aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--epan/dissectors/packet-diameter.c210
1 files changed, 122 insertions, 88 deletions
diff --git a/epan/dissectors/packet-diameter.c b/epan/dissectors/packet-diameter.c
index 8d4ddb978b..8c6f93a4fb 100644
--- a/epan/dissectors/packet-diameter.c
+++ b/epan/dissectors/packet-diameter.c
@@ -473,11 +473,12 @@ dissect_diameter_3gpp2_exp_res(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree
return 0;
diam_sub_dis = (diam_sub_dis_t*)data;
- pi = proto_tree_add_item(tree, hf_diameter_3gpp2_exp_res, tvb, 0, 4, ENC_BIG_ENDIAN);
- diam_sub_dis->avp_str = (char *)wmem_alloc(wmem_packet_scope(), ITEM_LABEL_LENGTH+1);
- proto_item_fill_label(PITEM_FINFO(pi), diam_sub_dis->avp_str);
- diam_sub_dis->avp_str = strstr(diam_sub_dis->avp_str,": ")+2;
-
+ if (tree) {
+ pi = proto_tree_add_item(tree, hf_diameter_3gpp2_exp_res, tvb, 0, 4, ENC_BIG_ENDIAN);
+ diam_sub_dis->avp_str = (char *)wmem_alloc(wmem_packet_scope(), ITEM_LABEL_LENGTH+1);
+ proto_item_fill_label(PITEM_FINFO(pi), diam_sub_dis->avp_str);
+ diam_sub_dis->avp_str = strstr(diam_sub_dis->avp_str,": ")+2;
+ }
return 4;
}
@@ -784,9 +785,9 @@ dissect_diameter_avp(diam_ctx_t *c, tvbuff_t *tvb, int offset, diam_sub_dis_t *d
call_avp_subdissector(vendorid, code, subtvb, c->pinfo, avp_tree, diam_sub_dis_inf);
/* Let the subdissector have precedence filling in the avp_item string */
- if(diam_sub_dis_inf->avp_str){
+ if (diam_sub_dis_inf->avp_str) {
proto_item_append_text(avp_item," val=%s", diam_sub_dis_inf->avp_str);
- }else if (avp_str){
+ } else if (avp_str) {
proto_item_append_text(avp_item," val=%s", avp_str);
}
@@ -809,7 +810,7 @@ dissect_diameter_avp(diam_ctx_t *c, tvbuff_t *tvb, int offset, diam_sub_dis_t *d
static const char *
address_rfc_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb, diam_sub_dis_t *diam_sub_dis_inf _U_)
{
- char *label = (char *)wmem_alloc(wmem_packet_scope(), ITEM_LABEL_LENGTH+1);
+ char *label = NULL;
address_avp_t *t = (address_avp_t *)a->type_data;
gint len = tvb_reported_length(tvb);
proto_item *pi = proto_tree_add_item(c->tree, a->hf_value, tvb, 0, len, ENC_BIG_ENDIAN);
@@ -838,8 +839,12 @@ address_rfc_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb, diam_sub_dis_t *dia
break;
}
- proto_item_fill_label(PITEM_FINFO(pi), label);
- label = strstr(label,": ")+2;
+ if (c->tree) {
+ label = (char *)wmem_alloc(wmem_packet_scope(), ITEM_LABEL_LENGTH+1);
+ proto_item_fill_label(PITEM_FINFO(pi), label);
+ label = strstr(label,": ")+2;
+ }
+
return label;
}
@@ -870,7 +875,7 @@ static const char *
time_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb, diam_sub_dis_t *diam_sub_dis_inf _U_)
{
int len = tvb_reported_length(tvb);
- char *label = (char *)wmem_alloc(wmem_packet_scope(), ITEM_LABEL_LENGTH+1);
+ char *label = NULL;
proto_item *pi;
if ( len != 4 ) {
@@ -879,16 +884,21 @@ time_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb, diam_sub_dis_t *diam_sub_d
return "[Malformed]";
}
- pi = proto_tree_add_item(c->tree, (a->hf_value), tvb, 0, 4, ENC_TIME_NTP|ENC_BIG_ENDIAN);
- proto_item_fill_label(PITEM_FINFO(pi), label);
- label = strstr(label,": ")+2;
+ if (c->tree) {
+ label = (char *)wmem_alloc(wmem_packet_scope(), ITEM_LABEL_LENGTH+1);
+ pi = proto_tree_add_item(c->tree, (a->hf_value), tvb, 0, 4, ENC_TIME_NTP|ENC_BIG_ENDIAN);
+ proto_item_fill_label(PITEM_FINFO(pi), label);
+ label = strstr(label,": ")+2;
+ }
+
return label;
}
static const char *
address_v16_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb, diam_sub_dis_t *diam_sub_dis_inf _U_)
{
- char *label = (char *)wmem_alloc(wmem_packet_scope(), ITEM_LABEL_LENGTH+1);
+ char *label = NULL;
+
address_avp_t *t = (address_avp_t *)a->type_data;
proto_item *pi = proto_tree_add_item(c->tree,a->hf_value,tvb,0,tvb_reported_length(tvb),ENC_BIG_ENDIAN);
proto_tree *pt = proto_item_add_subtree(pi,t->ett);
@@ -909,44 +919,60 @@ address_v16_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb, diam_sub_dis_t *dia
break;
}
- proto_item_fill_label(PITEM_FINFO(pi), label);
- label = strstr(label,": ")+2;
+ if (c->tree) {
+ label = (char *)wmem_alloc(wmem_packet_scope(), ITEM_LABEL_LENGTH+1);
+ proto_item_fill_label(PITEM_FINFO(pi), label);
+ label = strstr(label,": ")+2;
+ }
+
return label;
}
static const char *
simple_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb, diam_sub_dis_t *diam_sub_dis_inf _U_)
{
- char *label = (char *)wmem_alloc(wmem_packet_scope(), ITEM_LABEL_LENGTH+1);
- proto_item *pi = proto_tree_add_item(c->tree,a->hf_value,tvb,0,tvb_reported_length(tvb),ENC_BIG_ENDIAN);
- proto_item_fill_label(PITEM_FINFO(pi), label);
- label = strstr(label,": ")+2;
+ char *label = NULL;
+
+ if (c->tree) {
+ proto_item *pi = proto_tree_add_item(c->tree,a->hf_value,tvb,0,tvb_reported_length(tvb),ENC_BIG_ENDIAN);
+ label = (char *)wmem_alloc(wmem_packet_scope(), ITEM_LABEL_LENGTH+1);
+ proto_item_fill_label(PITEM_FINFO(pi), label);
+ label = strstr(label,": ")+2;
+ }
+
return label;
}
static const char *
utf8_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb, diam_sub_dis_t *diam_sub_dis_inf _U_)
{
- char *label = (char *)wmem_alloc(wmem_packet_scope(), ITEM_LABEL_LENGTH+1);
- proto_item *pi = proto_tree_add_item(c->tree,a->hf_value,tvb,0,tvb_reported_length(tvb),ENC_UTF_8|ENC_BIG_ENDIAN);
- proto_item_fill_label(PITEM_FINFO(pi), label);
- label = strstr(label,": ")+2;
+ char *label = NULL;
+
+ if (c->tree) {
+ proto_item *pi = proto_tree_add_item(c->tree,a->hf_value,tvb,0,tvb_reported_length(tvb),ENC_UTF_8|ENC_BIG_ENDIAN);
+ label = (char *)wmem_alloc(wmem_packet_scope(), ITEM_LABEL_LENGTH+1);
+ proto_item_fill_label(PITEM_FINFO(pi), label);
+ label = strstr(label,": ")+2;
+ }
+
return label;
}
static const char *
integer32_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb, diam_sub_dis_t *diam_sub_dis_inf _U_)
{
- char *label;
+ char *label = NULL;
proto_item *pi;
/* Verify length before adding */
gint length = tvb_reported_length(tvb);
if (length == 4) {
- pi= proto_tree_add_item(c->tree, a->hf_value, tvb, 0, length, ENC_BIG_ENDIAN);
- label = (char *)wmem_alloc(wmem_packet_scope(), ITEM_LABEL_LENGTH+1);
- proto_item_fill_label(PITEM_FINFO(pi), label);
- label = strstr(label,": ")+2;
+ if (c->tree) {
+ pi= proto_tree_add_item(c->tree, a->hf_value, tvb, 0, length, ENC_BIG_ENDIAN);
+ label = (char *)wmem_alloc(wmem_packet_scope(), ITEM_LABEL_LENGTH+1);
+ 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,
@@ -955,24 +981,26 @@ integer32_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb, diam_sub_dis_t *diam_
expert_add_info_format(c->pinfo, pi, &ei_diameter_avp_len,
"Bad Integer32 Length (%u)", length);
PROTO_ITEM_SET_GENERATED(pi);
- label = NULL;
}
+
return label;
}
static const char *
integer64_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb, diam_sub_dis_t *diam_sub_dis_inf _U_)
{
- char *label;
+ char *label = NULL;
proto_item *pi;
/* Verify length before adding */
gint length = tvb_reported_length(tvb);
if (length == 8) {
- pi= proto_tree_add_item(c->tree, a->hf_value, tvb, 0, length, ENC_BIG_ENDIAN);
- label = (char *)wmem_alloc(wmem_packet_scope(), ITEM_LABEL_LENGTH+1);
- proto_item_fill_label(PITEM_FINFO(pi), label);
- label = strstr(label,": ")+2;
+ if (c->tree) {
+ pi= proto_tree_add_item(c->tree, a->hf_value, tvb, 0, length, ENC_BIG_ENDIAN);
+ label = (char *)wmem_alloc(wmem_packet_scope(), ITEM_LABEL_LENGTH+1);
+ 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,
@@ -981,24 +1009,26 @@ integer64_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb, diam_sub_dis_t *diam_
expert_add_info_format(c->pinfo, pi, &ei_diameter_avp_len,
"Bad Integer64 Length (%u)", length);
PROTO_ITEM_SET_GENERATED(pi);
- label = NULL;
}
+
return label;
}
static const char *
unsigned32_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb, diam_sub_dis_t *diam_sub_dis_inf _U_)
{
- char *label;
+ char *label = NULL;
proto_item *pi;
/* Verify length before adding */
gint length = tvb_reported_length(tvb);
if (length == 4) {
- pi= proto_tree_add_item(c->tree, a->hf_value, tvb, 0, length, ENC_BIG_ENDIAN);
- label = (char *)wmem_alloc(wmem_packet_scope(), ITEM_LABEL_LENGTH+1);
- proto_item_fill_label(PITEM_FINFO(pi), label);
- label = strstr(label,": ")+2;
+ if (c->tree) {
+ pi= proto_tree_add_item(c->tree, a->hf_value, tvb, 0, length, ENC_BIG_ENDIAN);
+ label = (char *)wmem_alloc(wmem_packet_scope(), ITEM_LABEL_LENGTH+1);
+ 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,
@@ -1007,24 +1037,26 @@ unsigned32_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb, diam_sub_dis_t *diam
expert_add_info_format(c->pinfo, pi, &ei_diameter_avp_len,
"Bad Unsigned32 Length (%u)", length);
PROTO_ITEM_SET_GENERATED(pi);
- label = NULL;
}
+
return label;
}
static const char *
unsigned64_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb, diam_sub_dis_t *diam_sub_dis_inf _U_)
{
- char *label;
+ char *label = NULL;
proto_item *pi;
/* Verify length before adding */
gint length = tvb_reported_length(tvb);
if (length == 8) {
- pi= proto_tree_add_item(c->tree, a->hf_value, tvb, 0, length, ENC_BIG_ENDIAN);
- label = (char *)wmem_alloc(wmem_packet_scope(), ITEM_LABEL_LENGTH+1);
- proto_item_fill_label(PITEM_FINFO(pi), label);
- label = strstr(label,": ")+2;
+ if (c->tree) {
+ pi= proto_tree_add_item(c->tree, a->hf_value, tvb, 0, length, ENC_BIG_ENDIAN);
+ label = (char *)wmem_alloc(wmem_packet_scope(), ITEM_LABEL_LENGTH+1);
+ 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,
@@ -1033,24 +1065,26 @@ unsigned64_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb, diam_sub_dis_t *diam
expert_add_info_format(c->pinfo, pi, &ei_diameter_avp_len,
"Bad Unsigned64 Length (%u)", length);
PROTO_ITEM_SET_GENERATED(pi);
- label = NULL;
}
+
return label;
}
static const char *
float32_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb, diam_sub_dis_t *diam_sub_dis_inf _U_)
{
- char *label;
+ char *label = NULL;
proto_item *pi;
/* Verify length before adding */
gint length = tvb_reported_length(tvb);
if (length == 4) {
- pi= proto_tree_add_item(c->tree,a->hf_value, tvb, 0, length, ENC_BIG_ENDIAN);
- label = (char *)wmem_alloc(wmem_packet_scope(), ITEM_LABEL_LENGTH+1);
- proto_item_fill_label(PITEM_FINFO(pi), label);
- label = strstr(label,": ")+2;
+ if (c->tree) {
+ pi= proto_tree_add_item(c->tree,a->hf_value, tvb, 0, length, ENC_BIG_ENDIAN);
+ label = (char *)wmem_alloc(wmem_packet_scope(), ITEM_LABEL_LENGTH+1);
+ 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,
@@ -1059,24 +1093,26 @@ float32_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb, diam_sub_dis_t *diam_su
expert_add_info_format(c->pinfo, pi, &ei_diameter_avp_len,
"Bad Float32 Length (%u)", length);
PROTO_ITEM_SET_GENERATED(pi);
- label = NULL;
}
+
return label;
}
static const char *
float64_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb, diam_sub_dis_t *diam_sub_dis_inf _U_)
{
- char *label;
+ char *label = NULL;
proto_item *pi;
/* Verify length before adding */
gint length = tvb_reported_length(tvb);
if (length == 8) {
- pi= proto_tree_add_item(c->tree, a->hf_value, tvb, 0, length, ENC_BIG_ENDIAN);
- label = (char *)wmem_alloc(wmem_packet_scope(), ITEM_LABEL_LENGTH+1);
- proto_item_fill_label(PITEM_FINFO(pi), label);
- label = strstr(label,": ")+2;
+ if (c->tree) {
+ pi= proto_tree_add_item(c->tree, a->hf_value, tvb, 0, length, ENC_BIG_ENDIAN);
+ label = (char *)wmem_alloc(wmem_packet_scope(), ITEM_LABEL_LENGTH+1);
+ 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,
@@ -1085,8 +1121,8 @@ float64_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb, diam_sub_dis_t *diam_su
expert_add_info_format(c->pinfo, pi, &ei_diameter_avp_len,
"Bad Float64 Length (%u)", length);
PROTO_ITEM_SET_GENERATED(pi);
- label = NULL;
}
+
return label;
}
@@ -1319,36 +1355,34 @@ dissect_diameter_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi
}
diameter_pair->processing_request=(flags_bits & DIAM_FLAGS_R)!= 0;
- if (tree){
- /* print state tracking info in the tree */
- if (flags_bits & DIAM_FLAGS_R) {
- /* This is a request */
- if (diameter_pair->ans_frame) {
- it = proto_tree_add_uint(diam_tree, hf_diameter_answer_in,
- tvb, 0, 0, diameter_pair->ans_frame);
- PROTO_ITEM_SET_GENERATED(it);
- }
- } else {
- /* This is an answer */
- if (diameter_pair->req_frame) {
- it = proto_tree_add_uint(diam_tree, hf_diameter_answer_to,
- tvb, 0, 0, diameter_pair->req_frame);
- PROTO_ITEM_SET_GENERATED(it);
-
- nstime_delta(&ns, &pinfo->fd->abs_ts, &diameter_pair->req_time);
- diameter_pair->srt_time = ns;
- it = proto_tree_add_time(diam_tree, hf_diameter_answer_time, tvb, 0, 0, &ns);
- PROTO_ITEM_SET_GENERATED(it);
- /* TODO: Populate result_code in tap record from AVP 268 */
- }
+ /* print state tracking info in the tree */
+ if (flags_bits & DIAM_FLAGS_R) {
+ /* This is a request */
+ if (diameter_pair->ans_frame) {
+ it = proto_tree_add_uint(diam_tree, hf_diameter_answer_in,
+ tvb, 0, 0, diameter_pair->ans_frame);
+ PROTO_ITEM_SET_GENERATED(it);
+ }
+ } else {
+ /* This is an answer */
+ if (diameter_pair->req_frame) {
+ it = proto_tree_add_uint(diam_tree, hf_diameter_answer_to,
+ tvb, 0, 0, diameter_pair->req_frame);
+ PROTO_ITEM_SET_GENERATED(it);
+
+ nstime_delta(&ns, &pinfo->fd->abs_ts, &diameter_pair->req_time);
+ diameter_pair->srt_time = ns;
+ it = proto_tree_add_time(diam_tree, hf_diameter_answer_time, tvb, 0, 0, &ns);
+ PROTO_ITEM_SET_GENERATED(it);
+ /* TODO: Populate result_code in tap record from AVP 268 */
}
+ }
- offset = 20;
+ offset = 20;
- /* Dissect AVPs until the end of the packet is reached */
- while (offset < packet_len) {
- offset += dissect_diameter_avp(c, tvb, offset, diam_sub_dis_inf);
- }
+ /* Dissect AVPs until the end of the packet is reached */
+ while (offset < packet_len) {
+ offset += dissect_diameter_avp(c, tvb, offset, diam_sub_dis_inf);
}
/* Handle requests for which no answers were found and