Coverage Report

Created: 2026-05-14 06:28

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wireshark/epan/dissectors/packet-rtcp.c
Line
Count
Source
1
/* packet-rtcp.c
2
 *
3
 * Routines for RTCP dissection
4
 * RTCP = Real-time Transport Control Protocol
5
 *
6
 * Copyright 2000, Philips Electronics N.V.
7
 * Written by Andreas Sikkema <h323@ramdyne.nl>
8
 *
9
 * Copyright 2004, Anders Broman <anders.broman@ericsson.com>
10
 *
11
 * Copyright 2005, Nagarjuna Venna <nvenna@brixnet.com>
12
 *
13
 * Copyright 2010, Matteo Valdina <zanfire@gmail.com>
14
 *
15
 * Wireshark - Network traffic analyzer
16
 * By Gerald Combs <gerald@wireshark.org>
17
 * Copyright 1998 Gerald Combs
18
 *
19
 * SPDX-License-Identifier: GPL-2.0-or-later
20
 */
21
22
/*
23
 * This dissector tries to dissect the RTCP protocol according to Annex A
24
 * of ITU-T Recommendation H.225.0 (02/98) and RFC 3550 (obsoleting 1889).
25
 * H.225.0 literally copies RFC 1889, but omitting a few sections.
26
 *
27
 * RTCP traffic is traditionally handled by an uneven UDP portnumber. This
28
 * can be any port number, but there is a registered port available, port 5005
29
 * See Annex B of ITU-T Recommendation H.225.0, section B.7
30
 *
31
 * Note that nowadays RTP and RTCP are often multiplexed onto a single port,
32
 * per RFC 5671.
33
 *
34
 * Information on PoC can be found from
35
 *    https://www.omaspecworks.org (OMA SpecWorks, formerly the Open
36
 *    Mobile Alliance - http://www.openmobilealliance.org/)
37
 *
38
 * RTCP XR is specified in RFC 3611.
39
 *
40
 * See also https://www.iana.org/assignments/rtp-parameters
41
 *
42
 * RTCP FB is specified in RFC 4585 and extended by RFC 5104
43
 *
44
 * MS-RTP: Real-time Transport Protocol (RTP) Extensions
45
 *    https://docs.microsoft.com/en-us/openspecs/office_protocols/ms-rtp
46
 */
47
48
/*
49
 * The part of this dissector for IDMS XR blocks was written by
50
 * Torsten Loebner (loebnert@googlemail.com) in the context of a graduation
51
 * project with the research organization TNO in Delft, Netherland.
52
 * The extension is based on the RTCP XR block specified in
53
 * ETSI TS 182 063 v3.5.2 Annex W (https://www.etsi.org/deliver/etsi_ts/183000_183099/183063/),
54
 * which was registered by IANA as RTCP XR Block Type 12
55
 * (https://www.iana.org/assignments/rtcp-xr-block-types/rtcp-xr-block-types.xml).
56
 */
57
58
#include "config.h"
59
60
#include <stdlib.h>
61
62
#include <epan/packet.h>
63
#include <epan/unit_strings.h>
64
65
#include <epan/conversation.h>
66
67
#include <epan/prefs.h>
68
#include <epan/expert.h>
69
#include <epan/to_str.h>
70
#include <epan/proto_data.h>
71
72
#include <wsutil/array.h>
73
#include <wsutil/ws_roundup.h>
74
#include <wsutil/ws_padding_to.h>
75
76
#include "packet-rtcp.h"
77
#include "packet-rtp.h"
78
#include "packet-gsm_a_common.h"
79
80
void proto_register_rtcp(void);
81
void proto_reg_handoff_rtcp(void);
82
83
/* Version is the first 2 bits of the first octet*/
84
122
#define RTCP_VERSION(octet) ((octet) >> 6)
85
86
/* Padding is the third bit; no need to shift, because true is any value
87
   other than 0! */
88
133
#define RTCP_PADDING(octet) ((octet) & 0x20)
89
90
/* Receiver/ Sender count is the 5 last bits  */
91
133
#define RTCP_COUNT(octet)   ((octet) & 0x1F)
92
93
/* Metric block for RTCP Congestion Control Feedback [RFC8888]
94
    0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8
95
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
96
   |R|ECN|            ATO              |
97
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   */
98
163
#define RTCP_CCFB_RECEIVED(metric_block) (((metric_block) & 0x8000) >> 15)
99
163
#define RTCP_CCFB_ECN(metric_block) (((metric_block) & 0x6000) >> 13)
100
163
#define RTCP_CCFB_ATO(metric_block) ((metric_block) & 0x1FFF)
101
102
121
#define RTCP_TRANSPORT_CC_HEADER_LENGTH   12
103
static int rtcp_padding_set = 0;
104
105
static dissector_handle_t rtcp_handle;
106
static dissector_handle_t srtcp_handle;
107
static dissector_handle_t ms_pse_handle;
108
static dissector_handle_t rtcp_rtpfb_nack_handle;
109
static dissector_handle_t rtcp_rtpfb_tmmbr_handle;
110
static dissector_handle_t rtcp_rtpfb_tmmbn_handle;
111
static dissector_handle_t rtcp_rtpfb_ccfb_handle;
112
static dissector_handle_t rtcp_rtpfb_transport_cc_handle;
113
static dissector_handle_t rtcp_rtpfb_undecoded_fci_handle;
114
115
116
/* add dissector table to permit sub-protocol registration */
117
static dissector_table_t rtcp_dissector_table;
118
static dissector_table_t rtcp_psfb_dissector_table;
119
static dissector_table_t rtcp_rtpfb_dissector_table;
120
static dissector_table_t rtcp_pse_dissector_table;
121
122
static const value_string rtcp_version_vals[] =
123
{
124
    { 2, "RFC 1889 Version" },
125
    { 0, "Old VAT Version" },
126
    { 1, "First Draft Version" },
127
    { 0, NULL },
128
};
129
130
140
#define RTCP_PT_MIN  192
131
/* Supplemental H.261 specific RTCP packet types according to Section C.3.5 */
132
10
#define RTCP_FIR     192
133
2
#define RTCP_NACK    193
134
#define RTCP_SMPTETC 194
135
#define RTCP_IJ      195
136
/* RTCP packet types according to Section A.11.1 */
137
/* And https://www.iana.org/assignments/rtp-parameters/rtp-parameters.xhtml */
138
287
#define RTCP_SR      200
139
265
#define RTCP_RR      201
140
4
#define RTCP_SDES    202
141
254
#define RTCP_BYE     203
142
250
#define RTCP_APP     204
143
322
#define RTCP_RTPFB   205
144
186
#define RTCP_PSFB    206
145
208
#define RTCP_XR      207
146
1
#define RTCP_AVB     208
147
1
#define RTCP_RSI     209
148
0
#define RTCP_TOKEN   210
149
150
136
#define RTCP_PT_MAX  210
151
152
static const value_string rtcp_packet_type_vals[] =
153
{
154
    { RTCP_SR,      "Sender Report" },
155
    { RTCP_RR,      "Receiver Report" },
156
    { RTCP_SDES,    "Source description" },
157
    { RTCP_BYE,     "Goodbye" },
158
    { RTCP_APP,     "Application specific" },
159
    { RTCP_RTPFB,   "Generic RTP Feedback" },
160
    { RTCP_PSFB,    "Payload-specific Feedback" },
161
    { RTCP_XR,      "Extended report (RFC 3611)"},
162
    { RTCP_AVB,     "AVB RTCP packet (IEEE1733)" },
163
    { RTCP_RSI,     "Receiver Summary Information" },
164
    { RTCP_TOKEN,   "Port Mapping" },
165
    { RTCP_FIR,     "Full Intra-frame Request (H.261)" },
166
    { RTCP_NACK,    "Negative Acknowledgement (H.261)" },
167
    { RTCP_SMPTETC, "SMPTE time-code mapping" },
168
    { RTCP_IJ,      "Extended inter-arrival jitter report" },
169
    { 0,         NULL }
170
};
171
172
/* RTCP SDES types (Section A.11.2) */
173
7
#define RTCP_SDES_END         0
174
0
#define RTCP_SDES_CNAME       1
175
0
#define RTCP_SDES_NAME        2
176
#define RTCP_SDES_EMAIL       3
177
#define RTCP_SDES_PHONE       4
178
#define RTCP_SDES_LOC         5
179
#define RTCP_SDES_TOOL        6
180
#define RTCP_SDES_NOTE        7
181
3
#define RTCP_SDES_PRIV        8
182
#define RTCP_SDES_H323_CADDR  9
183
#define RTCP_SDES_APSI       10
184
185
static const value_string rtcp_sdes_type_vals[] =
186
{
187
    { RTCP_SDES_END,        "END" },
188
    { RTCP_SDES_CNAME,      "CNAME (user and domain)" },
189
    { RTCP_SDES_NAME,       "NAME (common name)" },
190
    { RTCP_SDES_EMAIL,      "EMAIL (e-mail address)" },
191
    { RTCP_SDES_PHONE,      "PHONE (phone number)" },
192
    { RTCP_SDES_LOC,        "LOC (geographic location)" },
193
    { RTCP_SDES_TOOL,       "TOOL (name/version of source app)" },
194
    { RTCP_SDES_NOTE,       "NOTE (note about source)" },
195
    { RTCP_SDES_PRIV,       "PRIV (private extensions)" },
196
    { RTCP_SDES_H323_CADDR, "H323-CADDR (H.323 callable address)" },
197
    { RTCP_SDES_APSI,       "Application Specific Identifier" },
198
    { 0,               NULL }
199
};
200
201
/* RTCP XR Blocks (Section 4, RTC 3611)
202
 * or https://www.iana.org/assignments/rtcp-xr-block-types */
203
10
#define RTCP_XR_LOSS_RLE     1
204
16
#define RTCP_XR_DUP_RLE      2
205
10
#define RTCP_XR_PKT_RXTIMES  3
206
2
#define RTCP_XR_REF_TIME     4
207
1
#define RTCP_XR_DLRR         5
208
3
#define RTCP_XR_STATS_SUMRY  6
209
0
#define RTCP_XR_VOIP_METRCS  7
210
6
#define RTCP_XR_BT_XNQ       8
211
#define RTCP_XR_TI_VOIP      9
212
#define RTCP_XR_PR_LOSS_RLE 10
213
#define RTCP_XR_MC_ACQ      11
214
2
#define RTCP_XR_IDMS        12
215
8
#define RTCP_XR_DISCARD_RLE 25
216
217
static const value_string rtcp_xr_type_vals[] =
218
{
219
    { RTCP_XR_LOSS_RLE,     "Loss Run Length Encoding Report Block" },
220
    { RTCP_XR_DUP_RLE,      "Duplicate Run Length Encoding Report Block" },
221
    { RTCP_XR_PKT_RXTIMES,  "Packet Receipt Times Report Block" },
222
    { RTCP_XR_REF_TIME,     "Receiver Reference Time Report Block" },
223
    { RTCP_XR_DLRR,         "DLRR Report Block" },
224
    { RTCP_XR_STATS_SUMRY,  "Statistics Summary Report Block" },
225
    { RTCP_XR_VOIP_METRCS,  "VoIP Metrics Report Block" },
226
    { RTCP_XR_BT_XNQ,       "BT XNQ RTCP XR (RFC5093) Report Block" },
227
    { RTCP_XR_TI_VOIP,      "Texas Instruments Extended VoIP Quality Block" },
228
    { RTCP_XR_PR_LOSS_RLE,  "Post-repair Loss RLE Report Block" },
229
    { RTCP_XR_MC_ACQ,       "Multicast Acquisition Report Block" },
230
    { RTCP_XR_IDMS,         "Inter-destination Media Synchronization Block" }, /* [https://www.etsi.org/deliver/etsi_ts/183000_183099/183063/][ETSI 183 063][Miguel_Angel_Reina_Ortega] */
231
    { RTCP_XR_DISCARD_RLE,  "Discard Run Length Encoding Report Block" },
232
    { 0, NULL}
233
};
234
235
/* XR VoIP Metrics Block - PLC Algorithms */
236
static const value_string rtcp_xr_plc_algo_vals[] =
237
{
238
    { 0, "Unspecified" },
239
    { 1, "Disabled" },
240
    { 2, "Enhanced" },
241
    { 3, "Standard" },
242
    { 0, NULL }
243
};
244
245
/* XR VoIP Metrics Block - JB Adaptive */
246
static const value_string rtcp_xr_jb_adaptive_vals[] =
247
{
248
    { 0, "Unknown" },
249
    { 1, "Reserved" },
250
    { 2, "Non-Adaptive" },
251
    { 3, "Adaptive" },
252
    { 0, NULL }
253
};
254
255
/* XR Stats Summary Block - IP TTL or Hop Limit */
256
static const value_string rtcp_xr_ip_ttl_vals[] =
257
{
258
    { 0, "No TTL Values" },
259
    { 1, "IPv4" },
260
    { 2, "IPv6" },
261
    { 3, "Undefined" },
262
    { 0, NULL }
263
};
264
265
/* XR IDMS synchronization packet sender type */
266
static const value_string rtcp_xr_idms_spst[] =
267
{
268
    {  0, "Reserved" },
269
    {  1, "SC" },
270
    {  2, "MSAS" },
271
    {  3, "SC' INPUT" },
272
    {  4, "SC' OUTPUT" },
273
    {  5, "Reserved" },
274
    {  6, "Reserved" },
275
    {  7, "Reserved" },
276
    {  8, "Reserved" },
277
    {  9, "Reserved" },
278
    { 10, "Reserved" },
279
    { 11, "Reserved" },
280
    { 12, "Reserved" },
281
    { 13, "Reserved" },
282
    { 14, "Reserved" },
283
    { 15, "Reserved" },
284
    { 0, NULL }
285
};
286
287
//3GPP TS 24.380 version 18.6.0 Release 18
288
//8.3.3.3 MCPTT Session Identity field
289
static const value_string mcpc_session_type[] =
290
{
291
    { 0, "No type" },
292
    { 1, "Private" },
293
    { 3, "Prearranged" },
294
    { 4, "Chat" },
295
    { 0, NULL }
296
};
297
298
// 3GPP TS 24.380 version 18.6.0 Release 18
299
// 8.3.3.6 Answer State field
300
static const value_string  mcpc_answer_state[] =
301
{
302
    { 0, "Unconfirmed" },
303
    { 1, "Confirmed" },
304
    { 0, NULL }
305
};
306
307
/* RTCP Application PoC1 Value strings
308
 * OMA-TS-PoC-UserPlane-V1_0-20060609-A
309
 */
310
311
0
#define TBCP_BURST_REQUEST                  0
312
0
#define TBCP_BURST_GRANTED                  1
313
0
#define TBCP_BURST_TAKEN_EXPECT_NO_REPLY    2
314
0
#define TBCP_BURST_DENY                     3
315
0
#define TBCP_BURST_RELEASE                  4
316
0
#define TBCP_BURST_IDLE                     5
317
0
#define TBCP_BURST_REVOKE                   6
318
0
#define TBCP_BURST_ACKNOWLEDGMENT           7
319
0
#define TBCP_QUEUE_STATUS_REQUEST           8
320
0
#define TBCP_QUEUE_STATUS_RESPONSE          9
321
0
#define TBCP_DISCONNECT                    11
322
0
#define TBCP_CONNECT                       15
323
0
#define TBCP_BURST_TAKEN_EXPECT_REPLY      18
324
325
326
static const value_string rtcp_app_poc1_floor_cnt_type_vals[] =
327
{
328
    {  TBCP_BURST_REQUEST,                 "TBCP Talk Burst Request"},
329
    {  TBCP_BURST_GRANTED,                 "TBCP Talk Burst Granted"},
330
    {  TBCP_BURST_TAKEN_EXPECT_NO_REPLY,   "TBCP Talk Burst Taken (no ack expected)"},
331
    {  TBCP_BURST_DENY,                    "TBCP Talk Burst Deny"},
332
    {  TBCP_BURST_RELEASE,                 "TBCP Talk Burst Release"},
333
    {  TBCP_BURST_IDLE,                    "TBCP Talk Burst Idle"},
334
    {  TBCP_BURST_REVOKE,                  "TBCP Talk Burst Revoke"},
335
    {  TBCP_BURST_ACKNOWLEDGMENT,          "TBCP Talk Burst Acknowledgement"},
336
    {  TBCP_QUEUE_STATUS_REQUEST,          "TBCP Queue Status Request"},
337
    {  TBCP_QUEUE_STATUS_RESPONSE,         "TBCP Queue Status Response"},
338
    {  TBCP_DISCONNECT,                    "TBCP Disconnect"},
339
    {  TBCP_CONNECT,                       "TBCP Connect"},
340
    {  TBCP_BURST_TAKEN_EXPECT_REPLY,      "TBCP Talk Burst Taken (ack expected)"},
341
    {  0,   NULL }
342
};
343
344
static const value_string rtcp_app_poc1_reason_code1_vals[] =
345
{
346
    {  1,   "Another PoC User has permission"},
347
    {  2,   "Internal PoC server error"},
348
    {  3,   "Only one participant in the group"},
349
    {  4,   "Retry-after timer has not expired"},
350
    {  5,   "Listen only"},
351
    {  0,   NULL }
352
};
353
354
static const value_string rtcp_app_poc1_reason_code2_vals[] =
355
{
356
    {  1,   "Only one user"},
357
    {  2,   "Talk burst too long"},
358
    {  3,   "No permission to send a Talk Burst"},
359
    {  4,   "Talk burst pre-empted"},
360
    {  0,   NULL }
361
};
362
363
static const value_string rtcp_app_poc1_reason_code_ack_vals[] =
364
{
365
    {  0,   "Accepted"},
366
    {  1,   "Busy"},
367
    {  2,   "Not accepted"},
368
    {  0,   NULL }
369
};
370
static const value_string rtcp_app_poc1_conn_sess_type_vals[] =
371
{
372
    {  0,   "None"},
373
    {  1,   "1-to-1"},
374
    {  2,   "Ad-hoc"},
375
    {  3,   "Pre-arranged"},
376
    {  4,   "Chat"},
377
    {  0,   NULL }
378
};
379
380
static const value_string rtcp_app_poc1_qsresp_priority_vals[] =
381
{
382
    {  0,   "No priority (un-queued)"},
383
    {  1,   "Normal priority"},
384
    {  2,   "High priority"},
385
    {  3,   "Pre-emptive priority"},
386
    {  0,   NULL }
387
};
388
389
/* 3GPP 29.414 RTP Multiplexing */
390
static const value_string rtcp_app_mux_selection_vals[] =
391
{
392
    {  0,   "No multiplexing applied"},
393
    {  1,   "Multiplexing without RTP header compression applied"},
394
    {  2,   "Multiplexing with RTP header compression applied"},
395
    {  3,   "Reserved"},
396
    {  0,   NULL}
397
};
398
399
/* RFC 4585, RFC 5104, RFC 6051, RFC 6285, RFC 6642, RFC 6679, RFC 7728,
400
 * 3GPP TS 26.114 v16.3.0, RFC 8888 and
401
 * draft-holmer-rmcat-transport-wide-cc-extensions-01
402
 */
403
static const value_string rtcp_rtpfb_fmt_vals[] =
404
{
405
    {   1,  "Generic negative acknowledgement (NACK)"},
406
    {   3,  "Temporary Maximum Media Stream Bit Rate Request (TMMBR)"},
407
    {   4,  "Temporary Maximum Media Stream Bit Rate Notification (TMMBN)"},
408
    {   5,  "RTCP Rapid Resynchronisation Request (RTCP-SR-REQ)"},
409
    {   6,  "Rapid Acquisition of Multicast Sessions (RAMS)"},
410
    {   7,  "Transport-Layer Third-Party Loss Early Indication (TLLEI)"},
411
    {   8,  "RTCP ECN Feedback (RTCP-ECN-FB)"},
412
    {   9,  "Media Pause/Resume (PAUSE-RESUME)"},
413
    {  10,  "Delay Budget Information (DBI)"},
414
    {  11,  "RTP Congestion Control Feedback (CCFB)"},
415
    {  15,  "Transport-wide Congestion Control (Transport-cc)"},
416
    {  31,  "Reserved for future extensions"},
417
    {   0,  NULL }
418
};
419
420
static const value_string rtcp_psfb_fmt_vals[] =
421
{
422
    {   1,  "Picture Loss Indication"},
423
    {   2,  "Slice Loss Indication"},
424
    {   3,  "Reference Picture Selection Indication"},
425
    {   4,  "Full Intra Request (FIR) Command"},
426
    {   5,  "Temporal-Spatial Trade-off Request (TSTR)"},
427
    {   6,  "Temporal-Spatial Trade-off Notification (TSTN)"},
428
    {   7,  "Video Back Channel Message (VBCM)"},
429
    {  15,  "Application Layer Feedback"},
430
    {  31,  "Reserved for future extensions"},
431
    {   0,  NULL }
432
};
433
434
static const value_string rtcp_psfb_fmt_summary_vals[] =
435
{
436
    {   1,  "PLI"},
437
    {   2,  "SLI"},
438
    {   3,  "RPSI"},
439
    {   4,  "FIR"},
440
    {   5,  "TSTR"},
441
    {   6,  "TSTN"},
442
    {   7,  "VBCM"},
443
    {  15,  "ALFB"},
444
    {  31,  "Reserved"},
445
    {   0,  NULL }
446
};
447
448
/* Microsoft Profile Specific Extension Types */
449
static const value_string rtcp_ms_profile_extension_vals[] =
450
{
451
    {   1,  "MS - Estimated Bandwidth"},
452
    {   4,  "MS - Packet Loss Notification"},
453
    {   5,  "MS - Video Preference"},
454
    {   6,  "MS - Padding"},
455
    {   7,  "MS - Policy Server Bandwidth"},
456
    {   8,  "MS - TURN Server Bandwidth"},
457
    {   9,  "MS - Audio Healer Metrics"},
458
    {   10,  "MS - Receiver-side Bandwidth Limit"},
459
    {   11,  "MS - Packet Train Packet"},
460
    {   12,  "MS - Peer Info Exchange"},
461
    {   13,  "MS - Network Congestion Notification"},
462
    {   14,  "MS - Modality Send Bandwidth Limit"},
463
    {   0,  NULL }
464
};
465
466
static const value_string rtcp_ssrc_values[] = {
467
    {  0xFFFFFFFF,   "SOURCE_NONE" },
468
    {  0xFFFFFFFE,   "SOURCE_ANY" },
469
    {   0,  NULL }
470
};
471
472
/* TS 24.380 V17.7.0 */
473
static const value_string rtcp_mcpt_subtype_vals[] = {
474
    { 0x00,  "Floor Request" },
475
    { 0x01,  "Floor Granted" },
476
    { 0x02,  "Floor Taken" },
477
    { 0x03,  "Floor Deny" },
478
    { 0x04,  "Floor Release" },
479
    { 0x05,  "Floor Idle" },
480
    { 0x06,  "Floor Revoke" },
481
    { 0x08,  "Floor Queue Position Request" },
482
    { 0x09,  "Floor Queue Position Info" },
483
    { 0x0a,  "Floor Ack" },
484
    { 0x0b,  "Unicast Media Flow Control" },
485
    { 0x0e,  "Floor Queued Cancel" },
486
    { 0x0f,  "Floor Release Multi Talker" },
487
488
    { 0x11,  "Floor Granted(ack req)" },
489
    { 0x12,  "Floor Taken(ack req)" },
490
    { 0x13,  "Floor Deny(ack req)" },
491
    { 0x14,  "Floor Release(ack req)" },
492
    { 0x15,  "Floor Idle(ack req)" },
493
    { 0x19,  "Floor Queue Position Info(ack req)" },
494
    { 0x1b,  "Unicast Media Flow Control(ack req)" },
495
    { 0x1e,  "Floor Queued Cancel(ack req)" },
496
497
    { 0,  NULL }
498
};
499
500
/* TS 24.380 8.3.2 V18.6.0 */
501
static const value_string rtcp_mcpc_subtype_vals[] = {
502
    { 0x00,  "Connect" },
503
    { 0x01,  "Disconnect" },
504
    { 0x02,  "Acknowledge" },
505
506
    { 0x10,  "Connect(ack req)" },
507
    { 0x11,  "Disconnect(ack req)" },
508
509
    { 0,  NULL }
510
};
511
512
/* TS 24.380 V18.6.0 8.3.3.8 Reason Code field */
513
static const value_string rtcp_mcpc_reason_code_vals[] = {
514
    { 0, "Accepted" },
515
    { 1, "Busy" },
516
    { 2, "Not Accepted" },
517
    { 3, "Authentication of the MIKEY-SAKKE I_MESSAGE failed" },
518
    { 4, "Integrity protection check failed" },
519
    { 5, "Decrypting XML content failed" },
520
521
    { 0,  NULL }
522
};
523
/* TS 24.380 V18.6.0 8.3.3.11 Reason Cause field */
524
static const value_string rtcp_mcpc_reason_cause_vals[] = {
525
    {  0, "Busy" },
526
    {  1, "Authentication of the MIKEY-SAKKE I_MESSAGE failed" },
527
    {  2, "Integrity protection check failed" },
528
    {  3, "Unable to decrypt XML content" },
529
    {  4, "Inactivity timer expired" },
530
    {  5, "There are only one or no participants in the MCPTT call" },
531
    {  6, "The minimum number of affiliated MCPTT group members is not present" },
532
    {  7, "Group call timer expired" },
533
    {  8, "The MCPTT session has lasted longer than the maximum duration of a private call" },
534
    {  9, "Media bearer establishment failed and call ended" },
535
    { 10, "Media bearer establishment failed and call continues" },
536
    {  0,  NULL }
537
};
538
539
/* TS 24.380 V17.7.0 */
540
static const value_string rtcp_mccp_subtype_vals[] = {
541
    { 0x00,  "Map Group To Bearer" },
542
    { 0x01,  "Unmap Group To Bearer" },
543
    { 0x02,  "Application Paging" },
544
    { 0x03,  "Bearer Announcement" },
545
    { 0,  NULL }
546
};
547
548
549
/* TS 24.380 V17.7.0 */
550
static const value_string rtcp_mcpt_field_id_vals[] = {
551
    { 0,  "Floor Priority" },
552
    { 1,  "Duration" },
553
    { 2,  "Reject Cause" },
554
    { 3,  "Queue Info" },
555
    { 4,  "Granted Party's Identity" },
556
    { 5,  "Permission to Request the Floor" },
557
    { 6,  "User ID" },
558
    { 7,  "Queue Size" },
559
    { 8,  "Message Sequence-Number" },
560
    { 9,  "Queued User ID" },
561
    { 10,  "Source" },
562
    { 11,  "Track Info" },
563
    { 12,  "Message Type" },
564
    { 13,  "Floor Indicator" },
565
    { 14,  "SSRC" },
566
    { 15,  "List of Granted Users" },
567
    { 16,  "List of SSRCs" },
568
    { 17,  "Functional Alias" },
569
    { 18,  "List of Functional Aliases" },
570
    { 19,  "Location" },
571
    { 20,  "List of Locations" },
572
    { 21,  "Queued Floor Requests Purpose" },
573
    { 22,  "List of Queued Users" },
574
    { 23,  "Response State" },
575
    { 24,  "Media Flow Control Indicator" },
576
577
    { 102,  "Floor Priority" },
578
    { 103,  "Duration" },
579
    { 104,  "Reject Cause" },
580
    { 105,  "Queue Info" },
581
    { 106,  "Granted Party's Identity" },
582
    { 108,  "Permission to Request the Floor" },
583
    { 109,  "User ID" },
584
    { 110,  "Queue Size" },
585
    { 111,  "Message SequenceNumber" },
586
    { 112,  "Queued User ID" },
587
    { 113,  "Source" },
588
    { 114,  "Track Info" },
589
    { 115,  "Message Type" },
590
    { 116,  "Floor Indicator" },
591
592
    { 0,  NULL }
593
};
594
595
/* TS 24.380 V17.7.0 */
596
static const value_string rtcp_mccp_field_id_vals[] = {
597
    { 0,  "Subchannel" },
598
    { 1,  "TMGI" },
599
    { 2,  "MCPTT Group ID" },
600
    { 3,  "Monitoring State" },
601
    { 0,  NULL }
602
};
603
604
/* TS 24.380 8.3.3.1 V18.6.0 */
605
static const value_string rtcp_mcpc_field_id_vals[] = {
606
    { 0,  "Media Streams" },
607
    { 1,  "MCPTT Session Identity" },
608
    { 2,  "Warning Text" },
609
    { 3,  "MCPTT Group Identity" },
610
    { 4,  "Answer State" },
611
    { 5,  "Inviting MCPTT User Identity" },
612
    { 6,  "Reason Code" },
613
    { 7,  "Reason Cause" },
614
    { 8,  "Invited MCPTT User Identity" },
615
    { 192, "PCK_I_MESSAGE" },
616
    { 0,  NULL }
617
};
618
619
/* RTCP header fields                   */
620
static int proto_rtcp;
621
static int proto_srtcp;
622
static int proto_rtcp_ms_pse;
623
static int proto_rtcp_rtpfb_nack;
624
static int proto_rtcp_rtpfb_tmmbr;
625
static int proto_rtcp_rtpfb_tmmbn;
626
static int proto_rtcp_rtpfb_ccfb;
627
static int proto_rtcp_rtpfb_transport_cc;
628
static int proto_rtcp_rtpfb_undecoded_fci;
629
static int hf_rtcp_version;
630
static int hf_rtcp_padding;
631
static int hf_rtcp_rc;
632
static int hf_rtcp_sc;
633
static int hf_rtcp_pt;
634
static int hf_rtcp_length;
635
static int hf_rtcp_ssrc_sender;
636
static int hf_rtcp_ssrc_media_source;
637
static int hf_rtcp_ntp;
638
static int hf_rtcp_ntp_msw;
639
static int hf_rtcp_ntp_lsw;
640
static int hf_rtcp_timebase_indicator;
641
static int hf_rtcp_identity;
642
static int hf_rtcp_stream_id;
643
static int hf_rtcp_as_timestamp;
644
static int hf_rtcp_rtp_timestamp;
645
static int hf_rtcp_sender_pkt_cnt;
646
static int hf_rtcp_sender_oct_cnt;
647
static int hf_rtcp_ssrc_source;
648
static int hf_rtcp_ssrc_fraction;
649
static int hf_rtcp_ssrc_cum_nr;
650
static int hf_rtcp_ssrc_discarded;
651
/* First the 32 bit number, then the split
652
 * up 16 bit values */
653
/* These two are added to a subtree */
654
static int hf_rtcp_ssrc_ext_high_seq;
655
static int hf_rtcp_ssrc_high_seq;
656
static int hf_rtcp_ssrc_high_cycles;
657
static int hf_rtcp_ssrc_jitter;
658
static int hf_rtcp_ssrc_lsr;
659
static int hf_rtcp_ssrc_dlsr;
660
/* static int hf_rtcp_ssrc_csrc; */
661
static int hf_rtcp_sdes_type;
662
static int hf_rtcp_sdes_length;
663
static int hf_rtcp_sdes_text;
664
static int hf_rtcp_sdes_prefix_len;
665
static int hf_rtcp_sdes_prefix_string;
666
static int hf_rtcp_subtype;
667
static int hf_rtcp_name_ascii;
668
static int hf_rtcp_app_data;
669
static int hf_rtcp_app_data_str;
670
static int hf_rtcp_fsn;
671
static int hf_rtcp_blp;
672
static int hf_rtcp_padding_count;
673
static int hf_rtcp_padding_data;
674
static int hf_rtcp_profile_specific_extension_type;
675
static int hf_rtcp_profile_specific_extension_length;
676
static int hf_rtcp_profile_specific_extension;
677
static int hf_rtcp_app_poc1;
678
static int hf_rtcp_app_poc1_sip_uri;
679
static int hf_rtcp_app_poc1_disp_name;
680
static int hf_rtcp_app_poc1_priority;
681
static int hf_rtcp_app_poc1_request_ts;
682
static int hf_rtcp_app_poc1_stt;
683
static int hf_rtcp_app_poc1_partic;
684
static int hf_rtcp_app_poc1_ssrc_granted;
685
static int hf_rtcp_app_poc1_last_pkt_seq_no;
686
static int hf_rtcp_app_poc1_ignore_seq_no;
687
static int hf_rtcp_app_poc1_reason_code1;
688
static int hf_rtcp_app_poc1_reason1_phrase;
689
static int hf_rtcp_app_poc1_reason_code2;
690
static int hf_rtcp_app_poc1_new_time_request;
691
static int hf_rtcp_app_poc1_ack_subtype;
692
static int hf_rtcp_app_poc1_ack_reason_code;
693
static int hf_rtcp_app_poc1_qsresp_priority;
694
static int hf_rtcp_app_poc1_qsresp_position;
695
static int hf_rtcp_app_poc1_conn_content[5];
696
static int hf_rtcp_app_poc1_conn_session_type;
697
static int hf_rtcp_app_poc1_conn_add_ind_mao;
698
static int hf_rtcp_app_poc1_conn_sdes_items[5];
699
static int hf_rtcp_app_mux;
700
static int hf_rtcp_app_mux_mux;
701
static int hf_rtcp_app_mux_cp;
702
static int hf_rtcp_app_mux_selection;
703
static int hf_rtcp_app_mux_localmuxport;
704
static int hf_rtcp_xr_block_type;
705
static int hf_rtcp_xr_block_specific;
706
static int hf_rtcp_xr_block_length;
707
static int hf_rtcp_xr_drle_e;
708
static int hf_rtcp_xr_thinning;
709
static int hf_rtcp_xr_voip_metrics_burst_density;
710
static int hf_rtcp_xr_voip_metrics_gap_density;
711
static int hf_rtcp_xr_voip_metrics_burst_duration;
712
static int hf_rtcp_xr_voip_metrics_gap_duration;
713
static int hf_rtcp_xr_voip_metrics_rtdelay;
714
static int hf_rtcp_xr_voip_metrics_esdelay;
715
static int hf_rtcp_xr_voip_metrics_siglevel;
716
static int hf_rtcp_xr_voip_metrics_noiselevel;
717
static int hf_rtcp_xr_voip_metrics_rerl;
718
static int hf_rtcp_xr_voip_metrics_gmin;
719
static int hf_rtcp_xr_voip_metrics_rfactor;
720
static int hf_rtcp_xr_voip_metrics_extrfactor;
721
static int hf_rtcp_xr_voip_metrics_moslq;
722
static int hf_rtcp_xr_voip_metrics_moscq;
723
static int hf_rtcp_xr_voip_metrics_plc;
724
static int hf_rtcp_xr_voip_metrics_jbadaptive;
725
static int hf_rtcp_xr_voip_metrics_jbrate;
726
static int hf_rtcp_xr_voip_metrics_jbnominal;
727
static int hf_rtcp_xr_voip_metrics_jbmax;
728
static int hf_rtcp_xr_voip_metrics_jbabsmax;
729
static int hf_rtcp_xr_stats_loss_flag;
730
static int hf_rtcp_xr_stats_dup_flag;
731
static int hf_rtcp_xr_stats_jitter_flag;
732
static int hf_rtcp_xr_stats_ttl;
733
static int hf_rtcp_xr_beginseq;
734
static int hf_rtcp_xr_endseq;
735
static int hf_rtcp_xr_chunk_null_terminator;
736
static int hf_rtcp_xr_chunk_length;
737
static int hf_rtcp_xr_chunk_bit_vector;
738
static int hf_rtcp_xr_receipt_time_seq;
739
static int hf_rtcp_xr_stats_lost;
740
static int hf_rtcp_xr_stats_dups;
741
static int hf_rtcp_xr_stats_minjitter;
742
static int hf_rtcp_xr_stats_maxjitter;
743
static int hf_rtcp_xr_stats_meanjitter;
744
static int hf_rtcp_xr_stats_devjitter;
745
static int hf_rtcp_xr_stats_minttl;
746
static int hf_rtcp_xr_stats_maxttl;
747
static int hf_rtcp_xr_stats_meanttl;
748
static int hf_rtcp_xr_stats_devttl;
749
static int hf_rtcp_xr_timestamp;
750
static int hf_rtcp_xr_lrr;
751
static int hf_rtcp_xr_dlrr;
752
static int hf_rtcp_xr_idms_spst;
753
static int hf_rtcp_xr_idms_pt;
754
static int hf_rtcp_xr_idms_msci;
755
static int hf_rtcp_xr_idms_source_ssrc;
756
static int hf_rtcp_xr_idms_ntp_rcv_ts;
757
static int hf_rtcp_xr_idms_rtp_ts;
758
static int hf_rtcp_xr_idms_ntp_pres_ts;
759
static int hf_rtcp_length_check;
760
static int hf_rtcp_rtpfb_ccfb_beginseq;
761
static int hf_rtcp_rtpfb_ccfb_numreports;
762
static int hf_rtcp_rtpfb_ccfb_received;
763
static int hf_rtcp_rtpfb_ccfb_ecn;
764
static int hf_rtcp_rtpfb_ccfb_ato;
765
static int hf_rtcp_rtpfb_ccfb_padding;
766
static int hf_rtcp_rtpfb_ccfb_timestamp;
767
static int hf_rtcp_rtpfb_fmt;
768
static int hf_rtcp_rtpfb_nack_pid;
769
static int hf_rtcp_rtpfb_nack_blp;
770
static int hf_rtcp_rtpfb_transport_cc_fci_base_seq;
771
static int hf_rtcp_rtpfb_transport_cc_fci_pkt_stats_cnt;
772
static int hf_rtcp_rtpfb_transport_cc_fci_ref_time;
773
static int hf_rtcp_rtpfb_transport_cc_fci_fb_pkt_cnt;
774
static int hf_rtcp_rtpfb_transport_cc_fci_pkt_chunk;
775
static int hf_rtcp_rtpfb_transport_cc_fci_recv_delta_1_byte;
776
static int hf_rtcp_rtpfb_transport_cc_fci_recv_delta_2_bytes;
777
static int hf_rtcp_rtpfb_transport_cc_fci_recv_delta_padding;
778
static int hf_rtcp_psfb_fmt;
779
static int hf_rtcp_fci;
780
static int hf_rtcp_psfb_fir_fci_ssrc;
781
static int hf_rtcp_psfb_fir_fci_csn;
782
static int hf_rtcp_psfb_fir_fci_reserved;
783
static int hf_rtcp_psfb_sli_first;
784
static int hf_rtcp_psfb_sli_number;
785
static int hf_rtcp_psfb_sli_picture_id;
786
static int hf_rtcp_psfb_remb_fci_identifier;
787
static int hf_rtcp_psfb_remb_fci_number_ssrcs;
788
static int hf_rtcp_psfb_remb_fci_ssrc;
789
static int hf_rtcp_psfb_remb_fci_exp;
790
static int hf_rtcp_psfb_remb_fci_mantissa;
791
static int hf_rtcp_psfb_remb_fci_bitrate;
792
static int hf_rtcp_rtpfb_tmbbr_fci_ssrc;
793
static int hf_rtcp_rtpfb_tmbbr_fci_exp;
794
static int hf_rtcp_rtpfb_tmbbr_fci_mantissa;
795
static int hf_rtcp_rtpfb_tmbbr_fci_bitrate;
796
static int hf_rtcp_rtpfb_tmbbr_fci_measuredoverhead;
797
static int hf_srtcp_e;
798
static int hf_srtcp_index;
799
static int hf_srtcp_mki;
800
static int hf_srtcp_auth_tag;
801
static int hf_rtcp_xr_btxnq_begseq;               /* added for BT XNQ block (RFC5093) */
802
static int hf_rtcp_xr_btxnq_endseq;
803
static int hf_rtcp_xr_btxnq_vmaxdiff;
804
static int hf_rtcp_xr_btxnq_vrange;
805
static int hf_rtcp_xr_btxnq_vsum;
806
static int hf_rtcp_xr_btxnq_cycles;
807
static int hf_rtcp_xr_btxnq_jbevents;
808
static int hf_rtcp_xr_btxnq_tdegnet;
809
static int hf_rtcp_xr_btxnq_tdegjit;
810
static int hf_rtcp_xr_btxnq_es;
811
static int hf_rtcp_xr_btxnq_ses;
812
static int hf_rtcp_xr_btxnq_spare;
813
814
/* RTCP setup fields */
815
static int hf_rtcp_setup;
816
static int hf_rtcp_setup_frame;
817
static int hf_rtcp_setup_method;
818
819
/* RTCP roundtrip delay fields */
820
static int hf_rtcp_last_sr_timestamp_frame;
821
static int hf_rtcp_time_since_last_sr;
822
static int hf_rtcp_roundtrip_delay;
823
824
/* MS Profile Specific Extension Fields */
825
static int hf_rtcp_pse_ms_bandwidth;
826
static int hf_rtcp_pse_ms_confidence_level;
827
static int hf_rtcp_pse_ms_seq_num;
828
static int hf_rtcp_pse_ms_frame_resolution_width;
829
static int hf_rtcp_pse_ms_frame_resolution_height;
830
static int hf_rtcp_pse_ms_bitrate;
831
static int hf_rtcp_pse_ms_frame_rate;
832
static int hf_rtcp_pse_ms_concealed_frames;
833
static int hf_rtcp_pse_ms_stretched_frames;
834
static int hf_rtcp_pse_ms_compressed_frames;
835
static int hf_rtcp_pse_ms_total_frames;
836
static int hf_rtcp_pse_ms_receive_quality_state;
837
static int hf_rtcp_pse_ms_fec_distance_request;
838
static int hf_rtcp_pse_ms_last_packet_train;
839
static int hf_rtcp_pse_ms_packet_idx;
840
static int hf_rtcp_pse_ms_packet_cnt;
841
static int hf_rtcp_pse_ms_packet_train_byte_cnt;
842
static int hf_rtcp_pse_ms_inbound_bandwidth;
843
static int hf_rtcp_pse_ms_outbound_bandwidth;
844
static int hf_rtcp_pse_ms_no_cache;
845
static int hf_rtcp_pse_ms_congestion_info;
846
static int hf_rtcp_pse_ms_modality;
847
/* Microsoft PLI Extension */
848
static int hf_rtcp_psfb_pli_ms_request_id;
849
static int hf_rtcp_psfb_pli_ms_sfr;
850
/* Microsoft Video Source Request */
851
static int hf_rtcp_psfb_ms_type;
852
static int hf_rtcp_psfb_ms_length;
853
static int hf_rtcp_psfb_ms_msi;
854
static int hf_rtcp_psfb_ms_vsr_request_id;
855
static int hf_rtcp_psfb_ms_vsr_version;
856
static int hf_rtcp_psfb_ms_vsr_key_frame_request;
857
static int hf_rtcp_psfb_ms_vsr_num_entries;
858
static int hf_rtcp_psfb_ms_vsr_entry_length;
859
static int hf_rtcp_psfb_ms_vsre_payload_type;
860
static int hf_rtcp_psfb_ms_vsre_ucconfig_mode;
861
static int hf_rtcp_psfb_ms_vsre_no_sp_frames;
862
static int hf_rtcp_psfb_ms_vsre_baseline;
863
static int hf_rtcp_psfb_ms_vsre_cgs;
864
static int hf_rtcp_psfb_ms_vsre_aspect_ratio_bitmask;
865
static int hf_rtcp_psfb_ms_vsre_aspect_ratio_4by3;
866
static int hf_rtcp_psfb_ms_vsre_aspect_ratio_16by9;
867
static int hf_rtcp_psfb_ms_vsre_aspect_ratio_1by1;
868
static int hf_rtcp_psfb_ms_vsre_aspect_ratio_3by4;
869
static int hf_rtcp_psfb_ms_vsre_aspect_ratio_9by16;
870
static int hf_rtcp_psfb_ms_vsre_aspect_ratio_20by3;
871
static int hf_rtcp_psfb_ms_vsre_max_width;
872
static int hf_rtcp_psfb_ms_vsre_max_height;
873
static int hf_rtcp_psfb_ms_vsre_min_bitrate;
874
static int hf_rtcp_psfb_ms_vsre_bitrate_per_level;
875
static int hf_rtcp_psfb_ms_vsre_bitrate_histogram;
876
static int hf_rtcp_psfb_ms_vsre_frame_rate_mask;
877
static int hf_rtcp_psfb_ms_vsre_frame_rate_7_5;
878
static int hf_rtcp_psfb_ms_vsre_frame_rate_12_5;
879
static int hf_rtcp_psfb_ms_vsre_frame_rate_15;
880
static int hf_rtcp_psfb_ms_vsre_frame_rate_25;
881
static int hf_rtcp_psfb_ms_vsre_frame_rate_30;
882
static int hf_rtcp_psfb_ms_vsre_frame_rate_50;
883
static int hf_rtcp_psfb_ms_vsre_frame_rate_60;
884
static int hf_rtcp_psfb_ms_vsre_must_instances;
885
static int hf_rtcp_psfb_ms_vsre_may_instances;
886
static int hf_rtcp_psfb_ms_vsre_quality_histogram;
887
static int hf_rtcp_psfb_ms_vsre_max_pixels;
888
889
static int hf_rtcp_mcptt_fld_id;
890
static int hf_rtcp_mcptt_fld_len;
891
static int hf_rtcp_mcptt_fld_val;
892
static int hf_rtcp_mcptt_granted_partys_id;
893
static int hf_rtcp_app_data_padding;
894
static int hf_rtcp_mcptt_priority;
895
static int hf_rtcp_mcptt_duration;
896
static int hf_rtcp_mcptt_user_id;
897
static int hf_rtcp_mcptt_floor_ind_normal;
898
static int hf_rtcp_mcptt_floor_ind_broadcast;
899
static int hf_rtcp_mcptt_floor_ind_system;
900
static int hf_rtcp_mcptt_floor_ind_emergency;
901
static int hf_rtcp_mcptt_floor_ind_imminent_peril;
902
static int hf_rtcp_mcptt_floor_ind_queueing_supported;
903
static int hf_rtcp_mcptt_floor_ind_dual_floor;
904
static int hf_rtcp_mcptt_floor_ind_temp_group;
905
static int hf_rtcp_mcptt_floor_ind_multi_talker;
906
static int hf_rtcp_mcptt_rej_cause;
907
static int hf_rtcp_mcptt_rej_cause_floor_deny;
908
static int hf_rtcp_mcptt_rej_cause_floor_revoke;
909
static int hf_rtcp_mcptt_rej_phrase;
910
static int hf_rtcp_mcptt_queue_pos_inf;
911
static int hf_rtcp_mcptt_queue_pri_lev;
912
static int hf_rtcp_mcptt_perm_to_req_floor;
913
static int hf_rtcp_mcptt_queue_size;
914
static int hf_rtcp_mcptt_msg_seq_num;
915
static int hf_rtcp_mcptt_queued_user_id;
916
static int hf_rtcp_mcptt_source;
917
static int hf_rtcp_mcptt_queueing_cap;
918
static int hf_rtcp_mcptt_part_type_len;
919
static int hf_rtcp_mcptt_participant_type;
920
static int hf_rtcp_mcptt_participant_ref;
921
static int hf_rtcp_mcptt_ssrc;
922
static int hf_rtcp_mcptt_num_users;
923
static int hf_rtcp_mcptt_user_id_len;
924
static int hf_rtcp_spare8;
925
static int hf_rtcp_spare16;
926
static int hf_rtcp_mcptt_num_ssrc;
927
static int hf_rtcp_mcptt_func_alias;
928
static int hf_rtcp_mcptt_num_fas;
929
static int hf_rtcp_mcptt_fa_len;
930
static int hf_rtcp_mcptt_loc_type;
931
static int hf_rtcp_mcptt_cellid;
932
static int hf_rtcp_mcptt_enodebid;
933
static int hf_rtcp_mcptt_ecgi_eci;
934
static int hf_rtcp_mcptt_tac;
935
static int hf_rtcp_mcptt_mbms_serv_area;
936
static int hf_rtcp_mcptt_mbsfn_area_id;
937
static int hf_rtcp_mcptt_lat;
938
static int hf_rtcp_mcptt_long;
939
static int hf_rtcp_mcptt_msg_type;
940
static int hf_rtcp_mcptt_num_loc;
941
static int hf_rtcp_mcptt_floor_ind;
942
static int hf_rtcp_mccp_len;
943
static int hf_rtcp_mccp_field_id;
944
static int hf_rtcp_mcptt_group_id;
945
static int hf_rtcp_mccp_audio_m_line_no;
946
static int hf_rtcp_mccp_floor_m_line_no;
947
static int hf_rtcp_mccp_ip_version;
948
static int hf_rtcp_mccp_floor_port_no;
949
static int hf_rtcp_mccp_media_port_no;
950
static int hf_rtcp_mccp_ipv4;
951
static int hf_rtcp_mccp_ipv6;
952
static int hf_rtcp_mccp_tmgi;
953
static int hf_rtcp_encrypted;
954
955
static int hf_rtcp_mcpc_fld_id;
956
static int hf_rtcp_mcpc_fld_len;
957
static int hf_rtcp_mcpc_fld_val;
958
static int hf_rtcp_mcpc_media_streams;
959
static int hf_rtcp_mcpc_ctrl_channel;
960
static int hf_rtcp_mcpc_mcptt_session_type;
961
static int hf_rtcp_mcpc_mcptt_session_id;
962
static int hf_rtcp_mcpc_warning;
963
static int hf_rtcp_mcpc_mcptt_group_id;
964
static int hf_rtcp_mcpc_answer_state;
965
static int hf_rtcp_mcpc_mcptt_user_id;
966
static int hf_rtcp_mcpc_reason_code;
967
static int hf_rtcp_mcpc_reason_cause;
968
static int hf_rtcp_mcpc_invited_mcptt_user_id;
969
static int hf_rtcp_mcpc_pck_imessage;
970
971
/* RTCP fields defining a sub tree */
972
static int ett_rtcp;
973
static int ett_rtcp_sr;
974
static int ett_rtcp_rr;
975
static int ett_rtcp_sdes;
976
static int ett_rtcp_bye;
977
static int ett_rtcp_app;
978
static int ett_rtcp_rtpfb;
979
static int ett_rtcp_rtpfb_ccfb_fci;
980
static int ett_rtcp_rtpfb_ccfb_media_source;
981
static int ett_rtcp_rtpfb_ccfb_metric_blocks;
982
static int ett_rtcp_rtpfb_ccfb_metric_block;
983
static int ett_rtcp_psfb;
984
static int ett_rtcp_xr;
985
static int ett_rtcp_fir;
986
static int ett_rtcp_nack;
987
static int ett_ssrc;
988
static int ett_ssrc_item;
989
static int ett_ssrc_ext_high;
990
static int ett_sdes;
991
static int ett_sdes_item;
992
static int ett_PoC1;
993
static int ett_mux;
994
static int ett_rtcp_setup;
995
static int ett_rtcp_roundtrip_delay;
996
static int ett_xr_block;
997
static int ett_xr_block_contents;
998
static int ett_xr_ssrc;
999
static int ett_xr_loss_chunk;
1000
static int ett_poc1_conn_contents;
1001
static int ett_rtcp_nack_blp;
1002
static int ett_pse;
1003
static int ett_ms_vsr;
1004
static int ett_ms_vsr_entry;
1005
static int ett_ms_ds;
1006
static int ett_rtcp_mcpt;
1007
static int ett_rtcp_mcptt_participant_ref;
1008
static int ett_rtcp_mcptt_eci;
1009
static int ett_rtcp_mccp_tmgi;
1010
static int ett_rtcp_mcptt_floor_ind;
1011
static int ett_rtcp_mcpc;
1012
1013
static expert_field ei_rtcp_not_final_padding;
1014
static expert_field ei_rtcp_bye_reason_not_padded;
1015
static expert_field ei_rtcp_xr_block_length_bad;
1016
static expert_field ei_rtcp_roundtrip_delay;
1017
static expert_field ei_rtcp_length_check;
1018
static expert_field ei_rtcp_roundtrip_delay_negative;
1019
static expert_field ei_rtcp_psfb_ms_type;
1020
static expert_field ei_rtcp_missing_sender_ssrc;
1021
static expert_field ei_rtcp_missing_block_header;
1022
static expert_field ei_rtcp_block_length;
1023
static expert_field ei_srtcp_encrypted_payload;
1024
static expert_field ei_rtcp_rtpfb_transportcc_bad;
1025
static expert_field ei_rtcp_rtpfb_fmt_not_implemented;
1026
static expert_field ei_rtcp_rtpfb_ccfb_too_many_reports;
1027
static expert_field ei_rtcp_mcptt_unknown_fld;
1028
static expert_field ei_rtcp_mcptt_location_type;
1029
static expert_field ei_rtcp_appl_extra_bytes;
1030
static expert_field ei_rtcp_appl_not_ascii;
1031
static expert_field ei_rtcp_appl_non_conformant;
1032
static expert_field ei_rtcp_appl_non_zero_pad;
1033
static expert_field ei_rtcp_sdes_missing_null_terminator;
1034
static expert_field ei_rtcp_mcpc_unknown_fld;
1035
1036
enum default_protocol_type {
1037
    RTCP_PROTO_RTCP,
1038
    RTCP_PROTO_SRTCP
1039
};
1040
1041
static const enum_val_t rtcp_default_protocol_vals[] = {
1042
  {"RTCP",  "RTCP",  RTCP_PROTO_RTCP},
1043
  {"SRTCP", "SRTCP", RTCP_PROTO_SRTCP},
1044
  {NULL, NULL, -1}
1045
};
1046
1047
static int global_rtcp_default_protocol = RTCP_PROTO_RTCP;
1048
1049
/* Main dissection function */
1050
static int dissect_rtcp( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data);
1051
static int dissect_srtcp(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree, void* data);
1052
1053
/* Displaying set info */
1054
static bool global_rtcp_show_setup_info = true;
1055
static void show_setup_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
1056
1057
/* Related to roundtrip calculation (using LSR and DLSR) */
1058
static bool global_rtcp_show_roundtrip_calculation;
1059
#define MIN_ROUNDTRIP_TO_REPORT_DEFAULT 10
1060
static unsigned global_rtcp_show_roundtrip_calculation_minimum = MIN_ROUNDTRIP_TO_REPORT_DEFAULT;
1061
static void remember_outgoing_sr(packet_info *pinfo, uint32_t lsr);
1062
static void calculate_roundtrip_delay(tvbuff_t *tvb, packet_info *pinfo,
1063
                                      proto_tree *tree, uint32_t lsr, uint32_t dlsr);
1064
static void add_roundtrip_delay_info(tvbuff_t *tvb, packet_info *pinfo,
1065
                                     proto_tree *tree,
1066
                                     unsigned frame,
1067
                                     unsigned gap_between_reports, int delay);
1068
1069
enum application_specific_encoding_type {
1070
    RTCP_APP_NONE,
1071
    RTCP_APP_MCPTT,
1072
    RTCP_APP_MCPC
1073
};
1074
1075
static const enum_val_t rtcp_application_specific_encoding_vals[] = {
1076
  {"None", "None", RTCP_APP_NONE},
1077
  {"MCPT", "MCPT", RTCP_APP_MCPTT},
1078
  {"MCPC", "MCPC", RTCP_APP_MCPC},
1079
  {NULL, NULL, -1}
1080
};
1081
1082
static int preferences_application_specific_encoding = RTCP_APP_NONE;
1083
1084
1085
/* Set up an RTCP conversation using the info given */
1086
void srtcp_add_address( packet_info *pinfo,
1087
                       address *addr, int port,
1088
                       int other_port,
1089
                       const char *setup_method, uint32_t setup_frame_number,
1090
                       struct srtp_info *srtcp_info)
1091
35
{
1092
35
    address                         null_addr;
1093
35
    conversation_t                 *p_conv;
1094
35
    struct _rtcp_conversation_info *p_conv_data;
1095
1096
    /*
1097
     * If this isn't the first time this packet has been processed,
1098
     * we've already done this work, so we don't need to do it
1099
     * again.
1100
     */
1101
35
    if (pinfo->fd->visited)
1102
0
    {
1103
0
        return;
1104
0
    }
1105
1106
35
    clear_address(&null_addr);
1107
1108
    /*
1109
     * Check if the ip address and port combination is not
1110
     * already registered as a conversation.
1111
     */
1112
35
    p_conv = find_conversation_strat_xtd(pinfo, setup_frame_number, addr, &null_addr, CONVERSATION_UDP, port, other_port,
1113
35
                                         NO_ADDR_B | (!other_port ? NO_PORT_B : 0));
1114
1115
    /*
1116
     * If not, create a new conversation.
1117
     */
1118
35
    if ( ! p_conv ) {
1119
11
        p_conv = conversation_new_strat_xtd(pinfo, setup_frame_number, addr, &null_addr,
1120
11
            CONVERSATION_UDP, (uint32_t)port, (uint32_t)other_port,
1121
11
            NO_ADDR2 | (!other_port ? NO_PORT2 : 0));
1122
11
    }
1123
1124
    /* Set dissector */
1125
35
    conversation_set_dissector(p_conv, rtcp_handle);
1126
1127
    /*
1128
     * Check if the conversation has data associated with it.
1129
     */
1130
35
    p_conv_data = (struct _rtcp_conversation_info *)conversation_get_proto_data(p_conv, proto_rtcp);
1131
1132
    /*
1133
     * If not, add a new data item.
1134
     */
1135
35
    if ( ! p_conv_data ) {
1136
        /* Create conversation data */
1137
32
        p_conv_data = wmem_new0(wmem_file_scope(), struct _rtcp_conversation_info);
1138
32
        conversation_add_proto_data(p_conv, proto_rtcp, p_conv_data);
1139
32
    }
1140
1141
    /*
1142
     * Update the conversation data.
1143
     */
1144
35
    p_conv_data->setup_method_set = true;
1145
35
    (void) g_strlcpy(p_conv_data->setup_method, setup_method, MAX_RTCP_SETUP_METHOD_SIZE);
1146
35
    p_conv_data->setup_frame_number = setup_frame_number;
1147
35
    p_conv_data->srtcp_info = srtcp_info;
1148
35
}
1149
1150
/* Set up an RTCP conversation using the info given */
1151
void rtcp_add_address( packet_info *pinfo,
1152
                       address *addr, int port,
1153
                       int other_port,
1154
                       const char *setup_method, uint32_t setup_frame_number)
1155
13
{
1156
13
    srtcp_add_address(pinfo, addr, port, other_port, setup_method, setup_frame_number, NULL);
1157
13
}
1158
1159
static bool
1160
dissect_rtcp_heur( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data )
1161
1.22k
{
1162
1.22k
    unsigned int offset = 0;
1163
1.22k
    unsigned int first_byte;
1164
1.22k
    unsigned int packet_type;
1165
1166
1.22k
    if (tvb_captured_length(tvb) < 2)
1167
66
        return false;
1168
1169
    /* Look at first byte */
1170
1.16k
    first_byte = tvb_get_uint8(tvb, offset);
1171
1172
    /* Are version bits set to 2? */
1173
1.16k
    if (((first_byte & 0xC0) >> 6) != 2)
1174
907
    {
1175
907
        return false;
1176
907
    }
1177
1178
    /* Look at packet type */
1179
254
    packet_type = tvb_get_uint8(tvb, offset + 1);
1180
1181
    /* First packet within compound packet is supposed to be a sender
1182
       or receiver report. (However, see RFC 5506 which allows the
1183
       use of non-compound RTCP packets in some circumstances.)
1184
       - allow BYE because this happens anyway
1185
       - allow APP because TBCP ("PoC1") packets aren't compound...
1186
       - allow RTPFB for feedback
1187
       - allow PSFB for MS
1188
       - allow XR for status reports
1189
     */
1190
254
    if (!((packet_type == RTCP_SR)  || (packet_type == RTCP_RR) ||
1191
238
          (packet_type == RTCP_BYE) || (packet_type == RTCP_APP) ||
1192
220
          (packet_type == RTCP_RTPFB) || (packet_type == RTCP_PSFB) ||
1193
158
          (packet_type == RTCP_XR)))
1194
140
    {
1195
140
        return false;
1196
140
    }
1197
1198
    /* Overall length must be a multiple of 4 bytes */
1199
114
    if (tvb_reported_length(tvb) % 4)
1200
4
    {
1201
4
        return false;
1202
4
    }
1203
1204
    /* OK, dissect as RTCP */
1205
1206
    /* XXX: This heuristic doesn't differentiate between RTCP and SRTCP.
1207
     * There are some possible extra heuristics: looking to see if there's
1208
     * extra length (that is not padding), looking if padding is enabled
1209
     * but the last byte is inconsistent with padding, stepping through
1210
     * compound packets and seeing if it looks encrypted at some point, etc.
1211
     */
1212
110
    if (global_rtcp_default_protocol == RTCP_PROTO_RTCP) {
1213
110
        dissect_rtcp(tvb, pinfo, tree, data);
1214
110
    } else {
1215
0
        dissect_srtcp(tvb, pinfo, tree, data);
1216
0
    }
1217
1218
110
    return true;
1219
114
}
1220
1221
/* Dissect the length field. Append to this field text indicating the number of
1222
   actual bytes this translates to (i.e. (raw value + 1) * 4) */
1223
static int dissect_rtcp_length_field( proto_tree *tree, tvbuff_t *tvb, unsigned offset)
1224
128
{
1225
128
    proto_item     *ti;
1226
128
    unsigned short  raw_length = tvb_get_ntohs( tvb, offset );
1227
1228
128
    ti = proto_tree_add_item( tree, hf_rtcp_length, tvb, offset, 2,  ENC_BIG_ENDIAN);
1229
128
    proto_item_append_text(ti, " (%u bytes)", (raw_length+1)*4);
1230
128
    offset += 2;
1231
128
    return offset;
1232
128
}
1233
1234
static int
1235
dissect_rtcp_rtpfb_header(tvbuff_t *tvb, unsigned offset, proto_tree *rtcp_tree)
1236
51
{
1237
    /* Feedback message type, 8 bits */
1238
51
    proto_tree_add_item( rtcp_tree, hf_rtcp_rtpfb_fmt, tvb, offset, 1, ENC_BIG_ENDIAN );
1239
51
    offset++;
1240
1241
    /* Packet type, 8 bits */
1242
51
    proto_tree_add_item( rtcp_tree, hf_rtcp_pt, tvb, offset, 1, ENC_BIG_ENDIAN );
1243
51
    offset++;
1244
1245
51
    offset = dissect_rtcp_length_field(rtcp_tree, tvb, offset);
1246
1247
    /* SSRC of packet sender, 32 bits */
1248
51
    proto_tree_add_item( rtcp_tree, hf_rtcp_ssrc_sender, tvb, offset, 4, ENC_BIG_ENDIAN );
1249
51
    offset += 4;
1250
1251
51
    return offset;
1252
51
}
1253
1254
static int
1255
dissect_rtcp_nack( tvbuff_t *tvb, unsigned offset, proto_tree *tree )
1256
1
{
1257
    /* Packet type = FIR (H261) */
1258
1
    proto_tree_add_item( tree, hf_rtcp_rc, tvb, offset, 1, ENC_BIG_ENDIAN );
1259
1
    offset++;
1260
    /* Packet type, 8 bits  = APP */
1261
1
    proto_tree_add_item( tree, hf_rtcp_pt, tvb, offset, 1, ENC_BIG_ENDIAN );
1262
1
    offset++;
1263
1264
    /* Packet length in 32 bit words minus one */
1265
1
    offset = dissect_rtcp_length_field(tree, tvb, offset);
1266
1267
    /* SSRC  */
1268
1
    proto_tree_add_item( tree, hf_rtcp_ssrc_source, tvb, offset, 4, ENC_BIG_ENDIAN );
1269
1
    offset += 4;
1270
1271
    /* FSN, 16 bits */
1272
1
    proto_tree_add_item( tree, hf_rtcp_fsn, tvb, offset, 2, ENC_BIG_ENDIAN );
1273
1
    offset += 2;
1274
1275
    /* BLP, 16 bits */
1276
1
    proto_tree_add_item( tree, hf_rtcp_blp, tvb, offset, 2, ENC_BIG_ENDIAN );
1277
1
    offset += 2;
1278
1279
1
    return offset;
1280
1
}
1281
1282
static int
1283
dissect_rtcp_rtpfb_tmmbr_tmmbn_fci( tvbuff_t *tvb, unsigned offset, proto_tree *rtcp_tree, proto_item *top_item, int num_fci, bool is_notification)
1284
22
{
1285
22
    uint8_t exp;
1286
22
    uint32_t mantissa;
1287
22
    proto_tree *fci_tree;
1288
1289
22
    if (is_notification) {
1290
22
        fci_tree = proto_tree_add_subtree_format( rtcp_tree, tvb, offset, 8, ett_ssrc, NULL, "TMMBN %d", num_fci );
1291
22
    } else {
1292
0
        fci_tree = proto_tree_add_subtree_format( rtcp_tree, tvb, offset, 8, ett_ssrc, NULL, "TMMBR %d", num_fci );
1293
0
    }
1294
1295
    /* SSRC 32 bit*/
1296
22
    proto_tree_add_item( fci_tree, hf_rtcp_rtpfb_tmbbr_fci_ssrc, tvb, offset, 4, ENC_BIG_ENDIAN );
1297
22
    offset += 4;
1298
    /* Exp 6 bit*/
1299
22
    proto_tree_add_item( fci_tree, hf_rtcp_rtpfb_tmbbr_fci_exp, tvb, offset, 1, ENC_BIG_ENDIAN );
1300
22
    exp = (tvb_get_uint8(tvb, offset) & 0xfc) >> 2;
1301
    /* Mantissa 17 bit*/
1302
22
    proto_tree_add_item( fci_tree, hf_rtcp_rtpfb_tmbbr_fci_mantissa, tvb, offset, 3, ENC_BIG_ENDIAN );
1303
22
    mantissa = (tvb_get_ntohl( tvb, offset) & 0x3fffe00) >> 9;
1304
22
    proto_tree_add_string_format_value( fci_tree, hf_rtcp_rtpfb_tmbbr_fci_bitrate, tvb, offset, 3, "", "%u*2^%u", mantissa, exp);
1305
22
    offset += 3;
1306
    /* Overhead */
1307
22
    proto_tree_add_item( fci_tree, hf_rtcp_rtpfb_tmbbr_fci_measuredoverhead, tvb, offset, 2, ENC_BIG_ENDIAN );
1308
22
    offset += 1;
1309
1310
22
    if (top_item != NULL) {
1311
21
        if (is_notification == 1) {
1312
21
            proto_item_append_text(top_item, ": TMMBN: %u*2^%u", mantissa, exp);
1313
21
        } else {
1314
0
            proto_item_append_text(top_item, ": TMMBR: %u*2^%u", mantissa, exp);
1315
0
        }
1316
21
    }
1317
1318
22
    return offset;
1319
22
}
1320
1321
static int
1322
dissect_rtcp_rtpfb_tmmbr( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *rtcp_tree, void *data _U_)
1323
0
{
1324
0
    unsigned offset = 0;
1325
0
    proto_item *top_item = proto_tree_get_parent(rtcp_tree);
1326
1327
0
    unsigned packet_len = (tvb_get_uint16( tvb, offset + 2, ENC_BIG_ENDIAN) + 1) * 4;
1328
1329
0
    offset = dissect_rtcp_rtpfb_header(tvb, offset, rtcp_tree);
1330
1331
    /* SSRC of media source, 32 bits */
1332
0
    proto_tree_add_item( rtcp_tree, hf_rtcp_ssrc_media_source, tvb, offset, 4, ENC_BIG_ENDIAN );
1333
0
    offset += 4;
1334
1335
    /* Feedback Control Information */
1336
0
    uint32_t num_fci = 0;
1337
0
    while (offset < packet_len)
1338
0
    {
1339
0
        num_fci++;
1340
0
        offset = dissect_rtcp_rtpfb_tmmbr_tmmbn_fci( tvb, offset, rtcp_tree, top_item, num_fci, false);
1341
0
    }
1342
1343
0
    return offset;
1344
0
}
1345
1346
static int
1347
dissect_rtcp_rtpfb_tmmbn( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *rtcp_tree, void *data _U_)
1348
1
{
1349
1
    unsigned offset = 0;
1350
1
    proto_item *top_item = proto_tree_get_parent(rtcp_tree);
1351
1352
1
    unsigned packet_len = (tvb_get_uint16( tvb, offset + 2, ENC_BIG_ENDIAN) + 1) * 4;
1353
1354
1
    offset = dissect_rtcp_rtpfb_header(tvb, offset, rtcp_tree);
1355
1356
    /* SSRC of media source, 32 bits */
1357
1
    proto_tree_add_item( rtcp_tree, hf_rtcp_ssrc_media_source, tvb, offset, 4, ENC_BIG_ENDIAN );
1358
1
    offset += 4;
1359
1360
    /* Feedback Control Information */
1361
1
    uint32_t num_fci = 0;
1362
23
    while (offset < packet_len)
1363
22
    {
1364
22
        num_fci++;
1365
22
        offset = dissect_rtcp_rtpfb_tmmbr_tmmbn_fci( tvb, offset, rtcp_tree, top_item, num_fci, true);
1366
22
    }
1367
1368
1
    return offset;
1369
1
}
1370
1371
static int
1372
dissect_rtcp_rtpfb_ccfb_fci( tvbuff_t *tvb, unsigned offset, packet_info *pinfo, proto_tree *fci_tree, unsigned packet_len)
1373
15
{
1374
15
    proto_tree *media_source_ssrc_tree;
1375
15
    proto_item *metric_blocks_item;
1376
15
    proto_tree *metric_blocks_tree;
1377
15
    proto_item *metric_block_tree;
1378
15
    proto_item *ato_item;
1379
1380
    /* SSRC of media source, 32 bits */
1381
15
    const uint32_t media_source_ssrc = tvb_get_uint32( tvb, offset, 4);
1382
15
    media_source_ssrc_tree =
1383
15
      proto_tree_add_subtree_format( fci_tree, tvb, 0, 0, ett_rtcp_rtpfb_ccfb_media_source, NULL,
1384
15
                                     "Media Source Stream: 0x%"PRIx32 " (%"PRIu32 ")", media_source_ssrc, media_source_ssrc);
1385
1386
15
    proto_tree_add_item( media_source_ssrc_tree, hf_rtcp_ssrc_media_source, tvb, offset, 4, ENC_BIG_ENDIAN );
1387
15
    offset += 4;
1388
1389
15
    proto_tree_add_item( media_source_ssrc_tree, hf_rtcp_rtpfb_ccfb_beginseq, tvb, offset, 2, ENC_BIG_ENDIAN);
1390
15
    offset += 2;
1391
1392
    /* Calculate number of reports for "the range begin_seq up to, but not including, begin_seq+num_reports" */
1393
    /* https://www.rfc-editor.org/errata/eid8166 */
1394
15
    const uint16_t num_of_reported_pkts = tvb_get_uint16( tvb, offset, ENC_BIG_ENDIAN);
1395
15
    proto_tree_add_uint_format( media_source_ssrc_tree, hf_rtcp_rtpfb_ccfb_numreports, tvb, offset, 2,
1396
15
                                num_of_reported_pkts, "Number of metric blocks: %" PRIu16, num_of_reported_pkts);
1397
1398
15
    metric_blocks_tree = proto_tree_add_subtree(media_source_ssrc_tree, tvb, 0, 0, ett_rtcp_rtpfb_ccfb_metric_blocks,
1399
15
                                                &metric_blocks_item, "Metric Blocks");
1400
15
    proto_item_set_generated( metric_blocks_item);
1401
1402
15
    if (num_of_reported_pkts > 16384)
1403
2
    {
1404
2
      expert_add_info(pinfo, metric_blocks_tree, &ei_rtcp_rtpfb_ccfb_too_many_reports);
1405
2
      return packet_len;
1406
2
    }
1407
1408
176
    for (int i = 0; i < num_of_reported_pkts; i++)
1409
163
    {
1410
163
      offset += 2;
1411
1412
163
      const uint16_t metric_block = tvb_get_uint16( tvb, offset, ENC_BIG_ENDIAN);
1413
163
      const uint16_t received = RTCP_CCFB_RECEIVED(metric_block);
1414
163
      const uint16_t ecn = RTCP_CCFB_ECN(metric_block);
1415
163
      const uint16_t ato = RTCP_CCFB_ATO(metric_block);
1416
163
      float ato_ms = (float)ato / 1024 * 1000;
1417
1418
163
      metric_block_tree =
1419
163
        proto_tree_add_subtree_format( metric_blocks_tree, tvb, 0, 0, ett_rtcp_rtpfb_ccfb_metric_block, NULL,
1420
163
                                       "Metric Block (R:%"PRIu32", ECN:%"PRIu32", ATO:%f ms)", received, ecn, ato_ms);
1421
163
      proto_tree_add_item( metric_block_tree, hf_rtcp_rtpfb_ccfb_received, tvb, offset, 2, ENC_BIG_ENDIAN);
1422
163
      proto_tree_add_item( metric_block_tree, hf_rtcp_rtpfb_ccfb_ecn, tvb, offset, 2, ENC_BIG_ENDIAN);
1423
1424
163
      ato_item = proto_tree_add_item( metric_block_tree, hf_rtcp_rtpfb_ccfb_ato, tvb, offset, 2, ENC_BIG_ENDIAN);
1425
163
      proto_item_append_text(ato_item, " (%f ms)", ato_ms);
1426
163
    }
1427
1428
13
    offset += 2;
1429
13
    if (num_of_reported_pkts % 2 == 1)
1430
1
    {
1431
1
      proto_tree_add_item( metric_blocks_tree, hf_rtcp_rtpfb_ccfb_padding, tvb, offset, 2, ENC_BIG_ENDIAN);
1432
1
      offset += 2;
1433
1
    }
1434
1435
13
    return offset;
1436
15
}
1437
1438
static int
1439
dissect_rtcp_rtpfb_ccfb( tvbuff_t *tvb, packet_info *pinfo, proto_tree *rtcp_tree, void *data _U_)
1440
8
{
1441
8
  unsigned offset = 0;
1442
8
  proto_tree *fci_tree;
1443
8
  proto_item *fci_item;
1444
1445
8
  unsigned packet_len = (tvb_get_uint16( tvb, offset + 2, ENC_BIG_ENDIAN) + 1) * 4;
1446
1447
8
  offset = dissect_rtcp_rtpfb_header( tvb, offset, rtcp_tree);
1448
1449
8
  fci_tree = proto_tree_add_subtree( rtcp_tree, tvb, 0, 0, ett_rtcp_rtpfb_ccfb_fci,
1450
8
                                     &fci_item, "Feedback Control Information (FCI)");
1451
8
  proto_item_set_generated( fci_item);
1452
1453
  /* We can have multiple SSRC streams for which we are sending feedback (for which
1454
   * RTP packets have been received). Every iteration in while loop will dissect info
1455
   * for one source SSRC stream. Last 4 bytes are reserved for timestamp field.
1456
   */
1457
23
  while (offset < packet_len - 4)
1458
15
  {
1459
15
    offset = dissect_rtcp_rtpfb_ccfb_fci( tvb, offset, pinfo, fci_tree, packet_len);
1460
15
  }
1461
1462
8
  proto_tree_add_item( rtcp_tree, hf_rtcp_rtpfb_ccfb_timestamp, tvb, offset, 4, ENC_BIG_ENDIAN);
1463
8
  offset += 4;
1464
1465
8
  return offset;
1466
8
}
1467
1468
/* Dissect Application Specific Feedback messages */
1469
static int
1470
dissect_rtcp_asfb_ms( tvbuff_t *tvb, unsigned offset, proto_tree *tree, packet_info *pinfo)
1471
0
{
1472
0
    uint8_t num_entries;
1473
0
    uint8_t desc = 0;
1474
0
    uint16_t type;
1475
0
    uint16_t length;
1476
0
    uint8_t i;
1477
0
    uint32_t msi;
1478
0
    uint32_t min_bitrate, bitrate_per_level;
1479
0
    proto_tree *rtcp_ms_vsr_tree;
1480
0
    proto_tree *rtcp_ms_vsr_entry_tree;
1481
0
    proto_tree *rtcp_ms_ds_tree;
1482
0
    proto_item *item, *type_item;
1483
1484
0
    type = tvb_get_ntohs(tvb, offset);
1485
0
    type_item = proto_tree_add_item( tree, hf_rtcp_psfb_ms_type, tvb, offset, 2, ENC_BIG_ENDIAN );
1486
0
    offset += 2;
1487
1488
0
    length = tvb_get_ntohs(tvb, offset) - 4;
1489
0
    proto_tree_add_item( tree, hf_rtcp_psfb_ms_length, tvb, offset, 2, ENC_BIG_ENDIAN );
1490
0
    offset += 2;
1491
1492
0
    if (type == 1)
1493
0
    {
1494
0
        rtcp_ms_vsr_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ms_vsr, &item, "MS Video Source Request");
1495
1496
0
        col_append_str(pinfo->cinfo, COL_INFO, "( MS-VSR )");
1497
1498
0
        item = proto_tree_add_item( rtcp_ms_vsr_tree, hf_rtcp_psfb_ms_msi, tvb, offset, 4, ENC_BIG_ENDIAN );
1499
0
        msi = tvb_get_ntohl (tvb, offset);
1500
        /* Decode if it is NONE or ANY and add to line */
1501
0
        proto_item_append_text(item," %s", val_to_str_const(msi, rtcp_ssrc_values, ""));
1502
0
        offset += 4;
1503
1504
0
        proto_tree_add_item( rtcp_ms_vsr_tree, hf_rtcp_psfb_ms_vsr_request_id, tvb, offset, 2, ENC_BIG_ENDIAN );
1505
0
        offset += 2;
1506
        /* 2 reserved bytes */
1507
0
        offset += 2;
1508
0
        proto_tree_add_item( rtcp_ms_vsr_tree, hf_rtcp_psfb_ms_vsr_version, tvb, offset, 1, ENC_BIG_ENDIAN );
1509
0
        offset++;
1510
0
        proto_tree_add_item( rtcp_ms_vsr_tree, hf_rtcp_psfb_ms_vsr_key_frame_request, tvb, offset, 1, ENC_BIG_ENDIAN );
1511
0
        offset++;
1512
0
        num_entries = tvb_get_uint8(tvb, offset);
1513
0
        proto_tree_add_item( rtcp_ms_vsr_tree, hf_rtcp_psfb_ms_vsr_num_entries, tvb, offset, 1, ENC_BIG_ENDIAN );
1514
0
        offset++;
1515
0
        proto_tree_add_item( rtcp_ms_vsr_tree, hf_rtcp_psfb_ms_vsr_entry_length, tvb, offset, 1, ENC_BIG_ENDIAN );
1516
0
        offset++;
1517
        /* 4 reserved bytes */
1518
0
        offset += 4;
1519
1520
0
        while (num_entries-- && tvb_captured_length_remaining (tvb, offset) >= 0x44)
1521
0
        {
1522
0
            rtcp_ms_vsr_entry_tree = proto_tree_add_subtree_format(rtcp_ms_vsr_tree, tvb, offset, 0x44,
1523
0
                                     ett_ms_vsr_entry, NULL, "MS Video Source Request Entry #%d", ++desc);
1524
1525
0
            proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_payload_type,    tvb, offset, 1, ENC_BIG_ENDIAN);
1526
0
            offset++;
1527
0
            proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_ucconfig_mode,  tvb, offset, 1, ENC_BIG_ENDIAN);
1528
0
            offset++;
1529
0
            proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_no_sp_frames,  tvb, offset, 1, ENC_BIG_ENDIAN);
1530
0
            proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_baseline,  tvb, offset, 1, ENC_BIG_ENDIAN);
1531
0
            proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_cgs,  tvb, offset, 1, ENC_BIG_ENDIAN);
1532
0
            offset++;
1533
0
            proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_aspect_ratio_bitmask,  tvb, offset, 1, ENC_BIG_ENDIAN);
1534
0
            proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_aspect_ratio_20by3,  tvb, offset, 1, ENC_BIG_ENDIAN);
1535
0
            proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_aspect_ratio_9by16,  tvb, offset, 1, ENC_BIG_ENDIAN);
1536
0
            proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_aspect_ratio_3by4,  tvb, offset, 1, ENC_BIG_ENDIAN);
1537
0
            proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_aspect_ratio_1by1,  tvb, offset, 1, ENC_BIG_ENDIAN);
1538
0
            proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_aspect_ratio_16by9,  tvb, offset, 1, ENC_BIG_ENDIAN);
1539
0
            proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_aspect_ratio_4by3,  tvb, offset, 1, ENC_BIG_ENDIAN);
1540
0
            offset++;
1541
0
            proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_max_width,  tvb, offset, 2, ENC_BIG_ENDIAN);
1542
0
            offset += 2;
1543
0
            proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_max_height,  tvb, offset, 2, ENC_BIG_ENDIAN);
1544
0
            offset += 2;
1545
0
            proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_min_bitrate,  tvb, offset, 4, ENC_BIG_ENDIAN);
1546
0
            min_bitrate = tvb_get_ntohl (tvb, offset);
1547
0
            offset += 4;
1548
            /* 4 Reserved bytes */
1549
0
            offset += 4;
1550
0
            proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_bitrate_per_level,  tvb, offset, 4, ENC_BIG_ENDIAN);
1551
0
            bitrate_per_level = tvb_get_ntohl (tvb, offset);
1552
0
            offset += 4;
1553
0
            for (i = 0 ; i < 10 ; i++)
1554
0
            {
1555
0
                item = proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_bitrate_histogram,  tvb, offset, 2, ENC_BIG_ENDIAN);
1556
0
                proto_item_prepend_text(item,"Bitrate %d - %d ",
1557
0
                        min_bitrate + i * bitrate_per_level,
1558
0
                        min_bitrate + (i + 1) * bitrate_per_level);
1559
0
                offset += 2;
1560
0
            }
1561
0
            proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_frame_rate_mask,  tvb, offset, 4, ENC_BIG_ENDIAN);
1562
0
            offset +=3;      /* Move to low byte of mask where valid setting are */
1563
0
            proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_frame_rate_60,  tvb, offset, 1, ENC_BIG_ENDIAN);
1564
0
            proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_frame_rate_50,  tvb, offset, 1, ENC_BIG_ENDIAN);
1565
0
            proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_frame_rate_30,  tvb, offset, 1, ENC_BIG_ENDIAN);
1566
0
            proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_frame_rate_25,  tvb, offset, 1, ENC_BIG_ENDIAN);
1567
0
            proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_frame_rate_15,  tvb, offset, 1, ENC_BIG_ENDIAN);
1568
0
            proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_frame_rate_12_5,  tvb, offset, 1, ENC_BIG_ENDIAN);
1569
0
            proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_frame_rate_7_5,  tvb, offset, 1, ENC_BIG_ENDIAN);
1570
0
            offset++;
1571
0
            proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_must_instances,  tvb, offset, 2, ENC_BIG_ENDIAN);
1572
0
            offset += 2;
1573
0
            proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_may_instances,  tvb, offset, 2, ENC_BIG_ENDIAN);
1574
0
            offset += 2;
1575
0
            for (i = 0 ; i < 8 ; i++)
1576
0
            {
1577
0
                item = proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_quality_histogram,  tvb, offset, 2, ENC_BIG_ENDIAN);
1578
0
                proto_item_prepend_text(item, "Quality Level %d ", i+1 );
1579
0
                offset += 2;
1580
0
            }
1581
0
            proto_tree_add_item (rtcp_ms_vsr_entry_tree, hf_rtcp_psfb_ms_vsre_max_pixels,  tvb, offset, 4, ENC_BIG_ENDIAN);
1582
0
            offset += 4;
1583
0
        }
1584
0
    }
1585
0
    else if (type == 3)
1586
0
    {
1587
        /* MS Dominant Speaker History */
1588
0
        rtcp_ms_ds_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ms_ds, NULL, "MS Dominant Speaker History");
1589
0
        col_append_str(pinfo->cinfo, COL_INFO, "( MS-DSH )");
1590
0
        while (length-- && tvb_captured_length_remaining (tvb, offset) >= 4)
1591
0
        {
1592
0
            item = proto_tree_add_item( rtcp_ms_ds_tree, hf_rtcp_psfb_ms_msi, tvb, offset, 4, ENC_BIG_ENDIAN );
1593
0
            msi = tvb_get_ntohl (tvb, offset);
1594
0
            proto_item_append_text(item," %s", val_to_str_const(msi, rtcp_ssrc_values, ""));
1595
0
            offset += 4;
1596
0
            length --;
1597
0
        }
1598
0
    }
1599
0
    else
1600
0
    {
1601
0
        expert_add_info(pinfo, type_item, &ei_rtcp_psfb_ms_type);
1602
0
        offset += tvb_captured_length_remaining (tvb, offset);
1603
0
    }
1604
0
    return offset;
1605
0
}
1606
1607
static int
1608
dissect_rtcp_psfb_remb( tvbuff_t *tvb, unsigned offset, proto_tree *rtcp_tree, proto_item *top_item, int num_fci, unsigned *read_fci)
1609
0
{
1610
0
    unsigned    exp, indexSsrcs;
1611
0
    uint8_t     numberSsrcs;
1612
0
    uint64_t    mantissa, bitrate;
1613
0
    proto_tree *fci_tree;
1614
1615
0
    fci_tree = proto_tree_add_subtree_format( rtcp_tree, tvb, offset, 8, ett_ssrc, NULL, "REMB %d", num_fci );
1616
1617
    /* Unique identifier 'REMB' */
1618
0
    proto_tree_add_item( fci_tree, hf_rtcp_psfb_remb_fci_identifier, tvb, offset, 4, ENC_ASCII );
1619
0
    offset += 4;
1620
1621
    /* Number of ssrcs - they will each be parsed below */
1622
0
    proto_tree_add_item( fci_tree, hf_rtcp_psfb_remb_fci_number_ssrcs, tvb, offset, 1, ENC_BIG_ENDIAN );
1623
0
    numberSsrcs = tvb_get_uint8( tvb, offset);
1624
0
    offset += 1;
1625
1626
    /* Exp 6 bit*/
1627
0
    proto_tree_add_item( fci_tree, hf_rtcp_psfb_remb_fci_exp, tvb, offset, 1, ENC_BIG_ENDIAN );
1628
0
    exp = (tvb_get_uint8(tvb, offset) & 0xfc) ;
1629
0
    exp = exp >> 2;
1630
1631
    /* Mantissa 18 bit*/
1632
0
    proto_tree_add_item( fci_tree, hf_rtcp_psfb_remb_fci_mantissa, tvb, offset, 3, ENC_BIG_ENDIAN );
1633
0
    mantissa = (tvb_get_ntohl( tvb, offset - 1) & 0x0003ffff);
1634
0
    bitrate = mantissa << exp;
1635
0
    proto_tree_add_string_format_value( fci_tree, hf_rtcp_psfb_remb_fci_bitrate, tvb, offset, 3, "", "%" PRIu64, bitrate);
1636
0
    offset += 3;
1637
1638
0
    for  (indexSsrcs = 0; indexSsrcs < numberSsrcs; indexSsrcs++)
1639
0
    {
1640
        /* SSRC 32 bit*/
1641
0
        proto_tree_add_item( fci_tree, hf_rtcp_psfb_remb_fci_ssrc, tvb, offset, 4, ENC_BIG_ENDIAN );
1642
0
        offset += 4;
1643
0
    }
1644
1645
0
    if (top_item != NULL) {
1646
0
        proto_item_append_text(top_item, ": REMB: max bitrate=%" PRIu64, bitrate);
1647
0
    }
1648
0
    *read_fci = 2 + (numberSsrcs);
1649
1650
0
    return offset;
1651
0
}
1652
1653
static int
1654
dissect_rtcp_rtpfb_transport_cc_fci( tvbuff_t *tvb, unsigned offset, packet_info *pinfo, proto_tree *rtcp_tree, int pkt_len)
1655
121
{
1656
121
    proto_tree *fci_tree, *pkt_chunk_tree, *recv_delta_tree;
1657
121
    proto_item *item       = NULL;
1658
121
    uint8_t *delta_array;
1659
121
    uint16_t *pkt_seq_array;
1660
121
    uint32_t i, pkt_base_seq, pkt_seq_num, pkt_count, delta_index = 0;
1661
121
    int fci_length        = pkt_len - RTCP_TRANSPORT_CC_HEADER_LENGTH;
1662
121
    int padding_length     = offset;
1663
1664
121
    fci_tree = proto_tree_add_subtree_format( rtcp_tree, tvb, offset, fci_length, ett_ssrc, NULL, "Transport-cc" );
1665
1666
    /* base sequence number */
1667
121
    proto_tree_add_item_ret_uint( fci_tree, hf_rtcp_rtpfb_transport_cc_fci_base_seq, tvb, offset, 2, ENC_BIG_ENDIAN, &pkt_base_seq );
1668
121
    offset += 2;
1669
121
    pkt_seq_num = pkt_base_seq;
1670
1671
    /* packet status count */
1672
121
    proto_tree_add_item_ret_uint( fci_tree, hf_rtcp_rtpfb_transport_cc_fci_pkt_stats_cnt, tvb, offset, 2, ENC_BIG_ENDIAN, &pkt_count );
1673
121
    offset += 2;
1674
1675
121
    delta_array   = wmem_alloc0_array( pinfo->pool, uint8_t, pkt_count );
1676
121
    pkt_seq_array = wmem_alloc0_array( pinfo->pool, uint16_t, pkt_count );
1677
1678
    /* reference time */
1679
121
    proto_tree_add_item( fci_tree, hf_rtcp_rtpfb_transport_cc_fci_ref_time, tvb, offset, 3, ENC_BIG_ENDIAN );
1680
121
    offset += 3;
1681
1682
    /* feedback packet count */
1683
121
    proto_tree_add_item( fci_tree, hf_rtcp_rtpfb_transport_cc_fci_fb_pkt_cnt, tvb, offset, 1, ENC_BIG_ENDIAN );
1684
121
    offset += 1;
1685
1686
    /* packet chunk */
1687
121
    pkt_chunk_tree = proto_tree_add_subtree_format( fci_tree, tvb, offset, 0, ett_ssrc, NULL, "Packet Chunks" );
1688
1689
1.38k
    for (i = 0; i < pkt_count; )
1690
1.34k
    {
1691
1.34k
        uint32_t chunk = 0;
1692
1.34k
        item = proto_tree_add_item_ret_uint( pkt_chunk_tree, hf_rtcp_rtpfb_transport_cc_fci_pkt_chunk, tvb, offset, 2, ENC_BIG_ENDIAN, &chunk );
1693
1694
        /* Packet Status Symbols */
1695
        /**
1696
         * 00 Packet not received
1697
         * 01 Packet received, small delta
1698
         * 10 Packet received, large or negative delta
1699
         * 11 [Reserved]
1700
         */
1701
1.34k
        if ( !(chunk & 0x8000) )
1702
583
        {
1703
            /* Run length chunk, first bit is zero */
1704
583
            unsigned length = chunk & 0x1FFF;
1705
1706
583
            if ( length <= 0 || pkt_count - delta_index < length )
1707
86
            {
1708
                /* Malformed packet (zero or too many packets), stop parsing. */
1709
86
                proto_tree_add_expert(pkt_chunk_tree, pinfo, &ei_rtcp_rtpfb_transportcc_bad, tvb, offset, 2);
1710
86
                offset += 2;
1711
86
                return offset;
1712
86
            }
1713
1714
497
            if ( !(chunk & 0x6000) )
1715
161
            {
1716
161
                proto_item_append_text( item, " [Run Length Chunk] Packet not received. Length : %d", length);
1717
161
                pkt_seq_num += length;
1718
161
            }
1719
336
            else if ( chunk & 0x2000 )
1720
155
            {
1721
155
                proto_item_append_text( item, " [Run Length Chunk] Small Delta. Length : %d", length);
1722
480k
                for (unsigned j = 0; j < length; j++)
1723
479k
                {
1724
                    /*1 means 1 byte delta, 2 means 2 bytes delta*/
1725
479k
                    delta_array[delta_index+j] = 1;
1726
479k
                    pkt_seq_array[delta_index+j] = pkt_seq_num++;
1727
479k
                }
1728
155
                delta_index += length;
1729
155
            }
1730
181
            else if ( chunk & 0x4000 )
1731
181
            {
1732
181
                proto_item_append_text( item, " [Run Length Chunk] Large or Negative Delta. Length : %d", length);
1733
400k
                for (unsigned j = 0; j < length; j++)
1734
400k
                {
1735
400k
                    delta_array[delta_index+j] = 2;
1736
400k
                    pkt_seq_array[delta_index+j] = pkt_seq_num++;
1737
400k
                }
1738
181
                delta_index += length;
1739
181
            }
1740
0
            else
1741
0
            {
1742
0
                proto_item_append_text( item, " [Run Length Chunk] [Reserved]. Length : %d", length);
1743
0
                pkt_seq_num += length;
1744
0
            }
1745
1746
497
            i += length;
1747
1748
497
        }
1749
765
        else
1750
765
        {
1751
765
            wmem_strbuf_t* status = wmem_strbuf_new(pinfo->pool, "|");
1752
1753
            /* Status Vector Chunk, first bit is one */
1754
765
            if ( !(chunk & 0x4000) )
1755
303
            {
1756
                /* 1 bit symbols */
1757
1758
303
                int data = chunk & 0x3FFF;
1759
303
                int chunk_count = 14;
1760
1761
4.53k
                for (int k = 0; k < chunk_count; k++)
1762
4.23k
                {
1763
4.23k
                    if ( (data & (0x2000>>k)) == 0 )
1764
2.05k
                    {
1765
2.05k
                        if ( i + k < pkt_count )
1766
2.05k
                        {
1767
2.05k
                            wmem_strbuf_append(status, " N |");
1768
2.05k
                            pkt_seq_num++;
1769
2.05k
                        }
1770
1
                        else
1771
1
                        {
1772
                            /* padding */
1773
1
                            wmem_strbuf_append(status, " _ |");
1774
1
                        }
1775
2.05k
                    }
1776
2.17k
                    else
1777
2.17k
                    {
1778
2.17k
                        if (delta_index >= pkt_count) {
1779
                            /* Malformed packet (too many status packets). */
1780
1
                            proto_tree_add_expert(pkt_chunk_tree, pinfo, &ei_rtcp_rtpfb_transportcc_bad, tvb, offset, 2);
1781
1
                            offset += 2;
1782
1
                            return offset;
1783
1
                        }
1784
2.17k
                        wmem_strbuf_append(status, " R |");
1785
2.17k
                        delta_array[delta_index] = 1;
1786
2.17k
                        pkt_seq_array[delta_index] = pkt_seq_num++;
1787
2.17k
                        delta_index++;
1788
2.17k
                    }
1789
4.23k
                }
1790
302
                proto_item_append_text( item, " [1 bit Status Vector Chunk]: %s", wmem_strbuf_get_str(status));
1791
302
                i += chunk_count;
1792
302
            }
1793
462
            else
1794
462
            {
1795
                /* 2 bits symbols */
1796
462
                int chunk_count = 7;
1797
462
                int data = chunk & 0x3FFF;
1798
1799
3.61k
                for (int k = 0; k < chunk_count; k++)
1800
3.15k
                {
1801
3.15k
                    switch ( (data & (0x3000 >> (2*k))) >> ( 2 * (6-k) ) )
1802
3.15k
                    {
1803
1.10k
                        case 0: /*00 packet not received*/
1804
1.10k
                            if ( i + k < pkt_count )
1805
1.09k
                            {
1806
1.09k
                                wmem_strbuf_append(status, " NR |");
1807
1.09k
                                pkt_seq_num++;
1808
1.09k
                            }
1809
4
                            else
1810
4
                            {
1811
                                /*padding*/
1812
4
                                wmem_strbuf_append(status, " __ |");
1813
4
                            }
1814
1.10k
                            break;
1815
1816
286
                        case 1: /*01 Packet received, small delta*/
1817
286
                            if (delta_index >= pkt_count) {
1818
                                /* Malformed packet (too many status packets). */
1819
0
                                proto_tree_add_expert(pkt_chunk_tree, pinfo, &ei_rtcp_rtpfb_transportcc_bad, tvb, offset, 2);
1820
0
                                offset += 2;
1821
0
                                return offset;
1822
0
                            }
1823
286
                            wmem_strbuf_append(status, " SD |");
1824
286
                            delta_array[delta_index] = 1;
1825
286
                            pkt_seq_array[delta_index] = pkt_seq_num++;
1826
286
                            delta_index++;
1827
286
                            break;
1828
1829
234
                        case 2: /*10 Packet received, large or negative delta*/
1830
234
                            if (delta_index >= pkt_count) {
1831
                                /* Malformed packet (too many status packets). */
1832
2
                                proto_tree_add_expert(pkt_chunk_tree, pinfo, &ei_rtcp_rtpfb_transportcc_bad, tvb, offset, 2);
1833
2
                                offset += 2;
1834
2
                                return offset;
1835
2
                            }
1836
232
                            wmem_strbuf_append(status, " LD |");
1837
232
                            delta_array[delta_index] = 2;
1838
232
                            pkt_seq_array[delta_index] = pkt_seq_num++;
1839
232
                            delta_index++;
1840
232
                            break;
1841
1842
1.53k
                        case 3: /*11 packet received, w/o(wrong? overflow?) timestamp*/
1843
1.53k
                        default:
1844
                            /*TODO: process overflow status which is not details on draft.*/
1845
1.53k
                            wmem_strbuf_append(status, " WO |");
1846
1.53k
                            pkt_seq_num++;
1847
1.53k
                            break;
1848
1849
3.15k
                    }
1850
3.15k
                }
1851
1852
460
                proto_item_append_text( item, " [2 bits Status Vector Chunk]: %s", wmem_strbuf_get_str(status));
1853
460
                i += chunk_count;
1854
460
            }
1855
1856
765
        }
1857
1858
1.25k
        offset += 2;
1859
1.25k
    }
1860
1861
    /* recv delta */
1862
32
    recv_delta_tree = proto_tree_add_subtree_format( fci_tree, tvb, offset, 0, ett_ssrc, NULL, "Recv Delta" );
1863
916
    for (i = 0; i < pkt_count; i++ )
1864
886
    {
1865
886
        if ( delta_array[i] == 1 )
1866
601
        {
1867
            /*1 byte delta*/
1868
601
            uint32_t delta;
1869
601
            item = proto_tree_add_item_ret_uint( recv_delta_tree, hf_rtcp_rtpfb_transport_cc_fci_recv_delta_1_byte, tvb, offset, 1, ENC_BIG_ENDIAN, &delta );
1870
1871
601
            proto_item_append_text( item, " Small Delta: [seq: %d] %lf ms", pkt_seq_array[i], delta*250.0/1000);
1872
1873
601
            offset += 1;
1874
601
        }
1875
285
        else if ( delta_array[i] == 2 )
1876
283
        {
1877
            /*2 bytes delta*/
1878
283
            int16_t delta;
1879
283
            item = proto_tree_add_item( recv_delta_tree, hf_rtcp_rtpfb_transport_cc_fci_recv_delta_2_bytes, tvb, offset, 2, ENC_BIG_ENDIAN);
1880
283
            delta = tvb_get_ntohs(tvb, offset);
1881
1882
283
            if ( delta < 0 )
1883
178
            {
1884
178
                proto_item_append_text( item, " Negative Delta: [seq: %d] %lf ms", pkt_seq_array[i], delta*250.0/1000 );
1885
178
            }
1886
105
            else
1887
105
            {
1888
105
                proto_item_append_text( item, " Large Delta: [seq: %d] %lf ms", pkt_seq_array[i], delta*250.0/1000 );
1889
105
            }
1890
1891
283
            offset += 2;
1892
283
        }
1893
2
        else
1894
2
        {
1895
            /*End with 0*/
1896
2
            break;
1897
2
        }
1898
886
    }
1899
1900
    /* padding */
1901
32
    padding_length = fci_length - (offset - padding_length);
1902
32
    if ( padding_length > 0 )
1903
7
    {
1904
7
        proto_tree_add_item( recv_delta_tree, hf_rtcp_rtpfb_transport_cc_fci_recv_delta_padding, tvb, offset, padding_length, ENC_BIG_ENDIAN );
1905
7
        offset += padding_length;
1906
7
        rtcp_padding_set = 0;  /* consume RTCP padding here */
1907
7
    }
1908
1909
    /* delta_array / pkt_seq_array will be freed out of pinfo->pool */
1910
32
    delta_array = NULL;
1911
32
    pkt_seq_array = NULL;
1912
1913
32
    return offset;
1914
121
}
1915
1916
static int
1917
dissect_rtcp_rtpfb_transport_cc( tvbuff_t *tvb, packet_info *pinfo, proto_tree *rtcp_tree, void *data _U_)
1918
32
{
1919
32
    unsigned offset = 0;
1920
1921
32
    unsigned packet_len = (tvb_get_uint16( tvb, offset + 2, ENC_BIG_ENDIAN) + 1) * 4;
1922
1923
32
    offset = dissect_rtcp_rtpfb_header( tvb, offset, rtcp_tree);
1924
1925
    /* SSRC of media source, 32 bits */
1926
32
    proto_tree_add_item( rtcp_tree, hf_rtcp_ssrc_media_source, tvb, offset, 4, ENC_BIG_ENDIAN );
1927
32
    offset += 4;
1928
1929
153
    while (offset < packet_len)
1930
121
    {
1931
121
        offset = dissect_rtcp_rtpfb_transport_cc_fci( tvb, offset, pinfo, rtcp_tree, packet_len);
1932
121
    }
1933
1934
32
    return offset;
1935
32
}
1936
1937
static int
1938
dissect_rtcp_rtpfb_nack_fci( tvbuff_t *tvb, unsigned offset, proto_tree *rtcp_tree, proto_item *top_item)
1939
401
{
1940
401
    int           i;
1941
401
    int           nack_num_frames_lost;
1942
401
    proto_tree   *bitfield_tree;
1943
401
    unsigned int  rtcp_rtpfb_nack_pid;
1944
401
    unsigned int  rtcp_rtpfb_nack_blp;
1945
401
    proto_item   *ti;
1946
1947
401
    proto_tree_add_item(rtcp_tree, hf_rtcp_rtpfb_nack_pid, tvb, offset, 2, ENC_BIG_ENDIAN);
1948
401
    rtcp_rtpfb_nack_pid = tvb_get_ntohs(tvb, offset);
1949
401
    offset += 2;
1950
1951
401
    ti = proto_tree_add_item(rtcp_tree, hf_rtcp_rtpfb_nack_blp, tvb, offset, 2, ENC_BIG_ENDIAN);
1952
401
    rtcp_rtpfb_nack_blp = tvb_get_ntohs(tvb, offset);
1953
401
    bitfield_tree = proto_item_add_subtree(ti, ett_rtcp_nack_blp);
1954
401
    nack_num_frames_lost = 1;
1955
401
    if (rtcp_rtpfb_nack_blp) {
1956
323
        proto_item_append_text(ti, " (Frames");
1957
5.49k
        for (i = 0; i < 16; i ++) {
1958
5.16k
            if (rtcp_rtpfb_nack_blp & (1<<i)) {
1959
2.29k
                proto_tree_add_uint_format(bitfield_tree, hf_rtcp_rtpfb_nack_pid, tvb, offset, 2, rtcp_rtpfb_nack_pid + i + 1,
1960
2.29k
                    "Frame %u also lost", rtcp_rtpfb_nack_pid + i + 1);
1961
2.29k
                proto_item_append_text(ti, " %u", rtcp_rtpfb_nack_pid + i + 1);
1962
2.29k
                nack_num_frames_lost ++;
1963
2.29k
            }
1964
5.16k
        }
1965
323
        proto_item_append_text(ti, " lost)");
1966
323
    } else {
1967
78
        proto_item_append_text(ti, " (No additional frames lost)");
1968
78
    }
1969
401
    offset += 2;
1970
1971
401
    if (top_item != NULL) {
1972
395
        proto_item_append_text(top_item, ": NACK: %d frames lost", nack_num_frames_lost);
1973
395
    }
1974
401
    return offset;
1975
401
}
1976
1977
static int
1978
dissect_rtcp_rtpfb_nack( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *rtcp_tree, void *data _U_)
1979
7
{
1980
7
    unsigned offset = 0;
1981
7
    proto_item *top_item = proto_tree_get_parent(rtcp_tree);
1982
1983
7
    unsigned packet_len = (tvb_get_uint16( tvb, offset + 2, ENC_BIG_ENDIAN) + 1) * 4;
1984
1985
7
    offset = dissect_rtcp_rtpfb_header( tvb, offset, rtcp_tree);
1986
1987
    /* SSRC of media source, 32 bits */
1988
7
    proto_tree_add_item( rtcp_tree, hf_rtcp_ssrc_media_source, tvb, offset, 4, ENC_BIG_ENDIAN );
1989
7
    offset += 4;
1990
1991
408
    while (offset < packet_len)
1992
401
    {
1993
401
        offset = dissect_rtcp_rtpfb_nack_fci( tvb, offset, rtcp_tree, top_item);
1994
401
    }
1995
1996
7
    return offset;
1997
7
}
1998
1999
static int
2000
dissect_rtcp_rtpfb_undecoded( tvbuff_t *tvb, packet_info *pinfo, proto_tree *rtcp_tree, void *data _U_)
2001
3
{
2002
3
    unsigned offset = 0;
2003
3
    unsigned packet_len = (tvb_get_uint16( tvb, offset + 2, ENC_BIG_ENDIAN) + 1) * 4;
2004
2005
3
    offset = dissect_rtcp_rtpfb_header( tvb, offset, rtcp_tree);
2006
2007
    /* SSRC of media source, 32 bits */
2008
3
    proto_tree_add_item( rtcp_tree, hf_rtcp_ssrc_media_source, tvb, offset, 4, ENC_BIG_ENDIAN );
2009
3
    offset += 4;
2010
2011
3
    proto_item *ti = proto_tree_add_item(rtcp_tree, hf_rtcp_fci, tvb, offset, packet_len - offset, ENC_NA );
2012
3
    expert_add_info(pinfo, ti, &ei_rtcp_rtpfb_fmt_not_implemented);
2013
2014
3
    return packet_len;
2015
3
}
2016
2017
static int
2018
dissect_rtcp_rtpfb( tvbuff_t *tvb, unsigned offset, proto_tree *rtcp_tree, packet_info *pinfo)
2019
51
{
2020
51
    unsigned int rtcp_rtpfb_fmt;
2021
51
    int          packet_length;
2022
2023
    /* Transport layer FB message */
2024
    /* Feedback message type (FMT): 5 bits */
2025
51
    rtcp_rtpfb_fmt = (tvb_get_uint8(tvb, offset) & 0x1f);
2026
2027
    /* Packet length in 32 bit words MINUS one, 16 bits */
2028
51
    packet_length = (tvb_get_ntohs(tvb, offset + 2) + 1) * 4;
2029
2030
51
    tvbuff_t *subtvb = tvb_new_subset_length(tvb, offset, packet_length);
2031
51
    if (dissector_try_uint (rtcp_rtpfb_dissector_table, rtcp_rtpfb_fmt, subtvb, pinfo, rtcp_tree))
2032
1
    {
2033
1
      return offset + packet_length;
2034
1
    }
2035
50
    else /* RTPFB FMT types that are still unassigned by IANA */
2036
50
    {
2037
50
      int start_offset = offset;
2038
2039
50
      offset = dissect_rtcp_rtpfb_header( tvb, offset, rtcp_tree);
2040
2041
      /* SSRC of media source, 32 bits */
2042
50
      proto_tree_add_item( rtcp_tree, hf_rtcp_ssrc_media_source, tvb, offset, 4, ENC_BIG_ENDIAN );
2043
50
      offset += 4;
2044
2045
50
      proto_tree_add_item(rtcp_tree, hf_rtcp_fci, tvb, offset, start_offset + packet_length - offset, ENC_NA );
2046
50
      return offset + packet_length;
2047
50
    }
2048
51
}
2049
2050
static int
2051
dissect_rtcp_psfb( tvbuff_t *tvb, unsigned offset, proto_tree *rtcp_tree,
2052
    unsigned packet_length, proto_item *top_item _U_, packet_info *pinfo _U_)
2053
9
{
2054
9
    unsigned int  counter;
2055
9
    unsigned int  num_fci;
2056
9
    unsigned int  read_fci;
2057
9
    proto_tree   *fci_tree;
2058
9
    proto_item   *ti;
2059
9
    unsigned int  rtcp_psfb_fmt;
2060
9
    int           base_offset = offset;
2061
9
    int           i;
2062
2063
    /* Payload-specific FB message */
2064
    /* Feedback message type (FMT): 5 bits */
2065
9
    proto_tree_add_item( rtcp_tree, hf_rtcp_psfb_fmt, tvb, offset, 1, ENC_BIG_ENDIAN );
2066
9
    rtcp_psfb_fmt = (tvb_get_uint8(tvb, offset) & 0x1f);
2067
9
    col_append_fstr(pinfo->cinfo, COL_INFO, "%s  ",
2068
9
                  val_to_str_const(rtcp_psfb_fmt, rtcp_psfb_fmt_summary_vals, "Unknown"));
2069
2070
9
    offset++;
2071
2072
    /* Packet type, 8 bits */
2073
9
    proto_tree_add_item( rtcp_tree, hf_rtcp_pt, tvb, offset, 1, ENC_BIG_ENDIAN );
2074
9
    offset++;
2075
2076
    /* Packet length in 32 bit words MINUS one, 16 bits */
2077
9
    num_fci = (tvb_get_ntohs(tvb, offset) - 2);
2078
9
    offset  = dissect_rtcp_length_field(rtcp_tree, tvb, offset);
2079
2080
    /* SSRC of packet sender, 32 bits */
2081
9
    proto_tree_add_item( rtcp_tree, hf_rtcp_ssrc_sender, tvb, offset, 4, ENC_BIG_ENDIAN );
2082
9
    offset += 4;
2083
2084
    /* SSRC of media source, 32 bits */
2085
9
    ti = proto_tree_add_item( rtcp_tree, hf_rtcp_ssrc_media_source, tvb, offset, 4, ENC_BIG_ENDIAN );
2086
    /* Decode if it is NONE or ANY and add to line */
2087
9
    proto_item_append_text(ti," %s", val_to_str_const(tvb_get_ntohl(tvb,offset), rtcp_ssrc_values, ""));
2088
9
    offset += 4;
2089
2090
    /* Check if we have a type specific dissector,
2091
     * if we do, just return from here
2092
     */
2093
9
    if (packet_length > 12) {
2094
8
      tvbuff_t *subtvb = tvb_new_subset_length(tvb, offset, packet_length - 12);
2095
2096
8
      if (dissector_try_uint (rtcp_psfb_dissector_table, rtcp_psfb_fmt,
2097
8
              subtvb, pinfo, rtcp_tree))
2098
0
        return base_offset + packet_length;
2099
8
    }
2100
2101
    /* Feedback Control Information (FCI) */
2102
9
    counter  = 0;
2103
9
    read_fci = 0;
2104
112
    while ( read_fci < num_fci ) {
2105
108
        switch (rtcp_psfb_fmt)
2106
108
        {
2107
7
        case 1:     /* Picture Loss Indications (PLI) */
2108
7
        {
2109
            /* Handle MS PLI Extension */
2110
7
            fci_tree = proto_tree_add_subtree_format( rtcp_tree, tvb, offset, 12, ett_ssrc, NULL, "MS PLI");
2111
7
            proto_tree_add_item( fci_tree, hf_rtcp_psfb_pli_ms_request_id, tvb, offset, 2, ENC_BIG_ENDIAN );
2112
7
            offset += 2;
2113
            /* 2 reserved bytes */
2114
7
            offset += 2;
2115
47
            for (i = 0 ; i < 8 ; i++)
2116
40
            {
2117
40
                ti = proto_tree_add_item( fci_tree, hf_rtcp_psfb_pli_ms_sfr, tvb, offset, 1, ENC_BIG_ENDIAN );
2118
40
                proto_item_prepend_text(ti,"PRID %d - %d ",
2119
40
                        i * 8, (i+1) * 8 - 1);
2120
40
                offset++;
2121
40
            }
2122
7
            read_fci += 3;
2123
7
            break;
2124
0
        }
2125
54
        case 2:     /* Slice Loss Indication (SLI) */
2126
            /* Handle SLI */
2127
54
            fci_tree = proto_tree_add_subtree_format( rtcp_tree, tvb, offset, 4, ett_ssrc, NULL, "SLI %u", ++counter );
2128
54
            proto_tree_add_item( fci_tree, hf_rtcp_psfb_sli_first,      tvb, offset, 4, ENC_BIG_ENDIAN );
2129
54
            proto_tree_add_item( fci_tree, hf_rtcp_psfb_sli_number,     tvb, offset, 4, ENC_BIG_ENDIAN );
2130
54
            proto_tree_add_item( fci_tree, hf_rtcp_psfb_sli_picture_id, tvb, offset, 4, ENC_BIG_ENDIAN );
2131
54
            offset +=4;
2132
54
            read_fci++;
2133
54
            break;
2134
44
        case 4:     /* Handle FIR */
2135
44
        {
2136
            /* Create a new subtree for a length of 8 bytes */
2137
44
            fci_tree  = proto_tree_add_subtree_format( rtcp_tree, tvb, offset, 8, ett_ssrc, NULL, "FIR %u", ++counter );
2138
            /* SSRC 32 bit*/
2139
44
            proto_tree_add_item( fci_tree, hf_rtcp_psfb_fir_fci_ssrc, tvb, offset, 4, ENC_BIG_ENDIAN );
2140
44
            offset   += 4;
2141
            /* Command Sequence Number 8 bit*/
2142
44
            proto_tree_add_item( fci_tree, hf_rtcp_psfb_fir_fci_csn, tvb, offset, 1, ENC_BIG_ENDIAN );
2143
            /*proto_tree_add_item( ssrc_tree, hf_rtcp_ssrc_source, tvb, offset, 4, ENC_BIG_ENDIAN );*/
2144
44
            offset   += 1;
2145
            /* Reserved 24 bit*/
2146
44
            proto_tree_add_item( fci_tree, hf_rtcp_psfb_fir_fci_reserved, tvb, offset, 3, ENC_BIG_ENDIAN );
2147
44
            offset   += 3;
2148
44
            read_fci += 2;
2149
44
            break;
2150
0
        }
2151
0
        case 15:
2152
0
        {
2153
            /*
2154
             * Handle Application Layer Feedback messages.
2155
             *
2156
             * XXX - how do we determine how to interpret these?
2157
             *
2158
             * REMB (Receiver Estimated Maximum Bitrate) is, according
2159
             * to section 2.3 "Signaling of use of this extension" of
2160
             * https://tools.ietf.org/html/draft-alvestrand-rmcat-remb-03,
2161
             * indicated as an SDP option when the session is set up.
2162
             *
2163
             * MS-RTP is, according to MS-RTP and according to MS-SDPEXT
2164
             * section 3.1.5.30.2 "a=rtcp-fb attribute", indicated as an
2165
             * SDP option when the session is set up.
2166
             *
2167
             * Those would work if we have the SDP setup traffic and parse
2168
             * the a=rtcp-fb attribute, but if we don't, we'd need to have
2169
             * the user specify it somehow.
2170
             */
2171
0
            uint32_t magic_value = tvb_get_ntohl( tvb, offset);
2172
            /* look for string literal 'REMB' which is 0x52454d42 hex */
2173
0
            if (magic_value == 0x52454d42) {
2174
                /* Handle REMB (Receiver Estimated Maximum Bitrate) - https://tools.ietf.org/html/draft-alvestrand-rmcat-remb-00 */
2175
0
                offset = dissect_rtcp_psfb_remb(tvb, offset, rtcp_tree, top_item, counter, &read_fci);
2176
0
            } else {
2177
                /* Handle MS Application Layer Feedback Messages - MS-RTP */
2178
0
                offset = dissect_rtcp_asfb_ms(tvb, offset, rtcp_tree, pinfo);
2179
0
                read_fci = num_fci;     /* Consume all the bytes. */
2180
0
            }
2181
0
            break;
2182
0
        }
2183
0
        case 3:             /* Reference Picture Selection Indication (RPSI) - Not decoded*/
2184
3
        default:
2185
            /* Consume anything left so it doesn't make an infinite loop. */
2186
3
            read_fci = num_fci;
2187
3
            break;
2188
108
        }
2189
108
    }
2190
2191
    /* Append undecoded FCI information */
2192
4
    if ((packet_length - (offset - base_offset)) > 0) {
2193
3
        proto_tree_add_item( rtcp_tree, hf_rtcp_fci, tvb, offset, packet_length - (offset - base_offset), ENC_NA );
2194
3
        offset = base_offset + packet_length;
2195
3
    }
2196
4
    return offset;
2197
9
}
2198
2199
static int
2200
dissect_rtcp_fir( tvbuff_t *tvb, unsigned offset, proto_tree *tree )
2201
5
{
2202
    /* Packet type = FIR (H261) */
2203
5
    proto_tree_add_item( tree, hf_rtcp_rc, tvb, offset, 1, ENC_BIG_ENDIAN );
2204
5
    offset++;
2205
    /* Packet type, 8 bits  = APP */
2206
5
    proto_tree_add_item( tree, hf_rtcp_pt, tvb, offset, 1, ENC_BIG_ENDIAN );
2207
5
    offset++;
2208
2209
    /* Packet length in 32 bit words minus one */
2210
5
    offset = dissect_rtcp_length_field(tree, tvb, offset);
2211
2212
    /* SSRC  */
2213
5
    proto_tree_add_item( tree, hf_rtcp_ssrc_source, tvb, offset, 4, ENC_BIG_ENDIAN );
2214
5
    offset += 4;
2215
2216
5
    return offset;
2217
5
}
2218
static int
2219
dissect_rtcp_app_poc1(tvbuff_t* tvb, packet_info* pinfo, unsigned offset, proto_tree* tree,
2220
   unsigned packet_len, proto_item* subtype_item, unsigned rtcp_subtype)
2221
0
{
2222
    /* PoC1 Application */
2223
0
    unsigned      item_len;
2224
0
    uint8_t     t2timer_code, participants_code;
2225
0
    unsigned      sdes_type;
2226
0
    proto_tree* PoC1_tree;
2227
0
    proto_item* PoC1_item;
2228
0
    unsigned padding;
2229
0
    char* str_rtcp_subtype;
2230
2231
0
    str_rtcp_subtype = val_to_str(pinfo->pool, rtcp_subtype, rtcp_app_poc1_floor_cnt_type_vals, "unknown (%u)");
2232
0
    proto_item_append_text(subtype_item, " %s", str_rtcp_subtype);
2233
0
    col_add_fstr(pinfo->cinfo, COL_INFO, "(PoC1) %s", str_rtcp_subtype);
2234
0
    offset += 4;
2235
0
    packet_len -= 4;
2236
0
    if (packet_len == 0)
2237
0
        return offset;      /* No more data */
2238
    /* Create a subtree for the PoC1 Application items; we don't yet know
2239
       the length */
2240
2241
       /* Top-level poc tree */
2242
0
    PoC1_item = proto_tree_add_item(tree, hf_rtcp_app_poc1, tvb, offset, packet_len, ENC_NA);
2243
0
    PoC1_tree = proto_item_add_subtree(PoC1_item, ett_PoC1);
2244
2245
    /* Dissect it according to its subtype */
2246
0
    switch (rtcp_subtype) {
2247
2248
0
    case TBCP_BURST_REQUEST:
2249
0
    {
2250
0
        uint8_t code;
2251
0
        uint16_t priority;
2252
2253
        /* Both items here are optional */
2254
0
        if (tvb_reported_length_remaining(tvb, offset) == 0)
2255
0
        {
2256
0
            return offset;
2257
0
        }
2258
2259
        /* Look for a code in the first byte */
2260
0
        code = tvb_get_uint8(tvb, offset);
2261
0
        offset += 1;
2262
2263
        /* Priority (optional) */
2264
0
        if (code == 102)
2265
0
        {
2266
0
            item_len = tvb_get_uint8(tvb, offset);
2267
0
            offset += 1;
2268
0
            if (item_len != 2) /* SHALL be 2 */
2269
0
                return offset;
2270
2271
0
            priority = tvb_get_ntohs(tvb, offset);
2272
0
            proto_tree_add_item(PoC1_tree, hf_rtcp_app_poc1_priority, tvb, offset, 2, ENC_BIG_ENDIAN);
2273
0
            offset += 2;
2274
2275
0
            col_append_fstr(pinfo->cinfo, COL_INFO,
2276
0
                " \"%s\"",
2277
0
                val_to_str_const(priority,
2278
0
                    rtcp_app_poc1_qsresp_priority_vals,
2279
0
                    "Unknown"));
2280
2281
            /* Look for (optional) next code */
2282
0
            if (tvb_reported_length_remaining(tvb, offset) == 0)
2283
0
            {
2284
0
                return offset;
2285
0
            }
2286
0
            code = tvb_get_uint8(tvb, offset);
2287
0
            offset += 1;
2288
2289
0
        }
2290
2291
        /* Request timestamp (optional) */
2292
0
        if (code == 103)
2293
0
        {
2294
0
            char* buff;
2295
2296
0
            item_len = tvb_get_uint8(tvb, offset);
2297
0
            offset += 1;
2298
0
            if (item_len != 8) /* SHALL be 8 */
2299
0
                return offset;
2300
2301
0
            proto_tree_add_item_ret_time_string(PoC1_tree, hf_rtcp_app_poc1_request_ts, tvb, offset, 8, ENC_TIME_NTP | ENC_BIG_ENDIAN, pinfo->pool, &buff);
2302
2303
0
            offset += 8;
2304
2305
0
            col_append_fstr(pinfo->cinfo, COL_INFO, " ts=\"%s\"", buff);
2306
0
        }
2307
0
    }
2308
0
    break;
2309
2310
0
    case TBCP_BURST_GRANTED:
2311
0
    {
2312
0
        proto_item* ti;
2313
0
        uint16_t    stop_talking_time;
2314
0
        uint16_t    participants;
2315
2316
        /* Stop talking timer (now mandatory) */
2317
0
        t2timer_code = tvb_get_uint8(tvb, offset);
2318
0
        offset += 1;
2319
0
        if (t2timer_code != 101) /* SHALL be 101 */
2320
0
            return offset;
2321
2322
0
        item_len = tvb_get_uint8(tvb, offset);
2323
0
        offset += 1;
2324
0
        if (item_len != 2) /* SHALL be 2 */
2325
0
            return offset;
2326
2327
0
        stop_talking_time = tvb_get_ntohs(tvb, offset);
2328
0
        ti = proto_tree_add_item(PoC1_tree, hf_rtcp_app_poc1_stt, tvb, offset, 2, ENC_BIG_ENDIAN);
2329
2330
        /* Append text with meanings of value */
2331
0
        switch (stop_talking_time)
2332
0
        {
2333
0
        case 0:
2334
0
            proto_item_append_text(ti, " unknown");
2335
0
            break;
2336
0
        case 65535:
2337
0
            proto_item_append_text(ti, " infinity");
2338
0
            break;
2339
0
        default:
2340
0
            proto_item_append_text(ti, " seconds");
2341
0
            break;
2342
0
        }
2343
0
        offset += item_len;
2344
2345
0
        col_append_fstr(pinfo->cinfo, COL_INFO, " stop-talking-time=%u",
2346
0
            stop_talking_time);
2347
2348
        /* Participants (optional) */
2349
0
        if (tvb_reported_length_remaining(tvb, offset) == 0)
2350
0
        {
2351
0
            return offset;
2352
0
        }
2353
0
        participants_code = tvb_get_uint8(tvb, offset);
2354
0
        offset += 1;
2355
0
        if (participants_code != 100) /* SHALL be 100 */
2356
0
            return offset;
2357
2358
0
        item_len = tvb_get_uint8(tvb, offset);
2359
0
        offset += 1;
2360
0
        if (item_len != 2) /* SHALL be 2 */
2361
0
            return offset;
2362
2363
0
        participants = tvb_get_ntohs(tvb, offset);
2364
0
        ti = proto_tree_add_item(PoC1_tree, hf_rtcp_app_poc1_partic, tvb, offset, 2, ENC_BIG_ENDIAN);
2365
2366
        /* Append text with meanings of extreme values */
2367
0
        switch (participants)
2368
0
        {
2369
0
        case 0:
2370
0
            proto_item_append_text(ti, " (not known)");
2371
0
            break;
2372
0
        case 65535:
2373
0
            proto_item_append_text(ti, " (or more)");
2374
0
            break;
2375
0
        default:
2376
0
            break;
2377
0
        }
2378
0
        offset += item_len;
2379
2380
0
        col_append_fstr(pinfo->cinfo, COL_INFO, " participants=%u",
2381
0
            participants);
2382
0
    }
2383
0
    break;
2384
2385
0
    case TBCP_BURST_TAKEN_EXPECT_NO_REPLY:
2386
0
    case TBCP_BURST_TAKEN_EXPECT_REPLY:
2387
0
    {
2388
0
        uint16_t participants;
2389
0
        proto_item* ti;
2390
2391
        /* SSRC of PoC client */
2392
0
        proto_tree_add_item(PoC1_tree, hf_rtcp_app_poc1_ssrc_granted, tvb, offset, 4, ENC_BIG_ENDIAN);
2393
0
        offset += 4;
2394
0
        packet_len -= 4;
2395
2396
        /* SDES type (must be CNAME) */
2397
0
        sdes_type = tvb_get_uint8(tvb, offset);
2398
0
        proto_tree_add_item(PoC1_tree, hf_rtcp_sdes_type, tvb, offset, 1, ENC_BIG_ENDIAN);
2399
0
        offset++;
2400
0
        packet_len--;
2401
0
        if (sdes_type != RTCP_SDES_CNAME)
2402
0
        {
2403
0
            return offset;
2404
0
        }
2405
2406
        /* SIP URI */
2407
0
        item_len = tvb_get_uint8(tvb, offset);
2408
        /* Item len of 1 because it's an FT_UINT_STRING... */
2409
0
        proto_tree_add_item(PoC1_tree, hf_rtcp_app_poc1_sip_uri,
2410
0
            tvb, offset, 1, ENC_ASCII | ENC_BIG_ENDIAN);
2411
0
        offset++;
2412
2413
0
        col_append_fstr(pinfo->cinfo, COL_INFO, " CNAME=\"%s\"",
2414
0
            tvb_get_string_enc(pinfo->pool, tvb, offset, item_len, ENC_ASCII));
2415
2416
0
        offset += item_len;
2417
0
        packet_len = packet_len - item_len - 1;
2418
2419
        /* In the application dependent data, the TBCP Talk Burst Taken message SHALL carry
2420
         * a SSRC field and SDES items, CNAME and MAY carry SDES item NAME to identify the
2421
         * PoC Client that has been granted permission to send a Talk Burst.
2422
         *
2423
         * The SDES item NAME SHALL be included if it is known by the PoC Server.
2424
         * Therefore the length of the packet will vary depending on number of SDES items
2425
         * and the size of the SDES items.
2426
         */
2427
0
        if (packet_len == 0)
2428
0
            return offset;
2429
2430
        /* SDES type (must be NAME if present) */
2431
0
        sdes_type = tvb_get_uint8(tvb, offset);
2432
0
        if (sdes_type == RTCP_SDES_NAME) {
2433
0
            proto_tree_add_item(PoC1_tree, hf_rtcp_sdes_type, tvb, offset, 1, ENC_BIG_ENDIAN);
2434
0
            offset++;
2435
0
            packet_len--;
2436
2437
            /* Display name */
2438
0
            item_len = tvb_get_uint8(tvb, offset);
2439
            /* Item len of 1 because it's an FT_UINT_STRING... */
2440
0
            proto_tree_add_item(PoC1_tree, hf_rtcp_app_poc1_disp_name,
2441
0
                tvb, offset, 1, ENC_ASCII | ENC_BIG_ENDIAN);
2442
0
            offset++;
2443
2444
0
            col_append_fstr(pinfo->cinfo, COL_INFO, " DISPLAY-NAME=\"%s\"",
2445
0
                tvb_get_string_enc(pinfo->pool, tvb, offset, item_len, ENC_ASCII));
2446
2447
0
            offset += item_len;
2448
0
            packet_len = packet_len - item_len - 1;
2449
2450
0
            if (packet_len == 0) {
2451
0
                return offset;
2452
0
            }
2453
2454
            /* Move onto next 4-byte boundary */
2455
0
            offset = WS_ROUNDUP_4(offset);
2456
0
        }
2457
2458
        /* Participants (optional) */
2459
0
        if (tvb_reported_length_remaining(tvb, offset) == 0) {
2460
0
            return offset;
2461
0
        }
2462
0
        participants_code = tvb_get_uint8(tvb, offset);
2463
0
        offset += 1;
2464
0
        if (participants_code != 100) { /* SHALL be 100 */
2465
0
            return offset;
2466
0
        }
2467
0
        item_len = tvb_get_uint8(tvb, offset);
2468
0
        offset += 1;
2469
0
        if (item_len != 2) { /* SHALL be 2 */
2470
0
            return offset;
2471
0
        }
2472
2473
0
        participants = tvb_get_ntohs(tvb, offset);
2474
0
        ti = proto_tree_add_item(PoC1_tree, hf_rtcp_app_poc1_partic, tvb, offset, 2, ENC_BIG_ENDIAN);
2475
2476
        /* Append text with meanings of extreme values */
2477
0
        switch (participants) {
2478
0
        case 0:
2479
0
            proto_item_append_text(ti, " (not known)");
2480
0
            break;
2481
0
        case 65535:
2482
0
            proto_item_append_text(ti, " (or more)");
2483
0
            break;
2484
0
        default:
2485
0
            break;
2486
0
        }
2487
2488
0
        col_append_fstr(pinfo->cinfo, COL_INFO, " Participants=%u",
2489
0
            participants);
2490
0
        offset += item_len;
2491
0
    }
2492
0
    break;
2493
2494
0
    case TBCP_BURST_DENY:
2495
0
    {
2496
0
        uint8_t reason_code;
2497
2498
        /* Reason code */
2499
0
        reason_code = tvb_get_uint8(tvb, offset);
2500
0
        proto_tree_add_item(PoC1_tree, hf_rtcp_app_poc1_reason_code1, tvb, offset, 1, ENC_BIG_ENDIAN);
2501
0
        offset++;
2502
0
        packet_len--;
2503
2504
0
        col_append_fstr(pinfo->cinfo, COL_INFO, " reason-code=\"%s\"",
2505
0
            val_to_str_const(reason_code,
2506
0
                rtcp_app_poc1_reason_code1_vals,
2507
0
                "Unknown"));
2508
2509
        /* Reason phrase */
2510
0
        item_len = tvb_get_uint8(tvb, offset);
2511
0
        if (item_len != 0) {
2512
0
            proto_tree_add_item(PoC1_tree, hf_rtcp_app_poc1_reason1_phrase, tvb, offset, 1, ENC_ASCII | ENC_BIG_ENDIAN);
2513
0
        }
2514
2515
0
        offset += (item_len + 1);
2516
0
    }
2517
0
    break;
2518
2519
0
    case TBCP_BURST_RELEASE:
2520
0
    {
2521
0
        uint16_t last_seq_no;
2522
        /*uint16_t ignore_last_seq_no;*/
2523
2524
        /* Sequence number of last RTP packet in burst */
2525
0
        proto_tree_add_item(PoC1_tree, hf_rtcp_app_poc1_last_pkt_seq_no, tvb, offset, 2, ENC_BIG_ENDIAN);
2526
0
        last_seq_no = tvb_get_ntohs(tvb, offset);
2527
2528
        /* Bit 16 is ignore flag */
2529
0
        offset += 2;
2530
0
        proto_tree_add_item(PoC1_tree, hf_rtcp_app_poc1_ignore_seq_no, tvb, offset, 2, ENC_BIG_ENDIAN);
2531
        /*ignore_last_seq_no = (tvb_get_ntohs(tvb, offset) & 0x8000);*/
2532
2533
                        /* XXX: Was the intention to also show the "ignore_last_seq_no' flag in COL_INFO ? */
2534
0
        col_append_fstr(pinfo->cinfo, COL_INFO, " last_rtp_seq_no=%u",
2535
0
            last_seq_no);
2536
2537
        /* 15 bits of padding follows */
2538
2539
0
        offset += 2;
2540
0
    }
2541
0
    break;
2542
2543
0
    case TBCP_BURST_IDLE:
2544
0
        break;
2545
2546
0
    case TBCP_BURST_REVOKE:
2547
0
    {
2548
        /* Reason code */
2549
0
        uint16_t reason_code = tvb_get_ntohs(tvb, offset);
2550
0
        proto_tree_add_item(PoC1_tree, hf_rtcp_app_poc1_reason_code2, tvb, offset, 2, ENC_BIG_ENDIAN);
2551
2552
        /* The meaning of this field depends upon the reason code... */
2553
0
        switch (reason_code)
2554
0
        {
2555
0
        case 1: /* Only one user */
2556
            /* No additional info */
2557
0
            break;
2558
0
        case 2: /* Talk burst too long */
2559
            /* Additional info is 16 bits with time (in seconds) client can request */
2560
0
            proto_tree_add_item(PoC1_tree, hf_rtcp_app_poc1_new_time_request, tvb, offset + 2, 2, ENC_BIG_ENDIAN);
2561
0
            break;
2562
0
        case 3: /* No permission */
2563
            /* No additional info */
2564
0
            break;
2565
0
        case 4: /* Pre-empted */
2566
            /* No additional info */
2567
0
            break;
2568
0
        }
2569
2570
0
        col_append_fstr(pinfo->cinfo, COL_INFO, " reason-code=\"%s\"",
2571
0
            val_to_str_const(reason_code,
2572
0
                rtcp_app_poc1_reason_code2_vals,
2573
0
                "Unknown"));
2574
0
        offset += 4;
2575
0
    }
2576
0
    break;
2577
2578
0
    case TBCP_BURST_ACKNOWLEDGMENT:
2579
0
    {
2580
0
        uint8_t subtype;
2581
2582
        /* Code of message being acknowledged */
2583
0
        subtype = (tvb_get_uint8(tvb, offset) & 0xf8) >> 3;
2584
0
        proto_tree_add_item(PoC1_tree, hf_rtcp_app_poc1_ack_subtype, tvb, offset, 1, ENC_BIG_ENDIAN);
2585
2586
0
        col_append_fstr(pinfo->cinfo, COL_INFO, " (for %s)",
2587
0
            val_to_str_const(subtype,
2588
0
                rtcp_app_poc1_floor_cnt_type_vals,
2589
0
                "Unknown"));
2590
2591
        /* Reason code only seen if subtype was Connect */
2592
0
        if (subtype == TBCP_CONNECT)
2593
0
        {
2594
0
            proto_tree_add_item(PoC1_tree, hf_rtcp_app_poc1_ack_reason_code, tvb, offset, 2, ENC_BIG_ENDIAN);
2595
0
        }
2596
2597
        /* 16 bits of padding follow */
2598
0
        offset += 4;
2599
0
    }
2600
0
    break;
2601
2602
0
    case TBCP_QUEUE_STATUS_REQUEST:
2603
0
        break;
2604
2605
0
    case TBCP_QUEUE_STATUS_RESPONSE:
2606
0
    {
2607
0
        uint16_t    position;
2608
0
        proto_item* ti;
2609
2610
        /* Priority */
2611
0
        proto_tree_add_item(PoC1_tree, hf_rtcp_app_poc1_qsresp_priority, tvb, offset, 1, ENC_BIG_ENDIAN);
2612
2613
        /* Queue position. 65535 indicates 'position not available' */
2614
0
        position = tvb_get_ntohs(tvb, offset + 1);
2615
0
        ti = proto_tree_add_item(PoC1_tree, hf_rtcp_app_poc1_qsresp_position, tvb, offset + 1, 2, ENC_BIG_ENDIAN);
2616
0
        if (position == 0)
2617
0
        {
2618
0
            proto_item_append_text(ti, " (client is un-queued)");
2619
0
        }
2620
0
        if (position == 65535)
2621
0
        {
2622
0
            proto_item_append_text(ti, " (position not available)");
2623
0
        }
2624
2625
0
        col_append_fstr(pinfo->cinfo, COL_INFO, " position=%u", position);
2626
2627
        /* 1 bytes of padding  follows */
2628
2629
0
        offset += 4;
2630
0
    }
2631
0
    break;
2632
2633
0
    case TBCP_DISCONNECT:
2634
0
        break;
2635
2636
0
    case TBCP_CONNECT:
2637
0
    {
2638
0
        proto_item* content;
2639
0
        proto_tree* content_tree = proto_tree_add_subtree(PoC1_tree, tvb, offset, 2,
2640
0
            ett_poc1_conn_contents, &content, "SDES item content");
2641
0
        bool          contents[5];
2642
0
        unsigned int  i;
2643
0
        uint8_t       items_set = 0;
2644
2645
0
        uint16_t items_field = tvb_get_ntohs(tvb, offset);
2646
2647
        /* Dissect each defined bit flag in the SDES item content */
2648
0
        for (i = 0; i < 5; i++)
2649
0
        {
2650
0
            proto_tree_add_item(content_tree, hf_rtcp_app_poc1_conn_content[i], tvb, offset, 2, ENC_BIG_ENDIAN);
2651
0
            contents[i] = items_field & (1 << (15 - i));
2652
0
            if (contents[i]) ++items_set;
2653
0
        }
2654
2655
        /* Show how many flags were set */
2656
0
        proto_item_append_text(content, " (%u items)", items_set);
2657
2658
        /* Session type */
2659
0
        proto_tree_add_item(PoC1_tree, hf_rtcp_app_poc1_conn_session_type, tvb, offset + 2, 1, ENC_BIG_ENDIAN);
2660
2661
        /* Additional indications */
2662
0
        proto_tree_add_item(PoC1_tree, hf_rtcp_app_poc1_conn_add_ind_mao, tvb, offset + 3, 1, ENC_BIG_ENDIAN);
2663
2664
0
        offset += 4;
2665
0
        packet_len -= 4;
2666
2667
        /* One SDES item for every set flag in contents array */
2668
0
        for (i = 0; i < array_length(contents); ++i) {
2669
0
            if (contents[i]) {
2670
0
                unsigned /*sdes_type2,*/ sdes_len2;
2671
                /* (sdes_type2 not currently used...).  Could complain if type
2672
                   doesn't match expected for item... */
2673
                   /*sdes_type2 = tvb_get_uint8( tvb, offset );*/
2674
0
                offset += 1;
2675
0
                sdes_len2 = tvb_get_uint8(tvb, offset);
2676
2677
                /* Add SDES field indicated as present */
2678
0
                proto_tree_add_item(PoC1_tree, hf_rtcp_app_poc1_conn_sdes_items[i], tvb, offset, 1, ENC_BIG_ENDIAN);
2679
2680
                /* Move past field */
2681
0
                offset += sdes_len2 + 1;
2682
0
                packet_len -= (sdes_len2 + 2);
2683
0
            }
2684
0
        }
2685
0
        break;
2686
0
    }
2687
2688
0
    default:
2689
0
        break;
2690
0
    }
2691
2692
0
    padding = WS_PADDING_TO_4(offset);
2693
0
    if (padding) {
2694
0
        proto_tree_add_item(PoC1_tree, hf_rtcp_app_data_padding, tvb, offset, padding, ENC_BIG_ENDIAN);
2695
0
        offset += padding;
2696
0
    }
2697
2698
2699
0
    return offset;
2700
0
}
2701
2702
static const value_string rtcp_mcptt_rej_cause_floor_deny_vals[] = {
2703
    { 0x1, "Another MCPTT client has permission" },
2704
    { 0x2, "Internal floor control server error" },
2705
    { 0x3, "Only one participant" },
2706
    { 0x4, "Retry-after timer has not expired" },
2707
    { 0x5, "Receive only" },
2708
    { 0x6, "No resources available" },
2709
    { 0x7, "Queue full" },
2710
    { 0xff, "Other reason" },
2711
    { 0, NULL },
2712
};
2713
2714
static const value_string rtcp_mcptt_rej_cause_floor_revoke_vals[] = {
2715
    { 0x1, "Only one MCPTT client" },
2716
    { 0x2, "Media burst too long" },
2717
    { 0x3, "No permission to send a Media Burst" },
2718
    { 0x4, "Media Burst pre-empted" },
2719
    { 0x6, "No resources available" },
2720
    { 0xff, "Other reason" },
2721
    { 0, NULL },
2722
};
2723
2724
static const value_string rtcp_mcptt_perm_to_req_floor_vals[] = {
2725
    { 0x0, "The receiver is not permitted to request floor" },
2726
    { 0x1, "The receiver is permitted to request floor" },
2727
    { 0, NULL },
2728
};
2729
2730
static const value_string rtcp_mcptt_source_vals[] = {
2731
    { 0x0, "The floor participant is the source" },
2732
    { 0x1, "The participating MCPTT function is the source" },
2733
    { 0x2, "The controlling MCPTT function is the source" },
2734
    { 0x3, "The non-controlling MCPTT function is the source" },
2735
    { 0, NULL },
2736
};
2737
2738
static const value_string rtcp_mcptt_loc_type_vals[] = {
2739
    { 0x0, "Not provided" },
2740
    { 0x1, "ECGI" },
2741
    { 0x2, "Tracking Area" },
2742
    { 0x3, "PLMN ID" },
2743
    { 0x4, "MBMS Service Area" },
2744
    { 0x5, "MBSFN Area ID" },
2745
    { 0x6, "Geographic coordinates" },
2746
    { 0, NULL },
2747
};
2748
2749
static int
2750
dissect_rtcp_mcptt_location_ie(tvbuff_t* tvb, packet_info* pinfo, unsigned offset, proto_tree* tree)
2751
0
{
2752
0
    uint32_t loc_type;
2753
0
    static int * const ECGI_flags[] = {
2754
0
        &hf_rtcp_mcptt_enodebid,
2755
0
        &hf_rtcp_mcptt_cellid,
2756
0
        NULL
2757
0
    };
2758
2759
    /* Location  Type */
2760
0
    proto_tree_add_item_ret_uint(tree, hf_rtcp_mcptt_loc_type, tvb, offset, 1, ENC_BIG_ENDIAN, &loc_type);
2761
0
    offset += 1;
2762
2763
0
    switch (loc_type) {
2764
0
    case 0:
2765
        /* Not provided */
2766
0
        break;
2767
0
    case 1:
2768
        /* ECGI - 56 bits = MCC + MNC + ECI*/
2769
0
        dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, tree, offset, E212_ECGI, true);
2770
0
        offset += 3;
2771
0
        proto_tree_add_bitmask(tree, tvb, offset, hf_rtcp_mcptt_ecgi_eci, ett_rtcp_mcptt_eci, ECGI_flags, ENC_BIG_ENDIAN);
2772
0
        offset += 4;
2773
0
        break;
2774
0
    case 2:
2775
        /* Tracking Area - 40 bits = MCC + MNC + 16 bits */
2776
        /* ECGI - 56 bits = MCC + MNC + ECI*/
2777
0
        dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, tree, offset, E212_ECGI, true);
2778
0
        offset += 3;
2779
0
        proto_tree_add_item(tree, hf_rtcp_mcptt_tac, tvb, offset, 2, ENC_BIG_ENDIAN);
2780
0
        offset += 2;
2781
0
        break;
2782
0
    case 3:
2783
        /* PLMN ID - 24 bits = MCC+MNC */
2784
0
        dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, tree, offset, E212_ECGI, true);
2785
0
        offset += 3;
2786
0
        break;
2787
0
    case 4:
2788
        /* MBMS Service Area - 16 bits = [0-65535] */
2789
0
        proto_tree_add_item(tree, hf_rtcp_mcptt_mbms_serv_area, tvb, offset, 2, ENC_BIG_ENDIAN);
2790
0
        offset += 2;
2791
0
        break;
2792
0
    case 5:
2793
        /* MBSFN Area ID - 8 bits = [0-255] */
2794
0
        proto_tree_add_item(tree, hf_rtcp_mcptt_mbsfn_area_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2795
0
        offset += 1;
2796
0
        break;
2797
0
    case 6:
2798
        /* Geographic coordinates - 48 bits = latitude in first 24 bits + longitude in last 24 bits coded as
2799
         * in subclause 6.1 in 3GPP TS 23.032
2800
         * XXX Make use of dissect_geographical_description() ?
2801
         */
2802
0
        proto_tree_add_item(tree, hf_rtcp_mcptt_lat, tvb, offset, 3, ENC_BIG_ENDIAN);
2803
0
        offset += 3;
2804
0
        proto_tree_add_item(tree, hf_rtcp_mcptt_long, tvb, offset, 3, ENC_BIG_ENDIAN);
2805
0
        offset += 3;
2806
0
        break;
2807
0
    default:
2808
0
        proto_tree_add_expert(tree, pinfo, &ei_rtcp_mcptt_location_type, tvb, offset-1, 1);
2809
0
        break;
2810
0
    }
2811
2812
0
    return offset;
2813
0
}
2814
2815
/* TS 24.380 */
2816
static int
2817
dissect_rtcp_app_mcpt(tvbuff_t* tvb, packet_info* pinfo, unsigned offset, proto_tree* tree,
2818
    unsigned packet_len, proto_item* subtype_item, unsigned rtcp_subtype)
2819
0
{
2820
2821
0
    proto_tree* sub_tree;
2822
0
    uint32_t mcptt_fld_id, mcptt_fld_len;
2823
0
    char* str_rtcp_subtype;
2824
0
    proto_item* ti;
2825
2826
0
    str_rtcp_subtype = val_to_str(pinfo->pool, rtcp_subtype, rtcp_mcpt_subtype_vals, "unknown (%u)");
2827
2828
0
    col_add_fstr(pinfo->cinfo, COL_INFO, "(MCPT) %s", str_rtcp_subtype);
2829
0
    proto_item_append_text(subtype_item, " %s", str_rtcp_subtype);
2830
2831
0
    sub_tree = proto_tree_add_subtree(tree, tvb, offset, packet_len, ett_rtcp_mcpt, NULL,
2832
0
        "Mission Critical Push To Talk(MCPTT)");
2833
0
    offset += 4;
2834
0
    packet_len -= 4;
2835
2836
0
    if (packet_len == 0) {
2837
0
        return offset;
2838
0
    }
2839
2840
0
    while (packet_len > 0) {
2841
0
        unsigned len_len;
2842
0
        unsigned padding;
2843
0
        int start_offset = offset;
2844
        /* Field ID 8 bits*/
2845
0
        ti = proto_tree_add_item_ret_uint(sub_tree, hf_rtcp_mcptt_fld_id, tvb, offset, 1, ENC_BIG_ENDIAN, &mcptt_fld_id);
2846
0
        offset++;
2847
        /* Length value
2848
         * a length value which is:
2849
         *  - one octet long, if the field ID is less than 192; and
2850
         *  - two octets long, if the field ID is equal to or greater than 192;
2851
         */
2852
0
        if (mcptt_fld_id < 192) {
2853
0
            len_len = 1;
2854
0
        } else {
2855
0
            len_len = 2;
2856
0
        }
2857
0
        proto_tree_add_item_ret_uint(sub_tree, hf_rtcp_mcptt_fld_len, tvb, offset, len_len, ENC_BIG_ENDIAN, &mcptt_fld_len);
2858
0
        offset += len_len;
2859
2860
0
        padding = WS_PADDING_TO_4(1 + len_len + mcptt_fld_len);
2861
0
        if (mcptt_fld_len != 0) {
2862
            /* Field Value */
2863
0
            switch (mcptt_fld_id) {
2864
0
            case 0:
2865
                /* Floor Priority */
2866
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcptt_priority, tvb, offset, 2, ENC_BIG_ENDIAN);
2867
0
                offset += 2;
2868
0
                break;
2869
0
            case 1:
2870
                /* Duration */
2871
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcptt_duration, tvb, offset, 2, ENC_BIG_ENDIAN);
2872
0
                offset += 2;
2873
0
                break;
2874
0
            case 2:
2875
0
            {
2876
                /* Reject Cause */
2877
0
                uint32_t cause = 0;
2878
0
                switch (rtcp_subtype) {
2879
0
                case 3:
2880
                    /* Floor deny */
2881
0
                    proto_tree_add_item_ret_uint(sub_tree, hf_rtcp_mcptt_rej_cause_floor_deny, tvb, offset, 2, ENC_BIG_ENDIAN, &cause);
2882
0
                    col_append_fstr(pinfo->cinfo, COL_INFO, " - %s",
2883
0
                        val_to_str_const(cause, rtcp_mcptt_rej_cause_floor_deny_vals, "Unknown"));
2884
0
                    break;
2885
0
                case 6:
2886
                    /* Floor revoke */
2887
0
                    proto_tree_add_item_ret_uint(sub_tree, hf_rtcp_mcptt_rej_cause_floor_revoke, tvb, offset, 2, ENC_BIG_ENDIAN, &cause);
2888
0
                    col_append_fstr(pinfo->cinfo, COL_INFO, " - %s",
2889
0
                        val_to_str_const(cause, rtcp_mcptt_rej_cause_floor_deny_vals, "Unknown"));
2890
0
                    break;
2891
0
                default:
2892
0
                    proto_tree_add_item(sub_tree, hf_rtcp_mcptt_rej_cause, tvb, offset, 2, ENC_BIG_ENDIAN);
2893
0
                    break;
2894
0
                }
2895
0
                offset += 2;
2896
                /* If the length field is set to '2', there is no <Reject Phrase> value in the Reject Cause field */
2897
0
                if (mcptt_fld_len == 2) {
2898
0
                    break;
2899
0
                }
2900
                /* Reject Phrase */
2901
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcptt_rej_phrase, tvb, offset, mcptt_fld_len - 2, ENC_UTF_8);
2902
0
                offset += (mcptt_fld_len - 2);
2903
0
                break;
2904
0
            }
2905
0
            case 3:
2906
                /* Queue Info*/
2907
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcptt_queue_pos_inf, tvb, offset, 1, ENC_BIG_ENDIAN);
2908
0
                offset += 1;
2909
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcptt_queue_pri_lev, tvb, offset, 1, ENC_BIG_ENDIAN);
2910
0
                offset += 1;
2911
0
                break;
2912
0
            case 4:
2913
0
            case 106:
2914
                /* Granted Party's Identity */
2915
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcptt_granted_partys_id, tvb, offset, mcptt_fld_len, ENC_UTF_8);
2916
0
                offset += mcptt_fld_len;
2917
0
                break;
2918
0
            case 5:
2919
                /* Permission to Request the Floor */
2920
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcptt_perm_to_req_floor, tvb, offset, 2, ENC_BIG_ENDIAN);
2921
0
                offset += 2;
2922
0
                break;
2923
0
            case 6:
2924
                /* User ID */
2925
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcptt_user_id, tvb, offset, mcptt_fld_len, ENC_UTF_8);
2926
0
                offset += mcptt_fld_len;
2927
0
                break;
2928
0
            case 7:
2929
                /* Queue Size */
2930
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcptt_queue_size, tvb, offset, 2, ENC_BIG_ENDIAN);
2931
0
                offset += 2;
2932
0
                break;
2933
0
            case 8:
2934
                /* Message Sequence-Number */
2935
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcptt_msg_seq_num, tvb, offset, 2, ENC_BIG_ENDIAN);
2936
0
                offset += 2;
2937
0
                break;
2938
0
            case 9:
2939
                /* Queued User ID */
2940
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcptt_queued_user_id, tvb, offset, mcptt_fld_len, ENC_UTF_8);
2941
0
                offset += mcptt_fld_len;
2942
0
                break;
2943
0
            case 10:
2944
                /* Source */
2945
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcptt_source, tvb, offset, 2, ENC_BIG_ENDIAN);
2946
0
                offset += 2;
2947
0
                break;
2948
0
            case 11:
2949
0
            {
2950
0
                uint32_t fld_len, num_ref;
2951
0
                int rem_len = mcptt_fld_len;
2952
0
                proto_tree* part_tree;
2953
                /* Track Info */
2954
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcptt_queueing_cap, tvb, offset, 1, ENC_BIG_ENDIAN);
2955
0
                offset += 1;
2956
0
                rem_len -= 1;
2957
0
                proto_tree_add_item_ret_uint(sub_tree, hf_rtcp_mcptt_part_type_len, tvb, offset, 1, ENC_BIG_ENDIAN, &fld_len);
2958
0
                offset += 1;
2959
0
                rem_len -= 1;
2960
0
                unsigned part_type_padding = WS_PADDING_TO_4(fld_len);
2961
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcptt_participant_type, tvb, offset, fld_len, ENC_UTF_8);
2962
0
                offset += fld_len;
2963
0
                rem_len -= fld_len;
2964
0
                if(part_type_padding != 0){
2965
0
                    uint32_t data;
2966
0
                    proto_tree_add_item_ret_uint(sub_tree, hf_rtcp_app_data_padding, tvb, offset, part_type_padding, ENC_BIG_ENDIAN, &data);
2967
0
                    if (data != 0) {
2968
0
                        proto_tree_add_expert(sub_tree, pinfo, &ei_rtcp_appl_non_zero_pad, tvb, offset, part_type_padding);
2969
0
                    }
2970
0
                    offset += part_type_padding;
2971
0
                    rem_len -= part_type_padding;
2972
0
                }
2973
0
                if (rem_len > 0) {
2974
0
                    num_ref = 1;
2975
                    /* Floor Participant Reference */
2976
0
                    while (rem_len > 0) {
2977
0
                        part_tree = proto_tree_add_subtree_format(sub_tree, tvb, offset, 4, ett_rtcp_mcptt_participant_ref, NULL, "Floor Participant Reference %u", num_ref);
2978
0
                        proto_tree_add_item(part_tree, hf_rtcp_mcptt_participant_ref, tvb, offset, 4, ENC_BIG_ENDIAN);
2979
0
                        offset += 4;
2980
0
                        rem_len -= 4;
2981
0
                        num_ref++;
2982
0
                    }
2983
0
                }
2984
0
                break;
2985
0
            }
2986
0
            case 12:
2987
                /* Message Type */
2988
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcptt_msg_type, tvb, offset, 1, ENC_NA);
2989
0
                offset += 1;
2990
0
                proto_tree_add_item(sub_tree, hf_rtcp_spare8, tvb, offset, 1, ENC_NA);
2991
0
                offset += 1;
2992
0
                break;
2993
0
            case 13:
2994
0
            {
2995
                /* Floor Indicator TS 24.380 V 18.6.0 */
2996
0
                static int* const floor_ind_flags[] = {
2997
0
                    &hf_rtcp_mcptt_floor_ind_normal,
2998
0
                    &hf_rtcp_mcptt_floor_ind_broadcast,
2999
0
                    &hf_rtcp_mcptt_floor_ind_system,
3000
0
                    &hf_rtcp_mcptt_floor_ind_emergency,
3001
0
                    &hf_rtcp_mcptt_floor_ind_imminent_peril,
3002
0
                    &hf_rtcp_mcptt_floor_ind_queueing_supported,
3003
0
                    &hf_rtcp_mcptt_floor_ind_dual_floor,
3004
0
                    &hf_rtcp_mcptt_floor_ind_temp_group,
3005
0
                    &hf_rtcp_mcptt_floor_ind_multi_talker,
3006
0
                    NULL
3007
0
                };
3008
0
                proto_tree_add_bitmask(sub_tree, tvb, offset, hf_rtcp_mcptt_floor_ind, ett_rtcp_mcptt_floor_ind, floor_ind_flags, ENC_BIG_ENDIAN);
3009
0
                offset += 2;
3010
0
                break;
3011
0
            }
3012
0
            case 14:
3013
                /* SSRC */
3014
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcptt_ssrc, tvb, offset, 4, ENC_BIG_ENDIAN);
3015
0
                offset += 4;
3016
0
                proto_tree_add_item(sub_tree, hf_rtcp_spare16, tvb, offset, 2, ENC_BIG_ENDIAN);
3017
0
                offset += 2;
3018
0
                break;
3019
0
            case 15:
3020
                /* List of Granted Users */
3021
0
            {
3022
0
                uint32_t num_users, user_id_len;
3023
                /* No of users */
3024
0
                proto_tree_add_item_ret_uint(sub_tree, hf_rtcp_mcptt_num_users, tvb, offset, 1, ENC_BIG_ENDIAN, &num_users);
3025
0
                offset += 1;
3026
0
                while (num_users > 0) {
3027
0
                    proto_tree_add_item_ret_uint(sub_tree, hf_rtcp_mcptt_user_id_len, tvb, offset, 1, ENC_BIG_ENDIAN, &user_id_len);
3028
0
                    offset += 1;
3029
0
                    proto_tree_add_item(sub_tree, hf_rtcp_mcptt_user_id, tvb, offset, user_id_len, ENC_UTF_8);
3030
0
                    offset += user_id_len;
3031
0
                    num_users--;
3032
0
                }
3033
0
                break;
3034
0
            }
3035
0
            case 16:
3036
                /* List of SSRCs */
3037
0
            {
3038
0
                uint32_t num_ssrc;
3039
                /* Number of SSRCs*/
3040
0
                proto_tree_add_item_ret_uint(sub_tree, hf_rtcp_mcptt_num_ssrc, tvb, offset, 1, ENC_BIG_ENDIAN, &num_ssrc);
3041
0
                offset += 1;
3042
0
                proto_tree_add_item(sub_tree, hf_rtcp_spare8, tvb, offset, 1, ENC_BIG_ENDIAN);
3043
0
                offset += 1;
3044
3045
0
                while (num_ssrc > 0) {
3046
0
                    proto_tree_add_item(sub_tree, hf_rtcp_mcptt_ssrc, tvb, offset, 4, ENC_BIG_ENDIAN);
3047
0
                    offset += 4;
3048
0
                    num_ssrc--;
3049
0
                }
3050
0
                break;
3051
0
            }
3052
0
            case 17:
3053
                /* Functional Alias */
3054
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcptt_func_alias, tvb, offset, mcptt_fld_len, ENC_UTF_8);
3055
0
                offset += mcptt_fld_len;
3056
0
                break;
3057
3058
0
            case 18:
3059
                /* List of Functional Aliases */
3060
0
            {
3061
0
                uint32_t num_fas, fa_len;
3062
                /* No of FAs */
3063
0
                proto_tree_add_item_ret_uint(sub_tree, hf_rtcp_mcptt_num_fas, tvb, offset, 1, ENC_BIG_ENDIAN, &num_fas);
3064
0
                offset += 1;
3065
0
                while (num_fas > 0) {
3066
0
                    proto_tree_add_item_ret_uint(sub_tree, hf_rtcp_mcptt_fa_len, tvb, offset, 1, ENC_BIG_ENDIAN, &fa_len);
3067
0
                    offset += 1;
3068
0
                    proto_tree_add_item(sub_tree, hf_rtcp_mcptt_func_alias, tvb, offset, fa_len, ENC_UTF_8);
3069
0
                    offset += fa_len;
3070
0
                    num_fas--;
3071
0
                }
3072
0
                break;
3073
0
            }
3074
3075
0
            case 19:
3076
                /* Location */
3077
0
                offset = dissect_rtcp_mcptt_location_ie(tvb, pinfo, offset, sub_tree);
3078
0
                break;
3079
0
            case 20:
3080
                /* List of Locations */
3081
0
            {
3082
0
                uint32_t num_loc;
3083
                /* Number of Locations*/
3084
0
                proto_tree_add_item_ret_uint(sub_tree, hf_rtcp_mcptt_num_loc, tvb, offset, 1, ENC_BIG_ENDIAN, &num_loc);
3085
0
                offset += 1;
3086
3087
0
                while (num_loc > 0) {
3088
0
                    offset = dissect_rtcp_mcptt_location_ie(tvb, pinfo, offset, sub_tree);
3089
0
                    num_loc--;
3090
0
                }
3091
0
                break;
3092
0
            }
3093
3094
0
            default:
3095
0
                expert_add_info(pinfo, ti, &ei_rtcp_mcptt_unknown_fld);
3096
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcptt_fld_val, tvb, offset, mcptt_fld_len, ENC_NA);
3097
0
                offset += mcptt_fld_len;
3098
0
                break;
3099
0
            }
3100
0
        }
3101
0
        if (padding) {
3102
0
            uint32_t data;
3103
0
            ti = proto_tree_add_item_ret_uint(sub_tree, hf_rtcp_app_data_padding, tvb, offset, padding, ENC_BIG_ENDIAN, &data);
3104
0
            if (data != 0) {
3105
0
                expert_add_info(pinfo, ti, &ei_rtcp_appl_non_zero_pad);
3106
0
            }
3107
0
            offset += padding;
3108
0
        }
3109
0
        packet_len -= (offset - start_offset);
3110
0
        if (packet_len >= 4) {
3111
0
            uint32_t dword = tvb_get_ntohl(tvb, offset);
3112
0
            if (dword == 0) {
3113
                /* Extra 4 zero bytes */
3114
0
                proto_tree_add_expert(sub_tree, pinfo, &ei_rtcp_appl_extra_bytes, tvb, offset, 4);
3115
0
                packet_len -= 4;
3116
0
                offset += 4;
3117
0
            }
3118
0
        }
3119
0
    }
3120
3121
0
    return offset;
3122
0
}
3123
3124
/* TS 24.380 */
3125
static int
3126
dissect_rtcp_app_mcpc(tvbuff_t* tvb, packet_info* pinfo, unsigned offset, proto_tree* tree,
3127
    unsigned packet_len, proto_item* subtype_item, unsigned rtcp_subtype)
3128
0
{
3129
3130
0
    proto_tree* sub_tree;
3131
0
    uint32_t mcpc_fld_id, mcpc_fld_len;
3132
0
    char* str_rtcp_subtype;
3133
0
    proto_item *ti;
3134
3135
0
    str_rtcp_subtype = val_to_str(pinfo->pool, rtcp_subtype, rtcp_mcpc_subtype_vals, "unknown (%u)");
3136
3137
0
    col_add_fstr(pinfo->cinfo, COL_INFO, "(MCPC) %s", str_rtcp_subtype);
3138
0
    proto_item_append_text(subtype_item, " %s", str_rtcp_subtype);
3139
3140
0
    sub_tree = proto_tree_add_subtree(tree, tvb, offset, packet_len, ett_rtcp_mcpc, NULL,
3141
0
        "Mission Critical Pre-established session call control");
3142
0
    offset += 4;
3143
0
    packet_len -= 4;
3144
3145
0
    if (packet_len == 0) {
3146
0
        return offset;
3147
0
    }
3148
3149
0
    while (packet_len > 0) {
3150
0
        unsigned len_len;
3151
0
        unsigned padding;
3152
0
        int start_offset = offset;
3153
        /* Field ID 8 bits*/
3154
0
        ti = proto_tree_add_item_ret_uint(sub_tree, hf_rtcp_mcpc_fld_id, tvb, offset, 1, ENC_BIG_ENDIAN, &mcpc_fld_id);
3155
0
        offset++;
3156
        /* Length value
3157
         * a length value which is:
3158
         *  - one octet long, if the field ID is less than 192; and
3159
         *  - two octets long, if the field ID is equal to or greater than 192;
3160
         */
3161
0
        if (mcpc_fld_id < 192) {
3162
0
            len_len = 1;
3163
0
        } else {
3164
0
            len_len = 2;
3165
0
        }
3166
0
        proto_tree_add_item_ret_uint(sub_tree, hf_rtcp_mcpc_fld_len, tvb, offset, len_len, ENC_BIG_ENDIAN, &mcpc_fld_len);
3167
0
        offset += len_len;
3168
3169
0
        padding = WS_PADDING_TO_4(1 + len_len + mcpc_fld_len);
3170
0
        if (mcpc_fld_len != 0) {
3171
           /* Field Value */
3172
0
            switch (mcpc_fld_id) {
3173
0
            case 0:
3174
                /* Media Streams */
3175
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcpc_media_streams, tvb, offset, 1, ENC_BIG_ENDIAN);
3176
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcpc_ctrl_channel, tvb, offset + 1, 1, ENC_BIG_ENDIAN );
3177
0
                break;
3178
0
            case 1:
3179
                /* MCPTT Session Identity */
3180
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcpc_mcptt_session_type, tvb, offset, 1, ENC_BIG_ENDIAN);
3181
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcpc_mcptt_session_id, tvb, offset + 1, mcpc_fld_len - 1, ENC_ASCII);
3182
0
                break;
3183
0
            case 2:
3184
0
            {
3185
                /* Warning Text */
3186
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcpc_warning, tvb, offset, mcpc_fld_len, ENC_ASCII);
3187
0
                break;
3188
0
            }
3189
0
            case 3:
3190
                /* MCPTT Group Identity */
3191
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcpc_mcptt_group_id, tvb, offset, mcpc_fld_len, ENC_ASCII);
3192
0
                break;
3193
0
            case 4:
3194
                /* Answer State */
3195
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcpc_answer_state, tvb, offset, 2, ENC_BIG_ENDIAN);
3196
0
                break;
3197
0
            case 5:
3198
                /* Inviting MCPTT User Identity */
3199
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcpc_mcptt_user_id, tvb, offset, mcpc_fld_len, ENC_ASCII);
3200
0
                break;
3201
0
            case 6:
3202
                /* Reason Code */
3203
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcpc_reason_code, tvb, offset, 2, ENC_BIG_ENDIAN);
3204
0
                break;
3205
0
            case 7:
3206
                /* Reason Cause */
3207
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcpc_reason_cause, tvb, offset, 2, ENC_BIG_ENDIAN);
3208
0
                break;
3209
0
            case 8:
3210
                /* Invited MCPTT User Identity */
3211
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcpc_invited_mcptt_user_id, tvb, offset, mcpc_fld_len, ENC_ASCII);
3212
0
                break;
3213
0
            case 192:
3214
                /* PCK I_MESSAGE */
3215
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcpc_pck_imessage, tvb, offset, mcpc_fld_len, ENC_NA);
3216
0
                break;
3217
0
            default:
3218
0
                expert_add_info(pinfo, ti, &ei_rtcp_mcpc_unknown_fld);
3219
0
                proto_tree_add_item(sub_tree, hf_rtcp_mcpc_fld_val, tvb, offset, mcpc_fld_len, ENC_NA);
3220
0
                break;
3221
0
            }
3222
0
            offset += mcpc_fld_len;
3223
0
        }
3224
0
        if (padding) {
3225
0
            uint32_t data;
3226
0
            ti = proto_tree_add_item_ret_uint(sub_tree, hf_rtcp_app_data_padding, tvb, offset, padding, ENC_BIG_ENDIAN, &data);
3227
0
            if (data != 0) {
3228
0
                expert_add_info(pinfo, ti, &ei_rtcp_appl_non_zero_pad);
3229
0
            }
3230
0
            offset += padding;
3231
0
        }
3232
3233
0
        packet_len -= (offset - start_offset);
3234
0
        if (packet_len >= 4) {
3235
0
            uint32_t dword = tvb_get_ntohl(tvb, offset);
3236
0
            if (dword == 0) {
3237
                /* Extra 4 zero bytes */
3238
0
                proto_tree_add_expert(sub_tree, pinfo, &ei_rtcp_appl_extra_bytes, tvb, offset, 4);
3239
0
                packet_len -= 4;
3240
0
                offset += 4;
3241
0
            }
3242
0
        }
3243
0
    }
3244
3245
0
    return offset;
3246
0
}
3247
3248
/* TS 24.380 V 13.2.0*/
3249
static int
3250
dissect_rtcp_app_mccp(tvbuff_t* tvb, packet_info* pinfo, unsigned offset, proto_tree* tree,
3251
    unsigned packet_len, proto_item* subtype_item, unsigned rtcp_subtype)
3252
0
{
3253
3254
0
    proto_tree* sub_tree;
3255
0
    uint32_t mccp_fld_id, mccp_fld_len;
3256
0
    int total_packet_length;
3257
0
    char* str_rtcp_subtype;
3258
3259
0
    str_rtcp_subtype = val_to_str(pinfo->pool, rtcp_subtype, rtcp_mccp_subtype_vals, "unknown (%u)");
3260
3261
0
    col_add_fstr(pinfo->cinfo, COL_INFO, "(MCCP) %s", str_rtcp_subtype);
3262
0
    proto_item_append_text(subtype_item, " %s", str_rtcp_subtype);
3263
3264
0
    if (packet_len <= 0) {
3265
0
        total_packet_length = tvb_reported_length_remaining(tvb, offset);
3266
0
        proto_tree_add_expert_format(tree, pinfo, &ei_rtcp_length_check, tvb, offset, total_packet_length,
3267
0
            "Incorrect RTCP packet length information (expected 0 bytes, found %d)",
3268
0
            total_packet_length);
3269
0
        packet_len = total_packet_length;
3270
0
    }
3271
3272
0
    sub_tree = proto_tree_add_subtree(tree, tvb, offset, packet_len, ett_rtcp_mcpt, NULL,
3273
0
        "MBMS subchannel control");
3274
3275
0
    offset += 4;
3276
0
    packet_len -= 4;
3277
3278
0
    if (packet_len == 0) {
3279
0
        return offset;
3280
0
    }
3281
3282
0
    while (packet_len > 0) {
3283
0
        proto_item* ti;
3284
0
        unsigned padding;
3285
0
        int start_offset = offset;
3286
3287
        /* Each MBMS subchannel control specific field consists of an 8-bit <Field ID> item,
3288
         * an 8-bit octet <Length> value item containing the length of the field value not
3289
         * including <Field ID> or the <Length> value items.
3290
         */
3291
0
        ti = proto_tree_add_item_ret_uint(sub_tree, hf_rtcp_mccp_field_id, tvb, offset, 1, ENC_BIG_ENDIAN, &mccp_fld_id);
3292
0
        offset += 1;
3293
0
        packet_len -= 1;
3294
0
        proto_tree_add_item_ret_uint(sub_tree, hf_rtcp_mccp_len, tvb, offset, 1, ENC_BIG_ENDIAN, &mccp_fld_len);
3295
0
        offset += 1;
3296
0
        packet_len -= 1;
3297
0
        padding = WS_PADDING_TO_4(2 + mccp_fld_len);
3298
0
        switch (mccp_fld_id) {
3299
0
        case 0:
3300
0
        {
3301
            /* Subchannel */
3302
            /*The <Audio m-line Number> value shall consist of 4 bit parameter giving the
3303
             * number of the" m=audio" m-line in the SIP MESSAGE request announcing
3304
             * the MBMS bearer described in 3GPP TS 24.379
3305
             */
3306
0
            uint32_t ip_ver, floor_m_line_no;
3307
0
            proto_tree_add_item(sub_tree, hf_rtcp_mccp_audio_m_line_no, tvb, offset, 1, ENC_BIG_ENDIAN);
3308
            /* The <Floor m-line Number> value shall consist of 4 bit parameter giving the
3309
             * number of the "m=application" m-line in the SIP MESSAGE request announcing
3310
             * the MBMS bearer described in 3GPP TS 24.379 */
3311
0
            proto_tree_add_item_ret_uint(sub_tree, hf_rtcp_mccp_floor_m_line_no, tvb, offset, 1, ENC_BIG_ENDIAN, &floor_m_line_no);
3312
0
            offset += 1;
3313
            /* IP version */
3314
0
            proto_tree_add_item_ret_uint(sub_tree, hf_rtcp_mccp_ip_version, tvb, offset, 1, ENC_BIG_ENDIAN, &ip_ver);
3315
0
            offset += 1;
3316
            /* Floor Port Number
3317
             * If the <Floor m-line Number> value is equal to '0',
3318
             * the <Floor control Port Number> value is not included in the MBMS Subchannel field.
3319
             */
3320
0
            if (floor_m_line_no > 0) {
3321
0
                proto_tree_add_item(sub_tree, hf_rtcp_mccp_floor_port_no, tvb, offset, 4, ENC_BIG_ENDIAN);
3322
0
                offset += 4;
3323
0
            }
3324
            /* Media Port Number */
3325
0
            proto_tree_add_item(sub_tree, hf_rtcp_mccp_media_port_no, tvb, offset, 4, ENC_BIG_ENDIAN);
3326
0
            offset += 4;
3327
            /* IP Address */
3328
0
            if (ip_ver == 0) {
3329
0
                proto_tree_add_item(sub_tree, hf_rtcp_mccp_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
3330
0
                offset += 4;
3331
0
            } else {
3332
0
                proto_tree_add_item(sub_tree, hf_rtcp_mccp_ipv6, tvb, offset, 16, ENC_NA);
3333
0
                offset += 16;
3334
0
            }
3335
0
        }
3336
0
            break;
3337
0
        case 1:
3338
            /* TMGI */
3339
0
        {
3340
0
            proto_tree* tmgi_tree;
3341
0
            ti = proto_tree_add_item(sub_tree, hf_rtcp_mccp_tmgi, tvb, offset, mccp_fld_len, ENC_NA);
3342
0
            tmgi_tree = proto_item_add_subtree(ti, ett_rtcp_mccp_tmgi);
3343
0
            de_sm_tmgi(tvb, tmgi_tree, pinfo, offset, mccp_fld_len, NULL, 0);
3344
0
            offset += mccp_fld_len;
3345
0
        }
3346
0
            break;
3347
0
        case 3:
3348
            /* MCPTT Group ID */
3349
0
            proto_tree_add_item(sub_tree, hf_rtcp_mcptt_group_id, tvb, offset, mccp_fld_len, ENC_UTF_8);
3350
0
            offset += mccp_fld_len;
3351
0
            break;
3352
0
        default:
3353
0
            expert_add_info(pinfo, ti, &ei_rtcp_mcptt_unknown_fld);
3354
0
            proto_tree_add_item(sub_tree, hf_rtcp_mcptt_fld_val, tvb, offset, mccp_fld_len, ENC_NA);
3355
0
            offset += mccp_fld_len;
3356
0
            break;
3357
0
        }
3358
0
        if (padding) {
3359
0
            proto_tree_add_item(sub_tree, hf_rtcp_app_data_padding, tvb, offset, padding, ENC_BIG_ENDIAN);
3360
0
            offset += padding;
3361
0
        }
3362
0
        packet_len -= (offset - start_offset);
3363
0
        if (packet_len >= 4) {
3364
            /*
3365
             * XXX - what is this?  Where is it specified?
3366
             */
3367
0
            uint32_t dword;
3368
0
            if (mccp_fld_len % 4) {
3369
0
                dword = tvb_get_ntohl(tvb, offset);
3370
0
                padding = (4 - (mccp_fld_len % 4));
3371
0
                dword = dword >> (padding * 8);
3372
0
                if (dword == 0) {
3373
                    /* Extra 4 zero bytes */
3374
0
                    proto_tree_add_expert(sub_tree, pinfo, &ei_rtcp_appl_extra_bytes, tvb, offset, padding);
3375
0
                    packet_len -= padding;
3376
0
                    offset += padding;
3377
0
                }
3378
0
            }
3379
0
        }
3380
3381
0
    }
3382
0
    return offset;
3383
0
}
3384
static int
3385
dissect_rtcp_app( tvbuff_t *tvb,packet_info *pinfo, unsigned offset, proto_tree *tree, unsigned packet_len,
3386
                  proto_item *subtype_item, unsigned rtcp_subtype, uint32_t app_length )
3387
10
{
3388
3389
10
    const char* ascii_name;
3390
10
    bool is_ascii;
3391
3392
    /* XXX If more application types are to be dissected it may be useful to use a table like in packet-sip.c */
3393
10
    static const char poc1_app_name_str[] = "PoC1";
3394
10
    static const char mux_app_name_str[] = "3GPP";
3395
3396
    /* Application Name (ASCII) */
3397
10
    is_ascii = tvb_ascii_isprint(tvb, offset, 4);
3398
10
    if (is_ascii) {
3399
4
        proto_tree_add_item_ret_string(tree, hf_rtcp_name_ascii, tvb, offset, 4, ENC_ASCII | ENC_NA, pinfo->pool, (const uint8_t**)&ascii_name);
3400
6
    } else {
3401
6
        proto_tree_add_expert(tree, pinfo, &ei_rtcp_appl_not_ascii, tvb, offset, 4);
3402
6
    }
3403
3404
    /* Applications specific data */
3405
10
    if (rtcp_padding_set) {
3406
        /* If there's padding present, we have to remove that from the data part
3407
        * The last octet of the packet contains the length of the padding
3408
        */
3409
3
        packet_len -= tvb_get_uint8(tvb, offset + packet_len - 1);
3410
3
    }
3411
3412
10
    if (is_ascii) {
3413
        /* See if we can handle this application type */
3414
4
        if (g_ascii_strncasecmp(ascii_name, poc1_app_name_str, 4) == 0)
3415
0
        {
3416
0
            offset = dissect_rtcp_app_poc1(tvb, pinfo, offset, tree, packet_len, subtype_item, rtcp_subtype);
3417
4
        } else if (g_ascii_strncasecmp(ascii_name, mux_app_name_str, 4) == 0)
3418
0
        {
3419
            /* 3GPP Nb protocol extension (3GPP 29.414) for RTP Multiplexing */
3420
0
            col_append_fstr(pinfo->cinfo, COL_INFO, "( %s ) subtype=%u", ascii_name, rtcp_subtype);
3421
0
            offset += 4;
3422
0
            packet_len -= 4;
3423
            /* Applications specific data */
3424
0
            if (rtcp_padding_set) {
3425
                /* If there's padding present, we have to remove that from the data part
3426
                * The last octet of the packet contains the length of the padding
3427
                */
3428
0
                packet_len -= tvb_get_uint8(tvb, offset + packet_len - 1);
3429
0
            }
3430
0
            if (packet_len == 4)
3431
0
            {
3432
0
                uint16_t local_port = 0;
3433
3434
0
                proto_item* mux_item = proto_tree_add_item(tree, hf_rtcp_app_mux, tvb, offset, packet_len, ENC_NA);
3435
0
                proto_tree* mux_tree = proto_item_add_subtree(mux_item, ett_mux);
3436
0
                proto_tree_add_item(mux_tree, hf_rtcp_app_mux_mux, tvb, offset, 1, ENC_BIG_ENDIAN);
3437
0
                proto_tree_add_item(mux_tree, hf_rtcp_app_mux_cp, tvb, offset, 1, ENC_BIG_ENDIAN);
3438
0
                proto_tree_add_item(mux_tree, hf_rtcp_app_mux_selection, tvb, offset, 1, ENC_BIG_ENDIAN);
3439
0
                local_port = tvb_get_ntohs(tvb, offset + 2);
3440
0
                proto_tree_add_uint(mux_tree, hf_rtcp_app_mux_localmuxport, tvb, offset + 2, 2, local_port * 2);
3441
0
            } else
3442
0
            {
3443
                /* fall back to just showing the data if it's the wrong length */
3444
0
                proto_tree_add_item(tree, hf_rtcp_app_data, tvb, offset, packet_len, ENC_NA);
3445
0
            }
3446
0
            if ((offset + packet_len) >= offset)
3447
0
                offset += packet_len;
3448
0
            return offset;
3449
4
        } else if (g_ascii_strncasecmp(ascii_name, "MCPT", 4) == 0) {
3450
0
            offset = dissect_rtcp_app_mcpt(tvb, pinfo, offset, tree, packet_len, subtype_item, rtcp_subtype);
3451
4
        } else if (g_ascii_strncasecmp(ascii_name, "MCPC", 4) == 0) {
3452
0
            offset = dissect_rtcp_app_mcpc(tvb, pinfo, offset, tree, packet_len, subtype_item, rtcp_subtype);
3453
4
        } else if (g_ascii_strncasecmp(ascii_name, "MCCP", 4) == 0) {
3454
0
            offset = dissect_rtcp_app_mccp(tvb, pinfo, offset, tree, packet_len, subtype_item, rtcp_subtype);
3455
4
        } else {
3456
4
            tvbuff_t* next_tvb;     /* tvb to pass to subdissector */
3457
            /* tvb         == Pass the entire APP payload so the subdissector can have access to the
3458
             * entire data set
3459
             */
3460
4
            next_tvb = tvb_new_subset_length(tvb, offset - 8, app_length + 4);
3461
            /* look for registered sub-dissectors */
3462
4
            if (dissector_try_string_with_data(rtcp_dissector_table, ascii_name, next_tvb, pinfo, tree, true, NULL)) {
3463
                /* found subdissector - return tvb_reported_length */
3464
0
                offset += 4;
3465
0
                packet_len -= 4;
3466
0
                if (rtcp_padding_set) {
3467
                    /* If there's padding present, we have to remove that from the data part
3468
                    * The last octet of the packet contains the length of the padding
3469
                    */
3470
0
                    packet_len -= tvb_get_uint8(tvb, offset + packet_len - 1);
3471
0
                }
3472
0
                if ((offset + packet_len) >= offset)
3473
0
                    offset += packet_len;
3474
0
                return offset;
3475
0
            } else
3476
4
            {
3477
                /* Unhandled application type, just show app name and raw data */
3478
4
                col_append_fstr(pinfo->cinfo, COL_INFO, "( %s ) subtype=%u", ascii_name, rtcp_subtype);
3479
4
                offset += 4;
3480
4
                packet_len -= 4;
3481
                /* Applications specific data */
3482
4
                if (rtcp_padding_set) {
3483
                    /* If there's padding present, we have to remove that from the data part
3484
                    * The last octet of the packet contains the length of the padding
3485
                    */
3486
2
                    packet_len -= tvb_get_uint8(tvb, offset + packet_len - 1);
3487
2
                }
3488
4
                if (tvb_ascii_isprint(tvb, offset, packet_len)) {
3489
0
                    proto_tree_add_item(tree, hf_rtcp_app_data_str, tvb, offset, packet_len, ENC_ASCII);
3490
4
                } else {
3491
4
                    proto_tree_add_item(tree, hf_rtcp_app_data, tvb, offset, packet_len, ENC_NA);
3492
4
                }
3493
4
                if ((offset + packet_len) >= offset)
3494
1
                    offset += packet_len;
3495
4
            }
3496
4
        }
3497
6
    } else {
3498
        /* Unhandled application type, just show subtype and raw data */
3499
6
        col_append_fstr(pinfo->cinfo, COL_INFO, "subtype=%u", rtcp_subtype);
3500
6
        offset += 4;
3501
6
        packet_len -= 4;
3502
        /* Applications specific data */
3503
6
        if (rtcp_padding_set) {
3504
            /* If there's padding present, we have to remove that from the data part
3505
            * The last octet of the packet contains the length of the padding
3506
            */
3507
1
            packet_len -= tvb_get_uint8(tvb, offset + packet_len - 1);
3508
1
        }
3509
6
        if (tvb_ascii_isprint(tvb, offset, packet_len)) {
3510
4
            proto_tree_add_item(tree, hf_rtcp_app_data_str, tvb, offset, packet_len, ENC_ASCII);
3511
4
        } else {
3512
2
            proto_tree_add_item(tree, hf_rtcp_app_data, tvb, offset, packet_len, ENC_NA);
3513
2
        }
3514
6
        if ((offset + packet_len) >= offset)
3515
4
            offset += packet_len;
3516
6
    }
3517
10
    return offset;
3518
10
}
3519
3520
3521
static unsigned
3522
dissect_rtcp_bye( tvbuff_t *tvb, packet_info *pinfo, unsigned offset, proto_tree *tree,
3523
    unsigned count, unsigned packet_length )
3524
8
{
3525
8
    unsigned chunk;
3526
8
    unsigned int reason_length = 0;
3527
8
    unsigned int reason_offset = 0;
3528
3529
8
    chunk = 1;
3530
3531
38
    while ( chunk <= count ) {
3532
        /* source identifier, 32 bits */
3533
30
        proto_tree_add_item( tree, hf_rtcp_ssrc_source, tvb, offset, 4, ENC_BIG_ENDIAN);
3534
30
        offset += 4;
3535
30
        chunk++;
3536
30
    }
3537
3538
8
    if (count * 4 < packet_length) {
3539
        /* Bye reason consists of an 8 bit length l and a string with length l */
3540
6
        reason_length = tvb_get_uint8( tvb, offset );
3541
6
        proto_tree_add_item( tree, hf_rtcp_sdes_length, tvb, offset, 1, ENC_BIG_ENDIAN );
3542
6
        offset++;
3543
3544
6
        reason_offset = offset;
3545
6
        proto_tree_add_item( tree, hf_rtcp_sdes_text, tvb, offset, reason_length, ENC_ASCII);
3546
6
        offset += reason_length;
3547
6
    }
3548
3549
    /* BYE packet padded out if string didn't fit in previous word */
3550
8
    unsigned pad_size = WS_PADDING_TO_4(offset);
3551
8
    if (pad_size)
3552
5
    {
3553
        /* Check padding */
3554
19
        for (unsigned i = 0; i < pad_size; i++)
3555
14
        {
3556
14
            if ((!(tvb_offset_exists(tvb, offset + i))) ||
3557
14
                (tvb_get_uint8(tvb, offset + i) != 0))
3558
12
            {
3559
12
                proto_tree_add_expert(tree, pinfo, &ei_rtcp_bye_reason_not_padded, tvb, reason_offset, reason_length);
3560
12
            }
3561
14
        }
3562
3563
5
        offset += pad_size;
3564
5
    }
3565
3566
8
    return offset;
3567
8
}
3568
3569
static int
3570
dissect_rtcp_sdes( tvbuff_t *tvb, unsigned offset, proto_tree *tree, int count )
3571
2
{
3572
2
    int           chunk;
3573
2
    proto_item   *sdes_item;
3574
2
    proto_tree   *sdes_tree;
3575
2
    proto_tree   *sdes_item_tree;
3576
2
    proto_item   *ti;
3577
2
    int           start_offset;
3578
2
    int           items_start_offset;
3579
2
    uint32_t      ssrc;
3580
2
    unsigned int  item_len;
3581
2
    unsigned int  sdes_type;
3582
2
    unsigned int  prefix_len;
3583
2
    bool          terminator_found;
3584
3585
2
    chunk = 1;
3586
7
    while ( chunk <= count ) {
3587
        /* Create a subtree for this chunk; we don't yet know
3588
           the length. */
3589
5
        start_offset = offset;
3590
3591
5
        ssrc = tvb_get_ntohl( tvb, offset );
3592
5
        sdes_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1,
3593
5
            ett_sdes, &sdes_item, "Chunk %u, SSRC/CSRC 0x%X", chunk, ssrc);
3594
3595
        /* SSRC_n source identifier, 32 bits */
3596
5
        proto_tree_add_item( sdes_tree, hf_rtcp_ssrc_source, tvb, offset, 4, ENC_BIG_ENDIAN );
3597
5
        offset += 4;
3598
3599
        /* Create a subtree for the SDES items; we don't yet know
3600
           the length */
3601
5
        items_start_offset = offset;
3602
5
        sdes_item_tree = proto_tree_add_subtree(sdes_tree, tvb, offset, -1,
3603
5
            ett_sdes_item, &ti, "SDES items" );
3604
3605
        /*
3606
         * Not every message is ended with "null" bytes, so check for
3607
         * end of frame as well.
3608
         */
3609
5
        terminator_found = false;
3610
9
        while ( tvb_reported_length_remaining( tvb, offset ) > 0 ) {
3611
            /* ID, 8 bits */
3612
7
            sdes_type = tvb_get_uint8( tvb, offset );
3613
7
            proto_tree_add_item( sdes_item_tree, hf_rtcp_sdes_type, tvb, offset, 1, ENC_BIG_ENDIAN );
3614
7
            offset++;
3615
3616
7
            if ( sdes_type == RTCP_SDES_END ) {
3617
                /* End of list */
3618
3
                terminator_found = true;
3619
3
                break;
3620
3
            }
3621
3622
            /* Item length, 8 bits */
3623
4
            item_len = tvb_get_uint8( tvb, offset );
3624
4
            proto_tree_add_item( sdes_item_tree, hf_rtcp_sdes_length, tvb, offset, 1, ENC_BIG_ENDIAN );
3625
4
            offset++;
3626
3627
4
            if ( item_len != 0 ) {
3628
3
                if ( sdes_type == RTCP_SDES_PRIV ) {
3629
                    /* PRIV adds two items between the
3630
                     * SDES length and value - an 8 bit
3631
                     * length giving the length of a
3632
                     * "prefix string", and the string.
3633
                     */
3634
0
                    prefix_len = tvb_get_uint8( tvb, offset );
3635
0
                    if ( prefix_len + 1 > item_len ) {
3636
0
                        proto_tree_add_uint_format_value( sdes_item_tree,
3637
0
                            hf_rtcp_sdes_prefix_len, tvb,
3638
0
                            offset, 1, prefix_len,
3639
0
                            "%u (bogus, must be <= %u)",
3640
0
                            prefix_len, item_len - 1);
3641
0
                        offset += item_len;
3642
0
                        continue;
3643
0
                    }
3644
0
                    proto_tree_add_item( sdes_item_tree, hf_rtcp_sdes_prefix_len, tvb, offset, 1, ENC_BIG_ENDIAN );
3645
0
                    offset++;
3646
3647
0
                    proto_tree_add_item( sdes_item_tree, hf_rtcp_sdes_prefix_string, tvb, offset, prefix_len, ENC_ASCII );
3648
0
                    offset   += prefix_len;
3649
0
                    item_len -= prefix_len +1;
3650
0
                    if ( item_len == 0 )
3651
0
                        continue;
3652
0
                }
3653
3
                proto_tree_add_item( sdes_item_tree, hf_rtcp_sdes_text, tvb, offset, item_len, ENC_ASCII );
3654
3
                offset += item_len;
3655
3
            }
3656
4
        }
3657
3658
5
        if (!terminator_found) {
3659
0
            expert_add_info(NULL, ti, &ei_rtcp_sdes_missing_null_terminator);
3660
0
        }
3661
        /* Set the length of the items subtree. */
3662
5
        proto_item_set_len(ti, offset - items_start_offset);
3663
3664
        /* 32 bits = 4 bytes, so.....
3665
         * If offset % 4 != 0, we divide offset by 4, add one and then
3666
         * multiply by 4 again to reach the boundary
3667
         */
3668
5
        if ( offset % 4 != 0 )
3669
3
            offset = ((offset / 4) + 1 ) * 4;
3670
3671
        /* Set the length of this chunk. */
3672
5
        proto_item_set_len(sdes_item, offset - start_offset);
3673
3674
5
        chunk++;
3675
5
    }
3676
3677
2
    return offset;
3678
2
}
3679
3680
static void parse_xr_type_specific_field(tvbuff_t *tvb, unsigned offset, unsigned block_type,
3681
                                         proto_tree *tree, uint8_t *thinning)
3682
65
{
3683
65
    static int * const flags[] = {
3684
65
        &hf_rtcp_xr_stats_loss_flag,
3685
65
        &hf_rtcp_xr_stats_dup_flag,
3686
65
        &hf_rtcp_xr_stats_jitter_flag,
3687
65
        &hf_rtcp_xr_stats_ttl,
3688
65
        NULL
3689
65
    };
3690
3691
65
    switch (block_type) {
3692
0
        case RTCP_XR_DISCARD_RLE:
3693
0
            proto_tree_add_item(tree, hf_rtcp_xr_drle_e, tvb, offset, 1, ENC_BIG_ENDIAN);
3694
            /* FALLTHROUGH */
3695
5
        case RTCP_XR_LOSS_RLE:
3696
8
        case RTCP_XR_DUP_RLE:
3697
9
        case RTCP_XR_PKT_RXTIMES:
3698
9
            *thinning = tvb_get_uint8(tvb, offset) & 0x0F;
3699
9
            proto_tree_add_item(tree, hf_rtcp_xr_thinning, tvb, offset, 1, ENC_BIG_ENDIAN);
3700
9
            break;
3701
3702
1
        case RTCP_XR_STATS_SUMRY:
3703
1
            proto_tree_add_bitmask_list(tree, tvb, offset, 1, flags, ENC_BIG_ENDIAN);
3704
1
            break;
3705
3706
55
        default:
3707
55
            proto_tree_add_item(tree, hf_rtcp_xr_block_specific, tvb, offset, 1, ENC_BIG_ENDIAN);
3708
55
            break;
3709
65
    }
3710
65
}
3711
3712
static bool validate_xr_block_length(tvbuff_t *tvb, packet_info *pinfo, unsigned offset, unsigned block_type, unsigned block_len, proto_tree *tree)
3713
65
{
3714
65
    proto_item *ti;
3715
3716
65
    ti = proto_tree_add_uint(tree, hf_rtcp_xr_block_length, tvb, offset, 2, block_len);
3717
65
    proto_item_append_text(ti, " (%u bytes)", (block_len)*4);
3718
65
    switch (block_type) {
3719
1
        case RTCP_XR_REF_TIME:
3720
1
            if (block_len != 2)
3721
1
                expert_add_info_format(pinfo, ti, &ei_rtcp_xr_block_length_bad, "Invalid block length, should be 2");
3722
1
            return false;
3723
3724
1
        case RTCP_XR_STATS_SUMRY:
3725
1
            if (block_len != 9)
3726
1
                expert_add_info_format(pinfo, ti, &ei_rtcp_xr_block_length_bad, "Invalid block length, should be 9");
3727
1
            return false;
3728
3729
0
        case RTCP_XR_VOIP_METRCS:
3730
3
        case RTCP_XR_BT_XNQ:
3731
3
            if (block_len != 8)
3732
3
                expert_add_info_format(pinfo, ti, &ei_rtcp_xr_block_length_bad, "Invalid block length, should be 8");
3733
3
            return false;
3734
3735
1
        case RTCP_XR_IDMS:
3736
1
            if (block_len != 7)
3737
1
                expert_add_info_format(pinfo, ti, &ei_rtcp_xr_block_length_bad, "Invalid block length, should be 7");
3738
1
            return false;
3739
3740
59
        default:
3741
59
            break;
3742
65
    }
3743
59
    return true;
3744
65
}
3745
3746
static int
3747
dissect_rtcp_xr(tvbuff_t *tvb, packet_info *pinfo, unsigned offset, proto_tree *tree, unsigned packet_len)
3748
25
{
3749
25
    unsigned    block_num;
3750
3751
    /* Packet length should at least be 4 */
3752
25
    if (packet_len < 4) {
3753
0
        proto_tree_add_expert(tree, pinfo, &ei_rtcp_missing_sender_ssrc, tvb, offset, packet_len);
3754
0
        return offset + packet_len;
3755
0
    }
3756
3757
25
    if (rtcp_padding_set) {
3758
        /* If there's padding present, we have to remove that from the data part
3759
        * The last octet of the packet contains the length of the padding
3760
        */
3761
8
        packet_len -= tvb_get_uint8(tvb, offset + packet_len - 1);
3762
8
    }
3763
3764
    /* SSRC */
3765
25
    proto_tree_add_item( tree, hf_rtcp_ssrc_sender, tvb, offset, 4, ENC_BIG_ENDIAN );
3766
25
    offset     += 4;
3767
25
    packet_len -= 4;
3768
3769
81
    for( block_num = 1; packet_len > 0; block_num++) {
3770
72
        unsigned block_type     = tvb_get_uint8(tvb, offset), block_length = 0;
3771
72
        unsigned content_length = 0;
3772
72
        uint8_t thinning = 0;
3773
        /*bool valid = true;*/
3774
3775
        /* Create a subtree for this block, don't know the length yet*/
3776
72
        proto_item *block;
3777
72
        proto_tree *xr_block_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1, ett_xr_block, &block, "Block %u", block_num);
3778
72
        proto_tree *content_tree;
3779
3780
72
        proto_tree_add_item(xr_block_tree, hf_rtcp_xr_block_type, tvb, offset, 1, ENC_BIG_ENDIAN);
3781
3782
72
        if (packet_len >= 2) {
3783
65
            parse_xr_type_specific_field(tvb, offset + 1, block_type, xr_block_tree, &thinning);
3784
65
            if (packet_len >= 4) {
3785
65
                block_length = tvb_get_ntohs(tvb, offset + 2);
3786
                /* XXX: What if false return from the following ?? */
3787
65
                /*valid =*/ validate_xr_block_length(tvb, pinfo, offset + 2, block_type, block_length, xr_block_tree);
3788
65
            }
3789
65
        } else {
3790
7
            expert_add_info(pinfo, block, &ei_rtcp_missing_block_header);
3791
7
            return offset + packet_len;
3792
7
        }
3793
3794
65
        content_length = block_length * 4;
3795
65
        proto_item_set_len(block, content_length + 4);
3796
3797
65
        if (content_length > packet_len) {
3798
10
            expert_add_info(pinfo, block, &ei_rtcp_block_length);
3799
10
        }
3800
3801
65
        offset     += 4;
3802
65
        packet_len -= 4;
3803
3804
65
        content_tree = proto_tree_add_subtree(xr_block_tree, tvb, offset, content_length, ett_xr_block_contents, NULL, "Contents");
3805
3806
65
        switch (block_type) {
3807
0
        case RTCP_XR_VOIP_METRCS: {
3808
0
            unsigned fraction_rate;
3809
3810
            /* Identifier */
3811
0
            proto_tree_add_item(content_tree, hf_rtcp_ssrc_source, tvb, offset, 4, ENC_BIG_ENDIAN);
3812
0
            offset += 4;
3813
3814
            /* Loss Rate */
3815
0
            fraction_rate = tvb_get_uint8(tvb, offset);
3816
0
            proto_tree_add_uint_format_value(content_tree, hf_rtcp_ssrc_fraction, tvb, offset, 1,
3817
0
                                       fraction_rate, "%u / 256", fraction_rate);
3818
0
            offset++;
3819
3820
            /* Discard Rate */
3821
0
            fraction_rate = tvb_get_uint8(tvb, offset);
3822
0
            proto_tree_add_uint_format_value(content_tree, hf_rtcp_ssrc_discarded, tvb, offset, 1,
3823
0
                                       fraction_rate, "%u / 256", fraction_rate);
3824
0
            offset++;
3825
3826
            /* Burst Density */
3827
0
            proto_tree_add_item(content_tree, hf_rtcp_xr_voip_metrics_burst_density, tvb, offset, 1, ENC_BIG_ENDIAN);
3828
0
            offset++;
3829
3830
            /* Gap Density */
3831
0
            proto_tree_add_item(content_tree, hf_rtcp_xr_voip_metrics_gap_density, tvb, offset, 1, ENC_BIG_ENDIAN);
3832
0
            offset++;
3833
3834
            /* Burst Duration */
3835
0
            proto_tree_add_item(content_tree, hf_rtcp_xr_voip_metrics_burst_duration, tvb, offset, 2, ENC_BIG_ENDIAN);
3836
0
            offset += 2;
3837
3838
            /* Gap Duration */
3839
0
            proto_tree_add_item(content_tree, hf_rtcp_xr_voip_metrics_gap_duration, tvb, offset, 2, ENC_BIG_ENDIAN);
3840
0
            offset += 2;
3841
3842
            /* Round Trip Delay */
3843
0
            proto_tree_add_item(content_tree, hf_rtcp_xr_voip_metrics_rtdelay, tvb, offset, 2, ENC_BIG_ENDIAN);
3844
0
            offset += 2;
3845
3846
            /* End System Delay */
3847
0
            proto_tree_add_item(content_tree, hf_rtcp_xr_voip_metrics_esdelay, tvb, offset, 2, ENC_BIG_ENDIAN);
3848
0
            offset += 2;
3849
3850
            /* Signal Level */
3851
0
            if (tvb_get_uint8(tvb, offset) == 0x7f)
3852
0
                proto_tree_add_int_format_value(content_tree, hf_rtcp_xr_voip_metrics_siglevel, tvb, offset, 1, 0x7f, "Unavailable");
3853
0
            else
3854
0
                proto_tree_add_item(content_tree, hf_rtcp_xr_voip_metrics_siglevel, tvb, offset, 1, ENC_BIG_ENDIAN);
3855
0
            offset++;
3856
3857
            /* Noise Level */
3858
0
            if (tvb_get_uint8(tvb, offset) == 0x7f)
3859
0
                proto_tree_add_int_format_value(content_tree, hf_rtcp_xr_voip_metrics_noiselevel, tvb, offset, 1, 0x7f, "Unavailable");
3860
0
            else
3861
0
                proto_tree_add_item(content_tree, hf_rtcp_xr_voip_metrics_noiselevel, tvb, offset, 1, ENC_BIG_ENDIAN);
3862
0
            offset++;
3863
3864
            /* RERL */
3865
0
            if (tvb_get_uint8(tvb, offset) == 0x7f)
3866
0
                proto_tree_add_uint_format_value(content_tree, hf_rtcp_xr_voip_metrics_rerl, tvb, offset, 1, 0x7f, "Unavailable");
3867
0
            else
3868
0
                proto_tree_add_item(content_tree, hf_rtcp_xr_voip_metrics_rerl, tvb, offset, 1, ENC_BIG_ENDIAN);
3869
0
            offset++;
3870
3871
            /* GMin */
3872
0
            proto_tree_add_item(content_tree, hf_rtcp_xr_voip_metrics_gmin, tvb, offset, 1, ENC_BIG_ENDIAN);
3873
0
            offset++;
3874
3875
            /* R factor */
3876
0
            if (tvb_get_uint8(tvb, offset) == 0x7f)
3877
0
                proto_tree_add_uint_format_value(content_tree, hf_rtcp_xr_voip_metrics_rfactor, tvb, offset, 1, 0x7f, "Unavailable");
3878
0
            else
3879
0
                proto_tree_add_item(content_tree, hf_rtcp_xr_voip_metrics_rfactor, tvb, offset, 1, ENC_BIG_ENDIAN);
3880
0
            offset++;
3881
3882
            /* external R Factor */
3883
0
            if (tvb_get_uint8(tvb, offset) == 0x7f)
3884
0
                proto_tree_add_uint_format_value(content_tree, hf_rtcp_xr_voip_metrics_extrfactor, tvb, offset, 1, 0x7f, "Unavailable");
3885
0
            else
3886
0
                proto_tree_add_item(content_tree, hf_rtcp_xr_voip_metrics_extrfactor, tvb, offset, 1, ENC_BIG_ENDIAN);
3887
0
            offset++;
3888
3889
            /* MOS LQ */
3890
0
            if (tvb_get_uint8(tvb, offset) == 0x7f)
3891
0
                proto_tree_add_float_format_value(content_tree, hf_rtcp_xr_voip_metrics_moslq, tvb, offset, 1, 0x7f, "Unavailable");
3892
0
            else
3893
0
                proto_tree_add_float(content_tree, hf_rtcp_xr_voip_metrics_moslq, tvb, offset, 1,
3894
0
                                 (float) (tvb_get_uint8(tvb, offset) / 10.0));
3895
0
            offset++;
3896
3897
            /* MOS CQ */
3898
0
            if (tvb_get_uint8(tvb, offset) == 0x7f)
3899
0
                proto_tree_add_float_format_value(content_tree, hf_rtcp_xr_voip_metrics_moscq, tvb, offset, 1, 0x7f, "Unavailable");
3900
0
            else
3901
0
                proto_tree_add_float(content_tree, hf_rtcp_xr_voip_metrics_moscq, tvb, offset, 1,
3902
0
                                     (float) (tvb_get_uint8(tvb, offset) / 10.0));
3903
0
            offset++;
3904
3905
            /* PLC, JB Adaptive, JB Rate */
3906
0
            proto_tree_add_item(content_tree, hf_rtcp_xr_voip_metrics_plc, tvb, offset, 1, ENC_BIG_ENDIAN);
3907
0
            proto_tree_add_item(content_tree, hf_rtcp_xr_voip_metrics_jbadaptive, tvb, offset, 1, ENC_BIG_ENDIAN);
3908
0
            proto_tree_add_item(content_tree, hf_rtcp_xr_voip_metrics_jbrate, tvb, offset, 1, ENC_BIG_ENDIAN);
3909
0
            offset += 2; /* skip over reserved bit */
3910
3911
            /* JB Nominal */
3912
0
            proto_tree_add_item(content_tree, hf_rtcp_xr_voip_metrics_jbnominal, tvb, offset, 2, ENC_BIG_ENDIAN);
3913
0
            offset += 2;
3914
3915
            /* JB Max */
3916
0
            proto_tree_add_item(content_tree, hf_rtcp_xr_voip_metrics_jbmax, tvb, offset, 2, ENC_BIG_ENDIAN);
3917
0
            offset += 2;
3918
3919
            /* JB Abs max */
3920
0
            proto_tree_add_item(content_tree, hf_rtcp_xr_voip_metrics_jbabsmax, tvb, offset, 2, ENC_BIG_ENDIAN);
3921
0
            offset += 2;
3922
3923
0
            break;
3924
0
        }
3925
3926
1
        case RTCP_XR_STATS_SUMRY: {
3927
            /* Identifier */
3928
1
            proto_tree_add_item(content_tree, hf_rtcp_ssrc_source, tvb, offset, 4, ENC_BIG_ENDIAN);
3929
1
            offset += 4;
3930
3931
            /* Begin Seq */
3932
1
            proto_tree_add_item(content_tree, hf_rtcp_xr_beginseq, tvb, offset, 2, ENC_BIG_ENDIAN);
3933
1
            offset += 2;
3934
3935
            /* End Seq */
3936
1
            proto_tree_add_item(content_tree, hf_rtcp_xr_endseq, tvb, offset, 2, ENC_BIG_ENDIAN);
3937
1
            offset += 2;
3938
3939
            /* Lost Pkts */
3940
1
            proto_tree_add_item(content_tree, hf_rtcp_xr_stats_lost, tvb, offset, 4, ENC_BIG_ENDIAN);
3941
1
            offset += 4;
3942
3943
            /* Dup Pkts */
3944
1
            proto_tree_add_item(content_tree, hf_rtcp_xr_stats_dups, tvb, offset, 4, ENC_BIG_ENDIAN);
3945
1
            offset += 4;
3946
3947
            /* Min Jitter */
3948
1
            proto_tree_add_item(content_tree, hf_rtcp_xr_stats_minjitter, tvb, offset, 4, ENC_BIG_ENDIAN);
3949
1
            offset += 4;
3950
3951
            /* Max Jitter */
3952
1
            proto_tree_add_item(content_tree, hf_rtcp_xr_stats_maxjitter, tvb, offset, 4, ENC_BIG_ENDIAN);
3953
1
            offset += 4;
3954
3955
            /* Mean Jitter */
3956
1
            proto_tree_add_item(content_tree, hf_rtcp_xr_stats_meanjitter, tvb, offset, 4, ENC_BIG_ENDIAN);
3957
1
            offset += 4;
3958
3959
            /* Dev Jitter */
3960
1
            proto_tree_add_item(content_tree, hf_rtcp_xr_stats_devjitter, tvb, offset, 4, ENC_BIG_ENDIAN);
3961
1
            offset += 4;
3962
3963
            /* Min TTL */
3964
1
            proto_tree_add_item(content_tree, hf_rtcp_xr_stats_minttl, tvb, offset, 1, ENC_BIG_ENDIAN);
3965
1
            offset ++;
3966
3967
            /* Max TTL */
3968
1
            proto_tree_add_item(content_tree, hf_rtcp_xr_stats_maxttl, tvb, offset, 1, ENC_BIG_ENDIAN);
3969
1
            offset ++;
3970
3971
            /* Mean TTL */
3972
1
            proto_tree_add_item(content_tree, hf_rtcp_xr_stats_meanttl, tvb, offset, 1, ENC_BIG_ENDIAN);
3973
1
            offset ++;
3974
3975
            /* Dev TTL */
3976
1
            proto_tree_add_item(content_tree, hf_rtcp_xr_stats_devttl, tvb, offset, 1, ENC_BIG_ENDIAN);
3977
1
            offset ++;
3978
3979
1
            break;
3980
0
        }
3981
3982
1
        case RTCP_XR_REF_TIME: {
3983
1
            proto_tree_add_item(content_tree, hf_rtcp_xr_timestamp, tvb, offset, 8, ENC_TIME_NTP|ENC_BIG_ENDIAN);
3984
1
            offset += 8;
3985
1
            break;
3986
0
        }
3987
3988
1
        case RTCP_XR_DLRR: {
3989
            /* Each report block is 12 bytes */
3990
1
            int sources = content_length / 12;
3991
1
            int counter = 0;
3992
10
            for(counter = 0; counter < sources; counter++) {
3993
                /* Create a new subtree for a length of 12 bytes */
3994
9
                proto_tree *ssrc_tree = proto_tree_add_subtree_format(content_tree, tvb, offset, 12, ett_xr_ssrc, NULL, "Source %u", counter + 1);
3995
3996
                /* SSRC_n source identifier, 32 bits */
3997
9
                proto_tree_add_item(ssrc_tree, hf_rtcp_ssrc_source, tvb, offset, 4, ENC_BIG_ENDIAN);
3998
9
                offset += 4;
3999
4000
                /* Last RR timestamp */
4001
9
                proto_tree_add_item(ssrc_tree, hf_rtcp_xr_lrr, tvb, offset, 4, ENC_BIG_ENDIAN);
4002
9
                offset += 4;
4003
4004
                /* Delay since last RR timestamp */
4005
9
                proto_tree_add_item(ssrc_tree, hf_rtcp_xr_dlrr, tvb, offset, 4, ENC_BIG_ENDIAN);
4006
9
                offset += 4;
4007
9
            }
4008
4009
1
            if (content_length % 12 != 0)
4010
0
                offset += content_length % 12;
4011
1
            break;
4012
0
        }
4013
4014
1
        case RTCP_XR_PKT_RXTIMES: {
4015
            /* 8 bytes of fixed header */
4016
1
            uint32_t rcvd_time;
4017
1
            unsigned count = 0, skip = 8;
4018
1
            uint16_t begin = 0;
4019
4020
            /* Identifier */
4021
1
            proto_tree_add_item(content_tree, hf_rtcp_ssrc_source, tvb, offset, 4, ENC_BIG_ENDIAN);
4022
1
            offset += 4;
4023
4024
            /* Begin Seq */
4025
1
            begin = tvb_get_ntohs(tvb, offset);
4026
            /* Apply Thinning value */
4027
1
            begin = (begin + ((1<<thinning)-1)) & ~((1<<thinning)-1);
4028
1
            proto_tree_add_item(content_tree, hf_rtcp_xr_beginseq, tvb, offset, 2, ENC_BIG_ENDIAN);
4029
1
            offset += 2;
4030
4031
            /* End Seq */
4032
1
            proto_tree_add_item(content_tree, hf_rtcp_xr_endseq, tvb, offset, 2, ENC_BIG_ENDIAN);
4033
1
            offset += 2;
4034
4035
7
            for(count = 0; skip < content_length; skip += 4, count++) {
4036
6
                rcvd_time = tvb_get_ntohl(tvb, offset);
4037
6
                proto_tree_add_uint_format(content_tree, hf_rtcp_xr_receipt_time_seq, tvb,
4038
6
                                           offset, 4, rcvd_time, "Seq: %u, Receipt Time: %u",
4039
6
                                           (begin + (count<<thinning)) % 65536, rcvd_time);
4040
6
                offset += 4;
4041
6
            }
4042
1
            break;
4043
0
        }
4044
4045
5
        case RTCP_XR_LOSS_RLE:
4046
8
        case RTCP_XR_DUP_RLE:
4047
8
        case RTCP_XR_DISCARD_RLE: {
4048
            /* 8 bytes of fixed header */
4049
8
            unsigned count = 0, skip = 8;
4050
8
            proto_tree *chunks_tree;
4051
4052
            /* Identifier */
4053
8
            proto_tree_add_item(content_tree, hf_rtcp_ssrc_source, tvb, offset, 4, ENC_BIG_ENDIAN);
4054
8
            offset += 4;
4055
4056
            /* Begin Seq */
4057
8
            proto_tree_add_item(content_tree, hf_rtcp_xr_beginseq, tvb, offset, 2, ENC_BIG_ENDIAN);
4058
8
            offset += 2;
4059
4060
            /* End Seq */
4061
8
            proto_tree_add_item(content_tree, hf_rtcp_xr_endseq, tvb, offset, 2, ENC_BIG_ENDIAN);
4062
8
            offset += 2;
4063
4064
            /* report Chunks */
4065
8
            chunks_tree = proto_tree_add_subtree(content_tree, tvb, offset, content_length, ett_xr_loss_chunk, NULL, "Report Chunks");
4066
4067
502
            for(count = 1; skip < content_length; skip += 2, count++) {
4068
494
                unsigned value = tvb_get_ntohs(tvb, offset);
4069
4070
494
                if (value == 0) {
4071
43
                    proto_tree_add_none_format(chunks_tree, hf_rtcp_xr_chunk_null_terminator, tvb, offset, 2, "Chunk: %u -- Null Terminator ",
4072
43
                                        count);
4073
451
                } else if ( ! ( value & 0x8000 )) {
4074
317
                    const char *run_type = (value & 0x4000) ? "1s" : "0s";
4075
317
                    value &= 0x3FFF;
4076
317
                    proto_tree_add_uint_format(chunks_tree, hf_rtcp_xr_chunk_length, tvb, offset, 2, value, "Chunk: %u -- Length Run %s, length: %u",
4077
317
                                        count, run_type, value);
4078
317
                } else {
4079
134
                    proto_tree_add_uint_format(chunks_tree, hf_rtcp_xr_chunk_bit_vector, tvb, offset, 2, value &  0x7FFF,
4080
134
                                        "Chunk: %u -- Bit Vector 0x%x", count, value &  0x7FFF);
4081
134
                }
4082
494
                offset += 2;
4083
494
            }
4084
4085
8
            break;
4086
8
        }
4087
3
        case RTCP_XR_BT_XNQ: {                                      /* BT XNQ block as defined in RFC5093 */
4088
3
            unsigned temp_value; /* used when checking spare bits in block type 8 */
4089
4090
3
            proto_tree_add_item(content_tree, hf_rtcp_xr_btxnq_begseq, tvb, offset, 2, ENC_BIG_ENDIAN);          /* Begin Sequence number */
4091
3
            proto_tree_add_item(content_tree, hf_rtcp_xr_btxnq_endseq, tvb, offset+2, 2, ENC_BIG_ENDIAN);        /* End Sequence number */
4092
3
            offset += 4;
4093
4094
3
            proto_tree_add_item(content_tree, hf_rtcp_xr_btxnq_vmaxdiff, tvb, offset, 2, ENC_BIG_ENDIAN);        /* vmaxdiff */
4095
3
            proto_tree_add_item(content_tree, hf_rtcp_xr_btxnq_vrange, tvb, offset+2, 2, ENC_BIG_ENDIAN);        /* vrange */
4096
3
            offset += 4;
4097
4098
3
            proto_tree_add_item(content_tree, hf_rtcp_xr_btxnq_vsum, tvb, offset, 4, ENC_BIG_ENDIAN);            /* vsum */
4099
3
            offset += 4;
4100
4101
3
            proto_tree_add_item(content_tree, hf_rtcp_xr_btxnq_cycles, tvb, offset, 2, ENC_BIG_ENDIAN);          /* cycle count */
4102
3
            proto_tree_add_item(content_tree, hf_rtcp_xr_btxnq_jbevents, tvb, offset+2, 2, ENC_BIG_ENDIAN);      /* jitter buffer events */
4103
3
            offset += 4;
4104
4105
3
            temp_value = tvb_get_ntohl(tvb, offset);                                                    /* tDegNet */
4106
3
            if ((temp_value & 0x0ff000000) != 0)
4107
2
                proto_tree_add_string(content_tree, hf_rtcp_xr_btxnq_spare, tvb, offset, 1, "Warning - spare bits not 0");
4108
3
            proto_tree_add_uint(content_tree, hf_rtcp_xr_btxnq_tdegnet, tvb, offset+1, 3, temp_value & 0x0ffffff);
4109
3
            offset += 4;
4110
4111
3
            temp_value = tvb_get_ntohl(tvb, offset);                                                    /* tDegJit */
4112
3
            if ((temp_value & 0x0ff000000) != 0)
4113
1
                proto_tree_add_string(content_tree, hf_rtcp_xr_btxnq_spare, tvb, offset, 1, "Warning - spare bits not 0");
4114
3
            proto_tree_add_uint(content_tree, hf_rtcp_xr_btxnq_tdegjit, tvb, offset+1, 3, temp_value & 0x0ffffff);
4115
3
            offset += 4;
4116
4117
3
            temp_value = tvb_get_ntohl(tvb, offset);                                                    /* ES */
4118
3
            if ((temp_value & 0x0ff000000) != 0)
4119
1
                proto_tree_add_string(content_tree, hf_rtcp_xr_btxnq_spare, tvb, offset, 1, "Warning - spare bits not 0");
4120
3
            proto_tree_add_uint(content_tree, hf_rtcp_xr_btxnq_es, tvb, offset+1, 3, temp_value & 0x0ffffff);
4121
3
            offset += 4;
4122
4123
3
            temp_value = tvb_get_ntohl(tvb, offset);                                                    /* SES */
4124
3
            if ((temp_value & 0x0ff000000) != 0)
4125
2
                proto_tree_add_string(content_tree, hf_rtcp_xr_btxnq_spare, tvb, offset, 1, "Warning - spare bits not 0");
4126
3
            proto_tree_add_uint(content_tree, hf_rtcp_xr_btxnq_ses, tvb, offset+1, 3, temp_value & 0x0ffffff);
4127
3
            offset += 4;
4128
4129
3
            break;
4130
8
        }
4131
1
        case RTCP_XR_IDMS: {
4132
1
            proto_item *item;
4133
1
            int         hour,min,sec,msec;
4134
1
            uint32_t    tmp_ts;
4135
1
            offset -= 3;
4136
1
            proto_tree_add_item(content_tree, hf_rtcp_xr_idms_spst, tvb, offset, 1, ENC_BIG_ENDIAN);
4137
1
            offset+=3;
4138
1
            proto_tree_add_item(content_tree, hf_rtcp_xr_idms_pt, tvb, offset, 1, ENC_BIG_ENDIAN);
4139
1
            offset+=4;
4140
1
            proto_tree_add_item(content_tree, hf_rtcp_xr_idms_msci, tvb, offset, 4, ENC_BIG_ENDIAN);
4141
1
            offset+=4;
4142
1
            proto_tree_add_item(content_tree, hf_rtcp_xr_idms_source_ssrc, tvb, offset, 4, ENC_BIG_ENDIAN);
4143
1
            offset+=4;
4144
1
            proto_tree_add_item(content_tree, hf_rtcp_xr_idms_ntp_rcv_ts, tvb, offset, 8, ENC_BIG_ENDIAN);
4145
1
            item = proto_tree_add_item(content_tree, hf_rtcp_ntp, tvb, offset, 8, ENC_TIME_NTP|ENC_BIG_ENDIAN);
4146
1
            proto_item_set_generated(item);
4147
4148
1
            proto_tree_add_item(content_tree, hf_rtcp_xr_idms_rtp_ts, tvb, offset, 4, ENC_BIG_ENDIAN);
4149
1
            offset+=4;
4150
4151
1
            tmp_ts = tvb_get_ntohl(tvb,offset);
4152
1
            hour   = (  (int) ( tmp_ts >> 16 ) ) / 3600;
4153
1
            min    = (( (int) ( tmp_ts >> 16 ) ) - hour * 3600) / 60;
4154
1
            sec    = (( (int) ( tmp_ts >> 16 ) ) - hour * 3600 - min * 60);
4155
1
            msec   = (  (int) ( tmp_ts & 0x0000FFFF ) ) / 66;
4156
1
            proto_tree_add_uint_format_value(content_tree, hf_rtcp_xr_idms_ntp_pres_ts, tvb, offset, 4, tmp_ts,
4157
1
                                             "%d:%02d:%02d:%03d [h:m:s:ms]", hour,min,sec,msec);
4158
1
            offset+=4;
4159
1
        }
4160
1
            break;
4161
49
        default:
4162
            /* skip over the unknown block */
4163
49
            offset += content_length;
4164
49
            break;
4165
65
        } /* switch (block_type) */
4166
56
        packet_len -= content_length;
4167
56
    } /* for (block_num = ...) */
4168
9
    return offset;
4169
25
}
4170
4171
static int
4172
dissect_rtcp_avb( tvbuff_t *tvb, packet_info *pinfo _U_, unsigned offset, proto_tree *tree,
4173
    unsigned packet_length _U_ )
4174
1
{
4175
    /* SSRC / CSRC */
4176
1
    proto_tree_add_item( tree, hf_rtcp_ssrc_source, tvb, offset, 4, ENC_BIG_ENDIAN );
4177
1
    offset += 4;
4178
4179
    /* Name (ASCII) */
4180
1
    proto_tree_add_item( tree, hf_rtcp_name_ascii, tvb, offset, 4, ENC_ASCII );
4181
1
    offset += 4;
4182
4183
    /* TimeBase Indicator */
4184
1
    proto_tree_add_item( tree, hf_rtcp_timebase_indicator, tvb, offset, 2, ENC_BIG_ENDIAN );
4185
1
    offset += 2;
4186
4187
    /* Identity */
4188
1
    proto_tree_add_item( tree, hf_rtcp_identity, tvb, offset, 10, ENC_NA );
4189
1
    offset += 10;
4190
4191
    /* Stream id, 64 bits */
4192
1
    proto_tree_add_item( tree, hf_rtcp_stream_id, tvb, offset, 8, ENC_BIG_ENDIAN );
4193
1
    offset += 8;
4194
4195
    /* AS timestamp, 32 bits */
4196
1
    proto_tree_add_item( tree, hf_rtcp_as_timestamp, tvb, offset, 4, ENC_BIG_ENDIAN );
4197
1
    offset += 4;
4198
4199
    /* RTP timestamp, 32 bits */
4200
1
    proto_tree_add_item( tree, hf_rtcp_rtp_timestamp, tvb, offset, 4, ENC_BIG_ENDIAN );
4201
1
    offset += 4;
4202
4203
1
    return offset;
4204
1
}
4205
4206
static int
4207
dissect_rtcp_rsi( tvbuff_t *tvb, packet_info *pinfo _U_, unsigned offset, proto_tree *tree,
4208
    unsigned packet_length )
4209
1
{
4210
1
    proto_item *item;
4211
4212
    /* SSRC / CSRC */
4213
1
    proto_tree_add_item( tree, hf_rtcp_ssrc_source, tvb, offset, 4, ENC_BIG_ENDIAN );
4214
1
    offset += 4;
4215
4216
    /* SSRC / CSRC */
4217
1
    proto_tree_add_item( tree, hf_rtcp_ssrc_source, tvb, offset, 4, ENC_BIG_ENDIAN );
4218
1
    offset += 4;
4219
4220
    /* NTP timestamp */
4221
1
    proto_tree_add_item(tree, hf_rtcp_ntp_msw, tvb, offset, 4, ENC_BIG_ENDIAN);
4222
4223
1
    proto_tree_add_item(tree, hf_rtcp_ntp_lsw, tvb, offset+4, 4, ENC_BIG_ENDIAN);
4224
4225
1
    item = proto_tree_add_item(tree, hf_rtcp_ntp, tvb, offset, 8, ENC_TIME_NTP|ENC_BIG_ENDIAN);
4226
1
    proto_item_set_generated(item);
4227
1
    offset += 8;
4228
4229
    /* Sub report blocks */
4230
4231
1
    return offset + (packet_length - 16);
4232
1
}
4233
4234
static int
4235
dissect_rtcp_token( tvbuff_t *tvb, packet_info *pinfo _U_, unsigned offset, proto_tree *tree,
4236
                    unsigned packet_len, unsigned rtcp_subtype _U_ )
4237
0
{
4238
    /* SSRC / CSRC */
4239
0
    proto_tree_add_item( tree, hf_rtcp_ssrc_source, tvb, offset, 4, ENC_BIG_ENDIAN );
4240
0
    offset += 4;
4241
4242
    /* subtypes */
4243
4244
0
    return offset + (packet_len - 4);
4245
0
}
4246
4247
static int
4248
dissect_ms_profile_specific_extensions(tvbuff_t *tvb, packet_info *pinfo, proto_tree *pse_tree, void *data _U_)
4249
1
{
4250
1
    int16_t extension_type;
4251
1
    int16_t extension_length;
4252
1
    proto_item *pse_item;
4253
1
    proto_item *item;
4254
1
    unsigned offset = 0;
4255
4256
1
    extension_type   = tvb_get_ntohs (tvb, offset);
4257
1
    extension_length = tvb_get_ntohs (tvb, offset+2);
4258
1
    if (extension_length < 4) {
4259
1
        extension_length = 4; /* expert info? */
4260
1
    }
4261
4262
1
    pse_item = proto_tree_get_parent(pse_tree);
4263
1
    proto_item_append_text(pse_item, " (%s)",
4264
1
            val_to_str_const(extension_type, rtcp_ms_profile_extension_vals, "Unknown"));
4265
1
    col_append_fstr(pinfo->cinfo, COL_INFO, "PSE:%s  ",
4266
1
                  val_to_str_const(extension_type, rtcp_ms_profile_extension_vals, "Unknown"));
4267
4268
1
    proto_tree_add_item(pse_tree, hf_rtcp_profile_specific_extension_type, tvb, offset,
4269
1
            2, ENC_BIG_ENDIAN);
4270
1
    offset += 2;
4271
1
    proto_tree_add_item(pse_tree, hf_rtcp_profile_specific_extension_length, tvb, offset,
4272
1
            2, ENC_BIG_ENDIAN);
4273
1
    offset += 2;
4274
4275
1
    switch (extension_type)
4276
1
    {
4277
1
    case 1:
4278
        /* MS Estimated Bandwidth */
4279
1
        item = proto_tree_add_item(pse_tree, hf_rtcp_ssrc_sender, tvb, offset, 4, ENC_BIG_ENDIAN);
4280
        /* Decode if it is NONE or ANY and add to line */
4281
1
        proto_item_append_text(item," %s", val_to_str_const(tvb_get_ntohl (tvb, offset), rtcp_ssrc_values, ""));
4282
1
        proto_tree_add_item(pse_tree, hf_rtcp_pse_ms_bandwidth, tvb, offset + 4, 4, ENC_BIG_ENDIAN);
4283
        /* Confidence level byte is optional so check length first */
4284
1
        if (extension_length == 16)
4285
0
        {
4286
0
            proto_tree_add_item(pse_tree, hf_rtcp_pse_ms_confidence_level, tvb, offset + 8, 1, ENC_BIG_ENDIAN);
4287
0
        }
4288
1
        break;
4289
0
    case 4:
4290
        /* MS Packet Loss Notification */
4291
0
        proto_tree_add_item(pse_tree, hf_rtcp_pse_ms_seq_num, tvb, offset + 2, 2, ENC_BIG_ENDIAN);
4292
0
        break;
4293
0
    case 5:
4294
        /* MS Video Preference */
4295
0
        proto_tree_add_item(pse_tree, hf_rtcp_pse_ms_frame_resolution_width, tvb, offset + 4, 2, ENC_BIG_ENDIAN);
4296
0
        proto_tree_add_item(pse_tree, hf_rtcp_pse_ms_frame_resolution_height, tvb, offset + 6, 2, ENC_BIG_ENDIAN);
4297
0
        proto_tree_add_item(pse_tree, hf_rtcp_pse_ms_bitrate, tvb, offset + 8, 4, ENC_BIG_ENDIAN);
4298
0
        proto_tree_add_item(pse_tree, hf_rtcp_pse_ms_frame_rate, tvb, offset + 12, 2, ENC_BIG_ENDIAN);
4299
0
        break;
4300
0
    case 7:
4301
        /* MS Policy Server Bandwidth */
4302
        /* First 4 bytes are reserved */
4303
0
        proto_tree_add_item(pse_tree, hf_rtcp_pse_ms_bandwidth, tvb, offset + 4, 4, ENC_BIG_ENDIAN);
4304
0
        break;
4305
0
    case 8:
4306
        /* MS TURN Server Bandwidth */
4307
        /* First 4 bytes are reserved */
4308
0
        proto_tree_add_item(pse_tree, hf_rtcp_pse_ms_bandwidth, tvb, offset + 4, 4, ENC_BIG_ENDIAN);
4309
0
        break;
4310
0
    case 9:
4311
        /* MS Audio Healer Metrics */
4312
0
        item = proto_tree_add_item(pse_tree, hf_rtcp_ssrc_sender, tvb, offset, 4, ENC_BIG_ENDIAN);
4313
        /* Decode if it is NONE or ANY and add to line */
4314
0
        proto_item_append_text(item," %s", val_to_str_const(tvb_get_ntohl (tvb, offset), rtcp_ssrc_values, ""));
4315
0
        proto_tree_add_item(pse_tree, hf_rtcp_pse_ms_concealed_frames, tvb, offset+4, 4, ENC_BIG_ENDIAN);
4316
0
        proto_tree_add_item(pse_tree, hf_rtcp_pse_ms_stretched_frames, tvb, offset+8, 4, ENC_BIG_ENDIAN);
4317
0
        proto_tree_add_item(pse_tree, hf_rtcp_pse_ms_compressed_frames, tvb, offset+12, 4, ENC_BIG_ENDIAN);
4318
0
        proto_tree_add_item(pse_tree, hf_rtcp_pse_ms_total_frames, tvb, offset+16, 4, ENC_BIG_ENDIAN);
4319
        /* 2 bytes Reserved */
4320
0
        proto_tree_add_item(pse_tree, hf_rtcp_pse_ms_receive_quality_state, tvb, offset+22, 1, ENC_BIG_ENDIAN);
4321
0
        proto_tree_add_item(pse_tree, hf_rtcp_pse_ms_fec_distance_request, tvb, offset+23, 1, ENC_BIG_ENDIAN);
4322
0
        break;
4323
0
    case 10:
4324
        /* MS Receiver-side Bandwidth Limit */
4325
        /* First 4 bytes are reserved */
4326
0
        proto_tree_add_item(pse_tree, hf_rtcp_pse_ms_bandwidth, tvb, offset + 4, 4, ENC_BIG_ENDIAN);
4327
0
        break;
4328
0
    case 11:
4329
        /* MS Packet Train Packet */
4330
0
        item = proto_tree_add_item(pse_tree, hf_rtcp_ssrc_sender, tvb, offset, 4, ENC_BIG_ENDIAN);
4331
        /* Decode if it is NONE or ANY and add to line */
4332
0
        proto_item_append_text(item," %s", val_to_str_const(tvb_get_ntohl (tvb, offset), rtcp_ssrc_values, ""));
4333
0
        proto_tree_add_item(pse_tree, hf_rtcp_pse_ms_last_packet_train, tvb, offset+4, 1, ENC_BIG_ENDIAN);
4334
0
        proto_tree_add_item(pse_tree, hf_rtcp_pse_ms_packet_idx, tvb, offset+4, 1, ENC_BIG_ENDIAN);
4335
0
        proto_tree_add_item(pse_tree, hf_rtcp_pse_ms_packet_cnt, tvb, offset+5, 1, ENC_BIG_ENDIAN);
4336
0
        proto_tree_add_item(pse_tree, hf_rtcp_pse_ms_packet_train_byte_cnt, tvb, offset+6, 2, ENC_BIG_ENDIAN);
4337
0
        break;
4338
0
    case 12:
4339
        /* MS Peer Info Exchange */
4340
0
        item = proto_tree_add_item(pse_tree, hf_rtcp_ssrc_sender, tvb, offset, 4, ENC_BIG_ENDIAN);
4341
        /* Decode if it is NONE or ANY and add to line */
4342
0
        proto_item_append_text(item," %s", val_to_str_const(tvb_get_ntohl (tvb, offset), rtcp_ssrc_values, ""));
4343
0
        proto_tree_add_item(pse_tree, hf_rtcp_pse_ms_inbound_bandwidth, tvb, offset + 4, 4, ENC_BIG_ENDIAN);
4344
0
        proto_tree_add_item(pse_tree, hf_rtcp_pse_ms_outbound_bandwidth, tvb, offset + 8, 4, ENC_BIG_ENDIAN);
4345
0
        proto_tree_add_item(pse_tree, hf_rtcp_pse_ms_no_cache, tvb, offset + 12, 1, ENC_BIG_ENDIAN);
4346
0
        break;
4347
0
    case 13:
4348
        /* MS Network Congestion Notification */
4349
0
        proto_tree_add_item(pse_tree, hf_rtcp_ntp_msw, tvb, offset, 4, ENC_BIG_ENDIAN);
4350
0
        proto_tree_add_item(pse_tree, hf_rtcp_ntp_lsw, tvb, offset+4, 4, ENC_BIG_ENDIAN);
4351
0
        proto_tree_add_item(pse_tree, hf_rtcp_ntp, tvb, offset, 8, ENC_TIME_NTP|ENC_BIG_ENDIAN);
4352
0
        proto_tree_add_item(pse_tree, hf_rtcp_pse_ms_congestion_info, tvb, offset + 12, 1, ENC_BIG_ENDIAN);
4353
0
        break;
4354
0
    case 14:
4355
        /* MS Modality Send Bandwidth Limit */
4356
0
        proto_tree_add_item(pse_tree, hf_rtcp_pse_ms_modality, tvb, offset, 1, ENC_BIG_ENDIAN);
4357
        /* 3 bytes Reserved */
4358
0
        proto_tree_add_item(pse_tree, hf_rtcp_pse_ms_bandwidth, tvb, offset + 4, 4, ENC_BIG_ENDIAN);
4359
0
        break;
4360
4361
0
    case 6:
4362
        /* MS Padding */
4363
0
    default:
4364
        /* Unrecognized */
4365
0
        proto_tree_add_item(pse_tree, hf_rtcp_profile_specific_extension, tvb, offset,
4366
0
                extension_length - 4, ENC_NA);
4367
0
        break;
4368
1
    }
4369
1
    offset += extension_length - 4;
4370
1
    return offset;
4371
1
}
4372
4373
static void
4374
dissect_rtcp_profile_specific_extensions (packet_info *pinfo, tvbuff_t *tvb, proto_tree *tree, unsigned offset, int remaining)
4375
2
{
4376
2
    tvbuff_t   *next_tvb;
4377
2
    proto_tree *pse_tree;
4378
2
    proto_item *pse_item;
4379
2
    int         bytes_consumed;
4380
2
    uint16_t    extension_type;
4381
4382
    /* Profile-specific extensions, as by their name, are supposed to be
4383
     * associated with a profile, negotiated in SDP or similar in the
4384
     * Media Description ("m=" line). In practice, the standards the
4385
     * define profile-specific extensions, like MS-RT, use the "RTP/AVP"
4386
     * profile, so we can't use that. They do seem to use the first two
4387
     * bytes as a type, though different standards disagree about the
4388
     * the nature of the length field (bytes vs 32-bit words).
4389
     *
4390
     * So we use a FT_UINT16 dissector table. If that ever proves
4391
     * insufficient, we could try a FT_NONE payload table.
4392
     */
4393
2
    col_append_str(pinfo->cinfo, COL_INFO, "(");
4394
5
    while (remaining) {
4395
3
        extension_type = tvb_get_ntohs(tvb, offset);
4396
3
        next_tvb = tvb_new_subset_length(tvb, offset, remaining);
4397
3
        pse_tree = proto_tree_add_subtree(tree, tvb, offset, remaining, ett_pse, &pse_item, "Profile Specific Extension");
4398
3
        bytes_consumed = dissector_try_uint_with_data(rtcp_pse_dissector_table, extension_type, next_tvb, pinfo, pse_tree, false, NULL);
4399
3
        if (!bytes_consumed) {
4400
2
            proto_item_append_text(pse_item, " (Unknown)");
4401
2
            col_append_str(pinfo->cinfo, COL_INFO, "PSE:Unknown ");
4402
2
            proto_tree_add_item(pse_tree, hf_rtcp_profile_specific_extension, tvb, offset,
4403
2
                    remaining, ENC_NA);
4404
2
            bytes_consumed = remaining;
4405
2
        }
4406
3
        offset += bytes_consumed;
4407
3
        remaining -= bytes_consumed;
4408
3
    }
4409
2
    col_append_str(pinfo->cinfo, COL_INFO, ") ");
4410
2
}
4411
4412
static int
4413
dissect_rtcp_rr( packet_info *pinfo, tvbuff_t *tvb, unsigned offset, proto_tree *tree,
4414
    int count, unsigned packet_length )
4415
10
{
4416
10
    int           counter;
4417
10
    proto_tree   *ssrc_tree;
4418
10
    proto_tree   *ssrc_sub_tree;
4419
10
    proto_tree   *high_sec_tree;
4420
10
    proto_item   *ti;
4421
10
    uint8_t       rr_flt;
4422
10
    int           rr_offset = offset;
4423
4424
4425
10
    counter = 1;
4426
71
    while ( counter <= count ) {
4427
61
        uint32_t lsr, dlsr;
4428
4429
        /* Create a new subtree for a length of 24 bytes */
4430
61
        ssrc_tree = proto_tree_add_subtree_format(tree, tvb, offset, 24,
4431
61
            ett_ssrc, NULL, "Source %u", counter );
4432
4433
        /* SSRC_n source identifier, 32 bits */
4434
61
        proto_tree_add_item( ssrc_tree, hf_rtcp_ssrc_source, tvb, offset, 4, ENC_BIG_ENDIAN );
4435
61
        offset += 4;
4436
4437
61
        ssrc_sub_tree = proto_tree_add_subtree(ssrc_tree, tvb, offset, 20, ett_ssrc_item, NULL, "SSRC contents" );
4438
4439
        /* Fraction lost, 8bits */
4440
61
        rr_flt = tvb_get_uint8( tvb, offset );
4441
61
        proto_tree_add_uint_format_value( ssrc_sub_tree, hf_rtcp_ssrc_fraction, tvb,
4442
61
            offset, 1, rr_flt, "%u / 256", rr_flt );
4443
61
        offset++;
4444
4445
        /* Cumulative number of packets lost, 24 bits */
4446
61
        proto_tree_add_item( ssrc_sub_tree, hf_rtcp_ssrc_cum_nr, tvb,
4447
61
            offset, 3, ENC_BIG_ENDIAN );
4448
61
        offset += 3;
4449
4450
        /* Extended highest sequence nr received, 32 bits
4451
         * Just for the sake of it, let's add another subtree
4452
         * because this might be a little clearer
4453
         */
4454
61
        ti = proto_tree_add_item( ssrc_tree, hf_rtcp_ssrc_ext_high_seq,
4455
61
            tvb, offset, 4, ENC_BIG_ENDIAN );
4456
61
        high_sec_tree = proto_item_add_subtree( ti, ett_ssrc_ext_high );
4457
        /* Sequence number cycles */
4458
61
        proto_tree_add_item( high_sec_tree, hf_rtcp_ssrc_high_cycles,
4459
61
            tvb, offset, 2, ENC_BIG_ENDIAN );
4460
61
        offset += 2;
4461
        /* highest sequence number received */
4462
61
        proto_tree_add_item( high_sec_tree, hf_rtcp_ssrc_high_seq,
4463
61
            tvb, offset, 2, ENC_BIG_ENDIAN );
4464
61
        offset += 2;
4465
4466
        /* Interarrival jitter */
4467
61
        proto_tree_add_item( ssrc_tree, hf_rtcp_ssrc_jitter, tvb,
4468
61
            offset, 4, ENC_BIG_ENDIAN );
4469
61
        offset += 4;
4470
4471
        /* Last SR timestamp */
4472
61
        lsr = tvb_get_ntohl( tvb, offset );
4473
61
        proto_tree_add_item( ssrc_tree, hf_rtcp_ssrc_lsr, tvb,
4474
61
                             offset, 4, ENC_BIG_ENDIAN );
4475
61
        offset += 4;
4476
4477
        /* Delay since last SR timestamp */
4478
61
        dlsr = tvb_get_ntohl( tvb, offset );
4479
61
        ti = proto_tree_add_item( ssrc_tree, hf_rtcp_ssrc_dlsr, tvb,
4480
61
                                  offset, 4, ENC_BIG_ENDIAN );
4481
61
        proto_item_append_text(ti, " (%d milliseconds)",
4482
61
                               (int)(((double)dlsr/(double)65536) * 1000.0));
4483
61
        offset += 4;
4484
4485
        /* Do roundtrip calculation */
4486
61
        if (global_rtcp_show_roundtrip_calculation)
4487
0
        {
4488
            /* Based on delay since SR was sent in other direction */
4489
0
            calculate_roundtrip_delay(tvb, pinfo, ssrc_tree, lsr, dlsr);
4490
0
        }
4491
4492
61
        counter++;
4493
61
    }
4494
4495
    /* If length remaining, assume profile-specific extension bytes */
4496
10
    if ((offset-rr_offset) < packet_length)
4497
2
    {
4498
2
        dissect_rtcp_profile_specific_extensions (pinfo, tvb, tree, offset, packet_length - (offset - rr_offset));
4499
2
        offset = rr_offset + packet_length;
4500
2
    }
4501
4502
10
    return offset;
4503
10
}
4504
4505
static int
4506
dissect_rtcp_sr( packet_info *pinfo, tvbuff_t *tvb, unsigned offset, proto_tree *tree,
4507
    int count,  unsigned packet_length )
4508
9
{
4509
9
    proto_item *item;
4510
9
    uint32_t    ts_msw, ts_lsw;
4511
9
    int         sr_offset = offset;
4512
4513
    /* NTP timestamp */
4514
9
    ts_msw = tvb_get_ntohl(tvb, offset);
4515
9
    proto_tree_add_item(tree, hf_rtcp_ntp_msw, tvb, offset, 4, ENC_BIG_ENDIAN);
4516
4517
9
    ts_lsw = tvb_get_ntohl(tvb, offset+4);
4518
9
    proto_tree_add_item(tree, hf_rtcp_ntp_lsw, tvb, offset+4, 4, ENC_BIG_ENDIAN);
4519
4520
9
    item = proto_tree_add_item(tree, hf_rtcp_ntp, tvb, offset, 8, ENC_TIME_NTP|ENC_BIG_ENDIAN);
4521
9
    proto_item_set_generated(item);
4522
9
    offset += 8;
4523
4524
    /* RTP timestamp, 32 bits */
4525
9
    proto_tree_add_item( tree, hf_rtcp_rtp_timestamp, tvb, offset, 4, ENC_BIG_ENDIAN );
4526
9
    offset += 4;
4527
    /* Sender's packet count, 32 bits */
4528
9
    proto_tree_add_item( tree, hf_rtcp_sender_pkt_cnt, tvb, offset, 4, ENC_BIG_ENDIAN );
4529
9
    offset += 4;
4530
    /* Sender's octet count, 32 bits */
4531
9
    proto_tree_add_item( tree, hf_rtcp_sender_oct_cnt, tvb, offset, 4, ENC_BIG_ENDIAN );
4532
9
    offset += 4;
4533
4534
    /* Record the time of this packet in the sender's conversation */
4535
9
    if (global_rtcp_show_roundtrip_calculation)
4536
0
    {
4537
        /* Use middle 32 bits of 64-bit time value */
4538
0
        uint32_t lsr = ((ts_msw & 0x0000ffff) << 16 | (ts_lsw & 0xffff0000) >> 16);
4539
4540
        /* Record the time that we sent this in appropriate conversation */
4541
0
        remember_outgoing_sr(pinfo, lsr);
4542
0
    }
4543
4544
    /* The rest of the packet is equal to the RR packet */
4545
9
    if ( count != 0 )
4546
5
        offset = dissect_rtcp_rr( pinfo, tvb, offset, tree, count, packet_length-(offset-sr_offset) );
4547
4
    else
4548
4
    {
4549
        /* If length remaining, assume profile-specific extension bytes */
4550
4
        if ((offset-sr_offset) < packet_length)
4551
0
        {
4552
0
            dissect_rtcp_profile_specific_extensions (pinfo, tvb,  tree, offset, packet_length - (offset - sr_offset));
4553
0
            offset = sr_offset + packet_length;
4554
0
        }
4555
4
    }
4556
4557
9
    return offset;
4558
9
}
4559
4560
/* Look for conversation info and display any setup info found */
4561
void show_setup_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
4562
133
{
4563
    /* Conversation and current data */
4564
133
    struct _rtcp_conversation_info *p_conv_data;
4565
4566
    /* Use existing packet data if available */
4567
133
    p_conv_data = (struct _rtcp_conversation_info *)p_get_proto_data(wmem_file_scope(), pinfo, proto_rtcp, 0);
4568
4569
133
    if (!p_conv_data)
4570
133
    {
4571
133
        conversation_t *p_conv;
4572
        /* First time, get info from conversation */
4573
133
        p_conv = find_conversation_strat_xtd(pinfo, pinfo->num, &pinfo->net_dst, &pinfo->net_src,
4574
133
                                   conversation_pt_to_conversation_type(pinfo->ptype),
4575
133
                                   pinfo->destport, pinfo->srcport, NO_ADDR_B);
4576
4577
133
        if (p_conv)
4578
7
        {
4579
            /* Look for data in conversation */
4580
7
            struct _rtcp_conversation_info *p_conv_packet_data;
4581
7
            p_conv_data = (struct _rtcp_conversation_info *)conversation_get_proto_data(p_conv, proto_rtcp);
4582
4583
7
            if (p_conv_data)
4584
0
            {
4585
                /* Save this conversation info into packet info */
4586
0
                p_conv_packet_data = (struct _rtcp_conversation_info *)wmem_memdup(wmem_file_scope(),
4587
0
                      p_conv_data, sizeof(struct _rtcp_conversation_info));
4588
4589
0
                p_add_proto_data(wmem_file_scope(), pinfo, proto_rtcp, 0, p_conv_packet_data);
4590
0
            }
4591
7
        }
4592
133
    }
4593
4594
    /* Create setup info subtree with summary info. */
4595
133
    if (p_conv_data && p_conv_data->setup_method_set)
4596
0
    {
4597
0
        proto_tree *rtcp_setup_tree;
4598
0
        proto_item *ti =  proto_tree_add_string_format(tree, hf_rtcp_setup, tvb, 0, 0,
4599
0
                                                       "",
4600
0
                                                       "Stream setup by %s (frame %u)",
4601
0
                                                       p_conv_data->setup_method,
4602
0
                                                       p_conv_data->setup_frame_number);
4603
0
        proto_item_set_generated(ti);
4604
0
        rtcp_setup_tree = proto_item_add_subtree(ti, ett_rtcp_setup);
4605
0
        if (rtcp_setup_tree)
4606
0
        {
4607
            /* Add details into subtree */
4608
0
            proto_item *item = proto_tree_add_uint(rtcp_setup_tree, hf_rtcp_setup_frame,
4609
0
                                                   tvb, 0, 0, p_conv_data->setup_frame_number);
4610
0
            proto_item_set_generated(item);
4611
0
            item = proto_tree_add_string(rtcp_setup_tree, hf_rtcp_setup_method,
4612
0
                                         tvb, 0, 0, p_conv_data->setup_method);
4613
0
            proto_item_set_generated(item);
4614
0
        }
4615
0
    }
4616
133
}
4617
4618
4619
/* Update conversation data to record time that outgoing rr/sr was sent */
4620
static void remember_outgoing_sr(packet_info *pinfo, uint32_t lsr)
4621
0
{
4622
0
    conversation_t                 *p_conv;
4623
0
    struct _rtcp_conversation_info *p_conv_data;
4624
0
    struct _rtcp_conversation_info *p_packet_data;
4625
4626
    /* This information will be accessed when an incoming packet comes back to
4627
       the side that sent this packet, so no use storing in the packet
4628
       info.  However, do store the fact that we've already set this info
4629
       before  */
4630
4631
4632
    /**************************************************************************/
4633
    /* First of all, see if we've already stored this information for this sr */
4634
4635
    /* Look first in packet info */
4636
0
    p_packet_data = (struct _rtcp_conversation_info *)p_get_proto_data(wmem_file_scope(), pinfo, proto_rtcp, 0);
4637
0
    if (p_packet_data && p_packet_data->last_received_set &&
4638
0
        (p_packet_data->last_received_frame_number >= pinfo->num))
4639
0
    {
4640
        /* We already did this, OK */
4641
0
        return;
4642
0
    }
4643
4644
4645
    /**************************************************************************/
4646
    /* Otherwise, we want to find/create the conversation and update it       */
4647
4648
    /* First time, get info from conversation.
4649
       Even though we think of this as an outgoing packet being sent,
4650
       we store the time as being received by the destination. */
4651
0
    p_conv = find_conversation_strat_xtd(pinfo, pinfo->num, &pinfo->net_dst, &pinfo->net_src,
4652
0
                               conversation_pt_to_conversation_type(pinfo->ptype),
4653
0
                               pinfo->destport, pinfo->srcport, NO_ADDR_B);
4654
4655
    /* If the conversation doesn't exist, create it now. */
4656
0
    if (!p_conv)
4657
0
    {
4658
0
        p_conv = conversation_new_strat_xtd(pinfo, pinfo->num, &pinfo->net_dst, &pinfo->net_src,
4659
0
            CONVERSATION_UDP, pinfo->destport, pinfo->srcport,
4660
0
            NO_ADDR2);
4661
0
        if (!p_conv)
4662
0
        {
4663
            /* Give up if can't create it */
4664
0
            return;
4665
0
        }
4666
0
    }
4667
4668
4669
    /****************************************************/
4670
    /* Now find/create conversation data                */
4671
0
    p_conv_data = (struct _rtcp_conversation_info *)conversation_get_proto_data(p_conv, proto_rtcp);
4672
0
    if (!p_conv_data)
4673
0
    {
4674
        /* Allocate memory for data */
4675
0
        p_conv_data = wmem_new0(wmem_file_scope(), struct _rtcp_conversation_info);
4676
4677
        /* Add it to conversation. */
4678
0
        conversation_add_proto_data(p_conv, proto_rtcp, p_conv_data);
4679
0
    }
4680
4681
    /*******************************************************/
4682
    /* Update conversation data                            */
4683
0
    p_conv_data->last_received_set = true;
4684
0
    p_conv_data->last_received_frame_number = pinfo->num;
4685
0
    p_conv_data->last_received_timestamp = pinfo->abs_ts;
4686
0
    p_conv_data->last_received_ts = lsr;
4687
4688
4689
    /****************************************************************/
4690
    /* Update packet info to record conversation state              */
4691
4692
    /* Will use/create packet info */
4693
0
    if (!p_packet_data)
4694
0
    {
4695
0
        p_packet_data = wmem_new0(wmem_file_scope(), struct _rtcp_conversation_info);
4696
4697
0
        p_add_proto_data(wmem_file_scope(), pinfo, proto_rtcp, 0, p_packet_data);
4698
0
    }
4699
4700
    /* Copy current conversation data into packet info */
4701
0
    p_packet_data->last_received_set = true;
4702
0
    p_packet_data->last_received_frame_number = p_conv_data->last_received_frame_number;
4703
0
}
4704
4705
4706
/* Use received sr to work out what the roundtrip delay is
4707
   (at least between capture point and the other endpoint involved in
4708
    the conversation) */
4709
static void calculate_roundtrip_delay(tvbuff_t *tvb, packet_info *pinfo,
4710
                                      proto_tree *tree, uint32_t lsr, uint32_t dlsr)
4711
0
{
4712
    /*****************************************************/
4713
    /* This is called dissecting an SR.  We need to:
4714
       - look in the packet info for stored calculation.  If found, use.
4715
       - look up the conversation of the sending side to see when the
4716
         'last SR' was detected (received)
4717
       - calculate the network delay using the that packet time,
4718
         this packet time, and dlsr
4719
    *****************************************************/
4720
4721
0
    conversation_t                 *p_conv;
4722
0
    struct _rtcp_conversation_info *p_conv_data;
4723
0
    struct _rtcp_conversation_info *p_packet_data;
4724
4725
4726
    /*************************************************/
4727
    /* Look for previous result                      */
4728
0
    p_packet_data = (struct _rtcp_conversation_info *)p_get_proto_data(wmem_file_scope(), pinfo, proto_rtcp, 0);
4729
0
    if (p_packet_data && p_packet_data->lsr_matched)
4730
0
    {
4731
        /* Show info. */
4732
0
        add_roundtrip_delay_info(tvb, pinfo, tree,
4733
0
                                 p_packet_data->calculated_delay_used_frame,
4734
0
                                 p_packet_data->calculated_delay_report_gap,
4735
0
                                 p_packet_data->calculated_delay);
4736
0
        return;
4737
0
    }
4738
4739
4740
    /********************************************************************/
4741
    /* Look for captured timestamp of last SR in conversation of sender */
4742
    /* of this packet                                                   */
4743
0
    p_conv = find_conversation_strat_xtd(pinfo, pinfo->num, &pinfo->net_src, &pinfo->net_dst,
4744
0
                               conversation_pt_to_conversation_type(pinfo->ptype),
4745
0
                               pinfo->srcport, pinfo->destport, NO_ADDR_B);
4746
0
    if (!p_conv)
4747
0
    {
4748
0
        return;
4749
0
    }
4750
4751
    /* Look for conversation data  */
4752
0
    p_conv_data = (struct _rtcp_conversation_info *)conversation_get_proto_data(p_conv, proto_rtcp);
4753
0
    if (!p_conv_data)
4754
0
    {
4755
0
        return;
4756
0
    }
4757
4758
0
    if (p_conv_data->last_received_set)
4759
0
    {
4760
        /* Store result of calculation in packet info */
4761
0
        if (!p_packet_data)
4762
0
        {
4763
            /* Create packet info if it doesn't exist */
4764
0
            p_packet_data = wmem_new0(wmem_file_scope(), struct _rtcp_conversation_info);
4765
4766
            /* Set as packet info */
4767
0
            p_add_proto_data(wmem_file_scope(), pinfo, proto_rtcp, 0, p_packet_data);
4768
0
        }
4769
4770
        /* Don't allow match seemingly calculated from same (or later!) frame */
4771
0
        if (pinfo->num <= p_conv_data->last_received_frame_number)
4772
0
        {
4773
0
            return;
4774
0
        }
4775
4776
        /* The previous report must match the lsr given here */
4777
0
        if (p_conv_data->last_received_ts == lsr)
4778
0
        {
4779
            /* Look at time of since original packet was sent */
4780
0
            int seconds_between_packets = (int)
4781
0
                  (pinfo->abs_ts.secs - p_conv_data->last_received_timestamp.secs);
4782
0
            int nseconds_between_packets =
4783
0
                  pinfo->abs_ts.nsecs - p_conv_data->last_received_timestamp.nsecs;
4784
4785
0
            int total_gap = (seconds_between_packets*1000) +
4786
0
                             (nseconds_between_packets / 1000000);
4787
0
            int dlsr_ms = (int)(((double)dlsr/(double)65536) * 1000.0);
4788
0
            int delay;
4789
4790
            /* Delay is gap - dlsr  (N.B. this is allowed to be -ve) */
4791
0
            delay = total_gap - dlsr_ms;
4792
4793
            /* Record that the LSR matches */
4794
0
            p_packet_data->lsr_matched = true;
4795
4796
            /* No useful calculation can be done if dlsr not set... */
4797
0
            if (dlsr)
4798
0
            {
4799
0
                p_packet_data->calculated_delay = delay;
4800
0
                p_packet_data->calculated_delay_report_gap = total_gap;
4801
0
                p_packet_data->calculated_delay_used_frame = p_conv_data->last_received_frame_number;
4802
0
            }
4803
4804
            /* Show info. */
4805
0
            add_roundtrip_delay_info(tvb, pinfo, tree,
4806
0
                                     p_conv_data->last_received_frame_number,
4807
0
                                     total_gap,
4808
0
                                     delay);
4809
0
        }
4810
0
    }
4811
0
}
4812
4813
/* Show the calculated roundtrip delay info by adding protocol tree items
4814
   and appending text to the info column */
4815
static void add_roundtrip_delay_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
4816
                                     unsigned frame, unsigned gap_between_reports,
4817
                                     int delay)
4818
0
{
4819
    /* 'Last SR' frame used in calculation.  Show this even if no delay shown */
4820
0
    proto_item *item = proto_tree_add_uint(tree,
4821
0
                                           hf_rtcp_last_sr_timestamp_frame,
4822
0
                                           tvb, 0, 0, frame);
4823
0
    proto_item_set_generated(item);
4824
4825
    /* Time elapsed since 'Last SR' time in capture */
4826
0
    item = proto_tree_add_uint(tree,
4827
0
                               hf_rtcp_time_since_last_sr,
4828
0
                               tvb, 0, 0, gap_between_reports);
4829
0
    proto_item_set_generated(item);
4830
4831
    /* Don't report on calculated delays below the threshold.
4832
       Will report delays less than -threshold, to highlight
4833
       problems with generated reports */
4834
0
    if (abs(delay) < (int)global_rtcp_show_roundtrip_calculation_minimum)
4835
0
    {
4836
0
        return;
4837
0
    }
4838
4839
    /* Calculated delay in ms */
4840
0
    item = proto_tree_add_int(tree, hf_rtcp_roundtrip_delay, tvb, 0, 0, delay);
4841
0
    proto_item_set_generated(item);
4842
4843
    /* Add to expert info */
4844
0
    if (delay >= 0)
4845
0
    {
4846
0
        expert_add_info_format(pinfo, item, &ei_rtcp_roundtrip_delay, "RTCP round-trip delay detected (%d ms)", delay);
4847
0
    }
4848
0
    else
4849
0
    {
4850
0
        expert_add_info_format(pinfo, item, &ei_rtcp_roundtrip_delay_negative, "Negative RTCP round-trip delay detected (%d ms)", delay);
4851
0
    }
4852
4853
    /* Report delay in INFO column */
4854
0
    col_append_fstr(pinfo->cinfo, COL_INFO,
4855
0
                    " (roundtrip delay <-> %s = %dms, using frame %u)  ",
4856
0
                    address_to_str(pinfo->pool, &pinfo->net_src), delay, frame);
4857
0
}
4858
4859
static int
4860
rtcp_packet_type_to_tree( int rtcp_packet_type)
4861
133
{
4862
133
    int tree;
4863
4864
133
    switch(rtcp_packet_type) {
4865
9
        case RTCP_SR:    tree = ett_rtcp_sr;    break;
4866
6
        case RTCP_RR:    tree = ett_rtcp_rr;    break;
4867
2
        case RTCP_SDES:  tree = ett_rtcp_sdes;  break;
4868
8
        case RTCP_BYE:   tree = ett_rtcp_bye;   break;
4869
10
        case RTCP_APP:   tree = ett_rtcp_app;   break;
4870
51
        case RTCP_RTPFB: tree = ett_rtcp_rtpfb; break;
4871
9
        case RTCP_PSFB:  tree = ett_rtcp_psfb;  break;
4872
25
        case RTCP_XR:    tree = ett_rtcp_xr;    break;
4873
5
        case RTCP_FIR:   tree = ett_rtcp_fir;   break;
4874
1
        case RTCP_NACK:  tree = ett_rtcp_nack;  break;
4875
7
        default:         tree = ett_rtcp;
4876
133
    }
4877
133
    return tree;
4878
133
}
4879
4880
static int
4881
dissect_rtcp_common( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_, bool is_srtp )
4882
120
{
4883
120
    proto_item       *ti;
4884
120
    proto_tree       *rtcp_tree           = NULL;
4885
120
    proto_item       *padding_item        = NULL;
4886
120
    unsigned          offset              = 0;
4887
120
    unsigned          total_packet_length = 0;
4888
120
    unsigned          padding_offset      = 0;
4889
120
    bool              srtcp_encrypted     = false;
4890
120
    bool              srtcp_now_encrypted = false;
4891
120
    conversation_t   *p_conv;
4892
120
    struct srtp_info *srtcp_info          = NULL;
4893
120
    uint32_t          srtcp_offset        = 0;
4894
120
    uint32_t          srtcp_index         = 0;
4895
120
    uint8_t           temp_byte;
4896
120
    int proto_to_use = proto_rtcp;
4897
4898
120
    temp_byte = tvb_get_uint8(tvb, offset);
4899
    /* RFC 7983 gives current best practice in demultiplexing RT[C]P packets:
4900
     * Examine the first byte of the packet:
4901
     *              +----------------+
4902
     *              |        [0..3] -+--> forward to STUN
4903
     *              |                |
4904
     *              |      [16..19] -+--> forward to ZRTP
4905
     *              |                |
4906
     *  packet -->  |      [20..63] -+--> forward to DTLS
4907
     *              |                |
4908
     *              |      [64..79] -+--> forward to TURN Channel
4909
     *              |                |
4910
     *              |    [128..191] -+--> forward to RTP/RTCP
4911
     *              +----------------+
4912
     *
4913
     * DTLS-SRTP MUST support multiplexing of DTLS and RTP over the same
4914
     * port pair (RFCs 5764, 8835), and STUN packets sharing one port are
4915
     * common as well. In WebRTC it's common to get a SDP early in the
4916
     * setup process that sets up a RTCP conversation and sets the dissector
4917
     * to RTCP, but to still get subsequent STUN and DTLS packets.
4918
     *
4919
     * XXX: Add a pref like RTP to specifically send the packet to the correct
4920
     * other dissector. For now, rejecting packets works for the general setup,
4921
     * since the other dissectors have fairly good heuristic dissectors that
4922
     * are enabled by default.
4923
     */
4924
4925
    /* first see if this conversation is encrypted SRTP, and if so do not try to dissect the payload(s) */
4926
120
    p_conv = find_conversation_strat_xtd(pinfo, pinfo->num, &pinfo->net_src, &pinfo->net_dst,
4927
120
                               conversation_pt_to_conversation_type(pinfo->ptype),
4928
120
                               pinfo->srcport, pinfo->destport, NO_ADDR_B);
4929
120
    if (p_conv)
4930
1
    {
4931
1
        struct _rtcp_conversation_info *p_conv_data;
4932
1
        p_conv_data = (struct _rtcp_conversation_info *)conversation_get_proto_data(p_conv, proto_rtcp);
4933
1
        if (p_conv_data && p_conv_data->srtcp_info)
4934
0
        {
4935
0
            bool e_bit;
4936
0
            proto_to_use = proto_srtcp;
4937
0
            srtcp_info = p_conv_data->srtcp_info;
4938
            /* get the offset to the start of the SRTCP fields at the end of the packet */
4939
0
            srtcp_offset = tvb_reported_length_remaining(tvb, offset) - srtcp_info->auth_tag_len - srtcp_info->mki_len - 4;
4940
            /* It has been setup as SRTCP, but skip to the SRTCP E field at the end
4941
               to see if this particular packet is encrypted or not. The E bit is the MSB. */
4942
0
            srtcp_index = tvb_bytes_exist(tvb, srtcp_offset, 4) ? tvb_get_ntohl(tvb, srtcp_offset) : 0;
4943
0
            e_bit = (srtcp_index & 0x80000000) ? true : false;
4944
0
            srtcp_index &= 0x7fffffff;
4945
4946
0
            if (srtcp_info->encryption_algorithm!=SRTP_ENC_ALG_NULL) {
4947
                /* just flag it for now - the first SR or RR header and SSRC are unencrypted */
4948
0
                if (e_bit)
4949
0
                    srtcp_encrypted = true;
4950
0
            }
4951
0
        }
4952
119
    } else if (is_srtp) {
4953
        /* We've been told to dissect this as SRTCP without conversation info
4954
         * (so via Decode As or heuristic); since we don't know where the SRTCP
4955
         * bits start, so we don't know if it's encrypted. Assume yes, to
4956
         * avoid errors.
4957
         */
4958
0
        srtcp_encrypted = true;
4959
0
        proto_to_use = proto_srtcp;
4960
0
    }
4961
4962
120
    col_set_str(pinfo->cinfo, COL_PROTOCOL, (proto_to_use == proto_srtcp) ? "SRTCP" : "RTCP");
4963
4964
120
    if (RTCP_VERSION(temp_byte) != 2) {
4965
        /* Unknown or unsupported version */
4966
2
        col_add_fstr(pinfo->cinfo, COL_INFO, "Unknown %s version %u", (proto_to_use == proto_srtcp) ? "SRTCP" : "RTCP", RTCP_VERSION(temp_byte));
4967
2
        ti = proto_tree_add_item(tree, proto_to_use, tvb, offset, -1, ENC_NA );
4968
2
        rtcp_tree = proto_item_add_subtree(ti, ett_rtcp);
4969
2
        proto_tree_add_item( rtcp_tree, hf_rtcp_version, tvb,
4970
2
                             offset, 1, ENC_BIG_ENDIAN);
4971
4972
        /* XXX: Offset is zero here, so in practice this rejects the packet
4973
         * and lets heuristic dissectors make an attempt, though extra tree
4974
         * entries appear on a tshark one pass even if some other dissector
4975
         * claims the packet.
4976
         */
4977
2
        return offset;
4978
2
    }
4979
    /*
4980
     * Check if there are at least 4 bytes left in the frame,
4981
     * the last 16 bits of those is the length of the current
4982
     * RTCP message. The last compound message contains padding,
4983
     * that enables us to break from the while loop.
4984
     */
4985
143
    while ( !srtcp_now_encrypted && tvb_bytes_exist( tvb, offset, 4) ) {
4986
140
        int elem_count;
4987
140
        unsigned packet_type;
4988
140
        unsigned packet_length;
4989
        /*
4990
         * First retrieve the packet_type
4991
         */
4992
140
        packet_type = tvb_get_uint8( tvb, offset + 1 );
4993
4994
        /*
4995
         * Check if it's a valid type
4996
         */
4997
140
        if ( ( packet_type < RTCP_PT_MIN ) || ( packet_type >  RTCP_PT_MAX ) )
4998
7
            break;
4999
5000
133
        col_add_fstr(pinfo->cinfo, COL_INFO, "%s   ",
5001
133
                      val_to_str_const(packet_type, rtcp_packet_type_vals, "Unknown"));
5002
5003
        /*
5004
         * get the packet-length for the complete RTCP packet
5005
         */
5006
133
        packet_length = ( tvb_get_ntohs( tvb, offset + 2 ) + 1 ) * 4;
5007
133
        total_packet_length += packet_length;
5008
5009
133
        ti = proto_tree_add_item(tree, proto_to_use, tvb, offset, packet_length, ENC_NA );
5010
133
        proto_item_append_text(ti, " (%s)",
5011
133
                               val_to_str_const(packet_type,
5012
133
                                                rtcp_packet_type_vals,
5013
133
                                                "Unknown"));
5014
5015
133
        rtcp_tree = proto_item_add_subtree( ti, rtcp_packet_type_to_tree(packet_type) );
5016
5017
        /* Conversation setup info */
5018
133
        if (global_rtcp_show_setup_info)
5019
133
        {
5020
133
            show_setup_info(tvb, pinfo, rtcp_tree);
5021
133
        }
5022
5023
133
        if (rtcp_padding_set)
5024
63
        {
5025
            /* Padding can't yet be set, since there is another packet */
5026
63
            expert_add_info(pinfo, padding_item, &ei_rtcp_not_final_padding);
5027
63
        }
5028
5029
133
        temp_byte = tvb_get_uint8( tvb, offset );
5030
5031
133
        proto_tree_add_item( rtcp_tree, hf_rtcp_version, tvb,
5032
133
                             offset, 1, ENC_BIG_ENDIAN);
5033
133
        rtcp_padding_set = RTCP_PADDING( temp_byte );
5034
133
        padding_offset = offset + packet_length - 1;
5035
5036
133
        padding_item = proto_tree_add_boolean( rtcp_tree, hf_rtcp_padding, tvb,
5037
133
                                               offset, 1, temp_byte );
5038
133
        elem_count = RTCP_COUNT( temp_byte );
5039
5040
133
        switch ( packet_type ) {
5041
9
            case RTCP_SR:
5042
15
            case RTCP_RR:
5043
                /* Receiver report count, 5 bits */
5044
15
                proto_tree_add_uint( rtcp_tree, hf_rtcp_rc, tvb, offset, 1, temp_byte );
5045
15
                offset++;
5046
                /* Packet type, 8 bits */
5047
15
                proto_tree_add_item( rtcp_tree, hf_rtcp_pt, tvb, offset, 1, ENC_BIG_ENDIAN );
5048
15
                offset++;
5049
                /* Packet length in 32 bit words MINUS one, 16 bits */
5050
15
                offset = dissect_rtcp_length_field(rtcp_tree, tvb, offset);
5051
                /* Sender Synchronization source, 32 bits */
5052
15
                proto_tree_add_item( rtcp_tree, hf_rtcp_ssrc_sender, tvb, offset, 4, ENC_BIG_ENDIAN );
5053
15
                offset += 4;
5054
5055
15
                if (srtcp_encrypted) { /* rest of the payload is encrypted - do not try to dissect */
5056
0
                    srtcp_now_encrypted = true;
5057
0
                    break;
5058
0
                }
5059
5060
15
                if ( packet_type == RTCP_SR )
5061
9
                    offset = dissect_rtcp_sr( pinfo, tvb, offset, rtcp_tree, elem_count, packet_length-8 );
5062
6
                else
5063
6
                    offset = dissect_rtcp_rr( pinfo, tvb, offset, rtcp_tree, elem_count, packet_length-8 );
5064
15
                break;
5065
2
            case RTCP_SDES:
5066
                /* Source count, 5 bits */
5067
2
                proto_tree_add_uint( rtcp_tree, hf_rtcp_sc, tvb, offset, 1, temp_byte );
5068
2
                offset++;
5069
                /* Packet type, 8 bits */
5070
2
                proto_tree_add_item( rtcp_tree, hf_rtcp_pt, tvb, offset, 1, ENC_BIG_ENDIAN );
5071
2
                offset++;
5072
                /* Packet length in 32 bit words MINUS one, 16 bits */
5073
2
                offset = dissect_rtcp_length_field(rtcp_tree, tvb, offset);
5074
2
                offset += dissect_rtcp_sdes( tvb_new_subset_length(tvb, offset, packet_length - 4), 0, rtcp_tree, elem_count);
5075
2
                break;
5076
8
            case RTCP_BYE:
5077
                /* Source count, 5 bits */
5078
8
                proto_tree_add_uint( rtcp_tree, hf_rtcp_sc, tvb, offset, 1, temp_byte );
5079
8
                offset++;
5080
                /* Packet type, 8 bits */
5081
8
                proto_tree_add_item( rtcp_tree, hf_rtcp_pt, tvb, offset, 1, ENC_BIG_ENDIAN );
5082
8
                offset++;
5083
                /* Packet length in 32 bit words MINUS one, 16 bits */
5084
8
                offset = dissect_rtcp_length_field(rtcp_tree, tvb, offset);
5085
8
                offset = dissect_rtcp_bye( tvb, pinfo, offset, rtcp_tree, elem_count, packet_length-4 );
5086
8
                break;
5087
10
            case RTCP_APP: {
5088
                /* Subtype, 5 bits */
5089
10
                unsigned rtcp_subtype;
5090
10
                unsigned app_length;
5091
10
                proto_item* subtype_item;
5092
10
                rtcp_subtype = elem_count;
5093
10
                subtype_item = proto_tree_add_uint( rtcp_tree, hf_rtcp_subtype, tvb, offset, 1, elem_count );
5094
10
                offset++;
5095
                /* Packet type, 8 bits */
5096
10
                proto_tree_add_item( rtcp_tree, hf_rtcp_pt, tvb, offset, 1, ENC_BIG_ENDIAN );
5097
10
                offset++;
5098
                /* Packet length in 32 bit words MINUS one, 16 bits */
5099
10
                app_length = tvb_get_ntohs( tvb, offset ) <<2;
5100
10
                offset = dissect_rtcp_length_field(rtcp_tree, tvb, offset);
5101
                /* SSRC / CSRC */
5102
10
                proto_tree_add_item(rtcp_tree, hf_rtcp_ssrc_source, tvb, offset, 4, ENC_BIG_ENDIAN);
5103
10
                offset += 4;
5104
10
                if (srtcp_encrypted) { /* rest of the payload is encrypted - do not try to dissect hf_rtcp_encrypted*/
5105
0
                    proto_tree_add_item(rtcp_tree, hf_rtcp_encrypted, tvb, offset, -1, ENC_NA);
5106
0
                    if (preferences_application_specific_encoding == RTCP_APP_MCPTT) {
5107
0
                        char* str = val_to_str(pinfo->pool, rtcp_subtype, rtcp_mcpt_subtype_vals, "unknown (%u)");
5108
5109
0
                        col_add_fstr(pinfo->cinfo, COL_INFO, "(MCPT) %s", str);
5110
0
                        proto_item_append_text(subtype_item, " %s", str);
5111
0
                    }
5112
5113
0
                    return tvb_reported_length(tvb);
5114
0
                }
5115
10
                offset = dissect_rtcp_app( tvb, pinfo, offset,rtcp_tree, packet_length - 8, subtype_item, rtcp_subtype, app_length);
5116
10
            }
5117
0
                break;
5118
25
            case RTCP_XR:
5119
                /* Reserved, 5 bits, Ignore */
5120
25
                offset++;
5121
                /* Packet type, 8 bits */
5122
25
                proto_tree_add_item( rtcp_tree, hf_rtcp_pt, tvb, offset, 1, ENC_BIG_ENDIAN );
5123
25
                offset++;
5124
                /* Packet length in 32 bit words MINUS one, 16 bits */
5125
25
                offset = dissect_rtcp_length_field(rtcp_tree, tvb, offset);
5126
25
                offset = dissect_rtcp_xr( tvb, pinfo, offset, rtcp_tree, packet_length - 4 );
5127
25
                break;
5128
1
            case RTCP_AVB:
5129
                /* Subtype, 5 bits */
5130
1
                proto_tree_add_uint( rtcp_tree, hf_rtcp_subtype, tvb, offset, 1, elem_count );
5131
1
                offset++;
5132
                /* Packet type, 8 bits */
5133
1
                proto_tree_add_item( rtcp_tree, hf_rtcp_pt, tvb, offset, 1, ENC_BIG_ENDIAN );
5134
1
                offset++;
5135
                /* Packet length in 32 bit words MINUS one, 16 bits */
5136
1
                offset = dissect_rtcp_length_field(rtcp_tree, tvb, offset);
5137
1
                offset = dissect_rtcp_avb( tvb, pinfo, offset, rtcp_tree, packet_length - 4 );
5138
1
                break;
5139
1
            case RTCP_RSI:
5140
                /* Reserved, 5 bits, Ignore */
5141
1
                offset++;
5142
                /* Packet type, 8 bits */
5143
1
                proto_tree_add_item( rtcp_tree, hf_rtcp_pt, tvb, offset, 1, ENC_BIG_ENDIAN );
5144
1
                offset++;
5145
                /* Packet length in 32 bit words MINUS one, 16 bits */
5146
1
                offset = dissect_rtcp_length_field(rtcp_tree, tvb, offset);
5147
1
                offset = dissect_rtcp_rsi( tvb, pinfo, offset, rtcp_tree, packet_length - 4 );
5148
1
                break;
5149
0
            case RTCP_TOKEN: {
5150
                /* Subtype, 5 bits */
5151
0
                unsigned rtcp_subtype;
5152
0
                rtcp_subtype = elem_count;
5153
0
                proto_tree_add_uint( rtcp_tree, hf_rtcp_subtype, tvb, offset, 1, elem_count );
5154
0
                offset++;
5155
                /* Packet type, 8 bits */
5156
0
                proto_tree_add_item( rtcp_tree, hf_rtcp_pt, tvb, offset, 1, ENC_BIG_ENDIAN );
5157
0
                offset++;
5158
                /* Packet length in 32 bit words MINUS one, 16 bits */
5159
0
                offset = dissect_rtcp_length_field(rtcp_tree, tvb, offset);
5160
0
                offset = dissect_rtcp_token( tvb, pinfo, offset, rtcp_tree, packet_length - 4, rtcp_subtype );
5161
0
            }
5162
0
                break;
5163
5
            case RTCP_FIR:
5164
5
                offset = dissect_rtcp_fir( tvb, offset, rtcp_tree );
5165
5
                break;
5166
1
            case RTCP_NACK:
5167
1
                offset = dissect_rtcp_nack( tvb, offset, rtcp_tree );
5168
1
                break;
5169
51
            case RTCP_RTPFB:
5170
51
                offset = dissect_rtcp_rtpfb( tvb, offset, rtcp_tree, pinfo );
5171
51
                break;
5172
9
            case RTCP_PSFB:
5173
9
                offset = dissect_rtcp_psfb( tvb, offset, rtcp_tree, packet_length, ti, pinfo );
5174
9
                break;
5175
5
            default:
5176
                /*
5177
                 * To prevent endless loops in case of an unknown message type
5178
                 * increase offset. Some time the while will end :-)
5179
                 */
5180
5
                offset++;
5181
5
                break;
5182
133
        }
5183
5184
25
        col_set_fence(pinfo->cinfo, COL_INFO);
5185
25
    }
5186
    /* If the padding bit is set, the last octet of the
5187
     * packet contains the length of the padding
5188
     * We only have to check for this at the end of the LAST RTCP message
5189
     */
5190
10
    if ( rtcp_padding_set ) {
5191
3
        unsigned padding_length;
5192
        /* The last RTCP message in the packet has padding - find it.
5193
         *
5194
         * The padding count is found at an offset of padding_offset; it
5195
         * contains the number of padding octets, including the padding
5196
         * count itself.
5197
         */
5198
3
        padding_length = tvb_get_uint8( tvb, padding_offset);
5199
5200
        /* This length includes the padding length byte itself, so 0 is not
5201
         * a valid value. */
5202
3
        if (padding_length != 0) {
5203
1
            proto_tree_add_item( rtcp_tree, hf_rtcp_padding_data, tvb, offset, padding_length - 1, ENC_NA );
5204
1
            offset += padding_length - 1;
5205
1
        }
5206
3
        proto_tree_add_item( rtcp_tree, hf_rtcp_padding_count, tvb, offset, 1, ENC_BIG_ENDIAN );
5207
3
        offset++;
5208
3
    }
5209
5210
    /* If the payload was encrypted, the main payload was not dissected.
5211
     */
5212
10
    if (srtcp_encrypted == true) {
5213
        /* If we don't have srtcp_info we can't calculate the length
5214
         */
5215
0
        if (srtcp_info) {
5216
0
            proto_tree_add_expert(rtcp_tree, pinfo, &ei_srtcp_encrypted_payload, tvb, offset, srtcp_offset - offset);
5217
0
            proto_tree_add_item(rtcp_tree, hf_srtcp_e, tvb, srtcp_offset, 4, ENC_BIG_ENDIAN);
5218
0
            proto_tree_add_uint(rtcp_tree, hf_srtcp_index, tvb, srtcp_offset, 4, srtcp_index);
5219
0
            srtcp_offset += 4;
5220
0
            if (srtcp_info->mki_len) {
5221
0
                proto_tree_add_item(rtcp_tree, hf_srtcp_mki, tvb, srtcp_offset, srtcp_info->mki_len, ENC_NA);
5222
0
                srtcp_offset += srtcp_info->mki_len;
5223
0
            }
5224
5225
0
            if (srtcp_info->auth_tag_len) {
5226
0
                proto_tree_add_item(rtcp_tree, hf_srtcp_auth_tag, tvb, srtcp_offset, srtcp_info->auth_tag_len, ENC_NA);
5227
                /*srtcp_offset += srtcp_info->auth_tag_len;*/
5228
0
            }
5229
0
        } else {
5230
0
            proto_tree_add_expert_remaining(rtcp_tree, pinfo, &ei_srtcp_encrypted_payload, tvb, offset);
5231
0
        }
5232
0
    }
5233
    /* offset should be total_packet_length by now... */
5234
10
    else if (offset == total_packet_length)
5235
2
    {
5236
2
        ti = proto_tree_add_boolean_format_value(rtcp_tree, hf_rtcp_length_check, tvb,
5237
2
                                            0, 0, true, "OK - %u bytes",
5238
2
                                            offset);
5239
        /* Hidden might be less annoying here...? */
5240
2
        proto_item_set_generated(ti);
5241
2
    }
5242
8
    else
5243
8
    {
5244
8
        ti = proto_tree_add_boolean_format_value(rtcp_tree, hf_rtcp_length_check, tvb,
5245
8
                                            0, 0, false,
5246
8
                                            "Wrong (expected %u bytes, found %d)",
5247
8
                                            total_packet_length, offset);
5248
8
        proto_item_set_generated(ti);
5249
5250
8
        expert_add_info_format(pinfo, ti, &ei_rtcp_length_check, "Incorrect RTCP packet length information (expected %u bytes, found %d)", total_packet_length, offset);
5251
8
    }
5252
10
    return tvb_captured_length(tvb);
5253
118
}
5254
5255
static int
5256
dissect_srtcp(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree, void* data)
5257
0
{
5258
0
    return dissect_rtcp_common(tvb, pinfo, tree, data, true);
5259
0
}
5260
5261
static int
5262
dissect_rtcp(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree, void* data)
5263
120
{
5264
120
    return dissect_rtcp_common(tvb, pinfo, tree, data, false);
5265
120
}
5266
5267
static void
5268
register_subdissectors_for_rtcp_rtpfb_dissector_table(void)
5269
15
{
5270
15
    proto_rtcp_rtpfb_nack = proto_register_protocol_in_name_only("Generic negative acknowledgement (NACK)", "RTCP NACK", "rtcp_rtpfb_nack", proto_rtcp, FT_BYTES);
5271
15
    proto_rtcp_rtpfb_tmmbr =
5272
15
        proto_register_protocol_in_name_only("Temporary Maximum Media Stream Bit Rate Request (TMMBR)", "RTCP TMMBR", "rtcp_rtpfb_tmmbr", proto_rtcp, FT_BYTES);
5273
15
    proto_rtcp_rtpfb_tmmbn =
5274
15
        proto_register_protocol_in_name_only("Temporary Maximum Media Stream Bit Rate Notification (TMMBN)", "RTCP TMMBN", "rtcp_rtpfb_tmmbn", proto_rtcp, FT_BYTES);
5275
15
    proto_rtcp_rtpfb_ccfb = proto_register_protocol_in_name_only("RTP Congestion Control Feedback (CCFB)", "RTCP CCFB", "rtcp_rtpfb_ccfb", proto_rtcp, FT_BYTES);
5276
15
    proto_rtcp_rtpfb_transport_cc =
5277
15
        proto_register_protocol_in_name_only("Transport-wide Congestion Control (Transport-cc)", "RTCP Transport-CC", "rtcp_rtpfb_transport_cc", proto_rtcp, FT_BYTES);
5278
15
    proto_rtcp_rtpfb_undecoded_fci = proto_register_protocol_in_name_only("Undecoded FCI", "Undecoded FCI", "rtcp_rtpfb_undecoded_fci", proto_rtcp, FT_BYTES);
5279
5280
15
    rtcp_rtpfb_nack_handle = register_dissector("rtcp_rtpfb_nack", dissect_rtcp_rtpfb_nack, proto_rtcp_rtpfb_nack);
5281
15
    rtcp_rtpfb_tmmbr_handle = register_dissector("rtcp_rtpfb_tmmbr", dissect_rtcp_rtpfb_tmmbr, proto_rtcp_rtpfb_tmmbr);
5282
15
    rtcp_rtpfb_tmmbn_handle = register_dissector("rtcp_rtpfb_tmmbn", dissect_rtcp_rtpfb_tmmbn, proto_rtcp_rtpfb_tmmbn);
5283
15
    rtcp_rtpfb_ccfb_handle = register_dissector("rtcp_rtpfb_ccfb", dissect_rtcp_rtpfb_ccfb, proto_rtcp_rtpfb_ccfb);
5284
15
    rtcp_rtpfb_transport_cc_handle = register_dissector("rtcp_rtpfb_transport_cc", dissect_rtcp_rtpfb_transport_cc, proto_rtcp_rtpfb_transport_cc);
5285
15
    rtcp_rtpfb_undecoded_fci_handle = register_dissector("rtcp_rtpfb_undecoded_fci", dissect_rtcp_rtpfb_undecoded, proto_rtcp_rtpfb_undecoded_fci);
5286
15
}
5287
5288
static void
5289
add_entries_for_rtcp_rtpfb_dissector_table(void)
5290
15
{
5291
    /* Below rtcp-rtpfb-fmt values (1, 3, 4, 11, 15) have full decoding support */
5292
15
    const uint32_t rtcp_rtpfb_nack_fmt = 1;
5293
15
    const uint32_t rtcp_rtpfb_tmmbr_fmt = 3;
5294
15
    const uint32_t rtcp_rtpfb_tmmbn_fmt = 4;
5295
15
    const uint32_t rtcp_rtpfb_ccfb_fmt = 11;
5296
15
    const uint32_t rtcp_rtpfb_transport_cc_fmt = 15;
5297
15
    dissector_add_uint("rtcp.rtpfb.fmt", rtcp_rtpfb_nack_fmt, rtcp_rtpfb_nack_handle);
5298
15
    dissector_add_uint("rtcp.rtpfb.fmt", rtcp_rtpfb_tmmbr_fmt, rtcp_rtpfb_tmmbr_handle);
5299
15
    dissector_add_uint("rtcp.rtpfb.fmt", rtcp_rtpfb_tmmbn_fmt, rtcp_rtpfb_tmmbn_handle);
5300
15
    dissector_add_uint("rtcp.rtpfb.fmt", rtcp_rtpfb_ccfb_fmt, rtcp_rtpfb_ccfb_handle);
5301
15
    dissector_add_uint("rtcp.rtpfb.fmt", rtcp_rtpfb_transport_cc_fmt, rtcp_rtpfb_transport_cc_handle);
5302
5303
    /* Below rtcp-rtpfb-fmt values (2, 5 - 10) don't have support for FCI decoding */
5304
15
    int rtcp_rtpfb_fmt = 2;
5305
15
    dissector_add_uint("rtcp.rtpfb.fmt", rtcp_rtpfb_fmt, rtcp_rtpfb_undecoded_fci_handle);
5306
105
    for (rtcp_rtpfb_fmt = 5; rtcp_rtpfb_fmt < 11; rtcp_rtpfb_fmt++) {
5307
90
      dissector_add_uint("rtcp.rtpfb.fmt", rtcp_rtpfb_fmt, rtcp_rtpfb_undecoded_fci_handle);
5308
90
    }
5309
15
}
5310
5311
void
5312
proto_register_rtcp(void)
5313
15
{
5314
15
    static hf_register_info hf[] = {
5315
15
        {
5316
15
            &hf_rtcp_version,
5317
15
            {
5318
15
                "Version",
5319
15
                "rtcp.version",
5320
15
                FT_UINT8,
5321
15
                BASE_DEC,
5322
15
                VALS(rtcp_version_vals),
5323
15
                0xC0,
5324
15
                NULL, HFILL
5325
15
            }
5326
15
        },
5327
15
        {
5328
15
            &hf_rtcp_padding,
5329
15
            {
5330
15
                "Padding",
5331
15
                "rtcp.padding",
5332
15
                FT_BOOLEAN,
5333
15
                8,
5334
15
                NULL,
5335
15
                0x20,
5336
15
                NULL, HFILL
5337
15
            }
5338
15
        },
5339
15
        {
5340
15
            &hf_rtcp_rc,
5341
15
            {
5342
15
                "Reception report count",
5343
15
                "rtcp.rc",
5344
15
                FT_UINT8,
5345
15
                BASE_DEC,
5346
15
                NULL,
5347
15
                0x1F,
5348
15
                NULL, HFILL
5349
15
            }
5350
15
        },
5351
15
        {
5352
15
            &hf_rtcp_sc,
5353
15
            {
5354
15
                "Source count",
5355
15
                "rtcp.sc",
5356
15
                FT_UINT8,
5357
15
                BASE_DEC,
5358
15
                NULL,
5359
15
                0x1F,
5360
15
                NULL, HFILL
5361
15
            }
5362
15
        },
5363
15
        {
5364
15
            &hf_rtcp_pt,
5365
15
            {
5366
15
                "Packet type",
5367
15
                "rtcp.pt",
5368
15
                FT_UINT8,
5369
15
                BASE_DEC,
5370
15
                VALS( rtcp_packet_type_vals ),
5371
15
                0x0,
5372
15
                NULL, HFILL
5373
15
            }
5374
15
        },
5375
15
        {
5376
15
            &hf_rtcp_length,
5377
15
            {
5378
15
                "Length",
5379
15
                "rtcp.length",
5380
15
                FT_UINT16,
5381
15
                BASE_DEC,
5382
15
                NULL,
5383
15
                0x0,
5384
15
                "32-bit words (-1) in packet", HFILL
5385
15
            }
5386
15
        },
5387
15
        {
5388
15
            &hf_rtcp_ssrc_sender,
5389
15
            {
5390
15
                "Sender SSRC",
5391
15
                "rtcp.senderssrc",
5392
15
                FT_UINT32,
5393
15
                BASE_HEX_DEC,
5394
15
                NULL,
5395
15
                0x0,
5396
15
                NULL, HFILL
5397
15
            }
5398
15
        },
5399
15
        {
5400
15
            &hf_rtcp_ssrc_media_source,
5401
15
            {
5402
15
                "Media source SSRC",
5403
15
                "rtcp.mediassrc",
5404
15
                FT_UINT32,
5405
15
                BASE_HEX_DEC,
5406
15
                NULL,
5407
15
                0x0,
5408
15
                NULL, HFILL
5409
15
            }
5410
15
        },
5411
15
        {
5412
15
            &hf_rtcp_ntp_msw,
5413
15
            {
5414
15
                "Timestamp, MSW",
5415
15
                "rtcp.timestamp.ntp.msw",
5416
15
                FT_UINT32,
5417
15
                BASE_DEC_HEX,
5418
15
                NULL,
5419
15
                0x0,
5420
15
                NULL, HFILL
5421
15
            }
5422
15
        },
5423
15
        {
5424
15
            &hf_rtcp_ntp_lsw,
5425
15
            {
5426
15
                "Timestamp, LSW",
5427
15
                "rtcp.timestamp.ntp.lsw",
5428
15
                FT_UINT32,
5429
15
                BASE_DEC_HEX,
5430
15
                NULL,
5431
15
                0x0,
5432
15
                NULL, HFILL
5433
15
            }
5434
15
        },
5435
15
        {
5436
15
            &hf_rtcp_ntp,
5437
15
            {
5438
15
                "MSW and LSW as NTP timestamp",
5439
15
                "rtcp.timestamp.ntp",
5440
15
                FT_ABSOLUTE_TIME,
5441
15
                ABSOLUTE_TIME_UTC,
5442
15
                NULL,
5443
15
                0x0,
5444
15
                NULL, HFILL
5445
15
            }
5446
15
        },
5447
15
        {
5448
15
            &hf_rtcp_timebase_indicator,
5449
15
            {
5450
15
                "Timebase Indicator",
5451
15
                "rtcp.timebase_indicator",
5452
15
                FT_UINT16,
5453
15
                BASE_DEC_HEX,
5454
15
                NULL,
5455
15
                0x0,
5456
15
                NULL, HFILL
5457
15
            }
5458
15
        },
5459
15
        {
5460
15
            &hf_rtcp_identity,
5461
15
            {
5462
15
                "Identity",
5463
15
                "rtcp.identity",
5464
15
                FT_BYTES,
5465
15
                BASE_NONE,
5466
15
                NULL,
5467
15
                0x0,
5468
15
                NULL, HFILL
5469
15
            }
5470
15
        },
5471
15
        {
5472
15
            &hf_rtcp_stream_id,
5473
15
            {
5474
15
                "Stream id",
5475
15
                "rtcp.stream_id",
5476
15
                FT_UINT64,
5477
15
                BASE_HEX,
5478
15
                NULL,
5479
15
                0x0,
5480
15
                NULL, HFILL
5481
15
            }
5482
15
        },
5483
15
        {
5484
15
            &hf_rtcp_as_timestamp,
5485
15
            {
5486
15
                "AS timestamp",
5487
15
                "rtcp.timestamp.as",
5488
15
                FT_UINT32,
5489
15
                BASE_DEC,
5490
15
                NULL,
5491
15
                0x0,
5492
15
                NULL, HFILL
5493
15
            }
5494
15
        },
5495
15
        {
5496
15
            &hf_rtcp_rtp_timestamp,
5497
15
            {
5498
15
                "RTP timestamp",
5499
15
                "rtcp.timestamp.rtp",
5500
15
                FT_UINT32,
5501
15
                BASE_DEC,
5502
15
                NULL,
5503
15
                0x0,
5504
15
                NULL, HFILL
5505
15
            }
5506
15
        },
5507
15
        {
5508
15
            &hf_rtcp_sender_pkt_cnt,
5509
15
            {
5510
15
                "Sender's packet count",
5511
15
                "rtcp.sender.packetcount",
5512
15
                FT_UINT32,
5513
15
                BASE_DEC,
5514
15
                NULL,
5515
15
                0x0,
5516
15
                NULL, HFILL
5517
15
            }
5518
15
        },
5519
15
        {
5520
15
            &hf_rtcp_sender_oct_cnt,
5521
15
            {
5522
15
                "Sender's octet count",
5523
15
                "rtcp.sender.octetcount",
5524
15
                FT_UINT32,
5525
15
                BASE_DEC,
5526
15
                NULL,
5527
15
                0x0,
5528
15
                NULL, HFILL
5529
15
            }
5530
15
        },
5531
15
        {
5532
15
            &hf_rtcp_ssrc_source,
5533
15
            {
5534
15
                "Identifier",
5535
15
                "rtcp.ssrc.identifier",
5536
15
                FT_UINT32,
5537
15
                BASE_HEX_DEC,
5538
15
                NULL,
5539
15
                0x0,
5540
15
                NULL, HFILL
5541
15
            }
5542
15
        },
5543
15
        {
5544
15
            &hf_rtcp_ssrc_fraction,
5545
15
            {
5546
15
                "Fraction lost",
5547
15
                "rtcp.ssrc.fraction",
5548
15
                FT_UINT8,
5549
15
                BASE_DEC,
5550
15
                NULL,
5551
15
                0x0,
5552
15
                NULL, HFILL
5553
15
            }
5554
15
        },
5555
15
        {
5556
15
            &hf_rtcp_ssrc_cum_nr,
5557
15
            {
5558
15
                "Cumulative number of packets lost",
5559
15
                "rtcp.ssrc.cum_nr",
5560
15
                FT_INT24,
5561
15
                BASE_DEC,
5562
15
                NULL,
5563
15
                0x0,
5564
15
                NULL, HFILL
5565
15
            }
5566
15
        },
5567
15
        {
5568
15
            &hf_rtcp_ssrc_ext_high_seq,
5569
15
            {
5570
15
                "Extended highest sequence number received",
5571
15
                "rtcp.ssrc.ext_high",
5572
15
                FT_UINT32,
5573
15
                BASE_DEC,
5574
15
                NULL,
5575
15
                0x0,
5576
15
                NULL, HFILL
5577
15
            }
5578
15
        },
5579
15
        {
5580
15
            &hf_rtcp_ssrc_high_seq,
5581
15
            {
5582
15
                "Highest sequence number received",
5583
15
                "rtcp.ssrc.high_seq",
5584
15
                FT_UINT16,
5585
15
                BASE_DEC,
5586
15
                NULL,
5587
15
                0x0,
5588
15
                NULL, HFILL
5589
15
            }
5590
15
        },
5591
15
        {
5592
15
            &hf_rtcp_ssrc_high_cycles,
5593
15
            {
5594
15
                "Sequence number cycles count",
5595
15
                "rtcp.ssrc.high_cycles",
5596
15
                FT_UINT16,
5597
15
                BASE_DEC,
5598
15
                NULL,
5599
15
                0x0,
5600
15
                NULL, HFILL
5601
15
            }
5602
15
        },
5603
15
        {
5604
15
            &hf_rtcp_ssrc_jitter,
5605
15
            {
5606
15
                "Interarrival jitter",
5607
15
                "rtcp.ssrc.jitter",
5608
15
                FT_UINT32,
5609
15
                BASE_DEC,
5610
15
                NULL,
5611
15
                0x0,
5612
15
                NULL, HFILL
5613
15
            }
5614
15
        },
5615
15
        {
5616
15
            &hf_rtcp_ssrc_lsr,
5617
15
            {
5618
15
                "Last SR timestamp",
5619
15
                "rtcp.ssrc.lsr",
5620
15
                FT_UINT32,
5621
15
                BASE_DEC_HEX,
5622
15
                NULL,
5623
15
                0x0,
5624
15
                NULL, HFILL
5625
15
            }
5626
15
        },
5627
15
        {
5628
15
            &hf_rtcp_ssrc_dlsr,
5629
15
            {
5630
15
                "Delay since last SR timestamp",
5631
15
                "rtcp.ssrc.dlsr",
5632
15
                FT_UINT32,
5633
15
                BASE_DEC,
5634
15
                NULL,
5635
15
                0x0,
5636
15
                NULL, HFILL
5637
15
            }
5638
15
        },
5639
#if 0
5640
        {
5641
            &hf_rtcp_ssrc_csrc,
5642
            {
5643
                "SSRC / CSRC identifier",
5644
                "rtcp.sdes.ssrc_csrc",
5645
                FT_UINT32,
5646
                BASE_HEX_DEC,
5647
                NULL,
5648
                0x0,
5649
                NULL, HFILL
5650
            }
5651
        },
5652
#endif
5653
15
        {
5654
15
            &hf_rtcp_sdes_type,
5655
15
            {
5656
15
                "Type",
5657
15
                "rtcp.sdes.type",
5658
15
                FT_UINT8,
5659
15
                BASE_DEC,
5660
15
                VALS( rtcp_sdes_type_vals ),
5661
15
                0x0,
5662
15
                NULL, HFILL
5663
15
            }
5664
15
        },
5665
15
        {
5666
15
            &hf_rtcp_sdes_length,
5667
15
            {
5668
15
                "Length",
5669
15
                "rtcp.sdes.length",
5670
15
                FT_UINT32,
5671
15
                BASE_DEC,
5672
15
                NULL,
5673
15
                0x0,
5674
15
                NULL, HFILL
5675
15
            }
5676
15
        },
5677
15
        {
5678
15
            &hf_rtcp_sdes_text,
5679
15
            {
5680
15
                "Text",
5681
15
                "rtcp.sdes.text",
5682
15
                FT_STRING,
5683
15
                BASE_NONE,
5684
15
                NULL,
5685
15
                0x0,
5686
15
                NULL, HFILL
5687
15
            }
5688
15
        },
5689
15
        {
5690
15
            &hf_rtcp_sdes_prefix_len,
5691
15
            {
5692
15
                "Prefix length",
5693
15
                "rtcp.sdes.prefix.length",
5694
15
                FT_UINT8,
5695
15
                BASE_DEC,
5696
15
                NULL,
5697
15
                0x0,
5698
15
                NULL, HFILL
5699
15
            }
5700
15
        },
5701
15
        {
5702
15
            &hf_rtcp_sdes_prefix_string,
5703
15
            {
5704
15
                "Prefix string",
5705
15
                "rtcp.sdes.prefix.string",
5706
15
                FT_STRING,
5707
15
                BASE_NONE,
5708
15
                NULL,
5709
15
                0x0,
5710
15
                NULL, HFILL
5711
15
            }
5712
15
        },
5713
15
        {
5714
15
            &hf_rtcp_subtype,
5715
15
            {
5716
15
                "Subtype",
5717
15
                "rtcp.app.subtype",
5718
15
                FT_UINT8,
5719
15
                BASE_DEC,
5720
15
                NULL,
5721
15
                0x1f,
5722
15
                NULL, HFILL
5723
15
            }
5724
15
        },
5725
15
        {
5726
15
            &hf_rtcp_name_ascii,
5727
15
            {
5728
15
                "Name (ASCII)",
5729
15
                "rtcp.app.name",
5730
15
                FT_STRING,
5731
15
                BASE_NONE,
5732
15
                NULL,
5733
15
                0x0,
5734
15
                NULL, HFILL
5735
15
            }
5736
15
        },
5737
15
        {
5738
15
            &hf_rtcp_app_data,
5739
15
            {
5740
15
                "Application specific data",
5741
15
                "rtcp.app.data",
5742
15
                FT_BYTES,
5743
15
                BASE_NONE,
5744
15
                NULL,
5745
15
                0x0,
5746
15
                NULL, HFILL
5747
15
            }
5748
15
        },
5749
15
        {
5750
15
            &hf_rtcp_app_data_str,
5751
15
            {
5752
15
                "Application specific data",
5753
15
                "rtcp.app.data_str",
5754
15
                FT_STRING,
5755
15
                BASE_NONE,
5756
15
                NULL,
5757
15
                0x0,
5758
15
                NULL, HFILL
5759
15
            }
5760
15
        },
5761
15
        {
5762
15
            &hf_rtcp_app_poc1,
5763
15
            {
5764
15
                "PoC1 Application specific data",
5765
15
                "rtcp.app.poc1",
5766
15
                FT_NONE,
5767
15
                BASE_NONE,
5768
15
                NULL,
5769
15
                0x0,
5770
15
                NULL, HFILL
5771
15
            }
5772
15
        },
5773
15
        {
5774
15
            &hf_rtcp_app_poc1_sip_uri,
5775
15
            {
5776
15
                "SIP URI",
5777
15
                "rtcp.app.poc1.sip.uri",
5778
15
                FT_UINT_STRING,
5779
15
                BASE_NONE,
5780
15
                NULL,
5781
15
                0x0,
5782
15
                NULL, HFILL
5783
15
            }
5784
15
        },
5785
15
        {
5786
15
            &hf_rtcp_app_poc1_disp_name,
5787
15
            {
5788
15
                "Display Name",
5789
15
                "rtcp.app.poc1.disp.name",
5790
15
                FT_UINT_STRING,
5791
15
                BASE_NONE,
5792
15
                NULL,
5793
15
                0x0,
5794
15
                NULL, HFILL
5795
15
            }
5796
15
        },
5797
15
        {
5798
15
            &hf_rtcp_app_poc1_priority,
5799
15
            {
5800
15
                "Priority",
5801
15
                "rtcp.app.poc1.priority",
5802
15
                FT_UINT16,
5803
15
                BASE_DEC,
5804
15
                VALS(rtcp_app_poc1_qsresp_priority_vals),
5805
15
                0x0,
5806
15
                NULL, HFILL
5807
15
            }
5808
15
        },
5809
15
        {
5810
15
            &hf_rtcp_app_poc1_request_ts,
5811
15
            {
5812
15
                "Talk Burst Request Timestamp",
5813
15
                "rtcp.app.poc1.request.ts",
5814
15
                FT_ABSOLUTE_TIME,
5815
15
                ABSOLUTE_TIME_NTP_UTC,
5816
15
                NULL,
5817
15
                0x0,
5818
15
                NULL, HFILL
5819
15
            }
5820
15
        },
5821
15
        {
5822
15
            &hf_rtcp_app_poc1_stt,
5823
15
            {
5824
15
                "Stop talking timer",
5825
15
                "rtcp.app.poc1.stt",
5826
15
                FT_UINT16,
5827
15
                BASE_DEC,
5828
15
                NULL,
5829
15
                0x0,
5830
15
                NULL, HFILL
5831
15
            }
5832
15
        },
5833
15
        {
5834
15
            &hf_rtcp_app_poc1_partic,
5835
15
            {
5836
15
                "Number of participants",
5837
15
                "rtcp.app.poc1.participants",
5838
15
                FT_UINT16,
5839
15
                BASE_DEC,
5840
15
                NULL,
5841
15
                0x0,
5842
15
                NULL, HFILL
5843
15
            }
5844
15
        },
5845
15
        {
5846
15
            &hf_rtcp_app_poc1_ssrc_granted,
5847
15
            {
5848
15
                "SSRC of client granted permission to talk",
5849
15
                "rtcp.app.poc1.ssrc.granted",
5850
15
                FT_UINT32,
5851
15
                BASE_DEC,
5852
15
                NULL,
5853
15
                0x0,
5854
15
                NULL, HFILL
5855
15
            }
5856
15
        },
5857
15
        {
5858
15
            &hf_rtcp_app_poc1_last_pkt_seq_no,
5859
15
            {
5860
15
                "Sequence number of last RTP packet",
5861
15
                "rtcp.app.poc1.last.pkt.seq.no",
5862
15
                FT_UINT16,
5863
15
                BASE_DEC,
5864
15
                NULL,
5865
15
                0x0,
5866
15
                NULL, HFILL
5867
15
            }
5868
15
        },
5869
15
        {
5870
15
            &hf_rtcp_app_poc1_ignore_seq_no,
5871
15
            {
5872
15
                "Ignore sequence number field",
5873
15
                "rtcp.app.poc1.ignore.seq.no",
5874
15
                FT_UINT16,
5875
15
                BASE_HEX,
5876
15
                NULL,
5877
15
                0x8000,
5878
15
                NULL, HFILL
5879
15
            }
5880
15
        },
5881
15
        {
5882
15
            &hf_rtcp_app_poc1_reason_code1,
5883
15
            {
5884
15
                "Reason code",
5885
15
                "rtcp.app.poc1.reason.code",
5886
15
                FT_UINT8,
5887
15
                BASE_DEC,
5888
15
                VALS(rtcp_app_poc1_reason_code1_vals),
5889
15
                0x0,
5890
15
                NULL, HFILL
5891
15
            }
5892
15
        },
5893
15
        {
5894
15
            &hf_rtcp_app_poc1_reason1_phrase,
5895
15
            {
5896
15
                "Reason Phrase",
5897
15
                "rtcp.app.poc1.reason.phrase",
5898
15
                FT_UINT_STRING,
5899
15
                BASE_NONE,
5900
15
                NULL,
5901
15
                0x0,
5902
15
                NULL, HFILL
5903
15
            }
5904
15
        },
5905
15
        {
5906
15
            &hf_rtcp_app_poc1_reason_code2,
5907
15
            {
5908
15
                "Reason code",
5909
15
                "rtcp.app.poc1.reason.code",
5910
15
                FT_UINT16,
5911
15
                BASE_DEC,
5912
15
                VALS(rtcp_app_poc1_reason_code2_vals),
5913
15
                0x0,
5914
15
                NULL, HFILL
5915
15
            }
5916
15
        },
5917
15
        {
5918
15
            &hf_rtcp_app_poc1_new_time_request,
5919
15
            {
5920
15
                "New time client can request (seconds)",
5921
15
                "rtcp.app.poc1.new.time.request",
5922
15
                FT_UINT16,
5923
15
                BASE_DEC,
5924
15
                NULL,
5925
15
                0x0,
5926
15
                "Time in seconds client can request for", HFILL
5927
15
            }
5928
15
        },
5929
15
        {
5930
15
            &hf_rtcp_app_poc1_ack_subtype,
5931
15
            {
5932
15
                "Subtype",
5933
15
                "rtcp.app.poc1.ack.subtype",
5934
15
                FT_UINT8,
5935
15
                BASE_DEC,
5936
15
                VALS(rtcp_app_poc1_floor_cnt_type_vals),
5937
15
                0xf8,
5938
15
                NULL, HFILL
5939
15
            }
5940
15
        },
5941
15
        {
5942
15
            &hf_rtcp_app_poc1_ack_reason_code,
5943
15
            {
5944
15
                "Reason code",
5945
15
                "rtcp.app.poc1.ack.reason.code",
5946
15
                FT_UINT16,
5947
15
                BASE_DEC,
5948
15
                VALS(rtcp_app_poc1_reason_code_ack_vals),
5949
15
                0x07ff,
5950
15
                NULL, HFILL
5951
15
            }
5952
15
        },
5953
15
        {
5954
15
            &hf_rtcp_app_poc1_qsresp_priority,
5955
15
            {
5956
15
                "Priority",
5957
15
                "rtcp.app.poc1.qsresp.priority",
5958
15
                FT_UINT8,
5959
15
                BASE_DEC,
5960
15
                VALS(rtcp_app_poc1_qsresp_priority_vals),
5961
15
                0x0,
5962
15
                NULL, HFILL
5963
15
            }
5964
15
        },
5965
15
        {
5966
15
            &hf_rtcp_app_poc1_qsresp_position,
5967
15
            {
5968
15
                "Position (number of clients ahead)",
5969
15
                "rtcp.app.poc1.qsresp.position",
5970
15
                FT_UINT16,
5971
15
                BASE_DEC,
5972
15
                NULL,
5973
15
                0x0,
5974
15
                NULL, HFILL
5975
15
            }
5976
15
        },
5977
15
        {
5978
15
            &hf_rtcp_app_poc1_conn_content[0],
5979
15
            {
5980
15
                "Identity of inviting client",
5981
15
                "rtcp.app.poc1.conn.content.a.id",
5982
15
                FT_BOOLEAN,
5983
15
                16,
5984
15
                NULL,
5985
15
                0x8000,
5986
15
                NULL, HFILL
5987
15
            }
5988
15
        },
5989
15
        {
5990
15
            &hf_rtcp_app_poc1_conn_content[1],
5991
15
            {
5992
15
                "Nick name of inviting client",
5993
15
                "rtcp.app.poc1.conn.content.a.dn",
5994
15
                FT_BOOLEAN,
5995
15
                16,
5996
15
                NULL,
5997
15
                0x4000,
5998
15
                NULL, HFILL
5999
15
            }
6000
15
        },
6001
15
        {
6002
15
            &hf_rtcp_app_poc1_conn_content[2],
6003
15
            {
6004
15
                "Session identity",
6005
15
                "rtcp.app.poc1.conn.content.sess.id",
6006
15
                FT_BOOLEAN,
6007
15
                16,
6008
15
                NULL,
6009
15
                0x2000,
6010
15
                NULL, HFILL
6011
15
            }
6012
15
        },
6013
15
        {
6014
15
            &hf_rtcp_app_poc1_conn_content[3],
6015
15
            {
6016
15
                "Group name",
6017
15
                "rtcp.app.poc1.conn.content.grp.dn",
6018
15
                FT_BOOLEAN,
6019
15
                16,
6020
15
                NULL,
6021
15
                0x1000,
6022
15
                NULL, HFILL
6023
15
            }
6024
15
        },
6025
15
        {
6026
15
            &hf_rtcp_app_poc1_conn_content[4],
6027
15
            {
6028
15
                "Group identity",
6029
15
                "rtcp.app.poc1.conn.content.grp.id",
6030
15
                FT_BOOLEAN,
6031
15
                16,
6032
15
                NULL,
6033
15
                0x0800,
6034
15
                NULL, HFILL
6035
15
            }
6036
15
        },
6037
15
        {
6038
15
            &hf_rtcp_app_poc1_conn_session_type,
6039
15
            {
6040
15
                "Session type",
6041
15
                "rtcp.app.poc1.conn.session.type",
6042
15
                FT_UINT8,
6043
15
                BASE_DEC,
6044
15
                VALS(rtcp_app_poc1_conn_sess_type_vals),
6045
15
                0x0,
6046
15
                NULL, HFILL
6047
15
            }
6048
15
        },
6049
15
        {
6050
15
            &hf_rtcp_app_poc1_conn_add_ind_mao,
6051
15
            {
6052
15
                "Manual answer override",
6053
15
                "rtcp.app.poc1.conn.add.ind.mao",
6054
15
                FT_BOOLEAN,
6055
15
                8,
6056
15
                NULL,
6057
15
                0x80,
6058
15
                NULL, HFILL
6059
15
            }
6060
15
        },
6061
15
        {
6062
15
            &hf_rtcp_app_poc1_conn_sdes_items[0],
6063
15
            {
6064
15
                "Identity of inviting client",
6065
15
                "rtcp.app.poc1.conn.sdes.a.id",
6066
15
                FT_UINT_STRING,
6067
15
                BASE_NONE,
6068
15
                NULL,
6069
15
                0x0,
6070
15
                NULL, HFILL
6071
15
            }
6072
15
        },
6073
15
        {
6074
15
            &hf_rtcp_app_poc1_conn_sdes_items[1],
6075
15
            {
6076
15
                "Nick name of inviting client",
6077
15
                "rtcp.app.poc1.conn.sdes.a.dn",
6078
15
                FT_UINT_STRING,
6079
15
                BASE_NONE,
6080
15
                NULL,
6081
15
                0x0,
6082
15
                NULL, HFILL
6083
15
            }
6084
15
        },
6085
15
        {
6086
15
            &hf_rtcp_app_poc1_conn_sdes_items[2],
6087
15
            {
6088
15
                "Session identity",
6089
15
                "rtcp.app.poc1.conn.sdes.sess.id",
6090
15
                FT_UINT_STRING,
6091
15
                BASE_NONE,
6092
15
                NULL,
6093
15
                0x0,
6094
15
                NULL, HFILL
6095
15
            }
6096
15
        },
6097
15
        {
6098
15
            &hf_rtcp_app_poc1_conn_sdes_items[3],
6099
15
            {
6100
15
                "Group Name",
6101
15
                "rtcp.app.poc1.conn.sdes.grp.dn",
6102
15
                FT_UINT_STRING,
6103
15
                BASE_NONE,
6104
15
                NULL,
6105
15
                0x0,
6106
15
                NULL, HFILL
6107
15
            }
6108
15
        },
6109
15
        {
6110
15
            &hf_rtcp_app_poc1_conn_sdes_items[4],
6111
15
            {
6112
15
                "Group identity",
6113
15
                "rtcp.app.poc1.conn.sdes.grp.id",
6114
15
                FT_UINT_STRING,
6115
15
                BASE_NONE,
6116
15
                NULL,
6117
15
                0x0,
6118
15
                NULL, HFILL
6119
15
            }
6120
15
        },
6121
15
        {
6122
15
            &hf_rtcp_app_mux,
6123
15
            {
6124
15
                "RtpMux Application specific data",
6125
15
                "rtcp.app.mux",
6126
15
                FT_NONE,
6127
15
                BASE_NONE,
6128
15
                NULL,
6129
15
                0x0,
6130
15
                NULL, HFILL
6131
15
            }
6132
15
        },
6133
15
        {
6134
15
            &hf_rtcp_app_mux_mux,
6135
15
            {
6136
15
                "Multiplexing supported",
6137
15
                "rtcp.app.mux.mux",
6138
15
                FT_BOOLEAN,
6139
15
                8,
6140
15
                NULL,
6141
15
                0x80,
6142
15
                NULL, HFILL
6143
15
            }
6144
15
                },
6145
15
        {
6146
15
            &hf_rtcp_app_mux_cp,
6147
15
            {
6148
15
                "Header compression supported",
6149
15
                "rtcp.app.mux.cp",
6150
15
                FT_BOOLEAN,
6151
15
                8,
6152
15
                NULL,
6153
15
                0x40,
6154
15
                NULL, HFILL
6155
15
            }
6156
15
        },
6157
15
        {
6158
15
            &hf_rtcp_app_mux_selection,
6159
15
            {
6160
15
                "Multiplexing selection",
6161
15
                "rtcp.app.mux.selection",
6162
15
                FT_UINT8,
6163
15
                BASE_DEC,
6164
15
                VALS(rtcp_app_mux_selection_vals),
6165
15
                0x30,
6166
15
                NULL, HFILL
6167
15
            }
6168
15
        },
6169
15
                {
6170
15
                    &hf_rtcp_app_mux_localmuxport,
6171
15
            {
6172
15
                "Local Mux Port",
6173
15
                "rtcp.app.mux.muxport",
6174
15
                FT_UINT16,
6175
15
                BASE_DEC,
6176
15
                NULL,
6177
15
                0x0,
6178
15
                NULL, HFILL
6179
15
            }
6180
15
        },
6181
15
        {
6182
15
            &hf_rtcp_fsn,
6183
15
            {
6184
15
                "First sequence number",
6185
15
                "rtcp.nack.fsn",
6186
15
                FT_UINT16,
6187
15
                BASE_DEC,
6188
15
                NULL,
6189
15
                0x0,
6190
15
                NULL, HFILL
6191
15
            }
6192
15
        },
6193
15
        {
6194
15
            &hf_rtcp_blp,
6195
15
            {
6196
15
                "Bitmask of following lost packets",
6197
15
                "rtcp.nack.blp",
6198
15
                FT_UINT16,
6199
15
                BASE_DEC,
6200
15
                NULL,
6201
15
                0x0,
6202
15
                NULL, HFILL
6203
15
            }
6204
15
        },
6205
15
        {
6206
15
            &hf_rtcp_padding_count,
6207
15
            {
6208
15
                "Padding count",
6209
15
                "rtcp.padding.count",
6210
15
                FT_UINT8,
6211
15
                BASE_DEC,
6212
15
                NULL,
6213
15
                0x0,
6214
15
                NULL, HFILL
6215
15
            }
6216
15
        },
6217
15
        {
6218
15
            &hf_rtcp_padding_data,
6219
15
            {
6220
15
                "Padding data",
6221
15
                "rtcp.padding.data",
6222
15
                FT_BYTES,
6223
15
                BASE_NONE,
6224
15
                NULL,
6225
15
                0x0,
6226
15
                NULL, HFILL
6227
15
            }
6228
15
        },
6229
15
        {
6230
15
            &hf_rtcp_profile_specific_extension_type,
6231
15
            {
6232
15
                "Extension Type",
6233
15
                "rtcp.profile-specific-extension.type",
6234
15
                FT_UINT16,
6235
15
                BASE_DEC,
6236
15
                VALS( rtcp_ms_profile_extension_vals ),
6237
15
                0x0,
6238
15
                NULL, HFILL
6239
15
            }
6240
15
        },
6241
15
        {
6242
15
            &hf_rtcp_profile_specific_extension_length,
6243
15
            {
6244
15
                "Extension Length",
6245
15
                "rtcp.profile-specific-extension.length",
6246
15
                FT_UINT16,
6247
15
                BASE_DEC,
6248
15
                NULL,
6249
15
                0x0,
6250
15
                NULL, HFILL
6251
15
            }
6252
15
        },
6253
15
        {
6254
15
            &hf_rtcp_profile_specific_extension,
6255
15
            {
6256
15
                "Profile-specific extension",
6257
15
                "rtcp.profile-specific-extension",
6258
15
                FT_BYTES,
6259
15
                BASE_NONE,
6260
15
                NULL,
6261
15
                0x0,
6262
15
                NULL, HFILL
6263
15
            }
6264
15
        },
6265
15
        {
6266
15
            &hf_rtcp_setup,
6267
15
            {
6268
15
                "Stream setup",
6269
15
                "rtcp.setup",
6270
15
                FT_STRING,
6271
15
                BASE_NONE,
6272
15
                NULL,
6273
15
                0x0,
6274
15
                "Stream setup, method and frame number", HFILL
6275
15
            }
6276
15
        },
6277
15
        {
6278
15
            &hf_rtcp_setup_frame,
6279
15
            {
6280
15
                "Setup frame",
6281
15
                "rtcp.setup-frame",
6282
15
                FT_FRAMENUM,
6283
15
                BASE_NONE,
6284
15
                NULL,
6285
15
                0x0,
6286
15
                "Frame that set up this stream", HFILL
6287
15
            }
6288
15
        },
6289
15
        {
6290
15
            &hf_rtcp_setup_method,
6291
15
            {
6292
15
                "Setup Method",
6293
15
                "rtcp.setup-method",
6294
15
                FT_STRING,
6295
15
                BASE_NONE,
6296
15
                NULL,
6297
15
                0x0,
6298
15
                "Method used to set up this stream", HFILL
6299
15
            }
6300
15
        },
6301
15
        {
6302
15
            &hf_rtcp_last_sr_timestamp_frame,
6303
15
            {
6304
15
                "Frame matching Last SR timestamp",
6305
15
                "rtcp.lsr-frame",
6306
15
                FT_FRAMENUM,
6307
15
                BASE_NONE,
6308
15
                NULL,
6309
15
                0x0,
6310
15
                "Frame matching LSR field (used to calculate roundtrip delay)", HFILL
6311
15
            }
6312
15
        },
6313
15
        {
6314
15
            &hf_rtcp_time_since_last_sr,
6315
15
            {
6316
15
                "Time since Last SR captured",
6317
15
                "rtcp.lsr-frame-captured",
6318
15
                FT_UINT32,
6319
15
                BASE_DEC,
6320
15
                NULL,
6321
15
                0x0,
6322
15
                "Time since frame matching LSR field was captured", HFILL
6323
15
            }
6324
15
        },
6325
15
        {
6326
15
            &hf_rtcp_roundtrip_delay,
6327
15
            {
6328
15
                "Roundtrip Delay(ms)",
6329
15
                "rtcp.roundtrip-delay",
6330
15
                FT_INT32,
6331
15
                BASE_DEC,
6332
15
                NULL,
6333
15
                0x0,
6334
15
                "Calculated roundtrip delay in ms", HFILL
6335
15
            }
6336
15
        },
6337
15
        {
6338
15
            &hf_rtcp_xr_block_type,
6339
15
            {
6340
15
                "Type",
6341
15
                "rtcp.xr.bt",
6342
15
                FT_UINT8,
6343
15
                BASE_DEC,
6344
15
                VALS(rtcp_xr_type_vals),
6345
15
                0x0,
6346
15
                "Block Type", HFILL
6347
15
            }
6348
15
        },
6349
15
        {
6350
15
            &hf_rtcp_xr_block_specific,
6351
15
            {
6352
15
                "Type Specific",
6353
15
                "rtcp.xr.bs",
6354
15
                FT_UINT8,
6355
15
                BASE_DEC,
6356
15
                NULL,
6357
15
                0x0,
6358
15
                "Reserved", HFILL
6359
15
            }
6360
15
        },
6361
15
        {
6362
15
            &hf_rtcp_xr_block_length,
6363
15
            {
6364
15
                "Length",
6365
15
                "rtcp.xr.bl",
6366
15
                FT_UINT16,
6367
15
                BASE_DEC,
6368
15
                NULL,
6369
15
                0x0,
6370
15
                "Block Length", HFILL
6371
15
            }
6372
15
        },
6373
15
        {
6374
15
            &hf_rtcp_ssrc_discarded,
6375
15
            {
6376
15
                "Fraction discarded",
6377
15
                "rtcp.ssrc.discarded",
6378
15
                FT_UINT8,
6379
15
                BASE_DEC,
6380
15
                NULL,
6381
15
                0x0,
6382
15
                "Discard Rate", HFILL
6383
15
            }
6384
15
        },
6385
15
        {
6386
15
            &hf_rtcp_xr_voip_metrics_burst_density,
6387
15
            {
6388
15
                "Burst Density",
6389
15
                "rtcp.xr.voipmetrics.burstdensity",
6390
15
                FT_UINT8,
6391
15
                BASE_DEC,
6392
15
                NULL,
6393
15
                0x0,
6394
15
                NULL, HFILL
6395
15
            }
6396
15
        },
6397
15
        {
6398
15
            &hf_rtcp_xr_voip_metrics_gap_density,
6399
15
            {
6400
15
                "Gap Density",
6401
15
                "rtcp.xr.voipmetrics.gapdensity",
6402
15
                FT_UINT8,
6403
15
                BASE_DEC,
6404
15
                NULL,
6405
15
                0x0,
6406
15
                NULL, HFILL
6407
15
            }
6408
15
        },
6409
15
        {
6410
15
            &hf_rtcp_xr_voip_metrics_burst_duration,
6411
15
            {
6412
15
                "Burst Duration(ms)",
6413
15
                "rtcp.xr.voipmetrics.burstduration",
6414
15
                FT_UINT16,
6415
15
                BASE_DEC,
6416
15
                NULL,
6417
15
                0x0,
6418
15
                NULL, HFILL
6419
15
            }
6420
15
        },
6421
15
        {
6422
15
            &hf_rtcp_xr_voip_metrics_gap_duration,
6423
15
            {
6424
15
                "Gap Duration(ms)",
6425
15
                "rtcp.xr.voipmetrics.gapduration",
6426
15
                FT_UINT16,
6427
15
                BASE_DEC,
6428
15
                NULL,
6429
15
                0x0,
6430
15
                NULL, HFILL
6431
15
            }
6432
15
        },
6433
15
        {
6434
15
            &hf_rtcp_xr_voip_metrics_rtdelay,
6435
15
            {
6436
15
                "Round Trip Delay(ms)",
6437
15
                "rtcp.xr.voipmetrics.rtdelay",
6438
15
                FT_UINT16,
6439
15
                BASE_DEC,
6440
15
                NULL,
6441
15
                0x0,
6442
15
                NULL, HFILL
6443
15
            }
6444
15
        },
6445
15
        {
6446
15
            &hf_rtcp_xr_voip_metrics_esdelay,
6447
15
            {
6448
15
                "End System Delay(ms)",
6449
15
                "rtcp.xr.voipmetrics.esdelay",
6450
15
                FT_UINT16,
6451
15
                BASE_DEC,
6452
15
                NULL,
6453
15
                0x0,
6454
15
                NULL, HFILL
6455
15
            }
6456
15
        },
6457
15
        {
6458
15
            &hf_rtcp_xr_voip_metrics_siglevel,
6459
15
            {
6460
15
                "Signal Level",
6461
15
                "rtcp.xr.voipmetrics.signallevel",
6462
15
                FT_INT8,
6463
15
                BASE_DEC,
6464
15
                NULL,
6465
15
                0x0,
6466
15
                NULL, HFILL
6467
15
            }
6468
15
        },
6469
15
        {
6470
15
            &hf_rtcp_xr_voip_metrics_noiselevel,
6471
15
            {
6472
15
                "Noise Level",
6473
15
                "rtcp.xr.voipmetrics.noiselevel",
6474
15
                FT_INT8,
6475
15
                BASE_DEC,
6476
15
                NULL,
6477
15
                0x0,
6478
15
                NULL, HFILL
6479
15
            }
6480
15
        },
6481
15
        {
6482
15
            &hf_rtcp_xr_voip_metrics_rerl,
6483
15
            {
6484
15
                "Residual Echo Return Loss",
6485
15
                "rtcp.xr.voipmetrics.rerl",
6486
15
                FT_UINT8,
6487
15
                BASE_DEC,
6488
15
                NULL,
6489
15
                0x0,
6490
15
                NULL, HFILL
6491
15
            }
6492
15
        },
6493
15
        {
6494
15
            &hf_rtcp_xr_voip_metrics_gmin,
6495
15
            {
6496
15
                "Gmin",
6497
15
                "rtcp.xr.voipmetrics.gmin",
6498
15
                FT_UINT8,
6499
15
                BASE_DEC,
6500
15
                NULL,
6501
15
                0x0,
6502
15
                NULL, HFILL
6503
15
            }
6504
15
        },
6505
15
        {
6506
15
            &hf_rtcp_xr_voip_metrics_rfactor,
6507
15
            {
6508
15
                "R Factor",
6509
15
                "rtcp.xr.voipmetrics.rfactor",
6510
15
                FT_UINT8,
6511
15
                BASE_DEC,
6512
15
                NULL,
6513
15
                0x0,
6514
15
                "R Factor is in the range of 0 to 100", HFILL
6515
15
            }
6516
15
        },
6517
15
        {
6518
15
            &hf_rtcp_xr_voip_metrics_extrfactor,
6519
15
            {
6520
15
                "External R Factor",
6521
15
                "rtcp.xr.voipmetrics.extrfactor",
6522
15
                FT_UINT8,
6523
15
                BASE_DEC,
6524
15
                NULL,
6525
15
                0x0,
6526
15
                "R Factor is in the range of 0 to 100", HFILL
6527
15
            }
6528
15
        },
6529
15
        {
6530
15
            &hf_rtcp_xr_voip_metrics_moslq,
6531
15
            {
6532
15
                "MOS - Listening Quality",
6533
15
                "rtcp.xr.voipmetrics.moslq",
6534
15
                FT_FLOAT,
6535
15
                BASE_NONE,
6536
15
                NULL,
6537
15
                0x0,
6538
15
                "MOS is in the range of 1 to 5", HFILL
6539
15
            }
6540
15
        },
6541
15
        {
6542
15
            &hf_rtcp_xr_voip_metrics_moscq,
6543
15
            {
6544
15
                "MOS - Conversational Quality",
6545
15
                "rtcp.xr.voipmetrics.moscq",
6546
15
                FT_FLOAT,
6547
15
                BASE_NONE,
6548
15
                NULL,
6549
15
                0x0,
6550
15
                "MOS is in the range of 1 to 5", HFILL
6551
15
            }
6552
15
        },
6553
15
        {
6554
15
            &hf_rtcp_xr_voip_metrics_plc,
6555
15
            {
6556
15
                "Packet Loss Concealment Algorithm",
6557
15
                "rtcp.xr.voipmetrics.plc",
6558
15
                FT_UINT8,
6559
15
                BASE_DEC,
6560
15
                VALS(rtcp_xr_plc_algo_vals),
6561
15
                0xC0,
6562
15
                NULL, HFILL
6563
15
            }
6564
15
        },
6565
15
        {
6566
15
            &hf_rtcp_xr_voip_metrics_jbadaptive,
6567
15
            {
6568
15
                "Adaptive Jitter Buffer Algorithm",
6569
15
                "rtcp.xr.voipmetrics.jba",
6570
15
                FT_UINT8,
6571
15
                BASE_DEC,
6572
15
                VALS(rtcp_xr_jb_adaptive_vals),
6573
15
                0x30,
6574
15
                NULL, HFILL
6575
15
            }
6576
15
        },
6577
15
        {
6578
15
            &hf_rtcp_xr_voip_metrics_jbrate,
6579
15
            {
6580
15
                "Jitter Buffer Rate",
6581
15
                "rtcp.xr.voipmetrics.jbrate",
6582
15
                FT_UINT8,
6583
15
                BASE_DEC,
6584
15
                NULL,
6585
15
                0x0F,
6586
15
                NULL, HFILL
6587
15
            }
6588
15
        },
6589
15
        {
6590
15
            &hf_rtcp_xr_voip_metrics_jbnominal,
6591
15
            {
6592
15
                "Nominal Jitter Buffer Size",
6593
15
                "rtcp.xr.voipmetrics.jbnominal",
6594
15
                FT_UINT16,
6595
15
                BASE_DEC,
6596
15
                NULL,
6597
15
                0x0,
6598
15
                NULL, HFILL
6599
15
            }
6600
15
        },
6601
15
        {
6602
15
            &hf_rtcp_xr_voip_metrics_jbmax,
6603
15
            {
6604
15
                "Maximum Jitter Buffer Size",
6605
15
                "rtcp.xr.voipmetrics.jbmax",
6606
15
                FT_UINT16,
6607
15
                BASE_DEC,
6608
15
                NULL,
6609
15
                0x0,
6610
15
                NULL, HFILL
6611
15
            }
6612
15
        },
6613
15
        {
6614
15
            &hf_rtcp_xr_voip_metrics_jbabsmax,
6615
15
            {
6616
15
                "Absolute Maximum Jitter Buffer Size",
6617
15
                "rtcp.xr.voipmetrics.jbabsmax",
6618
15
                FT_UINT16,
6619
15
                BASE_DEC,
6620
15
                NULL,
6621
15
                0x0,
6622
15
                NULL, HFILL
6623
15
            }
6624
15
        },
6625
15
        {
6626
15
            &hf_rtcp_xr_thinning,
6627
15
            {
6628
15
                "Thinning factor",
6629
15
                "rtcp.xr.tf",
6630
15
                FT_UINT8,
6631
15
                BASE_DEC,
6632
15
                                NULL,
6633
15
                0x0F,
6634
15
                NULL, HFILL
6635
15
            }
6636
15
        },
6637
15
        {
6638
15
            &hf_rtcp_xr_drle_e,
6639
15
            {
6640
15
                "Early bit",
6641
15
                "rtcp.xr.drle.e",
6642
15
                FT_BOOLEAN,
6643
15
                8,
6644
15
                NULL,
6645
15
                0x10,
6646
15
                NULL, HFILL
6647
15
            }
6648
15
        },
6649
15
        {
6650
15
            &hf_rtcp_xr_stats_loss_flag,
6651
15
            {
6652
15
                "Loss Report Flag",
6653
15
                "rtcp.xr.stats.lrflag",
6654
15
                FT_BOOLEAN,
6655
15
                8,
6656
15
                NULL,
6657
15
                0x80,
6658
15
                NULL, HFILL
6659
15
            }
6660
15
        },
6661
15
        {
6662
15
            &hf_rtcp_xr_stats_dup_flag,
6663
15
            {
6664
15
                "Duplicates Report Flag",
6665
15
                "rtcp.xr.stats.dupflag",
6666
15
                FT_BOOLEAN,
6667
15
                8,
6668
15
                NULL,
6669
15
                0x40,
6670
15
                NULL, HFILL
6671
15
            }
6672
15
        },
6673
15
        {
6674
15
            &hf_rtcp_xr_stats_jitter_flag,
6675
15
            {
6676
15
                "Jitter Report Flag",
6677
15
                "rtcp.xr.stats.jitterflag",
6678
15
                FT_BOOLEAN,
6679
15
                8,
6680
15
                NULL,
6681
15
                0x20,
6682
15
                NULL, HFILL
6683
15
            }
6684
15
        },
6685
15
        {
6686
15
            &hf_rtcp_xr_stats_ttl,
6687
15
            {
6688
15
                "TTL or Hop Limit Flag",
6689
15
                "rtcp.xr.stats.ttl",
6690
15
                FT_UINT8,
6691
15
                BASE_DEC,
6692
15
                VALS(rtcp_xr_ip_ttl_vals),
6693
15
                0x18,
6694
15
                NULL, HFILL
6695
15
            }
6696
15
        },
6697
15
        {
6698
15
            &hf_rtcp_xr_endseq,
6699
15
            {
6700
15
                "End Sequence Number",
6701
15
                "rtcp.xr.endseq",
6702
15
                FT_UINT16,
6703
15
                BASE_DEC,
6704
15
                NULL,
6705
15
                0x0,
6706
15
                NULL, HFILL
6707
15
            }
6708
15
        },
6709
15
        {
6710
15
            &hf_rtcp_xr_chunk_null_terminator,
6711
15
            {
6712
15
                "Null Terminator",
6713
15
                "rtcp.xr.chunk.null_terminator",
6714
15
                FT_NONE,
6715
15
                BASE_NONE,
6716
15
                NULL,
6717
15
                0x0,
6718
15
                NULL, HFILL
6719
15
            }
6720
15
        },
6721
15
        {
6722
15
            &hf_rtcp_xr_chunk_length,
6723
15
            {
6724
15
                "Check length",
6725
15
                "rtcp.xr.chunk.length",
6726
15
                FT_UINT16,
6727
15
                BASE_DEC,
6728
15
                NULL,
6729
15
                0x0,
6730
15
                NULL, HFILL
6731
15
            }
6732
15
        },
6733
15
        {
6734
15
            &hf_rtcp_xr_chunk_bit_vector,
6735
15
            {
6736
15
                "Bit Vector",
6737
15
                "rtcp.xr.chunk.bit_vector",
6738
15
                FT_UINT16,
6739
15
                BASE_DEC,
6740
15
                NULL,
6741
15
                0x0,
6742
15
                NULL, HFILL
6743
15
            }
6744
15
        },
6745
6746
15
        {
6747
15
            &hf_rtcp_xr_beginseq,
6748
15
            {
6749
15
                "Begin Sequence Number",
6750
15
                "rtcp.xr.beginseq",
6751
15
                FT_UINT16,
6752
15
                BASE_DEC,
6753
15
                NULL,
6754
15
                0x0,
6755
15
                NULL, HFILL
6756
15
            }
6757
15
        },
6758
15
        {
6759
15
            &hf_rtcp_xr_receipt_time_seq,
6760
15
            {
6761
15
                "Receipt Time",
6762
15
                "rtcp.xr.receipt_time_seq",
6763
15
                FT_UINT32,
6764
15
                BASE_DEC,
6765
15
                NULL,
6766
15
                0x0,
6767
15
                NULL, HFILL
6768
15
            }
6769
15
        },
6770
15
        {
6771
15
            &hf_rtcp_xr_stats_lost,
6772
15
            {
6773
15
                "Lost Packets",
6774
15
                "rtcp.xr.stats.lost",
6775
15
                FT_UINT32,
6776
15
                BASE_DEC,
6777
15
                NULL,
6778
15
                0x0,
6779
15
                NULL, HFILL
6780
15
            }
6781
15
        },
6782
15
        {
6783
15
            &hf_rtcp_xr_stats_dups,
6784
15
            {
6785
15
                "Duplicate Packets",
6786
15
                "rtcp.xr.stats.dups",
6787
15
                FT_UINT32,
6788
15
                BASE_DEC,
6789
15
                NULL,
6790
15
                0x0,
6791
15
                NULL, HFILL
6792
15
            }
6793
15
        },
6794
15
        {
6795
15
            &hf_rtcp_xr_stats_minjitter,
6796
15
            {
6797
15
                "Minimum Jitter",
6798
15
                "rtcp.xr.stats.minjitter",
6799
15
                FT_UINT32,
6800
15
                BASE_DEC,
6801
15
                NULL,
6802
15
                0x0,
6803
15
                NULL, HFILL
6804
15
            }
6805
15
        },
6806
15
        {
6807
15
            &hf_rtcp_xr_stats_maxjitter,
6808
15
            {
6809
15
                "Maximum Jitter",
6810
15
                "rtcp.xr.stats.maxjitter",
6811
15
                FT_UINT32,
6812
15
                BASE_DEC,
6813
15
                NULL,
6814
15
                0x0,
6815
15
                NULL, HFILL
6816
15
            }
6817
15
        },
6818
15
        {
6819
15
            &hf_rtcp_xr_stats_meanjitter,
6820
15
            {
6821
15
                "Mean Jitter",
6822
15
                "rtcp.xr.stats.meanjitter",
6823
15
                FT_UINT32,
6824
15
                BASE_DEC,
6825
15
                NULL,
6826
15
                0x0,
6827
15
                NULL, HFILL
6828
15
            }
6829
15
        },
6830
15
        {
6831
15
            &hf_rtcp_xr_stats_devjitter,
6832
15
            {
6833
15
                "Standard Deviation of Jitter",
6834
15
                "rtcp.xr.stats.devjitter",
6835
15
                FT_UINT32,
6836
15
                BASE_DEC,
6837
15
                NULL,
6838
15
                0x0,
6839
15
                NULL, HFILL
6840
15
            }
6841
15
        },
6842
15
        {
6843
15
            &hf_rtcp_xr_stats_minttl,
6844
15
            {
6845
15
                "Minimum TTL or Hop Limit",
6846
15
                "rtcp.xr.stats.minttl",
6847
15
                FT_UINT8,
6848
15
                BASE_DEC,
6849
15
                NULL,
6850
15
                0x0,
6851
15
                NULL, HFILL
6852
15
            }
6853
15
        },
6854
15
        {
6855
15
            &hf_rtcp_xr_stats_maxttl,
6856
15
            {
6857
15
                "Maximum TTL or Hop Limit",
6858
15
                "rtcp.xr.stats.maxttl",
6859
15
                FT_UINT8,
6860
15
                BASE_DEC,
6861
15
                NULL,
6862
15
                0x0,
6863
15
                NULL, HFILL
6864
15
            }
6865
15
        },
6866
15
        {
6867
15
            &hf_rtcp_xr_stats_meanttl,
6868
15
            {
6869
15
                "Mean TTL or Hop Limit",
6870
15
                "rtcp.xr.stats.meanttl",
6871
15
                FT_UINT8,
6872
15
                BASE_DEC,
6873
15
                NULL,
6874
15
                0x0,
6875
15
                NULL, HFILL
6876
15
            }
6877
15
        },
6878
15
        {
6879
15
            &hf_rtcp_xr_stats_devttl,
6880
15
            {
6881
15
                "Standard Deviation of TTL",
6882
15
                "rtcp.xr.stats.devttl",
6883
15
                FT_UINT8,
6884
15
                BASE_DEC,
6885
15
                NULL,
6886
15
                0x0,
6887
15
                NULL, HFILL
6888
15
            }
6889
15
        },
6890
15
        {
6891
15
            &hf_rtcp_xr_timestamp,
6892
15
            {
6893
15
                "Timestamp",
6894
15
                "rtcp.xr.timestamp",
6895
15
                FT_ABSOLUTE_TIME,
6896
15
                ABSOLUTE_TIME_UTC,
6897
15
                NULL,
6898
15
                0x0,
6899
15
                NULL, HFILL
6900
15
            }
6901
15
        },
6902
15
        {
6903
15
            &hf_rtcp_xr_lrr,
6904
15
            {
6905
15
                "Last RR timestamp",
6906
15
                "rtcp.xr.lrr",
6907
15
                FT_UINT32,
6908
15
                BASE_DEC,
6909
15
                NULL,
6910
15
                0x0,
6911
15
                NULL, HFILL
6912
15
            }
6913
15
        },
6914
15
        {
6915
15
            &hf_rtcp_xr_dlrr,
6916
15
            {
6917
15
                "Delay since last RR timestamp",
6918
15
                "rtcp.xr.dlrr",
6919
15
                FT_UINT32,
6920
15
                BASE_DEC,
6921
15
                NULL,
6922
15
                0x0,
6923
15
                NULL, HFILL
6924
15
            }
6925
15
        },
6926
15
        {
6927
15
            &hf_rtcp_length_check,
6928
15
            {
6929
15
                "RTCP frame length check",
6930
15
                "rtcp.length_check",
6931
15
                FT_BOOLEAN,
6932
15
                BASE_NONE,
6933
15
                NULL,
6934
15
                0x0,
6935
15
                NULL, HFILL
6936
15
            }
6937
15
        },
6938
15
        {
6939
15
            &hf_rtcp_rtpfb_fmt,
6940
15
            {
6941
15
                "RTCP Feedback message type (FMT)",
6942
15
                "rtcp.rtpfb.fmt",
6943
15
                FT_UINT8,
6944
15
                BASE_DEC,
6945
15
                VALS(rtcp_rtpfb_fmt_vals),
6946
15
                0x1f,
6947
15
                NULL, HFILL
6948
15
            }
6949
15
        },
6950
15
        {
6951
15
            &hf_rtcp_psfb_fmt,
6952
15
            {
6953
15
                "RTCP Feedback message type (FMT)",
6954
15
                "rtcp.psfb.fmt",
6955
15
                FT_UINT8,
6956
15
                BASE_DEC,
6957
15
                VALS(rtcp_psfb_fmt_vals),
6958
15
                0x1f,
6959
15
                NULL, HFILL
6960
15
            }
6961
15
        },
6962
15
        {
6963
15
            &hf_rtcp_rtpfb_nack_pid,
6964
15
            {
6965
15
                "RTCP Transport Feedback NACK PID",
6966
15
                "rtcp.rtpfb.nack_pid",
6967
15
                FT_UINT16,
6968
15
                BASE_DEC,
6969
15
                NULL,
6970
15
                0x0,
6971
15
                NULL, HFILL
6972
15
            }
6973
15
        },
6974
15
        {
6975
15
            &hf_rtcp_rtpfb_nack_blp,
6976
15
            {
6977
15
                "RTCP Transport Feedback NACK BLP",
6978
15
                "rtcp.rtpfb.nack_blp",
6979
15
                FT_UINT16,
6980
15
                BASE_HEX,
6981
15
                NULL,
6982
15
                0x0,
6983
15
                NULL, HFILL
6984
15
            }
6985
15
        },
6986
15
        {
6987
15
            &hf_rtcp_rtpfb_ccfb_beginseq,
6988
15
            {
6989
15
                "Begin Sequence Number",
6990
15
                "rtcp.rtpfb.ccfb.beginseq",
6991
15
                FT_UINT16,
6992
15
                BASE_DEC,
6993
15
                NULL,
6994
15
                0x0,
6995
15
                NULL, HFILL
6996
15
            }
6997
15
        },
6998
15
        {
6999
15
            &hf_rtcp_rtpfb_ccfb_numreports,
7000
15
            {
7001
15
                "Number Of Reports",
7002
15
                "rtcp.rtpfb.ccfb.numreports",
7003
15
                FT_UINT16,
7004
15
                BASE_DEC,
7005
15
                NULL,
7006
15
                0x0,
7007
15
                NULL, HFILL
7008
15
            }
7009
15
        },
7010
15
        {
7011
15
            &hf_rtcp_rtpfb_ccfb_received,
7012
15
            {
7013
15
                "Received",
7014
15
                "rtcp.rtpfb.ccfb.received",
7015
15
                FT_UINT16,
7016
15
                BASE_DEC,
7017
15
                NULL,
7018
15
                0x8000,
7019
15
                NULL, HFILL
7020
15
            }
7021
15
        },
7022
15
        {
7023
15
            &hf_rtcp_rtpfb_ccfb_ecn,
7024
15
            {
7025
15
                "Explicit Congestion Notification",
7026
15
                "rtcp.rtpfb.ccfb.ecn",
7027
15
                FT_UINT16,
7028
15
                BASE_DEC,
7029
15
                NULL,
7030
15
                0x6000,
7031
15
                NULL, HFILL
7032
15
            }
7033
15
        },
7034
15
        {
7035
15
            &hf_rtcp_rtpfb_ccfb_ato,
7036
15
            {
7037
15
                "Arrival Time Offset",
7038
15
                "rtcp.rtpfb.ccfb.ato",
7039
15
                FT_UINT16,
7040
15
                BASE_DEC,
7041
15
                NULL,
7042
15
                0x1FFF,
7043
15
                NULL, HFILL
7044
15
            }
7045
15
        },
7046
15
        {
7047
15
            &hf_rtcp_rtpfb_ccfb_padding,
7048
15
            {
7049
15
                "Padding",
7050
15
                "rtcp.rtpfb.ccfb.padding",
7051
15
                FT_UINT16,
7052
15
                BASE_DEC,
7053
15
                NULL,
7054
15
                0x0,
7055
15
                NULL, HFILL
7056
15
            }
7057
15
        },
7058
15
        {
7059
15
            &hf_rtcp_rtpfb_ccfb_timestamp,
7060
15
            {
7061
15
                "Timestamp",
7062
15
                "rtcp.rtpfb.ccfb.timestamp",
7063
15
                FT_UINT32,
7064
15
                BASE_HEX,
7065
15
                NULL,
7066
15
                0x0,
7067
15
                NULL, HFILL
7068
15
            }
7069
15
        },
7070
15
        {
7071
15
            &hf_rtcp_fci,
7072
15
            {
7073
15
                "Feedback Control Information (FCI)",
7074
15
                "rtcp.fci",
7075
15
                FT_BYTES,
7076
15
                BASE_NONE,
7077
15
                NULL,
7078
15
                0x0,
7079
15
                NULL, HFILL
7080
15
            }
7081
15
        },
7082
15
        {
7083
15
            &hf_rtcp_xr_idms_spst,
7084
15
            {
7085
15
                "Synchronization Packet Sender Type",
7086
15
                "rtcp.xr.idms.spst",
7087
15
                FT_UINT8,
7088
15
                BASE_DEC,
7089
15
                VALS(rtcp_xr_idms_spst),
7090
15
                0x0,
7091
15
                NULL, HFILL
7092
15
            }
7093
15
        },
7094
15
        {
7095
15
            &hf_rtcp_xr_idms_pt,
7096
15
            {
7097
15
                "Payload Type",
7098
15
                "rtcp.xr.idms.pt",
7099
15
                FT_UINT8,
7100
15
                BASE_DEC,
7101
15
                                NULL,
7102
15
                0x0,
7103
15
                NULL, HFILL
7104
15
            }
7105
15
        },
7106
15
        {
7107
15
            &hf_rtcp_xr_idms_msci,
7108
15
            {
7109
15
                "Media Stream Correlation Identifier",
7110
15
                "rtcp.xr.idms.msci",
7111
15
                FT_UINT32,
7112
15
                BASE_DEC,
7113
15
                                NULL,
7114
15
                0x0,
7115
15
                NULL, HFILL
7116
15
            }
7117
15
        },
7118
15
        {
7119
15
            &hf_rtcp_xr_idms_source_ssrc,
7120
15
            {
7121
15
                "Source SSRC",
7122
15
                "rtcp.xr.idms.source_ssrc",
7123
15
                FT_UINT32,
7124
15
                BASE_DEC,
7125
15
                                NULL,
7126
15
                0x0,
7127
15
                NULL, HFILL
7128
15
            }
7129
15
        },
7130
15
        {
7131
15
            &hf_rtcp_xr_idms_ntp_rcv_ts,
7132
15
            {
7133
15
                "NTP Timestamp of packet reception",
7134
15
                "rtcp.xr.idms.ntp_rcv_ts",
7135
15
                FT_ABSOLUTE_TIME,
7136
15
                ABSOLUTE_TIME_UTC,
7137
15
                NULL,
7138
15
                0x0,
7139
15
                NULL, HFILL
7140
15
            }
7141
15
        },
7142
15
        {
7143
15
            &hf_rtcp_xr_idms_rtp_ts,
7144
15
            {
7145
15
                "RTP Timestamp of packet",
7146
15
                "rtcp.xr.idms.rtp_ts",
7147
15
                FT_UINT32,
7148
15
                BASE_DEC,
7149
15
                                NULL,
7150
15
                0x0,
7151
15
                NULL, HFILL
7152
15
            }
7153
15
        },
7154
15
        {
7155
15
            &hf_rtcp_xr_idms_ntp_pres_ts,
7156
15
            {
7157
15
                "NTP Timestamp of presentation",
7158
15
                "rtcp.xr.idms.ntp_pres_ts",
7159
15
                FT_UINT32,
7160
15
                BASE_DEC,
7161
15
                                NULL,
7162
15
                0x0,
7163
15
                NULL, HFILL
7164
15
            }
7165
15
        },
7166
15
    {
7167
15
      &hf_rtcp_psfb_fir_fci_ssrc,
7168
15
            {
7169
15
                "SSRC",
7170
15
                "rtcp.psfb.fir.fci.ssrc",
7171
15
                FT_UINT32,
7172
15
                BASE_HEX_DEC,
7173
15
                NULL,
7174
15
                0x0,
7175
15
                NULL, HFILL
7176
15
            }
7177
15
        },
7178
15
    {
7179
15
      &hf_rtcp_psfb_fir_fci_csn,
7180
15
            {
7181
15
                "Command Sequence Number",
7182
15
                "rtcp.psfb.fir.fci.csn",
7183
15
                FT_UINT8,
7184
15
                BASE_DEC,
7185
15
                NULL,
7186
15
                0x0,
7187
15
                NULL, HFILL
7188
15
            }
7189
15
        },
7190
15
    {
7191
15
      &hf_rtcp_psfb_fir_fci_reserved,
7192
15
            {
7193
15
                "Reserved",
7194
15
                "rtcp.psfb.fir.fci.reserved",
7195
15
                FT_UINT24,
7196
15
                BASE_DEC,
7197
15
                NULL,
7198
15
                0x0,
7199
15
                NULL, HFILL
7200
15
            }
7201
15
        },
7202
15
    {
7203
15
            &hf_rtcp_psfb_sli_first,
7204
15
            {
7205
15
                "First MB",
7206
15
                "rtcp.psfb.fir.sli.first",
7207
15
                FT_UINT32,
7208
15
                BASE_DEC,
7209
15
                NULL,
7210
15
                0xFFF80000,
7211
15
                NULL, HFILL
7212
15
            }
7213
15
        },
7214
15
        {
7215
15
            &hf_rtcp_psfb_sli_number,
7216
15
            {
7217
15
                "Number of MBs",
7218
15
                "rtcp.psfb.fir.sli.number",
7219
15
                FT_UINT32,
7220
15
                BASE_DEC,
7221
15
                NULL,
7222
15
                0x0007FFC0,
7223
15
                NULL, HFILL
7224
15
            }
7225
15
        },
7226
15
        {
7227
15
            &hf_rtcp_psfb_sli_picture_id,
7228
15
            {
7229
15
                "Picture ID",
7230
15
                "rtcp.psfb.fir.sli.picture_id",
7231
15
                FT_UINT32,
7232
15
                BASE_DEC,
7233
15
                NULL,
7234
15
                0x0000003F,
7235
15
                NULL, HFILL
7236
15
            }
7237
15
        },
7238
15
        {
7239
15
      &hf_rtcp_psfb_remb_fci_identifier,
7240
15
            {
7241
15
                "Unique Identifier",
7242
15
                "rtcp.psfb.remb.identifier",
7243
15
                FT_STRING,
7244
15
                BASE_NONE,
7245
15
                NULL,
7246
15
                0x0,
7247
15
                NULL, HFILL
7248
15
            }
7249
15
        },
7250
15
    {
7251
15
      &hf_rtcp_psfb_remb_fci_ssrc,
7252
15
            {
7253
15
                "SSRC",
7254
15
                "rtcp.psfb.remb.fci.ssrc",
7255
15
                FT_UINT32,
7256
15
                BASE_HEX_DEC,
7257
15
                NULL,
7258
15
                0x0,
7259
15
                NULL, HFILL
7260
15
            }
7261
15
        },
7262
15
    {
7263
15
      &hf_rtcp_psfb_remb_fci_number_ssrcs,
7264
15
            {
7265
15
                "Number of Ssrcs",
7266
15
                "rtcp.psfb.remb.fci.number_ssrcs",
7267
15
                FT_UINT8,
7268
15
                BASE_DEC,
7269
15
                NULL,
7270
15
                0x0,
7271
15
                NULL, HFILL
7272
15
            }
7273
15
        },
7274
15
    {
7275
15
      &hf_rtcp_psfb_remb_fci_exp,
7276
15
            {
7277
15
                "BR Exp",
7278
15
                "rtcp.psfb.remb.fci.br_exp",
7279
15
                FT_UINT8,
7280
15
                BASE_DEC,
7281
15
                NULL,
7282
15
                0xfc,
7283
15
                NULL, HFILL
7284
15
            }
7285
15
        },
7286
15
    {
7287
15
      &hf_rtcp_psfb_remb_fci_mantissa,
7288
15
            {
7289
15
                "Br Mantissa",
7290
15
                "rtcp.psfb.remb.fci.br_mantissa",
7291
15
                FT_UINT32,
7292
15
                BASE_DEC,
7293
15
                NULL,
7294
15
                0x03ffff,
7295
15
                NULL, HFILL
7296
15
            }
7297
15
        },
7298
15
    {
7299
15
      &hf_rtcp_psfb_remb_fci_bitrate,
7300
15
            {
7301
15
                "Maximum bit rate",
7302
15
                "rtcp.psfb.remb.fci.bitrate",
7303
15
                FT_STRING,
7304
15
                BASE_NONE,
7305
15
                NULL,
7306
15
                0x0,
7307
15
                NULL, HFILL
7308
15
            }
7309
15
        },
7310
15
    {
7311
15
      &hf_rtcp_rtpfb_tmbbr_fci_ssrc,
7312
15
            {
7313
15
                "SSRC",
7314
15
                "rtcp.rtpfb.tmmbr.fci.ssrc",
7315
15
                FT_UINT32,
7316
15
                BASE_HEX_DEC,
7317
15
                NULL,
7318
15
                0x0,
7319
15
                NULL, HFILL
7320
15
            }
7321
15
        },
7322
15
    {
7323
15
      &hf_rtcp_rtpfb_tmbbr_fci_exp,
7324
15
            {
7325
15
                "MxTBR Exp",
7326
15
                "rtcp.rtpfb.tmmbr.fci.exp",
7327
15
                FT_UINT8,
7328
15
                BASE_DEC,
7329
15
                NULL,
7330
15
                0xfc,
7331
15
                NULL, HFILL
7332
15
            }
7333
15
        },
7334
15
    {
7335
15
      &hf_rtcp_rtpfb_tmbbr_fci_mantissa,
7336
15
            {
7337
15
                "MxTBR Mantissa",
7338
15
                "rtcp.rtpfb.tmmbr.fci.mantissa",
7339
15
                FT_UINT24,
7340
15
                BASE_DEC,
7341
15
                NULL,
7342
15
                0x03fffe,
7343
15
                NULL, HFILL
7344
15
            }
7345
15
        },
7346
15
    {
7347
15
      &hf_rtcp_rtpfb_tmbbr_fci_bitrate,
7348
15
            {
7349
15
                "Maximum total media bit rate",
7350
15
                "rtcp.rtpfb.tmmbr.fci.bitrate",
7351
15
                FT_STRING,
7352
15
                BASE_NONE,
7353
15
                NULL,
7354
15
                0x0,
7355
15
                NULL, HFILL
7356
15
            }
7357
15
        },
7358
15
    {
7359
15
      &hf_rtcp_rtpfb_tmbbr_fci_measuredoverhead,
7360
15
            {
7361
15
                "Measured Overhead",
7362
15
                "rtcp.rtpfb.tmmbr.fci.measuredoverhead",
7363
15
                FT_UINT16,
7364
15
                BASE_DEC,
7365
15
                NULL,
7366
15
                0x01ff,
7367
15
                NULL, HFILL
7368
15
            }
7369
15
        },
7370
15
        {
7371
15
            &hf_rtcp_rtpfb_transport_cc_fci_base_seq,
7372
15
            {
7373
15
                "Base Sequence Number",
7374
15
                "rtcp.rtpfb.transportcc.baseseq",
7375
15
                FT_UINT16,
7376
15
                BASE_DEC_HEX,
7377
15
                NULL,
7378
15
                0x0,
7379
15
                NULL, HFILL
7380
15
            }
7381
15
        },
7382
15
        {
7383
15
            &hf_rtcp_rtpfb_transport_cc_fci_pkt_stats_cnt,
7384
15
            {
7385
15
                "Packet Status Count",
7386
15
                "rtcp.rtpfb.transportcc.statuscount",
7387
15
                FT_UINT16,
7388
15
                BASE_DEC_HEX,
7389
15
                NULL,
7390
15
                0x0,
7391
15
                NULL, HFILL
7392
15
            }
7393
15
        },
7394
15
        {
7395
15
            &hf_rtcp_rtpfb_transport_cc_fci_ref_time,
7396
15
            {
7397
15
                "Reference Time",
7398
15
                "rtcp.rtpfb.transportcc.reftime",
7399
15
                FT_INT24,
7400
15
                BASE_DEC,
7401
15
                NULL,
7402
15
                0x0,
7403
15
                NULL, HFILL
7404
15
            }
7405
15
        },
7406
15
        {
7407
15
            &hf_rtcp_rtpfb_transport_cc_fci_fb_pkt_cnt,
7408
15
            {
7409
15
                "Feedback Packets Count",
7410
15
                "rtcp.rtpfb.transportcc.pktcount",
7411
15
                FT_UINT8,
7412
15
                BASE_DEC_HEX,
7413
15
                NULL,
7414
15
                0x0,
7415
15
                NULL, HFILL
7416
15
            }
7417
15
        },
7418
15
        {
7419
15
            &hf_rtcp_rtpfb_transport_cc_fci_pkt_chunk,
7420
15
            {
7421
15
                "Packet Chunk",
7422
15
                "rtcp.rtpfb.transportcc.pktchunk",
7423
15
                FT_UINT16,
7424
15
                BASE_DEC_HEX,
7425
15
                NULL,
7426
15
                0x0,
7427
15
                NULL, HFILL
7428
15
            }
7429
15
        },
7430
15
        {
7431
15
            &hf_rtcp_rtpfb_transport_cc_fci_recv_delta_1_byte,
7432
15
            {
7433
15
                "Recv Delta",
7434
15
                "rtcp.rtpfb.transportcc.recv_delta",
7435
15
                FT_UINT8,
7436
15
                BASE_HEX,
7437
15
                NULL,
7438
15
                0x0,
7439
15
                NULL, HFILL
7440
15
            }
7441
15
        },
7442
15
        {
7443
15
            &hf_rtcp_rtpfb_transport_cc_fci_recv_delta_2_bytes,
7444
15
            {
7445
15
                "Recv Delta",
7446
15
                "rtcp.rtpfb.transportcc.recv_delta",
7447
15
                FT_UINT16,
7448
15
                BASE_HEX,
7449
15
                NULL,
7450
15
                0x0,
7451
15
                NULL, HFILL
7452
15
            }
7453
15
        },
7454
15
        {
7455
15
            &hf_rtcp_rtpfb_transport_cc_fci_recv_delta_padding,
7456
15
            {
7457
15
                "Recv Delta Padding",
7458
15
                "rtcp.rtpfb.transportcc.recv_delta.padding",
7459
15
                FT_UINT16,
7460
15
                BASE_HEX,
7461
15
                NULL,
7462
15
                0x0,
7463
15
                NULL, HFILL
7464
15
            }
7465
15
        },
7466
7467
7468
15
        {
7469
15
            &hf_srtcp_e,
7470
15
            {
7471
15
                "SRTCP E flag",
7472
15
                "srtcp.e",
7473
15
                FT_BOOLEAN,
7474
15
                32,
7475
15
                NULL,
7476
15
                0x80000000,
7477
15
                "SRTCP Encryption Flag", HFILL
7478
15
            }
7479
15
        },
7480
15
        {
7481
15
            &hf_srtcp_index,
7482
15
            {
7483
15
                "SRTCP Index",
7484
15
                "srtcp.index",
7485
15
                FT_UINT32,
7486
15
                BASE_DEC_HEX,
7487
15
                NULL,
7488
15
                0x7fffffff,
7489
15
                NULL, HFILL
7490
15
            }
7491
15
        },
7492
15
        {
7493
15
            &hf_srtcp_mki,
7494
15
            {
7495
15
                "SRTCP MKI",
7496
15
                "srtcp.mki",
7497
15
                FT_BYTES,
7498
15
                BASE_NONE,
7499
15
                NULL,
7500
15
                0,
7501
15
                "SRTCP Master Key Index", HFILL
7502
15
            }
7503
15
        },
7504
15
        {
7505
15
            &hf_srtcp_auth_tag,
7506
15
            {
7507
15
                "SRTCP Auth Tag",
7508
15
                "srtcp.auth_tag",
7509
15
                FT_BYTES,
7510
15
                BASE_NONE,
7511
15
                NULL,
7512
15
                0,
7513
15
                "SRTCP Authentication Tag", HFILL
7514
15
            }
7515
15
        },
7516
        /* additions for BT XNQ block as defined in RFC5093 */
7517
15
        {
7518
15
            &hf_rtcp_xr_btxnq_begseq,
7519
15
            {
7520
15
                "Starting sequence number",
7521
15
                "rtcp.xr.btxnq.begseq",
7522
15
                FT_UINT16,
7523
15
                BASE_DEC,
7524
15
                NULL,
7525
15
                0x0,
7526
15
                NULL, HFILL
7527
15
            }
7528
15
        },
7529
15
        {
7530
15
            &hf_rtcp_xr_btxnq_endseq,
7531
15
            {
7532
15
                "Last sequence number",
7533
15
                "rtcp.xr.btxnq.endseq",
7534
15
                FT_UINT16,
7535
15
                BASE_DEC,
7536
15
                NULL,
7537
15
                0x0,
7538
15
                NULL, HFILL
7539
15
            }
7540
15
        },
7541
15
        {
7542
15
            &hf_rtcp_xr_btxnq_vmaxdiff,
7543
15
            {
7544
15
                "Maximum IPDV difference in 1 cycle",
7545
15
                "rtcp.xr.btxnq.vmaxdiff",
7546
15
                FT_UINT16,
7547
15
                BASE_DEC,
7548
15
                NULL,
7549
15
                0x0,
7550
15
                NULL, HFILL
7551
15
            }
7552
15
        },
7553
15
        {
7554
15
            &hf_rtcp_xr_btxnq_vrange,
7555
15
            {
7556
15
                "Maximum IPDV difference seen to date",
7557
15
                "rtcp.xr.btxnq.vrange",
7558
15
                FT_UINT16,
7559
15
                BASE_DEC,
7560
15
                NULL,
7561
15
                0x0,
7562
15
                NULL, HFILL
7563
15
            }
7564
15
        },
7565
15
        {
7566
15
            &hf_rtcp_xr_btxnq_vsum,
7567
15
            {
7568
15
                "Sum of peak IPDV differences to date",
7569
15
                "rtcp.xr.btxnq.vsum",
7570
15
                FT_UINT32,
7571
15
                BASE_DEC,
7572
15
                NULL,
7573
15
                0x0,
7574
15
                NULL, HFILL
7575
15
            }
7576
15
        },
7577
15
        {
7578
15
            &hf_rtcp_xr_btxnq_cycles,
7579
15
            {
7580
15
                "Number of cycles in calculation",
7581
15
                "rtcp.xr.btxnq.cycles",
7582
15
                FT_UINT16,
7583
15
                BASE_DEC,
7584
15
                NULL,
7585
15
                0x0,
7586
15
                NULL, HFILL
7587
15
            }
7588
15
        },
7589
15
        {
7590
15
            &hf_rtcp_xr_btxnq_jbevents,
7591
15
            {
7592
15
                "Number of jitter buffer adaptations to date",
7593
15
                "rtcp.xr.btxnq.jbevents",
7594
15
                FT_UINT16,
7595
15
                BASE_DEC,
7596
15
                NULL,
7597
15
                0x0,
7598
15
                NULL, HFILL
7599
15
            }
7600
15
        },
7601
15
        {
7602
15
            &hf_rtcp_xr_btxnq_spare,
7603
15
            {
7604
15
                "Spare/reserved bits",
7605
15
                "rtcp.xr.btxnq.spare",
7606
15
                FT_STRING,
7607
15
                BASE_NONE,
7608
15
                NULL,
7609
15
                0x0,
7610
15
                NULL, HFILL
7611
15
            }
7612
15
        },
7613
15
        {
7614
15
            &hf_rtcp_xr_btxnq_tdegnet,
7615
15
            {
7616
15
                "Time degraded by packet loss or late delivery",
7617
15
                "rtcp.xr.btxnq.tdegnet",
7618
15
                FT_UINT32,
7619
15
                BASE_DEC,
7620
15
                NULL,
7621
15
                0x0,
7622
15
                NULL, HFILL
7623
15
            }
7624
15
        },
7625
15
        {
7626
15
            &hf_rtcp_xr_btxnq_tdegjit,
7627
15
            {
7628
15
                "Time degraded by jitter buffer adaptation events",
7629
15
                "rtcp.xr.btxnq.tdegjit",
7630
15
                FT_UINT32,
7631
15
                BASE_DEC,
7632
15
                NULL,
7633
15
                0x0,
7634
15
                NULL, HFILL
7635
15
            }
7636
15
        },
7637
15
        {
7638
15
            &hf_rtcp_xr_btxnq_es,
7639
15
            {
7640
15
                "ES due to unavailable packet events",
7641
15
                "rtcp.xr.btxnq.es",
7642
15
                FT_UINT32,
7643
15
                BASE_DEC,
7644
15
                NULL,
7645
15
                0x0,
7646
15
                NULL, HFILL
7647
15
            }
7648
15
        },
7649
15
        {
7650
15
            &hf_rtcp_xr_btxnq_ses,
7651
15
            {
7652
15
                "SES due to unavailable packet events",
7653
15
                "rtcp.xr.btxnq.ses",
7654
15
                FT_UINT32,
7655
15
                BASE_DEC,
7656
15
                NULL,
7657
15
                0x0,
7658
15
                NULL, HFILL
7659
15
            }
7660
15
        },
7661
        /* MS Profile Specific Extension Fields */
7662
15
        {
7663
15
            &hf_rtcp_pse_ms_bandwidth,
7664
15
            {
7665
15
                "Bandwidth",
7666
15
                "rtcp.ms_pse.bandwidth",
7667
15
                FT_UINT32,
7668
15
                BASE_DEC,
7669
15
                NULL,
7670
15
                0x0,
7671
15
                NULL, HFILL
7672
15
            }
7673
15
        },
7674
15
        {
7675
15
            &hf_rtcp_pse_ms_confidence_level,
7676
15
            {
7677
15
                "Confidence Level",
7678
15
                "rtcp.ms_pse.confidence_level",
7679
15
                FT_UINT8,
7680
15
                BASE_DEC,
7681
15
                NULL,
7682
15
                0x0,
7683
15
                NULL, HFILL
7684
15
            }
7685
15
        },
7686
15
        {
7687
15
            &hf_rtcp_pse_ms_seq_num,
7688
15
            {
7689
15
                "Sequence Number",
7690
15
                "rtcp.ms_pse.seq_num",
7691
15
                FT_UINT16,
7692
15
                BASE_DEC,
7693
15
                NULL,
7694
15
                0x0,
7695
15
                NULL, HFILL
7696
15
            }
7697
15
        },
7698
15
        {
7699
15
            &hf_rtcp_pse_ms_frame_resolution_width,
7700
15
            {
7701
15
                "Frame Resolution Width",
7702
15
                "rtcp.ms_pse.frame_res_width",
7703
15
                FT_UINT16,
7704
15
                BASE_DEC,
7705
15
                NULL,
7706
15
                0x0,
7707
15
                NULL, HFILL
7708
15
            }
7709
15
        },
7710
15
        {
7711
15
            &hf_rtcp_pse_ms_frame_resolution_height,
7712
15
            {
7713
15
                "Frame Resolution Height",
7714
15
                "rtcp.ms_pse.frame_res_height",
7715
15
                FT_UINT16,
7716
15
                BASE_DEC,
7717
15
                NULL,
7718
15
                0x0,
7719
15
                NULL, HFILL
7720
15
            }
7721
15
        },
7722
15
        {
7723
15
            &hf_rtcp_pse_ms_bitrate,
7724
15
            {
7725
15
                "Bitrate",
7726
15
                "rtcp.ms_pse.bitrate",
7727
15
                FT_UINT32,
7728
15
                BASE_DEC,
7729
15
                NULL,
7730
15
                0x0,
7731
15
                NULL, HFILL
7732
15
            }
7733
15
        },
7734
15
        {
7735
15
            &hf_rtcp_pse_ms_frame_rate,
7736
15
            {
7737
15
                "Frame Rate",
7738
15
                "rtcp.ms_pse.frame_rate",
7739
15
                FT_UINT16,
7740
15
                BASE_DEC,
7741
15
                NULL,
7742
15
                0x0,
7743
15
                NULL, HFILL
7744
15
            }
7745
15
        },
7746
15
        {
7747
15
            &hf_rtcp_pse_ms_concealed_frames,
7748
15
            {
7749
15
                "Concealed Frames",
7750
15
                "rtcp.ms_pse.concealed_frames",
7751
15
                FT_UINT32,
7752
15
                BASE_DEC,
7753
15
                NULL,
7754
15
                0x0,
7755
15
                NULL, HFILL
7756
15
            }
7757
15
        },
7758
15
        {
7759
15
            &hf_rtcp_pse_ms_stretched_frames,
7760
15
            {
7761
15
                "Stretched Frames",
7762
15
                "rtcp.ms_pse.stretched_frames",
7763
15
                FT_UINT32,
7764
15
                BASE_DEC,
7765
15
                NULL,
7766
15
                0x0,
7767
15
                NULL, HFILL
7768
15
            }
7769
15
        },
7770
15
        {
7771
15
            &hf_rtcp_pse_ms_compressed_frames,
7772
15
            {
7773
15
                "Compressed Frames",
7774
15
                "rtcp.ms_pse.compressed_frames",
7775
15
                FT_UINT32,
7776
15
                BASE_DEC,
7777
15
                NULL,
7778
15
                0x0,
7779
15
                NULL, HFILL
7780
15
            }
7781
15
        },
7782
15
        {
7783
15
            &hf_rtcp_pse_ms_total_frames,
7784
15
            {
7785
15
                "Total Frames",
7786
15
                "rtcp.ms_pse.total_frames",
7787
15
                FT_UINT32,
7788
15
                BASE_DEC,
7789
15
                NULL,
7790
15
                0x0,
7791
15
                NULL, HFILL
7792
15
            }
7793
15
        },
7794
15
        {
7795
15
            &hf_rtcp_pse_ms_receive_quality_state,
7796
15
            {
7797
15
                "Received Quality State",
7798
15
                "rtcp.ms_pse.receive_quality_state",
7799
15
                FT_UINT8,
7800
15
                BASE_DEC,
7801
15
                NULL,
7802
15
                0x0,
7803
15
                NULL, HFILL
7804
15
            }
7805
15
        },
7806
15
        {
7807
15
            &hf_rtcp_pse_ms_fec_distance_request,
7808
15
            {
7809
15
                "FEC Distance Request",
7810
15
                "rtcp.ms_pse.fec_distance_request",
7811
15
                FT_UINT8,
7812
15
                BASE_DEC,
7813
15
                NULL,
7814
15
                0x0,
7815
15
                NULL, HFILL
7816
15
            }
7817
15
        },
7818
15
        {
7819
15
            &hf_rtcp_pse_ms_last_packet_train,
7820
15
            {
7821
15
                "Last Packet Train Flag",
7822
15
                "rtcp.ms_pse.last_packet_train",
7823
15
                FT_BOOLEAN,
7824
15
                8,
7825
15
                NULL,
7826
15
                0x80,
7827
15
                NULL, HFILL
7828
15
            }
7829
15
        },
7830
15
        {
7831
15
            &hf_rtcp_pse_ms_packet_idx,
7832
15
            {
7833
15
                "Packet Index",
7834
15
                "rtcp.ms_pse.packet_index",
7835
15
                FT_UINT8,
7836
15
                BASE_DEC,
7837
15
                NULL,
7838
15
                0x7f,
7839
15
                NULL, HFILL
7840
15
            }
7841
15
        },
7842
15
        {
7843
15
            &hf_rtcp_pse_ms_packet_cnt,
7844
15
            {
7845
15
                "Packet Count",
7846
15
                "rtcp.ms_pse.packet_count",
7847
15
                FT_UINT8,
7848
15
                BASE_DEC,
7849
15
                NULL,
7850
15
                0x7f,
7851
15
                NULL, HFILL
7852
15
            }
7853
15
        },
7854
15
        {
7855
15
            &hf_rtcp_pse_ms_packet_train_byte_cnt,
7856
15
            {
7857
15
                "Packet Train Byte Count",
7858
15
                "rtcp.ms_pse.packet_train_byte_count",
7859
15
                FT_UINT16,
7860
15
                BASE_DEC,
7861
15
                NULL,
7862
15
                0x0,
7863
15
                NULL, HFILL
7864
15
            }
7865
15
        },
7866
15
        {
7867
15
            &hf_rtcp_pse_ms_inbound_bandwidth,
7868
15
            {
7869
15
                "Inbound Link Bandwidth",
7870
15
                "rtcp.ms_pse.inbound_bandwidth",
7871
15
                FT_UINT32,
7872
15
                BASE_DEC,
7873
15
                NULL,
7874
15
                0x0,
7875
15
                NULL, HFILL
7876
15
            }
7877
15
        },
7878
15
        {
7879
15
            &hf_rtcp_pse_ms_outbound_bandwidth,
7880
15
            {
7881
15
                "Outbound Link Bandwidth",
7882
15
                "rtcp.ms_pse.outbound_bandwidth",
7883
15
                FT_UINT32,
7884
15
                BASE_DEC,
7885
15
                NULL,
7886
15
                0x0,
7887
15
                NULL, HFILL
7888
15
            }
7889
15
        },
7890
15
        {
7891
15
            &hf_rtcp_pse_ms_no_cache,
7892
15
            {
7893
15
                "No Cache Flag",
7894
15
                "rtcp.ms_pse.no_cache",
7895
15
                FT_BOOLEAN,
7896
15
                8,
7897
15
                NULL,
7898
15
                0x80,
7899
15
                NULL, HFILL
7900
15
            }
7901
15
        },
7902
15
        {
7903
15
            &hf_rtcp_pse_ms_congestion_info,
7904
15
            {
7905
15
                "Congestion Information",
7906
15
                "rtcp.ms_pse.congestion_info",
7907
15
                FT_UINT8,
7908
15
                BASE_DEC,
7909
15
                NULL,
7910
15
                0x0,
7911
15
                NULL, HFILL
7912
15
            }
7913
15
        },
7914
15
        {
7915
15
            &hf_rtcp_pse_ms_modality,
7916
15
            {
7917
15
                "Modality",
7918
15
                "rtcp.ms_pse.modality",
7919
15
                FT_UINT8,
7920
15
                BASE_DEC,
7921
15
                NULL,
7922
15
                0x0,
7923
15
                NULL, HFILL
7924
15
            }
7925
15
        },
7926
7927
        /* Microsoft PLI */
7928
15
        {
7929
15
            &hf_rtcp_psfb_pli_ms_request_id,
7930
15
            {
7931
15
                "Request ID",
7932
15
                "rtcp.psfb.ms.pli.request_id",
7933
15
                FT_UINT16,
7934
15
                BASE_DEC,
7935
15
                NULL,
7936
15
                0x0,
7937
15
                NULL, HFILL
7938
15
            }
7939
15
        },
7940
15
        {
7941
15
            &hf_rtcp_psfb_pli_ms_sfr,
7942
15
            {
7943
15
                "Sync Frame Request",
7944
15
                "rtcp.psfb.ms.pli.sync_frame_request",
7945
15
                FT_UINT8,
7946
15
                BASE_DEC,
7947
15
                NULL,
7948
15
                0x0,
7949
15
                NULL, HFILL
7950
15
            }
7951
15
        },
7952
7953
        /* Microsoft Application Feedback Video Source Request */
7954
15
        {
7955
15
            &hf_rtcp_psfb_ms_type,
7956
15
            {
7957
15
                "Application Layer Feedback Type",
7958
15
                "rtcp.psfb.ms.afb_type",
7959
15
                FT_UINT16,
7960
15
                BASE_DEC,
7961
15
                NULL,
7962
15
                0x0,
7963
15
                NULL, HFILL
7964
15
            }
7965
15
        },
7966
15
        {
7967
15
            &hf_rtcp_psfb_ms_length,
7968
15
            {
7969
15
                "Length",
7970
15
                "rtcp.psfb.ms.length",
7971
15
                FT_UINT16,
7972
15
                BASE_DEC,
7973
15
                NULL,
7974
15
                0x0,
7975
15
                NULL, HFILL
7976
15
            }
7977
15
        },
7978
15
        {
7979
15
            &hf_rtcp_psfb_ms_msi,
7980
15
            {
7981
15
                "Requested Media Source ID (MSI)",
7982
15
                "rtcp.psfb.ms.msi",
7983
15
                FT_UINT32,
7984
15
                BASE_HEX_DEC,
7985
15
                NULL,
7986
15
                0x0,
7987
15
                NULL, HFILL
7988
15
            }
7989
15
        },
7990
15
        {
7991
15
            &hf_rtcp_psfb_ms_vsr_request_id,
7992
15
            {
7993
15
                "Request Id",
7994
15
                "rtcp.psfb.ms.vsr.request_id",
7995
15
                FT_UINT16,
7996
15
                BASE_DEC,
7997
15
                NULL,
7998
15
                0x0,
7999
15
                NULL, HFILL
8000
15
            }
8001
15
        },
8002
15
        {
8003
15
            &hf_rtcp_psfb_ms_vsr_version,
8004
15
            {
8005
15
                "Version",
8006
15
                "rtcp.psfb.ms.vsr.version",
8007
15
                FT_UINT8,
8008
15
                BASE_DEC,
8009
15
                NULL,
8010
15
                0x0,
8011
15
                NULL, HFILL
8012
15
            }
8013
15
        },
8014
15
        {
8015
15
            &hf_rtcp_psfb_ms_vsr_key_frame_request,
8016
15
            {
8017
15
                "Key Frame Request",
8018
15
                "rtcp.psfb.ms.vsr.key_frame_request",
8019
15
                FT_BOOLEAN,
8020
15
                8,
8021
15
                NULL,
8022
15
                0x01,
8023
15
                NULL, HFILL
8024
15
            }
8025
15
        },
8026
15
        {
8027
15
            &hf_rtcp_psfb_ms_vsr_num_entries,
8028
15
            {
8029
15
                "Number of Entries",
8030
15
                "rtcp.psfb.ms.vsr.num_entries",
8031
15
                FT_UINT8,
8032
15
                BASE_DEC,
8033
15
                NULL,
8034
15
                0x0,
8035
15
                NULL, HFILL
8036
15
            }
8037
15
        },
8038
15
        {
8039
15
            &hf_rtcp_psfb_ms_vsr_entry_length,
8040
15
            {
8041
15
                "Entry Length",
8042
15
                "rtcp.psfb.ms.vsr.entry_length",
8043
15
                FT_UINT8,
8044
15
                BASE_DEC,
8045
15
                NULL,
8046
15
                0x0,
8047
15
                NULL, HFILL
8048
15
            }
8049
15
        },
8050
15
        {
8051
15
            &hf_rtcp_psfb_ms_vsre_payload_type,
8052
15
            {
8053
15
                "Payload Type",
8054
15
                "rtcp.psfb.ms.vsr.entry.payload_type",
8055
15
                FT_UINT8,
8056
15
                BASE_DEC,
8057
15
                NULL,
8058
15
                0x0,
8059
15
                NULL, HFILL
8060
15
            }
8061
15
        },
8062
15
        {
8063
15
            &hf_rtcp_psfb_ms_vsre_ucconfig_mode,
8064
15
            {
8065
15
                "UCConfig Mode",
8066
15
                "rtcp.psfb.ms.vsr.entry.ucconfig_mode",
8067
15
                FT_UINT8,
8068
15
                BASE_DEC,
8069
15
                NULL,
8070
15
                0x0,
8071
15
                NULL, HFILL
8072
15
            }
8073
15
        },
8074
15
        {
8075
15
            &hf_rtcp_psfb_ms_vsre_no_sp_frames,
8076
15
            {
8077
15
                "No support for SP Frames (RT only)",
8078
15
                "rtcp.psfb.ms.vsr.entry.no_sp_frames",
8079
15
                FT_BOOLEAN,
8080
15
                8,
8081
15
                NULL,
8082
15
                0x04,
8083
15
                NULL, HFILL
8084
15
            }
8085
15
        },
8086
15
        {
8087
15
            &hf_rtcp_psfb_ms_vsre_baseline,
8088
15
            {
8089
15
                "Only Supports Constrained Baseline (H.264 only)",
8090
15
                "rtcp.psfb.ms.vsr.entry.no_sp_baseline",
8091
15
                FT_BOOLEAN,
8092
15
                8,
8093
15
                NULL,
8094
15
                0x02,
8095
15
                NULL, HFILL
8096
15
            }
8097
15
        },
8098
15
        {
8099
15
            &hf_rtcp_psfb_ms_vsre_cgs,
8100
15
            {
8101
15
                "Supports CGS rewrite (H.264 only)",
8102
15
                "rtcp.psfb.ms.vsr.entry.cgs",
8103
15
                FT_BOOLEAN,
8104
15
                8,
8105
15
                NULL,
8106
15
                0x01,
8107
15
                NULL, HFILL
8108
15
            }
8109
15
        },
8110
15
        {
8111
15
            &hf_rtcp_psfb_ms_vsre_aspect_ratio_bitmask,
8112
15
            {
8113
15
                "Aspect Ratio Bitmask",
8114
15
                "rtcp.psfb.ms.vsr.entry.aspect_ratio",
8115
15
                FT_UINT8,
8116
15
                BASE_HEX,
8117
15
                NULL,
8118
15
                0x0,
8119
15
                NULL, HFILL
8120
15
            }
8121
15
        },
8122
15
        {
8123
15
            &hf_rtcp_psfb_ms_vsre_aspect_ratio_4by3,
8124
15
            {
8125
15
                "Aspect Ratio 4 by 3",
8126
15
                "rtcp.psfb.ms.vsr.entry.aspect_ratio_4by3",
8127
15
                FT_BOOLEAN,
8128
15
                8,
8129
15
                NULL,
8130
15
                0x01,
8131
15
                NULL, HFILL
8132
15
            }
8133
15
        },
8134
15
        {
8135
15
            &hf_rtcp_psfb_ms_vsre_aspect_ratio_16by9,
8136
15
            {
8137
15
                "Aspect Ratio 16 by 9",
8138
15
                "rtcp.psfb.ms.vsr.entry.aspect_ratio_16by9",
8139
15
                FT_BOOLEAN,
8140
15
                8,
8141
15
                NULL,
8142
15
                0x02,
8143
15
                NULL, HFILL
8144
15
            }
8145
15
        },
8146
15
        {
8147
15
            &hf_rtcp_psfb_ms_vsre_aspect_ratio_1by1,
8148
15
            {
8149
15
                "Aspect Ratio 1 by 1",
8150
15
                "rtcp.psfb.ms.vsr.entry.aspect_ratio_1by1",
8151
15
                FT_BOOLEAN,
8152
15
                8,
8153
15
                NULL,
8154
15
                0x04,
8155
15
                NULL, HFILL
8156
15
            }
8157
15
        },
8158
15
        {
8159
15
            &hf_rtcp_psfb_ms_vsre_aspect_ratio_3by4,
8160
15
            {
8161
15
                "Aspect Ratio 3 by 4",
8162
15
                "rtcp.psfb.ms.vsr.entry.aspect_ratio_3by4",
8163
15
                FT_BOOLEAN,
8164
15
                8,
8165
15
                NULL,
8166
15
                0x08,
8167
15
                NULL, HFILL
8168
15
            }
8169
15
        },
8170
15
        {
8171
15
            &hf_rtcp_psfb_ms_vsre_aspect_ratio_9by16,
8172
15
            {
8173
15
                "Aspect Ratio 9 by 16",
8174
15
                "rtcp.psfb.ms.vsr.entry.aspect_ratio_9by16",
8175
15
                FT_BOOLEAN,
8176
15
                8,
8177
15
                NULL,
8178
15
                0x10,
8179
15
                NULL, HFILL
8180
15
            }
8181
15
        },
8182
15
        {
8183
15
            &hf_rtcp_psfb_ms_vsre_aspect_ratio_20by3,
8184
15
            {
8185
15
                "Aspect Ratio 20 by 3",
8186
15
                "rtcp.psfb.ms.vsr.entry.aspect_ratio_20by3",
8187
15
                FT_BOOLEAN,
8188
15
                8,
8189
15
                NULL,
8190
15
                0x20,
8191
15
                NULL, HFILL
8192
15
            }
8193
15
        },
8194
15
        {
8195
15
            &hf_rtcp_psfb_ms_vsre_max_width,
8196
15
            {
8197
15
                "Max Width",
8198
15
                "rtcp.psfb.ms.vsr.entry.max_width",
8199
15
                FT_UINT16,
8200
15
                BASE_DEC,
8201
15
                NULL,
8202
15
                0x0,
8203
15
                NULL, HFILL
8204
15
            }
8205
15
        },
8206
15
        {
8207
15
            &hf_rtcp_psfb_ms_vsre_max_height,
8208
15
            {
8209
15
                "Max Height",
8210
15
                "rtcp.psfb.ms.vsr.entry.max_height",
8211
15
                FT_UINT16,
8212
15
                BASE_DEC,
8213
15
                NULL,
8214
15
                0x0,
8215
15
                NULL, HFILL
8216
15
            }
8217
15
        },
8218
15
        {
8219
15
            &hf_rtcp_psfb_ms_vsre_min_bitrate,
8220
15
            {
8221
15
                "Min bit rate",
8222
15
                "rtcp.psfb.ms.vsr.entry.min_bitrate",
8223
15
                FT_UINT32,
8224
15
                BASE_DEC,
8225
15
                NULL,
8226
15
                0x0,
8227
15
                NULL, HFILL
8228
15
            }
8229
15
        },
8230
15
        {
8231
15
            &hf_rtcp_psfb_ms_vsre_bitrate_per_level,
8232
15
            {
8233
15
                "Bit rate per level",
8234
15
                "rtcp.psfb.ms.vsr.entry.bitrate_per_level",
8235
15
                FT_UINT32,
8236
15
                BASE_DEC,
8237
15
                NULL,
8238
15
                0x0,
8239
15
                NULL, HFILL
8240
15
            }
8241
15
        },
8242
15
        {
8243
15
            &hf_rtcp_psfb_ms_vsre_bitrate_histogram,
8244
15
            {
8245
15
                "Receiver Count",
8246
15
                "rtcp.psfb.ms.vsr.entry.bitrate_histogram",
8247
15
                FT_UINT16,
8248
15
                BASE_DEC,
8249
15
                NULL,
8250
15
                0x0,
8251
15
                NULL, HFILL
8252
15
            }
8253
15
        },
8254
15
        {
8255
15
            &hf_rtcp_psfb_ms_vsre_frame_rate_mask,
8256
15
            {
8257
15
                "Frame rate mask",
8258
15
                "rtcp.psfb.ms.vsr.entry.frame_rate_mask",
8259
15
                FT_UINT32,
8260
15
                BASE_HEX,
8261
15
                NULL,
8262
15
                0x0,
8263
15
                NULL, HFILL
8264
15
            }
8265
15
        },
8266
15
        {
8267
15
            &hf_rtcp_psfb_ms_vsre_frame_rate_7_5,
8268
15
            {
8269
15
                "7.5 fps",
8270
15
                "rtcp.psfb.ms.vsr.entry.frame_rate_7_5",
8271
15
                FT_BOOLEAN,
8272
15
                8,
8273
15
                NULL,
8274
15
                0x01,
8275
15
                NULL, HFILL
8276
15
            }
8277
15
        },
8278
15
        {
8279
15
            &hf_rtcp_psfb_ms_vsre_frame_rate_12_5,
8280
15
            {
8281
15
                "12.5 fps",
8282
15
                "rtcp.psfb.ms.vsr.entry.frame_rate_12_5",
8283
15
                FT_BOOLEAN,
8284
15
                8,
8285
15
                NULL,
8286
15
                0x02,
8287
15
                NULL, HFILL
8288
15
            }
8289
15
        },
8290
15
        {
8291
15
            &hf_rtcp_psfb_ms_vsre_frame_rate_15,
8292
15
            {
8293
15
                "15 fps",
8294
15
                "rtcp.psfb.ms.vsr.entry.frame_rate_15",
8295
15
                FT_BOOLEAN,
8296
15
                8,
8297
15
                NULL,
8298
15
                0x04,
8299
15
                NULL, HFILL
8300
15
            }
8301
15
        },
8302
15
        {
8303
15
            &hf_rtcp_psfb_ms_vsre_frame_rate_25,
8304
15
            {
8305
15
                "25 fps",
8306
15
                "rtcp.psfb.ms.vsr.entry.frame_rate_25",
8307
15
                FT_BOOLEAN,
8308
15
                8,
8309
15
                NULL,
8310
15
                0x08,
8311
15
                NULL, HFILL
8312
15
            }
8313
15
        },
8314
15
        {
8315
15
            &hf_rtcp_psfb_ms_vsre_frame_rate_30,
8316
15
            {
8317
15
                "30 fps",
8318
15
                "rtcp.psfb.ms.vsr.entry.frame_rate_30",
8319
15
                FT_BOOLEAN,
8320
15
                8,
8321
15
                NULL,
8322
15
                0x10,
8323
15
                NULL, HFILL
8324
15
            }
8325
15
        },
8326
15
        {
8327
15
            &hf_rtcp_psfb_ms_vsre_frame_rate_50,
8328
15
            {
8329
15
                "50 fps",
8330
15
                "rtcp.psfb.ms.vsr.entry.frame_rate_50",
8331
15
                FT_BOOLEAN,
8332
15
                8,
8333
15
                NULL,
8334
15
                0x20,
8335
15
                NULL, HFILL
8336
15
            }
8337
15
        },
8338
15
        {
8339
15
            &hf_rtcp_psfb_ms_vsre_frame_rate_60,
8340
15
            {
8341
15
                "60 fps",
8342
15
                "rtcp.psfb.ms.vsr.entry.frame_rate_60",
8343
15
                FT_BOOLEAN,
8344
15
                8,
8345
15
                NULL,
8346
15
                0x40,
8347
15
                NULL, HFILL
8348
15
            }
8349
15
        },
8350
15
        {
8351
15
            &hf_rtcp_psfb_ms_vsre_must_instances,
8352
15
            {
8353
15
                "Number of MUST instances",
8354
15
                "rtcp.psfb.ms.vsr.entry.musts",
8355
15
                FT_UINT16,
8356
15
                BASE_DEC,
8357
15
                NULL,
8358
15
                0x0,
8359
15
                NULL, HFILL
8360
15
            }
8361
15
        },
8362
15
        {
8363
15
            &hf_rtcp_psfb_ms_vsre_may_instances,
8364
15
            {
8365
15
                "Number of MAY instances",
8366
15
                "rtcp.psfb.ms.vsr.entry.mays",
8367
15
                FT_UINT16,
8368
15
                BASE_DEC,
8369
15
                NULL,
8370
15
                0x0,
8371
15
                NULL, HFILL
8372
15
            }
8373
15
        },
8374
15
        {
8375
15
            &hf_rtcp_psfb_ms_vsre_quality_histogram,
8376
15
            {
8377
15
                "Receiver Count",
8378
15
                "rtcp.psfb.ms.vsr.entry.quality_histogram",
8379
15
                FT_UINT16,
8380
15
                BASE_DEC,
8381
15
                NULL,
8382
15
                0x0,
8383
15
                NULL, HFILL
8384
15
            }
8385
15
        },
8386
15
        {
8387
15
            &hf_rtcp_psfb_ms_vsre_max_pixels,
8388
15
            {
8389
15
                "Max Pixels per Frame",
8390
15
                "rtcp.psfb.ms.vsr.entry.max_pixels",
8391
15
                FT_UINT32,
8392
15
                BASE_DEC,
8393
15
                NULL,
8394
15
                0x0,
8395
15
                NULL, HFILL
8396
15
            }
8397
15
        },
8398
15
        {&hf_rtcp_mcptt_fld_id,
8399
15
            { "Field Id", "rtcp.mcptt.fld_id",
8400
15
            FT_UINT32, BASE_DEC, VALS(rtcp_mcpt_field_id_vals), 0x0,
8401
15
            NULL, HFILL }
8402
15
        },
8403
15
        {&hf_rtcp_mcptt_fld_len,
8404
15
            { "Length", "rtcp.mcptt.fld_len",
8405
15
            FT_UINT32, BASE_DEC, NULL, 0x0,
8406
15
            NULL, HFILL }
8407
15
        },
8408
15
        { &hf_rtcp_mcptt_fld_val,
8409
15
        { "Field value", "rtcp.mcptt.fld_val",
8410
15
            FT_BYTES, BASE_NONE, NULL, 0x0,
8411
15
            NULL, HFILL }
8412
15
        },
8413
15
        { &hf_rtcp_mcptt_granted_partys_id,
8414
15
        { "Granted Party's Identity", "rtcp.mcptt.granted_partys_id",
8415
15
            FT_STRING, BASE_NONE, NULL, 0x0,
8416
15
            NULL, HFILL }
8417
15
        },
8418
15
        { &hf_rtcp_app_data_padding,
8419
15
            { "Padding", "rtcp.app_data.padding",
8420
15
            FT_UINT32, BASE_DEC, NULL, 0x0,
8421
15
            NULL, HFILL }
8422
15
        },
8423
15
        { &hf_rtcp_mcptt_priority,
8424
15
            { "Floor Priority", "rtcp.app_data.mcptt.priority",
8425
15
            FT_UINT16, BASE_DEC, NULL, 0xff00,
8426
15
            NULL, HFILL }
8427
15
        },
8428
15
        { &hf_rtcp_mcptt_user_id,
8429
15
            { "User ID", "rtcp.app_data.mcptt.user_id",
8430
15
            FT_STRING, BASE_NONE, NULL, 0x0,
8431
15
            NULL, HFILL }
8432
15
        },
8433
15
        { &hf_rtcp_mcptt_duration,
8434
15
            { "Duration", "rtcp.app_data.mcptt.duration",
8435
15
            FT_UINT16, BASE_DEC | BASE_UNIT_STRING, UNS(& units_second_seconds), 0x0,
8436
15
            NULL, HFILL }
8437
15
        },
8438
15
        { &hf_rtcp_mcptt_floor_ind_normal,
8439
15
            { "Normal call", "rtcp.app_data.mcptt.floor_ind.normal",
8440
15
            FT_BOOLEAN, 16, NULL, 0x8000,
8441
15
            NULL, HFILL }
8442
15
        },
8443
15
        { &hf_rtcp_mcptt_floor_ind_broadcast,
8444
15
            { "Broadcast group call", "rtcp.app_data.mcptt.floor_ind.broadcast",
8445
15
            FT_BOOLEAN, 16, NULL, 0x4000,
8446
15
            NULL, HFILL }
8447
15
        },
8448
15
        { &hf_rtcp_mcptt_floor_ind_system,
8449
15
            { "System call", "rtcp.app_data.mcptt.floor_ind.system",
8450
15
            FT_BOOLEAN, 16, NULL, 0x2000,
8451
15
            NULL, HFILL }
8452
15
        },
8453
15
        { &hf_rtcp_mcptt_floor_ind_emergency,
8454
15
            { "Emergency call", "rtcp.app_data.mcptt.floor_ind.emergency",
8455
15
            FT_BOOLEAN, 16, NULL, 0x1000,
8456
15
            NULL, HFILL }
8457
15
        },
8458
15
        { &hf_rtcp_mcptt_floor_ind_imminent_peril,
8459
15
            { "Imminent peril call", "rtcp.app_data.mcptt.floor_ind.imminent_peril",
8460
15
            FT_BOOLEAN, 16, NULL, 0x0800,
8461
15
            NULL, HFILL }
8462
15
        },
8463
15
        { &hf_rtcp_mcptt_floor_ind_queueing_supported,
8464
15
            { "Queueing supported", "rtcp.app_data.mcptt.floor_ind.queueing_supported",
8465
15
            FT_BOOLEAN, 16, NULL, 0x0400,
8466
15
            NULL, HFILL }
8467
15
        },
8468
15
        { &hf_rtcp_mcptt_floor_ind_dual_floor,
8469
15
            { "Dual floor", "rtcp.app_data.mcptt.floor_ind.dual_floor",
8470
15
            FT_BOOLEAN, 16, NULL, 0x0200,
8471
15
            NULL, HFILL }
8472
15
        },
8473
15
        { &hf_rtcp_mcptt_floor_ind_temp_group,
8474
15
            { "Temporary group call", "rtcp.app_data.mcptt.floor_ind.temp_group",
8475
15
            FT_BOOLEAN, 16, NULL, 0x0100,
8476
15
            NULL, HFILL }
8477
15
        },
8478
15
        { &hf_rtcp_mcptt_floor_ind_multi_talker,
8479
15
            { "Multi-talker", "rtcp.app_data.mcptt.floor_ind.multi_talker",
8480
15
            FT_BOOLEAN, 16, NULL, 0x0080,
8481
15
            NULL, HFILL }
8482
15
        },
8483
15
        { &hf_rtcp_mcptt_rej_cause,
8484
15
            { "Reject Cause", "rtcp.app_data.mcptt.rej_cause",
8485
15
            FT_UINT16, BASE_DEC, NULL, 0x0,
8486
15
            NULL, HFILL }
8487
15
        },
8488
15
        { &hf_rtcp_mcptt_rej_cause_floor_deny,
8489
15
            { "Reject Cause", "rtcp.app_data.mcptt.rej_cause.floor_deny",
8490
15
            FT_UINT16, BASE_DEC, VALS(rtcp_mcptt_rej_cause_floor_deny_vals), 0x0,
8491
15
            NULL, HFILL }
8492
15
        },
8493
15
        { &hf_rtcp_mcptt_rej_cause_floor_revoke,
8494
15
            { "Reject Cause", "rtcp.app_data.mcptt.rej_cause.floor_revoke",
8495
15
            FT_UINT16, BASE_DEC, VALS(rtcp_mcptt_rej_cause_floor_revoke_vals), 0x0,
8496
15
            NULL, HFILL }
8497
15
        },
8498
15
        { &hf_rtcp_mcptt_rej_phrase,
8499
15
        { "Reject Phrase", "rtcp.mcptt.rej_phrase",
8500
15
            FT_STRING, BASE_NONE, NULL, 0x0,
8501
15
            NULL, HFILL }
8502
15
        },
8503
15
        { &hf_rtcp_mcptt_queue_pos_inf,
8504
15
            { "Queue Position Info", "rtcp.app_data.mcptt.queue_pos_inf",
8505
15
            FT_UINT8, BASE_DEC, NULL, 0x0,
8506
15
            NULL, HFILL }
8507
15
        },
8508
15
        { &hf_rtcp_mcptt_queue_pri_lev,
8509
15
            { "Queue Priority Level", "rtcp.app_data.mcptt.queue_pri_lev",
8510
15
            FT_UINT8, BASE_DEC, NULL, 0x0,
8511
15
            NULL, HFILL }
8512
15
        },
8513
15
        { &hf_rtcp_mcptt_perm_to_req_floor,
8514
15
            { "Permission to Request the Floor", "rtcp.app_data.mcptt.perm_to_req_floor",
8515
15
            FT_UINT16, BASE_DEC, VALS(rtcp_mcptt_perm_to_req_floor_vals), 0x0,
8516
15
            NULL, HFILL }
8517
15
        },
8518
15
        { &hf_rtcp_mcptt_queue_size,
8519
15
            { "Queue Size", "rtcp.app_data.mcptt.queue_size",
8520
15
            FT_UINT16, BASE_DEC, NULL, 0x0,
8521
15
            NULL, HFILL }
8522
15
        },
8523
15
        { &hf_rtcp_mcptt_msg_seq_num,
8524
15
            { "Message Sequence Number", "rtcp.app_data.mcptt.msg_seq_num",
8525
15
            FT_UINT16, BASE_DEC, NULL, 0x0,
8526
15
            NULL, HFILL }
8527
15
        },
8528
15
        { &hf_rtcp_mcptt_queued_user_id,
8529
15
        { "Queued User ID", "rtcp.mcptt.queued_user_id",
8530
15
            FT_STRING, BASE_NONE, NULL, 0x0,
8531
15
            NULL, HFILL }
8532
15
        },
8533
15
        { &hf_rtcp_mcptt_source,
8534
15
            { "Source", "rtcp.app_data.mcptt.source",
8535
15
            FT_UINT16, BASE_DEC, VALS(rtcp_mcptt_source_vals), 0x0,
8536
15
            NULL, HFILL }
8537
15
        },
8538
15
        { &hf_rtcp_mcptt_queueing_cap,
8539
15
            { "Queueing Capability", "rtcp.app_data.mcptt.queueing_cap",
8540
15
            FT_UINT8, BASE_DEC, NULL, 0x0,
8541
15
            NULL, HFILL }
8542
15
        },
8543
15
        { &hf_rtcp_mcptt_part_type_len,
8544
15
            { "Participant Type Length", "rtcp.app_data.mcptt.part_type_len",
8545
15
            FT_UINT8, BASE_DEC, NULL, 0x0,
8546
15
            NULL, HFILL }
8547
15
        },
8548
15
        { &hf_rtcp_mcptt_participant_type,
8549
15
        { "Participant Type", "rtcp.mcptt.participant_type",
8550
15
            FT_STRING, BASE_NONE, NULL, 0x0,
8551
15
            NULL, HFILL }
8552
15
        },
8553
15
        { &hf_rtcp_mcptt_participant_ref,
8554
15
            { "Floor Participant Reference", "rtcp.app_data.mcptt.floor_participant_ref",
8555
15
            FT_UINT32, BASE_DEC, NULL, 0x0,
8556
15
            NULL, HFILL }
8557
15
        },
8558
15
        { &hf_rtcp_mcptt_ssrc,
8559
15
            { "SSRC", "rtcp.app_data.mcptt.rtcp",
8560
15
            FT_UINT32, BASE_DEC, NULL, 0x0,
8561
15
            NULL, HFILL }
8562
15
        },
8563
15
        { &hf_rtcp_mcptt_num_users,
8564
15
            { "Number of users", "rtcp.app_data.mcptt.num_users",
8565
15
            FT_UINT8, BASE_DEC, NULL, 0x0,
8566
15
            NULL, HFILL }
8567
15
        },
8568
15
        { &hf_rtcp_mcptt_user_id_len,
8569
15
            { "User ID length", "rtcp.app_data.mcptt.user_id_len",
8570
15
            FT_UINT8, BASE_DEC, NULL, 0x0,
8571
15
            NULL, HFILL }
8572
15
        },
8573
15
        { &hf_rtcp_spare8,
8574
15
            { "Spare", "rtcp.spare8",
8575
15
            FT_UINT8, BASE_DEC, NULL, 0x0,
8576
15
            NULL, HFILL }
8577
15
        },
8578
15
        { &hf_rtcp_spare16,
8579
15
            { "Spare", "rtcp.spare16",
8580
15
            FT_UINT16, BASE_DEC, NULL, 0x0,
8581
15
            NULL, HFILL }
8582
15
        },
8583
15
        { &hf_rtcp_mcptt_num_ssrc,
8584
15
            { "Number of SSRC", "rtcp.app_data.mcptt.num_ssrc",
8585
15
            FT_UINT8, BASE_DEC, NULL, 0x0,
8586
15
            NULL, HFILL }
8587
15
        },
8588
15
        { &hf_rtcp_mcptt_func_alias,
8589
15
        { "Functional Alias", "rtcp.mcptt.func_alias",
8590
15
            FT_STRING, BASE_NONE, NULL, 0x0,
8591
15
            NULL, HFILL }
8592
15
        },
8593
15
        { &hf_rtcp_mcptt_fa_len,
8594
15
            { "Functional Alias length", "rtcp.app_data.mcptt.fa_len",
8595
15
            FT_UINT8, BASE_DEC, NULL, 0x0,
8596
15
            NULL, HFILL }
8597
15
        },
8598
15
        { &hf_rtcp_mcptt_num_fas,
8599
15
            { "Number of Functional Alias", "rtcp.app_data.mcptt.num_fa",
8600
15
            FT_UINT8, BASE_DEC, NULL, 0x0,
8601
15
            NULL, HFILL }
8602
15
        },
8603
15
        { &hf_rtcp_mcptt_loc_type,
8604
15
            { "Location Type", "rtcp.app_data.mcptt.loc_type",
8605
15
            FT_UINT8, BASE_DEC, VALS(rtcp_mcptt_loc_type_vals), 0x0,
8606
15
            NULL, HFILL }
8607
15
        },
8608
15
        { &hf_rtcp_mcptt_cellid,
8609
15
         {"CellId", "rtcp.app_data.mcptt.cellid",
8610
15
          FT_UINT32, BASE_DEC, NULL, 0xFF,
8611
15
          NULL, HFILL}
8612
15
        },
8613
15
        { &hf_rtcp_mcptt_enodebid,
8614
15
         { "eNodeB Id", "rtcp.app_data.mcptt.enodebid",
8615
15
          FT_UINT32, BASE_DEC, NULL, 0x0FFFFF00,
8616
15
          NULL, HFILL }
8617
15
        },
8618
15
        { &hf_rtcp_mcptt_ecgi_eci,
8619
15
         {"ECI (E-UTRAN Cell Identifier)", "rtcp.app_data.mcptt.ecgi_eci",
8620
15
          FT_UINT32, BASE_DEC, NULL, 0x0,
8621
15
          NULL, HFILL}
8622
15
        },
8623
15
        { &hf_rtcp_mcptt_tac,
8624
15
            { "Tracking Area Code", "rtcp.app_data.mcptt.tac",
8625
15
            FT_UINT16, BASE_DEC, NULL, 0x0,
8626
15
            NULL, HFILL }
8627
15
        },
8628
15
        { &hf_rtcp_mcptt_mbms_serv_area,
8629
15
            { "MBMS Service Area", "rtcp.app_data.mcptt.mbms_serv_area",
8630
15
            FT_UINT16, BASE_DEC, NULL, 0x0,
8631
15
            NULL, HFILL }
8632
15
        },
8633
15
        { &hf_rtcp_mcptt_mbsfn_area_id,
8634
15
            { "MBSFN Area ID", "rtcp.app_data.mcptt.mbsfn_area_id",
8635
15
            FT_UINT8, BASE_DEC, NULL, 0x0,
8636
15
            NULL, HFILL }
8637
15
        },
8638
15
        { &hf_rtcp_mcptt_lat,
8639
15
            { "Latitude value", "rtcp.app_data.mcptt.lat",
8640
15
            FT_INT24, BASE_DEC, NULL, 0x0,
8641
15
            NULL, HFILL }
8642
15
        },
8643
15
        { &hf_rtcp_mcptt_long,
8644
15
            { "Longitude value", "rtcp.app_data.mcptt.long",
8645
15
            FT_INT24, BASE_DEC, NULL, 0x0,
8646
15
            NULL, HFILL }
8647
15
        },
8648
15
        { &hf_rtcp_mcptt_msg_type,
8649
15
            { "Message Type", "rtcp.app_data.mcptt.msg_type",
8650
15
            FT_UINT8, BASE_DEC, VALS(rtcp_mcpt_subtype_vals), 0x0,
8651
15
            NULL, HFILL }
8652
15
        },
8653
15
        { &hf_rtcp_mcptt_num_loc,
8654
15
            { "Number of Locations", "rtcp.app_data.mcptt.num_loc",
8655
15
            FT_UINT8, BASE_DEC, NULL, 0x0,
8656
15
            NULL, HFILL }
8657
15
        },
8658
15
        { &hf_rtcp_mcptt_floor_ind,
8659
15
            { "Floor Indication", "rtcp.app_data.mcptt.floor_ind",
8660
15
            FT_UINT16, BASE_HEX, NULL, 0x0,
8661
15
            NULL, HFILL }
8662
15
        },
8663
15
        { &hf_rtcp_mccp_len,
8664
15
            { "Length", "rtcp.app_data.mccp.len",
8665
15
            FT_UINT8, BASE_DEC, NULL, 0x0,
8666
15
            NULL, HFILL }
8667
15
        },
8668
15
        { &hf_rtcp_mccp_field_id,
8669
15
            { "Field id", "rtcp.app_data.mccp.field_id",
8670
15
            FT_UINT8, BASE_DEC, VALS(rtcp_mccp_field_id_vals), 0x0,
8671
15
            NULL, HFILL }
8672
15
        },
8673
15
        { &hf_rtcp_mcptt_group_id,
8674
15
            { "MCPTT Group Identity", "rtcp.app_data.mccp.mcptt_grp_id",
8675
15
            FT_STRING, BASE_NONE, NULL, 0x0,
8676
15
            NULL, HFILL }
8677
15
        },
8678
15
        { &hf_rtcp_mccp_audio_m_line_no,
8679
15
            { "Audio m-line Number", "rtcp.app_data.mccp.audio_m_line_no",
8680
15
            FT_UINT8, BASE_DEC, NULL, 0xf0,
8681
15
            NULL, HFILL }
8682
15
        },
8683
15
        { &hf_rtcp_mccp_floor_m_line_no,
8684
15
            { "Floor m-line Number", "rtcp.app_data.mccp.floor_m_line_no",
8685
15
            FT_UINT8, BASE_DEC, NULL, 0x0f,
8686
15
            NULL, HFILL }
8687
15
        },
8688
15
        { &hf_rtcp_mccp_ip_version,
8689
15
            { "IP version", "rtcp.app_data.mccp.ip_version",
8690
15
            FT_UINT8, BASE_DEC, NULL, 0xf0,
8691
15
            NULL, HFILL }
8692
15
        },
8693
15
        { &hf_rtcp_mccp_floor_port_no,
8694
15
            { "Floor Port Number", "rtcp.app_data.mccp.floor_port_no",
8695
15
            FT_UINT32, BASE_DEC, NULL, 0x0,
8696
15
            NULL, HFILL }
8697
15
        },
8698
15
        { &hf_rtcp_mccp_media_port_no,
8699
15
            { "Media Port Number", "rtcp.app_data.mccp.media_port_no",
8700
15
            FT_UINT32, BASE_DEC, NULL, 0x0,
8701
15
            NULL, HFILL }
8702
15
        },
8703
15
        { &hf_rtcp_mccp_ipv4,
8704
15
            { "IP Address", "rtcp.app_data.mccp.ipv4",
8705
15
            FT_IPv4, BASE_NONE, NULL, 0x0,
8706
15
            NULL, HFILL }
8707
15
        },
8708
15
        { &hf_rtcp_mccp_ipv6,
8709
15
            { "IP Address", "rtcp.app_data.mccp.ipv6",
8710
15
            FT_IPv6, BASE_NONE, NULL, 0x0,
8711
15
            NULL, HFILL }
8712
15
        },
8713
15
        { &hf_rtcp_mccp_tmgi,
8714
15
            { "TMGI", "rtcp.app_data.mccp.tmgi",
8715
15
            FT_BYTES, BASE_NONE, NULL, 0x0,
8716
15
            NULL, HFILL }
8717
15
        },
8718
15
        { &hf_rtcp_encrypted,
8719
15
            { "Encrypted data", "rtcp.encrypted",
8720
15
            FT_BYTES, BASE_NONE, NULL, 0x0,
8721
15
            NULL, HFILL }
8722
15
        },
8723
15
        {&hf_rtcp_mcpc_fld_id,
8724
15
            { "Field Id", "rtcp.mcpc.fld_id",
8725
15
            FT_UINT32, BASE_DEC, VALS(rtcp_mcpc_field_id_vals), 0x0,
8726
15
            NULL, HFILL }
8727
15
        },
8728
15
        {&hf_rtcp_mcpc_fld_len,
8729
15
            { "Length", "rtcp.mcpc.fld_len",
8730
15
            FT_UINT32, BASE_DEC, NULL, 0x0,
8731
15
            NULL, HFILL }
8732
15
        },
8733
15
        { &hf_rtcp_mcpc_fld_val,
8734
15
            { "Field value", "rtcp.mcpc.fld_val",
8735
15
            FT_BYTES, BASE_NONE, NULL, 0x0,
8736
15
            NULL, HFILL }
8737
15
        },
8738
15
        { &hf_rtcp_mcpc_media_streams,
8739
15
            { "Media streams", "rtcp.mcpc.media_streams",
8740
15
            FT_UINT8, BASE_DEC, NULL, 0x0,
8741
15
            NULL, HFILL }
8742
15
        },
8743
15
        { &hf_rtcp_mcpc_ctrl_channel,
8744
15
            { "Control channel", "rtcp.mcpc.ctrl_channel",
8745
15
            FT_UINT8, BASE_DEC, NULL, 0x0,
8746
15
            NULL, HFILL }
8747
15
        },
8748
15
        { &hf_rtcp_mcpc_mcptt_session_type,
8749
15
            { "MCPTT session type", "rtcp.mcpc.mcptt_session_type",
8750
15
            FT_UINT8, BASE_DEC, VALS(mcpc_session_type), 0x0,
8751
15
            NULL, HFILL }
8752
15
        },
8753
15
        { &hf_rtcp_mcpc_mcptt_session_id,
8754
15
            { "MCPTT session identification", "rtcp.mcpc.mcptt_session_id",
8755
15
            FT_STRING, BASE_NONE, NULL, 0x0,
8756
15
            NULL, HFILL }
8757
15
        },
8758
15
        { &hf_rtcp_mcpc_warning,
8759
15
            { "Warning", "rtcp.mcpc.warning",
8760
15
            FT_STRING, BASE_NONE, NULL, 0x0,
8761
15
            NULL, HFILL }
8762
15
        },
8763
15
        { &hf_rtcp_mcpc_mcptt_group_id,
8764
15
            { "MCPTT group identification", "rtcp.mcpc.mcptt_group_id",
8765
15
            FT_STRING, BASE_NONE, NULL, 0x0,
8766
15
            NULL, HFILL }
8767
15
        },
8768
15
        { &hf_rtcp_mcpc_answer_state,
8769
15
            { "Answer state", "rtcp.mcpc.answer_state",
8770
15
            FT_UINT16, BASE_NONE, VALS(mcpc_answer_state), 0x0,
8771
15
            NULL, HFILL }
8772
15
        },
8773
15
        { &hf_rtcp_mcpc_mcptt_user_id,
8774
15
            { "MCPTT user identification", "rtcp.mcpc.mcptt_user_id",
8775
15
            FT_STRING, BASE_NONE, NULL, 0x0,
8776
15
            NULL, HFILL }
8777
15
        },
8778
15
        { &hf_rtcp_mcpc_reason_code,
8779
15
            { "Reason code", "rtcp.mcpc.reason_code",
8780
15
            FT_UINT16, BASE_NONE, VALS(rtcp_mcpc_reason_code_vals), 0x0,
8781
15
            NULL, HFILL }
8782
15
        },
8783
15
        { &hf_rtcp_mcpc_reason_cause,
8784
15
            { "Reason cause", "rtcp.mcpc.reason_cause",
8785
15
            FT_UINT16, BASE_NONE, VALS(rtcp_mcpc_reason_cause_vals), 0x0,
8786
15
            NULL, HFILL }
8787
15
        },
8788
15
        { &hf_rtcp_mcpc_invited_mcptt_user_id,
8789
15
            { "MCPTT invited user identification", "rtcp.mcpc.invited_mcptt_user_id",
8790
15
            FT_STRING, BASE_NONE, NULL, 0x0,
8791
15
            NULL, HFILL }
8792
15
        },
8793
15
        { &hf_rtcp_mcpc_pck_imessage,
8794
15
            { "PCK I_MESSAGE", "rtcp.mcpc.pck_imessage",
8795
15
            FT_BYTES, BASE_NONE, NULL, 0x0,
8796
15
            NULL, HFILL }
8797
15
        },
8798
15
    };
8799
8800
15
    static int *ett[] =
8801
15
    {
8802
15
        &ett_rtcp,
8803
15
        &ett_rtcp_sr,
8804
15
        &ett_rtcp_rr,
8805
15
        &ett_rtcp_sdes,
8806
15
        &ett_rtcp_bye,
8807
15
        &ett_rtcp_app,
8808
15
        &ett_rtcp_rtpfb,
8809
15
        &ett_rtcp_rtpfb_ccfb_fci,
8810
15
        &ett_rtcp_rtpfb_ccfb_media_source,
8811
15
        &ett_rtcp_rtpfb_ccfb_metric_blocks,
8812
15
        &ett_rtcp_rtpfb_ccfb_metric_block,
8813
15
        &ett_rtcp_psfb,
8814
15
        &ett_rtcp_xr,
8815
15
        &ett_rtcp_fir,
8816
15
        &ett_rtcp_nack,
8817
15
        &ett_ssrc,
8818
15
        &ett_ssrc_item,
8819
15
        &ett_ssrc_ext_high,
8820
15
        &ett_sdes,
8821
15
        &ett_sdes_item,
8822
15
        &ett_PoC1,
8823
15
        &ett_mux,
8824
15
        &ett_rtcp_setup,
8825
15
        &ett_rtcp_roundtrip_delay,
8826
15
        &ett_xr_block,
8827
15
        &ett_xr_block_contents,
8828
15
        &ett_xr_ssrc,
8829
15
        &ett_xr_loss_chunk,
8830
15
        &ett_poc1_conn_contents,
8831
15
        &ett_rtcp_nack_blp,
8832
15
        &ett_pse,
8833
15
        &ett_ms_vsr,
8834
15
        &ett_ms_vsr_entry,
8835
15
        &ett_ms_ds,
8836
15
        &ett_rtcp_mcpt,
8837
15
        &ett_rtcp_mcptt_participant_ref,
8838
15
        &ett_rtcp_mcptt_eci,
8839
15
        &ett_rtcp_mcptt_floor_ind,
8840
15
        &ett_rtcp_mccp_tmgi,
8841
15
        &ett_rtcp_mcpc
8842
15
    };
8843
8844
15
    static ei_register_info ei[] = {
8845
15
        { &ei_rtcp_not_final_padding, { "rtcp.not_final_padding", PI_PROTOCOL, PI_WARN, "Padding flag set on not final packet (see RFC3550, section 6.4.1)", EXPFILL }},
8846
15
        { &ei_rtcp_bye_reason_not_padded, { "rtcp.bye_reason_not_padded", PI_MALFORMED, PI_WARN, "Reason string is not NULL padded (see RFC3550, section 6.6)", EXPFILL }},
8847
15
        { &ei_rtcp_xr_block_length_bad, { "rtcp.invalid_block_length", PI_PROTOCOL, PI_WARN, "Invalid block length, should be 2", EXPFILL }},
8848
15
        { &ei_rtcp_roundtrip_delay, { "rtcp.roundtrip-delay.expert", PI_SEQUENCE, PI_NOTE, "RTCP round-trip delay detected", EXPFILL }},
8849
15
        { &ei_rtcp_roundtrip_delay_negative, { "rtcp.roundtrip-delay.negative", PI_SEQUENCE, PI_ERROR, "Negative RTCP round-trip delay detected", EXPFILL }},
8850
15
        { &ei_rtcp_length_check, { "rtcp.length_check.bad", PI_MALFORMED, PI_WARN, "Incorrect RTCP packet length information", EXPFILL }},
8851
15
        { &ei_rtcp_psfb_ms_type, { "rtcp.psfb.ms.afb_type.unknown", PI_PROTOCOL, PI_WARN, "Unknown Application Layer Feedback Type", EXPFILL }},
8852
15
        { &ei_rtcp_missing_sender_ssrc, { "rtcp.missing_sender_ssrc", PI_PROTOCOL, PI_WARN, "Missing Sender SSRC", EXPFILL }},
8853
15
        { &ei_rtcp_missing_block_header, { "rtcp.missing_block_header", PI_PROTOCOL, PI_WARN, "Missing Required Block Headers", EXPFILL }},
8854
15
        { &ei_rtcp_block_length, { "rtcp.block_length.invalid", PI_PROTOCOL, PI_WARN, "Block length is greater than packet length", EXPFILL }},
8855
15
        { &ei_srtcp_encrypted_payload, { "srtcp.encrypted_payload", PI_UNDECODED, PI_WARN, "Encrypted RTCP Payload - not dissected", EXPFILL }},
8856
15
        { &ei_rtcp_rtpfb_transportcc_bad, { "rtcp.rtpfb.transportcc_bad", PI_MALFORMED, PI_WARN, "Too many packet chunks (more than packet status count)", EXPFILL }},
8857
15
        { &ei_rtcp_rtpfb_fmt_not_implemented, { "rtcp.rtpfb.fmt_not_implemented", PI_UNDECODED, PI_WARN, "RTPFB FMT not dissected, contact Wireshark developers if you want this to be supported", EXPFILL }},
8858
15
        { &ei_rtcp_rtpfb_ccfb_too_many_reports, { "rtcp.mcptt.ccfb.invalid_pkt", PI_UNDECODED, PI_WARN, "RTPFB CCFB report block must not include more than 2^14 metric blocks", EXPFILL }},
8859
15
        { &ei_rtcp_mcptt_unknown_fld, { "rtcp.mcptt.unknown_fld", PI_PROTOCOL, PI_WARN, "Unknown MCPTT field", EXPFILL }},
8860
15
        { &ei_rtcp_mcptt_location_type, { "rtcp.mcptt.location_type_uk", PI_PROTOCOL, PI_WARN, "Unknown location type", EXPFILL }},
8861
15
        { &ei_rtcp_appl_extra_bytes, { "rtcp.appl.extra_bytes", PI_PROTOCOL, PI_ERROR, "Extra bytes detected", EXPFILL }},
8862
15
        { &ei_rtcp_appl_not_ascii, { "rtcp.appl.not_ascii", PI_PROTOCOL, PI_ERROR, "Application name is not a string", EXPFILL }},
8863
15
        { &ei_rtcp_appl_non_conformant, { "rtcp.appl.non_conformant", PI_PROTOCOL, PI_ERROR, "Data not according to standards", EXPFILL }},
8864
15
        { &ei_rtcp_appl_non_zero_pad, { "rtcp.appl.non_zero_pad", PI_PROTOCOL, PI_ERROR, "Non zero padding detected, faulty encoding?", EXPFILL }},
8865
15
        { &ei_rtcp_sdes_missing_null_terminator, { "rtcp.sdes.missing_null_terminator", PI_PROTOCOL, PI_WARN, "The list of items in each chunk MUST be terminated by one or more null octets (see RFC3550, section 6.5)", EXPFILL }},
8866
15
        { &ei_rtcp_mcpc_unknown_fld, { "rtcp.mcpc.unknown_fld", PI_PROTOCOL, PI_WARN, "Unknown MCPC field", EXPFILL }},
8867
15
    };
8868
8869
15
    module_t *rtcp_module, *srtcp_module;
8870
15
    expert_module_t* expert_rtcp;
8871
8872
15
    proto_rtcp = proto_register_protocol("Real-time Transport Control Protocol", "RTCP", "rtcp");
8873
15
    proto_srtcp = proto_register_protocol("Secure Real-time Transport Control Protocol", "SRTCP", "srtcp");
8874
15
    proto_register_field_array(proto_rtcp, hf, array_length(hf));
8875
15
    proto_register_subtree_array(ett, array_length(ett));
8876
15
    expert_rtcp = expert_register_protocol(proto_rtcp);
8877
15
    expert_register_field_array(expert_rtcp, ei, array_length(ei));
8878
8879
15
    rtcp_handle = register_dissector("rtcp", dissect_rtcp, proto_rtcp);
8880
15
    srtcp_handle = register_dissector("srtcp", dissect_srtcp, proto_srtcp);
8881
8882
15
    rtcp_module = prefs_register_protocol(proto_rtcp, NULL);
8883
15
    srtcp_module = prefs_register_protocol(proto_srtcp, NULL);
8884
8885
15
    prefs_register_enum_preference(rtcp_module, "default_protocol",
8886
15
        "Default protocol",
8887
15
        "The default protocol assumed by the heuristic dissector, "
8888
15
        "which does not easily distinguish between RTCP and SRTCP.",
8889
15
        &global_rtcp_default_protocol,
8890
15
        rtcp_default_protocol_vals,
8891
15
        false);
8892
8893
15
    prefs_register_bool_preference(rtcp_module, "show_setup_info",
8894
15
        "Show stream setup information",
8895
15
        "Where available, show which protocol and frame caused "
8896
15
        "this RTCP stream to be created",
8897
15
        &global_rtcp_show_setup_info);
8898
8899
15
    prefs_register_obsolete_preference(rtcp_module, "heuristic_rtcp");
8900
8901
15
    prefs_register_bool_preference(rtcp_module, "show_roundtrip_calculation",
8902
15
        "Show relative roundtrip calculations",
8903
15
        "Try to work out network delay by comparing time between packets "
8904
15
        "as captured and delays as seen by endpoint",
8905
15
        &global_rtcp_show_roundtrip_calculation);
8906
8907
15
    prefs_register_uint_preference(rtcp_module, "roundtrip_min_threshhold",
8908
15
        "Minimum roundtrip calculation to report (ms)",
8909
15
        "Minimum (absolute) calculated roundtrip delay time in milliseconds that "
8910
15
        "should be reported",
8911
15
        10, &global_rtcp_show_roundtrip_calculation_minimum);
8912
8913
    /* To get the subtype decoded for SRTP packets */
8914
15
    prefs_register_enum_preference(srtcp_module, "decode_application_subtype",
8915
15
        "Decode Application subtype as",
8916
15
        "Decode the subtype as this application",
8917
15
        &preferences_application_specific_encoding, rtcp_application_specific_encoding_vals, false);
8918
8919
    /* Register table for sub-dissectors */
8920
15
    rtcp_dissector_table = register_dissector_table("rtcp.app.name", "RTCP Application Name", proto_rtcp, FT_STRING, STRING_CASE_SENSITIVE);
8921
15
    rtcp_psfb_dissector_table = register_dissector_table("rtcp.psfb.fmt", "RTCP Payload Specific Feedback Message Format", proto_rtcp, FT_UINT8, BASE_DEC);
8922
15
    rtcp_rtpfb_dissector_table = register_dissector_table("rtcp.rtpfb.fmt", "RTCP Generic RTP Feedback Message Format", proto_rtcp, FT_UINT8, BASE_DEC);
8923
15
    rtcp_pse_dissector_table = register_dissector_table("rtcp.pse", "RTCP Profile Specific Extension", proto_rtcp, FT_UINT16, BASE_DEC);
8924
8925
15
    proto_rtcp_ms_pse = proto_register_protocol_in_name_only("Microsoft RTCP Profile Specific Extensions", "MS-RTP PSE", "rtcp_ms_pse", proto_rtcp, FT_BYTES);
8926
15
    register_subdissectors_for_rtcp_rtpfb_dissector_table();
8927
8928
15
    ms_pse_handle = register_dissector("rtcp_ms_pse", dissect_ms_profile_specific_extensions, proto_rtcp_ms_pse);
8929
15
}
8930
8931
void
8932
proto_reg_handoff_rtcp(void)
8933
15
{
8934
    /*
8935
     * Register this dissector as one that can be selected by a
8936
     * UDP port number.
8937
     */
8938
15
    dissector_add_for_decode_as_with_preference("udp.port", rtcp_handle);
8939
15
    dissector_add_for_decode_as("flip.payload", rtcp_handle );
8940
15
    dissector_add_for_decode_as_with_preference("udp.port", srtcp_handle);
8941
8942
195
    for (int idx = 0; rtcp_ms_profile_extension_vals[idx].strptr != NULL; idx++) {
8943
180
        dissector_add_uint("rtcp.pse", rtcp_ms_profile_extension_vals[idx].value, ms_pse_handle);
8944
180
    }
8945
8946
15
    add_entries_for_rtcp_rtpfb_dissector_table();
8947
8948
15
    heur_dissector_add( "udp", dissect_rtcp_heur, "RTCP over UDP", "rtcp_udp", proto_rtcp, HEURISTIC_ENABLE);
8949
15
    heur_dissector_add("stun", dissect_rtcp_heur, "RTCP over TURN", "rtcp_stun", proto_rtcp, HEURISTIC_ENABLE);
8950
15
}
8951
8952
/*
8953
 * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
8954
 *
8955
 * Local variables:
8956
 * c-basic-offset: 4
8957
 * tab-width: 8
8958
 * indent-tabs-mode: nil
8959
 * End:
8960
 *
8961
 * vi: set shiftwidth=4 tabstop=8 expandtab:
8962
 * :indentSize=4:tabSize=8:noTabs=true:
8963
 */