aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-dvb-s2-bb.c
diff options
context:
space:
mode:
authorMustBeArt <paul@mustbeart.com>2017-01-07 08:09:07 -0800
committerMichael Mann <mmann78@netscape.net>2017-01-13 12:50:36 +0000
commit15deb6073409ac7523b1b9ad04003b56b02e7974 (patch)
tree7e3eb6876da6db61b2135d8852bb207e7a4a9903 /epan/dissectors/packet-dvb-s2-bb.c
parentc2ddc300f35d4cf9c1a3d9088b9f2bcf4ad78645 (diff)
DVB-S2 BB: Handle GSE Padding in BB frames
GSE Padding is outside of any GSE Packet and continues to the end of the Baseband Frame, per 4.2.1 of ETSI TS 102 606-1. Added dvb-s2_gse.padding as an integer representing the length in bytes of the padding field. Change-Id: I9ed22c37a1969059a09ba44d9e3473cb9d0a1880 Reviewed-on: https://code.wireshark.org/review/19579 Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com> Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'epan/dissectors/packet-dvb-s2-bb.c')
-rw-r--r--epan/dissectors/packet-dvb-s2-bb.c54
1 files changed, 34 insertions, 20 deletions
diff --git a/epan/dissectors/packet-dvb-s2-bb.c b/epan/dissectors/packet-dvb-s2-bb.c
index 04d1abb28b..890cea890f 100644
--- a/epan/dissectors/packet-dvb-s2-bb.c
+++ b/epan/dissectors/packet-dvb-s2-bb.c
@@ -104,6 +104,7 @@ static int hf_dvb_s2_gse_hdr_start = -1;
static int hf_dvb_s2_gse_hdr_stop = -1;
static int hf_dvb_s2_gse_hdr_labeltype = -1;
static int hf_dvb_s2_gse_hdr_length = -1;
+static int hf_dvb_s2_gse_padding = -1;
static int hf_dvb_s2_gse_proto = -1;
static int hf_dvb_s2_gse_label6 = -1;
static int hf_dvb_s2_gse_label3 = -1;
@@ -559,42 +560,50 @@ static guint8 compute_crc8(tvbuff_t *p, guint8 len, guint8 offset)
}
/* *** Code to actually dissect the packets *** */
-static int dissect_dvb_s2_gse(tvbuff_t *tvb, int cur_off, proto_tree *tree, packet_info *pinfo)
+static int dissect_dvb_s2_gse(tvbuff_t *tvb, int cur_off, proto_tree *tree, packet_info *pinfo, int bytes_available)
{
int new_off = 0;
int frag_len;
- guint16 gse_hdr, data_len, gse_proto = 0;
+ guint16 gse_hdr, data_len, padding_len, gse_proto = 0;
proto_item *ti, *tf;
proto_tree *dvb_s2_gse_tree, *dvb_s2_gse_hdr_tree;
tvbuff_t *next_tvb;
- col_append_str(pinfo->cinfo, COL_INFO, "GSE");
+ col_append_str(pinfo->cinfo, COL_INFO, " GSE");
- /* get header and determine length */
+ /* get the GSE header */
gse_hdr = tvb_get_ntohs(tvb, cur_off + DVB_S2_GSE_OFFS_HDR);
- new_off += 2;
- frag_len = (gse_hdr & DVB_S2_GSE_HDR_LENGTH_MASK)+2;
-
- ti = proto_tree_add_item(tree, proto_dvb_s2_gse, tvb, cur_off, frag_len, ENC_NA);
- dvb_s2_gse_tree = proto_item_add_subtree(ti, ett_dvb_s2_gse);
-
- tf = proto_tree_add_item(dvb_s2_gse_tree, hf_dvb_s2_gse_hdr, tvb, cur_off + DVB_S2_GSE_OFFS_HDR, 2, gse_hdr);
-
- dvb_s2_gse_hdr_tree = proto_item_add_subtree(tf, ett_dvb_s2_gse_hdr);
- proto_tree_add_item(dvb_s2_gse_hdr_tree, hf_dvb_s2_gse_hdr_start, tvb, cur_off + DVB_S2_GSE_OFFS_HDR, 2, ENC_BIG_ENDIAN);
- proto_tree_add_item(dvb_s2_gse_hdr_tree, hf_dvb_s2_gse_hdr_stop, tvb, cur_off + DVB_S2_GSE_OFFS_HDR, 2, ENC_BIG_ENDIAN);
- proto_tree_add_item(dvb_s2_gse_hdr_tree, hf_dvb_s2_gse_hdr_labeltype, tvb,
- cur_off + DVB_S2_GSE_OFFS_HDR, 2, ENC_BIG_ENDIAN);
- proto_tree_add_item(dvb_s2_gse_hdr_tree, hf_dvb_s2_gse_hdr_length, tvb, cur_off + DVB_S2_GSE_OFFS_HDR, 2, ENC_BIG_ENDIAN);
+ /* check if this is just padding, which takes up the rest of the frame */
if (BIT_IS_CLEAR(gse_hdr, DVB_S2_GSE_HDR_START_POS) &&
BIT_IS_CLEAR(gse_hdr, DVB_S2_GSE_HDR_STOP_POS) &&
BIT_IS_CLEAR(gse_hdr, DVB_S2_GSE_HDR_LABELTYPE_POS1) && BIT_IS_CLEAR(gse_hdr, DVB_S2_GSE_HDR_LABELTYPE_POS2)) {
- col_append_str(pinfo->cinfo, COL_INFO, " ");
+
+ padding_len = bytes_available;
+ proto_tree_add_uint_format(tree, hf_dvb_s2_gse_padding, tvb, cur_off + new_off, padding_len, padding_len,
+ "DVB-S2 GSE Padding, Length: %d", padding_len);
+ col_append_str(pinfo->cinfo, COL_INFO, " pad");
+ new_off += padding_len;
+
return new_off;
} else {
+ /* Not padding, parse as a GSE Header */
+ new_off += 2;
+ frag_len = (gse_hdr & DVB_S2_GSE_HDR_LENGTH_MASK)+2;
+ ti = proto_tree_add_item(tree, proto_dvb_s2_gse, tvb, cur_off, frag_len, ENC_NA);
+ dvb_s2_gse_tree = proto_item_add_subtree(ti, ett_dvb_s2_gse);
+
+ tf = proto_tree_add_item(dvb_s2_gse_tree, hf_dvb_s2_gse_hdr, tvb, cur_off + DVB_S2_GSE_OFFS_HDR, 2, gse_hdr);
+
+ dvb_s2_gse_hdr_tree = proto_item_add_subtree(tf, ett_dvb_s2_gse_hdr);
+ proto_tree_add_item(dvb_s2_gse_hdr_tree, hf_dvb_s2_gse_hdr_start, tvb, cur_off + DVB_S2_GSE_OFFS_HDR, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(dvb_s2_gse_hdr_tree, hf_dvb_s2_gse_hdr_stop, tvb, cur_off + DVB_S2_GSE_OFFS_HDR, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(dvb_s2_gse_hdr_tree, hf_dvb_s2_gse_hdr_labeltype, tvb,
+ cur_off + DVB_S2_GSE_OFFS_HDR, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(dvb_s2_gse_hdr_tree, hf_dvb_s2_gse_hdr_length, tvb, cur_off + DVB_S2_GSE_OFFS_HDR, 2, ENC_BIG_ENDIAN);
+
if (BIT_IS_CLEAR(gse_hdr, DVB_S2_GSE_HDR_START_POS) || BIT_IS_CLEAR(gse_hdr, DVB_S2_GSE_HDR_STOP_POS)) {
proto_tree_add_item(dvb_s2_gse_tree, hf_dvb_s2_gse_fragid, tvb, cur_off + new_off, 1, ENC_BIG_ENDIAN);
@@ -790,7 +799,7 @@ static int dissect_dvb_s2_bb(tvbuff_t *tvb, int cur_off, proto_tree *tree, packe
while (bb_data_len) {
/* start DVB-GSE dissector */
- sub_dissected = dissect_dvb_s2_gse(tvb, cur_off + new_off, tree, pinfo);
+ sub_dissected = dissect_dvb_s2_gse(tvb, cur_off + new_off, tree, pinfo, bb_data_len);
new_off += sub_dissected;
if ((sub_dissected <= bb_data_len) && (sub_dissected >= DVB_S2_GSE_MINSIZE)) {
@@ -1026,6 +1035,11 @@ void proto_register_dvb_s2_modeadapt(void)
FT_UINT16, BASE_DEC, NULL, DVB_S2_GSE_HDR_LENGTH_MASK,
"GSE Length", HFILL}
},
+ {&hf_dvb_s2_gse_padding, {
+ "GSE Padding", "dvb-s2_gse.padding",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "GSE Padding Bytes", HFILL}
+ },
{&hf_dvb_s2_gse_proto, {
"Protocol", "dvb-s2_gse.proto",
FT_UINT16, BASE_HEX | BASE_RANGE_STRING, RVALS(gse_proto_str), 0x0,