forked from osmocom/wireshark
packet-ehdlc: Decode details of XID messages
We so far only dumped the XID as raw hex bytes. Now we actually decode the header and internal data structure of the XID. Change-Id: I2901486222d84166291e071bc07cb82a2f480974 Reviewed-on: https://code.wireshark.org/review/18461 Petri-Dish: Michael Mann <mmann78@netscape.net> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Michael Mann <mmann78@netscape.net>
This commit is contained in:
parent
3e82f423d9
commit
1e65231798
|
@ -47,6 +47,12 @@ static int hf_ehdlc_tei = -1;
|
||||||
static int hf_ehdlc_c_r = -1;
|
static int hf_ehdlc_c_r = -1;
|
||||||
|
|
||||||
static int hf_ehdlc_xid_payload = -1;
|
static int hf_ehdlc_xid_payload = -1;
|
||||||
|
static int hf_ehdlc_xid_win_tx = -1;
|
||||||
|
static int hf_ehdlc_xid_win_rx = -1;
|
||||||
|
static int hf_ehdlc_xid_ack_tmr_ms = -1;
|
||||||
|
static int hf_ehdlc_xid_format_id = -1;
|
||||||
|
static int hf_ehdlc_xid_group_id = -1;
|
||||||
|
static int hf_ehdlc_xid_len = -1;
|
||||||
static int hf_ehdlc_control = -1;
|
static int hf_ehdlc_control = -1;
|
||||||
|
|
||||||
static int hf_ehdlc_p = -1;
|
static int hf_ehdlc_p = -1;
|
||||||
|
@ -93,6 +99,7 @@ static const xdlc_cf_items ehdlc_cf_items_ext = {
|
||||||
|
|
||||||
/* Initialize the subtree pointers */
|
/* Initialize the subtree pointers */
|
||||||
static gint ett_ehdlc = -1;
|
static gint ett_ehdlc = -1;
|
||||||
|
static gint ett_ehdlc_xid = -1;
|
||||||
static gint ett_ehdlc_control = -1;
|
static gint ett_ehdlc_control = -1;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -149,6 +156,54 @@ static guint8 sapi_from_csapi(guint8 csapi)
|
||||||
|
|
||||||
static dissector_handle_t sub_handles[SUB_MAX];
|
static dissector_handle_t sub_handles[SUB_MAX];
|
||||||
|
|
||||||
|
static int
|
||||||
|
dissect_ehdlc_xid(proto_tree *tree, tvbuff_t *tvb, guint base_offset, guint len)
|
||||||
|
{
|
||||||
|
guint offset = base_offset;
|
||||||
|
proto_item *ti;
|
||||||
|
proto_tree *xid_tree;
|
||||||
|
|
||||||
|
/* XID is formatted like ISO 8885, typically we see
|
||||||
|
* something like
|
||||||
|
* 82 format identifier
|
||||||
|
* 80 group identifier
|
||||||
|
* 00 09 length
|
||||||
|
* 07 01 05 Window Size Tx
|
||||||
|
* 09 01 04 Ack Timer (msec)
|
||||||
|
* 08 01 05 Window Size Rx */
|
||||||
|
ti = proto_tree_add_item(tree, hf_ehdlc_xid_payload,
|
||||||
|
tvb, offset, len, ENC_NA);
|
||||||
|
xid_tree = proto_item_add_subtree(ti, ett_ehdlc_xid);
|
||||||
|
|
||||||
|
proto_tree_add_item(xid_tree, hf_ehdlc_xid_format_id, tvb, offset++, 1, ENC_NA);
|
||||||
|
proto_tree_add_item(xid_tree, hf_ehdlc_xid_group_id, tvb, offset++, 1, ENC_NA);
|
||||||
|
proto_tree_add_item(xid_tree, hf_ehdlc_xid_len, tvb, offset, 2, ENC_BIG_ENDIAN);
|
||||||
|
offset += 2;
|
||||||
|
|
||||||
|
while (tvb_reported_length_remaining(tvb, offset) >= 2) {
|
||||||
|
guint8 iei = tvb_get_guint8(tvb, offset++);
|
||||||
|
guint8 ie_len = tvb_get_guint8(tvb, offset++);
|
||||||
|
|
||||||
|
switch (iei) {
|
||||||
|
case 0x07:
|
||||||
|
proto_tree_add_item(xid_tree, hf_ehdlc_xid_win_tx, tvb,
|
||||||
|
offset, ie_len, ENC_NA);
|
||||||
|
break;
|
||||||
|
case 0x08:
|
||||||
|
proto_tree_add_item(xid_tree, hf_ehdlc_xid_win_rx, tvb,
|
||||||
|
offset, ie_len, ENC_NA);
|
||||||
|
break;
|
||||||
|
case 0x09:
|
||||||
|
proto_tree_add_item(xid_tree, hf_ehdlc_xid_ack_tmr_ms, tvb,
|
||||||
|
offset, ie_len, ENC_NA);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
offset += ie_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
return offset - base_offset;
|
||||||
|
}
|
||||||
|
|
||||||
/* Code to actually dissect the packets */
|
/* Code to actually dissect the packets */
|
||||||
static int
|
static int
|
||||||
dissect_ehdlc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
|
dissect_ehdlc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
|
||||||
|
@ -239,17 +294,8 @@ dissect_ehdlc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if (control == (XDLC_U | XDLC_XID)) {
|
} else if (control == (XDLC_U | XDLC_XID)) {
|
||||||
/* XID is formatted like ISO 8885, typically we see
|
dissect_ehdlc_xid(ehdlc_tree, tvb, offset+header_length,
|
||||||
* something like
|
len-header_length);
|
||||||
* 82 format identifier
|
|
||||||
* 80 group identifier
|
|
||||||
* 00 09 length
|
|
||||||
* 07 01 05 Window Size Tx
|
|
||||||
* 09 01 04 Ack Timer (msec)
|
|
||||||
* 08 01 05 Window Size Rx */
|
|
||||||
proto_tree_add_item(ehdlc_tree, hf_ehdlc_xid_payload,
|
|
||||||
tvb, offset+header_length,
|
|
||||||
len-header_length, ENC_NA);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (len == 0)
|
if (len == 0)
|
||||||
|
@ -299,6 +345,36 @@ proto_register_ehdlc(void)
|
||||||
FT_BYTES, BASE_NONE, NULL, 0,
|
FT_BYTES, BASE_NONE, NULL, 0,
|
||||||
NULL, HFILL }
|
NULL, HFILL }
|
||||||
},
|
},
|
||||||
|
{ &hf_ehdlc_xid_win_tx,
|
||||||
|
{ "Transmit Window", "ehdlc.xid.win_tx",
|
||||||
|
FT_UINT8, BASE_DEC, NULL, 0,
|
||||||
|
NULL, HFILL }
|
||||||
|
},
|
||||||
|
{ &hf_ehdlc_xid_win_rx,
|
||||||
|
{ "Receive Window", "ehdlc.xid.win_rx",
|
||||||
|
FT_UINT8, BASE_DEC, NULL, 0,
|
||||||
|
NULL, HFILL }
|
||||||
|
},
|
||||||
|
{ &hf_ehdlc_xid_ack_tmr_ms,
|
||||||
|
{ "Timer (ms)", "ehdlc.xid.ack_tmr_ms",
|
||||||
|
FT_UINT8, BASE_DEC, NULL, 0,
|
||||||
|
NULL, HFILL }
|
||||||
|
},
|
||||||
|
{ &hf_ehdlc_xid_format_id,
|
||||||
|
{ "Format Identifier", "ehdlc.xid.format_id",
|
||||||
|
FT_UINT8, BASE_HEX, NULL, 0,
|
||||||
|
NULL, HFILL }
|
||||||
|
},
|
||||||
|
{ &hf_ehdlc_xid_group_id,
|
||||||
|
{ "Group Identifier", "ehdlc.xid.group_id",
|
||||||
|
FT_UINT8, BASE_HEX, NULL, 0,
|
||||||
|
NULL, HFILL }
|
||||||
|
},
|
||||||
|
{ &hf_ehdlc_xid_len,
|
||||||
|
{ "XID Length", "ehdlc.xid.len",
|
||||||
|
FT_UINT16, BASE_DEC, NULL, 0,
|
||||||
|
NULL, HFILL }
|
||||||
|
},
|
||||||
{ &hf_ehdlc_control,
|
{ &hf_ehdlc_control,
|
||||||
{ "Control Field", "ehdlc.control",
|
{ "Control Field", "ehdlc.control",
|
||||||
FT_UINT16, BASE_HEX, NULL, 0,
|
FT_UINT16, BASE_HEX, NULL, 0,
|
||||||
|
@ -368,6 +444,7 @@ proto_register_ehdlc(void)
|
||||||
|
|
||||||
static gint *ett[] = {
|
static gint *ett[] = {
|
||||||
&ett_ehdlc,
|
&ett_ehdlc,
|
||||||
|
&ett_ehdlc_xid,
|
||||||
&ett_ehdlc_control,
|
&ett_ehdlc_control,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue