From df420b7ef9347cc54015288c24b3e01860c8d884 Mon Sep 17 00:00:00 2001 From: Doug Oucharek Date: Fri, 12 Apr 2013 14:21:53 -0700 Subject: [PATCH] LU-3164 utils: Fix Wireshark decode of Lustre under Infiniband Due to a difference in the IB LND vs TCP LND header sizes, some hard-coded offsets in the LNet dissector will not believe that the payload is lustre. As such, the lustre protocol may not be decoded under Infiniband. This patch addresses this by adding a variable to applicable offsets which is set to 0 for TCP, and 24 (extra bytes in IB LND header) for Infiniband. Signed-off-by: Doug Oucharek Change-Id: I3783bbb563df109e160752d246db9bc5148cf132 Reviewed-on: http://review.whamcloud.com/6045 Tested-by: Hudson Reviewed-by: Nathaniel Clark Tested-by: Maloo Reviewed-by: Amir Shehata Reviewed-by: Oleg Drokin --- lustre/contrib/wireshark/packet-lnet.c | 39 +++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/lustre/contrib/wireshark/packet-lnet.c b/lustre/contrib/wireshark/packet-lnet.c index b3a0a3e..39b09e4 100644 --- a/lustre/contrib/wireshark/packet-lnet.c +++ b/lustre/contrib/wireshark/packet-lnet.c @@ -44,24 +44,27 @@ #include #include +/* 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 */ @@ -288,7 +291,7 @@ static int dissect_csum(tvbuff_t * tvb, proto_tree *tree, int offset) 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 @@ -537,12 +540,14 @@ get_lnet_message_len(packet_info __attribute__((__unused__))*pinfo, tvbuff_t *t 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 */ } @@ -558,10 +563,9 @@ dissect_lnet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) /* 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; + ib_lnd_extra_bytes = 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: @@ -581,8 +585,9 @@ dissect_ib_lnet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) return 0; } - ib_packet = 1; - dissect_lnet_message(tvb, pinfo, tree); + ib_lnd_extra_bytes = EXTRA_IB_HEADER_SIZE; + tcp_dissect_pdus(tvb, pinfo, tree, TRUE, LNET_HEADER_LEN, + get_lnet_message_len, dissect_lnet_message); return tvb_length(tvb); } @@ -736,7 +741,7 @@ dissect_lnet_message(tvbuff_t * tvb, packet_info *pinfo, proto_tree *tree) lnet_tree = proto_item_add_subtree(ti,ett_lnet); /* add the subtree*/ - if (ib_packet) { + if (ib_lnd_extra_bytes) { offset = dissect_ib_msg(tvb, lnet_tree, offset); if (offset == 0) { /* There was no LNet payload, only ob2lnd. */ @@ -805,7 +810,7 @@ dissect_lnet_message(tvbuff_t * tvb, packet_info *pinfo, proto_tree *tree) /* padding */ - msg_filler_length = 72 - offset + 24 ; + msg_filler_length = 72 - offset + 24 + ib_lnd_extra_bytes; if ( msg_filler_length > 72) return ; /* +24 : ksosck_message take 24bytes, and allready in offset */ -- 1.8.3.1