Bug Summary

File:builds/wireshark/wireshark/epan/dissectors/packet-oran.c
Warning:line 3930, column 40
The right operand of '&' is a garbage value

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name packet-oran.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -fno-delete-null-pointer-checks -mframe-pointer=all -relaxed-aliasing -fmath-errno -ffp-contract=on -fno-rounding-math -ffloat16-excess-precision=fast -fbfloat16-excess-precision=fast -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/builds/wireshark/wireshark/build -fcoverage-compilation-dir=/builds/wireshark/wireshark/build -resource-dir /usr/lib/llvm-22/lib/clang/22 -isystem /usr/include/glib-2.0 -isystem /usr/lib/x86_64-linux-gnu/glib-2.0/include -isystem /builds/wireshark/wireshark/epan/dissectors -isystem /builds/wireshark/wireshark/build/epan/dissectors -isystem /usr/include/mit-krb5 -isystem /usr/include/libxml2 -isystem /builds/wireshark/wireshark/epan -D CARES_NO_DEPRECATED -D G_DISABLE_DEPRECATED -D G_DISABLE_SINGLE_INCLUDES -D WS_BUILD_DLL -D WS_DEBUG -D WS_DEBUG_UTF_8 -I /builds/wireshark/wireshark/build -I /builds/wireshark/wireshark -I /builds/wireshark/wireshark/include -D _GLIBCXX_ASSERTIONS -internal-isystem /usr/lib/llvm-22/lib/clang/22/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/16/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -fmacro-prefix-map=/builds/wireshark/wireshark/= -fmacro-prefix-map=/builds/wireshark/wireshark/build/= -fmacro-prefix-map=../= -Wno-format-nonliteral -std=gnu17 -ferror-limit 19 -fvisibility=hidden -fwrapv -fwrapv-pointer -fstrict-flex-arrays=3 -stack-protector 2 -fstack-clash-protection -fcf-protection=full -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fexceptions -fcolor-diagnostics -analyzer-output=html -faddrsig -fdwarf2-cfi-asm -o /builds/wireshark/wireshark/sbout/2026-11-09-100327-3661-1 -x c /builds/wireshark/wireshark/epan/dissectors/packet-oran.c
1/* packet-oran.c
2 * Routines for O-RAN fronthaul UC-plane dissection
3 * Copyright 2020, Jan Schiefer, Keysight Technologies, Inc.
4 * Copyright 2020- Martin Mathieson
5 *
6 * Wireshark - Network traffic analyzer
7 * By Gerald Combs <[email protected]>
8 * Copyright 1998 Gerald Combs
9 *
10 * SPDX-License-Identifier: GPL-2.0-or-later
11 */
12
13 /*
14 * Dissector for the O-RAN Fronthaul CUS protocol specification.
15 * See https://specifications.o-ran.org/specifications, WG4, Fronthaul Interfaces Workgroup
16 * The current implementation is based on the ORAN-WG4.CUS.0-v21.00 specification.
17 * Note that other eCPRI message types are handled in packet-ecpri.c
18 */
19
20#include <config.h>
21#define _USE_MATH_DEFINES
22#include <math.h>
23
24#include <epan/packet.h>
25#include <epan/expert.h>
26#include <epan/prefs.h>
27#include <epan/tap.h>
28#include <epan/tfs.h>
29#include <epan/reassemble.h>
30
31#include <epan/unit_strings.h>
32
33#include <wsutil/ws_roundup.h>
34#include <wsutil/ws_padding_to.h>
35
36#include "epan/dissectors/packet-oran.h"
37
38/* N.B. dissector preferences are taking the place of (some) M-plane parameters,
39 * so unfortunately it can be fiddly to get the preferences into a good state to
40 * decode a given capture..
41 * TODO:
42 * - Detect/indicate signs of application layer fragmentation?
43 * same eAxC in same symbol (same/different section ID?)
44 * - Not handling M-plane setting for "little endian byte order" as applied to
45 * IQ samples and beam weights does anyone use this?
46 * - for section extensions, check more constraints (which other extension types
47 * appear with them, order, repeated)
48 * - re-order items (decl and hf definitions) to match spec order?
49 * - track energy-saving status, and identify TRX or ASM commands as 'Sleep extension'
50 * - when tracking between C-plane and U-plane, indicated in C-plane any missing sectionIds/PRBs/REs
51 */
52
53/* Prototypes */
54void proto_register_oran(void);
55
56/* Initialize the protocol and registered fields */
57static int proto_oran;
58
59static int oran_tap = -1;
60
61static int hf_oran_du_port_id;
62static int hf_oran_bandsector_id;
63static int hf_oran_cc_id;
64static int hf_oran_ru_port_id;
65static int hf_oran_sequence_id;
66static int hf_oran_e_bit;
67static int hf_oran_subsequence_id;
68static int hf_oran_previous_frame;
69
70static int hf_oran_data_direction;
71static int hf_oran_payload_version;
72static int hf_oran_filter_index;
73static int hf_oran_frame_id;
74static int hf_oran_subframe_id;
75static int hf_oran_slot_id;
76static int hf_oran_slot_within_frame;
77static int hf_oran_start_symbol_id;
78static int hf_oran_numberOfSections;
79static int hf_oran_sectionType;
80
81static int hf_oran_udCompHdr;
82static int hf_oran_udCompHdrIqWidth;
83static int hf_oran_udCompHdrIqWidth_pref;
84static int hf_oran_udCompHdrMeth;
85static int hf_oran_udCompHdrMeth_pref;
86static int hf_oran_udCompLen;
87static int hf_oran_numberOfUEs;
88static int hf_oran_timeOffset;
89static int hf_oran_frameStructure_fft;
90static int hf_oran_frameStructure_subcarrier_spacing;
91static int hf_oran_cpLength;
92static int hf_oran_timing_header;
93static int hf_oran_section_id;
94static int hf_oran_rb;
95static int hf_oran_symInc;
96static int hf_oran_startPrbc;
97static int hf_oran_reMask_re1;
98static int hf_oran_reMask_re2;
99static int hf_oran_reMask_re3;
100static int hf_oran_reMask_re4;
101static int hf_oran_reMask_re5;
102static int hf_oran_reMask_re6;
103static int hf_oran_reMask_re7;
104static int hf_oran_reMask_re8;
105static int hf_oran_reMask_re9;
106static int hf_oran_reMask_re10;
107static int hf_oran_reMask_re11;
108static int hf_oran_reMask_re12;
109static int hf_oran_reMask;
110static int hf_oran_numPrbc;
111static int hf_oran_numSymbol;
112static int hf_oran_ef;
113static int hf_oran_beamId;
114
115static int hf_oran_sinrCompHdrIqWidth_pref;
116static int hf_oran_sinrCompHdrMeth_pref;
117
118static int hf_oran_ciCompHdr;
119static int hf_oran_ciCompHdrIqWidth;
120static int hf_oran_ciCompHdrMeth;
121static int hf_oran_ciCompOpt;
122
123static int hf_oran_extension;
124static int hf_oran_exttype;
125static int hf_oran_extlen;
126
127static int hf_oran_bfw_bundle;
128static int hf_oran_bfw_bundle_id;
129static int hf_oran_bfw;
130static int hf_oran_bfw_i;
131static int hf_oran_bfw_q;
132
133static int hf_oran_ueId;
134static int hf_oran_freqOffset;
135static int hf_oran_regularizationFactor;
136static int hf_oran_laaMsgType;
137static int hf_oran_laaMsgLen;
138static int hf_oran_lbtHandle;
139static int hf_oran_lbtDeferFactor;
140static int hf_oran_lbtBackoffCounter;
141static int hf_oran_lbtOffset;
142static int hf_oran_MCOT;
143static int hf_oran_lbtMode;
144static int hf_oran_sfnSfEnd;
145static int hf_oran_lbtPdschRes;
146static int hf_oran_sfStatus;
147static int hf_oran_initialPartialSF;
148static int hf_oran_lbtDrsRes;
149static int hf_oran_lbtBufErr;
150static int hf_oran_lbtTrafficClass;
151static int hf_oran_lbtCWConfig_H;
152static int hf_oran_lbtCWConfig_T;
153static int hf_oran_lbtCWR_Rst;
154
155static int hf_oran_reserved;
156static int hf_oran_reserved_1bit;
157static int hf_oran_reserved_2bits;
158static int hf_oran_reserved_3bits;
159static int hf_oran_reserved_4bits;
160static int hf_oran_reserved_last_4bits;
161static int hf_oran_reserved_last_5bits;
162static int hf_oran_reserved_6bits;
163static int hf_oran_reserved_last_6bits;
164static int hf_oran_reserved_7bits;
165static int hf_oran_reserved_last_7bits;
166static int hf_oran_reserved_8bits;
167static int hf_oran_reserved_16bits;
168static int hf_oran_reserved_15bits;
169static int hf_oran_reserved_bit1;
170static int hf_oran_reserved_bit2;
171static int hf_oran_reserved_bit4;
172static int hf_oran_reserved_bit5;
173static int hf_oran_reserved_bits123;
174static int hf_oran_reserved_bits1234;
175static int hf_oran_reserved_bits456;
176
177static int hf_oran_bundle_offset;
178static int hf_oran_cont_ind;
179
180static int hf_oran_bfwCompHdr;
181static int hf_oran_bfwCompHdr_iqWidth;
182static int hf_oran_bfwCompHdr_compMeth;
183static int hf_oran_symbolId;
184static int hf_oran_startPrbu;
185static int hf_oran_numPrbu;
186
187static int hf_oran_udCompParam;
188static int hf_oran_sReSMask;
189static int hf_oran_sReSMask_re12;
190static int hf_oran_sReSMask_re11;
191static int hf_oran_sReSMask_re10;
192static int hf_oran_sReSMask_re9;
193static int hf_oran_sReSMask_re8;
194static int hf_oran_sReSMask_re7;
195static int hf_oran_sReSMask_re6;
196static int hf_oran_sReSMask_re5;
197static int hf_oran_sReSMask_re4;
198static int hf_oran_sReSMask_re3;
199static int hf_oran_sReSMask_re2;
200static int hf_oran_sReSMask_re1;
201
202static int hf_oran_sReSMask1;
203static int hf_oran_sReSMask2;
204static int hf_oran_sReSMask1_2_re12;
205static int hf_oran_sReSMask1_2_re11;
206static int hf_oran_sReSMask1_2_re10;
207static int hf_oran_sReSMask1_2_re9;
208
209static int hf_oran_bfwCompParam;
210
211static int hf_oran_iSample;
212static int hf_oran_qSample;
213
214static int hf_oran_ciCompParam;
215
216static int hf_oran_blockScaler;
217static int hf_oran_compBitWidth;
218static int hf_oran_compShift;
219
220static int hf_oran_active_beamspace_coefficient_n1;
221static int hf_oran_active_beamspace_coefficient_n2;
222static int hf_oran_active_beamspace_coefficient_n3;
223static int hf_oran_active_beamspace_coefficient_n4;
224static int hf_oran_active_beamspace_coefficient_n5;
225static int hf_oran_active_beamspace_coefficient_n6;
226static int hf_oran_active_beamspace_coefficient_n7;
227static int hf_oran_active_beamspace_coefficient_n8;
228static int hf_oran_activeBeamspaceCoefficientMask;
229static int hf_oran_activeBeamspaceCoefficientMask_bits_set;
230
231static int hf_oran_se6_repetition;
232
233static int hf_oran_rbgSize;
234static int hf_oran_rbgMask;
235static int hf_oran_noncontig_priority;
236
237static int hf_oran_symbol_mask;
238static int hf_oran_symbol_mask_s13;
239static int hf_oran_symbol_mask_s12;
240static int hf_oran_symbol_mask_s11;
241static int hf_oran_symbol_mask_s10;
242static int hf_oran_symbol_mask_s9;
243static int hf_oran_symbol_mask_s8;
244static int hf_oran_symbol_mask_s7;
245static int hf_oran_symbol_mask_s6;
246static int hf_oran_symbol_mask_s5;
247static int hf_oran_symbol_mask_s4;
248static int hf_oran_symbol_mask_s3;
249static int hf_oran_symbol_mask_s2;
250static int hf_oran_symbol_mask_s1;
251static int hf_oran_symbol_mask_s0;
252
253static int hf_oran_rbg_mask_27;
254static int hf_oran_rbg_mask_26;
255static int hf_oran_rbg_mask_25;
256static int hf_oran_rbg_mask_24;
257static int hf_oran_rbg_mask_23;
258static int hf_oran_rbg_mask_22;
259static int hf_oran_rbg_mask_21;
260static int hf_oran_rbg_mask_20;
261static int hf_oran_rbg_mask_19;
262static int hf_oran_rbg_mask_18;
263static int hf_oran_rbg_mask_17;
264static int hf_oran_rbg_mask_16;
265static int hf_oran_rbg_mask_15;
266static int hf_oran_rbg_mask_14;
267static int hf_oran_rbg_mask_13;
268static int hf_oran_rbg_mask_12;
269static int hf_oran_rbg_mask_11;
270static int hf_oran_rbg_mask_10;
271static int hf_oran_rbg_mask_9;
272static int hf_oran_rbg_mask_8;
273static int hf_oran_rbg_mask_7;
274static int hf_oran_rbg_mask_6;
275static int hf_oran_rbg_mask_5;
276static int hf_oran_rbg_mask_4;
277static int hf_oran_rbg_mask_3;
278static int hf_oran_rbg_mask_2;
279static int hf_oran_rbg_mask_1;
280static int hf_oran_rbg_mask_0;
281
282static int hf_oran_exponent;
283static int hf_oran_iq_user_data;
284
285static int hf_oran_disable_bfws;
286static int hf_oran_rad;
287static int hf_oran_num_bund_prbs;
288static int hf_oran_beam_id;
289static int hf_oran_num_weights_per_bundle;
290
291static int hf_oran_ack_nack_req_id;
292
293static int hf_oran_frequency_range;
294static int hf_oran_off_start_prb;
295static int hf_oran_num_prb;
296
297static int hf_oran_samples_prb;
298static int hf_oran_ciSample;
299static int hf_oran_ciIsample;
300static int hf_oran_ciQsample;
301
302static int hf_oran_se10_port;
303static int hf_oran_beamGroupType;
304static int hf_oran_numPortc;
305
306static int hf_oran_csf;
307static int hf_oran_modcompscaler;
308
309static int hf_oran_modcomp_param_set;
310static int hf_oran_mc_scale_re_mask_re1;
311static int hf_oran_mc_scale_re_mask_re2;
312static int hf_oran_mc_scale_re_mask_re3;
313static int hf_oran_mc_scale_re_mask_re4;
314static int hf_oran_mc_scale_re_mask_re5;
315static int hf_oran_mc_scale_re_mask_re6;
316static int hf_oran_mc_scale_re_mask_re7;
317static int hf_oran_mc_scale_re_mask_re8;
318static int hf_oran_mc_scale_re_mask_re9;
319static int hf_oran_mc_scale_re_mask_re10;
320static int hf_oran_mc_scale_re_mask_re11;
321static int hf_oran_mc_scale_re_mask_re12;
322static int hf_oran_mc_scale_re_mask_re1_even;
323static int hf_oran_mc_scale_re_mask_re2_even;
324static int hf_oran_mc_scale_re_mask_re3_even;
325static int hf_oran_mc_scale_re_mask_re4_even;
326static int hf_oran_mc_scale_re_mask_re5_even;
327static int hf_oran_mc_scale_re_mask_re6_even;
328static int hf_oran_mc_scale_re_mask_re7_even;
329static int hf_oran_mc_scale_re_mask_re8_even;
330static int hf_oran_mc_scale_re_mask_re9_even;
331static int hf_oran_mc_scale_re_mask_re10_even;
332static int hf_oran_mc_scale_re_mask_re11_even;
333static int hf_oran_mc_scale_re_mask_re12_even;
334
335static int hf_oran_mc_scale_re_mask;
336static int hf_oran_mc_scale_re_mask_even;
337
338static int hf_oran_mc_scale_offset;
339
340static int hf_oran_eAxC_mask;
341static int hf_oran_technology;
342static int hf_oran_nullLayerInd;
343
344static int hf_oran_se19_repetition;
345static int hf_oran_portReMask;
346static int hf_oran_portSymbolMask;
347
348static int hf_oran_ext19_port;
349
350static int hf_oran_prb_allocation;
351static int hf_oran_nextSymbolId;
352static int hf_oran_nextStartPrbc;
353
354static int hf_oran_puncPattern;
355static int hf_oran_numPuncPatterns;
356static int hf_oran_symbolMask_ext20;
357static int hf_oran_startPuncPrb;
358static int hf_oran_numPuncPrb;
359static int hf_oran_puncReMask;
360static int hf_oran_multiSDScope;
361static int hf_oran_RbgIncl;
362
363static int hf_oran_ci_prb_group_size;
364static int hf_oran_prg_size_st5;
365static int hf_oran_prg_size_st6;
366
367static int hf_oran_num_ueid;
368
369static int hf_oran_antMask;
370
371static int hf_oran_transmissionWindowOffset;
372static int hf_oran_transmissionWindowSize;
373static int hf_oran_toT;
374
375static int hf_oran_bfaCompHdr;
376static int hf_oran_bfAzPtWidth;
377static int hf_oran_bfZePtWidth;
378static int hf_oran_bfAz3ddWidth;
379static int hf_oran_bfZe3ddWidth;
380static int hf_oran_bfAzPt;
381static int hf_oran_bfZePt;
382static int hf_oran_bfAz3dd;
383static int hf_oran_bfZe3dd;
384static int hf_oran_bfAzSl;
385static int hf_oran_bfZeSl;
386
387static int hf_oran_cmd_scope;
388static int hf_oran_number_of_st4_cmds;
389
390static int hf_oran_st4_cmd_header;
391static int hf_oran_st4_cmd_type;
392static int hf_oran_st4_cmd_len;
393static int hf_oran_st4_cmd_num_slots;
394static int hf_oran_st4_cmd_ack_nack_req_id;
395
396static int hf_oran_st4_cmd;
397
398static int hf_oran_sleepmode_trx;
399static int hf_oran_sleepmode_asm;
400static int hf_oran_log2maskbits;
401static int hf_oran_num_slots_ext;
402static int hf_oran_antMask_trx_control;
403
404static int hf_oran_max_pwr_lvl_ind;
405static int hf_oran_array_carrier_max_pwr_reduction;
406static int hf_oran_port_list_en;
407static int hf_oran_tpmi_mode;
408static int hf_oran_num_ueid_se34;
409static int hf_oran_ueid_se34;
410static int hf_oran_num_port_list_index;
411static int hf_oran_chan_srs_port_mask;
412
413
414static int hf_oran_ready;
415static int hf_oran_number_of_acks;
416static int hf_oran_number_of_nacks;
417static int hf_oran_ackid;
418static int hf_oran_nackid;
419
420static int hf_oran_acknack_request_frame;
421static int hf_oran_acknack_request_time;
422static int hf_oran_acknack_request_type;
423static int hf_oran_acknack_response_frame;
424static int hf_oran_acknack_response_time;
425
426static int hf_oran_disable_tdbfns;
427static int hf_oran_td_beam_group;
428static int hf_oran_disable_tdbfws;
429static int hf_oran_td_beam_num;
430
431static int hf_oran_dir_pattern;
432static int hf_oran_guard_pattern;
433
434static int hf_oran_ecpri_pcid;
435static int hf_oran_ecpri_rtcid;
436static int hf_oran_ecpri_seqid;
437
438static int hf_oran_num_sym_prb_pattern;
439static int hf_oran_prb_mode;
440static int hf_oran_sym_prb_pattern;
441static int hf_oran_sym_mask;
442static int hf_oran_num_mc_scale_offset;
443static int hf_oran_prb_pattern;
444static int hf_oran_prb_blk_offset;
445static int hf_oran_prb_blk_size;
446
447static int hf_oran_codebook_index;
448static int hf_oran_layerid;
449static int hf_oran_numlayers;
450static int hf_oran_txscheme;
451static int hf_oran_crs_remask;
452static int hf_oran_crs_shift;
453static int hf_oran_crs_symnum;
454static int hf_oran_beamid_ap1;
455static int hf_oran_beamid_ap2;
456static int hf_oran_beamid_ap3;
457
458static int hf_oran_port_list_index;
459static int hf_oran_alpn_per_sym;
460static int hf_oran_ant_dmrs_snr;
461static int hf_oran_user_group_size;
462static int hf_oran_user_group_id;
463static int hf_oran_entry_type;
464static int hf_oran_dmrs_port_number;
465static int hf_oran_ueid_reset;
466
467static int hf_oran_dmrs_symbol_mask;
468static int hf_oran_dmrs_symbol_mask_s13;
469static int hf_oran_dmrs_symbol_mask_s12;
470static int hf_oran_dmrs_symbol_mask_s11;
471static int hf_oran_dmrs_symbol_mask_s10;
472static int hf_oran_dmrs_symbol_mask_s9;
473static int hf_oran_dmrs_symbol_mask_s8;
474static int hf_oran_dmrs_symbol_mask_s7;
475static int hf_oran_dmrs_symbol_mask_s6;
476static int hf_oran_dmrs_symbol_mask_s5;
477static int hf_oran_dmrs_symbol_mask_s4;
478static int hf_oran_dmrs_symbol_mask_s3;
479static int hf_oran_dmrs_symbol_mask_s2;
480static int hf_oran_dmrs_symbol_mask_s1;
481static int hf_oran_dmrs_symbol_mask_s0;
482
483static int hf_oran_scrambling;
484static int hf_oran_nscid;
485static int hf_oran_dtype;
486static int hf_oran_cmd_without_data;
487static int hf_oran_lambda;
488static int hf_oran_first_prb;
489static int hf_oran_last_prb;
490static int hf_oran_low_papr_type;
491static int hf_oran_hopping_mode;
492
493static int hf_oran_tx_win_for_on_air_symbol_l;
494static int hf_oran_tx_win_for_on_air_symbol_r;
495
496static int hf_oran_num_fo_fb;
497static int hf_oran_freq_offset_fb;
498
499static int hf_oran_num_ue_sinr_rpt;
500static int hf_oran_num_sinr_per_prb;
501static int hf_oran_num_sinr_per_prb_right;
502static int hf_oran_num_sinr_per_prb_st9;
503
504static int hf_oran_sinr_value;
505
506static int hf_oran_measurement_report;
507static int hf_oran_mf;
508static int hf_oran_meas_data_size;
509static int hf_oran_meas_type_id;
510static int hf_oran_ipn_power;
511static int hf_oran_ue_tae;
512static int hf_oran_ue_layer_power;
513static int hf_oran_num_elements;
514static int hf_oran_ant_dmrs_snr_val;
515static int hf_oran_ue_freq_offset;
516static int hf_oran_curr_ue_freq_offset;
517
518static int hf_oran_measurement_command;
519
520static int hf_oran_beam_type;
521static int hf_oran_meas_cmd_size;
522
523static int hf_oran_symbol_reordering_layer;
524static int hf_oran_dmrs_entry;
525
526static int hf_oran_c_section_common;
527static int hf_oran_c_section;
528static int hf_oran_u_section;
529
530static const unit_name_string units_decibelfs = { " dBFS", NULL((void*)0) };
531static int hf_oran_u_prb_power;
532static int hf_oran_u_total_power;
533static int hf_oran_u_peak_power;
534
535static int hf_oran_u_section_ul_symbol_time;
536static int hf_oran_u_section_ul_symbol_frames;
537static int hf_oran_u_section_ul_symbol_first_frame;
538static int hf_oran_u_section_ul_symbol_last_frame;
539
540static int hf_oran_cd_scg_size;
541static int hf_oran_cd_scg_phase_step;
542
543static int hf_oran_sinr_prb;
544static int hf_oran_oru_control_sinr_slot_mask_id;
545static int hf_oran_pos_meas;
546
547static int hf_oran_ue_radial_speed;
548static int hf_oran_ue_az_aoa;
549static int hf_oran_ue_ze_aoa;
550static int hf_oran_ue_pos_toa_offset;
551
552static int hf_oran_num_rep_ue;
553static int hf_oran_rep_ueid;
554static int hf_oran_is_last_rep;
555static int hf_oran_rep_index;
556static int hf_oran_num_reps;
557
558static int hf_oran_mcs_table;
559static int hf_oran_mcs_index;
560
561static int hf_oran_num_meas_req;
562static int hf_oran_num_of_ue_ant_ports;
563static int hf_oran_ue_rank;
564static int hf_oran_codebook_subset;
565static int hf_oran_full_pwr_mode;
566static int hf_oran_full_pwr_mode_2_tpmi_group;
567
568static int hf_oran_num_cand_ranks;
569static int hf_oran_ue_pref_rank;
570static int hf_oran_ue_tpmi_rank_y;
571static int hf_oran_ue_tpmi_rank_y_sinr_lx;
572static int hf_oran_ue_layer_pre_eq_sinr;
573
574static int hf_oran_chan_type_sel;
575static int hf_oran_srs_meas_port_mask;
576static int hf_oran_srs_ue_port_wb_power;
577static int hf_oran_srs_ue_port_wb_sinr;
578
579/* Computed fields */
580static int hf_oran_c_eAxC_ID;
581static int hf_oran_refa;
582
583static int hf_oran_bfws_frame_defined;
584static int hf_oran_bfws_symbols_since_defined;
585
586static int hf_oran_corresponding_cplane_frame;
587static int hf_oran_corresponding_cplane_frame_time_delta;
588static int hf_oran_corresponding_uplane_frame;
589static int hf_oran_corresponding_uplane_frames_total;
590
591
592/* Convenient fields for filtering, mostly shown as hidden */
593static int hf_oran_cplane;
594static int hf_oran_uplane;
595static int hf_oran_bf; /* to match frames that configure beamforming in any way */
596static int hf_oran_zero_prb;
597static int hf_oran_nonzero_prb;
598static int hf_oran_bundle_weights_all_zero;
599static int hf_oran_ul_cplane_ud_comp_hdr_frame;
600static int hf_oran_delta_to_expected_ul_symbol_time;
601static int hf_oran_delta_to_expected_dl_symbol_time;
602
603/* For reassembly */
604static int hf_oran_fragments;
605static int hf_oran_fragment;
606static int hf_oran_fragment_overlap;
607static int hf_oran_fragment_overlap_conflict;
608static int hf_oran_fragment_multiple_tails;
609static int hf_oran_fragment_too_long_fragment;
610static int hf_oran_fragment_error;
611static int hf_oran_fragment_count;
612static int hf_oran_reassembled_in;
613static int hf_oran_reassembled_length;
614static int hf_oran_reassembled_data;
615
616static int hf_oran_payload;
617
618
619/* Subtrees */
620static int ett_oran;
621static int ett_oran_ecpri_rtcid;
622static int ett_oran_ecpri_pcid;
623static int ett_oran_ecpri_seqid;
624static int ett_oran_section;
625static int ett_oran_section_type;
626static int ett_oran_u_timing;
627static int ett_oran_u_section;
628static int ett_oran_u_prb;
629static int ett_oran_iq;
630static int ett_oran_bfw_bundle;
631static int ett_oran_bfw;
632static int ett_oran_frequency_range;
633static int ett_oran_prb_cisamples;
634static int ett_oran_cisample;
635static int ett_oran_udcomphdr;
636static int ett_oran_udcompparam;
637static int ett_oran_cicomphdr;
638static int ett_oran_cicompparam;
639static int ett_oran_bfwcomphdr;
640static int ett_oran_bfwcompparam;
641static int ett_oran_ext19_port;
642static int ett_oran_prb_allocation;
643static int ett_oran_punc_pattern;
644static int ett_oran_bfacomphdr;
645static int ett_oran_modcomp_param_set;
646static int ett_oran_st4_cmd_header;
647static int ett_oran_st4_cmd;
648static int ett_oran_sym_prb_pattern;
649static int ett_oran_measurement_report;
650static int ett_oran_measurement_command;
651static int ett_oran_sresmask;
652static int ett_oran_c_section_common;
653static int ett_oran_c_section;
654static int ett_oran_remask;
655static int ett_oran_mc_scale_remask;
656static int ett_oran_symbol_reordering_layer;
657static int ett_oran_dmrs_entry;
658static int ett_oran_dmrs_symbol_mask;
659static int ett_oran_symbol_mask;
660static int ett_oran_active_beamspace_coefficient_mask;
661static int ett_oran_sinr_prb;
662static int ett_oran_rbgMask;
663static int ett_oran_se10_port;
664
665static int ett_oran_fragment;
666static int ett_oran_fragments;
667
668/* Dissector table for Section Extensions not in the standard, keyed by exttype. */
669static dissector_table_t oran_sectionextension_table;
670
671/* Reassembly table. */
672static reassembly_table oran_reassembly_table;
673
674static void *oran_key(const packet_info *pinfo _U___attribute__((unused)), const uint32_t id _U___attribute__((unused)), const void *data)
675{
676 return (void *)data;
677}
678
679static void oran_free_key(void *ptr _U___attribute__((unused)))
680{
681}
682
683static reassembly_table_functions oran_reassembly_table_functions =
684{
685 g_direct_hash,
686 g_direct_equal,
687 oran_key,
688 oran_key,
689 oran_free_key,
690 oran_free_key
691};
692
693static const fragment_items oran_frag_items = {
694 &ett_oran_fragment,
695 &ett_oran_fragments,
696 &hf_oran_fragments,
697 &hf_oran_fragment,
698 &hf_oran_fragment_overlap,
699 &hf_oran_fragment_overlap_conflict,
700 &hf_oran_fragment_multiple_tails,
701 &hf_oran_fragment_too_long_fragment,
702 &hf_oran_fragment_error,
703 &hf_oran_fragment_count,
704 &hf_oran_reassembled_in,
705 &hf_oran_reassembled_length,
706 &hf_oran_reassembled_data,
707 "O-RAN FH CUS fragments"
708};
709
710
711/* Don't want all extensions to open and close together. Use [extType-1] entry */
712static int ett_oran_c_section_extension[HIGHEST_EXTTYPE35];
713
714/* Expert info */
715static expert_field ei_oran_unsupported_bfw_compression_method;
716static expert_field ei_oran_invalid_sample_bit_width;
717static expert_field ei_oran_reserved_numBundPrb;
718static expert_field ei_oran_extlen_wrong;
719static expert_field ei_oran_invalid_eaxc_bit_width;
720static expert_field ei_oran_extlen_zero;
721static expert_field ei_oran_rbg_size_reserved;
722static expert_field ei_oran_frame_length;
723static expert_field ei_oran_numprbc_ext21_zero;
724static expert_field ei_oran_ci_prb_group_size_reserved;
725static expert_field ei_oran_st8_nackid;
726static expert_field ei_oran_st4_no_cmds;
727static expert_field ei_oran_st4_zero_len_cmd;
728static expert_field ei_oran_st4_wrong_len_cmd;
729static expert_field ei_oran_st4_unknown_cmd;
730static expert_field ei_oran_mcot_out_of_range;
731static expert_field ei_oran_se10_unknown_beamgrouptype;
732static expert_field ei_oran_se10_not_allowed;
733static expert_field ei_oran_start_symbol_id_not_zero;
734static expert_field ei_oran_trx_control_cmd_scope;
735static expert_field ei_oran_unhandled_se;
736static expert_field ei_oran_bad_symbolmask;
737static expert_field ei_oran_numslots_not_zero;
738static expert_field ei_oran_version_unsupported;
739static expert_field ei_oran_laa_msg_type_unsupported;
740static expert_field ei_oran_se_on_unsupported_st;
741static expert_field ei_oran_cplane_unexpected_sequence_number_ul;
742static expert_field ei_oran_cplane_unexpected_sequence_number_dl;
743static expert_field ei_oran_uplane_unexpected_sequence_number_ul;
744static expert_field ei_oran_uplane_unexpected_sequence_number_dl;
745static expert_field ei_oran_acknack_no_request;
746static expert_field ei_oran_udcomphdr_should_be_zero;
747static expert_field ei_oran_radio_fragmentation_c_plane;
748static expert_field ei_oran_lastRbdid_out_of_range;
749static expert_field ei_oran_rbgMask_beyond_last_rbdid;
750static expert_field ei_oran_unexpected_measTypeId;
751static expert_field ei_oran_unsupported_compression_method;
752static expert_field ei_oran_ud_comp_len_wrong_size;
753static expert_field ei_oran_sresmask2_not_zero_with_rb;
754static expert_field ei_oran_st6_rb_shall_be_0;
755static expert_field ei_oran_st9_not_ul;
756static expert_field ei_oran_st10_numsymbol_not_14;
757static expert_field ei_oran_st10_startsymbolid_not_0;
758static expert_field ei_oran_st10_not_ul;
759static expert_field ei_oran_se24_nothing_to_inherit;
760static expert_field ei_oran_num_sinr_per_prb_unknown;
761static expert_field ei_oran_start_symbol_id_bits_ignored;
762static expert_field ei_oran_user_group_id_reserved_value;
763static expert_field ei_oran_port_list_index_zero;
764static expert_field ei_oran_ul_uplane_symbol_too_long;
765static expert_field ei_oran_reserved_not_zero;
766static expert_field ei_oran_too_many_symbols;
767static expert_field ei_oran_se30_not_ul;
768static expert_field ei_oran_se30_unknown_ueid;
769static expert_field ei_oran_beamid_bfws_not_found;
770static expert_field ei_oran_syminc_set_for_uplane;
771static expert_field ei_oran_cplane_entry_not_found;
772static expert_field ei_oran_se12_rb_set;
773static expert_field ei_oran_se5_re_mask_bits_not_covered;
774static expert_field ei_oran_se5_re_mask_bit_repeated;
775static expert_field ei_oran_se5_re_mask_bit_not_in_re_mask;
776static expert_field ei_oran_se5_re_zero_re_mask;
777
778
779/* These are the message types handled by this dissector. Others have handling in packet-ecpri.c */
780#define ECPRI_MT_IQ_DATA0 0
781#define ECPRI_MT_RT_CTRL_DATA2 2
782
783
784/* Preference settings - try to set reasonable defaults */
785static unsigned pref_du_port_id_bits = 4;
786static unsigned pref_bandsector_id_bits = 4;
787static unsigned pref_cc_id_bits = 4;
788static unsigned pref_ru_port_id_bits = 4;
789
790/* TODO: ideally should be per-flow */
791static unsigned pref_sample_bit_width_uplink = 14;
792static unsigned pref_sample_bit_width_downlink = 14;
793static unsigned pref_sample_bit_width_sinr = 14;
794
795/* TODO: these ideally should be per-flow too */
796static int pref_iqCompressionUplink = COMP_BLOCK_FP1;
797static int pref_iqCompressionDownlink = COMP_BLOCK_FP1;
798
799static int pref_iqCompressionSINR = COMP_BLOCK_FP1;
800
801
802/* Is udCompHeader present (both directions) */
803static int pref_includeUdCompHeaderUplink = 2; /* start using heuristic */
804static int pref_includeUdCompHeaderDownlink = 2; /* start using heuristic */
805
806/* Are we ignoring UL C-Plane udCompHdr? */
807static bool_Bool pref_override_ul_compression = false0;
808
809static unsigned pref_data_plane_section_total_rbs = 273;
810static unsigned pref_num_bf_antennas = 32;
811static bool_Bool pref_showIQSampleValues = true1;
812
813/* Based upon m-plane param, so will be system-wide */
814static int pref_support_udcompLen = 2; /* start heuristic, can force other settings if necessary */
815static bool_Bool udcomplen_heuristic_result_set = false0;
816static bool_Bool udcomplen_heuristic_result = false0;
817
818/* st6-4byte-alignment-required */
819static bool_Bool st6_4byte_alignment = false0;
820
821/* Requested, allows I/Q to be stored as integers.. */
822static bool_Bool show_unscaled_values = false0;
823
824/* Initialized off. Timing is in microseconds. */
825static unsigned us_allowed_for_ul_in_symbol = 0;
826
827/* Reassemble U-Plane (at Radio Transport layer) */
828static bool_Bool do_radio_transport_layer_reassembly = true1;
829
830/* Expected symbol duration. Initialize to 100MHz case (Mu=1) */
831static unsigned pref_symbol_time = 36;
832
833/* Link U-plane back to C-plane using sectionIds */
834static bool_Bool link_planes_together = true1;
835
836static const enum_val_t dl_compression_options[] = {
837 { "COMP_NONE", "No Compression", COMP_NONE0 },
838 { "COMP_BLOCK_FP", "Block Floating Point Compression", COMP_BLOCK_FP1 },
839 { "COMP_BLOCK_SCALE", "Block Scaling Compression", COMP_BLOCK_SCALE2 },
840 { "COMP_U_LAW", "u-Law Compression", COMP_U_LAW3 },
841 { "COMP_MODULATION", "Modulation Compression", COMP_MODULATION4 },
842 { "BFP_AND_SELECTIVE_RE", "Block Floating Point + selective RE sending", BFP_AND_SELECTIVE_RE5 },
843 { "MOD_COMPR_AND_SELECTIVE_RE", "Modulation Compression + selective RE sending", MOD_COMPR_AND_SELECTIVE_RE6 },
844 { "BFP_AND_SELECTIVE_RE_WITH_MASKS", "Block Floating Point + selective RE sending with masks in section header", BFP_AND_SELECTIVE_RE_WITH_MASKS7 },
845 { "MOD_COMPR_AND_SELECTIVE_RE_WITH_MASKS", "Modulation Compression + selective RE sending with masks in section header", MOD_COMPR_AND_SELECTIVE_RE_WITH_MASKS8 },
846 { NULL((void*)0), NULL((void*)0), 0 }
847};
848
849/* No Modulation compression in UL.. */
850static const enum_val_t ul_compression_options[] = {
851 { "COMP_NONE", "No Compression", COMP_NONE0 },
852 { "COMP_BLOCK_FP", "Block Floating Point Compression", COMP_BLOCK_FP1 },
853 { "COMP_BLOCK_SCALE", "Block Scaling Compression", COMP_BLOCK_SCALE2 },
854 { "COMP_U_LAW", "u-Law Compression", COMP_U_LAW3 },
855 { "BFP_AND_SELECTIVE_RE", "Block Floating Point + selective RE sending", BFP_AND_SELECTIVE_RE5 },
856 { "BFP_AND_SELECTIVE_RE_WITH_MASKS", "Block Floating Point + selective RE sending with masks in section header", BFP_AND_SELECTIVE_RE_WITH_MASKS7 },
857 { NULL((void*)0), NULL((void*)0), 0 }
858};
859
860static const enum_val_t udcomplen_support_options[] = {
861 { "NOT_SUPPORTED", "Not Supported", 0 },
862 { "SUPPORTED", "Supported", 1 },
863 { "HEURISTIC", "Attempt Heuristic", 2 },
864 { NULL((void*)0), NULL((void*)0), 0 }
865};
866
867static const enum_val_t udcomphdr_present_options[] = {
868 { "NOT_PRESENT", "Not Present", 0 },
869 { "PRESENT", "Present", 1 },
870 { "HEURISTIC", "Attempt Heuristic", 2 },
871 { NULL((void*)0), NULL((void*)0), 0 }
872};
873
874
875
876static const value_string e_bit[] = {
877 { 0, "More fragments follow" },
878 { 1, "Last fragment" },
879 { 0, NULL((void*)0)}
880};
881
882#define DIR_UPLINK0 0
883#define DIR_DOWNLINK1 1
884
885
886static const value_string data_direction_vals[] = {
887 { DIR_UPLINK0, "Uplink" }, /* gNB Rx */
888 { DIR_DOWNLINK1, "Downlink" }, /* gNB Tx */
889 { 0, NULL((void*)0)}
890};
891
892static const value_string rb_vals[] = {
893 { 0, "Every RB used" },
894 { 1, "Every other RB used" },
895 { 0, NULL((void*)0)}
896};
897
898static const value_string sym_inc_vals[] = {
899 { 0, "Use the current symbol number" },
900 { 1, "Increment the current symbol number" },
901 { 0, NULL((void*)0)}
902};
903
904static const value_string lbtMode_vals[] = {
905 { 0, "Full LBT (regular LBT, sending reservation signal until the beginning of the SF/slot)" },
906 { 1, "Partial LBT (looking back 25 usec prior to transmission" },
907 { 2, "Partial LBT (looking back 34 usec prior to transmission" },
908 { 3, "Full LBT and stop (regular LBT, without sending reservation signal" },
909 { 0, NULL((void*)0)}
910};
911
912static const value_string ue_rank_vals[] = {
913 { 1, "1" },
914 { 2, "2" },
915 { 3, "3" },
916 { 4, "4" },
917 { 0, NULL((void*)0)}
918};
919
920static const value_string num_of_ue_ant_ports_vals[] = {
921 { 2, "2" },
922 { 4, "4" },
923 { 0, NULL((void*)0)}
924};
925
926static const value_string codebook_subset_vals[] = {
927 { 0, "nonCoherent" },
928 { 1, "partialAndNonCoherent" },
929 { 2, "fullyAndPartialAndNonCoherent" },
930 { 3, "reserved" },
931 { 0, NULL((void*)0)}
932};
933
934
935static const range_string filter_indices[] = {
936 {0, 0, "standard channel filter"},
937 {1, 1, "UL filter for PRACH preamble formats 0, 1, 2; min. passband 839 x 1.25kHz = 1048.75 kHz"},
938 {2, 2, "UL filter for PRACH preamble format 3, min. passband 839 x 5 kHz = 4195 kHz"},
939 {3, 3, "UL filter for PRACH preamble formats A1, A2, A3, B1, B2, B3, B4, C0, C2; min. passband 139 x \u0394fRA"},
940 {4, 4, "UL filter for NPRACH 0, 1; min. passband 48 x 3.75KHz = 180 KHz"},
941 {5, 5, "UL filter for PRACH preamble formats"},
942 {8, 8, "UL filter NPUSCH"},
943 {9, 9, "Mixed numerology and other channels except PRACH and NB-IoT"},
944 {9, 15, "Reserved"},
945 {0, 0, NULL((void*)0)}
946};
947
948/* 7.3.1-1 */
949static const range_string section_types[] = {
950 { SEC_C_UNUSED_RB, SEC_C_UNUSED_RB, "Unused Resource Blocks or symbols in Downlink or Uplink" },
951 { SEC_C_NORMAL, SEC_C_NORMAL, "Most DL/UL radio channels" },
952 { SEC_C_RSVD2, SEC_C_RSVD2, "Reserved for future use" },
953 { SEC_C_PRACH, SEC_C_PRACH, "PRACH and mixed-numerology channels" },
954 { SEC_C_SLOT_CONTROL, SEC_C_SLOT_CONTROL, "Slot Configuration Control" },
955 { SEC_C_UE_SCHED, SEC_C_UE_SCHED, "UE scheduling information (UE-ID assignment to section)" },
956 { SEC_C_CH_INFO, SEC_C_CH_INFO, "Channel information" },
957 { SEC_C_LAA, SEC_C_LAA, "LAA (License Assisted Access)" },
958 { SEC_C_ACK_NACK_FEEDBACK, SEC_C_ACK_NACK_FEEDBACK, "ACK/NACK Feedback" },
959 { SEC_C_SINR_REPORTING, SEC_C_SINR_REPORTING, "SINR Reporting" },
960 { SEC_C_RRM_MEAS_REPORTS, SEC_C_RRM_MEAS_REPORTS, "RRM Measurement Reports" },
961 { SEC_C_REQUEST_RRM_MEAS, SEC_C_REQUEST_RRM_MEAS, "Request RRM Measurements" },
962 { SEC_C_SRS_DESCRIPTION, SEC_C_SRS_DESCRIPTION, "SRS Description" },
963 { SEC_C_RRM_MEAS_REPORTS_NON_TIMING, SEC_C_RRM_MEAS_REPORTS_NON_TIMING, "RRM Measurement reports - no-timing-controller" },
964 { SEC_C_CO_SCHEDULING_INFO, SEC_C_CO_SCHEDULING_INFO, "Co-scheduling information" },
965 { SEC_C_MAX_INDEX, 255, "Reserved for future use" },
966 { 0, 0, NULL((void*)0)} };
967
968static const range_string section_types_short[] = {
969 { SEC_C_UNUSED_RB, SEC_C_UNUSED_RB, "(Unused RBs)" },
970 { SEC_C_NORMAL, SEC_C_NORMAL, "(Most channels)" },
971 { SEC_C_RSVD2, SEC_C_RSVD2, "(reserved)" },
972 { SEC_C_PRACH, SEC_C_PRACH, "(PRACH/mixed-\u03bc)" },
973 { SEC_C_SLOT_CONTROL, SEC_C_SLOT_CONTROL, "(Slot info)" },
974 { SEC_C_UE_SCHED, SEC_C_UE_SCHED, "(UE scheduling info)" },
975 { SEC_C_CH_INFO, SEC_C_CH_INFO, "(Channel info)" },
976 { SEC_C_LAA, SEC_C_LAA, "(LAA)" },
977 { SEC_C_ACK_NACK_FEEDBACK, SEC_C_ACK_NACK_FEEDBACK, "(ACK/NACK)" },
978 { SEC_C_SINR_REPORTING, SEC_C_SINR_REPORTING, "(SINR Reporting)" },
979 { SEC_C_RRM_MEAS_REPORTS, SEC_C_RRM_MEAS_REPORTS, "(RRM Meas Reports)" },
980 { SEC_C_REQUEST_RRM_MEAS, SEC_C_REQUEST_RRM_MEAS, "(Req RRM Meas)" },
981 { SEC_C_SRS_DESCRIPTION, SEC_C_SRS_DESCRIPTION, "(SRS Description)" },
982 { SEC_C_RRM_MEAS_REPORTS_NON_TIMING, SEC_C_RRM_MEAS_REPORTS_NON_TIMING, "(RRM Meas reports - NT)" },
983 { SEC_C_CO_SCHEDULING_INFO, SEC_C_CO_SCHEDULING_INFO, "(Co-scheduling)" },
984 { SEC_C_MAX_INDEX, 255, "Reserved for future use" },
985 { 0, 0, NULL((void*)0) }
986};
987
988static const range_string ud_comp_header_width[] = {
989 {0, 0, "I and Q are each 16 bits wide"},
990 {1, 15, "Bit width of I and Q"},
991 {0, 0, NULL((void*)0)} };
992
993/* Table 8.3.3.13-3 */
994static const range_string ud_comp_header_meth[] = {
995 {COMP_NONE0, COMP_NONE0, "No compression" },
996 {COMP_BLOCK_FP1, COMP_BLOCK_FP1, "Block floating point compression" },
997 {COMP_BLOCK_SCALE2, COMP_BLOCK_SCALE2, "Block scaling" },
998 {COMP_U_LAW3, COMP_U_LAW3, "Mu - law" },
999 {COMP_MODULATION4, COMP_MODULATION4, "Modulation compression" },
1000 {BFP_AND_SELECTIVE_RE5, BFP_AND_SELECTIVE_RE5, "BFP + selective RE sending" },
1001 {MOD_COMPR_AND_SELECTIVE_RE6, MOD_COMPR_AND_SELECTIVE_RE6, "mod-compr + selective RE sending" },
1002 {BFP_AND_SELECTIVE_RE_WITH_MASKS7, BFP_AND_SELECTIVE_RE_WITH_MASKS7, "BFP + selective RE sending with masks in section header" },
1003 {MOD_COMPR_AND_SELECTIVE_RE_WITH_MASKS8, MOD_COMPR_AND_SELECTIVE_RE_WITH_MASKS8, "mod-compr + selective RE sending with masks in section header"},
1004 {9, 15, "Reserved"},
1005 {0, 0, NULL((void*)0)}
1006};
1007
1008/* Table 7.5.2.13-2 */
1009static const range_string frame_structure_fft[] = {
1010 {0, 0, "Reserved (no FFT/iFFT processing)"},
1011 {1, 3, "Reserved"},
1012 {4, 4, "FFT size 16"},
1013 {5, 5, "FFT size 32"},
1014 {6, 6, "FFT size 64"},
1015 {7, 7, "FFT size 128"},
1016 {8, 8, "FFT size 256"},
1017 {9, 9, "FFT size 512"},
1018 {10, 10, "FFT size 1024"},
1019 {11, 11, "FFT size 2048"},
1020 {12, 12, "FFT size 4096"},
1021 {13, 13, "FFT size 1536"},
1022 {14, 14, "FFT size 3072"},
1023 {15, 15, "Reserved"},
1024 {0, 0, NULL((void*)0)}
1025};
1026
1027/* Table 7.5.2.13-3 */
1028static const range_string subcarrier_spacings[] = {
1029 { 0, 0, "SCS 15 kHz, 1 slot/subframe, slot length 1 ms" },
1030 { 1, 1, "SCS 30 kHz, 2 slots/subframe, slot length 500 \u03bcs" },
1031 { 2, 2, "SCS 60 kHz, 4 slots/subframe, slot length 250 \u03bcs" },
1032 { 3, 3, "SCS 120 kHz, 8 slots/subframe, slot length 125 \u03bcs" },
1033 { 4, 4, "SCS 240 kHz, 16 slots/subframe, slot length 62.5 \u03bcs" },
1034 { 5, 11, "Reserved" }, /* N.B., 5 was 480kHz in early spec versions */
1035 { 12, 12, "SCS 1.25 kHz, 1 slot/subframe, slot length 1 ms" },
1036 { 13, 13, "SCS 3.75 kHz(LTE - specific), 1 slot/subframe, slot length 1 ms" },
1037 { 14, 14, "SCS 5 kHz, 1 slot/subframe, slot length 1 ms" },
1038 { 15, 15, "SCS 7.5 kHz(LTE - specific), 1 slot/subframe, slot length 1 ms" },
1039 { 0, 0, NULL((void*)0) }
1040};
1041
1042/* Table 7.5.3.14-1 laaMsgType definition */
1043static const range_string laaMsgTypes[] = {
1044 {0, 0, "LBT_PDSCH_REQ - lls - O-DU to O-RU request to obtain a PDSCH channel"},
1045 {1, 1, "LBT_DRS_REQ - lls - O-DU to O-RU request to obtain the channel and send DRS"},
1046 {2, 2, "LBT_PDSCH_RSP - O-RU to O-DU response, channel acq success or failure"},
1047 {3, 3, "LBT_DRS_RSP - O-RU to O-DU response, DRS sending success or failure"},
1048 {4, 4, "LBT_Buffer_Error - O-RU to O-DU response, reporting buffer overflow"},
1049 {5, 5, "LBT_CWCONFIG_REQ - O-DU to O-RU request, congestion window configuration"},
1050 {6, 6, "LBT_CWCONFIG_RST - O-RU to O-DU request, congestion window config, response"},
1051 {7, 15, "reserved for future methods"},
1052 {0, 0, NULL((void*)0)}
1053};
1054
1055/* 7.7.26.3 */
1056static const range_string freq_offset_fb_values[] = {
1057 {0, 0, "no frequency offset"},
1058 {8000, 8000, "value not provided"},
1059 {1, 30000, "positive frequency offset, (0, +0.5] subcarrier"},
1060 {0x8ad0, 0xffff, "negative frequency offset, [-0.5, 0) subcarrier"},
1061 {0x0, 0xffff, "reserved"},
1062 {0, 0, NULL((void*)0)}
1063};
1064
1065/* 7.5.3.78 */
1066static const range_string ue_tmpi_rank_sinr_vals[] = {
1067 {0, 0, "0 dB SINR"},
1068 {0x0001, 0x07ff, "positive SINR"},
1069 {0xf800, 0xffff, "-ve SINR"},
1070 {0x8000, 0x8000, "invalid measurement result"},
1071 {0x0, 0xffff, "reserved"},
1072 {0, 0, NULL((void*)0)}
1073};
1074
1075
1076
1077/* Table 7.5.2.19-1 */
1078static const value_string num_sinr_per_prb_vals[] = {
1079 { 0, "1" },
1080 { 1, "2" },
1081 { 2, "3" },
1082 { 3, "4" },
1083 { 4, "6" },
1084 { 5, "12" },
1085 { 6, "1 SINR value per section for DFT-s-OFDM" },
1086 { 7, "reserved" },
1087 { 0, NULL((void*)0)}
1088};
1089
1090static const value_string meas_type_id_vals[] = {
1091 { 1, "UE Timing Advance Error" },
1092 { 2, "UE Layer power" },
1093 { 3, "UE frequency offset" },
1094 { 4, "Interference plus Noise for allocated PRBs" },
1095 { 5, "Interference plus Noise for unallocated PRBs" },
1096 { 6, "DMRS-SNR per antenna" },
1097 { 7, "UE positioning measurement report" },
1098 { 8, "UE radial speed measurement report" },
1099 { 9, "UE post-equalization MU interference measurement" },
1100 { 10, "UE TPMI and rank recommendation measurement" },
1101 { 11, "UE layer pre-equalization SINR report" },
1102 { 12, "SRS UE port wideband signal power measurement report" },
1103 { 13, "SRS UE port wideband SINR measurement report" },
1104 { 14, "SRS wideband T-Matrix measurement report" },
1105 { 15, "SRS available port for beamforming measurement report" },
1106 { 16, "SRS discontinuous transmission measurement report" },
1107 { 17, "SRS UE port timing advance error measurement report" },
1108 { 18, "SRS UE port subband signal power measurement report" },
1109 { 19, "SRS UE port subband SINR measurement report" },
1110 { 20, "SRS port ordering measurement report" },
1111 { 21, "DMRS discontinuous transmission measurement report" },
1112 { 22, "Downlink post-equalization SINR measurement report" },
1113 { 23, "UE normalized beam power report" },
1114 { 24, "SRS unallocated comb offset IpN" },
1115 { 0, NULL((void*)0)}
1116};
1117
1118static const value_string beam_type_vals[] = {
1119 { 0, "List of beamId values" },
1120 { 1, "Range of beamId values" },
1121 { 0, NULL((void*)0)}
1122};
1123
1124/* 7.7.24.3 */
1125static const value_string entry_type_vals[] = {
1126 { 0, "inherit config from preceding entry (2 or 3) ueIdReset=0" },
1127 { 1, "inherit config from preceding entry (2 or 3) ueIdReset=1" },
1128 { 2, "related parameters if have transform precoding disabled " },
1129 { 3, "related parameters if have transform precoding enabled " },
1130 { 0, NULL((void*)0)}
1131};
1132
1133/* Table 7.7.29.3-1 */
1134static const range_string cd_scg_size_vals[] = {
1135 { 0, 0, "1 subcarrier" },
1136 { 1, 1, "1 RB x N subcarriers" },
1137 { 2, 2, "2 RB x N subcarriers" },
1138 { 3, 3, "4 RB x N subcarriers" },
1139 { 4, 4, "8 RB x N subcarriers" },
1140 { 5, 5, "16 RB x N subcarriers" },
1141 { 6, 6, "32 RB x N subcarriers" },
1142 { 7, 15, "reserved"},
1143 { 0, 0, NULL((void*)0)}
1144};
1145
1146/* 7.7.33.3 */
1147static const value_string chan_type_sel_vals[] = {
1148 { 0, "port channel index" },
1149 { 1, "layer channel index" },
1150 { 2, "reserved" },
1151 { 3, "reserved" },
1152 { 0, NULL((void*)0)}
1153};
1154
1155/* 7.7.34.4 */
1156static const value_string tpmi_mode_vals[] = {
1157 { 0, "Port selection mode" },
1158 { 1, "Explicit codebook mode" },
1159 { 0, NULL((void*)0)}
1160};
1161
1162
1163/* Table 7.6.1-1 */
1164static const value_string exttype_vals[] = {
1165 {0, "Reserved"},
1166 {1, "Beamforming weights"},
1167 {2, "Beamforming attributes"},
1168 {3, "DL Precoding configuration parameters and indications"},
1169 {4, "Modulation compr. params"},
1170 {5, "Modulation compression additional scaling parameters"},
1171 {6, "Non-contiguous PRB allocation"},
1172 {7, "Multiple-eAxC designation"},
1173 {8, "Regularization factor"},
1174 {9, "Dynamic Spectrum Sharing parameters"},
1175 {10, "Multiple ports grouping"},
1176 {11, "Flexible BF weights"},
1177 {12, "Non-Contiguous PRB Allocation with Frequency Ranges"},
1178 {13, "PRB Allocation with Frequency Hopping"},
1179 {14, "Nulling-layer Info. for ueId-based beamforming"},
1180 {15, "Mixed-numerology Info. for ueId-based beamforming"},
1181 {16, "Section description for antenna mapping in UE channel information based UL beamforming"},
1182 {17, "Section description for indication of user port group"},
1183 {18, "Section description for Uplink Transmission Management"},
1184 {19, "Compact beamforming information for multiple port"},
1185 {20, "Puncturing extension"},
1186 {21, "Variable PRB group size for channel information"},
1187 {22, "ACK/NACK request"},
1188 {23, "Multiple symbol modulation compression parameters"},
1189 {24, "PUSCH DMRS configuration"},
1190 {25, "Symbol reordering for DMRS-BF"},
1191 {26, "Frequency offset feedback"},
1192 {27, "O-DU controlled dimensionality reduction"},
1193 {28, "O-DU controlled frequency resolution for SINR reporting"},
1194 {29, "Cyclic delay adjustment"},
1195 {30, "PUSCH repetition indication"},
1196 {31, "MCS Information"},
1197 {32, "Rank and TPMI measurement request"},
1198 {33, "Dynamic channel type selection for SRS-BF-DL"},
1199 {34, "SRS-BF-UL Control"},
1200 {35, "Codebook-based beamforming parameters"},
1201 {0, NULL((void*)0)}
1202};
1203static value_string_ext exttype_vals_ext = VALUE_STRING_EXT_INIT(exttype_vals){ _try_val_to_str_ext_init, 0, (sizeof (exttype_vals) / sizeof
((exttype_vals)[0]))-1, exttype_vals, "exttype_vals", ((void
*)0) }
;
1204
1205
1206/**************************************************************************************/
1207/* Keep track for each Section Extension, which section types are allowed to carry it */
1208typedef struct {
1209 bool_Bool ST0;
1210 bool_Bool ST1;
1211 bool_Bool ST3;
1212 bool_Bool ST5;
1213 bool_Bool ST6;
1214 bool_Bool ST10;
1215 bool_Bool ST11;
1216 bool_Bool ST12;
1217 bool_Bool ST13;
1218 bool_Bool ST14;
1219} AllowedCTs_t;
1220
1221
1222static const AllowedCTs_t ext_cts[HIGHEST_EXTTYPE35] = {
1223 /* ST0 ST1 ST3 ST5 ST6 ST10 ST11 ST12 ST13 ST14 */
1224 { false0, true1, true1, false0, false0, false0, false0, false0, false0, false0 }, // SE 1 (1,3)
1225 { false0, true1, true1, false0, false0, false0, false0, false0, false0, false0 }, // SE 2 (1,3)
1226 { false0, true1, true1, false0, false0, false0, false0, false0, false0, false0 }, // SE 3 (1,3)
1227 { false0, true1, true1, true1, false0, false0, false0, false0, false0, false0 }, // SE 4 (1,3,5)
1228 { false0, true1, true1, true1, false0, false0, false0, false0, false0, false0 }, // SE 5 (1,3,5)
1229 { false0, true1, true1, true1, false0, true1, true1, false0, true1, false0 }, // SE 6 (1,3,5,10,11)
1230 { true1, false0, false0, false0, false0, false0, false0, false0, false0, false0 }, // SE 7 (0)
1231 { false0, false0, false0, true1, false0, false0, false0, false0, false0, false0 }, // SE 8 (5)
1232 { true1, true1, true1, true1, true1, true1, true1, false0, true1, false0 }, // SE 9 (all)
1233 { false0, true1, true1, true1, false0, false0, false0, false0, false0, false0 }, // SE 10 (1,3,5)
1234 { false0, true1, true1, false0, false0, false0, false0, false0, false0, false0 }, // SE 11 (1,3)
1235 { false0, true1, true1, true1, false0, true1, true1, false0, true1, false0 }, // SE 12 (1,3,5,10,11)
1236 { false0, true1, true1, true1, false0, false0, false0, false0, false0, false0 }, // SE 13 (1,3,5)
1237 { false0, false0, false0, true1, false0, false0, false0, false0, false0, false0 }, // SE 14 (5)
1238 { false0, false0, false0, true1, true1, false0, false0, false0, false0, false0 }, // SE 15 (5,6)
1239 { false0, false0, false0, true1, false0, false0, false0, false0, false0, false0 }, // SE 16 (5)
1240 { false0, false0, false0, true1, false0, false0, false0, false0, false0, false0 }, // SE 17 (5)
1241 { false0, true1, true1, true1, false0, false0, false0, false0, false0, false0 }, // SE 18 (1,3,5)
1242 { false0, true1, true1, false0, false0, false0, false0, false0, false0, false0 }, // SE 19 (1,3)
1243 { true1, true1, true1, true1, true1, true1, true1, false0, true1, false0 }, // SE 20 (0,1,3,5,10,11)
1244 { false0, false0, false0, true1, true1, false0, false0, false0, false0, false0 }, // SE 21 (5,6)
1245 { true1, true1, true1, true1, true1, true1, true1, false0, true1, false0 }, // SE 22 (all)
1246 { false0, true1, true1, true1, false0, false0, false0, false0, false0, false0 }, // SE 23 (1,3,5)
1247 { false0, false0, false0, true1, false0, false0, false0, false0, false0, false0 }, // SE 24 (5)
1248 { false0, false0, false0, true1, false0, false0, false0, false0, false0, false0 }, // SE 25 (5)
1249 { false0, false0, false0, true1, false0, false0, false0, false0, false0, false0 }, // SE 26 (5)
1250 { false0, false0, false0, true1, false0, false0, false0, false0, false0, false0 }, // SE 27 (5)
1251 { false0, false0, false0, true1, false0, false0, false0, false0, false0, false0 }, // SE 28 (5)
1252 { false0, true1, true1, true1, false0, false0, false0, false0, false0, false0 }, // SE 29 (1,3,5)
1253 { false0, false0, false0, true1, false0, false0, false0, false0, false0, false0 }, // SE 30 (5)
1254 { false0, true1, true1, true1, false0, false0, false0, false0, false0, false0 }, // SE 31 (1,3,5)
1255 { false0, false0, false0, true1, false0, false0, false0, true1 , false0, false0 }, // SE 32 (5, 14)
1256 { false0, false0, false0, true1, false0, false0, false0, false0, false0, true1 }, // SE 33 (5,14)
1257 { false0, false0, false0, true1, false0, false0, false0, false0, false0, false0 }, // SE 34 (5)
1258 { false0, false0, false0, true1, false0, false0, false0, false0, false0, false0 }, // SE 35 (5)
1259};
1260
1261static bool_Bool se_allowed_in_st(unsigned se, unsigned st)
1262{
1263 if (se==0 || se>HIGHEST_EXTTYPE35) {
1264 /* Don't know about new SE, so don't complain.. */
1265 return true1;
1266 }
1267
1268 switch (st) {
1269 case 0:
1270 return ext_cts[se-1].ST0;
1271 case 1:
1272 return ext_cts[se-1].ST1;
1273 case 3:
1274 return ext_cts[se-1].ST3;
1275 case 5:
1276 return ext_cts[se-1].ST5;
1277 case 6:
1278 return ext_cts[se-1].ST6;
1279 case 10:
1280 return ext_cts[se-1].ST10;
1281 case 11:
1282 return ext_cts[se-1].ST11;
1283 case 12:
1284 return ext_cts[se-1].ST12;
1285 case 13:
1286 return ext_cts[se-1].ST13;
1287 case 14:
1288 return ext_cts[se-1].ST14;
1289
1290 default:
1291 /* New/unknown section type that includes 'ef'.. assume ok */
1292 return true1;
1293 }
1294}
1295
1296/************************************************************************************/
1297
1298/* Table 7.7.1.2-2 */
1299static const value_string bfw_comp_headers_iq_width[] = {
1300 {0, "I and Q are 16 bits wide"},
1301 {1, "I and Q are 1 bit wide"},
1302 {2, "I and Q are 2 bits wide"},
1303 {3, "I and Q are 3 bits wide"},
1304 {4, "I and Q are 4 bits wide"},
1305 {5, "I and Q are 5 bits wide"},
1306 {6, "I and Q are 6 bits wide"},
1307 {7, "I and Q are 7 bits wide"},
1308 {8, "I and Q are 8 bits wide"},
1309 {9, "I and Q are 9 bits wide"},
1310 {10, "I and Q are 10 bits wide"},
1311 {11, "I and Q are 11 bits wide"},
1312 {12, "I and Q are 12 bits wide"},
1313 {13, "I and Q are 13 bits wide"},
1314 {14, "I and Q are 14 bits wide"},
1315 {15, "I and Q are 15 bits wide"},
1316 {0, NULL((void*)0)}
1317};
1318
1319/* Table 7.7.1.2-3 */
1320static const value_string bfw_comp_headers_comp_meth[] = {
1321 {COMP_NONE0, "no compression"},
1322 {COMP_BLOCK_FP1, "block floating point"},
1323 {COMP_BLOCK_SCALE2, "block scaling"},
1324 {COMP_U_LAW3, "u-law"},
1325 {4, "beamspace compression type I"},
1326 {5, "beamspace compression type II"},
1327 {0, NULL((void*)0)}
1328};
1329
1330/* 7.7.6.2 rbgSize (resource block group size) */
1331static const value_string rbg_size_vals[] = {
1332 {0, "reserved"},
1333 {1, "1"},
1334 {2, "2"},
1335 {3, "3"},
1336 {4, "4"},
1337 {5, "6"},
1338 {6, "8"},
1339 {7, "16"},
1340 {0, NULL((void*)0)}
1341};
1342
1343/* 7.7.6.5 */
1344static const value_string priority_vals[] = {
1345 {0, "0"},
1346 {1, "+1"},
1347 {2, "-2 (reserved, should not be used)"},
1348 {3, "-1"},
1349 {0, NULL((void*)0)}
1350};
1351
1352/* 7.7.10.2 beamGroupType */
1353static const value_string beam_group_type_vals[] = {
1354 {0x0, "common beam"},
1355 {0x1, "beam matrix indication"},
1356 {0x2, "beam vector listing"},
1357 {0x3, "beamId/ueId listing with associated port-list index"},
1358 {0, NULL((void*)0)}
1359};
1360
1361/* 7.7.9.2 technology (interface name) */
1362static const value_string interface_name_vals[] = {
1363 {0x0, "LTE"},
1364 {0x1, "NR"},
1365 {0, NULL((void*)0)}
1366};
1367
1368/* 7.7.18.4 toT (type of transmission) */
1369static const value_string type_of_transmission_vals[] = {
1370 {0x0, "normal transmission mode, data can be distributed in any way the O-RU is implemented to transmit data"},
1371 {0x1, "uniformly distributed over the transmission window"},
1372 {0x2, "Reserved"},
1373 {0x3, "Reserved"},
1374 {0, NULL((void*)0)}
1375};
1376
1377/* 7.7.2.2 (width of bfa parameters) */
1378static const value_string bfa_bw_vals[] = {
1379 {0, "no bits, the field is not applicable (e.g., O-RU does not support it) or the default value shall be used"},
1380 {1, "2-bit bitwidth"},
1381 {2, "3-bit bitwidth"},
1382 {3, "4-bit bitwidth"},
1383 {4, "5-bit bitwidth"},
1384 {5, "6-bit bitwidth"},
1385 {6, "7-bit bitwidth"},
1386 {7, "8-bit bitwidth"},
1387 {0, NULL((void*)0)}
1388};
1389
1390/* 7.7.2.7 & 7.7.2.8 */
1391static const value_string sidelobe_suppression_vals[] = {
1392 {0, "10 dB"},
1393 {1, "15 dB"},
1394 {2, "20 dB"},
1395 {3, "25 dB"},
1396 {4, "30 dB"},
1397 {5, "35 dB"},
1398 {6, "40 dB"},
1399 {7, ">= 45 dB"},
1400 {0, NULL((void*)0)}
1401};
1402
1403static const value_string lbtTrafficClass_vals[] = {
1404 {1, "Priority 1"},
1405 {2, "Priority 2"},
1406 {3, "Priority 3"},
1407 {4, "Priority 4"},
1408 {0, NULL((void*)0)}
1409};
1410
1411/* 7.5.3.22 */
1412static const value_string lbtPdschRes_vals[] = {
1413 {0, "not sensing – indicates that the O-RU is transmitting data"},
1414 {1, "currently sensing – indicates the O-RU has not yet acquired the channel"},
1415 {2, "success – indicates that the channel was successfully acquired"},
1416 {3, "Failure – indicates expiration of the LBT timer. The LBT process should be reset"},
1417 {0, NULL((void*)0)}
1418};
1419
1420/* Table 7.5.2.15-3 */
1421static const value_string ci_comp_opt_vals[] = {
1422 {0, "compression per UE, one ciCompParam exists before the I/Q value of each UE"},
1423 {1, "compression per PRB, one ciCompParam exists before the I/Q value of each PRB"},
1424 {0, NULL((void*)0)}
1425};
1426
1427/* 7.5.2.17 */
1428static const range_string cmd_scope_vals[] = {
1429 {0, 0, "ARRAY-COMMAND"},
1430 {1, 1, "CARRIER-COMMAND"},
1431 {2, 2, "O-RU-COMMAND"},
1432 {3, 15, "reserved"},
1433 {0, 0, NULL((void*)0)}
1434};
1435
1436/* N.B., table in 7.5.3.38 is truncated.. */
1437static const range_string st4_cmd_type_vals[] = {
1438 {0, 0, "reserved for future command types"},
1439 {1, 1, "TIME_DOMAIN_BEAM_CONFIG"},
1440 {2, 2, "TDD_CONFIG_PATTERN"},
1441 {3, 3, "TRX_CONTROL"},
1442 {4, 4, "ASM"},
1443 {5, 5, "TRX_CONTROL_BIDIR"},
1444 {6, 6, "MAX_POWER_CONTROL"},
1445 {7, 255, "reserved for future command types"},
1446 {0, 0, NULL((void*)0)}
1447};
1448
1449/* Table 7.5.3.51-1 */
1450static const value_string log2maskbits_vals[] = {
1451 {0, "reserved"},
1452 {1, "min antMask size is 16 bits.."},
1453 {2, "min antMask size is 16 bits.."},
1454 {3, "min antMask size is 16 bits.."},
1455 {4, "16 bits"},
1456 {5, "32 bits"},
1457 {6, "64 bits"},
1458 {7, "128 bits"},
1459 {8, "256 bits"},
1460 {9, "512 bits"},
1461 {10, "1024 bits"},
1462 {11, "2048 bits"},
1463 {12, "4096 bits"},
1464 {13, "8192 bits"},
1465 {14, "16384 bits"},
1466 {15, "reserved"},
1467 {0, NULL((void*)0)}
1468};
1469
1470/* Table 16.1-1 Sleep modes */
1471static const value_string sleep_mode_trx_vals[] = {
1472 { 0, "TRXC-mode0-wake-up-duration (symbol)"},
1473 { 1, "TRXC-mode1-wake-up-duration (L)"},
1474 { 2, "TRXC-mode2-wake-up-duration (M)"},
1475 { 3, "TRXC-mode3-wake-up-duration (N)"},
1476 { 0, NULL((void*)0)}
1477};
1478
1479static const value_string sleep_mode_asm_vals[] = {
1480 { 0, "ASM-mode0-wake-up-duration (symbol)"},
1481 { 1, "ASM-mode1-wake-up-duration (L)"},
1482 { 2, "ASM-mode2-wake-up-duration (M)"},
1483 { 3, "ASM-mode3-wake-up-duration (N)"},
1484 { 0, NULL((void*)0)}
1485};
1486
1487/* 7.7.21.3.1 */
1488static const value_string prg_size_st5_vals[] = {
1489 { 0, "reserved"},
1490 { 1, "Precoding resource block group size as WIDEBAND"},
1491 { 2, "Precoding resource block group size 2"},
1492 { 3, "Precoding resource block group size 4"},
1493 { 0, NULL((void*)0)}
1494};
1495
1496/* 7.7.21.3.2 */
1497static const value_string prg_size_st6_vals[] = {
1498 { 0, "if ciPrbGroupSize is 2 or 4, then ciPrbGroupSize, else WIDEBAND"},
1499 { 1, "Precoding resource block group size as WIDEBAND"},
1500 { 2, "Precoding resource block group size 2"},
1501 { 3, "Precoding resource block group size 4"},
1502 { 0, NULL((void*)0)}
1503};
1504
1505/* 7.7.24.4 */
1506static const value_string alpn_per_sym_vals[] = {
1507 { 0, "report one allocated IPN value per all allocated symbols with DMRS"},
1508 { 1, "report one allocated IPN value per group of consecutive DMRS symbols"},
1509 { 0, NULL((void*)0)}
1510};
1511
1512/* 7.7.24.5 */
1513static const value_string ant_dmrs_snr_vals[] = {
1514 { 0, "O-RU shall not report the MEAS_ANT_DMRS_SNR"},
1515 { 1, "O-RU shall report the MEAS_ANT_DMRS_SNR"},
1516 { 0, NULL((void*)0)}
1517};
1518
1519/* 7.7.24.14 */
1520static const value_string dtype_vals[] = {
1521 { 0, "assume DMRS configuration type 1"},
1522 { 1, "assume DMRS configuration type 2"},
1523 { 0, NULL((void*)0)}
1524};
1525
1526/* 7.7.24.17 */
1527static const value_string papr_type_vals[] = {
1528 { 0, "sequence generator type 1 for short sequence lengths"},
1529 { 1, "sequence generator type 1 for long sequence lengths"},
1530 { 2, "sequence generator type 2 for short sequence lengths"},
1531 { 3, "sequence generator type 2 for long sequence lengths"},
1532 { 0, NULL((void*)0)}
1533};
1534
1535/* 7.7.24.18 */
1536static const value_string hopping_mode_vals[] = {
1537 { 0, "neither group, nor sequence hopping is enabled"},
1538 { 1, "group hopping is enabled and sequence hopping is disabled"},
1539 { 2, "sequence hopping is enabled and group hopping is disabled"},
1540 { 3, "reserved"},
1541 { 0, NULL((void*)0)}
1542};
1543
1544/* Table 7.7.31.2-1 */
1545static const value_string mcs_table_vals[] = {
1546 { 0, "MCS index table 1 for PDSCH and PUSCH without transform precoding" },
1547 { 1, "MCS index table 2 for PDSCH and PUSCH without transform precoding" },
1548 { 2, "MCS index table 3 for PDSCH and PUSCH without transform precoding" },
1549 { 3, "MCS index table 4 for PDSCH" },
1550 { 4, "MCS index table for PUSCH with transform precoding and 64QAM" },
1551 { 5, "MCS index table 2 for PUSCH with transform precoding and 64QAM" },
1552 { 0, NULL((void*)0)}
1553};
1554
1555/* 7.7.32.9 */
1556static const value_string full_pwr_mode_vals[] = {
1557 { 0, "not configured"},
1558 { 1, "full power mode 0"},
1559 { 2, "full power mode 1"},
1560 { 3, "full power mode 2"},
1561 { 0, NULL((void*)0)}
1562};
1563
1564
1565static const true_false_string tfs_sfStatus =
1566{
1567 "subframe was transmitted",
1568 "subframe was dropped"
1569};
1570
1571static const true_false_string tfs_lbtBufErr =
1572{
1573 "buffer overflow – data received at O-RU is larger than the available buffer size",
1574 "reserved"
1575};
1576
1577static const true_false_string tfs_partial_full_sf = {
1578 "partial SF",
1579 "full SF"
1580};
1581
1582static const true_false_string disable_tdbfns_tfs = {
1583 "beam numbers excluded",
1584 "beam numbers included"
1585};
1586
1587static const true_false_string continuity_indication_tfs = {
1588 "continuity between current and next bundle",
1589 "discontinuity between current and next bundle"
1590};
1591
1592static const true_false_string prb_mode_tfs = {
1593 "PRB-BLOCK mode",
1594 "PRB-MASK mode"
1595};
1596
1597static const true_false_string symbol_direction_tfs = {
1598 "DL symbol",
1599 "UL symbol"
1600};
1601
1602static const true_false_string symbol_guard_tfs = {
1603 "guard symbol",
1604 "non-guard symbol"
1605};
1606
1607static const true_false_string beam_numbers_included_tfs = {
1608 "time-domain beam numbers excluded in this command",
1609 "time-domain beam numbers included in this command"
1610};
1611
1612static const true_false_string measurement_flag_tfs = {
1613 "at least one additional measurement report or command after the current one",
1614 "no additional measurement report or command"
1615};
1616
1617static const true_false_string repetition_se6_tfs = {
1618 "repeated highest priority data section in the C-Plane message",
1619 "no repetition"
1620};
1621
1622static const true_false_string repetition_se19_tfs = {
1623 "per port information not present in the extension",
1624 "per port info present in the extension"
1625};
1626
1627static const true_false_string tfs_report_no_report_pos_meas =
1628{
1629 "Report MEAS_UE_POS for UE",
1630 "Do not report UE_POS for UE"
1631};
1632
1633static const true_false_string tfs_allocated_not_allocated =
1634{
1635 "allocated",
1636 "not allocated"
1637};
1638
1639
1640
1641/* Forward declaration */
1642static int dissect_udcompparam(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, unsigned offset,
1643 unsigned comp_meth,
1644 uint32_t *exponent, uint16_t *sReSMask, bool_Bool for_sinr);
1645
1646
1647static const true_false_string ready_tfs = {
1648 "message is a \"ready\" message",
1649 "message is a ACK message"
1650};
1651
1652static const true_false_string multi_sd_scope_tfs = {
1653 "Puncturing pattern applies to current and following sections",
1654 "Puncturing pattern applies to current section"
1655};
1656
1657static const true_false_string tfs_ueid_reset = {
1658 "cannot assume same UE as in preceding slot",
1659 "can assume same UE as in preceding slot"
1660};
1661
1662
1663typedef struct {
1664 uint32_t start; /* first prb of bundle */
1665 uint32_t end; /* last prb of bundle*/
1666 bool_Bool is_orphan; /* true if not complete (i.e., end-start < numBundPrb) */
1667 uint8_t bit_from_rbg_mask; /* 0 means not set, other bits offset by 1 */
1668} bundle_t;
1669
1670
1671/* Config for (and later, worked-out allocations) bundles for ext11 (dynamic BFW) */
1672typedef struct {
1673 /* Ext 6 config */
1674 bool_Bool ext6_set;
1675 uint8_t ext6_rbg_size; /* number of PRBs in resource block group (i.e., one bit in bitmask) */
1676
1677 uint8_t ext6_num_bits_set; /* Total number of rbgMask bits set */
1678 uint8_t ext6_bits_set[28]; /* Which bit position this entry has */
1679 /* TODO: store an f value for each bit position? */
1680
1681 /* Ext 12 config */
1682 bool_Bool ext12_set;
1683 unsigned ext12_num_pairs;
1684#define MAX_BFW_EXT12_PAIRS128 128
1685 struct {
1686 uint8_t off_start_prb;
1687 uint8_t num_prb;
1688 } ext12_pairs[MAX_BFW_EXT12_PAIRS128];
1689
1690 /* Ext 13 config */
1691 bool_Bool ext13_set;
1692 unsigned ext13_num_start_prbs;
1693#define MAX_BFW_EXT13_ALLOCATIONS128 128
1694 unsigned ext13_start_prbs[MAX_BFW_EXT13_ALLOCATIONS128];
1695 /* TODO: store nextSymbolId here too? */
1696
1697 /* Ext 21 config */
1698 bool_Bool ext21_set;
1699 uint8_t ext21_ci_prb_group_size;
1700
1701 /* Results/settings (after calling ext11_work_out_bundles()) */
1702 uint32_t num_bundles;
1703#define MAX_BFW_BUNDLES512 512
1704 bundle_t bundles[MAX_BFW_BUNDLES512];
1705} ext11_settings_t;
1706
1707
1708/* Work out bundle allocation for ext 11. Take into account ext6/ext21, ext12 or ext13 in this section before ext 11. */
1709/* Won't be called with numBundPrb=0 */
1710static void ext11_work_out_bundles(unsigned startPrbc,
1711 unsigned numPrbc,
1712 unsigned numBundPrb, /* number of PRBs per (full) bundle */
1713 ext11_settings_t *settings)
1714{
1715 /* Allocation configured by ext 6 */
1716 if (settings->ext6_set) {
1717 unsigned bundles_per_mask_bit = (settings->ext6_rbg_size / numBundPrb);
1718
1719 /* Need to cope with these not dividing exactly, or even having more PRbs in a bundle that
1720 rbg size. i.e. each bundle gets the correct number of PRBs until
1721 all rbg entries are consumed... */
1722
1723 /* TODO: need to check 7.9.4.2. Different cases depending upon value of RAD */
1724
1725 if (bundles_per_mask_bit == 0) {
1726 bundles_per_mask_bit = 1;
1727 }
1728
1729 /* Ext6 behaviour may also be affected by ext 21 */
1730 if (settings->ext21_set) {
1731 /* N.B., have already checked that numPrbc is not 0 */
1732
1733 /* ciPrbGroupSize overrides number of contiguous PRBs in group */
1734 bundles_per_mask_bit = (settings->ext6_rbg_size / settings->ext21_ci_prb_group_size);
1735
1736 /* numPrbc is the number of PRB groups per antenna - handled in call to dissect_bfw_bundle() */
1737 }
1738
1739 unsigned bundles_set = 0;
1740 bool_Bool reached_orphan = false0;
1741
1742 /* For each bit set in ext6 rbg mask.. */
1743 for (unsigned n=0;
1744 !reached_orphan && n < 28 && n < settings->ext6_num_bits_set;
1745 n++) {
1746
1747 /* For each bundle... */
1748
1749 /* TODO: Work out where first PRB is */
1750 /* May not be the start of an rbg block... */
1751 uint32_t prb_start = (settings->ext6_bits_set[n] * settings->ext6_rbg_size);
1752
1753 /* For each bundle within identified rbgSize block */
1754 for (unsigned m=0; !reached_orphan && m < bundles_per_mask_bit; m++) {
1755
1756 settings->bundles[bundles_set].start = startPrbc+prb_start+(m*numBundPrb);
1757
1758 /* Start already beyond end, so doesn't count. */
1759 if (settings->bundles[bundles_set].start > (startPrbc+numPrbc-1)) {
1760 settings->num_bundles = bundles_set;
1761 return;
1762 }
1763
1764 /* Bundle consists of numBundPrb bundles */
1765 /* TODO: may involve PRBs from >1 rbg blocks.. */
1766 settings->bundles[bundles_set].end = startPrbc+prb_start+((m+1)*numBundPrb)-1;
1767 if (settings->bundles[bundles_set].end > (startPrbc+numPrbc-1)) {
1768 /* Extends beyond end, so counts but is an orphan bundle */
1769 settings->bundles[bundles_set].end = startPrbc+numPrbc-1;
1770 settings->bundles[bundles_set].is_orphan = true1;
1771 reached_orphan = true1;
1772 }
1773
1774 /* Record which rbg this bundle comes from (+1) */
1775 settings->bundles[bundles_set].bit_from_rbg_mask = settings->ext6_bits_set[n]+1;
1776
1777 /* Get out if have reached array bound */
1778 if (++bundles_set == MAX_BFW_BUNDLES512) {
1779 return;
1780 }
1781 }
1782 }
1783 settings->num_bundles = bundles_set;
1784 }
1785
1786 /* Allocation configured by ext 12 */
1787 else if (settings->ext12_set) {
1788 /* First, allocate normally from startPrbc, numPrbc */
1789 settings->num_bundles = (numPrbc+numBundPrb-1) / numBundPrb;
1790
1791 /* Don't overflow settings->bundles[] ! */
1792 settings->num_bundles = MIN(MAX_BFW_BUNDLES, settings->num_bundles)(((512) < (settings->num_bundles)) ? (512) : (settings->
num_bundles))
;
1793
1794 for (uint32_t n=0; n < settings->num_bundles; n++) {
1795 settings->bundles[n].start = startPrbc + n*numBundPrb;
1796 settings->bundles[n].end = settings->bundles[n].start + numBundPrb-1;
1797 /* Does it go beyond the end? */
1798 if (settings->bundles[n].end > startPrbc+numPrbc-1) {
1799 settings->bundles[n].end = startPrbc+numPrbc-1;
1800 settings->bundles[n].is_orphan = true1;
1801 }
1802 }
1803 if (settings->num_bundles == MAX_BFW_BUNDLES512) {
1804 return;
1805 }
1806
1807 unsigned prb_offset = startPrbc + numPrbc;
1808
1809 /* Loop over pairs, adding bundles for each */
1810 for (unsigned p=0; p < settings->ext12_num_pairs; p++) {
1811 prb_offset += settings->ext12_pairs[p].off_start_prb;
1812 unsigned pair_bundles = (settings->ext12_pairs[p].num_prb+numBundPrb-1) / numBundPrb;
1813
1814 for (uint32_t n=0; n < pair_bundles; n++) {
1815 unsigned idx = settings->num_bundles;
1816
1817 settings->bundles[idx].start = prb_offset + n*numBundPrb;
1818 settings->bundles[idx].end = settings->bundles[idx].start + numBundPrb-1;
1819 /* Does it go beyond the end? */
1820 if (settings->bundles[idx].end > prb_offset + settings->ext12_pairs[p].num_prb - 1) {
1821 settings->bundles[idx].end = prb_offset + settings->ext12_pairs[p].num_prb - 1;
1822 settings->bundles[idx].is_orphan = true1;
1823 }
1824 /* Range check / return */
1825 settings->num_bundles++;
1826 if (settings->num_bundles == MAX_BFW_BUNDLES512) {
1827 return;
1828 }
1829 }
1830
1831 prb_offset += settings->ext12_pairs[p].num_prb;
1832 }
1833 }
1834
1835 /* Allocation configured by ext 13 */
1836 else if (settings->ext13_set) {
1837 unsigned alloc_size = (numPrbc+numBundPrb-1) / numBundPrb;
1838 settings->num_bundles = alloc_size * settings->ext13_num_start_prbs;
1839
1840 /* Don't overflow settings->bundles[] ! */
1841 settings->num_bundles = MIN(MAX_BFW_BUNDLES, settings->num_bundles)(((512) < (settings->num_bundles)) ? (512) : (settings->
num_bundles))
;
1842
1843 for (unsigned alloc=0; alloc < settings->ext13_num_start_prbs; alloc++) {
1844 unsigned alloc_start = alloc * alloc_size;
1845 for (uint32_t n=0; n < alloc_size; n++) {
1846 if ((alloc_start+n) >= MAX_BFW_BUNDLES512) {
1847 /* ERROR */
1848 return;
1849 }
1850 settings->bundles[alloc_start+n].start = settings->ext13_start_prbs[alloc] + startPrbc + n*numBundPrb;
1851 settings->bundles[alloc_start+n].end = settings->bundles[alloc_start+n].start + numBundPrb-1;
1852 if (settings->bundles[alloc_start+n].end > settings->ext13_start_prbs[alloc] + startPrbc + numPrbc - 1) {
1853 settings->bundles[alloc_start+n].end = settings->ext13_start_prbs[alloc] + startPrbc + numPrbc - 1;
1854 settings->bundles[alloc_start+n].is_orphan = true1;
1855 }
1856 }
1857 }
1858 }
1859
1860 /* Case where bundles are not controlled by other extensions - just divide up range into bundles we have */
1861 else {
1862 settings->num_bundles = (numPrbc+numBundPrb-1) / numBundPrb; /* rounded up */
1863
1864 /* Don't overflow settings->bundles[] */
1865 settings->num_bundles = MIN(MAX_BFW_BUNDLES, settings->num_bundles)(((512) < (settings->num_bundles)) ? (512) : (settings->
num_bundles))
;
1866
1867 /* For each bundle.. */
1868 for (uint32_t n=0; n < settings->num_bundles; n++) {
1869 /* Allocate start and end */
1870 settings->bundles[n].start = startPrbc + n*numBundPrb;
1871 settings->bundles[n].end = settings->bundles[n].start + numBundPrb - 1;
1872 /* If would go beyond end of PRBs, limit and identify as orphan */
1873 if (settings->bundles[n].end > startPrbc+numPrbc-1) {
1874 settings->bundles[n].end = startPrbc+numPrbc-1;
1875 settings->bundles[n].is_orphan = true1;
1876 }
1877 }
1878 }
1879}
1880
1881
1882/* Modulation Compression configuration */
1883typedef struct {
1884 /* Application of each entry is filtered by RE.
1885 * TODO: should also be filtered by PRB + symbol... */
1886 uint16_t mod_compr_re_mask;
1887
1888 /* Settings to apply */
1889 bool_Bool mod_compr_csf;
1890 float mod_compr_scaler;
1891} mod_compr_config_t;
1892
1893/* Multiple configs with a section */
1894typedef struct {
1895 uint16_t section_id;
1896 uint32_t num_configs;
1897
1898 #define MAX_MOD_COMPR_CONFIGS12 12
1899 mod_compr_config_t configs[MAX_MOD_COMPR_CONFIGS12];
1900} section_mod_compr_config_t;
1901
1902/* Flow has separate configs for each section */
1903typedef struct {
1904 uint16_t num_sections;
1905
1906 /* Separate config for each section */
1907 section_mod_compr_config_t sections[MAX_SECTION_IDs32];
1908} mod_compr_params_t;
1909
1910
1911typedef struct {
1912 uint32_t frame_number;
1913 nstime_t frame_time;
1914
1915 /* Timing to match */
1916 uint8_t frame;
1917 uint8_t subframe;
1918 uint8_t slot;
1919 uint8_t startSymbol;
1920
1921 bool_Bool in_use;
1922 uint16_t startPrb;
1923 uint16_t numPrb;
1924 uint16_t numSymbols;
1925 uint16_t beamIds[273];
1926} section_details_t;
1927
1928typedef struct {
1929 uint16_t sectionId;
1930 /* For the same sectionId, can have 2 currently active entries.. */
1931 section_details_t details[2];
1932} expected_section_data_t;
1933
1934
1935/*******************************************************/
1936/* Overall state of a flow (eAxC/plane) */
1937typedef struct {
1938 /* State for sequence analysis [each direction] */
1939 bool_Bool last_frame_seen[2];
1940 uint32_t last_frame[2];
1941 uint8_t next_expected_sequence_number[2];
1942
1943 /* expected frames. sectionId -> expected_section_data_t* */
1944 wmem_tree_t *expected_sections[2]; /* [direction] */
1945
1946 /* Table recording ackNack requests (ackNackId -> ack_nack_request_t*)
1947 Note that this assumes that the same ackNackId will not be reused within a state,
1948 which may well not be valid */
1949 wmem_tree_t *ack_nack_requests;
1950
1951 /* Store udCompHdr seen in C-Plane for UL - can be looked up and used by U-PLane.
1952 Note that this appears in the common section header parts of ST1, ST3, ST5,
1953 so can still be over-written per sectionId in the U-Plane */
1954 unsigned ul_ud_comp_hdr_frame;
1955 bool_Bool ul_ud_comp_hdr_set;
1956 unsigned ul_ud_comp_hdr_bit_width;
1957 int ul_ud_comp_hdr_compression;
1958
1959 bool_Bool udcomphdrDownlink_heuristic_result_set;
1960 bool_Bool udcomphdrDownlink_heuristic_result;
1961 bool_Bool udcomphdrUplink_heuristic_result_set;
1962 bool_Bool udcomphdrUplink_heuristic_result;
1963
1964 /* Modulation compression params */
1965 mod_compr_params_t mod_comp_params;
1966} flow_state_t;
1967
1968static section_mod_compr_config_t* get_mod_compr_section_to_write(packet_info *pinfo, flow_state_t *flow,
1969 unsigned sectionId)
1970{
1971 /* Only record configs on the first pass */
1972 if (flow == NULL((void*)0) || PINFO_FD_VISITED(pinfo)((pinfo)->fd->visited)) {
1973 return NULL((void*)0);
1974 }
1975
1976 /* Look for this section among existing entries */
1977 for (unsigned s=0; s < flow->mod_comp_params.num_sections; s++) {
1978 if (flow->mod_comp_params.sections[s].section_id == sectionId) {
1979 return &flow->mod_comp_params.sections[s];
1980 }
1981 }
1982
1983 /* Not found, so try to add a new one */
1984 if (flow->mod_comp_params.num_sections >= MAX_SECTION_IDs32) {
1985 /* Can't allocate one! */
1986 return NULL((void*)0);
1987 }
1988 else {
1989 flow->mod_comp_params.sections[flow->mod_comp_params.num_sections].section_id = sectionId;
1990 return &flow->mod_comp_params.sections[flow->mod_comp_params.num_sections++];
1991 }
1992}
1993
1994static section_mod_compr_config_t* get_mod_compr_section_to_read(flow_state_t *flow,
1995 unsigned sectionId)
1996{
1997 if (flow == NULL((void*)0)) {
1998 return NULL((void*)0);
1999 }
2000
2001 /* Look for this section among existing entries */
2002 for (unsigned s=0; s < flow->mod_comp_params.num_sections; s++) {
2003 if (flow->mod_comp_params.sections[s].section_id == sectionId) {
2004 return &flow->mod_comp_params.sections[s];
2005 }
2006 }
2007
2008 /* Not found */
2009 return NULL((void*)0);
2010}
2011
2012
2013
2014typedef struct {
2015 uint32_t request_frame_number;
2016 nstime_t request_frame_time;
2017 enum {
2018 SE22,
2019 ST4Cmd1,
2020 ST4Cmd2,
2021 ST4Cmd3,
2022 ST4Cmd4,
2023 ST4Cmd5,
2024 ST4Cmd6
2025 } requestType;
2026
2027 uint32_t response_frame_number;
2028 nstime_t response_frame_time;
2029} ack_nack_request_t;
2030
2031static const value_string acknack_type_vals[] = {
2032 { SE22, "SE 22" },
2033 { ST4Cmd1, "ST4 (TIME_DOMAIN_BEAM_CONFIG)" },
2034 { ST4Cmd2, "ST4 (TDD_CONFIG_PATTERN)" },
2035 { ST4Cmd3, "ST4 (TRX_CONTROL)" },
2036 { ST4Cmd4, "ST4 (ASM)" },
2037 { ST4Cmd5, "ST4 (TRX_CONTROL_BIDIR)" },
2038 { ST4Cmd6, "ST4 (MAX_POWER_CONTROL)" },
2039 { 0, NULL((void*)0)}
2040};
2041
2042#define ORAN_C_PLANE0 0
2043#define ORAN_U_PLANE1 1
2044
2045
2046
2047/* Table maintained on first pass from flow_key(uint32_t) -> flow_state_t* */
2048static wmem_tree_t *flow_states_table;
2049
2050
2051/* Includes transport details (eth addresses + vlan) */
2052/* First and last bytes of the Ethernet source and destination, in the order of the flow */
2053static uint32_t flow_key_addresses(packet_info *pinfo, bool_Bool opposite_dir)
2054{
2055 uint32_t word = 0;
2056 const uint8_t *src_eth = (pinfo->dl_src.type == AT_ETHER) ? (const uint8_t*)pinfo->dl_src.data : NULL((void*)0);
2057 const uint8_t *dst_eth = (pinfo->dl_dst.type == AT_ETHER) ? (const uint8_t*)pinfo->dl_dst.data : NULL((void*)0);
2058
2059 if (!opposite_dir) {
2060 if (src_eth) {
2061 word |= src_eth[5] | (src_eth[0] << 8);
2062 }
2063 if (dst_eth) {
2064 word |= (dst_eth[5] << 16) | (dst_eth[0] << 24);
2065 }
2066 }
2067 else {
2068 if (src_eth) {
2069 word |= (src_eth[5] << 16) | (src_eth[0] << 24);
2070 }
2071 if (dst_eth) {
2072 word |= dst_eth[5] | (dst_eth[0] << 8);
2073 }
2074 }
2075 return word;
2076}
2077
2078static flow_state_t* lookup_flow(packet_info *pinfo, uint16_t eaxc_id, uint8_t plane, bool_Bool opposite_dir)
2079{
2080 wmem_tree_key_t key[3];
2081 uint32_t word1, word2;
2082
2083 /* 1st value is vlan_id(15) | plane(1) | eaxc_id(16) */
2084 word1 = eaxc_id | (plane << 16) | (pinfo->vlan_id << 17);
2085 key[0].length = 1;
2086 key[0].key = &word1;
2087
2088 /* 2nd word is first/last bytes of eth src/dst */
2089 word2 = flow_key_addresses(pinfo, opposite_dir);
2090 key[1].length = 1;
2091 key[1].key = &word2;
2092 key[2].length = 0;
2093 key[2].key = NULL((void*)0);
2094
2095 return (flow_state_t*)wmem_tree_lookup32_array(flow_states_table, key);
2096}
2097
2098static void store_flow(packet_info *pinfo, uint16_t eaxc_id, uint8_t plane, bool_Bool opposite_dir, flow_state_t *state)
2099{
2100 wmem_tree_key_t key[3];
2101 uint32_t word1, word2;
2102
2103 /* 1st value is vlan_id(15) | plane(1) | eaxc_id(16) */
2104 word1 = eaxc_id | (plane << 16) | (pinfo->vlan_id << 17);
2105 key[0].length = 1;
2106 key[0].key = &word1;
2107
2108 /* 2nd word is first/last bytes of eth src/dst */
2109 word2 = flow_key_addresses(pinfo, opposite_dir);
2110 key[1].length = 1;
2111 key[1].key = &word2;
2112 key[2].length = 0;
2113 key[2].key = NULL((void*)0);
2114
2115 wmem_tree_insert32_array(flow_states_table, key, state);
2116}
2117
2118
2119
2120
2121typedef struct {
2122 uint32_t frame_number;
2123 uint16_t sectionId;
2124 uint32_t gap_in_usecs;
2125 uint8_t symbol;
2126 uint16_t startPrbu;
2127 uint16_t numPrbu;
2128} corresponding_uplane_frame;
2129
2130/* Table consulted on subsequent passes: frame_num -> flow_result_t* */
2131static wmem_tree_t *flow_results_table;
2132
2133typedef struct {
2134 /* Sequence analysis */
2135 bool_Bool unexpected_seq_number;
2136 uint8_t expected_sequence_number;
2137 uint32_t previous_frame;
2138
2139 /* sectionId -> expected_section_data_t* */
2140 /* Frame only covers one direction */
2141 wmem_tree_t *expected_sections;
2142
2143 /* List of u-plane frames (corresponding_uplane_frame*) corresponding to a c-plane frame */
2144 wmem_list_t *u_plane_frames;
2145
2146 /* Whether a C-plane flow had been seen when a u-plane frame was first seen */
2147 bool_Bool cplane_seen;
2148
2149 /* UL udCompHdr settings from the C-plane when a UL u-plane frame was first seen */
2150 bool_Bool ul_ud_comp_hdr_set;
2151 unsigned ul_ud_comp_hdr_bit_width;
2152 int ul_ud_comp_hdr_compression;
2153 unsigned ul_ud_comp_hdr_frame;
2154} flow_result_t;
2155
2156
2157/* Uplink timing */
2158/* For a given symbol, track first to last UL frame to find out first-last time */
2159/* frameId (8) + subframeId (4) + slotId (6) + symbolId (6) = 24 bits */
2160/* N.B. if a capture lasts > 2.5s, may see same timing come around again... */
2161static uint32_t get_timing_key(uint8_t frameId, uint8_t subframeId, uint8_t slotId, uint8_t symbolId)
2162{
2163 return symbolId + (slotId<<8) + (subframeId<<14) + (frameId<<18);
2164}
2165
2166typedef struct {
2167 uint32_t first_frame;
2168 nstime_t first_frame_time;
2169 uint32_t frames_seen_in_symbol;
2170 uint32_t last_frame_in_symbol;
2171} ul_timing_for_slot;
2172
2173/* Set during first pass. timing_key -> ul_timing_for_slot* */
2174static wmem_tree_t *ul_symbol_timing;
2175
2176
2177/* Tracking lifetimes of DL beamIds */
2178typedef struct {
2179 uint32_t frame_defined;
2180 uint32_t symbol_when_defined;
2181} bfw_definition;
2182
2183/* Maintained during first pass: beamId (from ext11) -> bfw_definition */
2184static wmem_tree_t *dl_beam_ids_defined;
2185/* Lookup where/when beamIds were defined (frameid:beamid) -> bfw_definition */
2186static wmem_tree_t *dl_beam_ids_results;
2187
2188
2189static void show_link_to_acknack_response(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo,
2190 ack_nack_request_t *response);
2191
2192
2193
2194
2195static void write_pdu_label_and_info(proto_item *ti1, proto_item *ti2,
2196 packet_info *pinfo, const char *format, ...) G_GNUC_PRINTF(4, 5)__attribute__((__format__ (__printf__, 4, 5)));
2197
2198 /* Write the given formatted text to:
2199 - the info column (if pinfo != NULL)
2200 - 1 or 2 other labels (optional)
2201 */
2202static void write_pdu_label_and_info(proto_item *ti1, proto_item *ti2,
2203 packet_info *pinfo, const char *format, ...)
2204{
2205#define MAX_INFO_BUFFER256 256
2206 char info_buffer[MAX_INFO_BUFFER256];
2207 va_list ap;
2208
2209 if ((ti1 == NULL((void*)0)) && (ti2 == NULL((void*)0)) && (pinfo == NULL((void*)0))) {
2210 return;
2211 }
2212
2213 va_start(ap, format)__builtin_va_start(ap, format);
2214 vsnprintf(info_buffer, MAX_INFO_BUFFER256, format, ap);
2215 va_end(ap)__builtin_va_end(ap);
2216
2217 /* Add to indicated places */
2218 if (pinfo != NULL((void*)0)) {
2219 col_append_str(pinfo->cinfo, COL_INFO, info_buffer);
2220 }
2221 if (ti1 != NULL((void*)0)) {
2222 proto_item_append_text(ti1, "%s", info_buffer);
2223 }
2224 if (ti2 != NULL((void*)0)) {
2225 proto_item_append_text(ti2, "%s", info_buffer);
2226 }
2227}
2228
2229/* Add section labels (type + PRB range) for C-Plane, U-Plane */
2230static void
2231write_section_info(proto_item *section_heading, packet_info *pinfo, proto_item *protocol_item,
2232 uint32_t section_id, uint32_t start_prbx, uint32_t num_prbx, uint32_t rb)
2233{
2234 switch (num_prbx) {
2235 case 0:
2236 /* None -> all */
2237 write_pdu_label_and_info(section_heading, protocol_item, pinfo, ", Id: %4d (all PRBs)", section_id);
2238 break;
2239 case 1:
2240 /* Single PRB */
2241 write_pdu_label_and_info(section_heading, protocol_item, pinfo, ", Id: %4d (PRB: %7u)", section_id, start_prbx);
2242 break;
2243 default:
2244 /* Range */
2245 write_pdu_label_and_info(section_heading, protocol_item, pinfo, ", Id: %4d (PRB: %3u-%3u%s)", section_id, start_prbx,
2246 start_prbx + (num_prbx-1)*(1+rb), rb ? " (every-other)" : "");
2247 }
2248}
2249
2250static void
2251write_channel_section_info(proto_item *section_heading, packet_info *pinfo,
2252 uint32_t section_id, uint32_t ueId, uint32_t start_prbx, uint32_t num_prbx,
2253 uint32_t num_trx)
2254{
2255 switch (num_prbx) {
2256 case 0:
2257 /* TODO: ?? */
2258 break;
2259 case 1:
2260 /* Single PRB */
2261 write_pdu_label_and_info(section_heading, NULL((void*)0), pinfo,
2262 ", Id: %4d (UEId=%5u PRB %7u, %2u antennas)",
2263 section_id, ueId, start_prbx, num_trx);
2264 break;
2265 default:
2266 /* Range */
2267 write_pdu_label_and_info(section_heading, NULL((void*)0), pinfo,
2268 ", Id: %4d (UEId=%5u PRBs %3u-%3u, %2u antennas)",
2269 section_id, ueId, start_prbx, start_prbx+num_prbx-1, num_trx);
2270 }
2271}
2272
2273/* Add a reserved field, and warn if value isn't 0 */
2274/* TODO: maybe add a pref not to output expert warning if becomes too annoying? */
2275static void add_reserved_field(proto_tree *tree, int hf, tvbuff_t *tvb, int offset, int len)
2276{
2277 uint32_t reserved;
2278 proto_item *res_ti = proto_tree_add_item_ret_uint(tree, hf, tvb, offset, len, ENC_NA0x00000000, &reserved);
2279 if (reserved != 0) {
2280 expert_add_info_format(NULL((void*)0), res_ti, &ei_oran_reserved_not_zero,
2281 "reserved field saw value of 0x%x", reserved);
2282 }
2283}
2284
2285/* 5.1.3.2.7 (real time control data / IQ data transfer message series identifier) */
2286static void
2287addPcOrRtcid(tvbuff_t *tvb, proto_tree *tree, unsigned *offset, int hf, uint16_t *eAxC, oran_tap_info *tap_info)
2288{
2289 /* Subtree */
2290 proto_item *oran_pcid_ti = proto_tree_add_item(tree, hf,
2291 tvb, *offset, 2, ENC_NA0x00000000);
2292 proto_tree *oran_pcid_tree = proto_item_add_subtree(oran_pcid_ti, ett_oran_ecpri_pcid);
2293
2294 uint64_t duPortId, bandSectorId, ccId, ruPortId = 0;
2295 int id_offset = *offset;
2296
2297 /* All parts of eAxC should be above 0, and should total 16 bits (breakdown controlled by preferences) */
2298 if (!((pref_du_port_id_bits > 0) && (pref_bandsector_id_bits > 0) && (pref_cc_id_bits > 0) && (pref_ru_port_id_bits > 0) &&
2299 ((pref_du_port_id_bits + pref_bandsector_id_bits + pref_cc_id_bits + pref_ru_port_id_bits) == 16))) {
2300 expert_add_info(NULL((void*)0), tree, &ei_oran_invalid_eaxc_bit_width);
2301 *eAxC = 0;
2302 *offset += 2;
2303 return;
2304 }
2305
2306 unsigned bit_offset = *offset * 8;
2307
2308 /* N.B. For sequence analysis / tapping, just interpret these 2 bytes as eAxC ID... */
2309 *eAxC = tvb_get_uint16(tvb, *offset, ENC_BIG_ENDIAN0x00000000);
2310
2311 /* DU Port ID */
2312 proto_tree_add_bits_ret_val(oran_pcid_tree, hf_oran_du_port_id, tvb, bit_offset, pref_du_port_id_bits, &duPortId, ENC_BIG_ENDIAN0x00000000);
2313 bit_offset += pref_du_port_id_bits;
2314 /* BandSector ID */
2315 proto_tree_add_bits_ret_val(oran_pcid_tree, hf_oran_bandsector_id, tvb, bit_offset, pref_bandsector_id_bits, &bandSectorId, ENC_BIG_ENDIAN0x00000000);
2316 bit_offset += pref_bandsector_id_bits;
2317 /* CC ID */
2318 proto_tree_add_bits_ret_val(oran_pcid_tree, hf_oran_cc_id, tvb, bit_offset, pref_cc_id_bits, &ccId, ENC_BIG_ENDIAN0x00000000);
2319 bit_offset += pref_cc_id_bits;
2320 /* RU Port ID */
2321 proto_tree_add_bits_ret_val(oran_pcid_tree, hf_oran_ru_port_id, tvb, bit_offset, pref_ru_port_id_bits, &ruPortId, ENC_BIG_ENDIAN0x00000000);
2322 *offset += 2;
2323
2324 proto_item_append_text(oran_pcid_ti, " (DU_Port_ID: %d, BandSector_ID: %d, CC_ID: %d, RU_Port_ID: %d)",
2325 (int)duPortId, (int)bandSectorId, (int)ccId, (int)ruPortId);
2326 char id[16];
2327 snprintf(id, 16, "%x:%x:%x:%x", (int)duPortId, (int)bandSectorId, (int)ccId, (int)ruPortId);
2328 proto_item *pi = proto_tree_add_string(oran_pcid_tree, hf_oran_c_eAxC_ID, tvb, id_offset, 2, id);
2329 proto_item_set_generated(pi);
2330
2331 tap_info->eaxc = *eAxC;
2332 tap_info->eaxc_du_port_id = (uint16_t)duPortId;
2333 tap_info->eaxc_bandsector_id = (uint16_t)bandSectorId;
2334 tap_info->eaxc_cc_id = (uint16_t)ccId;
2335 tap_info->eaxc_ru_port_id = (uint16_t)ruPortId;
2336}
2337
2338/* Uniquely identify the U-plane stream that may need to be reassembled */
2339static uint32_t make_reassembly_id(uint32_t seqid, uint16_t eAxC, int direction)
2340{
2341 return ((seqid & 0xff) << 24) | ((direction&1)<<16) | (eAxC & 0xffff);
2342}
2343
2344/* 5.1.3.2.8 ecpriSeqid (message identifier) */
2345/* Return out info that may be used for sequence number analysis and reassembly */
2346static int
2347addSeqid(tvbuff_t *tvb, proto_tree *oran_tree, int offset, int plane, uint32_t *seq_id, proto_item **seq_id_ti,
2348 uint32_t *subseqid, uint32_t *e)
2349{
2350 /* Subtree */
2351 proto_item *seqIdItem = proto_tree_add_item(oran_tree, hf_oran_ecpri_seqid, tvb, offset, 2, ENC_NA0x00000000);
2352 proto_tree *oran_seqid_tree = proto_item_add_subtree(seqIdItem, ett_oran_ecpri_seqid);
2353
2354 /* Sequence ID (8 bits) */
2355 *seq_id_ti = proto_tree_add_item_ret_uint(oran_seqid_tree, hf_oran_sequence_id, tvb, offset, 1, ENC_NA0x00000000, seq_id);
2356 offset += 1;
2357
2358 /* E bit */
2359 proto_tree_add_item_ret_uint(oran_seqid_tree, hf_oran_e_bit, tvb, offset, 1, ENC_NA0x00000000, e);
2360 /* Subsequence ID (7 bits) */
2361 proto_tree_add_item_ret_uint(oran_seqid_tree, hf_oran_subsequence_id, tvb, offset, 1, ENC_NA0x00000000, subseqid);
2362 offset += 1;
2363
2364 /* radio-transport fragmentation not allowed for C-Plane messages */
2365 if (plane == ORAN_C_PLANE0) {
2366 if (*e !=1 || *subseqid != 0) {
2367 expert_add_info(NULL((void*)0), seqIdItem, &ei_oran_radio_fragmentation_c_plane);
2368 }
2369 }
2370
2371 /* Summary */
2372 proto_item_append_text(seqIdItem, " (SeqId: %3d, E: %d, SubSeqId: %d)", *seq_id, *e, *subseqid);
2373 return offset;
2374}
2375
2376static int dissect_symbolmask(tvbuff_t *tvb, proto_tree *tree, int offset, uint32_t *symbol_mask, proto_item **ti)
2377{
2378 uint64_t temp_val;
2379
2380 static int * const symbol_mask_flags[] = {
2381 &hf_oran_symbol_mask_s13,
2382 &hf_oran_symbol_mask_s12,
2383 &hf_oran_symbol_mask_s11,
2384 &hf_oran_symbol_mask_s10,
2385 &hf_oran_symbol_mask_s9,
2386 &hf_oran_symbol_mask_s8,
2387 &hf_oran_symbol_mask_s7,
2388 &hf_oran_symbol_mask_s6,
2389 &hf_oran_symbol_mask_s5,
2390 &hf_oran_symbol_mask_s4,
2391 &hf_oran_symbol_mask_s3,
2392 &hf_oran_symbol_mask_s2,
2393 &hf_oran_symbol_mask_s1,
2394 &hf_oran_symbol_mask_s0,
2395 NULL((void*)0)
2396 };
2397
2398 proto_item *temp_ti = proto_tree_add_bitmask_ret_uint64(tree, tvb, offset,
2399 hf_oran_symbol_mask,
2400 ett_oran_symbol_mask, symbol_mask_flags,
2401 ENC_BIG_ENDIAN0x00000000, &temp_val);
2402 /* Set out parameters */
2403 if (symbol_mask) {
2404 *symbol_mask = (uint32_t)temp_val;
2405 }
2406 if (ti) {
2407 *ti = temp_ti;
2408 }
2409 return offset+2;
2410}
2411
2412/* 7.7.1.2 bfwCompHdr (beamforming weight compression header) */
2413static int dissect_bfwCompHdr(tvbuff_t *tvb, proto_tree *tree, int offset,
2414 uint32_t *iq_width, uint32_t *comp_meth, proto_item **comp_meth_ti)
2415{
2416 /* Subtree */
2417 proto_item *bfwcomphdr_ti = proto_tree_add_string_format(tree, hf_oran_bfwCompHdr,
2418 tvb, offset, 1, "",
2419 "bfwCompHdr");
2420 proto_tree *bfwcomphdr_tree = proto_item_add_subtree(bfwcomphdr_ti, ett_oran_bfwcomphdr);
2421
2422 /* Width and method */
2423 proto_tree_add_item_ret_uint(bfwcomphdr_tree, hf_oran_bfwCompHdr_iqWidth,
2424 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, iq_width);
2425 /* Special case: 0 -> 16 */
2426 *iq_width = (*iq_width==0) ? 16 : *iq_width;
2427 *comp_meth_ti = proto_tree_add_item_ret_uint(bfwcomphdr_tree, hf_oran_bfwCompHdr_compMeth,
2428 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, comp_meth);
2429 offset++;
2430
2431 /* Summary */
2432 proto_item_append_text(bfwcomphdr_ti, " (IqWidth=%u, compMeth=%s)",
2433 *iq_width,
2434 val_to_str_const(*comp_meth, bfw_comp_headers_comp_meth, "reserved"));
2435
2436 return offset;
2437}
2438
2439/* Return offset */
2440/* Returning number of entries set - would be good to also return an array of set TRX# so could show which array element
2441 each BFW is actually for.. */
2442static int dissect_active_beamspace_coefficient_mask(tvbuff_t *tvb, proto_tree *tree, int offset, unsigned *num_trx_entries, uint16_t **trx_entries)
2443{
2444 /* activeBeamspaceCoefficientMask - ceil(K/8) octets */
2445 /* K is the number of elements in uncompressed beamforming weight vector.
2446 * Calculated from parameters describing tx-array or tx-array */
2447 unsigned k_octets = (pref_num_bf_antennas + 7) / 8;
2448
2449 static uint16_t trx_enabled[1024];
2450
2451 /* TODO: could use a bigger bitmask array, but for now just uses this bytes-worth for each byte */
2452 static int * const mask_bits[] = {
2453 &hf_oran_active_beamspace_coefficient_n1,
2454 &hf_oran_active_beamspace_coefficient_n2,
2455 &hf_oran_active_beamspace_coefficient_n3,
2456 &hf_oran_active_beamspace_coefficient_n4,
2457 &hf_oran_active_beamspace_coefficient_n5,
2458 &hf_oran_active_beamspace_coefficient_n6,
2459 &hf_oran_active_beamspace_coefficient_n7,
2460 &hf_oran_active_beamspace_coefficient_n8,
2461 NULL((void*)0)
2462 };
2463
2464 *num_trx_entries = 0;
2465 uint64_t val;
2466 for (unsigned n=0; n < k_octets; n++) {
2467 proto_tree_add_bitmask_ret_uint64(tree, tvb, offset,
2468 hf_oran_activeBeamspaceCoefficientMask,
2469 ett_oran_active_beamspace_coefficient_mask, mask_bits,
2470 ENC_BIG_ENDIAN0x00000000, &val);
2471 offset++;
2472 /* Add up the set bits for this byte (but be careful not to count beyond last real K bit..) */
2473 /* N1 is the most significant bit */
2474 for (unsigned b=0; b < 8; b++) {
2475 if ((0x80 >> b) & (unsigned)val) {
2476 if (((n*8)+b) < pref_num_bf_antennas) {
2477 if (*num_trx_entries < 1024-1) { /* Don't write beyond array (which should be plenty big) */
2478 trx_enabled[(*num_trx_entries)++] = (n*8) + b + 1;
2479 }
2480 }
2481 }
2482 }
2483 }
2484 /* Set pointer to static array */
2485 *trx_entries = trx_enabled;
2486
2487 /* Show how many bits set */
2488 proto_item *ti = proto_tree_add_uint(tree, hf_oran_activeBeamspaceCoefficientMask_bits_set, tvb,
2489 offset-k_octets, k_octets, *num_trx_entries);
2490 proto_item_set_generated(ti);
2491
2492 return offset;
2493}
2494
2495static void add_beam_id_to_tap(oran_tap_info *tap_info, uint16_t beam_id)
2496{
2497 if (tap_info->num_beams < MAX_BEAMS_IN_FRAME32) {
2498 tap_info->beams[tap_info->num_beams++] = beam_id;
2499 }
2500}
2501
2502
2503/* 7.7.1.3 bfwCompParam (beamforming weight compression parameter).
2504 * Depends upon passed-in bfwCompMeth (field may be empty) */
2505static int dissect_bfwCompParam(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, int offset,
2506 proto_item *meth_ti, uint32_t *bfw_comp_method,
2507 uint32_t *exponent, bool_Bool *supported, unsigned *num_trx_entries, uint16_t **trx_entries)
2508{
2509 if (*bfw_comp_method == COMP_NONE0) {
2510 /* Absent! */
2511 *num_trx_entries = 0;
2512 *supported = true1;
2513 return offset;
2514 }
2515
2516 /* Subtree */
2517 proto_item *bfwcompparam_ti = proto_tree_add_string_format(tree, hf_oran_bfwCompParam,
2518 tvb, offset, 1, "",
2519 "bfwCompParam");
2520 proto_tree *bfwcompparam_tree = proto_item_add_subtree(bfwcompparam_ti, ett_oran_bfwcompparam);
2521
2522 proto_item_append_text(bfwcompparam_ti,
2523 " (meth=%s)", val_to_str_const(*bfw_comp_method, bfw_comp_headers_comp_meth, "reserved"));
2524
2525 *num_trx_entries = 0;
2526 *supported = false0;
2527 switch (*bfw_comp_method) {
2528 case COMP_BLOCK_FP1: /* block floating point */
2529 /* 4 reserved bits + exponent */
2530 add_reserved_field(bfwcompparam_tree, hf_oran_reserved_4bits, tvb, offset, 1);
2531 proto_tree_add_item_ret_uint(bfwcompparam_tree, hf_oran_exponent,
2532 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, exponent);
2533 proto_item_append_text(bfwcompparam_ti, " exponent=%u", *exponent);
2534 *supported = true1;
2535 offset++;
2536 break;
2537 case COMP_BLOCK_SCALE2: /* block scaling */
2538 /* Separate into integer and fractional bits? */
2539 proto_tree_add_item(bfwcompparam_tree, hf_oran_blockScaler,
2540 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
2541 offset++;
2542 break;
2543 case COMP_U_LAW3: /* u-law */
2544 /* compBitWidth, compShift */
2545 proto_tree_add_item(bfwcompparam_tree, hf_oran_compBitWidth,
2546 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
2547 proto_tree_add_item(bfwcompparam_tree, hf_oran_compShift,
2548 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
2549 offset++;
2550 break;
2551 case 4: /* beamspace I (BLOCK SCALING) */
2552 /* activeBeamspaceCoefficientMask */
2553 offset = dissect_active_beamspace_coefficient_mask(tvb, bfwcompparam_tree, offset, num_trx_entries, trx_entries);
2554 *bfw_comp_method = COMP_BLOCK_SCALE2;
2555 *supported = false0; /* TODO: true once BLOCK SCALE is supported */
2556 proto_tree_add_item(bfwcompparam_tree, hf_oran_blockScaler,
2557 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
2558 offset++;
2559 break;
2560 case 5: /* beamspace II (BLOCK FLOATING POINT) */
2561 /* activeBeamspaceCoefficientMask */
2562 offset = dissect_active_beamspace_coefficient_mask(tvb, bfwcompparam_tree, offset, num_trx_entries, trx_entries);
2563 /* reserved (4 bits) + exponent (4 bits) */
2564 add_reserved_field(bfwcompparam_tree, hf_oran_reserved_4bits, tvb, offset, 1);
2565 proto_tree_add_item_ret_uint(bfwcompparam_tree, hf_oran_exponent, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, exponent);
2566 offset += 1;
2567 *bfw_comp_method = COMP_BLOCK_FP1;
2568 *supported = true1;
2569 break;
2570
2571 default:
2572 /* Not handled */
2573 break;
2574 }
2575
2576 proto_item_set_end(bfwcompparam_ti, tvb, offset);
2577
2578 /* Can't go on if compression scheme not supported */
2579 if (!(*supported) && meth_ti) {
2580 expert_add_info_format(pinfo, meth_ti, &ei_oran_unsupported_bfw_compression_method,
2581 "BFW Compression method %u (%s) not decompressed by dissector",
2582 *bfw_comp_method,
2583 val_to_str_const(*bfw_comp_method, bfw_comp_headers_comp_meth, "reserved"));
2584 }
2585 return offset;
2586}
2587
2588
2589/* Special case for uncompressed value with given iq_width */
2590static float uncompressed_to_float(uint32_t bits, uint32_t iq_width)
2591{
2592 if (iq_width == 0 || iq_width > 16) {
2593 /* Not valid */
2594 return 0.0;
2595 }
2596
2597 uint32_t mask = (1U << (iq_width-1)) - 1;
2598 int32_t i32 = (bits & (1U << (iq_width-1))) ? (int32_t)bits - (int32_t)(1U << iq_width) : (int32_t)bits;
2599
2600 if (show_unscaled_values || mask == 0) {
2601 return (float)i32;
2602 }
2603 return ((float)i32) / (mask);
2604}
2605
2606/* Decompress I/Q value, taking into account method, width, exponent, other input-specific methods */
2607static float decompress_value(uint32_t bits, uint32_t comp_method, uint8_t iq_width,
2608 uint32_t exponent,
2609 /* Modulation compression settings. N.B. should also pass in PRB + symbol? */
2610 section_mod_compr_config_t *m_c_p, uint8_t re)
2611{
2612 switch (comp_method) {
2613 case COMP_NONE0: /* no compression */
2614 return uncompressed_to_float(bits, iq_width);
2615
2616 case COMP_BLOCK_FP1: /* block floating point */
2617 case BFP_AND_SELECTIVE_RE5:
2618 case BFP_AND_SELECTIVE_RE_WITH_MASKS7:
2619 {
2620 /* A.1.3 Block Floating Point Decompression Algorithm */
2621 int32_t cPRB = bits;
2622 uint32_t scaler = 1 << exponent; /* i.e. 2^exponent */
2623
2624 /* Check last bit, in case we need to flip to -ve */
2625 if (cPRB >= (1<<(iq_width-1))) {
2626 cPRB -= (1<<iq_width);
2627 }
2628
2629 /* Unscale (8.1.3.1) */
2630 cPRB *= scaler;
2631 if (show_unscaled_values) {
2632 return (float)cPRB;
2633 }
2634
2635 uint32_t mantissa_scale_factor = 1 << (iq_width-1); /* 2^(mantissabits-1) */
2636 uint32_t exp_scale_factor = 1 << 15; /* 2^(2^exponentbits - 1 ) The exponent bit width is fixed to 4, so the maximum exponent is 15 */
2637
2638 float ret = cPRB / ((float)(mantissa_scale_factor*exp_scale_factor));
2639 return ret;
2640 }
2641
2642 case COMP_BLOCK_SCALE2:
2643 case COMP_U_LAW3:
2644 /* Not supported! But will be reported as expert info outside of this function! */
2645 return 0.0;
2646
2647 case COMP_MODULATION4:
2648 case MOD_COMPR_AND_SELECTIVE_RE6:
2649 case MOD_COMPR_AND_SELECTIVE_RE_WITH_MASKS8:
2650 {
2651 /* Described in A.5 (with pseudo code) */
2652 /* N.B., Applies to downlink data only - is not used for BFW */
2653
2654 /* Defaults if not overridden. TODO: what should these be? */
2655 bool_Bool csf = false0;
2656 float mcScaler = (float)(1 << 11);
2657
2658 /* Find csf + mcScaler to use. Non-default configs gleaned from SE 4,5,23 */
2659 /* TODO: should ideally be filtering by symbol and PRB too (as configured from SE23) */
2660 if (re > 0 && m_c_p && m_c_p->num_configs > 0) {
2661 for (unsigned c=0; c<m_c_p->num_configs; c++) {
2662 if (m_c_p->configs[c].mod_compr_re_mask & (1 << (12-re))) {
2663 /* Return first (should be only) found */
2664 csf = m_c_p->configs[c].mod_compr_csf;
2665 mcScaler = m_c_p->configs[c].mod_compr_scaler;
2666 break;
2667 }
2668 }
2669 }
2670
2671 int32_t cPRB = bits;
2672
2673 /* 2) Map iqSample to iqSampleFx */
2674 /* Check last bit, in case we need to flip to -ve */
2675 if (cPRB >= (1<<(iq_width-1))) {
2676 cPRB -= (1<<iq_width);
2677 }
2678 float iqSampleFx = (float)cPRB / (1 << (iq_width-1));
2679
2680
2681 /* 3) or 4) (b) - add unshifted value if csf set */
2682 float csf_to_add = 0.0;
2683 if (csf) {
2684 /* Unshift the constellation point */
2685 csf_to_add = (float)1.0 / (1 << (iq_width));
2686 }
2687 iqSampleFx += csf_to_add;
2688
2689 /* 3) or 4) (c) - unscaling */
2690 float iqSampleScaled = mcScaler * iqSampleFx * (float)sqrt(2);
2691 return iqSampleScaled;
2692 }
2693
2694 default:
2695 /* Not supported! But will be reported as expert info outside of this function! */
2696 return 0.0;
2697 }
2698}
2699
2700/* Out-of-range value used for special case */
2701#define ORPHAN_BUNDLE_NUMBER999 999
2702
2703/* Bundle of PRBs/TRX I/Q samples (ext 11) */
2704static uint32_t dissect_bfw_bundle(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, unsigned offset,
2705 proto_item *comp_meth_ti, uint32_t bfwcomphdr_comp_meth,
2706 section_mod_compr_config_t *mod_compr_params,
2707 uint32_t num_weights_per_bundle,
2708 uint8_t iq_width,
2709 unsigned bundle_number,
2710 bundle_t *bundle,
2711 uint32_t symbol_count,
2712 section_details_t *section_details,
2713 oran_tap_info *tap_info)
2714{
2715 /* Set bundle name */
2716 char bundle_name[32];
2717 if (!bundle->is_orphan) {
2718 snprintf(bundle_name, 32, "Bundle %3u", bundle_number);
2719 }
2720 else {
2721 (void) g_strlcpy(bundle_name, "Orphaned ", 32);
2722 }
2723
2724 /* Create Bundle root */
2725 proto_item *bundle_ti;
2726 if (bundle->start != bundle->end) {
2727 bundle_ti = proto_tree_add_string_format(tree, hf_oran_bfw_bundle,
2728 tvb, offset, 0, "",
2729 "%s: (PRBs %3u-%3u)",
2730 bundle_name,
2731 bundle->start, bundle->end);
2732 }
2733 else {
2734 bundle_ti = proto_tree_add_string_format(tree, hf_oran_bfw_bundle,
2735 tvb, offset, 0, "",
2736 "%s: (PRB %3u)",
2737 bundle_name,
2738 bundle->start);
2739 }
2740 proto_tree *bundle_tree = proto_item_add_subtree(bundle_ti, ett_oran_bfw_bundle);
2741
2742 /* Generated bundle id */
2743 proto_item *bundleid_ti = proto_tree_add_uint(bundle_tree, hf_oran_bfw_bundle_id, tvb, 0, 0,
2744 bundle_number);
2745 proto_item_set_generated(bundleid_ti);
2746 proto_item_set_hidden(bundleid_ti);
2747
2748 /* bfwCompParam */
2749 bool_Bool compression_method_supported = false0;
2750 unsigned exponent = 0;
2751 unsigned num_trx_entries = 0;
2752 uint16_t *trx_entries;
2753 offset = dissect_bfwCompParam(tvb, bundle_tree, pinfo, offset, comp_meth_ti,
2754 &bfwcomphdr_comp_meth, &exponent, &compression_method_supported,
2755 &num_trx_entries, &trx_entries);
2756
2757 /* Create Bundle subtree */
2758 int bit_offset = offset*8;
2759 int bfw_offset;
2760
2761 /* contInd */
2762 proto_tree_add_item(bundle_tree, hf_oran_cont_ind,
2763 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
2764 /* beamId */
2765 uint32_t beam_id;
2766 proto_tree_add_item_ret_uint(bundle_tree, hf_oran_beam_id, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &beam_id);
2767 proto_item_append_text(bundle_ti, " (beamId:%5u) ", beam_id);
2768 bit_offset += 16;
2769 add_beam_id_to_tap(tap_info, beam_id);
2770
2771 if (!PINFO_FD_VISITED(pinfo)((pinfo)->fd->visited)) {
2772 if (section_details) {
2773 for (unsigned prb = bundle->start; prb <= bundle->end; prb++) {
2774 if (prb < 273) {
2775 section_details->beamIds[prb] = beam_id;
2776 }
2777 }
2778 }
2779 }
2780
2781 /* On first pass, record that beamId was defined here */
2782 if (!PINFO_FD_VISITED(pinfo)((pinfo)->fd->visited)) {
2783 bfw_definition *definition = wmem_new0(wmem_file_scope(), bfw_definition)((bfw_definition*)wmem_alloc0((wmem_file_scope()), sizeof(bfw_definition
)))
;
2784 definition->frame_defined = pinfo->num;
2785 definition->symbol_when_defined = symbol_count;
2786 wmem_tree_insert32(dl_beam_ids_defined, beam_id, definition);
2787 }
2788
2789
2790 /* Number of weights per bundle (from preference) */
2791 proto_item *wpb_ti = proto_tree_add_uint(bundle_tree, hf_oran_num_weights_per_bundle, tvb, 0, 0,
2792 num_weights_per_bundle);
2793 proto_item_set_generated(wpb_ti);
2794
2795 /* Add the weights for this bundle. Overwrite with what was seen in bfwCompParam if beamspace */
2796 if (num_trx_entries != 0) {
2797 num_weights_per_bundle = num_trx_entries;
2798 }
2799
2800 bool_Bool non_zero_weights_seen = false0;
2801 int bit_offset_before_weights = bit_offset;
2802 for (unsigned w=0; w < num_weights_per_bundle; w++) {
2803
2804 uint16_t trx_index = (num_trx_entries) ? trx_entries[w] : w+1;
2805
2806 /* Create subtree */
2807 bfw_offset = bit_offset / 8;
2808 uint8_t bfw_extent = ((bit_offset + (iq_width*2)) / 8) - bfw_offset;
2809 proto_item *bfw_ti = proto_tree_add_string_format(bundle_tree, hf_oran_bfw,
2810 tvb, bfw_offset, bfw_extent,
2811 "", "TRX %3u: (", trx_index);
2812 proto_tree *bfw_tree = proto_item_add_subtree(bfw_ti, ett_oran_bfw);
2813
2814 /* I */
2815 /* Get bits, and convert to float. */
2816 uint32_t bits = tvb_get_bits32(tvb, bit_offset, iq_width, ENC_BIG_ENDIAN0x00000000);
2817 if (bits) {
2818 non_zero_weights_seen = true1;
2819 }
2820 float value = decompress_value(bits, bfwcomphdr_comp_meth, iq_width,
2821 exponent, mod_compr_params, 0 /* RE */);
2822 /* Add to tree. */
2823 proto_tree_add_float_format_value(bfw_tree, hf_oran_bfw_i, tvb, bit_offset/8, (iq_width+7)/8, value, "#%u=%f", w, value);
2824 bit_offset += iq_width;
2825 proto_item_append_text(bfw_ti, "I%u=%f ", w, value);
2826
2827 /* Q */
2828 /* Get bits, and convert to float. */
2829 bits = tvb_get_bits32(tvb, bit_offset, iq_width, ENC_BIG_ENDIAN0x00000000);
2830 if (bits) {
2831 non_zero_weights_seen = true1;
2832 }
2833
2834 value = decompress_value(bits, bfwcomphdr_comp_meth, iq_width,
2835 exponent, mod_compr_params, 0 /* RE */);
2836 /* Add to tree. */
2837 proto_tree_add_float_format_value(bfw_tree, hf_oran_bfw_q, tvb, bit_offset/8, (iq_width+7)/8, value, "#%u=%f", w, value);
2838 bit_offset += iq_width;
2839 proto_item_append_text(bfw_ti, "Q%u=%f)", w, value);
2840 }
2841
2842 if (!non_zero_weights_seen) {
2843 proto_tree_add_item(bundle_tree, hf_oran_bundle_weights_all_zero, tvb,
2844 bit_offset_before_weights/8, (bit_offset+7)/8 - (bit_offset_before_weights/8), ENC_NA0x00000000);
2845 }
2846
2847 if (bundle->bit_from_rbg_mask) {
2848 proto_item_append_text(bundle_ti, " (rbg %u)", bundle->bit_from_rbg_mask-1);
2849 }
2850
2851 /* Set extent of bundle */
2852 proto_item_set_end(bundle_ti, tvb, (bit_offset+7)/8);
2853
2854 return (bit_offset+7)/8;
2855}
2856
2857/* Return new bit offset. in/out will always be byte-aligned.. */
2858static int dissect_ciCompParam(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), unsigned bit_offset,
2859 unsigned comp_meth, uint8_t *exponent)
2860{
2861 if (comp_meth == COMP_NONE0) {
2862 /* Nothing in frame so don't even create subtree */
2863 return bit_offset;
2864 }
2865
2866 /* Subtree */
2867 proto_item *cicompparam_ti = proto_tree_add_string_format(tree, hf_oran_ciCompParam,
2868 tvb, bit_offset/8, 1, "",
2869 "ciCompParam");
2870 proto_tree *cicompparam_tree = proto_item_add_subtree(cicompparam_ti, ett_oran_cicompparam);
2871 uint32_t ci_exponent;
2872
2873 /* Contents differ by compression method */
2874 switch (comp_meth) {
2875 case COMP_BLOCK_FP1:
2876 add_reserved_field(cicompparam_tree, hf_oran_reserved_4bits, tvb, bit_offset/8, 1);
2877 proto_tree_add_item_ret_uint(cicompparam_tree, hf_oran_exponent,
2878 tvb, bit_offset/8, 1, ENC_BIG_ENDIAN0x00000000, &ci_exponent);
2879 *exponent = ci_exponent;
2880 proto_item_append_text(cicompparam_ti, " (Exponent=%u)", ci_exponent);
2881 bit_offset += 8; /* one byte */
2882 break;
2883 case COMP_BLOCK_SCALE2:
2884 /* Separate into integer (1) and fractional (7) bits? */
2885 proto_tree_add_item(cicompparam_tree, hf_oran_blockScaler,
2886 tvb, bit_offset/8, 1, ENC_BIG_ENDIAN0x00000000);
2887 bit_offset += 8;
2888 break;
2889 case COMP_U_LAW3:
2890 /* compBitWidth, compShift (4 bits each) */
2891 proto_tree_add_item(cicompparam_tree, hf_oran_compBitWidth,
2892 tvb, bit_offset/8, 1, ENC_BIG_ENDIAN0x00000000);
2893 proto_tree_add_item(cicompparam_tree, hf_oran_compShift,
2894 tvb, bit_offset/8, 1, ENC_BIG_ENDIAN0x00000000);
2895 bit_offset += 8;
2896 break;
2897
2898 default:
2899 /* reserved, ? bytes of zeros.. */
2900 break;
2901 }
2902
2903 return bit_offset;
2904}
2905
2906/* frameStructure (7.5.2.13) */
2907static unsigned dissect_frame_structure(proto_item *tree, tvbuff_t *tvb, unsigned offset,
2908 uint32_t subframeId, uint32_t slotId)
2909{
2910 uint32_t scs;
2911 /* FFT Size (4 bits) */
2912 proto_tree_add_item(tree, hf_oran_frameStructure_fft, tvb, offset, 1, ENC_NA0x00000000);
2913 /* Subcarrier spacing (SCS) */
2914 proto_tree_add_item_ret_uint(tree, hf_oran_frameStructure_subcarrier_spacing, tvb, offset, 1, ENC_NA0x00000000, &scs);
2915
2916 /* Show slot within frame as a generated field. See table 7.5.13-3 */
2917 uint32_t slots_per_subframe = 1;
2918 if (scs <= 4) {
2919 slots_per_subframe = 1 << scs;
2920 }
2921 if (scs <= 4 || scs >= 12) {
2922 proto_item *ti = proto_tree_add_uint(tree, hf_oran_slot_within_frame, tvb, 0, 0,
2923 (slots_per_subframe*subframeId) + slotId);
2924 proto_item_set_generated(ti);
2925 }
2926 return offset + 1;
2927}
2928
2929static unsigned dissect_csf(proto_item *tree, tvbuff_t *tvb, unsigned bit_offset,
2930 unsigned iq_width, bool_Bool *p_csf)
2931{
2932 proto_item *csf_ti;
2933 uint64_t csf;
2934 csf_ti = proto_tree_add_bits_ret_val(tree, hf_oran_csf, tvb, bit_offset, 1, &csf, ENC_BIG_ENDIAN0x00000000);
2935 if (csf) {
2936 /* Table 7.7.4.2-1 Constellation shift definition (index is udIqWidth) */
2937 const char* shift_value[] = { "n/a", "1/2", "1/4", "1/8", "1/16", "1/32" };
2938 if (iq_width >=1 && iq_width <= 5) {
2939 proto_item_append_text(csf_ti, " (Shift Value is %s)", shift_value[iq_width]);
2940 }
2941 }
2942
2943 /* Set out parameter */
2944 if (p_csf != NULL((void*)0)) {
2945 *p_csf = (csf!=0);
2946 }
2947 return bit_offset+1;
2948}
2949
2950static unsigned dissect_rbg_mask(proto_item *tree, tvbuff_t *tvb, unsigned offset, uint32_t *rbgMask, proto_item **item)
2951{
2952 uint64_t rbgMask64;
2953
2954 static int * const rbg_mask_bits[] = {
2955 &hf_oran_rbg_mask_27,
2956 &hf_oran_rbg_mask_26,
2957 &hf_oran_rbg_mask_25,
2958 &hf_oran_rbg_mask_24,
2959 &hf_oran_rbg_mask_23,
2960 &hf_oran_rbg_mask_22,
2961 &hf_oran_rbg_mask_21,
2962 &hf_oran_rbg_mask_20,
2963 &hf_oran_rbg_mask_19,
2964 &hf_oran_rbg_mask_18,
2965 &hf_oran_rbg_mask_17,
2966 &hf_oran_rbg_mask_16,
2967 &hf_oran_rbg_mask_15,
2968 &hf_oran_rbg_mask_14,
2969 &hf_oran_rbg_mask_13,
2970 &hf_oran_rbg_mask_12,
2971 &hf_oran_rbg_mask_11,
2972 &hf_oran_rbg_mask_10,
2973 &hf_oran_rbg_mask_9,
2974 &hf_oran_rbg_mask_8,
2975 &hf_oran_rbg_mask_7,
2976 &hf_oran_rbg_mask_6,
2977 &hf_oran_rbg_mask_5,
2978 &hf_oran_rbg_mask_4,
2979 &hf_oran_rbg_mask_3,
2980 &hf_oran_rbg_mask_2,
2981 &hf_oran_rbg_mask_1,
2982 &hf_oran_rbg_mask_0,
2983 NULL((void*)0)
2984 };
2985
2986 *item = proto_tree_add_bitmask_ret_uint64(tree, tvb, offset,
2987 hf_oran_rbgMask, ett_oran_rbgMask,
2988 rbg_mask_bits,
2989 ENC_BIG_ENDIAN0x00000000, &rbgMask64);
2990 *rbgMask = (uint32_t)rbgMask64;
2991 return offset+4;
2992}
2993
2994
2995/* Section 7.
2996 * N.B. these are the green parts of the tables showing Section Types, differing by section Type */
2997static int dissect_oran_c_section(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo,
2998 flow_state_t* state,
2999 uint32_t sectionType, oran_tap_info *tap_info, proto_item *protocol_item,
3000 uint32_t subframeId, uint32_t frameId, uint32_t slotId, uint32_t startSymbolId,
3001 uint8_t ci_iq_width, uint8_t ci_comp_meth, unsigned ci_comp_opt,
3002 unsigned num_sinr_per_prb)
3003{
3004 unsigned offset = 0;
3005 proto_tree *c_section_tree = NULL((void*)0);
3006 proto_item *sectionHeading = NULL((void*)0);
3007
3008 /* Section subtree */
3009 sectionHeading = proto_tree_add_string_format(tree, hf_oran_c_section,
3010 tvb, offset, 0, "", "Section");
3011 c_section_tree = proto_item_add_subtree(sectionHeading, ett_oran_c_section);
3012
3013 uint32_t sectionId = 0;
3014
3015 uint32_t startPrbc=0, startPrbu=0;
3016 uint32_t numPrbc=0, numPrbu=0;
3017 uint32_t ueId = 0;
3018 proto_item *ueId_ti = NULL((void*)0);
3019 uint32_t section_beamId = 0;
3020 proto_item *section_beamId_ti = NULL((void*)0);
3021 bool_Bool section_beamId_ignored = false0;
3022
3023 proto_item *numsymbol_ti = NULL((void*)0);
3024 bool_Bool numsymbol_ignored = false0;
3025
3026 proto_item *numprbc_ti = NULL((void*)0);
3027
3028 proto_item *rb_ti = NULL((void*)0);
3029 uint32_t rb;
3030
3031 uint64_t re_mask;
1
're_mask' declared without an initial value
3032 proto_item *re_mask_ti = NULL((void*)0);
3033
3034 /* Config affecting ext11 bundles (initially unset) */
3035 ext11_settings_t ext11_settings;
3036 memset(&ext11_settings, 0, sizeof(ext11_settings));
3037
3038 /* Section Type 10 needs to keep track of PRB range that should be reported
3039 for msgTypeId=5 (Interference plus Noise for unallocated PRBs) */
3040 /* All PRBs start as false */
3041#define MAX_PRBS273 273
3042 bool_Bool prbs_for_st10_type5[MAX_PRBS273];
3043 memset(&prbs_for_st10_type5, 0, sizeof(prbs_for_st10_type5));
3044
3045 /* These UEIds are set by ST5, ST10 (single value), and extended by SE10 */
3046#define MAX_UEIDS16 16
3047 uint32_t ueids[MAX_UEIDS16];
3048 uint32_t number_of_ueids = 0;
3049
3050 bool_Bool extension_flag = false0;
3051
3052 /* All remaining symbols for section types without numSymbol */
3053 uint32_t numSymbol = 14;
3054
3055 /* These sections (ST0, ST1, ST2, ST3, ST5, ST9, ST10, ST11) are similar, so handle as common with per-type differences */
3056 if (((sectionType <= SEC_C_UE_SCHED) || (sectionType >= SEC_C_SINR_REPORTING)) &&
2
Assuming 'sectionType' is > SEC_C_UE_SCHED
3
Assuming 'sectionType' is < SEC_C_SINR_REPORTING
3057 (sectionType != SEC_C_SLOT_CONTROL)) {
3058
3059 /* sectionID */
3060 proto_item *ti = proto_tree_add_item_ret_uint(c_section_tree, hf_oran_section_id, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &sectionId);
3061 if (sectionId == 4095) {
3062 proto_item_append_text(ti, " (not default coupling C/U planes using sectionId)");
3063 }
3064 offset++;
3065
3066 if (tap_info->num_section_ids < MAX_SECTION_IDs32) {
3067 tap_info->section_ids[tap_info->num_section_ids++] = sectionId;
3068 }
3069
3070 /* rb */
3071 rb_ti = proto_tree_add_item_ret_uint(c_section_tree, hf_oran_rb, tvb, offset, 1, ENC_NA0x00000000, &rb);
3072
3073 /* symInc (1 bit) */
3074 /* TODO: mark as ignored if SE6, SE12 or SE19 present */
3075 if (sectionType != SEC_C_RRM_MEAS_REPORTS && /* Section Type 10 */
3076 sectionType != SEC_C_RRM_MEAS_REPORTS_NON_TIMING && /* Section Type 13 */
3077 sectionType != SEC_C_REQUEST_RRM_MEAS) { /* Section Type 11 */
3078 unsigned int sym_inc;
3079 proto_item *sym_inc_ti = proto_tree_add_item_ret_uint(c_section_tree, hf_oran_symInc, tvb, offset, 1, ENC_NA0x00000000, &sym_inc);
3080 if (sym_inc !=0 && (sectionType == SEC_C_SINR_REPORTING)) { /* Section Type 9 */
3081 /* "0 shall be used" */
3082 proto_item_append_text(sym_inc_ti, " (should be 0)");
3083 }
3084 }
3085 else {
3086 /* reserved (1 bit) */
3087 add_reserved_field(c_section_tree, hf_oran_reserved_bit5, tvb, offset, 1);
3088 }
3089
3090 /* startPrbx and numPrbx */
3091 if (sectionType == SEC_C_SINR_REPORTING) {
3092 /* startPrbu (10 bits) */
3093 proto_tree_add_item_ret_uint(c_section_tree, hf_oran_startPrbu, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &startPrbu);
3094 offset += 2;
3095
3096 /* numPrbu */
3097 numprbc_ti = proto_tree_add_item_ret_uint(c_section_tree, hf_oran_numPrbu, tvb, offset, 1, ENC_NA0x00000000, &numPrbu);
3098 if (numPrbu == 0) {
3099 proto_item_append_text(numprbc_ti, " (all PRBs - configured as %u)", pref_data_plane_section_total_rbs);
3100 numPrbu = pref_data_plane_section_total_rbs;
3101 }
3102 offset += 1;
3103 }
3104 else {
3105 /* startPrbc (10 bits) */
3106 proto_tree_add_item_ret_uint(c_section_tree, hf_oran_startPrbc, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &startPrbc);
3107 offset += 2;
3108
3109 /* numPrbc */
3110 numprbc_ti = proto_tree_add_item_ret_uint(c_section_tree, hf_oran_numPrbc, tvb, offset, 1, ENC_NA0x00000000, &numPrbc);
3111 if (numPrbc == 0) {
3112 proto_item_append_text(numprbc_ti, " (all PRBs - configured as %u)", pref_data_plane_section_total_rbs);
3113 /* TODO: should probably set to pref_data_plane_section_total_rbs, and define MAX_PRBS to > 273 ? */
3114 numPrbc = MAX_PRBS273;
3115 }
3116 offset += 1;
3117 }
3118
3119 /* Start with range from section. May get changed by SE6, SE12, SE20 */
3120 for (unsigned n=startPrbc; n < startPrbc+numPrbc; n++) {
3121 if (n < MAX_PRBS273) {
3122 prbs_for_st10_type5[n] = true1;
3123 }
3124 }
3125
3126 if (sectionType != SEC_C_SINR_REPORTING) { /* *NOT* Section Type 9 */
3127 static int * const remask_flags[] = {
3128 &hf_oran_reMask_re1,
3129 &hf_oran_reMask_re2,
3130 &hf_oran_reMask_re3,
3131 &hf_oran_reMask_re4,
3132 &hf_oran_reMask_re5,
3133 &hf_oran_reMask_re6,
3134 &hf_oran_reMask_re7,
3135 &hf_oran_reMask_re8,
3136 &hf_oran_reMask_re9,
3137 &hf_oran_reMask_re10,
3138 &hf_oran_reMask_re11,
3139 &hf_oran_reMask_re12,
3140 NULL((void*)0)
3141 };
3142
3143 /* reMask */
3144 re_mask_ti = proto_tree_add_bitmask_ret_uint64(c_section_tree, tvb, offset,
3145 hf_oran_reMask, ett_oran_remask, remask_flags, ENC_BIG_ENDIAN0x00000000, &re_mask);
3146 offset++;
3147 /* numSymbol */
3148 numsymbol_ti = proto_tree_add_item_ret_uint(c_section_tree, hf_oran_numSymbol, tvb, offset, 1, ENC_NA0x00000000, &numSymbol);
3149 if (((sectionType == SEC_C_RRM_MEAS_REPORTS) || (sectionType == SEC_C_RRM_MEAS_REPORTS_NON_TIMING)) && (numSymbol != 14)) { /* Section type 10/13 must have 14 symbols */
3150 proto_item_append_text(numsymbol_ti, " (for ST10, should be 14!)");
3151 expert_add_info_format(pinfo, numsymbol_ti, &ei_oran_st10_numsymbol_not_14,
3152 "numSymbol should be 14 for ST10 - found %u", numSymbol);
3153 }
3154 if ((startSymbolId + numSymbol) > 14) {
3155 /* Warn if startSymbol + numSymbol would be > 14 */
3156 expert_add_info_format(pinfo, numsymbol_ti, &ei_oran_too_many_symbols,
3157 "startSymbolId (%u) + numSymbol (%u) exceeds max of 14",
3158 startSymbolId, numSymbol);
3159 }
3160 offset++;
3161
3162 /* [ef] (extension flag) */
3163 switch (sectionType) {
3164 case SEC_C_UNUSED_RB: /* Section Type 0 */
3165 case SEC_C_NORMAL: /* Section Type 1 */
3166 case SEC_C_PRACH: /* Section Type 3 */
3167 case SEC_C_UE_SCHED: /* Section Type 5 */
3168 case SEC_C_RRM_MEAS_REPORTS: /* Section Type 10 */
3169 case SEC_C_RRM_MEAS_REPORTS_NON_TIMING: /* Section Type 13 */
3170
3171 case SEC_C_REQUEST_RRM_MEAS: /* Section Type 11 */
3172 proto_tree_add_item_ret_boolean(c_section_tree, hf_oran_ef, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &extension_flag);
3173 break;
3174 default:
3175 /* Other section types don't support extensions */
3176 break;
3177 }
3178
3179 write_section_info(sectionHeading, pinfo, protocol_item, sectionId, startPrbc, numPrbc, rb);
3180 proto_item_append_text(sectionHeading, ", Symbols: %2u", numSymbol);
3181
3182 if (numPrbc == 0) {
3183 /* Special case for all PRBs */
3184 numPrbc = pref_data_plane_section_total_rbs;
3185 startPrbc = 0; /* may already be 0... */
3186 }
3187 }
3188 else {
3189 /* Section Type 9 */
3190 write_section_info(sectionHeading, pinfo, protocol_item, sectionId, startPrbu, numPrbu, rb);
3191 proto_item_append_text(sectionHeading, ", numSinrPerPrb: %2u", num_sinr_per_prb);
3192 }
3193
3194 /* Section type specific fields (after 'numSymbol') */
3195 switch (sectionType) {
3196 case SEC_C_UNUSED_RB: /* Section Type 0 - Table 7.4.2-1 */
3197 /* reserved (15 bits) */
3198 add_reserved_field(c_section_tree, hf_oran_reserved_15bits, tvb, offset, 2);
3199 offset += 2;
3200 break;
3201
3202 case SEC_C_NORMAL: /* Section Type 1 - Table 7.4.3-1 */
3203 /* beamId */
3204 section_beamId_ti = proto_tree_add_item_ret_uint(c_section_tree, hf_oran_beamId, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &section_beamId);
3205 offset += 2;
3206
3207 /* beamId might get invalidated by e.g., ext-6, ext-11, so unused value will still be shown here.. */
3208 proto_item_append_text(sectionHeading, ", BeamId: %d", section_beamId);
3209 break;
3210
3211 case SEC_C_PRACH: /* Section Type 3 - Table 7.4.5-1 */
3212 {
3213 /* beamId */
3214 section_beamId_ti = proto_tree_add_item_ret_uint(c_section_tree, hf_oran_beamId, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &section_beamId);
3215 offset += 2;
3216
3217 /* freqOffset */
3218 int32_t freqOffset; /* Yes, this is signed, so the cast is intentional. */
3219 proto_item *freq_offset_item = proto_tree_add_item_ret_uint(c_section_tree, hf_oran_freqOffset, tvb, offset, 3, ENC_BIG_ENDIAN0x00000000, (uint32_t*)&freqOffset);
3220 freqOffset |= 0xff000000; /* Must sign-extend */
3221 proto_item_set_text(freq_offset_item, "Frequency offset: %d \u0394f", freqOffset);
3222 offset += 3;
3223
3224 /* reserved (8 bits) */
3225 add_reserved_field(c_section_tree, hf_oran_reserved_8bits, tvb, offset, 1);
3226 offset += 1;
3227
3228 /* beamId might get invalidated by e.g., ext-6, ext-11, so unused value will still be shown here.. */
3229 proto_item_append_text(sectionHeading, ", BeamId: %d, FreqOffset: %d \u0394f", section_beamId, freqOffset);
3230 break;
3231 }
3232
3233 case SEC_C_UE_SCHED: /* Section Type 5 - Table 7.4.7-1 */
3234 case SEC_C_RRM_MEAS_REPORTS: /* Section Type 10 - Table 7.4.12-1 */
3235 case SEC_C_RRM_MEAS_REPORTS_NON_TIMING: /* Section Type 13 - Table 7.4.12-1 (same frame format) */
3236
3237 /* ueId */
3238 ueId_ti = proto_tree_add_item_ret_uint(c_section_tree, hf_oran_ueId, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &ueId);
3239 offset += 2;
3240 if (ueId == 0x7fff) {
3241 proto_item_append_text(ueId_ti, " (PRBs not scheduled for eAxC ID in transport header)");
3242 }
3243 else {
3244 ueids[number_of_ueids++] = ueId;
3245 }
3246
3247 proto_item_append_text(sectionHeading, ", UEId: %d", ueId);
3248 break;
3249
3250 case SEC_C_SINR_REPORTING: /* Section Type 9 - SINR Reporting */
3251 {
3252 /* Hidden filter for bf (DMFS-BF) */
3253 proto_item *bf_ti = proto_tree_add_item(tree, hf_oran_bf, tvb, 0, 0, ENC_NA0x00000000);
3254 PROTO_ITEM_SET_HIDDEN(bf_ti)proto_item_set_hidden((bf_ti));
3255
3256 unsigned bit_offset = offset*8;
3257
3258 /* sinr iqWidth */
3259 proto_item *iq_width_item = proto_tree_add_uint(c_section_tree, hf_oran_sinrCompHdrIqWidth_pref, tvb, 0, 0, pref_sample_bit_width_sinr);
3260 proto_item_append_text(iq_width_item, " (from preferences)");
3261 proto_item_set_generated(iq_width_item);
3262 if (pref_sample_bit_width_sinr == 0 || pref_sample_bit_width_sinr > 16) {
3263 expert_add_info_format(pinfo, iq_width_item, &ei_oran_invalid_sample_bit_width,
3264 "SINR sample bit width from preference (%u) not valid, so can't decode SINR",
3265 pref_sample_bit_width_sinr);
3266 break;
3267 }
3268
3269 /* sinr compMethod */
3270 proto_item *sinr_comp_meth_item = proto_tree_add_uint(c_section_tree, hf_oran_sinrCompHdrMeth_pref, tvb, 0, 0, pref_iqCompressionSINR);
3271 proto_item_append_text(sinr_comp_meth_item, " (from preferences)");
3272 proto_item_set_generated(sinr_comp_meth_item);
3273
3274 /* Add SINR entries for each PRB */
3275 for (unsigned prb=startPrbu; prb < startPrbu+numPrbu; prb++) {
3276 /* Create a subtree for each PRB */
3277 proto_item *prb_ti = proto_tree_add_string_format(c_section_tree, hf_oran_sinr_prb,
3278 tvb, offset, 0, "", "PRB %3u (", prb);
3279 proto_tree *prb_tree = proto_item_add_subtree(prb_ti, ett_oran_sinr_prb);
3280
3281 /* Each prb starts byte-aligned */
3282 bit_offset = ((bit_offset+7)/8) * 8;
3283
3284 /* N.B., using width/method from UL U-plane preferences, not certain that this is correct.. */
3285
3286 /* sinrCompParam (udCompParam format, may be empty) */
3287 uint32_t exponent = 0; /* N.B. init to silence warnings, but will always be set if read in COMP_BLOCK_FP case */
3288 uint16_t sReSMask;
3289 bit_offset = dissect_udcompparam(tvb, pinfo, prb_tree, bit_offset/8,
3290 pref_iqCompressionSINR, &exponent, &sReSMask,
3291 true1) * 8; /* last param is for_sinr */
3292
3293 /* sinrValues for this PRB. */
3294 /* TODO: not sure how numSinrPerPrb interacts with rb==1... */
3295 for (unsigned n=0; n < num_sinr_per_prb; n++) {
3296 unsigned sinr_bits = tvb_get_bits32(tvb, bit_offset, pref_sample_bit_width_sinr, ENC_BIG_ENDIAN0x00000000);
3297
3298 /* Using SINR compression settings from preferences */
3299 float value = decompress_value(sinr_bits,
3300 pref_iqCompressionSINR, pref_sample_bit_width_sinr,
3301 exponent,
3302 NULL((void*)0) /* no ModCompr for SINR */, 0 /* RE */);
3303 unsigned sample_len_in_bytes = ((bit_offset%8)+pref_sample_bit_width_sinr+7)/8;
3304 proto_item *val_ti = proto_tree_add_float(prb_tree, hf_oran_sinr_value, tvb,
3305 bit_offset/8, sample_len_in_bytes, value);
3306 proto_item_append_text(prb_ti, " %8f", value);
3307
3308 /* Show here which subcarriers share which values (they all divide 12..) */
3309 if (num_sinr_per_prb == 12) {
3310 proto_item_append_text(val_ti, " (PRB=%u, subcarrier %u)",
3311 startPrbu+((prb-startPrbu)*(rb+1)), n*(12/num_sinr_per_prb));
3312 }
3313 else {
3314 proto_item_append_text(val_ti, " (PRB=%u, subcarriers %u-%u)",
3315 startPrbu+((prb-startPrbu)*(rb+1)),
3316 n*(12/num_sinr_per_prb), (n+1)*(12/num_sinr_per_prb)-1);
3317 }
3318 bit_offset += pref_sample_bit_width_sinr;
3319 }
3320
3321 /* 1-byte alignment per PRB (7.2.11) */
3322 offset = (bit_offset+7)/8;
3323 bit_offset = offset*8;
3324
3325 proto_item_append_text(prb_ti, ")");
3326 proto_item_set_end(prb_ti, tvb, offset);
3327 }
3328 break;
3329 }
3330 case SEC_C_REQUEST_RRM_MEAS: /* Section Type 11 - Request RRM Measurements */
3331 /* Reserved (15 bits) */
3332 add_reserved_field(c_section_tree, hf_oran_reserved_15bits, tvb, offset, 2);
3333 offset += 2;
3334 break;
3335
3336 default:
3337 break;
3338 }
3339 }
3340 else if (sectionType == SEC_C_CH_INFO) { /* Section Type 6 */
4
Assuming 'sectionType' is equal to SEC_C_CH_INFO
5
Taking true branch
3341 /* ef */
3342 proto_tree_add_item_ret_boolean(c_section_tree, hf_oran_ef, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &extension_flag);
3343 /* ueId */
3344 proto_tree_add_item_ret_uint(c_section_tree, hf_oran_ueId, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &ueId);
3345 offset += 2;
3346 /* regularizationFactor */
3347 proto_tree_add_item(c_section_tree, hf_oran_regularizationFactor, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
3348 offset += 2;
3349 /* reserved (4 bits) */
3350 add_reserved_field(c_section_tree, hf_oran_reserved_4bits, tvb, offset, 1);
3351 /* rb ("Value=0 shall be set") */
3352 rb_ti = proto_tree_add_item_ret_uint(c_section_tree, hf_oran_rb, tvb, offset, 1, ENC_NA0x00000000, &rb);
3353 if (rb != 0) {
6
Assuming 'rb' is equal to 0
7
Taking false branch
3354 proto_item_append_text(rb_ti, " (should be set to 0)");
3355 expert_add_info(pinfo, rb_ti, &ei_oran_st6_rb_shall_be_0);
3356 }
3357 /* symInc */
3358 proto_tree_add_item(c_section_tree, hf_oran_symInc, tvb, offset, 1, ENC_NA0x00000000);
3359 /* startPrbc */
3360 proto_tree_add_item_ret_uint(c_section_tree, hf_oran_startPrbc, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &startPrbc);
3361 offset += 2;
3362 /* numPrbc */
3363 proto_tree_add_item_ret_uint(c_section_tree, hf_oran_numPrbc, tvb, offset, 1, ENC_NA0x00000000, &numPrbc);
3364 offset += 1;
3365
3366 /* Hidden filter for bf */
3367 proto_item *bf_ti = proto_tree_add_item(tree, hf_oran_bf, tvb, 0, 0, ENC_NA0x00000000);
3368 PROTO_ITEM_SET_HIDDEN(bf_ti)proto_item_set_hidden((bf_ti));
3369
3370 /* ciIsample,ciQsample pairs */
3371 unsigned m;
3372 unsigned prb;
3373 uint32_t bit_offset = offset*8;
3374
3375 /* Antenna count from preference */
3376 unsigned num_trx = pref_num_bf_antennas;
3377
3378 write_channel_section_info(sectionHeading, pinfo,
3379 sectionId, ueId, startPrbc, numPrbc, num_trx);
3380
3381 bool_Bool first_prb = true1;
3382 uint8_t exponent = 0;
3383 for (prb=startPrbc; prb < startPrbc+numPrbc; prb++) {
8
Assuming the condition is false
9
Loop condition is false. Execution continues on line 3434
3384
3385 /* PRB subtree */
3386 unsigned prb_start_offset = bit_offset;
3387 proto_item *prb_ti = proto_tree_add_string_format(c_section_tree, hf_oran_samples_prb,
3388 tvb, bit_offset/8, 0,
3389 "", "PRB=%u", prb);
3390 proto_tree *prb_tree = proto_item_add_subtree(prb_ti, ett_oran_prb_cisamples);
3391
3392 /* There may be a ciCompParam here.. */
3393 if (first_prb || ci_comp_opt==1) {
3394 bit_offset = dissect_ciCompParam(tvb, prb_tree, pinfo, bit_offset, ci_comp_meth, &exponent);
3395 }
3396 first_prb = false0;
3397
3398 /* Antennas */
3399 for (m=0; m < num_trx; m++) {
3400
3401 unsigned sample_offset = bit_offset / 8;
3402 uint8_t sample_extent = ((bit_offset + (ci_iq_width*2)) / 8) - sample_offset;
3403
3404 /* Create subtree for antenna */
3405 proto_item *sample_ti = proto_tree_add_string_format(prb_tree, hf_oran_ciSample,
3406 tvb, sample_offset, sample_extent,
3407 "", "TRX=%2u: ", m);
3408 proto_tree *sample_tree = proto_item_add_subtree(sample_ti, ett_oran_cisample);
3409
3410 /* I */
3411 /* Get bits, and convert to float. */
3412 uint32_t bits = tvb_get_bits32(tvb, bit_offset, ci_iq_width, ENC_BIG_ENDIAN0x00000000);
3413 float value = decompress_value(bits, ci_comp_meth, ci_iq_width, exponent, NULL((void*)0) /* no ModCompr for ST6 */, 0 /* RE */);
3414
3415 /* Add to tree. */
3416 proto_tree_add_float_format_value(sample_tree, hf_oran_ciIsample, tvb, bit_offset/8, (ci_iq_width+7)/8, value, "#%u=%f", m, value);
3417 bit_offset += ci_iq_width;
3418 proto_item_append_text(sample_ti, "I%u=%f ", m, value);
3419
3420 /* Q */
3421 /* Get bits, and convert to float. */
3422 bits = tvb_get_bits32(tvb, bit_offset, ci_iq_width, ENC_BIG_ENDIAN0x00000000);
3423 value = decompress_value(bits, ci_comp_meth, ci_iq_width, exponent, NULL((void*)0) /* no ModCompr for ST6 */, 0 /* RE */);
3424
3425 /* Add to tree. */
3426 proto_tree_add_float_format_value(sample_tree, hf_oran_ciQsample, tvb, bit_offset/8, (ci_iq_width+7)/8, value, "#%u=%f", m, value);
3427 bit_offset += ci_iq_width;
3428 proto_item_append_text(sample_ti, "Q%u=%f ", m, value);
3429 }
3430 proto_item_set_len(prb_ti, (bit_offset-prb_start_offset+7)/8);
3431 }
3432
3433 /* Pad out by 1 or 4 bytes, according to preference */
3434 if (!st6_4byte_alignment) {
10
Assuming 'st6_4byte_alignment' is true
11
Taking false branch
3435 offset = (bit_offset + 7) / 8;
3436 }
3437 else {
3438 int mode = bit_offset % 32;
3439 if (mode
11.1
'mode' is not equal to 0
!= 0) {
12
Taking true branch
3440 offset = (bit_offset + (32-mode))/8;
3441 }
3442 else {
3443 offset = bit_offset/8;
3444 }
3445 }
3446 proto_item_set_end(c_section_tree, tvb, offset);
3447 }
3448
3449
3450 expected_section_data_t *data_section = NULL((void*)0);
3451 unsigned index_to_use = 0;
3452
3453 /* On first pass, allocate a section entry to use */
3454 if (link_planes_together && !PINFO_FD_VISITED(pinfo)((pinfo)->fd->visited)) {
13
Assuming 'link_planes_together' is false
3455
3456 /* Look for existing entry for sectionId to overwrite first. */
3457 uint8_t direction = !tap_info->uplink;
3458 data_section = wmem_tree_lookup32(state->expected_sections[direction],
3459 sectionId);
3460 if (data_section == NULL((void*)0)) {
3461 /* None, so create */
3462 data_section = wmem_new0(wmem_file_scope(), expected_section_data_t)((expected_section_data_t*)wmem_alloc0((wmem_file_scope()), sizeof
(expected_section_data_t)))
;
3463 wmem_tree_insert32(state->expected_sections[direction],
3464 sectionId,
3465 data_section);
3466 }
3467
3468 /* TODO: not currently coping with case where >1 C-plane frames define same sectionId (covering different PRBs).
3469 * Ideally would at least update the missing beamIds.. */
3470 if (data_section->details[0].in_use) {
3471 /* If 2nd entry not in use, use that one */
3472 if (!data_section->details[1].in_use) {
3473 index_to_use = 1;
3474 }
3475 else {
3476 /* Both in use, so replace the older of the 2 entries */
3477 if (data_section->details[1].frame_number < data_section->details[0].frame_number) {
3478 index_to_use = 1;
3479 }
3480 }
3481 }
3482
3483 if (data_section) {
3484 section_details_t *details = &data_section->details[index_to_use];
3485
3486 details->in_use = true1;
3487 details->frame = frameId;
3488 details->subframe = subframeId;
3489 details->slot = slotId;
3490 details->startSymbol = startSymbolId;
3491 details->numSymbols = numSymbol;
3492
3493 details->frame_number = pinfo->num;
3494 details->frame_time = pinfo->abs_ts;
3495 data_section->sectionId = sectionId;
3496 details->startPrb = startPrbc;
3497 details->numPrb = numPrbc;
3498 for (unsigned prb = startPrbc; prb <= startPrbc+numPrbc; prb++) {
3499 if (prb < 273) {
3500 details->beamIds[prb] = section_beamId;
3501 }
3502 }
3503 }
3504 }
3505
3506 bool_Bool seen_se10 = false0;
3507 uint32_t numPortc = 0;
3508 proto_item *bf_ti = NULL((void*)0);
3509
3510 /* Section extension commands */
3511 while (extension_flag) {
14
Loop condition is true. Entering loop body
3512 int extension_start_offset = offset;
3513
3514 /* Prefetch extType so can use specific extension type ett */
3515 uint32_t exttype = tvb_get_uint8(tvb, offset) & 0x7f;
3516 uint32_t exttype_ett_index = exttype;
3517 if (exttype == 0 || exttype > HIGHEST_EXTTYPE35) {
15
Assuming 'exttype' is not equal to 0
16
Assuming 'exttype' is <= HIGHEST_EXTTYPE
17
Taking false branch
3518 /* Just use first one if out of range */
3519 exttype_ett_index = 1;
3520 }
3521
3522 /* Create subtree for each extension (with summary) */
3523 proto_item *extension_ti = proto_tree_add_string_format(c_section_tree, hf_oran_extension,
3524 tvb, offset, 0, "", "Extension");
3525 proto_tree *extension_tree = proto_item_add_subtree(extension_ti, ett_oran_c_section_extension[exttype_ett_index-1]);
3526
3527 /* ef (i.e. another extension after this one?) */
3528 proto_tree_add_item_ret_boolean(extension_tree, hf_oran_ef, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &extension_flag);
3529
3530 /* extType */
3531 proto_item *exttype_ti;
3532 exttype_ti = proto_tree_add_item(extension_tree, hf_oran_exttype, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3533 offset++;
3534 proto_item_append_text(sectionHeading, " (ext-%u)", exttype);
3535
3536 proto_item_append_text(extension_ti, " (ext-%u: %s)", exttype, val_to_str_ext_const(exttype, &exttype_vals_ext, "Reserved"));
3537
3538 /* Don't tap if out of range. */
3539 if (exttype
17.1
'exttype' is > 0
> 0 && exttype
17.2
'exttype' is <= HIGHEST_EXTTYPE
<= HIGHEST_EXTTYPE35) {
18
Taking true branch
3540 tap_info->extensions[exttype] = true1;
3541 }
3542
3543 /* Is this SE allowed for this section type? */
3544 if (!se_allowed_in_st(exttype, sectionType)) {
19
Assuming the condition is false
3545 expert_add_info_format(pinfo, extension_tree, &ei_oran_se_on_unsupported_st,
3546 "SE %u (%s) should not appear in ST %u (%s)!",
3547 exttype, val_to_str_ext_const(exttype, &exttype_vals_ext, "Reserved"),
3548 sectionType, rval_to_str_const(sectionType, section_types, "Unknown"));
3549 }
3550
3551
3552 /* extLen (number of 32-bit words) */
3553 uint32_t extlen_len = ((exttype==11)||(exttype==19)||(exttype==20)) ? 2 : 1; /* Extensions 11/19/20 are special */
20
Assuming 'exttype' is not equal to 11
21
Assuming 'exttype' is not equal to 19
22
Assuming 'exttype' is not equal to 20
23
'?' condition is false
3554 uint32_t extlen;
3555 proto_item *extlen_ti = proto_tree_add_item_ret_uint(extension_tree, hf_oran_extlen, tvb,
3556 offset, extlen_len, ENC_BIG_ENDIAN0x00000000, &extlen);
3557 proto_item_append_text(extlen_ti, " (%u bytes)", extlen*4);
3558 offset += extlen_len;
3559 if (extlen == 0) {
24
Assuming 'extlen' is not equal to 0
25
Taking false branch
3560 expert_add_info(pinfo, extlen_ti, &ei_oran_extlen_zero);
3561 /* Break out to avoid infinitely looping! */
3562 break;
3563 }
3564
3565 bool_Bool ext_unhandled = false0;
3566
3567 switch (exttype) {
26
Control jumps to 'case 5:' at line 3831
3568
3569 case 1: /* SE 1: Beamforming Weights */
3570 {
3571 uint32_t bfwcomphdr_iq_width, bfwcomphdr_comp_meth;
3572 proto_item *comp_meth_ti = NULL((void*)0);
3573
3574 /* Hidden filter for bf */
3575 bf_ti = proto_tree_add_item(tree, hf_oran_bf, tvb, 0, 0, ENC_NA0x00000000);
3576 PROTO_ITEM_SET_HIDDEN(bf_ti)proto_item_set_hidden((bf_ti));
3577
3578 /* bfwCompHdr (2 subheaders - bfwIqWidth and bfwCompMeth) */
3579 offset = dissect_bfwCompHdr(tvb, extension_tree, offset,
3580 &bfwcomphdr_iq_width, &bfwcomphdr_comp_meth, &comp_meth_ti);
3581
3582 /* bfwCompParam */
3583 uint32_t exponent = 0;
3584 bool_Bool compression_method_supported = false0;
3585 unsigned num_trx = 0;
3586 uint16_t *trx; /* ptr to array */
3587 offset = dissect_bfwCompParam(tvb, extension_tree, pinfo, offset, comp_meth_ti,
3588 &bfwcomphdr_comp_meth, &exponent, &compression_method_supported,
3589 &num_trx, &trx);
3590
3591 /* Can't show details of unsupported compression method */
3592 if (!compression_method_supported) {
3593 break;
3594 }
3595
3596 /* We know:
3597 - iq_width (above)
3598 - numBfWeights (taken from preference)
3599 - remaining bytes in extension
3600 We can therefore derive TRX (number of antennas).
3601 */
3602
3603 bool_Bool using_array = false0;
3604
3605 /* I & Q samples
3606 May know how many entries from activeBeamspaceCoefficientMask. */
3607 if (num_trx == 0) {
3608 /* Don't know how many there will be, so just fill available bytes... */
3609 unsigned extension_end_offset = extension_start_offset + (extlen*4);
3610 unsigned weights_bytes = (offset < extension_end_offset) ? extension_end_offset - offset : 0;
3611 unsigned num_weights_pairs = (weights_bytes*8) / (bfwcomphdr_iq_width*2);
3612 num_trx = num_weights_pairs;
3613 }
3614 else {
3615 using_array = true1;
3616 }
3617
3618 bool_Bool non_zero_weights_seen = false0;
3619 int bit_offset = offset*8;
3620 int offset_before_weights = offset;
3621
3622 for (unsigned n=0; n < num_trx; n++) {
3623 /* Create antenna subtree */
3624 int bfw_offset = bit_offset / 8;
3625
3626 uint16_t trx_index = (using_array) ? trx[n] : n+1;
3627
3628 proto_item *bfw_ti = proto_tree_add_string_format(extension_tree, hf_oran_bfw,
3629 tvb, bfw_offset, 0, "", "TRX %3u: (", trx_index);
3630 proto_tree *bfw_tree = proto_item_add_subtree(bfw_ti, ett_oran_bfw);
3631
3632 /* I value */
3633 /* Get bits, and convert to float. */
3634 uint32_t bits = tvb_get_bits32(tvb, bit_offset, bfwcomphdr_iq_width, ENC_BIG_ENDIAN0x00000000);
3635 if (bits) {
3636 non_zero_weights_seen = true1;
3637 }
3638 float value = decompress_value(bits, bfwcomphdr_comp_meth, bfwcomphdr_iq_width, exponent,
3639 NULL((void*)0) /* no ModCompr */, 0 /* RE */);
3640 /* Add to tree. */
3641 proto_tree_add_float(bfw_tree, hf_oran_bfw_i, tvb, bit_offset/8,
3642 (bfwcomphdr_iq_width+7)/8, value);
3643 bit_offset += bfwcomphdr_iq_width;
3644 proto_item_append_text(bfw_ti, "I=%f ", value);
3645
3646 /* Leave a gap between I and Q values */
3647 proto_item_append_text(bfw_ti, " ");
3648
3649 /* Q value */
3650 /* Get bits, and convert to float. */
3651 bits = tvb_get_bits32(tvb, bit_offset, bfwcomphdr_iq_width, ENC_BIG_ENDIAN0x00000000);
3652 if (bits) {
3653 non_zero_weights_seen = true1;
3654 }
3655
3656 value = decompress_value(bits, bfwcomphdr_comp_meth, bfwcomphdr_iq_width, exponent,
3657 NULL((void*)0) /* no ModCompr */, 0 /* RE */);
3658 /* Add to tree. */
3659 proto_tree_add_float(bfw_tree, hf_oran_bfw_q, tvb, bit_offset/8,
3660 (bfwcomphdr_iq_width+7)/8, value);
3661 bit_offset += bfwcomphdr_iq_width;
3662 proto_item_append_text(bfw_ti, "Q=%f", value);
3663
3664 proto_item_append_text(bfw_ti, ")");
3665 proto_item_set_len(bfw_ti, (bit_offset+7)/8 - bfw_offset);
3666 }
3667
3668 /* Need to round to next byte */
3669 offset = (bit_offset+7)/8;
3670
3671 if (!non_zero_weights_seen) {
3672 proto_tree_add_item(extension_tree, hf_oran_bundle_weights_all_zero, tvb,
3673 offset_before_weights, offset-offset_before_weights, ENC_NA0x00000000);
3674 }
3675 break;
3676 }
3677
3678 case 2: /* SE 2: Beamforming attributes */
3679 {
3680 /* Hidden filter for bf */
3681 bf_ti = proto_tree_add_item(tree, hf_oran_bf, tvb, 0, 0, ENC_NA0x00000000);
3682 PROTO_ITEM_SET_HIDDEN(bf_ti)proto_item_set_hidden((bf_ti));
3683
3684 /* bfaCompHdr (get widths of fields to follow) */
3685 uint32_t bfAzPtWidth, bfZePtWidth, bfAz3ddWidth, bfZe3ddWidth;
3686 /* subtree */
3687 proto_item *bfa_ti = proto_tree_add_string_format(extension_tree, hf_oran_bfaCompHdr,
3688 tvb, offset, 2, "", "bfaCompHdr");
3689 proto_tree *bfa_tree = proto_item_add_subtree(bfa_ti, ett_oran_bfacomphdr);
3690
3691 /* reserved (2 bits) */
3692 add_reserved_field(bfa_tree, hf_oran_reserved_2bits, tvb, offset, 1);
3693 /* bfAzPtWidth (3 bits) */
3694 proto_tree_add_item_ret_uint(bfa_tree, hf_oran_bfAzPtWidth, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &bfAzPtWidth);
3695 /* bfZePtWidth (3 bits) */
3696 proto_tree_add_item_ret_uint(bfa_tree, hf_oran_bfZePtWidth, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &bfZePtWidth);
3697 offset += 1;
3698
3699 /* reserved (2 bits) */
3700 add_reserved_field(bfa_tree, hf_oran_reserved_2bits, tvb, offset, 1);
3701 /* bfAz3ddWidth (3 bits) */
3702 proto_tree_add_item_ret_uint(bfa_tree, hf_oran_bfAz3ddWidth, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &bfAz3ddWidth);
3703 /* bfZe3ddWidth (3 bits) */
3704 proto_tree_add_item_ret_uint(bfa_tree, hf_oran_bfZe3ddWidth, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &bfZe3ddWidth);
3705 offset += 1;
3706
3707 unsigned bit_offset = offset*8;
3708
3709 /* bfAzPt */
3710 if (bfAzPtWidth > 0) {
3711 proto_tree_add_bits_item(extension_tree, hf_oran_bfAzPt, tvb, bit_offset, bfAzPtWidth+1, ENC_BIG_ENDIAN0x00000000);
3712 bit_offset += (bfAzPtWidth+1);
3713 }
3714 /* bfZePt */
3715 if (bfZePtWidth > 0) {
3716 proto_tree_add_bits_item(extension_tree, hf_oran_bfZePt, tvb, bit_offset, bfZePtWidth+1, ENC_BIG_ENDIAN0x00000000);
3717 bit_offset += (bfZePtWidth+1);
3718 }
3719 /* bfAz3dd */
3720 if (bfAz3ddWidth > 0) {
3721 proto_tree_add_bits_item(extension_tree, hf_oran_bfAz3dd, tvb, bit_offset, bfAz3ddWidth+1, ENC_BIG_ENDIAN0x00000000);
3722 bit_offset += (bfAz3ddWidth+1);
3723 }
3724 /* bfZe3dd */
3725 if (bfZe3ddWidth > 0) {
3726 proto_tree_add_bits_item(extension_tree, hf_oran_bfZe3dd, tvb, bit_offset, bfZe3ddWidth+1, ENC_BIG_ENDIAN0x00000000);
3727 bit_offset += (bfZe3ddWidth+1);
3728 }
3729
3730 /* Pad to next byte (unless last 2 fields already fit in this one) */
3731 if ((bit_offset % 8) > 2) {
3732 offset = (bit_offset+7) / 8;
3733 }
3734 else {
3735 offset = bit_offset / 8;
3736 }
3737
3738 /* bfAzSl (3 bits) */
3739 proto_tree_add_item(extension_tree, hf_oran_bfAzSl, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3740 /* bfZeSl (3 bits) */
3741 proto_tree_add_item(extension_tree, hf_oran_bfZeSl, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3742 offset += 1;
3743 break;
3744 }
3745
3746 case 3: /* SE 3: DL precoding parameters */
3747 {
3748 /* codebookindex (8 bits) */
3749 /* "This parameter is not used and shall be set to zero." */
3750 proto_tree_add_item(extension_tree, hf_oran_codebook_index, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3751 offset += 1;
3752 /* layerid */
3753 uint32_t layerid;
3754 proto_tree_add_item_ret_uint(extension_tree, hf_oran_layerid, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &layerid);
3755 /* numLayers */
3756 proto_tree_add_item(extension_tree, hf_oran_numlayers, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3757 offset += 1;
3758
3759 /* Stop here for non-first data layer */
3760 if (layerid != 0 && layerid != 0xf) {
3761 break;
3762 }
3763
3764 /* First data layer case */
3765 /* txScheme */
3766 proto_tree_add_item(extension_tree, hf_oran_txscheme, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3767 /* crsReMask */
3768 proto_tree_add_item(extension_tree, hf_oran_crs_remask, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
3769 offset += 2;
3770
3771 /* crsShift (1 bit) */
3772 proto_tree_add_item(extension_tree, hf_oran_crs_shift, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3773 /* reserved (3 bits) */
3774 add_reserved_field(extension_tree, hf_oran_reserved_bits123, tvb, offset, 1);
3775 /* crsSymNum (4 bits) */
3776 proto_tree_add_item(extension_tree, hf_oran_crs_symnum, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3777 offset += 1;
3778 /* reserved (8 bits) */
3779 add_reserved_field(extension_tree, hf_oran_reserved_8bits, tvb, offset, 1);
3780 offset += 1;
3781
3782 /* reserved (1 bit) */
3783 add_reserved_field(extension_tree, hf_oran_reserved_1bit, tvb, offset, 1);
3784 /* beamIdAP1 (15 bits) */
3785 proto_tree_add_item(extension_tree, hf_oran_beamid_ap1, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
3786 offset += 2;
3787 /* reserved (1 bit) */
3788 add_reserved_field(extension_tree, hf_oran_reserved_1bit, tvb, offset, 1);
3789 /* beamIdAP2 (15 bits) */
3790 proto_tree_add_item(extension_tree, hf_oran_beamid_ap2, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
3791 offset += 2;
3792 /* reserved (1 bit) */
3793 add_reserved_field(extension_tree, hf_oran_reserved_1bit, tvb, offset, 1);
3794 /* beamIdAP3 (15 bits) */
3795 proto_tree_add_item(extension_tree, hf_oran_beamid_ap3, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
3796 offset += 2;
3797 break;
3798 }
3799
3800 case 4: /* SE 4: Modulation compression params (5.4.7.4) (single sets) */
3801 {
3802 /* csf */
3803 bool_Bool csf;
3804 dissect_csf(extension_tree, tvb, offset*8, ci_iq_width, &csf);
3805
3806 /* modCompScaler (16 bits) */
3807 uint32_t modCompScaler;
3808 proto_item *ti = proto_tree_add_item_ret_uint(extension_tree, hf_oran_modcompscaler,
3809 tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &modCompScaler);
3810 offset += 2;
3811
3812 /* Work out and show floating point value too. exponent and mantissa are both unsigned */
3813 uint16_t exponent = (modCompScaler >> 11) & 0x000f; /* m.s. 4 bits */
3814 uint16_t mantissa = modCompScaler & 0x07ff; /* l.s. 11 bits */
3815 float value = ((float)mantissa/(1<<11)) * ((float)1.0 / (1 << exponent));
3816 proto_item_append_text(ti, " (%f)", value);
3817
3818 section_mod_compr_config_t* sect_config = get_mod_compr_section_to_write(pinfo, state, sectionId);
3819
3820 /* Store these params in this flow's state */
3821 if (sect_config && sect_config->num_configs < MAX_MOD_COMPR_CONFIGS12) {
3822 unsigned i = sect_config->num_configs;
3823 sect_config->configs[i].mod_compr_re_mask = 0xfff; /* Covers all REs */
3824 sect_config->configs[i].mod_compr_csf = csf;
3825 sect_config->configs[i].mod_compr_scaler = value;
3826 sect_config->num_configs++;
3827 }
3828 break;
3829 }
3830
3831 case 5: /* SE 5: Modulation Compression Additional Parameters (7.7.5) (multiple sets) */
3832 {
3833 /* Applies only to section types 1,3 and 5 */
3834 /* N.B. there may be multiple instances of this SE in the same frame */
3835
3836 /* There may be one or 2 entries, depending upon extLen */
3837 int sets = 1, reserved_bits = 0;
3838 switch (extlen) {
27
Control jumps to the 'default' case at line 3860
3839 case 2:
3840 sets = 1;
3841 reserved_bits = 20;
3842 break;
3843 case 3:
3844 sets = 2;
3845 reserved_bits = 24;
3846 break;
3847 case 4:
3848 /* sets can be 3 or 4, depending upon whether last 28 bits are 0.. */
3849 if ((tvb_get_ntohl(tvb, offset+10) & 0x0fffffff) == 0) {
3850 sets = 3;
3851 reserved_bits = 28;
3852 }
3853 else {
3854 sets = 4;
3855 reserved_bits = 0;
3856 }
3857 break;
3858
3859 /* TODO: it seems that it could be longer.. */
3860 default:
3861 /* Malformed error!!! */
3862 expert_add_info_format(pinfo, extlen_ti, &ei_oran_extlen_wrong,
3863 "For SE5 (modCompr additional params), extLen must be 2, 3 or 4, but %u was dissected",
3864 extlen);
3865 break;
28
Execution continues on line 3868
3866 }
3867
3868 uint64_t accumulated_mc_scale_re_mask = 0;
3869 unsigned bit_offset = offset*8;
3870 /* Dissect each set */
3871 for (int s=0; s < sets; s++) {
29
Loop condition is true. Entering loop body
3872 /* Subtree for each set */
3873 unsigned set_start_offset = bit_offset/8;
3874 proto_item *set_ti = proto_tree_add_string(extension_tree, hf_oran_modcomp_param_set,
3875 tvb, set_start_offset, 0, "");
3876 proto_tree *set_tree = proto_item_add_subtree(set_ti, ett_oran_modcomp_param_set);
3877
3878 uint64_t mcScaleReMask, mcScaleOffset;
3879 bool_Bool csf;
3880
3881 /* mcScaleReMask (12 bits). Defines which REs the following csf and mcScaleOffset apply to */
3882 static int * const remask_flags[] = {
3883 &hf_oran_mc_scale_re_mask_re1,
3884 &hf_oran_mc_scale_re_mask_re2,
3885 &hf_oran_mc_scale_re_mask_re3,
3886 &hf_oran_mc_scale_re_mask_re4,
3887 &hf_oran_mc_scale_re_mask_re5,
3888 &hf_oran_mc_scale_re_mask_re6,
3889 &hf_oran_mc_scale_re_mask_re7,
3890 &hf_oran_mc_scale_re_mask_re8,
3891 &hf_oran_mc_scale_re_mask_re9,
3892 &hf_oran_mc_scale_re_mask_re10,
3893 &hf_oran_mc_scale_re_mask_re11,
3894 &hf_oran_mc_scale_re_mask_re12,
3895 NULL((void*)0)
3896 };
3897 /* Same as above, but offset by 4 bits */
3898 static int * const remask_flags_even[] = {
3899 &hf_oran_mc_scale_re_mask_re1_even,
3900 &hf_oran_mc_scale_re_mask_re2_even,
3901 &hf_oran_mc_scale_re_mask_re3_even,
3902 &hf_oran_mc_scale_re_mask_re4_even,
3903 &hf_oran_mc_scale_re_mask_re5_even,
3904 &hf_oran_mc_scale_re_mask_re6_even,
3905 &hf_oran_mc_scale_re_mask_re7_even,
3906 &hf_oran_mc_scale_re_mask_re8_even,
3907 &hf_oran_mc_scale_re_mask_re9_even,
3908 &hf_oran_mc_scale_re_mask_re10_even,
3909 &hf_oran_mc_scale_re_mask_re11_even,
3910 &hf_oran_mc_scale_re_mask_re12_even,
3911 NULL((void*)0)
3912 };
3913
3914 /* RE Mask for set (12 bits) */
3915 proto_item *set_re_mask_ti;
3916 set_re_mask_ti = proto_tree_add_bitmask_ret_uint64(set_tree, tvb, bit_offset / 8,
3917 (s % 2) ? hf_oran_mc_scale_re_mask_even : hf_oran_mc_scale_re_mask,
30
'?' condition is false
3918 ett_oran_mc_scale_remask,
3919 (s % 2) ? remask_flags_even : remask_flags, ENC_BIG_ENDIAN0x00000000, &mcScaleReMask);
31
'?' condition is false
3920 bit_offset += 12;
3921
3922 if (mcScaleReMask == 0) {
32
Assuming 'mcScaleReMask' is not equal to 0
33
Taking false branch
3923 /* Shouldn't expect an entry with an entry that doesn't change anything. */
3924 /* Exception (from Table 7.7.5.1-3) is when extLen=4 and this is the 4th set */
3925 if (!(extlen == 4 && s == 3)) {
3926 expert_add_info(pinfo, set_re_mask_ti, &ei_oran_se5_re_zero_re_mask);
3927 }
3928 }
3929
3930 if ((mcScaleReMask & re_mask) != mcScaleReMask) {
34
The right operand of '&' is a garbage value
3931 /* Bits set that were not in reMask! */
3932 expert_add_info_format(pinfo, set_re_mask_ti, &ei_oran_se5_re_mask_bit_not_in_re_mask,
3933 "SE 5 set references REs (0x%03x) not set in the section reMask (0x%03x)",
3934 (uint16_t)mcScaleReMask, (uint16_t)re_mask);
3935 }
3936
3937 if (accumulated_mc_scale_re_mask & mcScaleReMask) {
3938 /* Bits have already been covered! */
3939 expert_add_info_format(pinfo, set_re_mask_ti, &ei_oran_se5_re_mask_bit_repeated,
3940 "SE 5 set references REs (0x%03x) already covered by an earlier set",
3941 (uint16_t)mcScaleReMask);
3942 }
3943
3944 /* Add RE bits from this set to accumulated */
3945 accumulated_mc_scale_re_mask |= mcScaleReMask;
3946
3947 /* csf (1 bit) */
3948 bit_offset = dissect_csf(set_tree, tvb, bit_offset, ci_iq_width, &csf);
3949 /* mcScaleOffset (15 bits) */
3950 proto_item *ti = proto_tree_add_bits_ret_val(set_tree, hf_oran_mc_scale_offset, tvb, bit_offset, 15, &mcScaleOffset, ENC_BIG_ENDIAN0x00000000);
3951 uint16_t exponent = (mcScaleOffset >> 11) & 0x000f; /* m.s. 4 bits */
3952 uint16_t mantissa = mcScaleOffset & 0x07ff; /* l.s. 11 bits */
3953 float mcScaleOffset_value = ((float)mantissa/(1<<11)) * ((float)1.0 / (1 << exponent));
3954 proto_item_append_text(ti, " (%f)", mcScaleOffset_value);
3955 bit_offset += 15;
3956
3957 section_mod_compr_config_t* sect_config = get_mod_compr_section_to_write(pinfo, state, sectionId);
3958
3959 /* Record this config */
3960 if (sect_config && sect_config->num_configs < MAX_MOD_COMPR_CONFIGS12) {
3961 unsigned i = sect_config->num_configs;
3962 sect_config->configs[i].mod_compr_re_mask = (uint16_t)mcScaleReMask;
3963 sect_config->configs[i].mod_compr_csf = csf;
3964 sect_config->configs[i].mod_compr_scaler = mcScaleOffset_value;
3965 sect_config->num_configs++;
3966 }
3967
3968 /* Summary */
3969 proto_item_set_len(set_ti, (bit_offset+7)/8 - set_start_offset);
3970 proto_item_append_text(set_ti, " (mcScaleReMask=0x%03x csf=%5s mcScaleOffset=%f)",
3971 (unsigned)mcScaleReMask, tfs_get_true_false(csf)tfs_get_string(csf, ((void*)0)), mcScaleOffset_value);
3972 }
3973
3974 proto_item_append_text(extension_ti, " (%u sets)", sets);
3975
3976 if (accumulated_mc_scale_re_mask != re_mask) {
3977 /* Complain that not all bits were set */
3978 expert_add_info_format(pinfo, re_mask_ti, &ei_oran_se5_re_mask_bits_not_covered,
3979 "Section reMask (0x%03x) has bits not covered by any sets (covers 0x%03x)",
3980 (uint16_t)re_mask, (uint16_t)accumulated_mc_scale_re_mask);
3981 }
3982
3983 /* Reserved (variable-length) */
3984 if (reserved_bits) {
3985 proto_tree_add_bits_item(extension_tree, hf_oran_reserved, tvb, bit_offset, reserved_bits, ENC_BIG_ENDIAN0x00000000);
3986 bit_offset += reserved_bits;
3987 }
3988
3989 offset = bit_offset/8;
3990 break;
3991 }
3992
3993 case 6: /* SE 6: Non-contiguous PRB allocation in time and frequency domain */
3994 {
3995 /* numSymbol not used in this case */
3996 if (numsymbol_ti && !numsymbol_ignored) {
3997 proto_item_append_text(numsymbol_ti, " (ignored)");
3998 numsymbol_ignored = true1;
3999 }
4000
4001 /* Will update ext6 recorded info */
4002 ext11_settings.ext6_set = true1;
4003
4004 /* TODO: rb bit must be zero (unless "se6-rb-bit-supported" is set) */
4005
4006 /* repetition (only valid to be set if coupling via frequency and time with priorities (optimized) (7.8.1.5) */
4007 proto_tree_add_bits_item(extension_tree, hf_oran_se6_repetition, tvb, offset*8, 1, ENC_BIG_ENDIAN0x00000000);
4008 /* rbgSize (PRBs per bit set in rbgMask) */
4009 uint32_t rbgSize;
4010 proto_item *rbg_size_ti;
4011 rbg_size_ti = proto_tree_add_item_ret_uint(extension_tree, hf_oran_rbgSize, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &rbgSize);
4012 if (rbgSize == 0) {
4013 /* N.B. this is only true if "se6-rb-bit-supported" is set... */
4014 expert_add_info(pinfo, rbg_size_ti, &ei_oran_rbg_size_reserved);
4015 }
4016 /* rbgMask (28 bits) */
4017 uint32_t rbgMask;
4018 proto_item *rbgmask_ti; // = proto_tree_add_item_ret_uint(extension_tree, hf_oran_rbgMask, tvb, offset, 4, ENC_BIG_ENDIAN, &rbgMask);
4019 offset = dissect_rbg_mask(extension_tree, tvb, offset, &rbgMask, &rbgmask_ti);
4020 if (rbgSize == 0) {
4021 proto_item_append_text(rbgmask_ti, " (value ignored since rbgSize is 0)");
4022 }
4023
4024 /* TODO: if receiver detects non-zero bits outside the valid range, those shall be ignored. */
4025 /* priority (only valid to be set if coupling via frequency and time with priorities (7.8.1.3) */
4026 proto_tree_add_item(extension_tree, hf_oran_noncontig_priority, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4027 /* symbolMask */
4028 offset = dissect_symbolmask(tvb, extension_tree, offset, NULL((void*)0), NULL((void*)0));
4029
4030 /* Look up rbg_size enum -> value */
4031 switch (rbgSize) {
4032 case 0:
4033 /* N.B. reserved, but covered above with expert info (would remain 0) */
4034 /* Might also indicate that rb bit is valid */
4035 break;
4036 case 1:
4037 ext11_settings.ext6_rbg_size = 1; break;
4038 case 2:
4039 ext11_settings.ext6_rbg_size = 2; break;
4040 case 3:
4041 ext11_settings.ext6_rbg_size = 3; break;
4042 case 4:
4043 ext11_settings.ext6_rbg_size = 4; break;
4044 case 5:
4045 ext11_settings.ext6_rbg_size = 6; break;
4046 case 6:
4047 ext11_settings.ext6_rbg_size = 8; break;
4048 case 7:
4049 ext11_settings.ext6_rbg_size = 16; break;
4050 /* N.B., encoded in 3 bits, so no other values are possible */
4051 }
4052
4053 /* Set to looked-up value */
4054 rbgSize = ext11_settings.ext6_rbg_size;
4055
4056 uint32_t lastRbgid = 0;
4057 if (rbgSize != 0) {
4058 /* The O-DU shall not use combinations of startPrbc, numPrbc and rbgSize leading to a value of lastRbgid larger than 27 */
4059 /* i.e., leftmost bit used should not need to go off left end of rbgMask! */
4060 lastRbgid = (uint32_t)ceil((numPrbc + (startPrbc % rbgSize)) / (float)rbgSize) - 1;
4061 if (lastRbgid > 27) {
4062 expert_add_info_format(pinfo, rbg_size_ti, &ei_oran_lastRbdid_out_of_range,
4063 "SE6: rbgSize (%u) not compatible with startPrbc(%u) and numPrbc(%u)",
4064 rbgSize, startPrbc, numPrbc);
4065 break;
4066 }
4067 }
4068
4069 /* Record (and count) which bits are set in rbgMask */
4070 bool_Bool first_seen = false0;
4071 unsigned first_seen_pos=0, last_seen_pos=0;
4072 for (unsigned n=0; n < 28 && ext11_settings.ext6_num_bits_set < 28; n++) {
4073 if ((rbgMask >> n) & 0x01) {
4074 ext11_settings.ext6_bits_set[ext11_settings.ext6_num_bits_set++] = n;
4075 if (!first_seen) {
4076 first_seen = true1;
4077 first_seen_pos = n;
4078 }
4079 last_seen_pos = n;
4080 }
4081 }
4082
4083 /* Show how many bits were set in rbgMask */
4084 proto_item_append_text(rbgmask_ti, " (%u bits set)", ext11_settings.ext6_num_bits_set);
4085 /* Also, that is the range of bits */
4086 if (first_seen) {
4087 proto_item_append_text(rbgmask_ti, " (%u bits spread)", last_seen_pos-first_seen_pos+1);
4088
4089 /* Complain if last set bit is beyond lastRbgid */
4090 if (last_seen_pos > lastRbgid) {
4091 expert_add_info_format(pinfo, rbgmask_ti, &ei_oran_rbgMask_beyond_last_rbdid,
4092 "SE6: rbgMask (0x%07x) has bit %u set, but lastRbgId is %u",
4093 rbgMask, last_seen_pos, lastRbgid);
4094 }
4095 }
4096
4097 /* Also update prbs_for_st10_type5[] */
4098 if (sectionType == 10 && rbgSize != 0) {
4099 /* Unset all entries */
4100 memset(&prbs_for_st10_type5, 0, sizeof(prbs_for_st10_type5));
4101
4102 /* Work out which PRB first bit corresponds to */
4103 unsigned firstPrbStart = (startPrbc/rbgSize) * rbgSize;
4104
4105 /* Add PRBs corresponding to each bit set */
4106 for (unsigned n=0; n < 28 ; n++) {
4107 if ((rbgMask >> n) & 0x01) {
4108 /* Lazy way to clip any values that lie outside of range for section */
4109 for (unsigned p=0; p < rbgSize; p++) {
4110 unsigned start = firstPrbStart + (n*rbgSize);
4111 if ((start+p < MAX_PRBS273) && (start+p >= startPrbc) && (start+p <= startPrbc+numPrbc-1)) {
4112 prbs_for_st10_type5[start+p] = true1;
4113 }
4114 }
4115 }
4116 }
4117 }
4118
4119 break;
4120 }
4121
4122 case 7: /* SE 7: eAxC mask */
4123 /* Allow ST0 to address multiple eAxC_ID values for transmission blanking */
4124 proto_tree_add_item(extension_tree, hf_oran_eAxC_mask, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
4125 offset += 2;
4126 break;
4127
4128 case 8: /* SE 8: Regularization factor */
4129 {
4130 for (unsigned ueid_index=0; ueid_index < number_of_ueids; ueid_index++) {
4131 /* regularizationFactor (2 bytes) */
4132 proto_item *rf_ti = proto_tree_add_item(extension_tree, hf_oran_regularizationFactor, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
4133 proto_item_append_text(rf_ti, " (UeId=%u)", ueids[ueid_index]);
4134 offset += 2;
4135 }
4136 break;
4137 }
4138 case 9: /* SE 9: Dynamic Spectrum Sharing parameters */
4139 /* Technology (1 byte) */
4140 proto_tree_add_item(extension_tree, hf_oran_technology, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4141 offset += 1;
4142 /* Reserved (1 byte) */
4143 add_reserved_field(extension_tree, hf_oran_reserved_8bits, tvb, offset, 1);
4144 offset += 1;
4145 break;
4146
4147 case 10: /* SE 10: Group configuration of multiple ports */
4148 {
4149 seen_se10 = true1;
4150
4151 /* beamGroupType */
4152 uint32_t beam_group_type = 0;
4153 proto_item *bgt_ti;
4154 bgt_ti = proto_tree_add_item_ret_uint(extension_tree, hf_oran_beamGroupType,
4155 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &beam_group_type);
4156 proto_item_append_text(extension_ti, " (%s)", val_to_str_const(beam_group_type, beam_group_type_vals, "Unknown"));
4157
4158 /* numPortc */
4159 proto_tree_add_item_ret_uint(extension_tree, hf_oran_numPortc,
4160 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &numPortc);
4161 offset++;
4162
4163 /* Will append all beamId values to extension_ti, regardless of beamGroupType */
4164 unsigned n;
4165
4166 switch (beam_group_type) {
4167 case 0x0: /* common beam */
4168 case 0x1: /* beam matrix indication */
4169 /* Reserved byte */
4170 add_reserved_field(extension_tree, hf_oran_reserved_8bits, tvb, offset, 1);
4171 offset++;
4172
4173 /* Explain how entries are allocated */
4174 if (beam_group_type == 0x0) {
4175 proto_item_append_text(extension_ti, " (all %u ueid/Beam entries are %u)", numPortc, ueId);
4176 }
4177 else {
4178 /* 'numPortc' consecutive BeamIds from section header */
4179 proto_item_append_text(extension_ti, " (ueId/beam entries are %u -> %u)", ueId, ueId+numPortc);
4180 }
4181
4182 if (sectionType == 5) {
4183 /* These types are not allowed */
4184 expert_add_info_format(pinfo, bgt_ti, &ei_oran_se10_not_allowed,
4185 "SE10: beamGroupType %u is not allowed for section type 5", beam_group_type);
4186 }
4187 break;
4188
4189 case 0x2: /* beam vector listing */
4190 {
4191 proto_item_append_text(extension_ti, " [ ");
4192
4193 /* Beam listing vector case */
4194 /* Work out how many port beam entries there is room for */
4195 /* Using numPortC as visible in issue 18116 */
4196 for (n=0; n < numPortc; n++) {
4197 /* Port subtree */
4198 proto_item *port_ti = proto_tree_add_item(extension_tree, hf_oran_se10_port,
4199 tvb, offset, 2, ENC_NA0x00000000);
4200 proto_tree *port_tree = proto_item_add_subtree(port_ti, ett_oran_se10_port);
4201
4202 /* 1 reserved bit */
4203 add_reserved_field(port_tree, hf_oran_reserved_1bit, tvb, offset, 1);
4204
4205 /* port beam ID (or UEID) (15 bits) */
4206 uint32_t id;
4207 proto_item *beamid_or_ueid_ti = proto_tree_add_item_ret_uint(port_tree, hf_oran_beamId,
4208 tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &id);
4209 proto_item_append_text(beamid_or_ueid_ti, " (or UEId) port #%u", n);
4210 offset += 2;
4211
4212 if (id != 0x7fff) {
4213 if (number_of_ueids < MAX_UEIDS16) {
4214 ueids[number_of_ueids++] = id;
4215 }
4216 }
4217
4218 proto_item_append_text(extension_ti, "%u ", id);
4219 proto_item_append_text(port_ti, " (beam/ueid %u)", id);
4220 }
4221
4222 proto_item_append_text(extension_ti, "]");
4223 break;
4224 }
4225 case 0x3: /* beamId/ueId listing with associated port-list index */
4226 {
4227 proto_item_append_text(extension_ti, " [ ");
4228
4229 if (numPortc > 0) {
4230 /* first portListIndex is outside loop */
4231 uint32_t port_list_index;
4232 proto_item *pli_ti = proto_tree_add_item_ret_uint(extension_tree, hf_oran_port_list_index, tvb,
4233 offset, 1, ENC_BIG_ENDIAN0x00000000, &port_list_index);
4234 if (port_list_index == 0) {
4235 /* Value 0 is reserved */
4236 expert_add_info(pinfo, pli_ti, &ei_oran_port_list_index_zero);
4237 }
4238 offset += 1;
4239
4240 for (n=0; n < numPortc-1; n++) {
4241 /* Port subtree */
4242 proto_item *port_ti = proto_tree_add_item(extension_tree, hf_oran_se10_port,
4243 tvb, offset, 3, ENC_NA0x00000000);
4244 proto_tree *port_tree = proto_item_add_subtree(port_ti, ett_oran_se10_port);
4245
4246 /* 1 reserved bit */
4247 add_reserved_field(port_tree, hf_oran_reserved_1bit, tvb, offset, 1);
4248
4249 /* port beam ID (or UEID) */
4250 uint32_t id;
4251 proto_item *beamid_or_ueid_ti = proto_tree_add_item_ret_uint(port_tree, hf_oran_beamId,
4252 tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &id);
4253 proto_item_append_text(beamid_or_ueid_ti, " port #%u beam ID (or UEId) %u", n, id);
4254 offset += 2;
4255
4256 if (id != 0x7fff) {
4257 if (number_of_ueids < MAX_UEIDS16) {
4258 ueids[number_of_ueids++] = id;
4259 }
4260 }
4261
4262 /* subsequent portListIndex */
4263 pli_ti = proto_tree_add_item_ret_uint(port_tree, hf_oran_port_list_index, tvb,
4264 offset, 1, ENC_BIG_ENDIAN0x00000000, &port_list_index);
4265 if (port_list_index == 0) {
4266 /* Value 0 is reserved */
4267 expert_add_info(pinfo, pli_ti, &ei_oran_port_list_index_zero);
4268 }
4269 offset += 1;
4270
4271 proto_item_append_text(extension_ti, "%u:%u ", port_list_index, id);
4272 proto_item_append_text(port_ti, " (beam/ueid %u, portListIndex %u)", id, port_list_index);
4273 }
4274 }
4275
4276 proto_item_append_text(extension_ti, "]");
4277 break;
4278 }
4279
4280
4281 default:
4282 /* Warning for unsupported/reserved value */
4283 expert_add_info(NULL((void*)0), bgt_ti, &ei_oran_se10_unknown_beamgrouptype);
4284 break;
4285 }
4286 break;
4287 }
4288
4289 case 11: /* SE 11: Flexible Weights Extension Type */
4290 {
4291 /* Hidden filter for bf */
4292 bf_ti = proto_tree_add_item(tree, hf_oran_bf, tvb, 0, 0, ENC_NA0x00000000);
4293 PROTO_ITEM_SET_HIDDEN(bf_ti)proto_item_set_hidden((bf_ti));
4294
4295 /* beamId in section header should be ignored. Guard against appending multiple times.. */
4296 if (section_beamId_ti && !section_beamId_ignored) {
4297 proto_item_append_text(section_beamId_ti, " (ignored)");
4298 section_beamId_ignored = true1;
4299 }
4300
4301 bool_Bool disableBFWs;
4302 uint32_t numBundPrb;
4303 bool_Bool rad;
4304
4305 /* disableBFWs */
4306 proto_tree_add_item_ret_boolean(extension_tree, hf_oran_disable_bfws,
4307 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &disableBFWs);
4308 if (disableBFWs) {
4309 proto_item_append_text(extension_ti, " (disableBFWs)");
4310 }
4311
4312 /* RAD */
4313 proto_tree_add_item_ret_boolean(extension_tree, hf_oran_rad,
4314 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &rad);
4315 /* bundleOffset (6 bits) */
4316 proto_tree_add_item(extension_tree, hf_oran_bundle_offset, tvb,
4317 offset, 1, ENC_BIG_ENDIAN0x00000000);
4318 offset++;
4319
4320 /* numBundPrb (number of prbs in each bundle) */
4321 proto_item *num_bund_prb_ti = proto_tree_add_item_ret_uint(extension_tree, hf_oran_num_bund_prbs,
4322 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &numBundPrb);
4323 offset++;
4324 /* value zero is reserved.. */
4325 if (numBundPrb == 0) {
4326 expert_add_info(pinfo, num_bund_prb_ti, &ei_oran_reserved_numBundPrb);
4327 }
4328
4329 uint32_t num_bundles;
4330 bool_Bool orphaned_prbs = false0;
4331
4332 /* N.B. glibly assuming that Mu=1 */
4333 uint32_t symbol_count = (frameId*20 + slotId) * 14 + startSymbolId;
4334
4335 if (!disableBFWs) {
4336 /********************************************/
4337 /* Table 7.7.11.1-1 */
4338 /* Weights are present */
4339 /********************************************/
4340
4341 uint32_t bfwcomphdr_iq_width, bfwcomphdr_comp_meth;
4342 proto_item *comp_meth_ti = NULL((void*)0);
4343
4344 /* bfwCompHdr (2 subheaders - bfwIqWidth and bfwCompMeth)*/
4345 offset = dissect_bfwCompHdr(tvb, extension_tree, offset,
4346 &bfwcomphdr_iq_width, &bfwcomphdr_comp_meth, &comp_meth_ti);
4347
4348 /* Work out number of bundles, but take care not to divide by zero. */
4349 if (numBundPrb == 0) {
4350 break;
4351 }
4352
4353 /* Work out bundles! */
4354 /* TODO: assuming that these modifying SEs appear before SE 11, but not sure that this is guaranteed?! */
4355 ext11_work_out_bundles(startPrbc, numPrbc, numBundPrb, &ext11_settings);
4356 num_bundles = ext11_settings.num_bundles;
4357
4358 /* Add (complete) bundles */
4359 for (unsigned b=0; b < num_bundles; b++) {
4360 offset = dissect_bfw_bundle(tvb, extension_tree, pinfo, offset,
4361 comp_meth_ti, bfwcomphdr_comp_meth,
4362 NULL((void*)0) /* no ModCompr */,
4363 (ext11_settings.ext21_set) ?
4364 numPrbc :
4365 pref_num_bf_antennas,
4366 bfwcomphdr_iq_width,
4367 b, /* bundle number */
4368 &ext11_settings.bundles[b],
4369 symbol_count,
4370 (link_planes_together && data_section) ? &data_section->details[index_to_use] : NULL((void*)0),
4371 tap_info);
4372 if (!offset) {
4373 break;
4374 }
4375 }
4376 if (num_bundles > 0) {
4377 /* Set flag from last bundle entry */
4378 orphaned_prbs = ext11_settings.bundles[num_bundles-1].is_orphan;
4379 }
4380 }
4381 else {
4382 /********************************************/
4383 /* Table 7.7.11.1-2 */
4384 /* No weights in this case */
4385 /********************************************/
4386
4387 /* Work out number of bundles, but take care not to divide by zero. */
4388 if (numBundPrb == 0) {
4389 break;
4390 }
4391
4392 ext11_work_out_bundles(startPrbc, numPrbc, numBundPrb, &ext11_settings);
4393 num_bundles = ext11_settings.num_bundles;
4394
4395 for (unsigned n=0; n < num_bundles; n++) {
4396 uint32_t first_prb = ext11_settings.bundles[n].start;
4397 uint32_t last_prb = ext11_settings.bundles[n].end;
4398
4399 /* Still create a bundle subtree */
4400 proto_item *bundle_ti = proto_tree_add_string_format(extension_tree, hf_oran_bfw_bundle,
4401 tvb, offset, 2, "",
4402 "Bundle: (PRBs %3u-%3u)",
4403 first_prb, last_prb);
4404 proto_tree *bundle_tree = proto_item_add_subtree(bundle_ti, ett_oran_bfw_bundle);
4405
4406 /* contInd */
4407 proto_tree_add_item(bundle_tree, hf_oran_cont_ind,
4408 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4409 /* beamId */
4410 /* N.B., only added to tap_info if not 0 or ignored (after SEs seen) */
4411 uint32_t beam_id;
4412 proto_item *beamid_ti = proto_tree_add_item_ret_uint(bundle_tree, hf_oran_beam_id,
4413 tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &beam_id);
4414 proto_item_append_text(bundle_ti, " (beamId:%u)", beam_id);
4415
4416
4417 if (!ext11_settings.bundles[n].is_orphan) {
4418 proto_item_append_text(beamid_ti, " (PRBs %3u-%3u) (Bundle %2u)",
4419 ext11_settings.bundles[n].start,
4420 ext11_settings.bundles[n].end,
4421 n);
4422 }
4423 else {
4424 orphaned_prbs = true1;
4425 proto_item_append_text(beamid_ti, " (PRBs %3u-%3u) (Orphaned PRBs)",
4426 ext11_settings.bundles[n].start,
4427 ext11_settings.bundles[n].end);
4428 proto_item_append_text(bundle_ti, " (Orphaned PRBs)");
4429 }
4430 offset += 2;
4431
4432 if (!PINFO_FD_VISITED(pinfo)((pinfo)->fd->visited)) {
4433 if (data_section) {
4434 /* Set beamId only for range of PRBs */
4435 for (unsigned prb = ext11_settings.bundles[n].start; prb <= ext11_settings.bundles[n].end; prb++) {
4436 if (prb < 273) {
4437 data_section->details[index_to_use].beamIds[prb] = beam_id;
4438 }
4439 }
4440 }
4441 }
4442
4443 /* Look for where BFWs were sent for this beamId */
4444 bfw_definition *definition;
4445
4446 wmem_tree_key_t key[3];
4447 key[0].length = 1;
4448 key[0].key = &pinfo->num;
4449 key[1].length = 1;
4450 key[1].key = &beam_id;
4451 key[2].length = 0;
4452 key[2].key = NULL((void*)0);
4453
4454 if (!PINFO_FD_VISITED(pinfo)((pinfo)->fd->visited)) {
4455 /* Look up current result */
4456 definition = wmem_tree_lookup32(dl_beam_ids_defined, beam_id);
4457 if (definition != NULL((void*)0)) {
4458 /* Add to results table for this frame */
4459 wmem_tree_insert32_array(dl_beam_ids_results, key, definition);
4460 }
4461 }
4462 else {
4463 /* Look up from result table */
4464 definition = wmem_tree_lookup32_array(dl_beam_ids_results, key);
4465 }
4466
4467 /* Show link back to frame where/when beamId was defined. Allow linking to self */
4468 if (definition && definition->frame_defined != 0) {
4469 proto_item *defined_ti = proto_tree_add_uint(bundle_tree, hf_oran_bfws_frame_defined, tvb, offset, 0, definition->frame_defined);
4470 proto_item_set_generated(defined_ti);
4471 proto_item *since_ti = proto_tree_add_uint(bundle_tree, hf_oran_bfws_symbols_since_defined, tvb, offset, 0,
4472 symbol_count - definition->symbol_when_defined);
4473 proto_item_set_generated(since_ti);
4474 }
4475 else {
4476 /* TODO: lookup needs to find beam if it was defined in this frame!! */
4477 expert_add_info_format(NULL((void*)0), beamid_ti, &ei_oran_beamid_bfws_not_found,
4478 "ext11 for beamId %u and disableBFWs set, but can't find definition", beam_id);
4479 }
4480 }
4481
4482 }
4483
4484 /* Add summary to extension root */
4485 if (orphaned_prbs) {
4486 proto_item_append_text(extension_ti, " (%u full bundles + orphaned)", num_bundles-1);
4487 }
4488 else {
4489 proto_item_append_text(extension_ti, " (%u bundles)", num_bundles);
4490 }
4491 }
4492
4493 break;
4494
4495 case 12: /* SE 12: Non-Contiguous PRB Allocation with Frequency Ranges */
4496 {
4497 /* numSymbol not used in this case */
4498 if (numsymbol_ti && !numsymbol_ignored) {
4499 proto_item_append_text(numsymbol_ti, " (ignored)");
4500 numsymbol_ignored = true1;
4501 }
4502
4503 /* rb must be zero if this SE is present */
4504 if (rb != 0) {
4505 expert_add_info(NULL((void*)0), rb_ti, &ei_oran_se12_rb_set);
4506 }
4507
4508 ext11_settings.ext12_set = true1;
4509
4510 /* priority */
4511 proto_tree_add_item(extension_tree, hf_oran_noncontig_priority, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4512
4513 /* symbolMask */
4514 offset = dissect_symbolmask(tvb, extension_tree, offset, NULL((void*)0), NULL((void*)0));
4515
4516 /* There are now 'R' pairs of (offStartPrb, numPrb) values. Fill extlen bytes with values. If last one is not set,
4517 should be populated with 0s. */
4518 uint32_t extlen_remaining_bytes = (extlen*4) - 4;
4519 uint8_t prb_index;
4520
4521 /* This is for ST10/ST11. First pair starts after frames signalled there */
4522 uint16_t st10_st11_offset = startPrbc + numPrbc;
4523
4524 for (prb_index = 1; extlen_remaining_bytes > 0; prb_index++)
4525 {
4526 /* Create a subtree for each pair */
4527 proto_item *pair_ti = proto_tree_add_string(extension_tree, hf_oran_frequency_range,
4528 tvb, offset, 2, "");
4529 proto_tree *pair_tree = proto_item_add_subtree(pair_ti, ett_oran_frequency_range);
4530
4531 /* offStartPrb */
4532 uint32_t off_start_prb;
4533 proto_tree_add_item_ret_uint(pair_tree, hf_oran_off_start_prb, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &off_start_prb);
4534 offset++;
4535
4536 /* numPrb */
4537 uint32_t num_prb;
4538 proto_tree_add_item_ret_uint(pair_tree, hf_oran_num_prb, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &num_prb);
4539 offset++;
4540
4541 extlen_remaining_bytes -= 2;
4542
4543 /* Last pair may be 0,0 if not used. Check for this */
4544 if ((extlen_remaining_bytes == 0) && (off_start_prb == 0) && (num_prb == 0)) {
4545 proto_item_append_text(pair_ti, " (not used)");
4546 }
4547 /* Add summary to pair root item, and configure details in ext11_settings */
4548 else {
4549 proto_item_append_text(pair_ti, "(%u) [%u : %u]",
4550 prb_index, off_start_prb, num_prb);
4551 proto_item_append_text(extension_ti, "[%u : %u]",
4552 off_start_prb, num_prb);
4553 if (ext11_settings.ext12_num_pairs < MAX_BFW_EXT12_PAIRS128) {
4554 ext11_settings.ext12_pairs[ext11_settings.ext12_num_pairs].off_start_prb = off_start_prb;
4555 ext11_settings.ext12_pairs[ext11_settings.ext12_num_pairs++].num_prb = num_prb;
4556 }
4557
4558 /* Also update PRBs to be covered for ST10 type 5 */
4559 /* Original range from section is added to.. */
4560 /* TODO: I don't think this is quite right.. */
4561 for (unsigned prb=st10_st11_offset+off_start_prb; prb < st10_st11_offset+off_start_prb+num_prb; prb++) {
4562 if (prb < MAX_PRBS273) {
4563 prbs_for_st10_type5[prb] = true1;
4564 }
4565 }
4566
4567 /* Any next pair will begin after this one */
4568 st10_st11_offset += (off_start_prb + num_prb);
4569 }
4570 }
4571 break;
4572 }
4573
4574 case 13: /* SE 13: PRB Allocation with Frequency Hopping */
4575 {
4576 /* Will update settings for ext11 */
4577 ext11_settings.ext13_set = true1;
4578
4579 uint32_t extlen_remaining_bytes = (extlen*4) - 2;
4580 uint8_t allocation_index;
4581
4582 unsigned prev_next_symbol_id = 0, prev_next_start_prbc = 0;
4583
4584 for (allocation_index = 1; extlen_remaining_bytes > 0; allocation_index++)
4585 {
4586 /* Subtree for allocation */
4587 proto_item *allocation_ti = proto_tree_add_string(extension_tree, hf_oran_prb_allocation,
4588 tvb, offset, 2, "");
4589 proto_tree *allocation_tree = proto_item_add_subtree(allocation_ti, ett_oran_prb_allocation);
4590
4591 /* Reserved (2 bits) */
4592 add_reserved_field(allocation_tree, hf_oran_reserved_2bits, tvb, offset, 1);
4593
4594 /* nextSymbolId (4 bits) */
4595 uint32_t next_symbol_id;
4596 proto_tree_add_item_ret_uint(allocation_tree, hf_oran_nextSymbolId, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &next_symbol_id);
4597
4598 /* nextStartPrbc (10 bits) */
4599 uint32_t next_start_prbc;
4600 proto_tree_add_item_ret_uint(allocation_tree, hf_oran_nextStartPrbc, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &next_start_prbc);
4601 offset += 2;
4602
4603 /* Add summary to allocation root item */
4604 proto_item_append_text(allocation_ti, "(%u) nextSymbolId=%3u, nextStartPrbc=%u",
4605 allocation_index, next_symbol_id, next_start_prbc);
4606
4607 /* Checking for duplicates (expected if e.g. had only 2 entries but extlen bytes still to fill */
4608 if ((allocation_index > 1) && (next_symbol_id == prev_next_symbol_id) && (next_start_prbc == prev_next_start_prbc)) {
4609 proto_item_append_text(allocation_ti, " (repeated - to fill up extlen)");
4610 }
4611 else {
4612 /* Add entry for configuring ext11. don't store out of range */
4613 if (ext11_settings.ext13_num_start_prbs < MAX_BFW_EXT13_ALLOCATIONS128) {
4614 ext11_settings.ext13_start_prbs[ext11_settings.ext13_num_start_prbs++] = next_start_prbc;
4615 }
4616 }
4617 prev_next_symbol_id = next_symbol_id;
4618 prev_next_start_prbc = next_start_prbc;
4619
4620 extlen_remaining_bytes -= 2;
4621 }
4622 break;
4623 }
4624
4625 case 14: /* SE 14: Nulling-layer Info. for ueId-based beamforming */
4626 /* Hidden filter for bf (DMRS BF) */
4627 bf_ti = proto_tree_add_item(tree, hf_oran_bf, tvb, 0, 0, ENC_NA0x00000000);
4628 PROTO_ITEM_SET_HIDDEN(bf_ti)proto_item_set_hidden((bf_ti));
4629
4630 if (!seen_se10) {
4631 proto_tree_add_item(extension_tree, hf_oran_nullLayerInd, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4632 offset += 1;
4633 add_reserved_field(extension_tree, hf_oran_reserved_8bits, tvb, offset, 1);
4634 offset += 1;
4635 }
4636 else {
4637 /* Loop over numPortc++1 (from SE 10) nullLayerInd fields */
4638 for (unsigned port=0; port < numPortc+1; port++) {
4639 proto_tree_add_item(extension_tree, hf_oran_nullLayerInd, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4640 offset += 1;
4641 }
4642 }
4643 break;
4644
4645 case 15: /* SE 15: Mixed-numerology Info. for ueId-based beamforming */
4646 {
4647 /* frameStructure */
4648 offset = dissect_frame_structure(extension_tree, tvb, offset,
4649 subframeId, slotId);
4650 /* freqOffset */
4651 proto_tree_add_item(extension_tree, hf_oran_freqOffset, tvb, offset, 3, ENC_BIG_ENDIAN0x00000000);
4652 offset += 3;
4653 /* cpLength */
4654 proto_item *cplength_ti = proto_tree_add_item(extension_tree, hf_oran_cpLength, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
4655 if (sectionType != 0 && sectionType != 3) {
4656 proto_item_append_text(cplength_ti, " (ignored - used only with ST0 and ST3)");
4657 }
4658 offset += 2;
4659 break;
4660 }
4661
4662 case 16: /* SE 16: Antenna mapping in UE channel information based UL beamforming */
4663 {
4664 /* One entry for each UEId */
4665 for (unsigned n=0; n < number_of_ueids; n++) {
4666 /* TODO: want to skip if ueId is 0x7fff and beamGroupType = 10b and 'non-scheduled-ueId-enabled'=TRUE */
4667 /* antMask */
4668 proto_item *ti = proto_tree_add_item(extension_tree, hf_oran_antMask, tvb, offset, 8, ENC_BIG_ENDIAN0x00000000);
4669 proto_item_append_text(ti, " (RX eAxC #%u, UEId=%u)", n+1, ueids[n]);
4670 offset += 8;
4671 }
4672 break;
4673 }
4674
4675 case 17: /* SE 17: Indication of user port group. Applies to ST5 + SE10 with group type 1 (beam matrix indication) */
4676 {
4677 uint32_t extlen_remaining_bytes = (extlen*4) - 2;
4678 uint32_t end_bit = (offset+extlen_remaining_bytes) * 8;
4679 uint32_t ueid_index = 1;
4680
4681 /* "the preceding Section Type and extension messages implicitly provide the number of scheduled users" */
4682 for (uint32_t bit_offset=offset*8; (bit_offset < end_bit) && (ueid_index <= number_of_ueids); bit_offset+=4, ueid_index++) {
4683 /* numUeId (Number of UE Ids per user) */
4684 proto_item *ti = proto_tree_add_bits_item(extension_tree, hf_oran_num_ueid, tvb, bit_offset, 4, ENC_BIG_ENDIAN0x00000000);
4685 /* TODO: show ueids[ueid_index] here too? */
4686 proto_item_append_text(ti, " (user #%u)", ueid_index);
4687 }
4688 break;
4689 }
4690
4691 case 18: /* SE 18: Uplink transmission management */
4692 /* transmissionWindowOffset */
4693 proto_tree_add_item(extension_tree, hf_oran_transmissionWindowOffset, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
4694 offset += 2;
4695 /* reserved (2 bits) */
4696 add_reserved_field(extension_tree, hf_oran_reserved_2bits, tvb, offset, 1);
4697 /* transmissionWindowSize (14 bits) */
4698 proto_tree_add_item(extension_tree, hf_oran_transmissionWindowSize, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
4699 offset += 2;
4700
4701 /* reserved (6 bits) */
4702 add_reserved_field(extension_tree, hf_oran_reserved_6bits, tvb, offset, 1);
4703 /* toT (2 bits) */
4704 proto_tree_add_item(extension_tree, hf_oran_toT, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4705 offset += 1;
4706 break;
4707
4708 case 19: /* SE 19: Compact beamforming information for multiple port */
4709 {
4710 /* beamId in section header should be ignored. Guard against appending multiple times.. */
4711 if (section_beamId_ti && !section_beamId_ignored) {
4712 proto_item_append_text(section_beamId_ti, " (ignored)");
4713 section_beamId_ignored = true1;
4714 }
4715
4716 /* numSymbol not used in this case */
4717 if (numsymbol_ti && !numsymbol_ignored) {
4718 proto_item_append_text(numsymbol_ti, " (ignored)");
4719 numsymbol_ignored = true1;
4720 }
4721
4722 /* disableBFWs */
4723 bool_Bool disableBFWs;
4724 proto_tree_add_item_ret_boolean(extension_tree, hf_oran_disable_bfws,
4725 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &disableBFWs);
4726 if (disableBFWs) {
4727 proto_item_append_text(extension_ti, " (disableBFWs)");
4728 }
4729 /* repetition (1 bit) */
4730 uint64_t repetition;
4731 proto_tree_add_bits_ret_val(extension_tree, hf_oran_se19_repetition, tvb, (offset*8)+1, 1, &repetition, ENC_BIG_ENDIAN0x00000000);
4732 /* numPortc (6 bits) */
4733 proto_tree_add_item_ret_uint(extension_tree, hf_oran_numPortc,
4734 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &numPortc);
4735 offset++;
4736
4737 /* priority (2 bits) */
4738 proto_tree_add_item(extension_tree, hf_oran_noncontig_priority, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4739 /* symbolMask (14 bits) */
4740 offset = dissect_symbolmask(tvb, extension_tree, offset, NULL((void*)0), NULL((void*)0));
4741
4742 uint32_t bfwcomphdr_iq_width, bfwcomphdr_comp_meth;
4743 proto_item *comp_meth_ti = NULL((void*)0);
4744
4745 if (!repetition) {
4746
4747 if (!disableBFWs) {
4748 /* bfwCompHdr */
4749 offset = dissect_bfwCompHdr(tvb, extension_tree, offset,
4750 &bfwcomphdr_iq_width, &bfwcomphdr_comp_meth, &comp_meth_ti);
4751 }
4752
4753 /* Add entries for each port */
4754 for (unsigned port=0; port < numPortc; port++) {
4755
4756 /* Create subtree for port entry*/
4757 int port_start_offset = offset;
4758 proto_item *port_ti = proto_tree_add_string_format(extension_tree, hf_oran_ext19_port,
4759 tvb, offset, 0,
4760 "", "Port %u: ", port);
4761 proto_tree *port_tree = proto_item_add_subtree(port_ti, ett_oran_ext19_port);
4762
4763 /* Reserved (4 bits) */
4764 add_reserved_field(port_tree, hf_oran_reserved_4bits, tvb, offset, 1);
4765 /* portReMask (12 bits) */
4766 proto_tree_add_item(port_tree, hf_oran_portReMask, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
4767 offset += 2;
4768
4769 /* Reserved (2 bits) */
4770 add_reserved_field(port_tree, hf_oran_reserved_2bits, tvb, offset, 1);
4771 /* portSymbolMask (14 bits) */
4772 proto_tree_add_item(port_tree, hf_oran_portSymbolMask, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
4773 offset += 2;
4774
4775 /* Reserved (1 bit) */
4776 add_reserved_field(port_tree, hf_oran_reserved_1bit, tvb, offset, 1);
4777 /* beamID (15 bits) */
4778 uint16_t beamId;
4779 proto_tree_add_item_ret_uint16(port_tree, hf_oran_beamId, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &beamId);
4780 proto_item_append_text(port_ti, " (beamId=%u)", beamId);
4781 offset += 2;
4782
4783 /* No weights present */
4784 if (!disableBFWs) {
4785 /*******************************************************************/
4786 /* Table 7.7.19.1-1 (there is no part -2 for disableBFWs case...), */
4787 /* but for SE 11, bfwCompParam was only present for !disableBFWs */
4788 /*******************************************************************/
4789
4790 /* bfwCompParam */
4791 bool_Bool compression_method_supported = false0;
4792 uint32_t exponent = 0;
4793 unsigned num_trx_entries = 0;
4794 uint16_t *trx;
4795 offset = dissect_bfwCompParam(tvb, port_tree, pinfo, offset, comp_meth_ti,
4796 &bfwcomphdr_comp_meth, &exponent, &compression_method_supported,
4797 &num_trx_entries, &trx);
4798
4799 int bit_offset = offset*8;
4800 int bfw_offset;
4801
4802 /* Add weights for each TRX */
4803 unsigned trx_to_add = (num_trx_entries==0) ? pref_num_bf_antennas : num_trx_entries;
4804 for (unsigned b=0; b < trx_to_add; b++) {
4805
4806 uint16_t trx_index = (num_trx_entries) ? trx[b] : b+1;
4807
4808 /* Create BFW subtree */
4809 bfw_offset = bit_offset / 8;
4810 uint8_t bfw_extent = ((bit_offset + (bfwcomphdr_iq_width*2)) / 8) - bfw_offset;
4811 proto_item *bfw_ti = proto_tree_add_string_format(port_tree, hf_oran_bfw,
4812 tvb, bfw_offset, bfw_extent,
4813 "", "TRX %u: (", trx_index);
4814 proto_tree *bfw_tree = proto_item_add_subtree(bfw_ti, ett_oran_bfw);
4815
4816 /* I */
4817 uint32_t bits = tvb_get_bits32(tvb, bit_offset, bfwcomphdr_iq_width, ENC_BIG_ENDIAN0x00000000);
4818 float value = decompress_value(bits, bfwcomphdr_comp_meth, bfwcomphdr_iq_width, exponent, NULL((void*)0) /* no ModCompr */, 0 /* RE */);
4819 /* Add to tree. */
4820 proto_tree_add_float_format_value(bfw_tree, hf_oran_bfw_i, tvb, bit_offset/8,
4821 (bfwcomphdr_iq_width+7)/8, value, "#%u=%f", b, value);
4822 bit_offset += bfwcomphdr_iq_width;
4823 proto_item_append_text(bfw_ti, "I%u=%f ", b, value);
4824
4825 /* Q */
4826 bits = tvb_get_bits32(tvb, bit_offset, bfwcomphdr_iq_width, ENC_BIG_ENDIAN0x00000000);
4827 value = decompress_value(bits, bfwcomphdr_comp_meth, bfwcomphdr_iq_width, exponent, NULL((void*)0) /* no ModCompr */, 0 /* RE */);
4828 /* Add to tree. */
4829 proto_tree_add_float_format_value(bfw_tree, hf_oran_bfw_q, tvb, bit_offset/8,
4830 (bfwcomphdr_iq_width+7)/8, value, "#%u=%f", b, value);
4831 bit_offset += bfwcomphdr_iq_width;
4832 proto_item_append_text(bfw_ti, "Q%u=%f)", b, value);
4833 }
4834
4835 offset = (bit_offset+7)/8;
4836 }
4837 else {
4838 /* No weights... */
4839 }
4840
4841 /* Set length of this port entry */
4842 proto_item_set_len(port_ti, offset-port_start_offset);
4843 }
4844 }
4845 break;
4846 }
4847
4848 case 20: /* SE 20: Puncturing extension */
4849 {
4850 /* numPuncPatterns */
4851 uint32_t numPuncPatterns;
4852 proto_tree_add_item_ret_uint(extension_tree, hf_oran_numPuncPatterns, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &numPuncPatterns);
4853 offset += 1;
4854
4855 /* Add each puncturing pattern */
4856 for (uint32_t n=0; n < numPuncPatterns; n++) {
4857 unsigned pattern_start_offset = offset;
4858
4859 /* Subtree for this puncturing pattern */
4860 proto_item *pattern_ti = proto_tree_add_string_format(extension_tree, hf_oran_puncPattern,
4861 tvb, offset, 0,
4862 "", "Puncturing Pattern: %u/%u", n+1, numPuncPatterns);
4863 proto_tree *pattern_tree = proto_item_add_subtree(pattern_ti, ett_oran_punc_pattern);
4864
4865 /* SymbolMask (14 bits) */
4866 proto_tree_add_item(pattern_tree, hf_oran_symbolMask_ext20, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
4867 offset += 1;
4868
4869 uint32_t startPuncPrb, numPuncPrb;
4870
4871 /* startPuncPrb (10 bits) */
4872 proto_tree_add_item_ret_uint(pattern_tree, hf_oran_startPuncPrb, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &startPuncPrb);
4873 offset += 2;
4874 /* numPuncPrb (8 bits) */
4875 proto_tree_add_item_ret_uint(pattern_tree, hf_oran_numPuncPrb, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &numPuncPrb);
4876 offset += 1;
4877
4878 proto_item_append_text(pattern_ti, " [%u->%u]", startPuncPrb, startPuncPrb+numPuncPrb-1);
4879
4880 /* Make a hole in range of PRBs to report */
4881 for (unsigned p=startPuncPrb; p < startPuncPrb+numPuncPrb; p++) {
4882 if (p < MAX_PRBS273) {
4883 prbs_for_st10_type5[p] = false0;
4884 }
4885 }
4886
4887 /* puncReMask (12 bits) */
4888 proto_tree_add_item(pattern_tree, hf_oran_puncReMask, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
4889 offset += 1;
4890 /* rb (1 bit) */
4891 proto_item *se20_rb_ti = proto_tree_add_item(pattern_tree, hf_oran_rb, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4892 /* reserved (1 bit) */
4893 add_reserved_field(pattern_tree, hf_oran_reserved_bit5, tvb, offset, 1);
4894 /* multiSDScope (1 bit) */
4895 proto_tree_add_item(pattern_tree, hf_oran_multiSDScope, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4896 /* rbgIncl (1 bit) */
4897 bool_Bool rbgIncl;
4898 proto_tree_add_item_ret_boolean(pattern_tree, hf_oran_RbgIncl, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &rbgIncl);
4899 offset += 1;
4900
4901 if (rbgIncl) {
4902 /* reserved (1 bit) */
4903 add_reserved_field(pattern_tree, hf_oran_reserved_1bit, tvb, offset, 1);
4904 /* rbgSize(3 bits) */
4905 proto_tree_add_item(pattern_tree, hf_oran_rbgSize, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4906 /* rbgMask (28 bits) */
4907 proto_item *rbgmask_ti;
4908 uint32_t rbgMask;
4909 offset = dissect_rbg_mask(pattern_tree, tvb, offset, &rbgMask, &rbgmask_ti);
4910
4911 proto_item_append_text(se20_rb_ti, " (ignored)");
4912 }
4913
4914 proto_item_set_len(pattern_ti, offset-pattern_start_offset);
4915 }
4916
4917 break;
4918 }
4919 case 21: /* SE 21: Variable PRB group size for channel information */
4920 {
4921 /* ciPrbGroupSize */
4922 uint32_t ci_prb_group_size;
4923 proto_item *prb_group_size_ti = proto_tree_add_item_ret_uint(extension_tree, hf_oran_ci_prb_group_size, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &ci_prb_group_size);
4924 offset += 1;
4925
4926 switch (ci_prb_group_size) {
4927 case 0:
4928 case 1:
4929 case 255:
4930 /* Reserved value */
4931 expert_add_info_format(pinfo, prb_group_size_ti, &ei_oran_ci_prb_group_size_reserved,
4932 "SE 11 ciPrbGroupSize is reserved value %u - must be 2-254",
4933 ci_prb_group_size);
4934 break;
4935 default:
4936 /* This value affects how SE 11 is interpreted */
4937 ext11_settings.ext21_set = true1;
4938 ext11_settings.ext21_ci_prb_group_size = ci_prb_group_size;
4939
4940 if (numPrbc == 0) {
4941 expert_add_info(pinfo, numprbc_ti, &ei_oran_numprbc_ext21_zero);
4942 }
4943 break;
4944 }
4945
4946 /* reserved (6 bits) */
4947 add_reserved_field(extension_tree, hf_oran_reserved_6bits, tvb, offset, 1);
4948
4949 /* prgSize (2 bits). Interpretation depends upon section type (5 or 6), but also mplane parameters? */
4950 if (sectionType == SEC_C_UE_SCHED) { /* Section Type 5 */
4951 proto_tree_add_item(extension_tree, hf_oran_prg_size_st5, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4952 }
4953 else if (sectionType == SEC_C_CH_INFO) { /* Section Type 6 */
4954 proto_tree_add_item(extension_tree, hf_oran_prg_size_st6, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4955 }
4956 offset += 1;
4957 break;
4958 }
4959
4960 case 22: /* SE 22: ACK/NACK request */
4961 {
4962 uint32_t ack_nack_req_id;
4963 proto_tree_add_item_ret_uint(extension_tree, hf_oran_ack_nack_req_id, tvb, offset, 2,
4964 ENC_BIG_ENDIAN0x00000000, &ack_nack_req_id);
4965 offset += 2;
4966
4967 if (state) {
4968 if (!PINFO_FD_VISITED(pinfo)((pinfo)->fd->visited)) {
4969 /* Add this request into conversation state on first pass */
4970 ack_nack_request_t *request_details = wmem_new0(wmem_file_scope(), ack_nack_request_t)((ack_nack_request_t*)wmem_alloc0((wmem_file_scope()), sizeof
(ack_nack_request_t)))
;
4971 request_details->request_frame_number = pinfo->num;
4972 request_details->request_frame_time = pinfo->abs_ts;
4973 request_details->requestType = SE22;
4974 /* Insert into flow's tree */
4975 wmem_tree_insert32(state->ack_nack_requests, ack_nack_req_id, request_details);
4976 }
4977 else {
4978 /* Try to link forward to ST8 response */
4979 ack_nack_request_t *response = wmem_tree_lookup32(state->ack_nack_requests,
4980 ack_nack_req_id);
4981 if (response) {
4982 show_link_to_acknack_response(extension_tree, tvb, pinfo, response);
4983 }
4984 }
4985 }
4986 break;
4987 }
4988
4989 case 23: /* SE 23: Arbitrary symbol pattern modulation compression parameters */
4990 {
4991 /* Green common header */
4992
4993 /* numSymPrbPattern (4 bits) */
4994 uint32_t num_sym_prb_pattern;
4995 proto_tree_add_item_ret_uint(extension_tree, hf_oran_num_sym_prb_pattern, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &num_sym_prb_pattern);
4996 /* reserved (3 bits) */
4997 add_reserved_field(extension_tree, hf_oran_reserved_bits456, tvb, offset, 1);
4998 /* prbMode (1 bit) */
4999 bool_Bool prb_mode;
5000 proto_tree_add_item_ret_boolean(extension_tree, hf_oran_prb_mode, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &prb_mode);
5001 offset += 1;
5002
5003 /* reserved (8 bits) */
5004 add_reserved_field(extension_tree, hf_oran_reserved_8bits, tvb, offset, 1);
5005 offset += 1;
5006
5007 /* Dissect each SymPrbPattern */
5008 for (uint32_t n=0; n < num_sym_prb_pattern; n++) {
5009
5010 /* Subtree */
5011 proto_item *pattern_ti = proto_tree_add_string_format(extension_tree, hf_oran_sym_prb_pattern,
5012 tvb, offset, 1, "",
5013 prb_mode ? "PRB-BLOCK" : "PRB-MASK");
5014 proto_tree *pattern_tree = proto_item_add_subtree(pattern_ti, ett_oran_sym_prb_pattern);
5015
5016
5017 /* Orange part */
5018
5019 /* Reserved (2 bits) */
5020 add_reserved_field(pattern_tree, hf_oran_reserved_2bits, tvb, offset, 1);
5021 /* symMask (14 bits) */
5022 proto_tree_add_item(pattern_tree, hf_oran_sym_mask, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5023 offset += 2;
5024 /* numMcScaleOffset (4 bits) */
5025 uint32_t numMcScaleOffset;
5026 proto_tree_add_item_ret_uint(pattern_tree, hf_oran_num_mc_scale_offset, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &numMcScaleOffset);
5027
5028 if (!prb_mode) { /* PRB-MASK */
5029 /* prbPattern (4 bits) */
5030 proto_tree_add_item(pattern_tree, hf_oran_prb_pattern, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5031 offset += 1;
5032 /* reserved (8 bits) */
5033 add_reserved_field(pattern_tree, hf_oran_reserved_8bits, tvb, offset, 1);
5034 offset += 1;
5035 /* reserved (4 bits) */
5036 add_reserved_field(pattern_tree, hf_oran_reserved_4bits, tvb, offset, 1);
5037 }
5038 else { /* PRB-BLOCK */
5039 /* prbBlkOffset (8 bits) */
5040 proto_tree_add_item(pattern_tree, hf_oran_prb_blk_offset, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5041 offset += 1;
5042 /* prbBlkSize (8 bits) */
5043 proto_tree_add_item(pattern_tree, hf_oran_prb_blk_size, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5044 offset += 1;
5045 }
5046
5047 for (unsigned c=0; c < numMcScaleOffset; c++) {
5048 if (c > 0) {
5049 /* reserved (4 bits) */
5050 add_reserved_field(pattern_tree, hf_oran_reserved_4bits, tvb, offset, 1);
5051 }
5052
5053 static int * const remask_flags_even[] = {
5054 &hf_oran_mc_scale_re_mask_re1_even,
5055 &hf_oran_mc_scale_re_mask_re2_even,
5056 &hf_oran_mc_scale_re_mask_re3_even,
5057 &hf_oran_mc_scale_re_mask_re4_even,
5058 &hf_oran_mc_scale_re_mask_re5_even,
5059 &hf_oran_mc_scale_re_mask_re6_even,
5060 &hf_oran_mc_scale_re_mask_re7_even,
5061 &hf_oran_mc_scale_re_mask_re8_even,
5062 &hf_oran_mc_scale_re_mask_re9_even,
5063 &hf_oran_mc_scale_re_mask_re10_even,
5064 &hf_oran_mc_scale_re_mask_re11_even,
5065 &hf_oran_mc_scale_re_mask_re12_even,
5066 NULL((void*)0)
5067 };
5068
5069 /* mcScaleReMask (12 bits). Defines which REs the following csf and mcScaleOffset apply to */
5070 uint64_t mcScaleReMask, mcScaleOffset;
5071 proto_tree_add_bitmask_ret_uint64(pattern_tree, tvb, offset,
5072 hf_oran_mc_scale_re_mask_even,
5073 ett_oran_mc_scale_remask,
5074 remask_flags_even, ENC_BIG_ENDIAN0x00000000, &mcScaleReMask);
5075 offset += 2;
5076
5077 /* csf (1 bit) */
5078 bool_Bool csf;
5079 dissect_csf(pattern_tree, tvb, offset*8, ci_iq_width, &csf);
5080 /* mcScaleOffset (15 bits) */
5081 proto_item *ti = proto_tree_add_bits_ret_val(pattern_tree, hf_oran_mc_scale_offset, tvb, offset*8 + 1, 15, &mcScaleOffset, ENC_BIG_ENDIAN0x00000000);
5082 uint16_t exponent = (mcScaleOffset >> 11) & 0x000f; /* m.s. 4 bits */
5083 uint16_t mantissa = mcScaleOffset & 0x07ff; /* l.s. 11 bits */
5084 float mcScaleOffset_value = ((float)mantissa/(1<<11)) * ((float)1.0 / (1 << exponent));
5085 proto_item_append_text(ti, " (%f)", mcScaleOffset_value);
5086
5087 offset += 2;
5088
5089 /* Record this config. */
5090 /* TODO: at some point, will also want to store/use PRB + symbol filters */
5091 section_mod_compr_config_t* sect_config = get_mod_compr_section_to_write(pinfo, state, sectionId);
5092
5093 if (sect_config && sect_config->num_configs < MAX_MOD_COMPR_CONFIGS12) {
5094 unsigned i = sect_config->num_configs;
5095 sect_config->configs[i].mod_compr_re_mask = (uint16_t)mcScaleReMask;
5096 sect_config->configs[i].mod_compr_csf = csf;
5097 sect_config->configs[i].mod_compr_scaler = mcScaleOffset_value;
5098 sect_config->num_configs++;
5099 }
5100 }
5101
5102 proto_item_set_end(pattern_ti, tvb, offset);
5103 }
5104 break;
5105 }
5106
5107 case 24: /* SE 24: PUSCH DMRS configuration */
5108 {
5109 /* Hidden filter for bf (DMRS BF) */
5110 bf_ti = proto_tree_add_item(tree, hf_oran_bf, tvb, 0, 0, ENC_NA0x00000000);
5111 PROTO_ITEM_SET_HIDDEN(bf_ti)proto_item_set_hidden((bf_ti));
5112
5113 /* alpnPerSym (1 bit) */
5114 proto_tree_add_item(extension_tree, hf_oran_alpn_per_sym, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5115 /* antDmrsSnr (1 bit) */
5116 proto_tree_add_item(extension_tree, hf_oran_ant_dmrs_snr, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5117 /* reserved (1 bit) */
5118 add_reserved_field(extension_tree, hf_oran_reserved_bit2, tvb, offset, 1);
5119 /* userGroupSize (5 bits) */
5120 uint32_t user_group_size;
5121 proto_item *ugs_ti = proto_tree_add_item_ret_uint(extension_tree, hf_oran_user_group_size, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &user_group_size);
5122 if (user_group_size == 0) {
5123 proto_item_append_text(ugs_ti, " (not used)");
5124 }
5125 else if (user_group_size > 12) {
5126 proto_item_append_text(ugs_ti, " (reserved)");
5127 }
5128 offset += 1;
5129 /* userGroupId (8 bits)*/
5130 uint32_t user_group_id;
5131 proto_item *ugi_ti = proto_tree_add_item_ret_uint(extension_tree, hf_oran_user_group_id, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &user_group_id);
5132 if (user_group_id == 0) {
5133 /* TODO: Value 0 can happen in several cases, described in 7.7.24.7.. */
5134 }
5135 if (user_group_id == 255) {
5136 /* Value 255 is reserved */
5137 expert_add_info(pinfo, ugi_ti, &ei_oran_user_group_id_reserved_value);
5138 }
5139 offset += 1;
5140
5141 bool_Bool seen_value_to_inherit = false0;
5142 bool_Bool inherited_config_has_transform_precoding = false0;
5143 int dmrs_configs_seen = 0;
5144
5145 /* Dissect each entry until reach number of configured ueIds (or run out of extlen bytes..) */
5146 uint32_t ueid_index = 0;
5147 while ((offset < (extension_start_offset + extlen*4)) && (ueid_index < number_of_ueids)) {
5148 dmrs_configs_seen++;
5149
5150 /* Subtree */
5151 proto_item *entry_ti = proto_tree_add_string_format(extension_tree, hf_oran_dmrs_entry,
5152 tvb, offset, 0, "",
5153 "Entry");
5154 proto_tree *entry_tree = proto_item_add_subtree(entry_ti, ett_oran_dmrs_entry);
5155
5156 /* entryType (3 bits) */
5157 uint32_t entry_type;
5158 proto_item *entry_type_ti;
5159 entry_type_ti = proto_tree_add_item_ret_uint(entry_tree, hf_oran_entry_type, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &entry_type);
5160 if (entry_type > 3) {
5161 proto_item_append_text(entry_type_ti, " (reserved)");
5162 }
5163
5164 /* dmrsPortNumber (5 bits). Values 0-11 allowed */
5165 unsigned int dmrs_port_number;
5166 proto_item *dpn_ti = proto_tree_add_item_ret_uint(entry_tree, hf_oran_dmrs_port_number, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &dmrs_port_number);
5167 if (dmrs_port_number > 11) {
5168 proto_item_append_text(dpn_ti, " (12-31 are reserved)");
5169 }
5170 offset += 1;
5171
5172 /* What follows depends upon entryType */
5173 switch (entry_type) {
5174 case 0: /* dmrsPortNumber config same as previous, ueId ueIdReset=0 */
5175 case 1: /* dmrsPortNumber config same as previous, ueId ueIdReset=1 */
5176 /* No further fields for these */
5177 /* Error here if no previous values to inherit!! */
5178 if (!seen_value_to_inherit) {
5179 expert_add_info_format(pinfo, entry_type_ti, &ei_oran_se24_nothing_to_inherit,
5180 "SE24: have seen entry type %u, but no previous config (type 2 or 3) to inherit config from", entry_type);
5181
5182 }
5183 /* TODO: would be useful to repeat whole inherited config here? */
5184 break;
5185
5186 case 2: /* transform precoding disabled */
5187 case 3: /* transform precoding enabled */
5188 {
5189 /* Type 2/3 are very similar.. */
5190
5191 /* ueIdReset (1 bit) */
5192 proto_tree_add_item(entry_tree, hf_oran_ueid_reset, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5193 /* posMeas (1 bit) */
5194 proto_tree_add_item(entry_tree, hf_oran_pos_meas, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5195
5196 /* dmrsSymbolMask (14 bits) */
5197 static int * const dmrs_symbol_mask_flags[] = {
5198 &hf_oran_dmrs_symbol_mask_s13,
5199 &hf_oran_dmrs_symbol_mask_s12,
5200 &hf_oran_dmrs_symbol_mask_s11,
5201 &hf_oran_dmrs_symbol_mask_s10,
5202 &hf_oran_dmrs_symbol_mask_s9,
5203 &hf_oran_dmrs_symbol_mask_s8,
5204 &hf_oran_dmrs_symbol_mask_s7,
5205 &hf_oran_dmrs_symbol_mask_s6,
5206 &hf_oran_dmrs_symbol_mask_s5,
5207 &hf_oran_dmrs_symbol_mask_s4,
5208 &hf_oran_dmrs_symbol_mask_s3,
5209 &hf_oran_dmrs_symbol_mask_s2,
5210 &hf_oran_dmrs_symbol_mask_s1,
5211 &hf_oran_dmrs_symbol_mask_s0,
5212 NULL((void*)0)
5213 };
5214 proto_tree_add_bitmask(entry_tree, tvb, offset,
5215 hf_oran_dmrs_symbol_mask, ett_oran_dmrs_symbol_mask, dmrs_symbol_mask_flags, ENC_BIG_ENDIAN0x00000000);
5216 offset += 2;
5217
5218 /* scrambling */
5219 proto_tree_add_item(entry_tree, hf_oran_scrambling, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5220 offset += 2;
5221
5222 /* nscid (1 bit) */
5223 proto_tree_add_item(entry_tree, hf_oran_nscid, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5224
5225 /* These 5 bits differ depending upon entry type */
5226 if (entry_type == 2) { /* type 2 */
5227 /* dType (1 bit) */
5228 proto_tree_add_item(entry_tree, hf_oran_dtype, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5229 /* cdmWithoutData (2 bits) */
5230 proto_tree_add_item(entry_tree, hf_oran_cmd_without_data, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5231 /* lambda (2 bits) */
5232 proto_tree_add_item(entry_tree, hf_oran_lambda, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5233 }
5234 else { /* type 3 */
5235 /* reserved (1 bit) */
5236 add_reserved_field(entry_tree, hf_oran_reserved_bit1, tvb, offset, 1);
5237 /* lowPaprType (2 bits) */
5238 proto_tree_add_item(entry_tree, hf_oran_low_papr_type, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5239 /* hoppingMode (2 bits) */
5240 proto_tree_add_item(entry_tree, hf_oran_hopping_mode, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5241 }
5242
5243 /* firstPrb (9 bits) */
5244 proto_tree_add_item(entry_tree, hf_oran_first_prb, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5245 offset += 1;
5246 /* lastPrb (9 bits) */
5247 proto_tree_add_item(entry_tree, hf_oran_last_prb, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5248 offset += 2;
5249 /* Reserved (16 bits) */
5250 add_reserved_field(entry_tree, hf_oran_reserved_16bits, tvb, offset, 2);
5251 offset += 2;
5252
5253 /* Could now see entry types 0 or 1 - they have these values to inherit */
5254 seen_value_to_inherit = true1;
5255 inherited_config_has_transform_precoding = (entry_type == 3);
5256 break;
5257 }
5258
5259 default:
5260 /* reserved - expert info */
5261 break;
5262 }
5263
5264 proto_item_append_text(entry_ti, " [UEId=%u] (dmrsPortNumber=%2u) (type %u - %s) ",
5265 ueids[ueid_index++], dmrs_port_number, entry_type, val_to_str_const(entry_type, entry_type_vals, "Unknown"));
5266 proto_item_set_end(entry_ti, tvb, offset);
5267
5268 if (entry_type <= 1) {
5269 proto_item_append_text(entry_ti, " [transform-precoding %s]",
5270 inherited_config_has_transform_precoding ? "enabled" : "disabled");
5271 }
5272 }
5273
5274 proto_item_append_text(extension_ti, " (%d DMRS configs seen)", dmrs_configs_seen);
5275 break;
5276 }
5277
5278 case 25: /* SE 25: Symbol reordering for DMRS-BF */
5279 /* Just dissect each available block of 7 bytes as the 14 symbols for a layer,
5280 where each layer could be one or apply to all layers. */
5281 {
5282 /* TODO: should only appear in one section of a message - check? */
5283 unsigned layer = 0;
5284 proto_item *layer_ti;
5285 while (offset+7 <= (extension_start_offset + extlen*4)) {
5286 /* Layer subtree */
5287 layer_ti = proto_tree_add_string_format(extension_tree, hf_oran_symbol_reordering_layer,
5288 tvb, offset, 7, "",
5289 "Layer");
5290 proto_tree *layer_tree = proto_item_add_subtree(layer_ti, ett_oran_symbol_reordering_layer);
5291
5292 /* All 14 symbols for a layer (or all layers) */
5293 for (unsigned s=0; s < 14; s++) {
5294 proto_item *sym_ti;
5295 /* txWinForOnAirSymbol */
5296 unsigned int tx_win_for_on_air_symbol;
5297 sym_ti = proto_tree_add_item_ret_uint(layer_tree,
5298 (s % 2) ? hf_oran_tx_win_for_on_air_symbol_r : hf_oran_tx_win_for_on_air_symbol_l,
5299 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &tx_win_for_on_air_symbol);
5300 if (tx_win_for_on_air_symbol == 0x0F) {
5301 /* Ordering not affected */
5302 proto_item_append_text(sym_ti, " (sym %u - no info)", s);
5303 }
5304 else {
5305 proto_item_append_text(sym_ti, " (sym %u)", s);
5306 }
5307 if (s % 2) {
5308 offset += 1;
5309 }
5310 }
5311
5312 proto_item_append_text(layer_ti, " (layer %u)", ++layer);
5313 proto_item_append_text(extension_ti, " (layer %u)", layer);
5314 }
5315 /* Set layer subtree label */
5316 if (layer == 1) {
5317 proto_item_append_text(layer_ti, " (all)");
5318 proto_item_append_text(extension_ti, " (all)");
5319 }
5320 if (layer == 0) {
5321 /* TODO: are no layers valid? What does it mean? */
5322 proto_item_append_text(extension_ti, " (none)");
5323 }
5324 break;
5325 }
5326
5327 case 26: /* SE 26: Frequency offset feedback */
5328 /* Reserved (8 bits) */
5329 add_reserved_field(extension_tree, hf_oran_reserved_8bits, tvb, offset, 1);
5330 offset += 1;
5331 /* Reserved (1 bit) */
5332 add_reserved_field(extension_tree, hf_oran_reserved_1bit, tvb, offset, 1);
5333 /* numFoFb (7 bits) */
5334 unsigned num_fo_fb;
5335 proto_tree_add_item_ret_uint(extension_tree, hf_oran_num_fo_fb, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &num_fo_fb);
5336 offset += 1;
5337
5338 /* Add each freqOffsetFb value */
5339 for (unsigned n=0; n < num_fo_fb; n++) {
5340 unsigned freq_offset_fb;
5341 /* freqOffsetFb (16 bits) */
5342 proto_item *offset_ti = proto_tree_add_item_ret_uint(extension_tree, hf_oran_freq_offset_fb,
5343 tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &freq_offset_fb);
5344 /* Show if maps onto a -ve number */
5345 if ((freq_offset_fb >= 0x8ad0) && (freq_offset_fb <= 0xffff)) {
5346 proto_item_append_text(offset_ti, "(value %d)", -1 - (0xffff-freq_offset_fb));
5347 }
5348 proto_item_append_text(offset_ti, " [#%u]", n+1);
5349 offset += 2;
5350 }
5351 break;
5352
5353 case 27: /* SE 27: O-DU controlled dimensionality reduction */
5354 {
5355 /* Hidden filter for bf (DMRS BF) */
5356 bf_ti = proto_tree_add_item(tree, hf_oran_bf, tvb, 0, 0, ENC_NA0x00000000);
5357 PROTO_ITEM_SET_HIDDEN(bf_ti)proto_item_set_hidden((bf_ti));
5358
5359 /* beamType (2 bits) */
5360 unsigned beam_type;
5361 proto_tree_add_item_ret_uint(extension_tree, hf_oran_beam_type, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &beam_type);
5362 /* reserved (6 bits) */
5363 add_reserved_field(extension_tree, hf_oran_reserved_last_6bits, tvb, offset, 1);
5364 offset += 1;
5365
5366 /* numElements */
5367 unsigned num_elements;
5368 proto_item *num_elements_ti = proto_tree_add_item_ret_uint(extension_tree, hf_oran_num_elements, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &num_elements);
5369 if (num_elements == 0) {
5370 num_elements = 256;
5371 proto_item_append_text(num_elements_ti, " (256");
5372 }
5373
5374 offset += 1;
5375
5376 /* beamId value(s) */
5377 switch (beam_type) {
5378 case 0:
5379 for (unsigned n=0; n < num_elements; n++) {
5380 /* reserved (1 bit) + beamId */
5381 add_reserved_field(extension_tree, hf_oran_reserved_1bit, tvb, offset, 1);
5382 proto_tree_add_item(c_section_tree, hf_oran_beamId, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5383 offset += 2;
5384 }
5385 break;
5386 case 1:
5387 /* reserved (1 bit) + beamId */
5388 add_reserved_field(extension_tree, hf_oran_reserved_1bit, tvb, offset, 1);
5389 proto_tree_add_item(c_section_tree, hf_oran_beamId, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5390 offset += 2;
5391 break;
5392 default:
5393 /* Unknown type... */
5394 break;
5395 }
5396 break;
5397 }
5398
5399 case 28: /* SE 28: O-DU controlled frequency resolution for SINR reporting */
5400 {
5401 /* reserved (3 bits) */
5402 add_reserved_field(extension_tree, hf_oran_reserved_3bits, tvb, offset, 1);
5403 /* numUeSinrRpt (5 bits) */
5404 uint32_t num_ue_sinr_rpt;
5405 proto_tree_add_item_ret_uint(extension_tree, hf_oran_num_ue_sinr_rpt, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &num_ue_sinr_rpt);
5406 offset += 1;
5407
5408 for (uint32_t n=0; n < num_ue_sinr_rpt; n++) {
5409 /* reserved (1 bit) */
5410 add_reserved_field(extension_tree, (n % 2) ? hf_oran_reserved_bit4 : hf_oran_reserved_1bit,
5411 tvb, offset, 1);
5412
5413 /* numSinrPerPrb (3 bits). Taken from alternate nibbles within byte. */
5414 proto_tree_add_item(extension_tree, (n % 2) ? hf_oran_num_sinr_per_prb_right : hf_oran_num_sinr_per_prb,
5415 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5416 if (n % 2) {
5417 offset += 1;
5418 }
5419 }
5420
5421 /* May need to skip beyond half-used byte */
5422 if (num_ue_sinr_rpt % 2) {
5423 offset += 1;
5424 }
5425 break;
5426 }
5427
5428 case 29: /* SE 29: Cyclic delay adjustment */
5429 /* reserved (4 bits) */
5430 add_reserved_field(extension_tree, hf_oran_reserved_4bits, tvb, offset, 1);
5431 /* cdScgSize (4 bits) */
5432 proto_tree_add_item(extension_tree, hf_oran_cd_scg_size, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5433 offset += 1;
5434
5435 /* cdScgPhaseStep */
5436 proto_tree_add_item(extension_tree, hf_oran_cd_scg_phase_step, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5437 offset += 1;
5438 break;
5439
5440 case 30: /* SE 30: PUSCH repetition indication */
5441 {
5442 /* Only valid for UL */
5443 if (!tap_info->uplink) {
5444 expert_add_info(pinfo, extension_ti, &ei_oran_se30_not_ul);
5445 }
5446
5447 /* ueids[], number_of_ueids may have been rewritten by SE10 */
5448
5449 /* reserved (4 bits) */
5450 add_reserved_field(extension_tree, hf_oran_reserved_4bits, tvb, offset, 1);
5451 /* numRepUe (4 bits) */
5452 uint8_t num_rep_ue;
5453 proto_tree_add_item_ret_uint8(extension_tree, hf_oran_num_rep_ue, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &num_rep_ue);
5454 offset ++;
5455 /* reserved (8 bits) */
5456 add_reserved_field(extension_tree, hf_oran_reserved_8bits, tvb, offset, 1);
5457 offset += 1;
5458
5459 if (num_rep_ue == 1) {
5460 /* SE10 *not* present. N.B. this should tally with number_of_ueids being set to only 1? */
5461 /* reserved (1 bit) */
5462 add_reserved_field(extension_tree, hf_oran_reserved_1bit, tvb, offset, 1);
5463 /* isLastRep (1 bit). Value meaningless here? */
5464 proto_tree_add_item(extension_tree, hf_oran_is_last_rep, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5465 /* repIndex (6 bits) */
5466 proto_tree_add_item(extension_tree, hf_oran_rep_index, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5467 offset += 1;
5468
5469 /* reserved (2 bits) */
5470 add_reserved_field(extension_tree, hf_oran_reserved_2bits, tvb, offset, 1);
5471 /* numReps (6 bits) */
5472 uint8_t num_reps;
5473 proto_tree_add_item_ret_uint8(extension_tree, hf_oran_num_reps, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &num_reps);
5474 /* TODO: should numReps be 0 here? */
5475 offset += 1;
5476
5477 /* reserved (2 bits) */
5478 add_reserved_field(extension_tree, hf_oran_reserved_16bits, tvb, offset, 2);
5479 offset += 2;
5480
5481 }
5482 else {
5483 /* SE10 present */
5484 bool_Bool is_last_rep = false0;
5485 /* TODO: should is_last_rep (also) cause loop exit? */
5486 for (uint8_t ue_idx=0; (ue_idx < num_rep_ue) && !is_last_rep; ue_idx++) {
5487 /* reserved (1 bit) */
5488 add_reserved_field(extension_tree, hf_oran_reserved_1bit, tvb, offset, 1);
5489 /* isLastRep (1 bit) */
5490 proto_tree_add_item_ret_boolean(extension_tree, hf_oran_is_last_rep, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &is_last_rep);
5491 /* repIndex (6 bits) */
5492 proto_tree_add_item(extension_tree, hf_oran_rep_index, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5493 offset += 1;
5494
5495 /* reserved (2 bits) */
5496 add_reserved_field(extension_tree, hf_oran_reserved_2bits, tvb, offset, 1);
5497 /* numReps (6 bits) */
5498 uint8_t num_reps;
5499 proto_item *num_reps_ti = proto_tree_add_item_ret_uint8(extension_tree, hf_oran_num_reps, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &num_reps);
5500 /* TODO: values 33-63 are reserved */
5501 if (num_reps > 32) {
5502 proto_item_append_text(num_reps_ti, " (reserved)");
5503 }
5504 offset += 1;
5505
5506 for (uint8_t rep=0; rep < num_reps; rep++) {
5507 /* reserved (1 bit) */
5508 add_reserved_field(extension_tree, hf_oran_reserved_1bit, tvb, offset, 1);
5509 /* repUeId (15 bits) */
5510 /* TODO: should be fetching and comparing with ueids[] from SE10? */
5511 uint16_t ueid;
5512 proto_item *ueid_ti = proto_tree_add_item_ret_uint16(extension_tree, hf_oran_rep_ueid, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &ueid);
5513
5514 /* Check that this ueid is recognised (among ueids[], number_of_ueids) */
5515 bool_Bool matched = false0;
5516 for (unsigned u=0; u < number_of_ueids; u++) {
5517 if (ueid == ueids[u])
5518 matched = true1;
5519 }
5520 if (!matched) {
5521 expert_add_info_format(pinfo, ueid_ti, &ei_oran_se30_unknown_ueid,
5522 "SE 30 mentions UEId %u - not seen in SE10", ueid);
5523 }
5524 offset += 2;
5525 }
5526 }
5527 }
5528 break;
5529 }
5530 case 31: /* SE 31: MCS Information */
5531 {
5532 /* TODO: show ueid (from ST5 or SE10) as generated field? Maybe add a subtree for each entry? */
5533 for (uint32_t u=0; u < number_of_ueids; u++) {
5534 /* reserved (4 bits) */
5535 add_reserved_field(extension_tree, hf_oran_reserved_4bits, tvb, offset, 1);
5536 /* mcsTable (4 bits) */
5537 proto_tree_add_item(extension_tree, hf_oran_mcs_table, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5538 offset += 1;
5539
5540 /* reserved (2 bits) */
5541 add_reserved_field(extension_tree, hf_oran_reserved_2bits, tvb, offset, 1);
5542 /* mcsIndex (6 bits) */
5543 proto_tree_add_item(extension_tree, hf_oran_mcs_index, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5544 offset += 1;
5545 }
5546 break;
5547 }
5548
5549 case 32: /* SE 32: Rank and TPMI measurement request */
5550 {
5551 /* reserved (3 bits) */
5552 add_reserved_field(extension_tree, hf_oran_reserved_3bits, tvb, offset, 1);
5553 /* numMeasReq (5 bits) */
5554 uint8_t num_meas_req;
5555 proto_tree_add_item_ret_uint8(extension_tree, hf_oran_num_meas_req, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &num_meas_req);
5556 offset += 1;
5557
5558 /* reserved (8 bits) */
5559 add_reserved_field(extension_tree, hf_oran_reserved_8bits, tvb, offset, 1);
5560 offset += 1;
5561
5562 /* Show each measurement request */
5563 for (unsigned r=0; r < num_meas_req; r++) {
5564 /* Reserved (1 bit) */
5565 add_reserved_field(extension_tree, hf_oran_reserved_1bit, tvb, offset, 1);
5566 /* ueId (14 bits) */
5567 proto_tree_add_item(extension_tree, hf_oran_ueId, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5568 offset += 2;
5569
5570 /* numOfUeAntPorts (4 bits) */
5571 proto_tree_add_item(extension_tree, hf_oran_num_of_ue_ant_ports, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5572 /* ueRank (4 bits) */
5573 proto_tree_add_item(extension_tree, hf_oran_ue_rank, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5574 offset += 1;
5575
5576 /* codebookSubset (2 bits) */
5577 proto_tree_add_item(extension_tree, hf_oran_codebook_subset, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5578 /* TODO: tpmiIndex (6 bits) */
5579 offset += 1;
5580
5581 /* fullPwrMode (2 bits) */
5582 proto_tree_add_item(extension_tree, hf_oran_full_pwr_mode, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5583 /* fullPwrMode2TmpiGroup (14 bits) */
5584 /* TODO: add as a bitset */
5585 proto_tree_add_item(extension_tree, hf_oran_full_pwr_mode_2_tpmi_group, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5586 offset += 2;
5587
5588 /* reserved (2 bytes) */
5589 add_reserved_field(extension_tree, hf_oran_reserved_16bits, tvb, offset, 2);
5590 offset += 2;
5591 }
5592 break;
5593 }
5594
5595 case 33: /* Dynamic channel type selection for SRS-BF-DL */
5596 /* Reserved (6 bits) */
5597 add_reserved_field(extension_tree, hf_oran_reserved_6bits, tvb, offset, 1);
5598 /* chanTypeSel (2 bits) */
5599 proto_tree_add_item(extension_tree, hf_oran_chan_type_sel, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5600 offset += 1;
5601 /* Reserved (8 bits) */
5602 add_reserved_field(extension_tree, hf_oran_reserved_8bits, tvb, offset, 1);
5603 offset += 1;
5604 break;
5605
5606 case 34: /* RS-BF-UL Control */
5607 {
5608 /* portListEn (1 bit) */
5609 bool_Bool port_list_en;
5610 proto_tree_add_item_ret_boolean(extension_tree, hf_oran_port_list_en, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &port_list_en);
5611 /* reserved (4 bits) */
5612 add_reserved_field(extension_tree, hf_oran_reserved_bits1234, tvb, offset, 1);
5613 /* tpmiMode (3 bits) */
5614 uint8_t tpmi_mode;
5615 proto_tree_add_item_ret_uint8(extension_tree, hf_oran_tpmi_mode, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &tpmi_mode);
5616 offset += 1;
5617
5618 /* reserved (2 bits) */
5619 add_reserved_field(extension_tree, hf_oran_reserved_2bits, tvb, offset, 1);
5620 /* numUeid (6 bits) */
5621 uint8_t num_ueid;
5622 proto_tree_add_item_ret_uint8(extension_tree, hf_oran_num_ueid_se34, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &num_ueid);
5623 offset += 1;
5624
5625 for (unsigned layer=0; layer < num_ueid; layer++) {
5626 /* TODO: TPMI data for layer */
5627 switch (tpmi_mode) {
5628 case 0:
5629 /* srsPortMask (8 bits) */
5630 proto_tree_add_item(extension_tree, hf_oran_chan_srs_port_mask, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5631 offset += 1;
5632 break;
5633 case 1:
5634 /* srsPortMask (8 bits) */
5635 proto_tree_add_item(extension_tree, hf_oran_chan_srs_port_mask, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5636 offset += 1;
5637 /* TODO: tpmiPhaseP7 (2 bits) */
5638 /* TODO: tpmiPhaseP6 (2 bits) */
5639 /* TODO: tpmiPhaseP5 (2 bits) */
5640 /* TODO: tpmiPhaseP4 (2 bits) */
5641 offset += 1;
5642 /* TODO: tpmiPhaseP3 (2 bits) */
5643 /* TODO: tpmiPhaseP2 (2 bits) */
5644 /* TODO: tpmiPhaseP1 (2 bits) */
5645 /* TODO: tpmiPhaseP0 (2 bits) */
5646 offset += 1;
5647 }
5648
5649 /* ueId for layer */
5650 proto_tree_add_item(extension_tree, hf_oran_ueid_se34, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5651 offset += 2;
5652 }
5653
5654 if (port_list_en) {
5655 /* numPortListIndex (1 byte) */
5656 uint8_t num_port_list_index;
5657 proto_tree_add_item_ret_uint8(extension_tree, hf_oran_num_port_list_index, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &num_port_list_index);
5658 offset += 1;
5659
5660 /* portListIndex (1 byte) */
5661 for (unsigned port=0; port < num_port_list_index; port++) {
5662 proto_item *ti = proto_tree_add_item(extension_tree, hf_oran_port_list_index, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5663 proto_item_append_text(ti, " (idx %u)", port+1);
5664 offset += 1;
5665 }
5666 }
5667
5668 break;
5669 }
5670
5671 case 35: /* TODO: Codebook-based beamforming parameters */
5672
5673 default:
5674 {
5675 /* Not handled above. Offer the SE to an external dissector. */
5676 /* If one handles it, use the number of bytes it dissected; */
5677 /* otherwise fall back to flagging it as unsupported. */
5678 int dissected = 0;
5679 unsigned se_end = extension_start_offset + (extlen*4);
5680 oran_se_info se_info;
5681 se_info.exttype = exttype;
5682 se_info.extlen = extlen;
5683 se_info.startPrbc = startPrbc;
5684 se_info.numPrbc = numPrbc;
5685 se_info.extension_ti = extension_ti;
5686 se_info.exttype_ti = exttype_ti;
5687
5688 /* Subset tvb covering just the SE payload */
5689 tvbuff_t *se_tvb = tvb_new_subset_length(tvb, offset, se_end-offset);
5690 dissected = dissector_try_uint_with_data(oran_sectionextension_table, exttype,
5691 se_tvb, pinfo, extension_tree, true1, &se_info);
5692
5693 if (dissected > 0) {
5694 offset += dissected;
5695 break;
5696 }
5697
5698 /* Other/unexpected extension types */
5699 expert_add_info_format(pinfo, exttype_ti, &ei_oran_unhandled_se,
5700 "SE %u (%s) not supported by dissector",
5701 exttype, val_to_str_ext_const(exttype, &exttype_vals_ext, "Reserved"));
5702 ext_unhandled = true1;
5703 break;
5704 }
5705 }
5706
5707 /* Check offset compared with extlen. There should be 0-3 bytes of padding */
5708 int num_padding_bytes = (extension_start_offset + (extlen*4) - offset);
5709 if (!ext_unhandled && ((num_padding_bytes<0) || (num_padding_bytes>3))) {
5710 expert_add_info_format(pinfo, extlen_ti, &ei_oran_extlen_wrong,
5711 "extlen signalled %u bytes (+ 0-3 bytes padding), but %u were dissected",
5712 extlen*4, offset-extension_start_offset);
5713 }
5714
5715 /* Move offset to beyond signalled length of extension */
5716 offset = extension_start_offset + (extlen*4);
5717
5718 /* Set length of extension header. */
5719 proto_item_set_len(extension_ti, extlen*4);
5720 }
5721 /* End of section extension handling */
5722
5723 /* Tap section beamId if not overwritten by SEs */
5724 if (!section_beamId_ignored && section_beamId != 0) {
5725 add_beam_id_to_tap(tap_info, section_beamId);
5726 }
5727
5728
5729 /* RRM measurement reports have measurement reports *after* extensions */
5730 if ((sectionType == SEC_C_RRM_MEAS_REPORTS) || /* Section Type 10 */
5731 (sectionType == SEC_C_RRM_MEAS_REPORTS_NON_TIMING)) /* Section Type 13 */
5732 {
5733 /* Hidden filter for bf (DMFS-BF). No BF weights though.. */
5734 bf_ti = proto_tree_add_item(c_section_tree, hf_oran_bf, tvb, 0, 0, ENC_NA0x00000000);
5735 PROTO_ITEM_SET_HIDDEN(bf_ti)proto_item_set_hidden((bf_ti));
5736
5737 bool_Bool mf;
5738 do {
5739 /* Measurement report subtree */
5740 proto_item *mr_ti = proto_tree_add_string_format(c_section_tree, hf_oran_measurement_report,
5741 tvb, offset, 1, "", "Measurement Report");
5742 proto_tree *mr_tree = proto_item_add_subtree(mr_ti, ett_oran_measurement_report);
5743 unsigned report_start_offset = offset;
5744
5745 /* measurement flag (i.e., more reports after this one) (1 bit) */
5746 proto_tree_add_item_ret_boolean(mr_tree, hf_oran_mf, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &mf);
5747
5748 /* measTypeId (7 bits) */
5749 uint32_t meas_type_id;
5750 proto_item *meas_type_id_ti;
5751 meas_type_id_ti = proto_tree_add_item_ret_uint(mr_tree, hf_oran_meas_type_id, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &meas_type_id);
5752 offset += 1;
5753
5754 /* Common to all measurement types */
5755 unsigned num_elements = 0;
5756 if (meas_type_id == 6) {
5757 /* numElements */
5758 proto_tree_add_item_ret_uint(mr_tree, hf_oran_num_elements, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &num_elements);
5759 }
5760 else {
5761 /* All other meas ids have a reserved byte */
5762 add_reserved_field(mr_tree, hf_oran_reserved_8bits, tvb, offset, 1);
5763 }
5764 offset += 1;
5765
5766 /* measDataSize (16 bits). N.B. begins at mf field, i.e. 2 bytes before this one */
5767 unsigned meas_data_size;
5768 proto_item *meas_data_size_ti;
5769 meas_data_size_ti = proto_tree_add_item_ret_uint(mr_tree, hf_oran_meas_data_size, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &meas_data_size);
5770 meas_data_size *= 4;
5771 proto_item_append_text(meas_data_size_ti, " (%u bytes)", meas_data_size);
5772 offset += 2;
5773
5774 /* Summary for measurement report root */
5775 proto_item_append_text(mr_ti, " (measTypeId=%u - %s)",
5776 meas_type_id, val_to_str_const(meas_type_id, meas_type_id_vals, "unknown"));
5777 /* And section header */
5778 proto_item_append_text(tree, " (%s)", val_to_str_const(meas_type_id, meas_type_id_vals, "unknown"));
5779 /* And Info column */
5780 col_append_fstr(pinfo->cinfo, COL_INFO, " (%s)", val_to_str_const(meas_type_id, meas_type_id_vals, "unknown"));
5781
5782 /* Handle specific message type fields */
5783 switch (meas_type_id) {
5784 case 1:
5785 {
5786 /* ueTae */
5787 unsigned ue_tae;
5788 proto_item *ue_tae_ti;
5789 ue_tae_ti = proto_tree_add_item_ret_uint(mr_tree, hf_oran_ue_tae, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &ue_tae);
5790 /* Show if maps onto a -ve number */
5791 if ((ue_tae >= 0x8ad0) && (ue_tae <= 0xffff)) {
5792 proto_item_append_text(ue_tae_ti, "(value %d)", -1 - (0xffff-ue_tae));
5793 }
5794 offset += 2;
5795
5796 /* Reserved (16 bits) */
5797 add_reserved_field(mr_tree, hf_oran_reserved_16bits, tvb, offset, 2);
5798 offset += 2;
5799 break;
5800 }
5801 case 2:
5802 /* ueLayerPower entries, one for each UEId */
5803 /* i.e., should loop over 0-number_of_ues? */
5804 for (unsigned ueid_index=0; ueid_index < number_of_ueids; ueid_index++) {
5805 unsigned ue_layer_power;
5806 proto_item *ue_layer_power_ti;
5807 /* ueLayerPower */
5808 ue_layer_power_ti = proto_tree_add_item_ret_uint(mr_tree, hf_oran_ue_layer_power, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &ue_layer_power);
5809 /* Show if maps onto a -ve number */
5810 if ((ue_layer_power >= 0x8ad0) && (ue_layer_power <= 0xffff)) {
5811 proto_item_append_text(ue_layer_power_ti, "(value %d) (ueId=%u)", -1 - (0xffff-ue_layer_power), ueids[ueid_index]);
5812 }
5813 offset += 2;
5814 }
5815 /* padding out to 4 bytes */
5816 break;
5817 case 3:
5818 {
5819 /* ueFreqOffset */
5820 unsigned ue_freq_offset;
5821 proto_item *ue_freq_offset_ti;
5822 ue_freq_offset_ti = proto_tree_add_item_ret_uint(mr_tree, hf_oran_ue_freq_offset, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &ue_freq_offset);
5823 /* Show if maps onto a -ve number */
5824 if ((ue_freq_offset >= 0x8ad0) && (ue_freq_offset <= 0xffff)) {
5825 proto_item_append_text(ue_freq_offset_ti, "(value %d)", -1 - (0xffff-ue_freq_offset));
5826 }
5827 offset += 2;
5828
5829 /* currUeFreqOffset (16 bits) */
5830 unsigned curr_ue_freq_offset;
5831 proto_item *curr_ue_freq_offset_ti;
5832 curr_ue_freq_offset_ti = proto_tree_add_item_ret_uint(mr_tree, hf_oran_curr_ue_freq_offset, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &curr_ue_freq_offset);
5833 /* Show if maps onto a -ve number */
5834 if ((curr_ue_freq_offset >= 0x8ad0) && (curr_ue_freq_offset <= 0xffff)) {
5835 proto_item_append_text(curr_ue_freq_offset_ti, "(value %d)", -1 - (0xffff-curr_ue_freq_offset));
5836 }
5837 offset += 2;
5838 break;
5839 }
5840 case 4:
5841 case 5:
5842 /* reserved (2 bits) */
5843 add_reserved_field(mr_tree, hf_oran_reserved_2bits, tvb, offset, 1);
5844 /* symbolMask (14 bits) */
5845 offset = dissect_symbolmask(tvb, mr_tree, offset, NULL((void*)0), NULL((void*)0));
5846
5847 /* 2 bytes for each PRB ipnPower */
5848 for (unsigned prb=0; prb<MAX_PRBS273; prb++) {
5849 /* Skip if should not be reported */
5850 if (!prbs_for_st10_type5[prb]) {
5851 continue;
5852 }
5853 unsigned ipn_power;
5854 proto_item *ipn_power_ti;
5855 /* ipnPower (2 bytes) */
5856 ipn_power_ti = proto_tree_add_item_ret_uint(mr_tree, hf_oran_ipn_power, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &ipn_power);
5857 proto_item_append_text(ipn_power_ti, " (PRB %3d)", prb);
5858 /* Show if maps onto a -ve number */
5859 if ((ipn_power >= 0x8ad0) && (ipn_power <= 0xffff)) {
5860 proto_item_append_text(ipn_power_ti, " (value %d)", -1 - (0xffff-ipn_power));
5861 }
5862 offset += 2;
5863 }
5864 /* padding out to 4 bytes */
5865 break;
5866 case 6:
5867 /* antDmrsSnrVal entries */
5868 for (unsigned n=0; n < num_elements; n++) {
5869 unsigned snr_value;
5870 proto_item *snr_value_ti;
5871 /* antDmrsSnrVal (2 bytes) */
5872 snr_value_ti = proto_tree_add_item_ret_uint(mr_tree, hf_oran_ant_dmrs_snr_val, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &snr_value);
5873 proto_item_append_text(snr_value_ti, " (elem %2u)", n+1);
5874 /* Show if maps onto a -ve number */
5875 if ((snr_value >= 0x8ad0) && (snr_value <= 0xffff)) {
5876 proto_item_append_text(snr_value_ti, " (value %d)", -1 - (0xffff-snr_value));
5877 }
5878 offset += 2;
5879 }
5880 break;
5881 case 7:
5882 {
5883 /* UE positioning measurement report */
5884 float start_value;
5885
5886 /* ueAzAoa (16 bits) */
5887 uint32_t ue_az_aoa;
5888 proto_item *ue_az_aoa_ti = proto_tree_add_item_ret_uint(mr_tree, hf_oran_ue_az_aoa, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &ue_az_aoa);
5889 if (ue_az_aoa <= 0xE0F) {
5890 if (ue_az_aoa >= 0x0708) {
5891 start_value = (ue_az_aoa-0x0708) * (float)0.1;
5892 proto_item_append_text(ue_az_aoa_ti, " (%.1f <= val < %.1f degrees)", start_value, start_value + (float)0.1);
5893 }
5894 else {
5895 start_value = 180 + (ue_az_aoa * (float)0.1);
5896 proto_item_append_text(ue_az_aoa_ti, " (%.1f <= val < %.1f degrees)", start_value, start_value + (float)0.1);
5897 }
5898 }
5899 else if (ue_az_aoa == 0xffff) {
5900 proto_item_append_text(ue_az_aoa_ti, " (invalid measurement result)");
5901 }
5902 else {
5903 proto_item_append_text(ue_az_aoa_ti, " (reserved)");
5904 }
5905 offset += 2;
5906
5907 /* Reserved (16 bits) */
5908 add_reserved_field(mr_tree, hf_oran_reserved_16bits, tvb, offset, 2);
5909 offset += 2;
5910
5911 /* ueZeAoa (16 bits) */
5912 uint32_t ue_ze_aoa;
5913 proto_item *ue_ze_aoa_ti = proto_tree_add_item_ret_uint(mr_tree, hf_oran_ue_ze_aoa, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &ue_ze_aoa);
5914 if (ue_ze_aoa <= 0x707) {
5915 start_value = ue_ze_aoa * (float)0.1;
5916 proto_item_append_text(ue_ze_aoa_ti, " (%.1f <= val < %.1f degrees)", start_value, start_value + (float)0.1);
5917 }
5918 else if (ue_ze_aoa == 0xffff) {
5919 proto_item_append_text(ue_ze_aoa_ti, " (invalid measurement result)");
5920 }
5921 else {
5922 proto_item_append_text(ue_ze_aoa_ti, " (reserved)");
5923 }
5924 offset += 2;
5925
5926 /* Reserved (16 bits) */
5927 add_reserved_field(mr_tree, hf_oran_reserved_16bits, tvb, offset, 2);
5928 offset += 2;
5929
5930 /* uePosToaOffset (16 bits) */
5931 uint32_t ue_pos_toa_offset;
5932 proto_item *ue_pos_toa_offset_ti = proto_tree_add_item_ret_uint(mr_tree, hf_oran_ue_pos_toa_offset, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &ue_pos_toa_offset);
5933 if (ue_pos_toa_offset == 0) {
5934 proto_item_append_text(ue_pos_toa_offset_ti, " (no UE ToA offset, 0 symbols)");
5935 }
5936 else if (ue_pos_toa_offset <= 0x7fff) {
5937 proto_item_append_text(ue_pos_toa_offset_ti, " (+ve UE ToA offset)");
5938 }
5939 else if (ue_pos_toa_offset == 0x8000) {
5940 proto_item_append_text(ue_pos_toa_offset_ti, " (invalid measurement result)");
5941 }
5942 else {
5943 proto_item_append_text(ue_pos_toa_offset_ti, " (-ve UE ToA offset)");
5944 }
5945 offset += 2;
5946
5947 /* Reserved (16 bits) */
5948 add_reserved_field(mr_tree, hf_oran_reserved_16bits, tvb, offset, 2);
5949 offset += 2;
5950 break;
5951 }
5952 case 8:
5953 {
5954 /* UE radial speed measurement report */
5955
5956 /* ueRadialSpeed (16 bits) */
5957 uint32_t radial_speed;
5958 proto_item *radial_speed_ti = proto_tree_add_item_ret_uint(mr_tree, hf_oran_ue_radial_speed, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &radial_speed);
5959 if (radial_speed <= 10000) {
5960 proto_item_append_text(radial_speed_ti, " (%.1f km/h)", radial_speed * (float)0.1);
5961 }
5962 else if (radial_speed == 0x8000) {
5963 proto_item_append_text(radial_speed_ti, " (invalid measurement result)");
5964 }
5965 else {
5966 proto_item_append_text(radial_speed_ti, " (reserved value)");
5967 }
5968 offset += 2;
5969
5970 /* Reserved (16 bits) */
5971 add_reserved_field(mr_tree, hf_oran_reserved_16bits, tvb, offset, 2);
5972 offset += 2;
5973 break;
5974 }
5975 case 9:
5976 {
5977 /* TODO: UE post-equalization MU interference measurement */
5978
5979 /* reserved (16 bits) */
5980 add_reserved_field(mr_tree, hf_oran_reserved_16bits, tvb, offset, 2);
5981 offset += 2;
5982
5983 /* TODO: muInterferenceLevel (all layers * all PRB blocks) */
5984 break;
5985 }
5986 case 10:
5987 {
5988 /* UE TPMI and rank recommendation measurement */
5989
5990 /* numCandRanks (4 bits - only 1-4 valid) */
5991 uint8_t num_cand_ranks;
5992 proto_tree_add_item_ret_uint8(mr_tree, hf_oran_num_cand_ranks, tvb, offset, 1, ENC_NA0x00000000, &num_cand_ranks);
5993 if (num_cand_ranks > 4) {
5994 num_cand_ranks = 4;
5995 }
5996 if (num_cand_ranks < 1) {
5997 num_cand_ranks = 1;
5998 }
5999
6000 /* uePrefRank (4 bits) */
6001 proto_tree_add_item(mr_tree, hf_oran_ue_pref_rank, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
6002 offset += 1;
6003
6004 for (uint8_t cand_rank=1; cand_rank <= num_cand_ranks; cand_rank++) {
6005 /* ueTpmiRankY (1 byte) */
6006 proto_item *rank_y_ti = proto_tree_add_item(mr_tree, hf_oran_ue_tpmi_rank_y,
6007 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
6008 proto_item_append_text(rank_y_ti, " (rank %u)", cand_rank);
6009
6010 offset += 1;
6011
6012 for (uint8_t sinr = 1; sinr <= cand_rank; sinr++) {
6013 /* ueTpmiRankYSinrLX (2 bytes) */
6014 proto_item *rank_y_sinr_x_ti = proto_tree_add_item(mr_tree, hf_oran_ue_tpmi_rank_y_sinr_lx,
6015 tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
6016 proto_item_append_text(rank_y_sinr_x_ti, " (rank %u, sinr %u)", cand_rank, sinr);
6017 offset += 2;
6018 }
6019 }
6020 break;
6021 }
6022 case 11:
6023 {
6024 /* UE layer pre-equalization SINR report */
6025 /* TODO: how to know how many layers? Just fill up available data? */
6026 unsigned num_layers = (meas_data_size > 4) ? (meas_data_size - 4) / 2 : 0;
6027 for (unsigned layer=0; layer < num_layers; layer++) {
6028 /* ueLayerPreEqSinr (2 bytes each) */
6029 proto_item *pre_eq_sinr_ti = proto_tree_add_item(mr_tree, hf_oran_ue_layer_pre_eq_sinr,
6030 tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
6031 proto_item_append_text(pre_eq_sinr_ti, " (layer %u)", layer);
6032 offset += 2;
6033 }
6034 break;
6035 }
6036 case 12:
6037 {
6038 /* SRS UE port wideband signal power measurement report */
6039 /* srsMeasPortMask (2 bytes) */
6040 uint16_t srs_meas_port_mask;
6041 proto_tree_add_item_ret_uint16(mr_tree, hf_oran_srs_meas_port_mask, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &srs_meas_port_mask);
6042 offset += 2;
6043
6044 for (unsigned p=0; p < 16; p++) {
6045 if ((1<<p) & srs_meas_port_mask) {
6046 /* srsUePortWbPower (one for each port mask bit set) */
6047 proto_item *wb_power_ti = proto_tree_add_item(mr_tree, hf_oran_srs_ue_port_wb_power, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
6048 proto_item_append_text(wb_power_ti, " (antenna port %u)", p);
6049 offset += 2;
6050 }
6051 }
6052 break;
6053 }
6054 case 13:
6055 {
6056 /* SRS UE port wideband SINR measurement report */
6057 /* srsMeasPortMask (2 bytes) */
6058 uint16_t srs_meas_port_mask;
6059 proto_tree_add_item_ret_uint16(mr_tree, hf_oran_srs_meas_port_mask, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &srs_meas_port_mask);
6060 offset += 2;
6061
6062 for (unsigned p=0; p < 16; p++) {
6063 if ((1<<p) & srs_meas_port_mask) {
6064 /* srsUePortWbSinr (one for each port mask bit set) */
6065 proto_item *sinr_ti = proto_tree_add_item(mr_tree, hf_oran_srs_ue_port_wb_sinr, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
6066 proto_item_append_text(sinr_ti, " (antenna port %u)", p);
6067 offset += 2;
6068 }
6069 }
6070 break;
6071 }
6072 /* TODO: new measurement types */
6073 case 14:
6074 case 15:
6075 case 16:
6076 case 17:
6077 case 18:
6078 case 19:
6079 case 20:
6080 case 21:
6081 case 22:
6082 case 23:
6083 case 24:
6084
6085 default:
6086 /* Anything else is not expected */
6087 expert_add_info_format(pinfo, meas_type_id_ti, &ei_oran_unexpected_measTypeId,
6088 "measTypeId %u (%s) not supported - only 1-6 are expected",
6089 meas_type_id,
6090 val_to_str_const(meas_type_id, meas_type_id_vals, "reserved"));
6091 break;
6092
6093 }
6094
6095 /* Pad out to next 4 bytes */
6096 offset += WS_PADDING_TO_4(offset-report_start_offset)((4U - ((offset-report_start_offset) % 4U)) % 4U);
6097
6098 /* TODO: verify dissected size of report vs meas_data_size? */
6099
6100 /* End of measurement report tree */
6101 proto_item_set_end(mr_ti, tvb, offset);
6102 } while (mf);
6103 }
6104
6105 /* Request for RRM Measurements has measurement commands after extensions */
6106 else if (sectionType == SEC_C_REQUEST_RRM_MEAS) /* Section Type 11 */
6107 {
6108 bool_Bool mf = true1;
6109 do {
6110 /* Measurement command subtree */
6111 proto_item *mc_ti = proto_tree_add_string_format(c_section_tree, hf_oran_measurement_command,
6112 tvb, offset, 8, "", "Measurement Command");
6113 proto_tree *mc_tree = proto_item_add_subtree(mc_ti, ett_oran_measurement_command);
6114
6115 /* mf (1 bit). 1st measurement command is always preset */
6116 proto_tree_add_item_ret_boolean(mc_tree, hf_oran_mf, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &mf);
6117
6118 /* measTypeId (7 bits) */
6119 uint32_t meas_type_id;
6120 proto_item *meas_type_id_ti;
6121 meas_type_id_ti = proto_tree_add_item_ret_uint(mc_tree, hf_oran_meas_type_id, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &meas_type_id);
6122 offset += 1;
6123
6124 proto_item *meas_command_ti;
6125 uint32_t meas_command_size;
6126
6127 switch (meas_type_id) {
6128 case 5: /* command for IpN for unallocated PRBs */
6129 /* reserved (1 byte) */
6130 add_reserved_field(mc_tree, hf_oran_reserved_8bits, tvb, offset, 1);
6131 offset += 1;
6132 /* measCmdSize. Presumably number of words so in future could skip unrecognised command types.. */
6133 meas_command_ti = proto_tree_add_item_ret_uint(mc_tree, hf_oran_meas_cmd_size, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &meas_command_size);
6134 proto_item_append_text(meas_command_ti, " (%u bytes)", meas_command_size*4);
6135 offset += 2;
6136 /* reserved (2 bits) */
6137 add_reserved_field(mc_tree, hf_oran_reserved_2bits, tvb, offset, 1);
6138 /* symbolMask (14 bits) */
6139 offset = dissect_symbolmask(tvb, mc_tree, offset, NULL((void*)0), NULL((void*)0));
6140 /* reserved (16 bits) */
6141 add_reserved_field(mc_tree, hf_oran_reserved_16bits, tvb, offset, 2);
6142 offset += 2;
6143 break;
6144
6145 default:
6146 /* Anything else is not expected */
6147 expert_add_info_format(pinfo, meas_type_id_ti, &ei_oran_unexpected_measTypeId,
6148 "measTypeId %u (%s) not supported - only 5 is expected",
6149 meas_type_id,
6150 val_to_str_const(meas_type_id, meas_type_id_vals, "reserved"));
6151 break;
6152 }
6153 proto_item_append_text(mc_ti, " (%s)", val_to_str_const(meas_type_id, meas_type_id_vals, "unknown"));
6154
6155 } while (mf);
6156 }
6157
6158 /* Set extent of overall section */
6159 proto_item_set_len(sectionHeading, offset);
6160
6161 return offset;
6162}
6163
6164/* Dissect udCompHdr (user data compression header, 7.5.2.10) */
6165/* bit_width and comp_meth are out params */
6166static int dissect_udcomphdr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, unsigned offset,
6167 bool_Bool cplane, bool_Bool ignore,
6168 unsigned *bit_width, unsigned *comp_meth, proto_item **comp_meth_ti,
6169 oran_tap_info *tap_info)
6170{
6171 /* Subtree */
6172 proto_item *udcomphdr_ti = proto_tree_add_string_format(tree, hf_oran_udCompHdr,
6173 tvb, offset, 1, "",
6174 "udCompHdr");
6175 proto_tree *udcomphdr_tree = proto_item_add_subtree(udcomphdr_ti, ett_oran_udcomphdr);
6176
6177 uint8_t byte = tvb_get_uint8(tvb, offset);
6178 uint32_t hdr_iq_width = 0, ud_comp_meth = 0;
6179
6180 /* Don't dissect fields if ignored and correctly set to 0 */
6181 if (!(ignore && byte == 0)) {
6182 /* udIqWidth */
6183
6184 proto_item *iq_width_item = proto_tree_add_item_ret_uint(udcomphdr_tree, hf_oran_udCompHdrIqWidth , tvb, offset, 1, ENC_NA0x00000000, &hdr_iq_width);
6185 proto_item_append_text(iq_width_item, " (%u bits)", (hdr_iq_width) ? hdr_iq_width : 16);
6186
6187 /* udCompMeth */
6188 *comp_meth_ti = proto_tree_add_item_ret_uint(udcomphdr_tree, hf_oran_udCompHdrMeth, tvb, offset, 1, ENC_NA0x00000000, &ud_comp_meth);
6189
6190 /* An ignored header does not change the settings */
6191 if (!ignore) {
6192 *bit_width = (hdr_iq_width) ? hdr_iq_width : 16;
6193 if (comp_meth) {
6194 *comp_meth = ud_comp_meth;
6195 }
6196 }
6197 }
6198
6199 /* Populate tap header with compression settings */
6200 if (!ignore) {
6201 tap_info->compression_methods |= (1 << ud_comp_meth);
6202 tap_info->compression_width = MAX(tap_info->compression_width, hdr_iq_width)(((tap_info->compression_width) > (hdr_iq_width)) ? (tap_info
->compression_width) : (hdr_iq_width))
;
6203 /* Summary */
6204 proto_item_append_text(udcomphdr_ti, " (IqWidth=%u, udCompMeth=%s)",
6205 *bit_width, rval_to_str_const(ud_comp_meth, ud_comp_header_meth, "Unknown"));
6206 }
6207 else {
6208 proto_item_append_text(udcomphdr_ti, " (ignored)");
6209 if (hdr_iq_width || ud_comp_meth) {
6210 if (cplane) {
6211 /* Only ignoring in DL for cplane */
6212 expert_add_info_format(pinfo, udcomphdr_ti, &ei_oran_udcomphdr_should_be_zero,
6213 "udCompHdr in C-Plane for DL should be 0 - found 0x%02x",
6214 tvb_get_uint8(tvb, offset));
6215 }
6216 else {
6217 /* TODO: Ignore UL if using m-plane/preference setting rather than c-plane, but wrong to be set? */
6218 /* expert_add_info_format(pinfo, udcomphdr_ti, &ei_oran_udcomphdr_should_be_zero,
6219 "udCompHdr in C-Plane for UL should be 0 - found 0x%02x",
6220 tvb_get_uint8(tvb, offset));
6221 */
6222 }
6223 }
6224 }
6225 return offset+1;
6226}
6227
6228/* Dissect udCompParam (user data compression parameter, 8.3.3.15) */
6229/* bit_width and comp_meth are out params */
6230static int dissect_udcompparam(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, unsigned offset,
6231 unsigned comp_meth,
6232 uint32_t *exponent, uint16_t *sReSMask,
6233 bool_Bool for_sinr)
6234{
6235 if (for_sinr && (comp_meth != COMP_BLOCK_FP1)) {
6236 /* sinrCompParam only present when bfp is used */
6237 return offset;
6238 }
6239
6240 if (comp_meth == COMP_NONE0 ||
6241 comp_meth == COMP_MODULATION4 ||
6242 comp_meth == MOD_COMPR_AND_SELECTIVE_RE_WITH_MASKS8) {
6243
6244 /* Not even creating a subtree for udCompMeth 0, 4, 8 */
6245 return offset;
6246 }
6247
6248 /* Subtree */
6249 unsigned start_offset = offset;
6250 proto_item *udcompparam_ti = proto_tree_add_string_format(tree, hf_oran_udCompParam,
6251 tvb, offset, 1, "",
6252 (for_sinr) ? "sinrCompParam" : "udCompParam");
6253 proto_tree *udcompparam_tree = proto_item_add_subtree(udcompparam_ti, ett_oran_udcompparam);
6254
6255 /* Show comp_meth as a generated field */
6256 proto_item *meth_ti = proto_tree_add_uint(udcompparam_tree, hf_oran_udCompHdrMeth_pref, tvb, 0, 0, comp_meth);
6257 proto_item_set_generated(meth_ti);
6258
6259 uint32_t param_exponent;
6260 uint64_t param_sresmask;
6261
6262 static int * const sres_mask_flags[] = {
6263 &hf_oran_sReSMask_re12,
6264 &hf_oran_sReSMask_re11,
6265 &hf_oran_sReSMask_re10,
6266 &hf_oran_sReSMask_re9,
6267 &hf_oran_sReSMask_re8,
6268 &hf_oran_sReSMask_re7,
6269 &hf_oran_sReSMask_re6,
6270 &hf_oran_sReSMask_re5,
6271 &hf_oran_sReSMask_re4,
6272 &hf_oran_sReSMask_re3,
6273 &hf_oran_sReSMask_re2,
6274 &hf_oran_sReSMask_re1,
6275 NULL((void*)0)
6276 };
6277
6278 switch (comp_meth) {
6279 case COMP_BLOCK_FP1: /* 1 */
6280 case BFP_AND_SELECTIVE_RE_WITH_MASKS7: /* 7 */
6281 /* reserved (4 bits) */
6282 add_reserved_field(udcompparam_tree, hf_oran_reserved_4bits, tvb, offset, 1);
6283 /* exponent (4 bits) */
6284 proto_tree_add_item_ret_uint(udcompparam_tree, hf_oran_exponent,
6285 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &param_exponent);
6286 *exponent = param_exponent;
6287 proto_item_append_text(udcompparam_ti, " (Exponent=%u)", param_exponent);
6288 offset += 1;
6289 break;
6290
6291 case COMP_BLOCK_SCALE2: /* 2 */
6292 /* Separate into integer and fractional bits? */
6293 proto_tree_add_item(udcompparam_tree, hf_oran_blockScaler,
6294 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
6295 offset++;
6296 break;
6297
6298 case COMP_U_LAW3: /* 3 */
6299 /* compBitWidth, compShift */
6300 proto_tree_add_item(udcompparam_tree, hf_oran_compBitWidth,
6301 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
6302 proto_tree_add_item(udcompparam_tree, hf_oran_compShift,
6303 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
6304 offset += 1;
6305 break;
6306
6307 case BFP_AND_SELECTIVE_RE5: /* 5 */
6308 {
6309 /* sReSMask (exponent in middle!) */
6310 proto_item *sresmask_ti;
6311 sresmask_ti = proto_tree_add_bitmask_ret_uint64(udcompparam_tree, tvb, offset,
6312 hf_oran_sReSMask,
6313 ett_oran_sresmask,
6314 sres_mask_flags,
6315 ENC_NA0x00000000,
6316 &param_sresmask);
6317
6318 /* Get rid of exponent-shaped gap */
6319 param_sresmask = ((param_sresmask >> 4) & 0x0f00) | (param_sresmask & 0xff);
6320 unsigned res = 0;
6321 for (unsigned n=0; n < 12; n++) {
6322 if ((param_sresmask >> n) & 0x1) {
6323 res++;
6324 }
6325 }
6326 proto_item_append_text(sresmask_ti, " (%2u REs)", res);
6327
6328 /* exponent */
6329 proto_tree_add_item_ret_uint(udcompparam_tree, hf_oran_exponent,
6330 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &param_exponent);
6331 *sReSMask = (uint16_t)param_sresmask;
6332 *exponent = param_exponent;
6333
6334 proto_item_append_text(udcompparam_ti, " (exponent=%u, %u REs)", *exponent, res);
6335 offset += 2;
6336 break;
6337 }
6338
6339 case MOD_COMPR_AND_SELECTIVE_RE6: /* 6 */
6340 {
6341 /* sReSMask (exponent in middle!) */
6342 proto_item *sresmask_ti;
6343
6344 sresmask_ti = proto_tree_add_bitmask_ret_uint64(udcompparam_tree, tvb, offset,
6345 hf_oran_sReSMask,
6346 ett_oran_sresmask,
6347 sres_mask_flags,
6348 ENC_NA0x00000000,
6349 &param_sresmask);
6350
6351 /* Get rid of reserved-shaped gap */
6352 param_sresmask = ((param_sresmask >> 4) & 0x0f00) | (param_sresmask & 0xff);
6353 unsigned res = 0;
6354 for (unsigned n=0; n < 12; n++) {
6355 if ((param_sresmask >> n) & 0x1) {
6356 res++;
6357 }
6358 }
6359 proto_item_append_text(sresmask_ti, " (%u REs)", res);
6360
6361 /* reserved (4 bits) */
6362 add_reserved_field(udcompparam_tree, hf_oran_reserved_last_4bits, tvb, offset, 1);
6363 *sReSMask = (uint16_t)param_sresmask;
6364
6365 proto_item_append_text(udcompparam_ti, " (%u REs)", res);
6366 offset += 2;
6367 break;
6368 }
6369
6370 default:
6371 /* reserved (set to all zeros), but how many bytes?? */
6372 break;
6373 }
6374
6375 proto_item_set_len(udcompparam_ti, offset-start_offset);
6376 return offset;
6377}
6378
6379
6380/* Dissect ciCompHdr (channel information compression header, 7.5.2.15) */
6381/* bit_width and comp_meth are out params */
6382static int dissect_cicomphdr(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, unsigned offset,
6383 unsigned *bit_width, unsigned *comp_meth, uint8_t *comp_opt)
6384{
6385 /* Subtree */
6386 proto_item *cicomphdr_ti = proto_tree_add_string_format(tree, hf_oran_ciCompHdr,
6387 tvb, offset, 1, "",
6388 "ciCompHdr");
6389 proto_tree *cicomphdr_tree = proto_item_add_subtree(cicomphdr_ti, ett_oran_cicomphdr);
6390
6391 /* ciIqWidth */
6392 uint32_t hdr_iq_width;
6393 proto_item *iq_width_item = proto_tree_add_item_ret_uint(cicomphdr_tree, hf_oran_ciCompHdrIqWidth , tvb, offset, 1, ENC_NA0x00000000, &hdr_iq_width);
6394 hdr_iq_width = (hdr_iq_width) ? hdr_iq_width : 16;
6395 if (bit_width) {
6396 *bit_width = hdr_iq_width;
6397 }
6398 proto_item_append_text(iq_width_item, " (%u bits)", hdr_iq_width);
6399
6400 /* ciCompMeth */
6401 uint32_t ci_comp_meth;
6402 proto_tree_add_item_ret_uint(cicomphdr_tree, hf_oran_ciCompHdrMeth, tvb, offset, 1, ENC_NA0x00000000, &ci_comp_meth);
6403 if (comp_meth) {
6404 *comp_meth = ci_comp_meth;
6405 }
6406
6407 /* ciCompOpt */
6408 uint32_t opt;
6409 proto_tree_add_item_ret_uint(cicomphdr_tree, hf_oran_ciCompOpt, tvb, offset, 1, ENC_NA0x00000000, &opt);
6410 *comp_opt = opt;
6411 offset += 1;
6412
6413 /* Summary */
6414 proto_item_append_text(cicomphdr_ti, " (IqWidth=%u, ciCompMeth=%s, ciCompOpt=%s)",
6415 hdr_iq_width,
6416 rval_to_str_const(ci_comp_meth, ud_comp_header_meth, "Unknown"),
6417 (*comp_opt) ? "compression per PRB" : "compression per UE");
6418 return offset;
6419}
6420
6421static void dissect_payload_version(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, unsigned offset)
6422{
6423 unsigned version;
6424 proto_item *ti = proto_tree_add_item_ret_uint(tree, hf_oran_payload_version, tvb, offset, 1, ENC_NA0x00000000, &version);
6425 if (version != 1) {
6426 expert_add_info_format(pinfo, ti, &ei_oran_version_unsupported,
6427 "PayloadVersion %u not supported by dissector (only 1 is known)",
6428 version);
6429 /* TODO: should throw an exception? */
6430 }
6431}
6432
6433/* Time from earlier to later in units of unit_ns nanoseconds, rounded.
6434 0 if later is before earlier, and at most UINT32_MAX */
6435static uint32_t time_gap(const nstime_t *later, const nstime_t *earlier, uint32_t unit_ns)
6436{
6437 nstime_t delta;
6438 nstime_delta(&delta, later, earlier);
6439 if (delta.secs < 0 || (delta.secs == 0 && delta.nsecs < 0)) {
6440 return 0;
6441 }
6442 if ((uint64_t)delta.secs >= UINT32_MAX(4294967295U)) {
6443 return UINT32_MAX(4294967295U);
6444 }
6445 uint64_t units = ((uint64_t)delta.secs * (1000000000 / unit_ns)) +
6446 (((uint64_t)delta.nsecs + unit_ns/2) / unit_ns);
6447 return (uint32_t)MIN(units, UINT32_MAX)(((units) < ((4294967295U))) ? (units) : ((4294967295U)));
6448}
6449
6450static void show_link_to_acknack_request(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo,
6451 ack_nack_request_t *request)
6452{
6453 /* Request frame */
6454 proto_item *ti = proto_tree_add_uint(tree, hf_oran_acknack_request_frame,
6455 tvb, 0, 0, request->request_frame_number);
6456 PROTO_ITEM_SET_GENERATED(ti)proto_item_set_generated((ti));
6457
6458 /* Work out gap between frames (in ms) */
6459 uint32_t total_gap = time_gap(&pinfo->abs_ts, &request->request_frame_time, 1000000);
6460
6461 ti = proto_tree_add_uint(tree, hf_oran_acknack_request_time,
6462 tvb, 0, 0, total_gap);
6463 PROTO_ITEM_SET_GENERATED(ti)proto_item_set_generated((ti));
6464
6465 /* Type of request */
6466 ti = proto_tree_add_uint(tree, hf_oran_acknack_request_type,
6467 tvb, 0, 0, request->requestType);
6468 PROTO_ITEM_SET_GENERATED(ti)proto_item_set_generated((ti));
6469}
6470
6471static void show_link_to_acknack_response(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo,
6472 ack_nack_request_t *response)
6473{
6474 if (response->response_frame_number == 0) {
6475 /* Requests may not get a response, and can't always tell when to expect one */
6476 return;
6477 }
6478
6479 /* Response frame */
6480 proto_item *ti = proto_tree_add_uint(tree, hf_oran_acknack_response_frame,
6481 tvb, 0, 0, response->response_frame_number);
6482 PROTO_ITEM_SET_GENERATED(ti)proto_item_set_generated((ti));
6483
6484 /* Work out gap between frames (in ms) */
6485 uint32_t total_gap = time_gap(&response->response_frame_time, &pinfo->abs_ts, 1000000);
6486
6487 ti = proto_tree_add_uint(tree, hf_oran_acknack_response_time,
6488 tvb, 0, 0, total_gap);
6489 PROTO_ITEM_SET_GENERATED(ti)proto_item_set_generated((ti));
6490}
6491
6492
6493
6494/* Control plane dissector (section 7). */
6495static int dissect_oran_c(tvbuff_t *tvb, packet_info *pinfo,
6496 proto_tree *tree, oran_tap_info *tap_info, void *data _U___attribute__((unused)))
6497{
6498 /* Hidden filter for plane */
6499 proto_item *plane_ti = proto_tree_add_item(tree, hf_oran_cplane, tvb, 0, 0, ENC_NA0x00000000);
6500 PROTO_ITEM_SET_HIDDEN(plane_ti)proto_item_set_hidden((plane_ti));
6501
6502 /* Set up structures needed to add the protocol subtree and manage it */
6503 unsigned offset = 0;
6504
6505 col_set_str(pinfo->cinfo, COL_PROTOCOL, "O-RAN-FH-C");
6506 col_set_str(pinfo->cinfo, COL_INFO, "C-Plane");
6507
6508 tap_info->userplane = false0;
6509
6510 /* Create display subtree for the protocol */
6511 proto_item *protocol_item = proto_tree_add_item(tree, proto_oran, tvb, 0, -1, ENC_NA0x00000000);
6512 proto_item_append_text(protocol_item, "-C");
6513 proto_tree *oran_tree = proto_item_add_subtree(protocol_item, ett_oran);
6514
6515 /* ecpriRtcid (eAxC ID) */
6516 uint16_t eAxC;
6517 addPcOrRtcid(tvb, oran_tree, &offset, hf_oran_ecpri_rtcid, &eAxC, tap_info);
6518 tap_info->eaxc = eAxC;
6519
6520 /* Look up any existing conversation state for eAxC+plane */
6521 flow_state_t* state = lookup_flow(pinfo, eAxC, ORAN_C_PLANE0, false0);
6522
6523 /* Message identifier */
6524 uint32_t seq_id, sub_seq_id, e;
6525 proto_item *seq_id_ti;
6526 offset = addSeqid(tvb, oran_tree, offset, ORAN_C_PLANE0, &seq_id, &seq_id_ti, &sub_seq_id, &e);
6527
6528 /* Section common subtree */
6529 int section_tree_offset = offset;
6530 proto_item *sectionHeading = proto_tree_add_string_format(oran_tree, hf_oran_c_section_common,
6531 tvb, offset, 0, "", "C-Plane Section Type ");
6532 proto_tree *section_tree = proto_item_add_subtree(sectionHeading, ett_oran_c_section_common);
6533
6534 /* Peek ahead at the section type */
6535 uint32_t sectionType = 0;
6536 sectionType = tvb_get_uint8(tvb, offset+5);
6537
6538 uint32_t scs = 0;
6539 proto_item *scs_ti = NULL((void*)0);
6540
6541 /* dataDirection */
6542 uint32_t direction = 0;
6543 proto_item *datadir_ti = proto_tree_add_item_ret_uint(section_tree, hf_oran_data_direction, tvb, offset, 1, ENC_NA0x00000000, &direction);
6544 tap_info->uplink = (direction==0);
6545
6546 /* Update/report status of conversation */
6547 if (!PINFO_FD_VISITED(pinfo)((pinfo)->fd->visited)) {
6548
6549 if (state == NULL((void*)0)) {
6550 /* Allocate state now */
6551 state = wmem_new0(wmem_file_scope(), flow_state_t)((flow_state_t*)wmem_alloc0((wmem_file_scope()), sizeof(flow_state_t
)))
;
6552 state->ack_nack_requests = wmem_tree_new(wmem_file_scope());
6553 store_flow(pinfo, eAxC, ORAN_C_PLANE0, false0, state);
6554 /* Tables for each direction */
6555 state->expected_sections[0] = wmem_tree_new(wmem_file_scope());
6556 state->expected_sections[1] = wmem_tree_new(wmem_file_scope());
6557 }
6558
6559 /* Check sequence analysis status */
6560 if (state->last_frame_seen[direction] && (seq_id != state->next_expected_sequence_number[direction])) {
6561 /* Store this result */
6562 flow_result_t *result = wmem_new0(wmem_file_scope(), flow_result_t)((flow_result_t*)wmem_alloc0((wmem_file_scope()), sizeof(flow_result_t
)))
;
6563 result->unexpected_seq_number = true1;
6564 result->expected_sequence_number = state->next_expected_sequence_number[direction];
6565 result->previous_frame = state->last_frame[direction];
6566 result->u_plane_frames = wmem_list_new(wmem_file_scope());
6567 wmem_tree_insert32(flow_results_table, pinfo->num, result);
6568 }
6569 /* Update conversation info */
6570 state->last_frame[direction] = pinfo->num;
6571 state->last_frame_seen[direction] = true1;
6572 state->next_expected_sequence_number[direction] = (seq_id+1) % 256;
6573 }
6574
6575 /* Show any issues associated with this frame number */
6576 flow_result_t *result = wmem_tree_lookup32(flow_results_table, pinfo->num);
6577 if (result!=NULL((void*)0) && result->unexpected_seq_number) {
6578 expert_add_info_format(pinfo, seq_id_ti,
6579 (direction == DIR_UPLINK0) ?
6580 &ei_oran_cplane_unexpected_sequence_number_ul :
6581 &ei_oran_cplane_unexpected_sequence_number_dl,
6582 "Sequence number %u expected, but got %u",
6583 result->expected_sequence_number, seq_id);
6584
6585 /* Update tap info */
6586 uint32_t missing_sns = (256 + seq_id - result->expected_sequence_number) % 256;
6587 /* Don't get confused by being slightly out of order.. */
6588 if (missing_sns < 128) {
6589 tap_info->missing_sns = missing_sns;
6590 }
6591 else {
6592 tap_info->missing_sns = 0;
6593 }
6594
6595 /* Show link back to previous frame in stream */
6596 proto_item *prev_ti = proto_tree_add_uint(proto_item_get_subtree(proto_item_get_parent(seq_id_ti)),
6597 hf_oran_previous_frame, tvb, 0, 0, result->previous_frame);
6598 proto_item_set_generated(prev_ti);
6599 }
6600
6601 /* payloadVersion */
6602 dissect_payload_version(section_tree, tvb, pinfo, offset);
6603
6604 /* filterIndex */
6605 if (sectionType == SEC_C_SLOT_CONTROL || sectionType == SEC_C_ACK_NACK_FEEDBACK) {
6606 /* scs (for ST4 and ST8) */
6607 scs_ti = proto_tree_add_item_ret_uint(section_tree, hf_oran_frameStructure_subcarrier_spacing, tvb, offset, 1, ENC_NA0x00000000, &scs);
6608 }
6609 else if (sectionType == SEC_C_RRM_MEAS_REPORTS || sectionType == SEC_C_RRM_MEAS_REPORTS_NON_TIMING || sectionType == SEC_C_REQUEST_RRM_MEAS) {
6610 /* reserved (4 bits) */
6611 add_reserved_field(section_tree, hf_oran_reserved_last_4bits, tvb, offset, 1);
6612 }
6613 else if (sectionType != SEC_C_LAA) {
6614 /* filterIndex (most common case) */
6615 proto_tree_add_item(section_tree, hf_oran_filter_index, tvb, offset, 1, ENC_NA0x00000000);
6616 }
6617 offset += 1;
6618
6619 unsigned ref_a_offset = offset;
6620 /* frameId */
6621 uint32_t frameId = 0;
6622 proto_tree_add_item_ret_uint(section_tree, hf_oran_frame_id, tvb, offset, 1, ENC_NA0x00000000, &frameId);
6623 tap_info->frame = frameId;
6624 offset += 1;
6625
6626 /* subframeId */
6627 uint32_t subframeId = 0;
6628 proto_tree_add_item_ret_uint(section_tree, hf_oran_subframe_id, tvb, offset, 1, ENC_NA0x00000000, &subframeId);
6629 /* slotId */
6630 uint32_t slotId = 0;
6631 proto_tree_add_item_ret_uint(section_tree, hf_oran_slot_id, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &slotId);
6632 tap_info->slot = slotId;
6633 offset++;
6634
6635 /* startSymbolId */
6636 uint32_t startSymbolId = 0;
6637 proto_item *ssid_ti = NULL((void*)0);
6638 if ((sectionType == SEC_C_ACK_NACK_FEEDBACK) || /* Section Type 8 */
6639 (sectionType == SEC_C_SINR_REPORTING)) { /* Section Type 9 */
6640 /* symbolId */
6641 proto_tree_add_item_ret_uint(section_tree, hf_oran_symbolId, tvb, offset, 1, ENC_NA0x00000000, &startSymbolId);
6642 }
6643 else if (sectionType != SEC_C_LAA) {
6644 /* startSymbolId is in most section types */
6645 ssid_ti = proto_tree_add_item_ret_uint(section_tree, hf_oran_start_symbol_id, tvb, offset, 1, ENC_NA0x00000000, &startSymbolId);
6646 if (startSymbolId && (sectionType == SEC_C_RRM_MEAS_REPORTS)) { /* Section Type 10 */
6647 proto_item_append_text(ssid_ti, " (should be 0 for ST10!)");
6648 expert_add_info_format(pinfo, ssid_ti, &ei_oran_st10_startsymbolid_not_0,
6649 "startSymbolId should be 0 for ST10 - found %u", startSymbolId);
6650 }
6651 }
6652 else {
6653 /* reserved (6 bits) */
6654 add_reserved_field(section_tree, hf_oran_reserved_last_6bits, tvb, offset, 1);
6655 }
6656 offset++;
6657
6658
6659 char id[16];
6660 snprintf(id, 16, "%u-%u-%u-%u", frameId, subframeId, slotId, startSymbolId);
6661 proto_item *pi = proto_tree_add_string(section_tree, hf_oran_refa, tvb, ref_a_offset, 3, id);
6662 proto_item_set_generated(pi);
6663
6664 uint32_t cmd_scope = 0;
6665 bool_Bool st8_ready = false0;
6666
6667 /* numberOfSections (or whatever section has instead) */
6668 uint32_t nSections = 0;
6669 if (sectionType == SEC_C_SLOT_CONTROL) { /* Section Type 4 */
6670 /* Slot Control has these fields instead */
6671 /* reserved (4 bits) */
6672 add_reserved_field(section_tree, hf_oran_reserved_4bits, tvb, offset, 1);
6673 /* cmdScope (4 bits) */
6674 proto_tree_add_item_ret_uint(section_tree, hf_oran_cmd_scope, tvb, offset, 1, ENC_NA0x00000000, &cmd_scope);
6675 }
6676 else if (sectionType == SEC_C_ACK_NACK_FEEDBACK) { /* Section Type 8 */
6677 /* reserved (7 bits) */
6678 add_reserved_field(section_tree, hf_oran_reserved_7bits, tvb, offset, 1);
6679 /* ready (1 bit) */
6680 /* TODO: when set, ready in slotId+1.. */
6681 proto_tree_add_item_ret_boolean(section_tree, hf_oran_ready, tvb, offset, 1, ENC_NA0x00000000, &st8_ready);
6682 if (!st8_ready) {
6683 /* SCS value is ignored, and may be set to any value by O-RU */
6684 proto_item_append_text(scs_ti, " (ignored)");
6685 }
6686 }
6687 else if (sectionType != SEC_C_LAA) {
6688 /* numberOfSections */
6689 proto_tree_add_item_ret_uint(section_tree, hf_oran_numberOfSections, tvb, offset, 1, ENC_NA0x00000000, &nSections);
6690 }
6691 else {
6692 add_reserved_field(section_tree, hf_oran_reserved_8bits, tvb, offset, 1);
6693 }
6694 offset++;
6695
6696 /* sectionType */
6697 proto_tree_add_item_ret_uint(section_tree, hf_oran_sectionType, tvb, offset, 1, ENC_NA0x00000000, &sectionType);
6698 offset += 1;
6699
6700 /* Check that dataDirection is consistent with section type */
6701 if (sectionType == SEC_C_SINR_REPORTING && direction != 0) { /* Section Type 9 */
6702 expert_add_info(pinfo, datadir_ti, &ei_oran_st9_not_ul);
6703 }
6704 if (sectionType == SEC_C_RRM_MEAS_REPORTS && direction != 0) { /* Section Type 10 */
6705 expert_add_info(pinfo, datadir_ti, &ei_oran_st10_not_ul);
6706 }
6707
6708 /* Note this section type in stats */
6709 if (sectionType < SEC_C_MAX_INDEX) {
6710 tap_info->section_types[sectionType] = true1;
6711 }
6712
6713 /* Section-type-specific fields following common header (white entries in Section Type diagrams) */
6714 unsigned bit_width = 0;
6715 unsigned comp_meth = 0;
6716 proto_item *comp_meth_ti;
6717 unsigned ci_comp_method = 0;
6718 uint8_t ci_comp_opt = 0;
6719
6720 uint32_t num_ues = 0;
6721 uint32_t number_of_acks = 0, number_of_nacks = 0;
6722
6723 uint32_t num_sinr_per_prb = 0;
6724
6725 switch (sectionType) {
6726 case SEC_C_UNUSED_RB: /* Section Type 0 */
6727 /* timeOffset */
6728 proto_tree_add_item(section_tree, hf_oran_timeOffset, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
6729 offset += 2;
6730 /* frameStructure */
6731 offset = dissect_frame_structure(section_tree, tvb, offset,
6732 subframeId, slotId);
6733
6734 /* cpLength */
6735 proto_tree_add_item(section_tree, hf_oran_cpLength, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
6736 offset += 2;
6737 /* reserved (8 bits) */
6738 add_reserved_field(section_tree, hf_oran_reserved_8bits, tvb, offset, 1);
6739 offset += 1;
6740 break;
6741
6742 case SEC_C_NORMAL: /* Section Type 1 */
6743 case SEC_C_UE_SCHED: /* Section Type 5 */
6744 /* udCompHdr */
6745 offset = dissect_udcomphdr(tvb, pinfo, section_tree, offset,
6746 true1, direction==1 || pref_override_ul_compression, /* ignore for DL or if using mplane for UL settings */
6747 &bit_width, &comp_meth, &comp_meth_ti, tap_info);
6748 /* reserved (8 bits) */
6749 add_reserved_field(section_tree, hf_oran_reserved_8bits, tvb, offset, 1);
6750 offset += 1;
6751 break;
6752
6753 case SEC_C_SLOT_CONTROL: /* Section Type 4 */
6754 break;
6755
6756 case SEC_C_PRACH: /* Section Type 3 */
6757 /* timeOffset */
6758 proto_tree_add_item(section_tree, hf_oran_timeOffset, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
6759 offset += 2;
6760 /* frameStructure */
6761 offset = dissect_frame_structure(section_tree, tvb, offset,
6762 subframeId, slotId);
6763 /* cpLength */
6764 proto_tree_add_item(section_tree, hf_oran_cpLength, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
6765 offset += 2;
6766 /* udCompHdr */
6767 offset = dissect_udcomphdr(tvb, pinfo, section_tree, offset,
6768 true1, direction==1 || pref_override_ul_compression, /* ignore for DL or if using mplane for UL settings */
6769 &bit_width, &comp_meth, &comp_meth_ti, tap_info);
6770 break;
6771
6772 case SEC_C_CH_INFO: /* Section Type 6 */
6773 /* numberOfUEs */
6774 proto_tree_add_item_ret_uint(section_tree, hf_oran_numberOfUEs, tvb, offset, 1, ENC_NA0x00000000, &num_ues);
6775 offset += 1;
6776 /* ciCompHdr (was reserved) */
6777 offset = dissect_cicomphdr(tvb, pinfo, section_tree, offset, &bit_width, &ci_comp_method, &ci_comp_opt);
6778
6779 /* Number of sections may not be filled in (at all, or correctly), so set to the number of UEs.
6780 The data entries are per-UE... they don't have a sectionID, but they could have section extensions... */
6781 if (nSections == 0 || num_ues > nSections) {
6782 nSections = num_ues;
6783 }
6784 break;
6785
6786 case SEC_C_RSVD2:
6787 break;
6788
6789 case SEC_C_LAA: /* Section Type 7 */
6790 add_reserved_field(section_tree, hf_oran_reserved_16bits, tvb, offset, 2);
6791 offset += 2;
6792 break;
6793
6794 case SEC_C_ACK_NACK_FEEDBACK: /* Section Type 8 */
6795 /* numberOfAcks (1 byte) */
6796 proto_tree_add_item_ret_uint(section_tree, hf_oran_number_of_acks, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &number_of_acks);
6797 offset += 1;
6798 /* numberOfNacks (1 byte) */
6799 proto_tree_add_item_ret_uint(section_tree, hf_oran_number_of_nacks, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &number_of_nacks);
6800 offset += 1;
6801
6802 /* The requests were sent by the O-DU, in the other direction (or the same, if sent by the O-DU) */
6803 flow_state_t *request_state = lookup_flow(pinfo, eAxC, ORAN_C_PLANE0, true1);
6804 if (!request_state || !request_state->ack_nack_requests) {
6805 request_state = state;
6806 }
6807
6808 /* Show ACKs and NACKs. For both, try to link back to request. */
6809 for (unsigned int n=1; n <= number_of_acks; n++) {
6810 uint32_t ackid;
6811 proto_item *ack_ti;
6812 ack_ti = proto_tree_add_item_ret_uint(section_tree, hf_oran_ackid, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &ackid);
6813 offset += 2;
6814
6815 /* Look up request table in state (which really should be set by now, but test anyway). */
6816 if (request_state && request_state->ack_nack_requests) {
6817 ack_nack_request_t *request = wmem_tree_lookup32(request_state->ack_nack_requests, ackid);
6818 if (!request && state && state->ack_nack_requests) {
6819 request = wmem_tree_lookup32(state->ack_nack_requests, ackid);
6820 }
6821 if (request != NULL((void*)0)) {
6822 /* On first pass, update with this response */
6823 if (!PINFO_FD_VISITED(pinfo)((pinfo)->fd->visited)) {
6824 request->response_frame_number = pinfo->num;
6825 request->response_frame_time = pinfo->abs_ts;
6826 }
6827
6828 /* Show request details */
6829 show_link_to_acknack_request(section_tree, tvb, pinfo, request);
6830 }
6831 else {
6832 /* Request not found */
6833 expert_add_info_format(pinfo, ack_ti, &ei_oran_acknack_no_request,
6834 "Response for ackId=%u received, but no request found",
6835 ackid);
6836 }
6837 }
6838 }
6839 for (unsigned int m=1; m <= number_of_nacks; m++) {
6840 uint32_t nackid;
6841 proto_item *nack_ti = proto_tree_add_item_ret_uint(section_tree, hf_oran_nackid, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &nackid);
6842 offset += 2;
6843
6844 expert_add_info_format(pinfo, nack_ti, &ei_oran_st8_nackid,
6845 "Received Nack for ackNackId=%u",
6846 nackid);
6847
6848 /* Look up request table in state. */
6849 if (request_state && request_state->ack_nack_requests) {
6850 ack_nack_request_t *request = wmem_tree_lookup32(request_state->ack_nack_requests, nackid);
6851 if (!request && state && state->ack_nack_requests) {
6852 request = wmem_tree_lookup32(state->ack_nack_requests, nackid);
6853 }
6854 if (request) {
6855 /* On first pass, update with this response */
6856 if (!PINFO_FD_VISITED(pinfo)((pinfo)->fd->visited)) {
6857 request->response_frame_number = pinfo->num;
6858 request->response_frame_time = pinfo->abs_ts;
6859 }
6860
6861 /* Show request details */
6862 show_link_to_acknack_request(section_tree, tvb, pinfo, request);
6863 }
6864 else {
6865 /* Request not found */
6866 expert_add_info_format(pinfo, nack_ti, &ei_oran_acknack_no_request,
6867 "Response for nackId=%u received, but no request found",
6868 nackid);
6869 }
6870 }
6871 }
6872 break;
6873
6874 case SEC_C_SINR_REPORTING: /* Section Type 9 */
6875 {
6876 /* numSinrPerPrb (3 bits) */
6877 proto_item *nspp_ti;
6878 nspp_ti = proto_tree_add_item_ret_uint(section_tree, hf_oran_num_sinr_per_prb_st9, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &num_sinr_per_prb);
6879 switch (num_sinr_per_prb) {
6880 case 0:
6881 num_sinr_per_prb = 1; break;
6882 case 1:
6883 num_sinr_per_prb = 2; break;
6884 case 2:
6885 num_sinr_per_prb = 3; break;
6886 case 3:
6887 num_sinr_per_prb = 4; break;
6888 case 4:
6889 num_sinr_per_prb = 6; break;
6890 case 5:
6891 num_sinr_per_prb = 12; break;
6892
6893 default:
6894 proto_item_append_text(nspp_ti, " (invalid)");
6895 expert_add_info_format(pinfo, nspp_ti, &ei_oran_num_sinr_per_prb_unknown,
6896 "Invalid numSinrPerPrb value (%u)",
6897 num_sinr_per_prb);
6898 num_sinr_per_prb = 1;
6899 }
6900
6901 /* oruControlSinrSlotMaskId (5 bits) */
6902 proto_tree_add_item(section_tree, hf_oran_oru_control_sinr_slot_mask_id, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
6903 offset += 1;
6904 /* reserved (8 bits) */
6905 add_reserved_field(section_tree, hf_oran_reserved_8bits, tvb, offset, 1);
6906 offset += 1;
6907 break;
6908 }
6909
6910 case SEC_C_RRM_MEAS_REPORTS: /* Section Type 10 */
6911 case SEC_C_REQUEST_RRM_MEAS: /* Section Type 11 */
6912 /* reserved (16 bits) */
6913 add_reserved_field(section_tree, hf_oran_reserved_16bits, tvb, offset, 2);
6914 offset += 2;
6915 break;
6916 };
6917
6918 /* Update udCompHdr details in state for UL U-Plane */
6919 if (state && direction==0 && !PINFO_FD_VISITED(pinfo)((pinfo)->fd->visited)) {
6920 switch (sectionType) {
6921 case SEC_C_NORMAL: /* Section Type 1 */
6922 case SEC_C_PRACH: /* Section Type 3 */
6923 case SEC_C_UE_SCHED: /* Section Type 5 */
6924 state->ul_ud_comp_hdr_set = true1;
6925 state->ul_ud_comp_hdr_bit_width = bit_width;
6926 state->ul_ud_comp_hdr_compression = comp_meth;
6927 state->ul_ud_comp_hdr_frame = pinfo->num;
6928 break;
6929 default:
6930 break;
6931 }
6932 }
6933
6934
6935 proto_item_append_text(sectionHeading, "%d, %s, frameId: %d, subframeId: %d, slotId: %d, startSymbolId: %d",
6936 sectionType, val_to_str_const(direction, data_direction_vals, "Unknown"),
6937 frameId, subframeId, slotId, startSymbolId);
6938 if (nSections) {
6939 proto_item_append_text(sectionHeading, ", numberOfSections=%u", nSections);
6940 }
6941
6942 write_pdu_label_and_info(protocol_item, NULL((void*)0), pinfo, ", Type: %2d %s", sectionType,
6943 rval_to_str_const(sectionType, section_types_short, "Unknown"));
6944
6945 /* Set actual length of C-Plane section header */
6946 proto_item_set_len(section_tree, offset - section_tree_offset);
6947
6948 if (sectionType == SEC_C_ACK_NACK_FEEDBACK) {
6949 write_pdu_label_and_info(oran_tree, section_tree, pinfo,
6950 (st8_ready) ? " (Ready)" : " (ACK)");
6951 }
6952
6953
6954 /* Section type 4 doesn't have normal sections, so deal with here before normal sections */
6955 if (sectionType == SEC_C_SLOT_CONTROL) {
6956 /* numberOfST4Cmds */
6957 uint32_t no_st4_cmds, st4_cmd_len, num_slots, ack_nack_req_id, st4_cmd_type;
6958 proto_item *no_ti = proto_tree_add_item_ret_uint(section_tree, hf_oran_number_of_st4_cmds,
6959 tvb, offset, 1, ENC_NA0x00000000, &no_st4_cmds);
6960 if (no_st4_cmds == 0) {
6961 expert_add_info(pinfo, no_ti, &ei_oran_st4_no_cmds);
6962 }
6963 offset += 1;
6964
6965 /* reserved (1 byte) */
6966 add_reserved_field(section_tree, hf_oran_reserved_8bits, tvb, offset, 1);
6967 offset += 1;
6968
6969 /* Loop over commands. Each has 8-byte common header, followed by cmd-specific payload */
6970 proto_item *len_ti;
6971 for (uint32_t n=0; n < no_st4_cmds; n++) {
6972 /* Table 7.4.6-2: Section Type 4 Command common header format */
6973 proto_item *hdr_ti = proto_tree_add_string_format(section_tree, hf_oran_st4_cmd_header,
6974 tvb, offset, 8, "",
6975 "Type 4 Command common header");
6976 proto_tree *hdr_tree = proto_item_add_subtree(hdr_ti, ett_oran_st4_cmd_header);
6977
6978 /* st4CmdType */
6979 proto_tree_add_item_ret_uint(hdr_tree, hf_oran_st4_cmd_type, tvb, offset, 1, ENC_NA0x00000000, &st4_cmd_type);
6980 offset += 1;
6981
6982 /* st4CmdLen */
6983 len_ti = proto_tree_add_item_ret_uint(hdr_tree, hf_oran_st4_cmd_len, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &st4_cmd_len);
6984 if (st4_cmd_len == 0) {
6985 /* Meaning of 0 not yet defined (v15.00) */
6986 proto_item_append_text(len_ti, " (reserved)");
6987 expert_add_info(pinfo, len_ti, &ei_oran_st4_zero_len_cmd);
6988 }
6989 else {
6990 proto_item_append_text(len_ti, " (%u bytes)", st4_cmd_len*4);
6991 }
6992 offset += 2;
6993
6994 /* numSlots */
6995 proto_item *slots_ti = proto_tree_add_item_ret_uint(hdr_tree, hf_oran_st4_cmd_num_slots, tvb, offset, 1, ENC_NA0x00000000, &num_slots);
6996 if (num_slots == 0) {
6997 proto_item_append_text(slots_ti, " (until changed)");
6998 }
6999 offset += 1;
7000
7001 /* ackNackReqId */
7002 proto_item *ack_nack_req_id_ti;
7003 ack_nack_req_id_ti = proto_tree_add_item_ret_uint(hdr_tree, hf_oran_st4_cmd_ack_nack_req_id, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &ack_nack_req_id);
7004 offset += 2;
7005 if (ack_nack_req_id == 0) {
7006 proto_item_append_text(ack_nack_req_id_ti, " (no Section type 8 response expected)");
7007 }
7008
7009 /* reserved (16 bits) */
7010 add_reserved_field(hdr_tree, hf_oran_reserved_16bits, tvb, offset, 2);
7011 offset += 2;
7012
7013 /* Set common header summary */
7014 proto_item_append_text(hdr_ti, " (cmd=%s, len=%u, slots=%u, ackNackReqId=%u)",
7015 rval_to_str_const(st4_cmd_type, st4_cmd_type_vals, "Unknown"),
7016 st4_cmd_len, num_slots, ack_nack_req_id);
7017
7018 col_append_fstr(pinfo->cinfo, COL_INFO, " (%s)",
7019 rval_to_str_const(st4_cmd_type, st4_cmd_type_vals, "Unknown"));
7020
7021
7022 /* Subtree for this command body */
7023 proto_item *command_ti = proto_tree_add_string_format(section_tree, hf_oran_st4_cmd,
7024 tvb, offset, 0, "",
7025 "Type 4 Command (%s)", rval_to_str_const(st4_cmd_type, st4_cmd_type_vals, "Unknown"));
7026 proto_tree *command_tree = proto_item_add_subtree(command_ti, ett_oran_st4_cmd);
7027
7028 unsigned command_start_offset = offset;
7029
7030 /* Check fields compatible with chosen command. */
7031 if (st4_cmd_type==1) {
7032 if (num_slots != 0) {
7033 /* "the value of numSlots should be set to zero for this command type" */
7034 expert_add_info_format(pinfo, slots_ti, &ei_oran_numslots_not_zero,
7035 "numSlots should be zero for ST4 command 1 - found %u",
7036 num_slots);
7037 }
7038 }
7039
7040 if (st4_cmd_type==3 || st4_cmd_type==4) {
7041 if (startSymbolId != 0) {
7042 /* "expected reception window for the commands is the symbol zero reception window" */
7043 expert_add_info_format(pinfo, ssid_ti, &ei_oran_start_symbol_id_not_zero,
7044 "startSymbolId should be zero for ST4 commands 3&4 - found %u",
7045 startSymbolId);
7046 }
7047 }
7048
7049 /* Add format for this command */
7050 switch (st4_cmd_type) {
7051 case 1: /* TIME_DOMAIN_BEAM_CONFIG */
7052 {
7053 bool_Bool disable_tdbfns;
7054 uint32_t bfwcomphdr_iq_width, bfwcomphdr_comp_meth;
7055
7056 /* Hidden filter for bf */
7057 proto_item *bf_ti = proto_tree_add_item(command_tree, hf_oran_bf, tvb, 0, 0, ENC_NA0x00000000);
7058 PROTO_ITEM_SET_HIDDEN(bf_ti)proto_item_set_hidden((bf_ti));
7059
7060 /* reserved (2 bits) */
7061 add_reserved_field(command_tree, hf_oran_reserved_2bits, tvb, offset, 1);
7062 /* symbolMask (14 bits) */
7063 uint32_t symbol_mask;
7064 proto_item *symbol_mask_ti;
7065 offset = dissect_symbolmask(tvb, command_tree, offset, &symbol_mask, &symbol_mask_ti);
7066 /* Symbol bits before 'startSymbolId' in Section Type 4 common header should be set to 0 by O-DU and shall be ignored by O-RU */
7067 /* lsb is symbol 0 */
7068 for (unsigned s=0; s < 14; s++) {
7069 if ((symbol_mask & (1 << s)) && (startSymbolId > s)) {
7070 proto_item_append_text(symbol_mask_ti, " (startSymbolId is %u, so some lower symbol bits ignored!)", startSymbolId);
7071 expert_add_info(pinfo, symbol_mask_ti, &ei_oran_start_symbol_id_bits_ignored);
7072 break;
7073 }
7074 }
7075
7076 /* disableTDBFNs (1 bit) */
7077 proto_tree_add_item_ret_boolean(command_tree, hf_oran_disable_tdbfns, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &disable_tdbfns);
7078
7079 /* tdBeamNum (15 bits) */
7080 proto_tree_add_item(command_tree, hf_oran_td_beam_num, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
7081 offset += 2;
7082
7083 /* bfwCompHdr (2 subheaders - bfwIqWidth and bfwCompMeth)*/
7084 offset = dissect_bfwCompHdr(tvb, command_tree, offset,
7085 &bfwcomphdr_iq_width, &bfwcomphdr_comp_meth, &comp_meth_ti);
7086 /* reserved (3 bytes) */
7087 proto_tree_add_bits_item(command_tree, hf_oran_reserved, tvb, offset*8, 24, ENC_BIG_ENDIAN0x00000000);
7088 offset += 3;
7089
7090 if (disable_tdbfns) {
7091 /* No beamnum information to show so get out. */
7092 break;
7093 }
7094
7095 /* Read beam entries until reach end of command length */
7096 while ((offset - command_start_offset) < (st4_cmd_len * 4)) {
7097 /* Stop at the padding (fewer than 4 zero bytes) at the end of the command.
7098 An entry with BFWs does not fit there. */
7099 unsigned remaining = command_start_offset + (st4_cmd_len * 4) - offset;
7100 bool_Bool padding = (remaining < 4);
7101 for (unsigned b=0; padding && b < remaining; b++) {
7102 padding = (tvb_get_uint8(tvb, offset+b) == 0);
7103 }
7104 if (padding) {
7105 break;
7106 }
7107
7108 /* disableTDBFWs (1 bit) */
7109 bool_Bool disable_tdbfws;
7110 proto_tree_add_item_ret_boolean(command_tree, hf_oran_disable_tdbfws, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &disable_tdbfws);
7111
7112 /* tdBeamNum (15 bits) */
7113 proto_tree_add_item(command_tree, hf_oran_td_beam_num, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
7114 offset += 2;
7115
7116 /* Showing BFWs? */
7117 if (!disable_tdbfws) {
7118
7119 /* bfwCompParam */
7120 unsigned exponent = 0;
7121 bool_Bool supported = false0;
7122 unsigned num_trx_entries;
7123 uint16_t *trx_entries;
7124 offset = dissect_bfwCompParam(tvb, command_tree, pinfo, offset, comp_meth_ti,
7125 &bfwcomphdr_comp_meth, &exponent, &supported,
7126 &num_trx_entries, &trx_entries);
7127
7128 /* Antenna count from preference */
7129 unsigned num_trx = pref_num_bf_antennas;
7130 int bit_offset = offset*8;
7131
7132 for (unsigned trx=0; trx < num_trx; trx++) {
7133 /* Create antenna subtree */
7134 int bfw_offset = bit_offset / 8;
7135 proto_item *bfw_ti = proto_tree_add_string_format(command_tree, hf_oran_bfw,
7136 tvb, bfw_offset, 0, "", "TRX %3u: (", trx+1);
7137 proto_tree *bfw_tree = proto_item_add_subtree(bfw_ti, ett_oran_bfw);
7138
7139 /* I value */
7140 /* Get bits, and convert to float. */
7141 uint32_t bits = tvb_get_bits32(tvb, bit_offset, bfwcomphdr_iq_width, ENC_BIG_ENDIAN0x00000000);
7142 float value = decompress_value(bits, bfwcomphdr_comp_meth, bfwcomphdr_iq_width, exponent, NULL((void*)0) /* no ModCompr*/, 0 /* RE */);
7143 /* Add to tree. */
7144 proto_tree_add_float(bfw_tree, hf_oran_bfw_i, tvb, bit_offset/8,
7145 (bfwcomphdr_iq_width+7)/8, value);
7146 bit_offset += bfwcomphdr_iq_width;
7147 proto_item_append_text(bfw_ti, "I=%f ", value);
7148
7149 /* Leave a gap between I and Q values */
7150 proto_item_append_text(bfw_ti, " ");
7151
7152 /* Q value */
7153 /* Get bits, and convert to float. */
7154 bits = tvb_get_bits32(tvb, bit_offset, bfwcomphdr_iq_width, ENC_BIG_ENDIAN0x00000000);
7155 value = decompress_value(bits, bfwcomphdr_comp_meth, bfwcomphdr_iq_width, exponent, NULL((void*)0) /* no ModCompr*/, 0 /* RE */);
7156 /* Add to tree. */
7157 proto_tree_add_float(bfw_tree, hf_oran_bfw_q, tvb, bit_offset/8,
7158 (bfwcomphdr_iq_width+7)/8, value);
7159 bit_offset += bfwcomphdr_iq_width;
7160 proto_item_append_text(bfw_ti, "Q=%f", value);
7161
7162 proto_item_append_text(bfw_ti, ")");
7163 proto_item_set_len(bfw_ti, (bit_offset+7)/8 - bfw_offset);
7164 }
7165 /* Need to round to next byte */
7166 offset = (bit_offset+7)/8;
7167 }
7168 }
7169 break;
7170 }
7171 case 2: /* TDD_CONFIG_PATTERN */
7172 /* reserved (2 bits) */
7173 add_reserved_field(command_tree, hf_oran_reserved_2bits, tvb, offset, 1);
7174 /* dirPattern (14 bits) */
7175 proto_tree_add_item(command_tree, hf_oran_dir_pattern, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
7176 offset += 2;
7177
7178 /* reserved (2 bits) */
7179 add_reserved_field(command_tree, hf_oran_reserved_2bits, tvb, offset, 1);
7180 /* guardPattern (14 bits) */
7181 proto_tree_add_item(command_tree, hf_oran_guard_pattern, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
7182 offset += 2;
7183 break;
7184
7185 case 3: /* TRX_CONTROL */
7186 case 5: /* TRX_CONTROL_BIDIR */
7187 {
7188 /* Only allowed cmdScope is ARRAY-COMMAND */
7189 if (cmd_scope != 0) {
7190 expert_add_info(pinfo, command_tree, &ei_oran_trx_control_cmd_scope);
7191 }
7192
7193 /* reserved (2 bits) */
7194 add_reserved_field(command_tree, hf_oran_reserved_2bits, tvb, offset, 1);
7195 /* log2MaskBits (4 bits) */
7196 unsigned log2maskbits;
7197 proto_tree_add_item_ret_uint(command_tree, hf_oran_log2maskbits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &log2maskbits);
7198 /* sleepMode (2 bits) */
7199 uint32_t sleep_mode;
7200 proto_tree_add_item_ret_uint(command_tree, hf_oran_sleepmode_trx, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &sleep_mode);
7201 offset += 1;
7202
7203 /* reserved (4 bits) */
7204 add_reserved_field(command_tree, hf_oran_reserved_4bits, tvb, offset, 1);
7205 /* numSlotsExt (20 bits) */
7206 uint32_t num_slots_ext;
7207 proto_item *num_slots_ext_ti = proto_tree_add_item_ret_uint(command_tree, hf_oran_num_slots_ext, tvb, offset, 3, ENC_BIG_ENDIAN0x00000000, &num_slots_ext);
7208 if (num_slots==0 && num_slots_ext==0) {
7209 proto_item_append_text(num_slots_ext_ti, " (undefined sleep period)");
7210 }
7211 else {
7212 /* Time should be rounded up according to SCS */
7213 float total = (float)(num_slots + num_slots_ext);
7214 /* From table 7.5.2.13-3 */
7215 const float slot_length_by_scs[16] = { 1000, 500, 250, 125, 62.5, 31.25,
7216 0, 0, 0, 0, 0, 0, /* reserved */
7217 1000, 1000, 1000, 1000 };
7218 float slot_length = slot_length_by_scs[scs];
7219 /* Only using valid SCS. TODO: is this test ok? */
7220 if (slot_length != 0) {
7221 /* Round up to next slot */
7222 total = ((int)(total / slot_length) + 1) * slot_length;
7223 proto_item_append_text(num_slots_ext_ti, " (defined sleep period of %f us)", total);
7224 }
7225 }
7226 offset += 3;
7227
7228 /* reserved (2 bits) */
7229 add_reserved_field(command_tree, hf_oran_reserved_2bits, tvb, offset, 1);
7230
7231 /* symbolMask (14 bits) */
7232 uint32_t symbol_mask;
7233 proto_item *sm_ti;
7234 offset = dissect_symbolmask(tvb, command_tree, offset, &symbol_mask, &sm_ti);
7235 if (symbol_mask == 0x0) {
7236 proto_item_append_text(sm_ti, " (wake)");
7237 col_append_str(pinfo->cinfo, COL_INFO, " (wake)");
7238 }
7239 else if (symbol_mask == 0x3fff) {
7240 proto_item_append_text(sm_ti, " (sleep)");
7241 col_append_str(pinfo->cinfo, COL_INFO, " (sleep)");
7242 }
7243 else {
7244 expert_add_info_format(pinfo, sm_ti, &ei_oran_bad_symbolmask,
7245 "For non-zero sleepMode (%u), symbolMask should be 0x0 or 0x3fff - found 0x%05x",
7246 sleep_mode, symbol_mask);
7247 }
7248
7249 /* antMask (16-2048 bits). Size is lookup from log2MaskBits enum.. */
7250 unsigned antmask_length = 2;
7251 if (log2maskbits >= 4) {
7252 antmask_length = (1 << log2maskbits) / 8;
7253 }
7254 proto_item *ant_mask_ti = proto_tree_add_item(command_tree, hf_oran_antMask_trx_control, tvb, offset, antmask_length, ENC_NA0x00000000);
7255 /* show count */
7256 unsigned antenna_count = 0;
7257 for (unsigned b=0; b < antmask_length; b++) {
7258 uint8_t byte = tvb_get_uint8(tvb, offset+b);
7259 for (unsigned bit=0; bit < 8; bit++) {
7260 if ((1 << bit) & byte) {
7261 antenna_count++;
7262 }
7263 }
7264 }
7265 proto_item_append_text(ant_mask_ti, " (%u antennas)", antenna_count);
7266 offset += antmask_length;
7267
7268 /* Pad to next 4-byte boundary */
7269 offset = WS_ROUNDUP_4(offset)(((offset) + ((unsigned)(4U-1U))) & (~((unsigned)(4U-1U))
))
;
7270 break;
7271 }
7272
7273 case 4: /* ASM (advanced sleep mode) */
7274 /* reserved (2+4=6 bits) */
7275 add_reserved_field(command_tree, hf_oran_reserved_6bits, tvb, offset, 1);
7276 /* sleepMode (2 bits) */
7277 uint32_t sleep_mode;
7278 proto_tree_add_item_ret_uint(command_tree, hf_oran_sleepmode_asm, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &sleep_mode);
7279 offset += 1;
7280
7281 /* reserved (4 bits) */
7282 add_reserved_field(command_tree, hf_oran_reserved_4bits, tvb, offset, 1);
7283 /* numSlotsExt (20 bits) */
7284 proto_tree_add_item(command_tree, hf_oran_num_slots_ext, tvb, offset, 3, ENC_BIG_ENDIAN0x00000000);
7285 offset += 3;
7286
7287 /* reserved (2 bits) */
7288 add_reserved_field(command_tree, hf_oran_reserved_2bits, tvb, offset, 1);
7289 /* symbolMask (14 bits) */
7290 uint32_t symbol_mask;
7291 proto_item *sm_ti;
7292 offset = dissect_symbolmask(tvb, command_tree, offset, &symbol_mask, &sm_ti);
7293 if (symbol_mask == 0x0) {
7294 proto_item_append_text(sm_ti, " (wake)");
7295 col_append_str(pinfo->cinfo, COL_INFO, " (wake)");
7296 }
7297 else if (symbol_mask == 0x3fff) {
7298 proto_item_append_text(sm_ti, " (sleep)");
7299 col_append_str(pinfo->cinfo, COL_INFO, " (sleep)");
7300 }
7301 else {
7302 expert_add_info_format(pinfo, sm_ti, &ei_oran_bad_symbolmask,
7303 "For non-zero sleepMode (%u), symbolMask should be 0x0 or 0x3fff - found 0x%05x",
7304 sleep_mode, symbol_mask);
7305 }
7306
7307 /* reserved (2 bytes) */
7308 add_reserved_field(command_tree, hf_oran_reserved_16bits, tvb, offset, 2);
7309 offset += 2;
7310 break;
7311
7312 case 6: /* MAX_POWER_CONTROL */
7313 /* maxPrwLvllnd (8 bits) */
7314 proto_tree_add_item(command_tree, hf_oran_max_pwr_lvl_ind, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
7315 offset += 1;
7316 /* arrayCarrierMaxPwrReduction (16 bits) - should be shown in dB */
7317 proto_tree_add_item(command_tree, hf_oran_array_carrier_max_pwr_reduction, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
7318 offset += 2;
7319 /* reserved (8 bits) */
7320 add_reserved_field(command_tree, hf_oran_reserved_8bits, tvb, offset, 1);
7321 offset += 1;
7322 break;
7323
7324 default:
7325 /* Error! */
7326 expert_add_info_format(pinfo, len_ti, &ei_oran_st4_unknown_cmd,
7327 "Dissected ST4 command (%u) not recognised",
7328 st4_cmd_type);
7329 break;
7330 }
7331
7332 /* Check apparent size of padding (0-3 bytes ok) */
7333 long padding_remaining = command_start_offset + (st4_cmd_len * 4) - offset;
7334 if (padding_remaining > 3) {
7335 expert_add_info_format(pinfo, len_ti, &ei_oran_st4_wrong_len_cmd,
7336 "Dissected ST4 command does not match signalled st4CmdLen - set to %u (%u bytes) but dissected %u bytes",
7337 st4_cmd_len, st4_cmd_len*4, offset-command_start_offset);
7338 }
7339
7340 /* Advance by signalled length (needs to be aligned on 4-byte boundary) */
7341 offset = command_start_offset + (st4_cmd_len * 4);
7342
7343 /* Set end of command tree */
7344 proto_item_set_end(command_ti, tvb, offset);
7345
7346 if (ack_nack_req_id != 0 && state && state->ack_nack_requests) {
7347 if (!PINFO_FD_VISITED(pinfo)((pinfo)->fd->visited)) {
7348 /* Add this request into conversation state on first pass */
7349 ack_nack_request_t *request_details = wmem_new0(wmem_file_scope(), ack_nack_request_t)((ack_nack_request_t*)wmem_alloc0((wmem_file_scope()), sizeof
(ack_nack_request_t)))
;
7350 request_details->request_frame_number = pinfo->num;
7351 request_details->request_frame_time = pinfo->abs_ts;
7352 request_details->requestType = ST4Cmd1+st4_cmd_type-1;
7353
7354 wmem_tree_insert32(state->ack_nack_requests,
7355 ack_nack_req_id,
7356 request_details);
7357 }
7358 else {
7359 /* On later passes, try to link forward to ST8 response */
7360 ack_nack_request_t *response = wmem_tree_lookup32(state->ack_nack_requests,
7361 ack_nack_req_id);
7362 if (response) {
7363 show_link_to_acknack_response(section_tree, tvb, pinfo, response);
7364 }
7365 }
7366 }
7367 }
7368 }
7369 /* LAA doesn't have sections either.. */
7370 else if (sectionType == SEC_C_LAA) { /* Section Type 7 */
7371 /* 7.2.5 Table 6.4-6 */
7372 unsigned mcot;
7373 proto_item *mcot_ti;
7374
7375 /* laaMsgType */
7376 uint32_t laa_msg_type;
7377 proto_item *laa_msg_type_ti;
7378 laa_msg_type_ti = proto_tree_add_item_ret_uint(section_tree, hf_oran_laaMsgType, tvb, offset, 1, ENC_NA0x00000000, &laa_msg_type);
7379 /* laaMsgLen */
7380 uint32_t laa_msg_len;
7381 proto_item *len_ti = proto_tree_add_item_ret_uint(section_tree, hf_oran_laaMsgLen, tvb, offset, 1, ENC_NA0x00000000, &laa_msg_len);
7382 proto_item_append_text(len_ti, " (%u bytes)", 4*laa_msg_len);
7383 if (laa_msg_len == 0) {
7384 proto_item_append_text(len_ti, " (reserved)");
7385 }
7386 offset += 1;
7387
7388 int payload_offset = offset;
7389
7390 /* Payload */
7391 switch (laa_msg_type) {
7392 case 0:
7393 /* LBT_PDSCH_REQ */
7394 /* lbtHandle (16 bits) */
7395 proto_tree_add_item(section_tree, hf_oran_lbtHandle, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
7396 offset += 2;
7397 /* lbtOffset (10 bits) */
7398 proto_tree_add_item(section_tree, hf_oran_lbtOffset, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
7399 offset += 1;
7400 /* lbtMode (2 bits) */
7401 proto_tree_add_bits_item(section_tree, hf_oran_lbtMode, tvb, offset*8+2, 2, ENC_BIG_ENDIAN0x00000000);
7402 /* reserved (1 bit) */
7403 add_reserved_field(section_tree, hf_oran_reserved_bit4, tvb, offset, 1);
7404 /* lbtDeferFactor (3 bits) */
7405 proto_tree_add_item(section_tree, hf_oran_lbtDeferFactor, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
7406 offset += 1;
7407 /* lbtBackoffCounter (10 bits) */
7408 proto_tree_add_item(section_tree, hf_oran_lbtBackoffCounter, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
7409 offset += 1;
7410 /* MCOT (4 bits) */
7411 mcot_ti = proto_tree_add_item_ret_uint(section_tree, hf_oran_MCOT, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &mcot);
7412 if (mcot<1 || mcot>10) {
7413 proto_item_append_text(mcot_ti, " (should be in range 1-10!)");
7414 expert_add_info_format(pinfo, mcot_ti, &ei_oran_mcot_out_of_range,
7415 "MCOT seen with value %u (must be 1-10)", mcot);
7416
7417 }
7418 /* reserved (10 bits) */
7419 proto_tree_add_bits_item(section_tree, hf_oran_reserved, tvb, (offset*8)+6, 10, ENC_BIG_ENDIAN0x00000000);
7420 break;
7421 case 1:
7422 /* LBT_DRS_REQ */
7423 /* lbtHandle (16 bits) */
7424 proto_tree_add_item(section_tree, hf_oran_lbtHandle, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
7425 offset += 2;
7426 /* lbtOffset (10 bits) */
7427 proto_tree_add_item(section_tree, hf_oran_lbtOffset, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
7428 offset += 1;
7429 /* lbtMode (2 bits) */
7430 proto_tree_add_bits_item(section_tree, hf_oran_lbtMode, tvb, offset*8+2, 2, ENC_BIG_ENDIAN0x00000000);
7431 /* reserved (28 bits) */
7432 proto_tree_add_bits_item(section_tree, hf_oran_reserved, tvb, (offset*8)+4, 28, ENC_BIG_ENDIAN0x00000000);
7433 break;
7434 case 2:
7435 /* LBT_PDSCH_RSP */
7436 /* lbtHandle (16 bits) */
7437 proto_tree_add_item(section_tree, hf_oran_lbtHandle, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
7438 offset += 2;
7439 /* lbtPdschRes (2 bits) */
7440 proto_tree_add_item(section_tree, hf_oran_lbtPdschRes, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
7441 /* inParSF (1 bit) */
7442 proto_tree_add_item(section_tree, hf_oran_initialPartialSF, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
7443 /* sfStatus (1 bit) */
7444 proto_tree_add_item(section_tree, hf_oran_sfStatus, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
7445 /* sfnSf (12 bits) */
7446 proto_tree_add_item(section_tree, hf_oran_sfnSfEnd, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
7447 offset += 2;
7448 /* reserved (24 bits) */
7449 proto_tree_add_bits_item(section_tree, hf_oran_reserved, tvb, (offset*8), 24, ENC_BIG_ENDIAN0x00000000);
7450 break;
7451 case 3:
7452 /* LBT_DRS_RSP */
7453 /* lbtHandle (16 bits) */
7454 proto_tree_add_item(section_tree, hf_oran_lbtHandle, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
7455 offset += 2;
7456 /* lbtDrsRes (1 bit) */
7457 proto_tree_add_item(section_tree, hf_oran_lbtDrsRes, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
7458 /* reserved (7 bits) */
7459 add_reserved_field(section_tree, hf_oran_reserved_last_7bits, tvb, offset, 1);
7460 break;
7461 case 4:
7462 /* LBT_Buffer_Error */
7463 /* lbtHandle (16 bits) */
7464 proto_tree_add_item(section_tree, hf_oran_lbtHandle, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
7465 offset += 2;
7466 /* lbtBufErr (1 bit) */
7467 proto_tree_add_item(section_tree, hf_oran_lbtBufErr, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
7468 /* reserved (7 bits) */
7469 add_reserved_field(section_tree, hf_oran_reserved_last_7bits, tvb, offset, 1);
7470 break;
7471 case 5:
7472 /* LBT_CWCONFIG_REQ */
7473 /* lbtHandle (16 bits) */
7474 proto_tree_add_item(section_tree, hf_oran_lbtHandle, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
7475 offset += 2;
7476 /* lbtCWConfig_H (8 bits) */
7477 proto_tree_add_item(section_tree, hf_oran_lbtCWConfig_H, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
7478 offset += 1;
7479 /* lbtCWConfig_T (8 bits) */
7480 proto_tree_add_item(section_tree, hf_oran_lbtCWConfig_T, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
7481 offset += 1;
7482 /* lbtMode (2 bits) */
7483 proto_tree_add_bits_item(section_tree, hf_oran_lbtMode, tvb, offset*8, 2, ENC_BIG_ENDIAN0x00000000);
7484 /* lbtTrafficClass (3 bits) */
7485 proto_tree_add_item(section_tree, hf_oran_lbtTrafficClass, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
7486 /* reserved (19 bits) */
7487 proto_tree_add_bits_item(section_tree, hf_oran_reserved, tvb, (offset*8)+5, 19, ENC_BIG_ENDIAN0x00000000);
7488 break;
7489 case 6:
7490 /* LBT_CWCONFIG_RSP */
7491 /* lbtHandle (16 bits) */
7492 proto_tree_add_item(section_tree, hf_oran_lbtHandle, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
7493 offset += 2;
7494 /* lbtCWR_Rst (1 bit) */
7495 proto_tree_add_item(section_tree, hf_oran_lbtCWR_Rst, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
7496 /* reserved (7 bits) */
7497 add_reserved_field(section_tree, hf_oran_reserved_last_7bits, tvb, offset, 1);
7498 break;
7499
7500 default:
7501 /* Unhandled! */
7502 expert_add_info_format(pinfo, laa_msg_type_ti, &ei_oran_laa_msg_type_unsupported,
7503 "laaMsgType %u not supported by dissector",
7504 laa_msg_type);
7505
7506 break;
7507 }
7508 /* For now just skip indicated length of bytes */
7509 offset = payload_offset + 4*(laa_msg_len+1);
7510 }
7511
7512
7513 /* Dissect each C section */
7514 for (uint32_t i = 0; i < nSections; ++i) {
7515 tvbuff_t *section_tvb = tvb_new_subset_remaining(tvb, offset);
7516 offset += dissect_oran_c_section(section_tvb, oran_tree, pinfo, state, sectionType, tap_info,
7517 protocol_item,
7518 subframeId, frameId, slotId, startSymbolId,
7519 bit_width, ci_comp_method, ci_comp_opt,
7520 num_sinr_per_prb);
7521 }
7522
7523 /* Expert error if we are short of tvb by > 3 bytes */
7524 if (tvb_reported_length_remaining(tvb, offset) > 3) {
7525 expert_add_info_format(pinfo, protocol_item, &ei_oran_frame_length,
7526 "%u bytes remain at end of frame - should be 0-3",
7527 tvb_reported_length_remaining(tvb, offset));
7528 }
7529
7530 if (PINFO_FD_VISITED(pinfo)((pinfo)->fd->visited) && result) {
7531 /* Show list of frames that have corresponding U-plane data */
7532 wmem_list_frame_t *list_frame;
7533
7534 /* Some frames may answer > 1 section, so fashion a set using wmem_tree.. */
7535 wmem_tree_t *frames_set = wmem_tree_new(NULL((void*)0));
7536
7537 unsigned first_gap = 0;
7538 unsigned first_symbol = 0;
7539 unsigned first_gap_delta = 0;
7540 bool_Bool first_section = true1;
7541
7542 for (list_frame = wmem_list_head(result->u_plane_frames); list_frame != NULL((void*)0); list_frame = wmem_list_frame_next(list_frame)) {
7543 corresponding_uplane_frame *frame = wmem_list_frame_data(list_frame);
7544
7545 if (!wmem_tree_contains32(frames_set, frame->frame_number)) {
7546 /* Only check/show gap for first section from a given wireshark frame */
7547 if (first_gap == 0) {
7548 first_gap = frame->gap_in_usecs;
7549 first_symbol = frame->symbol;
7550 }
7551 else {
7552 /* Compare calculated vs actual arrival times */
7553 first_gap_delta = frame->gap_in_usecs - first_gap;
7554 unsigned expected_delta = pref_symbol_time * (frame->symbol-first_symbol);
7555 proto_item *delta_ti = proto_tree_add_int(oran_tree,
7556 (direction==0) ? hf_oran_delta_to_expected_ul_symbol_time : hf_oran_delta_to_expected_dl_symbol_time,
7557 tvb, 0, 0, first_gap_delta-expected_delta);
7558 proto_item_append_text (delta_ti, " (%u symbols since first, assuming %u\u03bcs/symbol)", frame->symbol-first_symbol, pref_symbol_time);
7559 proto_item_set_generated(delta_ti);
7560 }
7561 }
7562
7563 /* Show link to U-plane frame */
7564 proto_item *uplane_frame_ti = proto_tree_add_uint(oran_tree, hf_oran_corresponding_uplane_frame, tvb, 0, 0,
7565 frame->frame_number);
7566 proto_item_append_text(uplane_frame_ti, " sectionId:%2u symbol:%2u ", frame->sectionId, frame->symbol);
7567 if (frame->numPrbu > 1) {
7568 proto_item_append_text(uplane_frame_ti, "PRBs %3u->%3u", frame->startPrbu, frame->startPrbu+frame->numPrbu-1);
7569 }
7570 else {
7571 proto_item_append_text(uplane_frame_ti, "PRB: %3u", frame->startPrbu);
7572 }
7573
7574 proto_item_set_generated(uplane_frame_ti);
7575
7576 if (first_section) {
7577 /* Only show timings on first entry for a frame */
7578 proto_item_append_text(uplane_frame_ti, " (in %u\u03bcs)", frame->gap_in_usecs);
7579 first_section = false0;
7580 }
7581
7582 if (first_gap_delta) {
7583 /* Only show timings on first entry for a frame */
7584 proto_item_append_text(uplane_frame_ti, " (in %u\u03bcs) +%u", frame->gap_in_usecs, first_gap_delta);
7585 first_gap_delta = 0;
7586 }
7587
7588 wmem_tree_insert32(frames_set, frame->frame_number, NULL((void*)0));
7589 }
7590 /* Also show total number of corresponding u-plane frames */
7591
7592 proto_item *uplane_frame_count_ti = proto_tree_add_uint(oran_tree, hf_oran_corresponding_uplane_frames_total, tvb, 0, 0, wmem_tree_count(frames_set));
7593 proto_item_set_generated(uplane_frame_count_ti);
7594 /* No longer need this set/tree */
7595 wmem_tree_destroy(frames_set, false0, false0);
7596 }
7597
7598 return tvb_captured_length(tvb);
7599}
7600
7601static int dissect_oran_u_re(tvbuff_t *tvb, proto_tree *tree,
7602 unsigned sample_number, int samples_offset,
7603 oran_tap_info *tap_info,
7604 unsigned sample_bit_width,
7605 int comp_meth,
7606 uint32_t exponent,
7607 section_mod_compr_config_t *mod_compr_params,
7608 uint8_t re, float * const re_power)
7609{
7610 /* I */
7611 unsigned i_bits = tvb_get_bits32(tvb, samples_offset, sample_bit_width, ENC_BIG_ENDIAN0x00000000);
7612 float i_value = decompress_value(i_bits, comp_meth, sample_bit_width, exponent, mod_compr_params, re);
7613 unsigned sample_len_in_bytes = ((samples_offset%8)+sample_bit_width+7)/8;
7614 proto_item *i_ti = proto_tree_add_float(tree, hf_oran_iSample, tvb, samples_offset/8, sample_len_in_bytes, i_value);
7615 proto_item_set_text(i_ti, "iSample: % 0.7f 0x%04x (RE-%2u in the PRB)", i_value, i_bits, sample_number);
7616 samples_offset += sample_bit_width;
7617 /* Q */
7618 unsigned q_bits = tvb_get_bits32(tvb, samples_offset, sample_bit_width, ENC_BIG_ENDIAN0x00000000);
7619 float q_value = decompress_value(q_bits, comp_meth, sample_bit_width, exponent, mod_compr_params, re);
7620 sample_len_in_bytes = ((samples_offset%8)+sample_bit_width+7)/8;
7621 proto_item *q_ti = proto_tree_add_float(tree, hf_oran_qSample, tvb, samples_offset/8, sample_len_in_bytes, q_value);
7622 proto_item_set_text(q_ti, "qSample: % 0.7f 0x%04x (RE-%2u in the PRB)", q_value, q_bits, sample_number);
7623 samples_offset += sample_bit_width;
7624 *re_power = i_value*i_value + q_value*q_value;
7625 /* Update RE stats */
7626 tap_info->num_res++;
7627 /* if (i_value == 0.0 && q_value == 0.0) { */
7628 /* TODO: is just checking bits from frame good enough - assuming this always corresponds to a zero value? */
7629 if (i_bits == 0 && q_bits == 0) {
7630 tap_info->num_res_zero++;
7631 }
7632 else {
7633 tap_info->non_zero_re_in_current_prb = true1;
7634 }
7635 return samples_offset;
7636}
7637
7638
7639static bool_Bool udcomplen_appears_present(bool_Bool udcomphdr_present, tvbuff_t *tvb, int offset)
7640{
7641 if (!udcomplen_heuristic_result_set) {
7642 /* All sections will start the same way */
7643 unsigned int section_bytes_before_field = (udcomphdr_present) ? 6 : 4;
7644
7645 /* Move offset back to the start of the section */
7646 offset -= section_bytes_before_field;
7647
7648 do {
7649 /* This field appears several bytes into the U-plane section */
7650 uint32_t length_remaining = tvb_reported_length_remaining(tvb, offset);
7651 /* Are there enough bytes to still read the length field? */
7652 if (section_bytes_before_field+2 > length_remaining) {
7653 udcomplen_heuristic_result = false0;
7654 udcomplen_heuristic_result_set = true1;
7655 break;
7656 }
7657
7658 /* Read the length field */
7659 uint16_t udcomplen = tvb_get_ntohs(tvb, offset+section_bytes_before_field);
7660
7661 /* Is this less than a valid section? Realistic minimal section will be bigger than this..
7662 * Could take into account numPrbU, etc */
7663 if (udcomplen < section_bytes_before_field+2) {
7664 udcomplen_heuristic_result = false0;
7665 udcomplen_heuristic_result_set = true1;
7666 break;
7667 }
7668
7669 /* Does this section fit into the frame? */
7670 if (udcomplen > length_remaining) {
7671 udcomplen_heuristic_result = false0;
7672 udcomplen_heuristic_result_set = true1;
7673 break;
7674 }
7675
7676 /* Move past this section */
7677 offset += udcomplen;
7678
7679 /* Are we at the end of the frame? */
7680 /* TODO: if frame is less than 60 bytes, there may be > 4 bytes, likely zeros.. */
7681 if (tvb_reported_length_remaining(tvb, offset) < 4) {
7682 udcomplen_heuristic_result = true1;
7683 udcomplen_heuristic_result_set = true1;
7684 }
7685 } while (!udcomplen_heuristic_result_set);
7686 }
7687 return udcomplen_heuristic_result;
7688}
7689
7690static bool_Bool at_udcomphdr(tvbuff_t *tvb, int offset)
7691{
7692 if (tvb_captured_length_remaining(tvb, offset) < 2) {
7693 return false0;
7694 }
7695 uint8_t first_byte = tvb_get_uint8(tvb, offset);
7696 uint8_t reserved_byte = tvb_get_uint8(tvb, offset+1);
7697
7698 /* - iq width could be anything, though unlikely to be signalled as (say) < 1-3? */
7699 /* - meth should be 0-8 */
7700 /* - reserved byte should be 0 */
7701 return (((first_byte & 0x0f) <= MOD_COMPR_AND_SELECTIVE_RE_WITH_MASKS8) && (reserved_byte == 0));
7702}
7703
7704static bool_Bool udcomphdr_appears_present(flow_state_t *flow, uint32_t direction, tvbuff_t *tvb, int offset)
7705{
7706 /* Should really not happen, but guard against this anyway. */
7707 if (flow == NULL((void*)0)) {
7708 /* No state to update. */
7709 return false0;
7710 }
7711
7712 if (direction == DIR_UPLINK0) {
7713 if (flow->udcomphdrUplink_heuristic_result_set) {
7714 /* Return cached value */
7715 return flow->udcomphdrUplink_heuristic_result;
7716 }
7717 else {
7718 /* Work it out, and save answer for next time */
7719 flow->udcomphdrUplink_heuristic_result_set = true1;
7720 flow->udcomphdrUplink_heuristic_result = at_udcomphdr(tvb, offset);
7721 return flow->udcomphdrUplink_heuristic_result;
7722 }
7723 }
7724 else {
7725 /* Downlink */
7726 if (flow->udcomphdrDownlink_heuristic_result_set) {
7727 /* Return cached value */
7728 return flow->udcomphdrDownlink_heuristic_result;
7729 }
7730 else {
7731 /* Work it out, and save answer for next time */
7732 flow->udcomphdrDownlink_heuristic_result_set = true1;
7733 flow->udcomphdrDownlink_heuristic_result = at_udcomphdr(tvb, offset);
7734 return flow->udcomphdrDownlink_heuristic_result;
7735 }
7736 }
7737}
7738
7739/*
7740 dissect_oran_u_timing_header()
7741 Table 8.3.2-1, octets 9-12..
7742 */
7743static int dissect_oran_u_timing_header(tvbuff_t *tvb, packet_info *pinfo, unsigned offset,
7744 proto_item * timingHeader, oran_tap_info *tap_info, uint32_t * frameIdPtr, uint32_t * subframeIdPtr, uint32_t * slotIdPtr,
7745 uint32_t * symbolIdPtr, uint32_t * directionPtr )
7746{
7747 /* Now does the data combine correctly? */
7748 /* Common header for time reference */
7749 proto_tree *timing_header_tree = proto_item_add_subtree(timingHeader, ett_oran_u_timing);
7750
7751 /* dataDirection */
7752 proto_tree_add_item_ret_uint(timing_header_tree, hf_oran_data_direction, tvb, offset, 1, ENC_NA0x00000000, directionPtr);
7753 tap_info->uplink = ((*directionPtr)==0);
7754 /* payloadVersion */
7755 dissect_payload_version(timing_header_tree, tvb, pinfo, offset);
7756 /* filterIndex */
7757 proto_tree_add_item(timing_header_tree, hf_oran_filter_index, tvb, offset, 1, ENC_NA0x00000000);
7758 offset += 1;
7759
7760 int ref_a_offset = offset;
7761
7762 /* frameId */
7763 proto_tree_add_item_ret_uint(timing_header_tree, hf_oran_frame_id, tvb, offset, 1, ENC_NA0x00000000, frameIdPtr);
7764 tap_info->frame = *frameIdPtr;
7765 offset += 1;
7766
7767 /* subframeId */
7768 proto_tree_add_item_ret_uint(timing_header_tree, hf_oran_subframe_id, tvb, offset, 1, ENC_NA0x00000000, subframeIdPtr);
7769 /* slotId */
7770 proto_tree_add_item_ret_uint(timing_header_tree, hf_oran_slot_id, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, slotIdPtr);
7771 tap_info->slot = *slotIdPtr;
7772 offset++;
7773 /* symbolId */
7774 proto_tree_add_item_ret_uint(timing_header_tree, hf_oran_symbolId, tvb, offset, 1, ENC_NA0x00000000, symbolIdPtr);
7775 offset++;
7776
7777 char id[16];
7778 snprintf(id, 16, "%u-%u-%u-%u", *frameIdPtr, *subframeIdPtr, *slotIdPtr, *symbolIdPtr);
7779 proto_item *pi = proto_tree_add_string(timing_header_tree, hf_oran_refa, tvb, ref_a_offset, 3, id);
7780 proto_item_set_generated(pi);
7781
7782 proto_item_append_text(timingHeader, "%s, frameId: %d, subframeId: %d, slotId: %d, symbolId: %d)",
7783 val_to_str_const(*directionPtr, data_direction_vals, "Unknown"), *frameIdPtr, *subframeIdPtr, *slotIdPtr, *symbolIdPtr);
7784 return offset;
7785}
7786
7787/*
7788 dissect_oran_u_section_header()
7789 Mandatory Section Header fields (darker green part)
7790 Table 8.3.2-1, octets 13-16. Optional fields handled elsewhere.
7791 */
7792static int dissect_oran_u_section_header(tvbuff_t *tvb, packet_info *pinfo, unsigned offset,
7793 proto_tree * section_tree,
7794 oran_tap_info *tap_info,
7795 flow_result_t *result, flow_state_t *cplane_state,
7796 uint32_t frameId, uint32_t subframeId, uint32_t slotId, uint32_t symbolId,
7797 uint32_t direction, uint32_t * sectionIdPtr, uint32_t * rbPtr, uint32_t *startPrbuPtr, uint32_t *numPrbuPtr,
7798 section_details_t **section_details_ptr)
7799{
7800 proto_item *sectionId_ti = proto_tree_add_item_ret_uint(section_tree, hf_oran_section_id, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, sectionIdPtr);
7801 if (*sectionIdPtr == 4095) {
7802 proto_item_append_text(sectionId_ti, " (not default coupling C/U planes using sectionId)");
7803 }
7804 offset++;
7805
7806 if (tap_info->num_section_ids < MAX_SECTION_IDs32) {
7807 tap_info->section_ids[tap_info->num_section_ids++] = *sectionIdPtr;
7808 }
7809
7810 section_details_t *section_details = NULL((void*)0);
7811 corresponding_uplane_frame *details = NULL((void*)0);
7812
7813 /* Lookup corresponding C-plane frame/info */
7814 if (link_planes_together) {
7815 if (result && result->cplane_seen) {
7816
7817 expected_section_data_t *section_data = NULL((void*)0);
7818 section_data = wmem_tree_lookup32(result->expected_sections, *sectionIdPtr);
7819
7820 if (!section_data && !PINFO_FD_VISITED(pinfo)((pinfo)->fd->visited) && cplane_state) {
7821 /* Take a deep-copy of the C-plane state for this sectionId on first pass */
7822 expected_section_data_t *cplane_data = wmem_tree_lookup32(cplane_state->expected_sections[direction],
7823 *sectionIdPtr);
7824 if (cplane_data) {
7825 section_data = wmem_memdup(wmem_file_scope(), cplane_data, sizeof(expected_section_data_t));
7826 wmem_tree_insert32(result->expected_sections, *sectionIdPtr, section_data);
7827 }
7828 }
7829
7830 if (section_data) {
7831 /* Need to work out which of 2 entries is in use for this data frame */
7832 unsigned index_to_use = 0;
7833
7834 /* Does the first entry match the timing for this frame? */
7835 if (section_data->details[0].in_use &&
7836 section_data->details[0].frame == frameId &&
7837 section_data->details[0].subframe == subframeId &&
7838 section_data->details[0].slot == slotId &&
7839 /* Check that symbolId is in range */
7840 section_data->details[0].startSymbol <= symbolId &&
7841 (unsigned)symbolId < (unsigned)(section_data->details[0].startSymbol + section_data->details[0].numSymbols)) {
7842
7843 index_to_use = 0;
7844 }
7845 else if (section_data->details[1].in_use &&
7846 section_data->details[1].frame == frameId &&
7847 section_data->details[1].subframe == subframeId &&
7848 section_data->details[1].slot == slotId &&
7849 /* Check that symbolId is in range */
7850 section_data->details[1].startSymbol <= symbolId &&
7851 (unsigned)symbolId < (unsigned)(section_data->details[1].startSymbol + section_data->details[1].numSymbols)) {
7852
7853 index_to_use = 1;
7854 }
7855 else {
7856 /* There was a sectionId, but timing header didn't exactly match, so neither index may be used.. */
7857 index_to_use = 2; /* invalid value */
7858 /* Expert info */
7859 expert_add_info_format(NULL((void*)0), sectionId_ti,
7860 &ei_oran_cplane_entry_not_found,
7861 "C-plane entry for %s sectionId %u at timing header %u-%u-%u-%u"
7862 " timing didn't match C-plane",
7863 (direction) ? "DL" : "UL", *sectionIdPtr,
7864 frameId, subframeId, slotId, symbolId);
7865 }
7866
7867 if (index_to_use <= 1) {
7868 section_details = &section_data->details[index_to_use];
7869
7870 /* Cplane frame number */
7871 proto_item *cplane_frame_ti = proto_tree_add_uint(section_tree, hf_oran_corresponding_cplane_frame, tvb, 0, 0,
7872 section_details->frame_number);
7873 proto_item_set_generated(cplane_frame_ti);
7874
7875 /* usecs since cplane frame */
7876 time_t total_gap = 0;
7877
7878 if ((pinfo->abs_ts.secs == section_details->frame_time.secs) || (pinfo->abs_ts.secs == section_details->frame_time.secs+1)) {
7879 total_gap = ((pinfo->abs_ts.secs - section_details->frame_time.secs) * 1000000) +
7880 ((pinfo->abs_ts.nsecs - section_details->frame_time.nsecs)/1000);
7881 }
7882
7883 if (total_gap > 0) {
7884 proto_item *cplane_delta_ti = proto_tree_add_uint64(section_tree, hf_oran_corresponding_cplane_frame_time_delta, tvb, 0, 0, (uint64_t)total_gap);
7885 proto_item_set_generated(cplane_delta_ti);
7886 }
7887
7888 if (!PINFO_FD_VISITED(pinfo)((pinfo)->fd->visited)) {
7889 /* Look up 'result' for c-plane frame, and tell it about this frame.. */
7890 flow_result_t *cplane_result = wmem_tree_lookup32(flow_results_table, section_details->frame_number);
7891 if (!cplane_result) {
7892 cplane_result = wmem_new0(wmem_file_scope(), flow_result_t)((flow_result_t*)wmem_alloc0((wmem_file_scope()), sizeof(flow_result_t
)))
;
7893 cplane_result->u_plane_frames = wmem_list_new(wmem_file_scope());
7894 wmem_tree_insert32(flow_results_table, section_details->frame_number, cplane_result);
7895 }
7896 /* PRB range filled in below.. */
7897
7898 details = wmem_new(wmem_file_scope(), corresponding_uplane_frame)((corresponding_uplane_frame*)wmem_alloc((wmem_file_scope()),
sizeof(corresponding_uplane_frame)))
;
7899 details->frame_number = pinfo->num;
7900 details->gap_in_usecs = (uint32_t)total_gap;
7901 details->sectionId = *sectionIdPtr;
7902 details->symbol = symbolId;
7903
7904 wmem_list_append(cplane_result->u_plane_frames, details);
7905 }
7906 }
7907 }
7908 else {
7909 /* No section entry at all */
7910 expert_add_info_format(NULL((void*)0), sectionId_ti,
7911 &ei_oran_cplane_entry_not_found,
7912 "C-plane entry for %s sectionId %u not found",
7913 (direction) ? "DL" : "UL", *sectionIdPtr);
7914 }
7915 }
7916 }
7917
7918 /* rb */
7919 proto_tree_add_item_ret_uint(section_tree, hf_oran_rb, tvb, offset, 1, ENC_NA0x00000000, rbPtr);
7920 /* symInc. "use of symInc=1 shall be prohibited in the U-plane" */
7921 uint8_t syminc;
7922 proto_item *syminc_ti = proto_tree_add_item_ret_uint8(section_tree, hf_oran_symInc, tvb, offset, 1, ENC_NA0x00000000, &syminc);
7923 if (syminc) {
7924 expert_add_info(NULL((void*)0), syminc_ti, &ei_oran_syminc_set_for_uplane);
7925 }
7926 /* startPrbu */
7927 proto_tree_add_item_ret_uint(section_tree, hf_oran_startPrbu, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, startPrbuPtr);
7928 offset += 2;
7929
7930 /* numPrbu */
7931 proto_tree_add_item_ret_uint(section_tree, hf_oran_numPrbu, tvb, offset, 1, ENC_NA0x00000000, numPrbuPtr);
7932 offset += 1;
7933
7934 if (!PINFO_FD_VISITED(pinfo)((pinfo)->fd->visited) && details) {
7935 details->startPrbu = *startPrbuPtr;
7936 details->numPrbu = (*numPrbuPtr) ? (*numPrbuPtr) : 273;
7937 }
7938
7939 *section_details_ptr = section_details;
7940 return offset;
7941}
7942
7943/* unscaled_power_correction computes correction required to rescale reported power in order to report dBFS */
7944static float unscaled_power_correction(int sample_bit_width, unsigned compression) {
7945 /* Logic for COMP_NONE and COMP_BLOCK_FP. No adjustment required for COMP_MODULATION */
7946 float correction = 0.0f;
7947 switch(compression) {
7948 case COMP_BLOCK_FP1:
7949 case BFP_AND_SELECTIVE_RE5:
7950 case BFP_AND_SELECTIVE_RE_WITH_MASKS7:
7951 correction = 20.0f*((float)(M_LOG10E0.43429448190325182765/M_LOG2E1.4426950408889634074))*((sample_bit_width-1) + 15);
7952 break;
7953 case COMP_NONE0:
7954 correction = 20.0f*((float)(M_LOG10E0.43429448190325182765/M_LOG2E1.4426950408889634074))*(sample_bit_width-1);
7955 break;
7956 default:
7957 break;
7958 }
7959 return correction;
7960}
7961
7962static int dissect_oran_u_section(tvbuff_t *tvb, packet_info *pinfo, unsigned offset,
7963 proto_tree * oran_tree,
7964 proto_item * protocol_item,
7965 oran_tap_info *tap_info,
7966 flow_state_t *state, flow_result_t *result, flow_state_t *cplane_state,
7967 uint32_t frameId, uint32_t subframeId, uint32_t slotId, uint32_t symbolId,
7968 uint32_t direction, int includeUdCompHeader, unsigned * sample_bit_width_ptr,
7969 unsigned compression, bool_Bool ud_cmp_hdr_cplane, unsigned *nBytesPerPrbPtr)
7970{
7971 /* Section subtree */
7972 unsigned section_start_offset = offset;
7973 proto_item *sectionHeading = proto_tree_add_string_format(oran_tree, hf_oran_u_section,
7974 tvb, offset, 0, "", "Section");
7975 proto_tree *section_tree = proto_item_add_subtree(sectionHeading, ett_oran_u_section);
7976 section_details_t *section_details = NULL((void*)0);
7977
7978 /* Total (section) power and peak power */
7979 float total_power = 0.0f;
7980 float peak_power = 0.0f;
7981 int peak_location = 0;
7982
7983 /* Section Header fields [fixed parts] (darker green part) */
7984 uint32_t sectionId = 0, rb, startPrbu = 0, numPrbu = 0;
7985
7986 offset = dissect_oran_u_section_header(tvb, pinfo, offset, section_tree, tap_info, result, cplane_state,
7987 frameId, subframeId, slotId, symbolId, direction, &sectionId, &rb, &startPrbu, &numPrbu,
7988 &section_details);
7989
7990 proto_item *ud_comp_meth_item, *ud_comp_len_ti=NULL((void*)0);
7991 uint32_t ud_comp_len = 0;
7992
7993 /* udCompHdr (if preferences indicate will be present) */
7994 bool_Bool included = (includeUdCompHeader==1) || /* 1 means present.. */
7995 (includeUdCompHeader==2 && udcomphdr_appears_present(state, direction, tvb, offset)); /* heuristic */
7996 bool_Bool udCompHdr_ignored = direction == 0 && pref_override_ul_compression; /* Ignore UL if configured to */
7997 if (included) {
7998 /* 7.5.2.10 */
7999 /* Extract these values to inform how wide IQ samples in each PRB will be. */
8000 offset = dissect_udcomphdr(tvb, pinfo, section_tree, offset, false0,
8001 udCompHdr_ignored,
8002 sample_bit_width_ptr,
8003 &compression, &ud_comp_meth_item, tap_info);
8004
8005 /* Not part of udCompHdr */
8006 uint32_t reserved;
8007 proto_item *res_ti = proto_tree_add_item_ret_uint(section_tree, hf_oran_reserved_8bits, tvb, offset, 1, ENC_NA0x00000000, &reserved);
8008 offset += 1;
8009 if (reserved != 0) {
8010 expert_add_info_format(pinfo, res_ti, &ei_oran_reserved_not_zero,
8011 "reserved field (0x%x) not zero - perhaps udCompHdr is not really present?",
8012 reserved);
8013 }
8014 }
8015
8016 if (!included || udCompHdr_ignored) {
8017 /* No fields to dissect - just showing comp values from prefs */
8018 /* iqWidth */
8019 proto_item *iq_width_item = proto_tree_add_uint(section_tree, hf_oran_udCompHdrIqWidth_pref, tvb, 0, 0, *sample_bit_width_ptr);
8020 proto_item_append_text(iq_width_item, (ud_cmp_hdr_cplane) ? " (from c-plane)" : " (from preferences)");
8021 proto_item_set_generated(iq_width_item);
8022
8023 /* udCompMethod */
8024 ud_comp_meth_item = proto_tree_add_uint(section_tree, hf_oran_udCompHdrMeth_pref, tvb, 0, 0, compression);
8025 proto_item_append_text(ud_comp_meth_item, (ud_cmp_hdr_cplane) ? " (from c-plane)" : " (from preferences)");
8026 proto_item_set_generated(ud_comp_meth_item);
8027
8028 /* Point back to C-Plane, if used */
8029 /* TODO: doesn't work with multiple port mappings using SE10.. */
8030 if (ud_cmp_hdr_cplane) {
8031 proto_item *cplane_ti = proto_tree_add_uint(section_tree, hf_oran_ul_cplane_ud_comp_hdr_frame, tvb, offset, 0, result->ul_ud_comp_hdr_frame);
8032 proto_item_set_generated(cplane_ti);
8033 }
8034
8035 /* Still adding these values to tap */
8036 tap_info->compression_methods |= (1 << compression);
8037 tap_info->compression_width = MAX(tap_info->compression_width, *sample_bit_width_ptr)(((tap_info->compression_width) > (*sample_bit_width_ptr
)) ? (tap_info->compression_width) : (*sample_bit_width_ptr
))
;
8038 }
8039
8040 /* Not supported! TODO: other places where comp method is looked up (e.g., bfw?) */
8041 switch (compression) {
8042 case COMP_NONE0:
8043 case COMP_BLOCK_FP1:
8044 case BFP_AND_SELECTIVE_RE5:
8045 case COMP_MODULATION4:
8046 case MOD_COMPR_AND_SELECTIVE_RE6:
8047 case BFP_AND_SELECTIVE_RE_WITH_MASKS7:
8048 case MOD_COMPR_AND_SELECTIVE_RE_WITH_MASKS8:
8049 break;
8050 default:
8051 expert_add_info_format(pinfo, ud_comp_meth_item, &ei_oran_unsupported_compression_method,
8052 "Compression method %u (%s) not supported by dissector",
8053 compression,
8054 rval_to_str_const(compression, ud_comp_header_meth, "reserved"));
8055 }
8056
8057 /* udCompLen (when supported, methods 5,6,7,8) */
8058 if (compression >= BFP_AND_SELECTIVE_RE5) {
8059 bool_Bool supported = (pref_support_udcompLen==1) || /* supported */
8060 (pref_support_udcompLen==2 && udcomplen_appears_present(included, tvb, offset));
8061
8062 if (supported) {
8063 ud_comp_len_ti = proto_tree_add_item_ret_uint(section_tree, hf_oran_udCompLen, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &ud_comp_len);
8064 if (ud_comp_len <= 1) {
8065 proto_item_append_text(ud_comp_len_ti, " (reserved)");
8066 }
8067 /* TODO: report if less than a viable section in frame? */
8068 /* Check that there is this much length left in the frame */
8069 if (ud_comp_len > tvb_reported_length_remaining(tvb, section_start_offset)) {
8070 expert_add_info_format(pinfo, ud_comp_len_ti, &ei_oran_ud_comp_len_wrong_size,
8071 "udCompLen indicates %u bytes in section, but only %u are left in frame",
8072 ud_comp_len, tvb_reported_length_remaining(tvb, section_start_offset));
8073 }
8074 /* Actual length of section will be checked below, at the end of the section */
8075 offset += 2;
8076 }
8077 }
8078
8079 /* sReSMask1 + sReSMask2 (depends upon compression method) */
8080 uint64_t sresmask1=0, sresmask2=0;
8081 if (compression == BFP_AND_SELECTIVE_RE_WITH_MASKS7 ||
8082 compression == MOD_COMPR_AND_SELECTIVE_RE_WITH_MASKS8)
8083 {
8084 static int * const sres_mask1_2_flags[] = {
8085 &hf_oran_sReSMask1_2_re12,
8086 &hf_oran_sReSMask1_2_re11,
8087 &hf_oran_sReSMask1_2_re10,
8088 &hf_oran_sReSMask1_2_re9,
8089 &hf_oran_sReSMask_re8,
8090 &hf_oran_sReSMask_re7,
8091 &hf_oran_sReSMask_re6,
8092 &hf_oran_sReSMask_re5,
8093 &hf_oran_sReSMask_re4,
8094 &hf_oran_sReSMask_re3,
8095 &hf_oran_sReSMask_re2,
8096 &hf_oran_sReSMask_re1,
8097 NULL((void*)0)
8098 };
8099
8100 /* reserved (4 bits) */
8101 add_reserved_field(section_tree, hf_oran_reserved_4bits, tvb, offset, 1);
8102 /* sReSMask1 (12 bits) */
8103 proto_item *sresmask_ti;
8104 sresmask_ti = proto_tree_add_bitmask_ret_uint64(section_tree, tvb, offset,
8105 hf_oran_sReSMask1,
8106 ett_oran_sresmask,
8107 sres_mask1_2_flags,
8108 ENC_NA0x00000000,
8109 &sresmask1);
8110 offset += 2;
8111 /* Count REs present */
8112 unsigned res = 0;
8113 for (unsigned n=0; n < 12; n++) {
8114 if ((sresmask1 >> n) & 0x1) {
8115 res++;
8116 }
8117 }
8118 proto_item_append_text(sresmask_ti, " (%u REs)", res);
8119
8120
8121 /* reserved (4 bits) */
8122 add_reserved_field(section_tree, hf_oran_reserved_4bits, tvb, offset, 1);
8123 /* sReSMask2 (12 bits) */
8124 sresmask_ti = proto_tree_add_bitmask_ret_uint64(section_tree, tvb, offset,
8125 hf_oran_sReSMask2,
8126 ett_oran_sresmask,
8127 sres_mask1_2_flags,
8128 ENC_NA0x00000000,
8129 &sresmask2);
8130 offset += 2;
8131
8132 if (rb == 1) {
8133 proto_item_append_text(sresmask_ti, " (ignored)");
8134 if (sresmask2 != 0) {
8135 expert_add_info(pinfo, ud_comp_len_ti, &ei_oran_sresmask2_not_zero_with_rb);
8136 }
8137 }
8138 else {
8139 /* Count REs present */
8140 res = 0;
8141 for (unsigned n=0; n < 12; n++) {
8142 if ((sresmask2 >> n) & 0x1) {
8143 res++;
8144 }
8145 }
8146 proto_item_append_text(sresmask_ti, " (%u REs)", res);
8147 }
8148 }
8149
8150 write_section_info(sectionHeading, pinfo, protocol_item, sectionId, startPrbu, numPrbu, rb);
8151
8152 /* TODO: should this use the same pref as c-plane? */
8153 if (numPrbu == 0) {
8154 /* Special case for all PRBs (NR: the total number of PRBs may be > 255) */
8155 numPrbu = pref_data_plane_section_total_rbs;
8156 startPrbu = 0; /* may already be 0... */
8157 }
8158
8159 section_mod_compr_config_t* mod_compr_config = get_mod_compr_section_to_read(cplane_state, sectionId);
8160
8161 /* Add each PRB */
8162 for (unsigned i = 0; i < numPrbu; i++) {
8163 /* Create subtree */
8164 proto_item *prbHeading = proto_tree_add_string_format(section_tree, hf_oran_samples_prb,
8165 tvb, offset, 0,
8166 "", "PRB");
8167 proto_tree *rb_tree = proto_item_add_subtree(prbHeading, ett_oran_u_prb);
8168 uint32_t exponent = 0;
8169 uint16_t sresmask = 0;
8170
8171 /* udCompParam (depends upon compression method) */
8172 int before = offset;
8173 offset = dissect_udcompparam(tvb, pinfo, rb_tree, offset, compression, &exponent, &sresmask, false0);
8174 int udcompparam_len = offset-before;
8175
8176 /* Show PRB number in root */
8177 proto_item_append_text(prbHeading, " %3u", startPrbu + i*(1+rb));
8178
8179 /* Work out how many REs / PRB */
8180 unsigned res_per_prb = 12;
8181 uint16_t sresmask_to_use = 0x0fff;
8182 float rb_power = 0.0f;
8183
8184 if (compression >= BFP_AND_SELECTIVE_RE5) {
8185 /* Work out which mask should be used */
8186 if (compression==BFP_AND_SELECTIVE_RE5 || compression==MOD_COMPR_AND_SELECTIVE_RE6) {
8187 /* Selective RE cases, use value from compModParam */
8188 sresmask_to_use = (uint16_t)sresmask;
8189 }
8190 else {
8191 /* With masks (in section). Choose between sresmask1 and sresmask2 */
8192 if (rb==1 || (i%2)==0) {
8193 /* Even values */
8194 sresmask_to_use = (uint16_t)sresmask1;
8195 }
8196 else {
8197 /* Odd values */
8198 sresmask_to_use = (uint16_t)sresmask2;
8199 }
8200 }
8201
8202 /* Count REs present using sresmask */
8203 res_per_prb = 0;
8204 /* Use sresmask to pick out which REs are present */
8205 for (unsigned n=0; n<12; n++) {
8206 if (sresmask_to_use & (1<<n)) {
8207 res_per_prb++;
8208 }
8209 }
8210 }
8211
8212 /* N.B. bytes for samples need to be padded out to next byte
8213 (certainly where there aren't 12 REs in PRB..) */
8214 unsigned nBytesForSamples = ((*sample_bit_width_ptr) * res_per_prb * 2 + 7) / 8;
8215 *nBytesPerPrbPtr = nBytesForSamples + udcompparam_len;
8216
8217 proto_tree_add_item(rb_tree, hf_oran_iq_user_data, tvb, offset, nBytesForSamples, ENC_NA0x00000000);
8218
8219 if (section_details) {
8220 if ((startPrbu + i*(1+rb)) < 273) {
8221 proto_item *beamid_ti = proto_tree_add_uint(rb_tree, hf_oran_beamId, tvb, 0, 0,
8222 section_details->beamIds[startPrbu + i*(1+rb)]);
8223 proto_item_set_generated(beamid_ti);
8224 }
8225 }
8226
8227
8228 tap_info->non_zero_re_in_current_prb = false0;
8229
8230 /* Optionally trying to show I/Q RE values */
8231 if (pref_showIQSampleValues) {
8232 /* Individual values */
8233 unsigned samples_offset = offset*8;
8234 unsigned samples_start = offset;
8235 unsigned samples = 0;
8236
8237 float re_power = 0.0f;
8238 if (compression >= BFP_AND_SELECTIVE_RE5) {
8239 /* Use sresmask to pick out which REs are present */
8240 for (unsigned n=1; n<=12; n++) {
8241 if (sresmask_to_use & (1<<(n-1))) {
8242 int new_samples_offset =
8243 dissect_oran_u_re(tvb, rb_tree, n, samples_offset, tap_info, *sample_bit_width_ptr,
8244 compression, exponent, mod_compr_config, n, &re_power);
8245 rb_power += re_power;
8246 if ( re_power > peak_power ) {
8247 peak_power = re_power;
8248 peak_location = samples_offset;
8249 }
8250 samples_offset = new_samples_offset;
8251 samples++;
8252 }
8253 }
8254 }
8255 else {
8256 /* All 12 REs are present */
8257 for (unsigned n=1; n<=12; n++) {
8258 int new_samples_offset =
8259 dissect_oran_u_re(tvb, rb_tree, n, samples_offset, tap_info, *sample_bit_width_ptr,
8260 compression, exponent, mod_compr_config, n, &re_power);
8261 rb_power += re_power;
8262 if ( re_power > peak_power ) {
8263 peak_power = re_power;
8264 peak_location = samples_offset;
8265 }
8266 samples_offset = new_samples_offset;
8267 samples++;
8268 }
8269 }
8270 proto_item_append_text(prbHeading, " (%u REs)", samples);
8271 if (section_details) {
8272 if ((startPrbu + i*(1+rb)) < 273) {
8273 proto_item_append_text(prbHeading, " [BeamId:%u]", section_details->beamIds[startPrbu + i*(1+rb)]);
8274 }
8275 }
8276
8277 /* Was this PRB all zeros? */
8278 if (!tap_info->non_zero_re_in_current_prb) {
8279 tap_info->num_prbs_zero++;
8280 /* Add a filter to make zero-valued PRBs more findable */
8281 proto_item *zero_ti = proto_tree_add_item(rb_tree, hf_oran_zero_prb, tvb,
8282 samples_start, nBytesForSamples, ENC_NA0x00000000);
8283 proto_item_set_hidden(zero_ti);
8284 proto_item_append_text(prbHeading, " (all zeros)");
8285 }
8286 else {
8287 proto_item *nonzero_ti = proto_tree_add_item(rb_tree, hf_oran_nonzero_prb, tvb, samples_start, nBytesForSamples, ENC_NA0x00000000);
8288 proto_item_set_hidden(nonzero_ti);
8289 }
8290 if (rb_power > 0.0f ) {
8291 /* Zero bit pattern does not infer zero power (see modComp) */
8292 rb_power = rb_power/samples;
8293 total_power += rb_power;
8294 float rb_power_dB = (float) (10.0*log10(rb_power));
8295 if ( show_unscaled_values ) {
8296 rb_power_dB = rb_power_dB - unscaled_power_correction(*sample_bit_width_ptr,compression);
8297 }
8298 proto_item_append_text(prbHeading, " [%3.2f dBFS]", rb_power_dB);
8299 proto_item * rb_power_ti = proto_tree_add_float(rb_tree, hf_oran_u_prb_power, tvb, samples_start, nBytesForSamples, rb_power_dB);
8300 proto_item_set_generated(rb_power_ti);
8301 }
8302 }
8303
8304 tap_info->num_prbs++;
8305
8306
8307 /* Advance past samples */
8308 offset += nBytesForSamples;
8309
8310 /* Set end of prb subtree */
8311 proto_item_set_end(prbHeading, tvb, offset);
8312 }
8313
8314 /* Set extent of section */
8315 proto_item_set_len(sectionHeading, offset-section_start_offset);
8316 if (ud_comp_len_ti != NULL((void*)0) && ((offset-section_start_offset != ud_comp_len))) {
8317 expert_add_info_format(pinfo, ud_comp_len_ti, &ei_oran_ud_comp_len_wrong_size,
8318 "udCompLen indicates %u bytes in section, but dissected %u instead",
8319 ud_comp_len, offset-section_start_offset);
8320 }
8321 /* Show total power: average over full bandwidth */
8322 if ( pref_showIQSampleValues ) {
8323 if ( total_power > 0.0f ) {
8324 float power_dBFS = (float)(10.0*log10(total_power/numPrbu));
8325 if ( show_unscaled_values ) {
8326 power_dBFS = power_dBFS - unscaled_power_correction(*sample_bit_width_ptr,compression);
8327 }
8328 proto_item *ti = proto_tree_add_float(section_tree, hf_oran_u_total_power, tvb, section_start_offset, offset-section_start_offset, power_dBFS);
8329 proto_item_set_generated(ti);
8330 proto_item_append_text(sectionHeading, " [Mean Power %3.2f dBFS]", power_dBFS);
8331 } else {
8332 proto_item_append_text(sectionHeading, " [all zeros]");
8333 }
8334
8335 if ( peak_power > 0.0 ) {
8336 float peak_to_average = peak_power / ((total_power/numPrbu));
8337 peak_to_average = (float) (10.0*log10(peak_to_average));
8338 unsigned sample_size = (peak_location + 2*(*sample_bit_width_ptr) + 7)/8 - peak_location/8;
8339 proto_item *ti = proto_tree_add_float(section_tree, hf_oran_u_peak_power, tvb, peak_location/8, sample_size, peak_to_average);
8340 proto_item_set_generated(ti);
8341 }
8342 }
8343 return offset;
8344}
8345
8346/* User plane dissector (section 8) */
8347static int
8348dissect_oran_u(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
8349 oran_tap_info *tap_info, void *data _U___attribute__((unused)))
8350{
8351 /* Hidden filter for plane */
8352 proto_item *plane_ti = proto_tree_add_item(tree, hf_oran_uplane, tvb, 0, 0, ENC_NA0x00000000);
8353 PROTO_ITEM_SET_HIDDEN(plane_ti)proto_item_set_hidden((plane_ti));
8354
8355 /* Set up structures needed to add the protocol subtree and manage it */
8356 unsigned offset = 0;
8357
8358 col_set_str(pinfo->cinfo, COL_PROTOCOL, "O-RAN-FH-U");
8359 col_set_str(pinfo->cinfo, COL_INFO, "U-Plane");
8360
8361 tap_info->userplane = true1;
8362
8363 /* Create display subtree for the protocol */
8364 proto_item *protocol_item = proto_tree_add_item(tree, proto_oran, tvb, 0, -1, ENC_NA0x00000000);
8365 proto_item_append_text(protocol_item, "-U");
8366 proto_tree *oran_tree = proto_item_add_subtree(protocol_item, ett_oran);
8367
8368 /* Transport header */
8369 /* Real-time control data / IQ data transfer message series identifier */
8370 uint16_t eAxC;
8371 addPcOrRtcid(tvb, oran_tree, &offset, hf_oran_ecpri_pcid, &eAxC, tap_info);
8372 tap_info->eaxc = eAxC;
8373
8374 /* Update/report status of conversation */
8375 flow_state_t* state = lookup_flow(pinfo, eAxC, ORAN_U_PLANE1, false0);
8376
8377 flow_result_t *result = NULL((void*)0);
8378
8379 /* Message identifier */
8380 proto_item *seqIdItem;
8381 uint32_t seqId, subSeqId, e;
8382 offset = addSeqid(tvb, oran_tree, offset, ORAN_U_PLANE1, &seqId, &seqIdItem, &subSeqId, &e);
8383
8384 uint32_t frameId = 0, subframeId = 0, slotId = 0, symbolId = 0, direction = 0;
8385
8386 /* Add buffer to the reassembly ahead of cycling through the options */
8387 if (do_radio_transport_layer_reassembly && (e !=1 || subSeqId!= 0)) {
8388 /* Set fragmented flag. */
8389 bool_Bool save_fragmented = pinfo->fragmented;
8390 pinfo->fragmented = true1;
8391 fragment_head *fh;
8392 unsigned frag_data_len = tvb_reported_length_remaining(tvb, offset);
8393
8394 /* Add this fragment into reassembly table */
8395 /* In the absence of information from the header [might not be present], use the MAC addresses. */
8396 int dir = cmp_address(&pinfo->src, &pinfo->dst)>0;
8397 uint32_t reassembly_id = make_reassembly_id(seqId, eAxC, dir);
8398 fh = fragment_add_seq(&oran_reassembly_table, tvb, offset, pinfo,
8399 reassembly_id, /* id */
8400 GUINT_TO_POINTER(reassembly_id)((gpointer) (gulong) (reassembly_id)), /* data */
8401 subSeqId, /* frag_number */
8402 frag_data_len, /* frag_data_len */
8403 !e, /* more_frags */
8404 0);
8405
8406 bool_Bool update_col_info = true1;
8407
8408 /* See if this completes an SDU */
8409 tvbuff_t *original_tvb = tvb;
8410 tvbuff_t *next_tvb = process_reassembled_data(tvb, offset, pinfo, "Reassembled O-RAN FH CUS Payload",
8411 fh, &oran_frag_items,
8412 &update_col_info, oran_tree);
8413 if (next_tvb) {
8414 /* Have reassembled data */
8415 proto_tree_add_item(oran_tree, hf_oran_payload, next_tvb, 0, -1, ENC_NA0x00000000);
8416 col_append_fstr(pinfo->cinfo, COL_INFO, " Reassembled Data (%u bytes)", tvb_reported_length(next_tvb));
8417 }
8418 /* Will continue with either reassembled tvb or NULL */
8419 tvb = next_tvb;
8420
8421 /* Restore fragmented flag */
8422 pinfo->fragmented = save_fragmented;
8423
8424 /* Don't dissect any more if not complete yet.. */
8425 if (tvb == NULL((void*)0)) {
8426 /* For subseq=0 it's possible to do a partial decode to display the timing header
8427 and first section header, but not much more */
8428 if ( subSeqId == 0 ) {
8429 if ( tvb_reported_length_remaining(original_tvb, offset) >= 4 ) {
8430 proto_item * timingHeader = proto_tree_add_string_format(oran_tree, hf_oran_timing_header,
8431 original_tvb, offset, 4, "", "Timing Header (");
8432 offset = dissect_oran_u_timing_header(original_tvb, pinfo, offset, timingHeader, tap_info, &frameId, &subframeId, &slotId, &symbolId, &direction);
8433
8434 if ( tvb_reported_length_remaining(original_tvb, offset) >= 4 ) {
8435 uint32_t sectionId, rb, startPrbu, numPrbu;
8436 section_details_t *section_details = NULL((void*)0);
8437 proto_item *sectionHeading = proto_tree_add_string_format(oran_tree, hf_oran_u_section,
8438 original_tvb, offset, 0, "", "Section");
8439 proto_tree *section_tree = proto_item_add_subtree(sectionHeading, ett_oran_u_section);
8440
8441 /* No C-plane linking for a partial decode */
8442 offset = dissect_oran_u_section_header(original_tvb, pinfo, offset, section_tree, tap_info, NULL((void*)0), NULL((void*)0),
8443 frameId, subframeId, slotId, symbolId, direction, &sectionId, &rb,
8444 &startPrbu, &numPrbu, &section_details);
8445 }
8446 }
8447 }
8448 return tvb_captured_length(original_tvb);
8449 }
8450 offset = 0; /* This sorts out the reading of the timing header and the first section header */
8451 }
8452
8453 proto_item * timingHeader = proto_tree_add_string_format(oran_tree, hf_oran_timing_header,
8454 tvb, offset, 4, "", "Timing Header (");
8455 offset = dissect_oran_u_timing_header(tvb, pinfo, offset, timingHeader, tap_info, &frameId, &subframeId, &slotId, &symbolId, &direction);
8456
8457 unsigned sample_bit_width;
8458 unsigned compression;
8459 int includeUdCompHeader;
8460
8461 /* Also lookup C-PLANE state (sent in opposite direction for UL) so may check current compression settings */
8462 flow_state_t* cplane_state = lookup_flow(pinfo, eAxC, ORAN_C_PLANE0, direction == 0);
8463
8464 if (!PINFO_FD_VISITED(pinfo)((pinfo)->fd->visited)) {
8465 /* Create state/conversation if doesn't exist yet */
8466 if (!state) {
8467 /* Allocate new state */
8468 state = wmem_new0(wmem_file_scope(), flow_state_t)((flow_state_t*)wmem_alloc0((wmem_file_scope()), sizeof(flow_state_t
)))
;
8469 state->ack_nack_requests = wmem_tree_new(wmem_file_scope());
8470 state->expected_sections[0] = wmem_tree_new(wmem_file_scope());
8471 state->expected_sections[1] = wmem_tree_new(wmem_file_scope());
8472 store_flow(pinfo, eAxC, ORAN_U_PLANE1, false0, state);
8473 }
8474
8475 result = wmem_new0(wmem_file_scope(), flow_result_t)((flow_result_t*)wmem_alloc0((wmem_file_scope()), sizeof(flow_result_t
)))
;
8476 result->expected_sections = wmem_tree_new(wmem_file_scope());
8477 result->u_plane_frames = wmem_list_new(wmem_file_scope());
8478 result->cplane_seen = (cplane_state != NULL((void*)0));
8479
8480 wmem_tree_insert32(flow_results_table, pinfo->num, result);
8481
8482 /* Check sequence analysis status (but not if later part of radio layer fragmentation) */
8483 if (state->last_frame_seen[direction] && (subSeqId==0) && (seqId != state->next_expected_sequence_number[direction])) {
8484 /* Store this result */
8485 result->unexpected_seq_number = true1;
8486 result->expected_sequence_number = state->next_expected_sequence_number[direction];
8487 result->previous_frame = state->last_frame[direction];
8488 }
8489 /* Update sequence analysis state */
8490 state->last_frame[direction] = pinfo->num;
8491 state->last_frame_seen[direction] = true1;
8492 state->next_expected_sequence_number[direction] = (seqId+1) % 256;
8493 }
8494
8495 /* Show any issues associated with this frame number */
8496 result = wmem_tree_lookup32(flow_results_table, pinfo->num);
8497 if (result) {
8498 if (result->unexpected_seq_number) {
8499 expert_add_info_format(pinfo, seqIdItem,
8500 (direction == DIR_UPLINK0) ?
8501 &ei_oran_uplane_unexpected_sequence_number_ul :
8502 &ei_oran_uplane_unexpected_sequence_number_dl,
8503 "Sequence number %u expected, but got %u",
8504 result->expected_sequence_number, seqId);
8505 tap_info->missing_sns = (256 + seqId - result->expected_sequence_number) % 256;
8506
8507 /* Show link back to previous frame in stream */
8508 proto_item *prev_ti = proto_tree_add_uint(proto_item_get_subtree(proto_item_get_parent(seqIdItem)),
8509 hf_oran_previous_frame, tvb, 0, 0, result->previous_frame);
8510 proto_item_set_generated(prev_ti);
8511 }
8512 }
8513
8514 /* Checking UL timing within current slot. Disabled if limit set to 0. */
8515 /* N.B., timing is relative to first seen frame,
8516 not some notion of the beginning of the slot from sync, offset by some timing.. */
8517 if (direction == DIR_UPLINK0 && us_allowed_for_ul_in_symbol > 0) {
8518 uint32_t timing_key = get_timing_key(frameId, subframeId, slotId, symbolId);
8519 if (!PINFO_FD_VISITED(pinfo)((pinfo)->fd->visited)) {
8520 /* Set state on first pass */
8521 ul_timing_for_slot* timing = (ul_timing_for_slot*)wmem_tree_lookup32(ul_symbol_timing, timing_key);
8522 if (!timing) {
8523 /* Allocate new state */
8524 timing = wmem_new0(wmem_file_scope(), ul_timing_for_slot)((ul_timing_for_slot*)wmem_alloc0((wmem_file_scope()), sizeof
(ul_timing_for_slot)))
;
8525 timing->first_frame = pinfo->num;
8526 timing->first_frame_time = pinfo->abs_ts;
8527 timing->frames_seen_in_symbol = 1;
8528 timing->last_frame_in_symbol = pinfo->num;
8529 wmem_tree_insert32(ul_symbol_timing, timing_key, timing);
8530 }
8531 else {
8532 /* Update existing state */
8533 timing->frames_seen_in_symbol++;
8534 timing->last_frame_in_symbol = pinfo->num;
8535 }
8536 }
8537 else {
8538 /* Subsequent passes - look up result */
8539 ul_timing_for_slot* timing = (ul_timing_for_slot*)wmem_tree_lookup32(ul_symbol_timing, timing_key);
8540 if (timing) { /* Really shouldn't fail! */
8541 if (timing->frames_seen_in_symbol > 1) {
8542 /* Work out gap between frames (in microseconds) back to frame carrying first seen symbol */
8543 uint32_t total_gap = time_gap(&pinfo->abs_ts, &timing->first_frame_time, 1000);
8544
8545 /* Show how long it has been */
8546 proto_item *ti = NULL((void*)0);
8547 if (pinfo->num != timing->first_frame) {
8548 ti = proto_tree_add_uint(timingHeader, hf_oran_u_section_ul_symbol_time, tvb, 0, 0, total_gap);
8549 proto_item_set_generated(ti);
8550 }
8551
8552 if (total_gap > us_allowed_for_ul_in_symbol) {
8553 expert_add_info_format(pinfo, ti, &ei_oran_ul_uplane_symbol_too_long,
8554 "UL U-Plane Tx took longer (%u\u03bcs) than limit set in preferences (%u\u03bcs)",
8555 total_gap, us_allowed_for_ul_in_symbol);
8556 proto_item_append_text(timingHeader, " (%u\u03bcs since first frame seen for symbol)", total_gap);
8557 }
8558
8559 /* Show how many frames were received */
8560 ti = proto_tree_add_uint(timingHeader, hf_oran_u_section_ul_symbol_frames, tvb, 0, 0, timing->frames_seen_in_symbol);
8561 proto_item_set_generated(ti);
8562
8563 /* Link to first frame for this symbol */
8564 if (pinfo->num != timing->first_frame) {
8565 ti = proto_tree_add_uint(timingHeader, hf_oran_u_section_ul_symbol_first_frame, tvb, 0, 0, timing->first_frame);
8566 proto_item_set_generated(ti);
8567 }
8568
8569 /* And also last frame */
8570 if (pinfo->num != timing->last_frame_in_symbol) {
8571 ti = proto_tree_add_uint(timingHeader, hf_oran_u_section_ul_symbol_last_frame, tvb, 0, 0, timing->last_frame_in_symbol);
8572 proto_item_set_generated(ti);
8573 }
8574
8575 tap_info->ul_delay_in_us = total_gap;
8576 }
8577 }
8578 }
8579 }
8580
8581
8582 /* Look up preferences for samples */
8583 if (direction == DIR_UPLINK0) {
8584 sample_bit_width = pref_sample_bit_width_uplink;
8585 compression = pref_iqCompressionUplink;
8586 includeUdCompHeader = pref_includeUdCompHeaderUplink;
8587 }
8588 else {
8589 sample_bit_width = pref_sample_bit_width_downlink;
8590 compression = pref_iqCompressionDownlink;
8591 includeUdCompHeader = pref_includeUdCompHeaderDownlink;
8592 }
8593
8594 /* If uplink, load any udCompHdr settings written by C-Plane */
8595 bool_Bool ud_cmp_hdr_cplane = false0;
8596 if (result && direction == 0) {
8597 /* On first pass, keep the settings the C-Plane has written so far */
8598 if (!PINFO_FD_VISITED(pinfo)((pinfo)->fd->visited) && cplane_state && cplane_state->ul_ud_comp_hdr_set) {
8599 result->ul_ud_comp_hdr_set = true1;
8600 result->ul_ud_comp_hdr_bit_width = cplane_state->ul_ud_comp_hdr_bit_width;
8601 result->ul_ud_comp_hdr_compression = cplane_state->ul_ud_comp_hdr_compression;
8602 result->ul_ud_comp_hdr_frame = cplane_state->ul_ud_comp_hdr_frame;
8603 }
8604 /* Initialise settings from udpCompHdr from C-Plane */
8605 if (result->ul_ud_comp_hdr_set && !pref_override_ul_compression) {
8606 sample_bit_width = result->ul_ud_comp_hdr_bit_width;
8607 compression = result->ul_ud_comp_hdr_compression;
8608 ud_cmp_hdr_cplane = true1;
8609 }
8610 }
8611
8612 /* Need a valid value (e.g. 9, 14). 0 definitely won't work, as won't progress around loop! */
8613 /* N.B. may yet be overwritten by udCompHdr settings in sections below! */
8614 if (sample_bit_width == 0 || sample_bit_width > 16) {
8615 expert_add_info_format(pinfo, protocol_item, &ei_oran_invalid_sample_bit_width,
8616 "%cL Sample bit width from %s (%u) not valid, so can't decode sections",
8617 (direction == DIR_UPLINK0) ? 'U' : 'D',
8618 !ud_cmp_hdr_cplane ? "preference" : "C-Plane",
8619 sample_bit_width);
8620 return offset;
8621 }
8622
8623 unsigned bytesLeft;
8624 unsigned number_of_sections = 0;
8625 unsigned nBytesPerPrb =0;
8626
8627 /* Add each section (not from count, just keep parsing until payload used) */
8628 do {
8629 offset = dissect_oran_u_section(tvb, pinfo, offset, oran_tree, protocol_item, tap_info, state, result, cplane_state,
8630 frameId, subframeId, slotId, symbolId, direction, includeUdCompHeader,
8631 &sample_bit_width, compression, ud_cmp_hdr_cplane, &nBytesPerPrb);
8632 bytesLeft = tvb_captured_length(tvb) - offset;
8633 number_of_sections++;
8634 } while (bytesLeft >= 4); /* eCPRI payload ends after the sections and 0-3 bytes of padding */
8635
8636 /* Show number of sections found */
8637 proto_item *ti = proto_tree_add_uint(oran_tree, hf_oran_numberOfSections, tvb, 0, 0, number_of_sections);
8638 proto_item_set_generated(ti);
8639
8640 return tvb_captured_length(tvb);
8641}
8642
8643
8644/**********************************************************************/
8645/* Main dissection function. */
8646/* N.B. ecpri message type passed in as 'data' arg by eCPRI dissector */
8647static int
8648dissect_oran(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
8649{
8650 if (data == NULL((void*)0)) {
8651 return 0;
8652 }
8653 uint32_t ecpri_message_type = *(uint32_t *)data;
8654 unsigned offset = 0;
8655
8656 /* Allocate and zero tap struct */
8657 oran_tap_info *tap_info = wmem_new0(pinfo->pool, oran_tap_info)((oran_tap_info*)wmem_alloc0((pinfo->pool), sizeof(oran_tap_info
)))
;
8658 tap_info->pdu_size = pinfo->fd->pkt_len;
8659 tap_info->ul_delay_configured_max = us_allowed_for_ul_in_symbol;
8660
8661 switch (ecpri_message_type) {
8662 case ECPRI_MT_IQ_DATA0:
8663 offset = dissect_oran_u(tvb, pinfo, tree, tap_info, data);
8664 break;
8665 case ECPRI_MT_RT_CTRL_DATA2:
8666 offset = dissect_oran_c(tvb, pinfo, tree, tap_info, data);
8667 break;
8668 default:
8669 /* Not dissecting other types - assume these are handled by eCPRI dissector */
8670 return 0;
8671 }
8672
8673 tap_queue_packet(oran_tap, pinfo, tap_info);
8674
8675 return offset;
8676}
8677
8678static void oran_init_protocol(void)
8679{
8680 udcomplen_heuristic_result_set = false0;
8681 udcomplen_heuristic_result = false0;
8682}
8683
8684
8685/* Register the protocol with Wireshark. */
8686void
8687proto_register_oran(void)
8688{
8689 static hf_register_info hf[] = {
8690
8691 /* Section 5.1.3.2.7 */
8692 { &hf_oran_du_port_id,
8693 { "DU Port ID", "oran_fh_cus.du_port_id",
8694 FT_UINT16, BASE_DEC,
8695 NULL((void*)0), 0x0,
8696 "Processing unit at O-RU - width set in dissector preference", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8697 },
8698
8699 /* Section 5.1.3.2.7 */
8700 { &hf_oran_bandsector_id,
8701 { "BandSector ID", "oran_fh_cus.bandsector_id",
8702 FT_UINT16, BASE_DEC,
8703 NULL((void*)0), 0x0,
8704 "Aggregated cell identified - width set in dissector preference", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8705 },
8706
8707 /* Section 5.1.3.2.7 */
8708 { &hf_oran_cc_id,
8709 { "CC ID", "oran_fh_cus.cc_id",
8710 FT_UINT16, BASE_DEC,
8711 NULL((void*)0), 0x0,
8712 "Component Carrier - width set in dissector preference", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8713 },
8714
8715 /* Section 5.1.3.2.7 */
8716 { &hf_oran_ru_port_id,
8717 { "RU Port ID", "oran_fh_cus.ru_port_id",
8718 FT_UINT16, BASE_DEC,
8719 NULL((void*)0), 0x0,
8720 "Logical flow - width set in dissector preference", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8721 },
8722
8723 /* Section 5.1.3.2.8 */
8724 { &hf_oran_sequence_id,
8725 { "Sequence ID", "oran_fh_cus.sequence_id",
8726 FT_UINT8, BASE_DEC,
8727 NULL((void*)0), 0x0,
8728 "The Sequence ID wraps around individually per eAxC", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8729 },
8730
8731 /* Section 5.1.3.2.8 */
8732 { &hf_oran_e_bit,
8733 { "E Bit", "oran_fh_cus.e_bit",
8734 FT_UINT8, BASE_DEC,
8735 VALS(e_bit)((0 ? (const struct _value_string*)0 : ((e_bit)))), 0x80,
8736 "Indicate the last message of a subsequence (U-Plane only)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8737 },
8738
8739 /* Section 5.1.3.2.8 */
8740 { &hf_oran_subsequence_id,
8741 { "Subsequence ID", "oran_fh_cus.subsequence_id",
8742 FT_UINT8, BASE_DEC,
8743 NULL((void*)0), 0x7f,
8744 "The subsequence ID (for eCPRI layer fragmentation)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8745 },
8746
8747 { &hf_oran_previous_frame,
8748 { "Previous frame in stream", "oran_fh_cus.previous-frame",
8749 FT_FRAMENUM, BASE_NONE,
8750 FRAMENUM_TYPE(FT_FRAMENUM_NONE)((gpointer) (glong) (FT_FRAMENUM_NONE)), 0x0,
8751 "Previous frame in sequence", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8752 },
8753
8754 /* Section 7.5.2.1 */
8755 { &hf_oran_data_direction,
8756 { "Data Direction", "oran_fh_cus.data_direction",
8757 FT_UINT8, BASE_DEC,
8758 VALS(data_direction_vals)((0 ? (const struct _value_string*)0 : ((data_direction_vals)
)))
, 0x80,
8759 "gNB data direction", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8760 },
8761
8762 /* Section 7.5.2.2 */
8763 { &hf_oran_payload_version,
8764 { "Payload Version", "oran_fh_cus.payloadVersion",
8765 FT_UINT8, BASE_DEC,
8766 NULL((void*)0), 0x70,
8767 "Payload protocol version the following IEs", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8768 },
8769
8770 /* Section 7.5.2.3 */
8771 { &hf_oran_filter_index,
8772 { "Filter Index", "oran_fh_cus.filterIndex",
8773 FT_UINT8, BASE_DEC | BASE_RANGE_STRING0x00000100,
8774 RVALS(filter_indices)((0 ? (const struct _range_string*)0 : ((filter_indices)))), 0x0f,
8775 "used between IQ data and air interface, both in DL and UL", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8776 },
8777
8778 /* Section 7.5.2.4 */
8779 { &hf_oran_frame_id,
8780 { "Frame ID", "oran_fh_cus.frameId",
8781 FT_UINT8, BASE_DEC,
8782 NULL((void*)0), 0x0,
8783 "A counter for 10 ms frames (wrapping period 2.56 seconds)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8784 },
8785
8786 /* Section 7.5.2.5 */
8787 { &hf_oran_subframe_id,
8788 { "Subframe ID", "oran_fh_cus.subframe_id",
8789 FT_UINT8, BASE_DEC,
8790 NULL((void*)0), 0xf0,
8791 "A counter for 1 ms sub-frames within 10ms frame", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8792 },
8793
8794 /* Section 7.5.2.6 */
8795 { &hf_oran_slot_id,
8796 { "Slot ID", "oran_fh_cus.slotId",
8797 FT_UINT16, BASE_DEC,
8798 NULL((void*)0), 0x0fc0,
8799 "Slot number within a 1ms sub-frame", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8800 },
8801
8802 /* Generated for convenience */
8803 { &hf_oran_slot_within_frame,
8804 { "Slot within frame", "oran_fh_cus.slot-within-frame",
8805 FT_UINT16, BASE_DEC,
8806 NULL((void*)0), 0x0,
8807 "Slot within frame, to match DCT logs", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8808 },
8809
8810 /* Section 7.5.2.7 */
8811 { &hf_oran_start_symbol_id,
8812 { "Start Symbol ID", "oran_fh_cus.startSymbolId",
8813 FT_UINT8, BASE_DEC,
8814 NULL((void*)0), 0x3f,
8815 "The first symbol number within slot affected", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8816 },
8817
8818 /* Section 7.5.2.8 */
8819 { &hf_oran_numberOfSections,
8820 { "Number of Sections", "oran_fh_cus.numberOfSections",
8821 FT_UINT8, BASE_DEC,
8822 NULL((void*)0), 0x0,
8823 "The number of section IDs included in this message", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8824 },
8825
8826 /* Section 7.5.2.9 */
8827 { &hf_oran_sectionType,
8828 { "Section Type", "oran_fh_cus.sectionType",
8829 FT_UINT8, BASE_DEC | BASE_RANGE_STRING0x00000100,
8830 RVALS(section_types)((0 ? (const struct _range_string*)0 : ((section_types)))), 0x0,
8831 "Determines the characteristics of U-plane data", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8832 },
8833
8834 /* Section 7.5.2.10 */
8835 { &hf_oran_udCompHdr,
8836 { "udCompHdr", "oran_fh_cus.udCompHdr",
8837 FT_STRING, BASE_NONE,
8838 NULL((void*)0), 0x0,
8839 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8840 },
8841
8842 /* Section 7.5.2.11 */
8843 { &hf_oran_numberOfUEs,
8844 { "Number Of UEs", "oran_fh_cus.numberOfUEs",
8845 FT_UINT8, BASE_DEC,
8846 NULL((void*)0), 0x0,
8847 "Indicates number of UEs for which channel info is provided", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8848 },
8849
8850 /* Section 7.5.2.12 */
8851 { &hf_oran_timeOffset,
8852 { "Time Offset", "oran_fh_cus.timeOffset",
8853 FT_UINT16, BASE_DEC,
8854 NULL((void*)0), 0x0,
8855 "from start of the slot to start of CP in samples", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8856 },
8857
8858 /* Section 7.5.2.13 */
8859 { &hf_oran_frameStructure_fft,
8860 { "FFT Size", "oran_fh_cus.frameStructure.fft",
8861 FT_UINT8, BASE_HEX | BASE_RANGE_STRING0x00000100,
8862 RVALS(frame_structure_fft)((0 ? (const struct _range_string*)0 : ((frame_structure_fft)
)))
, 0xf0,
8863 "The FFT/iFFT size being used for all IQ data processing related to this message", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8864 },
8865
8866 /* Section 7.5.2.13 */
8867 { &hf_oran_frameStructure_subcarrier_spacing,
8868 { "Subcarrier Spacing", "oran_fh_cus.frameStructure.spacing",
8869 FT_UINT8, BASE_HEX | BASE_RANGE_STRING0x00000100,
8870 RVALS(subcarrier_spacings)((0 ? (const struct _range_string*)0 : ((subcarrier_spacings)
)))
, 0x0f,
8871 "The sub carrier spacing as well as the number of slots per 1ms sub-frame",
8872 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8873 },
8874
8875 /* Section 7.5.2.14 */
8876 { &hf_oran_cpLength,
8877 { "cpLength", "oran_fh_cus.cpLength",
8878 FT_UINT16, BASE_DEC,
8879 NULL((void*)0), 0x0,
8880 "cyclic prefix length", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8881 },
8882
8883 { &hf_oran_timing_header,
8884 { "Timing Header", "oran_fh_cus.timingHeader",
8885 FT_STRING, BASE_NONE,
8886 NULL((void*)0), 0x0,
8887 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8888 },
8889
8890 /* Section 7.5.3.1 */
8891 { &hf_oran_section_id,
8892 { "sectionId", "oran_fh_cus.sectionId",
8893 FT_UINT16, BASE_DEC,
8894 NULL((void*)0), 0xfff0,
8895 "section identifier of data", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8896 },
8897
8898 /* Section 7.5.3.2 */
8899 { &hf_oran_rb,
8900 { "rb", "oran_fh_cus.rb",
8901 FT_UINT8, BASE_DEC,
8902 VALS(rb_vals)((0 ? (const struct _value_string*)0 : ((rb_vals)))), 0x08,
8903 "resource block indicator", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8904 },
8905
8906 /* Section 7.5.5.3 */
8907 { &hf_oran_symInc,
8908 { "symInc", "oran_fh_cus.symInc",
8909 FT_UINT8, BASE_DEC,
8910 VALS(sym_inc_vals)((0 ? (const struct _value_string*)0 : ((sym_inc_vals)))), 0x04,
8911 "Symbol Number Increment Command", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8912 },
8913
8914 /* Section 7.5.3.4 */
8915 { &hf_oran_startPrbc,
8916 { "startPrbc", "oran_fh_cus.startPrbc",
8917 FT_UINT16, BASE_DEC,
8918 NULL((void*)0), 0x03ff,
8919 "Starting PRB of Control Plane Section", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8920 },
8921
8922 /* Section 7.5.3.5 */
8923 { &hf_oran_reMask_re1,
8924 { "RE 1", "oran_fh_cus.reMask-RE1",
8925 FT_BOOLEAN, 16,
8926 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x8000,
8927 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8928 },
8929 { &hf_oran_reMask_re2,
8930 { "RE 2", "oran_fh_cus.reMask-RE2",
8931 FT_BOOLEAN, 16,
8932 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x4000,
8933 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8934 },
8935 { &hf_oran_reMask_re3,
8936 { "RE 3", "oran_fh_cus.reMask-RE3",
8937 FT_BOOLEAN, 16,
8938 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x2000,
8939 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8940 },
8941 { &hf_oran_reMask_re4,
8942 { "RE 4", "oran_fh_cus.reMask-RE4",
8943 FT_BOOLEAN, 16,
8944 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x1000,
8945 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8946 },
8947 { &hf_oran_reMask_re5,
8948 { "RE 5", "oran_fh_cus.reMask-RE5",
8949 FT_BOOLEAN, 16,
8950 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0800,
8951 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8952 },
8953 { &hf_oran_reMask_re6,
8954 { "RE 6", "oran_fh_cus.reMask-RE6",
8955 FT_BOOLEAN, 16,
8956 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0400,
8957 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8958 },
8959 { &hf_oran_reMask_re7,
8960 { "RE 7", "oran_fh_cus.reMask-RE7",
8961 FT_BOOLEAN, 16,
8962 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0200,
8963 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8964 },
8965 { &hf_oran_reMask_re8,
8966 { "RE 8", "oran_fh_cus.reMask-RE8",
8967 FT_BOOLEAN, 16,
8968 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0100,
8969 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8970 },
8971 { &hf_oran_reMask_re9,
8972 { "RE 9", "oran_fh_cus.reMask-RE9",
8973 FT_BOOLEAN, 16,
8974 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0080,
8975 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8976 },
8977 { &hf_oran_reMask_re10,
8978 { "RE 10", "oran_fh_cus.reMask-RE10",
8979 FT_BOOLEAN, 16,
8980 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0040,
8981 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8982 },
8983 { &hf_oran_reMask_re11,
8984 { "RE 11", "oran_fh_cus.reMask-RE11",
8985 FT_BOOLEAN, 16,
8986 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0020,
8987 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8988 },
8989 { &hf_oran_reMask_re12,
8990 { "RE 12", "oran_fh_cus.reMask-RE12",
8991 FT_BOOLEAN, 16,
8992 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0010,
8993 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8994 },
8995 { &hf_oran_reMask,
8996 { "RE Mask", "oran_fh_cus.reMask",
8997 FT_UINT16, BASE_HEX,
8998 NULL((void*)0), 0xfff0,
8999 "The Resource Element (RE) mask within a PRB", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9000 },
9001
9002 /* Section 7.5.3.6 */
9003 { &hf_oran_numPrbc,
9004 { "numPrbc", "oran_fh_cus.numPrbc",
9005 FT_UINT8, BASE_DEC,
9006 NULL((void*)0), 0x0,
9007 "Number of contiguous PRBs per data section description", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9008 },
9009 /* Section 7.5.3.7 */
9010 { &hf_oran_numSymbol,
9011 { "Number of Symbols", "oran_fh_cus.numSymbol",
9012 FT_UINT8, BASE_DEC,
9013 NULL((void*)0), 0x0f,
9014 "Defines number of symbols to which the section control is applicable", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9015 },
9016 /* Section 7.5.3.8 */
9017 { &hf_oran_ef,
9018 { "Extension Flag", "oran_fh_cus.ef",
9019 FT_BOOLEAN, 8,
9020 NULL((void*)0), 0x80,
9021 "Indicates if more section extensions follow", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9022 },
9023 /* Section 7.5.3.9 */
9024 { &hf_oran_beamId,
9025 { "Beam ID", "oran_fh_cus.beamId",
9026 FT_UINT16, BASE_DEC,
9027 NULL((void*)0), 0x7fff,
9028 "Defines the beam pattern to be applied to the U-Plane data", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9029 },
9030
9031 { &hf_oran_extension,
9032 { "Extension", "oran_fh_cus.extension",
9033 FT_STRING, BASE_NONE,
9034 NULL((void*)0), 0x0,
9035 "Section extension", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9036 },
9037
9038 /* Section 7.6.2.1 */
9039 { &hf_oran_exttype,
9040 { "extType", "oran_fh_cus.extType",
9041 FT_UINT8, BASE_DEC|BASE_EXT_STRING0x00000200,
9042 &exttype_vals_ext, 0x7f,
9043 "The extension type, which provides additional parameters specific to subject data extension", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9044 },
9045
9046 /* Section 7.6.2.3 */
9047 { &hf_oran_extlen,
9048 { "extLen", "oran_fh_cus.extLen",
9049 FT_UINT16, BASE_DEC,
9050 NULL((void*)0), 0x0,
9051 "Extension length in 32-bit words", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9052 },
9053
9054 /* Section 7.7.1 */
9055 { &hf_oran_bfw,
9056 { "bfw", "oran_fh_cus.bfw",
9057 FT_STRING, BASE_NONE,
9058 NULL((void*)0), 0x0,
9059 "Set of weights for a particular antenna", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9060 },
9061 { &hf_oran_bfw_bundle,
9062 { "Bundle", "oran_fh_cus.bfw.bundle",
9063 FT_STRING, BASE_NONE,
9064 NULL((void*)0), 0x0,
9065 "Bundle of BFWs", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9066 },
9067 { &hf_oran_bfw_bundle_id,
9068 { "Bundle Id", "oran_fh_cus.bfw.bundleId",
9069 FT_UINT32, BASE_DEC,
9070 NULL((void*)0), 0x0,
9071 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9072 },
9073 /* Section 7.7.1.4 */
9074 { &hf_oran_bfw_i,
9075 { "bfwI", "oran_fh_cus.bfwI",
9076 FT_FLOAT, BASE_NONE,
9077 NULL((void*)0), 0x0,
9078 "In-phase", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9079 },
9080 /* Section 7.7.1.5 */
9081 { &hf_oran_bfw_q,
9082 { "bfwQ", "oran_fh_cus.bfwQ",
9083 FT_FLOAT, BASE_NONE,
9084 NULL((void*)0), 0x0,
9085 "Quadrature", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9086 },
9087
9088 /* Section 7.5.3.10 */
9089 { &hf_oran_ueId,
9090 { "UE ID", "oran_fh_cus.ueId",
9091 FT_UINT16, BASE_DEC,
9092 NULL((void*)0), 0x7fff,
9093 "logical identifier for set of channel info", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9094 },
9095 /* Section 7.5.3.11 */
9096 { &hf_oran_freqOffset,
9097 { "Frequency Offset", "oran_fh_cus.freqOffset",
9098 FT_UINT24, BASE_DEC,
9099 NULL((void*)0), 0x0,
9100 "with respect to the carrier center frequency before additional filtering", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9101 },
9102
9103 /* Section 7.5.3.12 */
9104 { &hf_oran_regularizationFactor,
9105 { "Regularization Factor", "oran_fh_cus.regularizationFactor",
9106 FT_INT16, BASE_DEC,
9107 NULL((void*)0), 0x0,
9108 "Signed value to support MMSE operation within O-RU", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9109 },
9110 /* Section 7.5.3.14 */
9111 { &hf_oran_laaMsgType,
9112 { "LAA Message Type", "oran_fh_cus.laaMsgType",
9113 FT_UINT8, BASE_DEC | BASE_RANGE_STRING0x00000100,
9114 RVALS(laaMsgTypes)((0 ? (const struct _range_string*)0 : ((laaMsgTypes)))), 0xf0,
9115 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9116 },
9117 /* Section 7.5.3.15 */
9118 { &hf_oran_laaMsgLen,
9119 { "LAA Message Length", "oran_fh_cus.laaMsgLen",
9120 FT_UINT8, BASE_DEC,
9121 NULL((void*)0), 0x0f,
9122 "number of 32-bit words in the LAA section", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9123 },
9124 /* Section 7.5.3.16 */
9125 { &hf_oran_lbtHandle,
9126 { "LBT Handle", "oran_fh_cus.lbtHandle",
9127 FT_UINT16, BASE_HEX,
9128 NULL((void*)0), 0x0,
9129 "label to identify transaction", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9130 },
9131 /* Section 7.5.3.17 */
9132 { &hf_oran_lbtDeferFactor,
9133 { "Defer Factor", "oran_fh_cus.lbtDeferFactor",
9134 FT_UINT8, BASE_DEC,
9135 NULL((void*)0), 0x07,
9136 "Defer factor in sensing slots as described in 3GPP TS 36.213 Section 15.1.1", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9137 },
9138 /* Section 7.5.3.18 */
9139 { &hf_oran_lbtBackoffCounter,
9140 { "Backoff Counter", "oran_fh_cus.lbtBackoffCounter",
9141 FT_UINT16, BASE_DEC,
9142 NULL((void*)0), 0xffc0,
9143 "LBT backoff counter in sensing slots as described in 3GPP TS 36.213 Section 15.1.1", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9144 },
9145 /* Section 7.5.3.19 */
9146 { &hf_oran_lbtOffset,
9147 { "LBT Offset", "oran_fh_cus.lbtOffset",
9148 FT_UINT16, BASE_DEC,
9149 NULL((void*)0), 0xffc0,
9150 "LBT start time in microseconds from the beginning of the subframe scheduled by this message", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9151 },
9152 /* Section 7.5.3.20 */
9153 { &hf_oran_MCOT,
9154 { "Maximum Channel Occupancy Time", "oran_fh_cus.MCOT",
9155 FT_UINT8, BASE_DEC,
9156 NULL((void*)0), 0x3c,
9157 "LTE TXOP duration in subframes as described in 3GPP TS 36.213 Section 15.1.1", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9158 },
9159 /* Section 7.5.3.21 */
9160 { &hf_oran_lbtMode,
9161 { "LBT Mode", "oran_fh_cus.lbtMode",
9162 FT_UINT8, BASE_DEC,
9163 VALS(lbtMode_vals)((0 ? (const struct _value_string*)0 : ((lbtMode_vals)))), 0x0,
9164 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9165 },
9166 /* Section 7.5.3.22 */
9167 { &hf_oran_lbtPdschRes,
9168 { "lbtPdschRes", "oran_fh_cus.lbtPdschRes",
9169 FT_UINT8, BASE_DEC,
9170 VALS(lbtPdschRes_vals)((0 ? (const struct _value_string*)0 : ((lbtPdschRes_vals)))), 0xc0,
9171 "LBT result of SFN/SF", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9172 },
9173 /* Section 7.5.3.23 */
9174 { &hf_oran_sfStatus,
9175 { "sfStatus", "oran_fh_cus.sfStatus",
9176 FT_BOOLEAN, 8,
9177 TFS(&tfs_sfStatus)((0 ? (const struct true_false_string*)0 : ((&tfs_sfStatus
))))
, 0x10,
9178 "Indicates whether the subframe was dropped or transmitted", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9179 },
9180 /* Section 7.5.3.24 */
9181 { &hf_oran_lbtDrsRes,
9182 { "lbtDrsRes", "oran_fh_cus.lbtDrsRes",
9183 FT_BOOLEAN, 8,
9184 TFS(&tfs_fail_success)((0 ? (const struct true_false_string*)0 : ((&tfs_fail_success
))))
, 0x80,
9185 "Indicates whether the subframe was dropped or transmitted", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9186 },
9187 /* Section 7.5.3.25 */
9188 { &hf_oran_initialPartialSF,
9189 { "Initial partial SF", "oran_fh_cus.initialPartialSF",
9190 FT_BOOLEAN, 8,
9191 TFS(&tfs_partial_full_sf)((0 ? (const struct true_false_string*)0 : ((&tfs_partial_full_sf
))))
, 0x40,
9192 "Indicates whether the initial SF in the LBT process is full or partial", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9193 },
9194 /* Section 7.5.3.26. */
9195 { &hf_oran_lbtBufErr,
9196 { "lbtBufErr", "oran_fh_cus.lbtBufErr",
9197 FT_BOOLEAN, 8,
9198 TFS(&tfs_lbtBufErr)((0 ? (const struct true_false_string*)0 : ((&tfs_lbtBufErr
))))
, 0x80,
9199 "LBT buffer error", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9200 },
9201 /* Section 7.5.3.27 */
9202 { &hf_oran_sfnSfEnd,
9203 { "SFN/SF End", "oran_fh_cus.sfnSfEnd",
9204 FT_UINT16, BASE_DEC,
9205 NULL((void*)0), 0x0fff,
9206 "SFN/SF by which the DRS window must end", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9207 },
9208 /* Section 7.5.3.28 */
9209 { &hf_oran_lbtCWConfig_H,
9210 { "lbtCWConfig_H", "oran_fh_cus.lbtCWConfig_H",
9211 FT_UINT8, BASE_DEC,
9212 NULL((void*)0), 0x0,
9213 "HARQ parameters for congestion window management", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9214 },
9215 /* Section 7.5.3.29 */
9216 { &hf_oran_lbtCWConfig_T,
9217 { "lbtCWConfig_T", "oran_fh_cus.lbtCWConfig_T",
9218 FT_UINT8, BASE_DEC,
9219 NULL((void*)0), 0x0,
9220 "TB parameters for congestion window management", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9221 },
9222 /* Section 7.5.3.30 */
9223 { &hf_oran_lbtTrafficClass,
9224 { "lbtTrafficClass", "oran_fh_cus.lbtTrafficClass",
9225 FT_UINT8, BASE_DEC,
9226 VALS(lbtTrafficClass_vals)((0 ? (const struct _value_string*)0 : ((lbtTrafficClass_vals
))))
, 0x38,
9227 "Traffic class priority for congestion window management", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9228 },
9229 /* Section 7.5.3.31 */
9230 { &hf_oran_lbtCWR_Rst,
9231 { "lbtCWR_Rst", "oran_fh_cus.lbtCWR_Rst",
9232 FT_BOOLEAN, 8,
9233 TFS(&tfs_fail_success)((0 ? (const struct true_false_string*)0 : ((&tfs_fail_success
))))
, 0x80,
9234 "notification about packet reception successful or not", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9235 },
9236
9237 /* Reserved fields */
9238 { &hf_oran_reserved,
9239 { "reserved", "oran_fh_cus.reserved",
9240 FT_UINT64, BASE_HEX,
9241 NULL((void*)0), 0x0,
9242 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9243 },
9244 { &hf_oran_reserved_1bit,
9245 { "reserved", "oran_fh_cus.reserved",
9246 FT_UINT8, BASE_HEX,
9247 NULL((void*)0), 0x80,
9248 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9249 },
9250 { &hf_oran_reserved_2bits,
9251 { "reserved", "oran_fh_cus.reserved",
9252 FT_UINT8, BASE_HEX,
9253 NULL((void*)0), 0xc0,
9254 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9255 },
9256 { &hf_oran_reserved_3bits,
9257 { "reserved", "oran_fh_cus.reserved",
9258 FT_UINT8, BASE_HEX,
9259 NULL((void*)0), 0xe0,
9260 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9261 },
9262 { &hf_oran_reserved_4bits,
9263 { "reserved", "oran_fh_cus.reserved",
9264 FT_UINT8, BASE_HEX,
9265 NULL((void*)0), 0xf0,
9266 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9267 },
9268 { &hf_oran_reserved_last_4bits,
9269 { "reserved", "oran_fh_cus.reserved",
9270 FT_UINT8, BASE_HEX,
9271 NULL((void*)0), 0x0f,
9272 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9273 },
9274 { &hf_oran_reserved_last_5bits,
9275 { "reserved", "oran_fh_cus.reserved",
9276 FT_UINT8, BASE_HEX,
9277 NULL((void*)0), 0x1f,
9278 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9279 },
9280 { &hf_oran_reserved_6bits,
9281 { "reserved", "oran_fh_cus.reserved",
9282 FT_UINT8, BASE_HEX,
9283 NULL((void*)0), 0xfc,
9284 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9285 },
9286 { &hf_oran_reserved_last_6bits,
9287 { "reserved", "oran_fh_cus.reserved",
9288 FT_UINT8, BASE_HEX,
9289 NULL((void*)0), 0x3f,
9290 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9291 },
9292 { &hf_oran_reserved_7bits,
9293 { "reserved", "oran_fh_cus.reserved",
9294 FT_UINT8, BASE_HEX,
9295 NULL((void*)0), 0xfe,
9296 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9297 },
9298 { &hf_oran_reserved_last_7bits,
9299 { "reserved", "oran_fh_cus.reserved",
9300 FT_UINT8, BASE_HEX,
9301 NULL((void*)0), 0x7f,
9302 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9303 },
9304 { &hf_oran_reserved_8bits,
9305 { "reserved", "oran_fh_cus.reserved",
9306 FT_UINT8, BASE_HEX,
9307 NULL((void*)0), 0x0,
9308 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9309 },
9310 { &hf_oran_reserved_16bits,
9311 { "reserved", "oran_fh_cus.reserved",
9312 FT_UINT16, BASE_HEX,
9313 NULL((void*)0), 0x0,
9314 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9315 },
9316 { &hf_oran_reserved_15bits,
9317 { "reserved", "oran_fh_cus.reserved",
9318 FT_UINT16, BASE_HEX,
9319 NULL((void*)0), 0x7fff,
9320 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9321 },
9322 { &hf_oran_reserved_bit1,
9323 { "reserved", "oran_fh_cus.reserved",
9324 FT_UINT8, BASE_HEX,
9325 NULL((void*)0), 0x40,
9326 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9327 },
9328 { &hf_oran_reserved_bit2,
9329 { "reserved", "oran_fh_cus.reserved",
9330 FT_UINT8, BASE_HEX,
9331 NULL((void*)0), 0x20,
9332 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9333 },
9334 { &hf_oran_reserved_bit4,
9335 { "reserved", "oran_fh_cus.reserved",
9336 FT_UINT8, BASE_HEX,
9337 NULL((void*)0), 0x08,
9338 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9339 },
9340 { &hf_oran_reserved_bit5,
9341 { "reserved", "oran_fh_cus.reserved",
9342 FT_UINT8, BASE_HEX,
9343 NULL((void*)0), 0x04,
9344 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9345 },
9346 { &hf_oran_reserved_bits123,
9347 { "reserved", "oran_fh_cus.reserved",
9348 FT_UINT8, BASE_HEX,
9349 NULL((void*)0), 0x70,
9350 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9351 },
9352 { &hf_oran_reserved_bits1234,
9353 { "reserved", "oran_fh_cus.reserved",
9354 FT_UINT8, BASE_HEX,
9355 NULL((void*)0), 0x78,
9356 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9357 },
9358 { &hf_oran_reserved_bits456,
9359 { "reserved", "oran_fh_cus.reserved",
9360 FT_UINT8, BASE_HEX,
9361 NULL((void*)0), 0x0e,
9362 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9363 },
9364
9365 /* 7.7.11.9 */
9366 { &hf_oran_cont_ind,
9367 { "contInd", "oran_fh_cus.contInd",
9368 FT_BOOLEAN, 8,
9369 TFS(&continuity_indication_tfs)((0 ? (const struct true_false_string*)0 : ((&continuity_indication_tfs
))))
, 0x80,
9370 "PRB region continuity flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9371 },
9372 /* 7.7.11.10 */
9373 { &hf_oran_bundle_offset,
9374 { "BundleOffset", "oran_fh_cus.bundleOffset",
9375 FT_UINT8, BASE_DEC,
9376 NULL((void*)0), 0x3f,
9377 "offset between start of first PRB bundle and startPrbc", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9378 },
9379
9380 /* 7.7.1.2 bfwCompHdr (beamforming weight compression header) */
9381 { &hf_oran_bfwCompHdr,
9382 { "bfwCompHdr", "oran_fh_cus.bfwCompHdr",
9383 FT_STRING, BASE_NONE,
9384 NULL((void*)0), 0x0,
9385 "Compression method and IQ bit width for beamforming weights", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9386 },
9387 { &hf_oran_bfwCompHdr_iqWidth,
9388 { "IQ Bit Width", "oran_fh_cus.bfwCompHdr_iqWidth",
9389 FT_UINT8, BASE_HEX,
9390 VALS(bfw_comp_headers_iq_width)((0 ? (const struct _value_string*)0 : ((bfw_comp_headers_iq_width
))))
, 0xf0,
9391 "IQ bit width for the beamforming weights", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9392 },
9393 { &hf_oran_bfwCompHdr_compMeth,
9394 { "Compression Method", "oran_fh_cus.bfwCompHdr_compMeth",
9395 FT_UINT8, BASE_HEX,
9396 VALS(bfw_comp_headers_comp_meth)((0 ? (const struct _value_string*)0 : ((bfw_comp_headers_comp_meth
))))
, 0x0f,
9397 "compression method for the beamforming weights", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9398 },
9399
9400 /* 7.5.3.32 */
9401 { &hf_oran_ciCompParam,
9402 { "ciCompParam", "oran_fh_cus.ciCompParam",
9403 FT_STRING, BASE_NONE,
9404 NULL((void*)0), 0x0,
9405 "channel information compression parameter", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9406 },
9407
9408 /* Table 7.5.3.32-1 */
9409 { &hf_oran_blockScaler,
9410 { "blockScaler", "oran_fh_cus.blockScaler",
9411 FT_UINT8, BASE_HEX,
9412 NULL((void*)0), 0x0,
9413 "unsigned, 1 integer bit, 7 fractional bits", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9414 },
9415 { &hf_oran_compBitWidth,
9416 { "compBitWidth", "oran_fh_cus.compBitWidth",
9417 FT_UINT8, BASE_DEC,
9418 NULL((void*)0), 0xf0,
9419 "Length of I bits and length of Q bits after compression over entire PRB", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9420 },
9421 { &hf_oran_compShift,
9422 { "compShift", "oran_fh_cus.compShift",
9423 FT_UINT8, BASE_DEC,
9424 NULL((void*)0), 0x0f,
9425 "The shift applied to the entire PRB", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9426 },
9427
9428 { &hf_oran_active_beamspace_coefficient_n1,
9429 { "N1", "oran_fh_cus.activeBeamspace_Coefficient_n1",
9430 FT_BOOLEAN, 8,
9431 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x80,
9432 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9433 },
9434 { &hf_oran_active_beamspace_coefficient_n2,
9435 { "N2", "oran_fh_cus.activeBeamspace_Coefficient_n2",
9436 FT_BOOLEAN, 8,
9437 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x40,
9438 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9439 },
9440 { &hf_oran_active_beamspace_coefficient_n3,
9441 { "N3", "oran_fh_cus.activeBeamspace_Coefficient_n3",
9442 FT_BOOLEAN, 8,
9443 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x20,
9444 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9445 },
9446 { &hf_oran_active_beamspace_coefficient_n4,
9447 { "N4", "oran_fh_cus.activeBeamspace_Coefficient_n4",
9448 FT_BOOLEAN, 8,
9449 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x10,
9450 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9451 },
9452 { &hf_oran_active_beamspace_coefficient_n5,
9453 { "N5", "oran_fh_cus.activeBeamspace_Coefficient_n5",
9454 FT_BOOLEAN, 8,
9455 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x08,
9456 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9457 },
9458 { &hf_oran_active_beamspace_coefficient_n6,
9459 { "N6", "oran_fh_cus.activeBeamspace_Coefficient_n6",
9460 FT_BOOLEAN, 8,
9461 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x04,
9462 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9463 },
9464 { &hf_oran_active_beamspace_coefficient_n7,
9465 { "N7", "oran_fh_cus.activeBeamspace_Coefficient_n7",
9466 FT_BOOLEAN, 8,
9467 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x02,
9468 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9469 },
9470 { &hf_oran_active_beamspace_coefficient_n8,
9471 { "N8", "oran_fh_cus.activeBeamspace_Coefficient_n8",
9472 FT_BOOLEAN, 8,
9473 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x01,
9474 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9475 },
9476
9477 { &hf_oran_activeBeamspaceCoefficientMask,
9478 { "activeBeamspaceCoefficientMask", "oran_fh_cus.activeBeamspaceCoefficientMask",
9479 FT_UINT8, BASE_HEX,
9480 NULL((void*)0), 0xff,
9481 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9482 },
9483 { &hf_oran_activeBeamspaceCoefficientMask_bits_set,
9484 { "Array elements set", "oran_fh_cus.activeBeamspaceCoefficientMask.bits-set",
9485 FT_UINT32, BASE_DEC,
9486 NULL((void*)0), 0x0,
9487 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9488 },
9489
9490 /* Section 7.7.6.6 */
9491 { &hf_oran_se6_repetition,
9492 { "repetition", "oran_fh_cus.repetition",
9493 FT_BOOLEAN, BASE_NONE,
9494 TFS(&repetition_se6_tfs)((0 ? (const struct true_false_string*)0 : ((&repetition_se6_tfs
))))
, 0x0,
9495 "Repetition of a highest priority data section for C-Plane", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9496 },
9497 /* 7.7.20.9 */
9498 { &hf_oran_rbgSize,
9499 { "rbgSize", "oran_fh_cus.rbgSize",
9500 FT_UINT8, BASE_HEX,
9501 VALS(rbg_size_vals)((0 ? (const struct _value_string*)0 : ((rbg_size_vals)))), 0x70,
9502 "Number of PRBs of the resource block groups allocated by the bit mask", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9503 },
9504 /* 7.7.20.10 */
9505 { &hf_oran_rbgMask,
9506 { "rbgMask", "oran_fh_cus.rbgMask",
9507 FT_UINT32, BASE_HEX,
9508 NULL((void*)0), 0x0fffffff,
9509 "Each bit indicates whether a corresponding resource block group is present", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9510 },
9511 /* 7.7.6.5. Also 7.7.12.3 and 7.7.19.5 */
9512 { &hf_oran_noncontig_priority,
9513 { "priority", "oran_fh_cus.priority",
9514 FT_UINT8, BASE_HEX,
9515 VALS(priority_vals)((0 ? (const struct _value_string*)0 : ((priority_vals)))), 0xc0,
9516 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9517 },
9518
9519 /* 7.7.6.4 */
9520 { &hf_oran_symbol_mask,
9521 { "symbolMask", "oran_fh_cus.symbolMask",
9522 FT_UINT16, BASE_HEX,
9523 NULL((void*)0), 0x3fff,
9524 "Each bit indicates whether the rbgMask applies to a given symbol in the slot", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9525 },
9526 { &hf_oran_symbol_mask_s13,
9527 { "symbol 13", "oran_fh_cus.symbolMask.symbol-13",
9528 FT_BOOLEAN, 16,
9529 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x2000,
9530 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9531 },
9532 { &hf_oran_symbol_mask_s12,
9533 { "symbol 12", "oran_fh_cus.symbolMask.symbol-12",
9534 FT_BOOLEAN, 16,
9535 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x1000,
9536 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9537 },
9538 { &hf_oran_symbol_mask_s11,
9539 { "symbol 11", "oran_fh_cus.symbolMask.symbol-11",
9540 FT_BOOLEAN, 16,
9541 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0800,
9542 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9543 },
9544 { &hf_oran_symbol_mask_s10,
9545 { "symbol 10", "oran_fh_cus.symbolMask.symbol-10",
9546 FT_BOOLEAN, 16,
9547 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0400,
9548 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9549 },
9550 { &hf_oran_symbol_mask_s9,
9551 { "symbol 9", "oran_fh_cus.symbolMask.symbol-9",
9552 FT_BOOLEAN, 16,
9553 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0200,
9554 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9555 },
9556 { &hf_oran_symbol_mask_s8,
9557 { "symbol 8", "oran_fh_cus.symbolMask.symbol-8",
9558 FT_BOOLEAN, 16,
9559 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0100,
9560 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9561 },
9562 { &hf_oran_symbol_mask_s7,
9563 { "symbol 7", "oran_fh_cus.symbolMask.symbol-7",
9564 FT_BOOLEAN, 16,
9565 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0080,
9566 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9567 },
9568 { &hf_oran_symbol_mask_s6,
9569 { "symbol 6", "oran_fh_cus.symbolMask.symbol-6",
9570 FT_BOOLEAN, 16,
9571 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0040,
9572 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9573 },
9574 { &hf_oran_symbol_mask_s5,
9575 { "symbol 5", "oran_fh_cus.symbolMask.symbol-5",
9576 FT_BOOLEAN, 16,
9577 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0020,
9578 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9579 },
9580 { &hf_oran_symbol_mask_s4,
9581 { "symbol 4", "oran_fh_cus.symbolMask.symbol-4",
9582 FT_BOOLEAN, 16,
9583 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0010,
9584 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9585 },
9586 { &hf_oran_symbol_mask_s3,
9587 { "symbol 3", "oran_fh_cus.symbolMask.symbol-3",
9588 FT_BOOLEAN, 16,
9589 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0008,
9590 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9591 },
9592 { &hf_oran_symbol_mask_s2,
9593 { "symbol 2", "oran_fh_cus.symbolMask.symbol-2",
9594 FT_BOOLEAN, 16,
9595 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0004,
9596 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9597 },
9598 { &hf_oran_symbol_mask_s1,
9599 { "symbol 1", "oran_fh_cus.symbolMask.symbol-1",
9600 FT_BOOLEAN, 16,
9601 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0002,
9602 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9603 },
9604 { &hf_oran_symbol_mask_s0,
9605 { "symbol 0", "oran_fh_cus.symbolMask.symbol-0",
9606 FT_BOOLEAN, 16,
9607 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0001,
9608 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9609 },
9610
9611 /* 7.7.6.3 */
9612 { &hf_oran_rbg_mask_27,
9613 { "bit 27", "oran_fh_cus.rbgMask.bit27",
9614 FT_BOOLEAN, 32,
9615 TFS(&tfs_allocated_not_allocated)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_not_allocated
))))
, 0x08000000,
9616 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9617 },
9618 { &hf_oran_rbg_mask_26,
9619 { "bit 26", "oran_fh_cus.rbgMask.bit26",
9620 FT_BOOLEAN, 32,
9621 TFS(&tfs_allocated_not_allocated)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_not_allocated
))))
, 0x04000000,
9622 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9623 },
9624 { &hf_oran_rbg_mask_25,
9625 { "bit 25", "oran_fh_cus.rbgMask.bit25",
9626 FT_BOOLEAN, 32,
9627 TFS(&tfs_allocated_not_allocated)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_not_allocated
))))
, 0x02000000,
9628 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9629 },
9630 { &hf_oran_rbg_mask_24,
9631 { "bit 24", "oran_fh_cus.rbgMask.bit24",
9632 FT_BOOLEAN, 32,
9633 TFS(&tfs_allocated_not_allocated)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_not_allocated
))))
, 0x01000000,
9634 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9635 },
9636 { &hf_oran_rbg_mask_23,
9637 { "bit 23", "oran_fh_cus.rbgMask.bit23",
9638 FT_BOOLEAN, 32,
9639 TFS(&tfs_allocated_not_allocated)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_not_allocated
))))
, 0x00800000,
9640 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9641 },
9642 { &hf_oran_rbg_mask_22,
9643 { "bit 22", "oran_fh_cus.rbgMask.bit22",
9644 FT_BOOLEAN, 32,
9645 TFS(&tfs_allocated_not_allocated)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_not_allocated
))))
, 0x00400000,
9646 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9647 },
9648 { &hf_oran_rbg_mask_21,
9649 { "bit 21", "oran_fh_cus.rbgMask.bit21",
9650 FT_BOOLEAN, 32,
9651 TFS(&tfs_allocated_not_allocated)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_not_allocated
))))
, 0x00200000,
9652 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9653 },
9654 { &hf_oran_rbg_mask_20,
9655 { "bit 20", "oran_fh_cus.rbgMask.bit20",
9656 FT_BOOLEAN, 32,
9657 TFS(&tfs_allocated_not_allocated)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_not_allocated
))))
, 0x00100000,
9658 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9659 },
9660 { &hf_oran_rbg_mask_19,
9661 { "bit 19", "oran_fh_cus.rbgMask.bit19",
9662 FT_BOOLEAN, 32,
9663 TFS(&tfs_allocated_not_allocated)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_not_allocated
))))
, 0x00080000,
9664 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9665 },
9666 { &hf_oran_rbg_mask_18,
9667 { "bit 18", "oran_fh_cus.rbgMask.bit18",
9668 FT_BOOLEAN, 32,
9669 TFS(&tfs_allocated_not_allocated)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_not_allocated
))))
, 0x00040000,
9670 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9671 },
9672 { &hf_oran_rbg_mask_17,
9673 { "bit 17", "oran_fh_cus.rbgMask.bit17",
9674 FT_BOOLEAN, 32,
9675 TFS(&tfs_allocated_not_allocated)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_not_allocated
))))
, 0x00020000,
9676 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9677 },
9678 { &hf_oran_rbg_mask_16,
9679 { "bit 16", "oran_fh_cus.rbgMask.bit16",
9680 FT_BOOLEAN, 32,
9681 TFS(&tfs_allocated_not_allocated)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_not_allocated
))))
, 0x00010000,
9682 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9683 },
9684 { &hf_oran_rbg_mask_15,
9685 { "bit 15", "oran_fh_cus.rbgMask.bit15",
9686 FT_BOOLEAN, 32,
9687 TFS(&tfs_allocated_not_allocated)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_not_allocated
))))
, 0x00008000,
9688 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9689 },
9690 { &hf_oran_rbg_mask_14,
9691 { "bit 14", "oran_fh_cus.rbgMask.bit14",
9692 FT_BOOLEAN, 32,
9693 TFS(&tfs_allocated_not_allocated)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_not_allocated
))))
, 0x00004000,
9694 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9695 },
9696 { &hf_oran_rbg_mask_13,
9697 { "bit 13", "oran_fh_cus.rbgMask.bit13",
9698 FT_BOOLEAN, 32,
9699 TFS(&tfs_allocated_not_allocated)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_not_allocated
))))
, 0x00002000,
9700 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9701 },
9702 { &hf_oran_rbg_mask_12,
9703 { "bit 12", "oran_fh_cus.rbgMask.bit12",
9704 FT_BOOLEAN, 32,
9705 TFS(&tfs_allocated_not_allocated)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_not_allocated
))))
, 0x00001000,
9706 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9707 },
9708 { &hf_oran_rbg_mask_11,
9709 { "bit 11", "oran_fh_cus.rbgMask.bit11",
9710 FT_BOOLEAN, 32,
9711 TFS(&tfs_allocated_not_allocated)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_not_allocated
))))
, 0x00000800,
9712 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9713 },
9714 { &hf_oran_rbg_mask_10,
9715 { "bit 10", "oran_fh_cus.rbgMask.bit10",
9716 FT_BOOLEAN, 32,
9717 TFS(&tfs_allocated_not_allocated)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_not_allocated
))))
, 0x00000400,
9718 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9719 },
9720 { &hf_oran_rbg_mask_9,
9721 { "bit 9", "oran_fh_cus.rbgMask.bit9",
9722 FT_BOOLEAN, 32,
9723 TFS(&tfs_allocated_not_allocated)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_not_allocated
))))
, 0x00000200,
9724 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9725 },
9726 { &hf_oran_rbg_mask_8,
9727 { "bit 8", "oran_fh_cus.rbgMask.bit8",
9728 FT_BOOLEAN, 32,
9729 TFS(&tfs_allocated_not_allocated)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_not_allocated
))))
, 0x00000100,
9730 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9731 },
9732 { &hf_oran_rbg_mask_7,
9733 { "bit 7", "oran_fh_cus.rbgMask.bit7",
9734 FT_BOOLEAN, 32,
9735 TFS(&tfs_allocated_not_allocated)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_not_allocated
))))
, 0x00000080,
9736 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9737 },
9738 { &hf_oran_rbg_mask_6,
9739 { "bit 6", "oran_fh_cus.rbgMask.bit6",
9740 FT_BOOLEAN, 32,
9741 TFS(&tfs_allocated_not_allocated)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_not_allocated
))))
, 0x00000040,
9742 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9743 },
9744 { &hf_oran_rbg_mask_5,
9745 { "bit 5", "oran_fh_cus.rbgMask.bit5",
9746 FT_BOOLEAN, 32,
9747 TFS(&tfs_allocated_not_allocated)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_not_allocated
))))
, 0x00000020,
9748 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9749 },
9750 { &hf_oran_rbg_mask_4,
9751 { "bit 4", "oran_fh_cus.rbgMask.bit4",
9752 FT_BOOLEAN, 32,
9753 TFS(&tfs_allocated_not_allocated)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_not_allocated
))))
, 0x00000010,
9754 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9755 },
9756 { &hf_oran_rbg_mask_3,
9757 { "bit 3", "oran_fh_cus.rbgMask.bit3",
9758 FT_BOOLEAN, 32,
9759 TFS(&tfs_allocated_not_allocated)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_not_allocated
))))
, 0x00000008,
9760 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9761 },
9762 { &hf_oran_rbg_mask_2,
9763 { "bit 2", "oran_fh_cus.rbgMask.bit2",
9764 FT_BOOLEAN, 32,
9765 TFS(&tfs_allocated_not_allocated)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_not_allocated
))))
, 0x00000004,
9766 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9767 },
9768 { &hf_oran_rbg_mask_1,
9769 { "bit 1", "oran_fh_cus.rbgMask.bit1",
9770 FT_BOOLEAN, 32,
9771 TFS(&tfs_allocated_not_allocated)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_not_allocated
))))
, 0x00000002,
9772 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9773 },
9774 { &hf_oran_rbg_mask_0,
9775 { "bit 0", "oran_fh_cus.rbgMask.bit0",
9776 FT_BOOLEAN, 32,
9777 TFS(&tfs_allocated_not_allocated)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_not_allocated
))))
, 0x00000001,
9778 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9779 },
9780
9781
9782 /* 7.7.22.2 */
9783 { &hf_oran_ack_nack_req_id,
9784 { "ackNackReqId", "oran_fh_cus.ackNackReqId",
9785 FT_UINT16, BASE_HEX,
9786 NULL((void*)0), 0x0,
9787 "Indicates the ACK/NACK request ID of a section description", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9788 },
9789
9790 /* Subtree for next 2 items */
9791 { &hf_oran_frequency_range,
9792 { "Frequency Range", "oran_fh_cus.frequencyRange",
9793 FT_STRING, BASE_NONE,
9794 NULL((void*)0), 0x0,
9795 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9796 },
9797
9798 /* 7.7.12.4 */
9799 { &hf_oran_off_start_prb,
9800 { "offStartPrb", "oran_fh_cus.offStartPrb",
9801 FT_UINT8, BASE_DEC,
9802 NULL((void*)0), 0x0,
9803 "Offset of PRB range start", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9804 },
9805 /* 7.7.12.5 */
9806 { &hf_oran_num_prb,
9807 { "numPrb", "oran_fh_cus.numPrb",
9808 FT_UINT8, BASE_DEC,
9809 NULL((void*)0), 0x0,
9810 "Number of PRBs in PRB range", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9811 },
9812
9813 /* symbolId 8.3.3.7 */
9814 { &hf_oran_symbolId,
9815 { "Symbol Identifier", "oran_fh_cus.symbolId",
9816 FT_UINT8, BASE_DEC,
9817 NULL((void*)0), 0x3f,
9818 "Identifies a symbol number within a slot", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9819 },
9820
9821 /* startPrbu 8.3.3.11 */
9822 { &hf_oran_startPrbu,
9823 { "startPrbu", "oran_fh_cus.startPrbu",
9824 FT_UINT16, BASE_DEC,
9825 NULL((void*)0), 0x03ff,
9826 "starting PRB of user plane section", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9827 },
9828
9829 /* numPrbu 8.3.3.12 */
9830 { &hf_oran_numPrbu,
9831 { "numPrbu", "oran_fh_cus.numPrbu",
9832 FT_UINT8, BASE_DEC,
9833 NULL((void*)0), 0x0,
9834 "number of PRBs per user plane section", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9835 },
9836
9837 /* 7.7.1.3 */
9838 { &hf_oran_bfwCompParam,
9839 { "bfwCompParam", "oran_fh_cus.bfwCompParam",
9840 FT_STRING, BASE_NONE,
9841 NULL((void*)0), 0x0,
9842 "Beamforming weight compression parameter", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9843 },
9844
9845 /* 6.3.3.13 */
9846 { &hf_oran_udCompHdrMeth,
9847 { "User Data Compression Method", "oran_fh_cus.udCompHdrMeth",
9848 FT_UINT8, BASE_DEC | BASE_RANGE_STRING0x00000100,
9849 RVALS(ud_comp_header_meth)((0 ? (const struct _range_string*)0 : ((ud_comp_header_meth)
)))
, 0x0f,
9850 "Defines the compression method for the user data in every section in the C-Plane message", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9851 },
9852 { &hf_oran_udCompHdrMeth_pref,
9853 { "User Data Compression Method", "oran_fh_cus.udCompHdrMeth",
9854 FT_UINT8, BASE_DEC | BASE_RANGE_STRING0x00000100,
9855 RVALS(ud_comp_header_meth)((0 ? (const struct _range_string*)0 : ((ud_comp_header_meth)
)))
, 0x0,
9856 "Defines the compression method for the user data in every section in the C-Plane message", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9857 },
9858 /* 8.3.3.18 */
9859 { &hf_oran_udCompLen,
9860 { "udCompLen", "oran_fh_cus.udCompLen",
9861 FT_UINT16, BASE_DEC,
9862 NULL((void*)0), 0x0,
9863 "PRB field length in octets", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9864 },
9865
9866 /* 7.5.2.10 */
9867 { &hf_oran_udCompHdrIqWidth,
9868 { "User Data IQ width", "oran_fh_cus.udCompHdrWidth",
9869 FT_UINT8, BASE_DEC | BASE_RANGE_STRING0x00000100,
9870 RVALS(ud_comp_header_width)((0 ? (const struct _range_string*)0 : ((ud_comp_header_width
))))
, 0xf0,
9871 "Defines the IQ bit width for the user data in every section in the C-Plane message", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9872 },
9873 { &hf_oran_udCompHdrIqWidth_pref,
9874 { "User Data IQ width", "oran_fh_cus.udCompHdrWidth.pref",
9875 FT_UINT8, BASE_DEC,
9876 NULL((void*)0), 0x0,
9877 "IQ bit width for the user data in every section in the C-Plane message, from preference", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9878 },
9879
9880 { &hf_oran_sinrCompHdrIqWidth_pref,
9881 { "SINR IQ width", "oran_fh_cus.sinrCompHdrWidth",
9882 FT_UINT8, BASE_DEC,
9883 NULL((void*)0), 0x0,
9884 "Defines the IQ bit width for SINR data in section type 9", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9885 },
9886 { &hf_oran_sinrCompHdrMeth_pref,
9887 { "SINR Compression Method", "oran_fh_cus.sinrCompHdrMeth",
9888 FT_UINT8, BASE_DEC | BASE_RANGE_STRING0x00000100,
9889 RVALS(ud_comp_header_meth)((0 ? (const struct _range_string*)0 : ((ud_comp_header_meth)
)))
, 0x0,
9890 "Defines the compression method for SINR data in section type 9", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9891 },
9892
9893 /* Section 8.3.3.15 (not always present - depends upon meth) */
9894 { &hf_oran_udCompParam,
9895 { "User Data Compression Parameter", "oran_fh_cus.udCompParam",
9896 FT_STRING, BASE_NONE,
9897 NULL((void*)0), 0x0,
9898 "Applies to whatever compression method is specified by the associated sectionID's compMeth value", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9899 },
9900 /* 8.3.3.18 */
9901 { &hf_oran_sReSMask,
9902 { "sReSMask", "oran_fh_cus.sReSMask",
9903 FT_UINT16, BASE_HEX,
9904 NULL((void*)0), 0xf0ff,
9905 "selective RE sending mask", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9906 },
9907
9908 { &hf_oran_sReSMask_re12,
9909 { "RE-12", "oran_fh_cus.sReSMask-re12",
9910 FT_BOOLEAN, 16,
9911 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x8000,
9912 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9913 },
9914 { &hf_oran_sReSMask_re11,
9915 { "RE-11", "oran_fh_cus.sReSMask-re11",
9916 FT_BOOLEAN, 16,
9917 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x4000,
9918 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9919 },
9920 { &hf_oran_sReSMask_re10,
9921 { "RE-10", "oran_fh_cus.sReSMask-re10",
9922 FT_BOOLEAN, 16,
9923 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x2000,
9924 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9925 },
9926 { &hf_oran_sReSMask_re9,
9927 { "RE-9", "oran_fh_cus.sReSMask-re9",
9928 FT_BOOLEAN, 16,
9929 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x1000,
9930 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9931 },
9932 { &hf_oran_sReSMask_re8,
9933 { "RE-8", "oran_fh_cus.sReSMask-re8",
9934 FT_BOOLEAN, 16,
9935 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0080,
9936 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9937 },
9938 { &hf_oran_sReSMask_re7,
9939 { "RE-7", "oran_fh_cus.sReSMask-re7",
9940 FT_BOOLEAN, 16,
9941 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0040,
9942 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9943 },
9944 { &hf_oran_sReSMask_re6,
9945 { "RE-6", "oran_fh_cus.sReSMask-re6",
9946 FT_BOOLEAN, 16,
9947 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0020,
9948 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9949 },
9950 { &hf_oran_sReSMask_re5,
9951 { "RE-5", "oran_fh_cus.sReSMask-re5",
9952 FT_BOOLEAN, 16,
9953 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0010,
9954 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9955 },
9956 { &hf_oran_sReSMask_re4,
9957 { "RE-4", "oran_fh_cus.sReSMask-re4",
9958 FT_BOOLEAN, 16,
9959 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0008,
9960 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9961 },
9962 { &hf_oran_sReSMask_re3,
9963 { "RE-3", "oran_fh_cus.sReSMask-re3",
9964 FT_BOOLEAN, 16,
9965 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0004,
9966 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9967 },
9968 { &hf_oran_sReSMask_re2,
9969 { "RE-2", "oran_fh_cus.sReSMask-re2",
9970 FT_BOOLEAN, 16,
9971 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0002,
9972 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9973 },
9974 { &hf_oran_sReSMask_re1,
9975 { "RE-1", "oran_fh_cus.sReSMask-re1",
9976 FT_BOOLEAN, 16,
9977 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0001,
9978 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9979 },
9980
9981 /* 8.3.3.20 */
9982 { &hf_oran_sReSMask1,
9983 { "sReSMask1", "oran_fh_cus.sReSMask1",
9984 FT_UINT16, BASE_HEX,
9985 NULL((void*)0), 0x0fff,
9986 "selective RE sending mask 1", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9987 },
9988 /* 8.3.3.21 */
9989 { &hf_oran_sReSMask2,
9990 { "sReSMask2", "oran_fh_cus.sReSMask2",
9991 FT_UINT16, BASE_HEX,
9992 NULL((void*)0), 0x0fff,
9993 "selective RE sending mask 2", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9994 },
9995
9996 { &hf_oran_sReSMask1_2_re12,
9997 { "RE-12", "oran_fh_cus.sReSMask-re12",
9998 FT_BOOLEAN, 16,
9999 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0800,
10000 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10001 },
10002 { &hf_oran_sReSMask1_2_re11,
10003 { "RE-11", "oran_fh_cus.sReSMask-re11",
10004 FT_BOOLEAN, 16,
10005 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0400,
10006 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10007 },
10008 { &hf_oran_sReSMask1_2_re10,
10009 { "RE-10", "oran_fh_cus.sReSMask-re10",
10010 FT_BOOLEAN, 16,
10011 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0200,
10012 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10013 },
10014 { &hf_oran_sReSMask1_2_re9,
10015 { "RE-9", "oran_fh_cus.sReSMask-re9",
10016 FT_BOOLEAN, 16,
10017 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0100,
10018 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10019 },
10020
10021 /* Section 6.3.3.15 */
10022 { &hf_oran_iSample,
10023 { "iSample", "oran_fh_cus.iSample",
10024 FT_FLOAT, BASE_NONE,
10025 NULL((void*)0), 0x0,
10026 "In-phase Sample value", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10027 },
10028
10029 /* Section 6.3.3.16 */
10030 { &hf_oran_qSample,
10031 { "qSample", "oran_fh_cus.qSample",
10032 FT_FLOAT, BASE_NONE,
10033 NULL((void*)0), 0x0,
10034 "Quadrature Sample value", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10035 },
10036
10037 { &hf_oran_exponent,
10038 { "Exponent", "oran_fh_cus.exponent",
10039 FT_UINT8, BASE_DEC,
10040 NULL((void*)0), 0x0f,
10041 "Exponent applicable to the I & Q mantissas", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10042 },
10043
10044 { &hf_oran_iq_user_data,
10045 { "IQ User Data", "oran_fh_cus.iq_user_data",
10046 FT_BYTES, BASE_NONE,
10047 NULL((void*)0), 0x0,
10048 "Used for the In-phase and Quadrature sample mantissa", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10049 },
10050
10051
10052 { &hf_oran_u_section_ul_symbol_time,
10053 { "Microseconds since first UL U-plane frame for this symbol", "oran_fh_cus.us-since-first-ul-frame",
10054 FT_UINT32, BASE_DEC,
10055 NULL((void*)0), 0x0,
10056 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10057 },
10058 { &hf_oran_u_section_ul_symbol_frames,
10059 { "Number of UL frames sent for this symbol", "oran_fh_cus.number-ul-frames-in-symbol",
10060 FT_UINT32, BASE_DEC,
10061 NULL((void*)0), 0x0,
10062 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10063 },
10064 { &hf_oran_u_section_ul_symbol_first_frame,
10065 { "First UL frame for this symbol", "oran_fh_cus.first-ul-frame-in-symbol",
10066 FT_FRAMENUM, BASE_NONE,
10067 FRAMENUM_TYPE(FT_FRAMENUM_NONE)((gpointer) (glong) (FT_FRAMENUM_NONE)), 0x0,
10068 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10069 },
10070 { &hf_oran_u_section_ul_symbol_last_frame,
10071 { "Last UL frame for this symbol", "oran_fh_cus.last-ul-frame-in-symbol",
10072 FT_FRAMENUM, BASE_NONE,
10073 FRAMENUM_TYPE(FT_FRAMENUM_NONE)((gpointer) (glong) (FT_FRAMENUM_NONE)), 0x0,
10074 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10075 },
10076
10077 { &hf_oran_c_eAxC_ID,
10078 { "c_eAxC_ID", "oran_fh_cus.c_eaxc_id",
10079 FT_STRING, BASE_NONE,
10080 NULL((void*)0), 0x0,
10081 "This is a calculated field for the c_eAxC ID, which identifies the message stream", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10082 },
10083
10084 { &hf_oran_refa,
10085 { "RefA", "oran_fh_cus.refa",
10086 FT_STRING, BASE_NONE,
10087 NULL((void*)0), 0x0,
10088 "This is a calculated field for the RefA ID, which provides a reference in time", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10089 },
10090
10091
10092 /* Section 7.5.2.15 */
10093 { &hf_oran_ciCompHdr,
10094 { "ciCompHdr", "oran_fh_cus.ciCompHdr",
10095 FT_STRING, BASE_NONE,
10096 NULL((void*)0), 0x0,
10097 "Channel Information Compression Header", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10098 },
10099 { &hf_oran_ciCompHdrMeth,
10100 { "User Data Compression Method", "oran_fh_cus.ciCompHdrMeth",
10101 FT_UINT8, BASE_DEC | BASE_RANGE_STRING0x00000100,
10102 RVALS(ud_comp_header_meth)((0 ? (const struct _range_string*)0 : ((ud_comp_header_meth)
)))
, 0x0e,
10103 "Compression method for Channel Information", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10104 },
10105 { &hf_oran_ciCompHdrIqWidth,
10106 { "User Data IQ width", "oran_fh_cus.ciCompHdrWidth",
10107 FT_UINT8, BASE_DEC | BASE_RANGE_STRING0x00000100,
10108 RVALS(ud_comp_header_width)((0 ? (const struct _range_string*)0 : ((ud_comp_header_width
))))
, 0xf0,
10109 "IQ bit width for Channel Information", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10110 },
10111 { &hf_oran_ciCompOpt,
10112 { "ciCompOpt", "oran_fh_cus.ciCompOpt",
10113 FT_UINT8, BASE_DEC,
10114 VALS(ci_comp_opt_vals)((0 ? (const struct _value_string*)0 : ((ci_comp_opt_vals)))), 0x01,
10115 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10116 },
10117
10118 /* 7.7.11.7 */
10119 { &hf_oran_disable_bfws,
10120 { "disableBFWs", "oran_fh_cus.disableBFWs",
10121 FT_BOOLEAN, 8,
10122 NULL((void*)0), 0x80,
10123 "Indicate if BFWs under section extension are disabled", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10124 },
10125 /* 7.7.11.8 */
10126 { &hf_oran_rad,
10127 { "RAD", "oran_fh_cus.rad",
10128 FT_BOOLEAN, 8,
10129 NULL((void*)0), 0x40,
10130 "Reset After PRB Discontinuity", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10131 },
10132 /* 7.7.11.4 */
10133 { &hf_oran_num_bund_prbs,
10134 { "numBundPrb", "oran_fh_cus.numBundPrb",
10135 FT_UINT8, BASE_DEC,
10136 NULL((void*)0), 0x0,
10137 "Number of bundled PRBs per BFWs", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10138 },
10139 { &hf_oran_beam_id,
10140 { "beamId", "oran_fh_cus.beamId",
10141 FT_UINT16, BASE_DEC,
10142 NULL((void*)0), 0x7fff,
10143 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10144 },
10145 { &hf_oran_num_weights_per_bundle,
10146 { "Num weights per bundle", "oran_fh_cus.num_weights_per_bundle",
10147 FT_UINT16, BASE_DEC,
10148 NULL((void*)0), 0x0,
10149 "From dissector preference", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10150 },
10151
10152 { &hf_oran_samples_prb,
10153 {"PRB", "oran_fh_cus.prb",
10154 FT_STRING, BASE_NONE,
10155 NULL((void*)0), 0x0,
10156 "Grouping of samples for a particular Physical Resource Block", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10157 },
10158
10159 /* 7.5.3.13 */
10160 { &hf_oran_ciSample,
10161 { "ciSample", "oran_fh_cus.ciSample",
10162 FT_STRING, BASE_NONE,
10163 NULL((void*)0), 0x0,
10164 "Sample (I and Q values)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10165 },
10166 { &hf_oran_ciIsample,
10167 { "ciIsample", "oran_fh_cus.ciISample",
10168 FT_FLOAT, BASE_NONE,
10169 NULL((void*)0), 0x0,
10170 "Channel information complex value - I part", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10171 },
10172 { &hf_oran_ciQsample,
10173 { "ciQsample", "oran_fh_cus.ciQSample",
10174 FT_FLOAT, BASE_NONE,
10175 NULL((void*)0), 0x0,
10176 "Channel information complex value - Q part", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10177 },
10178
10179 /* 7.7.10 */
10180 { &hf_oran_se10_port,
10181 { "Port entry", "oran_fh_cus.portEntry",
10182 FT_NONE, BASE_NONE,
10183 NULL((void*)0), 0x0,
10184 "SE10 port entry", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10185 },
10186 /* 7.7.10.2 */
10187 { &hf_oran_beamGroupType,
10188 { "beamGroupType", "oran_fh_cus.beamGroupType",
10189 FT_UINT8, BASE_DEC,
10190 VALS(beam_group_type_vals)((0 ? (const struct _value_string*)0 : ((beam_group_type_vals
))))
, 0xc0,
10191 "The type of beam grouping", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10192 },
10193 /* 7.7.10.3 */
10194 { &hf_oran_numPortc,
10195 { "numPortc", "oran_fh_cus.numPortc",
10196 FT_UINT8, BASE_DEC,
10197 NULL((void*)0), 0x3f,
10198 "The number of eAxC ports", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10199 },
10200
10201 /* 7.7.4.2 (1 bit) */
10202 { &hf_oran_csf,
10203 { "csf", "oran_fh_cus.csf",
10204 FT_BOOLEAN, BASE_NONE,
10205 NULL((void*)0), 0x0,
10206 "constellation shift flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10207 },
10208 /* 7.7.4.3 */
10209 { &hf_oran_modcompscaler,
10210 { "modCompScaler", "oran_fh_cus.modcompscaler",
10211 FT_UINT16, BASE_DEC,
10212 NULL((void*)0), 0x7fff,
10213 "modulation compression scaler value", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10214 },
10215
10216 /* 7.7.5.1 */
10217 { &hf_oran_modcomp_param_set,
10218 { "Set", "oran_fh_cus.modcomp-param-set",
10219 FT_STRING, BASE_NONE,
10220 NULL((void*)0), 0x0,
10221 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10222 },
10223
10224
10225
10226 /* mcScaleReMask 7.7.5.2 (12 bits) */
10227
10228 /* First entry (starts with msb within byte) */
10229 { &hf_oran_mc_scale_re_mask_re1,
10230 { "RE 1", "oran_fh_cus.mcscalermask-RE1",
10231 FT_BOOLEAN, 16,
10232 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x8000,
10233 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10234 },
10235 { &hf_oran_mc_scale_re_mask_re2,
10236 { "RE 2", "oran_fh_cus.mcscalermask-RE2",
10237 FT_BOOLEAN, 16,
10238 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x4000,
10239 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10240 },
10241 { &hf_oran_mc_scale_re_mask_re3,
10242 { "RE 3", "oran_fh_cus.mcscalermask-RE3",
10243 FT_BOOLEAN, 16,
10244 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x2000,
10245 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10246 },
10247 { &hf_oran_mc_scale_re_mask_re4,
10248 { "RE 4", "oran_fh_cus.mcscalermask-RE4",
10249 FT_BOOLEAN, 16,
10250 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x1000,
10251 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10252 },
10253 { &hf_oran_mc_scale_re_mask_re5,
10254 { "RE 5", "oran_fh_cus.mcscalermask-RE5",
10255 FT_BOOLEAN, 16,
10256 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0800,
10257 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10258 },
10259 { &hf_oran_mc_scale_re_mask_re6,
10260 { "RE 6", "oran_fh_cus.mcscalermask-RE6",
10261 FT_BOOLEAN, 16,
10262 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0400,
10263 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10264 },
10265 { &hf_oran_mc_scale_re_mask_re7,
10266 { "RE 7", "oran_fh_cus.mcscalermask-RE7",
10267 FT_BOOLEAN, 16,
10268 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0200,
10269 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10270 },
10271 { &hf_oran_mc_scale_re_mask_re8,
10272 { "RE 8", "oran_fh_cus.mcscalermask-RE8",
10273 FT_BOOLEAN, 16,
10274 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0100,
10275 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10276 },
10277 { &hf_oran_mc_scale_re_mask_re9,
10278 { "RE 9", "oran_fh_cus.mcscalermask-RE9",
10279 FT_BOOLEAN, 16,
10280 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0080,
10281 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10282 },
10283 { &hf_oran_mc_scale_re_mask_re10,
10284 { "RE 10", "oran_fh_cus.mcscalermask-RE10",
10285 FT_BOOLEAN, 16,
10286 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0040,
10287 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10288 },
10289 { &hf_oran_mc_scale_re_mask_re11,
10290 { "RE 11", "oran_fh_cus.mcscalermask-RE11",
10291 FT_BOOLEAN, 16,
10292 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0020,
10293 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10294 },
10295 { &hf_oran_mc_scale_re_mask_re12,
10296 { "RE 12", "oran_fh_cus.mcscalermask-RE12",
10297 FT_BOOLEAN, 16,
10298 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0010,
10299 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10300 },
10301
10302 /* Even tries entry (starts with 5th bit within byte) */
10303 { &hf_oran_mc_scale_re_mask_re1_even,
10304 { "RE 1", "oran_fh_cus.mcscalermask-RE1",
10305 FT_BOOLEAN, 16,
10306 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0800,
10307 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10308 },
10309 { &hf_oran_mc_scale_re_mask_re2_even,
10310 { "RE 2", "oran_fh_cus.mcscalermask-RE2",
10311 FT_BOOLEAN, 16,
10312 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0400,
10313 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10314 },
10315 { &hf_oran_mc_scale_re_mask_re3_even,
10316 { "RE 3", "oran_fh_cus.mcscalermask-RE3",
10317 FT_BOOLEAN, 16,
10318 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0200,
10319 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10320 },
10321 { &hf_oran_mc_scale_re_mask_re4_even,
10322 { "RE 4", "oran_fh_cus.mcscalermask-RE4",
10323 FT_BOOLEAN, 16,
10324 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0100,
10325 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10326 },
10327 { &hf_oran_mc_scale_re_mask_re5_even,
10328 { "RE 5", "oran_fh_cus.mcscalermask-RE5",
10329 FT_BOOLEAN, 16,
10330 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0080,
10331 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10332 },
10333 { &hf_oran_mc_scale_re_mask_re6_even,
10334 { "RE 6", "oran_fh_cus.mcscalermask-RE6",
10335 FT_BOOLEAN, 16,
10336 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0040,
10337 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10338 },
10339 { &hf_oran_mc_scale_re_mask_re7_even,
10340 { "RE 7", "oran_fh_cus.mcscalermask-RE7",
10341 FT_BOOLEAN, 16,
10342 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0020,
10343 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10344 },
10345 { &hf_oran_mc_scale_re_mask_re8_even,
10346 { "RE 8", "oran_fh_cus.mcscalermask-RE8",
10347 FT_BOOLEAN, 16,
10348 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0010,
10349 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10350 },
10351 { &hf_oran_mc_scale_re_mask_re9_even,
10352 { "RE 9", "oran_fh_cus.mcscalermask-RE9",
10353 FT_BOOLEAN, 16,
10354 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0008,
10355 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10356 },
10357 { &hf_oran_mc_scale_re_mask_re10_even,
10358 { "RE 10", "oran_fh_cus.mcscalermask-RE10",
10359 FT_BOOLEAN, 16,
10360 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0004,
10361 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10362 },
10363 { &hf_oran_mc_scale_re_mask_re11_even,
10364 { "RE 11", "oran_fh_cus.mcscalermask-RE11",
10365 FT_BOOLEAN, 16,
10366 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0002,
10367 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10368 },
10369 { &hf_oran_mc_scale_re_mask_re12_even,
10370 { "RE 12", "oran_fh_cus.mcscalermask-RE12",
10371 FT_BOOLEAN, 16,
10372 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0001,
10373 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10374 },
10375
10376 { &hf_oran_mc_scale_re_mask,
10377 { "mcScaleReMask", "oran_fh_cus.mcscaleremask",
10378 FT_UINT16, BASE_HEX,
10379 NULL((void*)0), 0xfff0,
10380 "modulation compression power scale RE mask", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10381 },
10382 { &hf_oran_mc_scale_re_mask_even,
10383 { "mcScaleReMask", "oran_fh_cus.mcscaleremask",
10384 FT_UINT16, BASE_HEX,
10385 NULL((void*)0), 0x0fff,
10386 "modulation compression power scale RE mask", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10387 },
10388
10389 /* mcScaleOffset 7.7.5.4 (15 bits) */
10390 { &hf_oran_mc_scale_offset,
10391 { "mcScaleOffset", "oran_fh_cus.mcscaleoffset",
10392 FT_UINT24, BASE_DEC,
10393 NULL((void*)0), 0x0,
10394 "scaling value for modulation compression", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10395 },
10396 /* eAxCmask (7.7.7.2) */
10397 { &hf_oran_eAxC_mask,
10398 { "eAxC Mask", "oran_fh_cus.eaxcmask",
10399 FT_UINT16, BASE_HEX,
10400 NULL((void*)0), 0xffff,
10401 "Which eAxC_ID values the C-Plane message applies to", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10402 },
10403 /* technology (interface name) 7.7.9.2 */
10404 { &hf_oran_technology,
10405 { "Technology", "oran_fh_cus.technology",
10406 FT_UINT8, BASE_DEC,
10407 VALS(interface_name_vals)((0 ? (const struct _value_string*)0 : ((interface_name_vals)
)))
, 0x0,
10408 "Interface name (that C-PLane section applies to)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10409 },
10410 /* Exttype 14 (7.7.14.2) */
10411 { &hf_oran_nullLayerInd,
10412 { "nullLayerInd", "oran_fh_cus.nulllayerind",
10413 FT_BOOLEAN, BASE_NONE,
10414 NULL((void*)0), 0x0,
10415 "Whether corresponding layer is nulling-layer or not", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10416 },
10417
10418 /* Exttype 19 */
10419 /* 7.7.19.3 */
10420 { &hf_oran_se19_repetition,
10421 { "repetition", "oran_fh_cus.repetition",
10422 FT_BOOLEAN, BASE_NONE,
10423 TFS(&repetition_se19_tfs)((0 ? (const struct true_false_string*)0 : ((&repetition_se19_tfs
))))
, 0x0,
10424 "repeat port info flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10425 },
10426 /* 7.7.19.8 */
10427 /* TODO: break down into each RE as done for 7.5.3.5 ? */
10428 { &hf_oran_portReMask,
10429 { "portReMask", "oran_fh_cus.portReMask",
10430 FT_BOOLEAN, 16,
10431 TFS(&tfs_set_notset)((0 ? (const struct true_false_string*)0 : ((&tfs_set_notset
))))
, 0x0fff,
10432 "RE bitmask per port", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10433 },
10434 /* 7.7.19.9 */
10435 { &hf_oran_portSymbolMask,
10436 { "portSymbolMask", "oran_fh_cus.portSymbolMask",
10437 FT_BOOLEAN, 16,
10438 TFS(&tfs_set_notset)((0 ? (const struct true_false_string*)0 : ((&tfs_set_notset
))))
, 0x3fff,
10439 "Symbol bitmask port port", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10440 },
10441
10442 { &hf_oran_ext19_port,
10443 {"Port", "oran_fh_cus.ext19.port",
10444 FT_STRING, BASE_NONE,
10445 NULL((void*)0), 0x0,
10446 "Entry for a given port in ext19", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10447 },
10448
10449 /* Ext 13 */
10450 { &hf_oran_prb_allocation,
10451 {"PRB allocation", "oran_fh_cus.prb-allocation",
10452 FT_STRING, BASE_NONE,
10453 NULL((void*)0), 0x0,
10454 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10455 },
10456 /* 7.7.13.2 */
10457 { &hf_oran_nextSymbolId,
10458 { "nextSymbolId", "oran_fh_cus.nextSymbolId",
10459 FT_UINT8, BASE_DEC,
10460 NULL((void*)0), 0x3c,
10461 "offset of PRB range start", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10462 },
10463 /* 7.7.13.3 */
10464 { &hf_oran_nextStartPrbc,
10465 { "nextStartPrbc", "oran_fh_cus.nextStartPrbc",
10466 FT_UINT16, BASE_DEC,
10467 NULL((void*)0), 0x03ff,
10468 "number of PRBs in PRB range", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10469 },
10470
10471 /* Puncturing patters as appears in SE 20 */
10472 { &hf_oran_puncPattern,
10473 { "puncPattern", "oran_fh_cus.puncPattern",
10474 FT_STRING, BASE_NONE,
10475 NULL((void*)0), 0x0,
10476 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10477 },
10478
10479 /* 7.7.20.2 numPuncPatterns */
10480 { &hf_oran_numPuncPatterns,
10481 { "numPuncPatterns", "oran_fh_cus.numPuncPatterns",
10482 FT_UINT8, BASE_DEC,
10483 NULL((void*)0), 0x0,
10484 "number of puncturing patterns", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
10485 },
10486 /* 7.7.20.3 symbolMask */
10487 { &hf_oran_symbolMask_ext20,
10488 { "symbolMask", "oran_fh_cus.symbolMask",
10489 FT_UINT16, BASE_HEX,
10490 NULL((void*)0), 0xfffc,
10491 "Bitmask where each bit indicates the symbols associated with the puncturing pattern", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10492 },
10493 /* 7.7.20.4 startPuncPrb */
10494 { &hf_oran_startPuncPrb,
10495 { "startPuncPrb", "oran_fh_cus.startPuncPrb",
10496 FT_UINT16, BASE_DEC,
10497 NULL((void*)0), 0x03ff,
10498 "starting PRB to which one puncturing pattern applies", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10499 },
10500 /* 7.7.20.5 numPuncPrb */
10501 { &hf_oran_numPuncPrb,
10502 { "numPuncPrb", "oran_fh_cus.numPuncPrb",
10503 FT_UINT8, BASE_DEC,
10504 NULL((void*)0), 0x0,
10505 "the number of PRBs of the puncturing pattern", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10506 },
10507 /* 7.7.20.6 puncReMask */
10508 { &hf_oran_puncReMask,
10509 { "puncReMask", "oran_fh_cus.puncReMask",
10510 FT_UINT16, BASE_DEC,
10511 NULL((void*)0), 0xfff0,
10512 "puncturing pattern RE mask", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10513 },
10514 /* 7.7.20.12 multiSDScope */
10515 { &hf_oran_multiSDScope,
10516 { "multiSDScope", "oran_fh_cus.multiSDScope",
10517 FT_BOOLEAN, 8,
10518 TFS(&multi_sd_scope_tfs)((0 ? (const struct true_false_string*)0 : ((&multi_sd_scope_tfs
))))
, 0x02,
10519 "multiple section description scope flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10520 },
10521 /* 7.7.20.4 rbgIncl */
10522 { &hf_oran_RbgIncl,
10523 { "rbgIncl", "oran_fh_cus.rbgIncl",
10524 FT_BOOLEAN, 8,
10525 NULL((void*)0), 0x01,
10526 "rbg included flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10527 },
10528
10529 /* 7.7.21.2 ciPrbGroupSize */
10530 { &hf_oran_ci_prb_group_size,
10531 { "ciPrbGroupSize", "oran_fh_cus.ciPrbGroupSize",
10532 FT_UINT8, BASE_DEC,
10533 NULL((void*)0), 0x0,
10534 "channel information PRB group size", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10535 },
10536 /* 7.21.3 */
10537 { &hf_oran_prg_size_st5,
10538 { "prgSize", "oran_fh_cus.prgSize",
10539 FT_UINT8, BASE_DEC,
10540 VALS(prg_size_st5_vals)((0 ? (const struct _value_string*)0 : ((prg_size_st5_vals)))
)
, 0x03,
10541 "precoding resource block group size", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10542 },
10543 { &hf_oran_prg_size_st6,
10544 { "prgSize", "oran_fh_cus.prgSize",
10545 FT_UINT8, BASE_DEC,
10546 VALS(prg_size_st6_vals)((0 ? (const struct _value_string*)0 : ((prg_size_st6_vals)))
)
, 0x03,
10547 "precoding resource block group size", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10548 },
10549
10550 /* 7.7.17.2 numUeID */
10551 { &hf_oran_num_ueid,
10552 { "numUeID", "oran_fh_cus.numUeID",
10553 FT_UINT8, BASE_DEC,
10554 NULL((void*)0), 0x0,
10555 "number of ueIDs per user", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10556 },
10557
10558 /* 7.7.16.2 antMask */
10559 { &hf_oran_antMask,
10560 { "antMask", "oran_fh_cus.antMask",
10561 FT_UINT64, BASE_HEX,
10562 NULL((void*)0), 0xffffffffffffffff,
10563 "indices of antennas to be pre-combined per RX endpoint", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10564 },
10565
10566 /* 7.7.18.2 transmissionWindowOffset */
10567 { &hf_oran_transmissionWindowOffset,
10568 { "transmissionWindowOffset", "oran_fh_cus.transmissionWindowOffset",
10569 FT_UINT16, BASE_DEC,
10570 NULL((void*)0), 0x0,
10571 "start of the transmission window as an offset to when the transmission window would have been without this parameter, i.e. (Ta3_max - Ta3_min)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10572 },
10573 /* 7.7.18.3 transmissionWindowSize */
10574 { &hf_oran_transmissionWindowSize,
10575 { "transmissionWindowSize", "oran_fh_cus.transmissionWindowSize",
10576 FT_UINT16, BASE_DEC,
10577 NULL((void*)0), 0x3fff,
10578 "size of the transmission window in resolution µs", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10579 },
10580 /* 7.7.18.4 toT */
10581 { &hf_oran_toT,
10582 { "toT", "oran_fh_cus.toT",
10583 FT_UINT8, BASE_DEC,
10584 VALS(type_of_transmission_vals)((0 ? (const struct _value_string*)0 : ((type_of_transmission_vals
))))
, 0x03,
10585 "type of transmission", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10586 },
10587
10588 /* 7.7.2.2 bfaCompHdr */
10589 { &hf_oran_bfaCompHdr,
10590 { "bfaCompHdr", "oran_fh_cus.bfaCompHdr",
10591 FT_STRING, BASE_NONE,
10592 NULL((void*)0), 0x0,
10593 "beamforming attributes compression header", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10594 },
10595 /* 7.7.2.2-2: bfAzPtWidth */
10596 { &hf_oran_bfAzPtWidth,
10597 { "bfAzPtWidth", "oran_fh_cus.bfAzPtWidth",
10598 FT_UINT8, BASE_DEC,
10599 VALS(bfa_bw_vals)((0 ? (const struct _value_string*)0 : ((bfa_bw_vals)))), 0x38,
10600 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10601 },
10602 /* 7.7.2.2-3: bfZePtWidth */
10603 { &hf_oran_bfZePtWidth,
10604 { "bfZePtWidth", "oran_fh_cus.bfZePtWidth",
10605 FT_UINT8, BASE_DEC,
10606 VALS(bfa_bw_vals)((0 ? (const struct _value_string*)0 : ((bfa_bw_vals)))), 0x07,
10607 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10608 },
10609 /* 7.7.2.2-4: bfAz3ddWidth */
10610 { &hf_oran_bfAz3ddWidth,
10611 { "bfAz3ddWidth", "oran_fh_cus.bfAz3ddWidth",
10612 FT_UINT8, BASE_DEC,
10613 VALS(bfa_bw_vals)((0 ? (const struct _value_string*)0 : ((bfa_bw_vals)))), 0x38,
10614 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10615 },
10616 /* 7.7.2.2-5: bfZe3ddWidth */
10617 { &hf_oran_bfZe3ddWidth,
10618 { "bfZe3ddWidth", "oran_fh_cus.bfZe3ddWidth",
10619 FT_UINT8, BASE_DEC,
10620 VALS(bfa_bw_vals)((0 ? (const struct _value_string*)0 : ((bfa_bw_vals)))), 0x07,
10621 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10622 },
10623
10624 /* 7.7.2.3 bfAzPt */
10625 { &hf_oran_bfAzPt,
10626 { "bfAzPt", "oran_fh_cus.bfAzPt",
10627 FT_UINT8, BASE_DEC,
10628 NULL((void*)0), 0x0,
10629 "beamforming azimuth pointing parameter", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10630 },
10631 /* 7.7.2.4 bfZePt */
10632 { &hf_oran_bfZePt,
10633 { "bfZePt", "oran_fh_cus.bfZePt",
10634 FT_UINT8, BASE_DEC,
10635 NULL((void*)0), 0x0,
10636 "beamforming zenith pointing parameter", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10637 },
10638 /* 7.7.2.5 bfAz3dd */
10639 { &hf_oran_bfAz3dd,
10640 { "bfAz3dd", "oran_fh_cus.bfAz3dd",
10641 FT_UINT8, BASE_DEC,
10642 NULL((void*)0), 0x0,
10643 "beamforming azimuth beamwidth parameter", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10644 },
10645 /* 7.7.2.6 bfZe3dd */
10646 { &hf_oran_bfZe3dd,
10647 { "bfZe3dd", "oran_fh_cus.bfZe3dd",
10648 FT_UINT8, BASE_DEC,
10649 NULL((void*)0), 0x0,
10650 "beamforming zenith beamwidth parameter", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10651 },
10652
10653 /* 7.7.2.7 bfAzSl */
10654 { &hf_oran_bfAzSl,
10655 { "bfAzSl", "oran_fh_cus.bfAzSl",
10656 FT_UINT8, BASE_DEC,
10657 VALS(sidelobe_suppression_vals)((0 ? (const struct _value_string*)0 : ((sidelobe_suppression_vals
))))
, 0x38,
10658 "beamforming azimuth sidelobe parameter", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10659 },
10660 /* 7.7.2.8 bfZeSl */
10661 { &hf_oran_bfZeSl,
10662 { "bfZeSl", "oran_fh_cus.bfZeSl",
10663 FT_UINT8, BASE_DEC,
10664 VALS(sidelobe_suppression_vals)((0 ? (const struct _value_string*)0 : ((sidelobe_suppression_vals
))))
, 0x07,
10665 "beamforming zenith sidelobe parameter", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10666 },
10667
10668 /* 7.5.2.17 */
10669 { &hf_oran_cmd_scope,
10670 { "cmdScope", "oran_fh_cus.cmdScope",
10671 FT_UINT8, BASE_DEC | BASE_RANGE_STRING0x00000100,
10672 RVALS(cmd_scope_vals)((0 ? (const struct _range_string*)0 : ((cmd_scope_vals)))), 0x0f,
10673 "command scope", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10674 },
10675 /* 7.5.2.18 */
10676 { &hf_oran_number_of_st4_cmds,
10677 { "numberOfST4Cmds", "oran_fh_cus.numberOfST4Cmds",
10678 FT_UINT8, BASE_DEC,
10679 NULL((void*)0), 0x0,
10680 "Number of Section Type 4 commands", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10681 },
10682
10683 { &hf_oran_st4_cmd_header,
10684 { "Command common header", "oran_fh_cus.st4CmdCommonHeader",
10685 FT_STRING, BASE_NONE,
10686 NULL((void*)0), 0x0,
10687 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10688 },
10689
10690 /* 7.5.3.38 */
10691 { &hf_oran_st4_cmd_type,
10692 { "st4CmdType", "oran_fh_cus.st4CmdType",
10693 FT_UINT8, BASE_DEC | BASE_RANGE_STRING0x00000100,
10694 RVALS(st4_cmd_type_vals)((0 ? (const struct _range_string*)0 : ((st4_cmd_type_vals)))
)
, 0x0,
10695 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10696 },
10697 /* 7.5.3.39 */
10698 { &hf_oran_st4_cmd_len,
10699 { "st4CmdLen", "oran_fh_cus.st4CmdLen",
10700 FT_UINT16, BASE_DEC,
10701 NULL((void*)0), 0x0,
10702 "Length of command in 32-bit words", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10703 },
10704 /* 7.5.3.40 */
10705 { &hf_oran_st4_cmd_num_slots,
10706 { "numSlots", "oran_fh_cus.st4NumSlots",
10707 FT_UINT8, BASE_DEC,
10708 NULL((void*)0), 0x0,
10709 "Contiguous slots for which command is applicable", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10710 },
10711 /* 7.5.3.41 */
10712 { &hf_oran_st4_cmd_ack_nack_req_id,
10713 { "ackNackReqId", "oran_fh_cus.ackNackReqId",
10714 FT_UINT16, BASE_DEC,
10715 NULL((void*)0), 0x0,
10716 "ACK/NACK Request Id", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10717 },
10718
10719 { &hf_oran_st4_cmd,
10720 { "Command", "oran_fh_cus.st4Cmd",
10721 FT_STRING, BASE_NONE,
10722 NULL((void*)0), 0x0,
10723 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10724 },
10725
10726 /* 7.5.3.52 */
10727 { &hf_oran_sleepmode_trx,
10728 { "sleepMode", "oran_fh_cus.sleepMode",
10729 FT_UINT8, BASE_HEX,
10730 VALS(sleep_mode_trx_vals)((0 ? (const struct _value_string*)0 : ((sleep_mode_trx_vals)
)))
, 0x03,
10731 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10732 },
10733 { &hf_oran_sleepmode_asm,
10734 { "sleepMode", "oran_fh_cus.sleepMode",
10735 FT_UINT8, BASE_HEX,
10736 VALS(sleep_mode_asm_vals)((0 ? (const struct _value_string*)0 : ((sleep_mode_asm_vals)
)))
, 0x03,
10737 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10738 },
10739
10740 /* 7.5.3.51 */
10741 { &hf_oran_log2maskbits,
10742 { "log2MaskBits", "oran_fh_cus.log2MaskBits",
10743 FT_UINT8, BASE_HEX,
10744 VALS(log2maskbits_vals)((0 ? (const struct _value_string*)0 : ((log2maskbits_vals)))
)
, 0x3c,
10745 "Number of bits to appear in antMask", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10746 },
10747 /* 7.5.3.53 */
10748 { &hf_oran_num_slots_ext,
10749 { "numSlotsExt", "oran_fh_cus.numSlotsExt",
10750 FT_UINT24, BASE_HEX,
10751 NULL((void*)0), 0x0fffff,
10752 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10753 },
10754 /* 7.5.3.54 */
10755 { &hf_oran_antMask_trx_control,
10756 { "antMask", "oran_fh_cus.trxControl.antMask",
10757 FT_BYTES, BASE_NONE,
10758 NULL((void*)0), 0x0,
10759 "which antennas should sleep or wake-up", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10760 },
10761
10762 /* 7.5.3.136 */
10763 { &hf_oran_max_pwr_lvl_ind,
10764 { "maxPwrLvlInd", "oran_fh_cus.maxPwrLvlInd",
10765 FT_UINT8, BASE_DEC,
10766 NULL((void*)0), 0x0,
10767 "Maximum output power for tx-array", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10768 },
10769 /* 7.5.3.137 */
10770 { &hf_oran_array_carrier_max_pwr_reduction,
10771 { "arrayCarrierMaxPwrReduction", "oran_fh_cus.arrayCarrierMaxPwrReduction",
10772 FT_UINT16, BASE_DEC,
10773 NULL((void*)0), 0x0,
10774 "array carrier power reduction", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10775 },
10776
10777 /* 7.734.3 */
10778 { &hf_oran_port_list_en,
10779 { "portListEn", "oran_fh_cus.portListEn",
10780 FT_BOOLEAN, 8,
10781 NULL((void*)0), 0x80,
10782 "port list enabled", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10783 },
10784 /* 7.7.34.4 */
10785 { &hf_oran_tpmi_mode,
10786 { "tpmiMode", "oran_fh_cus.tpmiMode",
10787 FT_UINT8, BASE_DEC,
10788 VALS(tpmi_mode_vals)((0 ? (const struct _value_string*)0 : ((tpmi_mode_vals)))), 0x07,
10789 "TPMI mode selection", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10790 },
10791 /* 7.7.34.5 */
10792 { &hf_oran_num_ueid_se34,
10793 { "numUeId", "oran_fh_cus.numUeId",
10794 FT_UINT8, BASE_DEC,
10795 NULL((void*)0), 0x3f,
10796 "Number of uplink layers", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10797 },
10798 { &hf_oran_ueid_se34,
10799 { "ueId", "oran_fh_cus.ueId",
10800 FT_UINT16, BASE_DEC,
10801 NULL((void*)0), 0x0,
10802 "ueId for UE layer", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10803 },
10804 { &hf_oran_num_port_list_index,
10805 { "numPortListIndex", "oran_fh_cus.numPortListIndex",
10806 FT_UINT8, BASE_DEC,
10807 NULL((void*)0), 0x0,
10808 "Number of portListIndex values to follow", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10809 },
10810 /* 7.7.34.6.2 */
10811 { &hf_oran_chan_srs_port_mask,
10812 { "srsPortMask", "oran_fh_cus.srsPortMask",
10813 FT_UINT8, BASE_DEC,
10814 NULL((void*)0), 0x0,
10815 "SRS antenna ports used for tx of UE layer", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10816 },
10817
10818 /* 7.5.3.55 */
10819 { &hf_oran_ready,
10820 { "ready", "oran_fh_cus.ready",
10821 FT_BOOLEAN, 8,
10822 TFS(&ready_tfs)((0 ? (const struct true_false_string*)0 : ((&ready_tfs))
))
, 0x01,
10823 "wake-up ready indicator", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10824 },
10825 /* 7.5.3.34 */
10826 { &hf_oran_number_of_acks,
10827 { "numberOfAcks", "oran_fh_cus.numberOfAcks",
10828 FT_UINT8, BASE_DEC,
10829 NULL((void*)0), 0x0,
10830 "number of ACKs for one eAxC_ID", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10831 },
10832 /* 7.5.3.35 */
10833 { &hf_oran_number_of_nacks,
10834 { "numberOfNacks", "oran_fh_cus.numberOfNacks",
10835 FT_UINT8, BASE_DEC,
10836 NULL((void*)0), 0x0,
10837 "number of NACKs for one eAxC_ID", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10838 },
10839 /* 7.5.3.36 */
10840 { &hf_oran_ackid,
10841 { "ackId", "oran_fh_cus.ackId",
10842 FT_UINT16, BASE_DEC,
10843 NULL((void*)0), 0x0,
10844 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10845 },
10846 /* 7.5.3.37 */
10847 { &hf_oran_nackid,
10848 { "nackId", "oran_fh_cus.nackId",
10849 FT_UINT16, BASE_DEC,
10850 NULL((void*)0), 0x0,
10851 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10852 },
10853
10854 /* Links between acknack requests & responses */
10855 { &hf_oran_acknack_request_frame,
10856 { "Request Frame", "oran_fh_cus.ackNackId.request-frame",
10857 FT_FRAMENUM, BASE_NONE,
10858 FRAMENUM_TYPE(FT_FRAMENUM_REQUEST)((gpointer) (glong) (FT_FRAMENUM_REQUEST)), 0x0,
10859 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10860 },
10861 { &hf_oran_acknack_request_time,
10862 { "Time since request in ms", "oran_fh_cus.ackNackId.time-since-request",
10863 FT_UINT32, BASE_DEC,
10864 NULL((void*)0), 0x0,
10865 "Time between request and response", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10866 },
10867 { &hf_oran_acknack_request_type,
10868 { "Request Type", "oran_fh_cus.ackNackId.request-type",
10869 FT_UINT32, BASE_DEC,
10870 VALS(acknack_type_vals)((0 ? (const struct _value_string*)0 : ((acknack_type_vals)))
)
, 0x0,
10871 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10872 },
10873 { &hf_oran_acknack_response_frame,
10874 { "Response Frame", "oran_fh_cus.ackNackId.response-frame",
10875 FT_FRAMENUM, BASE_NONE,
10876 FRAMENUM_TYPE(FT_FRAMENUM_RESPONSE)((gpointer) (glong) (FT_FRAMENUM_RESPONSE)), 0x0,
10877 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10878 },
10879 { &hf_oran_acknack_response_time,
10880 { "Time to response in ms", "oran_fh_cus.ackNackId.time-to-response",
10881 FT_UINT32, BASE_DEC,
10882 NULL((void*)0), 0x0,
10883 "Time between request and response", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10884 },
10885
10886 /* 7.5.3.43 */
10887 { &hf_oran_disable_tdbfns,
10888 { "disableTDBFNs", "oran_fh_cus.disableTDBFNs",
10889 FT_BOOLEAN, 8,
10890 TFS(&disable_tdbfns_tfs)((0 ? (const struct true_false_string*)0 : ((&disable_tdbfns_tfs
))))
, 0x80,
10891 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10892 },
10893
10894 /* 7.5.3.44 */
10895 { &hf_oran_td_beam_group,
10896 { "tdBeamGrp", "oran_fh_cus.tdBeamGrp",
10897 FT_UINT16, BASE_HEX,
10898 NULL((void*)0), 0x7fff,
10899 "Applies to symbolMask in command header", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10900 },
10901 /* 7.5.3.43 */
10902 { &hf_oran_disable_tdbfws,
10903 { "disableTDBFWs", "oran_fh_cus.disableTDBFWs",
10904 FT_BOOLEAN, 8,
10905 TFS(&beam_numbers_included_tfs)((0 ? (const struct true_false_string*)0 : ((&beam_numbers_included_tfs
))))
, 0x80,
10906 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10907 },
10908
10909 /* 7.5.3.56 */
10910 { &hf_oran_td_beam_num,
10911 { "tdBeamNum", "oran_fh_cus.tdBeamNum",
10912 FT_UINT16, BASE_HEX,
10913 NULL((void*)0), 0x7fff,
10914 "time-domain beam number", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10915 },
10916
10917 /* 7.5.3.49 */
10918 { &hf_oran_dir_pattern,
10919 { "dirPattern", "oran_fh_cus.dirPattern",
10920 FT_BOOLEAN, 16,
10921 TFS(&symbol_direction_tfs)((0 ? (const struct true_false_string*)0 : ((&symbol_direction_tfs
))))
, 0x3fff,
10922 "symbol data direction (gNB Tx/Rx) pattern", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10923 },
10924 /* 7.5.3.50 */
10925 { &hf_oran_guard_pattern,
10926 { "guardPattern", "oran_fh_cus.guardPattern",
10927 FT_BOOLEAN, 16,
10928 TFS(&symbol_guard_tfs)((0 ? (const struct true_false_string*)0 : ((&symbol_guard_tfs
))))
, 0x3fff,
10929 "guard pattern bitmask", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10930 },
10931
10932 /* For convenient filtering */
10933 { &hf_oran_cplane,
10934 { "C-Plane", "oran_fh_cus.c-plane",
10935 FT_NONE, BASE_NONE,
10936 NULL((void*)0), 0x0,
10937 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10938 },
10939 { &hf_oran_uplane,
10940 { "U-Plane", "oran_fh_cus.u-plane",
10941 FT_NONE, BASE_NONE,
10942 NULL((void*)0), 0x0,
10943 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10944 },
10945 { &hf_oran_bf,
10946 { "BeamForming", "oran_fh_cus.bf",
10947 FT_NONE, BASE_NONE,
10948 NULL((void*)0), 0x0,
10949 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10950 },
10951 { &hf_oran_zero_prb,
10952 { "Zero PRB", "oran_fh_cus.zero-prb",
10953 FT_NONE, BASE_NONE,
10954 NULL((void*)0), 0x0,
10955 "All of the REs in this PRB are zero", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10956 },
10957 { &hf_oran_nonzero_prb,
10958 { "Non-Zero PRB", "oran_fh_cus.nonzero-prb",
10959 FT_NONE, BASE_NONE,
10960 NULL((void*)0), 0x0,
10961 "Not all of the REs in this PRB are zero", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10962 },
10963 /* TODO: rename, as now used in ext1 too, which doesn't really have bundles? */
10964 { &hf_oran_bundle_weights_all_zero,
10965 { "Bundle Weights all zero", "oran_fh_cus.zero-bundle",
10966 FT_NONE, BASE_NONE,
10967 NULL((void*)0), 0x0,
10968 "All of the weights in a bundle are zero", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10969 },
10970
10971
10972 /* 5.1.3.2.7 */
10973 { &hf_oran_ecpri_pcid,
10974 { "ecpriPcid", "oran_fh_cus.ecpriPcid",
10975 FT_NONE, BASE_NONE,
10976 NULL((void*)0), 0x0,
10977 "IQ data transfer message series identifier", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10978 },
10979 { &hf_oran_ecpri_rtcid,
10980 { "ecpriRtcid", "oran_fh_cus.ecpriRtcid",
10981 FT_NONE, BASE_NONE,
10982 NULL((void*)0), 0x0,
10983 "Real time control data identifier", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10984 },
10985 /* 5.1.3.2.8 */
10986 { &hf_oran_ecpri_seqid,
10987 { "ecpriSeqid", "oran_fh_cus.ecpriSeqid",
10988 FT_NONE, BASE_NONE,
10989 NULL((void*)0), 0x0,
10990 "message identifier", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10991 },
10992
10993 /* 7.7.23.2 */
10994 { &hf_oran_num_sym_prb_pattern,
10995 { "numSymPrbPattern", "oran_fh_cus.numSymPrbPattern",
10996 FT_UINT8, BASE_DEC,
10997 NULL((void*)0), 0xf0,
10998 "number of symbol and resource block patterns", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
10999 },
11000 /* 7.7.23.9 */
11001 { &hf_oran_prb_mode,
11002 { "prbMode", "oran_fh_cus.prbMode",
11003 FT_BOOLEAN, 8,
11004 TFS(&prb_mode_tfs)((0 ? (const struct true_false_string*)0 : ((&prb_mode_tfs
))))
, 0x01,
11005 "PRB Mode", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11006 },
11007 /* 7.7.23.4 */
11008 { &hf_oran_sym_prb_pattern,
11009 { "symPrbPattern", "oran_fh_cus.symPrbPattern",
11010 FT_STRING, BASE_NONE,
11011 NULL((void*)0), 0x0,
11012 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11013 },
11014 /* 7.7.23.3 */
11015 { &hf_oran_sym_mask,
11016 { "symMask", "oran_fh_cus.symMask",
11017 FT_UINT16, BASE_HEX,
11018 NULL((void*)0), 0x3fff,
11019 "symbol mask part of symPrbPattern", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11020 },
11021 /* 7.7.23.5 */
11022 {&hf_oran_num_mc_scale_offset,
11023 {"numMcScaleOffset", "oran_fh_cus.numMcScaleOffset",
11024 FT_UINT8, BASE_DEC,
11025 NULL((void*)0), 0xf0,
11026 "number of modulation compression scaling value per symPrbPattern",
11027 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11028 },
11029 /* 7.7.23.4 */
11030 { &hf_oran_prb_pattern,
11031 { "prbPattern", "oran_fh_cus.prbPattern",
11032 FT_UINT8, BASE_DEC,
11033 NULL((void*)0), 0x0f,
11034 "size of one PRB block of one SymPrbPattern", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11035 },
11036 /* 7.7.23.10 */
11037 { &hf_oran_prb_blk_offset,
11038 { "prbBlkOffset", "oran_fh_cus.prbBlkOffset",
11039 FT_UINT16, BASE_DEC,
11040 NULL((void*)0), 0x0ff0,
11041 "offset to start of PRB block", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11042 },
11043
11044 /* 7.7.23.11 */
11045 { &hf_oran_prb_blk_size,
11046 { "prbBlkSize", "oran_fh_cus.prbBlkSize",
11047 FT_UINT16, BASE_DEC,
11048 NULL((void*)0), 0x0ff0,
11049 "size of one PRB block of one SymPrbPattern", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11050 },
11051
11052 /* 7.7.3.2 */
11053 { &hf_oran_codebook_index,
11054 { "codebookIndex", "oran_fh_cus.codebookIndex",
11055 FT_UINT8, BASE_DEC,
11056 NULL((void*)0), 0x0,
11057 "precoder codebook used for transmission", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11058 },
11059 /* 7.7.3.3 */
11060 { &hf_oran_layerid,
11061 { "layerID", "oran_fh_cus.layerID",
11062 FT_UINT8, BASE_DEC,
11063 NULL((void*)0), 0xf0,
11064 "Layer ID for DL transmission", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11065 },
11066 /* 7.7.3.5 */
11067 { &hf_oran_numlayers,
11068 { "numLayers", "oran_fh_cus.numLayers",
11069 FT_UINT8, BASE_DEC,
11070 NULL((void*)0), 0x0f,
11071 "number of layers for DL transmission", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11072 },
11073 /* 7.7.3.4 */
11074 { &hf_oran_txscheme,
11075 { "txScheme", "oran_fh_cus.txScheme",
11076 FT_UINT8, BASE_DEC,
11077 NULL((void*)0), 0xf0,
11078 "transmission scheme", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11079 },
11080 /* 7.7.3.6 */
11081 { &hf_oran_crs_remask,
11082 { "crsReMask", "oran_fh_cus.crsReMask",
11083 FT_UINT16, BASE_HEX,
11084 NULL((void*)0), 0x0fff,
11085 "CRS resource element mask", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11086 },
11087 /* 7.7.3.8 */
11088 { &hf_oran_crs_shift,
11089 { "crsShift", "oran_fh_cus.crsShift",
11090 FT_UINT8, BASE_HEX,
11091 NULL((void*)0), 0x80,
11092 "CRS resource element mask", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11093 },
11094 /* 7.7.3.7 */
11095 { &hf_oran_crs_symnum,
11096 { "crsSymNum", "oran_fh_cus.crsSymNum",
11097 FT_UINT8, BASE_DEC,
11098 NULL((void*)0), 0x0f,
11099 "CRS symbol number indication", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11100 },
11101 /* 7.7.3.9 */
11102 { &hf_oran_beamid_ap1,
11103 { "beamIdAP1", "oran_fh_cus.beamIdAP1",
11104 FT_UINT16, BASE_DEC,
11105 NULL((void*)0), 0x7fff,
11106 "beam id to be used for antenna port 1", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11107 },
11108 /* 7.7.3.10 */
11109 { &hf_oran_beamid_ap2,
11110 { "beamIdAP2", "oran_fh_cus.beamIdAP2",
11111 FT_UINT16, BASE_DEC,
11112 NULL((void*)0), 0x7fff,
11113 "beam id to be used for antenna port 2", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11114 },
11115 /* 7.7.3.11 */
11116 { &hf_oran_beamid_ap3,
11117 { "beamIdAP3", "oran_fh_cus.beamIdAP3",
11118 FT_UINT16, BASE_DEC,
11119 NULL((void*)0), 0x7fff,
11120 "beam id to be used for antenna port 3", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11121 },
11122
11123 /* 7.7.10.3a */
11124 { &hf_oran_port_list_index,
11125 { "portListIndex", "oran_fh_cus.portListIndex",
11126 FT_UINT8, BASE_DEC,
11127 NULL((void*)0), 0x0,
11128 "the index of an eAxC_ID in the port-list", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11129 },
11130
11131 { &hf_oran_alpn_per_sym,
11132 { "alpnPerSym", "oran_fh_cus.alpnPerSym",
11133 FT_UINT8, BASE_HEX,
11134 VALS(alpn_per_sym_vals)((0 ? (const struct _value_string*)0 : ((alpn_per_sym_vals)))
)
, 0x80,
11135 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11136 },
11137 { &hf_oran_ant_dmrs_snr,
11138 { "antDmrsSnr", "oran_fh_cus.antDmrsSnr",
11139 FT_UINT8, BASE_HEX,
11140 VALS(ant_dmrs_snr_vals)((0 ? (const struct _value_string*)0 : ((ant_dmrs_snr_vals)))
)
, 0x40,
11141 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11142 },
11143
11144 /* 7.7.24.6 */
11145 { &hf_oran_user_group_size,
11146 { "userGroupSize", "oran_fh_cus.userGroupSize",
11147 FT_UINT8, BASE_DEC,
11148 NULL((void*)0), 0x1f,
11149 "number of UE data layers in the user group identified by userGroupId", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11150 },
11151 /* 7.7.24.7 */
11152 { &hf_oran_user_group_id,
11153 { "userGroupId", "oran_fh_cus.userGroupId",
11154 FT_UINT8, BASE_DEC,
11155 NULL((void*)0), 0x0,
11156 "indicates user group described by the section", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11157 },
11158 /* 7.7.24.8 */
11159 { &hf_oran_entry_type,
11160 { "entryType", "oran_fh_cus.entryType",
11161 FT_UINT8, BASE_DEC,
11162 VALS(entry_type_vals)((0 ? (const struct _value_string*)0 : ((entry_type_vals)))), 0xe0,
11163 "indicates format of the entry", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11164 },
11165 /* 7.7.24.9 */
11166 { &hf_oran_dmrs_port_number,
11167 { "dmrsPortNumber", "oran_fh_cus.dmrsPortNumber",
11168 FT_UINT8, BASE_DEC,
11169 NULL((void*)0), 0x1f,
11170 "DMRS antenna port number for the associated ueId", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11171 },
11172 /* 7.7.24.10 */
11173 { &hf_oran_ueid_reset,
11174 { "ueidReset", "oran_fh_cus.ueidReset",
11175 FT_BOOLEAN, 8,
11176 TFS(&tfs_ueid_reset)((0 ? (const struct true_false_string*)0 : ((&tfs_ueid_reset
))))
, 0x80,
11177 "same UEID as the previous slot", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11178 },
11179 /* 7.7.24.11 */
11180 { &hf_oran_dmrs_symbol_mask,
11181 { "dmrsSymbolMask", "oran_fh_cus.dmrsSymbolMask",
11182 FT_UINT16, BASE_HEX,
11183 NULL((void*)0), 0x3fff,
11184 "symbols within the slot containing DMRS", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11185 },
11186 { &hf_oran_dmrs_symbol_mask_s13,
11187 { "symbol 13", "oran_fh_cus.dmrsSymbolMask.symbol-13",
11188 FT_BOOLEAN, 16,
11189 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x2000,
11190 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11191 },
11192 { &hf_oran_dmrs_symbol_mask_s12,
11193 { "symbol 12", "oran_fh_cus.dmrsSymbolMask.symbol-12",
11194 FT_BOOLEAN, 16,
11195 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x1000,
11196 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11197 },
11198 { &hf_oran_dmrs_symbol_mask_s11,
11199 { "symbol 11", "oran_fh_cus.dmrsSymbolMask.symbol-11",
11200 FT_BOOLEAN, 16,
11201 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0800,
11202 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11203 },
11204 { &hf_oran_dmrs_symbol_mask_s10,
11205 { "symbol 10", "oran_fh_cus.dmrsSymbolMask.symbol-10",
11206 FT_BOOLEAN, 16,
11207 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0400,
11208 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11209 },
11210 { &hf_oran_dmrs_symbol_mask_s9,
11211 { "symbol 9", "oran_fh_cus.dmrsSymbolMask.symbol-9",
11212 FT_BOOLEAN, 16,
11213 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0200,
11214 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11215 },
11216 { &hf_oran_dmrs_symbol_mask_s8,
11217 { "symbol 8", "oran_fh_cus.dmrsSymbolMask.symbol-8",
11218 FT_BOOLEAN, 16,
11219 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0100,
11220 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11221 },
11222 { &hf_oran_dmrs_symbol_mask_s7,
11223 { "symbol 7", "oran_fh_cus.dmrsSymbolMask.symbol-7",
11224 FT_BOOLEAN, 16,
11225 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0080,
11226 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11227 },
11228 { &hf_oran_dmrs_symbol_mask_s6,
11229 { "symbol 6", "oran_fh_cus.dmrsSymbolMask.symbol-6",
11230 FT_BOOLEAN, 16,
11231 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0040,
11232 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11233 },
11234 { &hf_oran_dmrs_symbol_mask_s5,
11235 { "symbol 5", "oran_fh_cus.dmrsSymbolMask.symbol-5",
11236 FT_BOOLEAN, 16,
11237 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0020,
11238 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11239 },
11240 { &hf_oran_dmrs_symbol_mask_s4,
11241 { "symbol 4", "oran_fh_cus.dmrsSymbolMask.symbol-4",
11242 FT_BOOLEAN, 16,
11243 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0010,
11244 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11245 },
11246 { &hf_oran_dmrs_symbol_mask_s3,
11247 { "symbol 3", "oran_fh_cus.dmrsSymbolMask.symbol-3",
11248 FT_BOOLEAN, 16,
11249 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0008,
11250 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11251 },
11252 { &hf_oran_dmrs_symbol_mask_s2,
11253 { "symbol 2", "oran_fh_cus.dmrsSymbolMask.symbol-2",
11254 FT_BOOLEAN, 16,
11255 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0004,
11256 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11257 },
11258 { &hf_oran_dmrs_symbol_mask_s1,
11259 { "symbol 1", "oran_fh_cus.dmrsSymbolMask.symbol-1",
11260 FT_BOOLEAN, 16,
11261 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0002,
11262 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11263 },
11264 { &hf_oran_dmrs_symbol_mask_s0,
11265 { "symbol 0", "oran_fh_cus.dmrsSymbolMask.symbol-0",
11266 FT_BOOLEAN, 16,
11267 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0001,
11268 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11269 },
11270
11271 /* 7.7.24.12 */
11272 { &hf_oran_scrambling,
11273 { "scrambling", "oran_fh_cus.scrambling",
11274 FT_UINT16, BASE_HEX,
11275 NULL((void*)0), 0x0,
11276 "used to calculate the seed value required to initialize pseudo-random generator", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11277 },
11278 /* 7.7.24.13 */
11279 { &hf_oran_nscid,
11280 { "nscid", "oran_fh_cus.nscid",
11281 FT_UINT8, BASE_HEX,
11282 NULL((void*)0), 0x80,
11283 "used to calculate the seed value for pseudo-random generator", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11284 },
11285 /* 7.7.24.14 */
11286 { &hf_oran_dtype,
11287 { "dType", "oran_fh_cus.dType",
11288 FT_UINT8, BASE_HEX,
11289 VALS(dtype_vals)((0 ? (const struct _value_string*)0 : ((dtype_vals)))), 0x40,
11290 "PUSCH DMRS configuration type", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11291 },
11292 /* 7.7.24.15 */
11293 { &hf_oran_cmd_without_data,
11294 { "cmdWithoutData", "oran_fh_cus.cmdWithoutData",
11295 FT_UINT8, BASE_HEX,
11296 NULL((void*)0), 0x30,
11297 "number of DMRS CDM groups without data", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11298 },
11299 /* 7.7.24.16 */
11300 { &hf_oran_lambda,
11301 { "lambda", "oran_fh_cus.lambda",
11302 FT_UINT8, BASE_HEX,
11303 NULL((void*)0), 0x0c,
11304 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11305 },
11306 /* 7.7.24.19 */
11307 { &hf_oran_first_prb,
11308 { "firstPrb", "oran_fh_cus.firstPrb",
11309 FT_UINT16, BASE_DEC,
11310 NULL((void*)0), 0x03fe,
11311 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11312 },
11313 /* 7.7.24.20 */
11314 { &hf_oran_last_prb,
11315 { "lastPrb", "oran_fh_cus.lastPrb",
11316 FT_UINT16, BASE_DEC,
11317 NULL((void*)0), 0x01ff,
11318 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11319 },
11320
11321 /* 7.7.24.17 */
11322 /* TODO: add value_string */
11323 { &hf_oran_low_papr_type,
11324 { "lowPaprType", "oran_fh_cus.lowPaprType",
11325 FT_UINT8, BASE_HEX,
11326 VALS(papr_type_vals)((0 ? (const struct _value_string*)0 : ((papr_type_vals)))), 0x30,
11327 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11328 },
11329 /* 7.7.24.18 */
11330 { &hf_oran_hopping_mode,
11331 { "hoppingMode", "oran_fh_cus.hoppingMode",
11332 FT_UINT8, BASE_HEX,
11333 VALS(hopping_mode_vals)((0 ? (const struct _value_string*)0 : ((hopping_mode_vals)))
)
, 0x0c,
11334 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11335 },
11336
11337 { &hf_oran_tx_win_for_on_air_symbol_l,
11338 { "txWinForOnAirSymbol", "oran_fh_cus.txWinForOnAirSymbol",
11339 FT_UINT8, BASE_DEC,
11340 NULL((void*)0), 0xf0,
11341 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11342 },
11343 { &hf_oran_tx_win_for_on_air_symbol_r,
11344 { "txWinForOnAirSymbol", "oran_fh_cus.txWinForOnAirSymbol",
11345 FT_UINT8, BASE_DEC,
11346 NULL((void*)0), 0x0f,
11347 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11348 },
11349 /* 7.7.26.2 */
11350 { &hf_oran_num_fo_fb,
11351 { "numFoFb", "oran_fh_cus.numFoFb",
11352 FT_UINT8, BASE_DEC,
11353 NULL((void*)0), 0x7f,
11354 "number of frequency offset feedback", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11355 },
11356 /* 7.7.26.3 */
11357 { &hf_oran_freq_offset_fb,
11358 { "freqOffsetFb", "oran_fh_cus.freqOffsetFb",
11359 FT_UINT16, BASE_HEX_DEC | BASE_RANGE_STRING0x00000100,
11360 RVALS(freq_offset_fb_values)((0 ? (const struct _range_string*)0 : ((freq_offset_fb_values
))))
, 0x0,
11361 "UE frequency offset feedback", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11362 },
11363
11364 /* 7.7.28.2 */
11365 { &hf_oran_num_ue_sinr_rpt,
11366 { "numUeSinrRpt", "oran_fh_cus.numUeSinrRpt",
11367 FT_UINT8, BASE_DEC,
11368 NULL((void*)0), 0x1f,
11369 "number of sinr reported UEs {1 - 12}", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11370 },
11371
11372 /* 7.5.2.19 */
11373 { &hf_oran_num_sinr_per_prb,
11374 { "numSinrPerPrb", "oran_fh_cus.numSinrPerPrb",
11375 FT_UINT8, BASE_DEC,
11376 VALS(num_sinr_per_prb_vals)((0 ? (const struct _value_string*)0 : ((num_sinr_per_prb_vals
))))
, 0x70,
11377 "number of SINR values per PRB", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11378 },
11379 { &hf_oran_num_sinr_per_prb_right,
11380 { "numSinrPerPrb", "oran_fh_cus.numSinrPerPrb",
11381 FT_UINT8, BASE_DEC,
11382 VALS(num_sinr_per_prb_vals)((0 ? (const struct _value_string*)0 : ((num_sinr_per_prb_vals
))))
, 0x07,
11383 "number of SINR values per PRB", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11384 },
11385 { &hf_oran_num_sinr_per_prb_st9,
11386 { "numSinrPerPrb", "oran_fh_cus.numSinrPerPrb",
11387 FT_UINT8, BASE_DEC,
11388 VALS(num_sinr_per_prb_vals)((0 ? (const struct _value_string*)0 : ((num_sinr_per_prb_vals
))))
, 0xe0,
11389 "number of SINR values per PRB", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11390 },
11391
11392 /* 7.5.3.68 */
11393 { &hf_oran_sinr_value,
11394 { "sinrValue", "oran_fh_cus.sinrValue",
11395 FT_FLOAT, BASE_NONE,
11396 NULL((void*)0), 0x0,
11397 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11398 },
11399
11400 { &hf_oran_measurement_report,
11401 { "Measurement Report", "oran_fh_cus.measurement-report",
11402 FT_STRING, BASE_NONE,
11403 NULL((void*)0), 0x0,
11404 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11405 },
11406 /* 7.5.3.57 */
11407 { &hf_oran_mf,
11408 { "mf", "oran_fh_cus.mf",
11409 FT_BOOLEAN, 8,
11410 TFS(&measurement_flag_tfs)((0 ? (const struct true_false_string*)0 : ((&measurement_flag_tfs
))))
, 0x80,
11411 "measurement flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11412 },
11413 /* 7.5.3.59 */
11414 { &hf_oran_meas_data_size,
11415 { "measDataSize", "oran_fh_cus.measDataSize",
11416 FT_UINT16, BASE_DEC,
11417 NULL((void*)0), 0x0,
11418 "measurement data size (in words)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11419 },
11420
11421 /* 7.5.3.58 */
11422 { &hf_oran_meas_type_id,
11423 { "measTypeId", "oran_fh_cus.measTypeId",
11424 FT_UINT8, BASE_DEC,
11425 VALS(meas_type_id_vals)((0 ? (const struct _value_string*)0 : ((meas_type_id_vals)))
)
, 0x7F,
11426 "measurement report type identifier", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11427 },
11428 /* 7.5.3.66 */
11429 { &hf_oran_num_elements,
11430 { "numElements", "oran_fh_cus.numElements",
11431 FT_UINT8, BASE_DEC,
11432 NULL((void*)0), 0x0,
11433 "measurement report type identifier", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11434 },
11435 /* 7.5.3.60 */
11436 { &hf_oran_ue_tae,
11437 { "ueTae", "oran_fh_cus.ueTae",
11438 FT_UINT16, BASE_DEC | BASE_RANGE_STRING0x00000100,
11439 RVALS(freq_offset_fb_values)((0 ? (const struct _range_string*)0 : ((freq_offset_fb_values
))))
, 0x0,
11440 "UE Timing Advance Error", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11441 },
11442 /* 7.5.3.61 */
11443 { &hf_oran_ue_layer_power,
11444 { "ueLayerPower", "oran_fh_cus.ueLayerPower",
11445 FT_UINT16, BASE_DEC | BASE_RANGE_STRING0x00000100,
11446 RVALS(freq_offset_fb_values)((0 ? (const struct _range_string*)0 : ((freq_offset_fb_values
))))
, 0x0,
11447 "UE Layer Power", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11448 },
11449
11450 /* 7.5.3.62 */
11451 { &hf_oran_ue_freq_offset,
11452 { "ueFreqOffset", "oran_fh_cus.ueFreqOffset",
11453 FT_UINT16, BASE_DEC | BASE_RANGE_STRING0x00000100,
11454 RVALS(freq_offset_fb_values)((0 ? (const struct _range_string*)0 : ((freq_offset_fb_values
))))
, 0x0,
11455 "UE frequency offset", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11456 },
11457 /* 7.5.3.63 */
11458 { &hf_oran_ipn_power,
11459 { "ipnPower", "oran_fh_cus.ipnPower",
11460 FT_UINT16, BASE_DEC | BASE_RANGE_STRING0x00000100,
11461 RVALS(freq_offset_fb_values)((0 ? (const struct _range_string*)0 : ((freq_offset_fb_values
))))
, 0x0,
11462 "Interference plus Noise power", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11463 },
11464 /* 7.5.3.64 */
11465 { &hf_oran_ant_dmrs_snr_val,
11466 { "antDmrsSnrVal", "oran_fh_cus.antDmrsSnrVal",
11467 FT_UINT16, BASE_DEC | BASE_RANGE_STRING0x00000100,
11468 RVALS(freq_offset_fb_values)((0 ? (const struct _range_string*)0 : ((freq_offset_fb_values
))))
, 0x0,
11469 "antenna DMRS-SNR", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11470 },
11471
11472 { &hf_oran_measurement_command,
11473 { "Measurement Command", "oran_fh_cus.measurement-command",
11474 FT_STRING, BASE_NONE,
11475 NULL((void*)0), 0x0,
11476 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11477 },
11478
11479 /* 7.5.27.2 */
11480 { &hf_oran_beam_type,
11481 {"beamType", "oran_fh_cus.beamType",
11482 FT_UINT16, BASE_DEC,
11483 VALS(beam_type_vals)((0 ? (const struct _value_string*)0 : ((beam_type_vals)))), 0xc0,
11484 NULL((void*)0),
11485 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11486 },
11487 /* 7.5.3.65 */
11488 { &hf_oran_meas_cmd_size,
11489 {"measCmdSize", "oran_fh_cus.measCmdSize",
11490 FT_UINT16, BASE_DEC,
11491 NULL((void*)0), 0x0,
11492 "measurement command size in words",
11493 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11494 },
11495 /* 7.5.3.73 */
11496 { &hf_oran_curr_ue_freq_offset,
11497 { "currUeFreqOffset", "oran_fh_cus.currUeFreqOffset",
11498 FT_UINT16, BASE_DEC | BASE_RANGE_STRING0x00000100,
11499 RVALS(freq_offset_fb_values)((0 ? (const struct _range_string*)0 : ((freq_offset_fb_values
))))
, 0x0,
11500 "Estimated UE frequency offset in current slot (Hz)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11501 },
11502
11503 { &hf_oran_symbol_reordering_layer,
11504 { "Layer", "oran_fh_cus.layer",
11505 FT_STRING, BASE_NONE,
11506 NULL((void*)0), 0x0,
11507 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11508 },
11509 { &hf_oran_dmrs_entry,
11510 { "Entry", "oran_fh_cus.dmrs-entry",
11511 FT_STRING, BASE_NONE,
11512 NULL((void*)0), 0x0,
11513 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11514 },
11515
11516 /* 7.7.29.3 */
11517 { &hf_oran_cd_scg_size,
11518 {"cdScgSize", "oran_fh_cus.cdScgSize",
11519 FT_UINT8, BASE_DEC | BASE_RANGE_STRING0x00000100,
11520 RVALS(cd_scg_size_vals)((0 ? (const struct _range_string*)0 : ((cd_scg_size_vals)))), 0x0f,
11521 "Cyclic delay subcarrier group size",
11522 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11523 },
11524 /* 7.7.29.4 */
11525 { &hf_oran_cd_scg_phase_step,
11526 {"cdScgPhaseStep", "oran_fh_cus.cdScgPhaseStep",
11527 FT_INT8, BASE_DEC,
11528 NULL((void*)0), 0x0,
11529 "Cyclic delay subcarrier group phase step",
11530 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11531 },
11532
11533 { &hf_oran_sinr_prb,
11534 { "PRB", "oran_fh_cus.sinr.prb",
11535 FT_STRING, BASE_NONE,
11536 NULL((void*)0), 0x0,
11537 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11538 },
11539 /* 7.5.2.20 */
11540 { &hf_oran_oru_control_sinr_slot_mask_id,
11541 {"oruControlSinrSlotMaskId", "oran_fh_cus.oruControlSinrSlotMaskId",
11542 FT_UINT8, BASE_DEC,
11543 NULL((void*)0), 0x1f,
11544 "SINR time resolution",
11545 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11546 },
11547 /* 7.7.24.21 */
11548 { &hf_oran_pos_meas,
11549 {"posMeas", "oran_fh_cus.posMeas",
11550 FT_BOOLEAN, 8,
11551 TFS(&tfs_report_no_report_pos_meas)((0 ? (const struct true_false_string*)0 : ((&tfs_report_no_report_pos_meas
))))
, 0x40,
11552 "Positioning measurement report request",
11553 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11554 },
11555
11556 /* 7.5.3.69 */
11557 { &hf_oran_ue_radial_speed,
11558 {"ueRadialSpeed", "oran_fh_cus.ueRadialSpeed",
11559 FT_UINT16, BASE_DEC,
11560 NULL((void*)0), 0x0,
11561 "UE radial speed",
11562 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11563 },
11564 /* 7.5.3.70 */
11565 { &hf_oran_ue_az_aoa,
11566 {"ueAzAoa", "oran_fh_cus.ueAzAoa",
11567 FT_UINT16, BASE_DEC,
11568 NULL((void*)0), 0x0,
11569 "UE azimuth angle of arrival",
11570 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11571 },
11572 /* 7.5.3.71 */
11573 { &hf_oran_ue_ze_aoa,
11574 {"ueZeAoa", "oran_fh_cus.ueZeAoa",
11575 FT_UINT16, BASE_DEC,
11576 NULL((void*)0), 0x0,
11577 "UE zenith angle of arrival",
11578 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11579 },
11580 /* 7.5.3.72 */
11581 { &hf_oran_ue_pos_toa_offset,
11582 {"uePosToaOffset", "oran_fh_cus.uePosToaOffset",
11583 FT_UINT16, BASE_DEC,
11584 NULL((void*)0), 0x0,
11585 "UE positioning time of arrival offset",
11586 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11587 },
11588
11589 /* 7.7.30.2 */
11590 { &hf_oran_num_rep_ue,
11591 {"numRepUe", "oran_fh_cus.numRepUe",
11592 FT_UINT8, BASE_DEC,
11593 NULL((void*)0), 0x0f,
11594 "Number of UEs with PUSCH repetition",
11595 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11596 },
11597 /* 7.7.30.3 */
11598 { &hf_oran_rep_ueid,
11599 {"repUeId", "oran_fh_cus.repUeId",
11600 FT_UINT16, BASE_DEC,
11601 NULL((void*)0), 0x7fff,
11602 "UEId the PUSCH is part of",
11603 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11604 },
11605 /* 7.7.30.4 */
11606 { &hf_oran_is_last_rep,
11607 {"isLastRep", "oran_fh_cus.isLastRep",
11608 FT_BOOLEAN, 8,
11609 NULL((void*)0), 0x40,
11610 "Last transmission in the repetition",
11611 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11612 },
11613 /* 7.7.30.5 */
11614 { &hf_oran_rep_index,
11615 {"repIndex", "oran_fh_cus.repIndex",
11616 FT_UINT8, BASE_DEC,
11617 NULL((void*)0), 0x3f,
11618 "Repetition index of the PUSCH transmission",
11619 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11620 },
11621 /* 7.7.30.6 */
11622 { &hf_oran_num_reps,
11623 {"numReps", "oran_fh_cus.numReps",
11624 FT_UINT8, BASE_DEC,
11625 NULL((void*)0), 0x3f,
11626 "The number of total PUSCH repetitions",
11627 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11628 },
11629
11630 /* 7.7.31.2 */
11631 { &hf_oran_mcs_table,
11632 {"mcsTable", "oran_fh_cus.mcsTable",
11633 FT_UINT8, BASE_DEC,
11634 VALS(mcs_table_vals)((0 ? (const struct _value_string*)0 : ((mcs_table_vals)))), 0x0f,
11635 "MCS index table",
11636 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11637 },
11638 /* 7.7.31.3 */
11639 { &hf_oran_mcs_index,
11640 {"mcsIndex", "oran_fh_cus.mcsIndex",
11641 FT_UINT8, BASE_DEC,
11642 NULL((void*)0), 0x3f,
11643 "MCS index value",
11644 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11645 },
11646
11647 /* 7.7.33.3 */
11648 { &hf_oran_num_meas_req,
11649 {"numMeasReq", "oran_fh_cus.numMeasReq",
11650 FT_UINT8, BASE_DEC,
11651 NULL((void*)0), 0x1f,
11652 "Number of UEs for which meas is requested",
11653 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11654 },
11655 /* 7.7.32.5 */
11656 { &hf_oran_ue_rank,
11657 {"ueRank", "oran_fh_cus.ueRank",
11658 FT_UINT8, BASE_DEC,
11659 VALS(ue_rank_vals)((0 ? (const struct _value_string*)0 : ((ue_rank_vals)))), 0x0f,
11660 "Number of UE layers under evaluation",
11661 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11662 },
11663 /* 7.7.32.6 */
11664 { &hf_oran_num_of_ue_ant_ports,
11665 {"numOfUeAntPorts", "oran_fh_cus.numofUeAntPorts",
11666 FT_UINT8, BASE_DEC,
11667 VALS(num_of_ue_ant_ports_vals)((0 ? (const struct _value_string*)0 : ((num_of_ue_ant_ports_vals
))))
, 0xf0,
11668 "Used for the PUSCH tx under evaluation",
11669 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11670 },
11671 /* 7.7.32.8 */
11672 { &hf_oran_codebook_subset,
11673 {"codebookSubset", "oran_fh_cus.codebookSubset",
11674 FT_UINT8, BASE_DEC,
11675 VALS(codebook_subset_vals)((0 ? (const struct _value_string*)0 : ((codebook_subset_vals
))))
, 0xc0,
11676 "UE capability wrt ULTPMI sets",
11677 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11678 },
11679 /* 7.7.32.9 */
11680 { &hf_oran_full_pwr_mode,
11681 {"fullPwrMode", "oran_fh_cus.fullPwrMode",
11682 FT_UINT8, BASE_DEC,
11683 VALS(full_pwr_mode_vals)((0 ? (const struct _value_string*)0 : ((full_pwr_mode_vals))
))
, 0xc0,
11684 "Transmission mode",
11685 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11686 },
11687 /* 7.7.32.10 */
11688 { &hf_oran_full_pwr_mode_2_tpmi_group,
11689 {"fullPwrMode2TpmiGroup", "oran_fh_cus.fullPwrMode2TpmiGroup",
11690 FT_UINT16, BASE_HEX,
11691 NULL((void*)0), 0x3fff,
11692 "Capabilities",
11693 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11694 },
11695
11696 /* 7.5.3.75 */
11697 { &hf_oran_num_cand_ranks,
11698 {"numCandRanks", "oran_fh_cus.numCandRanks",
11699 FT_UINT8, BASE_DEC,
11700 NULL((void*)0), 0xf0,
11701 NULL((void*)0),
11702 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11703 },
11704 /* 7.5.3.76 */
11705 { &hf_oran_ue_pref_rank,
11706 {"uePrefRank", "oran_fh_cus.uePrefRank",
11707 FT_UINT8, BASE_DEC,
11708 NULL((void*)0), 0x0f,
11709 "Most optimal UL Tx rank for UE",
11710 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11711 },
11712 /* 7.5.3.77 */
11713 { &hf_oran_ue_tpmi_rank_y,
11714 {"ueTpmiRankY", "oran_fh_cus.ueTpmiRankY",
11715 FT_UINT8, BASE_DEC,
11716 NULL((void*)0), 0x0,
11717 "TPMI index for codebook-based PUSCH tx",
11718 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11719 },
11720 /* 7.5.3.78 */
11721 { &hf_oran_ue_tpmi_rank_y_sinr_lx,
11722 {"ueTpmiRankYSinrLX", "oran_fh_cus.ueTpmiRankYSinrLX",
11723 FT_UINT16, BASE_HEX | BASE_RANGE_STRING0x00000100,
11724 RVALS(ue_tmpi_rank_sinr_vals)((0 ? (const struct _range_string*)0 : ((ue_tmpi_rank_sinr_vals
))))
, 0x0,
11725 "Estimation of post-equalization SINR",
11726 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11727 },
11728 /* 7.5.3.79 */
11729 { &hf_oran_ue_layer_pre_eq_sinr,
11730 {"ueLayerPreEqSinr", "oran_fh_cus.ueLayerPreEqSinr",
11731 FT_UINT16, BASE_HEX,
11732 NULL((void*)0), 0x0,
11733 "Pre-equalization SINR of a UE layer",
11734 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11735 },
11736
11737 /* 7.7.33.3 */
11738 { &hf_oran_chan_type_sel,
11739 { "chanTypeSel", "oran_fh_cus.chanTypeSel",
11740 FT_UINT8, BASE_DEC,
11741 VALS(chan_type_sel_vals)((0 ? (const struct _value_string*)0 : ((chan_type_sel_vals))
))
, 0x03,
11742 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11743 },
11744
11745 /* 7.7.3.117 */
11746 { &hf_oran_srs_meas_port_mask,
11747 { "srsMeasPortMask", "oran_fh_cus.srsMeasPortMask",
11748 FT_UINT16, BASE_DEC,
11749 NULL((void*)0), 0xffff,
11750 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11751 },
11752 /* 7.7.3.106 */
11753 { &hf_oran_srs_ue_port_wb_power,
11754 { "srsUePortWbPower", "oran_fh_cus.srsUePortWbPower",
11755 FT_UINT16, BASE_DEC,
11756 NULL((void*)0), 0x0,
11757 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11758 },
11759 /* 7.7.3.107 */
11760 { &hf_oran_srs_ue_port_wb_sinr,
11761 { "srsUePortWbSinr", "oran_fh_cus.srsUePortWbSinr",
11762 FT_UINT16, BASE_DEC,
11763 NULL((void*)0), 0x0,
11764 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11765 },
11766
11767 { &hf_oran_c_section_common,
11768 { "Common Section", "oran_fh_cus.c-plane.section.common",
11769 FT_STRING, BASE_NONE,
11770 NULL((void*)0), 0x0,
11771 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11772 },
11773 { &hf_oran_c_section,
11774 { "Section", "oran_fh_cus.c-plane.section",
11775 FT_STRING, BASE_NONE,
11776 NULL((void*)0), 0x0,
11777 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11778 },
11779 { &hf_oran_u_section,
11780 { "Section", "oran_fh_cus.u-plane.section",
11781 FT_STRING, BASE_NONE,
11782 NULL((void*)0), 0x0,
11783 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11784 },
11785
11786 { &hf_oran_u_total_power,
11787 { "Mean Power", "oran_fh_cus.power",
11788 FT_FLOAT, BASE_NONE|BASE_UNIT_STRING0x00001000,
11789 UNS(&units_decibelfs)((0 ? (const struct unit_name_string*)0 : ((&units_decibelfs
))))
, 0x0,
11790 "Average power of whole section (dBFS)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11791 },
11792
11793 { &hf_oran_u_peak_power,
11794 { "PAPR", "oran_fh_cus.papr",
11795 FT_FLOAT, BASE_NONE|BASE_UNIT_STRING0x00001000,
11796 UNS(&units_decibels)((0 ? (const struct unit_name_string*)0 : ((&units_decibels
))))
, 0x0,
11797 "Peak-to-average power ratio (dB)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11798 },
11799
11800 { &hf_oran_u_prb_power,
11801 { "PRB Mean Power", "oran_fh_cus.prbpower",
11802 FT_FLOAT, BASE_NONE|BASE_UNIT_STRING0x00001000,
11803 UNS(&units_decibelfs)((0 ? (const struct unit_name_string*)0 : ((&units_decibelfs
))))
, 0x0,
11804 "Average power of PRB (dBFS)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11805 },
11806
11807 /* Link back to UL C-plane where udCompHdr was recorded */
11808 { &hf_oran_ul_cplane_ud_comp_hdr_frame,
11809 { "C-Plane UL udCompHdr frame", "oran_fh_cus.ul-cplane.udCompHdr",
11810 FT_FRAMENUM, BASE_NONE,
11811 FRAMENUM_TYPE(FT_FRAMENUM_REQUEST)((gpointer) (glong) (FT_FRAMENUM_REQUEST)), 0x0,
11812 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11813 },
11814 { &hf_oran_delta_to_expected_ul_symbol_time,
11815 { "Delta to expected UL symbol time", "oran_fh_cus.delta-expected-ul-symbol-time",
11816 FT_INT32, BASE_DEC,
11817 NULL((void*)0), 0x0,
11818 "usec difference vs time predicted by first symbol timing and configurable duration", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11819 },
11820 { &hf_oran_delta_to_expected_dl_symbol_time,
11821 { "Delta to expected DL symbol time", "oran_fh_cus.delta-expected-dl-symbol-time",
11822 FT_INT32, BASE_DEC,
11823 NULL((void*)0), 0x0,
11824 "Difference vs time predicted by first symbol timing and configurable duration", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11825 },
11826
11827 /* For ext11, where was a beamId (last) defined? */
11828 { &hf_oran_bfws_frame_defined,
11829 { "Beam defined in frame", "oran_fh_cus.bfw-defined",
11830 FT_FRAMENUM, BASE_NONE,
11831 FRAMENUM_TYPE(FT_FRAMENUM_RETRANS_PREV)((gpointer) (glong) (FT_FRAMENUM_RETRANS_PREV)), 0x0,
11832 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11833 },
11834 { &hf_oran_bfws_symbols_since_defined,
11835 { "Symbols since BFWs defined", "oran_fh_cus.symbols-since-bfw-defined",
11836 FT_UINT32, BASE_DEC,
11837 NULL((void*)0), 0x0,
11838 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11839 },
11840
11841 /* Corresponding C-plane frame for DL U-plane */
11842 { &hf_oran_corresponding_cplane_frame,
11843 { "C-plane frame", "oran_fh_cus.cplane-frame",
11844 FT_FRAMENUM, BASE_NONE,
11845 FRAMENUM_TYPE(FT_FRAMENUM_REQUEST)((gpointer) (glong) (FT_FRAMENUM_REQUEST)), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11846 },
11847 /* Time since corresponding C-plane frame for U-plane */
11848 { &hf_oran_corresponding_cplane_frame_time_delta,
11849 { "Time since C-plane frame", "oran_fh_cus.cplane-frame-time-delta",
11850 FT_UINT64, BASE_DEC, NULL((void*)0), 0x0,
11851 "Microseconds since C-plane frame", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11852 },
11853 /* Corresponding U-plane frame for C-plane */
11854 { &hf_oran_corresponding_uplane_frame,
11855 { "U-plane frame", "oran_fh_cus.uplane-frame",
11856 FT_FRAMENUM, BASE_NONE,
11857 FRAMENUM_TYPE(FT_FRAMENUM_RESPONSE)((gpointer) (glong) (FT_FRAMENUM_RESPONSE)), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11858 },
11859 { &hf_oran_corresponding_uplane_frames_total,
11860 { "U-plane frames total", "oran_fh_cus.u-plane-frames-total",
11861 FT_UINT32, BASE_DEC, NULL((void*)0), 0x0,
11862 "Number of corresponding U-plane frames", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
11863 },
11864
11865 /* Reassembly */
11866 { &hf_oran_fragment,
11867 { "Fragment", "oran_fh_cus.fragment", FT_FRAMENUM, BASE_NONE,
11868 NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
11869 { &hf_oran_fragments,
11870 { "Fragments", "oran_fh_cus.fragments", FT_BYTES, BASE_NONE,
11871 NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
11872 { &hf_oran_fragment_overlap,
11873 { "Fragment overlap", "oran_fh_cus.fragment.overlap", FT_BOOLEAN, BASE_NONE,
11874 NULL((void*)0), 0x0, "Fragment overlaps with other fragments", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
11875 { &hf_oran_fragment_overlap_conflict,
11876 { "Conflicting data in fragment overlap", "oran_fh_cus.fragment.overlap.conflict",
11877 FT_BOOLEAN, BASE_NONE, NULL((void*)0), 0x0,
11878 "Overlapping fragments contained conflicting data", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
11879 { &hf_oran_fragment_multiple_tails,
11880 { "Multiple tail fragments found", "oran_fh_cus.fragment.multipletails",
11881 FT_BOOLEAN, BASE_NONE, NULL((void*)0), 0x0,
11882 "Several tails were found when defragmenting the packet", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
11883 { &hf_oran_fragment_too_long_fragment,
11884 { "Fragment too long", "oran_fh_cus.fragment.toolongfragment",
11885 FT_BOOLEAN, BASE_NONE, NULL((void*)0), 0x0,
11886 "Fragment contained data past end of packet", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
11887 { &hf_oran_fragment_error,
11888 { "Defragmentation error", "oran_fh_cus.fragment.error", FT_FRAMENUM, BASE_NONE,
11889 NULL((void*)0), 0x0, "Defragmentation error due to illegal fragments", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
11890 { &hf_oran_fragment_count,
11891 { "Fragment count", "oran_fh_cus.fragment.count", FT_UINT32, BASE_DEC,
11892 NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
11893 { &hf_oran_reassembled_in,
11894 { "Reassembled payload in frame", "oran_fh_cus.reassembled_in", FT_FRAMENUM, BASE_NONE,
11895 NULL((void*)0), 0x0, "This payload packet is reassembled in this frame", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
11896 { &hf_oran_reassembled_length,
11897 { "Reassembled payload length", "oran_fh_cus.reassembled.length", FT_UINT32, BASE_DEC,
11898 NULL((void*)0), 0x0, "The total length of the reassembled payload", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
11899 { &hf_oran_reassembled_data,
11900 { "Reassembled data", "oran_fh_cus.reassembled.data", FT_BYTES, BASE_NONE,
11901 NULL((void*)0), 0x0, "The reassembled payload", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
11902
11903 { &hf_oran_payload,
11904 { "Payload", "oran_fh_cus.payload", FT_BYTES, BASE_SHOW_ASCII_PRINTABLE0x00010000,
11905 NULL((void*)0), 0x0, "Complete or reassembled payload", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
11906 };
11907
11908 /* Setup protocol subtree array */
11909 static int *ett[] = {
11910 &ett_oran,
11911 &ett_oran_ecpri_pcid,
11912 &ett_oran_ecpri_rtcid,
11913 &ett_oran_ecpri_seqid,
11914 &ett_oran_section_type,
11915 &ett_oran_u_timing,
11916 &ett_oran_u_section,
11917 &ett_oran_u_prb,
11918 &ett_oran_section,
11919 &ett_oran_iq,
11920 &ett_oran_bfw_bundle,
11921 &ett_oran_bfw,
11922 &ett_oran_frequency_range,
11923 &ett_oran_prb_cisamples,
11924 &ett_oran_cisample,
11925 &ett_oran_udcomphdr,
11926 &ett_oran_udcompparam,
11927 &ett_oran_cicomphdr,
11928 &ett_oran_cicompparam,
11929 &ett_oran_bfwcomphdr,
11930 &ett_oran_bfwcompparam,
11931 &ett_oran_ext19_port,
11932 &ett_oran_prb_allocation,
11933 &ett_oran_punc_pattern,
11934 &ett_oran_bfacomphdr,
11935 &ett_oran_modcomp_param_set,
11936 &ett_oran_st4_cmd_header,
11937 &ett_oran_st4_cmd,
11938 &ett_oran_sym_prb_pattern,
11939 &ett_oran_measurement_report,
11940 &ett_oran_measurement_command,
11941 &ett_oran_sresmask,
11942 &ett_oran_c_section_common,
11943 &ett_oran_c_section,
11944 &ett_oran_remask,
11945 &ett_oran_mc_scale_remask,
11946 &ett_oran_symbol_reordering_layer,
11947 &ett_oran_dmrs_entry,
11948 &ett_oran_dmrs_symbol_mask,
11949 &ett_oran_symbol_mask,
11950 &ett_oran_active_beamspace_coefficient_mask,
11951 &ett_oran_sinr_prb,
11952 &ett_oran_rbgMask,
11953 &ett_oran_se10_port,
11954
11955 &ett_oran_fragment,
11956 &ett_oran_fragments
11957 };
11958
11959 /* Separate subtree array for extensions. Used with [ext-1] */
11960 static int *ext_ett[HIGHEST_EXTTYPE35];
11961 for (unsigned extno=0; extno<HIGHEST_EXTTYPE35; extno++) {
11962 ext_ett[extno] = &ett_oran_c_section_extension[extno];
11963 }
11964
11965 expert_module_t* expert_oran;
11966
11967 static ei_register_info ei[] = {
11968 { &ei_oran_unsupported_bfw_compression_method, { "oran_fh_cus.unsupported_bfw_compression_method", PI_UNDECODED0x05000000, PI_WARN0x00600000, "Unsupported BFW Compression Method", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11969 { &ei_oran_invalid_sample_bit_width, { "oran_fh_cus.invalid_sample_bit_width", PI_UNDECODED0x05000000, PI_ERROR0x00800000, "Unsupported sample bit width", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11970 { &ei_oran_reserved_numBundPrb, { "oran_fh_cus.reserved_numBundPrb", PI_MALFORMED0x07000000, PI_ERROR0x00800000, "Reserved value 0 for numBundPrb seen - not valid", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11971 { &ei_oran_extlen_wrong, { "oran_fh_cus.extlen_wrong", PI_MALFORMED0x07000000, PI_ERROR0x00800000, "extlen doesn't match number of dissected bytes", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11972 { &ei_oran_invalid_eaxc_bit_width, { "oran_fh_cus.invalid_eaxc_bit_width", PI_UNDECODED0x05000000, PI_ERROR0x00800000, "Inconsistent eAxC bit width", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11973 { &ei_oran_extlen_zero, { "oran_fh_cus.extlen_zero", PI_MALFORMED0x07000000, PI_ERROR0x00800000, "extlen value of 0 is reserved", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11974 { &ei_oran_rbg_size_reserved, { "oran_fh_cus.rbg_size_reserved", PI_MALFORMED0x07000000, PI_ERROR0x00800000, "rbgSize value of 0 is reserved", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11975 { &ei_oran_frame_length, { "oran_fh_cus.frame_length", PI_MALFORMED0x07000000, PI_ERROR0x00800000, "there should be 0-3 bytes remaining after PDU in frame", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11976 { &ei_oran_numprbc_ext21_zero, { "oran_fh_cus.numprbc_ext21_zero", PI_MALFORMED0x07000000, PI_ERROR0x00800000, "numPrbc shall not be set to 0 when ciPrbGroupSize is configured", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11977 { &ei_oran_ci_prb_group_size_reserved, { "oran_fh_cus.ci_prb_group_size_reserved", PI_MALFORMED0x07000000, PI_WARN0x00600000, "ciPrbGroupSize should be 2-254", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11978 { &ei_oran_st8_nackid, { "oran_fh_cus.st8_nackid", PI_SEQUENCE0x02000000, PI_WARN0x00600000, "operation for this ackId failed", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11979 { &ei_oran_st4_no_cmds, { "oran_fh_cus.st4_nackid", PI_MALFORMED0x07000000, PI_ERROR0x00800000, "Not valid for ST4 to carry no commands", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11980 { &ei_oran_st4_zero_len_cmd, { "oran_fh_cus.st4_zero_len_cmd", PI_MALFORMED0x07000000, PI_WARN0x00600000, "ST4 cmd with length 0 is reserved", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11981 { &ei_oran_st4_wrong_len_cmd, { "oran_fh_cus.st4_wrong_len_cmd", PI_MALFORMED0x07000000, PI_ERROR0x00800000, "ST4 cmd with length not matching contents", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11982 { &ei_oran_st4_unknown_cmd, { "oran_fh_cus.st4_unknown_cmd", PI_MALFORMED0x07000000, PI_ERROR0x00800000, "ST4 cmd with unknown command code", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11983 { &ei_oran_mcot_out_of_range, { "oran_fh_cus.mcot_out_of_range", PI_MALFORMED0x07000000, PI_ERROR0x00800000, "MCOT should be 1-10", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11984 { &ei_oran_se10_unknown_beamgrouptype, { "oran_fh_cus.se10_unknown_beamgrouptype", PI_MALFORMED0x07000000, PI_WARN0x00600000, "SE10 - unknown BeamGroupType value", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11985 { &ei_oran_se10_not_allowed, { "oran_fh_cus.se10_not_allowed", PI_MALFORMED0x07000000, PI_WARN0x00600000, "SE10 - type not allowed for sectionType", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11986 { &ei_oran_start_symbol_id_not_zero, { "oran_fh_cus.startsymbolid_shall_be_zero", PI_MALFORMED0x07000000, PI_WARN0x00600000, "For ST4 commands 3&4, startSymbolId shall be 0", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11987 { &ei_oran_trx_control_cmd_scope, { "oran_fh_cus.trx_command.bad_cmdscope", PI_MALFORMED0x07000000, PI_WARN0x00600000, "TRX command must have cmdScope of ARRAY-COMMAND", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11988 { &ei_oran_unhandled_se, { "oran_fh_cus.se_not_handled", PI_UNDECODED0x05000000, PI_WARN0x00600000, "SE not recognised/handled by dissector", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11989 { &ei_oran_bad_symbolmask, { "oran_fh_cus.bad_symbol_mask", PI_MALFORMED0x07000000, PI_WARN0x00600000, "For non-zero sleepMode, symbolMask must be 0x0 or 0x3ffff", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11990 { &ei_oran_numslots_not_zero, { "oran_fh_cus.numslots_not_zero", PI_MALFORMED0x07000000, PI_WARN0x00600000, "For ST4 TIME_DOMAIN_BEAM_WEIGHTS, numSlots should be 0", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11991 { &ei_oran_version_unsupported, { "oran_fh_cus.version_unsupported", PI_UNDECODED0x05000000, PI_WARN0x00600000, "Protocol version unsupported", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11992 { &ei_oran_laa_msg_type_unsupported, { "oran_fh_cus.laa_msg_type_unsupported", PI_UNDECODED0x05000000, PI_WARN0x00600000, "laaMsgType unsupported", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11993 { &ei_oran_se_on_unsupported_st, { "oran_fh_cus.se_on_unsupported_st", PI_MALFORMED0x07000000, PI_WARN0x00600000, "Section Extension should not appear on this Section Type", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11994 { &ei_oran_cplane_unexpected_sequence_number_ul, { "oran_fh_cus.unexpected_seq_no_cplane.ul", PI_SEQUENCE0x02000000, PI_WARN0x00600000, "Unexpected sequence number seen in C-Plane UL", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11995 { &ei_oran_cplane_unexpected_sequence_number_dl, { "oran_fh_cus.unexpected_seq_no_cplane.dl", PI_SEQUENCE0x02000000, PI_WARN0x00600000, "Unexpected sequence number seen in C-Plane DL", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11996 { &ei_oran_uplane_unexpected_sequence_number_ul, { "oran_fh_cus.unexpected_seq_no_uplane.ul", PI_SEQUENCE0x02000000, PI_WARN0x00600000, "Unexpected sequence number seen in U-Plane UL", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11997 { &ei_oran_uplane_unexpected_sequence_number_dl, { "oran_fh_cus.unexpected_seq_no_uplane.dl", PI_SEQUENCE0x02000000, PI_WARN0x00600000, "Unexpected sequence number seen in U-Plane DL", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11998 { &ei_oran_acknack_no_request, { "oran_fh_cus.acknack_no_request", PI_SEQUENCE0x02000000, PI_WARN0x00600000, "Have ackNackId response, but no request", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11999 { &ei_oran_udcomphdr_should_be_zero, { "oran_fh_cus.udcomphdr_should_be_zero", PI_MALFORMED0x07000000, PI_WARN0x00600000, "C-Plane udCompHdr in DL should be set to 0", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12000 { &ei_oran_radio_fragmentation_c_plane, { "oran_fh_cus.radio_fragmentation_c_plane", PI_MALFORMED0x07000000, PI_ERROR0x00800000, "Radio fragmentation not allowed in C-PLane", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12001 { &ei_oran_lastRbdid_out_of_range, { "oran_fh_cus.lastrbdid_out_of_range", PI_MALFORMED0x07000000, PI_WARN0x00600000, "SE 6 has bad rbgSize", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12002 { &ei_oran_rbgMask_beyond_last_rbdid, { "oran_fh_cus.rbgmask_beyond_lastrbdid", PI_MALFORMED0x07000000, PI_WARN0x00600000, "rbgMask has bits set beyond lastRbgId", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12003 { &ei_oran_unexpected_measTypeId, { "oran_fh_cus.unexpected_meastypeid", PI_MALFORMED0x07000000, PI_WARN0x00600000, "unexpected measTypeId", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12004 { &ei_oran_unsupported_compression_method, { "oran_fh_cus.compression_type_unsupported", PI_UNDECODED0x05000000, PI_WARN0x00600000, "Unsupported compression type", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12005 { &ei_oran_ud_comp_len_wrong_size, { "oran_fh_cus.ud_comp_len_wrong_size", PI_MALFORMED0x07000000, PI_WARN0x00600000, "udCompLen does not match length of U-Plane section", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12006 { &ei_oran_sresmask2_not_zero_with_rb, { "oran_fh_cus.sresmask2_not_zero", PI_MALFORMED0x07000000, PI_WARN0x00600000, "sReSMask2 should be zero when rb set", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12007 { &ei_oran_st6_rb_shall_be_0, { "oran_fh_cus.st6_rb_set", PI_MALFORMED0x07000000, PI_WARN0x00600000, "rb should not be set for Section Type 6", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12008 { &ei_oran_st9_not_ul, { "oran_fh_cus.st9_not_ul", PI_MALFORMED0x07000000, PI_WARN0x00600000, "Section Type 9 should only be sent in uplink direction", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12009 { &ei_oran_st10_numsymbol_not_14, { "oran_fh_cus.st10_numsymbol_not_14", PI_MALFORMED0x07000000, PI_WARN0x00600000, "numSymbol should be 14 for Section Type 10", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12010 { &ei_oran_st10_startsymbolid_not_0, { "oran_fh_cus.st10_startsymbolid_not_0", PI_MALFORMED0x07000000, PI_WARN0x00600000, "startSymbolId should be 0 for Section Type 10", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12011 { &ei_oran_st10_not_ul, { "oran_fh_cus.st10_not_ul", PI_MALFORMED0x07000000, PI_WARN0x00600000, "Section Type 10 should only be sent in uplink direction", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12012 { &ei_oran_se24_nothing_to_inherit, { "oran_fh_cus.se24_nothing_to_inherit", PI_MALFORMED0x07000000, PI_WARN0x00600000, "SE10 doesn't have type 2 or 3 before trying to inherit", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12013 { &ei_oran_num_sinr_per_prb_unknown, { "oran_fh_cus.unexpected_num_sinr_per_prb", PI_MALFORMED0x07000000, PI_WARN0x00600000, "invalid numSinrPerPrb value", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12014 { &ei_oran_start_symbol_id_bits_ignored, { "oran_fh_cus.start_symbol_id_bits_ignored", PI_MALFORMED0x07000000, PI_WARN0x00600000, "some startSymbolId lower bits ignored", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12015 { &ei_oran_user_group_id_reserved_value, { "oran_fh_cus.user_group_id.reserved_value", PI_MALFORMED0x07000000, PI_WARN0x00600000, "userGroupId value 255 is reserved", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12016 { &ei_oran_port_list_index_zero, { "oran_fh_cus.port_list_index.zero", PI_MALFORMED0x07000000, PI_WARN0x00600000, "portListIndex should not be zero", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12017 { &ei_oran_ul_uplane_symbol_too_long, { "oran_fh_cus.ul_uplane_symbol_tx_too_slow", PI_RECEIVE0x0f000000, PI_WARN0x00600000, "UL U-Plane Tx took too long for symbol (limit set in preference)", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12018 { &ei_oran_reserved_not_zero, { "oran_fh_cus.reserved_not_zero", PI_MALFORMED0x07000000, PI_WARN0x00600000, "Reserved field is not zero", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12019 { &ei_oran_too_many_symbols, { "oran_fh_cus.too_many_symbols", PI_MALFORMED0x07000000, PI_ERROR0x00800000, "Range of symbols in slot exceeds 14", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12020 { &ei_oran_se30_not_ul, { "oran_fh_cus.se30_not_ul", PI_MALFORMED0x07000000, PI_WARN0x00600000, "SE30 should only be sent in uplink direction", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12021 { &ei_oran_se30_unknown_ueid, { "oran_fh_cus.se30_unknown_ue", PI_MALFORMED0x07000000, PI_WARN0x00600000, "SE30 UEId not recognised from SE10", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12022 { &ei_oran_beamid_bfws_not_found, { "oran_fh_cus.beamid_bfws_not_found", PI_SEQUENCE0x02000000, PI_WARN0x00600000, "Have bundle with disableBFWs but no definition found", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12023 { &ei_oran_syminc_set_for_uplane, { "oran_fh_cus.syminc_set_for_uplane", PI_MALFORMED0x07000000, PI_ERROR0x00800000, "symInc is prohibited in the U-Plane", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12024 { &ei_oran_cplane_entry_not_found, { "oran_fh_cus.cplane_entry_not_found", PI_SEQUENCE0x02000000, PI_WARN0x00600000, "C-plane for this U-plane section not found", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12025 { &ei_oran_se12_rb_set, { "oran_fh_cus.se12_rb_set", PI_MALFORMED0x07000000, PI_WARN0x00600000, "rb should not be set when SE12 is present", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12026 { &ei_oran_se5_re_mask_bits_not_covered, { "oran_fh_cus.se5_re_mask_bits_not_covered", PI_MALFORMED0x07000000, PI_WARN0x00600000, "section reMask bits not covered by SE5 sets", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12027 { &ei_oran_se5_re_mask_bit_repeated, { "oran_fh_cus.se5_re_mask_bits_repeated", PI_MALFORMED0x07000000, PI_WARN0x00600000, "SE5 sets repeat bits", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12028 { &ei_oran_se5_re_mask_bit_not_in_re_mask, { "oran_fh_cus.se5_re_mask_bitnot_in_re_mask", PI_MALFORMED0x07000000, PI_WARN0x00600000, "SE5 set has bit not in section reMask", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
12029 { &ei_oran_se5_re_zero_re_mask, { "oran_fh_cus.se5_re_mask_zero", PI_MALFORMED0x07000000, PI_WARN0x00600000, "SE5 set has zero reMask", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}}
12030 };
12031
12032
12033 /* Register the protocol name and description */
12034 proto_oran = proto_register_protocol("O-RAN Fronthaul CUS", "O-RAN FH CUS", "oran_fh_cus");
12035
12036 /* Allow dissector to find be found by name. */
12037 register_dissector("oran_fh_cus", dissect_oran, proto_oran);
12038
12039 /* Dissector table so dissectors for non-standard Section Extension can register by exttype */
12040 oran_sectionextension_table = register_dissector_table("oran.sectionextension",
12041 "O-RAN non-standard Section Extension (by exttype)",
12042 proto_oran, FT_UINT8, BASE_DEC);
12043
12044 /* Register the tap name. */
12045 oran_tap = register_tap("oran-fh-cus");
12046
12047 /* Required function calls to register the header fields and subtrees */
12048 proto_register_field_array(proto_oran, hf, array_length(hf)(sizeof (hf) / sizeof (hf)[0]));
12049 proto_register_subtree_array(ett, array_length(ett)(sizeof (ett) / sizeof (ett)[0]));
12050 proto_register_subtree_array(ext_ett, array_length(ext_ett)(sizeof (ext_ett) / sizeof (ext_ett)[0]));
12051
12052 expert_oran = expert_register_protocol(proto_oran);
12053 expert_register_field_array(expert_oran, ei, array_length(ei)(sizeof (ei) / sizeof (ei)[0]));
12054
12055
12056 /* Preferences */
12057 module_t * oran_module = prefs_register_protocol(proto_oran, NULL((void*)0));
12058
12059 /* Register bit width/compression preferences separately by direction. */
12060 prefs_register_uint_preference(oran_module, "oran.du_port_id_bits", "DU Port ID bits [a]",
12061 "The bit width of DU Port ID - sum of a,b,c&d (eAxC) must be 16", 10, &pref_du_port_id_bits);
12062 prefs_register_uint_preference(oran_module, "oran.bandsector_id_bits", "BandSector ID bits [b]",
12063 "The bit width of BandSector ID - sum of a,b,c&d (eAxC) must be 16", 10, &pref_bandsector_id_bits);
12064 prefs_register_uint_preference(oran_module, "oran.cc_id_bits", "CC ID bits [c]",
12065 "The bit width of CC ID - sum of a,b,c&d (eAxC) must be 16", 10, &pref_cc_id_bits);
12066 prefs_register_uint_preference(oran_module, "oran.ru_port_id_bits", "RU Port ID bits [d]",
12067 "The bit width of RU Port ID - sum of a,b,c&d (eAxC) must be 16", 10, &pref_ru_port_id_bits);
12068
12069 /* Uplink userplane */
12070 prefs_register_static_text_preference(oran_module, "oran.ul", "", "");
12071 prefs_register_uint_preference(oran_module, "oran.iq_bitwidth_up", "IQ Bitwidth Uplink",
12072 "The bit width of a sample in the Uplink (if no udcompHdr and no C-Plane)", 10, &pref_sample_bit_width_uplink);
12073 prefs_register_enum_preference(oran_module, "oran.ud_comp_up", "Uplink User Data Compression",
12074 "Uplink User Data Compression (if no udcompHdr and no C-Plane)", &pref_iqCompressionUplink, ul_compression_options, false0);
12075 prefs_register_enum_preference(oran_module, "oran.ud_comp_hdr_up", "udCompHdr field is present for uplink",
12076 "The udCompHdr field in U-Plane messages may or may not be present, depending on the "
12077 "configuration of the O-RU. This preference instructs the dissector to expect "
12078 "this field to be present in uplink messages",
12079 &pref_includeUdCompHeaderUplink, udcomphdr_present_options, false0);
12080 prefs_register_bool_preference(oran_module, "oran.ignore_cplane_ul_udcomphdr", "Ignore UL compression settings from C-plane",
12081 "When set, override udCompHdr from UL C-Plane with compression method and width configured here", &pref_override_ul_compression);
12082 prefs_register_uint_preference(oran_module, "oran.ul_slot_us_limit", "Microseconds allowed for UL tx in symbol",
12083 "Maximum number of microseconds allowed for UL slot transmission before expert warning (zero to disable). N.B. timing relative to first frame seen for same symbol",
12084 10, &us_allowed_for_ul_in_symbol);
12085
12086 /* Downlink userplane */
12087 prefs_register_static_text_preference(oran_module, "oran.dl", "", "");
12088 prefs_register_uint_preference(oran_module, "oran.iq_bitwidth_down", "IQ Bitwidth Downlink",
12089 "The bit width of a sample in the Downlink (if no udcompHdr)", 10, &pref_sample_bit_width_downlink);
12090 prefs_register_enum_preference(oran_module, "oran.ud_comp_down", "Downlink User Data Compression",
12091 "Downlink User Data Compression", &pref_iqCompressionDownlink, dl_compression_options, false0);
12092 prefs_register_enum_preference(oran_module, "oran.ud_comp_hdr_down", "udCompHdr field is present for downlink",
12093 "The udCompHdr field in U-Plane messages may or may not be present, depending on the "
12094 "configuration of the O-RU. This preference instructs the dissector to expect "
12095 "this field to be present in downlink messages",
12096 &pref_includeUdCompHeaderDownlink, udcomphdr_present_options, false0);
12097
12098 /* SINR */
12099 prefs_register_static_text_preference(oran_module, "oran.sinr", "", "");
12100 prefs_register_uint_preference(oran_module, "oran.iq_bitwidth_sinr", "IQ Bitwidth SINR",
12101 "The bit width of a sample in SINR", 10, &pref_sample_bit_width_sinr);
12102 prefs_register_enum_preference(oran_module, "oran.ud_comp_sinr", "SINR Compression",
12103 "SINR Compression", &pref_iqCompressionSINR, ul_compression_options, false0);
12104
12105 /* BF-related */
12106 prefs_register_static_text_preference(oran_module, "oran.bf", "", "");
12107 prefs_register_uint_preference(oran_module, "oran.num_bf_antennas", "Number of beam weights",
12108 "Number of array elements that BF weights will be provided for", 10, &pref_num_bf_antennas);
12109 prefs_register_obsolete_preference(oran_module, "oran.num_weights_per_bundle");
12110 prefs_register_obsolete_preference(oran_module, "oran.num_bf_weights");
12111 prefs_register_bool_preference(oran_module, "oran.st6_4byte_alignment_required", "Use 4-byte alignment for ST6 sections",
12112 "Default is 1-byte alignment", &st6_4byte_alignment);
12113
12114 /* Misc (and will seldom need to be accessed) */
12115 prefs_register_static_text_preference(oran_module, "oran.misc", "", "");
12116 prefs_register_bool_preference(oran_module, "oran.show_iq_samples", "Show IQ Sample values",
12117 "When enabled, for U-Plane frames show each I and Q value in PRB", &pref_showIQSampleValues);
12118 prefs_register_enum_preference(oran_module, "oran.support_udcomplen", "udCompLen supported",
12119 "When enabled, U-Plane messages with relevant compression schemes will include udCompLen",
12120 &pref_support_udcompLen, udcomplen_support_options, false0);
12121 prefs_register_uint_preference(oran_module, "oran.rbs_in_uplane_section", "Total RBs in User-Plane data section",
12122 "This is used if numPrbu is signalled as 0", 10, &pref_data_plane_section_total_rbs);
12123 prefs_register_bool_preference(oran_module, "oran.unscaled_iq", "Show unscaled I/Q values",
12124 "", &show_unscaled_values);
12125 prefs_register_bool_preference(oran_module, "oran.attempt_reassembly",
12126 "Attempt Radio Transport layer reassembly", "",
12127 &do_radio_transport_layer_reassembly);
12128 prefs_register_obsolete_preference(oran_module, "oran.k_antenna_ports");
12129 prefs_register_uint_preference(oran_module, "oran.symbol_time", "Symbol duration in us",
12130 "e.g., 36us for 100MHz, Mu=1", 10, &pref_symbol_time);
12131
12132 prefs_register_bool_preference(oran_module, "oran.link_planes",
12133 "Link C-plane and U-plane using sectionId", "",
12134 &link_planes_together);
12135
12136
12137
12138
12139 flow_states_table = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
12140 flow_results_table = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
12141 ul_symbol_timing = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
12142
12143 dl_beam_ids_defined = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
12144 dl_beam_ids_results = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
12145
12146 register_init_routine(&oran_init_protocol);
12147
12148 /* Register reassembly table. */
12149 reassembly_table_register(&oran_reassembly_table,
12150 &oran_reassembly_table_functions);
12151}
12152
12153/*
12154* Editor modelines - http://www.wireshark.org/tools/modelines.html
12155*
12156* Local Variables:
12157* c-basic-offset: 4
12158* tab-width: 8
12159* indent-tabs-mode: nil
12160* End:
12161*
12162* ex: set shiftwidth=4 tabstop=8 expandtab:
12163* :indentSize=4:tabSize=8:noTabs=true:
12164*/