aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorMichael Mann <mmann78@netscape.net>2013-10-28 15:59:26 +0000
committerMichael Mann <mmann78@netscape.net>2013-10-28 15:59:26 +0000
commit5de5fe6cb19cbeaad9fd2fb2bc0280df4716290c (patch)
tree62f769306a1fe1453a5e12d0513fc8ef2d17a744 /epan
parent63407767cf1b8f8d55dffb7173e1de1c990b67e5 (diff)
Pass diam_sub_dis_t directly to the subdissectors instead of using pinfo->private_data.
svn path=/trunk/; revision=52919
Diffstat (limited to 'epan')
-rw-r--r--epan/dissectors/packet-diameter.c77
-rw-r--r--epan/dissectors/packet-diameter_3gpp.c14
2 files changed, 43 insertions, 48 deletions
diff --git a/epan/dissectors/packet-diameter.c b/epan/dissectors/packet-diameter.c
index 972bef21e5..0642b16b74 100644
--- a/epan/dissectors/packet-diameter.c
+++ b/epan/dissectors/packet-diameter.c
@@ -115,7 +115,7 @@ typedef struct _diam_ctx_t {
typedef struct _diam_avp_t diam_avp_t;
typedef struct _avp_type_t avp_type_t;
-typedef const char *(*diam_avp_dissector_t)(diam_ctx_t *, diam_avp_t *, tvbuff_t *);
+typedef const char *(*diam_avp_dissector_t)(diam_ctx_t *, diam_avp_t *, tvbuff_t *, diam_sub_dis_t *);
typedef struct _diam_vnd_t {
@@ -186,7 +186,7 @@ typedef struct _proto_avp_t {
avp_reassemble_mode_t reassemble_mode;
} proto_avp_t;
-static const char *simple_avp(diam_ctx_t *, diam_avp_t *, tvbuff_t *);
+static const char *simple_avp(diam_ctx_t *, diam_avp_t *, tvbuff_t *, diam_sub_dis_t *);
static diam_vnd_t unknown_vendor = { 0xffffffff, NULL, NULL, NULL };
static diam_vnd_t no_vnd = { 0, NULL, NULL, NULL };
@@ -411,7 +411,7 @@ dissect_diameter_base_framed_ipv6_prefix(tvbuff_t *tvb, packet_info *pinfo _U_,
* variables as volatile and deal with casting them).
*/
static void
-call_avp_subdissector(guint32 vendorid, guint32 code, tvbuff_t *subtvb, packet_info *pinfo, proto_tree *avp_tree)
+call_avp_subdissector(guint32 vendorid, guint32 code, tvbuff_t *subtvb, packet_info *pinfo, proto_tree *avp_tree, diam_sub_dis_t *diam_sub_dis_inf)
{
TRY {
switch (vendorid) {
@@ -422,7 +422,7 @@ call_avp_subdissector(guint32 vendorid, guint32 code, tvbuff_t *subtvb, packet_i
dissector_try_uint(diameter_ericsson_avp_dissector_table, code, subtvb, pinfo, avp_tree);
break;
case VENDOR_THE3GPP:
- dissector_try_uint(diameter_3gpp_avp_dissector_table, code, subtvb, pinfo, avp_tree);
+ dissector_try_uint_new(diameter_3gpp_avp_dissector_table, code, subtvb, pinfo, avp_tree, FALSE, diam_sub_dis_inf);
break;
default:
break;
@@ -440,7 +440,7 @@ call_avp_subdissector(guint32 vendorid, guint32 code, tvbuff_t *subtvb, packet_i
/* Dissect an AVP at offset */
static int
-dissect_diameter_avp(diam_ctx_t *c, tvbuff_t *tvb, int offset)
+dissect_diameter_avp(diam_ctx_t *c, tvbuff_t *tvb, int offset, diam_sub_dis_t *diam_sub_dis_inf)
{
guint32 code = tvb_get_ntohl(tvb,offset);
guint32 len = tvb_get_ntohl(tvb,offset+4);
@@ -562,15 +562,15 @@ dissect_diameter_avp(diam_ctx_t *c, tvbuff_t *tvb, int offset)
save_tree = c->tree;
c->tree = avp_tree;
if (c->version_rfc) {
- avp_str = a->dissector_rfc(c,a,subtvb);
+ avp_str = a->dissector_rfc(c,a,subtvb, diam_sub_dis_inf);
} else {
- avp_str = a->dissector_v16(c,a,subtvb);
+ avp_str = a->dissector_v16(c,a,subtvb, diam_sub_dis_inf);
}
c->tree = save_tree;
if (avp_str) proto_item_append_text(avp_item," val=%s", avp_str);
- call_avp_subdissector(vendorid, code, subtvb, c->pinfo, avp_tree);
+ call_avp_subdissector(vendorid, code, subtvb, c->pinfo, avp_tree, diam_sub_dis_inf);
if (pad_len) {
guint8 i;
@@ -588,7 +588,7 @@ dissect_diameter_avp(diam_ctx_t *c, tvbuff_t *tvb, int offset)
}
static const char *
-address_rfc_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb)
+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);
address_avp_t *t = (address_avp_t *)a->type_data;
@@ -624,7 +624,7 @@ address_rfc_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb)
}
static const char *
-proto_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb)
+proto_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb, diam_sub_dis_t *diam_sub_dis_inf)
{
proto_avp_t *t = (proto_avp_t *)a->type_data;
@@ -636,7 +636,7 @@ proto_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb)
}
TRY {
- call_dissector(t->handle, tvb, c->pinfo, c->tree);
+ call_dissector_with_data(t->handle, tvb, c->pinfo, c->tree, diam_sub_dis_inf);
}
CATCH_NONFATAL_ERRORS {
show_exception(tvb, c->pinfo, c->tree, EXCEPT_CODE, GET_MESSAGE);
@@ -647,7 +647,7 @@ proto_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb)
}
static const char *
-time_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb)
+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_length(tvb);
char *label = (char *)wmem_alloc(wmem_packet_scope(), ITEM_LABEL_LENGTH+1);
@@ -666,7 +666,7 @@ time_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb)
}
static const char *
-address_v16_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb)
+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);
address_avp_t *t = (address_avp_t *)a->type_data;
@@ -695,7 +695,7 @@ address_v16_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb)
}
static const char *
-simple_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb)
+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_length(tvb),ENC_BIG_ENDIAN);
@@ -705,7 +705,7 @@ simple_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb)
}
static const char *
-utf8_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb)
+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_length(tvb),ENC_UTF_8|ENC_BIG_ENDIAN);
@@ -715,7 +715,7 @@ utf8_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb)
}
static const char *
-integer32_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb)
+integer32_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb, diam_sub_dis_t *diam_sub_dis_inf _U_)
{
char *label;
proto_item *pi;
@@ -741,7 +741,7 @@ integer32_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb)
}
static const char *
-integer64_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb)
+integer64_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb, diam_sub_dis_t *diam_sub_dis_inf _U_)
{
char *label;
proto_item *pi;
@@ -767,7 +767,7 @@ integer64_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb)
}
static const char *
-unsigned32_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb)
+unsigned32_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb, diam_sub_dis_t *diam_sub_dis_inf _U_)
{
char *label;
proto_item *pi;
@@ -793,7 +793,7 @@ unsigned32_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb)
}
static const char *
-unsigned64_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb)
+unsigned64_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb, diam_sub_dis_t *diam_sub_dis_inf _U_)
{
char *label;
proto_item *pi;
@@ -819,7 +819,7 @@ unsigned64_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb)
}
static const char *
-float32_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb)
+float32_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb, diam_sub_dis_t *diam_sub_dis_inf _U_)
{
char *label;
proto_item *pi;
@@ -845,7 +845,7 @@ float32_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb)
}
static const char *
-float64_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb)
+float64_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb, diam_sub_dis_t *diam_sub_dis_inf _U_)
{
char *label;
proto_item *pi;
@@ -871,7 +871,7 @@ float64_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb)
}
static const char *
-grouped_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb)
+grouped_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb, diam_sub_dis_t *diam_sub_dis_inf)
{
int offset = 0;
int len = tvb_length(tvb);
@@ -881,7 +881,7 @@ grouped_avp(diam_ctx_t *c, diam_avp_t *a, tvbuff_t *tvb)
c->tree = proto_item_add_subtree(pi,a->ett);
while (offset < len) {
- offset += dissect_diameter_avp(c, tvb, offset);
+ offset += dissect_diameter_avp(c, tvb, offset, diam_sub_dis_inf);
}
c->tree = pt;
@@ -917,13 +917,11 @@ dissect_diameter_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
wmem_tree_t *pdus_tree;
proto_item *it;
nstime_t ns;
- void *pd_save;
diam_sub_dis_t *diam_sub_dis_inf = wmem_new0(wmem_packet_scope(), diam_sub_dis_t);
diam_sub_dis_inf->application_id = tvb_get_ntohl(tvb,8);
- pd_save = pinfo->private_data;
col_set_str(pinfo->cinfo, COL_PROTOCOL, "DIAMETER");
pi = proto_tree_add_item(tree,proto_diameter,tvb,0,-1,ENC_NA);
@@ -974,8 +972,6 @@ dissect_diameter_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
cmd_vs = (value_string *)(void *)all_cmds->data;
app_item = proto_tree_add_item(diam_tree, hf_diameter_application_id, tvb, 8, 4, ENC_BIG_ENDIAN);
- /* Store the application id to be used by subdissectors */
- pinfo->private_data = diam_sub_dis_inf;
if (try_val_to_str(diam_sub_dis_inf->application_id, dictionary.applications) == NULL) {
proto_tree *tu = proto_item_add_subtree(app_item,ett_unknown);
@@ -1123,26 +1119,27 @@ dissect_diameter_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
offset = 20;
+ }
- /* Dissect AVPs until the end of the packet is reached */
- while (offset < packet_len) {
- offset += dissect_diameter_avp(c, tvb, offset);
- }
+ /* Store the application id to be used by subdissectors */
+
- /* Handle requests for which no answers were found and
- * anawers for which no requests were found in the tap listener.
- * In case if you don't need unpaired requests/answers use:
- * if(diameter_pair->processing_request || !diameter_pair->req_frame)
- * return;
- */
- tap_queue_packet(diameter_tap, pinfo, diameter_pair);
+ /* 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
+ * anawers for which no requests were found in the tap listener.
+ * In case if you don't need unpaired requests/answers use:
+ * if(diameter_pair->processing_request || !diameter_pair->req_frame)
+ * return;
+ */
+ tap_queue_packet(diameter_tap, pinfo, diameter_pair);
+
if(have_tap_listener(exported_pdu_tap)){
export_diameter_pdu(pinfo,tvb);
}
-
- pinfo->private_data = pd_save;
}
static guint
diff --git a/epan/dissectors/packet-diameter_3gpp.c b/epan/dissectors/packet-diameter_3gpp.c
index c31a930bf4..5bdbbe183f 100644
--- a/epan/dissectors/packet-diameter_3gpp.c
+++ b/epan/dissectors/packet-diameter_3gpp.c
@@ -274,12 +274,11 @@ dissect_diameter_3gpp_visited_nw_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto
*/
static int
-dissect_diameter_3gpp_feature_list_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_)
+dissect_diameter_3gpp_feature_list_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, void *data)
{
- diam_sub_dis_t *diam_sub_dis_inf;
+ diam_sub_dis_t *diam_sub_dis_inf = (diam_sub_dis_t*)data;
- if(pinfo->private_data){
- diam_sub_dis_inf = (diam_sub_dis_t*)pinfo->private_data;
+ if(diam_sub_dis_inf){
diam_sub_dis_inf->feature_list_id = tvb_get_ntohl(tvb,0);
}
@@ -320,19 +319,18 @@ dissect_diameter_3gpp_uar_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tre
*/
static int
-dissect_diameter_3gpp_feature_list(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) {
+dissect_diameter_3gpp_feature_list(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data) {
proto_item* item;
proto_tree *sub_tree;
int offset = 0;
guint32 bit_offset, application_id = 0, feature_list_id = 0;
- diam_sub_dis_t *diam_sub_dis_inf;
+ diam_sub_dis_t *diam_sub_dis_inf = (diam_sub_dis_t*)data;
item = proto_tree_add_item(tree, hf_diameter_3gpp_feature_list_flags, tvb, offset, 4, ENC_BIG_ENDIAN);
sub_tree = proto_item_add_subtree(item, diameter_3gpp_feature_list_ett);
- if(pinfo->private_data){
- diam_sub_dis_inf = (diam_sub_dis_t*)pinfo->private_data;
+ if(diam_sub_dis_inf){
application_id = diam_sub_dis_inf->application_id;
feature_list_id = diam_sub_dis_inf->feature_list_id;
}