Coverage Report

Created: 2026-01-02 06:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wireshark/epan/dissectors/packet-dvb-sdt.c
Line
Count
Source
1
/* packet-mpeg-sdt.c
2
 * Routines for DVB (ETSI EN 300 468) Servide Description Table (SDT) dissection
3
 * Copyright 2012, Guy Martin <gmsoft@tuxicoman.be>
4
 *
5
 * Wireshark - Network traffic analyzer
6
 * By Gerald Combs <gerald@wireshark.org>
7
 * Copyright 1998 Gerald Combs
8
 *
9
 * SPDX-License-Identifier: GPL-2.0-or-later
10
 */
11
12
#include "config.h"
13
14
#include <epan/packet.h>
15
#include <epan/tfs.h>
16
#include "packet-mpeg-sect.h"
17
#include "packet-mpeg-descriptor.h"
18
19
void proto_register_dvb_sdt(void);
20
void proto_reg_handoff_dvb_sdt(void);
21
22
static dissector_handle_t dvb_sdt_handle;
23
24
static int proto_dvb_sdt;
25
static int hf_dvb_sdt_transport_stream_id;
26
static int hf_dvb_sdt_reserved1;
27
static int hf_dvb_sdt_version_number;
28
static int hf_dvb_sdt_current_next_indicator;
29
static int hf_dvb_sdt_section_number;
30
static int hf_dvb_sdt_last_section_number;
31
32
static int hf_dvb_sdt_original_network_id;
33
static int hf_dvb_sdt_reserved2;
34
35
static int hf_dvb_sdt_service_id;
36
static int hf_dvb_sdt_reserved3;
37
static int hf_dvb_sdt_eit_schedule_flag;
38
static int hf_dvb_sdt_eit_present_following_flag;
39
static int hf_dvb_sdt_running_status;
40
static int hf_dvb_sdt_free_ca_mode;
41
static int hf_dvb_sdt_descriptors_loop_length;
42
43
static int ett_dvb_sdt;
44
static int ett_dvb_sdt_service;
45
46
14
#define DVB_SDT_RESERVED1_MASK                  0xC0
47
14
#define DVB_SDT_VERSION_NUMBER_MASK             0x3E
48
14
#define DVB_SDT_CURRENT_NEXT_INDICATOR_MASK     0x01
49
50
14
#define DVB_SDT_RESERVED3_MASK                  0xFC
51
14
#define DVB_SDT_EIT_SCHEDULE_FLAG_MASK          0x02
52
14
#define DVB_SDT_EIT_PRESENT_FOLLOWING_FLAG_MASK 0x01
53
54
14
#define DVB_SDT_RUNNING_STATUS_MASK             0xE000
55
14
#define DVB_SDT_FREE_CA_MODE_MASK               0x1000
56
39
#define DVB_SDT_DESCRIPTORS_LOOP_LENGTH_MASK    0x0FFF
57
58
static const value_string dvb_sdt_running_status_vals[] = {
59
    { 0, "Undefined" },
60
    { 1, "Not Running" },
61
    { 2, "Starts in a few seconds" },
62
    { 3, "Pausing" },
63
    { 4, "Running" },
64
    { 5, "Service off-air" },
65
66
    { 0, NULL }
67
};
68
69
static const value_string dvb_sdt_free_ca_mode_vals[] = {
70
    { 0, "Not Scrambled" },
71
    { 1, "One or more component scrambled" },
72
73
    { 0, NULL }
74
};
75
76
static int
77
dissect_dvb_sdt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
78
22
{
79
80
22
    unsigned    offset = 0, length = 0;
81
22
    unsigned    descriptor_len;
82
22
    uint16_t    svc_id;
83
84
22
    proto_item *ti;
85
22
    proto_tree *dvb_sdt_tree;
86
22
    proto_tree *dvb_sdt_service_tree;
87
88
    /* The TVB should start right after the section_length in the Section packet */
89
90
22
    col_set_str(pinfo->cinfo, COL_INFO, "Service Description Table (SDT)");
91
92
22
    ti = proto_tree_add_item(tree, proto_dvb_sdt, tvb, offset, -1, ENC_NA);
93
22
    dvb_sdt_tree = proto_item_add_subtree(ti, ett_dvb_sdt);
94
95
22
    offset += packet_mpeg_sect_header(tvb, offset, dvb_sdt_tree, &length, NULL);
96
22
    length -= 4;
97
98
22
    proto_tree_add_item(dvb_sdt_tree, hf_dvb_sdt_transport_stream_id,    tvb, offset, 2, ENC_BIG_ENDIAN);
99
22
    offset += 2;
100
101
22
    proto_tree_add_item(dvb_sdt_tree, hf_dvb_sdt_reserved1,              tvb, offset, 1, ENC_BIG_ENDIAN);
102
22
    proto_tree_add_item(dvb_sdt_tree, hf_dvb_sdt_version_number,         tvb, offset, 1, ENC_BIG_ENDIAN);
103
22
    proto_tree_add_item(dvb_sdt_tree, hf_dvb_sdt_current_next_indicator, tvb, offset, 1, ENC_BIG_ENDIAN);
104
22
    offset += 1;
105
106
22
    proto_tree_add_item(dvb_sdt_tree, hf_dvb_sdt_section_number,         tvb, offset, 1, ENC_BIG_ENDIAN);
107
22
    offset += 1;
108
109
22
    proto_tree_add_item(dvb_sdt_tree, hf_dvb_sdt_last_section_number,    tvb, offset, 1, ENC_BIG_ENDIAN);
110
22
    offset += 1;
111
112
22
    proto_tree_add_item(dvb_sdt_tree, hf_dvb_sdt_original_network_id,    tvb, offset, 2, ENC_BIG_ENDIAN);
113
22
    offset += 2;
114
115
22
    proto_tree_add_item(dvb_sdt_tree, hf_dvb_sdt_reserved2,              tvb, offset, 1, ENC_BIG_ENDIAN);
116
22
    offset += 1;
117
118
119
22
    if (offset >= length)
120
0
        return offset;
121
122
    /* Parse all the services */
123
47
    while (offset < length) {
124
125
25
        svc_id = tvb_get_ntohs(tvb, offset);
126
25
        dvb_sdt_service_tree = proto_tree_add_subtree_format(dvb_sdt_tree, tvb, offset, 5,
127
25
                    ett_dvb_sdt_service, NULL, "Service 0x%04hx", svc_id);
128
129
25
        proto_tree_add_item(dvb_sdt_service_tree, hf_dvb_sdt_service_id,                 tvb, offset, 2, ENC_BIG_ENDIAN);
130
25
        offset += 2;
131
132
25
        proto_tree_add_item(dvb_sdt_service_tree, hf_dvb_sdt_reserved3,                  tvb, offset, 1, ENC_BIG_ENDIAN);
133
25
        proto_tree_add_item(dvb_sdt_service_tree, hf_dvb_sdt_eit_schedule_flag,          tvb, offset, 1, ENC_BIG_ENDIAN);
134
25
        proto_tree_add_item(dvb_sdt_service_tree, hf_dvb_sdt_eit_present_following_flag, tvb, offset, 1, ENC_BIG_ENDIAN);
135
25
        offset += 1;
136
137
25
        proto_tree_add_item(dvb_sdt_service_tree, hf_dvb_sdt_running_status,             tvb, offset, 2, ENC_BIG_ENDIAN);
138
25
        proto_tree_add_item(dvb_sdt_service_tree, hf_dvb_sdt_free_ca_mode,               tvb, offset, 2, ENC_BIG_ENDIAN);
139
25
        proto_tree_add_item(dvb_sdt_service_tree, hf_dvb_sdt_descriptors_loop_length,    tvb, offset, 2, ENC_BIG_ENDIAN);
140
25
        descriptor_len = tvb_get_ntohs(tvb, offset) & DVB_SDT_DESCRIPTORS_LOOP_LENGTH_MASK;
141
25
        offset += 2;
142
143
25
        offset += proto_mpeg_descriptor_loop_dissect(tvb, pinfo, offset, descriptor_len, dvb_sdt_service_tree);
144
25
    }
145
146
22
    offset += packet_mpeg_sect_crc(tvb, pinfo, dvb_sdt_tree, 0, offset);
147
22
    proto_item_set_len(ti, offset);
148
22
    return tvb_captured_length(tvb);
149
22
}
150
151
152
void
153
proto_register_dvb_sdt(void)
154
14
{
155
156
14
    static hf_register_info hf[] = {
157
158
14
        { &hf_dvb_sdt_transport_stream_id, {
159
14
            "Transport Stream ID", "dvb_sdt.tsid",
160
14
            FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL
161
14
        } },
162
163
14
        { &hf_dvb_sdt_reserved1, {
164
14
            "Reserved", "dvb_sdt.reserved1",
165
14
            FT_UINT8, BASE_HEX, NULL, DVB_SDT_RESERVED1_MASK, NULL, HFILL
166
14
        } },
167
168
14
        { &hf_dvb_sdt_version_number, {
169
14
            "Version Number", "dvb_sdt.version",
170
14
            FT_UINT8, BASE_HEX, NULL, DVB_SDT_VERSION_NUMBER_MASK, NULL, HFILL
171
14
        } },
172
173
14
        { &hf_dvb_sdt_current_next_indicator, {
174
14
            "Current/Next Indicator", "dvb_sdt.cur_next_ind",
175
14
            FT_BOOLEAN, 8, TFS(&tfs_current_not_yet), DVB_SDT_CURRENT_NEXT_INDICATOR_MASK, NULL, HFILL
176
14
        } },
177
178
14
        { &hf_dvb_sdt_section_number, {
179
14
            "Section Number", "dvb_sdt.sect_num",
180
14
            FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL
181
14
        } },
182
183
14
        { &hf_dvb_sdt_last_section_number, {
184
14
            "Last Section Number", "dvb_sdt.last_sect_num",
185
14
            FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL
186
14
        } },
187
188
14
        { &hf_dvb_sdt_original_network_id, {
189
14
            "Original Network ID", "dvb_sdt.original_nid",
190
14
            FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL
191
14
        } },
192
193
14
        { &hf_dvb_sdt_reserved2, {
194
14
            "Reserved", "dvb_sdt.reserved2",
195
14
            FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL
196
14
        } },
197
198
199
14
        { &hf_dvb_sdt_service_id, {
200
14
            "Service ID", "dvb_sdt.svc.id",
201
14
            FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL
202
14
        } },
203
204
14
        { &hf_dvb_sdt_reserved3, {
205
14
            "Reserved", "dvb_sdt.svc.reserved",
206
14
            FT_UINT8, BASE_HEX, NULL, DVB_SDT_RESERVED3_MASK, NULL, HFILL
207
14
        } },
208
209
14
        { &hf_dvb_sdt_eit_schedule_flag, {
210
14
            "EIT Schedule Flag", "dvb_sdt.svc.eit_schedule_flag",
211
14
            FT_UINT8, BASE_DEC, NULL, DVB_SDT_EIT_SCHEDULE_FLAG_MASK, NULL, HFILL
212
14
        } },
213
214
14
        { &hf_dvb_sdt_eit_present_following_flag, {
215
14
            "EIT Present Following Flag", "dvb_sdt.svc.eit_present_following_flag",
216
14
            FT_UINT8, BASE_DEC, NULL, DVB_SDT_EIT_PRESENT_FOLLOWING_FLAG_MASK, NULL, HFILL
217
14
        } },
218
219
14
        { &hf_dvb_sdt_running_status, {
220
14
            "Running Status", "dvb_sdt.svc.running_status",
221
14
            FT_UINT16, BASE_HEX, VALS(dvb_sdt_running_status_vals), DVB_SDT_RUNNING_STATUS_MASK, NULL, HFILL
222
14
        } },
223
224
14
        { &hf_dvb_sdt_free_ca_mode, {
225
14
            "Free CA Mode", "dvb_sdt.svc.free_ca_mode",
226
14
            FT_UINT16, BASE_HEX, VALS(dvb_sdt_free_ca_mode_vals), DVB_SDT_FREE_CA_MODE_MASK, NULL, HFILL
227
14
        } },
228
229
14
        { &hf_dvb_sdt_descriptors_loop_length, {
230
14
            "Descriptors Loop Length", "dvb_sdt.svc.descr_loop_len",
231
14
            FT_UINT16, BASE_DEC, NULL, DVB_SDT_DESCRIPTORS_LOOP_LENGTH_MASK, NULL, HFILL
232
14
        } }
233
234
14
    };
235
236
14
    static int *ett[] = {
237
14
        &ett_dvb_sdt,
238
14
        &ett_dvb_sdt_service
239
14
    };
240
241
14
    proto_dvb_sdt = proto_register_protocol("DVB Service Description Table", "DVB SDT", "dvb_sdt");
242
243
14
    proto_register_field_array(proto_dvb_sdt, hf, array_length(hf));
244
14
    proto_register_subtree_array(ett, array_length(ett));
245
246
14
    dvb_sdt_handle = register_dissector("dvb_sdt", dissect_dvb_sdt, proto_dvb_sdt);
247
14
}
248
249
250
void proto_reg_handoff_dvb_sdt(void)
251
14
{
252
14
    dissector_add_uint("mpeg_sect.tid", DVB_SDT_TID_ACTUAL, dvb_sdt_handle);
253
14
    dissector_add_uint("mpeg_sect.tid", DVB_SDT_TID_OTHER, dvb_sdt_handle);
254
14
}
255
256
257
/*
258
 * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
259
 *
260
 * Local variables:
261
 * c-basic-offset: 4
262
 * tab-width: 8
263
 * indent-tabs-mode: nil
264
 * End:
265
 *
266
 * vi: set shiftwidth=4 tabstop=8 expandtab:
267
 * :indentSize=4:tabSize=8:noTabs=true:
268
 */