forked from osmocom/wireshark
MQ dissector update from metatech.
svn path=/trunk/; revision=10476
This commit is contained in:
parent
eee9dc26ac
commit
309bfa6667
53
packet-mq.c
53
packet-mq.c
|
@ -3,7 +3,7 @@
|
||||||
*
|
*
|
||||||
* metatech <metatech@flashmail.com>
|
* metatech <metatech@flashmail.com>
|
||||||
*
|
*
|
||||||
* $Id: packet-mq.c,v 1.1 2004/03/16 19:23:24 guy Exp $
|
* $Id: packet-mq.c,v 1.2 2004/03/25 04:44:54 guy Exp $
|
||||||
*
|
*
|
||||||
* Ethereal - Network traffic analyzer
|
* Ethereal - Network traffic analyzer
|
||||||
* By Gerald Combs <gerald@ethereal.com>
|
* By Gerald Combs <gerald@ethereal.com>
|
||||||
|
@ -507,24 +507,17 @@ dissect_mq(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
||||||
{
|
{
|
||||||
proto_tree *mq_tree = NULL;
|
proto_tree *mq_tree = NULL;
|
||||||
proto_tree *mqroot_tree = NULL;
|
proto_tree *mqroot_tree = NULL;
|
||||||
proto_item *ti;
|
proto_item *ti = NULL;
|
||||||
conversation_t *conversation;
|
|
||||||
gint offset = 0;
|
gint offset = 0;
|
||||||
guint32 structId;
|
guint32 structId;
|
||||||
guint8 opcode;
|
guint8 opcode;
|
||||||
|
guint32 iSegmentLength = 0;
|
||||||
gboolean bLittleEndian = FALSE;
|
gboolean bLittleEndian = FALSE;
|
||||||
gboolean bPayload = FALSE;
|
gboolean bPayload = FALSE;
|
||||||
gboolean bEBCDIC = FALSE;
|
gboolean bEBCDIC = FALSE;
|
||||||
|
|
||||||
if (check_col(pinfo->cinfo, COL_PROTOCOL)) col_set_str(pinfo->cinfo, COL_PROTOCOL, "MQ");
|
if (check_col(pinfo->cinfo, COL_PROTOCOL)) col_set_str(pinfo->cinfo, COL_PROTOCOL, "MQ");
|
||||||
conversation = find_conversation(&pinfo->src, &pinfo->dst, pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
|
if (tvb_length(tvb) >= 28)
|
||||||
if (conversation == NULL)
|
|
||||||
{
|
|
||||||
conversation = conversation_new(&pinfo->src, &pinfo->dst, pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
|
|
||||||
conversation_set_dissector(conversation, mq_handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tvb_reported_length(tvb) >= 28)
|
|
||||||
{
|
{
|
||||||
structId = tvb_get_ntohl(tvb, offset);
|
structId = tvb_get_ntohl(tvb, offset);
|
||||||
if (structId == MQ_STRUCTID_TSH || structId == MQ_STRUCTID_TSH_EBCDIC)
|
if (structId == MQ_STRUCTID_TSH || structId == MQ_STRUCTID_TSH_EBCDIC)
|
||||||
|
@ -551,6 +544,7 @@ dissect_mq(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
||||||
mq_tree = proto_item_add_subtree(ti, ett_mq_tsh);
|
mq_tree = proto_item_add_subtree(ti, ett_mq_tsh);
|
||||||
|
|
||||||
proto_tree_add_item(mq_tree, hf_mq_tsh_structid, tvb, offset + 0, 4, FALSE);
|
proto_tree_add_item(mq_tree, hf_mq_tsh_structid, tvb, offset + 0, 4, FALSE);
|
||||||
|
iSegmentLength = tvb_get_ntohl(tvb, offset + 4);
|
||||||
proto_tree_add_item(mq_tree, hf_mq_tsh_packetlength, tvb, offset + 4, 4, FALSE);
|
proto_tree_add_item(mq_tree, hf_mq_tsh_packetlength, tvb, offset + 4, 4, FALSE);
|
||||||
|
|
||||||
bLittleEndian = (tvb_get_guint8(tvb, offset + 8) == MQ_LITTLE_ENDIAN ? TRUE : FALSE);
|
bLittleEndian = (tvb_get_guint8(tvb, offset + 8) == MQ_LITTLE_ENDIAN ? TRUE : FALSE);
|
||||||
|
@ -621,8 +615,10 @@ dissect_mq(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*iSizeCONN = ((iVersionID == 4 || iVersionID == 6) ? 120 : 112);*/ /* guess */
|
/*iSizeCONN = ((iVersionID == 4 || iVersionID == 6) ? 120 : 112);*/ /* guess */
|
||||||
/* The iVersionID is available in the previous ID segment, we should keep a state */
|
/* The iVersionID is available in the previous ID segment, we should keep a state
|
||||||
iSizeCONN = 112;
|
* Instead we rely on the segment length announced in the TSH */
|
||||||
|
iSizeCONN = iSegmentLength - iSizeTSH;
|
||||||
|
if (iSizeCONN != 112 && iSizeCONN != 120) iSizeCONN = 120;
|
||||||
|
|
||||||
if (tree)
|
if (tree)
|
||||||
{
|
{
|
||||||
|
@ -637,7 +633,6 @@ dissect_mq(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
||||||
|
|
||||||
if (tvb_length_remaining(tvb, offset) >= 120)
|
if (tvb_length_remaining(tvb, offset) >= 120)
|
||||||
{
|
{
|
||||||
iSizeCONN = 120;
|
|
||||||
if (tree)
|
if (tree)
|
||||||
{
|
{
|
||||||
proto_tree_add_item(mq_tree, hf_mq_conn_unknown2, tvb, offset + 112, 4, bLittleEndian);
|
proto_tree_add_item(mq_tree, hf_mq_conn_unknown2, tvb, offset + 112, 4, bLittleEndian);
|
||||||
|
@ -728,7 +723,6 @@ dissect_mq(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
||||||
}
|
}
|
||||||
else if ((structId == MQ_STRUCTID_UID || structId == MQ_STRUCTID_UID_EBCDIC) && tvb_length_remaining(tvb, offset) >= 28)
|
else if ((structId == MQ_STRUCTID_UID || structId == MQ_STRUCTID_UID_EBCDIC) && tvb_length_remaining(tvb, offset) >= 28)
|
||||||
{
|
{
|
||||||
guint8 iVersionUID = 0;
|
|
||||||
gint iSizeUID = 0;
|
gint iSizeUID = 0;
|
||||||
if (check_col(pinfo->cinfo, COL_INFO))
|
if (check_col(pinfo->cinfo, COL_INFO))
|
||||||
{
|
{
|
||||||
|
@ -741,8 +735,11 @@ dissect_mq(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* iSizeUID = (iVersionID < 5 ? 28 : 132); guess */
|
/* iSizeUID = (iVersionID < 5 ? 28 : 132); guess */
|
||||||
/* The iVersionID is available in the previous ID segment, we should keep a state */
|
/* The iVersionID is available in the previous ID segment, we should keep a state *
|
||||||
iSizeUID = 28;
|
* Instead we rely on the segment length announced in the TSH */
|
||||||
|
iSizeUID = iSegmentLength - iSizeTSH;
|
||||||
|
if (iSizeUID != 28 && iSizeUID != 132) iSizeUID = 132;
|
||||||
|
|
||||||
if (tree)
|
if (tree)
|
||||||
{
|
{
|
||||||
ti = proto_tree_add_text(mqroot_tree, tvb, offset, iSizeUID, MQ_TEXT_UID);
|
ti = proto_tree_add_text(mqroot_tree, tvb, offset, iSizeUID, MQ_TEXT_UID);
|
||||||
|
@ -755,7 +752,6 @@ dissect_mq(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
||||||
|
|
||||||
if (tvb_length_remaining(tvb, offset) >= 132)
|
if (tvb_length_remaining(tvb, offset) >= 132)
|
||||||
{
|
{
|
||||||
iSizeUID = 132;
|
|
||||||
if (tree)
|
if (tree)
|
||||||
{
|
{
|
||||||
proto_tree_add_item(mq_tree, hf_mq_uid_longuserid, tvb, offset + 28, 64, FALSE);
|
proto_tree_add_item(mq_tree, hf_mq_uid_longuserid, tvb, offset + 28, 64, FALSE);
|
||||||
|
@ -1032,7 +1028,7 @@ dissect_mq(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
||||||
proto_item_append_text(ti, " (%d bytes)", sizeBUFF);
|
proto_item_append_text(ti, " (%d bytes)", sizeBUFF);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
offset = tvb_reported_length(tvb);
|
offset = tvb_length(tvb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1063,7 +1059,7 @@ dissect_mq(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
||||||
static gboolean
|
static gboolean
|
||||||
dissect_mq_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
dissect_mq_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
||||||
{
|
{
|
||||||
if (tvb_reported_length(tvb) >= 28)
|
if (tvb_length(tvb) >= 28)
|
||||||
{
|
{
|
||||||
guint32 structId;
|
guint32 structId;
|
||||||
guint32 iLength;
|
guint32 iLength;
|
||||||
|
@ -1074,8 +1070,18 @@ dissect_mq_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
||||||
|
|
||||||
if ((structId == MQ_STRUCTID_TSH || structId == MQ_STRUCTID_TSH_EBCDIC)
|
if ((structId == MQ_STRUCTID_TSH || structId == MQ_STRUCTID_TSH_EBCDIC)
|
||||||
&& (cEndian == MQ_LITTLE_ENDIAN || cEndian == MQ_BIG_ENDIAN)
|
&& (cEndian == MQ_LITTLE_ENDIAN || cEndian == MQ_BIG_ENDIAN)
|
||||||
&& iLength == tvb_reported_length(tvb))
|
&& (iLength == tvb_length(tvb)))
|
||||||
{
|
{
|
||||||
|
/* Register this dissector for this conversation */
|
||||||
|
conversation_t *conversation = NULL;
|
||||||
|
conversation = find_conversation(&pinfo->src, &pinfo->dst, pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
|
||||||
|
if (conversation == NULL)
|
||||||
|
{
|
||||||
|
conversation = conversation_new(&pinfo->src, &pinfo->dst, pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
|
||||||
|
}
|
||||||
|
conversation_set_dissector(conversation, mq_handle);
|
||||||
|
|
||||||
|
/* Dissect the packet */
|
||||||
dissect_mq(tvb, pinfo, tree);
|
dissect_mq(tvb, pinfo, tree);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -1175,7 +1181,7 @@ proto_register_mq(void)
|
||||||
{ "Maximum message size", "mq.id.maxmsgsize", FT_UINT32, BASE_DEC, NULL, 0x0, "ID max msg size", HFILL }},
|
{ "Maximum message size", "mq.id.maxmsgsize", FT_UINT32, BASE_DEC, NULL, 0x0, "ID max msg size", HFILL }},
|
||||||
|
|
||||||
{ &hf_mq_id_sequencewrapvalue,
|
{ &hf_mq_id_sequencewrapvalue,
|
||||||
{ "Sequence wrap value", "mq.id.seqwrap", FT_UINT32, BASE_HEX, NULL, 0x0, "ID seq wrap value", HFILL }},
|
{ "Sequence wrap value", "mq.id.seqwrap", FT_UINT32, BASE_DEC, NULL, 0x0, "ID seq wrap value", HFILL }},
|
||||||
|
|
||||||
{ &hf_mq_id_channel,
|
{ &hf_mq_id_channel,
|
||||||
{ "Channel name", "mq.id.channelname", FT_STRINGZ, BASE_HEX, NULL, 0x0, "ID channel name", HFILL }},
|
{ "Channel name", "mq.id.channelname", FT_STRINGZ, BASE_HEX, NULL, 0x0, "ID channel name", HFILL }},
|
||||||
|
@ -1490,7 +1496,7 @@ proto_register_mq(void)
|
||||||
{ "Address of first record", "mq.pmo.addrrec", FT_UINT32, BASE_HEX, NULL, 0x0, "PMO address of first record", HFILL }},
|
{ "Address of first record", "mq.pmo.addrrec", FT_UINT32, BASE_HEX, NULL, 0x0, "PMO address of first record", HFILL }},
|
||||||
|
|
||||||
{ &hf_mq_pmo_responserecptr,
|
{ &hf_mq_pmo_responserecptr,
|
||||||
{ "Address of first response record", "mq.pmo.addrres", FT_UINT32, BASE_HEX, NULL, 0x0, "PMO qddress of first response record", HFILL }}
|
{ "Address of first response record", "mq.pmo.addrres", FT_UINT32, BASE_HEX, NULL, 0x0, "PMO address of first response record", HFILL }}
|
||||||
};
|
};
|
||||||
static gint *ett[] = {
|
static gint *ett[] = {
|
||||||
&ett_mq,
|
&ett_mq,
|
||||||
|
@ -1525,5 +1531,4 @@ proto_reg_handoff_mq(void)
|
||||||
dissector_add("tcp.port", MQ_PORT_TCP, mq_handle);
|
dissector_add("tcp.port", MQ_PORT_TCP, mq_handle);
|
||||||
|
|
||||||
heur_dissector_add("tcp", dissect_mq_heur, proto_mq);
|
heur_dissector_add("tcp", dissect_mq_heur, proto_mq);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue