1 /* packet-rtp-ed137.c
2 *
3 * Routines for RTP ED-137 extensions dissection
4 * RTP = Real time Transport Protocol
5 *
6 * Copyright 2000, Philips Electronics N.V.
7 * Written by Andreas Sikkema <h323@ramdyne.nl>
8 *
9 * Wireshark - Network traffic analyzer
10 * By Gerald Combs <gerald@wireshark.org>
11 * Copyright 1998 Gerald Combs
12 *
13 * SPDX-License-Identifier: GPL-2.0-or-later
14 */
15
16 /*
17 * This dissector tries to dissect the RTP extension headers by ED-137, ED-137A, ED-137B and ED-137C specification
18 * of EUROCAE (The European Organisation for Civil Aviation Equipment)
19 *
20 * There are two packet header extension signatures. One for ED-137 and second ED-137A and later releases. Even some extensions are same in ED-137 and ED-137A, constants and code are duplicated because there are slight differences between standard release.
21 * ED-137A and later standards share some extensions (e. g. SQI is defined in ED-137A and repeated without change in ED-137B and C). Naming convention use first standard release where extension was introduced (ED-137A in SQI case).
22 *
23 * Each ED-137 header extension consists of fixed part and variable part (called "extension for additional features" in standard). The code decodes fixed part and some variable part headers. The code decode only additional headers we seen (we have samples) even standard defines more of it.
24 * To allow other developers and vendors to introduce custom decoders, there are dissector tables rtp.hdr_ext.ed137 and rtp.hdr_ext.ed137a which registers dissector for each "additional feature" header by type/length key. It allows anyone extending decoding capabilites just by adding plugin and register dissector in the table - without modifying this source.
25 * rtp.hdr_ext.ed137 table is used for ED-137 standard release. rtp.hdr_ext.ed137a table is used for ED-137A and later standard releases.
26 */
27
28
29 #include "config.h"
30
31 #include <epan/packet.h>
32 #include <epan/to_str.h>
33
34 #include "packet-rtp.h"
35
36 static int proto_rtp_ed137 = -1;
37
38 static dissector_handle_t rtp_hdr_ext_ed137_handle;
39 static dissector_handle_t rtp_hdr_ext_ed137a_handle;
40 static dissector_handle_t rtp_hdr_ext_ed137a_feature_sqi_handle;
41 static dissector_handle_t rtp_hdr_ext_ed137a_feature_climax_tdly_handle;
42 static dissector_handle_t rtp_hdr_ext_ed137b_feature_rrc_single_handle;
43 static dissector_handle_t rtp_hdr_ext_ed137b_feature_climax_ddc_rmm_handle;
44 static dissector_handle_t rtp_hdr_ext_ed137b_feature_climax_ddc_mam_handle;
45 static dissector_handle_t rtp_hdr_ext_ed137c_feature_climax_ddc_mam_handle;
46
47 static dissector_table_t rtp_hdr_ext_ed137a_add_features_table;
48
49 /* RTP header ED-137 extension fields */
50 static int hf_rtp_hdr_ed137s = -1;
51 static int hf_rtp_hdr_ed137 = -1;
52 static int hf_rtp_hdr_ed137_add = -1;
53 static int hf_rtp_hdr_ed137_ptt_type = -1;
54 static int hf_rtp_hdr_ed137_squ = -1;
55 static int hf_rtp_hdr_ed137_ptt_id = -1;
56 static int hf_rtp_hdr_ed137_sct = -1;
57 static int hf_rtp_hdr_ed137_x = -1;
58 static int hf_rtp_hdr_ed137_x_nu = -1;
59 static int hf_rtp_hdr_ed137_ft_type = -1;
60 static int hf_rtp_hdr_ed137_ft_len = -1;
61 static int hf_rtp_hdr_ed137_ft_value = -1;
62 static int hf_rtp_hdr_ed137_ft_bss_qidx = -1;
63 static int hf_rtp_hdr_ed137_ft_bss_rssi_qidx = -1;
64 static int hf_rtp_hdr_ed137_ft_bss_qidx_ml = -1;
65 static int hf_rtp_hdr_ed137_vf = -1;
66 static int hf_rtp_hdr_ed137_ft_climax_delay_value = -1;
67
68 /* RTP header ED-137A extension fields */
69 static int hf_rtp_hdr_ed137a = -1;
70 static int hf_rtp_hdr_ed137a_add = -1;
71 static int hf_rtp_hdr_ed137a_ptt_type = -1;
72 static int hf_rtp_hdr_ed137a_squ = -1;
73 static int hf_rtp_hdr_ed137a_ptt_id = -1;
74 static int hf_rtp_hdr_ed137a_pm = -1;
75 static int hf_rtp_hdr_ed137a_ptts = -1;
76 static int hf_rtp_hdr_ed137a_sct = -1;
77 static int hf_rtp_hdr_ed137a_reserved = -1;
78 static int hf_rtp_hdr_ed137a_x = -1;
79 static int hf_rtp_hdr_ed137a_x_nu = -1;
80 static int hf_rtp_hdr_ed137a_ft_type = -1;
81 static int hf_rtp_hdr_ed137a_ft_len = -1;
82 static int hf_rtp_hdr_ed137a_ft_value = -1;
83 static int hf_rtp_hdr_ed137a_ft_padding = -1;
84 static int hf_rtp_hdr_ed137a_ft_sqi_qidx = -1;
85 static int hf_rtp_hdr_ed137a_ft_sqi_rssi_qidx = -1;
86 static int hf_rtp_hdr_ed137a_ft_sqi_qidx_ml = -1;
87 static int hf_rtp_hdr_ed137a_ft_climax_delay_mode = -1;
88 static int hf_rtp_hdr_ed137a_ft_climax_delay_relative_value = -1;
89 static int hf_rtp_hdr_ed137a_ft_climax_delay_absolute_value = -1;
90
91 /* RTP header ED-137B extension fields */
92 static int hf_rtp_hdr_ed137b_ft_rrc_single = -1;
93 static int hf_rtp_hdr_ed137b_ft_rrc_single_ms_tx_f1 = -1;
94 static int hf_rtp_hdr_ed137b_ft_rrc_single_ms_rx_f1 = -1;
95 static int hf_rtp_hdr_ed137b_ft_rrc_single_ms_tx_f2 = -1;
96 static int hf_rtp_hdr_ed137b_ft_rrc_single_ms_rx_f2 = -1;
97 static int hf_rtp_hdr_ed137b_ft_rrc_single_sel_tx_f1 = -1;
98 static int hf_rtp_hdr_ed137b_ft_rrc_single_sel_tx_f2 = -1;
99 static int hf_rtp_hdr_ed137b_ft_rrc_single_mu_rx_f1 = -1;
100 static int hf_rtp_hdr_ed137b_ft_rrc_single_mu_rx_f2 = -1;
101 static int hf_rtp_hdr_ed137b_ft_climax_ddc_unknown = -1;
102 static int hf_rtp_hdr_ed137b_ft_climax_ddc_rmm = -1;
103 static int hf_rtp_hdr_ed137b_ft_climax_ddc_rmm_tqv = -1;
104 static int hf_rtp_hdr_ed137b_ft_climax_ddc_rmm_t1 = -1;
105 static int hf_rtp_hdr_ed137b_ft_climax_ddc_mam = -1;
106 static int hf_rtp_hdr_ed137b_ft_climax_ddc_mam_tqg = -1;
107 static int hf_rtp_hdr_ed137b_ft_climax_ddc_mam_t1 = -1;
108 static int hf_rtp_hdr_ed137b_ft_climax_ddc_mam_nmr = -1;
109 static int hf_rtp_hdr_ed137b_ft_climax_ddc_mam_t2 = -1;
110 static int hf_rtp_hdr_ed137b_ft_climax_ddc_mam_tsd = -1;
111 static int hf_rtp_hdr_ed137b_ft_climax_ddc_mam_tj1 = -1;
112 static int hf_rtp_hdr_ed137b_ft_climax_ddc_mam_tid = -1;
113
114 /* RTP header ED-137C extension fields */
115 static int hf_rtp_hdr_ed137c_ft_climax_ddc_mam = -1;
116 static int hf_rtp_hdr_ed137c_ft_climax_ddc_mam_tqg = -1;
117 static int hf_rtp_hdr_ed137c_ft_climax_ddc_mam_t1 = -1;
118 static int hf_rtp_hdr_ed137c_ft_climax_ddc_mam_nmr = -1;
119 static int hf_rtp_hdr_ed137c_ft_climax_ddc_mam_t2 = -1;
120 static int hf_rtp_hdr_ed137c_ft_climax_ddc_mam_tsd = -1;
121 static int hf_rtp_hdr_ed137c_ft_climax_ddc_mam_tj1 = -1;
122 static int hf_rtp_hdr_ed137c_ft_climax_ddc_mam_tid = -1;
123 static int hf_rtp_hdr_ed137c_ft_climax_ddc_mam_ts2 = -1;
124
125 static gint ett_hdr_ext_ed137s = -1;
126 static gint ett_hdr_ext_ed137 = -1;
127 static gint ett_hdr_ext_ed137_add = -1;
128 static gint ett_hdr_ext_ed137a = -1;
129 static gint ett_hdr_ext_ed137a_add = -1;
130
131 /* Forward declaration we need below */
132 void proto_register_rtp_ed137(void);
133 void proto_reg_handoff_rtp_ed137(void);
134
135 /* Combine 4 bits of type with 4 bits of length to 8 bit key */
136 #define MAKE_KEY(type, len) \
137 ( ( type & 0x0F ) << 4 | ( len & 0x0f ) )
138
139 /* ED-137 signature */
140 #define RTP_ED137_SIG 0x0067
141
142 /* ED-137A signature */
143 #define RTP_ED137A_SIG 0x0167
144
145 /* ED-137 PTT */
146 #define RTP_ED137_ptt_mask(octet) ((octet) & 0xE0000000)
147 #define RTP_ED137A_ptt_mask(octet) ((octet) & 0xE000)
148 #define RTP_ED137_squ_mask(octet) ((octet) & 0x10000000)
149 #define RTP_ED137A_squ_mask(octet) ((octet) & 0x1000)
150
151 /* ED-137 extended information */
152 #define RTP_ED137_extended_information(octet) ((octet) & 0x00400000)
153 #define RTP_ED137A_extended_information(octet) ((octet) & 0x0001)
154
155 /* ED-137 feature type */
156 #define RTP_ED137_feature_type(octet) (((octet) & 0x003C0000) >> 18)
157 #define RTP_ED137A_feature_type(octet) (((octet) & 0x0000F000) >> 12)
158
159 /* ED-137 feature length */
160 #define RTP_ED137_feature_length(octet) (((octet) & 0x0003C000) >> 14)
161 #define RTP_ED137A_feature_length(octet) (((octet) & 0x00000F00) >> 8)
162
163 /* ED-137 feature value */
164 #define RTP_ED137_feature_value(octet) (((octet) & 0x00003FFE) >> 1)
165 #define RTP_ED137A_feature_value(octet) (((octet) & 0x000000FF) >> 0)
166
167 /* ED_137 None constants */
168 #define RTP_ED137_feature_none_type 0x0
169
170 /* ED-137 BSS constants */
171 #define RTP_ED137_feature_bss_type 0x1
172 #define RTP_ED137_feature_bss_qidx(octet) (((octet) & 0x00003FC0) >> 6)
173 #define RTP_ED137_feature_bss_qidx_ml(octet) (((octet) & 0x00000038) >> 2)
174 #define RTP_ED137_feature_bss_qidx_ml_rssi 0
175 #define RTP_ED137_feature_bss_qidx_rssi_max 15
176
177 /* ED-137 CLIMAX-Time Delay */
178 #define RTP_ED137_feature_climax_ot_type 0x2
179 #define RTP_ED137_feature_climax_ot_value(octet) (((octet) & 0x00003F00) >> 8)
180
181 /* ED-137A SQI constants */
182 #define RTP_ED137A_feature_sqi_type 0x1
183 #define RTP_ED137A_feature_sqi_len 1
184 #define RTP_ED137A_feature_sqi_key MAKE_KEY( RTP_ED137A_feature_sqi_type, RTP_ED137A_feature_sqi_len )
185 #define RTP_ED137A_feature_sqi_qidx(octet) (((octet) & 0x000000F8) >> 3)
186 #define RTP_ED137A_feature_sqi_qidx_ml(octet) (((octet) & 0x00000007) >> 0)
187 #define RTP_ED137A_feature_sqi_qidx_ml_rssi 0
188 #define RTP_ED137A_feature_sqi_qidx_rssi_max 15
189
190 /* ED-137A CLIMAX-Time Delay */
191 #define RTP_ED137A_feature_climax_tdly_type 0x2
192 #define RTP_ED137A_feature_climax_tdly_len 1
193 #define RTP_ED137A_feature_climax_tdly_key MAKE_KEY( RTP_ED137A_feature_climax_tdly_type, RTP_ED137A_feature_climax_tdly_len )
194 #define RTP_ED137A_feature_climax_tdly_mode(octet) (((octet) & 0x00000080) >> 7)
195 #define RTP_ED137A_feature_climax_tdly_value(octet) (((octet) & 0x0000007F) >> 0)
196 #define RTP_ED137A_feature_climax_tdly_mode_relative 0
197 #define RTP_ED137A_feature_climax_tdly_mode_absolute 1
198
199 /* ED-137B RRC single */
200 #define RTP_ED137B_feature_rrc_single_type 0x3
201 #define RTP_ED137B_feature_rrc_single_len 1
202 #define RTP_ED137B_feature_rrc_single_key MAKE_KEY( RTP_ED137B_feature_rrc_single_type, RTP_ED137B_feature_rrc_single_len )
203
204 /* ED-137B CLIMAX dynamic delay compensation */
205 #define RTP_ED137B_feature_climax_ddc_type 0x4
206 #define RTP_ED137B_feature_climax_ddc_rmm_len 3
207 #define RTP_ED137B_feature_climax_ddc_mam_len 12
208 #define RTP_ED137B_feature_climax_ddc_rmm_key MAKE_KEY( RTP_ED137B_feature_climax_ddc_type, RTP_ED137B_feature_climax_ddc_rmm_len )
209 #define RTP_ED137B_feature_climax_ddc_mam_key MAKE_KEY( RTP_ED137B_feature_climax_ddc_type, RTP_ED137B_feature_climax_ddc_mam_len )
210 #define RTP_ED137B_feature_climax_ddc_rmm_tqv(octet) (((octet) & 0x00800000) >> 23)
211 #define RTP_ED137B_feature_climax_ddc_rmm_t1(octet) (((octet) & 0x007FFFFF) >> 0)
212 #define RTP_ED137B_feature_climax_ddc_mam_tqg(octet) (((octet) & 0x00800000) >> 23)
213 #define RTP_ED137B_feature_climax_ddc_mam_t1(octet) (((octet) & 0x007FFFFF) >> 0)
214 #define RTP_ED137B_feature_climax_ddc_mam_nmr(octet) (((octet) & 0x00800000) >> 23)
215 #define RTP_ED137B_feature_climax_ddc_mam_t2(octet) (((octet) & 0x007FFFFF) >> 0)
216 #define RTP_ED137B_feature_climax_ddc_mam_tsd(octet) (((octet) & 0xFFFF) >> 0)
217 #define RTP_ED137B_feature_climax_ddc_mam_tj1(octet) (((octet) & 0xFFFF) >> 0)
218 #define RTP_ED137B_feature_climax_ddc_mam_tid(octet) (((octet) & 0xFFFF) >> 0)
219 #define RTP_ED137B_feature_climax_ddc_rmm_tqv_relative 0
220 #define RTP_ED137B_feature_climax_ddc_rmm_tqv_absolute 1
221 #define RTP_ED137B_feature_climax_ddc_mam_tqg_relative 0
222 #define RTP_ED137B_feature_climax_ddc_mam_tqg_absolute 1
223
224 /* ED-137C CLIMAX dynamic delay compensation*/
225 #define RTP_ED137C_feature_climax_ddc_type 0x4
226 #define RTP_ED137C_feature_climax_ddc_mam_len 14
227 #define RTP_ED137C_feature_climax_ddc_mam_key MAKE_KEY( RTP_ED137C_feature_climax_ddc_type, RTP_ED137C_feature_climax_ddc_mam_len )
228 #define RTP_ED137C_feature_climax_ddc_rmm_tqv(octet) (((octet) & 0x00800000) >> 23)
229 #define RTP_ED137C_feature_climax_ddc_rmm_t1(octet) (((octet) & 0x007FFFFF) >> 0)
230 #define RTP_ED137C_feature_climax_ddc_mam_tqg(octet) (((octet) & 0x00800000) >> 23)
231 #define RTP_ED137C_feature_climax_ddc_mam_t1(octet) (((octet) & 0x007FFFFF) >> 0)
232 #define RTP_ED137C_feature_climax_ddc_mam_nmr(octet) (((octet) & 0x00800000) >> 23)
233 #define RTP_ED137C_feature_climax_ddc_mam_t2(octet) (((octet) & 0x007FFFFF) >> 0)
234 #define RTP_ED137C_feature_climax_ddc_mam_tsd(octet) (((octet) & 0xFFFF) >> 0)
235 #define RTP_ED137C_feature_climax_ddc_mam_tj1(octet) (((octet) & 0xFFFF) >> 0)
236 #define RTP_ED137C_feature_climax_ddc_mam_tid(octet) (((octet) & 0xFFFF) >> 0)
237 #define RTP_ED137C_feature_climax_ddc_mam_ts2(octet) (((octet) & 0xFFFF) >> 0)
238 #define RTP_ED137C_feature_climax_ddc_rmm_tqv_relative 0
239 #define RTP_ED137C_feature_climax_ddc_rmm_tqv_absolute 1
240 #define RTP_ED137C_feature_climax_ddc_mam_tqg_relative 0
241 #define RTP_ED137C_feature_climax_ddc_mam_tqg_absolute 1
242
243
244 static const value_string rtp_ext_ed137_ptt_type[] =
245 {
246 { 0x00, "PTT OFF" },
247 { 0x01, "Normal PTT ON" },
248 { 0x02, "Coupling PTT ON" },
249 { 0x03, "Priority PTT ON" },
250 { 0x04, "Emergency PTT ON" },
251 { 0x05, "Reserved" },
252 { 0x06, "Reserved" },
253 { 0x07, "Reserved" },
254 { 0, NULL },
255 };
256
257 static const value_string rtp_ext_ed137_squ[] =
258 {
259 { 0x00, "SQ OFF" },
260 { 0x01, "SQ ON" },
261 { 0, NULL },
262 };
263
264 static const value_string rtp_ext_ed137_ft_type[] =
265 {
266 { 0x0, "No features" },
267 { 0x1, "Best signal selection" },
268 { 0x2, "CLIMAX time delay" },
269 { 0x3, "Reserved" },
270 { 0x4, "Reserved" },
271 { 0x5, "Reserved" },
272 { 0x6, "Reserved" },
273 { 0x7, "Reserved" },
274 { 0x8, "Reserved" },
275 { 0x9, "Reserved" },
276 { 0xA, "Reserved" },
277 { 0xB, "Vendor reserved" },
278 { 0xC, "Vendor reserved" },
279 { 0xD, "Vendor reserved" },
280 { 0xE, "Vendor reserved" },
281 { 0xF, "Vendor reserved" },
282 { 0, NULL },
283 };
284
285 static const value_string rtp_ext_ed137_x[] =
286 {
287 { 0x00, "No extended information with additional features is used" },
288 { 0x01, "Extended information with additional features is used" },
289 { 0, NULL },
290 };
291
292 static const value_string rtp_ext_ed137_vf[] =
293 {
294 { 0x00, "VF OFF" },
295 { 0x01, "VF ON" },
296 { 0, NULL },
297 };
298
299 static const value_string rtp_ext_ed137_ft_bss_rssi_qidx[] =
300 {
301 { 0x00, "lower than -100.00 dBm" },
302 { 0x01, "lower than or equal to -97.86 dBm" },
303 { 0x02, "lower than or equal to -95.71 dBm" },
304 { 0x03, "lower than or equal to -93.57 dBm" },
305 { 0x04, "lower than or equal to -91.43 dBm" },
306 { 0x05, "lower than or equal to -89.29 dBm" },
307 { 0x06, "lower than or equal to -87.14 dBm" },
308 { 0x07, "lower than or equal to -85.00 dBm" },
309 { 0x08, "lower than or equal to -82.86 dBm" },
310 { 0x09, "lower than or equal to -80.71 dBm" },
311 { 0x0a, "lower than or equal to -78.57 dBm" },
312 { 0x0b, "lower than or equal to -76.43 dBm" },
313 { 0x0c, "lower than or equal to -74.29 dBm" },
314 { 0x0d, "lower than or equal to -72.14 dBm" },
315 { 0x0e, "lower than or equal to -70.00 dBm" },
316 { 0x0f, "higher than -70.00 dBm" },
317 { 0, NULL },
318 };
319
320 static const value_string rtp_ext_ed137_ft_bss_qidx_ml[] =
321 {
322 { 0x00, "RSSI" },
323 { 0x01, "AGC Level" },
324 { 0x02, "C/N" },
325 { 0x03, "Standardized PSD" },
326 { 0x04, "Vendor specific method" },
327 { 0x05, "Vendor specific method" },
328 { 0x06, "Vendor specific method" },
329 { 0x07, "Vendor specific method" },
330 { 0, NULL },
331 };
332
333 static const value_string rtp_ext_ed137a_ptt_type[] =
334 {
335 { 0x00, "PTT OFF" },
336 { 0x01, "Normal PTT ON" },
337 { 0x02, "Coupling PTT ON" },
338 { 0x03, "Priority PTT ON" },
339 { 0x04, "Emergency PTT ON" },
340 { 0x05, "Test PTT ON" },
341 { 0x06, "Reserved" },
342 { 0x07, "Reserved" },
343 { 0, NULL },
344 };
345
346 static const value_string rtp_ext_ed137a_squ[] =
347 {
348 { 0x00, "SQ OFF" },
349 { 0x01, "SQ ON" },
350 { 0, NULL },
351 };
352
353 static const value_string rtp_ext_ed137a_ft_type[] =
354 {
355 { 0x0, "No features" },
356 { 0x1, "Signal Quality Information" },
357 { 0x2, "CLIMAX time delay" },
358 { 0x3, "Radio remote control" },
359 { 0x4, "CLIMAX dynamic delay compensation" },
360 { 0x5, "Reserved" },
361 { 0x6, "Reserved" },
362 { 0x7, "Reserved" },
363 { 0x8, "Reserved" },
364 { 0x9, "Reserved" },
365 { 0xA, "Reserved" },
366 { 0xB, "Vendor reserved" },
367 { 0xC, "Vendor reserved" },
368 { 0xD, "Vendor reserved" },
369 { 0xE, "Vendor reserved" },
370 { 0xF, "Vendor reserved" },
371 { 0, NULL },
372 };
373
374 static const value_string rtp_ext_ed137a_ft_sqi_rssi_qidx[] =
375 {
376 { 0x00, "lower than -100.00 dBm" },
377 { 0x01, "lower than or equal to -97.86 dBm" },
378 { 0x02, "lower than or equal to -95.71 dBm" },
379 { 0x03, "lower than or equal to -93.57 dBm" },
380 { 0x04, "lower than or equal to -91.43 dBm" },
381 { 0x05, "lower than or equal to -89.29 dBm" },
382 { 0x06, "lower than or equal to -87.14 dBm" },
383 { 0x07, "lower than or equal to -85.00 dBm" },
384 { 0x08, "lower than or equal to -82.86 dBm" },
385 { 0x09, "lower than or equal to -80.71 dBm" },
386 { 0x0a, "lower than or equal to -78.57 dBm" },
387 { 0x0b, "lower than or equal to -76.43 dBm" },
388 { 0x0c, "lower than or equal to -74.29 dBm" },
389 { 0x0d, "lower than or equal to -72.14 dBm" },
390 { 0x0e, "lower than or equal to -70.00 dBm" },
391 { 0x0f, "higher than -70.00 dBm" },
392 { 0, NULL },
393 };
394
395 static const value_string rtp_ext_ed137a_ft_sqi_qidx_ml[] =
396 {
397 { 0x00, "RSSI" },
398 { 0x01, "AGC Level" },
399 { 0x02, "C/N" },
400 { 0x03, "Standardized PSD" },
401 { 0x04, "Vendor specific method" },
402 { 0x05, "Vendor specific method" },
403 { 0x06, "Vendor specific method" },
404 { 0x07, "Vendor specific method" },
405 { 0, NULL },
406 };
407
408 static const value_string rtp_ext_ed137a_ft_climax_delay_mode[] =
409 {
410 { 0x00, "relative" },
411 { 0x01, "absolute" },
412 { 0, NULL },
413 };
414
415 static const value_string rtp_ext_ed137b_ft_single_ms_tx_f1[] =
416 {
417 { 0x00, "Main transmitter for F1 is used" },
418 { 0x01, "Standby transmitter for F1 is used" },
419 { 0, NULL },
420 };
421
422 static const value_string rtp_ext_ed137b_ft_single_ms_rx_f1[] =
423 {
424 { 0x00, "Main receiver for F1 is used" },
425 { 0x01, "Standby receiver for F1 is used" },
426 { 0, NULL },
427 };
428
429 static const value_string rtp_ext_ed137b_ft_single_ms_tx_f2[] =
430 {
431 { 0x00, "Main transmitter for F2 is used" },
432 { 0x01, "Standby transmitter for F2 is used" },
433 { 0, NULL },
434 };
435
436 static const value_string rtp_ext_ed137b_ft_single_ms_rx_f2[] =
437 {
438 { 0x00, "Main receiver for F2 is used" },
439 { 0x01, "Standby receiver for F2 is used" },
440 { 0, NULL },
441 };
442
443 static const value_string rtp_ext_ed137b_ft_single_sel_tx_f1[] =
444 {
445 { 0x00, "Active transmitter for F1 shall not be used" },
446 { 0x01, "Active transmitter for F1 shall be used" },
447 { 0, NULL },
448 };
449
450 static const value_string rtp_ext_ed137b_ft_single_sel_tx_f2[] =
451 {
452 { 0x00, "Active transmitter for F2 shall not be used" },
453 { 0x01, "Active transmitter for F2 shall be used" },
454 { 0, NULL },
455 };
456
457 static const value_string rtp_ext_ed137b_ft_single_mu_rx_f1[] =
458 {
459 { 0x00, "Active receiver for F1 shall be unmuted" },
460 { 0x01, "Active receiver for F1 shall be muted" },
461 { 0, NULL },
462 };
463
464 static const value_string rtp_ext_ed137b_ft_single_mu_rx_f2[] =
465 {
466 { 0x00, "Active receiver for F2 shall be unmuted" },
467 { 0x01, "Active receiver for F2 shall be muted" },
468 { 0, NULL },
469 };
470
471 static const value_string rtp_ext_ed137b_ft_climax_ddc_time_quality[] =
472 {
473 { 0x00, "Not synchronized" },
474 { 0x01, "Synchronized" },
475 { 0, NULL },
476 };
477
478 static const value_string rtp_ext_ed137b_ft_climax_ddc_mam_nmr[] =
479 {
480 { 0x00, "No request" },
481 { 0x01, "GRS requests a new RTT measurement" },
482 { 0, NULL },
483 };
484
485 static const value_string rtp_ext_ed137c_ft_climax_ddc_time_quality[] =
486 {
487 { 0x00, "Not synchronized" },
488 { 0x01, "Synchronized" },
489 { 0, NULL },
490 };
491
492 static const value_string rtp_ext_ed137c_ft_climax_ddc_mam_nmr[] =
493 {
494 { 0x00, "No request" },
495 { 0x01, "GRS requests a new RTT measurement" },
496 { 0, NULL },
497 };
498
499 /* We do not need to allocate/free strings */
500 static char *ed137_ptt_only = "PTT";
501 static char *ed137_squ_only = "SQU";
502 static char *ed137_ptt_and_squ = "PTT+SQU";
503
504 /* Note:
505 * Only seen/tested headers are decoded
506 */
507 static int
dissect_rtp_hdr_ext_ed137(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,void * data)508 dissect_rtp_hdr_ext_ed137(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
509 {
510 unsigned int hdr_extension_len;
511 struct _rtp_info *rtp_info=(struct _rtp_info *)data;
512 proto_tree *rtp_hext_tree = NULL;
513 unsigned int hdrext_offset = 0;
514 gboolean ed137_ptt = FALSE;
515 gboolean ed137_squ = FALSE;
516
517 hdr_extension_len = tvb_reported_length(tvb);
518
519 if ( hdr_extension_len > 0 ) {
520
521 if (rtp_info != NULL) {
522 rtp_info->info_is_ed137 = TRUE;
523 }
524 if ( tree ) {
525 proto_item *ti;
526 ti = proto_tree_add_item(tree, hf_rtp_hdr_ed137s, tvb, 0, hdr_extension_len, ENC_NA);
527 rtp_hext_tree = proto_item_add_subtree( ti, ett_hdr_ext_ed137s );
528 }
529
530 while ( hdr_extension_len > 0 ) {
531 proto_item *ti2;
532 proto_tree *rtp_hext_tree2;
533 proto_item *ti3;
534 proto_tree *rtp_hext_tree3;
535 unsigned int ft_type;
536 guint32 ext_value = tvb_get_ntohl( tvb, hdrext_offset );
537
538 if (RTP_ED137_ptt_mask(ext_value)) {
539 col_append_str(pinfo->cinfo, COL_INFO, ", PTT");
540 ed137_ptt = TRUE;
541 }
542 if (RTP_ED137_squ_mask(ext_value)) {
543 col_append_str(pinfo->cinfo, COL_INFO, ", SQU");
544 ed137_squ = TRUE;
545 }
546
547 /* Map PTT/SQU bits to string */
548 if (rtp_info != NULL) {
549 if (ed137_ptt) {
550 if (ed137_squ) {
551 rtp_info->info_ed137_info = ed137_ptt_and_squ;
552 } else {
553 rtp_info->info_ed137_info = ed137_ptt_only;
554 }
555 } else {
556 if (ed137_squ) {
557 rtp_info->info_ed137_info = ed137_squ_only;
558 } else {
559 rtp_info->info_ed137_info = NULL;
560 }
561 }
562 }
563
564 if ( rtp_hext_tree ) {
565 ti2 = proto_tree_add_item(rtp_hext_tree, hf_rtp_hdr_ed137, tvb, hdrext_offset, 4, ENC_NA);
566 rtp_hext_tree2 = proto_item_add_subtree( ti2, ett_hdr_ext_ed137 );
567
568 /* There are multiple formats of header - depends on direction of a flow. As it is not possible to quess flow direction, we use items from RTPRx because unused fields are empty in other formats */
569 proto_tree_add_item( rtp_hext_tree2, hf_rtp_hdr_ed137_ptt_type, tvb, hdrext_offset, 4, ENC_BIG_ENDIAN);
570 proto_tree_add_item( rtp_hext_tree2, hf_rtp_hdr_ed137_squ, tvb, hdrext_offset, 4, ENC_BIG_ENDIAN);
571 proto_tree_add_item( rtp_hext_tree2, hf_rtp_hdr_ed137_ptt_id, tvb, hdrext_offset, 4, ENC_BIG_ENDIAN);
572 proto_tree_add_item( rtp_hext_tree2, hf_rtp_hdr_ed137_sct, tvb, hdrext_offset, 4, ENC_BIG_ENDIAN);
573 proto_tree_add_item( rtp_hext_tree2, hf_rtp_hdr_ed137_x, tvb, hdrext_offset, 4, ENC_BIG_ENDIAN);
574 proto_tree_add_item( rtp_hext_tree2, hf_rtp_hdr_ed137_vf, tvb, hdrext_offset, 4, ENC_BIG_ENDIAN);
575 }
576
577 ft_type = RTP_ED137_feature_type(ext_value);
578
579 ti3 = proto_tree_add_item(rtp_hext_tree, hf_rtp_hdr_ed137_add, tvb, hdrext_offset, 4, ENC_NA);
580 rtp_hext_tree3 = proto_item_add_subtree( ti3, ett_hdr_ext_ed137_add );
581
582 if (RTP_ED137_extended_information(ext_value)) {
583 /* Extended information is used */
584
585 if ( rtp_hext_tree ) {
586 proto_tree_add_item( rtp_hext_tree3, hf_rtp_hdr_ed137_ft_type, tvb, hdrext_offset, 4, ENC_BIG_ENDIAN);
587 proto_tree_add_item( rtp_hext_tree3, hf_rtp_hdr_ed137_ft_len, tvb, hdrext_offset, 4, ENC_BIG_ENDIAN);
588 }
589
590 if ( rtp_hext_tree ) {
591 switch (ft_type) {
592 case RTP_ED137_feature_bss_type:
593 {
594 unsigned int bss_qidx;
595 unsigned int bss_qidx_ml;
596
597 bss_qidx = RTP_ED137_feature_bss_qidx(ext_value);
598 bss_qidx_ml = RTP_ED137_feature_bss_qidx_ml(ext_value);
599 if (RTP_ED137_feature_bss_qidx_ml_rssi == bss_qidx_ml) {
600 /* Special handling for RSSI method */
601 if (bss_qidx <= RTP_ED137_feature_bss_qidx_rssi_max) {
602 /* Correct range */
603 proto_tree_add_item( rtp_hext_tree3, hf_rtp_hdr_ed137_ft_bss_rssi_qidx, tvb, hdrext_offset, 4, ENC_BIG_ENDIAN);
604 }
605 else {
606 /* Handle as other method */
607 proto_tree_add_item( rtp_hext_tree3, hf_rtp_hdr_ed137_ft_bss_qidx, tvb, hdrext_offset, 4, ENC_BIG_ENDIAN);
608 }
609 }
610 else {
611 /* Other BSS method handling */
612 proto_tree_add_item( rtp_hext_tree3, hf_rtp_hdr_ed137_ft_bss_qidx, tvb, hdrext_offset, 4, ENC_BIG_ENDIAN);
613 }
614 proto_tree_add_item( rtp_hext_tree3, hf_rtp_hdr_ed137_ft_bss_qidx_ml, tvb, hdrext_offset, 4, ENC_BIG_ENDIAN);
615 break;
616 }
617 case RTP_ED137_feature_climax_ot_type:
618 {
619 unsigned int climax_ot_value;
620 unsigned int climax_ot_value_calc;
621
622 climax_ot_value = RTP_ED137_feature_climax_ot_value(ext_value);
623
624 /* Relative delay, in 2ms steps */
625 climax_ot_value_calc=2*climax_ot_value;
626 proto_tree_add_uint_format_value( rtp_hext_tree3, hf_rtp_hdr_ed137_ft_climax_delay_value, tvb, hdrext_offset, 4, climax_ot_value, "%d ms", climax_ot_value_calc);
627
628 break;
629 }
630 default:
631 proto_tree_add_item( rtp_hext_tree3, hf_rtp_hdr_ed137_ft_value, tvb, hdrext_offset, 4, ENC_NA);
632 break;
633 }
634 }
635
636 /* Shift behind header */
637 hdrext_offset += 4;
638 hdr_extension_len -= 4;
639 }
640 else {
641 /* Extended information is not used */
642 if ( rtp_hext_tree ) {
643 proto_tree_add_item( rtp_hext_tree3, hf_rtp_hdr_ed137_x_nu, tvb, hdrext_offset, 4, ENC_BIG_ENDIAN);
644 }
645
646 /* Shift behind empty additional feature header */
647 hdrext_offset += 4;
648 hdr_extension_len -= 4;
649 }
650 }
651 }
652 return tvb_captured_length(tvb);
653 }
654
655
656 #define NSTIME_INIT_USEC(nstime, usecs) \
657 nstime.secs = usecs / 1000000; \
658 nstime.nsecs = (usecs % 1000000) * 1000;
659
660 /* Decodes and calculates relative/absolute time item */
process_time_value(packet_info * pinfo,tvbuff_t * tvb,proto_tree * tree,int time_item,unsigned int hdrext_offset,gboolean time_relative _U_,unsigned int time_value)661 static void process_time_value(packet_info *pinfo, tvbuff_t *tvb, proto_tree *tree, int time_item, unsigned int hdrext_offset, gboolean time_relative _U_, unsigned int time_value)
662 {
663 /* Note: even there is relative/absolute flag, value is shown same way because it is relative value derived from relative/absolute start point */
664 unsigned int time_calc;
665 nstime_t tmp_time;
666 gchar *tmp;
667
668 /* Value is stored as count of 125 us ticks */
669 time_calc = time_value * 125;
670 NSTIME_INIT_USEC(tmp_time, time_calc);
671 tmp = rel_time_to_secs_str(pinfo->pool, &tmp_time);
672
673 proto_tree_add_uint_format_value( tree, time_item, tvb, hdrext_offset, 3, time_value, "%s s", tmp);
674 }
675
676 /* Decodes and calculates value based on 125us tick*/
process_125us_based_value(tvbuff_t * tvb,proto_tree * tree,int value_item,unsigned int hdrext_offset)677 static void process_125us_based_value(tvbuff_t *tvb, proto_tree *tree, int value_item, unsigned int hdrext_offset)
678 {
679 guint32 value;
680 guint32 value_calc;
681
682 /* Values is stored as count of 125 us ticks */
683 value = tvb_get_ntohs( tvb, hdrext_offset );
684 value_calc = value * 125;
685
686 proto_tree_add_uint_format_value( tree, value_item, tvb, hdrext_offset, 2, value, "%d us", value_calc);
687 }
688
689 static int
dissect_rtp_hdr_ext_ed137a_feature_sqi(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,void * data _U_)690 dissect_rtp_hdr_ext_ed137a_feature_sqi(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
691 {
692 guint32 ext_value;
693 guint32 sqi_qidx;
694 guint32 sqi_qidx_ml;
695
696 ext_value = tvb_get_guint8( tvb, 0 );
697 sqi_qidx = RTP_ED137A_feature_sqi_qidx(ext_value);
698 sqi_qidx_ml = RTP_ED137A_feature_sqi_qidx_ml(ext_value);
699 if (RTP_ED137A_feature_sqi_qidx_ml_rssi == sqi_qidx_ml) {
700 /* Special handling for RSSI method */
701 if (sqi_qidx <= RTP_ED137A_feature_sqi_qidx_rssi_max) {
702 /* Correct range */
703 proto_tree_add_item( tree, hf_rtp_hdr_ed137a_ft_sqi_rssi_qidx, tvb, 0, 1, ENC_BIG_ENDIAN);
704 }
705 else {
706 /* Handle as other method */
707 proto_tree_add_item( tree, hf_rtp_hdr_ed137a_ft_sqi_qidx, tvb, 0, 1, ENC_BIG_ENDIAN);
708 }
709 }
710 else {
711 /* Other SQI method handling */
712 proto_tree_add_item( tree, hf_rtp_hdr_ed137a_ft_sqi_qidx, tvb, 0, 1, ENC_BIG_ENDIAN);
713 }
714 proto_tree_add_item( tree, hf_rtp_hdr_ed137a_ft_sqi_qidx_ml, tvb, 0, 1, ENC_BIG_ENDIAN);
715
716 return tvb_captured_length(tvb);
717 }
718
719 static int
dissect_rtp_hdr_ext_ed137a_feature_climax_tdly(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,void * data _U_)720 dissect_rtp_hdr_ext_ed137a_feature_climax_tdly(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
721 {
722 guint32 ext_value;
723 guint32 climax_tdly_mode;
724 guint32 climax_tdly_value;
725 guint32 climax_tdly_value_calc;
726
727 ext_value = tvb_get_guint8( tvb, 0 );
728
729 climax_tdly_mode = RTP_ED137A_feature_climax_tdly_mode(ext_value);
730 climax_tdly_value = RTP_ED137A_feature_climax_tdly_value(ext_value);
731
732 proto_tree_add_item( tree, hf_rtp_hdr_ed137a_ft_climax_delay_mode, tvb, 0, 1, ENC_BIG_ENDIAN);
733 if (RTP_ED137A_feature_climax_tdly_mode_relative == climax_tdly_mode) {
734 /* Relative delay, in 2ms steps */
735 climax_tdly_value_calc=2*climax_tdly_value;
736
737 proto_tree_add_uint_format_value( tree, hf_rtp_hdr_ed137a_ft_climax_delay_relative_value, tvb, 0, 1, climax_tdly_value, "%d ms", climax_tdly_value_calc);
738
739 }
740 else {
741 /* Absolute delay, in 2ms steps */
742 climax_tdly_value_calc=2*climax_tdly_value;
743
744 proto_tree_add_uint_format_value( tree, hf_rtp_hdr_ed137a_ft_climax_delay_absolute_value, tvb, 0, 1, climax_tdly_value, "%d ms", climax_tdly_value_calc);
745
746 }
747
748 return tvb_captured_length(tvb);
749 }
750
751 static int
dissect_rtp_hdr_ext_ed137b_feature_rrc_single(tvbuff_t * tvb,packet_info * pinfo _U_,proto_tree * tree,void * data _U_)752 dissect_rtp_hdr_ext_ed137b_feature_rrc_single(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
753 {
754 proto_tree *item;
755
756 /* Generated item points really to previous byte */
757 item = proto_tree_add_item( tree, hf_rtp_hdr_ed137b_ft_rrc_single, tvb, -1, 1, ENC_NA);
758 proto_item_set_generated(item);
759
760 proto_tree_add_item( tree, hf_rtp_hdr_ed137b_ft_rrc_single_ms_tx_f1, tvb, 0, 1, ENC_BIG_ENDIAN);
761 proto_tree_add_item( tree, hf_rtp_hdr_ed137b_ft_rrc_single_ms_rx_f1, tvb, 0, 1, ENC_BIG_ENDIAN);
762 proto_tree_add_item( tree, hf_rtp_hdr_ed137b_ft_rrc_single_ms_tx_f2, tvb, 0, 1, ENC_BIG_ENDIAN);
763 proto_tree_add_item( tree, hf_rtp_hdr_ed137b_ft_rrc_single_ms_rx_f2, tvb, 0, 1, ENC_BIG_ENDIAN);
764 proto_tree_add_item( tree, hf_rtp_hdr_ed137b_ft_rrc_single_sel_tx_f1, tvb, 0, 1, ENC_BIG_ENDIAN);
765 proto_tree_add_item( tree, hf_rtp_hdr_ed137b_ft_rrc_single_sel_tx_f2, tvb, 0, 1, ENC_BIG_ENDIAN);
766 proto_tree_add_item( tree, hf_rtp_hdr_ed137b_ft_rrc_single_mu_rx_f1, tvb, 0, 1, ENC_BIG_ENDIAN);
767 proto_tree_add_item( tree, hf_rtp_hdr_ed137b_ft_rrc_single_mu_rx_f2, tvb, 0, 1, ENC_BIG_ENDIAN);
768
769 return tvb_captured_length(tvb);
770 }
771
772 static int
dissect_rtp_hdr_ext_ed137b_feature_climax_ddc_rmm(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,void * data _U_)773 dissect_rtp_hdr_ext_ed137b_feature_climax_ddc_rmm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
774 {
775 guint32 ext_value;
776 proto_tree *item;
777 guint32 climax_ddc_rmm_tqv;
778 guint32 climax_ddc_rmm_t1;
779
780 /* Generated item points really to previous byte */
781 item = proto_tree_add_item( tree, hf_rtp_hdr_ed137b_ft_climax_ddc_rmm, tvb, -1, 1, ENC_NA);
782 proto_item_set_generated(item);
783
784 ext_value = tvb_get_ntoh24( tvb, 0 );
785 climax_ddc_rmm_tqv = RTP_ED137B_feature_climax_ddc_rmm_tqv(ext_value);
786 climax_ddc_rmm_t1 = RTP_ED137B_feature_climax_ddc_rmm_t1(ext_value);
787
788 proto_tree_add_item( tree, hf_rtp_hdr_ed137b_ft_climax_ddc_rmm_tqv, tvb, 0, 3, ENC_BIG_ENDIAN);
789 process_time_value(pinfo, tvb, tree, hf_rtp_hdr_ed137b_ft_climax_ddc_rmm_t1, 0, (RTP_ED137B_feature_climax_ddc_rmm_tqv_relative == climax_ddc_rmm_tqv), climax_ddc_rmm_t1);
790
791 return tvb_captured_length(tvb);
792 }
793
794 static int
dissect_rtp_hdr_ext_ed137b_feature_climax_ddc_mam(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,void * data _U_)795 dissect_rtp_hdr_ext_ed137b_feature_climax_ddc_mam(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
796 {
797 guint32 ext_value;
798 proto_tree *item;
799 guint32 climax_ddc_mam_tqg;
800 guint32 climax_ddc_mam_t1;
801 guint32 climax_ddc_mam_t2;
802
803 /* Generated item points really to previous byte */
804 item = proto_tree_add_item( tree, hf_rtp_hdr_ed137b_ft_climax_ddc_mam, tvb, -1, 1, ENC_NA);
805 proto_item_set_generated(item);
806
807 ext_value = tvb_get_ntoh24( tvb, 0 + 0 );
808 climax_ddc_mam_tqg = RTP_ED137B_feature_climax_ddc_mam_tqg(ext_value);
809 climax_ddc_mam_t1 = RTP_ED137B_feature_climax_ddc_mam_t1(ext_value);
810
811 proto_tree_add_item( tree, hf_rtp_hdr_ed137b_ft_climax_ddc_mam_tqg, tvb, 0, 3, ENC_BIG_ENDIAN);
812 process_time_value(pinfo, tvb, tree, hf_rtp_hdr_ed137b_ft_climax_ddc_mam_t1, 0, (RTP_ED137B_feature_climax_ddc_mam_tqg_relative == climax_ddc_mam_tqg), climax_ddc_mam_t1);
813
814 ext_value = tvb_get_ntoh24( tvb, 0 + 3 );
815 climax_ddc_mam_t2 = RTP_ED137B_feature_climax_ddc_mam_t2(ext_value);
816
817 proto_tree_add_item( tree, hf_rtp_hdr_ed137b_ft_climax_ddc_mam_nmr, tvb, 0 + 3, 3, ENC_BIG_ENDIAN);
818 process_time_value(pinfo, tvb, tree, hf_rtp_hdr_ed137b_ft_climax_ddc_mam_t2, 0 + 3, (RTP_ED137B_feature_climax_ddc_mam_tqg_relative == climax_ddc_mam_tqg), climax_ddc_mam_t2);
819
820 process_125us_based_value( tvb, tree, hf_rtp_hdr_ed137b_ft_climax_ddc_mam_tsd, 0 + 6);
821 process_125us_based_value( tvb, tree, hf_rtp_hdr_ed137b_ft_climax_ddc_mam_tj1, 0 + 8);
822 process_125us_based_value( tvb, tree, hf_rtp_hdr_ed137b_ft_climax_ddc_mam_tid, 0 + 10);
823
824 return tvb_captured_length(tvb);
825 }
826
827 static int
dissect_rtp_hdr_ext_ed137c_feature_climax_ddc_mam(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,void * data _U_)828 dissect_rtp_hdr_ext_ed137c_feature_climax_ddc_mam(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
829 {
830 guint32 ext_value;
831 proto_tree *item;
832 guint32 climax_ddc_mam_tqg;
833 guint32 climax_ddc_mam_t1;
834 guint32 climax_ddc_mam_t2;
835
836 /* Generated item points really to previous byte */
837 item = proto_tree_add_item( tree, hf_rtp_hdr_ed137c_ft_climax_ddc_mam, tvb, -1, 1, ENC_NA);
838 proto_item_set_generated(item);
839
840 ext_value = tvb_get_ntoh24( tvb, 0 + 0 );
841 climax_ddc_mam_tqg = RTP_ED137C_feature_climax_ddc_mam_tqg(ext_value);
842 climax_ddc_mam_t1 = RTP_ED137C_feature_climax_ddc_mam_t1(ext_value);
843
844 proto_tree_add_item( tree, hf_rtp_hdr_ed137c_ft_climax_ddc_mam_tqg, tvb, 0, 3, ENC_BIG_ENDIAN);
845 process_time_value(pinfo, tvb, tree, hf_rtp_hdr_ed137c_ft_climax_ddc_mam_t1, 0, (RTP_ED137C_feature_climax_ddc_mam_tqg_relative == climax_ddc_mam_tqg), climax_ddc_mam_t1);
846
847 ext_value = tvb_get_ntoh24( tvb, 0 + 3 );
848 climax_ddc_mam_t2 = RTP_ED137C_feature_climax_ddc_mam_t2(ext_value);
849
850 proto_tree_add_item( tree, hf_rtp_hdr_ed137c_ft_climax_ddc_mam_nmr, tvb, 0 + 3, 3, ENC_BIG_ENDIAN);
851 process_time_value(pinfo, tvb, tree, hf_rtp_hdr_ed137c_ft_climax_ddc_mam_t2, 0 + 3, (RTP_ED137C_feature_climax_ddc_mam_tqg_relative == climax_ddc_mam_tqg), climax_ddc_mam_t2);
852
853 process_125us_based_value( tvb, tree, hf_rtp_hdr_ed137c_ft_climax_ddc_mam_tsd, 0 + 6);
854 process_125us_based_value( tvb, tree, hf_rtp_hdr_ed137c_ft_climax_ddc_mam_tj1, 0 + 8);
855 process_125us_based_value( tvb, tree, hf_rtp_hdr_ed137c_ft_climax_ddc_mam_tid, 0 + 10);
856 process_125us_based_value( tvb, tree, hf_rtp_hdr_ed137c_ft_climax_ddc_mam_ts2, 0 + 12);
857
858 return tvb_captured_length(tvb);
859 }
860
861 /* Decode ED-137A fixed part and call dissectors for variable part */
862 static int
dissect_rtp_hdr_ext_ed137a(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,void * data)863 dissect_rtp_hdr_ext_ed137a(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
864 {
865 guint32 hdr_extension_len;
866 struct _rtp_info *rtp_info=(struct _rtp_info *)data;
867 proto_tree *rtp_hext_tree = NULL;
868 guint32 hdrext_offset = 0;
869 gboolean ed137_ptt = FALSE;
870 gboolean ed137_squ = FALSE;
871
872 hdr_extension_len = tvb_reported_length(tvb);
873
874 if ( hdr_extension_len > 0 ) {
875 proto_item *ti2;
876 proto_tree *rtp_hext_tree2;
877 guint32 ext_value = tvb_get_ntohs( tvb, hdrext_offset );
878
879 if (rtp_info != NULL) {
880 rtp_info->info_is_ed137 = TRUE;
881 }
882 if ( tree ) {
883 proto_item *ti;
884 ti = proto_tree_add_item(tree, hf_rtp_hdr_ed137s, tvb, 0, hdr_extension_len, ENC_NA);
885 rtp_hext_tree = proto_item_add_subtree( ti, ett_hdr_ext_ed137s );
886 }
887
888 if (RTP_ED137A_ptt_mask(ext_value)) {
889 col_append_str(pinfo->cinfo, COL_INFO, ", PTT");
890 ed137_ptt = TRUE;
891 }
892 if (RTP_ED137A_squ_mask(ext_value)) {
893 col_append_str(pinfo->cinfo, COL_INFO, ", SQU");
894 ed137_squ = TRUE;
895 }
896
897 /* Map PTT/SQU bits to string */
898 if (rtp_info != NULL) {
899 if (ed137_ptt) {
900 if (ed137_squ) {
901 rtp_info->info_ed137_info = ed137_ptt_and_squ;
902 } else {
903 rtp_info->info_ed137_info = ed137_ptt_only;
904 }
905 } else {
906 if (ed137_squ) {
907 rtp_info->info_ed137_info = ed137_squ_only;
908 } else {
909 rtp_info->info_ed137_info = NULL;
910 }
911 }
912 }
913
914 if ( rtp_hext_tree ) {
915 ti2 = proto_tree_add_item(rtp_hext_tree, hf_rtp_hdr_ed137a, tvb, hdrext_offset, 2, ENC_NA);
916 rtp_hext_tree2 = proto_item_add_subtree( ti2, ett_hdr_ext_ed137a );
917
918 /* There are multiple formats of header - depends on direction of a flow. As it is not possible to quess flow direction, we use items from RTPRx because unused fields are empty in other formats */
919 proto_tree_add_item( rtp_hext_tree2, hf_rtp_hdr_ed137a_ptt_type, tvb, hdrext_offset, 2, ENC_BIG_ENDIAN);
920 proto_tree_add_item( rtp_hext_tree2, hf_rtp_hdr_ed137a_squ, tvb, hdrext_offset, 2, ENC_BIG_ENDIAN);
921 proto_tree_add_item( rtp_hext_tree2, hf_rtp_hdr_ed137a_ptt_id, tvb, hdrext_offset, 2, ENC_BIG_ENDIAN);
922 proto_tree_add_item( rtp_hext_tree2, hf_rtp_hdr_ed137a_pm, tvb, hdrext_offset, 2, ENC_BIG_ENDIAN);
923 proto_tree_add_item( rtp_hext_tree2, hf_rtp_hdr_ed137a_ptts, tvb, hdrext_offset, 2, ENC_BIG_ENDIAN);
924 proto_tree_add_item( rtp_hext_tree2, hf_rtp_hdr_ed137a_sct, tvb, hdrext_offset, 2, ENC_BIG_ENDIAN);
925 proto_tree_add_item( rtp_hext_tree2, hf_rtp_hdr_ed137a_reserved, tvb, hdrext_offset, 2, ENC_BIG_ENDIAN);
926 proto_tree_add_item( rtp_hext_tree2, hf_rtp_hdr_ed137a_x, tvb, hdrext_offset, 2, ENC_BIG_ENDIAN);
927 }
928
929 /* Shift behind standard ED-137A header */
930 hdrext_offset += 2;
931 hdr_extension_len -= 2;
932
933 /* Do we have additional feature blocks? */
934 if (RTP_ED137A_extended_information(ext_value)) {
935
936 /* Loop over all additional feature blocks */
937 /* The shortest header lenght is 2, anything shorter is padding */
938 while ( hdr_extension_len >= 2 ) {
939 proto_item *ti3;
940 proto_tree *rtp_hext_tree3;
941 guint32 ft_type;
942 guint32 ft_len;
943
944 ext_value = tvb_get_ntohs( tvb, hdrext_offset );
945 ft_type = RTP_ED137A_feature_type(ext_value);
946 ft_len = RTP_ED137A_feature_length(ext_value);
947
948 /* Is it header or padding? */
949 if ( RTP_ED137_feature_none_type != ft_type ) {
950 ti3 = proto_tree_add_item(rtp_hext_tree, hf_rtp_hdr_ed137a_add, tvb, hdrext_offset, (ft_len > 0 ? ft_len + 1 : 2), ENC_NA);
951 rtp_hext_tree3 = proto_item_add_subtree( ti3, ett_hdr_ext_ed137a_add );
952
953 if ( rtp_hext_tree ) {
954 proto_tree_add_item( rtp_hext_tree3, hf_rtp_hdr_ed137a_ft_type, tvb, hdrext_offset, 1, ENC_BIG_ENDIAN);
955 proto_tree_add_item( rtp_hext_tree3, hf_rtp_hdr_ed137a_ft_len, tvb, hdrext_offset, 1, ENC_BIG_ENDIAN);
956 }
957
958 /* Shift behind feature header */
959 hdrext_offset += 1;
960 hdr_extension_len -= 1;
961
962 if ( rtp_hext_tree ) {
963 tvbuff_t *newtvb;
964 guint32 ft_table_key;
965
966 /* join 4 bit type and 4 bit lenght to 8 bit key */
967 ft_table_key = MAKE_KEY( ft_type, ft_len );
968
969 /* pass interpretation of header extension to a registered subdissector */
970 /* new subset points to value (starts behind type/length pair) */
971 newtvb = tvb_new_subset_length(tvb, hdrext_offset, hdr_extension_len);
972
973 /* try to find a dissector by type/len key and dissect additional feature header */
974 if ( !(dissector_try_uint(rtp_hdr_ext_ed137a_add_features_table, ft_table_key, newtvb, pinfo, rtp_hext_tree3)) ) {
975 proto_tree_add_item( rtp_hext_tree3, hf_rtp_hdr_ed137a_ft_value, tvb, hdrext_offset, ft_len, ENC_NA);
976 }
977 }
978
979 /* Shift behind feature data */
980 hdrext_offset += ft_len;
981 hdr_extension_len -= ft_len;
982 }
983 else {
984 /* Padding, exit while loop */
985 break;
986 }
987
988 }
989
990 /* Process padding if any */
991 guint32 hdr_extension_padding;
992
993 hdr_extension_padding = hdr_extension_len & 0x03;
994
995 /* Calculate padding size */
996 if ( hdr_extension_padding > 0 ) {
997 if ( rtp_hext_tree ) {
998 proto_tree_add_item( rtp_hext_tree, hf_rtp_hdr_ed137a_ft_padding, tvb, hdrext_offset, hdr_extension_padding, ENC_NA);
999 }
1000 }
1001
1002 }
1003 else {
1004 /* Extended information is not used */
1005 if ( rtp_hext_tree ) {
1006 proto_item *ti3;
1007 proto_tree *rtp_hext_tree3;
1008
1009 ti3 = proto_tree_add_item(rtp_hext_tree, hf_rtp_hdr_ed137a_add, tvb, hdrext_offset, 2, ENC_NA);
1010 rtp_hext_tree3 = proto_item_add_subtree( ti3, ett_hdr_ext_ed137a_add );
1011 proto_tree_add_item( rtp_hext_tree3, hf_rtp_hdr_ed137a_x_nu, tvb, hdrext_offset, 2, ENC_BIG_ENDIAN);
1012 }
1013 }
1014 }
1015 return tvb_captured_length(tvb);
1016 }
1017
1018 /* Register RTP ED-137 */
1019 void
proto_register_rtp_ed137(void)1020 proto_register_rtp_ed137(void)
1021 {
1022 static hf_register_info hf[] =
1023 {
1024 /* ED-137 and ED-137A common structures */
1025 {
1026 &hf_rtp_hdr_ed137s,
1027 {
1028 "ED137 extensions",
1029 "rtp.ext.ed137s",
1030 FT_NONE,
1031 BASE_NONE,
1032 NULL,
1033 0x0,
1034 NULL, HFILL
1035 }
1036 },
1037 /* ED-137 only structures */
1038 {
1039 &hf_rtp_hdr_ed137,
1040 {
1041 "ED137 extension",
1042 "rtp.ext.ed137",
1043 FT_NONE,
1044 BASE_NONE,
1045 NULL,
1046 0x0,
1047 NULL, HFILL
1048 }
1049 },
1050 {
1051 &hf_rtp_hdr_ed137_add,
1052 {
1053 "ED137 extension additional feature",
1054 "rtp.ext.ed137.ft",
1055 FT_NONE,
1056 BASE_NONE,
1057 NULL,
1058 0x0,
1059 NULL, HFILL
1060 }
1061 },
1062 {
1063 &hf_rtp_hdr_ed137_ptt_type,
1064 {
1065 "PTT Type",
1066 "rtp.ext.ed137.ptt_type",
1067 FT_UINT32,
1068 BASE_DEC,
1069 VALS(rtp_ext_ed137_ptt_type),
1070 0xE0000000,
1071 NULL, HFILL
1072 }
1073 },
1074 {
1075 &hf_rtp_hdr_ed137_squ,
1076 {
1077 "SQU",
1078 "rtp.ext.ed137.squ",
1079 FT_UINT32,
1080 BASE_DEC,
1081 VALS(rtp_ext_ed137_squ),
1082 0x10000000,
1083 NULL, HFILL
1084 }
1085 },
1086 {
1087 &hf_rtp_hdr_ed137_ptt_id,
1088 {
1089 "PTT-id",
1090 "rtp.ext.ed137.ptt_id",
1091 FT_UINT32,
1092 BASE_DEC,
1093 NULL,
1094 0x0F000000,
1095 NULL, HFILL
1096 }
1097 },
1098 {
1099 &hf_rtp_hdr_ed137_sct,
1100 {
1101 "Simultaneous Call Transmissions",
1102 "rtp.ext.ed137.sct",
1103 FT_UINT32,
1104 BASE_DEC,
1105 NULL,
1106 0x00800000,
1107 NULL, HFILL
1108 }
1109 },
1110 {
1111 &hf_rtp_hdr_ed137_x,
1112 {
1113 "X",
1114 "rtp.ext.ed137.x",
1115 FT_UINT32,
1116 BASE_DEC,
1117 VALS(rtp_ext_ed137_x),
1118 0x00400000,
1119 NULL, HFILL
1120 }
1121 },
1122 {
1123 &hf_rtp_hdr_ed137_x_nu,
1124 {
1125 "Not used",
1126 "rtp.ext.ed137.x-nu",
1127 FT_UINT32,
1128 BASE_DEC,
1129 NULL,
1130 0x003FFFFE,
1131 NULL, HFILL
1132 }
1133 },
1134 {
1135 &hf_rtp_hdr_ed137_ft_type,
1136 {
1137 "Feature type",
1138 "rtp.ext.ed137.ft.type",
1139 FT_UINT32,
1140 BASE_HEX_DEC,
1141 VALS(rtp_ext_ed137_ft_type),
1142 0x003C0000,
1143 NULL, HFILL
1144 }
1145 },
1146 {
1147 &hf_rtp_hdr_ed137_ft_len,
1148 {
1149 "Feature length",
1150 "rtp.ext.ed137.ft.len",
1151 FT_UINT32,
1152 BASE_DEC,
1153 NULL,
1154 0x0003C000,
1155 NULL, HFILL
1156 }
1157 },
1158 {
1159 &hf_rtp_hdr_ed137_ft_value,
1160 {
1161 "Feature value",
1162 "rtp.ext.ed137.ft.value",
1163 FT_UINT32,
1164 BASE_HEX_DEC,
1165 NULL,
1166 0x00003FFE,
1167 NULL, HFILL
1168 }
1169 },
1170 {
1171 &hf_rtp_hdr_ed137_vf,
1172 {
1173 "VF",
1174 "rtp.ext.ed137.vf",
1175 FT_UINT32,
1176 BASE_DEC,
1177 VALS(rtp_ext_ed137_vf),
1178 0x00000001,
1179 NULL, HFILL
1180 }
1181 },
1182 {
1183 &hf_rtp_hdr_ed137_ft_bss_qidx,
1184 {
1185 "BSS Quality Index",
1186 "rtp.ext.ed137.ft.bss.qidx",
1187 FT_UINT32,
1188 BASE_DEC,
1189 NULL,
1190 0x00003FC0,
1191 NULL, HFILL
1192 }
1193 },
1194 {
1195 &hf_rtp_hdr_ed137_ft_bss_rssi_qidx,
1196 {
1197 "BSS Quality Index",
1198 "rtp.ext.ed137.ft.bss.qidx",
1199 FT_UINT32,
1200 BASE_DEC,
1201 VALS(rtp_ext_ed137_ft_bss_rssi_qidx),
1202 0x00003FC0,
1203 NULL, HFILL
1204 }
1205 },
1206 {
1207 &hf_rtp_hdr_ed137_ft_bss_qidx_ml,
1208 {
1209 "BSS Quality Index Method",
1210 "rtp.ext.ed137.ft.bss.qidx-ml",
1211 FT_UINT32,
1212 BASE_DEC,
1213 VALS(rtp_ext_ed137_ft_bss_qidx_ml),
1214 0x00000038,
1215 NULL, HFILL
1216 }
1217 },
1218 {
1219 &hf_rtp_hdr_ed137_ft_climax_delay_value,
1220 {
1221 "CLIMAX-Time Delay",
1222 "rtp.ext.ed137.ft.climax_delay.value",
1223 FT_UINT32,
1224 BASE_DEC,
1225 NULL,
1226 0x00003F00,
1227 NULL, HFILL
1228 }
1229 },
1230 /* ED-137A/B only structures */
1231 {
1232 &hf_rtp_hdr_ed137a,
1233 {
1234 "ED137A extension",
1235 "rtp.ext.ed137a",
1236 FT_NONE,
1237 BASE_NONE,
1238 NULL,
1239 0x0,
1240 NULL, HFILL
1241 }
1242 },
1243 {
1244 &hf_rtp_hdr_ed137a_add,
1245 {
1246 "ED137A extension additional feature",
1247 "rtp.ext.ed137a.ft",
1248 FT_NONE,
1249 BASE_NONE,
1250 NULL,
1251 0x0,
1252 NULL, HFILL
1253 }
1254 },
1255 {
1256 &hf_rtp_hdr_ed137a_ptt_type,
1257 {
1258 "PTT Type",
1259 "rtp.ext.ed137a.ptt_type",
1260 FT_UINT16,
1261 BASE_DEC,
1262 VALS(rtp_ext_ed137a_ptt_type),
1263 0xE000,
1264 NULL, HFILL
1265 }
1266 },
1267 {
1268 &hf_rtp_hdr_ed137a_squ,
1269 {
1270 "SQU",
1271 "rtp.ext.ed137a.squ",
1272 FT_UINT16,
1273 BASE_DEC,
1274 VALS(rtp_ext_ed137a_squ),
1275 0x1000,
1276 NULL, HFILL
1277 }
1278 },
1279 {
1280 &hf_rtp_hdr_ed137a_ptt_id,
1281 {
1282 "PTT-id",
1283 "rtp.ext.ed137a.ptt_id",
1284 FT_UINT16,
1285 BASE_DEC,
1286 NULL,
1287 0x0FC0,
1288 NULL, HFILL
1289 }
1290 },
1291 {
1292 &hf_rtp_hdr_ed137a_pm,
1293 {
1294 "PTT Mute",
1295 "rtp.ext.ed137a.pm",
1296 FT_UINT16,
1297 BASE_DEC,
1298 NULL,
1299 0x0020,
1300 NULL, HFILL
1301 }
1302 },
1303 {
1304 &hf_rtp_hdr_ed137a_ptts,
1305 {
1306 "PTT Summation",
1307 "rtp.ext.ed137a.ptts",
1308 FT_UINT16,
1309 BASE_DEC,
1310 NULL,
1311 0x0010,
1312 NULL, HFILL
1313 }
1314 },
1315 {
1316 &hf_rtp_hdr_ed137a_sct,
1317 {
1318 "Simultaneous Call Transmissions",
1319 "rtp.ext.ed137a.sct",
1320 FT_UINT16,
1321 BASE_DEC,
1322 NULL,
1323 0x0008,
1324 NULL, HFILL
1325 }
1326 },
1327 {
1328 &hf_rtp_hdr_ed137a_reserved,
1329 {
1330 "Reserved",
1331 "rtp.ext.ed137a.reserved",
1332 FT_UINT16,
1333 BASE_HEX_DEC,
1334 NULL,
1335 0x0006,
1336 NULL, HFILL
1337 }
1338 },
1339 {
1340 &hf_rtp_hdr_ed137a_x,
1341 {
1342 "X",
1343 "rtp.ext.ed137a.x",
1344 FT_UINT16,
1345 BASE_DEC,
1346 VALS(rtp_ext_ed137_x),
1347 0x0001,
1348 NULL, HFILL
1349 }
1350 },
1351 {
1352 &hf_rtp_hdr_ed137a_x_nu,
1353 {
1354 "Not used",
1355 "rtp.ext.ed137a.x-nu",
1356 FT_UINT16,
1357 BASE_DEC,
1358 NULL,
1359 0xFFFF,
1360 NULL, HFILL
1361 }
1362 },
1363 {
1364 &hf_rtp_hdr_ed137a_ft_type,
1365 {
1366 "Feature type",
1367 "rtp.ext.ed137a.ft.type",
1368 FT_UINT8,
1369 BASE_HEX_DEC,
1370 VALS(rtp_ext_ed137a_ft_type),
1371 0xF0,
1372 NULL, HFILL
1373 }
1374 },
1375 {
1376 &hf_rtp_hdr_ed137a_ft_len,
1377 {
1378 "Feature length",
1379 "rtp.ext.ed137a.ft.len",
1380 FT_UINT8,
1381 BASE_DEC,
1382 NULL,
1383 0x0F,
1384 NULL, HFILL
1385 }
1386 },
1387 {
1388 &hf_rtp_hdr_ed137a_ft_value,
1389 {
1390 "Feature value",
1391 "rtp.ext.ed137a.ft.value",
1392 FT_BYTES,
1393 BASE_NONE,
1394 NULL,
1395 0x0,
1396 NULL, HFILL
1397 }
1398 },
1399 {
1400 &hf_rtp_hdr_ed137a_ft_padding,
1401 {
1402 "Padding",
1403 "rtp.ext.ed137a.ft.padding",
1404 FT_BYTES,
1405 BASE_NONE,
1406 NULL,
1407 0x0,
1408 NULL, HFILL
1409 }
1410 },
1411 {
1412 &hf_rtp_hdr_ed137a_ft_sqi_qidx,
1413 {
1414 "SQI Quality Index",
1415 "rtp.ext.ed137a.ft.sqi.qidx",
1416 FT_UINT8,
1417 BASE_DEC,
1418 NULL,
1419 0xF8,
1420 NULL, HFILL
1421 }
1422 },
1423 {
1424 &hf_rtp_hdr_ed137a_ft_sqi_rssi_qidx,
1425 {
1426 "SQI Quality Index",
1427 "rtp.ext.ed137a.ft.sqi.qidx",
1428 FT_UINT8,
1429 BASE_DEC,
1430 VALS(rtp_ext_ed137a_ft_sqi_rssi_qidx),
1431 0xF8,
1432 NULL, HFILL
1433 }
1434 },
1435 {
1436 &hf_rtp_hdr_ed137a_ft_sqi_qidx_ml,
1437 {
1438 "SQI Quality Index Method",
1439 "rtp.ext.ed137a.ft.sqi.qidx-ml",
1440 FT_UINT8,
1441 BASE_DEC,
1442 VALS(rtp_ext_ed137a_ft_sqi_qidx_ml),
1443 0x07,
1444 NULL, HFILL
1445 }
1446 },
1447 {
1448 &hf_rtp_hdr_ed137a_ft_climax_delay_mode,
1449 {
1450 "CLIMAX-Time Delay Mode",
1451 "rtp.ext.ed137a.ft.climax_delay.mode",
1452 FT_UINT8,
1453 BASE_DEC,
1454 VALS(rtp_ext_ed137a_ft_climax_delay_mode),
1455 0x80,
1456 NULL, HFILL
1457 }
1458 },
1459 {
1460 &hf_rtp_hdr_ed137a_ft_climax_delay_relative_value,
1461 {
1462 "CLIMAX-Time Delay Relative",
1463 "rtp.ext.ed137a.ft.climax_delay.relative_value",
1464 FT_UINT8,
1465 BASE_DEC,
1466 NULL,
1467 0x7F,
1468 NULL, HFILL
1469 }
1470 },
1471 {
1472 &hf_rtp_hdr_ed137a_ft_climax_delay_absolute_value,
1473 {
1474 "CLIMAX-Time Delay Absolute",
1475 "rtp.ext.ed137a.ft.climax_delay.absolute_value",
1476 FT_UINT8,
1477 BASE_DEC,
1478 NULL,
1479 0x7F,
1480 NULL, HFILL
1481 }
1482 },
1483 {
1484 &hf_rtp_hdr_ed137b_ft_rrc_single,
1485 {
1486 "RRC for single frequency",
1487 "rtp.ext.ed137b.ft.rrc.single",
1488 FT_NONE,
1489 BASE_NONE,
1490 NULL,
1491 0x0,
1492 NULL, HFILL
1493 }
1494 },
1495 {
1496 &hf_rtp_hdr_ed137b_ft_rrc_single_ms_tx_f1,
1497 {
1498 "MSTxF1",
1499 "rtp.ext.ed137b.ft.rrc.mstxf1",
1500 FT_UINT8,
1501 BASE_DEC,
1502 VALS(rtp_ext_ed137b_ft_single_ms_tx_f1),
1503 0x80,
1504 NULL, HFILL
1505 }
1506 },
1507 {
1508 &hf_rtp_hdr_ed137b_ft_rrc_single_ms_rx_f1,
1509 {
1510 "MSRxF1",
1511 "rtp.ext.ed137b.ft.rrc.msrxf1",
1512 FT_UINT8,
1513 BASE_DEC,
1514 VALS(rtp_ext_ed137b_ft_single_ms_rx_f1),
1515 0x40,
1516 NULL, HFILL
1517 }
1518 },
1519 {
1520 &hf_rtp_hdr_ed137b_ft_rrc_single_ms_tx_f2,
1521 {
1522 "MSTxF2",
1523 "rtp.ext.ed137b.ft.rrc.mstxf2",
1524 FT_UINT8,
1525 BASE_DEC,
1526 VALS(rtp_ext_ed137b_ft_single_ms_tx_f2),
1527 0x20,
1528 NULL, HFILL
1529 }
1530 },
1531 {
1532 &hf_rtp_hdr_ed137b_ft_rrc_single_ms_rx_f2,
1533 {
1534 "MSRxF2",
1535 "rtp.ext.ed137b.ft.rrc.msrxf2",
1536 FT_UINT8,
1537 BASE_DEC,
1538 VALS(rtp_ext_ed137b_ft_single_ms_rx_f2),
1539 0x10,
1540 NULL, HFILL
1541 }
1542 },
1543 {
1544 &hf_rtp_hdr_ed137b_ft_rrc_single_sel_tx_f1,
1545 {
1546 "SelTxF1",
1547 "rtp.ext.ed137b.ft.rrc.seltxf1",
1548 FT_UINT8,
1549 BASE_DEC,
1550 VALS(rtp_ext_ed137b_ft_single_sel_tx_f1),
1551 0x08,
1552 NULL, HFILL
1553 }
1554 },
1555 {
1556 &hf_rtp_hdr_ed137b_ft_rrc_single_sel_tx_f2,
1557 {
1558 "SelTxF2",
1559 "rtp.ext.ed137b.ft.rrc.seltxf2",
1560 FT_UINT8,
1561 BASE_DEC,
1562 VALS(rtp_ext_ed137b_ft_single_sel_tx_f2),
1563 0x04,
1564 NULL, HFILL
1565 }
1566 },
1567 {
1568 &hf_rtp_hdr_ed137b_ft_rrc_single_mu_rx_f1,
1569 {
1570 "MuRxF1",
1571 "rtp.ext.ed137b.ft.rrc.murxf1",
1572 FT_UINT8,
1573 BASE_DEC,
1574 VALS(rtp_ext_ed137b_ft_single_mu_rx_f1),
1575 0x02,
1576 NULL, HFILL
1577 }
1578 },
1579 {
1580 &hf_rtp_hdr_ed137b_ft_rrc_single_mu_rx_f2,
1581 {
1582 "MuRxF2",
1583 "rtp.ext.ed137b.ft.rrc.murxf2",
1584 FT_UINT8,
1585 BASE_DEC,
1586 VALS(rtp_ext_ed137b_ft_single_mu_rx_f2),
1587 0x01,
1588 NULL, HFILL
1589 }
1590 },
1591 {
1592 &hf_rtp_hdr_ed137b_ft_climax_ddc_unknown,
1593 {
1594 "CLIMAX Dynamic Delay Compensation Unknown Method",
1595 "rtp.ext.ed137b.ft.climax_ddc.unknown",
1596 FT_BYTES,
1597 BASE_NONE,
1598 NULL,
1599 0x0,
1600 NULL, HFILL
1601 }
1602 },
1603 {
1604 &hf_rtp_hdr_ed137b_ft_climax_ddc_rmm,
1605 {
1606 "CLIMAX Dynamic Delay Compensation RMM Request",
1607 "rtp.ext.ed137b.ft.climax_ddc.rmm",
1608 FT_NONE,
1609 BASE_NONE,
1610 NULL,
1611 0x0,
1612 NULL, HFILL
1613 }
1614 },
1615 {
1616 &hf_rtp_hdr_ed137b_ft_climax_ddc_rmm_tqv,
1617 {
1618 "Time Quality VCS",
1619 "rtp.ext.ed137b.ft.climax_ddc.rmm_tqv",
1620 FT_UINT24,
1621 BASE_DEC,
1622 VALS(rtp_ext_ed137b_ft_climax_ddc_time_quality),
1623 0x800000,
1624 NULL, HFILL
1625 }
1626 },
1627 {
1628 &hf_rtp_hdr_ed137b_ft_climax_ddc_rmm_t1,
1629 {
1630 "T1",
1631 "rtp.ext.ed137b.ft.climax_ddc.rmm_t1",
1632 FT_UINT24,
1633 BASE_DEC,
1634 NULL,
1635 0x7FFFFF,
1636 NULL, HFILL
1637 }
1638 },
1639 {
1640 &hf_rtp_hdr_ed137b_ft_climax_ddc_mam,
1641 {
1642 "CLIMAX Dynamic Delay Compensation MAM Response (ED-137B)",
1643 "rtp.ext.ed137b.ft.climax_ddc.mam",
1644 FT_NONE,
1645 BASE_NONE,
1646 NULL,
1647 0x0,
1648 NULL, HFILL
1649 }
1650 },
1651 {
1652 &hf_rtp_hdr_ed137b_ft_climax_ddc_mam_tqg,
1653 {
1654 "Time Quality GRS",
1655 "rtp.ext.ed137b.ft.climax_ddc.mam_tqg",
1656 FT_UINT24,
1657 BASE_DEC,
1658 VALS(rtp_ext_ed137b_ft_climax_ddc_time_quality),
1659 0x800000,
1660 NULL, HFILL
1661 }
1662 },
1663 {
1664 &hf_rtp_hdr_ed137b_ft_climax_ddc_mam_t1,
1665 {
1666 "T1",
1667 "rtp.ext.ed137b.ft.climax_ddc.mam_t1",
1668 FT_UINT24,
1669 BASE_DEC,
1670 NULL,
1671 0x7FFFFF,
1672 NULL, HFILL
1673 }
1674 },
1675 {
1676 &hf_rtp_hdr_ed137b_ft_climax_ddc_mam_nmr,
1677 {
1678 "New measurement requested",
1679 "rtp.ext.ed137b.ft.climax_ddc.mam_nmr",
1680 FT_UINT24,
1681 BASE_DEC,
1682 VALS(rtp_ext_ed137b_ft_climax_ddc_mam_nmr),
1683 0x800000,
1684 NULL, HFILL
1685 }
1686 },
1687 {
1688 &hf_rtp_hdr_ed137b_ft_climax_ddc_mam_t2,
1689 {
1690 "T2",
1691 "rtp.ext.ed137b.ft.climax_ddc.mam_t2",
1692 FT_UINT24,
1693 BASE_DEC,
1694 NULL,
1695 0x7FFFFF,
1696 NULL, HFILL
1697 }
1698 },
1699 {
1700 &hf_rtp_hdr_ed137b_ft_climax_ddc_mam_tsd,
1701 {
1702 "Tsd",
1703 "rtp.ext.ed137b.ft.climax_ddc.mam_tsd",
1704 FT_UINT16,
1705 BASE_DEC,
1706 NULL,
1707 0,
1708 NULL, HFILL
1709 }
1710 },
1711 {
1712 &hf_rtp_hdr_ed137b_ft_climax_ddc_mam_tj1,
1713 {
1714 "Tj1",
1715 "rtp.ext.ed137b.ft.climax_ddc.mam_tj1",
1716 FT_UINT16,
1717 BASE_DEC,
1718 NULL,
1719 0,
1720 NULL, HFILL
1721 }
1722 },
1723 {
1724 &hf_rtp_hdr_ed137b_ft_climax_ddc_mam_tid,
1725 {
1726 "Tid",
1727 "rtp.ext.ed137b.ft.climax_ddc.mam_tid",
1728 FT_UINT16,
1729 BASE_DEC,
1730 NULL,
1731 0,
1732 NULL, HFILL
1733 }
1734 },
1735 {
1736 &hf_rtp_hdr_ed137c_ft_climax_ddc_mam,
1737 {
1738 "CLIMAX Dynamic Delay Compensation MAM Response (ED-137C)",
1739 "rtp.ext.ed137c.ft.climax_ddc.mam",
1740 FT_NONE,
1741 BASE_NONE,
1742 NULL,
1743 0x0,
1744 NULL, HFILL
1745 }
1746 },
1747 {
1748 &hf_rtp_hdr_ed137c_ft_climax_ddc_mam_tqg,
1749 {
1750 "Time Quality GRS",
1751 "rtp.ext.ed137c.ft.climax_ddc.mam_tqg",
1752 FT_UINT24,
1753 BASE_DEC,
1754 VALS(rtp_ext_ed137c_ft_climax_ddc_time_quality),
1755 0x800000,
1756 NULL, HFILL
1757 }
1758 },
1759 {
1760 &hf_rtp_hdr_ed137c_ft_climax_ddc_mam_t1,
1761 {
1762 "T1",
1763 "rtp.ext.ed137c.ft.climax_ddc.mam_t1",
1764 FT_UINT24,
1765 BASE_DEC,
1766 NULL,
1767 0x7FFFFF,
1768 NULL, HFILL
1769 }
1770 },
1771 {
1772 &hf_rtp_hdr_ed137c_ft_climax_ddc_mam_nmr,
1773 {
1774 "New measurement requested",
1775 "rtp.ext.ed137c.ft.climax_ddc.mam_nmr",
1776 FT_UINT24,
1777 BASE_DEC,
1778 VALS(rtp_ext_ed137c_ft_climax_ddc_mam_nmr),
1779 0x800000,
1780 NULL, HFILL
1781 }
1782 },
1783 {
1784 &hf_rtp_hdr_ed137c_ft_climax_ddc_mam_t2,
1785 {
1786 "T2",
1787 "rtp.ext.ed137c.ft.climax_ddc.mam_t2",
1788 FT_UINT24,
1789 BASE_DEC,
1790 NULL,
1791 0x7FFFFF,
1792 NULL, HFILL
1793 }
1794 },
1795 {
1796 &hf_rtp_hdr_ed137c_ft_climax_ddc_mam_tsd,
1797 {
1798 "Tsd",
1799 "rtp.ext.ed137c.ft.climax_ddc.mam_tsd",
1800 FT_UINT16,
1801 BASE_DEC,
1802 NULL,
1803 0,
1804 NULL, HFILL
1805 }
1806 },
1807 {
1808 &hf_rtp_hdr_ed137c_ft_climax_ddc_mam_tj1,
1809 {
1810 "Tj1",
1811 "rtp.ext.ed137c.ft.climax_ddc.mam_tj1",
1812 FT_UINT16,
1813 BASE_DEC,
1814 NULL,
1815 0,
1816 NULL, HFILL
1817 }
1818 },
1819 {
1820 &hf_rtp_hdr_ed137c_ft_climax_ddc_mam_tid,
1821 {
1822 "Tid",
1823 "rtp.ext.ed137c.ft.climax_ddc.mam_tid",
1824 FT_UINT16,
1825 BASE_DEC,
1826 NULL,
1827 0,
1828 NULL, HFILL
1829 }
1830 },
1831 {
1832 &hf_rtp_hdr_ed137c_ft_climax_ddc_mam_ts2,
1833 {
1834 "Ts2",
1835 "rtp.ext.ed137c.ft.climax_ddc.mam_ts2",
1836 FT_UINT16,
1837 BASE_DEC,
1838 NULL,
1839 0,
1840 NULL, HFILL
1841 }
1842 },
1843 };
1844
1845 static gint *ett[] =
1846 {
1847 &ett_hdr_ext_ed137s,
1848 &ett_hdr_ext_ed137,
1849 &ett_hdr_ext_ed137_add,
1850 &ett_hdr_ext_ed137a,
1851 &ett_hdr_ext_ed137a_add,
1852 };
1853
1854 proto_rtp_ed137 = proto_register_protocol("Real-Time Transport Protocol ED137 Extensions", "RTP-ED137", "rtp.ext.ed137");
1855 proto_register_field_array(proto_rtp_ed137, hf, array_length(hf));
1856 proto_register_subtree_array(ett, array_length(ett));
1857
1858 rtp_hdr_ext_ed137_handle = register_dissector("rtp.ext.ed137", dissect_rtp_hdr_ext_ed137, proto_rtp_ed137);
1859 rtp_hdr_ext_ed137a_handle = register_dissector("rtp.ext.ed137a", dissect_rtp_hdr_ext_ed137a, proto_rtp_ed137);
1860
1861 /* Table for ED-137A additional feature dissectors */
1862 rtp_hdr_ext_ed137a_add_features_table = register_dissector_table("rtp.hdr_ext.ed137a",
1863 "RTP header ED137A additional features", proto_rtp_ed137, FT_UINT8, BASE_HEX);
1864
1865 /* Register dissectors for tested additional headers */
1866 /* ED-137A signal quality information */
1867 rtp_hdr_ext_ed137a_feature_sqi_handle = register_dissector("rtp.hdr_ext.ed137a.ed137a_feature_sqi", dissect_rtp_hdr_ext_ed137a_feature_sqi, proto_rtp_ed137);
1868 dissector_add_uint("rtp.hdr_ext.ed137a", RTP_ED137A_feature_sqi_key, rtp_hdr_ext_ed137a_feature_sqi_handle);
1869
1870 /* ED-137A CLIMAX time delay */
1871 rtp_hdr_ext_ed137a_feature_climax_tdly_handle = register_dissector("rtp.hdr_ext.ed137a.ed137a_feature_climax_tdly", dissect_rtp_hdr_ext_ed137a_feature_climax_tdly, proto_rtp_ed137);
1872 dissector_add_uint("rtp.hdr_ext.ed137a", RTP_ED137A_feature_climax_tdly_key, rtp_hdr_ext_ed137a_feature_climax_tdly_handle);
1873
1874 /* ED-137B RRC for single frequency */
1875 rtp_hdr_ext_ed137b_feature_rrc_single_handle = register_dissector("rtp.hdr_ext.ed137a.ed137b_feature_rrc_single", dissect_rtp_hdr_ext_ed137b_feature_rrc_single, proto_rtp_ed137);
1876 dissector_add_uint("rtp.hdr_ext.ed137a", RTP_ED137B_feature_rrc_single_key, rtp_hdr_ext_ed137b_feature_rrc_single_handle);
1877
1878 /* ED-137B CLIMAX request for measurement message (RMM) */
1879 rtp_hdr_ext_ed137b_feature_climax_ddc_rmm_handle = register_dissector("rtp.hdr_ext.ed137a.ed137b_feature_climax_ddc_rmm", dissect_rtp_hdr_ext_ed137b_feature_climax_ddc_rmm, proto_rtp_ed137);
1880 dissector_add_uint("rtp.hdr_ext.ed137a", RTP_ED137B_feature_climax_ddc_rmm_key, rtp_hdr_ext_ed137b_feature_climax_ddc_rmm_handle);
1881
1882 /* ED-137B CLIMAX response message (MAM) */
1883 rtp_hdr_ext_ed137b_feature_climax_ddc_mam_handle = register_dissector("rtp.hdr_ext.ed137a.ed137b_feature_climax_ddc_mam", dissect_rtp_hdr_ext_ed137b_feature_climax_ddc_mam, proto_rtp_ed137);
1884 dissector_add_uint("rtp.hdr_ext.ed137a", RTP_ED137B_feature_climax_ddc_mam_key, rtp_hdr_ext_ed137b_feature_climax_ddc_mam_handle);
1885
1886 /* ED-137C CLIMAX response message (MAM) */
1887 rtp_hdr_ext_ed137c_feature_climax_ddc_mam_handle = register_dissector("rtp.hdr_ext.ed137a.ed137c_feature_climax_ddc_mam", dissect_rtp_hdr_ext_ed137c_feature_climax_ddc_mam, proto_rtp_ed137);
1888 dissector_add_uint("rtp.hdr_ext.ed137a", RTP_ED137C_feature_climax_ddc_mam_key, rtp_hdr_ext_ed137c_feature_climax_ddc_mam_handle);
1889 }
1890
1891 void
proto_reg_handoff_rtp_ed137(void)1892 proto_reg_handoff_rtp_ed137(void)
1893 {
1894 static gboolean prefs_initialized = FALSE;
1895
1896 if (!prefs_initialized) {
1897
1898 dissector_add_uint("rtp.hdr_ext", RTP_ED137_SIG, rtp_hdr_ext_ed137_handle);
1899 dissector_add_uint("rtp.hdr_ext", RTP_ED137A_SIG, rtp_hdr_ext_ed137a_handle);
1900
1901 prefs_initialized = TRUE;
1902 }
1903 }
1904
1905 /*
1906 * Editor modelines - https://www.wireshark.org/tools/modelines.html
1907 *
1908 * Local variables:
1909 * c-basic-offset: 4
1910 * tab-width: 8
1911 * indent-tabs-mode: nil
1912 * End:
1913 *
1914 * vi: set shiftwidth=4 tabstop=8 expandtab:
1915 * :indentSize=4:tabSize=8:noTabs=true:
1916 */
1917