aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-tipc.c
diff options
context:
space:
mode:
Diffstat (limited to 'epan/dissectors/packet-tipc.c')
-rw-r--r--epan/dissectors/packet-tipc.c66
1 files changed, 48 insertions, 18 deletions
diff --git a/epan/dissectors/packet-tipc.c b/epan/dissectors/packet-tipc.c
index 4de6afea41..034c6c9a0c 100644
--- a/epan/dissectors/packet-tipc.c
+++ b/epan/dissectors/packet-tipc.c
@@ -34,6 +34,7 @@
#include <epan/prefs.h>
#include <epan/expert.h>
#include <epan/etypes.h>
+#include <epan/address_types.h>
#include <epan/reassemble.h>
#include "packet-tcp.h"
@@ -184,6 +185,8 @@ static gint ett_tipc_data = -1;
static expert_field ei_tipc_words_unused_for_user = EI_INIT;
+static int tipc_address_type = -1;
+
/* protocol preferences */
static gboolean tipc_defragment = TRUE;
static gboolean dissect_tipc_data = TRUE;
@@ -574,16 +577,12 @@ tipc_defragment_init(void)
&addresses_reassembly_table_functions);
}
-
static gchar*
-tipc_addr_to_str(guint tipc_address)
+tipc_addr_value_to_buf(guint tipc_address, gchar *buf, int buf_len)
{
guint8 zone;
guint16 subnetwork;
guint16 processor;
- gchar *buff;
-
- buff = (gchar *)wmem_alloc(wmem_packet_scope(), MAX_TIPC_ADDRESS_STR_LEN);
processor = tipc_address & 0x0fff;
@@ -593,11 +592,40 @@ 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(buf, buf_len, "%u.%u.%u", zone, subnetwork, processor);
+ return buf;
+}
+
+static gchar*
+tipc_addr_to_str(guint tipc_address)
+{
+ gchar *buf;
+
+ buf = (gchar *)wmem_alloc(wmem_packet_scope(), MAX_TIPC_ADDRESS_STR_LEN);
+ return tipc_addr_value_to_buf(tipc_address, buf, MAX_TIPC_ADDRESS_STR_LEN);
+}
+
+static gboolean
+tipc_addr_to_str_buf(const address* addr, gchar *buf, int buf_len)
+{
+ const guint8 *data = (const guint8 *)addr->data;
+ guint32 tipc_address;
+
+ tipc_address = data[0];
+ tipc_address = (tipc_address << 8) ^ data[1];
+ tipc_address = (tipc_address << 8) ^ data[2];
+ tipc_address = (tipc_address << 8) ^ data[3];
- return buff;
+ tipc_addr_value_to_buf(tipc_address, buf, buf_len);
+ return TRUE;
}
+static int tipc_addr_str_len(const address* addr _U_)
+{
+ return MAX_TIPC_ADDRESS_STR_LEN;
+}
+
+
/*
All name distributor messages have a data part containing one or more table elements with
the following five-word structure:
@@ -2069,18 +2097,18 @@ dissect_tipc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_
/* Data type header */
if (hdr_size > 5 && user <4) {
/* W6 Originating Processor */
- TVB_SET_ADDRESS(&pinfo->src, AT_TIPC, tipc_tvb, offset + 24, 4);
+ TVB_SET_ADDRESS(&pinfo->src, tipc_address_type, tipc_tvb, offset + 24, 4);
/* W7 Destination Processor */
- TVB_SET_ADDRESS(&pinfo->dst, AT_TIPC, tipc_tvb, offset + 28, 4);
+ TVB_SET_ADDRESS(&pinfo->dst, tipc_address_type, tipc_tvb, offset + 28, 4);
} else {
/* Short data hdr */
/* W2 Previous Processor */
- TVB_SET_ADDRESS(&pinfo->src, AT_TIPC, tipc_tvb, offset + 8, 4);
+ TVB_SET_ADDRESS(&pinfo->src, tipc_address_type, tipc_tvb, offset + 8, 4);
}
} else {
/* W2 Previous Processor */
- TVB_SET_ADDRESS(&pinfo->src, AT_TIPC, tipc_tvb, offset + 8, 4);
+ TVB_SET_ADDRESS(&pinfo->src, tipc_address_type, tipc_tvb, offset + 8, 4);
}
break;
case TIPCv2:
@@ -2105,28 +2133,28 @@ dissect_tipc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_
if (datatype_hdr) {
if (hdr_size > 6) {
/* W6 Originating Processor */
- TVB_SET_ADDRESS(&pinfo->src, AT_TIPC, tipc_tvb, offset + 24, 4);
+ TVB_SET_ADDRESS(&pinfo->src, tipc_address_type, tipc_tvb, offset + 24, 4);
/* W7 Destination Processor */
- TVB_SET_ADDRESS(&pinfo->dst, AT_TIPC, tipc_tvb, offset + 28, 4);
+ TVB_SET_ADDRESS(&pinfo->dst, tipc_address_type, tipc_tvb, offset + 28, 4);
} else {
/* W3 Previous Processor */
- TVB_SET_ADDRESS(&pinfo->src, AT_TIPC, tipc_tvb, offset + 12, 4);
+ TVB_SET_ADDRESS(&pinfo->src, tipc_address_type, tipc_tvb, offset + 12, 4);
}
} else {
if (user != TIPCv2_NEIGHBOUR_DISCOVERY) {
/* W6 Originating Processor */
- TVB_SET_ADDRESS(&pinfo->src, AT_TIPC, tipc_tvb, offset + 24, 4);
+ TVB_SET_ADDRESS(&pinfo->src, tipc_address_type, tipc_tvb, offset + 24, 4);
/* W7 Destination Processor */
- TVB_SET_ADDRESS(&pinfo->dst, AT_TIPC, tipc_tvb, offset + 28, 4);
+ TVB_SET_ADDRESS(&pinfo->dst, tipc_address_type, tipc_tvb, offset + 28, 4);
} else {
/* W2 Destination Domain */
- TVB_SET_ADDRESS(&pinfo->dst, AT_TIPC, tipc_tvb, offset + 8, 4);
+ TVB_SET_ADDRESS(&pinfo->dst, tipc_address_type, tipc_tvb, offset + 8, 4);
/* W3 Previous Node */
- TVB_SET_ADDRESS(&pinfo->src, AT_TIPC, tipc_tvb, offset + 12, 4);
+ TVB_SET_ADDRESS(&pinfo->src, tipc_address_type, tipc_tvb, offset + 12, 4);
}
}
break;
@@ -2933,6 +2961,8 @@ proto_register_tipc(void)
/* Register configuration options */
tipc_module = prefs_register_protocol(proto_tipc, proto_reg_handoff_tipc);
+ tipc_address_type = address_type_dissector_register("tipc_address_type", "TIPC Address Zone,Subnetwork,Processor", tipc_addr_to_str_buf, tipc_addr_str_len);
+
/* Set default ports */
range_convert_str(&global_tipc_udp_port_range, DEFAULT_TIPC_PORT_RANGE, MAX_TCP_PORT);