/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 | | */ |