-/* packet-lnet.c
- * Lnet packet dissection
+/* packet-lnet.c
+ * Lnet packet dissection
* Author: Laurent George <george@ocre.cea.fr>
* based on packet-agentx.c and packet-afs.c
* 20080903
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
- * Copyright (c) 2012, 2013, Intel Corporation.
+ * Copyright (c) 2012, 2017, Intel Corporation.
*/
#ifdef HAVE_CONFIG_H
#include <epan/conversation.h>
#include <epan/prefs.h>
#include <epan/emem.h>
-
+#include <epan/to_str.h>
#include <epan/dissectors/packet-tcp.h>
#include <epan/dissectors/packet-infiniband.h>
+#include "wireshark-compat.h"
+
+/* This value inidcates whether we are processing an Infiniband packet, or
+ TCP. It gets set to the extra bytes the IB header requires if IB,
+ or zero if TCP. */
+static guint ib_lnd_extra_bytes;
+
/* How much data has at least to be available to be able to determine the
* length of the lnet message.
* Note: This is only used for TCP-based LNet packets. Not used for Infiniband.
*/
#define LNET_HEADER_LEN 52
-#define LNET_NID_DEST_OFFSET 24
-#define LNET_NID_SRC_OFFSET 32
-#define LNET_MSG_TYPE_OFFSET 48
-#define LNET_PTL_INDEX_OFFSET_PUT 88
+#define LNET_NID_DEST_OFFSET (24 + ib_lnd_extra_bytes)
+#define LNET_NID_SRC_OFFSET (32 + ib_lnd_extra_bytes)
+#define LNET_MSG_TYPE_OFFSET (48 + ib_lnd_extra_bytes)
+#define LNET_PTL_INDEX_OFFSET_PUT (88 + ib_lnd_extra_bytes)
+
+#define EXTRA_IB_HEADER_SIZE 24
/* TCP ports used for LNet. */
static guint global_lnet_tcp_port = 988;
static guint lnet_tcp_port = 988;
-/* This boolean inidcates whether we are processing an Infiniband packet, or
- TCP. */
-static guint ib_packet;
-
void proto_reg_handoff_lnet(void);
/* Define the lnet proto */
if (!csum)
proto_tree_add_text(tree, tvb, offset, 4, "Checksum Disabled");
else {
- if (ib_packet)
+ if (ib_lnd_extra_bytes)
proto_tree_add_item(tree, hf_lnet_ib_csum, tvb, offset,
4, little_endian);
else
return offset + 8;
}
-static void
-dissect_ksock_msg_noop( tvbuff_t * tvb, packet_info *pinfo, proto_tree *tree)
+#ifdef WIRESHARK_COMPAT
+static void
+dissect_ksock_msg_noop(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+#else
+static int
+dissect_ksock_msg_noop(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
+ void *ignored)
+#endif
{
guint32 offset;
offset=0;
offset=dissect_csum(tvb,tree,offset);
offset=dissect_req_cookie(tvb, tree, offset);
offset=dissect_ack_cookie(tvb,tree,offset);
+#ifndef WIRESHARK_COMPAT
+ return offset;
+#endif
}
proto_tree_add_item(tree,hf_match_bits,tvb,offset,8,little_endian);offset+=8;
proto_tree_add_item(tree,hf_hdr_data,tvb,offset,8,little_endian);offset+=8;
- if (check_col(pinfo->cinfo, COL_INFO))
- col_append_sep_str(pinfo->cinfo, COL_INFO, ", ",
- val_to_str(tvb_get_letohl(tvb, offset), portal_indices,
- "Unknown")); /* add some nice value */
+ col_append_sep_str(pinfo->cinfo, COL_INFO, ", ",
+ val_to_str(tvb_get_letohl(tvb, offset),
+ portal_indices,
+ "Unknown")); /* add some nice value */
proto_item_append_text(tree, ", %s" , val_to_str(tvb_get_letohl(tvb,
offset),
portal_indices,
static int dissect_lnet_get(tvbuff_t * tvb, proto_tree *tree, int offset, packet_info *pinfo _U_)
{
/* typedef struct lnet_get {
- lnet_handle_wire_t return_wmd;
- __u64 match_bits;
- __u32 ptl_index;
- __u32 src_offset;
- __u32 sink_length;
- } WIRE_ATTR lnet_get_t; */
-
- proto_tree_add_item(tree,hf_dst_wmd_interface,tvb,offset,8,little_endian);offset+=8;
- proto_tree_add_item(tree,hf_dst_wmd_object,tvb,offset,8,little_endian);offset+=8;
- /*if (check_col(pinfo->cinfo, COL_INFO))*/
- /* col_prepend_fence_fstr(pinfo->cinfo, COL_INFO, " %" G_GINT64_MODIFIER "u ", tvb_get_letoh64(tvb,offset) );*/
-
- proto_tree_add_item(tree,hf_match_bits,tvb,offset,8,little_endian);offset+=8;
- if (check_col(pinfo->cinfo, COL_INFO))
- col_append_sep_str(pinfo->cinfo, COL_INFO, ", ", val_to_str(tvb_get_letohl(tvb,offset), portal_indices, "Unknown"));
- proto_item_append_text(tree, ", %s" , val_to_str(tvb_get_letohl(tvb,offset), portal_indices, "Unknown"));
- proto_tree_add_item(tree,hf_ptl_index,tvb,offset,4,little_endian);offset+=4;
- proto_tree_add_item(tree,hf_src_offset,tvb,offset,4,little_endian);offset+=4;
- proto_tree_add_item(tree,hf_sink_length,tvb,offset,4,little_endian);offset+=4;
- return offset;
+ lnet_handle_wire_t return_wmd;
+ __u64 match_bits;
+ __u32 ptl_index;
+ __u32 src_offset;
+ __u32 sink_length;
+ } WIRE_ATTR lnet_get_t;
+ */
+
+ proto_tree_add_item(tree, hf_dst_wmd_interface,
+ tvb, offset, 8, little_endian);
+ offset += 8;
+ proto_tree_add_item(tree, hf_dst_wmd_object, tvb, offset, 8,
+ little_endian);
+ offset += 8;
+ proto_tree_add_item(tree, hf_match_bits, tvb, offset, 8, little_endian);
+ offset += 8;
+ col_append_sep_str(pinfo->cinfo, COL_INFO, ", ",
+ val_to_str(tvb_get_letohl(tvb, offset),
+ portal_indices, "Unknown"));
+ proto_item_append_text(tree, ", %s",
+ val_to_str(tvb_get_letohl(tvb, offset),
+ portal_indices, "Unknown"));
+ proto_tree_add_item(tree, hf_ptl_index, tvb, offset, 4, little_endian);
+ offset += 4;
+ proto_tree_add_item(tree, hf_src_offset, tvb, offset, 4, little_endian);
+ offset += 4;
+ proto_tree_add_item(tree, hf_sink_length, tvb, offset, 4,
+ little_endian);
+ offset += 4;
+ return offset;
}
static int dissect_lnet_reply(tvbuff_t * tvb, proto_tree *tree, int offset)
return offset ;
}
-static void dissect_lnet_message(tvbuff_t * tvb, packet_info *pinfo, proto_tree *tree);
+#ifdef WIRESHARK_COMPAT
+static void dissect_lnet_message(tvbuff_t *, packet_info *, proto_tree *);
+#else
+static int dissect_lnet_message(tvbuff_t *, packet_info *, proto_tree *, void*);
+#endif
/* The next two length getting routines are only used for KSOCK LNK messages. */
static guint
guint32 plen;
/* Get the payload length */
- plen = tvb_get_letohl(tvb,offset+28+24); /* 24 = ksm header,
+ plen = tvb_get_letohl(tvb, offset + 28 + 24 + ib_lnd_extra_bytes);
+ /* 24 = ksm header,
28 = the rest of the
headers */
/* That length doesn't include the header; add that in. */
- return plen + 72 +24 ; /* +24 == ksock msg header.. :D */
+ return plen + 72 + 24 + ib_lnd_extra_bytes; /* +24 == ksock msg
+ header.. :D */
}
/* TODO : correct this, now we do a difference between packet with
NOOP and others .. but I don't find how to use pdu_dissect with
a variable length<=LNET_HEADER_LEN */
- ib_packet = 0;
- switch(tvb_get_letohl(tvb,0)){
- case KSOCK_MSG_NOOP:
- /*g_print("ksock noop %d \n", pinfo->fd->num);*/
- tcp_dissect_pdus(tvb,pinfo,tree,TRUE,0, get_noop_message_len,dissect_ksock_msg_noop);
- break;
- case KSOCK_MSG_LNET:
- tcp_dissect_pdus(tvb,pinfo,tree,TRUE,LNET_HEADER_LEN, get_lnet_message_len,dissect_lnet_message);
- break;
+ ib_lnd_extra_bytes = 0;
+ switch (tvb_get_letohl(tvb, 0)) {
+ case KSOCK_MSG_NOOP:
+#ifdef WIRESHARK_COMPAT
+ tcp_dissect_pdus(tvb, pinfo, tree, TRUE, 0,
+ get_noop_message_len,
+ dissect_ksock_msg_noop);
+#else
+ tcp_dissect_pdus(tvb, pinfo, tree, TRUE, 0,
+ get_noop_message_len,
+ dissect_ksock_msg_noop, NULL);
+#endif
+ break;
+ case KSOCK_MSG_LNET:
+#ifdef WIRESHARK_COMPAT
+ tcp_dissect_pdus(tvb, pinfo, tree, TRUE, LNET_HEADER_LEN,
+ get_lnet_message_len,
+ dissect_lnet_message);
+#else
+ tcp_dissect_pdus(tvb, pinfo, tree, TRUE, LNET_HEADER_LEN,
+ get_lnet_message_len,
+ dissect_lnet_message, NULL);
+#endif
+ break;
}
-
}
static int
+#ifdef WIRESHARK_COMPAT
dissect_ib_lnet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+#else
+dissect_ib_lnet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
+#endif
{
/* We can tell if this is an LNet payload by looking at the first
* 32-bit word for our magic number. */
return 0;
}
- ib_packet = 1;
- dissect_lnet_message(tvb, pinfo, tree);
+ ib_lnd_extra_bytes = EXTRA_IB_HEADER_SIZE;
+#ifdef WIRESHARK_COMPAT
+ tcp_dissect_pdus(tvb, pinfo, tree, TRUE, LNET_HEADER_LEN,
+ get_lnet_message_len, dissect_lnet_message);
+#else
+ tcp_dissect_pdus(tvb, pinfo, tree, TRUE, LNET_HEADER_LEN,
+ get_lnet_message_len, dissect_lnet_message, NULL);
+#endif
return tvb_length(tvb);
}
/*----------------------------------------------------------- */
+#ifdef WIRESHARK_COMPAT
static void
-dissect_lnet_message(tvbuff_t * tvb, packet_info *pinfo, proto_tree *tree)
+dissect_lnet_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+#else
+static int
+dissect_lnet_message(tvbuff_t *tvb, packet_info *pinfo,
+ proto_tree *tree, void *data)
+#endif
{
-
guint64 match;
guint32 msg_type;
-
- lnet_request_val_t* conversation_val ;
-
-
- if (check_col(pinfo->cinfo, COL_PROTOCOL)) {
- col_set_str(pinfo->cinfo, COL_PROTOCOL, "Lnet");
- }
-
- if (check_col(pinfo->cinfo, COL_INFO)) {
- /* t_nid dest_nid ; */
- /*t_nid src_nid ; */
- /*guint32 msg_type;*/
- /*[> col_clear(pinfo->cinfo, COL_INFO); <]*/
- /*dest_nid = get_nid(tvb, LNET_NID_DEST_OFFSET);*/
- /*src_nid = get_nid(tvb, LNET_NID_SRC_OFFSET);*/
-
- /*[> col_add_fstr(pinfo->cinfo, COL_INFO, "%s@tcp%d > %s@tcp%d",
- ip_to_str((guint8 *) &src_nid.addr), src_nid.interface,
- ip_to_str((guint8 *) & dest_nid.addr), dest_nid.interface); */
-
- msg_type = tvb_get_letohl(tvb, LNET_MSG_TYPE_OFFSET );
- /* We delete the entire line and add LNET + msg_type */
- col_add_fstr(pinfo->cinfo, COL_INFO, "LNET_%s", (msg_type < sizeof(lnet_msg_type_t)/sizeof(value_string)) ? lnet_msg_type_t[msg_type].strptr : "Unknown");
- }
-
- if (tree) {
- t_nid dest_nid ; /* nid value */
- t_nid src_nid ;
-
-
- proto_item *ti = NULL; /* principal node */
- proto_tree *lnet_tree = NULL ; /* principal tree */
- proto_tree *lnet_nid_src_tree= NULL ; /*subtree for the nids*/
- proto_tree *lnet_nid_dest_tree= NULL ;
- proto_item *ti_src_nid ; /* node for the nids */
- proto_item *ti_dest_nid ;
-
- gint offset = 0 ;
-
- guint32 msg_type ;
- guint32 payload_length;
- guint32 msg_filler_length;
-
-
- ti = proto_tree_add_item(tree,proto_lnet,tvb,0,-1,FALSE); /* principal node */
- /* ti=proto_tree_add_protocol_format(tree, proto_lnet, tvb, 0, -1, "Lnet"); */
-
- lnet_tree = proto_item_add_subtree(ti,ett_lnet); /* add the subtree*/
-
- if (ib_packet) {
- offset = dissect_ib_msg(tvb, lnet_tree, offset);
- if (offset == 0) {
- /* There was no LNet payload, only ob2lnd. */
- return;
- }
- } else {
- /* dissect the first 24 bytes (ksock_msg_t in
- lnet/socklnd.h */
- offset=dissect_ksock_msg(tvb,lnet_tree,offset);
- }
-
- /* Dest nid */
- dest_nid = get_nid(tvb, offset);
- ti_dest_nid = proto_tree_add_text(lnet_tree, tvb, offset, 8, "dest_nid = %s@tcp%d", ip_to_str((guint8 *) &dest_nid.addr), dest_nid.interface);
- lnet_nid_dest_tree = proto_item_add_subtree(ti_dest_nid,ett_lnet_dest_nid) ;
- offset=dissect_dest_nid(tvb,lnet_nid_dest_tree,offset);
-
- /* Same for src_nid */
- src_nid = get_nid(tvb, offset);
- ti_src_nid = proto_tree_add_text(lnet_tree, tvb, offset, 8, "src_nid = %s@tcp%d", ip_to_str((guint8 *) &src_nid.addr), src_nid.interface);
- lnet_nid_src_tree = proto_item_add_subtree(ti_src_nid,ett_lnet_src_nid) ;
- offset=dissect_src_nid(tvb,lnet_nid_src_tree,offset);
-
- /* pid */
- proto_tree_add_item(lnet_tree, hf_lnet_src_pid, tvb, offset, 4, TRUE); offset+=4;
- proto_tree_add_item(lnet_tree, hf_lnet_dest_pid, tvb, offset, 4, TRUE); offset+=4;
-
- /* message_type (32 bits) */
- msg_type = tvb_get_letohl(tvb, offset+0);
- /* put some nice info on lnet line */
- proto_item_append_text(ti," %s", (msg_type < sizeof(lnet_msg_type_t)/sizeof(value_string)) ? lnet_msg_type_t[msg_type].strptr : "Unknow") ; /* rajout de l'info dans l'arbre */
- proto_tree_add_item(lnet_tree, hf_lnet_msg_type, tvb, offset, 4, TRUE); offset+=4;
-
- /* payload data (to follow) length :*/
- payload_length = tvb_get_letohl(tvb,offset+0);
- proto_tree_add_item(lnet_tree, hf_lnet_payload_length, tvb, offset, 4, TRUE); offset+=4;
-
- /* here offset = 24+8+8+4+4+4+4 = 56 */
- match = 0 ;
- switch(msg_type) {
- case LNET_MSG_ACK:
- offset=dissect_lnet_ack(tvb,lnet_tree,offset,pinfo);
- match = tvb_get_letoh64(tvb,72 );
- break;
- case LNET_MSG_PUT:
- offset=dissect_lnet_put(tvb,lnet_tree,offset,pinfo);
- match = tvb_get_letoh64(tvb, 72);
- break;
- case LNET_MSG_GET:
- offset=dissect_lnet_get(tvb,lnet_tree,offset,pinfo);
- match = tvb_get_letoh64(tvb, 72);
- break;
- case LNET_MSG_REPLY:
- offset=dissect_lnet_reply(tvb,lnet_tree,offset);
- break;
- case LNET_MSG_HELLO:
- offset=dissect_lnet_hello(tvb,lnet_tree,offset);
- break;
- default:
- break;
+ gint offset = 0;
+ t_nid dest_nid; /* nid value */
+ t_nid src_nid;
+ proto_item *ti = NULL; /* principal node */
+ proto_tree *lnet_tree = NULL; /* principal tree */
+ proto_tree *lnet_nid_src_tree = NULL; /*subtree for the nids*/
+ proto_tree *lnet_nid_dest_tree = NULL;
+ proto_item *ti_src_nid; /* node for the nids */
+ proto_item *ti_dest_nid;
+ guint32 payload_length;
+ guint32 msg_filler_length;
+
+ /* lnet_request_val_t* conversation_val ; */
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "Lnet");
+
+ msg_type = tvb_get_letohl(tvb, LNET_MSG_TYPE_OFFSET);
+ /* We delete the entire line and add LNET + msg_type */
+ col_add_fstr(pinfo->cinfo, COL_INFO, "LNET_%s",
+ (msg_type < sizeof(lnet_msg_type_t)/sizeof(value_string))
+ ? lnet_msg_type_t[msg_type].strptr
+ : "Unknown");
+
+ if (tree == NULL)
+ goto out;
+
+ /* principal node */
+ ti = proto_tree_add_item(tree, proto_lnet, tvb, 0, -1, FALSE);
+
+ lnet_tree = proto_item_add_subtree(ti, ett_lnet);
+
+ if (ib_lnd_extra_bytes) {
+ offset = dissect_ib_msg(tvb, lnet_tree, offset);
+ if (offset == 0) {
+ /* There was no LNet payload, only ob2lnd. */
+ goto out;
}
+ } else {
+ /* dissect the first 24 bytes (ksock_msg_t in
+ * lnet/socklnd.h
+ */
+ offset = dissect_ksock_msg(tvb, lnet_tree, offset);
+ }
+ /* Dest nid */
+ dest_nid = get_nid(tvb, offset);
+ ti_dest_nid = proto_tree_add_text(lnet_tree, tvb, offset, 8,
+ "dest_nid = %s@tcp%d",
+ ip_to_str((guint8 *) &dest_nid.addr),
+ dest_nid.interface);
+ lnet_nid_dest_tree = proto_item_add_subtree(ti_dest_nid,
+ ett_lnet_dest_nid);
+ offset = dissect_dest_nid(tvb, lnet_nid_dest_tree, offset);
+
+ /* Same for src_nid */
+ src_nid = get_nid(tvb, offset);
+ ti_src_nid = proto_tree_add_text(lnet_tree, tvb, offset, 8,
+ "src_nid = %s@tcp%d",
+ ip_to_str((guint8 *) &src_nid.addr),
+ src_nid.interface);
+ lnet_nid_src_tree = proto_item_add_subtree(ti_src_nid,
+ ett_lnet_src_nid);
+ offset = dissect_src_nid(tvb, lnet_nid_src_tree, offset);
+
+ /* pid */
+ proto_tree_add_item(lnet_tree, hf_lnet_src_pid, tvb, offset, 4, TRUE);
+ offset += 4;
+ proto_tree_add_item(lnet_tree, hf_lnet_dest_pid, tvb, offset, 4, TRUE);
+ offset += 4;
- conversation_val = get_lnet_conv(pinfo , lnet_request_hash, match );
- /* proto_tree_add_text(tree, tvb, 0 , 0, "match = %" G_GINT64_MODIFIER "u parent = %d", conversation_val -> match_bits , conversation_val -> packet_num_parent); */
-
-
- /* padding */
- msg_filler_length = 72 - offset + 24 ;
- if ( msg_filler_length > 72)
- return ;
- /* +24 : ksosck_message take 24bytes, and allready in offset */
+ /* message_type (32 bits) */
+ msg_type = tvb_get_letohl(tvb, offset+0);
+ /* put some nice info on lnet line */
+ proto_item_append_text(ti, " %s",
+ (msg_type <
+ sizeof(lnet_msg_type_t)/sizeof(value_string))
+ ? lnet_msg_type_t[msg_type].strptr
+ : "Unknow");
+ proto_tree_add_item(lnet_tree, hf_lnet_msg_type, tvb,
+ offset, 4, TRUE);
+ offset += 4;
- proto_tree_add_item(lnet_tree, hf_lnet_msg_filler, tvb, offset,
- msg_filler_length, little_endian);
- offset+=msg_filler_length;
+ /* payload data (to follow) length :*/
+ payload_length = tvb_get_letohl(tvb, offset+0);
+ proto_tree_add_item(lnet_tree, hf_lnet_payload_length, tvb,
+ offset, 4, TRUE);
+ offset += 4;
- if (payload_length>0)
- {
+ /* here offset = 24+8+8+4+4+4+4 = 56 */
+ match = 0;
+ switch (msg_type) {
+ case LNET_MSG_ACK:
+ offset = dissect_lnet_ack(tvb, lnet_tree, offset, pinfo);
+ match = tvb_get_letoh64(tvb, 72);
+ break;
+ case LNET_MSG_PUT:
+ offset = dissect_lnet_put(tvb, lnet_tree, offset, pinfo);
+ match = tvb_get_letoh64(tvb, 72);
+ break;
+ case LNET_MSG_GET:
+ offset = dissect_lnet_get(tvb, lnet_tree, offset, pinfo);
+ match = tvb_get_letoh64(tvb, 72);
+ break;
+ case LNET_MSG_REPLY:
+ offset = dissect_lnet_reply(tvb, lnet_tree, offset);
+ break;
+ case LNET_MSG_HELLO:
+ offset = dissect_lnet_hello(tvb, lnet_tree, offset);
+ break;
+ default:
+ break;
+ }
- /* display of payload */
- proto_tree_add_item(lnet_tree, hf_lnet_payload, tvb,
- offset, payload_length,
- little_endian);
+ /* conversation_val = */
+ get_lnet_conv(pinfo, lnet_request_hash, match);
+ /* proto_tree_add_text(tree, tvb, 0 , 0, "match = %"
+ * G_GINT64_MODIFIER "u parent = %d",
+ * conversation_val -> match_bits ,
+ * conversation_val -> packet_num_parent);
+ */
+
+ /* padding */
+ msg_filler_length = 72 - offset + 24 + ib_lnd_extra_bytes;
+ if (msg_filler_length > 72)
+ goto out;
+ /* +24 : ksosck_message take 24bytes, and allready in offset */
+
+ proto_tree_add_item(lnet_tree, hf_lnet_msg_filler, tvb, offset,
+ msg_filler_length, little_endian);
+ offset += msg_filler_length;
+
+ if (payload_length > 0) {
+ /* display of payload */
+ proto_tree_add_item(lnet_tree, hf_lnet_payload, tvb,
+ offset, payload_length,
+ little_endian);
+
+ next_tvb = tvb_new_subset(tvb, offset,
+ payload_length, payload_length);
+ if (msg_type == LNET_MSG_PUT)
+ dissector_try_uint(subdissector_table,
+ tvb_get_letohl(tvb, LNET_PTL_INDEX_OFFSET_PUT),
+ next_tvb, pinfo, tree);
- next_tvb = tvb_new_subset (tvb, offset, payload_length, payload_length);
- if(msg_type==LNET_MSG_PUT)
- dissector_try_port(subdissector_table, tvb_get_letohl(tvb,LNET_PTL_INDEX_OFFSET_PUT), next_tvb, pinfo, tree);
+ }
- }
+ offset += payload_length;
- offset+=payload_length;
- }
+out:
+#ifdef WIRESHARK_COMPAT
+ return;
+#else
+ return offset;
+#endif
}
void
lnet_prefs_initialized = TRUE;
}
else
- dissector_delete("tcp.port",global_lnet_tcp_port, lnet_handle);
+ dissector_delete_uint("tcp.port", global_lnet_tcp_port, lnet_handle);
lnet_tcp_port = global_lnet_tcp_port;
- dissector_add("tcp.port", lnet_tcp_port, lnet_handle);
+ dissector_add_uint("tcp.port", lnet_tcp_port, lnet_handle);
}