diff options
author | Tomas Kukosa <tomas.kukosa@siemens.com> | 2006-06-13 13:21:12 +0000 |
---|---|---|
committer | Tomas Kukosa <tomas.kukosa@siemens.com> | 2006-06-13 13:21:12 +0000 |
commit | a063a87af511e0357a7d68936894ff78909ca3fd (patch) | |
tree | 3822564a5e220cfeecdedc59887834b72478d560 /epan | |
parent | a557a61ae01b399e6afebaf4c6505628d4d7750b (diff) | |
download | wireshark-a063a87af511e0357a7d68936894ff78909ca3fd.tar.gz |
- "next tvb" list moved from h225 to new file next_tvb.[ch]
- h225 updated and regenerated
- restore calling subdissectors for SNMP variables which was broken with new SNMP
svn path=/trunk/; revision=18451
Diffstat (limited to 'epan')
-rw-r--r-- | epan/Makefile.common | 2 | ||||
-rw-r--r-- | epan/dissectors/packet-h225.c | 79 | ||||
-rw-r--r-- | epan/dissectors/packet-snmp.c | 55 | ||||
-rw-r--r-- | epan/next_tvb.c | 128 | ||||
-rw-r--r-- | epan/next_tvb.h | 65 |
5 files changed, 243 insertions, 86 deletions
diff --git a/epan/Makefile.common b/epan/Makefile.common index 70d17f6477..92b254d641 100644 --- a/epan/Makefile.common +++ b/epan/Makefile.common @@ -59,6 +59,7 @@ LIBWIRESHARK_SRC = \ in_cksum.c \ ipproto.c \ ipv4.c \ + next_tvb.c \ nstime.c \ oid_resolv.c \ osi-utils.c \ @@ -144,6 +145,7 @@ LIBWIRESHARK_INCLUDES = \ guid-utils.h \ lapd_sapi.h \ llcsaps.h \ + next_tvb.h \ nlpid.h \ nstime.h \ oid_resolv.h \ diff --git a/epan/dissectors/packet-h225.c b/epan/dissectors/packet-h225.c index 1ed800f56a..891737d7a7 100644 --- a/epan/dissectors/packet-h225.c +++ b/epan/dissectors/packet-h225.c @@ -53,6 +53,7 @@ #include <epan/prefs.h> #include <epan/oid_resolv.h> +#include <epan/next_tvb.h> #include "tap.h" #include "packet-tpkt.h" #include "packet-per.h" @@ -63,68 +64,6 @@ #include "packet-h245.h" #include "packet-q931.h" -/*---------------------------------------------------------------------------*/ -/* next tvb list - can be moved to some more common file if other dissector needs it */ - -#include <epan/emem.h> - -typedef struct next_tvb_item { - struct next_tvb_item *next; - struct next_tvb_item *previous; - dissector_handle_t handle; - tvbuff_t *tvb; - proto_tree *tree; -} next_tvb_item_t; - -typedef struct { - next_tvb_item_t *first; - next_tvb_item_t *last; - int count; -} next_tvb_list_t; - -void next_tvb_init(next_tvb_list_t *list); -void next_tvb_add(next_tvb_list_t *list, tvbuff_t *tvb, proto_tree *tree, dissector_handle_t handle); -void next_tvb_call(next_tvb_list_t *list, packet_info *pinfo, proto_tree *tree, dissector_handle_t handle, dissector_handle_t data_handle); - -void next_tvb_init(next_tvb_list_t *list) { - list->first = NULL; - list->last = NULL; - list->count = 0; -} - -void next_tvb_add(next_tvb_list_t *list, tvbuff_t *tvb, proto_tree *tree, dissector_handle_t handle) { - next_tvb_item_t *item; - - item = ep_alloc(sizeof(next_tvb_item_t)); - - item->handle = handle; - item->tvb = tvb; - item->tree = tree; - - if (list->last) { - list->last->next = item; - } else { - list->first = item; - } - item->next = NULL; - item->previous = list->last; - list->last = item; - list->count++; -} - -void next_tvb_call(next_tvb_list_t *list, packet_info *pinfo, proto_tree *tree, dissector_handle_t handle, dissector_handle_t data_handle) { - next_tvb_item_t *item; - - item = list->first; - while (item) { - if (item->tvb && tvb_length(item->tvb)) { - call_dissector((item->handle) ? item->handle : ((handle) ? handle : data_handle), item->tvb, pinfo, (item->tree) ? item->tree : tree); - } - item = item->next; - } -} - -/*---------------------------------------------------------------------------*/ #define PNAME "H323-MESSAGES" #define PSNAME "H.225.0" @@ -922,7 +861,7 @@ static int hf_h225_stopped = -1; /* NULL */ static int hf_h225_notAvailable = -1; /* NULL */ /*--- End of included file: packet-h225-hf.c ---*/ -#line 170 "packet-h225-template.c" +#line 109 "packet-h225-template.c" /* Initialize the subtree pointers */ static gint ett_h225 = -1; @@ -1162,7 +1101,7 @@ static gint ett_h225_ServiceControlResponse = -1; static gint ett_h225_T_result = -1; /*--- End of included file: packet-h225-ett.c ---*/ -#line 174 "packet-h225-template.c" +#line 113 "packet-h225-template.c" /* Preferences */ static gboolean h225_reassembly = TRUE; @@ -5482,7 +5421,7 @@ dissect_h225_ParallelH245Control_item(tvbuff_t *tvb, int offset, asn_ctx_t *actx offset = dissect_per_octet_string(tvb, offset, actx, tree, hf_index, NO_BOUND, NO_BOUND, &h245_tvb); - next_tvb_add(&h245_list, h245_tvb, (h225_h245_in_tree)?tree:NULL, h245dg_handle); + next_tvb_add_handle(&h245_list, h245_tvb, (h225_h245_in_tree)?tree:NULL, h245dg_handle); return offset; @@ -6356,7 +6295,7 @@ dissect_h225_H245Control_item(tvbuff_t *tvb, int offset, asn_ctx_t *actx _U_, pr offset = dissect_per_octet_string(tvb, offset, actx, tree, hf_index, NO_BOUND, NO_BOUND, &h245_tvb); - next_tvb_add(&h245_list, h245_tvb, (h225_h245_in_tree)?tree:NULL, h245dg_handle); + next_tvb_add_handle(&h245_list, h245_tvb, (h225_h245_in_tree)?tree:NULL, h245dg_handle); return offset; @@ -6431,7 +6370,7 @@ dissect_h225_T_messageContent_item(tvbuff_t *tvb, int offset, asn_ctx_t *actx _U offset = dissect_per_octet_string(tvb, offset, actx, tree, hf_index, NO_BOUND, NO_BOUND, &next_tvb); - next_tvb_add(&tp_list, next_tvb, (h225_tp_in_tree)?tree:NULL, tp_handle); + next_tvb_add_handle(&tp_list, next_tvb, (h225_tp_in_tree)?tree:NULL, tp_handle); return offset; @@ -9406,7 +9345,7 @@ dissect_h225_RasMessage(tvbuff_t *tvb, int offset, asn_ctx_t *actx _U_, proto_tr /*--- End of included file: packet-h225-fn.c ---*/ -#line 198 "packet-h225-template.c" +#line 137 "packet-h225-template.c" static int @@ -12496,7 +12435,7 @@ void proto_register_h225(void) { "ServiceControlResponse/result/notAvailable", HFILL }}, /*--- End of included file: packet-h225-hfarr.c ---*/ -#line 311 "packet-h225-template.c" +#line 250 "packet-h225-template.c" }; /* List of subtrees */ @@ -12738,7 +12677,7 @@ void proto_register_h225(void) { &ett_h225_T_result, /*--- End of included file: packet-h225-ettarr.c ---*/ -#line 317 "packet-h225-template.c" +#line 256 "packet-h225-template.c" }; module_t *h225_module; diff --git a/epan/dissectors/packet-snmp.c b/epan/dissectors/packet-snmp.c index 4be5eee185..80b020defa 100644 --- a/epan/dissectors/packet-snmp.c +++ b/epan/dissectors/packet-snmp.c @@ -64,6 +64,7 @@ #include <epan/prefs.h> #include <epan/sminmpec.h> #include <epan/emem.h> +#include <epan/next_tvb.h> #include "packet-ipx.h" #include "packet-hpext.h" @@ -155,6 +156,7 @@ static int proto_smux = -1; static const gchar *mib_modules = DEF_MIB_MODULES; static gboolean display_oid = TRUE; +static gboolean snmp_var_in_tree = TRUE; /* Subdissector tables */ static dissector_table_t variable_oid_dissector_table; @@ -170,10 +172,13 @@ static gboolean snmp_desegment = TRUE; guint32 MsgSecurityModel; tvbuff_t *oid_tvb=NULL; +tvbuff_t *value_tvb=NULL; static dissector_handle_t snmp_handle; static dissector_handle_t data_handle; +static next_tvb_list_t var_list; + static int hf_snmp_v3_flags_auth = -1; static int hf_snmp_v3_flags_crypt = -1; static int hf_snmp_v3_flags_report = -1; @@ -277,7 +282,7 @@ static int hf_snmp_priority = -1; /* INTEGER_M1_2147483647 */ static int hf_snmp_operation = -1; /* T_operation */ /*--- End of included file: packet-snmp-hf.c ---*/ -#line 185 "packet-snmp-template.c" +#line 190 "packet-snmp-template.c" static int hf_smux_version = -1; static int hf_smux_pdutype = -1; @@ -317,7 +322,7 @@ static gint ett_snmp_SimpleOpen = -1; static gint ett_snmp_RReqPDU = -1; /*--- End of included file: packet-snmp-ett.c ---*/ -#line 196 "packet-snmp-template.c" +#line 201 "packet-snmp-template.c" /* defined in net-SNMP; include/net-snmp/library/snmp.h */ #undef SNMP_MSG_GET @@ -1187,7 +1192,7 @@ dissect_snmp_NotificationName(gboolean implicit_tag _U_, tvbuff_t *tvb, int offs static int dissect_snmp_Integer_value(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 223 "snmp.cnf" +#line 233 "snmp.cnf" guint length; snmp_variable_decode(tvb, tree, pinfo, oid_tvb, offset, &length, NULL); @@ -1205,10 +1210,10 @@ static int dissect_integer_value(packet_info *pinfo, proto_tree *tree, tvbuff_t static int dissect_snmp_String_value(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 217 "snmp.cnf" +#line 227 "snmp.cnf" guint length; - snmp_variable_decode(tvb, tree, pinfo, oid_tvb, offset, &length, NULL); + snmp_variable_decode(tvb, tree, pinfo, oid_tvb, offset, &length, &value_tvb); offset = offset + length; @@ -1223,7 +1228,7 @@ static int dissect_string_value(packet_info *pinfo, proto_tree *tree, tvbuff_t * static int dissect_snmp_ObjectID_value(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 229 "snmp.cnf" +#line 239 "snmp.cnf" guint length; snmp_variable_decode(tvb, tree, pinfo, oid_tvb, offset, &length, NULL); @@ -1241,7 +1246,7 @@ static int dissect_objectID_value(packet_info *pinfo, proto_tree *tree, tvbuff_t static int dissect_snmp_Empty(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 235 "snmp.cnf" +#line 245 "snmp.cnf" guint length; snmp_variable_decode(tvb, tree, pinfo, oid_tvb, offset, &length, NULL); @@ -1651,9 +1656,20 @@ static const ber_sequence_t VarBind_sequence[] = { static int dissect_snmp_VarBind(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { - offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset, +#line 213 "snmp.cnf" + oid_tvb = NULL; + value_tvb = NULL; + offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset, VarBind_sequence, hf_index, ett_snmp_VarBind); + if (oid_tvb && value_tvb) { + next_tvb_add_string(&var_list, value_tvb, (snmp_var_in_tree) ? tree : NULL, + variable_oid_dissector_table, + oid_to_str(tvb_get_ptr(oid_tvb, 0, tvb_length(oid_tvb)), tvb_length(oid_tvb))); + } + + + return offset; } static int dissect_VarBindList_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) { @@ -2682,7 +2698,7 @@ static void dissect_SMUX_PDUs_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree /*--- End of included file: packet-snmp-fn.c ---*/ -#line 1032 "packet-snmp-template.c" +#line 1037 "packet-snmp-template.c" guint dissect_snmp_pdu(tvbuff_t *tvb, int offset, packet_info *pinfo, @@ -2783,6 +2799,8 @@ dissect_snmp_pdu(tvbuff_t *tvb, int offset, packet_info *pinfo, } } + next_tvb_init(&var_list); + if (check_col(pinfo->cinfo, COL_PROTOCOL)) { col_set_str(pinfo->cinfo, COL_PROTOCOL, proto_get_protocol_short_name(find_protocol_by_id(proto))); @@ -2816,10 +2834,10 @@ dissect_snmp_pdu(tvbuff_t *tvb, int offset, packet_info *pinfo, return length_remaining; break; } - return offset; - + next_tvb_call(&var_list, pinfo, tree, NULL, data_handle); + return offset; } static gint @@ -3372,7 +3390,7 @@ void proto_register_snmp(void) { "RReqPDU/operation", HFILL }}, /*--- End of included file: packet-snmp-hfarr.c ---*/ -#line 1385 "packet-snmp-template.c" +#line 1392 "packet-snmp-template.c" }; /* List of subtrees */ @@ -3410,7 +3428,7 @@ void proto_register_snmp(void) { &ett_snmp_RReqPDU, /*--- End of included file: packet-snmp-ettarr.c ---*/ -#line 1394 "packet-snmp-template.c" +#line 1401 "packet-snmp-template.c" }; module_t *snmp_module; @@ -3480,6 +3498,14 @@ void proto_register_snmp(void) { " To use this option, you must also enable \"Allow subdissectors to reassemble TCP streams\" in the TCP protocol settings.", &snmp_desegment); + prefs_register_bool_preference(snmp_module, "var_in_tree", + "Display dissected variables inside SNMP tree", + "ON - display dissected variables inside SNMP tree, OFF - display dissected variables in root tree after SNMP", + &snmp_var_in_tree); + + variable_oid_dissector_table = + register_dissector_table("snmp.variable_oid", + "SNMP Variable OID", FT_STRING, BASE_NONE); } @@ -3533,9 +3559,6 @@ proto_register_smux(void) proto_register_field_array(proto_smux, hf, array_length(hf)); proto_register_subtree_array(ett, array_length(ett)); - variable_oid_dissector_table = - register_dissector_table("snmp.variable_oid", - "SNMP Variable OID", FT_STRING, BASE_NONE); } void diff --git a/epan/next_tvb.c b/epan/next_tvb.c new file mode 100644 index 0000000000..e35c47ff73 --- /dev/null +++ b/epan/next_tvb.c @@ -0,0 +1,128 @@ +/* next_tvb.c + * Routines for "next tvb" list + * + * $Id$ + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <glib.h> + +#include <epan/packet.h> +#include <epan/emem.h> + +#include "next_tvb.h" + +void next_tvb_init(next_tvb_list_t *list) { + list->first = NULL; + list->last = NULL; + list->count = 0; +} + +void next_tvb_add_handle(next_tvb_list_t *list, tvbuff_t *tvb, proto_tree *tree, dissector_handle_t handle) { + next_tvb_item_t *item; + + item = ep_alloc(sizeof(next_tvb_item_t)); + + item->type = NTVB_HANDLE; + item->handle = handle; + item->tvb = tvb; + item->tree = tree; + + if (list->last) { + list->last->next = item; + } else { + list->first = item; + } + item->next = NULL; + item->previous = list->last; + list->last = item; + list->count++; +} + +void next_tvb_add_port(next_tvb_list_t *list, tvbuff_t *tvb, proto_tree *tree, dissector_table_t table, guint32 port) { + next_tvb_item_t *item; + + item = ep_alloc(sizeof(next_tvb_item_t)); + + item->type = NTVB_PORT; + item->table = table; + item->port = port; + item->tvb = tvb; + item->tree = tree; + + if (list->last) { + list->last->next = item; + } else { + list->first = item; + } + item->next = NULL; + item->previous = list->last; + list->last = item; + list->count++; +} + +void next_tvb_add_string(next_tvb_list_t *list, tvbuff_t *tvb, proto_tree *tree, dissector_table_t table, const gchar *string) { + next_tvb_item_t *item; + + item = ep_alloc(sizeof(next_tvb_item_t)); + + item->type = NTVB_STRING; + item->table = table; + item->string = string; + item->tvb = tvb; + item->tree = tree; + + if (list->last) { + list->last->next = item; + } else { + list->first = item; + } + item->next = NULL; + item->previous = list->last; + list->last = item; + list->count++; +} + +void next_tvb_call(next_tvb_list_t *list, packet_info *pinfo, proto_tree *tree, dissector_handle_t handle, dissector_handle_t data_handle) { + next_tvb_item_t *item; + + item = list->first; + while (item) { + if (item->tvb && tvb_length(item->tvb)) { + switch (item->type) { + case NTVB_HANDLE: + call_dissector((item->handle) ? item->handle : ((handle) ? handle : data_handle), item->tvb, pinfo, (item->tree) ? item->tree : tree); + break; + case NTVB_PORT: + dissector_try_port(item->table, item->port, item->tvb, pinfo, (item->tree) ? item->tree : tree); + break; + case NTVB_STRING: + dissector_try_string(item->table, item->string, item->tvb, pinfo, (item->tree) ? item->tree : tree); + break; + } + } + item = item->next; + } +} + diff --git a/epan/next_tvb.h b/epan/next_tvb.h new file mode 100644 index 0000000000..cb002ae062 --- /dev/null +++ b/epan/next_tvb.h @@ -0,0 +1,65 @@ +/* next_tvb.h + * Definitions for "next tvb" list + * + * $Id$ + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +/* The buffers returned by these functions are all allocated with a + * packet lifetime or are static buffers and does not have have to be freed. + * However, take into account that when the packet dissection + * completes, these buffers will be automatically reclaimed/freed. + * If you need the buffer to remain for a longer scope than packet lifetime + * you must copy the content to an se_alloc() buffer. + */ + +#ifndef __NEXT_TVB_H__ +#define __NEXT_TVB_H__ + +typedef enum { + NTVB_HANDLE, + NTVB_PORT, + NTVB_STRING, +} next_tvb_call_e; + +typedef struct next_tvb_item { + struct next_tvb_item *next; + struct next_tvb_item *previous; + next_tvb_call_e type; + dissector_handle_t handle; + dissector_table_t table; + guint32 port; + const gchar *string; + tvbuff_t *tvb; + proto_tree *tree; +} next_tvb_item_t; + +typedef struct { + next_tvb_item_t *first; + next_tvb_item_t *last; + int count; +} next_tvb_list_t; + +extern void next_tvb_init(next_tvb_list_t *list); +extern void next_tvb_add_handle(next_tvb_list_t *list, tvbuff_t *tvb, proto_tree *tree, dissector_handle_t handle); +extern void next_tvb_add_port(next_tvb_list_t *list, tvbuff_t *tvb, proto_tree *tree, dissector_table_t table, guint32 port); +extern void next_tvb_add_string(next_tvb_list_t *list, tvbuff_t *tvb, proto_tree *tree, dissector_table_t table, const gchar *string); +extern void next_tvb_call(next_tvb_list_t *list, packet_info *pinfo, proto_tree *tree, dissector_handle_t handle, dissector_handle_t data_handle); + +#endif /* __NEXT_TVB_H__ */ |