diff options
author | Guy Harris <guy@alum.mit.edu> | 2016-01-12 21:21:42 -0800 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2016-01-13 05:22:12 +0000 |
commit | d286243d0d7f83e39b5ac3aec4524eea3294147f (patch) | |
tree | dc7918b75b5b25c16c2d8a64264b8c2af4ff11f9 | |
parent | b7dc77312720bb1bfa3698f3b48e21c991c49632 (diff) |
Dissect the MC and AAL2 headers as 32-bit words.
That's how they're extracted in the libwiretap module, and that's how
they're shown in the ERF spec.
This gets rid of some compiler warnings about type-punning.
Merge some reserved bit fields to match what's in the ERF spec.
Renumber others.
Process the AAL2 and MC headers differently; yes, they're both
big-endian 32-bit values, but that makes the code a bit clearer, and,
heck, the optimizer may well combine the two sequences of code.
Change-Id: Ief7f976e77e8f2fba1685ad5a50ee677a8070ae7
Reviewed-on: https://code.wireshark.org/review/13251
Reviewed-by: Guy Harris <guy@alum.mit.edu>
-rw-r--r-- | epan/dissectors/packet-erf.c | 530 | ||||
-rw-r--r-- | wiretap/erf.c | 16 | ||||
-rw-r--r-- | wiretap/erf.h | 4 | ||||
-rw-r--r-- | wiretap/wtap.h | 1 |
4 files changed, 263 insertions, 288 deletions
diff --git a/epan/dissectors/packet-erf.c b/epan/dissectors/packet-erf.c index 270eff486f..1d6075ae0f 100644 --- a/epan/dissectors/packet-erf.c +++ b/epan/dissectors/packet-erf.c @@ -41,48 +41,6 @@ void proto_reg_handoff_erf(void); #define EXT_HDR_TYPE_CHANNELISED 12 #define EXT_HDR_TYPE_SIGNATURE 14 -struct erf_mc_hdlc_hdrx { - guint16 byte01; - guint8 byte2; - guint8 byte3; -}; - -struct erf_mc_raw_hdrx { - guint8 byte0; - guint16 byte12; - guint8 byte3; -}; - -struct erf_mc_atm_hdrx { - guint16 byte01; - guint8 byte2; - guint8 byte3; -}; - -struct erf_mc_aal5_hdrx { - guint16 byte01; - guint8 byte2; - guint8 byte3; -}; - -struct erf_mc_aal2_hdrx { - guint16 byte01; - guint8 byte2; - guint8 byte3; -}; - -struct erf_aal2_hdrx { - guint8 byte0; - guint8 byte1; - guint16 byte23; -}; - -struct erf_mc_rawl_hdrx { - guint16 byte01; - guint8 byte2; - guint8 byte3; -}; - struct erf_eth_hdrx { guint8 byte0; guint8 byte1; @@ -191,14 +149,12 @@ static int hf_erf_mc_hdlc_res3 = -1; static int hf_erf_mc_raw = -1; static int hf_erf_mc_raw_int = -1; static int hf_erf_mc_raw_res1 = -1; -static int hf_erf_mc_raw_res2 = -1; -static int hf_erf_mc_raw_res3 = -1; static int hf_erf_mc_raw_sre = -1; static int hf_erf_mc_raw_lre = -1; -static int hf_erf_mc_raw_res4 = -1; +static int hf_erf_mc_raw_res2 = -1; static int hf_erf_mc_raw_lbe = -1; static int hf_erf_mc_raw_first = -1; -static int hf_erf_mc_raw_res5 = -1; +static int hf_erf_mc_raw_res3 = -1; /* MC ATM Header */ static int hf_erf_mc_atm = -1; @@ -217,10 +173,10 @@ static int hf_erf_mc_atm_res3 = -1; /* MC Raw link Header */ static int hf_erf_mc_rawl = -1; static int hf_erf_mc_rawl_cn = -1; -static int hf_erf_mc_rawl_res2 = -1; +static int hf_erf_mc_rawl_res1 = -1; static int hf_erf_mc_rawl_lbe = -1; static int hf_erf_mc_rawl_first = -1; -static int hf_erf_mc_rawl_res3 = -1; +static int hf_erf_mc_rawl_res2 = -1; /* MC AAL5 Header */ static int hf_erf_mc_aal5 = -1; @@ -333,80 +289,78 @@ static dissector_handle_t sdh_handle; #define ATM_HDR_LENGTH 4 /* Multi Channel HDLC */ -#define MC_HDLC_CN_MASK 0x03ff -#define MC_HDLC_RES1_MASK 0xfc00 -#define MC_HDLC_RES2_MASK 0x00 -#define MC_HDLC_FCSE_MASK 0x01 -#define MC_HDLC_SRE_MASK 0x02 -#define MC_HDLC_LRE_MASK 0x04 -#define MC_HDLC_AFE_MASK 0x08 -#define MC_HDLC_OE_MASK 0x10 -#define MC_HDLC_LBE_MASK 0x20 -#define MC_HDLC_FIRST_MASK 0x40 -#define MC_HDLC_RES3_MASK 0x80 +#define MC_HDLC_CN_MASK 0x000003ff +#define MC_HDLC_RES1_MASK 0x0000fc00 +#define MC_HDLC_RES2_MASK 0x00ff0000 +#define MC_HDLC_FCSE_MASK 0x01000000 +#define MC_HDLC_SRE_MASK 0x02000000 +#define MC_HDLC_LRE_MASK 0x04000000 +#define MC_HDLC_AFE_MASK 0x08000000 +#define MC_HDLC_OE_MASK 0x10000000 +#define MC_HDLC_LBE_MASK 0x20000000 +#define MC_HDLC_FIRST_MASK 0x40000000 +#define MC_HDLC_RES3_MASK 0x80000000 /* Multi Channel RAW */ -#define MC_RAW_INT_MASK 0x0f -#define MC_RAW_RES1_MASK 0xf0 -#define MC_RAW_RES2_MASK 0xffff -#define MC_RAW_RES3_MASK 0x01 -#define MC_RAW_SRE_MASK 0x02 -#define MC_RAW_LRE_MASK 0x04 -#define MC_RAW_RES4_MASK 0x18 -#define MC_RAW_LBE_MASK 0x20 -#define MC_RAW_FIRST_MASK 0x40 -#define MC_RAW_RES5_MASK 0x80 +#define MC_RAW_INT_MASK 0x0000000f +#define MC_RAW_RES1_MASK 0x01fffff0 +#define MC_RAW_SRE_MASK 0x02000000 +#define MC_RAW_LRE_MASK 0x04000000 +#define MC_RAW_RES2_MASK 0x18000000 +#define MC_RAW_LBE_MASK 0x20000000 +#define MC_RAW_FIRST_MASK 0x40000000 +#define MC_RAW_RES3_MASK 0x80000000 /* Multi Channel ATM */ -#define MC_ATM_CN_MASK 0x03ff -#define MC_ATM_RES1_MASK 0x7c00 -#define MC_ATM_MUL_MASK 0x8000 -#define MC_ATM_PORT_MASK 0x0f -#define MC_ATM_RES2_MASK 0xf0 -#define MC_ATM_LBE_MASK 0x01 -#define MC_ATM_HEC_MASK 0x02 -#define MC_ATM_CRC10_MASK 0x04 -#define MC_ATM_OAMCELL_MASK 0x08 -#define MC_ATM_FIRST_MASK 0x10 -#define MC_ATM_RES3_MASK 0xe0 +#define MC_ATM_CN_MASK 0x000003ff +#define MC_ATM_RES1_MASK 0x00007c00 +#define MC_ATM_MUL_MASK 0x00008000 +#define MC_ATM_PORT_MASK 0x000f0000 +#define MC_ATM_RES2_MASK 0x00f00000 +#define MC_ATM_LBE_MASK 0x01000000 +#define MC_ATM_HEC_MASK 0x02000000 +#define MC_ATM_CRC10_MASK 0x04000000 +#define MC_ATM_OAMCELL_MASK 0x08000000 +#define MC_ATM_FIRST_MASK 0x10000000 +#define MC_ATM_RES3_MASK 0xe0000000 /* Multi Channel RAW Link */ -#define MC_RAWL_CN_MASK 0x03ff -#define MC_RAWL_RES1_MASK 0xfffc -#define MC_RAWL_RES2_MASK 0x1f -#define MC_RAWL_LBE_MASK 0x20 -#define MC_RAWL_FIRST_MASK 0x40 -#define MC_RAWL_RES3_MASK 0x80 +#define MC_RAWL_CN_MASK 0x000003ff +#define MC_RAWL_RES1_MASK 0x1ffffc00 +#define MC_RAWL_LBE_MASK 0x20000000 +#define MC_RAWL_FIRST_MASK 0x40000000 +#define MC_RAWL_RES2_MASK 0x80000000 /* Multi Channel AAL5 */ -#define MC_AAL5_CN_MASK 0x03ff -#define MC_AAL5_RES1_MASK 0xfc00 -#define MC_AAL5_PORT_MASK 0x0f -#define MC_AAL5_CRCCK_MASK 0x10 -#define MC_AAL5_CRCE_MASK 0x20 -#define MC_AAL5_LENCK_MASK 0x40 -#define MC_AAL5_LENE_MASK 0x80 -#define MC_AAL5_RES2_MASK 0x0f -#define MC_AAL5_FIRST_MASK 0x10 -#define MC_AAL5_RES3_MASK 0xe0 +#define MC_AAL5_CN_MASK 0x000003ff +#define MC_AAL5_RES1_MASK 0x0000fc00 +#define MC_AAL5_PORT_MASK 0x000f0000 +#define MC_AAL5_CRCCK_MASK 0x00100000 +#define MC_AAL5_CRCE_MASK 0x00200000 +#define MC_AAL5_LENCK_MASK 0x00400000 +#define MC_AAL5_LENE_MASK 0x00800000 +#define MC_AAL5_RES2_MASK 0x0f000000 +#define MC_AAL5_FIRST_MASK 0x10000000 +#define MC_AAL5_RES3_MASK 0xe0000000 /* Multi Channel AAL2 */ -#define MC_AAL2_CN_MASK 0x03ff -#define MC_AAL2_RES1_MASK 0x1c00 -#define MC_AAL2_RES2_MASK 0xe000 -#define MC_AAL2_PORT_MASK 0x0f -#define MC_AAL2_RES3_MASK 0x10 -#define MC_AAL2_FIRST_MASK 0x20 -#define MC_AAL2_MAALE_MASK 0x40 -#define MC_AAL2_LENE_MASK 0x80 -#define MC_AAL2_CID_MASK 0x00 +#define MC_AAL2_CN_MASK 0x000003ff +#define MC_AAL2_RES1_MASK 0x00001c00 +#define MC_AAL2_RES2_MASK 0x0000e000 +#define MC_AAL2_PORT_MASK 0x000f0000 +#define MC_AAL2_RES3_MASK 0x00100000 +#define MC_AAL2_FIRST_MASK 0x00200000 +#define MC_AAL2_MAALE_MASK 0x00400000 +#define MC_AAL2_LENE_MASK 0x00800000 +#define MC_AAL2_CID_MASK 0xff000000 +#define MC_AAL2_CID_SHIFT 24 /* AAL2 */ -#define AAL2_CID_MASK 0x00 -#define AAL2_MAALE_MASK 0x00 -#define AAL2_MAALEI_MASK 0x0001 -#define AAL2_FIRST_MASK 0x0002 -#define AAL2_RES1_MASK 0xfffc +#define AAL2_CID_MASK 0x000000ff +#define AAL2_MAALE_MASK 0x0000ff00 +#define AAL2_MAALEI_MASK 0x00010000 +#define AAL2_FIRST_MASK 0x00020000 +#define AAL2_RES1_MASK 0xfffc0000 /* ETH */ #define ETH_OFF_MASK 0x00 @@ -836,46 +790,45 @@ static void dissect_mc_hdlc_header(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { if (tree) { - proto_item *mc_hdlc_item; - proto_tree *mc_hdlc_tree; - struct erf_mc_hdlc_hdrx *mc_hdlc; - proto_item *pi; + proto_item *mc_hdlc_item; + proto_tree *mc_hdlc_tree; + guint32 mc_hdlc; + proto_item *pi; /* Multi Channel HDLC Header */ mc_hdlc_item = proto_tree_add_uint(tree, hf_erf_mc_hdlc, tvb, 0, 0, pinfo->pseudo_header->erf.subhdr.mc_hdr); mc_hdlc_tree = proto_item_add_subtree(mc_hdlc_item, ett_erf_mc_hdlc); - mc_hdlc = (struct erf_mc_hdlc_hdrx *) (&pinfo->pseudo_header->erf.subhdr.mc_hdr); + mc_hdlc = pinfo->pseudo_header->erf.subhdr.mc_hdr; - proto_tree_add_uint(mc_hdlc_tree, hf_erf_mc_hdlc_cn, tvb, 0, 0, mc_hdlc->byte01); - proto_tree_add_uint(mc_hdlc_tree, hf_erf_mc_hdlc_res1, tvb, 0, 0, mc_hdlc->byte01); - proto_tree_add_uint(mc_hdlc_tree, hf_erf_mc_hdlc_res2, tvb, 0, 0, mc_hdlc->byte2); - pi=proto_tree_add_uint(mc_hdlc_tree, hf_erf_mc_hdlc_fcse, tvb, 0, 0, mc_hdlc->byte3); - if (mc_hdlc->byte3 & MC_HDLC_FCSE_MASK) + proto_tree_add_uint(mc_hdlc_tree, hf_erf_mc_hdlc_cn, tvb, 0, 0, mc_hdlc); + proto_tree_add_uint(mc_hdlc_tree, hf_erf_mc_hdlc_res1, tvb, 0, 0, mc_hdlc); + proto_tree_add_uint(mc_hdlc_tree, hf_erf_mc_hdlc_res2, tvb, 0, 0, mc_hdlc); + pi=proto_tree_add_uint(mc_hdlc_tree, hf_erf_mc_hdlc_fcse, tvb, 0, 0, mc_hdlc); + if (mc_hdlc & MC_HDLC_FCSE_MASK) expert_add_info_format(pinfo, pi, &ei_erf_checksum_error, "ERF MC FCS Error"); - pi=proto_tree_add_uint(mc_hdlc_tree, hf_erf_mc_hdlc_sre, tvb, 0, 0, mc_hdlc->byte3); - if (mc_hdlc->byte3 & MC_HDLC_SRE_MASK) + pi=proto_tree_add_uint(mc_hdlc_tree, hf_erf_mc_hdlc_sre, tvb, 0, 0, mc_hdlc); + if (mc_hdlc & MC_HDLC_SRE_MASK) expert_add_info_format(pinfo, pi, &ei_erf_checksum_error, "ERF MC Short Record Error, <5 bytes"); - pi=proto_tree_add_uint(mc_hdlc_tree, hf_erf_mc_hdlc_lre, tvb, 0, 0, mc_hdlc->byte3); - if (mc_hdlc->byte3 & MC_HDLC_LRE_MASK) + pi=proto_tree_add_uint(mc_hdlc_tree, hf_erf_mc_hdlc_lre, tvb, 0, 0, mc_hdlc); + if (mc_hdlc & MC_HDLC_LRE_MASK) expert_add_info_format(pinfo, pi, &ei_erf_checksum_error, "ERF MC Long Record Error, >2047 bytes"); - pi=proto_tree_add_uint(mc_hdlc_tree, hf_erf_mc_hdlc_afe, tvb, 0, 0, mc_hdlc->byte3); - if (mc_hdlc->byte3 & MC_HDLC_AFE_MASK) + pi=proto_tree_add_uint(mc_hdlc_tree, hf_erf_mc_hdlc_afe, tvb, 0, 0, mc_hdlc); + if (mc_hdlc & MC_HDLC_AFE_MASK) expert_add_info_format(pinfo, pi, &ei_erf_checksum_error, "ERF MC Aborted Frame Error"); - pi=proto_tree_add_uint(mc_hdlc_tree, hf_erf_mc_hdlc_oe, tvb, 0, 0, mc_hdlc->byte3); - if (mc_hdlc->byte3 & MC_HDLC_OE_MASK) + pi=proto_tree_add_uint(mc_hdlc_tree, hf_erf_mc_hdlc_oe, tvb, 0, 0, mc_hdlc); + if (mc_hdlc & MC_HDLC_OE_MASK) expert_add_info_format(pinfo, pi, &ei_erf_checksum_error, "ERF MC Octet Error, the closing flag was not octet aligned after bit unstuffing"); - pi=proto_tree_add_uint(mc_hdlc_tree, hf_erf_mc_hdlc_lbe, tvb, 0, 0, mc_hdlc->byte3); - if (mc_hdlc->byte3 & MC_HDLC_LBE_MASK) + pi=proto_tree_add_uint(mc_hdlc_tree, hf_erf_mc_hdlc_lbe, tvb, 0, 0, mc_hdlc); + if (mc_hdlc & MC_HDLC_LBE_MASK) expert_add_info_format(pinfo, pi, &ei_erf_checksum_error, "ERF MC Lost Byte Error"); - proto_tree_add_uint(mc_hdlc_tree, hf_erf_mc_hdlc_first, tvb, 0, 0, mc_hdlc->byte3); - proto_tree_add_uint(mc_hdlc_tree, hf_erf_mc_hdlc_res3, tvb, 0, 0, mc_hdlc->byte3); - + proto_tree_add_uint(mc_hdlc_tree, hf_erf_mc_hdlc_first, tvb, 0, 0, mc_hdlc); + proto_tree_add_uint(mc_hdlc_tree, hf_erf_mc_hdlc_res3, tvb, 0, 0, mc_hdlc); } } @@ -883,25 +836,23 @@ static void dissect_mc_raw_header(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { if (tree) { - proto_item *mc_raw_item; - proto_tree *mc_raw_tree; - struct erf_mc_raw_hdrx *mc_raw; + proto_item *mc_raw_item; + proto_tree *mc_raw_tree; + guint32 mc_raw; /* Multi Channel RAW Header */ mc_raw_item = proto_tree_add_uint(tree, hf_erf_mc_raw, tvb, 0, 0, pinfo->pseudo_header->erf.subhdr.mc_hdr); mc_raw_tree = proto_item_add_subtree(mc_raw_item, ett_erf_mc_raw); - mc_raw = (struct erf_mc_raw_hdrx *) (&pinfo->pseudo_header->erf.subhdr.mc_hdr); - - proto_tree_add_uint(mc_raw_tree, hf_erf_mc_raw_int, tvb, 0, 0, mc_raw->byte0); - proto_tree_add_uint(mc_raw_tree, hf_erf_mc_raw_res1, tvb, 0, 0, mc_raw->byte0); - proto_tree_add_uint(mc_raw_tree, hf_erf_mc_raw_res2, tvb, 0, 0, mc_raw->byte12); - proto_tree_add_uint(mc_raw_tree, hf_erf_mc_raw_res3, tvb, 0, 0, mc_raw->byte3); - proto_tree_add_uint(mc_raw_tree, hf_erf_mc_raw_sre, tvb, 0, 0, mc_raw->byte3); - proto_tree_add_uint(mc_raw_tree, hf_erf_mc_raw_lre, tvb, 0, 0, mc_raw->byte3); - proto_tree_add_uint(mc_raw_tree, hf_erf_mc_raw_res4, tvb, 0, 0, mc_raw->byte3); - proto_tree_add_uint(mc_raw_tree, hf_erf_mc_raw_lbe, tvb, 0, 0, mc_raw->byte3); - proto_tree_add_uint(mc_raw_tree, hf_erf_mc_raw_first, tvb, 0, 0, mc_raw->byte3); - proto_tree_add_uint(mc_raw_tree, hf_erf_mc_raw_res5, tvb, 0, 0, mc_raw->byte3); + mc_raw = pinfo->pseudo_header->erf.subhdr.mc_hdr; + + proto_tree_add_uint(mc_raw_tree, hf_erf_mc_raw_int, tvb, 0, 0, mc_raw); + proto_tree_add_uint(mc_raw_tree, hf_erf_mc_raw_res1, tvb, 0, 0, mc_raw); + proto_tree_add_uint(mc_raw_tree, hf_erf_mc_raw_sre, tvb, 0, 0, mc_raw); + proto_tree_add_uint(mc_raw_tree, hf_erf_mc_raw_lre, tvb, 0, 0, mc_raw); + proto_tree_add_uint(mc_raw_tree, hf_erf_mc_raw_res2, tvb, 0, 0, mc_raw); + proto_tree_add_uint(mc_raw_tree, hf_erf_mc_raw_lbe, tvb, 0, 0, mc_raw); + proto_tree_add_uint(mc_raw_tree, hf_erf_mc_raw_first, tvb, 0, 0, mc_raw); + proto_tree_add_uint(mc_raw_tree, hf_erf_mc_raw_res3, tvb, 0, 0, mc_raw); } } @@ -909,28 +860,28 @@ static void dissect_mc_atm_header(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { if (tree) { - proto_item *mc_atm_item; - proto_tree *mc_atm_tree; - struct erf_mc_atm_hdrx *mc_atm; + proto_item *mc_atm_item; + proto_tree *mc_atm_tree; + guint32 mc_atm; /*"Multi Channel ATM Header"*/ mc_atm_item = proto_tree_add_uint(tree, hf_erf_mc_atm, tvb, 0, 0, pinfo->pseudo_header->erf.subhdr.mc_hdr); mc_atm_tree = proto_item_add_subtree(mc_atm_item, ett_erf_mc_atm); - mc_atm = (struct erf_mc_atm_hdrx *) (&pinfo->pseudo_header->erf.subhdr.mc_hdr); + mc_atm = pinfo->pseudo_header->erf.subhdr.mc_hdr; - proto_tree_add_uint(mc_atm_tree, hf_erf_mc_atm_cn, tvb, 0, 0, mc_atm->byte01); - proto_tree_add_uint(mc_atm_tree, hf_erf_mc_atm_res1, tvb, 0, 0, mc_atm->byte01); - proto_tree_add_uint(mc_atm_tree, hf_erf_mc_atm_mul, tvb, 0, 0, mc_atm->byte01); + proto_tree_add_uint(mc_atm_tree, hf_erf_mc_atm_cn, tvb, 0, 0, mc_atm); + proto_tree_add_uint(mc_atm_tree, hf_erf_mc_atm_res1, tvb, 0, 0, mc_atm); + proto_tree_add_uint(mc_atm_tree, hf_erf_mc_atm_mul, tvb, 0, 0, mc_atm); - proto_tree_add_uint(mc_atm_tree, hf_erf_mc_atm_port, tvb, 0, 0, mc_atm->byte2); - proto_tree_add_uint(mc_atm_tree, hf_erf_mc_atm_res2, tvb, 0, 0, mc_atm->byte2); + proto_tree_add_uint(mc_atm_tree, hf_erf_mc_atm_port, tvb, 0, 0, mc_atm); + proto_tree_add_uint(mc_atm_tree, hf_erf_mc_atm_res2, tvb, 0, 0, mc_atm); - proto_tree_add_uint(mc_atm_tree, hf_erf_mc_atm_lbe, tvb, 0, 0, mc_atm->byte3); - proto_tree_add_uint(mc_atm_tree, hf_erf_mc_atm_hec, tvb, 0, 0, mc_atm->byte3); - proto_tree_add_uint(mc_atm_tree, hf_erf_mc_atm_crc10, tvb, 0, 0, mc_atm->byte3); - proto_tree_add_uint(mc_atm_tree, hf_erf_mc_atm_oamcell, tvb, 0, 0, mc_atm->byte3); - proto_tree_add_uint(mc_atm_tree, hf_erf_mc_atm_first, tvb, 0, 0, mc_atm->byte3); - proto_tree_add_uint(mc_atm_tree, hf_erf_mc_atm_res3, tvb, 0, 0, mc_atm->byte3); + proto_tree_add_uint(mc_atm_tree, hf_erf_mc_atm_lbe, tvb, 0, 0, mc_atm); + proto_tree_add_uint(mc_atm_tree, hf_erf_mc_atm_hec, tvb, 0, 0, mc_atm); + proto_tree_add_uint(mc_atm_tree, hf_erf_mc_atm_crc10, tvb, 0, 0, mc_atm); + proto_tree_add_uint(mc_atm_tree, hf_erf_mc_atm_oamcell, tvb, 0, 0, mc_atm); + proto_tree_add_uint(mc_atm_tree, hf_erf_mc_atm_first, tvb, 0, 0, mc_atm); + proto_tree_add_uint(mc_atm_tree, hf_erf_mc_atm_res3, tvb, 0, 0, mc_atm); } } @@ -938,20 +889,20 @@ static void dissect_mc_rawlink_header(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { if (tree) { - proto_item *mc_rawl_item; - proto_tree *mc_rawl_tree; - struct erf_mc_rawl_hdrx *mc_rawl; + proto_item *mc_rawl_item; + proto_tree *mc_rawl_tree; + guint32 mc_rawl; /* Multi Channel RAW Link Header */ mc_rawl_item = proto_tree_add_uint(tree, hf_erf_mc_rawl, tvb, 0, 0, pinfo->pseudo_header->erf.subhdr.mc_hdr); mc_rawl_tree = proto_item_add_subtree(mc_rawl_item, ett_erf_mc_rawlink); - mc_rawl = (struct erf_mc_rawl_hdrx *) (&pinfo->pseudo_header->erf.subhdr.mc_hdr); + mc_rawl = pinfo->pseudo_header->erf.subhdr.mc_hdr; - proto_tree_add_uint(mc_rawl_tree, hf_erf_mc_rawl_cn, tvb, 0, 0, mc_rawl->byte01); - proto_tree_add_uint(mc_rawl_tree, hf_erf_mc_rawl_res2, tvb, 0, 0, mc_rawl->byte3); - proto_tree_add_uint(mc_rawl_tree, hf_erf_mc_rawl_lbe, tvb, 0, 0, mc_rawl->byte3); - proto_tree_add_uint(mc_rawl_tree, hf_erf_mc_rawl_first, tvb, 0, 0, mc_rawl->byte3); - proto_tree_add_uint(mc_rawl_tree, hf_erf_mc_rawl_res3, tvb, 0, 0, mc_rawl->byte3); + proto_tree_add_uint(mc_rawl_tree, hf_erf_mc_rawl_cn, tvb, 0, 0, mc_rawl); + proto_tree_add_uint(mc_rawl_tree, hf_erf_mc_rawl_res1, tvb, 0, 0, mc_rawl); + proto_tree_add_uint(mc_rawl_tree, hf_erf_mc_rawl_lbe, tvb, 0, 0, mc_rawl); + proto_tree_add_uint(mc_rawl_tree, hf_erf_mc_rawl_first, tvb, 0, 0, mc_rawl); + proto_tree_add_uint(mc_rawl_tree, hf_erf_mc_rawl_res2, tvb, 0, 0, mc_rawl); } } @@ -959,27 +910,27 @@ static void dissect_mc_aal5_header(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { if (tree) { - proto_item *mc_aal5_item; - proto_tree *mc_aal5_tree; - struct erf_mc_aal5_hdrx *mc_aal5; + proto_item *mc_aal5_item; + proto_tree *mc_aal5_tree; + guint32 mc_aal5; /* Multi Channel AAL5 Header */ mc_aal5_item = proto_tree_add_uint(tree, hf_erf_mc_aal5, tvb, 0, 0, pinfo->pseudo_header->erf.subhdr.mc_hdr); mc_aal5_tree = proto_item_add_subtree(mc_aal5_item, ett_erf_mc_aal5); - mc_aal5 = (struct erf_mc_aal5_hdrx *) (&pinfo->pseudo_header->erf.subhdr.mc_hdr); + mc_aal5 = pinfo->pseudo_header->erf.subhdr.mc_hdr; - proto_tree_add_uint(mc_aal5_tree, hf_erf_mc_aal5_cn, tvb, 0, 0, mc_aal5->byte01); - proto_tree_add_uint(mc_aal5_tree, hf_erf_mc_aal5_res1, tvb, 0, 0, mc_aal5->byte01); + proto_tree_add_uint(mc_aal5_tree, hf_erf_mc_aal5_cn, tvb, 0, 0, mc_aal5); + proto_tree_add_uint(mc_aal5_tree, hf_erf_mc_aal5_res1, tvb, 0, 0, mc_aal5); - proto_tree_add_uint(mc_aal5_tree, hf_erf_mc_aal5_port, tvb, 0, 0, mc_aal5->byte2); - proto_tree_add_uint(mc_aal5_tree, hf_erf_mc_aal5_crcck, tvb, 0, 0, mc_aal5->byte2); - proto_tree_add_uint(mc_aal5_tree, hf_erf_mc_aal5_crce, tvb, 0, 0, mc_aal5->byte2); - proto_tree_add_uint(mc_aal5_tree, hf_erf_mc_aal5_lenck, tvb, 0, 0, mc_aal5->byte2); - proto_tree_add_uint(mc_aal5_tree, hf_erf_mc_aal5_lene, tvb, 0, 0, mc_aal5->byte2); + proto_tree_add_uint(mc_aal5_tree, hf_erf_mc_aal5_port, tvb, 0, 0, mc_aal5); + proto_tree_add_uint(mc_aal5_tree, hf_erf_mc_aal5_crcck, tvb, 0, 0, mc_aal5); + proto_tree_add_uint(mc_aal5_tree, hf_erf_mc_aal5_crce, tvb, 0, 0, mc_aal5); + proto_tree_add_uint(mc_aal5_tree, hf_erf_mc_aal5_lenck, tvb, 0, 0, mc_aal5); + proto_tree_add_uint(mc_aal5_tree, hf_erf_mc_aal5_lene, tvb, 0, 0, mc_aal5); - proto_tree_add_uint(mc_aal5_tree, hf_erf_mc_aal5_res2, tvb, 0, 0, mc_aal5->byte3); - proto_tree_add_uint(mc_aal5_tree, hf_erf_mc_aal5_first, tvb, 0, 0, mc_aal5->byte3); - proto_tree_add_uint(mc_aal5_tree, hf_erf_mc_aal5_res3, tvb, 0, 0, mc_aal5->byte3); + proto_tree_add_uint(mc_aal5_tree, hf_erf_mc_aal5_res2, tvb, 0, 0, mc_aal5); + proto_tree_add_uint(mc_aal5_tree, hf_erf_mc_aal5_first, tvb, 0, 0, mc_aal5); + proto_tree_add_uint(mc_aal5_tree, hf_erf_mc_aal5_res3, tvb, 0, 0, mc_aal5); } } @@ -987,26 +938,26 @@ static void dissect_mc_aal2_header(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { if (tree) { - proto_item *mc_aal2_item; - proto_tree *mc_aal2_tree; - struct erf_mc_aal2_hdrx *mc_aal2; + proto_item *mc_aal2_item; + proto_tree *mc_aal2_tree; + guint32 mc_aal2; /* Multi Channel AAL2 Header */ mc_aal2_item = proto_tree_add_uint(tree, hf_erf_mc_aal2, tvb, 0, 0, pinfo->pseudo_header->erf.subhdr.mc_hdr); mc_aal2_tree = proto_item_add_subtree(mc_aal2_item, ett_erf_mc_aal2); - mc_aal2 = (struct erf_mc_aal2_hdrx *) (&pinfo->pseudo_header->erf.subhdr.mc_hdr); + mc_aal2 = pinfo->pseudo_header->erf.subhdr.mc_hdr; - proto_tree_add_uint(mc_aal2_tree, hf_erf_mc_aal2_cn, tvb, 0, 0, mc_aal2->byte01); - proto_tree_add_uint(mc_aal2_tree, hf_erf_mc_aal2_res1, tvb, 0, 0, mc_aal2->byte01); - proto_tree_add_uint(mc_aal2_tree, hf_erf_mc_aal2_res2, tvb, 0, 0, mc_aal2->byte01); + proto_tree_add_uint(mc_aal2_tree, hf_erf_mc_aal2_cn, tvb, 0, 0, mc_aal2); + proto_tree_add_uint(mc_aal2_tree, hf_erf_mc_aal2_res1, tvb, 0, 0, mc_aal2); + proto_tree_add_uint(mc_aal2_tree, hf_erf_mc_aal2_res2, tvb, 0, 0, mc_aal2); - proto_tree_add_uint(mc_aal2_tree, hf_erf_mc_aal2_port, tvb, 0, 0, mc_aal2->byte2); - proto_tree_add_uint(mc_aal2_tree, hf_erf_mc_aal2_res3, tvb, 0, 0, mc_aal2->byte2); - proto_tree_add_uint(mc_aal2_tree, hf_erf_mc_aal2_first, tvb, 0, 0, mc_aal2->byte2); - proto_tree_add_uint(mc_aal2_tree, hf_erf_mc_aal2_maale, tvb, 0, 0, mc_aal2->byte2); - proto_tree_add_uint(mc_aal2_tree, hf_erf_mc_aal2_lene, tvb, 0, 0, mc_aal2->byte2); + proto_tree_add_uint(mc_aal2_tree, hf_erf_mc_aal2_port, tvb, 0, 0, mc_aal2); + proto_tree_add_uint(mc_aal2_tree, hf_erf_mc_aal2_res3, tvb, 0, 0, mc_aal2); + proto_tree_add_uint(mc_aal2_tree, hf_erf_mc_aal2_first, tvb, 0, 0, mc_aal2); + proto_tree_add_uint(mc_aal2_tree, hf_erf_mc_aal2_maale, tvb, 0, 0, mc_aal2); + proto_tree_add_uint(mc_aal2_tree, hf_erf_mc_aal2_lene, tvb, 0, 0, mc_aal2); - proto_tree_add_uint(mc_aal2_tree, hf_erf_mc_aal2_cid, tvb, 0, 0, mc_aal2->byte3); + proto_tree_add_uint(mc_aal2_tree, hf_erf_mc_aal2_cid, tvb, 0, 0, mc_aal2); } } @@ -1014,23 +965,22 @@ static void dissect_aal2_header(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { if (tree) { - proto_item *aal2_item; - proto_tree *aal2_tree; - struct erf_aal2_hdrx *aal2; + proto_item *aal2_item; + proto_tree *aal2_tree; + guint32 aal2; /* AAL2 Header */ aal2_item = proto_tree_add_uint(tree, hf_erf_aal2, tvb, 0, 0, pinfo->pseudo_header->erf.subhdr.mc_hdr); aal2_tree = proto_item_add_subtree(aal2_item, ett_erf_aal2); - aal2 = (struct erf_aal2_hdrx*) (&pinfo->pseudo_header->erf.subhdr.mc_hdr); + aal2 = pinfo->pseudo_header->erf.subhdr.aal2_hdr; - proto_tree_add_uint(aal2_tree, hf_erf_aal2_cid, tvb, 0, 0, aal2->byte0); + proto_tree_add_uint(aal2_tree, hf_erf_aal2_cid, tvb, 0, 0, aal2); - proto_tree_add_uint(aal2_tree, hf_erf_aal2_maale, tvb, 0, 0, aal2->byte1); - - proto_tree_add_uint(aal2_tree, hf_erf_aal2_maalei, tvb, 0, 0, aal2->byte23); - proto_tree_add_uint(aal2_tree, hf_erf_aal2_first, tvb, 0, 0, aal2->byte23); - proto_tree_add_uint(aal2_tree, hf_erf_aal2_res1, tvb, 0, 0, aal2->byte23); + proto_tree_add_uint(aal2_tree, hf_erf_aal2_maale, tvb, 0, 0, aal2); + proto_tree_add_uint(aal2_tree, hf_erf_aal2_maalei, tvb, 0, 0, aal2); + proto_tree_add_uint(aal2_tree, hf_erf_aal2_first, tvb, 0, 0, aal2); + proto_tree_add_uint(aal2_tree, hf_erf_aal2_res1, tvb, 0, 0, aal2); } } @@ -1365,17 +1315,29 @@ dissect_erf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) dissect_mc_aal2_header(tvb, pinfo, erf_tree); /* + * The channel identification number is in the MC header, so it's + * in the pseudo-header, not in the packet data. + * + * We'll be overwriting the pseudo-header, so fetch it first. + * + * XXX - we should be passing a newly-constructed pseudo-header as + * an argument to the ATM dissector. + */ + aal2_cid = (pinfo->pseudo_header->erf.subhdr.mc_hdr & MC_AAL2_CID_MASK) >> MC_AAL2_CID_SHIFT; + + /* * ERF_TYPE_MC_AAL2 MC pseudoheader is not included in tvb, * and we do not supply 'dct2000' pseudoheader. */ - atm_hdr = tvb_get_ntohl(tvb, 0); - aal2_cid = ((struct erf_mc_aal2_hdrx *)(&pinfo->pseudo_header->erf.subhdr.mc_hdr))->byte3; - - /* Change wtap pseudo_header from erf to atm for atm dissector */ + /* + * Overwrite the wtap pseudo_header with an ATM pseudo-header. + * Zero it out, and fill it in. + */ memset(&pinfo->pseudo_header->atm, 0, sizeof(pinfo->pseudo_header->atm)); - /* fill in atm pseudo header */ + atm_hdr = tvb_get_ntohl(tvb, 0); + pinfo->pseudo_header->atm.aal = AAL_2; pinfo->pseudo_header->atm.flags |= ATM_AAL2_NOPHDR; pinfo->pseudo_header->atm.vpi = ((atm_hdr & 0x0ff00000) >> 20); @@ -1637,37 +1599,37 @@ proto_register_erf(void) FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, { &hf_erf_mc_hdlc_cn, { "Connection number", "erf.mchdlc.cn", - FT_UINT16, BASE_DEC, NULL, MC_HDLC_CN_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_HDLC_CN_MASK, NULL, HFILL } }, { &hf_erf_mc_hdlc_res1, { "Reserved", "erf.mchdlc.res1", - FT_UINT16, BASE_HEX, NULL, MC_HDLC_RES1_MASK, NULL, HFILL } }, + FT_UINT32, BASE_HEX, NULL, MC_HDLC_RES1_MASK, NULL, HFILL } }, { &hf_erf_mc_hdlc_res2, { "Reserved", "erf.mchdlc.res2", - FT_UINT8, BASE_HEX, NULL, MC_HDLC_RES2_MASK, NULL, HFILL } }, + FT_UINT32, BASE_HEX, NULL, MC_HDLC_RES2_MASK, NULL, HFILL } }, { &hf_erf_mc_hdlc_fcse, { "FCS error", "erf.mchdlc.fcse", - FT_UINT8, BASE_DEC, NULL, MC_HDLC_FCSE_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_HDLC_FCSE_MASK, NULL, HFILL } }, { &hf_erf_mc_hdlc_sre, { "Short record error", "erf.mchdlc.sre", - FT_UINT8, BASE_DEC, NULL, MC_HDLC_SRE_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_HDLC_SRE_MASK, NULL, HFILL } }, { &hf_erf_mc_hdlc_lre, { "Long record error", "erf.mchdlc.lre", - FT_UINT8, BASE_DEC, NULL, MC_HDLC_LRE_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_HDLC_LRE_MASK, NULL, HFILL } }, { &hf_erf_mc_hdlc_afe, { "Aborted frame error", "erf.mchdlc.afe", - FT_UINT8, BASE_DEC, NULL, MC_HDLC_AFE_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_HDLC_AFE_MASK, NULL, HFILL } }, { &hf_erf_mc_hdlc_oe, { "Octet error", "erf.mchdlc.oe", - FT_UINT8, BASE_DEC, NULL, MC_HDLC_OE_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_HDLC_OE_MASK, NULL, HFILL } }, { &hf_erf_mc_hdlc_lbe, { "Lost byte error", "erf.mchdlc.lbe", - FT_UINT8, BASE_DEC, NULL, MC_HDLC_LBE_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_HDLC_LBE_MASK, NULL, HFILL } }, { &hf_erf_mc_hdlc_first, { "First record", "erf.mchdlc.first", - FT_UINT8, BASE_DEC, NULL, MC_HDLC_FIRST_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_HDLC_FIRST_MASK, NULL, HFILL } }, { &hf_erf_mc_hdlc_res3, { "Reserved", "erf.mchdlc.res3", - FT_UINT8, BASE_HEX, NULL, MC_HDLC_RES3_MASK, NULL, HFILL } }, + FT_UINT32, BASE_HEX, NULL, MC_HDLC_RES3_MASK, NULL, HFILL } }, /* MC RAW Header */ { &hf_erf_mc_raw, @@ -1675,34 +1637,28 @@ proto_register_erf(void) FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, { &hf_erf_mc_raw_int, { "Physical interface", "erf.mcraw.int", - FT_UINT8, BASE_DEC, NULL, MC_RAW_INT_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_RAW_INT_MASK, NULL, HFILL } }, { &hf_erf_mc_raw_res1, { "Reserved", "erf.mcraw.res1", - FT_UINT8, BASE_HEX, NULL, MC_RAW_RES1_MASK, NULL, HFILL } }, - { &hf_erf_mc_raw_res2, - { "Reserved", "erf.mcraw.res2", - FT_UINT16, BASE_HEX, NULL, MC_RAW_RES2_MASK, NULL, HFILL } }, - { &hf_erf_mc_raw_res3, - { "Reserved", "erf.mcraw.res3", - FT_UINT8, BASE_HEX, NULL, MC_RAW_RES3_MASK, NULL, HFILL } }, + FT_UINT32, BASE_HEX, NULL, MC_RAW_RES1_MASK, NULL, HFILL } }, { &hf_erf_mc_raw_sre, { "Short record error", "erf.mcraw.sre", - FT_UINT8, BASE_DEC, NULL, MC_RAW_SRE_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_RAW_SRE_MASK, NULL, HFILL } }, { &hf_erf_mc_raw_lre, { "Long record error", "erf.mcraw.lre", - FT_UINT8, BASE_DEC, NULL, MC_RAW_LRE_MASK, NULL, HFILL } }, - { &hf_erf_mc_raw_res4, - { "Reserved", "erf.mcraw.res4", - FT_UINT8, BASE_HEX, NULL, MC_RAW_RES4_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_RAW_LRE_MASK, NULL, HFILL } }, + { &hf_erf_mc_raw_res2, + { "Reserved", "erf.mcraw.res2", + FT_UINT32, BASE_HEX, NULL, MC_RAW_RES2_MASK, NULL, HFILL } }, { &hf_erf_mc_raw_lbe, { "Lost byte error", "erf.mcraw.lbe", - FT_UINT8, BASE_DEC, NULL, MC_RAW_LBE_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_RAW_LBE_MASK, NULL, HFILL } }, { &hf_erf_mc_raw_first, { "First record", "erf.mcraw.first", - FT_UINT8, BASE_DEC, NULL, MC_RAW_FIRST_MASK, NULL, HFILL } }, - { &hf_erf_mc_raw_res5, - { "Reserved", "erf.mcraw.res5", - FT_UINT8, BASE_HEX, NULL, MC_RAW_RES5_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_RAW_FIRST_MASK, NULL, HFILL } }, + { &hf_erf_mc_raw_res3, + { "Reserved", "erf.mcraw.res3", + FT_UINT32, BASE_HEX, NULL, MC_RAW_RES3_MASK, NULL, HFILL } }, /* MC ATM Header */ { &hf_erf_mc_atm, @@ -1710,37 +1666,37 @@ proto_register_erf(void) FT_UINT32, BASE_HEX, NULL, 0x00, NULL, HFILL } }, { &hf_erf_mc_atm_cn, { "Connection number", "erf.mcatm.cn", - FT_UINT16, BASE_DEC, NULL, MC_ATM_CN_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_ATM_CN_MASK, NULL, HFILL } }, { &hf_erf_mc_atm_res1, { "Reserved", "erf.mcatm.res1", - FT_UINT16, BASE_HEX, NULL, MC_ATM_RES1_MASK, NULL, HFILL } }, + FT_UINT32, BASE_HEX, NULL, MC_ATM_RES1_MASK, NULL, HFILL } }, { &hf_erf_mc_atm_mul, { "Multiplexed", "erf.mcatm.mul", - FT_UINT16, BASE_DEC, NULL, MC_ATM_MUL_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_ATM_MUL_MASK, NULL, HFILL } }, { &hf_erf_mc_atm_port, { "Physical port", "erf.mcatm.port", - FT_UINT8, BASE_DEC, NULL, MC_ATM_PORT_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_ATM_PORT_MASK, NULL, HFILL } }, { &hf_erf_mc_atm_res2, { "Reserved", "erf.mcatm.res2", - FT_UINT8, BASE_HEX, NULL, MC_ATM_RES2_MASK, NULL, HFILL } }, + FT_UINT32, BASE_HEX, NULL, MC_ATM_RES2_MASK, NULL, HFILL } }, { &hf_erf_mc_atm_lbe, { "Lost Byte Error", "erf.mcatm.lbe", - FT_UINT8, BASE_DEC, NULL, MC_ATM_LBE_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_ATM_LBE_MASK, NULL, HFILL } }, { &hf_erf_mc_atm_hec, { "HEC corrected", "erf.mcatm.hec", - FT_UINT8, BASE_DEC, NULL, MC_ATM_HEC_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_ATM_HEC_MASK, NULL, HFILL } }, { &hf_erf_mc_atm_crc10, { "OAM Cell CRC10 Error (not implemented)", "erf.mcatm.crc10", - FT_UINT8, BASE_DEC, NULL, MC_ATM_CRC10_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_ATM_CRC10_MASK, NULL, HFILL } }, { &hf_erf_mc_atm_oamcell, { "OAM Cell", "erf.mcatm.oamcell", - FT_UINT8, BASE_DEC, NULL, MC_ATM_OAMCELL_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_ATM_OAMCELL_MASK, NULL, HFILL } }, { &hf_erf_mc_atm_first, { "First record", "erf.mcatm.first", - FT_UINT8, BASE_DEC, NULL, MC_ATM_FIRST_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_ATM_FIRST_MASK, NULL, HFILL } }, { &hf_erf_mc_atm_res3, { "Reserved", "erf.mcatm.res3", - FT_UINT8, BASE_HEX, NULL, MC_ATM_RES3_MASK, NULL, HFILL } }, + FT_UINT32, BASE_HEX, NULL, MC_ATM_RES3_MASK, NULL, HFILL } }, /* MC RAW Link Header */ { &hf_erf_mc_rawl, @@ -1748,19 +1704,19 @@ proto_register_erf(void) FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, { &hf_erf_mc_rawl_cn, { "Connection number", "erf.mcrawl.cn", - FT_UINT8, BASE_DEC, NULL, MC_RAWL_CN_MASK, NULL, HFILL } }, - { &hf_erf_mc_rawl_res2, - { "Reserved", "erf.mcrawl.res2", - FT_UINT8, BASE_HEX, NULL, MC_RAWL_RES2_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_RAWL_CN_MASK, NULL, HFILL } }, + { &hf_erf_mc_rawl_res1, + { "Reserved", "erf.mcrawl.res1", + FT_UINT32, BASE_HEX, NULL, MC_RAWL_RES2_MASK, NULL, HFILL } }, { &hf_erf_mc_rawl_lbe, { "Lost byte error", "erf.mcrawl.lbe", - FT_UINT8, BASE_DEC, NULL, MC_RAWL_LBE_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_RAWL_LBE_MASK, NULL, HFILL } }, { &hf_erf_mc_rawl_first, { "First record", "erf.mcrawl.first", - FT_UINT8, BASE_DEC, NULL, MC_RAWL_FIRST_MASK, NULL, HFILL } }, - { &hf_erf_mc_rawl_res3, - { "Reserved", "erf.mcrawl.res5", - FT_UINT8, BASE_HEX, NULL, MC_RAWL_RES3_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_RAWL_FIRST_MASK, NULL, HFILL } }, + { &hf_erf_mc_rawl_res2, + { "Reserved", "erf.mcrawl.res2", + FT_UINT32, BASE_HEX, NULL, MC_RAWL_RES2_MASK, NULL, HFILL } }, /* MC AAL5 Header */ { &hf_erf_mc_aal5, @@ -1768,34 +1724,34 @@ proto_register_erf(void) FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, { &hf_erf_mc_aal5_cn, { "Connection number", "erf.mcaal5.cn", - FT_UINT16, BASE_DEC, NULL, MC_AAL5_CN_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_AAL5_CN_MASK, NULL, HFILL } }, { &hf_erf_mc_aal5_res1, { "Reserved", "erf.mcaal5.res1", - FT_UINT16, BASE_HEX, NULL, MC_AAL5_RES1_MASK, NULL, HFILL } }, + FT_UINT32, BASE_HEX, NULL, MC_AAL5_RES1_MASK, NULL, HFILL } }, { &hf_erf_mc_aal5_port, { "Physical port", "erf.mcaal5.port", - FT_UINT8, BASE_DEC, NULL, MC_AAL5_PORT_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_AAL5_PORT_MASK, NULL, HFILL } }, { &hf_erf_mc_aal5_crcck, { "CRC checked", "erf.mcaal5.crcck", - FT_UINT8, BASE_DEC, NULL, MC_AAL5_CRCCK_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_AAL5_CRCCK_MASK, NULL, HFILL } }, { &hf_erf_mc_aal5_crce, { "CRC error", "erf.mcaal5.crce", - FT_UINT8, BASE_DEC, NULL, MC_AAL5_CRCE_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_AAL5_CRCE_MASK, NULL, HFILL } }, { &hf_erf_mc_aal5_lenck, { "Length checked", "erf.mcaal5.lenck", - FT_UINT8, BASE_DEC, NULL, MC_AAL5_LENCK_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_AAL5_LENCK_MASK, NULL, HFILL } }, { &hf_erf_mc_aal5_lene, { "Length error", "erf.mcaal5.lene", - FT_UINT8, BASE_DEC, NULL, MC_AAL5_LENE_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_AAL5_LENE_MASK, NULL, HFILL } }, { &hf_erf_mc_aal5_res2, { "Reserved", "erf.mcaal5.res2", - FT_UINT8, BASE_HEX, NULL, MC_AAL5_RES2_MASK, NULL, HFILL } }, + FT_UINT32, BASE_HEX, NULL, MC_AAL5_RES2_MASK, NULL, HFILL } }, { &hf_erf_mc_aal5_first, { "First record", "erf.mcaal5.first", - FT_UINT8, BASE_DEC, NULL, MC_AAL5_FIRST_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_AAL5_FIRST_MASK, NULL, HFILL } }, { &hf_erf_mc_aal5_res3, { "Reserved", "erf.mcaal5.res3", - FT_UINT8, BASE_HEX, NULL, MC_AAL5_RES3_MASK, NULL, HFILL } }, + FT_UINT32, BASE_HEX, NULL, MC_AAL5_RES3_MASK, NULL, HFILL } }, /* MC AAL2 Header */ { &hf_erf_mc_aal2, @@ -1803,31 +1759,31 @@ proto_register_erf(void) FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, { &hf_erf_mc_aal2_cn, { "Connection number", "erf.mcaal2.cn", - FT_UINT16, BASE_DEC, NULL, MC_AAL2_CN_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_AAL2_CN_MASK, NULL, HFILL } }, { &hf_erf_mc_aal2_res1, { "Reserved for extra connection", "erf.mcaal2.res1", - FT_UINT16, BASE_HEX, NULL, MC_AAL2_RES1_MASK, NULL, HFILL } }, + FT_UINT32, BASE_HEX, NULL, MC_AAL2_RES1_MASK, NULL, HFILL } }, { &hf_erf_mc_aal2_res2, { "Reserved for type", "erf.mcaal2.mul", - FT_UINT16, BASE_HEX, NULL, MC_AAL2_RES2_MASK, NULL, HFILL } }, + FT_UINT32, BASE_HEX, NULL, MC_AAL2_RES2_MASK, NULL, HFILL } }, { &hf_erf_mc_aal2_port, { "Physical port", "erf.mcaal2.port", - FT_UINT8, BASE_DEC, NULL, MC_AAL2_PORT_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_AAL2_PORT_MASK, NULL, HFILL } }, { &hf_erf_mc_aal2_res3, { "Reserved", "erf.mcaal2.res2", - FT_UINT8, BASE_HEX, NULL, MC_AAL2_RES3_MASK, NULL, HFILL } }, + FT_UINT32, BASE_HEX, NULL, MC_AAL2_RES3_MASK, NULL, HFILL } }, { &hf_erf_mc_aal2_first, { "First cell received", "erf.mcaal2.lbe", - FT_UINT8, BASE_DEC, NULL, MC_AAL2_FIRST_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_AAL2_FIRST_MASK, NULL, HFILL } }, { &hf_erf_mc_aal2_maale, { "MAAL error", "erf.mcaal2.hec", - FT_UINT8, BASE_DEC, NULL, MC_AAL2_MAALE_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_AAL2_MAALE_MASK, NULL, HFILL } }, { &hf_erf_mc_aal2_lene, { "Length error", "erf.mcaal2.crc10", - FT_UINT8, BASE_DEC, NULL, MC_AAL2_LENE_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_AAL2_LENE_MASK, NULL, HFILL } }, { &hf_erf_mc_aal2_cid, { "Channel Identification Number", "erf.mcaal2.cid", - FT_UINT8, BASE_DEC, NULL, MC_AAL2_CID_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, MC_AAL2_CID_MASK, NULL, HFILL } }, /* AAL2 Header */ { &hf_erf_aal2, @@ -1835,19 +1791,19 @@ proto_register_erf(void) FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, { &hf_erf_aal2_cid, { "Channel Identification Number", "erf.aal2.cid", - FT_UINT8, BASE_DEC, NULL, AAL2_CID_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, AAL2_CID_MASK, NULL, HFILL } }, { &hf_erf_aal2_maale, { "MAAL error number", "erf.aal2.maale", - FT_UINT8, BASE_DEC, NULL, AAL2_MAALE_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, AAL2_MAALE_MASK, NULL, HFILL } }, { &hf_erf_aal2_maalei, { "MAAL error", "erf.aal2.hec", - FT_UINT16, BASE_DEC, NULL, AAL2_MAALEI_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, AAL2_MAALEI_MASK, NULL, HFILL } }, { &hf_erf_aal2_first, { "First cell received", "erf.aal2.lbe", - FT_UINT16, BASE_DEC, NULL, AAL2_FIRST_MASK, NULL, HFILL } }, + FT_UINT32, BASE_DEC, NULL, AAL2_FIRST_MASK, NULL, HFILL } }, { &hf_erf_aal2_res1, { "Reserved", "erf.aal2.res1", - FT_UINT16, BASE_HEX, NULL, AAL2_RES1_MASK, NULL, HFILL } }, + FT_UINT32, BASE_HEX, NULL, AAL2_RES1_MASK, NULL, HFILL } }, /* ETH Header */ { &hf_erf_eth, diff --git a/wiretap/erf.c b/wiretap/erf.c index 3d572e4881..bb41f3c145 100644 --- a/wiretap/erf.c +++ b/wiretap/erf.c @@ -339,6 +339,7 @@ static gboolean erf_read_header(FILE_T fh, { union wtap_pseudo_header *pseudo_header = &phdr->pseudo_header; guint32 mc_hdr; + guint32 aal2_hdr; guint8 erf_exhdr[8]; guint64 erf_exhdr_sw; guint8 type = 0; @@ -463,7 +464,6 @@ static gboolean erf_read_header(FILE_T fh, case ERF_TYPE_MC_AAL5: case ERF_TYPE_MC_AAL2: case ERF_TYPE_COLOR_MC_HDLC_POS: - case ERF_TYPE_AAL2: /* not an MC type but has a similar 'AAL2 ext' header */ if (!wtap_read_bytes(fh, &mc_hdr, sizeof(mc_hdr), err, err_info)) return FALSE; if (bytes_read != NULL) @@ -473,6 +473,16 @@ static gboolean erf_read_header(FILE_T fh, pseudo_header->erf.subhdr.mc_hdr = g_ntohl(mc_hdr); break; + case ERF_TYPE_AAL2: + if (!wtap_read_bytes(fh, &aal2_hdr, sizeof(aal2_hdr), err, err_info)) + return FALSE; + if (bytes_read != NULL) + *bytes_read += (guint32)sizeof(aal2_hdr); + *packet_size -= (guint32)sizeof(aal2_hdr); + skiplen += (guint32)sizeof(aal2_hdr); + pseudo_header->erf.subhdr.aal2_hdr = g_ntohl(aal2_hdr); + break; + case ERF_TYPE_IP_COUNTER: case ERF_TYPE_TCP_FLOW_COUNTER: /* unsupported, continue with default: */ @@ -546,6 +556,10 @@ static gboolean erf_write_phdr(wtap_dumper *wdh, int encap, const union wtap_pse phtonl(&erf_subhdr[0], pseudo_header->erf.subhdr.mc_hdr); subhdr_size += (int)sizeof(struct erf_mc_hdr); break; + case ERF_TYPE_AAL2: + phtonl(&erf_subhdr[0], pseudo_header->erf.subhdr.aal2_hdr); + subhdr_size += (int)sizeof(struct erf_aal2_hdr); + break; case ERF_TYPE_ETH: case ERF_TYPE_COLOR_ETH: case ERF_TYPE_DSM_COLOR_ETH: diff --git a/wiretap/erf.h b/wiretap/erf.h index 7922f5016f..894235c7ad 100644 --- a/wiretap/erf.h +++ b/wiretap/erf.h @@ -115,6 +115,10 @@ typedef struct erf_mc_hdr { guint32 mc; } erf_mc_header_t; +typedef struct erf_aal2_hdr { + guint32 aal2; +} erf_aal2_header_t; + typedef struct erf_eth_hdr { guint16 eth; } erf_eth_header_t; diff --git a/wiretap/wtap.h b/wiretap/wtap.h index 0335607b2a..39707abc15 100644 --- a/wiretap/wtap.h +++ b/wiretap/wtap.h @@ -940,6 +940,7 @@ struct erf_mc_phdr { { guint16 eth_hdr; guint32 mc_hdr; + guint32 aal2_hdr; } subhdr; }; |