aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrobionekenobi <robionekenobi@bluewin.ch>2014-08-03 21:49:29 +0200
committerAnders Broman <a.broman58@gmail.com>2014-08-06 06:49:31 +0000
commit09357c116c8edf29f9d224ed70774f1dfdd75331 (patch)
tree48a2cf8ff17d2744ef2998ad48f405ed6761de43
parent1a02ca0150e434d9ddc7c023267c9097a059b6be (diff)
mq improvements:
- handle RFH structure - use tvb_reported_length..., - Add Conversation/Request in row display Change-Id: I84c5cf3e9479d91b363eb093e71bb6bdf07e8194 Reviewed-on: https://code.wireshark.org/review/3354 Reviewed-by: Anders Broman <a.broman58@gmail.com>
-rw-r--r--epan/dissectors/packet-mq-pcf.c6
-rw-r--r--epan/dissectors/packet-mq.c359
-rw-r--r--epan/dissectors/packet-mq.h2
3 files changed, 235 insertions, 132 deletions
diff --git a/epan/dissectors/packet-mq-pcf.c b/epan/dissectors/packet-mq-pcf.c
index 4e9635644c..94b3017a79 100644
--- a/epan/dissectors/packet-mq-pcf.c
+++ b/epan/dissectors/packet-mq-pcf.c
@@ -188,7 +188,7 @@ static void dissect_mqpcf_parm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *mq
guint32 xOfs = offset;
uCnt = 0;
- while (tvb_length_remaining(tvb, xOfs) >= 16)
+ while (tvb_reported_length_remaining(tvb, xOfs) >= 16)
{
uLen = tvb_get_guint32_endian(tvb, xOfs + 4, bLittleEndian);
if (uLen < 16)
@@ -553,7 +553,7 @@ static void dissect_mqpcf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, m
bLittleEndian = ((p_mq_parm->mq_cur_ccsid.encod & MQ_MQENC_INTEGER_MASK) == MQ_MQENC_INTEGER_REVERSED) ? ENC_LITTLE_ENDIAN : ENC_BIG_ENDIAN;
- if (tvb_length(tvb) >= 36)
+ if (tvb_reported_length(tvb) >= 36)
{
gint iSizeMQCFH = 36;
guint32 iCommand = tvb_get_guint32_endian(tvb, offset + 12, bLittleEndian);
@@ -618,7 +618,7 @@ static void dissect_mqpcf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, m
static gboolean dissect_mqpcf_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
{
- if (data && tvb_length(tvb) >= 36)
+ if (data && tvb_reported_length(tvb) >= 36)
{
mq_parm_t *p_mq_parm = (mq_parm_t *)data;
if (strncmp((const char*)p_mq_parm->mq_format, MQ_MQFMT_ADMIN, 8) == 0
diff --git a/epan/dissectors/packet-mq.c b/epan/dissectors/packet-mq.c
index 5f525419e8..ba1d989718 100644
--- a/epan/dissectors/packet-mq.c
+++ b/epan/dissectors/packet-mq.c
@@ -610,9 +610,9 @@ static int hf_mq_lpoo_lpiopts = -1;
static int hf_mq_lpoo_defpersist = -1;
static int hf_mq_lpoo_defputresptype = -1;
static int hf_mq_lpoo_defreadahead = -1;
+static int hf_mq_lpoo_unknown5 = -1;
static int hf_mq_lpoo_qprotect = -1;
static int hf_mq_lpoo_unknown6 = -1;
-/*static int hf_mq_lpoo_unknown7 = -1;*/
static int hf_mq_lpoo_xtradata = -1;
static int hf_mq_lpoo_lpiopts_SAVE_IDENTITY_CTXT = -1;
@@ -620,9 +620,9 @@ static int hf_mq_lpoo_lpiopts_SAVE_ORIGIN_CTXT = -1 ;
static int hf_mq_lpoo_lpiopts_SAVE_USER_CTXT = -1;
static const int *pf_flds_lpooopt[] =
{
- &hf_mq_lpoo_lpiopts_SAVE_IDENTITY_CTXT,
- &hf_mq_lpoo_lpiopts_SAVE_ORIGIN_CTXT,
&hf_mq_lpoo_lpiopts_SAVE_USER_CTXT,
+ &hf_mq_lpoo_lpiopts_SAVE_ORIGIN_CTXT,
+ &hf_mq_lpoo_lpiopts_SAVE_IDENTITY_CTXT,
NULL
};
@@ -859,6 +859,10 @@ static int hf_mq_cih_erroroffset = -1;
static int hf_mq_cih_inputitem = -1;
static int hf_mq_cih_reserved4 = -1;
+static int hf_mq_rfh_ccsid = -1;
+static int hf_mq_rfh_length = -1;
+static int hf_mq_rfh_string = -1;
+
static int hf_mq_rmh_flags_last = -1;
static const int *pf_flds_rmh_flags[] =
{
@@ -930,6 +934,7 @@ static gint ett_mq_gmo_option = -1;
static gint ett_mq_gmo_matchoption = -1;
static gint ett_mq_pmo = -1;
static gint ett_mq_pmo_option = -1;
+static gint ett_mq_rfh_ValueName = -1;
static gint ett_mq_lpoo = -1;
static gint ett_mq_lpoo_options = -1;
@@ -1354,6 +1359,7 @@ static reassembly_table mq_reassembly_table;
#define MQ_TEXT_OD "Object Descriptor"
#define MQ_TEXT_PMO "Put Message Options"
#define MQ_TEXT_RMH "Reference Message Header"
+#define MQ_TEXT_RFH "Rules and Formatting Header"
#define MQ_TEXT_TM "Trigger Message"
#define MQ_TEXT_TMC2 "Trigger Message 2 (character format)"
#define MQ_TEXT_WIH "Work Information Header"
@@ -1556,6 +1562,7 @@ DEF_VALSB(StructID)
DEF_VALS2(STRUCTID_MSH , MQ_TEXT_MSH),
DEF_VALS2(STRUCTID_OD , MQ_TEXT_OD),
DEF_VALS2(STRUCTID_PMO , MQ_TEXT_PMO),
+ DEF_VALS2(STRUCTID_RFH , MQ_TEXT_RFH),
DEF_VALS2(STRUCTID_RMH , MQ_TEXT_RMH),
DEF_VALS2(STRUCTID_TM , MQ_TEXT_TM),
DEF_VALS2(STRUCTID_TMC2 , MQ_TEXT_TMC2),
@@ -1594,6 +1601,7 @@ DEF_VALSB(StructID)
DEF_VALS2(STRUCTID_MDE_EBCDIC , MQ_TEXT_MDE),
DEF_VALS2(STRUCTID_OD_EBCDIC , MQ_TEXT_OD),
DEF_VALS2(STRUCTID_PMO_EBCDIC , MQ_TEXT_PMO),
+ DEF_VALS2(STRUCTID_RFH_EBCDIC , MQ_TEXT_RFH),
DEF_VALS2(STRUCTID_RMH_EBCDIC , MQ_TEXT_RMH),
DEF_VALS2(STRUCTID_TM_EBCDIC , MQ_TEXT_TM),
DEF_VALS2(STRUCTID_TMC2_EBCDIC, MQ_TEXT_TMC2),
@@ -1861,7 +1869,7 @@ static gint dissect_mq_charv(tvbuff_t *tvb, proto_tree *tree, gint offset, gint
eStr = tvb_get_guint32_endian(tvb, offset + 16, p_mq_parm->mq_int_enc);
if (lStr && oStr)
{
- sStr = tvb_get_string_enc(wmem_packet_scope(), tvb, oStr, lStr, p_mq_parm->mq_str_enc);
+ sStr = (const char *)tvb_get_string_enc(wmem_packet_scope(), tvb, oStr, lStr, p_mq_parm->mq_str_enc);
}
else
sStr = NULL;
@@ -1891,7 +1899,7 @@ static gint dissect_mq_pmr(tvbuff_t *tvb, proto_tree *tree, gint offset, gint iN
if (offsetPMR != 0 && iSizePMR1 != 0)
{
iSizePMR = iNbrRecords * iSizePMR1;
- if (tvb_length_remaining(tvb, offset) >= iSizePMR)
+ if (tvb_reported_length_remaining(tvb, offset) >= iSizePMR)
{
if (tree)
{
@@ -1938,7 +1946,7 @@ static gint dissect_mq_or(tvbuff_t *tvb, proto_tree *tree, gint offset, gint iNb
if (offsetOR != 0)
{
iSizeOR = iNbrRecords * 96;
- if (tvb_length_remaining(tvb, offset) >= iSizeOR)
+ if (tvb_reported_length_remaining(tvb, offset) >= iSizeOR)
{
if (tree)
{
@@ -1963,7 +1971,7 @@ static gint dissect_mq_rr(tvbuff_t *tvb, proto_tree *tree, gint offset, gint iNb
if (offsetRR != 0)
{
iSizeRR = iNbrRecords * 8;
- if (tvb_length_remaining(tvb, offset) >= iSizeRR)
+ if (tvb_reported_length_remaining(tvb, offset) >= iSizeRR)
{
if (tree)
{
@@ -1986,7 +1994,7 @@ static gint dissect_mq_gmo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
{
gint iSize = 0;
- p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
+ p_mq_parm->mq_strucID = (tvb_reported_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
if (p_mq_parm->mq_strucID == MQ_STRUCTID_GMO || p_mq_parm->mq_strucID == MQ_STRUCTID_GMO_EBCDIC)
{
guint32 iVersion = 0;
@@ -1999,7 +2007,7 @@ static gint dissect_mq_gmo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
case 3: iSize = 100; break;
}
- if (iSize != 0 && tvb_length_remaining(tvb, offset) >= iSize)
+ if (iSize != 0 && tvb_reported_length_remaining(tvb, offset) >= iSize)
{
guint8 *sQueue;
sQueue = tvb_get_string_enc(wmem_packet_scope(), tvb, offset + 24, 48, p_mq_parm->mq_str_enc);
@@ -2050,7 +2058,7 @@ static gint dissect_mq_pmo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
{
gint iSize = 0;
- p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
+ p_mq_parm->mq_strucID = (tvb_reported_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
if (p_mq_parm->mq_strucID == MQ_STRUCTID_PMO || p_mq_parm->mq_strucID == MQ_STRUCTID_PMO_EBCDIC)
{
guint32 iVersion = 0;
@@ -2062,7 +2070,7 @@ static gint dissect_mq_pmo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
case 2: iSize = 152;break;
}
- if (iSize != 0 && tvb_length_remaining(tvb, offset) >= iSize)
+ if (iSize != 0 && tvb_reported_length_remaining(tvb, offset) >= iSize)
{
guint8 *sQueue;
@@ -2129,7 +2137,7 @@ static gint dissect_mq_od(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, g
{
gint iSize = 0;
- p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
+ p_mq_parm->mq_strucID = (tvb_reported_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
if (p_mq_parm->mq_strucID == MQ_STRUCTID_OD || p_mq_parm->mq_strucID == MQ_STRUCTID_OD_EBCDIC)
{
/* The OD struct can be present in several messages at different levels */
@@ -2144,7 +2152,7 @@ static gint dissect_mq_od(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, g
case 4: iSize = 336+3*20+4; break;
}
- if (iSize != 0 && tvb_length_remaining(tvb, offset) >= iSize)
+ if (iSize != 0 && tvb_reported_length_remaining(tvb, offset) >= iSize)
{
gint iNbrRecords = 0;
guint8 *sObj;
@@ -2220,7 +2228,7 @@ static gint dissect_mq_od(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, g
static gint dissect_mq_xid(tvbuff_t *tvb, proto_tree *tree, mq_parm_t *p_mq_parm, gint offset)
{
gint iSizeXid = 0;
- if (tvb_length_remaining(tvb, offset) >= 6)
+ if (tvb_reported_length_remaining(tvb, offset) >= 6)
{
guint8 iXidLength = 0;
guint8 iBqLength = 0;
@@ -2229,7 +2237,7 @@ static gint dissect_mq_xid(tvbuff_t *tvb, proto_tree *tree, mq_parm_t *p_mq_parm
iBqLength = tvb_get_guint8(tvb, offset + 5);
iSizeXid = 6 + iXidLength + iBqLength;
- if (tvb_length_remaining(tvb, offset) >= iSizeXid)
+ if (tvb_reported_length_remaining(tvb, offset) >= iSizeXid)
{
if (tree)
{
@@ -2244,7 +2252,7 @@ static gint dissect_mq_xid(tvbuff_t *tvb, proto_tree *tree, mq_parm_t *p_mq_parm
proto_tree_add_item(mq_tree, hf_mq_xa_xid_brq , tvb, offset + 6 + iXidLength, iBqLength, ENC_NA);
}
iSizeXid += (4 - (iSizeXid % 4)) % 4; /* Pad for alignment with 4 byte word boundary */
- if (tvb_length_remaining(tvb, offset) < iSizeXid)
+ if (tvb_reported_length_remaining(tvb, offset) < iSizeXid)
iSizeXid = 0;
}
else iSizeXid = 0;
@@ -2279,6 +2287,11 @@ static gint dissect_mq_sid(tvbuff_t *tvb, proto_tree *tree, mq_parm_t *p_mq_parm
}
return offset - bOffset;
}
+static void dissect_mq_addCR_colinfo(packet_info *pinfo, mq_parm_t *p_mq_parm)
+{
+ if (p_mq_parm->mq_convID)
+ col_append_fstr(pinfo->cinfo, COL_INFO, " C.R=%d.%d", p_mq_parm->mq_convID, p_mq_parm->mq_rqstID);
+}
static gint dissect_mq_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *mqroot_tree, gint offset, mq_parm_t *p_mq_parm)
{
guint8 iFAPLvl;
@@ -2293,10 +2306,11 @@ static gint dissect_mq_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *mqroot_
else
iSize = 208;
- if (iSize != 0 && tvb_length_remaining(tvb, offset) >= iSize)
+ if (iSize != 0 && tvb_reported_length_remaining(tvb, offset) >= iSize)
{
guint8 *sChannel;
sChannel = tvb_get_string_enc(wmem_packet_scope(), tvb, offset + 24, 20, p_mq_parm->mq_str_enc);
+ dissect_mq_addCR_colinfo(pinfo, p_mq_parm);
col_append_fstr(pinfo->cinfo, COL_INFO, " FAPLvl=%d", iFAPLvl);
if (strip_trailing_blanks(sChannel, 20) > 0)
{
@@ -2375,7 +2389,7 @@ static gint dissect_mq_md(tvbuff_t *tvb, proto_tree *tree, gint offset, mq_parm_
{
gint iSize = 0;
- p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
+ p_mq_parm->mq_strucID = (tvb_reported_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
if (p_mq_parm->mq_strucID == MQ_STRUCTID_MD || p_mq_parm->mq_strucID == MQ_STRUCTID_MD_EBCDIC)
{
guint32 iVersion = 0;
@@ -2387,7 +2401,7 @@ static gint dissect_mq_md(tvbuff_t *tvb, proto_tree *tree, gint offset, mq_parm_
case 2: iSize = 364; break;
}
- if (bDecode && iSize != 0 && tvb_length_remaining(tvb, offset) >= iSize)
+ if (bDecode && iSize != 0 && tvb_reported_length_remaining(tvb, offset) >= iSize)
{
p_mq_parm->iOfsEnc = offset + 24;
p_mq_parm->iOfsCcs = offset + 28;
@@ -2441,11 +2455,11 @@ static gint dissect_mq_fopa(tvbuff_t *tvb, proto_tree *tree, gint offset, mq_par
{
gint iSize = 0;
- p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
+ p_mq_parm->mq_strucID = (tvb_reported_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
if (p_mq_parm->mq_strucID == MQ_STRUCTID_FOPA || p_mq_parm->mq_strucID == MQ_STRUCTID_FOPA_EBCDIC)
{
iSize = tvb_get_guint32_endian(tvb, offset+8, p_mq_parm->mq_int_enc);
- if (iSize != 0 && tvb_length_remaining(tvb, offset) >= iSize)
+ if (iSize != 0 && tvb_reported_length_remaining(tvb, offset) >= iSize)
{
if (tree)
{
@@ -2470,13 +2484,14 @@ static gint dissect_mq_fopa(tvbuff_t *tvb, proto_tree *tree, gint offset, mq_par
}
static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
- gint offset = 0;
- guint32 iSegmentLength = 0;
- guint32 iSizePayload = 0;
- gint iSizeMD = 0;
- gboolean bPayload = FALSE;
- gboolean bEBCDIC = FALSE;
+ gint offset = 0;
+ guint32 iSegmentLength = 0;
+ guint32 iSizePayload = 0;
+ gint iSizeMD = 0;
+ gboolean bPayload = FALSE;
+ gboolean bEBCDIC = FALSE;
gint iDistributionListSize = 0;
+ gint capLen;
mq_parm_t *p_mq_parm;
heur_dtbl_entry_t *hdtbl_entry;
@@ -2491,12 +2506,13 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
p_mq_parm->iOfsEnc = 0;
p_mq_parm->iOfsFmt = 0;
p_mq_parm->iOfsCcs = 0;
- if (tvb_length(tvb) >= 4)
+
+ if (tvb_reported_length(tvb) >= 4)
{
p_mq_parm->mq_strucID = tvb_get_ntohl(tvb, offset);
if (((p_mq_parm->mq_strucID & MQ_MASK_TSHx) == MQ_STRUCTID_TSHx ||
(p_mq_parm->mq_strucID & MQ_MASK_TSHx) == MQ_STRUCTID_TSHx_EBCDIC)
- && tvb_length_remaining(tvb, offset) >= 28)
+ && tvb_reported_length_remaining(tvb, offset) >= 28)
{
proto_tree *mq_tree = NULL;
proto_tree *mqroot_tree = NULL;
@@ -2516,10 +2532,12 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
if (p_mq_parm->mq_strucID == MQ_STRUCTID_TSHM || p_mq_parm->mq_strucID == MQ_STRUCTID_TSHM_EBCDIC)
{
- if (tvb_length_remaining(tvb, offset) < 36)
+ if (tvb_reported_length_remaining(tvb, offset) < 36)
return;
iSizeMPF += 8;
iSizeTSH = 36;
+ p_mq_parm->mq_convID = tvb_get_ntohl(tvb, offset + 8);
+ p_mq_parm->mq_rqstID = tvb_get_ntohl(tvb, offset + 12);
}
p_mq_parm->mq_opcode = tvb_get_guint8(tvb, offset + iSizeMPF + 9);
@@ -2589,21 +2607,22 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
offset += iSizeTSH;
/* Now dissect the embedded structures */
- if (tvb_length_remaining(tvb, offset) >= 4)
+ if (tvb_reported_length_remaining(tvb, offset) >= 4)
{
p_mq_parm->mq_strucID = tvb_get_ntohl(tvb, offset);
if (((p_mq_parm->mq_ctlf1 & MQ_TCF_FIRST) != 0) || p_mq_parm->mq_opcode < 0x80)
{
/* First MQ segment (opcodes below 0x80 never span several TSH) */
gint iSizeAPI = 16;
- if (p_mq_parm->mq_opcode >= 0x80 && p_mq_parm->mq_opcode <= 0x9F && tvb_length_remaining(tvb, offset) >= 16)
+ if (p_mq_parm->mq_opcode >= 0x80 && p_mq_parm->mq_opcode <= 0x9F && tvb_reported_length_remaining(tvb, offset) >= 16)
{
guint32 iReturnCode = 0;
guint32 iHdl = 0;
iReturnCode = tvb_get_guint32_endian(tvb, offset + 8, p_mq_parm->mq_int_enc);
iHdl = tvb_get_guint32_endian(tvb, offset + 12, p_mq_parm->mq_int_enc);
+ dissect_mq_addCR_colinfo(pinfo, p_mq_parm);
if (iHdl != 0 && iHdl != 0xffffffff)
- col_append_fstr(pinfo->cinfo, COL_INFO, " Hdl=0x%08x", iHdl);
+ col_append_fstr(pinfo->cinfo, COL_INFO, " Hdl=0x%04x", iHdl);
if (iReturnCode != 0)
col_append_fstr(pinfo->cinfo, COL_INFO, " [RC=%d]", iReturnCode);
@@ -2617,9 +2636,10 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
proto_tree_add_item(mq_tree, hf_mq_api_objecthdl, tvb, offset + 12, 4, p_mq_parm->mq_int_enc);
}
offset += iSizeAPI;
- p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
+ p_mq_parm->mq_strucID = (tvb_reported_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
}
- if ((p_mq_parm->mq_strucID == MQ_STRUCTID_MSH || p_mq_parm->mq_strucID == MQ_STRUCTID_MSH_EBCDIC) && tvb_length_remaining(tvb, offset) >= 20)
+ capLen = tvb_reported_length_remaining(tvb , offset);
+ if ((p_mq_parm->mq_strucID == MQ_STRUCTID_MSH || p_mq_parm->mq_strucID == MQ_STRUCTID_MSH_EBCDIC) && capLen >= 20)
{
gint iSize = 20;
iSizePayload = tvb_get_guint32_endian(tvb, offset + 16, p_mq_parm->mq_int_enc);
@@ -2636,7 +2656,7 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
offset += iSize;
}
- else if (p_mq_parm->mq_opcode == MQ_TST_CONAUTH_INFO && tvb_length_remaining(tvb, offset) >= 20)
+ else if (p_mq_parm->mq_opcode == MQ_TST_CONAUTH_INFO && capLen >= 20)
{
gint iSize = 24;
gint iUsr = 0;
@@ -2660,13 +2680,24 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
proto_tree_add_item(mq_tree, hf_mq_caut_usr, tvb, offset + 24, iUsr, p_mq_parm->mq_str_enc);
if (iPsw)
proto_tree_add_item(mq_tree, hf_mq_caut_psw, tvb, offset + 24 + iUsr, iPsw, p_mq_parm->mq_str_enc);
-}
+ }
offset += iSize + iUsr + iPsw;
- p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
+ p_mq_parm->mq_strucID = (tvb_reported_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
}
- else if (p_mq_parm->mq_opcode == MQ_TST_SOCKET_ACTION && tvb_length_remaining(tvb, offset) >= 20)
+ else if (p_mq_parm->mq_opcode == MQ_TST_SOCKET_ACTION && capLen >= 20)
{
gint iSize = 20;
+ gint iTy;
+ gint iP1;
+ gint iP2;
+
+ p_mq_parm->mq_convID = tvb_get_guint32_endian(tvb, offset , p_mq_parm->mq_int_enc);
+ p_mq_parm->mq_rqstID = tvb_get_guint32_endian(tvb, offset + 4, p_mq_parm->mq_int_enc);
+ dissect_mq_addCR_colinfo(pinfo, p_mq_parm);
+ iTy = tvb_get_guint32_endian(tvb, offset + 8, p_mq_parm->mq_int_enc);
+ iP1 = tvb_get_guint32_endian(tvb, offset + 12, p_mq_parm->mq_int_enc);
+ iP2 = tvb_get_guint32_endian(tvb, offset + 16, p_mq_parm->mq_int_enc);
+ col_append_fstr(pinfo->cinfo, COL_INFO, " Type=%d, P1=%d, P2=%d", iTy, iP1, iP2);
if (tree)
{
mq_tree = proto_tree_add_subtree(mqroot_tree, tvb, offset, iSizeAPI, ett_mq_socket, NULL, MQ_TEXT_SOCKET);
@@ -2678,9 +2709,9 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
proto_tree_add_item(mq_tree, hf_mq_socket_parm2, tvb, offset + 16, 4, p_mq_parm->mq_int_enc);
}
offset += iSize;
- p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
+ p_mq_parm->mq_strucID = (tvb_reported_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
}
- else if (p_mq_parm->mq_opcode == MQ_TST_STATUS && tvb_length_remaining(tvb, offset) >= 8)
+ else if (p_mq_parm->mq_opcode == MQ_TST_STATUS && capLen >= 8)
{
/* Some status are 28 bytes long and some are 36 bytes long */
gint iStatus = 0;
@@ -2689,7 +2720,7 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
iStatus = tvb_get_guint32_endian(tvb, offset + 4, p_mq_parm->mq_int_enc);
iStatusLength = tvb_get_guint32_endian(tvb, offset, p_mq_parm->mq_int_enc);
- if (tvb_length_remaining(tvb, offset) >= iStatusLength)
+ if (tvb_reported_length_remaining(tvb, offset) >= iStatusLength)
{
if (iStatus != 0)
col_append_fstr(pinfo->cinfo, COL_INFO, " Code=%s", val_to_str(iStatus, GET_VALSV(status), "Unknown (0x%08x)"));
@@ -2707,7 +2738,7 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
offset += iStatusLength;
}
}
- else if (p_mq_parm->mq_opcode == MQ_TST_PING && tvb_length_remaining(tvb, offset) > 4)
+ else if (p_mq_parm->mq_opcode == MQ_TST_PING && capLen > 4)
{
if (tree)
{
@@ -2716,9 +2747,9 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
proto_tree_add_item(mq_tree, hf_mq_ping_length, tvb, offset, 4, p_mq_parm->mq_int_enc);
proto_tree_add_item(mq_tree, hf_mq_ping_buffer, tvb, offset + 4, -1, ENC_NA);
}
- offset = tvb_length(tvb);
+ offset = tvb_reported_length(tvb);
}
- else if (p_mq_parm->mq_opcode == MQ_TST_RESET && tvb_length_remaining(tvb, offset) >= 8)
+ else if (p_mq_parm->mq_opcode == MQ_TST_RESET && capLen >= 8)
{
if (tree)
{
@@ -2727,11 +2758,10 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
proto_tree_add_item(mq_tree, hf_mq_reset_length, tvb, offset, 4, p_mq_parm->mq_int_enc);
proto_tree_add_item(mq_tree, hf_mq_reset_seqnum, tvb, offset + 4, 4, p_mq_parm->mq_int_enc);
}
- offset = tvb_length(tvb);
+ offset = tvb_reported_length(tvb);
}
else if ((p_mq_parm->mq_opcode == MQ_TST_MQOPEN || p_mq_parm->mq_opcode == MQ_TST_MQCLOSE ||
- p_mq_parm->mq_opcode == MQ_TST_MQOPEN_REPLY || p_mq_parm->mq_opcode == MQ_TST_MQCLOSE_REPLY)
- && tvb_length_remaining(tvb, offset) >= 4)
+ p_mq_parm->mq_opcode == MQ_TST_MQOPEN_REPLY || p_mq_parm->mq_opcode == MQ_TST_MQCLOSE_REPLY) && capLen >= 4)
{
offset += dissect_mq_od(tvb, pinfo, mqroot_tree, offset, p_mq_parm, &iDistributionListSize);
if (tree)
@@ -2747,11 +2777,10 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
}
offset += 4;
- p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
+ p_mq_parm->mq_strucID = (tvb_reported_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
offset += dissect_mq_fopa(tvb, mqroot_tree, offset, p_mq_parm);
}
- else if ((p_mq_parm->mq_opcode == MQ_TST_MQCONN || p_mq_parm->mq_opcode == MQ_TST_MQCONN_REPLY) &&
- tvb_length_remaining(tvb, offset) > 0)
+ else if ((p_mq_parm->mq_opcode == MQ_TST_MQCONN || p_mq_parm->mq_opcode == MQ_TST_MQCONN_REPLY) && capLen > 0)
{
gint iSizeCONN = 0;
gint nofs;
@@ -2764,17 +2793,17 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
if (iSizeCONN != 112 && iSizeCONN != 120 && iSizeCONN != 260 && iSizeCONN != 332)
iSizeCONN = 0;
- if (iSizeCONN != 0 && tvb_length_remaining(tvb, offset) >= iSizeCONN)
+ if (iSizeCONN != 0 && tvb_reported_length_remaining(tvb, offset) >= iSizeCONN)
{
- guint8 *sApplicationName;
- guint8 *sQMgr;
+ gchar *sApplicationName;
+ gchar *sQMgr;
sApplicationName = format_text_chr(tvb_get_string_enc(wmem_packet_scope(), tvb, offset + 48, 28, p_mq_parm->mq_str_enc), 28, '.');
- if (strip_trailing_blanks(sApplicationName, 28) > 0)
+ if (strip_trailing_blanks((guint8 *)sApplicationName, 28) > 0)
{
col_append_fstr(pinfo->cinfo, COL_INFO, " App=%s", sApplicationName);
}
sQMgr = format_text_chr(tvb_get_string_enc(wmem_packet_scope(), tvb, offset, 48, p_mq_parm->mq_str_enc), 48, '.');
- if (strip_trailing_blanks(sQMgr, 48) > 0)
+ if (strip_trailing_blanks((guint8 *)sQMgr, 48) > 0)
{
col_append_fstr(pinfo->cinfo, COL_INFO, " QM=%s", sQMgr);
}
@@ -2822,7 +2851,7 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
offset += iSizeCONN;
}
}
- else if ((p_mq_parm->mq_opcode == MQ_TST_MQINQ || p_mq_parm->mq_opcode == MQ_TST_MQINQ_REPLY || p_mq_parm->mq_opcode == MQ_TST_MQSET) && tvb_length_remaining(tvb, offset) >= 12)
+ else if ((p_mq_parm->mq_opcode == MQ_TST_MQINQ || p_mq_parm->mq_opcode == MQ_TST_MQINQ_REPLY || p_mq_parm->mq_opcode == MQ_TST_MQSET) && capLen >= 12)
{
/* The MQINQ/MQSET structure is special because it does not start with a structid */
gint iNbSelectors;
@@ -2839,12 +2868,12 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
mq_tree = proto_tree_add_subtree(mqroot_tree, tvb, offset, -1, ett_mq_inq, NULL, MQ_TEXT_INQ);
- proto_tree_add_item(mq_tree, hf_mq_inq_nbsel, tvb, offset, 4, p_mq_parm->mq_int_enc);
- proto_tree_add_item(mq_tree, hf_mq_inq_nbint, tvb, offset + 4, 4, p_mq_parm->mq_int_enc);
+ proto_tree_add_item(mq_tree, hf_mq_inq_nbsel, tvb, offset, 4, p_mq_parm->mq_int_enc);
+ proto_tree_add_item(mq_tree, hf_mq_inq_nbint, tvb, offset + 4, 4, p_mq_parm->mq_int_enc);
proto_tree_add_item(mq_tree, hf_mq_inq_charlen, tvb, offset + 8, 4, p_mq_parm->mq_int_enc);
}
iOffsetINQ = 12;
- if (tvb_length_remaining(tvb, offset + iOffsetINQ) >= iNbSelectors * 4)
+ if (tvb_reported_length_remaining(tvb, offset + iOffsetINQ) >= iNbSelectors * 4)
{
if (tree)
{
@@ -2858,7 +2887,7 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
gint iSizeINQValues;
iSizeINQValues = iNbIntegers * 4 + iCharLen;
- if (tvb_length_remaining(tvb, offset + iOffsetINQ) >= iSizeINQValues)
+ if (tvb_reported_length_remaining(tvb, offset + iOffsetINQ) >= iSizeINQValues)
{
gint iInteger;
if (tree)
@@ -2879,15 +2908,19 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
}
}
- offset += tvb_length(tvb);
+ offset += tvb_reported_length(tvb);
}
else if (p_mq_parm->mq_opcode == MQ_TST_NOTIFICATION)
{
- gint iHdl;
+ guint uHdl;
+ guint uCod;
- iHdl = tvb_get_guint32_endian(tvb, offset+4, p_mq_parm->mq_int_enc);
+ uHdl = tvb_get_guint32_endian(tvb, offset+4, p_mq_parm->mq_int_enc);
+ uCod = tvb_get_guint32_endian(tvb, offset+8, p_mq_parm->mq_int_enc);
- col_append_fstr(pinfo->cinfo, COL_INFO, " Hdl=0x%08x", iHdl);
+ dissect_mq_addCR_colinfo(pinfo, p_mq_parm);
+ col_append_fstr(pinfo->cinfo, COL_INFO, " Hdl=0x%04x Cod=%s(0x%x)",
+ uHdl, try_val_to_str(uCod, GET_VALSV(notifcode)), uCod);
if (tree)
{
@@ -2899,7 +2932,7 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
proto_tree_add_item(mq_tree, hf_mq_notif_value, tvb, offset + 12, 4, p_mq_parm->mq_int_enc);
}
offset+=16;
- p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
+ p_mq_parm->mq_strucID = (tvb_reported_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
}
else if (p_mq_parm->mq_opcode == MQ_TST_REQUEST_MSGS)
{
@@ -2920,7 +2953,8 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
p_mq_parm->mq_msgreq_ccsid.encod = tvb_get_guint32_endian(tvb, offset + 44, p_mq_parm->mq_int_enc);
p_mq_parm->mq_msgreq_ccsid.ccsid = tvb_get_guint32_endian(tvb, offset + 48, p_mq_parm->mq_int_enc);
}
- col_append_fstr(pinfo->cinfo, COL_INFO, " Hdl=0x%08x GlbMsgIdx=%d, MaxLen=%d",
+ dissect_mq_addCR_colinfo(pinfo, p_mq_parm);
+ col_append_fstr(pinfo->cinfo, COL_INFO, " Hdl=0x%04x GlbMsgIdx=%d, MaxLen=%d",
iHdl, iGlbMsgIdx, iMaxMsgLen);
if (tree)
@@ -2973,7 +3007,7 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
}
offset += (iFlags & 0x00000010) ? (64+xOfs) : 40;
- p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
+ p_mq_parm->mq_strucID = (tvb_reported_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
}
else if (p_mq_parm->mq_opcode == MQ_TST_ASYNC_MESSAGE)
{
@@ -3006,7 +3040,8 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
if (!mq_in_reassembly)
{
- col_append_fstr(pinfo->cinfo, COL_INFO, " Hdl=0x%08x GlbMsgIdx=%d, SegIdx=%d, SegLen=%d",
+ dissect_mq_addCR_colinfo(pinfo, p_mq_parm);
+ col_append_fstr(pinfo->cinfo, COL_INFO, " Hdl=0x%04x GlbMsgIdx=%d, SegIdx=%d, SegLen=%d",
iHdl, iGlbMsgIdx, iSegmIndex, iSegLength);
}
@@ -3035,12 +3070,12 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
}
offset+=iHdrL;
- p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
+ p_mq_parm->mq_strucID = (tvb_reported_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
- iSizePayload = tvb_length_remaining(tvb, offset);
+ iSizePayload = tvb_reported_length_remaining(tvb, offset);
bPayload = (iSizePayload>0);
}
- else if ((p_mq_parm->mq_opcode == MQ_TST_SPI || p_mq_parm->mq_opcode == MQ_TST_SPI_REPLY) && tvb_length_remaining(tvb, offset) >= 12)
+ else if ((p_mq_parm->mq_opcode == MQ_TST_SPI || p_mq_parm->mq_opcode == MQ_TST_SPI_REPLY) && capLen >= 12)
{
gint iOffsetSPI = 0;
guint32 iSpiVerb = 0;
@@ -3062,31 +3097,31 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
offset += 12;
- p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
+ p_mq_parm->mq_strucID = (tvb_reported_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
if (((p_mq_parm->mq_strucID & MQ_MASK_SPxZ) == MQ_STRUCTID_SPxU ||
(p_mq_parm->mq_strucID & MQ_MASK_SPxZ) == MQ_STRUCTID_SPxU_EBCDIC)
- && tvb_length_remaining(tvb, offset) >= 12)
+ && tvb_reported_length_remaining(tvb, offset) >= 12)
{
gint iSizeSPIMD = 0;
if (tree)
{
guint8 *sStructId;
sStructId = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, 4, ((p_mq_parm->mq_strucID & MQ_MASK_SPxx) == MQ_STRUCTID_SPxx) ? ENC_ASCII : ENC_EBCDIC);
- mq_tree = proto_tree_add_subtree(mqroot_tree, tvb, offset, 12, ett_mq_spi_base, NULL, sStructId);
+ mq_tree = proto_tree_add_subtree(mqroot_tree, tvb, offset, 12, ett_mq_spi_base, NULL, (const char *)sStructId);
proto_tree_add_item(mq_tree, hf_mq_spi_base_StructID, tvb, offset, 4, p_mq_parm->mq_str_enc);
proto_tree_add_item(mq_tree, hf_mq_spi_base_version , tvb, offset + 4, 4, p_mq_parm->mq_int_enc);
proto_tree_add_item(mq_tree, hf_mq_spi_base_length , tvb, offset + 8, 4, p_mq_parm->mq_int_enc);
}
offset += 12;
- p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
+ p_mq_parm->mq_strucID = (tvb_reported_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
if ((iSizeSPIMD = dissect_mq_md(tvb, mqroot_tree, offset, p_mq_parm, TRUE)) != 0)
{
offset += iSizeSPIMD;
offset += dissect_mq_gmo(tvb, pinfo, mqroot_tree, offset, p_mq_parm);
offset += dissect_mq_pmo(tvb, pinfo, mqroot_tree, offset, p_mq_parm, &iDistributionListSize);
- p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
+ p_mq_parm->mq_strucID = (tvb_reported_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
}
offset += dissect_mq_od(tvb, pinfo, mqroot_tree, offset, p_mq_parm, &iDistributionListSize);
@@ -3095,14 +3130,14 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
(p_mq_parm->mq_strucID & MQ_MASK_SPxZ) == MQ_STRUCTID_SPxO_EBCDIC ||
(p_mq_parm->mq_strucID & MQ_MASK_SPxZ) == MQ_STRUCTID_SPxI ||
(p_mq_parm->mq_strucID & MQ_MASK_SPxZ) == MQ_STRUCTID_SPxI_EBCDIC)
- && tvb_length_remaining(tvb, offset) >= 12)
+ && tvb_reported_length_remaining(tvb, offset) >= 12)
{
if (tree)
{
/* Dissect the common part of these structures */
guint8 *sStructId;
sStructId = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, 4, ((p_mq_parm->mq_strucID & MQ_MASK_SPxx) == MQ_STRUCTID_SPxx) ? ENC_ASCII : ENC_EBCDIC);
- mq_tree = proto_tree_add_subtree(mqroot_tree, tvb, offset, -1, ett_mq_spi_base, NULL, sStructId);
+ mq_tree = proto_tree_add_subtree(mqroot_tree, tvb, offset, -1, ett_mq_spi_base, NULL, (const char *)sStructId);
proto_tree_add_item(mq_tree, hf_mq_spi_base_StructID, tvb, offset, 4, p_mq_parm->mq_str_enc);
proto_tree_add_item(mq_tree, hf_mq_spi_base_version , tvb, offset + 4, 4, p_mq_parm->mq_int_enc);
@@ -3110,7 +3145,7 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
if ((p_mq_parm->mq_strucID == MQ_STRUCTID_SPQO || p_mq_parm->mq_strucID == MQ_STRUCTID_SPQO_EBCDIC)
- && tvb_length_remaining(tvb, offset) >= 16)
+ && tvb_reported_length_remaining(tvb, offset) >= 16)
{
if (tree)
{
@@ -3118,7 +3153,7 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
proto_tree_add_item(mq_tree, hf_mq_spi_spqo_nbverb, tvb, offset + 12, 4, p_mq_parm->mq_int_enc);
iVerbNumber = tvb_get_guint32_endian(tvb, offset + 12, p_mq_parm->mq_int_enc);
- if (tvb_length_remaining(tvb, offset) >= iVerbNumber * 20 + 16)
+ if (tvb_reported_length_remaining(tvb, offset) >= iVerbNumber * 20 + 16)
{
gint iVerb = 0;
iOffsetSPI = offset + 16;
@@ -3136,7 +3171,7 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
}
else if ((p_mq_parm->mq_strucID == MQ_STRUCTID_SPAI || p_mq_parm->mq_strucID == MQ_STRUCTID_SPAI_EBCDIC)
- && tvb_length_remaining(tvb, offset) >= 136)
+ && tvb_reported_length_remaining(tvb, offset) >= 136)
{
if (tree)
{
@@ -3148,7 +3183,7 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
offset += 136;
}
else if ((p_mq_parm->mq_strucID == MQ_STRUCTID_SPGI || p_mq_parm->mq_strucID == MQ_STRUCTID_SPGI_EBCDIC)
- && tvb_length_remaining(tvb, offset) >= 24)
+ && tvb_reported_length_remaining(tvb, offset) >= 24)
{
if (tree)
{
@@ -3160,7 +3195,7 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
else if ((p_mq_parm->mq_strucID == MQ_STRUCTID_SPGO || p_mq_parm->mq_strucID == MQ_STRUCTID_SPPI ||
p_mq_parm->mq_strucID == MQ_STRUCTID_SPGO_EBCDIC || p_mq_parm->mq_strucID == MQ_STRUCTID_SPPI_EBCDIC)
- && tvb_length_remaining(tvb, offset) >= 20)
+ && tvb_reported_length_remaining(tvb, offset) >= 20)
{
if (tree)
{
@@ -3175,11 +3210,11 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
offset += 12;
}
- p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
+ p_mq_parm->mq_strucID = (tvb_reported_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
}
}
}
- else if ((p_mq_parm->mq_opcode >= 0xA0 && p_mq_parm->mq_opcode <= 0xB9) && tvb_length_remaining(tvb, offset) >= 16)
+ else if ((p_mq_parm->mq_opcode >= 0xA0 && p_mq_parm->mq_opcode <= 0xB9) && capLen >= 16)
{
/* The XA structures are special because they do not start with a structid */
if (tree)
@@ -3204,11 +3239,11 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
offset += iSizeXid;
}
else if ((p_mq_parm->mq_opcode == MQ_TST_XA_OPEN || p_mq_parm->mq_opcode == MQ_TST_XA_CLOSE)
- && tvb_length_remaining(tvb, offset) >= 1)
+ && tvb_reported_length_remaining(tvb, offset) >= 1)
{
guint8 iXAInfoLength = 0;
iXAInfoLength = tvb_get_guint8(tvb, offset);
- if (tvb_length_remaining(tvb, offset) >= iXAInfoLength + 1)
+ if (tvb_reported_length_remaining(tvb, offset) >= iXAInfoLength + 1)
{
if (tree)
{
@@ -3221,7 +3256,7 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
offset += 1 + iXAInfoLength;
}
else if ((p_mq_parm->mq_opcode == MQ_TST_XA_RECOVER || p_mq_parm->mq_opcode == MQ_TST_XA_RECOVER_REPLY)
- && tvb_length_remaining(tvb, offset) >= 4)
+ && tvb_reported_length_remaining(tvb, offset) >= 4)
{
gint iNbXid = 0;
iNbXid = tvb_get_guint32_endian(tvb, offset, p_mq_parm->mq_int_enc);
@@ -3244,7 +3279,7 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
}
}
- if ((p_mq_parm->mq_strucID == MQ_STRUCTID_LPOO || p_mq_parm->mq_strucID == MQ_STRUCTID_LPOO_EBCDIC) && tvb_length_remaining(tvb, offset) >= 32)
+ if ((p_mq_parm->mq_strucID == MQ_STRUCTID_LPOO || p_mq_parm->mq_strucID == MQ_STRUCTID_LPOO_EBCDIC) && tvb_reported_length_remaining(tvb, offset) >= 32)
{
guint iVersion;
guint iXtraData = 0;
@@ -3256,7 +3291,7 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
iXtraData = tvb_get_guint32_endian(tvb, offset + 84, p_mq_parm->mq_int_enc);
}
- if (iSize != 0 && tvb_length_remaining(tvb, offset) >= iSize)
+ if (iSize != 0 && tvb_reported_length_remaining(tvb, offset) >= iSize)
{
if (tree)
{
@@ -3267,7 +3302,8 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
dissect_mq_MQOO(tvb, mq_tree, offset+8, ett_mq_lpoo_options, hf_mq_lpoo_options, p_mq_parm);
- dissect_mq_LPOO_LPIOPTS(tvb, mq_tree, offset+16, ett_mq_lpoo_lpiopts, p_mq_parm);
+ dissect_mq_LPOO_LPIOPTS(tvb, mq_tree, offset+12, ett_mq_lpoo_lpiopts, p_mq_parm);
+ proto_tree_add_item(mq_tree, hf_mq_lpoo_unknown5 , tvb, offset + 16, 4, p_mq_parm->mq_int_enc);
proto_tree_add_item(mq_tree, hf_mq_lpoo_defpersist , tvb, offset + 20, 4, p_mq_parm->mq_int_enc);
proto_tree_add_item(mq_tree, hf_mq_lpoo_defputresptype, tvb, offset + 24, 4, p_mq_parm->mq_int_enc);
proto_tree_add_item(mq_tree, hf_mq_lpoo_defreadahead , tvb, offset + 28, 4, p_mq_parm->mq_int_enc);
@@ -3279,7 +3315,7 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
}
offset += iSize;
- p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
+ p_mq_parm->mq_strucID = (tvb_reported_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
if (iXtraData>0)
{
if (p_mq_parm->mq_opcode == MQ_TST_SPI_REPLY)
@@ -3291,12 +3327,12 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
}
}
- if ((p_mq_parm->mq_strucID == MQ_STRUCTID_ID || p_mq_parm->mq_strucID == MQ_STRUCTID_ID_EBCDIC) && tvb_length_remaining(tvb, offset) >= 5)
+ if ((p_mq_parm->mq_strucID == MQ_STRUCTID_ID || p_mq_parm->mq_strucID == MQ_STRUCTID_ID_EBCDIC) && tvb_reported_length_remaining(tvb, offset) >= 5)
{
offset += dissect_mq_id(tvb, pinfo, mqroot_tree, offset, p_mq_parm);
- p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
+ p_mq_parm->mq_strucID = (tvb_reported_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
}
- if ((p_mq_parm->mq_strucID == MQ_STRUCTID_UID || p_mq_parm->mq_strucID == MQ_STRUCTID_UID_EBCDIC) && tvb_length_remaining(tvb, offset) > 0)
+ if ((p_mq_parm->mq_strucID == MQ_STRUCTID_UID || p_mq_parm->mq_strucID == MQ_STRUCTID_UID_EBCDIC) && tvb_reported_length_remaining(tvb, offset) > 0)
{
gint iSizeUID;
/* iSizeUID = (iVersionID < 5 ? 28 : 132); guess */
@@ -3306,10 +3342,11 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
if (iSizeUID != 28 && iSizeUID != 132)
iSizeUID = 0;
- if (iSizeUID != 0 && tvb_length_remaining(tvb, offset) >= iSizeUID)
+ if (iSizeUID != 0 && tvb_reported_length_remaining(tvb, offset) >= iSizeUID)
{
guint8 *sUserId;
sUserId = tvb_get_string_enc(wmem_packet_scope(), tvb, offset + 4, 12, p_mq_parm->mq_str_enc);
+ dissect_mq_addCR_colinfo(pinfo, p_mq_parm);
if (strip_trailing_blanks(sUserId, 12) > 0)
{
col_append_fstr(pinfo->cinfo, COL_INFO, " User=%s", sUserId);
@@ -3334,7 +3371,7 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
}
offset += iSizeUID;
- p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
+ p_mq_parm->mq_strucID = (tvb_reported_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
}
offset += dissect_mq_od(tvb, pinfo, mqroot_tree, offset, p_mq_parm, &iDistributionListSize);
@@ -3355,7 +3392,7 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
offset += iSizePMO;
bPayload = TRUE;
}
- if (tvb_length_remaining(tvb, offset) >= 4)
+ if (tvb_reported_length_remaining(tvb, offset) >= 4)
{
if (bPayload == TRUE && (p_mq_parm->mq_opcode != MQ_TST_ASYNC_MESSAGE))
{
@@ -3375,18 +3412,18 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
if (bPayload == TRUE)
{
- if (iSizePayload != 0 && tvb_length_remaining(tvb, offset) > 0)
+ if (iSizePayload != 0 && tvb_reported_length_remaining(tvb, offset) > 0)
{
/* For the following header structures, each structure has a "format" field
which announces the type of the following structure. For dissection we
do not use it and rely on the structid instead. */
guint32 iHeadersLength = 0;
- if (tvb_length_remaining(tvb, offset) >= 4)
+ if (tvb_reported_length_remaining(tvb, offset) >= 4)
{
gint iSizeMD2 = 0;
p_mq_parm->mq_strucID = tvb_get_ntohl(tvb, offset);
- if ((p_mq_parm->mq_strucID == MQ_STRUCTID_XQH || p_mq_parm->mq_strucID == MQ_STRUCTID_XQH_EBCDIC) && tvb_length_remaining(tvb, offset) >= 104)
+ if ((p_mq_parm->mq_strucID == MQ_STRUCTID_XQH || p_mq_parm->mq_strucID == MQ_STRUCTID_XQH_EBCDIC) && tvb_reported_length_remaining(tvb, offset) >= 104)
{
/* if MD.format == MQXMIT */
gint iSizeXQH = 104;
@@ -3408,9 +3445,9 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
iHeadersLength += iSizeMD2;
}
- p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
+ p_mq_parm->mq_strucID = (tvb_reported_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
}
- if ((p_mq_parm->mq_strucID == MQ_STRUCTID_DLH || p_mq_parm->mq_strucID == MQ_STRUCTID_DLH_EBCDIC) && tvb_length_remaining(tvb, offset) >= 172)
+ if ((p_mq_parm->mq_strucID == MQ_STRUCTID_DLH || p_mq_parm->mq_strucID == MQ_STRUCTID_DLH_EBCDIC) && tvb_reported_length_remaining(tvb, offset) >= 172)
{
/* if MD.format == MQDEAD */
gint iSizeDLH = 172;
@@ -3440,7 +3477,7 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
offset += iSizeDLH;
iHeadersLength += iSizeDLH;
- p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
+ p_mq_parm->mq_strucID = (tvb_reported_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
}
if ((p_mq_parm->mq_strucID == MQ_STRUCTID_MDE || p_mq_parm->mq_strucID == MQ_STRUCTID_MDE_EBCDIC
|| p_mq_parm->mq_strucID == MQ_STRUCTID_CIH || p_mq_parm->mq_strucID == MQ_STRUCTID_CIH_EBCDIC
@@ -3448,7 +3485,7 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|| p_mq_parm->mq_strucID == MQ_STRUCTID_RFH || p_mq_parm->mq_strucID == MQ_STRUCTID_RFH_EBCDIC
|| p_mq_parm->mq_strucID == MQ_STRUCTID_RMH || p_mq_parm->mq_strucID == MQ_STRUCTID_RMH_EBCDIC
|| p_mq_parm->mq_strucID == MQ_STRUCTID_WIH || p_mq_parm->mq_strucID == MQ_STRUCTID_WIH_EBCDIC)
- && tvb_length_remaining(tvb, offset) >= 12)
+ && tvb_reported_length_remaining(tvb, offset) >= 12)
{
/* Dissect the generic part of the other pre-defined headers */
/* We assume that only one such header is present */
@@ -3462,18 +3499,20 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
p_mq_parm->mq_head_ccsid.encod = tvb_get_guint32_endian(tvb, offset + 12, p_mq_parm->mq_int_enc);
p_mq_parm->mq_head_ccsid.ccsid = tvb_get_guint32_endian(tvb, offset + 16, p_mq_parm->mq_int_enc);
- if (tvb_length_remaining(tvb, offset) >= iSizeHeader)
+ if (tvb_reported_length_remaining(tvb, offset) >= iSizeHeader)
{
gint iTmp;
gint iVer;
+ gint iLen;
gint oEnc = p_mq_parm->mq_str_enc;
p_mq_parm->iOfsEnc = offset + 12;
p_mq_parm->iOfsCcs = offset + 16;
p_mq_parm->iOfsFmt = offset + 20;
- iVer=(gint)tvb_get_guint32_endian(tvb, offset + 4, p_mq_parm->mq_int_enc);
- iTmp=p_mq_parm->mq_head_ccsid.ccsid;
+ iVer = (gint)tvb_get_guint32_endian(tvb, offset + 4, p_mq_parm->mq_int_enc);
+ iLen = (gint)tvb_get_guint32_endian(tvb, offset + 8, p_mq_parm->mq_int_enc);
+ iTmp = p_mq_parm->mq_head_ccsid.ccsid;
if (iTmp == 0)
iTmp = p_mq_parm->mq_md_ccsid.ccsid;
@@ -3605,6 +3644,43 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
proto_tree_add_item(mq_tree, hf_mq_wih_msgtoken , tvb, offset + 72, 16, ENC_NA);
proto_tree_add_item(mq_tree, hf_mq_wih_reserved , tvb, offset + 86, 32, p_mq_parm->mq_str_enc);
}
+ else if (p_mq_parm->mq_strucID == MQ_STRUCTID_RFH || p_mq_parm->mq_strucID == MQ_STRUCTID_RFH_EBCDIC)
+ {
+ int iPos, iEnd, iCCSID;
+ int iLenStr;
+ guint8 *sStr;
+
+ proto_tree *tree;
+
+ proto_tree_add_item(mq_tree, hf_mq_head_flags , tvb, offset + 28, 4, p_mq_parm->mq_int_enc);
+ iPos = offset + 32;
+ iEnd = offset + iLen - 32;
+ if ( iVer > 1 )
+ {
+ iCCSID = (int)tvb_get_guint32_endian(tvb, iPos, p_mq_parm->mq_int_enc);
+ proto_tree_add_item(mq_tree, hf_mq_rfh_ccsid, tvb, iPos, 4, p_mq_parm->mq_int_enc);
+ iPos += 4;
+ iEnd -= 4;
+ }
+ else
+ iCCSID = iTmp;
+
+ while (iPos < iEnd)
+ {
+ iLenStr = (int)tvb_get_guint32_endian(tvb, iPos, p_mq_parm->mq_int_enc);
+ sStr = tvb_get_string_enc(wmem_packet_scope(), tvb, iPos + 4, iLenStr, (iCCSID != 500) ? ENC_ASCII : ENC_EBCDIC);
+ if (*sStr)
+ strip_trailing_blanks(sStr, iLenStr);
+ if (*sStr)
+ format_text_chr(sStr, strlen((const char *)sStr), '.');
+
+ tree = proto_tree_add_subtree_format(mq_tree, tvb, iPos, iLenStr+4, ett_mq_rfh_ValueName, NULL, "NameValue: %s", sStr);
+
+ proto_tree_add_item(tree, hf_mq_rfh_length, tvb, iPos, 4, p_mq_parm->mq_int_enc);
+ proto_tree_add_item(tree, hf_mq_rfh_string, tvb, iPos + 4, iLenStr, p_mq_parm->mq_str_enc);
+ iPos += (iLenStr + 4);
+ }
+ }
else
{
proto_tree_add_item(mq_tree, hf_mq_head_flags , tvb, offset + 28, 4, p_mq_parm->mq_int_enc);
@@ -3613,7 +3689,7 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
offset += iSizeHeader;
iHeadersLength += iSizeHeader;
- p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
+ p_mq_parm->mq_strucID = (tvb_reported_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
p_mq_parm->mq_str_enc = oEnc;
}
}
@@ -3642,10 +3718,10 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
call_dissector(data_handle, next_tvb, pinfo, mqroot_tree);
}
}
- offset = tvb_length(tvb);
+ offset = tvb_reported_length(tvb);
}
/* After all recognised structures have been dissected, process remaining structure*/
- if (tvb_length_remaining(tvb, offset) >= 4)
+ if (tvb_reported_length_remaining(tvb, offset) >= 4)
{
p_mq_parm->mq_strucID = tvb_get_ntohl(tvb, offset);
if (tree)
@@ -3681,7 +3757,7 @@ static int reassemble_mq(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, vo
/* Reassembly of the MQ messages that span several PDU (several TSH) */
/* Typically a TCP PDU is 1460 bytes and a MQ PDU is 32766 bytes */
- if (tvb_length(tvb) < 28)
+ if (tvb_reported_length(tvb) < 28)
return 0;
memset(&mq_parm, 0, sizeof(mq_parm_t));
@@ -3713,14 +3789,28 @@ static int reassemble_mq(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, vo
if (mq_parm.mq_strucID == MQ_STRUCTID_TSHM || mq_parm.mq_strucID == MQ_STRUCTID_TSHM_EBCDIC)
iMulS = 8;
+ /* Get the Semgnet Length */
+ iSegL = tvb_get_ntohl ( tvb, 4);
+ if (iMulS==8)
+ {
+ mq_parm.mq_convID = tvb_get_ntohl (tvb, 8);
+ mq_parm.mq_rqstID = tvb_get_ntohl (tvb, 12);
+ }
+ else
+ {
+ mq_parm.mq_convID = 0;
+ mq_parm.mq_rqstID = 0;
+ }
+
/* Get the Encoding scheme */
iEnco = (tvb_get_guint8(tvb, 8 + iMulS) == MQ_LITTLE_ENDIAN ? ENC_LITTLE_ENDIAN : ENC_BIG_ENDIAN);
+ mq_parm.mq_int_enc = iEnco;
/* Get the Operation Code */
iOpcd = tvb_get_guint8( tvb, 9 + iMulS);
+ mq_parm.mq_opcode = iOpcd;
/* Get the Control Flag */
iCtlF = tvb_get_guint8( tvb, 10 + iMulS);
- /* Get the Semgnet Length */
- iSegL = tvb_get_ntohl ( tvb, 4);
+ mq_parm.mq_ctlf1 = iCtlF;
/* First Segment ? */
bSeg1st = ((iCtlF & MQ_TCF_FIRST) != 0);
/* Last Segment */
@@ -3802,14 +3892,18 @@ static int reassemble_mq(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, vo
proto_item *ti = proto_tree_add_item(tree, proto_mq, tvb, 0, -1, ENC_NA);
if (bMore)
{
- proto_item_append_text(ti, " [%s of a Reassembled MQ Segment] Hdl=0x%08x GlbMsgIdx=%d, SegIdx=%d, SegLen=%d",
- val_to_str(iOpcd, mq_opcode_vals, "Unknown (0x%02x)"),
+ proto_item_append_text(ti, " [%s of a Reassembled MQ Segment]",
+ val_to_str(iOpcd, mq_opcode_vals, "Unknown (0x%02x)"));
+ dissect_mq_addCR_colinfo(pinfo, &mq_parm);
+ proto_item_append_text(ti, " Hdl=0x%04x GlbMsgIdx=%d, SegIdx=%d, SegLen=%d",
iHdl, iGlbMsgIdx, iSegmIndex, iSegLength);
}
else
{
- proto_item_append_text(ti, " %s Hdl=0x%08x GlbMsgIdx=%d, SegIdx=%d, SegLen=%d",
- val_to_str(iOpcd, mq_opcode_vals, "Unknown (0x%02x)"),
+ proto_item_append_text(ti, " %s",
+ val_to_str(iOpcd, mq_opcode_vals, "Unknown (0x%02x)"));
+ dissect_mq_addCR_colinfo(pinfo, &mq_parm);
+ proto_item_append_text(ti, " Hdl=0x%04x GlbMsgIdx=%d, SegIdx=%d, SegLen=%d",
iHdl, iGlbMsgIdx, iSegmIndex, iSegLength);
}
mq_tree = proto_item_add_subtree(ti, ett_mq_reaasemb);
@@ -3836,18 +3930,20 @@ static int reassemble_mq(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, vo
next_tvb = tvb;
}
dissect_mq_pdu(next_tvb, pinfo, mq_tree);
- return tvb_length(tvb);
+ return tvb_reported_length(tvb);
}
else
{
mq_in_reassembly = TRUE;
/* Reassembly in progress */
col_set_str(pinfo->cinfo, COL_PROTOCOL, "MQ");
- col_add_fstr(pinfo->cinfo, COL_INFO, "[%s of a Reassembled MQ Segment] Hdl=0x%08x GlbMsgIdx=%d, SegIdx=%d, SegLen=%d",
- val_to_str(iOpcd, mq_opcode_vals, "Unknown (0x%02x)"),
+ col_add_fstr(pinfo->cinfo, COL_INFO, "[%s of a Reassembled MQ Segment]",
+ val_to_str(iOpcd, mq_opcode_vals, "Unknown (0x%02x)"));
+ dissect_mq_addCR_colinfo(pinfo, &mq_parm);
+ col_add_fstr(pinfo->cinfo, COL_INFO, " Hdl=0x%04x GlbMsgIdx=%d, SegIdx=%d, SegLen=%d",
iHdl, iGlbMsgIdx, iSegmIndex, iSegLength);
dissect_mq_pdu(tvb, pinfo, mq_tree);
- return tvb_length(tvb);
+ return tvb_reported_length(tvb);
}
}
else
@@ -3858,19 +3954,19 @@ static int reassemble_mq(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, vo
/* MQ segment is the first of a unreassembled series */
col_append_str(pinfo->cinfo, COL_INFO, " [Unreassembled MQ]");
}
- return tvb_length(tvb);
+ return tvb_reported_length(tvb);
}
}
/* Reassembly not enabled or non-fragmented message */
dissect_mq_pdu(tvb, pinfo, tree);
}
- return tvb_length(tvb);
+ return tvb_reported_length(tvb);
}
static guint get_mq_pdu_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset)
{
- if (tvb_length_remaining(tvb, offset) >= 8)
+ if (tvb_reported_length_remaining(tvb, offset) >= 8)
{
guint32 mq_strucID = tvb_get_ntohl(tvb, 0);
if ( (mq_strucID & MQ_MASK_TSHx) == MQ_STRUCTID_TSHx || (mq_strucID & MQ_MASK_TSHx) == MQ_STRUCTID_TSHx_EBCDIC )
@@ -3884,7 +3980,7 @@ static guint get_mq_pdu_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset)
static int dissect_mq_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
tcp_dissect_pdus(tvb, pinfo, tree, mq_desegment, 28, get_mq_pdu_len, reassemble_mq, data);
- return tvb_length(tvb);
+ return tvb_reported_length(tvb);
}
static void dissect_mq_spx(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
@@ -3895,7 +3991,7 @@ static void dissect_mq_spx(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
static gboolean dissect_mq_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint iProto, void *data)
{
- if (tvb_length(tvb) >= 28)
+ if (tvb_reported_length(tvb) >= 28)
{
guint32 mq_strucID = tvb_get_ntohl(tvb, 0);
if ( (mq_strucID & MQ_MASK_TSHx) == MQ_STRUCTID_TSHx || (mq_strucID & MQ_MASK_TSHx) == MQ_STRUCTID_TSHx_EBCDIC )
@@ -4356,10 +4452,10 @@ void proto_register_mq(void)
{ &hf_mq_lpoo_lpiopts_SAVE_ORIGIN_CTXT , {"SAVE_ORIGIN_CTXT", "mq.lpoo.opts.SAVE_ORIGIN_CTXT", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_LPOO_SAVE_ORIGIN_CTXT, "LPOO options SAVE_ORIGIN_CTXT", HFILL }},
{ &hf_mq_lpoo_lpiopts_SAVE_IDENTITY_CTXT, {"SAVE_IDENTITY_CTXT", "mq.lpoo.opts.SAVE_IDENTITY_CTXT", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_LPOO_SAVE_IDENTITY_CTXT, "LPOO options SAVE_IDENTITY_CTXT", HFILL }},
+ { &hf_mq_lpoo_unknown5 , {"Unknown5......", "mq.lpoo.unknown5", FT_UINT32, BASE_HEX, NULL, 0x0, "LPOO unknown5", HFILL }},
{ &hf_mq_lpoo_defpersist , {"DefPersitence.", "mq.lpoo.defpersist", FT_UINT32, BASE_HEX, NULL, 0x0, "LPOO Default Persitence", HFILL }},
{ &hf_mq_lpoo_defputresptype, {"DefPutRespType", "mq.lpoo.defputresptype", FT_UINT32, BASE_HEX, NULL, 0x0, "LPOO Default Put Response Type", HFILL }},
{ &hf_mq_lpoo_defreadahead , {"DefReadAHead..", "mq.lpoo.defreadahead", FT_UINT32, BASE_HEX, NULL, 0x0, "LPOO Default Read AHead", HFILL }},
-
{ &hf_mq_lpoo_qprotect , {"qprotect......", "mq.lpoo.qprotect", FT_STRINGZ, BASE_NONE, NULL, 0x0, "LPOO queue protection", HFILL }},
{ &hf_mq_lpoo_unknown6 , {"Unknown6......", "mq.lpoo.unknown6", FT_UINT32, BASE_HEX, NULL, 0x0, "LPOO unknown6", HFILL }},
{ &hf_mq_lpoo_xtradata , {"ExtraData.....", "mq.lpoo.extradata", FT_UINT32, BASE_DEC, NULL, 0x0, "LPOO Extra Data", HFILL }},
@@ -4501,6 +4597,10 @@ void proto_register_mq(void)
{ &hf_mq_cih_inputitem , {"InputItem....", "mq.cih.inputitem" , FT_UINT32 , BASE_DEC_HEX, NULL, 0x0, "Input Item", HFILL }},
{ &hf_mq_cih_reserved4 , {"Reserved4....", "mq.cih.reserved4" , FT_STRINGZ, BASE_NONE, NULL, 0x0, "Reserved 4", HFILL }},
+ { &hf_mq_rfh_ccsid , {"NmeValCCSID", "mq.rfh.ccsid" , FT_INT32 , BASE_DEC | BASE_RANGE_STRING, RVALS(&GET_VALRV(ccsid)), 0x0, "RFH NameValue CCSID", HFILL }},
+ { &hf_mq_rfh_length , {"Len." , "mq.rfh.length" , FT_UINT32 , BASE_DEC , NULL, 0x0, "RFH NameValue Length", HFILL }},
+ { &hf_mq_rfh_string , {"Val." , "mq.rfh.string" , FT_STRINGZ, BASE_NONE, NULL, 0x0, "RFH NameValue", HFILL }},
+
{ &hf_mq_rmh_flags_last , {"LAST", "mq.rmh.flags.last", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQRMHF_LAST, "MQ RMH LAST", HFILL }},
{ &hf_mq_rmh_objecttype , {"ObjectType...", "mq.rmh.objecttype" , FT_STRINGZ, BASE_NONE, NULL, 0x0, "Object Type", HFILL }},
@@ -4582,6 +4682,7 @@ void proto_register_mq(void)
&ett_mq_xa_xid,
&ett_mq_xa_info,
&ett_mq_charv,
+ &ett_mq_rfh_ValueName,
&ett_mq_reaasemb
};
diff --git a/epan/dissectors/packet-mq.h b/epan/dissectors/packet-mq.h
index 04d4b18e0d..2a752dd5cb 100644
--- a/epan/dissectors/packet-mq.h
+++ b/epan/dissectors/packet-mq.h
@@ -65,6 +65,8 @@ typedef struct _mq_ccsid_t
typedef struct _mq_parm_t
{
+ guint32 mq_convID ;
+ guint32 mq_rqstID;
guint32 mq_strucID ;
guint32 mq_int_enc ;
guint32 mq_str_enc ;