diff options
author | etxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7> | 2008-03-17 21:35:14 +0000 |
---|---|---|
committer | etxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7> | 2008-03-17 21:35:14 +0000 |
commit | 5a17423dea6e159a3fb26d1a5a8df293cfd86ace (patch) | |
tree | c4287cdf624db3a77e2cdebc9bff41edcba0b37a /epan/dissectors/packet-tipc.c | |
parent | 5472fa6417aa5b62037a179e16071aba2c4a6510 (diff) |
From Martin Peylo:
dissect TIPC encapsulated in TCP
http://bugs.wireshark.org/bugzilla/show_bug.cgi?id=2335
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@24674 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'epan/dissectors/packet-tipc.c')
-rw-r--r-- | epan/dissectors/packet-tipc.c | 1782 |
1 files changed, 907 insertions, 875 deletions
diff --git a/epan/dissectors/packet-tipc.c b/epan/dissectors/packet-tipc.c index 59d73a005e..b5759734bc 100644 --- a/epan/dissectors/packet-tipc.c +++ b/epan/dissectors/packet-tipc.c @@ -4,10 +4,10 @@ * $Id$ * * Copyright 2005-2006, Anders Broman <anders.broman@ericsson.com> - * + * * TIPCv2 protocol updates - * Copyright 2006-2007, Martin Peylo <wireshark@izac.de> - * + * Copyright 2006-2008, Martin Peylo <wireshark@izac.de> + * * Wireshark - Network traffic analyzer * By Gerald Combs <gerald@wireshark.org> * Copyright 1998 Gerald Combs @@ -47,8 +47,16 @@ #include <epan/emem.h> #include <epan/reassemble.h> +#include "packet-tcp.h" + static int proto_tipc = -1; +/* dissector handles */ +static dissector_handle_t tipc_handle; +static dissector_handle_t tipc_tcp_handle; +static dissector_handle_t data_handle; +static dissector_handle_t ip_handle; + static int hf_tipc_msg_fragments = -1; static int hf_tipc_msg_fragment = -1; static int hf_tipc_msg_fragment_overlap = -1; @@ -178,6 +186,7 @@ static gint ett_tipc = -1; static gint ett_tipc_data = -1; /* protocol preferences */ +static gboolean inited = FALSE; static gboolean tipc_defragment = TRUE; static gboolean dissect_tipc_data = TRUE; static gboolean try_heuristic_first = FALSE; @@ -185,12 +194,9 @@ static gboolean try_heuristic_first = FALSE; #define V2_AS_1_6 0x2 #define V2_AS_1_7 0x4 static gint handle_v2_as = V2_AS_ALL; - -static gboolean extra_ethertype = FALSE; - -#define ETHERTYPE_TIPC2 0x0807 - -static dissector_handle_t ip_handle; +static guint tipc_alternate_tcp_port = 0; +static guint tipc_alternate_tcp_port_prev = 0; +static gboolean tipc_tcp_desegment = TRUE; /* this is used to find encapsulated protocols */ static dissector_table_t tipc_user_dissector; @@ -198,8 +204,6 @@ static dissector_table_t tipc_type_dissector; static heur_dissector_list_t tipc_heur_subdissector_list; -static dissector_handle_t data_handle; - static proto_tree *top_tree; static const fragment_items tipc_msg_frag_items = { @@ -308,10 +312,10 @@ const value_string tipcv2_user_short_str_vals[] = { { 0, NULL} }; -#define TIPC_CONNECTED_MSG 0 -#define TIPC_NAMED_MSG 2 -#define TIPC_DIRECT_MSG 3 -#define TIPC_OVERLOAD_W_MSG 4 +#define TIPC_CONNECTED_MSG 0 +#define TIPC_NAMED_MSG 2 +#define TIPC_DIRECT_MSG 3 +#define TIPC_OVERLOAD_W_MSG 4 static const value_string tipc_data_msg_type_values[] = { { 0, "CONN_MSG"}, @@ -328,6 +332,7 @@ static const value_string tipcv2_data_msg_type_defines[] = { { 3, "DirectMsg"}, { 0, NULL} }; + static const value_string tipcv2_data_msg_type_values[] _U_ = { { 0, "Sent on connection (CONN_MSG)"}, { 1, "Logical multicast (MCAST_MSG)"}, @@ -335,6 +340,7 @@ static const value_string tipcv2_data_msg_type_values[] _U_ = { { 3, "Port identity destination address (DIRECT_MSG)"}, { 0, NULL} }; + static const value_string tipc_error_code_values[] = { { 0, "MSG_OK"}, { 1, "NO_PORT_NAME"}, @@ -346,9 +352,9 @@ static const value_string tipc_error_code_values[] = { { 0, NULL} }; -static const value_string tipcv2_error_code_strings[]={ +static const value_string tipcv2_error_code_strings[] = { { 0, "No error (TIPC_OK)"}, - { 1, "Destination port name unknown (TIPC_ERR_NO_NAME)"}, + { 1, "Destination port name unknown (TIPC_ERR_NO_NAME)"}, { 2, "Destination port does not exist (TIPC_ERR_NO_PORT)"}, { 3, "Destination node unavailable (TIPC_ERR_NO_NODE)"}, { 4, "Destination node overloaded (TIPC_ERR_OVERLOAD)"}, @@ -357,9 +363,9 @@ static const value_string tipcv2_error_code_strings[]={ { 0, NULL} }; -static const value_string tipcv2_error_code_short_strings[]={ +static const value_string tipcv2_error_code_short_strings[] = { { 0, "OK"}, - { 1, "ErrNoName"}, + { 1, "ErrNoName"}, { 2, "ErrNoPort"}, { 3, "ErrNoNode"}, { 4, "ErrOverload"}, @@ -368,12 +374,13 @@ static const value_string tipcv2_error_code_short_strings[]={ { 0, NULL} }; -static const value_string tipcv2_lookup_scope_strings[]={ +static const value_string tipcv2_lookup_scope_strings[] = { { 0, "Zone Scope"}, { 1, "Cluster Scope"}, { 2, "Node Scope"}, { 0, NULL} }; + static const value_string tipc_routing_mgr_msg_type_values[] = { { 0, "EXT_ROUTING_TABLE"}, { 1, "LOCAL_ROUTING_TABLE"}, @@ -382,23 +389,27 @@ static const value_string tipc_routing_mgr_msg_type_values[] = { { 4, "ROUTE_REMOVAL"}, { 0, NULL} }; + static const value_string tipc_name_dist_msg_type_values[] = { { 0, "PUBLICATION"}, { 1, "WITHDRAWAL"}, { 0, NULL} }; + /* CONNECTION_MANAGER */ static const value_string tipc_cm_msg_type_values[] = { { 0, "CONNECTION_PROBE"}, { 1, "CONNECTION_PROBE_REPLY"}, { 0, NULL} }; + static const value_string tipc_link_prot_msg_type_values[] = { { 10, "RESET_MSG"}, { 11, "ACTIVATE_MSG"}, { 12, "STATE_MSG"}, { 0, NULL} }; + /* CHANGEOVER_PROTOCOL */ static const value_string tipc_cng_prot_msg_type_values[] = { { 0, "DUPLICATE_MSG"}, @@ -406,6 +417,7 @@ static const value_string tipc_cng_prot_msg_type_values[] = { { 2, "INFO_MSG"}, { 0, NULL} }; + /* SEGMENTATION_MANAGER */ #define TIPC_FIRST_SEGMENT 1 #define TIPC_SEGMENT 2 @@ -416,52 +428,53 @@ const value_string tipc_sm_msg_type_values[] = { }; /* TIPCv2_BCAST_PROTOCOL - Broadcast Maintenance Protocol */ -static const value_string tipcv2_bcast_mtype_strings[]={ +static const value_string tipcv2_bcast_mtype_strings[] = { { 0, "Bcast"}, { 0, NULL} }; /* TIPCv2_MSG_BUNDLER - Message Bundler Protocol */ -static const value_string tipcv2_bundler_mtype_strings[]={ +static const value_string tipcv2_bundler_mtype_strings[] = { { 1, "Bundler"}, { 0, NULL} }; /* TIPCv2_LINK_PROTOCOL - Link State Maintenance Protocol */ -#define TIPCv2_STATE_MSG 0 -#define TIPCv2_RESET_MSG 1 -#define TIPCv2_ACTIV_MSG 2 +#define TIPCv2_STATE_MSG 0 +#define TIPCv2_RESET_MSG 1 +#define TIPCv2_ACTIV_MSG 2 -static const value_string tipcv2_link_mtype_strings[]={ +static const value_string tipcv2_link_mtype_strings[] = { { TIPCv2_STATE_MSG, "State"}, { TIPCv2_RESET_MSG, "Reset"}, { TIPCv2_ACTIV_MSG, "Activate"}, { 0, NULL} }; + /* TIPCv2_CONN_MANAGER - Connection Manager */ #define TIPCv2_CONMGR_CONN_PROBE 0 #define TIPCv2_CONMGR_CONN_PROBE_REPLY 1 #define TIPCv2_CONMGR_MSG_ACK 2 -static const value_string tipcv2_connmgr_mtype_strings[]={ - { TIPCv2_CONMGR_CONN_PROBE ,"Probe"}, - { TIPCv2_CONMGR_CONN_PROBE_REPLY ,"ProbeReply"}, - { TIPCv2_CONMGR_MSG_ACK ,"Ack"}, +static const value_string tipcv2_connmgr_mtype_strings[] = { + { TIPCv2_CONMGR_CONN_PROBE , "Probe"}, + { TIPCv2_CONMGR_CONN_PROBE_REPLY , "ProbeReply"}, + { TIPCv2_CONMGR_MSG_ACK , "Ack"}, { 0, NULL} }; -/* TIPCv2_ROUTE_DISTRIBUTOR - Routing Table Update Protocol */ +/* TIPCv2_ROUTE_DISTRIBUTOR - Routing Table Update Protocol */ /* for TIPC 1.6 */ -#define TIPCv2_EXT_ROUTING_TABLE 0 -#define TIPCv2_LOCAL_ROUTING_TABLE 1 -#define TIPCv2_SEC_ROUTING_TABLE 2 -#define TIPCv2_ROUTE_ADDITION 3 -#define TIPCv2_ROUTE_REMOVAL 4 +#define TIPCv2_EXT_ROUTING_TABLE 0 +#define TIPCv2_LOCAL_ROUTING_TABLE 1 +#define TIPCv2_SEC_ROUTING_TABLE 2 +#define TIPCv2_ROUTE_ADDITION 3 +#define TIPCv2_ROUTE_REMOVAL 4 /* for TIPC 1.7 */ #define TIPCv2_DIST_PUBLISH 0 #define TIPCv2_DIST_WITHDRAW 1 #define TIPCv2_DIST_PURGE 2 -static const value_string tipcv2_route_mtype_strings_1_6[]={ +static const value_string tipcv2_route_mtype_strings_1_6[] = { { 0, "ExtRoutingTab"}, { 1, "LocalRoutingTab"}, { 2, "SecRoutingTab"}, @@ -469,13 +482,15 @@ static const value_string tipcv2_route_mtype_strings_1_6[]={ { 4, "RouteRemoval"}, { 0, NULL} }; -static const value_string tipcv2_route_mtype_strings_1_7[]={ + +static const value_string tipcv2_route_mtype_strings_1_7[] = { { 0, "Dist Publish"}, { 1, "Dist Withdraw"}, { 2, "Dist Purge"}, { 0, NULL} }; -static const value_string tipcv2_dist_dist_strings[]={ + +static const value_string tipcv2_dist_dist_strings[] = { { 0, "Nowhere"}, { 1, "To Cluster"}, { 2, "To Zone"}, @@ -486,7 +501,8 @@ static const value_string tipcv2_dist_dist_strings[]={ { 7, "To Cluster, Zone and Network"}, { 0, NULL} }; -static const value_string tipcv2_dist_scope_strings[]={ + +static const value_string tipcv2_dist_scope_strings[] = { { 0, "Zone Scope"}, { 1, "Cluster Scope"}, { 2, "Node Scope"}, @@ -494,37 +510,38 @@ static const value_string tipcv2_dist_scope_strings[]={ }; /* TIPCv2_CHANGEOVER_PROTOCOL - Link Changeover Protocol */ -static const value_string tipcv2_changeover_mtype_strings[]={ +static const value_string tipcv2_changeover_mtype_strings[] = { { 0, "Duplicate"}, { 1, "Original"}, { 0, NULL} }; + /* TIPCv2_NAME_DISTRIBUTOR - Name Table Update Protocol */ -static const value_string tipcv2_naming_mtype_strings[]={ +static const value_string tipcv2_naming_mtype_strings[] = { { 0, "Publication"}, { 1, "Withdrawal"}, { 0, NULL} }; + /* TIPCv2_MSG_FRAGMENTER - Message Fragmentation Protocol" */ -static const value_string tipcv2_fragmenter_mtype_strings[]={ +static const value_string tipcv2_fragmenter_mtype_strings[] = { { 0, "First"}, { 1, "Fragment"}, { 2, "Last"}, { 0, NULL} }; -/* TIPCv2_NEIGHBOUR_DISCOVERY +/* TIPCv2_NEIGHBOUR_DISCOVERY * 4.3.9 Neighbour Detection Protocol */ -static const value_string tipcv2_neighbour_mtype_strings[]={ +static const value_string tipcv2_neighbour_mtype_strings[] = { { 0, "Request"}, { 1, "Response"}, { 0, NULL} }; - -static const value_string tipcv2_networkplane_strings[]={ +static const value_string tipcv2_networkplane_strings[] = { { 0, "A"}, { 1, "B"}, { 2, "C"}, @@ -534,9 +551,9 @@ static const value_string tipcv2_networkplane_strings[]={ { 0, NULL} }; - +/* functions forward declarations */ static void dissect_tipc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); - +void proto_reg_handoff_tipc(void); static GHashTable *tipc_msg_fragment_table = NULL; static GHashTable *tipc_msg_reassembled_table = NULL; @@ -558,7 +575,7 @@ tipc_addr_to_str(guint tipc_address) guint16 processor; gchar *buff; - buff=ep_alloc(MAX_TIPC_ADDRESS_STR_LEN); + buff = ep_alloc(MAX_TIPC_ADDRESS_STR_LEN); processor = tipc_address & 0x0fff; @@ -568,46 +585,46 @@ tipc_addr_to_str(guint tipc_address) tipc_address = tipc_address >> 12; zone = tipc_address & 0xff; - g_snprintf(buff,MAX_TIPC_ADDRESS_STR_LEN,"%u.%u.%u",zone,subnetwork,processor); + g_snprintf(buff, MAX_TIPC_ADDRESS_STR_LEN, "%u.%u.%u", zone, subnetwork, processor); return buff; } /* -All name distributor messages have a data part containing one or more table elements with -the following five-word structure: -struct DistributionItem{ - unsigned int type; / Published port name type / - unsigned int lower; / Lower bound of published sequence / - unsigned int upper; / Upper bound of published sequence / - unsigned int port; / Random number part of port identity / - unsigned int key; / Use for verification at withdrawal / -}; -*/ + All name distributor messages have a data part containing one or more table elements with + the following five-word structure: + struct DistributionItem { + unsigned int type; / Published port name type / + unsigned int lower; / Lower bound of published sequence / + unsigned int upper; / Upper bound of published sequence / + unsigned int port; / Random number part of port identity / + unsigned int key; / Use for verification at withdrawal / + }; + */ static void -dissect_tipc_name_dist_data(tvbuff_t *tvb, proto_tree *tree, guint8 item_size){ +dissect_tipc_name_dist_data(tvbuff_t *tvb, proto_tree *tree, guint8 item_size) +{ int offset = 0; guint32 dword; gchar *addr_str_ptr; - - if ((handle_v2_as & V2_AS_1_6) - || ((handle_v2_as & (V2_AS_ALL) && item_size==0))) { + + if ((handle_v2_as & V2_AS_1_6) || ((handle_v2_as & (V2_AS_ALL) && item_size == 0))) { /* TIPC 1.6 */ - while ( tvb_reported_length_remaining(tvb,offset) > 0){ - proto_tree_add_item(tree, hf_tipc_name_dist_type, tvb, offset, 4, FALSE); - offset = offset+4; - proto_tree_add_item(tree, hf_tipc_name_dist_lower, tvb, offset, 4, FALSE); - offset = offset+4; - proto_tree_add_item(tree, hf_tipc_name_dist_upper, tvb, offset, 4, FALSE); - offset = offset+4; - proto_tree_add_item(tree, hf_tipc_name_dist_port, tvb, offset, 4, FALSE); - offset = offset+4; - proto_tree_add_item(tree, hf_tipc_name_dist_key, tvb, offset, 4, FALSE); - offset = offset+4; + while (tvb_reported_length_remaining(tvb, offset) > 0) { + proto_tree_add_item(tree, hf_tipc_name_dist_type, tvb, offset, 4, FALSE); + offset = offset+4; + proto_tree_add_item(tree, hf_tipc_name_dist_lower, tvb, offset, 4, FALSE); + offset = offset+4; + proto_tree_add_item(tree, hf_tipc_name_dist_upper, tvb, offset, 4, FALSE); + offset = offset+4; + proto_tree_add_item(tree, hf_tipc_name_dist_port, tvb, offset, 4, FALSE); + offset = offset+4; + proto_tree_add_item(tree, hf_tipc_name_dist_key, tvb, offset, 4, FALSE); + offset = offset+4; } } else { /* TIPC 1.7 */ - while ( tvb_reported_length_remaining(tvb,offset) > 0){ + while (tvb_reported_length_remaining(tvb, offset) > 0) { proto_tree_add_item(tree, hf_tipc_name_dist_type, tvb, offset, 4, FALSE); offset = offset+4; proto_tree_add_item(tree, hf_tipc_name_dist_lower, tvb, offset, 4, FALSE); @@ -618,56 +635,56 @@ dissect_tipc_name_dist_data(tvbuff_t *tvb, proto_tree *tree, guint8 item_size){ offset = offset+4; proto_tree_add_item(tree, hf_tipc_name_dist_key, tvb, offset, 4, FALSE); offset = offset+4; - dword = tvb_get_ntohl(tvb,offset); + dword = tvb_get_ntohl(tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tree, hf_tipcv2_name_dist_port_id_node, tvb, offset, 4, addr_str_ptr); offset = offset+4; proto_tree_add_item(tree, hf_tipcv2_dist_dist, tvb, offset, 4, FALSE); proto_tree_add_item(tree, hf_tipcv2_dist_scope, tvb, offset, 4, FALSE); offset = offset + 4; - if(item_size == 7) continue; + if (item_size == 7) continue; /* if item_size is >7, the following fields are ignored * so far */ - proto_tree_add_text(tree, tvb, offset, ((item_size-7)*4),"This field is not specified in TIPC v7"); + proto_tree_add_text(tree, tvb, offset, ((item_size-7)*4), "This field is not specified in TIPC v7"); offset += (item_size-7)*4; } } } -/* Set message type in COL INFO and return type of message ( data or Internal message type */ +/* Set message type in COL INFO and return type of message (data or Internal message type */ static void -tipc_v2_set_info_col(tvbuff_t *tvb, packet_info *pinfo, guint8 user, guint8 msg_type, guint8 hdr_size){ - +tipc_v2_set_info_col(tvbuff_t *tvb, packet_info *pinfo, guint8 user, guint8 msg_type, guint8 hdr_size) +{ guint32 portNameInst, dword; guint32 portNameType, portNameInstLow, portNameInstHigh; guint8 error; - guint8 item_size=0; + guint8 item_size = 0; - switch (user){ + switch (user) { case TIPCv2_DATA_LOW: case TIPCv2_DATA_NORMAL: case TIPCv2_DATA_HIGH: case TIPCv2_DATA_NON_REJECTABLE: col_append_fstr(pinfo->cinfo, COL_INFO, " %s", val_to_str(msg_type, tipcv2_data_msg_type_defines, "unknown")); - /* Display Error!=0 in Info Column */ + /* Display Error != 0 in Info Column */ dword = tvb_get_ntohl(tvb, 4); error = (dword>>25) & 0xf; if (error > 0) col_append_fstr(pinfo->cinfo, COL_INFO, " %s", val_to_str(error, tipcv2_error_code_short_strings, "unknown")); - if (hdr_size > 8 ){ + if (hdr_size > 8) { /* Port Name Type: 32 bits */ portNameType = tvb_get_ntohl(tvb, 32); col_append_fstr(pinfo->cinfo, COL_INFO, " type:%d", portNameType); - if (hdr_size > 9 ){ + if (hdr_size > 9) { /* W9 name instance/multicast lower bound */ portNameInst = tvb_get_ntohl(tvb, 36); col_append_fstr(pinfo->cinfo, COL_INFO, " inst:%d", portNameInst); /* Port Name Sequence Lower: 32 bits */ - if (hdr_size > 10 ){ + if (hdr_size > 10) { portNameInst = tvb_get_ntohl(tvb, 40); col_append_fstr(pinfo->cinfo, COL_INFO, "-%d", portNameInst); - } + } } } break; @@ -682,7 +699,7 @@ tipc_v2_set_info_col(tvbuff_t *tvb, packet_info *pinfo, guint8 user, guint8 msg_ break; case TIPCv2_CONN_MANAGER: dword = tvb_get_ntohl(tvb, 4); - /* Display Error!=0 in Info Column */ + /* Display Error != 0 in Info Column */ error = (dword>>25) & 0xf; if (error > 0) col_append_fstr(pinfo->cinfo, COL_INFO, " %s", val_to_str(error, tipcv2_error_code_short_strings, "unknown")); @@ -690,13 +707,13 @@ tipc_v2_set_info_col(tvbuff_t *tvb, packet_info *pinfo, guint8 user, guint8 msg_ break; case TIPCv2_ROUTE_DISTRIBUTOR: /* determine if it is TIPC v1.6 or v1.7 */ - dword = tvb_get_ntohl(tvb,36); + dword = tvb_get_ntohl(tvb, 36); item_size = (dword >> 24) & 0xff; if ((handle_v2_as & V2_AS_1_6) || ((handle_v2_as & V2_AS_ALL) == 0)) { col_append_fstr(pinfo->cinfo, COL_INFO, " %s", val_to_str(msg_type, tipcv2_route_mtype_strings_1_6, "unknown")); } else { col_append_fstr(pinfo->cinfo, COL_INFO, " %s", val_to_str(msg_type, tipcv2_route_mtype_strings_1_7, "unknown")); - } + } break; case TIPCv2_CHANGEOVER_PROTOCOL: col_append_fstr(pinfo->cinfo, COL_INFO, " %s", val_to_str(msg_type, tipcv2_changeover_mtype_strings, "unknown")); @@ -706,11 +723,13 @@ tipc_v2_set_info_col(tvbuff_t *tvb, packet_info *pinfo, guint8 user, guint8 msg_ portNameInstLow = tvb_get_ntohl(tvb, 44); portNameInstHigh = tvb_get_ntohl(tvb, 48); - if( portNameInstLow == portNameInstHigh) { - col_append_fstr(pinfo->cinfo, COL_INFO, " %s type:%d inst:%d", val_to_str(msg_type, tipcv2_naming_mtype_strings, "unknown"), portNameType, portNameInstLow); + if (portNameInstLow == portNameInstHigh) { + col_append_fstr(pinfo->cinfo, COL_INFO, " %s type:%d inst:%d", + val_to_str(msg_type, tipcv2_naming_mtype_strings, "unknown"), portNameType, portNameInstLow); } else { /* sequence */ - col_append_fstr(pinfo->cinfo, COL_INFO, " %s type:%d seq:%d-%d", val_to_str(msg_type, tipcv2_naming_mtype_strings, "unknown"), portNameType, portNameInstLow, portNameInstHigh); + col_append_fstr(pinfo->cinfo, COL_INFO, " %s type:%d seq:%d-%d", + val_to_str(msg_type, tipcv2_naming_mtype_strings, "unknown"), portNameType, portNameInstLow, portNameInstHigh); } break; case TIPCv2_MSG_FRAGMENTER: @@ -720,97 +739,93 @@ tipc_v2_set_info_col(tvbuff_t *tvb, packet_info *pinfo, guint8 user, guint8 msg_ col_append_fstr(pinfo->cinfo, COL_INFO, " %s", val_to_str(msg_type, tipcv2_neighbour_mtype_strings, "unknown")); break; default: - break; + break; } } -/* Set message type in COL INFO and return type of message ( data or Internal message type */ +/* Set message type in COL INFO and return type of message (data or Internal message type */ static gboolean -tipc_v1_set_col_msgtype(packet_info *pinfo, guint8 user,guint8 msg_type){ - +tipc_v1_set_col_msgtype(packet_info *pinfo, guint8 user, guint8 msg_type) +{ gboolean datatype_hdr = FALSE; - switch (user){ - case TIPC_DATA_PRIO_0: + switch (user) { + case TIPC_DATA_PRIO_0: case TIPC_DATA_PRIO_1: case TIPC_DATA_PRIO_2: case TIPC_DATA_NON_REJECTABLE: - /* + /* * src and dest address will be found at different location depending on User ad hdr_size */ datatype_hdr = TRUE; if (check_col(pinfo->cinfo, COL_INFO)) - col_append_fstr(pinfo->cinfo, COL_INFO, "%s(%u) ", val_to_str(msg_type, tipc_data_msg_type_values, "unknown"),msg_type); + col_append_fstr(pinfo->cinfo, COL_INFO, "%s(%u) ", val_to_str(msg_type, tipc_data_msg_type_values, "unknown"), msg_type); break; case TIPC_NAME_DISTRIBUTOR: if (check_col(pinfo->cinfo, COL_INFO)) - col_append_fstr(pinfo->cinfo, COL_INFO, "%s(%u) ", val_to_str(msg_type, tipc_name_dist_msg_type_values, "unknown"),msg_type); + col_append_fstr(pinfo->cinfo, COL_INFO, "%s(%u) ", val_to_str(msg_type, tipc_name_dist_msg_type_values, "unknown"), msg_type); break; case TIPC_CONNECTION_MANAGER: if (check_col(pinfo->cinfo, COL_INFO)) - col_append_fstr(pinfo->cinfo, COL_INFO, "%s(%u) ", val_to_str(msg_type, tipc_cm_msg_type_values, "unknown"),msg_type); + col_append_fstr(pinfo->cinfo, COL_INFO, "%s(%u) ", val_to_str(msg_type, tipc_cm_msg_type_values, "unknown"), msg_type); break; case TIPC_ROUTING_MANAGER: if (check_col(pinfo->cinfo, COL_INFO)) - col_append_fstr(pinfo->cinfo, COL_INFO, "%s(%u) ", val_to_str(msg_type, tipc_routing_mgr_msg_type_values, "unknown"),msg_type); + col_append_fstr(pinfo->cinfo, COL_INFO, "%s(%u) ", val_to_str(msg_type, tipc_routing_mgr_msg_type_values, "unknown"), msg_type); break; case TIPC_LINK_PROTOCOL: if (check_col(pinfo->cinfo, COL_INFO)) - col_append_fstr(pinfo->cinfo, COL_INFO, "%s(%u) ", val_to_str(msg_type, tipc_link_prot_msg_type_values, "unknown"),msg_type); + col_append_fstr(pinfo->cinfo, COL_INFO, "%s(%u) ", val_to_str(msg_type, tipc_link_prot_msg_type_values, "unknown"), msg_type); break; case TIPC_CHANGEOVER_PROTOCOL: if (check_col(pinfo->cinfo, COL_INFO)) - col_append_fstr(pinfo->cinfo, COL_INFO, "%s(%u) ", val_to_str(msg_type, tipc_cng_prot_msg_type_values, "unknown"),msg_type); + col_append_fstr(pinfo->cinfo, COL_INFO, "%s(%u) ", val_to_str(msg_type, tipc_cng_prot_msg_type_values, "unknown"), msg_type); break; case TIPC_SEGMENTATION_MANAGER: if (check_col(pinfo->cinfo, COL_INFO)) - col_append_fstr(pinfo->cinfo, COL_INFO, "%s(%u) ", val_to_str(msg_type, tipc_sm_msg_type_values, "unknown"),msg_type); + col_append_fstr(pinfo->cinfo, COL_INFO, "%s(%u) ", val_to_str(msg_type, tipc_sm_msg_type_values, "unknown"), msg_type); break; case TIPC_MSG_BUNDLER: break; default: - break; + break; } return datatype_hdr; } - /* - Version 2(draft-maloy-tipc-01.txt): - -4.2.1 Internal Message Header Format - - - - 0 1 2 3 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - w0:|vers |msg usr|hdr sz |n|resrv| packet size | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - w1:|m typ|bcstsqgap| sequence gap | broadcast ack no | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - w2:| link level ack no | broadcast/link level seq no | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - w3:| previous node | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - w4:| next sent broadcast/fragm no | next sent pkt/ fragm msg no | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - w5:| session no | res |r|berid|link prio|netpl|p| - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - w6:| originating node | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - w7:| destination node | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - w8:| transport sequence number | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - w9:| msg count | link tolerance | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - \ \ - / User Specific Data / - \ \ - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - */ + Version 2(draft-maloy-tipc-01.txt): + 4.2.1 Internal Message Header Format + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +w0:|vers |msg usr|hdr sz |n|resrv| packet size | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +w1:|m typ|bcstsqgap| sequence gap | broadcast ack no | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +w2:| link level ack no | broadcast/link level seq no | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +w3:| previous node | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +w4:| next sent broadcast/fragm no | next sent pkt/ fragm msg no | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +w5:| session no | res |r|berid|link prio|netpl|p| + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +w6:| originating node | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +w7:| destination node | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +w8:| transport sequence number | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +w9:| msg count | link tolerance | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + \ \ + / User Specific Data / + \ \ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +*/ + static void dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_info *pinfo, int offset, guint8 user, guint32 msg_size, guint8 orig_hdr_size) { @@ -818,7 +833,7 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i gchar *addr_str_ptr; tvbuff_t *data_tvb; guint8 message_type; - guint8 item_size=0; + guint8 item_size = 0; guint16 message_count; guint msg_no = 0; guint32 msg_in_bundle_size; @@ -826,14 +841,14 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i /* for fragmented messages */ gint len, reported_len; - gboolean save_fragmented; + gboolean save_fragmented; guint32 frag_no, frag_msg_no; tvbuff_t* new_tvb = NULL; fragment_data *frag_msg = NULL; - message_type = (tvb_get_guint8(tipc_tvb,offset) >>5) & 0x7; + message_type = (tvb_get_guint8(tipc_tvb, offset) >>5) & 0x7; - switch (user){ + switch (user) { case TIPCv2_BCAST_PROTOCOL: /* W1 */ proto_tree_add_item(tipc_tree, hf_tipcv2_bcast_mtype, tipc_tvb, offset, 4, FALSE); @@ -846,35 +861,35 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i proto_tree_add_item(tipc_tree, hf_tipcv2_link_level_seq_no, tipc_tvb, offset, 4, FALSE); offset = offset + 4; /* W3 */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_prev_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; if (handle_v2_as & (V2_AS_1_6)) { /* W4-8 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 20,"Words 4-8 Unused for this user"); + proto_tree_add_text(tipc_tree, tipc_tvb, offset, 20, "words 4-8 unused for this user"); offset = offset + 20; } else { /* W4 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4,"Word 4 Unused for this user"); + proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4, "word 4 unused for this user"); offset = offset + 4; /* W5 */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_item(tipc_tree, hf_tipcv2_network_id, tipc_tvb, offset, 4, FALSE); offset = offset + 4; /* W6 */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_orig_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; /* W7 */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_dest_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; /* W8 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4,"Word 8 Unused for this user"); + proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4, "word 8 unused for this user"); offset = offset + 4; } /* W9 */ @@ -886,7 +901,7 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i if (handle_v2_as & (V2_AS_1_6)) { /* W1+W2 */ /* No message types */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 8,"Words 1+2 Unused for this user"); + proto_tree_add_text(tipc_tree, tipc_tvb, offset, 8, "words 1+2 unused for this user"); offset = offset + 8; } else { /* W1 */ @@ -898,54 +913,54 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i proto_tree_add_item(tipc_tree, hf_tipcv2_link_level_seq_no, tipc_tvb, offset, 4, FALSE); offset = offset + 4; } - /* W3 */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_prev_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; if (handle_v2_as & (V2_AS_1_6)) { /* W4-8 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 20,"Words 4-8 Unused for this user"); + proto_tree_add_text(tipc_tree, tipc_tvb, offset, 20, "words 4-8 unused for this user"); offset = offset + 20; } else { /* W4+5 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 8,"Words 4+5 Unused for this user"); + proto_tree_add_text(tipc_tree, tipc_tvb, offset, 8, "words 4+5 unused for this user"); offset = offset + 8; /* W6 */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_orig_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; /* W7 */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_dest_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; /* W8 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4,"Word 8 Unused for this user"); + proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4, "word 8 unused for this user"); offset = offset + 4; } /* W9 */ /* Message Count: 16 bits. */ proto_tree_add_item(tipc_tree, hf_tipcv2_msg_count, tipc_tvb, offset, 4, FALSE); - message_count = tvb_get_ntohs(tipc_tvb,offset); + message_count = tvb_get_ntohs(tipc_tvb, offset); /* According to the spec this should not be set here, * while there is data != 0 in this field when capturing * - proto_tree_add_item(tipc_tree, hf_tipcv2_link_tolerance, tipc_tvb, offset, 4, FALSE); + proto_tree_add_item(tipc_tree, hf_tipcv2_link_tolerance, tipc_tvb, offset, 4, FALSE); */ offset = offset + 4; /* This should give equal results like - * while (message_count-- > 0) {*/ - while ((guint32)offset < msg_size ){ + * while (message_count-- > 0) */ + while ((guint32)offset < msg_size) { msg_no++; dword = tvb_get_ntohl(tipc_tvb, offset); msg_in_bundle_size = dword & 0x1ffff; msg_in_bundle_user = (dword >> 25) & 0xf; - proto_tree_add_text(top_tree, tipc_tvb, offset, msg_in_bundle_size,"Message %u of %u in Bundle (%s)", msg_no, message_count, val_to_str(msg_in_bundle_user, tipcv2_user_short_str_vals, "unknown")); + proto_tree_add_text(top_tree, tipc_tvb, offset, msg_in_bundle_size, "Message %u of %u in Bundle (%s)", + msg_no, message_count, val_to_str(msg_in_bundle_user, tipcv2_user_short_str_vals, "unknown")); data_tvb = tvb_new_subset(tipc_tvb, offset, msg_in_bundle_size, msg_in_bundle_size); /* the info column shall not be deleted by the @@ -975,7 +990,7 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i proto_tree_add_item(tipc_tree, hf_tipcv2_link_level_seq_no, tipc_tvb, offset, 4, FALSE); offset = offset + 4; /* W3 */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_prev_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; @@ -1004,16 +1019,16 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i offset = offset + 4; if (handle_v2_as & (V2_AS_1_6)) { /* W6-8 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 12,"Words 6-8 Unused for this user"); + proto_tree_add_text(tipc_tree, tipc_tvb, offset, 12, "words 6-8 unused for this user"); offset = offset + 12; } else { /* W6 */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_orig_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; /* W7 */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_dest_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; @@ -1026,37 +1041,37 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i /* Link Tolerance: 16 bits */ proto_tree_add_item(tipc_tree, hf_tipcv2_link_tolerance, tipc_tvb, offset, 4, FALSE); offset = offset + 4; - - if ((message_type == TIPCv2_RESET_MSG) - || ((message_type == TIPCv2_STATE_MSG) && ((msg_size-(orig_hdr_size*4)) !=0))) /* is allowed */ + + if ((message_type == TIPCv2_RESET_MSG) + || ((message_type == TIPCv2_STATE_MSG) && ((msg_size-(orig_hdr_size*4)) != 0))) /* is allowed */ proto_tree_add_item(tipc_tree, hf_tipcv2_bearer_instance, tipc_tvb, offset, -1, FALSE); break; case TIPCv2_CONN_MANAGER: /* CONN_MANAGER uses the 36-byte header format of CONN_MSG payload messages */ - /* W1 */ + /* W1 */ proto_tree_add_item(tipc_tree, hf_tipcv2_connmgr_mtype, tipc_tvb, offset, 4, FALSE); proto_tree_add_item(tipc_tree, hf_tipcv2_errorcode, tipc_tvb, offset, 4, FALSE); proto_tree_add_item(tipc_tree, hf_tipcv2_rer_cnt, tipc_tvb, offset, 4, FALSE); proto_tree_add_item(tipc_tree, hf_tipcv2_lookup_scope, tipc_tvb, offset, 4, FALSE); /* Options Position: 3 bits */ - /* this is not used by this user according to Jon Maloy in tipc-discussion mailing list - opt_p = tvb_get_guint8(tipc_tvb, offset+1) & 0x7; - proto_tree_add_item(tipc_tree, hf_tipcv2_opt_p , tipc_tvb, offset, 4, FALSE); - if (opt_p != 0){ - hdr_size = hdr_size - (opt_p << 2); - } - */ + /* this is not used by this user according to Jon Maloy in tipc-discussion mailing list + opt_p = tvb_get_guint8(tipc_tvb, offset+1) & 0x7; + proto_tree_add_item(tipc_tree, hf_tipcv2_opt_p , tipc_tvb, offset, 4, FALSE); + if (opt_p != 0) { + hdr_size = hdr_size - (opt_p << 2); + } + */ proto_tree_add_item(tipc_tree, hf_tipcv2_broadcast_ack_no , tipc_tvb, offset, 4, FALSE); offset = offset + 4; - /* W2 */ + /* W2 */ proto_tree_add_item(tipc_tree, hf_tipcv2_link_level_ack_no , tipc_tvb, offset, 4, FALSE); proto_tree_add_item(tipc_tree, hf_tipcv2_link_level_seq_no , tipc_tvb, offset, 4, FALSE); offset = offset + 4; /* W3 */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_prev_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; @@ -1070,35 +1085,35 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i offset = offset + 4; /* W6 */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_orig_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; /* W7 */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_dest_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; /* W8 */ - /* according to Allan Stephens this was never verfied by the receiver - proto_tree_add_item(tipc_tree, hf_tipcv2_transport_seq_no, tipc_tvb, offset, 4, FALSE); - */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4,"Word 8 Unused for this user (might be set prior to 1.7.3 but was never verified)"); + /* according to Allan Stephens this was never verfied by the receiver + proto_tree_add_item(tipc_tree, hf_tipcv2_transport_seq_no, tipc_tvb, offset, 4, FALSE); + */ + proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4, "word 8 unused for this user (might be set prior to 1.7.3 but was never verified)"); offset = offset + 4; - /* this is not used here according to Jon Maloy in tipc-discussion mailing list + /* this is not used here according to Jon Maloy in tipc-discussion mailing list * Options - if (opt_p != 0){ - proto_tree_add_text(tipc_tree, tipc_tvb, offset,(opt_p >> 2),"Options"); - offset = offset + (opt_p << 2); - } - */ + if (opt_p != 0) { + proto_tree_add_text(tipc_tree, tipc_tvb, offset, (opt_p >> 2), "Options"); + offset = offset + (opt_p << 2); + } + */ - if ( message_type == TIPCv2_CONMGR_MSG_ACK || (handle_v2_as & (V2_AS_ALL + V2_AS_1_7))) + if (message_type == TIPCv2_CONMGR_MSG_ACK || (handle_v2_as & (V2_AS_ALL + V2_AS_1_7))) { /* W9 */ proto_tree_add_item(tipc_tree, hf_tipcv2_conn_mgr_msg_ack, tipc_tvb, offset, 4, FALSE); @@ -1108,13 +1123,13 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i case TIPCv2_ROUTE_DISTRIBUTOR: /* W1 */ /* determine if it is TIPC v1.6 or v1.7 */ - dword = tvb_get_ntohl(tipc_tvb,offset+28); + dword = tvb_get_ntohl(tipc_tvb, offset+28); item_size = (dword >> 24) & 0xff; if ((handle_v2_as & V2_AS_1_6) || ((handle_v2_as & V2_AS_ALL) == 0)) { proto_tree_add_item(tipc_tree, hf_tipcv2_route_mtype_1_6, tipc_tvb, offset, 4, FALSE); } else { proto_tree_add_item(tipc_tree, hf_tipcv2_route_mtype_1_7, tipc_tvb, offset, 4, FALSE); - } + } proto_tree_add_item(tipc_tree, hf_tipcv2_broadcast_ack_no, tipc_tvb, offset, 4, FALSE); offset = offset + 4; /* W2 */ @@ -1122,7 +1137,7 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i proto_tree_add_item(tipc_tree, hf_tipcv2_link_level_seq_no, tipc_tvb, offset, 4, FALSE); offset = offset + 4; /* W3 */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_prev_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; @@ -1130,44 +1145,44 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i if (handle_v2_as & V2_AS_1_6) { /* W4-9 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 24,"Words 4-9 Unused for this user"); + proto_tree_add_text(tipc_tree, tipc_tvb, offset, 24, "words 4-9 unused for this user"); offset = offset + 24; } else { /* W4 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4,"Word 4 Unused for this user"); + proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4, "word 4 unused for this user"); offset = offset + 4; /* W5 */ proto_tree_add_item(tipc_tree, hf_tipc_dst_port, tipc_tvb, offset, 4, FALSE); offset = offset + 4; /* W6 */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_orig_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; /* W7 */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_dest_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; /* W8 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4,"Word 8 Unused for this user"); + proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4, "word 8 unused for this user"); offset = offset + 4; /* W9 */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); item_size = (dword >> 24) & 0xff; proto_tree_add_item(tipc_tree, hf_tipcv2_item_size, tipc_tvb, offset, 4, FALSE); offset = offset + 4; } - /* item_size==0 indicates that it's TIPC v1.6 style */ - if ( (handle_v2_as & V2_AS_1_6) || ((handle_v2_as & V2_AS_ALL) && (item_size==0))) { + /* item_size == 0 indicates that it's TIPC v1.6 style */ + if ((handle_v2_as & V2_AS_1_6) || ((handle_v2_as & V2_AS_ALL) && (item_size == 0))) { /* W10 */ - switch (message_type){ + switch (message_type) { case TIPCv2_EXT_ROUTING_TABLE: /* 0 */ case TIPCv2_LOCAL_ROUTING_TABLE: /* 1 */ case TIPCv2_SEC_ROUTING_TABLE: /* 2 */ /* Cluster Address */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_cluster_address, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; @@ -1177,7 +1192,7 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i case TIPCv2_ROUTE_ADDITION: /* 3 */ case TIPCv2_ROUTE_REMOVAL: /* 4 */ /* Node Address */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_node_address, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; @@ -1186,15 +1201,15 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i } } else { /* what if item_size is set to a value fitting to TIPC v1.6 ? */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_network_region, tipc_tvb, offset, 4, addr_str_ptr); offset += 4; - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_local_router, tipc_tvb, offset, 4, addr_str_ptr); offset += 4; - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_remote_router, tipc_tvb, offset, 4, addr_str_ptr); offset += 4; @@ -1214,12 +1229,12 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i proto_tree_add_item(tipc_tree, hf_tipcv2_link_level_seq_no, tipc_tvb, offset, 4, FALSE); offset = offset + 4; /* W3 */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_prev_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; /* W4 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4,"Word 4 Unused for this user"); + proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4, "word 4 unused for this user"); offset = offset + 4; /* W5 */ /* the following two fields appear in this user according to */ @@ -1234,21 +1249,21 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i /* W6-W8 */ if (handle_v2_as & (V2_AS_1_6)) { /* W6-8 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 12,"Words 6-8 Unused for this user"); + proto_tree_add_text(tipc_tree, tipc_tvb, offset, 12, "words 6-8 unused for this user"); offset = offset + 12; } else { /* W6 */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_orig_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; /* W7 */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_dest_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; /* W8 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4,"Word 8 Unused for this user"); + proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4, "word 8 unused for this user"); offset = offset + 4; } /* W9 */ @@ -1256,7 +1271,7 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i { case 0: /* DUPLICATE_MSG */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4,"Word 9 Unused for this message type"); + proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4, "word 9 Unused for this message type"); break; case 1: /* ORIGINAL_MSG */ @@ -1278,22 +1293,22 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i proto_tree_add_item(tipc_tree, hf_tipcv2_link_level_seq_no, tipc_tvb, offset, 4, FALSE); offset = offset + 4; /* W3 */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_prev_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; /* W4+W5 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 8,"Words 4+5 Unused for this user"); + proto_tree_add_text(tipc_tree, tipc_tvb, offset, 8, "words 4+5 unused for this user"); offset = offset + 8; /* W6 */ /* Originating Node: 32 bits. */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_orig_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; /* W7 */ /* Destination Node: 32 bits. */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_dest_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; @@ -1303,19 +1318,19 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i proto_tree_add_item(tipc_tree, hf_tipcv2_transport_seq_no, tipc_tvb, offset, 4, FALSE); offset = offset + 4; } else { - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4,"Word 8 Unused for this user"); + proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4, "word 8 unused for this user"); offset = offset + 4; } /* W9 */ if (handle_v2_as & V2_AS_1_6) { - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4,"Word 9 Unused for this user"); + proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4, "word 9 unused for this user"); offset = offset + 4; - } else { - dword = tvb_get_ntohl(tipc_tvb,offset); + } else { + dword = tvb_get_ntohl(tipc_tvb, offset); item_size = (dword >> 24) & 0xff; proto_tree_add_item(tipc_tree, hf_tipcv2_item_size, tipc_tvb, offset, 4, FALSE); offset = offset + 4; - } + } /* W10 */ /* dissect the (one or more) Publications */ data_tvb = tvb_new_subset(tipc_tvb, offset, -1, -1); @@ -1331,12 +1346,12 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i proto_tree_add_item(tipc_tree, hf_tipcv2_link_level_seq_no, tipc_tvb, offset, 4, FALSE); offset = offset + 4; /* W3 */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_prev_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; /* W4 */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); /* Fragment Number: 16 Bits. */ proto_tree_add_item(tipc_tree, hf_tipcv2_fragment_number, tipc_tvb, offset, 4, FALSE); frag_no = (dword >> 16) & 0x0000ffff; @@ -1346,44 +1361,44 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i offset = offset + 4; if (handle_v2_as & (V2_AS_1_6)) { /* W5-W9 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 20,"Words 5-9 Unused for this user"); + proto_tree_add_text(tipc_tree, tipc_tvb, offset, 20, "words 5-9 unused for this user"); offset = offset + 20; } else { /* W5 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4,"Word 5 Unused for this user"); + proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4, "word 5 unused for this user"); offset = offset + 4; /* W6 */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_orig_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; /* W7 */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_dest_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; /* W8+9 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 8,"Words 8+9 Unused for this user"); + proto_tree_add_text(tipc_tree, tipc_tvb, offset, 8, "words 8+9 unused for this user"); offset = offset + 8; } len = (msg_size - (orig_hdr_size<<2)); reported_len = tvb_reported_length_remaining(tipc_tvb, offset); - if (tipc_defragment){ + if (tipc_defragment) { /* reassemble fragmented packages */ save_fragmented = pinfo->fragmented; pinfo->fragmented = TRUE; frag_msg = fragment_add_seq_check(tipc_tvb, offset, pinfo, - frag_msg_no, /* ID for fragments belonging together */ - /* TODO: make sure that fragments are on the same LINK */ - tipc_msg_fragment_table, /* list of message fragments */ - tipc_msg_reassembled_table, /* list of reassembled messages */ + frag_msg_no, /* ID for fragments belonging together */ + /* TODO: make sure that fragments are on the same LINK */ + tipc_msg_fragment_table, /* list of message fragments */ + tipc_msg_reassembled_table, /* list of reassembled messages */ /* TIPC starts with "1" but we * need "0" */ - (frag_no-1), /* number of the fragment */ - len, /* fragment length - to the end of the data */ - (message_type != TIPCv2_USER_LAST_FRAGMENT)); /* More fragments? */ + (frag_no-1), /* number of the fragment */ + len, /* fragment length - to the end of the data */ + (message_type != TIPCv2_USER_LAST_FRAGMENT)); /* More fragments? */ new_tvb = process_reassembled_data(tipc_tvb, offset, pinfo, "Reassembled Message", frag_msg, &tipc_msg_frag_items, @@ -1391,7 +1406,7 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i if (frag_msg) { /* Reassembled */ if (check_col(pinfo->cinfo, COL_INFO)) - col_append_str(pinfo->cinfo, COL_INFO, + col_append_str(pinfo->cinfo, COL_INFO, " (Message Reassembled)"); } else { /* Not last packet of reassembled Short Message */ if (check_col(pinfo->cinfo, COL_INFO)) @@ -1407,7 +1422,7 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i col_append_str(pinfo->cinfo, COL_INFO, " | "); col_set_fence(pinfo->cinfo, COL_INFO); } - dissect_tipc( new_tvb, pinfo, top_tree); + dissect_tipc(new_tvb, pinfo, top_tree); } else { /* make a new subset */ data_tvb = tvb_new_subset(tipc_tvb, offset, len, reported_len); call_dissector(data_handle, data_tvb, pinfo, top_tree); @@ -1424,36 +1439,36 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i case TIPCv2_NEIGHBOUR_DISCOVERY: /* The protocol for neighbour detection - uses a special message format, with the following generic structure: - - 0 1 2 3 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - w0:|vers |msg usr|hdr sz |n|resrv| packet size | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - w1:|m typ|0| requested links | broadcast ack no | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - w2:| destination domain | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - w3:| previous node | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - w4:| network identity | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - w5:| | - +-+-+-+-+-+-+- +-+-+-+-+-+-+-+ - w6:| | - +-+-+-+-+-+-+- bearer level originating address +-+-+-+-+-+-+-+ - w7:| | - +-+-+-+-+-+-+- +-+-+-+-+-+-+-+ - w8:| | - +-+-+-+-+-+-+- +-+-+-+-+-+-+-+ - w9:| | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - \ \ - / vendor specific data (optional) / - \ \ - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - */ +uses a special message format, with the following generic structure: + +0 1 2 3 +0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +w0:|vers |msg usr|hdr sz |n|resrv| packet size | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +w1:|m typ|0| requested links | broadcast ack no | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +w2:| destination domain | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +w3:| previous node | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +w4:| network identity | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +w5:| | + +-+-+-+-+-+-+- +-+-+-+-+-+-+-+ +w6:| | + +-+-+-+-+-+-+- bearer level originating address +-+-+-+-+-+-+-+ +w7:| | + +-+-+-+-+-+-+- +-+-+-+-+-+-+-+ +w8:| | + +-+-+-+-+-+-+- +-+-+-+-+-+-+-+ +w9:| | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + \ \ + / vendor specific data (optional) / + \ \ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +*/ /* W1 */ proto_tree_add_item(tipc_tree, hf_tipcv2_neighbour_mtype, tipc_tvb, offset, 4, FALSE); /* Requested Links (12 bits) */ @@ -1462,18 +1477,18 @@ The protocol for neighbour detection offset = offset + 4; /* W2 */ /* Destination Domain */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_destination_domain, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; /* W3 */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_prev_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; /* W4 */ /* Network Identity: */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_item(tipc_tree, hf_tipcv2_network_id, tipc_tvb, offset, 4, FALSE); offset = offset + 4; @@ -1489,22 +1504,20 @@ The protocol for neighbour detection proto_tree_add_item(tipc_tree, hf_tipcv2_bearer_level_orig_addr, tipc_tvb, offset, 16, FALSE); offset = offset + 16; } - if(msg_size-(orig_hdr_size*4) !=0) { - proto_tree_add_text(tipc_tree, tipc_tvb, offset, -1,"Vendor specific data"); + if (msg_size-(orig_hdr_size*4) != 0) { + proto_tree_add_text(tipc_tree, tipc_tvb, offset, -1, "Vendor specific data"); } break; default: - break; + break; } } -/* Version 2 Header +/* Version 2 Header http://tipc.sourceforge.net/doc/draft-spec-tipc-02.html#sec:TIPC_Pkt_Format 3.1.1. Payload Message Header Format - - 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -1534,9 +1547,7 @@ wA:| multicast upper bound | \ options \ / / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - - */ +*/ /* this function tries to call subdissectors for encapsulated data * @name_type pointer to the used port name type, NULL if not available @@ -1545,7 +1556,7 @@ wA:| multicast upper bound | static void call_tipc_v2_data_subdissectors(tvbuff_t *data_tvb, packet_info *pinfo, guint32 *name_type_p, guint8 user) { - if( dissect_tipc_data) { + if (dissect_tipc_data) { /* dissection of TIPC data is set in preferences */ /* check for heuristic dissectors if specified in the @@ -1556,12 +1567,12 @@ call_tipc_v2_data_subdissectors(tvbuff_t *data_tvb, packet_info *pinfo, guint32 } /* This triggers if a dissectors if * tipc.user is just set to a TIPC user holding data */ - if( dissector_try_port(tipc_user_dissector, user, data_tvb, pinfo, top_tree)) + if (dissector_try_port(tipc_user_dissector, user, data_tvb, pinfo, top_tree)) return; /* The Name Type is not always explicitly set in a TIPC Data - * Message. + * Message. * - * On the tipc-discussion mailinglist, Allan Stephens described + * On the tipc-discussion mailinglist, Allan Stephens described * where the Port Name is not set with the following words: * * <cite> @@ -1573,7 +1584,7 @@ call_tipc_v2_data_subdissectors(tvbuff_t *data_tvb, packet_info *pinfo, guint32 * since the sending socket/port already knows the port ID of the other end * of the connection, there is no need for any port name information to be * present in the TIPC header. - * + * * The "direct" type is used to carry connectionless traffic to a * destination that was specified using a port ID, rather than a port name; * again, no port name info is present in the TIPC header because it is not @@ -1589,8 +1600,8 @@ call_tipc_v2_data_subdissectors(tvbuff_t *data_tvb, packet_info *pinfo, guint32 * TODO: it should be determined by * some kind of static function which port name type a message * is going to, if it is not specified explicitly in a message */ - if( name_type_p) - if( dissector_try_port(tipc_type_dissector, *name_type_p, data_tvb, pinfo, top_tree)) + if (name_type_p) + if (dissector_try_port(tipc_type_dissector, *name_type_p, data_tvb, pinfo, top_tree)) return; /* check for heuristic dissectors if specified in the * preferences not to try them first */ @@ -1600,8 +1611,7 @@ call_tipc_v2_data_subdissectors(tvbuff_t *data_tvb, packet_info *pinfo, guint32 } } - /* dissection of TIPC data is not set in preferences or no subdissector - * found */ + /* dissection of TIPC data is not set in preferences or no subdissector found */ call_dissector(data_handle, data_tvb, pinfo, top_tree); } @@ -1612,48 +1622,46 @@ dissect_tipc_v2(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_info *pinfo, i { guint32 dword; gchar *addr_str_ptr; - guint8 opt_p=0; + guint8 opt_p = 0; proto_item *item; /* The unit used is 32 bit words */ guint8 orig_hdr_size; - guint32 name_type=0; - guint32 *name_type_p=NULL; + guint32 name_type = 0; + guint32 *name_type_p = NULL; tvbuff_t *data_tvb; gint len, reported_len; orig_hdr_size = hdr_size; - /* - * Word 0 - */ + /* Word 0 */ /* Version: 3 bits */ proto_tree_add_item(tipc_tree, hf_tipc_ver, tipc_tvb, offset, 4, FALSE); /* User: 4 bits */ proto_tree_add_item(tipc_tree, hf_tipcv2_usr, tipc_tvb, offset, 4, FALSE); /* Header Size: 4 bits */ item = proto_tree_add_item(tipc_tree, hf_tipc_hdr_size, tipc_tvb, offset, 4, FALSE); - proto_item_append_text(item, " = %u Bytes",(hdr_size * 4)); + proto_item_append_text(item, " = %u Bytes", (hdr_size * 4)); /* Non-sequenced: 1 bit */ - proto_tree_add_item(tipc_tree,hf_tipc_nonsequenced, tipc_tvb,offset,4, FALSE); - if (datatype_hdr){ + proto_tree_add_item(tipc_tree, hf_tipc_nonsequenced, tipc_tvb, offset, 4, FALSE); + if (datatype_hdr) { /* Destination Droppable: 1 bit */ - proto_tree_add_item(tipc_tree,hf_tipc_destdrop, tipc_tvb,offset,4, FALSE); + proto_tree_add_item(tipc_tree, hf_tipc_destdrop, tipc_tvb, offset, 4, FALSE); /* Source Droppable: 1 bit */ - proto_tree_add_item(tipc_tree,hf_tipcv2_srcdrop, tipc_tvb,offset,4, FALSE); + proto_tree_add_item(tipc_tree, hf_tipcv2_srcdrop, tipc_tvb, offset, 4, FALSE); } /* Reserved: 1 bits */ /* Message Size: 17 bits */ proto_tree_add_item(tipc_tree, hf_tipc_msg_size, tipc_tvb, offset, 4, FALSE); offset = offset + 4; - - if (!datatype_hdr){ + + if (!datatype_hdr) { dissect_tipc_v2_internal_msg(tipc_tvb, tipc_tree, pinfo, offset, user, msg_size, orig_hdr_size); return; } - /* Word 1 */ + /* Word 1 */ /* Message Type: 3 bits */ proto_tree_add_item(tipc_tree, hf_tipcv2_data_msg_type, tipc_tvb, offset, 4, FALSE); /* Error Code: 4 bits */ @@ -1668,22 +1676,22 @@ dissect_tipc_v2(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_info *pinfo, i if (handle_v2_as & (V2_AS_ALL + V2_AS_1_6)) { opt_p = tvb_get_guint8(tipc_tvb, offset+1) & 0x7; proto_tree_add_item(tipc_tree, hf_tipcv2_opt_p, tipc_tvb, offset, 4, FALSE); - if (opt_p != 0){ - hdr_size = hdr_size - (opt_p << 2); + if (opt_p != 0) { + hdr_size = hdr_size - (opt_p << 2); } } /* Broadcast Acknowledge Number: 16 bits */ proto_tree_add_item(tipc_tree, hf_tipcv2_broadcast_ack_no, tipc_tvb, offset, 4, FALSE); offset = offset + 4; - /* W2 */ + /* W2 */ /* Link Level Acknowledge Number: 16 bits */ proto_tree_add_item(tipc_tree, hf_tipcv2_link_level_ack_no, tipc_tvb, offset, 4, FALSE); /* broadcast/link level seq no */ proto_tree_add_item(tipc_tree, hf_tipcv2_link_level_seq_no, tipc_tvb, offset, 4, FALSE); offset = offset + 4; /* W3 previous node */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_prev_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; @@ -1695,19 +1703,19 @@ dissect_tipc_v2(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_info *pinfo, i /* W5 Destination Port: 32 bits */ proto_tree_add_item(tipc_tree, hf_tipc_dst_port, tipc_tvb, offset, 4, FALSE); offset = offset + 4; - if (hdr_size > 6 ){ + if (hdr_size > 6) { /* W6 Originating Node: 32 bits */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_orig_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; /* W7 Destination Node: 32 bits */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipcv2_dest_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; - if (hdr_size > 8 ){ + if (hdr_size > 8) { /* W8 name type / transport sequence number */ /* Transport Level Sequence Number: 32 bits */ /* Port Name Type: 32 bits */ @@ -1715,8 +1723,8 @@ dissect_tipc_v2(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_info *pinfo, i name_type = tvb_get_ntohl(tipc_tvb, offset); name_type_p = &name_type; offset = offset + 4; - - if (hdr_size > 9 ){ + + if (hdr_size > 9) { /* W9 name instance/multicast lower bound */ if (hdr_size < 11) /* no multicast */ @@ -1726,21 +1734,21 @@ dissect_tipc_v2(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_info *pinfo, i /* multicast */ /* Port Name Sequence Lower: 32 bits */ proto_tree_add_item(tipc_tree, hf_tipcv2_multicast_lower, tipc_tvb, offset, 4, FALSE); - offset = offset + 4; - if (hdr_size > 10 ){ + offset = offset + 4; + if (hdr_size > 10) { /* W10 multicast upper bound */ /* Port Name Sequence Upper: 32 bits */ proto_tree_add_item(tipc_tree, hf_tipcv2_multicast_upper, tipc_tvb, offset, 4, FALSE); offset = offset + 4; - } + } } } } /* Options */ if (handle_v2_as & (V2_AS_ALL + V2_AS_1_6)) { - if (opt_p != 0){ - proto_tree_add_text(tipc_tree, tipc_tvb, offset,(opt_p >> 2),"Options"); + if (opt_p != 0) { + proto_tree_add_text(tipc_tree, tipc_tvb, offset, (opt_p >> 2), "Options"); offset = offset + (opt_p << 2); } } @@ -1749,20 +1757,20 @@ dissect_tipc_v2(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_info *pinfo, i reported_len = tvb_reported_length_remaining(tipc_tvb, offset); data_tvb = tvb_new_subset(tipc_tvb, offset, len, reported_len); - call_tipc_v2_data_subdissectors( data_tvb, pinfo, name_type_p, user); + call_tipc_v2_data_subdissectors(data_tvb, pinfo, name_type_p, user); } /* From message.h (http://cvs.sourceforge.net/viewcvs.py/tipc/source/stable_ericsson/TIPC_SCC/src/Message.h?rev=1.2&view=markup) - //////////////////////////////////////////////////////////////////// - TIPC internal header format, version 1: +//////////////////////////////////////////////////////////////////// +TIPC internal header format, version 1: : : | Word 0-2: common to all users | | | +-------+-------+-------+-------+-------+-------+-------+-------+ |netw-|imp|link | | |p|bea- |link | -w3:|ork |ort|sel- | message count | |r|rer |sel- | - |id |anc|ector| | |b|id |ector| +w3:|ork |ort|sel- | message count | |r|rer |sel- | + |id |anc|ector| | |b|id |ector| +-------+-------+-------+-------+-------+-------+-------+-------+ | | w4:| remote address | @@ -1793,15 +1801,12 @@ wa:| | | | +-------+-------+-------+-------+-------+-------+-------+-------+ - NB: Connection Manager and Name Distributor use data message format. - - - +NB: Connection Manager and Name Distributor use data message format. */ static void -dissect_tipc_int_prot_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tipc_tree,int offset,guint8 user, guint32 msg_size) -{ +dissect_tipc_int_prot_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tipc_tree, int offset, guint8 user, guint32 msg_size) +{ guint8 msg_type; tvbuff_t *data_tvb; guint16 message_count; @@ -1813,77 +1818,77 @@ dissect_tipc_int_prot_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tipc_tr guint32 reassembled_msg_length = 0; guint32 no_of_segments = 0; - gboolean save_fragmented; + gboolean save_fragmented; tvbuff_t* new_tvb = NULL; tvbuff_t* next_tvb = NULL; fragment_data *frag_msg = NULL; proto_item *item; - - link_lev_seq_no = tvb_get_ntohl(tvb,4) & 0xffff; + + link_lev_seq_no = tvb_get_ntohl(tvb, 4) & 0xffff; /* Internal Protocol Header */ /* Unused */ - msg_type = tvb_get_guint8(tvb,20)>>4; + msg_type = tvb_get_guint8(tvb, 20)>>4; /* W3 */ - dword = tvb_get_ntohl(tvb,offset); + dword = tvb_get_ntohl(tvb, offset); link_sel = dword & 0x7; proto_tree_add_item(tipc_tree, hf_tipc_unused2, tvb, offset, 4, FALSE); /* Importance */ - if ( user == TIPC_SEGMENTATION_MANAGER) + if (user == TIPC_SEGMENTATION_MANAGER) proto_tree_add_item(tipc_tree, hf_tipc_importance, tvb, offset, 4, FALSE); /* Link selector */ - if ( user == TIPC_SEGMENTATION_MANAGER || user == TIPC_NAME_DISTRIBUTOR || user == TIPC_CHANGEOVER_PROTOCOL ) + if (user == TIPC_SEGMENTATION_MANAGER || user == TIPC_NAME_DISTRIBUTOR || user == TIPC_CHANGEOVER_PROTOCOL) proto_tree_add_item(tipc_tree, hf_tipc_link_selector, tvb, offset, 4, FALSE); /* Message count */ - if ( user == TIPC_MSG_BUNDLER || user == TIPC_CHANGEOVER_PROTOCOL ){ - message_count = tvb_get_ntohs(tvb,offset+2); + if (user == TIPC_MSG_BUNDLER || user == TIPC_CHANGEOVER_PROTOCOL) { + message_count = tvb_get_ntohs(tvb, offset+2); proto_tree_add_item(tipc_tree, hf_tipc_msg_cnt, tvb, offset, 4, FALSE); } /* Unused */ /* Probe */ - if ( user == TIPC_LINK_PROTOCOL ) + if (user == TIPC_LINK_PROTOCOL) proto_tree_add_item(tipc_tree, hf_tipc_probe, tvb, offset, 4, FALSE); /* Bearer identity */ - if ( user == TIPC_LINK_PROTOCOL || user == TIPC_CHANGEOVER_PROTOCOL ) + if (user == TIPC_LINK_PROTOCOL || user == TIPC_CHANGEOVER_PROTOCOL) proto_tree_add_item(tipc_tree, hf_tipc_bearer_id, tvb, offset, 4, FALSE); /* Link selector */ - if ( user == TIPC_SEGMENTATION_MANAGER || user == TIPC_NAME_DISTRIBUTOR || user == TIPC_CHANGEOVER_PROTOCOL ) + if (user == TIPC_SEGMENTATION_MANAGER || user == TIPC_NAME_DISTRIBUTOR || user == TIPC_CHANGEOVER_PROTOCOL) proto_tree_add_item(tipc_tree, hf_tipc_link_selector2, tvb, offset, 4, FALSE); - + offset = offset + 4; /* W4 */ /* Remote address */ - if ( user == TIPC_ROUTING_MANAGER ) + if (user == TIPC_ROUTING_MANAGER) proto_tree_add_item(tipc_tree, hf_tipc_remote_addr, tvb, offset, 4, FALSE); offset = offset + 4; - + /* W5 */ /* Message type */ - switch (user){ - case TIPC_ROUTING_MANAGER: - proto_tree_add_item(tipc_tree, hf_tipc_rm_msg_type, tvb, offset, 4, FALSE); - break; - case TIPC_NAME_DISTRIBUTOR: - proto_tree_add_item(tipc_tree, hf_tipc_nd_msg_type, tvb, offset, 4, FALSE); - break; - case TIPC_CONNECTION_MANAGER: - break; - case TIPC_LINK_PROTOCOL: - proto_tree_add_item(tipc_tree, hf_tipc_lp_msg_type, tvb, offset, 4, FALSE); - break; - case TIPC_CHANGEOVER_PROTOCOL: - proto_tree_add_item(tipc_tree, hf_tipc_cng_prot_msg_type, tvb, offset, 4, FALSE); - break; - case TIPC_SEGMENTATION_MANAGER: - proto_tree_add_item(tipc_tree, hf_tipc_sm_msg_type, tvb, offset, 4, FALSE); - break; - default: - proto_tree_add_item(tipc_tree, hf_tipc_unknown_msg_type, tvb, offset, 4, FALSE); - break; + switch (user) { + case TIPC_ROUTING_MANAGER: + proto_tree_add_item(tipc_tree, hf_tipc_rm_msg_type, tvb, offset, 4, FALSE); + break; + case TIPC_NAME_DISTRIBUTOR: + proto_tree_add_item(tipc_tree, hf_tipc_nd_msg_type, tvb, offset, 4, FALSE); + break; + case TIPC_CONNECTION_MANAGER: + break; + case TIPC_LINK_PROTOCOL: + proto_tree_add_item(tipc_tree, hf_tipc_lp_msg_type, tvb, offset, 4, FALSE); + break; + case TIPC_CHANGEOVER_PROTOCOL: + proto_tree_add_item(tipc_tree, hf_tipc_cng_prot_msg_type, tvb, offset, 4, FALSE); + break; + case TIPC_SEGMENTATION_MANAGER: + proto_tree_add_item(tipc_tree, hf_tipc_sm_msg_type, tvb, offset, 4, FALSE); + break; + default: + proto_tree_add_item(tipc_tree, hf_tipc_unknown_msg_type, tvb, offset, 4, FALSE); + break; } /* Sequence gap */ - if ( user == TIPC_LINK_PROTOCOL && msg_type == TIPC_LINK_PROTOCO_STATE_MSG ) + if (user == TIPC_LINK_PROTOCOL && msg_type == TIPC_LINK_PROTOCO_STATE_MSG) proto_tree_add_item(tipc_tree, hf_tipc_seq_gap, tvb, offset, 4, FALSE); /* Next sent packet */ proto_tree_add_item(tipc_tree, hf_tipc_nxt_snt_pkg, tvb, offset, 4, FALSE); @@ -1893,47 +1898,48 @@ dissect_tipc_int_prot_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tipc_tr /* Unused */ proto_tree_add_item(tipc_tree, hf_tipc_unused3, tvb, offset, 4, FALSE); offset = offset + 4; - /*W7 */ + /* W7 */ if (msg_size == 28) /* No data */ return; - switch (user){ + switch (user) { case TIPC_LINK_PROTOCOL: proto_tree_add_item(tipc_tree, hf_tipc_bearer_name, tvb, offset, -1, FALSE); break; case TIPC_CHANGEOVER_PROTOCOL: - switch (msg_type){ - case 0: /* DUPLICATE_MSG */ - case 1: /* ORIGINAL_MSG */ - proto_tree_add_text(tipc_tree, tvb, offset, -1,"TIPC_CHANGEOVER_PROTOCOL %s (%u)",val_to_str(msg_type, tipc_cng_prot_msg_type_values, "unknown"),msg_type); - data_tvb = tvb_new_subset(tvb, offset, -1, -1); - if (check_col(pinfo->cinfo, COL_INFO)) - col_set_fence(pinfo->cinfo, COL_INFO); - dissect_tipc(data_tvb, pinfo, tipc_tree); - break; - default: - /* INFO_MSG: Even when there are no packets in the send queue of a removed link, the other - endpoint must be informed about this fact, so it can be unblocked when it has terminated its - part of the changeover procedure. This message type may be regarded as an empty - ORIGINAL_MSG, where message count is zero, and no packet is wrapped inside. - */ - proto_tree_add_text(tipc_tree, tvb, offset, -1,"TIPC_CHANGEOVER_PROTOCOL Protol/dissection Error"); - break; + switch (msg_type) { + case 0: /* DUPLICATE_MSG */ + case 1: /* ORIGINAL_MSG */ + proto_tree_add_text(tipc_tree, tvb, offset, -1, "TIPC_CHANGEOVER_PROTOCOL %s (%u)", + val_to_str(msg_type, tipc_cng_prot_msg_type_values, "unknown"), msg_type); + data_tvb = tvb_new_subset(tvb, offset, -1, -1); + if (check_col(pinfo->cinfo, COL_INFO)) + col_set_fence(pinfo->cinfo, COL_INFO); + dissect_tipc(data_tvb, pinfo, tipc_tree); + break; + default: + /* INFO_MSG: Even when there are no packets in the send queue of a removed link, the other + * endpoint must be informed about this fact, so it can be unblocked when it has terminated its + * part of the changeover procedure. This message type may be regarded as an empty + * ORIGINAL_MSG, where message count is zero, and no packet is wrapped inside. + */ + proto_tree_add_text(tipc_tree, tvb, offset, -1, "TIPC_CHANGEOVER_PROTOCOL Protol/dissection Error"); + break; } break; case TIPC_SEGMENTATION_MANAGER: save_fragmented = pinfo->fragmented; - if (tipc_defragment){ + if (tipc_defragment) { pinfo->fragmented = TRUE; - + frag_msg = fragment_add_seq_next(tvb, offset, pinfo, - link_sel, /* ID for fragments belonging together - NEEDS IMPROVING? */ - tipc_msg_fragment_table, /* list of message fragments */ - tipc_msg_reassembled_table, /* list of reassembled messages */ + link_sel, /* ID for fragments belonging together - NEEDS IMPROVING? */ + tipc_msg_fragment_table, /* list of message fragments */ + tipc_msg_reassembled_table, /* list of reassembled messages */ tvb_length_remaining(tvb, offset), /* fragment length - to the end */ - TRUE); /* More fragments? */ - if (msg_type == TIPC_FIRST_SEGMENT ){ - reassembled_msg_length = tvb_get_ntohl(tvb,offset) & 0x1ffff; + TRUE); /* More fragments? */ + if (msg_type == TIPC_FIRST_SEGMENT) { + reassembled_msg_length = tvb_get_ntohl(tvb, offset) & 0x1ffff; /* The number of segments needed for he complete message (Including header) will be * The size of the data section of the first message, divided by the complete message size * + one segment for the remainder (if any). @@ -1942,46 +1948,47 @@ dissect_tipc_int_prot_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tipc_tr if (reassembled_msg_length > (no_of_segments * (msg_size - 28))) no_of_segments++; fragment_set_tot_len(pinfo, link_sel, tipc_msg_fragment_table, no_of_segments-1); - item = proto_tree_add_text(tipc_tree, tvb, offset, -1,"Segmented message size %u bytes -> No segments = %i",reassembled_msg_length,no_of_segments); + item = proto_tree_add_text(tipc_tree, tvb, offset, -1, "Segmented message size %u bytes -> No segments = %i", + reassembled_msg_length, no_of_segments); PROTO_ITEM_SET_GENERATED(item); } new_tvb = process_reassembled_data(tvb, offset, pinfo, - "Reassembled Message", frag_msg, &tipc_msg_frag_items, - NULL, tipc_tree); + "Reassembled Message", frag_msg, &tipc_msg_frag_items, + NULL, tipc_tree); if (frag_msg) { /* Reassembled */ if (check_col(pinfo->cinfo, COL_INFO)) - col_append_str(pinfo->cinfo, COL_INFO, - " (Message Reassembled)"); + col_append_str(pinfo->cinfo, COL_INFO, + " (Message Reassembled)"); } else { /* Not last packet of reassembled Short Message */ if (check_col(pinfo->cinfo, COL_INFO)) col_append_fstr(pinfo->cinfo, COL_INFO, - " (Message fragment %u)", link_lev_seq_no); + " (Message fragment %u)", link_lev_seq_no); } } if (new_tvb) { /* take it all */ next_tvb = new_tvb; } else { /* make a new subset */ - next_tvb = tvb_new_subset(tvb, offset, -1, -1); + next_tvb = tvb_new_subset(tvb, offset, -1, -1); } pinfo->fragmented = save_fragmented; - if (new_tvb){ + if (new_tvb) { if (check_col(pinfo->cinfo, COL_INFO)) col_set_fence(pinfo->cinfo, COL_INFO); dissect_tipc(next_tvb, pinfo, tipc_tree); return; } - - proto_tree_add_text(tipc_tree, next_tvb, 0, -1,"%u bytes Data Fragment",(msg_size - 28)); + + proto_tree_add_text(tipc_tree, next_tvb, 0, -1, "%u bytes Data Fragment", (msg_size - 28)); break; case TIPC_MSG_BUNDLER: - proto_tree_add_text(tipc_tree, tvb, offset, -1,"Message Bundle"); - while ((guint32)offset < msg_size ){ + proto_tree_add_text(tipc_tree, tvb, offset, -1, "Message Bundle"); + while ((guint32)offset < msg_size) { msg_no++; - msg_in_bundle_size = tvb_get_ntohl(tvb,offset); - proto_tree_add_text(tipc_tree, tvb, offset, msg_in_bundle_size,"%u Message in Bundle",msg_no); + msg_in_bundle_size = tvb_get_ntohl(tvb, offset); + proto_tree_add_text(tipc_tree, tvb, offset, msg_in_bundle_size, "%u Message in Bundle", msg_no); data_tvb = tvb_new_subset(tvb, offset, msg_in_bundle_size, msg_in_bundle_size); if (check_col(pinfo->cinfo, COL_INFO)) col_set_fence(pinfo->cinfo, COL_INFO); @@ -1990,16 +1997,32 @@ dissect_tipc_int_prot_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tipc_tr } break; default: - proto_tree_add_text(tipc_tree, tvb, offset, -1,"%u bytes Data",(msg_size - 28)); + proto_tree_add_text(tipc_tree, tvb, offset, -1, "%u bytes Data", (msg_size - 28)); break; } } +/* determines the lenght of a TIPC package */ +static guint +get_tipc_pdu_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset) +{ + return tvb_get_ntohl(tvb, offset) & 0x0001FFFF; +} + + +/* triggers the dissection of TIPC-over-TCP */ +static int +dissect_tipc_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree) +{ + tcp_dissect_pdus(tvb, pinfo, parent_tree, tipc_tcp_desegment, 4, get_tipc_pdu_len, + dissect_tipc); + return tvb_length(tvb); +} + static void dissect_tipc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { - proto_item *ti, *tipc_data_item, *item; proto_tree *tipc_tree, *tipc_data_tree; int offset = 0; @@ -2015,11 +2038,11 @@ dissect_tipc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) gboolean datatype_hdr = FALSE; guint8 msg_type = 0; - /* Make entry in Protocol column on summary display */ - if (check_col(pinfo->cinfo, COL_PROTOCOL)) + /* Make entry in Protocol column on summary display */ + if (check_col(pinfo->cinfo, COL_PROTOCOL)) col_set_str(pinfo->cinfo, COL_PROTOCOL, "TIPC"); - if (check_col(pinfo->cinfo, COL_INFO)) + if (check_col(pinfo->cinfo, COL_INFO)) col_clear(pinfo->cinfo, COL_INFO); top_tree = tree; @@ -2029,141 +2052,139 @@ dissect_tipc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) user = (dword>>25) & 0xf; msg_size = dword & 0x1ffff; - if ( (guint32)tvb_length_remaining(tvb, offset) < msg_size){ + if ((guint32)tvb_length_remaining(tvb, offset) < msg_size) { tipc_tvb = tvb; - }else{ + } else { tipc_tvb = tvb_new_subset(tvb, offset, msg_size, msg_size); } /* Set User values in COL INFO different in V1 and V2 */ - switch (version){ - case 0: - case TIPCv1: - msg_type = tvb_get_guint8(tipc_tvb, offset + 20)>>4; - if (check_col(pinfo->cinfo, COL_INFO)){ - col_append_fstr(pinfo->cinfo, COL_INFO, " %s(%u) ", val_to_str(user, tipc_user_values, "unknown"),user); - } - /* Set msg type in info col and find out if its a data hdr or not */ - datatype_hdr = tipc_v1_set_col_msgtype(pinfo, user, msg_type); - if ( datatype_hdr ){ - /* Data type header */ - if ( hdr_size > 5 && user <4){ - /* W6 Originating Processor */ - src_addr = tvb_get_ptr(tipc_tvb, offset + 24, 4); - SET_ADDRESS(&pinfo->src, AT_TIPC, 4, src_addr); - - /* W7 Destination Processor */ - dst_addr = tvb_get_ptr(tipc_tvb, offset + 28, 4); - SET_ADDRESS(&pinfo->dst, AT_TIPC, 4, dst_addr); - }else{ - /* Short data hdr */ + switch (version) { + case 0: + case TIPCv1: + msg_type = tvb_get_guint8(tipc_tvb, offset + 20)>>4; + if (check_col(pinfo->cinfo, COL_INFO)) { + col_append_fstr(pinfo->cinfo, COL_INFO, " %s(%u) ", val_to_str(user, tipc_user_values, "unknown"), user); + } + /* Set msg type in info col and find out if its a data hdr or not */ + datatype_hdr = tipc_v1_set_col_msgtype(pinfo, user, msg_type); + if (datatype_hdr) { + /* Data type header */ + if (hdr_size > 5 && user <4) { + /* W6 Originating Processor */ + src_addr = tvb_get_ptr(tipc_tvb, offset + 24, 4); + SET_ADDRESS(&pinfo->src, AT_TIPC, 4, src_addr); + + /* W7 Destination Processor */ + dst_addr = tvb_get_ptr(tipc_tvb, offset + 28, 4); + SET_ADDRESS(&pinfo->dst, AT_TIPC, 4, dst_addr); + } else { + /* Short data hdr */ + /* W2 Previous Processor */ + src_addr = tvb_get_ptr(tipc_tvb, offset + 8, 4); + SET_ADDRESS(&pinfo->src, AT_TIPC, 4, src_addr); + } + } else { /* W2 Previous Processor */ src_addr = tvb_get_ptr(tipc_tvb, offset + 8, 4); SET_ADDRESS(&pinfo->src, AT_TIPC, 4, src_addr); } - }else{ - /* W2 Previous Processor */ - src_addr = tvb_get_ptr(tipc_tvb, offset + 8, 4); - SET_ADDRESS(&pinfo->src, AT_TIPC, 4, src_addr); - } - break; - case TIPCv2: - msg_type = tvb_get_guint8(tipc_tvb,offset + 4)>>5; - if (check_col(pinfo->cinfo, COL_INFO)){ - col_append_fstr(pinfo->cinfo, COL_INFO, "%-12s", val_to_str(user, tipcv2_user_short_str_vals, "unknown")); - } - /* Set msg type in info col */ - if (check_col(pinfo->cinfo, COL_INFO)) - tipc_v2_set_info_col(tvb, pinfo, user, msg_type, hdr_size); - - /* find out if its a data hdr or not */ - switch (user){ - case TIPCv2_DATA_LOW: - case TIPCv2_DATA_NORMAL: - case TIPCv2_DATA_HIGH: - case TIPCv2_DATA_NON_REJECTABLE: - datatype_hdr = TRUE; - break; - default: - datatype_hdr = FALSE; - break; - } - - if ( datatype_hdr ){ - if (hdr_size > 6){ - /* W6 Originating Processor */ - src_addr = tvb_get_ptr(tipc_tvb, offset + 24, 4); - SET_ADDRESS(&pinfo->src, AT_TIPC, 4, src_addr); - - /* W7 Destination Processor */ - dst_addr = tvb_get_ptr(tipc_tvb, offset + 28, 4); - SET_ADDRESS(&pinfo->dst, AT_TIPC, 4, dst_addr); - }else{ - /* W3 Previous Processor */ - src_addr = tvb_get_ptr(tipc_tvb, offset + 12, 4); - SET_ADDRESS(&pinfo->src, AT_TIPC, 4, src_addr); + break; + case TIPCv2: + msg_type = tvb_get_guint8(tipc_tvb, offset + 4)>>5; + if (check_col(pinfo->cinfo, COL_INFO)) { + col_append_fstr(pinfo->cinfo, COL_INFO, "%-12s", val_to_str(user, tipcv2_user_short_str_vals, "unknown")); + } + /* Set msg type in info col */ + if (check_col(pinfo->cinfo, COL_INFO)) + tipc_v2_set_info_col(tvb, pinfo, user, msg_type, hdr_size); + + /* find out if its a data hdr or not */ + switch (user) { + case TIPCv2_DATA_LOW: + case TIPCv2_DATA_NORMAL: + case TIPCv2_DATA_HIGH: + case TIPCv2_DATA_NON_REJECTABLE: + datatype_hdr = TRUE; + break; + default: + datatype_hdr = FALSE; + break; } - }else{ - if (user != TIPCv2_NEIGHBOUR_DISCOVERY){ - /* W6 Originating Processor */ - src_addr = tvb_get_ptr(tipc_tvb, offset + 24, 4); - SET_ADDRESS(&pinfo->src, AT_TIPC, 4, src_addr); - - /* W7 Destination Processor */ - dst_addr = tvb_get_ptr(tipc_tvb, offset + 28, 4); - SET_ADDRESS(&pinfo->dst, AT_TIPC, 4, dst_addr); - }else{ - /* W2 Destination Domain */ - dst_addr = tvb_get_ptr(tipc_tvb, offset + 8, 4); - SET_ADDRESS(&pinfo->dst, AT_TIPC, 4, dst_addr); - - /* W3 Previous Node */ - src_addr = tvb_get_ptr(tipc_tvb, offset + 12, 4); - SET_ADDRESS(&pinfo->src, AT_TIPC, 4, src_addr); + if (datatype_hdr) { + if (hdr_size > 6) { + /* W6 Originating Processor */ + src_addr = tvb_get_ptr(tipc_tvb, offset + 24, 4); + SET_ADDRESS(&pinfo->src, AT_TIPC, 4, src_addr); + + /* W7 Destination Processor */ + dst_addr = tvb_get_ptr(tipc_tvb, offset + 28, 4); + SET_ADDRESS(&pinfo->dst, AT_TIPC, 4, dst_addr); + } else { + /* W3 Previous Processor */ + src_addr = tvb_get_ptr(tipc_tvb, offset + 12, 4); + SET_ADDRESS(&pinfo->src, AT_TIPC, 4, src_addr); + } + + } else { + if (user != TIPCv2_NEIGHBOUR_DISCOVERY) { + /* W6 Originating Processor */ + src_addr = tvb_get_ptr(tipc_tvb, offset + 24, 4); + SET_ADDRESS(&pinfo->src, AT_TIPC, 4, src_addr); + + /* W7 Destination Processor */ + dst_addr = tvb_get_ptr(tipc_tvb, offset + 28, 4); + SET_ADDRESS(&pinfo->dst, AT_TIPC, 4, dst_addr); + } else { + /* W2 Destination Domain */ + dst_addr = tvb_get_ptr(tipc_tvb, offset + 8, 4); + SET_ADDRESS(&pinfo->dst, AT_TIPC, 4, dst_addr); + + /* W3 Previous Node */ + src_addr = tvb_get_ptr(tipc_tvb, offset + 12, 4); + SET_ADDRESS(&pinfo->src, AT_TIPC, 4, src_addr); + } } - } - break; - default: - break; + break; + default: + break; } ti = proto_tree_add_item(tree, proto_tipc, tipc_tvb, offset, -1, FALSE); tipc_tree = proto_item_add_subtree(ti, ett_tipc); - if ( version == TIPCv2){ + if (version == TIPCv2) { dissect_tipc_v2(tipc_tvb, tipc_tree, pinfo, offset, user, msg_size, hdr_size, datatype_hdr); return; } - /* Word 0-2 common for all messages - * Word 0 - */ - + /* Word 0-2 common for all messages */ + /* Word 0 */ proto_tree_add_item(tipc_tree, hf_tipc_ver, tipc_tvb, offset, 4, FALSE); proto_tree_add_item(tipc_tree, hf_tipc_usr, tipc_tvb, offset, 4, FALSE); item = proto_tree_add_item(tipc_tree, hf_tipc_hdr_size, tipc_tvb, offset, 4, FALSE); - proto_item_append_text(item, " = %u Bytes",(hdr_size * 4)); - proto_tree_add_item(tipc_tree,hf_tipc_nonsequenced, tipc_tvb,offset,4, FALSE); + proto_item_append_text(item, " = %u Bytes", (hdr_size * 4)); + proto_tree_add_item(tipc_tree, hf_tipc_nonsequenced, tipc_tvb, offset, 4, FALSE); proto_tree_add_item(tipc_tree, hf_tipc_unused, tipc_tvb, offset, 4, FALSE); - if (datatype_hdr){ - proto_tree_add_item(tipc_tree,hf_tipc_destdrop, tipc_tvb,offset,4, FALSE); - proto_tree_add_item(tipc_tree,hf_tipcv2_srcdrop, tipc_tvb,offset,4, FALSE); + if (datatype_hdr) { + proto_tree_add_item(tipc_tree, hf_tipc_destdrop, tipc_tvb, offset, 4, FALSE); + proto_tree_add_item(tipc_tree, hf_tipcv2_srcdrop, tipc_tvb, offset, 4, FALSE); } proto_tree_add_item(tipc_tree, hf_tipc_msg_size, tipc_tvb, offset, 4, FALSE); offset = offset + 4; - + /* Word 1 */ proto_tree_add_item(tipc_tree, hf_tipc_ack_link_lev_seq, tipc_tvb, offset, 4, FALSE); proto_tree_add_item(tipc_tree, hf_tipc_link_lev_seq, tipc_tvb, offset, 4, FALSE); offset = offset + 4; - + /* Word 2 */ - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); addr_str_ptr = tipc_addr_to_str(dword); proto_tree_add_string(tipc_tree, hf_tipc_prev_proc, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; - switch (user){ + switch (user) { case TIPC_ROUTING_MANAGER: case TIPC_LINK_PROTOCOL: case TIPC_CHANGEOVER_PROTOCOL: @@ -2172,38 +2193,38 @@ dissect_tipc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) dissect_tipc_int_prot_msg(tipc_tvb, pinfo, tipc_tree, offset, user, msg_size); return; default: - break; + break; } - dword = tvb_get_ntohl(tipc_tvb,offset); + dword = tvb_get_ntohl(tipc_tvb, offset); pinfo->ptype = PT_TIPC; pinfo->srcport = dword; proto_tree_add_item(tipc_tree, hf_tipc_org_port, tipc_tvb, offset, 4, FALSE); offset = offset + 4; - if(user != TIPC_NAME_DISTRIBUTOR){ - dword = tvb_get_ntohl(tipc_tvb,offset); + if (user != TIPC_NAME_DISTRIBUTOR) { + dword = tvb_get_ntohl(tipc_tvb, offset); pinfo->destport = dword; proto_tree_add_item(tipc_tree, hf_tipc_dst_port, tipc_tvb, offset, 4, FALSE); } offset = offset + 4; - /* 20 - 24 Bytes - 20 bytes: Used in subnetwork local, connection oriented messages, where error code, reroute - counter and activity identity are zero. A recipient finding that the header size field is 20 does - by default know both user (DATA), message type (CONNECTED_MSG), error code - (MSG_OK), reroute counter (0), and activity identity (undefined). Since no more testing for - this is needed these fields can be left out in the header. Furthermore, since such messages - only will do zero or one inter-processor hop, we know that previous processor is the real - origin of the message. Hence the field originating processor can be omitted. For the same - reason, the recipient processor will know that it is identical to destination processor, so even - this field can be skipped. Finally, because the link layer guarantees delivery and sequence - order for this single hop, even the connection sequence number is redundant. So the message - can just be passed directly on to the destination port. Since this type of message statistically - should be by far the most frequent one this small optimization pays off. - */ - if ( hdr_size <= 6 ){ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, -1, "%u bytes Data", (msg_size - hdr_size *4)); - }else{ - switch (user){ + /* 20 - 24 Bytes + 20 bytes: Used in subnetwork local, connection oriented messages, where error code, reroute + counter and activity identity are zero. A recipient finding that the header size field is 20 does + by default know both user (DATA), message type (CONNECTED_MSG), error code + (MSG_OK), reroute counter (0), and activity identity (undefined). Since no more testing for + this is needed these fields can be left out in the header. Furthermore, since such messages + only will do zero or one inter-processor hop, we know that previous processor is the real + origin of the message. Hence the field originating processor can be omitted. For the same + reason, the recipient processor will know that it is identical to destination processor, so even + this field can be skipped. Finally, because the link layer guarantees delivery and sequence + order for this single hop, even the connection sequence number is redundant. So the message + can just be passed directly on to the destination port. Since this type of message statistically + should be by far the most frequent one this small optimization pays off. + */ + if (hdr_size <= 6) { + proto_tree_add_text(tipc_tree, tipc_tvb, offset, -1, "%u bytes Data", (msg_size - hdr_size*4)); + } else { + switch (user) { case TIPC_NAME_DISTRIBUTOR: proto_tree_add_item(tipc_tree, hf_tipc_nd_msg_type, tipc_tvb, offset, 4, FALSE); break; @@ -2213,657 +2234,649 @@ dissect_tipc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) default: proto_tree_add_item(tipc_tree, hf_tipc_data_msg_type, tipc_tvb, offset, 4, FALSE); break; - } - proto_tree_add_item(tipc_tree, hf_tipc_err_code, tipc_tvb, offset, 4, FALSE); - proto_tree_add_item(tipc_tree, hf_tipc_reroute_cnt, tipc_tvb, offset, 4, FALSE); - proto_tree_add_item(tipc_tree, hf_tipc_act_id, tipc_tvb, offset, 4, FALSE); - offset = offset + 4; + } + proto_tree_add_item(tipc_tree, hf_tipc_err_code, tipc_tvb, offset, 4, FALSE); + proto_tree_add_item(tipc_tree, hf_tipc_reroute_cnt, tipc_tvb, offset, 4, FALSE); + proto_tree_add_item(tipc_tree, hf_tipc_act_id, tipc_tvb, offset, 4, FALSE); + offset = offset + 4; - dword = tvb_get_ntohl(tipc_tvb,offset); - addr_str_ptr = tipc_addr_to_str(dword); + dword = tvb_get_ntohl(tipc_tvb, offset); + addr_str_ptr = tipc_addr_to_str(dword); - proto_tree_add_string(tipc_tree, hf_tipc_org_proc, tipc_tvb, offset, 4, addr_str_ptr); - offset = offset + 4; + proto_tree_add_string(tipc_tree, hf_tipc_org_proc, tipc_tvb, offset, 4, addr_str_ptr); + offset = offset + 4; - dword = tvb_get_ntohl(tipc_tvb,offset); - addr_str_ptr = tipc_addr_to_str(dword); + dword = tvb_get_ntohl(tipc_tvb, offset); + addr_str_ptr = tipc_addr_to_str(dword); - proto_tree_add_string(tipc_tree, hf_tipc_dst_proc, tipc_tvb, offset, 4, addr_str_ptr); - offset = offset + 4; - /* 32 bytes - 32 bytes: The size of all data messages containing an explicit port identity as destination - address. - */ - if ( hdr_size > 8){ - if (user == TIPC_NAME_DISTRIBUTOR ){ - /* - Although an internal service, the name distributor uses the full 40-byte "external" data header - format when updating the naming table instances. This is because its messages may need - routing, - all system processor must contain the publications from all device processors and - vice versa, whether they are directly linked or not. The fields name type, name instance, and - destination port of that header have no meaning for such messages - */ - offset = offset + 8; - tipc_data_item = proto_tree_add_text(tipc_tree, tvb, offset, -1, "TIPC_NAME_DISTRIBUTOR %u bytes User Data", (msg_size - hdr_size *4)); - tipc_data_tree = proto_item_add_subtree(tipc_data_item , ett_tipc_data); - data_tvb = tvb_new_subset(tipc_tvb, offset, -1, -1); - dissect_tipc_name_dist_data(data_tvb, tipc_data_tree, 0); - return; - }else{ - /* Port name type / Connection level sequence number */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4, "Port name type / Connection level sequence number"); - offset = offset + 4; - /* Port name instance */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4, "Port name instance"); - offset = offset + 4; - } + proto_tree_add_string(tipc_tree, hf_tipc_dst_proc, tipc_tvb, offset, 4, addr_str_ptr); + offset = offset + 4; + /* 32 bytes + 32 bytes: The size of all data messages containing an explicit port identity as destination + address. + */ + if (hdr_size > 8) { + if (user == TIPC_NAME_DISTRIBUTOR) { + /* + Although an internal service, the name distributor uses the full 40-byte "external" data header + format when updating the naming table instances. This is because its messages may need + routing, - all system processor must contain the publications from all device processors and + vice versa, whether they are directly linked or not. The fields name type, name instance, and + destination port of that header have no meaning for such messages + */ + offset = offset + 8; + tipc_data_item = proto_tree_add_text(tipc_tree, tvb, offset, -1, "TIPC_NAME_DISTRIBUTOR %u bytes User Data", (msg_size - hdr_size*4)); + tipc_data_tree = proto_item_add_subtree(tipc_data_item , ett_tipc_data); + data_tvb = tvb_new_subset(tipc_tvb, offset, -1, -1); + dissect_tipc_name_dist_data(data_tvb, tipc_data_tree, 0); + return; + } else { + /* Port name type / Connection level sequence number */ + proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4, "Port name type / Connection level sequence number"); + offset = offset + 4; + /* Port name instance */ + proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4, "Port name instance"); + offset = offset + 4; } + } - if (user < 4 && dissect_tipc_data){ /* DATA type user */ - switch (msg_type){ + if (user < 4 && dissect_tipc_data) { /* DATA type user */ + switch (msg_type) { case TIPC_CONNECTED_MSG: - proto_tree_add_text(tipc_tree, tipc_tvb, offset, -1, "%u bytes Data", (msg_size - hdr_size *4)); + proto_tree_add_text(tipc_tree, tipc_tvb, offset, -1, "%u bytes Data", (msg_size - hdr_size*4)); break; case TIPC_NAMED_MSG: data_tvb = tvb_new_subset(tipc_tvb, offset+14, -1, -1); proto_tree_add_text(tipc_tree, tipc_tvb, offset, 14, "TIPC_NAMED_MSG Hdr"); - proto_tree_add_text(tipc_tree, data_tvb,0, -1, "%u bytes Data", (msg_size - hdr_size *4)); + proto_tree_add_text(tipc_tree, data_tvb, 0, -1, "%u bytes Data", (msg_size - hdr_size*4)); return; case TIPC_DIRECT_MSG: previous_offset = offset; - while (tvb_reported_length_remaining(tipc_tvb,offset) > 0){ - dword = tvb_get_ntohl(tipc_tvb,offset); - if ((dword & 0xff000000) == 0x45000000){ /* && ((dword & 0x0000ffff)== tvb_reported_length_remaining(tvb,offset+2)))*/ + while (tvb_reported_length_remaining(tipc_tvb, offset) > 0) { + dword = tvb_get_ntohl(tipc_tvb, offset); + if ((dword & 0xff000000) == 0x45000000) { /* && ((dword & 0x0000ffff) == tvb_reported_length_remaining(tvb, offset+2)))*/ data_tvb = tvb_new_subset(tipc_tvb, offset, -1, -1); call_dissector(ip_handle, data_tvb, pinfo, top_tree); return; } offset = offset+4; } - proto_tree_add_text(tipc_tree, tipc_tvb, previous_offset, -1,"%u bytes Data", (msg_size - hdr_size *4)); + proto_tree_add_text(tipc_tree, tipc_tvb, previous_offset, -1, "%u bytes Data", (msg_size - hdr_size*4)); return; default: - proto_tree_add_text(tipc_tree, tipc_tvb, offset, -1,"%u bytes Data", (msg_size - hdr_size *4)); + proto_tree_add_text(tipc_tree, tipc_tvb, offset, -1, "%u bytes Data", (msg_size - hdr_size*4)); break; - } - } - - }/*if ( hdr_size <= 5 ) */ - /*}if tree */ - + } + } + } /*if (hdr_size <= 5) */ } - - /* Register TIPC with Wireshark */ void proto_register_tipc(void) -{ - +{ static hf_register_info hf[] = { - - {&hf_tipc_msg_fragments, - {"Message fragments", "tipc.msg.fragments", - FT_NONE, BASE_NONE, NULL, 0x00, NULL, HFILL } + { &hf_tipc_msg_fragments, + { "Message fragments", "tipc.msg.fragments", + FT_NONE, BASE_NONE, NULL, 0x00, NULL, HFILL } }, - {&hf_tipc_msg_fragment, - {"Message fragment", "tipc.msg.fragment", - FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL } + { &hf_tipc_msg_fragment, + { "Message fragment", "tipc.msg.fragment", + FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL } }, - {&hf_tipc_msg_fragment_overlap, - {"Message fragment overlap", "tipc.msg.fragment.overlap", - FT_BOOLEAN, BASE_NONE, NULL, 0x00, NULL, HFILL } + { &hf_tipc_msg_fragment_overlap, + { "Message fragment overlap", "tipc.msg.fragment.overlap", + FT_BOOLEAN, BASE_NONE, NULL, 0x00, NULL, HFILL } }, - {&hf_tipc_msg_fragment_overlap_conflicts, - {"Message fragment overlapping with conflicting data", "tipc.msg.fragment.overlap.conflicts", - FT_BOOLEAN, BASE_NONE, NULL, 0x00, NULL, HFILL } + { &hf_tipc_msg_fragment_overlap_conflicts, + { "Message fragment overlapping with conflicting data", "tipc.msg.fragment.overlap.conflicts", + FT_BOOLEAN, BASE_NONE, NULL, 0x00, NULL, HFILL } }, - {&hf_tipc_msg_fragment_multiple_tails, - {"Message has multiple tail fragments", "tipc.msg.fragment.multiple_tails", - FT_BOOLEAN, BASE_NONE, NULL, 0x00, NULL, HFILL } + { &hf_tipc_msg_fragment_multiple_tails, + { "Message has multiple tail fragments", "tipc.msg.fragment.multiple_tails", + FT_BOOLEAN, BASE_NONE, NULL, 0x00, NULL, HFILL } }, - {&hf_tipc_msg_fragment_too_long_fragment, - {"Message fragment too long", "tipc.msg.fragment.too_long_fragment", - FT_BOOLEAN, BASE_NONE, NULL, 0x00, NULL, HFILL } + { &hf_tipc_msg_fragment_too_long_fragment, + { "Message fragment too long", "tipc.msg.fragment.too_long_fragment", + FT_BOOLEAN, BASE_NONE, NULL, 0x00, NULL, HFILL } }, - {&hf_tipc_msg_fragment_error, - {"Message defragmentation error", "tipc.msg.fragment.error", - FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL } + { &hf_tipc_msg_fragment_error, + { "Message defragmentation error", "tipc.msg.fragment.error", + FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL } }, - {&hf_tipc_msg_reassembled_in, - {"Reassembled in", "tipc.msg.reassembled.in", - FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL } + { &hf_tipc_msg_reassembled_in, + { "Reassembled in", "tipc.msg.reassembled.in", + FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL } }, { &hf_tipc_ver, { "Version", "tipc.ver", - FT_UINT32, BASE_DEC, NULL, 0xe0000000, - "TIPC protocol version", HFILL } + FT_UINT32, BASE_DEC, NULL, 0xe0000000, + "TIPC protocol version", HFILL } }, { &hf_tipc_usr, { "User", "tipc.usr", - FT_UINT32, BASE_DEC, VALS(tipc_user_values), 0x1e000000, - "TIPC User", HFILL } + FT_UINT32, BASE_DEC, VALS(tipc_user_values), 0x1e000000, + "TIPC User", HFILL } }, { &hf_tipcv2_usr, { "User", "tipc.usr", - FT_UINT32, BASE_DEC, VALS(tipcv2_user_values), 0x1e000000, - "TIPC User", HFILL } + FT_UINT32, BASE_DEC, VALS(tipcv2_user_values), 0x1e000000, + "TIPC User", HFILL } }, { &hf_tipc_hdr_size, { "Header size", "tipc.hdr_size", - FT_UINT32, BASE_DEC, NULL, 0x01e00000, - "TIPC Header size", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x01e00000, + "TIPC Header size", HFILL } }, { &hf_tipc_nonsequenced, { "Non-sequenced", "tipc.non_sequenced", - FT_UINT32,BASE_DEC,NULL,0x00100000, - "Non-sequenced Bit",HFILL } + FT_UINT32, BASE_DEC, NULL, 0x00100000, + "Non-sequenced Bit", HFILL } }, { &hf_tipc_destdrop, { "Destination Droppable", "tipc.destdrop", - FT_UINT32,BASE_DEC,NULL,0x00080000, - "Destination Droppable Bit",HFILL } + FT_UINT32, BASE_DEC, NULL, 0x00080000, + "Destination Droppable Bit", HFILL } }, { &hf_tipc_unused, { "Unused", "tipc.hdr_unused", - FT_UINT32, BASE_DEC, NULL, 0x000e0000, - "TIPC Unused", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x000e0000, + "TIPC Unused", HFILL } }, { &hf_tipc_msg_size, { "Message size", "tipc.msg_size", - FT_UINT32, BASE_DEC, NULL, 0x0001ffff, - "TIPC Message size", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x0001ffff, + "TIPC Message size", HFILL } }, { &hf_tipc_ack_link_lev_seq, { "Acknowledged link level sequence number", "tipc.ack_link_lev_seq", - FT_UINT32, BASE_DEC, NULL, 0xffff0000, - "TIPC Acknowledged link level sequence number", HFILL } + FT_UINT32, BASE_DEC, NULL, 0xffff0000, + "TIPC Acknowledged link level sequence number", HFILL } }, { &hf_tipc_link_lev_seq, { "Link level sequence number", "tipc.link_lev_seq", - FT_UINT32, BASE_DEC, NULL, 0x0000ffff, - "TIPC Link level sequence number", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x0000ffff, + "TIPC Link level sequence number", HFILL } }, { &hf_tipc_prev_proc, { "Previous processor", "tipc.prev_proc", - FT_STRING, BASE_NONE, NULL, 0xffffffff, - "TIPC Previous processor", HFILL } + FT_STRING, BASE_NONE, NULL, 0xffffffff, + "TIPC Previous processor", HFILL } }, { &hf_tipc_org_port, { "Originating port", "tipc.org_port", - FT_UINT32, BASE_DEC, NULL, 0xffffffff, - "TIPC Oiginating port", HFILL } + FT_UINT32, BASE_DEC, NULL, 0xffffffff, + "TIPC Oiginating port", HFILL } }, { &hf_tipc_dst_port, { "Destination port", "tipc.dst_port", - FT_UINT32, BASE_DEC, NULL, 0xffffffff, - "TIPC Destination port", HFILL } + FT_UINT32, BASE_DEC, NULL, 0xffffffff, + "TIPC Destination port", HFILL } }, { &hf_tipc_data_msg_type, { "Message type", "tipc.msg_type", - FT_UINT32, BASE_DEC, VALS(tipc_data_msg_type_values), 0xf0000000, - "TIPC Message type", HFILL } + FT_UINT32, BASE_DEC, VALS(tipc_data_msg_type_values), 0xf0000000, + "TIPC Message type", HFILL } }, { &hf_tipc_err_code, { "Error code", "tipc.err_code", - FT_UINT32, BASE_DEC, VALS(tipc_error_code_values), 0x0f000000, - "TIPC Error code", HFILL } + FT_UINT32, BASE_DEC, VALS(tipc_error_code_values), 0x0f000000, + "TIPC Error code", HFILL } }, { &hf_tipc_reroute_cnt, { "Reroute counter", "tipc.route_cnt", - FT_UINT32, BASE_DEC, NULL, 0x00f00000, - "TIPC Reroute counter", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x00f00000, + "TIPC Reroute counter", HFILL } }, { &hf_tipc_act_id, { "Activity identity", "tipc.act_id", - FT_UINT32, BASE_DEC, NULL, 0x000fffff, - "TIPC Activity identity", HFILL } - }, + FT_UINT32, BASE_DEC, NULL, 0x000fffff, + "TIPC Activity identity", HFILL } + }, { &hf_tipc_org_proc, { "Originating processor", "tipc.org_proc", - FT_STRING, BASE_NONE, NULL, 0x0, - "TIPC Originating processor", HFILL } + FT_STRING, BASE_NONE, NULL, 0x0, + "TIPC Originating processor", HFILL } }, { &hf_tipc_dst_proc, { "Destination processor", "tipc.dst_proc", - FT_STRING, BASE_NONE, NULL, 0x0, - "TIPC Destination processor", HFILL } + FT_STRING, BASE_NONE, NULL, 0x0, + "TIPC Destination processor", HFILL } }, { &hf_tipc_unused2, { "Unused", "tipc.unused2", - FT_UINT32, BASE_DEC, NULL, 0xe0000000, - "TIPC Unused", HFILL } + FT_UINT32, BASE_DEC, NULL, 0xe0000000, + "TIPC Unused", HFILL } }, { &hf_tipc_importance, { "Importance", "tipc.importance", - FT_UINT32, BASE_DEC, NULL, 0x18000000, - "TIPC Importance", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x18000000, + "TIPC Importance", HFILL } }, { &hf_tipc_link_selector, { "Link selector", "tipc.link_selector", - FT_UINT32, BASE_DEC, NULL, 0x07000000, - "TIPC Link selector", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x07000000, + "TIPC Link selector", HFILL } }, { &hf_tipc_msg_cnt, { "Message count", "tipc.imsg_cnt", - FT_UINT32, BASE_DEC, NULL, 0x00ffff00, - "TIPC Message count", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x00ffff00, + "TIPC Message count", HFILL } }, { &hf_tipc_probe, { "Probe", "tipc.probe", - FT_UINT32, BASE_DEC, NULL, 0x00000040, - "TIPC Probe", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x00000040, + "TIPC Probe", HFILL } }, { &hf_tipc_bearer_id, { "Bearer identity", "tipc.bearer_id", - FT_UINT32, BASE_DEC, NULL, 0x00000038, - "TIPC Bearer identity", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x00000038, + "TIPC Bearer identity", HFILL } }, { &hf_tipc_link_selector2, { "Link selector", "tipc.link_selector", - FT_UINT32, BASE_DEC, NULL, 0x00000007, - "TIPC Link selector", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x00000007, + "TIPC Link selector", HFILL } }, { &hf_tipc_remote_addr, { "Remote address", "tipc.remote_addr", - FT_UINT32, BASE_DEC, NULL, 0xffffffff, - "TIPC Remote address", HFILL } + FT_UINT32, BASE_DEC, NULL, 0xffffffff, + "TIPC Remote address", HFILL } }, { &hf_tipc_rm_msg_type, { "Message type", "tipc.rm_msg_type", - FT_UINT32, BASE_DEC, VALS(tipc_routing_mgr_msg_type_values), 0xf0000000, - "TIPC Message type", HFILL } + FT_UINT32, BASE_DEC, VALS(tipc_routing_mgr_msg_type_values), 0xf0000000, + "TIPC Message type", HFILL } }, { &hf_tipc_nd_msg_type, { "Message type", "tipc.nd_msg_type", - FT_UINT32, BASE_DEC, VALS(tipc_name_dist_msg_type_values), 0xf0000000, - "TIPC Message type", HFILL } + FT_UINT32, BASE_DEC, VALS(tipc_name_dist_msg_type_values), 0xf0000000, + "TIPC Message type", HFILL } }, { &hf_tipc_cm_msg_type, { "Message type", "tipc.nd_msg_type", - FT_UINT32, BASE_DEC, VALS(tipc_cm_msg_type_values), 0xf0000000, - "TIPC Message type", HFILL } + FT_UINT32, BASE_DEC, VALS(tipc_cm_msg_type_values), 0xf0000000, + "TIPC Message type", HFILL } }, { &hf_tipc_lp_msg_type, { "Message type", "tipc.lp_msg_type", - FT_UINT32, BASE_DEC, VALS(tipc_link_prot_msg_type_values), 0xf0000000, - "TIPC Message type", HFILL } + FT_UINT32, BASE_DEC, VALS(tipc_link_prot_msg_type_values), 0xf0000000, + "TIPC Message type", HFILL } }, { &hf_tipc_cng_prot_msg_type, { "Message type", "tipc.cng_prot_msg_type", - FT_UINT32, BASE_DEC, VALS(tipc_cng_prot_msg_type_values), 0xf0000000, - "TIPC Message type", HFILL } + FT_UINT32, BASE_DEC, VALS(tipc_cng_prot_msg_type_values), 0xf0000000, + "TIPC Message type", HFILL } }, { &hf_tipc_sm_msg_type, { "Message type", "tipc.sm_msg_type", - FT_UINT32, BASE_DEC, VALS(tipc_sm_msg_type_values), 0xf0000000, - "TIPC Message type", HFILL } + FT_UINT32, BASE_DEC, VALS(tipc_sm_msg_type_values), 0xf0000000, + "TIPC Message type", HFILL } }, { &hf_tipc_unknown_msg_type, { "Message type", "tipc.unknown_msg_type", - FT_UINT32, BASE_DEC, NULL, 0xf0000000, - "TIPC Message type", HFILL } + FT_UINT32, BASE_DEC, NULL, 0xf0000000, + "TIPC Message type", HFILL } }, { &hf_tipc_seq_gap, { "Sequence gap", "tipc.seq_gap", - FT_UINT32, BASE_DEC, NULL, 0x0fff0000, - "TIPC Sequence gap", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x0fff0000, + "TIPC Sequence gap", HFILL } }, { &hf_tipc_nxt_snt_pkg, { "Next sent packet", "tipc.nxt_snt_pkg", - FT_UINT32, BASE_DEC, NULL, 0x0000ffff, - "TIPC Next sent packet", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x0000ffff, + "TIPC Next sent packet", HFILL } }, { &hf_tipc_unused3, { "Unused", "tipc.unused3", - FT_UINT32, BASE_DEC, NULL, 0x0, - "TIPC Unused", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x0, + "TIPC Unused", HFILL } }, { &hf_tipc_bearer_name, { "Bearer name", "tipc.bearer_name", - FT_STRINGZ, BASE_NONE, NULL, 0x0, - "TIPC Bearer name", HFILL } + FT_STRINGZ, BASE_NONE, NULL, 0x0, + "TIPC Bearer name", HFILL } }, { &hf_tipc_name_dist_type, { "Published port name type", "tipc.name_dist_type", - FT_UINT32, BASE_DEC, NULL, 0xffffffff, - "TIPC Published port name type", HFILL } + FT_UINT32, BASE_DEC, NULL, 0xffffffff, + "TIPC Published port name type", HFILL } }, { &hf_tipc_name_dist_lower, { "Lower bound of published sequence", "tipc.name_dist_lower", - FT_UINT32, BASE_DEC, NULL, 0xffffffff, - "TIPC Lower bound of published sequence", HFILL } + FT_UINT32, BASE_DEC, NULL, 0xffffffff, + "TIPC Lower bound of published sequence", HFILL } }, { &hf_tipc_name_dist_upper, { "Upper bound of published sequence", "tipc.name_dist_upper", - FT_UINT32, BASE_DEC, NULL, 0xffffffff, - "TIPC Upper bound of published sequence", HFILL } + FT_UINT32, BASE_DEC, NULL, 0xffffffff, + "TIPC Upper bound of published sequence", HFILL } }, { &hf_tipc_name_dist_port, { "Random number part of port identity", "tipc.dist_port", - FT_UINT32, BASE_DEC, NULL, 0xffffffff, - "TIPC Random number part of port identity", HFILL } + FT_UINT32, BASE_DEC, NULL, 0xffffffff, + "TIPC Random number part of port identity", HFILL } }, { &hf_tipc_name_dist_key, { "Key (Use for verification at withdrawal)", "tipc.dist_key", - FT_UINT32, BASE_DEC, NULL, 0xffffffff, - "TIPC key", HFILL } + FT_UINT32, BASE_DEC, NULL, 0xffffffff, + "TIPC key", HFILL } }, { &hf_tipcv2_srcdrop, { "Source Droppable", "tipc.srcdrop", - FT_UINT32, BASE_DEC, NULL, 0x00040000, - "Destination Droppable Bit", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x00040000, + "Destination Droppable Bit", HFILL } }, { &hf_tipcv2_data_msg_type, { "Message type", "tipc.data_type", - FT_UINT32, BASE_DEC, VALS(tipc_data_msg_type_values), 0xe0000000, - "TIPC Message type", HFILL } + FT_UINT32, BASE_DEC, VALS(tipc_data_msg_type_values), 0xe0000000, + "TIPC Message type", HFILL } }, { &hf_tipcv2_bcast_mtype, { "Message type", "tipcv2.bcast_msg_type", - FT_UINT32, BASE_DEC, VALS(tipcv2_bcast_mtype_strings), 0xe0000000, - "TIPC Message type", HFILL } + FT_UINT32, BASE_DEC, VALS(tipcv2_bcast_mtype_strings), 0xe0000000, + "TIPC Message type", HFILL } }, { &hf_tipcv2_bundler_mtype, { "Message type", "tipcv2.bundler_msg_type", - FT_UINT32, BASE_DEC, VALS(tipcv2_bundler_mtype_strings), 0xe0000000, - "TIPC Message type", HFILL } + FT_UINT32, BASE_DEC, VALS(tipcv2_bundler_mtype_strings), 0xe0000000, + "TIPC Message type", HFILL } }, { &hf_tipcv2_link_mtype, { "Message type", "tipcv2.link_msg_type", - FT_UINT32, BASE_DEC, VALS(tipcv2_link_mtype_strings), 0xe0000000, - "TIPC Message type", HFILL } + FT_UINT32, BASE_DEC, VALS(tipcv2_link_mtype_strings), 0xe0000000, + "TIPC Message type", HFILL } }, { &hf_tipcv2_connmgr_mtype, { "Message type", "tipcv2.connmgr_msg_type", - FT_UINT32, BASE_DEC, VALS(tipcv2_connmgr_mtype_strings), 0xe0000000, - "TIPC Message type", HFILL } + FT_UINT32, BASE_DEC, VALS(tipcv2_connmgr_mtype_strings), 0xe0000000, + "TIPC Message type", HFILL } }, { &hf_tipcv2_route_mtype_1_6, { "Message type", "tipcv2.route_msg_type", - FT_UINT32, BASE_DEC, VALS(tipcv2_route_mtype_strings_1_6), 0xe0000000, - "TIPC Message type", HFILL } + FT_UINT32, BASE_DEC, VALS(tipcv2_route_mtype_strings_1_6), 0xe0000000, + "TIPC Message type", HFILL } }, { &hf_tipcv2_route_mtype_1_7, { "Message type", "tipcv2.route_msg_type", - FT_UINT32, BASE_DEC, VALS(tipcv2_route_mtype_strings_1_7), 0xe0000000, - "TIPC Message type", HFILL } + FT_UINT32, BASE_DEC, VALS(tipcv2_route_mtype_strings_1_7), 0xe0000000, + "TIPC Message type", HFILL } }, { &hf_tipcv2_changeover_mtype, { "Message type", "tipcv2.changeover_msg_type", - FT_UINT32, BASE_DEC, VALS(tipcv2_changeover_mtype_strings), 0xe0000000, - "TIPC Message type", HFILL } + FT_UINT32, BASE_DEC, VALS(tipcv2_changeover_mtype_strings), 0xe0000000, + "TIPC Message type", HFILL } }, { &hf_tipcv2_naming_mtype, { "Message type", "tipcv2.naming_msg_type", - FT_UINT32, BASE_DEC, VALS(tipcv2_naming_mtype_strings), 0xe0000000, - "TIPC Message type", HFILL } + FT_UINT32, BASE_DEC, VALS(tipcv2_naming_mtype_strings), 0xe0000000, + "TIPC Message type", HFILL } }, { &hf_tipcv2_fragmenter_mtype, { "Message type", "tipcv2.fragmenter_msg_type", - FT_UINT32, BASE_DEC, VALS(tipcv2_fragmenter_mtype_strings), 0xe0000000, - "TIPC Message type", HFILL } + FT_UINT32, BASE_DEC, VALS(tipcv2_fragmenter_mtype_strings), 0xe0000000, + "TIPC Message type", HFILL } }, { &hf_tipcv2_neighbour_mtype, { "Message type", "tipcv2.data_msg_type", - FT_UINT32, BASE_DEC, VALS(tipcv2_neighbour_mtype_strings), 0xe0000000, - "TIPC Message type", HFILL } + FT_UINT32, BASE_DEC, VALS(tipcv2_neighbour_mtype_strings), 0xe0000000, + "TIPC Message type", HFILL } }, { &hf_tipcv2_errorcode, { "Error code", "tipcv2.errorcode", - FT_UINT32, BASE_DEC, VALS(tipcv2_error_code_strings), 0x1e000000, - "Error code", HFILL } + FT_UINT32, BASE_DEC, VALS(tipcv2_error_code_strings), 0x1e000000, + "Error code", HFILL } }, { &hf_tipcv2_rer_cnt, { "Reroute Counter", "tipcv2.rer_cnt", - FT_UINT32, BASE_DEC, NULL, 0x01e00000, - "Reroute Counter", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x01e00000, + "Reroute Counter", HFILL } }, { &hf_tipcv2_lookup_scope, { "Lookup Scope", "tipcv2.lookup_scope", - FT_UINT32, BASE_DEC, VALS(tipcv2_lookup_scope_strings), 0x00180000, - "Lookup Scope", HFILL } + FT_UINT32, BASE_DEC, VALS(tipcv2_lookup_scope_strings), 0x00180000, + "Lookup Scope", HFILL } }, { &hf_tipcv2_opt_p, { "Options Position", "tipcv2.opt_p", - FT_UINT32, BASE_DEC, NULL, 0x00070000, - "Options Position", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x00070000, + "Options Position", HFILL } }, { &hf_tipcv2_broadcast_ack_no, { "Broadcast Acknowledge Number", "tipcv2.broadcast_ack_no", - FT_UINT32, BASE_DEC, NULL, 0x0000FFFF, - "Broadcast Acknowledge Number", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x0000FFFF, + "Broadcast Acknowledge Number", HFILL } }, - { &hf_tipcv2_link_level_ack_no, { "Link Level Acknowledge Number", "tipcv2.link_level_ack_no", - FT_UINT32, BASE_DEC, NULL, 0xFFFF0000, - "Link Level Acknowledge Number", HFILL } + FT_UINT32, BASE_DEC, NULL, 0xFFFF0000, + "Link Level Acknowledge Number", HFILL } }, { &hf_tipcv2_link_level_seq_no, { "Link Level Sequence Number", "tipcv2.link_level_seq_no", - FT_UINT32, BASE_DEC, NULL, 0x0000FFFF, - "Link Level Sequence Number", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x0000FFFF, + "Link Level Sequence Number", HFILL } }, { &hf_tipcv2_bcast_seq_no, { "Broadcast Sequence Number", "tipcv2.bcast_seq_no", - FT_UINT32, BASE_DEC, NULL, 0x0000FFFF, - "Broadcast Sequence Number", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x0000FFFF, + "Broadcast Sequence Number", HFILL } }, { &hf_tipcv2_prev_node, { "Previous Node", "tipcv2.prev_node", - FT_STRING, BASE_NONE, NULL, 0xffffffff, - "TIPC Previous Node", HFILL } + FT_STRING, BASE_NONE, NULL, 0xffffffff, + "TIPC Previous Node", HFILL } }, { &hf_tipcv2_orig_node, { "Originating Node", "tipcv2.orig_node", - FT_STRING, BASE_NONE, NULL, 0xffffffff, - "TIPC Originating Node", HFILL } + FT_STRING, BASE_NONE, NULL, 0xffffffff, + "TIPC Originating Node", HFILL } }, { &hf_tipcv2_dest_node, { "Destination Node", "tipcv2.dest_node", - FT_STRING, BASE_NONE, NULL, 0xffffffff, - "TIPC Destination Node", HFILL } + FT_STRING, BASE_NONE, NULL, 0xffffffff, + "TIPC Destination Node", HFILL } }, { &hf_tipcv2_port_name_type, { "Port name type", "tipcv2.port_name_type", - FT_UINT32, BASE_DEC, NULL, 0xffffffff, - "Port name type", HFILL } + FT_UINT32, BASE_DEC, NULL, 0xffffffff, + "Port name type", HFILL } }, { &hf_tipcv2_port_name_instance, { "Port name instance", "tipcv2.port_name_instance", - FT_UINT32, BASE_DEC, NULL, 0xffffffff, - "Port name instance", HFILL } + FT_UINT32, BASE_DEC, NULL, 0xffffffff, + "Port name instance", HFILL } }, { &hf_tipcv2_multicast_lower, { "Multicast lower bound", "tipcv2.multicast_lower", - FT_UINT32, BASE_DEC, NULL, 0xffffffff, - "Multicast port name instance lower bound", HFILL } + FT_UINT32, BASE_DEC, NULL, 0xffffffff, + "Multicast port name instance lower bound", HFILL } }, { &hf_tipcv2_multicast_upper, { "Multicast upper bound", "tipcv2.multicast_upper", - FT_UINT32, BASE_DEC, NULL, 0xffffffff, - "Multicast port name instance upper bound", HFILL } + FT_UINT32, BASE_DEC, NULL, 0xffffffff, + "Multicast port name instance upper bound", HFILL } }, { &hf_tipcv2_bcast_seq_gap, { "Broadcast Sequence Gap", "tipcv2.bcast_seq_gap", - FT_UINT32, BASE_DEC, NULL, 0x1F000000, - "Broadcast Sequence Gap", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x1F000000, + "Broadcast Sequence Gap", HFILL } }, { &hf_tipcv2_sequence_gap, { "Sequence Gap", "tipcv2.seq_gap", - FT_UINT32, BASE_DEC, NULL, 0x00FF0000, - "Sequence Gap", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x00FF0000, + "Sequence Gap", HFILL } }, { &hf_tipcv2_next_sent_broadcast, { "Next Sent Broadcast", "tipcv2.next_sent_broadcast", - FT_UINT32, BASE_DEC, NULL, 0xFFFF0000, - "Next Sent Broadcast", HFILL } + FT_UINT32, BASE_DEC, NULL, 0xFFFF0000, + "Next Sent Broadcast", HFILL } }, { &hf_tipcv2_fragment_number, { "Fragment Number", "tipcv2.fragment_number", - FT_UINT32, BASE_DEC, NULL, 0xFFFF0000, - "Fragment Number", HFILL } + FT_UINT32, BASE_DEC, NULL, 0xFFFF0000, + "Fragment Number", HFILL } }, { &hf_tipcv2_fragment_msg_number, { "Fragment Message Number", "tipcv2.fragment_msg_number", - FT_UINT32, BASE_DEC, NULL, 0x0000FFFF, - "Fragment Message Number", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x0000FFFF, + "Fragment Message Number", HFILL } }, { &hf_tipcv2_next_sent_packet, { "Next Sent Packet", "tipcv2.next_sent_packet", - FT_UINT32, BASE_DEC, NULL, 0x0000FFFF, - "Next Sent Packet", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x0000FFFF, + "Next Sent Packet", HFILL } }, { &hf_tipcv2_session_no, { "Session Number", "tipcv2.session_no", - FT_UINT32, BASE_DEC, NULL, 0xFFFF0000, - "Session Number", HFILL } + FT_UINT32, BASE_DEC, NULL, 0xFFFF0000, + "Session Number", HFILL } }, { &hf_tipcv2_link_prio, { "Link Priority", "tipcv2.link_prio", - FT_UINT32, BASE_DEC, NULL, 0x000001F0, - "Link Priority", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x000001F0, + "Link Priority", HFILL } }, { &hf_tipcv2_network_plane, { "Network Plane", "tipcv2.network_plane", - FT_UINT32, BASE_DEC, VALS(tipcv2_networkplane_strings), 0x0000000E, - "Network Plane", HFILL } + FT_UINT32, BASE_DEC, VALS(tipcv2_networkplane_strings), 0x0000000E, + "Network Plane", HFILL } }, { &hf_tipcv2_probe, { "Probe", "tipcv2.probe", - FT_UINT32, BASE_DEC, NULL, 0x00000001, - "probe", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x00000001, + "probe", HFILL } }, { &hf_tipcv2_link_tolerance, { "Link Tolerance (ms)", "tipcv2.link_tolerance", - FT_UINT32, BASE_DEC, NULL, 0x0000FFFF, - "Link Tolerance in ms", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x0000FFFF, + "Link Tolerance in ms", HFILL } }, { &hf_tipcv2_bearer_instance, { "Bearer Instance", "tipcv2.bearer_instance", - FT_STRINGZ, BASE_NONE, NULL, 0, - "Bearer instance used by the sender node for this link", HFILL } + FT_STRINGZ, BASE_NONE, NULL, 0, + "Bearer instance used by the sender node for this link", HFILL } }, { &hf_tipcv2_bearer_level_orig_addr, { "Bearer Level Originating Address", "tipcv2.bearer_level_orig_addr", - FT_BYTES, BASE_HEX, NULL, 0, - "Bearer Level Originating Address", HFILL } + FT_BYTES, BASE_HEX, NULL, 0, + "Bearer Level Originating Address", HFILL } }, { &hf_tipcv2_cluster_address, { "Cluster Address", "tipcv2.cluster_address", - FT_STRING, BASE_NONE, NULL, 0xffffffff, - "The remote cluster concerned by the table", HFILL } + FT_STRING, BASE_NONE, NULL, 0xffffffff, + "The remote cluster concerned by the table", HFILL } }, { &hf_tipcv2_bitmap, { "Bitmap", "tipcv2.bitmap", - FT_BYTES, BASE_HEX, NULL, 0, - "Bitmap, indicating to which nodes within that cluster the sending node has direct links", HFILL } + FT_BYTES, BASE_HEX, NULL, 0, + "Bitmap, indicating to which nodes within that cluster the sending node has direct links", HFILL } }, { &hf_tipcv2_node_address, { "Node Address", "tipcv2.node_address", - FT_STRING, BASE_NONE, NULL, 0xffffffff, - "Which node the route addition/loss concern", HFILL } + FT_STRING, BASE_NONE, NULL, 0xffffffff, + "Which node the route addition/loss concern", HFILL } }, { &hf_tipcv2_destination_domain, { "Destination Domain", "tipcv2.destination_domain", - FT_STRING, BASE_NONE, NULL, 0xffffffff, - "The domain to which the link request is directed", HFILL } + FT_STRING, BASE_NONE, NULL, 0xffffffff, + "The domain to which the link request is directed", HFILL } }, { &hf_tipcv2_network_id, { "Network Identity", "tipcv2.network_id", - FT_UINT32, BASE_DEC, NULL, 0xFFFFFFFF, - "The sender node's network identity", HFILL } + FT_UINT32, BASE_DEC, NULL, 0xFFFFFFFF, + "The sender node's network identity", HFILL } }, { &hf_tipcv2_bcast_tag, { "Broadcast Tag", "tipcv2.bcast_tag", - FT_UINT32, BASE_DEC, NULL, 0xFFFF0000, - "Broadcast Tag", HFILL } + FT_UINT32, BASE_DEC, NULL, 0xFFFF0000, + "Broadcast Tag", HFILL } }, { &hf_tipcv2_msg_count, { "Message Count", "tipcv2.msg_count", - FT_UINT32, BASE_DEC, NULL, 0xFFFF0000, - "Message Count", HFILL } + FT_UINT32, BASE_DEC, NULL, 0xFFFF0000, + "Message Count", HFILL } }, { &hf_tipcv2_max_packet, { "Max Packet", "tipcv2.max_packet", - FT_UINT32, BASE_DEC, NULL, 0xFFFF0000, - "Max Packet", HFILL } + FT_UINT32, BASE_DEC, NULL, 0xFFFF0000, + "Max Packet", HFILL } }, { &hf_tipcv2_transport_seq_no, { "Transport Sequence No", "tipcv2.tseq_no", - FT_UINT32, BASE_DEC, NULL, 0xFFFFFFFF, - "Transport Level Sequence Number", HFILL } + FT_UINT32, BASE_DEC, NULL, 0xFFFFFFFF, + "Transport Level Sequence Number", HFILL } }, { &hf_tipcv2_redundant_link, { "Redundant Link", "tipcv2.redundant_link", - FT_UINT32, BASE_DEC, NULL, 0x00001000, - "Redundant Link", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x00001000, + "Redundant Link", HFILL } }, { &hf_tipcv2_bearer_id, { "Bearer identity", "tipcv2.bearer_id", - FT_UINT32, BASE_DEC, NULL, 0x00000e00, - "Bearer identity", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x00000e00, + "Bearer identity", HFILL } }, { &hf_tipcv2_conn_mgr_msg_ack, /* special CONN_MANAGER payload */ { "Number of Messages Acknowledged", "tipcv2.conn_mgr_msg_ack", - FT_UINT32, BASE_DEC, NULL, 0xffff0000, - "Number of Messages Acknowledged", HFILL } + FT_UINT32, BASE_DEC, NULL, 0xffff0000, + "Number of Messages Acknowledged", HFILL } }, { &hf_tipcv2_req_links, { "Requested Links", "tipcv2.req_links", - FT_UINT32, BASE_DEC, NULL, 0x0fff0000, - "Requested Links", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x0fff0000, + "Requested Links", HFILL } }, { &hf_tipcv2_timestamp, { "Timestamp", "tipcv2.timestamp", - FT_UINT32, BASE_DEC, NULL, 0xFFFFFFFF, - "OS-dependent Timestamp", HFILL } + FT_UINT32, BASE_DEC, NULL, 0xFFFFFFFF, + "OS-dependent Timestamp", HFILL } }, { &hf_tipcv2_item_size, { "Item Size", "tipcv2.item_size", - FT_UINT32, BASE_DEC, NULL, 0xFF000000, - "Item Size", HFILL } + FT_UINT32, BASE_DEC, NULL, 0xFF000000, + "Item Size", HFILL } }, { &hf_tipcv2_network_region, { "Network Region", "tipcv2.network_region", - FT_STRING, BASE_NONE, NULL, 0xffffffff, - "Network Region", HFILL } + FT_STRING, BASE_NONE, NULL, 0xffffffff, + "Network Region", HFILL } }, { &hf_tipcv2_local_router, { "Local Router", "tipcv2.local_router", - FT_STRING, BASE_NONE, NULL, 0xffffffff, - "Local Router", HFILL } + FT_STRING, BASE_NONE, NULL, 0xffffffff, + "Local Router", HFILL } }, { &hf_tipcv2_remote_router, { "Remote Router", "tipcv2.remote_router", - FT_STRING, BASE_NONE, NULL, 0xffffffff, - "Remote Router", HFILL } + FT_STRING, BASE_NONE, NULL, 0xffffffff, + "Remote Router", HFILL } }, { &hf_tipcv2_dist_dist, { "Route Distributor Dist", "tipcv2.dist_dist", - FT_UINT32, BASE_DEC, VALS(tipcv2_dist_dist_strings), 0x000000f0, - "Route Distributor Dist", HFILL } + FT_UINT32, BASE_DEC, VALS(tipcv2_dist_dist_strings), 0x000000f0, + "Route Distributor Dist", HFILL } }, { &hf_tipcv2_dist_scope, { "Route Distributor Scope", "tipcv2.dist_scope", - FT_UINT32, BASE_DEC, VALS(tipcv2_dist_scope_strings), 0x0000000f, - "Route Distributor Scope", HFILL } + FT_UINT32, BASE_DEC, VALS(tipcv2_dist_scope_strings), 0x0000000f, + "Route Distributor Scope", HFILL } }, { &hf_tipcv2_name_dist_port_id_node, { "Port Id Node", "tipcv2.port_id_node", - FT_STRING, BASE_NONE, NULL, 0xffffffff, - "Port Id Node", HFILL } + FT_STRING, BASE_NONE, NULL, 0xffffffff, + "Port Id Node", HFILL } }, { &hf_tipcv2_media_id, { "Media Id", "tipcv2.media_id", - FT_UINT32, BASE_DEC, NULL, 0x000000ff, - "Media Id", HFILL } + FT_UINT32, BASE_DEC, NULL, 0x000000ff, + "Media Id", HFILL } } }; -/* Setup protocol subtree array */ + /* Setup protocol subtree array */ static gint *ett[] = { &ett_tipc, &ett_tipc_data, @@ -2873,7 +2886,7 @@ proto_register_tipc(void) module_t *tipc_module; -/* options for the enum in the protocol preferences */ + /* options for the enum in the protocol preferences */ static enum_val_t handle_v2_as_options[] = { { "all", "ALL", V2_AS_ALL }, { "tipc l.5/1.6", "TIPC 1.5/1.6", V2_AS_1_6 }, @@ -2881,25 +2894,25 @@ proto_register_tipc(void) { NULL, NULL, 0 } }; -/* Register the protocol name and description */ + /* Register the protocol name and description */ proto_tipc = proto_register_protocol("Transparent Inter Process Communication(TIPC)", - "TIPC", "tipc"); + "TIPC", "tipc"); -/* Required function calls to register the header fields and subtrees used */ + /* Required function calls to register the header fields and subtrees used */ proto_register_field_array(proto_tipc, hf, array_length(hf)); proto_register_subtree_array(ett, array_length(ett)); -/* allow other protocols to be called according to specific values in order to - * dissect the protocols sent by TIPC */ + /* allow other protocols to be called according to specific values in order to + * dissect the protocols sent by TIPC */ - /* this allows e.g. to dissect everything which is TIPC Data */ + /* this allows e.g. to dissect everything which is TIPC Data */ tipc_user_dissector = register_dissector_table("tipc.usr", - "TIPC user", FT_UINT8, BASE_DEC); - /* this allows to dissect everything which is TIPC Data and uses a specific + "TIPC user", FT_UINT8, BASE_DEC); + /* this allows to dissect everything which is TIPC Data and uses a specific * port name type it actually does not really work because the type is not * necessarily set in every data message */ tipc_type_dissector = register_dissector_table("tipcv2.port_name_type", - "TIPC port name type", FT_UINT32, BASE_DEC); + "TIPC port name type", FT_UINT32, BASE_DEC); /* make heuristic dissectors possible */ register_heur_dissector_list("tipc", &tipc_heur_subdissector_list); @@ -2907,42 +2920,61 @@ proto_register_tipc(void) register_init_routine(tipc_defragment_init); /* Register configuration options */ - tipc_module = prefs_register_protocol(proto_tipc, NULL); + tipc_module = prefs_register_protocol(proto_tipc, proto_reg_handoff_tipc); prefs_register_bool_preference(tipc_module, "defragment", - "Reassemble TIPCv1 SEGMENTATION_MANAGER datagrams", - "Whether TIPCv1 SEGMENTATION_MANAGER datagrams should be reassembled", - &tipc_defragment); + "Reassemble TIPCv1 SEGMENTATION_MANAGER datagrams", + "Whether TIPCv1 SEGMENTATION_MANAGER datagrams should be reassembled", + &tipc_defragment); - prefs_register_bool_preference(tipc_module, "dissect_tipc_data", - "Dissect TIPC data", - "Whether to try to dissect TIPC data or not", - &dissect_tipc_data); + prefs_register_bool_preference(tipc_module, "dissect_tipc_data", + "Dissect TIPC data", + "Whether to try to dissect TIPC data or not", + &dissect_tipc_data); prefs_register_bool_preference(tipc_module, "try_heuristic_first", - "Try heuristic sub-dissectors first", - "Try to decode a TIPCv2 packet using an heuristic sub-dissector before using a registered sub-dissector", - &try_heuristic_first); + "Try heuristic sub-dissectors first", + "Try to decode a TIPCv2 packet using an heuristic sub-dissector before using a registered sub-dissector", + &try_heuristic_first); prefs_register_enum_preference(tipc_module, "handle_v2_as", "Handle version 2 as", - "TIPC 1.7 removes/adds fields (not) available in TIPC 1.5/1.6 while keeping the version number 2 in the packages. \"ALL\" shows all fields that were ever used in both versions.", + "TIPC 1.7 removes/adds fields (not) available in TIPC 1.5/1.6 while keeping the version number 2 in the packages. \"ALL\" shows all fields that were ever used in both versions.", &handle_v2_as, - handle_v2_as_options, + handle_v2_as_options, TRUE); + prefs_register_uint_preference(tipc_module, "alternate_port", + "TIPC-over-TCP port", "Decode this TCP ports traffic as TIPC. Set to \"0\" to disable.", 10, + &tipc_alternate_tcp_port); + + prefs_register_bool_preference(tipc_module, "desegment", + "Reassemble TIPC-over-TCP messages spanning multiple TCP segments", + "Whether the TIPC-over-TCP dissector should reassemble messages spanning multiple TCP segments. " + "To use this option, you must also enable \"Allow subdissectors to reassemble TCP streams\" in the TCP protocol settings.", + &tipc_tcp_desegment); } void proto_reg_handoff_tipc(void) { - dissector_handle_t tipc_handle; - - tipc_handle = create_dissector_handle(dissect_tipc, proto_tipc); - dissector_add("ethertype", ETHERTYPE_TIPC, tipc_handle); - if (extra_ethertype) - dissector_add("ethertype", ETHERTYPE_TIPC2, tipc_handle); - - ip_handle = find_dissector("ip"); - data_handle = find_dissector("data"); + if (!inited) { + tipc_handle = create_dissector_handle(dissect_tipc, proto_tipc); + tipc_tcp_handle = new_create_dissector_handle(dissect_tipc_tcp, proto_tipc); + ip_handle = find_dissector("ip"); + data_handle = find_dissector("data"); + + dissector_add("ethertype", ETHERTYPE_TIPC, tipc_handle); + + inited = TRUE; + } else { + /* change TIPC-over-TCP port if changed in the preferences */ + if (tipc_alternate_tcp_port != tipc_alternate_tcp_port_prev) { + if (tipc_alternate_tcp_port_prev != 0) + dissector_delete("tcp.port", tipc_alternate_tcp_port_prev, tipc_tcp_handle); + if (tipc_alternate_tcp_port != 0) + dissector_add("tcp.port", tipc_alternate_tcp_port, tipc_tcp_handle); + tipc_alternate_tcp_port_prev = tipc_alternate_tcp_port; + } + } } |