forked from osmocom/wireshark
ATM: add new dissector table
The new table takes unit ((VPI << 16) | VCI) to allow ATM cell payload dissection depending on VPI+VCI combination Change-Id: I8f958f904749363cafe0046424c3c2bf6a1a5c96 Reviewed-on: https://code.wireshark.org/review/31381 Petri-Dish: Guy Harris <guy@alum.mit.edu> Tested-by: Petri Dish Buildbot Reviewed-by: Guy Harris <guy@alum.mit.edu>
This commit is contained in:
parent
10a7993bae
commit
852a4212c8
|
@ -140,6 +140,8 @@ static gboolean dissect_lanesscop = FALSE;
|
||||||
|
|
||||||
static dissector_table_t atm_type_aal2_table;
|
static dissector_table_t atm_type_aal2_table;
|
||||||
static dissector_table_t atm_type_aal5_table;
|
static dissector_table_t atm_type_aal5_table;
|
||||||
|
static dissector_table_t atm_cell_payload_vpi_vci_table;
|
||||||
|
static dissector_table_t atm_reassembled_vpi_vci_table;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* See
|
* See
|
||||||
|
@ -927,6 +929,16 @@ dissect_reassembled_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
* First check whether custom dissection table
|
||||||
|
* was set up to dissect this VPI+VCI combination
|
||||||
|
*/
|
||||||
|
if (atm_info && dissector_try_uint_new(atm_reassembled_vpi_vci_table,
|
||||||
|
((atm_info->vpi) << 16) | atm_info->vci,
|
||||||
|
next_tvb, pinfo, tree, TRUE, atm_info))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
decoded = FALSE;
|
decoded = FALSE;
|
||||||
/*
|
/*
|
||||||
|
@ -1315,7 +1327,8 @@ static const value_string ft_ad_vals[] = {
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dissect_atm_cell_payload(tvbuff_t *tvb, int offset, packet_info *pinfo,
|
dissect_atm_cell_payload(tvbuff_t *tvb, int offset, packet_info *pinfo,
|
||||||
proto_tree *tree, guint aal, gboolean fill_columns)
|
proto_tree *tree, guint aal, gboolean fill_columns,
|
||||||
|
struct atm_phdr *atm_info)
|
||||||
{
|
{
|
||||||
proto_tree *aal_tree;
|
proto_tree *aal_tree;
|
||||||
proto_item *ti;
|
proto_item *ti;
|
||||||
|
@ -1324,6 +1337,18 @@ dissect_atm_cell_payload(tvbuff_t *tvb, int offset, packet_info *pinfo,
|
||||||
guint16 aal3_4_hdr, crc10;
|
guint16 aal3_4_hdr, crc10;
|
||||||
tvbuff_t *next_tvb;
|
tvbuff_t *next_tvb;
|
||||||
|
|
||||||
|
next_tvb = tvb_new_subset_remaining(tvb, offset);
|
||||||
|
/*
|
||||||
|
* First check whether custom dissection table
|
||||||
|
* was set up to dissect this VPI+VCI combination
|
||||||
|
*/
|
||||||
|
if (atm_info && dissector_try_uint_new(atm_cell_payload_vpi_vci_table,
|
||||||
|
((atm_info->vpi) << 16) | atm_info->vci,
|
||||||
|
next_tvb, pinfo, tree, TRUE, atm_info))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
switch (aal) {
|
switch (aal) {
|
||||||
|
|
||||||
case AAL_1:
|
case AAL_1:
|
||||||
|
@ -1440,13 +1465,14 @@ atm_is_oam_cell(const guint16 vci, const guint8 pt)
|
||||||
static void
|
static void
|
||||||
dissect_atm_cell(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
dissect_atm_cell(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
||||||
proto_tree *atm_tree, guint aal, gboolean nni,
|
proto_tree *atm_tree, guint aal, gboolean nni,
|
||||||
gboolean crc_stripped)
|
gboolean crc_stripped, const struct atm_phdr *atm_info)
|
||||||
{
|
{
|
||||||
int offset;
|
int offset;
|
||||||
proto_item *ti;
|
proto_item *ti;
|
||||||
guint8 octet, pt;
|
guint8 octet, pt;
|
||||||
int err;
|
int err;
|
||||||
guint16 vpi, vci;
|
guint16 vpi, vci;
|
||||||
|
struct atm_phdr atm_info_local;
|
||||||
|
|
||||||
if (!nni) {
|
if (!nni) {
|
||||||
/*
|
/*
|
||||||
|
@ -1540,7 +1566,28 @@ dissect_atm_cell(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dissect_atm_cell_payload(tvb, offset, pinfo, tree, aal, TRUE);
|
memset(&atm_info_local, 0, sizeof(atm_info_local));
|
||||||
|
if (atm_info) {
|
||||||
|
atm_info_local.flags = atm_info->flags;
|
||||||
|
atm_info_local.aal = atm_info->aal;
|
||||||
|
atm_info_local.type = atm_info->type;
|
||||||
|
atm_info_local.subtype = atm_info->subtype;
|
||||||
|
atm_info_local.vpi = atm_info->vpi;
|
||||||
|
atm_info_local.vci = atm_info->vci;
|
||||||
|
atm_info_local.aal2_cid = atm_info->aal2_cid;
|
||||||
|
atm_info_local.channel = atm_info->channel;
|
||||||
|
atm_info_local.cells = atm_info->cells;
|
||||||
|
atm_info_local.aal5t_u2u = atm_info->aal5t_u2u;
|
||||||
|
atm_info_local.aal5t_len = atm_info->aal5t_len;
|
||||||
|
atm_info_local.aal5t_chksum = atm_info->aal5t_chksum;
|
||||||
|
} else {
|
||||||
|
atm_info_local.aal = aal;
|
||||||
|
atm_info_local.type = pt;
|
||||||
|
atm_info_local.vpi = vpi;
|
||||||
|
atm_info_local.vci = vci;
|
||||||
|
}
|
||||||
|
|
||||||
|
dissect_atm_cell_payload(tvb, offset, pinfo, tree, aal, TRUE, &atm_info_local);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -1609,7 +1656,7 @@ dissect_atm_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
||||||
}
|
}
|
||||||
dissect_atm_cell(tvb, pinfo, tree, atm_tree,
|
dissect_atm_cell(tvb, pinfo, tree, atm_tree,
|
||||||
atm_info->aal, FALSE,
|
atm_info->aal, FALSE,
|
||||||
atm_info->flags & ATM_NO_HEC);
|
atm_info->flags & ATM_NO_HEC, atm_info);
|
||||||
} else {
|
} else {
|
||||||
/* This is a reassembled PDU. */
|
/* This is a reassembled PDU. */
|
||||||
|
|
||||||
|
@ -1677,19 +1724,24 @@ dissect_atm_oam_cell(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void*
|
||||||
atm_ti = proto_tree_add_item(tree, proto_atm, tvb, 0, 0, ENC_NA);
|
atm_ti = proto_tree_add_item(tree, proto_atm, tvb, 0, 0, ENC_NA);
|
||||||
atm_tree = proto_item_add_subtree(atm_ti, ett_atm);
|
atm_tree = proto_item_add_subtree(atm_ti, ett_atm);
|
||||||
|
|
||||||
dissect_atm_cell(tvb, pinfo, tree, atm_tree, AAL_OAMCELL, FALSE, FALSE);
|
dissect_atm_cell(tvb, pinfo, tree, atm_tree, AAL_OAMCELL, FALSE, FALSE, NULL);
|
||||||
return tvb_reported_length(tvb);
|
return tvb_reported_length(tvb);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
dissect_atm_pw_oam_cell(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
|
dissect_atm_pw_oam_cell(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
|
||||||
{
|
{
|
||||||
const struct pw_atm_phdr *pw_atm_info = (const struct pw_atm_phdr *)data;
|
struct pw_atm_phdr *pw_atm_info = (struct pw_atm_phdr *)data;
|
||||||
|
|
||||||
col_set_str(pinfo->cinfo, COL_PROTOCOL, "ATM");
|
col_set_str(pinfo->cinfo, COL_PROTOCOL, "ATM");
|
||||||
|
|
||||||
dissect_atm_cell_payload(tvb, 0, pinfo, tree, AAL_OAMCELL,
|
if (pw_atm_info) {
|
||||||
pw_atm_info->enable_fill_columns_by_atm_dissector);
|
dissect_atm_cell_payload(tvb, 0, pinfo, tree, AAL_OAMCELL,
|
||||||
|
pw_atm_info->enable_fill_columns_by_atm_dissector,
|
||||||
|
&pw_atm_info->info);
|
||||||
|
} else {
|
||||||
|
dissect_atm_cell_payload(tvb, 0, pinfo, tree, AAL_OAMCELL, TRUE, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
return tvb_reported_length(tvb);
|
return tvb_reported_length(tvb);
|
||||||
}
|
}
|
||||||
|
@ -1969,6 +2021,10 @@ proto_register_atm(void)
|
||||||
|
|
||||||
atm_type_aal2_table = register_dissector_table("atm.aal2.type", "ATM AAL_2 type", proto_atm, FT_UINT32, BASE_DEC);
|
atm_type_aal2_table = register_dissector_table("atm.aal2.type", "ATM AAL_2 type", proto_atm, FT_UINT32, BASE_DEC);
|
||||||
atm_type_aal5_table = register_dissector_table("atm.aal5.type", "ATM AAL_5 type", proto_atm, FT_UINT32, BASE_DEC);
|
atm_type_aal5_table = register_dissector_table("atm.aal5.type", "ATM AAL_5 type", proto_atm, FT_UINT32, BASE_DEC);
|
||||||
|
atm_cell_payload_vpi_vci_table = register_dissector_table("atm.cell_payload.vpi_vci", "ATM Cell Payload VPI VCI",
|
||||||
|
proto_atm, FT_UINT32, BASE_DEC);
|
||||||
|
atm_reassembled_vpi_vci_table = register_dissector_table("atm.reassembled.vpi_vci", "ATM Reassembled VPI VCI",
|
||||||
|
proto_atm, FT_UINT32, BASE_DEC);
|
||||||
|
|
||||||
register_capture_dissector_table("atm.aal5.type", "ATM AAL_5");
|
register_capture_dissector_table("atm.aal5.type", "ATM AAL_5");
|
||||||
register_capture_dissector_table("atm_lane", "ATM LAN Emulation");
|
register_capture_dissector_table("atm_lane", "ATM LAN Emulation");
|
||||||
|
|
Loading…
Reference in New Issue