aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-infiniband.c
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2010-05-03 17:51:01 +0000
committerAnders Broman <anders.broman@ericsson.com>2010-05-03 17:51:01 +0000
commit15d860553aa44de1ab904d076cf7255d82cfc878 (patch)
treee245e47c2fe1effd95ffcfa4ee14fdacda1af883 /epan/dissectors/packet-infiniband.c
parentb32d39b75531bb10a9b8062ad45f82e027f67e61 (diff)
This patch is submitted on behalf of Mellanox Technologies:
This patch fixes the code to correctly identify MAD packets by their source and destination queue pairs. https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=4737 svn path=/trunk/; revision=32644
Diffstat (limited to 'epan/dissectors/packet-infiniband.c')
-rw-r--r--epan/dissectors/packet-infiniband.c66
1 files changed, 37 insertions, 29 deletions
diff --git a/epan/dissectors/packet-infiniband.c b/epan/dissectors/packet-infiniband.c
index 71571e6b2a..75a38c2de8 100644
--- a/epan/dissectors/packet-infiniband.c
+++ b/epan/dissectors/packet-infiniband.c
@@ -8,6 +8,8 @@
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
+ * Modified 2010 by Mellanox Technologies Ltd.
+ *
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
@@ -78,6 +80,8 @@ dissect_infiniband(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
struct e_in6_addr SRCgid; /* Structures to hold GIDs should we need them */
struct e_in6_addr DSTgid;
gint crc_length = 0;
+ gint32 src_qp = -1, dst_qp = -1; /* Tracks source and destination QPs. This is important
+ for deciding whether or not the packet is a MAD */
/* Mark the Packet type as Infiniband in the wireshark UI */
/* Clear other columns */
@@ -278,38 +282,38 @@ dissect_infiniband(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
case RDETH_DETH_PAYLD:
parse_RDETH(all_headers_tree, tvb, &offset);
- parse_DETH(all_headers_tree, tvb, &offset);
+ parse_DETH(all_headers_tree, tvb, &offset, &src_qp);
packetLength -= 4; /* RDETH */
packetLength -= 8; /* DETH */
- parse_PAYLOAD(all_headers_tree, pinfo, tvb, &offset, packetLength, virtualLane);
+ parse_PAYLOAD(all_headers_tree, pinfo, tvb, &offset, packetLength, src_qp, dst_qp);
break;
case RDETH_DETH_RETH_PAYLD:
parse_RDETH(all_headers_tree, tvb, &offset);
- parse_DETH(all_headers_tree, tvb, &offset);
+ parse_DETH(all_headers_tree, tvb, &offset, &src_qp);
parse_RETH(all_headers_tree, tvb, &offset);
packetLength -= 4; /* RDETH */
packetLength -= 8; /* DETH */
packetLength -= 16; /* RETH */
- parse_PAYLOAD(all_headers_tree, pinfo, tvb, &offset, packetLength, virtualLane);
+ parse_PAYLOAD(all_headers_tree, pinfo, tvb, &offset, packetLength, src_qp, dst_qp);
break;
case RDETH_DETH_IMMDT_PAYLD:
parse_RDETH(all_headers_tree, tvb, &offset);
- parse_DETH(all_headers_tree, tvb, &offset);
+ parse_DETH(all_headers_tree, tvb, &offset, &src_qp);
parse_IMMDT(all_headers_tree, tvb, &offset);
packetLength -= 4; /* RDETH */
packetLength -= 8; /* DETH */
packetLength -= 4; /* IMMDT */
- parse_PAYLOAD(all_headers_tree, pinfo, tvb, &offset, packetLength, virtualLane);
+ parse_PAYLOAD(all_headers_tree, pinfo, tvb, &offset, packetLength, src_qp, dst_qp);
break;
case RDETH_DETH_RETH_IMMDT_PAYLD:
parse_RDETH(all_headers_tree, tvb, &offset);
- parse_DETH(all_headers_tree, tvb, &offset);
+ parse_DETH(all_headers_tree, tvb, &offset, &src_qp);
parse_RETH(all_headers_tree, tvb, &offset);
parse_IMMDT(all_headers_tree, tvb, &offset);
@@ -318,11 +322,11 @@ dissect_infiniband(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
packetLength -= 16; /* RETH */
packetLength -= 4; /* IMMDT */
- parse_PAYLOAD(all_headers_tree, pinfo, tvb, &offset, packetLength, virtualLane);
+ parse_PAYLOAD(all_headers_tree, pinfo, tvb, &offset, packetLength, src_qp, dst_qp);
break;
case RDETH_DETH_RETH:
parse_RDETH(all_headers_tree, tvb, &offset);
- parse_DETH(all_headers_tree, tvb, &offset);
+ parse_DETH(all_headers_tree, tvb, &offset, &src_qp);
parse_RETH(all_headers_tree, tvb, &offset);
packetLength -= 4; /* RDETH */
@@ -337,14 +341,14 @@ dissect_infiniband(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
packetLength -= 4; /* RDETH */
packetLength -= 4; /* AETH */
- parse_PAYLOAD(all_headers_tree, pinfo, tvb, &offset, packetLength, virtualLane);
+ parse_PAYLOAD(all_headers_tree, pinfo, tvb, &offset, packetLength, src_qp, dst_qp);
break;
case RDETH_PAYLD:
parse_RDETH(all_headers_tree, tvb, &offset);
packetLength -= 4; /* RDETH */
- parse_PAYLOAD(all_headers_tree, pinfo, tvb, &offset, packetLength, virtualLane);
+ parse_PAYLOAD(all_headers_tree, pinfo, tvb, &offset, packetLength, src_qp, dst_qp);
break;
case RDETH_AETH:
parse_AETH(all_headers_tree, tvb, &offset);
@@ -367,7 +371,7 @@ dissect_infiniband(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
break;
case RDETH_DETH_ATOMICETH:
parse_RDETH(all_headers_tree, tvb, &offset);
- parse_DETH(all_headers_tree, tvb, &offset);
+ parse_DETH(all_headers_tree, tvb, &offset, &src_qp);
parse_ATOMICETH(all_headers_tree, tvb, &offset);
packetLength -= 4; /* RDETH */
@@ -377,36 +381,36 @@ dissect_infiniband(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
break;
case RDETH_DETH:
parse_RDETH(all_headers_tree, tvb, &offset);
- parse_DETH(all_headers_tree, tvb, &offset);
+ parse_DETH(all_headers_tree, tvb, &offset, &src_qp);
packetLength -= 4; /* RDETH */
packetLength -= 8; /* DETH */
break;
case DETH_PAYLD:
- parse_DETH(all_headers_tree, tvb, &offset);
+ parse_DETH(all_headers_tree, tvb, &offset, &src_qp);
packetLength -= 8; /* DETH */
- parse_PAYLOAD(all_headers_tree, pinfo, tvb, &offset, packetLength, virtualLane);
+ parse_PAYLOAD(all_headers_tree, pinfo, tvb, &offset, packetLength, src_qp, dst_qp);
break;
case PAYLD:
- parse_PAYLOAD(all_headers_tree, pinfo, tvb, &offset, packetLength, virtualLane);
+ parse_PAYLOAD(all_headers_tree, pinfo, tvb, &offset, packetLength, src_qp, dst_qp);
break;
case IMMDT_PAYLD:
parse_IMMDT(all_headers_tree, tvb, &offset);
packetLength -= 4; /* IMMDT */
- parse_PAYLOAD(all_headers_tree, pinfo, tvb, &offset, packetLength, virtualLane);
+ parse_PAYLOAD(all_headers_tree, pinfo, tvb, &offset, packetLength, src_qp, dst_qp);
break;
case RETH_PAYLD:
parse_RETH(all_headers_tree, tvb, &offset);
packetLength -= 16; /* RETH */
- parse_PAYLOAD(all_headers_tree, pinfo, tvb, &offset, packetLength, virtualLane);
+ parse_PAYLOAD(all_headers_tree, pinfo, tvb, &offset, packetLength, src_qp, dst_qp);
break;
case RETH:
parse_RETH(all_headers_tree, tvb, &offset);
@@ -419,7 +423,7 @@ dissect_infiniband(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
packetLength -= 4; /* AETH */
- parse_PAYLOAD(all_headers_tree, pinfo, tvb, &offset, packetLength, virtualLane);
+ parse_PAYLOAD(all_headers_tree, pinfo, tvb, &offset, packetLength, src_qp, dst_qp);
break;
case AETH:
parse_AETH(all_headers_tree, tvb, &offset);
@@ -446,16 +450,16 @@ dissect_infiniband(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
packetLength -= 4; /* IETH */
- parse_PAYLOAD(all_headers_tree, pinfo, tvb, &offset, packetLength, virtualLane);
+ parse_PAYLOAD(all_headers_tree, pinfo, tvb, &offset, packetLength, src_qp, dst_qp);
break;
case DETH_IMMDT_PAYLD:
- parse_DETH(all_headers_tree, tvb, &offset);
+ parse_DETH(all_headers_tree, tvb, &offset, &src_qp);
parse_IMMDT(all_headers_tree, tvb, &offset);
packetLength -= 8; /* DETH */
packetLength -= 4; /* IMMDT */
- parse_PAYLOAD(all_headers_tree, pinfo, tvb, &offset, packetLength, virtualLane);
+ parse_PAYLOAD(all_headers_tree, pinfo, tvb, &offset, packetLength, src_qp, dst_qp);
break;
default:
parse_VENDOR(all_headers_tree, tvb, &offset);
@@ -678,9 +682,10 @@ parse_RDETH(proto_tree * parentTree, tvbuff_t *tvb, gint *offset)
/* Parse DETH - Datagram Extended Transport Header
* IN: parentTree to add the dissection to - in this code the all_headers_tree
* IN: tvb - the data buffer from wireshark
-* IN/OUT: The current and updated offset */
+* IN/OUT: The current and updated offset
+* OUT: src_qp - The source QP of this packet */
static void
-parse_DETH(proto_tree * parentTree, tvbuff_t *tvb, gint *offset)
+parse_DETH(proto_tree * parentTree, tvbuff_t *tvb, gint *offset, gint *src_qp)
{
gint local_offset = *offset;
/* DETH - Datagram Extended Transport Header */
@@ -693,7 +698,8 @@ parse_DETH(proto_tree * parentTree, tvbuff_t *tvb, gint *offset)
proto_tree_add_item(DETH_header_tree, hf_infiniband_queue_key, tvb, local_offset, 4, FALSE); local_offset+=4;
proto_tree_add_item(DETH_header_tree, hf_infiniband_reserved8_DETH, tvb, local_offset, 1, FALSE); local_offset+=1;
- proto_tree_add_item(DETH_header_tree, hf_infiniband_source_qp, tvb, local_offset, 3, FALSE); local_offset+=3;
+ proto_tree_add_item(DETH_header_tree, hf_infiniband_source_qp, tvb, local_offset, 3, FALSE);
+ *src_qp = tvb_get_ntoh24(tvb, local_offset); local_offset+=3;
*offset = local_offset;
}
@@ -829,9 +835,11 @@ parse_IETH(proto_tree * parentTree, tvbuff_t *tvb, gint *offset)
* IN: parentTree to add the dissection to - in this code the all_headers_tree
* IN: pinfo - packet info from wireshark
* IN: tvb - the data buffer from wireshark
-* IN/OUT: The current and updated offset
-* IN: Length of Payload */
-static void parse_PAYLOAD(proto_tree *parentTree, packet_info *pinfo, tvbuff_t *tvb, gint *offset, gint length, guint8 virtualLane)
+* IN/OUT: offset - The current and updated offset
+* IN: length - Length of Payload
+* IN: src_qp - Source QP of the packet
+* IN: dst_qp - Destination QP of the packet */
+static void parse_PAYLOAD(proto_tree *parentTree, packet_info *pinfo, tvbuff_t *tvb, gint *offset, gint length, gint src_qp, gint dst_qp)
{
gint local_offset = *offset;
/* Payload - Packet Payload */
@@ -853,7 +861,7 @@ static void parse_PAYLOAD(proto_tree *parentTree, packet_info *pinfo, tvbuff_t *
}
return;
}
- if(virtualLane == 0xF0)
+ if(src_qp == 0 || src_qp == 1 || dst_qp == 0 || dst_qp == 1) /* management datagram */
{
management_class = tvb_get_guint8(tvb, (*offset) + 1);