forked from osmocom/wireshark
opa: Add support for TID RDMA protocol
Change-Id: I04a4333e64a8fc9efc96bd351c55b293986629e2 Signed-off-by: Goldman, Adam <adam.goldman@intel.com> Reviewed-on: https://code.wireshark.org/review/28504 Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
This commit is contained in:
parent
bb47336086
commit
0090007308
|
@ -109,6 +109,7 @@ void proto_register_opa_9b(void);
|
|||
#define ATOMICETH 21
|
||||
#define IETH_PAYLD 22
|
||||
#define KDETH_PSM 23
|
||||
#define KDETH_TIDRDMA 24
|
||||
|
||||
/* PSM */
|
||||
#define PSM_RESERVED 0xC0
|
||||
|
@ -139,6 +140,16 @@ void proto_register_opa_9b(void);
|
|||
#define PSM_AM_REQUEST 0xD9
|
||||
#define PSM_AM_REPLY 0xDA
|
||||
|
||||
/* TID RDMA */
|
||||
#define TID_RDMA_WRITE_REQUEST 0xE0
|
||||
#define TID_RDMA_WRITE_RESPONSE 0xE1
|
||||
#define TID_RDMA_WRITE_DATA 0xE2
|
||||
#define TID_RDMA_WRITE_DATA_LAST 0xE3
|
||||
#define TID_RDMA_READ_REQUEST 0xE4
|
||||
#define TID_RDMA_READ_RESPONSE 0xE5
|
||||
#define TID_RDMA_RESYNC 0xE6
|
||||
#define TID_RDMA_ACK 0xE7
|
||||
|
||||
/* Array of all availavle OpCodes to make matching a bit easier. The OpCodes
|
||||
* dictate the header sequence following in the packet. These arrays tell the
|
||||
* dissector which headers must be decoded for the given OpCode.
|
||||
|
@ -242,70 +253,115 @@ static guint32 opCode_PSM[] = {
|
|||
PSM_DISCONNECT_REPLY,
|
||||
PSM_AM_REQUEST_NOREPLY,
|
||||
PSM_AM_REQUEST,
|
||||
PSM_AM_REPLY,
|
||||
PSM_AM_REPLY
|
||||
};
|
||||
static guint opCode_TIDRDMA[] = {
|
||||
TID_RDMA_WRITE_REQUEST,
|
||||
TID_RDMA_WRITE_RESPONSE,
|
||||
TID_RDMA_WRITE_DATA,
|
||||
TID_RDMA_WRITE_DATA_LAST,
|
||||
TID_RDMA_READ_REQUEST,
|
||||
TID_RDMA_READ_RESPONSE,
|
||||
TID_RDMA_RESYNC,
|
||||
TID_RDMA_ACK
|
||||
};
|
||||
|
||||
/* OP Codes */
|
||||
static const value_string vals_opa_bth_opcode[] = {
|
||||
{ RC_SEND_FIRST, "RC Send First " },
|
||||
{ RC_SEND_MIDDLE, "RC Send Middle " },
|
||||
{ RC_SEND_LAST, "RC Send Last " },
|
||||
{ RC_SEND_LAST_IMM, "RC Send Last Immediate " },
|
||||
{ RC_SEND_ONLY, "RC Send Only " },
|
||||
{ RC_SEND_ONLY_IMM, "RC Send Only Immediate " },
|
||||
{ RC_RDMA_WRITE_FIRST, "RC RDMA Write First " },
|
||||
{ RC_RDMA_WRITE_MIDDLE, "RC RDMA Write Middle " },
|
||||
{ RC_RDMA_WRITE_LAST, "RC RDMA Write Last " },
|
||||
{ RC_RDMA_WRITE_LAST_IMM, "RC RDMA Write Last Immediate " },
|
||||
{ RC_RDMA_WRITE_ONLY, "RC RDMA Write Only " },
|
||||
{ RC_RDMA_WRITE_ONLY_IMM, "RC RDMA Write Only Immediate " },
|
||||
{ RC_RDMA_READ_REQUEST, "RC RDMA Read Request " },
|
||||
{ RC_RDMA_READ_RESPONSE_FIRST, "RC RDMA Read Response First " },
|
||||
{ RC_RDMA_READ_RESPONSE_MIDDLE, "RC RDMA Read Response Middle " },
|
||||
{ RC_RDMA_READ_RESPONSE_LAST, "RC RDMA Read Response Last " },
|
||||
{ RC_RDMA_READ_RESPONSE_ONLY, "RC RDMA Read Response Only " },
|
||||
{ RC_ACKNOWLEDGE, "RC Acknowledge " },
|
||||
{ RC_ATOMIC_ACKNOWLEDGE, "RC Atomic Acknowledge " },
|
||||
{ RC_CMP_SWAP, "RC Compare Swap " },
|
||||
{ RC_FETCH_ADD, "RC Fetch Add " },
|
||||
{ RC_SEND_LAST_INVAL, "RC Send Last Invalidate " },
|
||||
{ RC_SEND_ONLY_INVAL, "RC Send Only Invalidate " },
|
||||
{ RD_SEND_FIRST, "RD Send First " },
|
||||
{ RD_SEND_MIDDLE, "RD Send Middle " },
|
||||
{ RD_SEND_LAST, "RD Send Last " },
|
||||
{ RD_SEND_LAST_IMM, "RD Last Immediate " },
|
||||
{ RD_SEND_ONLY, "RD Send Only " },
|
||||
{ RD_SEND_ONLY_IMM, "RD Send Only Immediate " },
|
||||
{ RD_RDMA_WRITE_FIRST, "RD RDMA Write First " },
|
||||
{ RD_RDMA_WRITE_MIDDLE, "RD RDMA Write Middle " },
|
||||
{ RD_RDMA_WRITE_LAST, "RD RDMA Write Last " },
|
||||
{ RD_RDMA_WRITE_LAST_IMM, "RD RDMA Write Last Immediate " },
|
||||
{ RD_RDMA_WRITE_ONLY, "RD RDMA Write Only " },
|
||||
{ RD_RDMA_WRITE_ONLY_IMM, "RD RDMA Write Only Immediate " },
|
||||
{ RD_RDMA_READ_REQUEST, "RD RDMA Read Request " },
|
||||
{ RD_RDMA_READ_RESPONSE_FIRST, "RD RDMA Read Response First " },
|
||||
{ RD_RDMA_READ_RESPONSE_MIDDLE, "RD RDMA Read Response Middle " },
|
||||
{ RD_RDMA_READ_RESPONSE_LAST, "RD RDMA Read Response Last " },
|
||||
{ RD_RDMA_READ_RESPONSE_ONLY, "RD RDMA Read Response Only " },
|
||||
{ RD_ACKNOWLEDGE, "RD Acknowledge " },
|
||||
{ RD_ATOMIC_ACKNOWLEDGE, "RD Atomic Acknowledge " },
|
||||
{ RD_CMP_SWAP, "RD Compare Swap " },
|
||||
{ RD_FETCH_ADD, "RD Fetch Add " },
|
||||
{ RD_RESYNC, "RD RESYNC " },
|
||||
{ UD_SEND_ONLY, "UD Send Only " },
|
||||
{ UD_SEND_ONLY_IMM, "UD Send Only Immediate " },
|
||||
{ UC_SEND_FIRST, "UC Send First " },
|
||||
{ UC_SEND_MIDDLE, "UC Send Middle " },
|
||||
{ UC_SEND_LAST, "UC Send Last " },
|
||||
{ UC_SEND_LAST_IMM, "UC Send Last Immediate " },
|
||||
{ UC_SEND_ONLY, "UC Send Only " },
|
||||
{ UC_SEND_ONLY_IMM, "UC Send Only Immediate " },
|
||||
{ RC_SEND_FIRST, "RC Send First" },
|
||||
{ RC_SEND_MIDDLE, "RC Send Middle" },
|
||||
{ RC_SEND_LAST, "RC Send Last" },
|
||||
{ RC_SEND_LAST_IMM, "RC Send Last Immediate" },
|
||||
{ RC_SEND_ONLY, "RC Send Only" },
|
||||
{ RC_SEND_ONLY_IMM, "RC Send Only Immediate" },
|
||||
{ RC_RDMA_WRITE_FIRST, "RC RDMA Write First" },
|
||||
{ RC_RDMA_WRITE_MIDDLE, "RC RDMA Write Middle" },
|
||||
{ RC_RDMA_WRITE_LAST, "RC RDMA Write Last" },
|
||||
{ RC_RDMA_WRITE_LAST_IMM, "RC RDMA Write Last Immediate" },
|
||||
{ RC_RDMA_WRITE_ONLY, "RC RDMA Write Only" },
|
||||
{ RC_RDMA_WRITE_ONLY_IMM, "RC RDMA Write Only Immediate" },
|
||||
{ RC_RDMA_READ_REQUEST, "RC RDMA Read Request" },
|
||||
{ RC_RDMA_READ_RESPONSE_FIRST, "RC RDMA Read Response First" },
|
||||
{ RC_RDMA_READ_RESPONSE_MIDDLE, "RC RDMA Read Response Middle" },
|
||||
{ RC_RDMA_READ_RESPONSE_LAST, "RC RDMA Read Response Last" },
|
||||
{ RC_RDMA_READ_RESPONSE_ONLY, "RC RDMA Read Response Only" },
|
||||
{ RC_ACKNOWLEDGE, "RC Acknowledge" },
|
||||
{ RC_ATOMIC_ACKNOWLEDGE, "RC Atomic Acknowledge" },
|
||||
{ RC_CMP_SWAP, "RC Compare Swap" },
|
||||
{ RC_FETCH_ADD, "RC Fetch Add" },
|
||||
{ RC_SEND_LAST_INVAL, "RC Send Last Invalidate" },
|
||||
{ RC_SEND_ONLY_INVAL, "RC Send Only Invalidate" },
|
||||
{ RD_SEND_FIRST, "RD Send First" },
|
||||
{ RD_SEND_MIDDLE, "RD Send Middle" },
|
||||
{ RD_SEND_LAST, "RD Send Last" },
|
||||
{ RD_SEND_LAST_IMM, "RD Last Immediate" },
|
||||
{ RD_SEND_ONLY, "RD Send Only" },
|
||||
{ RD_SEND_ONLY_IMM, "RD Send Only Immediate" },
|
||||
{ RD_RDMA_WRITE_FIRST, "RD RDMA Write First" },
|
||||
{ RD_RDMA_WRITE_MIDDLE, "RD RDMA Write Middle" },
|
||||
{ RD_RDMA_WRITE_LAST, "RD RDMA Write Last" },
|
||||
{ RD_RDMA_WRITE_LAST_IMM, "RD RDMA Write Last Immediate" },
|
||||
{ RD_RDMA_WRITE_ONLY, "RD RDMA Write Only" },
|
||||
{ RD_RDMA_WRITE_ONLY_IMM, "RD RDMA Write Only Immediate" },
|
||||
{ RD_RDMA_READ_REQUEST, "RD RDMA Read Request" },
|
||||
{ RD_RDMA_READ_RESPONSE_FIRST, "RD RDMA Read Response First" },
|
||||
{ RD_RDMA_READ_RESPONSE_MIDDLE, "RD RDMA Read Response Middle" },
|
||||
{ RD_RDMA_READ_RESPONSE_LAST, "RD RDMA Read Response Last" },
|
||||
{ RD_RDMA_READ_RESPONSE_ONLY, "RD RDMA Read Response Only" },
|
||||
{ RD_ACKNOWLEDGE, "RD Acknowledge" },
|
||||
{ RD_ATOMIC_ACKNOWLEDGE, "RD Atomic Acknowledge" },
|
||||
{ RD_CMP_SWAP, "RD Compare Swap" },
|
||||
{ RD_FETCH_ADD, "RD Fetch Add" },
|
||||
{ RD_RESYNC, "RD RESYNC" },
|
||||
{ UD_SEND_ONLY, "UD Send Only" },
|
||||
{ UD_SEND_ONLY_IMM, "UD Send Only Immediate" },
|
||||
{ UC_SEND_FIRST, "UC Send First" },
|
||||
{ UC_SEND_MIDDLE, "UC Send Middle" },
|
||||
{ UC_SEND_LAST, "UC Send Last" },
|
||||
{ UC_SEND_LAST_IMM, "UC Send Last Immediate" },
|
||||
{ UC_SEND_ONLY, "UC Send Only" },
|
||||
{ UC_SEND_ONLY_IMM, "UC Send Only Immediate" },
|
||||
{ UC_RDMA_WRITE_FIRST, "UC RDMA Write First" },
|
||||
{ UC_RDMA_WRITE_MIDDLE, "Unreliable Connection RDMA Write Middle " },
|
||||
{ UC_RDMA_WRITE_LAST, "UC RDMA Write Last " },
|
||||
{ UC_RDMA_WRITE_LAST_IMM, "UC RDMA Write Last Immediate " },
|
||||
{ UC_RDMA_WRITE_ONLY, "UC RDMA Write Only " },
|
||||
{ UC_RDMA_WRITE_ONLY_IMM, "UC RDMA Write Only Immediate " },
|
||||
{ UC_RDMA_WRITE_MIDDLE, "Unreliable Connection RDMA Write Middle" },
|
||||
{ UC_RDMA_WRITE_LAST, "UC RDMA Write Last" },
|
||||
{ UC_RDMA_WRITE_LAST_IMM, "UC RDMA Write Last Immediate" },
|
||||
{ UC_RDMA_WRITE_ONLY, "UC RDMA Write Only" },
|
||||
{ UC_RDMA_WRITE_ONLY_IMM, "UC RDMA Write Only Immediate" },
|
||||
{ PSM_RESERVED, "PSM Reserved" },
|
||||
{ PSM_TINY, "PSM TINY" },
|
||||
{ PSM_SHORT, "PSM SHORT" },
|
||||
{ PSM_MEDIUM, "PSM MEDIUM" },
|
||||
{ PSM_MEDIUM_DATA, "PSM MEDIUM_DATA" },
|
||||
{ PSM_LONG_RTS, "PSM LONG RTS" },
|
||||
{ PSM_LONG_CTS, "PSM LONG CTS" },
|
||||
{ PSM_LONG_DATA, "PSM LONG DATA" },
|
||||
{ PSM_TIDS_GRANT, "PSM TIDS GRANT" },
|
||||
{ PSM_TIDS_GRANT_ACK, "PSM TIDS GRANT ACK" },
|
||||
{ PSM_TIDS_RELEASE, "PSM TIDS RELEASE" },
|
||||
{ PSM_TIDS_RELEASE_CONFIRM, "PSM TIDS RELEASE CONFIRM" },
|
||||
{ PSM_EXPTID_UNALIGNED, "PSM EXPTID UNALIGNED" },
|
||||
{ PSM_EXPTID, "PSM EXPTID" },
|
||||
{ PSM_ACK, "PSM ACK" },
|
||||
{ PSM_NAK, "PSM NAK" },
|
||||
{ PSM_ERR_CHK, "PSM ERR CHK" },
|
||||
{ PSM_ERR_CHK_BAD, "PSM ERR CHK BAD" },
|
||||
{ PSM_ERR_CHK_GEN, "PSM ERR CHK GEN" },
|
||||
{ PSM_FLOW_CCA_BECN, "PSM FLOW CCA BECN" },
|
||||
{ PSM_CONNECT_REQUEST, "PSM CONNECT REQUEST" },
|
||||
{ PSM_CONNECT_REPLY, "PSM CONNECT REPLY" },
|
||||
{ PSM_DISCONNECT_REQUEST, "PSM DISCONNECT REQUEST" },
|
||||
{ PSM_DISCONNECT_REPLY, "PSM DISCONNECT REPLY" },
|
||||
{ PSM_AM_REQUEST_NOREPLY, "PSM AM REQUEST NOREPLY" },
|
||||
{ PSM_AM_REQUEST, "PSM AM REQUEST" },
|
||||
{ PSM_AM_REPLY, "PSM AM REPLY" },
|
||||
{ TID_RDMA_WRITE_REQUEST, "TID RDMA Write Request" },
|
||||
{ TID_RDMA_WRITE_RESPONSE, "TID RDMA Write Response" },
|
||||
{ TID_RDMA_WRITE_DATA, "TID RDMA Write Data" },
|
||||
{ TID_RDMA_WRITE_DATA_LAST, "TID RDMA Write Data Last" },
|
||||
{ TID_RDMA_READ_REQUEST, "TID RDMA Read Request" },
|
||||
{ TID_RDMA_READ_RESPONSE, "TID RDMA Read Response" },
|
||||
{ TID_RDMA_RESYNC, "TID RDMA ReSync" },
|
||||
{ TID_RDMA_ACK, "TID RDMA Ack" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
static const value_string vals_opa_9b_lnh[] = {
|
||||
|
@ -350,6 +406,7 @@ static gint ett_immdt = -1;
|
|||
static gint ett_ieth = -1;
|
||||
static gint ett_kdeth = -1;
|
||||
static gint ett_psm = -1;
|
||||
static gint ett_tidrdma = -1;
|
||||
|
||||
/* 9B Header Fields */
|
||||
static gint hf_opa_9B = -1;
|
||||
|
@ -468,6 +525,18 @@ static gint hf_opa_psm_nargs = -1;
|
|||
static gint hf_opa_psm_hidx = -1;
|
||||
static gint hf_opa_psm_arg = -1;
|
||||
static gint hf_opa_psm_payload = -1;
|
||||
/* TID RDMA */
|
||||
static gint hf_opa_TIDRDMA = -1;
|
||||
static gint hf_opa_TIDRDMA_reserved = -1;
|
||||
static gint hf_opa_TIDRDMA_TIDFlowPSN_reserved = -1;
|
||||
static gint hf_opa_TIDRDMA_TIDFlowPSN = -1;
|
||||
static gint hf_opa_TIDRDMA_TIDFlowQP_reserved = -1;
|
||||
static gint hf_opa_TIDRDMA_TIDFlowQP = -1;
|
||||
static gint hf_opa_TIDRDMA_VerbsPSN_reserved = -1;
|
||||
static gint hf_opa_TIDRDMA_VerbsPSN = -1;
|
||||
static gint hf_opa_TIDRDMA_VerbsQP_reserved = -1;
|
||||
static gint hf_opa_TIDRDMA_VerbsQP = -1;
|
||||
|
||||
|
||||
/* Custom Functions */
|
||||
static void cf_opa_dw_to_b(gchar *buf, guint32 value)
|
||||
|
@ -582,7 +651,7 @@ static void parse_opa_bth(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, g
|
|||
|
||||
proto_tree_add_item(base_transport_header_tree, hf_opa_bth_opcode, tvb, local_offset, 1, ENC_LITTLE_ENDIAN);
|
||||
*opCode = tvb_get_guint8(tvb, local_offset);
|
||||
col_append_str(pinfo->cinfo, COL_INFO, val_to_str((guint32)(*opCode), vals_opa_bth_opcode, "Unknown OpCode (0x%0x)"));
|
||||
col_append_fstr(pinfo->cinfo, COL_INFO, "%s ", val_to_str((guint32)(*opCode), vals_opa_bth_opcode, "Unknown OpCode (0x%0x)"));
|
||||
local_offset += 1;
|
||||
|
||||
proto_tree_add_item(base_transport_header_tree, hf_opa_bth_solicited_event, tvb, local_offset, 1, ENC_BIG_ENDIAN);
|
||||
|
@ -656,6 +725,9 @@ static gint32 find_next_header_sequence(guint32 OpCode)
|
|||
if (contains(OpCode, &opCode_PSM[0], (gint32)array_length(opCode_PSM)))
|
||||
return KDETH_PSM;
|
||||
|
||||
if (contains(OpCode, &opCode_TIDRDMA[0], (gint32)array_length(opCode_TIDRDMA)))
|
||||
return KDETH_TIDRDMA;
|
||||
|
||||
if ((OpCode ^ RC_ACKNOWLEDGE) == 0)
|
||||
return AETH;
|
||||
|
||||
|
@ -1044,7 +1116,164 @@ static void parse_PSM(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint
|
|||
}
|
||||
*offset = local_offset;
|
||||
}
|
||||
static void parse_TIDRDMA(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint *offset, gint opCode, gboolean *parsePayload)
|
||||
{
|
||||
gint local_offset = *offset;
|
||||
proto_item *TIDRDMA_header_item;
|
||||
proto_tree *TIDRDMA_header_tree;
|
||||
|
||||
switch (opCode) {
|
||||
case TID_RDMA_WRITE_REQUEST:
|
||||
parse_RETH(tvb, pinfo, tree, &local_offset);
|
||||
col_append_fstr(pinfo->cinfo, COL_INFO, "TID RDMA Write Request: ");
|
||||
TIDRDMA_header_item = proto_tree_add_item(tree, hf_opa_TIDRDMA, tvb, local_offset, 12, ENC_NA);
|
||||
proto_item_set_text(TIDRDMA_header_item, "TID RDMA Write Request Header");
|
||||
TIDRDMA_header_tree = proto_item_add_subtree(TIDRDMA_header_item, ett_tidrdma);
|
||||
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_reserved, tvb, local_offset, 8, ENC_NA);
|
||||
local_offset += 8;
|
||||
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_VerbsQP_reserved, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_VerbsQP, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
local_offset += 4;
|
||||
|
||||
*parsePayload = FALSE;
|
||||
break;
|
||||
case TID_RDMA_WRITE_RESPONSE:
|
||||
parse_AETH(tvb, pinfo, tree, &local_offset);
|
||||
col_append_fstr(pinfo->cinfo, COL_INFO, "TID RDMA Write Response: ");
|
||||
TIDRDMA_header_item = proto_tree_add_item(tree, hf_opa_TIDRDMA, tvb, local_offset, 24, ENC_NA);
|
||||
proto_item_set_text(TIDRDMA_header_item, "TID RDMA Write Response Header");
|
||||
TIDRDMA_header_tree = proto_item_add_subtree(TIDRDMA_header_item, ett_tidrdma);
|
||||
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_reserved, tvb, local_offset, 12, ENC_NA);
|
||||
local_offset += 12;
|
||||
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_TIDFlowPSN_reserved, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_TIDFlowPSN, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
local_offset += 4;
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_TIDFlowQP_reserved, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_TIDFlowQP, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
local_offset += 4;
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_VerbsQP_reserved, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_VerbsQP, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
local_offset += 4;
|
||||
|
||||
*parsePayload = FALSE;
|
||||
break;
|
||||
case TID_RDMA_WRITE_DATA:
|
||||
col_append_fstr(pinfo->cinfo, COL_INFO, "TID RDMA Write Data: ");
|
||||
TIDRDMA_header_item = proto_tree_add_item(tree, hf_opa_TIDRDMA, tvb, local_offset, 28, ENC_NA);
|
||||
proto_item_set_text(TIDRDMA_header_item, "TID RDMA Write Data Header");
|
||||
TIDRDMA_header_tree = proto_item_add_subtree(TIDRDMA_header_item, ett_tidrdma);
|
||||
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_reserved, tvb, local_offset, 24, ENC_NA);
|
||||
local_offset += 24;
|
||||
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_VerbsQP_reserved, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_VerbsQP, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
local_offset += 4;
|
||||
|
||||
*parsePayload = TRUE;
|
||||
break;
|
||||
case TID_RDMA_WRITE_DATA_LAST:
|
||||
col_append_fstr(pinfo->cinfo, COL_INFO, "TID RDMA Write Data Last: ");
|
||||
TIDRDMA_header_item = proto_tree_add_item(tree, hf_opa_TIDRDMA, tvb, local_offset, 28, ENC_NA);
|
||||
proto_item_set_text(TIDRDMA_header_item, "TID RDMA Write Data Last Header");
|
||||
TIDRDMA_header_tree = proto_item_add_subtree(TIDRDMA_header_item, ett_tidrdma);
|
||||
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_reserved, tvb, local_offset, 24, ENC_NA);
|
||||
local_offset += 24;
|
||||
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_VerbsQP_reserved, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_VerbsQP, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
local_offset += 4;
|
||||
|
||||
*parsePayload = TRUE;
|
||||
break;
|
||||
case TID_RDMA_READ_REQUEST:
|
||||
parse_RETH(tvb, pinfo, tree, &local_offset);
|
||||
col_append_fstr(pinfo->cinfo, COL_INFO, "TID RDMA Read Request: ");
|
||||
TIDRDMA_header_item = proto_tree_add_item(tree, hf_opa_TIDRDMA, tvb, local_offset, 12, ENC_NA);
|
||||
proto_item_set_text(TIDRDMA_header_item, "TID RDMA Read Request Header");
|
||||
TIDRDMA_header_tree = proto_item_add_subtree(TIDRDMA_header_item, ett_tidrdma);
|
||||
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_TIDFlowPSN_reserved, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_TIDFlowPSN, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
local_offset += 4;
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_TIDFlowQP_reserved, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_TIDFlowQP, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
local_offset += 4;
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_VerbsQP_reserved, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_VerbsQP, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
local_offset += 4;
|
||||
|
||||
*parsePayload = FALSE;
|
||||
break;
|
||||
case TID_RDMA_READ_RESPONSE:
|
||||
parse_AETH(tvb, pinfo, tree, &local_offset);
|
||||
col_append_fstr(pinfo->cinfo, COL_INFO, "TID RDMA Read Response: ");
|
||||
TIDRDMA_header_item = proto_tree_add_item(tree, hf_opa_TIDRDMA, tvb, local_offset, 24, ENC_NA);
|
||||
proto_item_set_text(TIDRDMA_header_item, "TID RDMA Read Response Header");
|
||||
TIDRDMA_header_tree = proto_item_add_subtree(TIDRDMA_header_item, ett_tidrdma);
|
||||
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_reserved, tvb, local_offset, 16, ENC_NA);
|
||||
local_offset += 16;
|
||||
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_VerbsPSN_reserved, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_VerbsPSN, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
local_offset += 4;
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_VerbsQP_reserved, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_VerbsQP, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
local_offset += 4;
|
||||
|
||||
*parsePayload = TRUE;
|
||||
break;
|
||||
case TID_RDMA_RESYNC:
|
||||
col_append_fstr(pinfo->cinfo, COL_INFO, "TID RDMA Read ReSync: ");
|
||||
TIDRDMA_header_item = proto_tree_add_item(tree, hf_opa_TIDRDMA, tvb, local_offset, 28, ENC_NA);
|
||||
proto_item_set_text(TIDRDMA_header_item, "TID RDMA Read ReSync Header");
|
||||
TIDRDMA_header_tree = proto_item_add_subtree(TIDRDMA_header_item, ett_tidrdma);
|
||||
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_reserved, tvb, local_offset, 24, ENC_NA);
|
||||
local_offset += 24;
|
||||
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_VerbsQP_reserved, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_VerbsQP, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
local_offset += 4;
|
||||
|
||||
*parsePayload = FALSE;
|
||||
break;
|
||||
case TID_RDMA_ACK:
|
||||
parse_AETH(tvb, pinfo, tree, &local_offset);
|
||||
col_append_fstr(pinfo->cinfo, COL_INFO, "TID RDMA ACK: ");
|
||||
TIDRDMA_header_item = proto_tree_add_item(tree, hf_opa_TIDRDMA, tvb, local_offset, 24, ENC_NA);
|
||||
proto_item_set_text(TIDRDMA_header_item, "TID RDMA ACK Header");
|
||||
TIDRDMA_header_tree = proto_item_add_subtree(TIDRDMA_header_item, ett_tidrdma);
|
||||
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_reserved, tvb, local_offset, 8, ENC_NA);
|
||||
local_offset += 8;
|
||||
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_TIDFlowPSN_reserved, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_TIDFlowPSN, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
local_offset += 4;
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_VerbsPSN_reserved, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_VerbsPSN, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
local_offset += 4;
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_TIDFlowQP_reserved, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_TIDFlowQP, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
local_offset += 4;
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_VerbsQP_reserved, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
proto_tree_add_item(TIDRDMA_header_tree, hf_opa_TIDRDMA_VerbsQP, tvb, local_offset, 4, ENC_BIG_ENDIAN);
|
||||
local_offset += 4;
|
||||
|
||||
*parsePayload = FALSE;
|
||||
break;
|
||||
default:
|
||||
*parsePayload = FALSE;
|
||||
}
|
||||
*offset = local_offset;
|
||||
}
|
||||
static void parse_IPvSix(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint *offset)
|
||||
{
|
||||
call_dissector(ipv6_handle, tvb_new_subset_remaining(tvb, *offset), pinfo, tree);
|
||||
|
@ -1252,6 +1481,11 @@ static int dissect_opa_9b(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, v
|
|||
parse_KDETH(tvb, pinfo, tree, &offset);
|
||||
parse_PSM(tvb, pinfo, tree, &offset, opCode);
|
||||
|
||||
break;
|
||||
case KDETH_TIDRDMA:
|
||||
parse_KDETH(tvb, pinfo, tree, &offset);
|
||||
parse_TIDRDMA(tvb, pinfo, tree, &offset, opCode, &parsePayload);
|
||||
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -1685,6 +1919,46 @@ void proto_register_opa_9b(void)
|
|||
{ &hf_opa_psm_payload, {
|
||||
"Payload", "opa.psm.payload",
|
||||
FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL }
|
||||
},
|
||||
{ &hf_opa_TIDRDMA, {
|
||||
"TID RDMA Header", "opa.tidrdma",
|
||||
FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL }
|
||||
},
|
||||
{ &hf_opa_TIDRDMA_reserved, {
|
||||
"Reserved", "opa.tidrdma.reserved",
|
||||
FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL }
|
||||
},
|
||||
{ &hf_opa_TIDRDMA_TIDFlowPSN_reserved, {
|
||||
"Reserved (1 bit)", "opa.tidrdma.tidflowpsn.reserved",
|
||||
FT_UINT32, BASE_HEX, NULL, 0x80000000, NULL, HFILL }
|
||||
},
|
||||
{ &hf_opa_TIDRDMA_TIDFlowPSN, {
|
||||
"TID Flow PSN", "opa.tidrdma.tidflowpsn",
|
||||
FT_UINT32, BASE_HEX, NULL, 0x7FFFFFFF, NULL, HFILL }
|
||||
},
|
||||
{ &hf_opa_TIDRDMA_TIDFlowQP_reserved, {
|
||||
"Reserved (8 bits)", "opa.tidrdma.tidflowqp.reserved",
|
||||
FT_UINT32, BASE_HEX, NULL, 0xFF000000, NULL, HFILL }
|
||||
},
|
||||
{ &hf_opa_TIDRDMA_TIDFlowQP, {
|
||||
"TID Flow QP", "opa.tidrdma.tidflowqp",
|
||||
FT_UINT32, BASE_HEX, NULL, 0x00FFFFFF, NULL, HFILL }
|
||||
},
|
||||
{ &hf_opa_TIDRDMA_VerbsPSN_reserved, {
|
||||
"Reserved (1 bit)", "opa.tidrdma.verbspsn.reserved",
|
||||
FT_UINT32, BASE_HEX, NULL, 0x80000000, NULL, HFILL }
|
||||
},
|
||||
{ &hf_opa_TIDRDMA_VerbsPSN, {
|
||||
"Verbs PSN", "opa.tidrdma.verbspsn",
|
||||
FT_UINT32, BASE_HEX, NULL, 0x7FFFFFFF, NULL, HFILL }
|
||||
},
|
||||
{ &hf_opa_TIDRDMA_VerbsQP_reserved, {
|
||||
"Reserved (8 bits)", "opa.tidrdma.verbsqp.reserved",
|
||||
FT_UINT32, BASE_HEX, NULL, 0xFF000000, NULL, HFILL }
|
||||
},
|
||||
{ &hf_opa_TIDRDMA_VerbsQP, {
|
||||
"Verbs QP", "opa.tidrdma.verbsqp",
|
||||
FT_UINT32, BASE_HEX, NULL, 0x00FFFFFF, NULL, HFILL }
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -1702,7 +1976,8 @@ void proto_register_opa_9b(void)
|
|||
&ett_immdt,
|
||||
&ett_ieth,
|
||||
&ett_kdeth,
|
||||
&ett_psm
|
||||
&ett_psm,
|
||||
&ett_tidrdma
|
||||
};
|
||||
|
||||
proto_opa_9b = proto_register_protocol("Intel Omni-Path", "OPA", "opa");
|
||||
|
|
Loading…
Reference in New Issue