aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-mp2t.c
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2012-03-16 11:51:00 +0000
committerAnders Broman <anders.broman@ericsson.com>2012-03-16 11:51:00 +0000
commite4403efbdb8611ea60f159ec38026fffe15a4b4a (patch)
treed5a42182a98a12b4fd96d7db9afb5254b43cbad0 /epan/dissectors/packet-mp2t.c
parent931acaff3ec9231865a826bf8b0da281479d85fa (diff)
From Guy Martin:
Fix a few bugs in packet-mp2t https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=6959 svn path=/trunk/; revision=41597
Diffstat (limited to 'epan/dissectors/packet-mp2t.c')
-rw-r--r--epan/dissectors/packet-mp2t.c31
1 files changed, 16 insertions, 15 deletions
diff --git a/epan/dissectors/packet-mp2t.c b/epan/dissectors/packet-mp2t.c
index 347bbae35b..50d8cd7115 100644
--- a/epan/dissectors/packet-mp2t.c
+++ b/epan/dissectors/packet-mp2t.c
@@ -190,11 +190,13 @@ static const value_string mp2t_pid_vals[] = {
{ 0, NULL }
};
+
+/* Values below according ETSI ETR 289 */
static const value_string mp2t_tsc_vals[] = {
{ 0, "Not scrambled" },
- { 1, "User-defined" },
- { 2, "User-defined" },
- { 3, "User-defined" },
+ { 1, "Reserved" },
+ { 2, "Packet scrambled with Even Key" },
+ { 3, "Packet scrambled with Odd Key" },
{ 0, NULL }
};
@@ -503,9 +505,9 @@ mp2t_get_packet_length(tvbuff_t *tvb, guint offset, packet_info *pinfo,
pkt_len = tvb_get_ntohs(len_tvb, offset + 2) + 6;
break;
case pid_pload_pes:
- pkt_len = tvb_get_ntohs(len_tvb, offset + 3);
+ pkt_len = tvb_get_ntohs(len_tvb, offset + 4);
if (pkt_len) /* A size of 0 means size not bounded */
- pkt_len += 2;
+ pkt_len += 6;
break;
case pid_pload_sect:
pkt_len = (tvb_get_ntohs(len_tvb, offset + 1) & 0xFFF) + 3;
@@ -778,7 +780,7 @@ mp2t_process_fragmented_payload(tvbuff_t *tvb, gint offset, guint remaining_len,
/* There are remaining bytes. Add them to the fragment list */
- if (frag_cur_pos + remaining_len >= frag_tot_len) {
+ if ((frag_tot_len && frag_cur_pos + remaining_len >= frag_tot_len) || (!frag_tot_len && pusi_flag)) {
mp2t_fragment_handle(tvb, offset, pinfo, tree, frag_id, frag_cur_pos, remaining_len, TRUE, pid_analysis->pload_type);
frag_id++;
fragmentation = FALSE;
@@ -965,7 +967,7 @@ dissect_tsp(tvbuff_t *tvb, volatile gint offset, packet_info *pinfo,
guint32 cc;
guint32 pusi_flag;
- /* guint8 pointer; */
+ guint32 tsc;
proto_item *ti = NULL;
proto_item *hi = NULL;
@@ -983,6 +985,7 @@ dissect_tsp(tvbuff_t *tvb, volatile gint offset, packet_info *pinfo,
pid = (header & MP2T_PID_MASK) >> MP2T_PID_SHIFT;
cc = (header & MP2T_CC_MASK) >> MP2T_CC_SHIFT;
+ tsc = (header & MP2T_TSC_MASK);
pusi_flag = (header & 0x00400000);
proto_item_append_text(ti, " PID=0x%x CC=%d", pid, cc);
col_set_str(pinfo->cinfo, COL_PROTOCOL, "MPEG TS");
@@ -999,12 +1002,6 @@ dissect_tsp(tvbuff_t *tvb, volatile gint offset, packet_info *pinfo,
afci = proto_tree_add_item( mp2t_header_tree, hf_mp2t_afc, tvb, offset, 4, ENC_BIG_ENDIAN);
proto_tree_add_item( mp2t_header_tree, hf_mp2t_cc, tvb, offset, 4, ENC_BIG_ENDIAN);
-
- /*
- if (pusi_flag)
- pointer = tvb_get_guint8(tvb, offset);
- */
-
afc = (header & MP2T_AFC_MASK) >> MP2T_AFC_SHIFT;
pid_analysis = get_pid_analysis(pid, conv);
@@ -1021,7 +1018,6 @@ dissect_tsp(tvbuff_t *tvb, volatile gint offset, packet_info *pinfo,
if (pid_analysis->pload_type == pid_pload_docsis && afc) {
/* DOCSIS packets should not have an adaptation field */
proto_item_append_text(afci, " (Invalid for DOCSIS packets, should be 0)");
- return;
}
if (pid_analysis->pload_type == pid_pload_null) {
@@ -1237,7 +1233,12 @@ dissect_tsp(tvbuff_t *tvb, volatile gint offset, packet_info *pinfo,
offset += payload_len;
}
- mp2t_process_fragmented_payload(tvb, offset, payload_len, pinfo, tree, mp2t_tree, pusi_flag, pid_analysis);
+ if (!tsc) {
+ mp2t_process_fragmented_payload(tvb, offset, payload_len, pinfo, tree, mp2t_tree, pusi_flag, pid_analysis);
+ } else {
+ /* Payload is scrambled */
+ col_set_str(pinfo->cinfo, COL_INFO, "Scrambled TS payload");
+ }
return;
}