+static const char*
+integer64_avp(diam_ctx_t* c, diam_avp_t* a, tvbuff_t* tvb)
+{
+ char* label = ep_alloc(ITEM_LABEL_LENGTH+1);
+ proto_item* pi;
+
+ /* Verify length before adding */
+ gint length = tvb_length_remaining(tvb,0);
+ if (length == 8) {
+ pi= proto_tree_add_item(c->tree,a->hf_value,tvb,0,tvb_length_remaining(tvb,0),FALSE);
+ proto_item_fill_label(PITEM_FINFO(pi), label);
+ label = strstr(label,": ")+2;
+ }
+ else {
+ pi = proto_tree_add_bytes_format(c->tree, hf_diameter_avp_data_wrong_length,
+ tvb, 0, length,
+ tvb_get_ptr(tvb, 0, length),
+ "Error! Bad Integer64 Length");
+ expert_add_info_format(c->pinfo, pi, PI_MALFORMED, PI_NOTE,
+ "Bad Integer64 Length (%u)", length);
+ PROTO_ITEM_SET_GENERATED(pi);
+ }
+ return label;
+}
+
+static const char*
+unsigned32_avp(diam_ctx_t* c, diam_avp_t* a, tvbuff_t* tvb)
+{
+ char* label = ep_alloc(ITEM_LABEL_LENGTH+1);
+ proto_item* pi;
+
+ /* Verify length before adding */
+ gint length = tvb_length_remaining(tvb,0);
+ if (length == 4) {
+ pi= proto_tree_add_item(c->tree,a->hf_value,tvb,0,tvb_length_remaining(tvb,0),FALSE);
+ proto_item_fill_label(PITEM_FINFO(pi), label);
+ label = strstr(label,": ")+2;
+ }
+ else {
+ pi = proto_tree_add_bytes_format(c->tree, hf_diameter_avp_data_wrong_length,
+ tvb, 0, length,
+ tvb_get_ptr(tvb, 0, length),
+ "Error! Bad Unsigned32 Length");
+ expert_add_info_format(c->pinfo, pi, PI_MALFORMED, PI_NOTE,
+ "Bad Unsigned32 Length (%u)", length);
+ PROTO_ITEM_SET_GENERATED(pi);
+ }
+ return label;
+}
+
+static const char*
+unsigned64_avp(diam_ctx_t* c, diam_avp_t* a, tvbuff_t* tvb)
+{
+ char* label = ep_alloc(ITEM_LABEL_LENGTH+1);
+ proto_item* pi;
+
+ /* Verify length before adding */
+ gint length = tvb_length_remaining(tvb,0);
+ if (length == 8) {
+ pi= proto_tree_add_item(c->tree,a->hf_value,tvb,0,tvb_length_remaining(tvb,0),FALSE);
+ proto_item_fill_label(PITEM_FINFO(pi), label);
+ label = strstr(label,": ")+2;
+ }
+ else {
+ pi = proto_tree_add_bytes_format(c->tree, hf_diameter_avp_data_wrong_length,
+ tvb, 0, length,
+ tvb_get_ptr(tvb, 0, length),
+ "Error! Bad Unsigned64 Length");
+ expert_add_info_format(c->pinfo, pi, PI_MALFORMED, PI_NOTE,
+ "Bad Unsigned64 Length (%u)", length);
+ PROTO_ITEM_SET_GENERATED(pi);
+ }
+ return label;
+}
+
+static const char*
+float32_avp(diam_ctx_t* c, diam_avp_t* a, tvbuff_t* tvb)
+{
+ char* label = ep_alloc(ITEM_LABEL_LENGTH+1);
+ proto_item* pi;
+
+ /* Verify length before adding */
+ gint length = tvb_length_remaining(tvb,0);
+ if (length == 4) {
+ pi= proto_tree_add_item(c->tree,a->hf_value,tvb,0,tvb_length_remaining(tvb,0),FALSE);
+ proto_item_fill_label(PITEM_FINFO(pi), label);
+ label = strstr(label,": ")+2;
+ }
+ else {
+ pi = proto_tree_add_bytes_format(c->tree, hf_diameter_avp_data_wrong_length,
+ tvb, 0, length,
+ tvb_get_ptr(tvb, 0, length),
+ "Error! Bad Float32 Length");
+ expert_add_info_format(c->pinfo, pi, PI_MALFORMED, PI_NOTE,
+ "Bad Float32 Length (%u)", length);
+ PROTO_ITEM_SET_GENERATED(pi);
+ }
+ return label;
+}
+
+static const char*
+float64_avp(diam_ctx_t* c, diam_avp_t* a, tvbuff_t* tvb)
+{
+ char* label = ep_alloc(ITEM_LABEL_LENGTH+1);
+ proto_item* pi;
+
+ /* Verify length before adding */
+ gint length = tvb_length_remaining(tvb,0);
+ if (length == 8) {
+ pi= proto_tree_add_item(c->tree,a->hf_value,tvb,0,tvb_length_remaining(tvb,0),FALSE);
+ proto_item_fill_label(PITEM_FINFO(pi), label);
+ label = strstr(label,": ")+2;
+ }
+ else {
+ pi = proto_tree_add_bytes_format(c->tree, hf_diameter_avp_data_wrong_length,
+ tvb, 0, length,
+ tvb_get_ptr(tvb, 0, length),
+ "Error! Bad Float64 Length");
+ expert_add_info_format(c->pinfo, pi, PI_MALFORMED, PI_NOTE,
+ "Bad Float64 Length (%u)", length);
+ PROTO_ITEM_SET_GENERATED(pi);
+ }
+ return label;
+}
+