Bug Summary

File:epan/dissectors/packet-oran.c
Warning:line 3788, column 67
The left 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-21/lib/clang/21 -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 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-21/lib/clang/21/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../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-truncation -Wno-format-nonliteral -Wno-pointer-sign -std=gnu11 -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 -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /builds/wireshark/wireshark/sbout/2025-10-14-100335-3623-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 <gerald@wireshark.org>
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-v17.01 specification.
17 * - haven't spotted any differences in v18.00
18 * Note that other eCPRI message types are handled in packet-ecpri.c
19 */
20
21#include <config.h>
22
23#include <math.h>
24
25#include <epan/packet.h>
26#include <epan/expert.h>
27#include <epan/prefs.h>
28#include <epan/tap.h>
29
30#include <epan/tfs.h>
31
32#include <wsutil/ws_roundup.h>
33#include <wsutil/ws_padding_to.h>
34
35#include "epan/dissectors/packet-oran.h"
36
37/* N.B. dissector preferences are taking the place of (some) M-plane parameters, so unfortunately it can be
38 * fiddly to get the preferences into a good state to decode a given capture..
39 * TODO:
40 * - for U-Plane, track back to last C-Plane frame for that eAxC
41 * - use udCompHdr values from C-Plane if not overridden by U-Plane?
42 * N.B. this matching is tricky see 7.8.1 Coupling of C-Plane and U-Plane
43 * - Radio transport layer (eCPRI) fragmentation / reassembly
44 * - Detect/indicate signs of application layer fragmentation?
45 * - Not handling M-plane setting for "little endian byte order" as applied to IQ samples and beam weights
46 * - for section extensions, check more constraints (which other extension types appear with them, order)
47 * - when some section extensions are present, some section header fields are effectively ignored - flag any remaining ("ignored, "shall")?
48 * - re-order items (decl and hf definitions) to match spec order?
49 */
50
51/* Prototypes */
52void proto_reg_handoff_oran(void);
53void proto_register_oran(void);
54
55/* Initialize the protocol and registered fields */
56static int proto_oran;
57
58static int oran_tap = -1;
59
60static int hf_oran_du_port_id;
61static int hf_oran_bandsector_id;
62static int hf_oran_cc_id;
63static int hf_oran_ru_port_id;
64static int hf_oran_sequence_id;
65static int hf_oran_e_bit;
66static int hf_oran_subsequence_id;
67static int hf_oran_previous_frame;
68
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_bits456;
175
176static int hf_oran_bundle_offset;
177static int hf_oran_cont_ind;
178
179static int hf_oran_bfwCompHdr;
180static int hf_oran_bfwCompHdr_iqWidth;
181static int hf_oran_bfwCompHdr_compMeth;
182static int hf_oran_symbolId;
183static int hf_oran_startPrbu;
184static int hf_oran_numPrbu;
185
186static int hf_oran_udCompParam;
187static int hf_oran_sReSMask;
188static int hf_oran_sReSMask_re12;
189static int hf_oran_sReSMask_re11;
190static int hf_oran_sReSMask_re10;
191static int hf_oran_sReSMask_re9;
192static int hf_oran_sReSMask_re8;
193static int hf_oran_sReSMask_re7;
194static int hf_oran_sReSMask_re6;
195static int hf_oran_sReSMask_re5;
196static int hf_oran_sReSMask_re4;
197static int hf_oran_sReSMask_re3;
198static int hf_oran_sReSMask_re2;
199static int hf_oran_sReSMask_re1;
200
201static int hf_oran_sReSMask1;
202static int hf_oran_sReSMask2;
203static int hf_oran_sReSMask1_2_re12;
204static int hf_oran_sReSMask1_2_re11;
205static int hf_oran_sReSMask1_2_re10;
206static int hf_oran_sReSMask1_2_re9;
207
208static int hf_oran_bfwCompParam;
209
210static int hf_oran_iSample;
211static int hf_oran_qSample;
212
213static int hf_oran_ciCompParam;
214
215static int hf_oran_blockScaler;
216static int hf_oran_compBitWidth;
217static int hf_oran_compShift;
218
219static int hf_oran_active_beamspace_coefficient_n1;
220static int hf_oran_active_beamspace_coefficient_n2;
221static int hf_oran_active_beamspace_coefficient_n3;
222static int hf_oran_active_beamspace_coefficient_n4;
223static int hf_oran_active_beamspace_coefficient_n5;
224static int hf_oran_active_beamspace_coefficient_n6;
225static int hf_oran_active_beamspace_coefficient_n7;
226static int hf_oran_active_beamspace_coefficient_n8;
227static int hf_oran_activeBeamspaceCoefficientMask;
228static int hf_oran_activeBeamspaceCoefficientMask_bits_set;
229
230static int hf_oran_se6_repetition;
231
232static int hf_oran_rbgSize;
233static int hf_oran_rbgMask;
234static int hf_oran_noncontig_priority;
235
236static int hf_oran_symbol_mask;
237static int hf_oran_symbol_mask_s13;
238static int hf_oran_symbol_mask_s12;
239static int hf_oran_symbol_mask_s11;
240static int hf_oran_symbol_mask_s10;
241static int hf_oran_symbol_mask_s9;
242static int hf_oran_symbol_mask_s8;
243static int hf_oran_symbol_mask_s7;
244static int hf_oran_symbol_mask_s6;
245static int hf_oran_symbol_mask_s5;
246static int hf_oran_symbol_mask_s4;
247static int hf_oran_symbol_mask_s3;
248static int hf_oran_symbol_mask_s2;
249static int hf_oran_symbol_mask_s1;
250static int hf_oran_symbol_mask_s0;
251
252static int hf_oran_exponent;
253static int hf_oran_iq_user_data;
254
255static int hf_oran_disable_bfws;
256static int hf_oran_rad;
257static int hf_oran_num_bund_prbs;
258static int hf_oran_beam_id;
259static int hf_oran_num_weights_per_bundle;
260
261static int hf_oran_ack_nack_req_id;
262
263static int hf_oran_frequency_range;
264static int hf_oran_off_start_prb;
265static int hf_oran_num_prb;
266
267static int hf_oran_samples_prb;
268static int hf_oran_ciSample;
269static int hf_oran_ciIsample;
270static int hf_oran_ciQsample;
271
272static int hf_oran_beamGroupType;
273static int hf_oran_numPortc;
274
275static int hf_oran_csf;
276static int hf_oran_modcompscaler;
277
278static int hf_oran_modcomp_param_set;
279static int hf_oran_mc_scale_re_mask;
280static int hf_oran_mc_scale_offset;
281
282static int hf_oran_eAxC_mask;
283static int hf_oran_technology;
284static int hf_oran_nullLayerInd;
285
286static int hf_oran_se19_repetition;
287static int hf_oran_portReMask;
288static int hf_oran_portSymbolMask;
289
290static int hf_oran_ext19_port;
291
292static int hf_oran_prb_allocation;
293static int hf_oran_nextSymbolId;
294static int hf_oran_nextStartPrbc;
295
296static int hf_oran_puncPattern;
297static int hf_oran_numPuncPatterns;
298static int hf_oran_symbolMask_ext20;
299static int hf_oran_startPuncPrb;
300static int hf_oran_numPuncPrb;
301static int hf_oran_puncReMask;
302static int hf_oran_multiSDScope;
303static int hf_oran_RbgIncl;
304
305static int hf_oran_ci_prb_group_size;
306static int hf_oran_prg_size_st5;
307static int hf_oran_prg_size_st6;
308
309static int hf_oran_num_ueid;
310
311static int hf_oran_antMask;
312
313static int hf_oran_transmissionWindowOffset;
314static int hf_oran_transmissionWindowSize;
315static int hf_oran_toT;
316
317static int hf_oran_bfaCompHdr;
318static int hf_oran_bfAzPtWidth;
319static int hf_oran_bfZePtWidth;
320static int hf_oran_bfAz3ddWidth;
321static int hf_oran_bfZe3ddWidth;
322static int hf_oran_bfAzPt;
323static int hf_oran_bfZePt;
324static int hf_oran_bfAz3dd;
325static int hf_oran_bfZe3dd;
326static int hf_oran_bfAzSl;
327static int hf_oran_bfZeSl;
328
329static int hf_oran_cmd_scope;
330static int hf_oran_number_of_st4_cmds;
331
332static int hf_oran_st4_cmd_header;
333static int hf_oran_st4_cmd_type;
334static int hf_oran_st4_cmd_len;
335static int hf_oran_st4_cmd_num_slots;
336static int hf_oran_st4_cmd_ack_nack_req_id;
337
338static int hf_oran_st4_cmd;
339
340static int hf_oran_sleepmode_trx;
341static int hf_oran_sleepmode_asm;
342static int hf_oran_log2maskbits;
343static int hf_oran_num_slots_ext;
344static int hf_oran_antMask_trx_control;
345
346static int hf_oran_ready;
347static int hf_oran_number_of_acks;
348static int hf_oran_number_of_nacks;
349static int hf_oran_ackid;
350static int hf_oran_nackid;
351
352static int hf_oran_acknack_request_frame;
353static int hf_oran_acknack_request_time;
354static int hf_oran_acknack_request_type;
355static int hf_oran_acknack_response_frame;
356static int hf_oran_acknack_response_time;
357
358static int hf_oran_disable_tdbfns;
359static int hf_oran_td_beam_group;
360static int hf_oran_disable_tdbfws;
361static int hf_oran_td_beam_num;
362
363static int hf_oran_dir_pattern;
364static int hf_oran_guard_pattern;
365
366static int hf_oran_ecpri_pcid;
367static int hf_oran_ecpri_rtcid;
368static int hf_oran_ecpri_seqid;
369
370static int hf_oran_num_sym_prb_pattern;
371static int hf_oran_prb_mode;
372static int hf_oran_sym_prb_pattern;
373static int hf_oran_sym_mask;
374static int hf_oran_num_mc_scale_offset;
375static int hf_oran_prb_pattern;
376static int hf_oran_prb_block_offset;
377static int hf_oran_prb_block_size;
378
379static int hf_oran_codebook_index;
380static int hf_oran_layerid;
381static int hf_oran_numlayers;
382static int hf_oran_txscheme;
383static int hf_oran_crs_remask;
384static int hf_oran_crs_shift;
385static int hf_oran_crs_symnum;
386static int hf_oran_beamid_ap1;
387static int hf_oran_beamid_ap2;
388static int hf_oran_beamid_ap3;
389
390static int hf_oran_port_list_index;
391static int hf_oran_alpn_per_sym;
392static int hf_oran_ant_dmrs_snr;
393static int hf_oran_user_group_size;
394static int hf_oran_user_group_id;
395static int hf_oran_entry_type;
396static int hf_oran_dmrs_port_number;
397static int hf_oran_ueid_reset;
398
399static int hf_oran_dmrs_symbol_mask;
400static int hf_oran_dmrs_symbol_mask_s13;
401static int hf_oran_dmrs_symbol_mask_s12;
402static int hf_oran_dmrs_symbol_mask_s11;
403static int hf_oran_dmrs_symbol_mask_s10;
404static int hf_oran_dmrs_symbol_mask_s9;
405static int hf_oran_dmrs_symbol_mask_s8;
406static int hf_oran_dmrs_symbol_mask_s7;
407static int hf_oran_dmrs_symbol_mask_s6;
408static int hf_oran_dmrs_symbol_mask_s5;
409static int hf_oran_dmrs_symbol_mask_s4;
410static int hf_oran_dmrs_symbol_mask_s3;
411static int hf_oran_dmrs_symbol_mask_s2;
412static int hf_oran_dmrs_symbol_mask_s1;
413static int hf_oran_dmrs_symbol_mask_s0;
414
415static int hf_oran_scrambling;
416static int hf_oran_nscid;
417static int hf_oran_dtype;
418static int hf_oran_cmd_without_data;
419static int hf_oran_lambda;
420static int hf_oran_first_prb;
421static int hf_oran_last_prb;
422static int hf_oran_low_papr_type;
423static int hf_oran_hopping_mode;
424
425static int hf_oran_tx_win_for_on_air_symbol_l;
426static int hf_oran_tx_win_for_on_air_symbol_r;
427
428static int hf_oran_num_fo_fb;
429static int hf_oran_freq_offset_fb;
430
431static int hf_oran_num_ue_sinr_rpt;
432static int hf_oran_num_sinr_per_prb;
433static int hf_oran_num_sinr_per_prb_right;
434
435static int hf_oran_sinr_value;
436
437static int hf_oran_measurement_report;
438static int hf_oran_mf;
439static int hf_oran_meas_data_size;
440static int hf_oran_meas_type_id;
441static int hf_oran_ipn_power;
442static int hf_oran_ue_tae;
443static int hf_oran_ue_layer_power;
444static int hf_oran_num_elements;
445static int hf_oran_ant_dmrs_snr_val;
446static int hf_oran_ue_freq_offset;
447
448static int hf_oran_measurement_command;
449
450static int hf_oran_beam_type;
451static int hf_oran_meas_cmd_size;
452
453static int hf_oran_symbol_reordering_layer;
454static int hf_oran_dmrs_entry;
455
456static int hf_oran_c_section_common;
457static int hf_oran_c_section;
458static int hf_oran_u_section;
459
460static int hf_oran_u_section_ul_symbol_time;
461static int hf_oran_u_section_ul_symbol_frames;
462static int hf_oran_u_section_ul_symbol_first_frame;
463static int hf_oran_u_section_ul_symbol_last_frame;
464
465/* Computed fields */
466static int hf_oran_c_eAxC_ID;
467static int hf_oran_refa;
468
469/* Convenient fields for filtering, mostly shown as hidden */
470static int hf_oran_cplane;
471static int hf_oran_uplane;
472static int hf_oran_bf; /* to match frames that configure beamforming in any way */
473static int hf_oran_zero_prb;
474
475static int hf_oran_ul_cplane_ud_comp_hdr_frame;
476
477/* Initialize the subtree pointers */
478static int ett_oran;
479static int ett_oran_ecpri_rtcid;
480static int ett_oran_ecpri_pcid;
481static int ett_oran_ecpri_seqid;
482static int ett_oran_section;
483static int ett_oran_section_type;
484static int ett_oran_u_timing;
485static int ett_oran_u_section;
486static int ett_oran_u_prb;
487static int ett_oran_iq;
488static int ett_oran_bfw_bundle;
489static int ett_oran_bfw;
490static int ett_oran_frequency_range;
491static int ett_oran_prb_cisamples;
492static int ett_oran_cisample;
493static int ett_oran_udcomphdr;
494static int ett_oran_udcompparam;
495static int ett_oran_cicomphdr;
496static int ett_oran_cicompparam;
497static int ett_oran_bfwcomphdr;
498static int ett_oran_bfwcompparam;
499static int ett_oran_ext19_port;
500static int ett_oran_prb_allocation;
501static int ett_oran_punc_pattern;
502static int ett_oran_bfacomphdr;
503static int ett_oran_modcomp_param_set;
504static int ett_oran_st4_cmd_header;
505static int ett_oran_st4_cmd;
506static int ett_oran_sym_prb_pattern;
507static int ett_oran_measurement_report;
508static int ett_oran_measurement_command;
509static int ett_oran_sresmask;
510static int ett_oran_c_section_common;
511static int ett_oran_c_section;
512static int ett_oran_remask;
513static int ett_oran_symbol_reordering_layer;
514static int ett_oran_dmrs_entry;
515static int ett_oran_dmrs_symbol_mask;
516static int ett_oran_symbol_mask;
517static int ett_active_beamspace_coefficient_mask;
518
519
520/* Don't want all extensions to open and close together. Use extType-1 entry */
521static int ett_oran_c_section_extension[HIGHEST_EXTTYPE28];
522
523/* Expert info */
524static expert_field ei_oran_unsupported_bfw_compression_method;
525static expert_field ei_oran_invalid_sample_bit_width;
526static expert_field ei_oran_reserved_numBundPrb;
527static expert_field ei_oran_extlen_wrong;
528static expert_field ei_oran_invalid_eaxc_bit_width;
529static expert_field ei_oran_extlen_zero;
530static expert_field ei_oran_rbg_size_reserved;
531static expert_field ei_oran_frame_length;
532static expert_field ei_oran_numprbc_ext21_zero;
533static expert_field ei_oran_ci_prb_group_size_reserved;
534static expert_field ei_oran_st8_nackid;
535static expert_field ei_oran_st4_no_cmds;
536static expert_field ei_oran_st4_zero_len_cmd;
537static expert_field ei_oran_st4_wrong_len_cmd;
538static expert_field ei_oran_st4_unknown_cmd;
539static expert_field ei_oran_mcot_out_of_range;
540static expert_field ei_oran_se10_unknown_beamgrouptype;
541static expert_field ei_oran_se10_not_allowed;
542static expert_field ei_oran_start_symbol_id_not_zero;
543static expert_field ei_oran_trx_control_cmd_scope;
544static expert_field ei_oran_unhandled_se;
545static expert_field ei_oran_bad_symbolmask;
546static expert_field ei_oran_numslots_not_zero;
547static expert_field ei_oran_version_unsupported;
548static expert_field ei_oran_laa_msg_type_unsupported;
549static expert_field ei_oran_se_on_unsupported_st;
550static expert_field ei_oran_cplane_unexpected_sequence_number_ul;
551static expert_field ei_oran_cplane_unexpected_sequence_number_dl;
552static expert_field ei_oran_uplane_unexpected_sequence_number_ul;
553static expert_field ei_oran_uplane_unexpected_sequence_number_dl;
554static expert_field ei_oran_acknack_no_request;
555static expert_field ei_oran_udpcomphdr_should_be_zero;
556static expert_field ei_oran_radio_fragmentation_c_plane;
557static expert_field ei_oran_radio_fragmentation_u_plane;
558static expert_field ei_oran_lastRbdid_out_of_range;
559static expert_field ei_oran_rbgMask_beyond_last_rbdid;
560static expert_field ei_oran_unexpected_measTypeId;
561static expert_field ei_oran_unsupported_compression_method;
562static expert_field ei_oran_ud_comp_len_wrong_size;
563static expert_field ei_oran_sresmask2_not_zero_with_rb;
564static expert_field ei_oran_st6_rb_shall_be_0;
565static expert_field ei_oran_st9_not_ul;
566static expert_field ei_oran_st10_numsymbol_not_14;
567static expert_field ei_oran_st10_startsymbolid_not_0;
568static expert_field ei_oran_st10_not_ul;
569static expert_field ei_oran_se24_nothing_to_inherit;
570static expert_field ei_oran_num_sinr_per_prb_unknown;
571static expert_field ei_oran_start_symbol_id_bits_ignored;
572static expert_field ei_oran_user_group_id_reserved_value;
573static expert_field ei_oran_port_list_index_zero;
574static expert_field ei_oran_ul_uplane_symbol_too_long;
575
576
577/* These are the message types handled by this dissector */
578#define ECPRI_MT_IQ_DATA0 0
579#define ECPRI_MT_RT_CTRL_DATA2 2
580
581
582/* Preference settings - try to set reasonable defaults */
583static unsigned pref_du_port_id_bits = 4;
584static unsigned pref_bandsector_id_bits = 4;
585static unsigned pref_cc_id_bits = 4;
586static unsigned pref_ru_port_id_bits = 4;
587
588/* TODO: ideally should be per-flow */
589static unsigned pref_sample_bit_width_uplink = 14;
590static unsigned pref_sample_bit_width_downlink = 14;
591static unsigned pref_sample_bit_width_sinr = 14;
592
593/* 8.3.3.15 Compression schemes */
594#define COMP_NONE0 0
595#define COMP_BLOCK_FP1 1
596#define COMP_BLOCK_SCALE2 2
597#define COMP_U_LAW3 3
598#define COMP_MODULATION4 4
599#define BFP_AND_SELECTIVE_RE5 5
600#define MOD_COMPR_AND_SELECTIVE_RE6 6
601#define BFP_AND_SELECTIVE_RE_WITH_MASKS7 7
602#define MOD_COMPR_AND_SELECTIVE_RE_WITH_MASKS8 8
603
604/* TODO: these ideally should be per-flow too */
605static int pref_iqCompressionUplink = COMP_BLOCK_FP1;
606static int pref_iqCompressionDownlink = COMP_BLOCK_FP1;
607
608static int pref_iqCompressionSINR = COMP_BLOCK_FP1;
609
610
611/* Is udCompHeader present (both directions) */
612static int pref_includeUdCompHeaderUplink = 2; /* start heuristic */
613static int pref_includeUdCompHeaderDownlink = 2; /* start heuristic */
614
615static unsigned pref_data_plane_section_total_rbs = 273;
616static unsigned pref_num_bf_antennas = 32;
617static bool_Bool pref_showIQSampleValues = true1;
618
619/* Based upon m-plane param, so will be system-wide */
620static int pref_support_udcompLen = 2; /* start heuristic, can force other settings if necessary */
621static bool_Bool udcomplen_heuristic_result_set = false0;
622static bool_Bool udcomplen_heuristic_result = false0;
623
624/* st6-4byte-alignment-required */
625static bool_Bool st6_4byte_alignment = false0;
626
627/* Requested, allows I/Q to be stored as integers.. */
628static bool_Bool show_unscaled_values = false0;
629
630/* Initialized off. Timing is in microseconds. */
631static unsigned us_allowed_for_ul_in_symbol = 0;
632
633static const enum_val_t dl_compression_options[] = {
634 { "COMP_NONE", "No Compression", COMP_NONE0 },
635 { "COMP_BLOCK_FP", "Block Floating Point Compression", COMP_BLOCK_FP1 },
636 { "COMP_BLOCK_SCALE", "Block Scaling Compression", COMP_BLOCK_SCALE2 },
637 { "COMP_U_LAW", "u-Law Compression", COMP_U_LAW3 },
638 { "COMP_MODULATION", "Modulation Compression", COMP_MODULATION4 },
639 { "BFP_AND_SELECTIVE_RE", "Block Floating Point + selective RE sending", BFP_AND_SELECTIVE_RE5 },
640 { "MOD_COMPR_AND_SELECTIVE_RE", "Modulation Compression + selective RE sending", MOD_COMPR_AND_SELECTIVE_RE6 },
641 { "BFP_AND_SELECTIVE_RE_WITH_MASKS", "Block Floating Point + selective RE sending with masks in section header", BFP_AND_SELECTIVE_RE_WITH_MASKS7 },
642 { "MOD_COMPR_AND_SELECTIVE_RE_WITH_MASKS", "Modulation Compression + selective RE sending with masks in section header", MOD_COMPR_AND_SELECTIVE_RE6 },
643 { NULL((void*)0), NULL((void*)0), 0 }
644};
645
646static const enum_val_t ul_compression_options[] = {
647 { "COMP_NONE", "No Compression", COMP_NONE0 },
648 { "COMP_BLOCK_FP", "Block Floating Point Compression", COMP_BLOCK_FP1 },
649 { "COMP_BLOCK_SCALE", "Block Scaling Compression", COMP_BLOCK_SCALE2 },
650 { "COMP_U_LAW", "u-Law Compression", COMP_U_LAW3 },
651 { "BFP_AND_SELECTIVE_RE", "Block Floating Point + selective RE sending", BFP_AND_SELECTIVE_RE5 },
652 { "BFP_AND_SELECTIVE_RE_WITH_MASKS", "Block Floating Point + selective RE sending with masks in section header", BFP_AND_SELECTIVE_RE_WITH_MASKS7 },
653 { NULL((void*)0), NULL((void*)0), 0 }
654};
655
656static const enum_val_t udcomplen_support_options[] = {
657 { "NOT_SUPPORTED", "Not Supported", 0 },
658 { "SUPPORTED", "Supported", 1 },
659 { "HEURISTIC", "Attempt Heuristic", 2 },
660 { NULL((void*)0), NULL((void*)0), 0 }
661};
662
663static const enum_val_t udcomphdr_present_options[] = {
664 { "NOT_PRESENT", "Not Present", 0 },
665 { "PRESENT", "Present", 1 },
666 { "HEURISTIC", "Attempt Heuristic", 2 },
667 { NULL((void*)0), NULL((void*)0), 0 }
668};
669
670
671
672static const value_string e_bit[] = {
673 { 0, "More fragments follow" },
674 { 1, "Last fragment" },
675 { 0, NULL((void*)0)}
676};
677
678#define DIR_UPLINK0 0
679#define DIR_DOWNLINK1 1
680
681
682static const value_string data_direction_vals[] = {
683 { DIR_UPLINK0, "Uplink" }, /* gNB Rx */
684 { DIR_DOWNLINK1, "Downlink" }, /* gNB Tx */
685 { 0, NULL((void*)0)}
686};
687
688static const value_string rb_vals[] = {
689 { 0, "Every RB used" },
690 { 1, "Every other RB used" },
691 { 0, NULL((void*)0)}
692};
693
694static const value_string sym_inc_vals[] = {
695 { 0, "Use the current symbol number" },
696 { 1, "Increment the current symbol number" },
697 { 0, NULL((void*)0)}
698};
699
700static const value_string lbtMode_vals[] = {
701 { 0, "Full LBT (regular LBT, sending reservation signal until the beginning of the SF/slot)" },
702 { 1, "Partial LBT (looking back 25 usec prior to transmission" },
703 { 2, "Partial LBT (looking back 34 usec prior to transmission" },
704 { 3, "Full LBT and stop (regular LBT, without sending reservation signal" },
705 { 0, NULL((void*)0)}
706};
707
708static const range_string filter_indices[] = {
709 {0, 0, "standard channel filter"},
710 {1, 1, "UL filter for PRACH preamble formats 0, 1, 2; min. passband 839 x 1.25kHz = 1048.75 kHz"},
711 {2, 2, "UL filter for PRACH preamble format 3, min. passband 839 x 5 kHz = 4195 kHz"},
712 {3, 3, "UL filter for PRACH preamble formats A1, A2, A3, B1, B2, B3, B4, C0, C2; min. passband 139 x \u0394fRA"},
713 {4, 4, "UL filter for NPRACH 0, 1; min. passband 48 x 3.75KHz = 180 KHz"},
714 {5, 5, "UL filter for PRACH preamble formats"},
715 {8, 8, "UL filter NPUSCH"},
716 {9, 9, "Mixed numerology and other channels except PRACH and NB-IoT"},
717 {9, 15, "Reserved"},
718 {0, 0, NULL((void*)0)}
719};
720
721static const range_string section_types[] = {
722 { SEC_C_UNUSED_RB, SEC_C_UNUSED_RB, "Unused Resource Blocks or symbols in Downlink or Uplink" },
723 { SEC_C_NORMAL, SEC_C_NORMAL, "Most DL/UL radio channels" },
724 { SEC_C_RSVD2, SEC_C_RSVD2, "Reserved for future use" },
725 { SEC_C_PRACH, SEC_C_PRACH, "PRACH and mixed-numerology channels" },
726 { SEC_C_SLOT_CONTROL, SEC_C_SLOT_CONTROL, "Slot Configuration Control" },
727 { SEC_C_UE_SCHED, SEC_C_UE_SCHED, "UE scheduling information (UE-ID assignment to section)" },
728 { SEC_C_CH_INFO, SEC_C_CH_INFO, "Channel information" },
729 { SEC_C_LAA, SEC_C_LAA, "LAA (License Assisted Access)" },
730 { SEC_C_ACK_NACK_FEEDBACK, SEC_C_ACK_NACK_FEEDBACK, "ACK/NACK Feedback" },
731 { SEC_C_SINR_REPORTING, SEC_C_SINR_REPORTING, "SINR Reporting" },
732 { SEC_C_RRM_MEAS_REPORTS, SEC_C_RRM_MEAS_REPORTS, "RRM Measurement Reports" },
733 { SEC_C_REQUEST_RRM_MEAS, SEC_C_REQUEST_RRM_MEAS, "Request RRM Measurements" },
734 { 12, 255, "Reserved for future use" },
735 { 0, 0, NULL((void*)0)} };
736
737static const range_string section_types_short[] = {
738 { SEC_C_UNUSED_RB, SEC_C_UNUSED_RB, "(Unused RBs) " },
739 { SEC_C_NORMAL, SEC_C_NORMAL, "(Most channels) " },
740 { SEC_C_RSVD2, SEC_C_RSVD2, "(reserved) " },
741 { SEC_C_PRACH, SEC_C_PRACH, "(PRACH/mixed-\u03bc)" },
742 { SEC_C_SLOT_CONTROL, SEC_C_SLOT_CONTROL, "(Slot info) " },
743 { SEC_C_UE_SCHED, SEC_C_UE_SCHED, "(UE scheduling info)" },
744 { SEC_C_CH_INFO, SEC_C_CH_INFO, "(Channel info) " },
745 { SEC_C_LAA, SEC_C_LAA, "(LAA) " },
746 { SEC_C_ACK_NACK_FEEDBACK, SEC_C_ACK_NACK_FEEDBACK, "(ACK/NACK) " },
747 { SEC_C_SINR_REPORTING, SEC_C_SINR_REPORTING, "(SINR Reporting) " },
748 { SEC_C_RRM_MEAS_REPORTS, SEC_C_RRM_MEAS_REPORTS, "(RRM Meas Reports) " },
749 { SEC_C_REQUEST_RRM_MEAS, SEC_C_REQUEST_RRM_MEAS, "(Req RRM Meas) " },
750 { 12, 255, "Reserved for future use" },
751 { 0, 0, NULL((void*)0) }
752};
753
754static const range_string ud_comp_header_width[] = {
755 {0, 0, "I and Q are each 16 bits wide"},
756 {1, 15, "Bit width of I and Q"},
757 {0, 0, NULL((void*)0)} };
758
759/* Table 8.3.3.13-3 */
760static const range_string ud_comp_header_meth[] = {
761 {COMP_NONE0, COMP_NONE0, "No compression" },
762 {COMP_BLOCK_FP1, COMP_BLOCK_FP1, "Block floating point compression" },
763 {COMP_BLOCK_SCALE2, COMP_BLOCK_SCALE2, "Block scaling" },
764 {COMP_U_LAW3, COMP_U_LAW3, "Mu - law" },
765 {COMP_MODULATION4, COMP_MODULATION4, "Modulation compression" },
766 {BFP_AND_SELECTIVE_RE5, BFP_AND_SELECTIVE_RE5, "BFP + selective RE sending" },
767 {MOD_COMPR_AND_SELECTIVE_RE6, MOD_COMPR_AND_SELECTIVE_RE6, "mod-compr + selective RE sending" },
768 {BFP_AND_SELECTIVE_RE_WITH_MASKS7, BFP_AND_SELECTIVE_RE_WITH_MASKS7, "BFP + selective RE sending with masks in section header" },
769 {MOD_COMPR_AND_SELECTIVE_RE_WITH_MASKS8, MOD_COMPR_AND_SELECTIVE_RE_WITH_MASKS8, "mod-compr + selective RE sending with masks in section header"},
770 {9, 15, "Reserved"},
771 {0, 0, NULL((void*)0)}
772};
773
774/* Table 7.5.2.13-2 */
775static const range_string frame_structure_fft[] = {
776 {0, 0, "Reserved (no FFT/iFFT processing)"},
777 {1, 3, "Reserved"},
778 {4, 4, "FFT size 16"},
779 {5, 5, "FFT size 32"},
780 {6, 6, "FFT size 64"},
781 {7, 7, "FFT size 128"},
782 {8, 8, "FFT size 256"},
783 {9, 9, "FFT size 512"},
784 {10, 10, "FFT size 1024"},
785 {11, 11, "FFT size 2048"},
786 {12, 12, "FFT size 4096"},
787 {13, 13, "FFT size 1536"},
788 {14, 14, "FFT size 3072"},
789 {15, 15, "Reserved"},
790 {0, 0, NULL((void*)0)}
791};
792
793/* Table 7.5.2.13-3 */
794static const range_string subcarrier_spacings[] = {
795 { 0, 0, "SCS 15 kHz, 1 slot/subframe, slot length 1 ms" },
796 { 1, 1, "SCS 30 kHz, 2 slots/subframe, slot length 500 \u03bcs" },
797 { 2, 2, "SCS 60 kHz, 4 slots/subframe, slot length 250 \u03bcs" },
798 { 3, 3, "SCS 120 kHz, 8 slots/subframe, slot length 125 \u03bcs" },
799 { 4, 4, "SCS 240 kHz, 16 slots/subframe, slot length 62.5 \u03bcs" },
800 { 5, 11, "Reserved" }, /* N.B., 5 was 480kHz in early spec versions */
801 { 12, 12, "SCS 1.25 kHz, 1 slot/subframe, slot length 1 ms" },
802 { 13, 13, "SCS 3.75 kHz(LTE - specific), 1 slot/subframe, slot length 1 ms" },
803 { 14, 14, "SCS 5 kHz, 1 slot/subframe, slot length 1 ms" },
804 { 15, 15, "SCS 7.5 kHz(LTE - specific), 1 slot/subframe, slot length 1 ms" },
805 { 0, 0, NULL((void*)0) }
806};
807
808/* Table 7.5.3.14-1 laaMsgType definition */
809static const range_string laaMsgTypes[] = {
810 {0, 0, "LBT_PDSCH_REQ - lls - O-DU to O-RU request to obtain a PDSCH channel"},
811 {1, 1, "LBT_DRS_REQ - lls - O-DU to O-RU request to obtain the channel and send DRS"},
812 {2, 2, "LBT_PDSCH_RSP - O-RU to O-DU response, channel acq success or failure"},
813 {3, 3, "LBT_DRS_RSP - O-RU to O-DU response, DRS sending success or failure"},
814 {4, 4, "LBT_Buffer_Error - O-RU to O-DU response, reporting buffer overflow"},
815 {5, 5, "LBT_CWCONFIG_REQ - O-DU to O-RU request, congestion window configuration"},
816 {6, 6, "LBT_CWCONFIG_RST - O-RU to O-DU request, congestion window config, response"},
817 {7, 15, "reserved for future methods"},
818 {0, 0, NULL((void*)0)}
819};
820
821static const range_string freq_offset_fb_values[] = {
822 {0, 0, "no frequency offset"},
823 {8000, 8000, "value not provided"},
824 {1, 30000, "positive frequency offset, (0, +0.5] subcarrier"},
825 {0x8ad0, 0xffff, "negative frequency offset, [-0.5, 0) subcarrier"},
826 {0x0, 0xffff, "reserved"},
827 {0, 0, NULL((void*)0)}
828};
829
830static const value_string num_sinr_per_prb_vals[] = {
831 { 0, "1" },
832 { 1, "2" },
833 { 2, "3" },
834 { 3, "4" },
835 { 4, "6" },
836 { 5, "12" },
837 { 6, "reserved" },
838 { 7, "reserved" },
839 { 0, NULL((void*)0)}
840};
841
842static const value_string meas_type_id_vals[] = {
843 { 1, "UE Timing Advance Error" },
844 { 2, "UE Layer power" },
845 { 3, "UE frequency offset" },
846 { 4, "Interference plus Noise for allocated PRBs" },
847 { 5, "Interference plus Noise for unallocated PRBs" },
848 { 6, "DMRS SNR per antenna" },
849 { 0, NULL((void*)0)}
850};
851
852static const value_string beam_type_vals[] = {
853 { 0, "List of beamId values" },
854 { 1, "Range of beamId values" },
855 { 0, NULL((void*)0)}
856};
857
858/* 7.7.24.3 */
859static const value_string entry_type_vals[] = {
860 { 0, "inherit config from preceding entry (2 or 3) ueIdReset=0" },
861 { 1, "inherit config from preceding entry (2 or 3) ueIdReset=1" },
862 { 2, "related parameters if have transform precoding disabled " },
863 { 3, "related parameters if have transform precoding enabled " },
864 { 0, NULL((void*)0)}
865};
866
867
868/* Table 7.6.1-1 */
869static const value_string exttype_vals[] = {
870 {0, "Reserved"},
871 {1, "Beamforming weights"},
872 {2, "Beamforming attributes"},
873 {3, "DL Precoding configuration parameters and indications"},
874 {4, "Modulation compr. params"},
875 {5, "Modulation compression additional scaling parameters"},
876 {6, "Non-contiguous PRB allocation"},
877 {7, "Multiple-eAxC designation"},
878 {8, "Regularization factor"},
879 {9, "Dynamic Spectrum Sharing parameters"},
880 {10, "Multiple ports grouping"},
881 {11, "Flexible BF weights"},
882 {12, "Non-Contiguous PRB Allocation with Frequency Ranges"},
883 {13, "PRB Allocation with Frequency Hopping"},
884 {14, "Nulling-layer Info. for ueId-based beamforming"},
885 {15, "Mixed-numerology Info. for ueId-based beamforming"},
886 {16, "Section description for antenna mapping in UE channel information based UL beamforming"},
887 {17, "Section description for indication of user port group"},
888 {18, "Section description for Uplink Transmission Management"},
889 {19, "Compact beamforming information for multiple port"},
890 {20, "Puncturing extension"},
891 {21, "Variable PRB group size for channel information"},
892 {22, "ACK/NACK request"},
893 {23, "Multiple symbol modulation compression parameters"},
894 {24, "PUSCH DMRS configuration"},
895 {25, "Symbol reordering for DMRS-BF"},
896 {26, "Frequency offset feedback"},
897 {27, "O-DU controlled dimensionality reduction"},
898 {28, "O-DU controlled frequency resolution for SINR reporting"},
899 {0, NULL((void*)0)}
900};
901
902/**************************************************************************************/
903/* Keep track for each Section Extension, which section types are allowed to carry it */
904typedef struct {
905 bool_Bool ST0;
906 bool_Bool ST1;
907 bool_Bool ST3;
908 bool_Bool ST5;
909 bool_Bool ST6;
910 bool_Bool ST10;
911 bool_Bool ST11;
912} AllowedCTs_t;
913
914
915static AllowedCTs_t ext_cts[HIGHEST_EXTTYPE28] = {
916 /* ST0 ST1 ST3 ST5 ST6 ST10 ST11 */
917 { false0, true1, true1, false0, false0, false0, false0}, // SE 1 (1,3)
918 { false0, true1, true1, false0, false0, false0, false0}, // SE 2 (1,3)
919 { false0, true1, true1, false0, false0, false0, false0}, // SE 3 (1,3)
920 { false0, true1, true1, true1, false0, false0, false0}, // SE 4 (1,3,5)
921 { false0, true1, true1, true1, false0, false0, false0}, // SE 5 (1,3,5)
922 { false0, true1, true1, true1, false0, true1, true1 }, // SE 6 (1,3,5,10,11)
923 { true1, false0, false0, false0, false0, false0, false0}, // SE 7 (0)
924 { false0, false0, false0, true1, false0, false0, false0}, // SE 8 (5)
925 { true1, true1, true1, true1, true1, true1, true1 }, // SE 9 (all)
926 { false0, true1, true1, true1, false0, false0, false0}, // SE 10 (1,3,5)
927 { false0, true1, true1, false0, false0, false0, false0}, // SE 11 (1,3)
928 { false0, true1, true1, true1, false0, true1, true1 }, // SE 12 (1,3,5,10,11)
929 { false0, true1, true1, true1, false0, false0, false0}, // SE 13 (1,3,5)
930 { false0, false0, false0, true1, false0, false0, false0}, // SE 14 (5)
931 { false0, false0, false0, true1, true1, false0, false0}, // SE 15 (5,6)
932 { false0, false0, false0, true1, false0, false0, false0}, // SE 16 (5)
933 { false0, false0, false0, true1, false0, false0, false0}, // SE 17 (5)
934 { false0, true1, true1, true1, false0, false0, false0}, // SE 18 (1,3,5)
935 { false0, true1, true1, false0, false0, false0, false0}, // SE 19 (1,3)
936 { true1, true1, true1, true1, true1, true1, true1 }, // SE 20 (0,1,3,5,10,11)
937 { false0, false0, false0, true1, true1, false0, false0}, // SE 21 (5,6)
938 { true1, true1, true1, true1, true1, true1, true1 }, // SE 22 (all)
939 { false0, true1, true1, true1, false0, false0, false0}, // SE 23 (1,3,5)
940 { false0, false0, false0, true1, false0, false0, false0}, // SE 24 (5)
941 { false0, false0, false0, true1, false0, false0, false0}, // SE 25 (5)
942 { false0, false0, false0, true1, false0, false0, false0}, // SE 26 (5)
943 { false0, false0, false0, true1, false0, false0, false0}, // SE 27 (5)
944 { false0, false0, false0, true1, false0, false0, false0}, // SE 28 (5)
945};
946
947static bool_Bool se_allowed_in_st(unsigned se, unsigned ct)
948{
949 if (se==0 || se>HIGHEST_EXTTYPE28) {
950 /* Don't know about new SE, so don't complain.. */
951 return true1;
952 }
953
954 switch (ct) {
955 case 1:
956 return ext_cts[se-1].ST1;
957 case 3:
958 return ext_cts[se-1].ST3;
959 case 5:
960 return ext_cts[se-1].ST5;
961 case 6:
962 return ext_cts[se-1].ST6;
963 case 10:
964 return ext_cts[se-1].ST10;
965 case 11:
966 return ext_cts[se-1].ST11;
967 default:
968 /* New/unknown section type that includes 'ef'.. assume ok */
969 return true1;
970 }
971}
972
973/************************************************************************************/
974
975/* Table 7.7.1.2-2 */
976static const value_string bfw_comp_headers_iq_width[] = {
977 {0, "I and Q are 16 bits wide"},
978 {1, "I and Q are 1 bit wide"},
979 {2, "I and Q are 2 bits wide"},
980 {3, "I and Q are 3 bits wide"},
981 {4, "I and Q are 4 bits wide"},
982 {5, "I and Q are 5 bits wide"},
983 {6, "I and Q are 6 bits wide"},
984 {7, "I and Q are 7 bits wide"},
985 {8, "I and Q are 8 bits wide"},
986 {9, "I and Q are 9 bits wide"},
987 {10, "I and Q are 10 bits wide"},
988 {11, "I and Q are 11 bits wide"},
989 {12, "I and Q are 12 bits wide"},
990 {13, "I and Q are 13 bits wide"},
991 {14, "I and Q are 14 bits wide"},
992 {15, "I and Q are 15 bits wide"},
993 {0, NULL((void*)0)}
994};
995
996/* Table 7.7.1.2-3 */
997static const value_string bfw_comp_headers_comp_meth[] = {
998 {COMP_NONE0, "no compression"},
999 {COMP_BLOCK_FP1, "block floating point"},
1000 {COMP_BLOCK_SCALE2, "block scaling"},
1001 {COMP_U_LAW3, "u-law"},
1002 {4, "beamspace compression type I"},
1003 {5, "beamspace compression type II"},
1004 {0, NULL((void*)0)}
1005};
1006
1007/* 7.7.6.2 rbgSize (resource block group size) */
1008static const value_string rbg_size_vals[] = {
1009 {0, "reserved"},
1010 {1, "1"},
1011 {2, "2"},
1012 {3, "3"},
1013 {4, "4"},
1014 {5, "6"},
1015 {6, "8"},
1016 {7, "16"},
1017 {0, NULL((void*)0)}
1018};
1019
1020/* 7.7.6.5 */
1021static const value_string priority_vals[] = {
1022 {0, "0"},
1023 {1, "+1"},
1024 {2, "-2 (reserved, should not be used)"},
1025 {3, "-1"},
1026 {0, NULL((void*)0)}
1027};
1028
1029/* 7.7.10.2 beamGroupType */
1030static const value_string beam_group_type_vals[] = {
1031 {0x0, "common beam"},
1032 {0x1, "beam matrix indication"},
1033 {0x2, "beam vector listing"},
1034 {0x3, "beamId/ueId listing with associated port-list index"},
1035 {0, NULL((void*)0)}
1036};
1037
1038/* 7.7.9.2 technology (interface name) */
1039static const value_string interface_name_vals[] = {
1040 {0x0, "LTE"},
1041 {0x1, "NR"},
1042 {0, NULL((void*)0)}
1043};
1044
1045/* 7.7.18.4 toT (type of transmission) */
1046static const value_string type_of_transmission_vals[] = {
1047 {0x0, "normal transmission mode, data can be distributed in any way the O-RU is implemented to transmit data"},
1048 {0x1, "uniformly distributed over the transmission window"},
1049 {0x2, "Reserved"},
1050 {0x3, "Reserved"},
1051 {0, NULL((void*)0)}
1052};
1053
1054/* 7.7.2.2 (width of bfa parameters) */
1055static const value_string bfa_bw_vals[] = {
1056 {0, "no bits, the field is not applicable (e.g., O-RU does not support it) or the default value shall be used"},
1057 {1, "2-bit bitwidth"},
1058 {2, "3-bit bitwidth"},
1059 {3, "4-bit bitwidth"},
1060 {4, "5-bit bitwidth"},
1061 {5, "6-bit bitwidth"},
1062 {6, "7-bit bitwidth"},
1063 {7, "8-bit bitwidth"},
1064 {0, NULL((void*)0)}
1065};
1066
1067/* 7.7.2.7 & 7.7.2.8 */
1068static const value_string sidelobe_suppression_vals[] = {
1069 {0, "10 dB"},
1070 {1, "15 dB"},
1071 {2, "20 dB"},
1072 {3, "25 dB"},
1073 {4, "30 dB"},
1074 {5, "35 dB"},
1075 {6, "40 dB"},
1076 {7, ">= 45 dB"},
1077 {0, NULL((void*)0)}
1078};
1079
1080static const value_string lbtTrafficClass_vals[] = {
1081 {1, "Priority 1"},
1082 {2, "Priority 2"},
1083 {3, "Priority 3"},
1084 {4, "Priority 4"},
1085 {0, NULL((void*)0)}
1086};
1087
1088/* 7.5.3.22 */
1089static const value_string lbtPdschRes_vals[] = {
1090 {0, "not sensing – indicates that the O-RU is transmitting data"},
1091 {1, "currently sensing – indicates the O-RU has not yet acquired the channel"},
1092 {2, "success – indicates that the channel was successfully acquired"},
1093 {3, "Failure – indicates expiration of the LBT timer. The LBT process should be reset"},
1094 {0, NULL((void*)0)}
1095};
1096
1097/* Table 7.5.2.15-3 */
1098static const value_string ci_comp_opt_vals[] = {
1099 {0, "compression per UE, one ciCompParam exists before the I/Q value of each UE"},
1100 {1, "compression per PRB, one ciCompParam exists before the I/Q value of each PRB"},
1101 {0, NULL((void*)0)}
1102};
1103
1104/* 7.5.2.17 */
1105static const range_string cmd_scope_vals[] = {
1106 {0, 0, "ARRAY-COMMAND"},
1107 {1, 1, "CARRIER-COMMAND"},
1108 {2, 2, "O-RU-COMMAND"},
1109 {3, 15, "reserved"},
1110 {0, 0, NULL((void*)0)}
1111};
1112
1113/* N.B., table in 7.5.3.38 is truncated.. */
1114static const range_string st4_cmd_type_vals[] = {
1115 {0, 0, "reserved for future command types"},
1116 {1, 1, "TIME_DOMAIN_BEAM_CONFIG"},
1117 {2, 2, "TDD_CONFIG_PATTERN"},
1118 {3, 3, "TRX_CONTROL"},
1119 {4, 4, "ASM"},
1120 {5, 255, "reserved for future command types"},
1121 {0, 0, NULL((void*)0)}
1122};
1123
1124/* Table 7.5.3.51-1 */
1125static const value_string log2maskbits_vals[] = {
1126 {0, "reserved"},
1127 {1, "min antMask size is 16 bits.."},
1128 {2, "min antMask size is 16 bits.."},
1129 {3, "min antMask size is 16 bits.."},
1130 {4, "16 bits"},
1131 {5, "32 bits"},
1132 {6, "64 bits"},
1133 {7, "128 bits"},
1134 {8, "256 bits"},
1135 {9, "512 bits"},
1136 {10, "1024 bits"},
1137 {11, "2048 bits"},
1138 {12, "4096 bits"},
1139 {13, "8192 bits"},
1140 {14, "16384 bits"},
1141 {15, "reserved"},
1142 {0, NULL((void*)0)}
1143};
1144
1145/* Table 16.1-1 Sleep modes */
1146static const value_string sleep_mode_trx_vals[] = {
1147 { 0, "TRXC-mode0-wake-up-duration (symbol)"},
1148 { 1, "TRXC-mode1-wake-up-duration (L)"},
1149 { 2, "TRXC-mode2-wake-up-duration (M)"},
1150 { 3, "TRXC-mode3-wake-up-duration (N)"},
1151 { 0, NULL((void*)0)}
1152};
1153
1154static const value_string sleep_mode_asm_vals[] = {
1155 { 0, "ASM-mode0-wake-up-duration (symbol)"},
1156 { 1, "ASM-mode1-wake-up-duration (L)"},
1157 { 2, "ASM-mode2-wake-up-duration (M)"},
1158 { 3, "ASM-mode3-wake-up-duration (N)"},
1159 { 0, NULL((void*)0)}
1160};
1161
1162/* 7.7.21.3.1 */
1163static const value_string prg_size_st5_vals[] = {
1164 { 0, "reserved"},
1165 { 1, "Precoding resource block group size as WIDEBAND"},
1166 { 2, "Precoding resource block group size 2"},
1167 { 3, "Precoding resource block group size 4"},
1168 { 0, NULL((void*)0)}
1169};
1170
1171/* 7.7.21.3.2 */
1172static const value_string prg_size_st6_vals[] = {
1173 { 0, "if ciPrbGroupSize is 2 or 4, then ciPrbGroupSize, else WIDEBAND"},
1174 { 1, "Precoding resource block group size as WIDEBAND"},
1175 { 2, "Precoding resource block group size 2"},
1176 { 3, "Precoding resource block group size 4"},
1177 { 0, NULL((void*)0)}
1178};
1179
1180/* 7.7.24.4 */
1181static const value_string alpn_per_sym_vals[] = {
1182 { 0, "report one allocated IPN value per all allocated symbols with DMRS"},
1183 { 1, "report one allocated IPN value per group of consecutive DMRS symbols"},
1184 { 0, NULL((void*)0)}
1185};
1186
1187/* 7.7.24.5 */
1188static const value_string ant_dmrs_snr_vals[] = {
1189 { 0, "O-RU shall not report the MEAS_ANT_DMRS_SNR"},
1190 { 1, "O-RU shall report the MEAS_ANT_DMRS_SNR"},
1191 { 0, NULL((void*)0)}
1192};
1193
1194/* 7.7.24.14 */
1195static const value_string dtype_vals[] = {
1196 { 0, "assume DMRS configuration type 1"},
1197 { 1, "assume DMRS configuration type 2"},
1198 { 0, NULL((void*)0)}
1199};
1200
1201/* 7.7.24.17 */
1202static const value_string papr_type_vals[] = {
1203 { 0, "sequence generator type 1 for short sequence lengths"},
1204 { 1, "sequence generator type 1 for long sequence lengths"},
1205 { 2, "sequence generator type 2 for short sequence lengths"},
1206 { 3, "sequence generator type 2 for long sequence lengths"},
1207 { 0, NULL((void*)0)}
1208};
1209
1210/* 7.7.24.18 */
1211static const value_string hopping_mode_vals[] = {
1212 { 0, "neither group, nor sequence hopping is enabled"},
1213 { 1, "group hopping is enabled and sequence hopping is disabled"},
1214 { 2, "sequence hopping is enabled and group hopping is disabled"},
1215 { 3, "reserved"},
1216 { 0, NULL((void*)0)}
1217};
1218
1219
1220static const true_false_string tfs_sfStatus =
1221{
1222 "subframe was transmitted",
1223 "subframe was dropped"
1224};
1225
1226static const true_false_string tfs_lbtBufErr =
1227{
1228 "buffer overflow – data received at O-RU is larger than the available buffer size",
1229 "reserved"
1230};
1231
1232static const true_false_string tfs_partial_full_sf = {
1233 "partial SF",
1234 "full SF"
1235};
1236
1237static const true_false_string disable_tdbfns_tfs = {
1238 "beam numbers excluded",
1239 "beam numbers included"
1240};
1241
1242static const true_false_string continuity_indication_tfs = {
1243 "continuity between current and next bundle",
1244 "discontinuity between current and next bundle"
1245};
1246
1247static const true_false_string prb_mode_tfs = {
1248 "PRB-BLOCK mode",
1249 "PRB-MASK mode"
1250};
1251
1252static const true_false_string symbol_direction_tfs = {
1253 "DL symbol",
1254 "UL symbol"
1255};
1256
1257static const true_false_string symbol_guard_tfs = {
1258 "guard symbol",
1259 "non-guard symbol"
1260};
1261
1262static const true_false_string beam_numbers_included_tfs = {
1263 "time-domain beam numbers excluded in this command",
1264 "time-domain beam numbers included in this command"
1265};
1266
1267static const true_false_string measurement_flag_tfs = {
1268 "at least one additional measurement report or command after the current one",
1269 "no additional measurement report or command"
1270};
1271
1272static const true_false_string repetition_se6_tfs = {
1273 "repeated highest priority data section in the C-Plane message",
1274 "no repetition"
1275};
1276
1277static const true_false_string repetition_se19_tfs = {
1278 "per port information not present in the extension",
1279 "per port info present in the extension"
1280};
1281
1282
1283
1284/* Forward declaration */
1285static int dissect_udcompparam(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, unsigned offset,
1286 unsigned comp_meth,
1287 uint32_t *exponent, uint16_t *sReSMask, bool_Bool for_sinr);
1288
1289
1290static const true_false_string ready_tfs = {
1291 "message is a \"ready\" message",
1292 "message is a ACK message"
1293};
1294
1295static const true_false_string multi_sd_scope_tfs = {
1296 "Puncturing pattern applies to current and following sections",
1297 "Puncturing pattern applies to current section"
1298};
1299
1300static const true_false_string tfs_ueid_reset = {
1301 "cannot assume same UE as in preceding slot",
1302 "can assume same UE as in preceding slot"
1303};
1304
1305
1306/* Config for (and later, worked-out allocations) bundles for ext11 (dynamic BFW) */
1307typedef struct {
1308 /* Ext 6 config */
1309 bool_Bool ext6_set;
1310 uint8_t ext6_rbg_size; /* number of PRBs allocated by bitmask */
1311
1312 uint8_t ext6_num_bits_set;
1313 uint8_t ext6_bits_set[28]; /* Which bit position this entry has */
1314 /* TODO: store an f value for each bit position? */
1315
1316 /* Ext 12 config */
1317 bool_Bool ext12_set;
1318 unsigned ext12_num_pairs;
1319#define MAX_BFW_EXT12_PAIRS128 128
1320 struct {
1321 uint8_t off_start_prb;
1322 uint8_t num_prb;
1323 } ext12_pairs[MAX_BFW_EXT12_PAIRS128];
1324
1325 /* Ext 13 config */
1326 bool_Bool ext13_set;
1327 unsigned ext13_num_start_prbs;
1328#define MAX_BFW_EXT13_ALLOCATIONS128 128
1329 unsigned ext13_start_prbs[MAX_BFW_EXT13_ALLOCATIONS128];
1330 /* TODO: store nextSymbolId here too? */
1331
1332 /* Ext 21 config */
1333 bool_Bool ext21_set;
1334 uint8_t ext21_ci_prb_group_size;
1335
1336 /* Results/settings (after calling ext11_work_out_bundles()) */
1337 uint32_t num_bundles;
1338#define MAX_BFW_BUNDLES512 512
1339 struct {
1340 uint32_t start; /* first prb of bundle */
1341 uint32_t end; /* last prb of bundle*/
1342 bool_Bool is_orphan; /* true if not complete (i.e., end-start < numBundPrb) */
1343 } bundles[MAX_BFW_BUNDLES512];
1344} ext11_settings_t;
1345
1346
1347/* Work out bundle allocation for ext 11. Take into account ext6/ext21, ext12 or ext13 in this section before ext 11. */
1348/* Won't be called with numBundPrb=0 */
1349static void ext11_work_out_bundles(unsigned startPrbc,
1350 unsigned numPrbc,
1351 unsigned numBundPrb, /* number of PRBs pre (full) bundle */
1352 ext11_settings_t *settings)
1353{
1354 /* Allocation configured by ext 6 */
1355 if (settings->ext6_set) {
1356 unsigned bundles_per_entry = (settings->ext6_rbg_size / numBundPrb);
1357
1358 /* Need to cope with these not dividing exactly, or even having more PRbs in a bundle that
1359 rbg size. i.e. each bundle gets the correct number of PRBs until
1360 all rbg entries are consumed... */
1361
1362 /* TODO: need to check 7.9.4.2. Different cases depending upon value of RAD */
1363
1364 if (bundles_per_entry == 0) {
1365 bundles_per_entry = 1;
1366 }
1367
1368 /* Maybe also be affected by ext 21 */
1369 if (settings->ext21_set) {
1370 /* N.B., have already checked that numPrbc is not 0 */
1371
1372 /* ciPrbGroupSize overrides number of contiguous PRBs in group */
1373 bundles_per_entry = (settings->ext6_rbg_size / settings->ext21_ci_prb_group_size);
1374
1375 /* numPrbc is the number of PRB groups per antenna - handled in call to dissect_bfw_bundle() */
1376 }
1377
1378 unsigned bundles_set = 0;
1379 for (unsigned n=0;
1380 n < (settings->ext6_num_bits_set * settings->ext6_rbg_size) / numBundPrb;
1381 n++) {
1382
1383 /* Watch out for array bound */
1384 if (n >= 28) {
1385 break;
1386 }
1387
1388 /* For each bundle... */
1389
1390 /* TODO: Work out where first PRB is */
1391 /* May not be the start of an rbg block... */
1392 uint32_t prb_start = (settings->ext6_bits_set[n] * settings->ext6_rbg_size);
1393
1394 /* For each bundle within identified rbgSize block */
1395 for (unsigned m=0; m < bundles_per_entry; m++) {
1396 settings->bundles[bundles_set].start = startPrbc+prb_start+(m*numBundPrb);
1397 /* Start already beyond end, so doesn't count. */
1398 if (settings->bundles[bundles_set].start > (startPrbc+numPrbc-1)) {
1399 break;
1400 }
1401 /* Bundle consists of numBundPrb bundles */
1402 /* TODO: may involve PRBs from >1 rbg blocks.. */
1403 settings->bundles[bundles_set].end = startPrbc+prb_start+((m+1)*numBundPrb)-1;
1404 if (settings->bundles[bundles_set].end > (startPrbc+numPrbc-1)) {
1405 /* Extends beyond end, so counts but is an orphan bundle */
1406 settings->bundles[bundles_set].end = numPrbc;
1407 settings->bundles[bundles_set].is_orphan = true1;
1408 }
1409
1410 /* Get out if have reached array bound */
1411 if (++bundles_set == MAX_BFW_BUNDLES512) {
1412 return;
1413 }
1414 }
1415 }
1416 settings->num_bundles = bundles_set;
1417 }
1418
1419 /* Allocation configured by ext 12 */
1420 else if (settings->ext12_set) {
1421 /* First, allocate normally from startPrbc, numPrbc */
1422 settings->num_bundles = (numPrbc+numBundPrb-1) / numBundPrb;
1423
1424 /* Don't overflow settings->bundles[] ! */
1425 settings->num_bundles = MIN(MAX_BFW_BUNDLES, settings->num_bundles)(((512) < (settings->num_bundles)) ? (512) : (settings->
num_bundles))
;
1426
1427 for (uint32_t n=0; n < settings->num_bundles; n++) {
1428 settings->bundles[n].start = startPrbc + n*numBundPrb;
1429 settings->bundles[n].end = settings->bundles[n].start + numBundPrb-1;
1430 /* Does it go beyond the end? */
1431 if (settings->bundles[n].end > startPrbc+numPrbc) {
1432 settings->bundles[n].end = numPrbc+numPrbc;
1433 settings->bundles[n].is_orphan = true1;
1434 }
1435 }
1436 if (settings->num_bundles == MAX_BFW_BUNDLES512) {
1437 return;
1438 }
1439
1440 unsigned prb_offset = startPrbc + numPrbc;
1441
1442 /* Loop over pairs, adding bundles for each */
1443 for (unsigned p=0; p < settings->ext12_num_pairs; p++) {
1444 prb_offset += settings->ext12_pairs[p].off_start_prb;
1445 unsigned pair_bundles = (settings->ext12_pairs[p].num_prb+numBundPrb-1) / numBundPrb;
1446
1447 for (uint32_t n=0; n < pair_bundles; n++) {
1448 unsigned idx = settings->num_bundles;
1449
1450 settings->bundles[idx].start = prb_offset + n*numBundPrb;
1451 settings->bundles[idx].end = settings->bundles[idx].start + numBundPrb-1;
1452 /* Does it go beyond the end? */
1453 if (settings->bundles[idx].end > prb_offset + settings->ext12_pairs[p].num_prb) {
1454 settings->bundles[idx].end = prb_offset + settings->ext12_pairs[p].num_prb;
1455 settings->bundles[idx].is_orphan = true1;
1456 }
1457 /* Range check / return */
1458 settings->num_bundles++;
1459 if (settings->num_bundles == MAX_BFW_BUNDLES512) {
1460 return;
1461 }
1462 }
1463
1464 prb_offset += settings->ext12_pairs[p].num_prb;
1465 }
1466 }
1467
1468 /* Allocation configured by ext 13 */
1469 else if (settings->ext13_set) {
1470 unsigned alloc_size = (numPrbc+numBundPrb-1) / numBundPrb;
1471 settings->num_bundles = alloc_size * settings->ext13_num_start_prbs;
1472
1473 /* Don't overflow settings->bundles[] ! */
1474 settings->num_bundles = MIN(MAX_BFW_BUNDLES, settings->num_bundles)(((512) < (settings->num_bundles)) ? (512) : (settings->
num_bundles))
;
1475
1476 for (unsigned alloc=0; alloc < settings->ext13_num_start_prbs; alloc++) {
1477 unsigned alloc_start = alloc * alloc_size;
1478 for (uint32_t n=0; n < alloc_size; n++) {
1479 if ((alloc_start+n) >= MAX_BFW_BUNDLES512) {
1480 /* ERROR */
1481 return;
1482 }
1483 settings->bundles[alloc_start+n].start = settings->ext13_start_prbs[alloc] + startPrbc + n*numBundPrb;
1484 settings->bundles[alloc_start+n].end = settings->bundles[alloc_start+n].start + numBundPrb-1;
1485 if (settings->bundles[alloc_start+n].end > settings->ext13_start_prbs[alloc] + numPrbc) {
1486 settings->bundles[alloc_start+n].end = settings->ext13_start_prbs[alloc] + numPrbc;
1487 settings->bundles[alloc_start+n].is_orphan = true1;
1488 }
1489 }
1490 }
1491 }
1492
1493 /* Case where bundles are not controlled by other extensions - just divide up range into bundles we have */
1494 else {
1495 settings->num_bundles = (numPrbc+numBundPrb-1) / numBundPrb; /* rounded up */
1496
1497 /* Don't overflow settings->bundles[] */
1498 settings->num_bundles = MIN(MAX_BFW_BUNDLES, settings->num_bundles)(((512) < (settings->num_bundles)) ? (512) : (settings->
num_bundles))
;
1499
1500 /* For each bundle.. */
1501 for (uint32_t n=0; n < settings->num_bundles; n++) {
1502 /* Allocate start and end */
1503 settings->bundles[n].start = startPrbc + n*numBundPrb;
1504 settings->bundles[n].end = settings->bundles[n].start + numBundPrb - 1;
1505 /* If would go beyond end of PRBs, limit and identify as orphan */
1506 if (settings->bundles[n].end > startPrbc+numPrbc) {
1507 settings->bundles[n].end = startPrbc+numPrbc;
1508 settings->bundles[n].is_orphan = true1;
1509 }
1510 }
1511 }
1512}
1513
1514
1515/*******************************************************/
1516/* Overall state of a flow (eAxC/plane) */
1517typedef struct {
1518 /* State for sequence analysis [each direction] */
1519 bool_Bool last_frame_seen[2];
1520 uint32_t last_frame[2];
1521 uint8_t next_expected_sequence_number[2];
1522
1523 /* Table recording ackNack requests (ackNackId -> ack_nack_request_t*)
1524 Note that this assumes that the same ackNackId will not be reused within a state,
1525 which may well not be valid */
1526 wmem_tree_t *ack_nack_requests;
1527
1528 /* Store udCompHdr seen in C-Plane for UL - can be looked up and used by U-PLane.
1529 Note that this appears in the common section header parts of ST1, ST3, ST5,
1530 so can still be over-written per sectionId in the U-Plane */
1531 unsigned ul_ud_comp_hdr_frame;
1532 bool_Bool ul_ud_comp_hdr_set;
1533 unsigned ul_ud_comp_hdr_bit_width;
1534 int ul_ud_comp_hdr_compression;
1535
1536 bool_Bool udcomphdrDownlink_heuristic_result_set;
1537 bool_Bool udcomphdrDownlink_heuristic_result;
1538 bool_Bool udcomphdrUplink_heuristic_result_set;
1539 bool_Bool udcomphdrUplink_heuristic_result;
1540
1541 /* Modulation compression params */
1542 /* TODO: incomplete (see SE4, SE5, SE23), and needs to be per section! */
1543 //uint16_t mod_comp_re_mask;
1544 //bool mod_compr_csf;
1545 //double mod_compr_mod_comp_scaler;
1546} flow_state_t;
1547
1548typedef struct {
1549 uint32_t request_frame_number;
1550 nstime_t request_frame_time;
1551 enum {
1552 SE22,
1553 ST4Cmd1,
1554 ST4Cmd2,
1555 ST4Cmd3,
1556 ST4Cmd4
1557 } requestType;
1558
1559 uint32_t response_frame_number;
1560 nstime_t response_frame_time;
1561} ack_nack_request_t;
1562
1563static const value_string acknack_type_vals[] = {
1564 { SE22, "SE 22" },
1565 { ST4Cmd1, "ST4 (TIME_DOMAIN_BEAM_CONFIG)" },
1566 { ST4Cmd2, "ST4 (TDD_CONFIG_PATTERN)" },
1567 { ST4Cmd3, "ST4 (TRX_CONTROL)" },
1568 { ST4Cmd4, "ST4 (ASM)" },
1569 { 0, NULL((void*)0)}
1570};
1571
1572#define ORAN_C_PLANE0 0
1573#define ORAN_U_PLANE1 1
1574
1575/* Using parts of src/dst MAC address, so don't confuse UL messages with DL messages configuring UL.. */
1576static uint32_t make_flow_key(packet_info *pinfo, uint16_t eaxc_id, uint8_t plane, bool_Bool opposite_dir)
1577{
1578 uint16_t eth_bits = 0;
1579 if (pinfo->dl_src.len == 6 && pinfo->dl_dst.len == 6) {
1580 /* Only using (most of) 2 bytes from addresses for now, but reluctant to make key longer.. */
1581 uint8_t *src_eth = (uint8_t*)pinfo->dl_src.data;
1582 uint8_t *dst_eth = (uint8_t*)pinfo->dl_dst.data;
1583 if (!opposite_dir) {
1584 eth_bits = (src_eth[0]<<8) | dst_eth[5];
1585 }
1586 else {
1587 eth_bits = (dst_eth[0]<<8) | src_eth[5];
1588 }
1589 }
1590 return eaxc_id | (plane << 16) | (eth_bits << 17);
1591}
1592
1593
1594/* Table maintained on first pass from flow_key(uint32_t) -> flow_state_t* */
1595static wmem_tree_t *flow_states_table;
1596
1597/* Table consulted on subsequent passes: frame_num -> flow_result_t* */
1598static wmem_tree_t *flow_results_table;
1599
1600typedef struct {
1601 /* Sequence analysis */
1602 bool_Bool unexpected_seq_number;
1603 uint8_t expected_sequence_number;
1604 uint32_t previous_frame;
1605} flow_result_t;
1606
1607
1608/* Uplink timing */
1609/* For a given symbol, track first to last UL frame to find out first-last time */
1610/* frameId (8) + subframeId (4) + slotId (6) + symbolId (6) = 24 bits */
1611/* N.B. if a capture lasts > 2.5s, may see same timing come around again... */
1612static uint32_t get_timing_key(uint8_t frameId, uint8_t subframeId, uint8_t slotId, uint8_t symbolId)
1613{
1614 return symbolId + (slotId<<8) + (subframeId<<14) + (frameId<<18);
1615}
1616
1617typedef struct {
1618 uint32_t first_frame;
1619 nstime_t first_frame_time;
1620 uint32_t frames_seen_in_symbol;
1621 uint32_t last_frame_in_symbol;
1622} ul_timing_for_slot;
1623
1624/* Set during first pass. timing_key -> ul_timing_for_slot* */
1625static wmem_tree_t *ul_symbol_timing;
1626
1627
1628static void show_link_to_acknack_response(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo,
1629 ack_nack_request_t *response);
1630
1631
1632
1633
1634static void write_pdu_label_and_info(proto_item *ti1, proto_item *ti2,
1635 packet_info *pinfo, const char *format, ...) G_GNUC_PRINTF(4, 5)__attribute__((__format__ (__printf__, 4, 5)));
1636
1637 /* Write the given formatted text to:
1638 - the info column (if pinfo != NULL)
1639 - 1 or 2 other labels (optional)
1640 */
1641static void write_pdu_label_and_info(proto_item *ti1, proto_item *ti2,
1642 packet_info *pinfo, const char *format, ...)
1643{
1644#define MAX_INFO_BUFFER256 256
1645 char info_buffer[MAX_INFO_BUFFER256];
1646 va_list ap;
1647
1648 if ((ti1 == NULL((void*)0)) && (ti2 == NULL((void*)0)) && (pinfo == NULL((void*)0))) {
1649 return;
1650 }
1651
1652 va_start(ap, format)__builtin_va_start(ap, format);
1653 vsnprintf(info_buffer, MAX_INFO_BUFFER256, format, ap);
1654 va_end(ap)__builtin_va_end(ap);
1655
1656 /* Add to indicated places */
1657 if (pinfo != NULL((void*)0)) {
1658 col_append_str(pinfo->cinfo, COL_INFO, info_buffer);
1659 }
1660 if (ti1 != NULL((void*)0)) {
1661 proto_item_append_text(ti1, "%s", info_buffer);
1662 }
1663 if (ti2 != NULL((void*)0)) {
1664 proto_item_append_text(ti2, "%s", info_buffer);
1665 }
1666}
1667
1668/* Add section labels (type + PRB range) for C-Plane, U-Plane */
1669static void
1670write_section_info(proto_item *section_heading, packet_info *pinfo, proto_item *protocol_item,
1671 uint32_t section_id, uint32_t start_prbx, uint32_t num_prbx, uint32_t rb)
1672{
1673 switch (num_prbx) {
1674 case 0:
1675 /* None -> all */
1676 write_pdu_label_and_info(section_heading, protocol_item, pinfo, ", Id: %4d (all PRBs)", section_id);
1677 break;
1678 case 1:
1679 /* Single PRB */
1680 write_pdu_label_and_info(section_heading, protocol_item, pinfo, ", Id: %4d (PRB: %7u)", section_id, start_prbx);
1681 break;
1682 default:
1683 /* Range */
1684 write_pdu_label_and_info(section_heading, protocol_item, pinfo, ", Id: %4d (PRB: %3u-%3u%s)", section_id, start_prbx,
1685 start_prbx + (num_prbx-1)*(1+rb), rb ? " (every-other)" : "");
1686 }
1687}
1688
1689static void
1690write_channel_section_info(proto_item *section_heading, packet_info *pinfo,
1691 uint32_t section_id, uint32_t ueId, uint32_t start_prbx, uint32_t num_prbx,
1692 uint32_t num_trx)
1693{
1694 switch (num_prbx) {
1695 case 0:
1696 /* TODO: ?? */
1697 break;
1698 case 1:
1699 /* Single PRB */
1700 write_pdu_label_and_info(section_heading, NULL((void*)0), pinfo,
1701 ", Id: %4d (UEId=%5u PRB %7u, %2u antennas)",
1702 section_id, ueId, start_prbx, num_trx);
1703 break;
1704 default:
1705 /* Range */
1706 write_pdu_label_and_info(section_heading, NULL((void*)0), pinfo,
1707 ", Id: %4d (UEId=%5u PRBs %3u-%3u, %2u antennas)",
1708 section_id, ueId, start_prbx, start_prbx+num_prbx-1, num_trx);
1709 }
1710}
1711
1712
1713/* 5.1.3.2.7 (real time control data / IQ data transfer message series identifier) */
1714static void
1715addPcOrRtcid(tvbuff_t *tvb, proto_tree *tree, int *offset, int hf, uint16_t *eAxC)
1716{
1717 /* Subtree */
1718 proto_item *oran_pcid_ti = proto_tree_add_item(tree, hf,
1719 tvb, *offset, 2, ENC_NA0x00000000);
1720 proto_tree *oran_pcid_tree = proto_item_add_subtree(oran_pcid_ti, ett_oran_ecpri_pcid);
1721
1722 uint64_t duPortId, bandSectorId, ccId, ruPortId = 0;
1723 int id_offset = *offset;
1724
1725 /* All parts of eAxC should be above 0, and should total 16 bits (breakdown controlled by preferences) */
1726 if (!((pref_du_port_id_bits > 0) && (pref_bandsector_id_bits > 0) && (pref_cc_id_bits > 0) && (pref_ru_port_id_bits > 0) &&
1727 ((pref_du_port_id_bits + pref_bandsector_id_bits + pref_cc_id_bits + pref_ru_port_id_bits) == 16))) {
1728 expert_add_info(NULL((void*)0), tree, &ei_oran_invalid_eaxc_bit_width);
1729 *eAxC = 0;
1730 *offset += 2;
1731 return;
1732 }
1733
1734 unsigned bit_offset = *offset * 8;
1735
1736 /* N.B. For sequence analysis / tapping, just interpret these 2 bytes as eAxC ID... */
1737 *eAxC = tvb_get_uint16(tvb, *offset, ENC_BIG_ENDIAN0x00000000);
1738
1739 /* DU Port ID */
1740 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);
1741 bit_offset += pref_du_port_id_bits;
1742 /* BandSector ID */
1743 proto_tree_add_bits_ret_val(oran_pcid_tree, hf_oran_bandsector_id, tvb, bit_offset, pref_bandsector_id_bits, &bandSectorId, ENC_BIG_ENDIAN0x00000000);
1744 bit_offset += pref_bandsector_id_bits;
1745 /* CC ID */
1746 proto_tree_add_bits_ret_val(oran_pcid_tree, hf_oran_cc_id, tvb, bit_offset, pref_cc_id_bits, &ccId, ENC_BIG_ENDIAN0x00000000);
1747 bit_offset += pref_cc_id_bits;
1748 /* RU Port ID */
1749 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);
1750 *offset += 2;
1751
1752 proto_item_append_text(oran_pcid_ti, " (DU_Port_ID: %d, BandSector_ID: %d, CC_ID: %d, RU_Port_ID: %d)",
1753 (int)duPortId, (int)bandSectorId, (int)ccId, (int)ruPortId);
1754 char id[16];
1755 snprintf(id, 16, "%x:%x:%x:%x", (int)duPortId, (int)bandSectorId, (int)ccId, (int)ruPortId);
1756 proto_item *pi = proto_tree_add_string(oran_pcid_tree, hf_oran_c_eAxC_ID, tvb, id_offset, 2, id);
1757 proto_item_set_generated(pi);
1758}
1759
1760/* 5.1.3.2.8 ecpriSeqid (message identifier) */
1761static int
1762addSeqid(tvbuff_t *tvb, proto_tree *oran_tree, int offset, int plane, uint8_t *seq_id, proto_item **seq_id_ti, packet_info *pinfo)
1763{
1764 /* Subtree */
1765 proto_item *seqIdItem = proto_tree_add_item(oran_tree, hf_oran_ecpri_seqid, tvb, offset, 2, ENC_NA0x00000000);
1766 proto_tree *oran_seqid_tree = proto_item_add_subtree(seqIdItem, ett_oran_ecpri_seqid);
1767 uint32_t seqId, subSeqId, e = 0;
1768
1769 /* Sequence ID (8 bits) */
1770 *seq_id_ti = proto_tree_add_item_ret_uint(oran_seqid_tree, hf_oran_sequence_id, tvb, offset, 1, ENC_NA0x00000000, &seqId);
1771 *seq_id = seqId;
1772 offset += 1;
1773
1774 /* Show link back to previous sequence ID, if set */
1775 flow_result_t *result = wmem_tree_lookup32(flow_results_table, pinfo->num);
1776 if (result) {
1777 proto_item *prev_ti = proto_tree_add_uint(oran_seqid_tree, hf_oran_previous_frame, tvb, 0, 0, result->previous_frame);
1778 proto_item_set_generated(prev_ti);
1779 }
1780
1781 /* E bit */
1782 proto_tree_add_item_ret_uint(oran_seqid_tree, hf_oran_e_bit, tvb, offset, 1, ENC_NA0x00000000, &e);
1783 /* Subsequence ID (7 bits) */
1784 proto_tree_add_item_ret_uint(oran_seqid_tree, hf_oran_subsequence_id, tvb, offset, 1, ENC_NA0x00000000, &subSeqId);
1785 offset += 1;
1786
1787 /* radio-transport fragmentation not allowed for C-Plane messages */
1788 if (plane == ORAN_C_PLANE0) {
1789 if (e !=1 || subSeqId != 0) {
1790 expert_add_info(NULL((void*)0), seqIdItem, &ei_oran_radio_fragmentation_c_plane);
1791 }
1792 }
1793 else {
1794 if (e !=1 || subSeqId != 0) {
1795 /* TODO: Re-assembly of any radio-fragmentation on U-Plane */
1796 expert_add_info(NULL((void*)0), seqIdItem, &ei_oran_radio_fragmentation_u_plane);
1797 }
1798 }
1799
1800 /* Summary */
1801 proto_item_append_text(seqIdItem, " (SeqId: %3d, E: %d, SubSeqId: %d)", seqId, e, subSeqId);
1802 return offset;
1803}
1804
1805static int dissect_symbolmask(tvbuff_t *tvb, proto_tree *tree, int offset, uint32_t *symbol_mask, proto_item **ti)
1806{
1807 uint64_t temp_val;
1808
1809 static int * const symbol_mask_flags[] = {
1810 &hf_oran_symbol_mask_s13,
1811 &hf_oran_symbol_mask_s12,
1812 &hf_oran_symbol_mask_s11,
1813 &hf_oran_symbol_mask_s10,
1814 &hf_oran_symbol_mask_s9,
1815 &hf_oran_symbol_mask_s8,
1816 &hf_oran_symbol_mask_s7,
1817 &hf_oran_symbol_mask_s6,
1818 &hf_oran_symbol_mask_s5,
1819 &hf_oran_symbol_mask_s4,
1820 &hf_oran_symbol_mask_s3,
1821 &hf_oran_symbol_mask_s2,
1822 &hf_oran_symbol_mask_s1,
1823 &hf_oran_symbol_mask_s0,
1824 NULL((void*)0)
1825 };
1826
1827 proto_item *temp_ti = proto_tree_add_bitmask_ret_uint64(tree, tvb, offset,
1828 hf_oran_symbol_mask,
1829 ett_oran_symbol_mask, symbol_mask_flags,
1830 ENC_BIG_ENDIAN0x00000000, &temp_val);
1831 /* Set out parameters */
1832 if (symbol_mask) {
1833 *symbol_mask = (uint32_t)temp_val;
1834 }
1835 if (ti) {
1836 *ti = temp_ti;
1837 }
1838 return offset+2;
1839}
1840
1841/* 7.7.1.2 bfwCompHdr (beamforming weight compression header) */
1842static int dissect_bfwCompHdr(tvbuff_t *tvb, proto_tree *tree, int offset,
1843 uint32_t *iq_width, uint32_t *comp_meth, proto_item **comp_meth_ti)
1844{
1845 /* Subtree */
1846 proto_item *bfwcomphdr_ti = proto_tree_add_string_format(tree, hf_oran_bfwCompHdr,
1847 tvb, offset, 1, "",
1848 "bfwCompHdr");
1849 proto_tree *bfwcomphdr_tree = proto_item_add_subtree(bfwcomphdr_ti, ett_oran_bfwcomphdr);
1850
1851 /* Width and method */
1852 proto_tree_add_item_ret_uint(bfwcomphdr_tree, hf_oran_bfwCompHdr_iqWidth,
1853 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, iq_width);
1854 /* Special case: 0 -> 16 */
1855 *iq_width = (*iq_width==0) ? 16 : *iq_width;
1856 *comp_meth_ti = proto_tree_add_item_ret_uint(bfwcomphdr_tree, hf_oran_bfwCompHdr_compMeth,
1857 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, comp_meth);
1858 offset++;
1859
1860 /* Summary */
1861 proto_item_append_text(bfwcomphdr_ti, " (IqWidth=%u, compMeth=%s)",
1862 *iq_width,
1863 val_to_str_const(*comp_meth, bfw_comp_headers_comp_meth, "reserved"));
1864
1865 return offset;
1866}
1867
1868/* Return offset */
1869/* Returning number of entries set - would be good to also return an array of set TRX# so could show which array element
1870 each BFW is actually for.. */
1871static int dissect_active_beamspace_coefficient_mask(tvbuff_t *tvb, proto_tree *tree, int offset, unsigned *num_trx_entries, uint16_t **trx_entries)
1872{
1873 /* activeBeamspaceCoefficientMask - ceil(K/8) octets */
1874 /* K is the number of elements in uncompressed beamforming weight vector.
1875 * Calculated from parameters describing tx-array or tx-array */
1876 unsigned k_octets = (pref_data_plane_section_total_rbs + 7) / 8;
1877
1878 static uint16_t trx_enabled[1024];
1879
1880 /* TODO: could use a bigger bitmask array, but for now just uses this bytes-worth for each byte */
1881 static int * const mask_bits[] = {
1882 &hf_oran_active_beamspace_coefficient_n1,
1883 &hf_oran_active_beamspace_coefficient_n2,
1884 &hf_oran_active_beamspace_coefficient_n3,
1885 &hf_oran_active_beamspace_coefficient_n4,
1886 &hf_oran_active_beamspace_coefficient_n5,
1887 &hf_oran_active_beamspace_coefficient_n6,
1888 &hf_oran_active_beamspace_coefficient_n7,
1889 &hf_oran_active_beamspace_coefficient_n8,
1890 NULL((void*)0)
1891 };
1892
1893 *num_trx_entries = 0;
1894 guint64 val;
1895 for (unsigned n=0; n < k_octets; n++) {
1896 proto_tree_add_bitmask_ret_uint64(tree, tvb, offset,
1897 hf_oran_activeBeamspaceCoefficientMask,
1898 ett_active_beamspace_coefficient_mask, mask_bits,
1899 ENC_BIG_ENDIAN0x00000000, &val);
1900 offset++;
1901 /* Add up the set bits for this byte (but be careful not to count beyond last real K bit..) */
1902 for (unsigned b=0; b < 8; b++) {
1903 if ((1 << b) & (unsigned)val) {
1904 if (((n*8)+b) < pref_data_plane_section_total_rbs) {
1905 if (*num_trx_entries < 1024-1) { /* Don't write beyond array (which should be plenty big) */
1906 trx_enabled[(*num_trx_entries)++] = (n*8) + b + 1;
1907 }
1908 }
1909 }
1910 }
1911 }
1912 /* Set pointer to static array */
1913 *trx_entries = trx_enabled;
1914
1915 /* Show how many bits set */
1916 proto_item *ti = proto_tree_add_uint(tree, hf_oran_activeBeamspaceCoefficientMask_bits_set, tvb,
1917 offset-k_octets, k_octets, *num_trx_entries);
1918 proto_item_set_generated(ti);
1919
1920 return offset;
1921}
1922
1923/* 7.7.1.3 bfwCompParam (beamforming weight compression parameter).
1924 * Depends upon passed-in bfwCompMeth (field may be empty) */
1925static int dissect_bfwCompParam(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, int offset,
1926 proto_item *meth_ti, uint32_t *bfw_comp_method,
1927 uint32_t *exponent, bool_Bool *supported, unsigned *num_trx_entries, uint16_t **trx_entries)
1928{
1929 if (*bfw_comp_method == COMP_NONE0) {
33
Assuming the condition is true
34
Taking true branch
1930 /* Absent! */
1931 *supported = true1;
1932 return offset;
35
Returning without writing to '*num_trx_entries'
1933 }
1934
1935 /* Subtree */
1936 proto_item *bfwcompparam_ti = proto_tree_add_string_format(tree, hf_oran_bfwCompParam,
1937 tvb, offset, 1, "",
1938 "bfwCompParam");
1939 proto_tree *bfwcompparam_tree = proto_item_add_subtree(bfwcompparam_ti, ett_oran_bfwcompparam);
1940
1941 proto_item_append_text(bfwcompparam_ti,
1942 " (meth=%s)", val_to_str_const(*bfw_comp_method, bfw_comp_headers_comp_meth, "reserved"));
1943
1944 *num_trx_entries = 0;
1945 *supported = false0;
1946 switch (*bfw_comp_method) {
1947 case COMP_BLOCK_FP1: /* block floating point */
1948 /* 4 reserved bits + exponent */
1949 proto_tree_add_item_ret_uint(bfwcompparam_tree, hf_oran_exponent,
1950 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, exponent);
1951 proto_item_append_text(bfwcompparam_ti, " exponent=%u", *exponent);
1952 *supported = true1;
1953 offset++;
1954 break;
1955 case COMP_BLOCK_SCALE2: /* block scaling */
1956 /* Separate into integer and fractional bits? */
1957 proto_tree_add_item(bfwcompparam_tree, hf_oran_blockScaler,
1958 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
1959 offset++;
1960 break;
1961 case COMP_U_LAW3: /* u-law */
1962 /* compBitWidth, compShift */
1963 proto_tree_add_item(bfwcompparam_tree, hf_oran_compBitWidth,
1964 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
1965 proto_tree_add_item(bfwcompparam_tree, hf_oran_compShift,
1966 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
1967 offset++;
1968 break;
1969 case 4: /* beamspace I (BLOCK SCALING) */
1970 /* activeBeamspaceCoefficientMask */
1971 offset = dissect_active_beamspace_coefficient_mask(tvb, bfwcompparam_tree, offset, num_trx_entries, trx_entries);
1972 *bfw_comp_method = COMP_BLOCK_SCALE2;
1973 *supported = false0; /* TODO: true once BLOCK SCALE is supported */
1974 break;
1975 case 5: /* beamspace II (BLOCK FLOATING POINT) */
1976 /* activeBeamspaceCoefficientMask */
1977 offset = dissect_active_beamspace_coefficient_mask(tvb, bfwcompparam_tree, offset, num_trx_entries, trx_entries);
1978 /* reserved (4 bits) + exponent (4 bits) */
1979 proto_tree_add_item(bfwcompparam_tree, hf_oran_reserved_4bits, tvb, offset, 1, ENC_NA0x00000000);
1980 proto_tree_add_item_ret_uint(bfwcompparam_tree, hf_oran_exponent, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, exponent);
1981 offset += 1;
1982 *bfw_comp_method = COMP_BLOCK_FP1;
1983 *supported = true1;
1984 break;
1985
1986 default:
1987 /* Not handled */
1988 break;
1989 }
1990
1991 /* Can't go on if compression scheme not supported */
1992 if (!(*supported) && meth_ti) {
1993 expert_add_info_format(pinfo, meth_ti, &ei_oran_unsupported_bfw_compression_method,
1994 "BFW Compression method %u (%s) not decompressed by dissector",
1995 *bfw_comp_method,
1996 val_to_str_const(*bfw_comp_method, bfw_comp_headers_comp_meth, "reserved"));
1997 }
1998 return offset;
1999}
2000
2001
2002/* Special case for uncompressed/16-bit value */
2003static float uncompressed_to_float(uint32_t h)
2004{
2005 int16_t i16 = h & 0x0000ffff;
2006 if (show_unscaled_values) {
2007 return (float)i16;
2008 }
2009 return ((float)i16) / 0x7fff;
2010}
2011
2012/* Decompress I/Q value, taking into account method, width, exponent, other input-specific methods */
2013/* TODO: pass in info needed for Modulation methods (reMask, csf, mcScaler values) gleaned from SE 4,5,23 */
2014static float decompress_value(uint32_t bits, uint32_t comp_method, uint8_t iq_width, uint32_t exponent)
2015{
2016 switch (comp_method) {
2017 case COMP_NONE0: /* no compression */
2018 return uncompressed_to_float(bits);
2019
2020 case COMP_BLOCK_FP1: /* block floating point */
2021 case BFP_AND_SELECTIVE_RE5:
2022 {
2023 /* A.1.3 Block Floating Point Decompression Algorithm */
2024 int32_t cPRB = bits;
2025 uint32_t scaler = 1 << exponent; /* i.e. 2^exponent */
2026
2027 /* Check last bit, in case we need to flip to -ve */
2028 if (cPRB >= (1<<(iq_width-1))) {
2029 cPRB -= (1<<iq_width);
2030 }
2031
2032 /* Unscale (8.1.3.1) */
2033 cPRB *= scaler;
2034 if (show_unscaled_values) {
2035 return (float)cPRB;
2036 }
2037
2038 uint32_t mantissa_scale_factor = 1 << (iq_width-1); /* 2^(mantissabits-1) */
2039 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 */
2040
2041 float ret = cPRB / ((float)(mantissa_scale_factor*exp_scale_factor));
2042 return ret;
2043 }
2044
2045 case COMP_BLOCK_SCALE2:
2046 case COMP_U_LAW3:
2047 /* Not supported! But will be reported as expert info outside of this function! */
2048 return 0.0;
2049
2050 case COMP_MODULATION4:
2051 case MOD_COMPR_AND_SELECTIVE_RE6:
2052 /* TODO: ! */
2053 return 0.0;
2054
2055
2056 default:
2057 /* Not supported! But will be reported as expert info outside of this function! */
2058 return 0.0;
2059 }
2060}
2061
2062/* Out-of-range value used for special case */
2063#define ORPHAN_BUNDLE_NUMBER999 999
2064
2065/* Bundle of PRBs/TRX I/Q samples (ext 11) */
2066static uint32_t dissect_bfw_bundle(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, unsigned offset,
2067 proto_item *comp_meth_ti, uint32_t bfwcomphdr_comp_meth,
2068 uint32_t num_weights_per_bundle,
2069 uint8_t iq_width,
2070 unsigned bundle_number,
2071 unsigned first_prb, unsigned last_prb, bool_Bool is_orphan)
2072{
2073 /* Set bundle name */
2074 char bundle_name[32];
2075 if (!is_orphan) {
2076 snprintf(bundle_name, 32, "Bundle %3u", bundle_number);
2077 }
2078 else {
2079 g_strlcpy(bundle_name, "Orphaned ", 32);
2080 }
2081
2082 /* Create Bundle root */
2083 proto_item *bundle_ti;
2084 if (first_prb != last_prb) {
2085 bundle_ti = proto_tree_add_string_format(tree, hf_oran_bfw_bundle,
2086 tvb, offset, 0, "",
2087 "%s: (PRBs %3u-%3u)",
2088 bundle_name,
2089 first_prb, last_prb);
2090 }
2091 else {
2092 bundle_ti = proto_tree_add_string_format(tree, hf_oran_bfw_bundle,
2093 tvb, offset, 0, "",
2094 "%s: (PRB %3u)",
2095 bundle_name,
2096 first_prb);
2097 }
2098 proto_tree *bundle_tree = proto_item_add_subtree(bundle_ti, ett_oran_bfw_bundle);
2099
2100 /* Generated bundle id */
2101 proto_item *bundleid_ti = proto_tree_add_uint(bundle_tree, hf_oran_bfw_bundle_id, tvb, 0, 0,
2102 bundle_number);
2103 proto_item_set_generated(bundleid_ti);
2104 proto_item_set_hidden(bundleid_ti);
2105
2106 /* bfwCompParam */
2107 bool_Bool compression_method_supported = false0;
2108 unsigned exponent = 0;
2109 unsigned num_trx_entries = 0;
2110 uint16_t *trx_entries;
2111 offset = dissect_bfwCompParam(tvb, bundle_tree, pinfo, offset, comp_meth_ti,
2112 &bfwcomphdr_comp_meth, &exponent, &compression_method_supported,
2113 &num_trx_entries, &trx_entries);
2114
2115 /* Can't show details of unsupported compression method */
2116 if (!compression_method_supported) {
2117 /* Don't know how to show, so give up */
2118 return offset;
2119 }
2120
2121 /* Create Bundle subtree */
2122 int bit_offset = offset*8;
2123 int bfw_offset;
2124 int prb_offset = offset;
2125
2126 /* contInd */
2127 proto_tree_add_item(bundle_tree, hf_oran_cont_ind,
2128 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
2129 /* beamId */
2130 uint32_t beam_id;
2131 proto_tree_add_item_ret_uint(bundle_tree, hf_oran_beam_id, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &beam_id);
2132 proto_item_append_text(bundle_ti, " (beamId:%u) ", beam_id);
2133 bit_offset += 16;
2134
2135 /* Number of weights per bundle (from preference) */
2136 proto_item *wpb_ti = proto_tree_add_uint(bundle_tree, hf_oran_num_weights_per_bundle, tvb, 0, 0,
2137 num_weights_per_bundle);
2138 proto_item_set_generated(wpb_ti);
2139
2140 /* Add the weights for this bundle. Overwrite with what was seen in bfwCompParam if beamspace */
2141 if (num_trx_entries != 0) {
2142 num_weights_per_bundle = num_trx_entries;
2143 }
2144
2145 for (unsigned w=0; w < num_weights_per_bundle; w++) {
2146
2147 uint16_t trx_index = (num_trx_entries) ? trx_entries[w] : w+1;
2148
2149 /* Create subtree */
2150 bfw_offset = bit_offset / 8;
2151 uint8_t bfw_extent = ((bit_offset + (iq_width*2)) / 8) - bfw_offset;
2152 proto_item *bfw_ti = proto_tree_add_string_format(bundle_tree, hf_oran_bfw,
2153 tvb, bfw_offset, bfw_extent,
2154 "", "TRX %3u: (", trx_index);
2155 proto_tree *bfw_tree = proto_item_add_subtree(bfw_ti, ett_oran_bfw);
2156
2157 /* I */
2158 /* Get bits, and convert to float. */
2159 uint32_t bits = tvb_get_bits32(tvb, bit_offset, iq_width, ENC_BIG_ENDIAN0x00000000);
2160 float value = decompress_value(bits, bfwcomphdr_comp_meth, iq_width, exponent);
2161 /* Add to tree. */
2162 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);
2163 bit_offset += iq_width;
2164 proto_item_append_text(bfw_ti, "I%u=%f ", w, value);
2165
2166 /* Q */
2167 /* Get bits, and convert to float. */
2168 bits = tvb_get_bits32(tvb, bit_offset, iq_width, ENC_BIG_ENDIAN0x00000000);
2169 value = decompress_value(bits, bfwcomphdr_comp_meth, iq_width, exponent);
2170 /* Add to tree. */
2171 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);
2172 bit_offset += iq_width;
2173 proto_item_append_text(bfw_ti, "Q%u=%f)", w, value);
2174 }
2175
2176 /* Set extent of bundle */
2177 proto_item_set_len(bundle_ti, (bit_offset+7)/8 - prb_offset);
2178
2179 return (bit_offset+7)/8;
2180}
2181
2182/* Return new bit offset. in/out will always be byte-aligned.. */
2183static int dissect_ciCompParam(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), unsigned bit_offset,
2184 unsigned comp_meth, uint8_t *exponent)
2185{
2186 if (comp_meth == COMP_NONE0) {
2187 /* Nothing in frame so don't even create subtree */
2188 return bit_offset;
2189 }
2190
2191 /* Subtree */
2192 proto_item *cicompparam_ti = proto_tree_add_string_format(tree, hf_oran_ciCompParam,
2193 tvb, bit_offset/8, 1, "",
2194 "ciCompParam");
2195 proto_tree *cicompparam_tree = proto_item_add_subtree(cicompparam_ti, ett_oran_cicompparam);
2196 uint32_t ci_exponent;
2197
2198 /* Contents differ by compression method */
2199 switch (comp_meth) {
2200 case COMP_BLOCK_FP1:
2201 proto_tree_add_item(cicompparam_tree, hf_oran_reserved_4bits, tvb, bit_offset/8, 1, ENC_NA0x00000000);
2202 proto_tree_add_item_ret_uint(cicompparam_tree, hf_oran_exponent,
2203 tvb, bit_offset/8, 1, ENC_BIG_ENDIAN0x00000000, &ci_exponent);
2204 *exponent = ci_exponent;
2205 proto_item_append_text(cicompparam_ti, " (Exponent=%u)", ci_exponent);
2206 bit_offset += 8; /* one byte */
2207 break;
2208 case COMP_BLOCK_SCALE2:
2209 /* Separate into integer (1) and fractional (7) bits? */
2210 proto_tree_add_item(cicompparam_tree, hf_oran_blockScaler,
2211 tvb, bit_offset/8, 1, ENC_BIG_ENDIAN0x00000000);
2212 bit_offset += 8;
2213 break;
2214 case COMP_U_LAW3:
2215 /* compBitWidth, compShift (4 bits each) */
2216 proto_tree_add_item(cicompparam_tree, hf_oran_compBitWidth,
2217 tvb, bit_offset/8, 1, ENC_BIG_ENDIAN0x00000000);
2218 proto_tree_add_item(cicompparam_tree, hf_oran_compShift,
2219 tvb, bit_offset/8, 1, ENC_BIG_ENDIAN0x00000000);
2220 bit_offset += 8;
2221 break;
2222
2223 default:
2224 /* reserved, ? bytes of zeros.. */
2225 break;
2226 }
2227
2228 return bit_offset;
2229}
2230
2231/* frameStructure (7.5.2.13) */
2232static unsigned dissect_frame_structure(proto_item *tree, tvbuff_t *tvb, unsigned offset,
2233 uint32_t subframeId, uint32_t slotId)
2234{
2235 uint32_t scs;
2236 /* FFT Size (4 bits) */
2237 proto_tree_add_item(tree, hf_oran_frameStructure_fft, tvb, offset, 1, ENC_NA0x00000000);
2238 /* Subcarrier spacing (SCS) */
2239 proto_tree_add_item_ret_uint(tree, hf_oran_frameStructure_subcarrier_spacing, tvb, offset, 1, ENC_NA0x00000000, &scs);
2240
2241 /* Show slot within frame as a generated field. See table 7.5.13-3 */
2242 uint32_t slots_per_subframe = 1;
2243 if (scs <= 4) {
2244 slots_per_subframe = 1 << scs;
2245 }
2246 if (scs <= 4 || scs >= 12) {
2247 proto_item *ti = proto_tree_add_uint(tree, hf_oran_slot_within_frame, tvb, 0, 0,
2248 (slots_per_subframe*subframeId) + slotId);
2249 proto_item_set_generated(ti);
2250 }
2251 return offset + 1;
2252}
2253
2254static unsigned dissect_csf(proto_item *tree, tvbuff_t *tvb, unsigned bit_offset,
2255 unsigned iq_width, bool_Bool *p_csf)
2256{
2257 proto_item *csf_ti;
2258 uint64_t csf;
2259 csf_ti = proto_tree_add_bits_ret_val(tree, hf_oran_csf, tvb, bit_offset, 1, &csf, ENC_BIG_ENDIAN0x00000000);
2260 if (csf) {
2261 /* Table 7.7.4.2-1 Constellation shift definition (index is udIqWidth) */
2262 const char* shift_value[] = { "n/a", "1/2", "1/4", "1/8", "1/16", "1/32" };
2263 if (iq_width >=1 && iq_width <= 5) {
2264 proto_item_append_text(csf_ti, " (Shift Value is %s)", shift_value[iq_width]);
2265 }
2266 }
2267
2268 /* Set out parameter */
2269 if (p_csf != NULL((void*)0)) {
2270 *p_csf = (csf!=0);
2271 }
2272 return bit_offset+1;
2273}
2274
2275
2276/* Section 7.
2277 * N.B. these are the green parts of the tables showing Section Types, differing by section Type */
2278static int dissect_oran_c_section(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo,
2279 flow_state_t* state,
2280 uint32_t sectionType, oran_tap_info *tap_info, proto_item *protocol_item,
2281 uint32_t subframeId, uint32_t slotId,
2282 uint8_t ci_iq_width, uint8_t ci_comp_meth, unsigned ci_comp_opt,
2283 unsigned num_sinr_per_prb)
2284{
2285 unsigned offset = 0;
2286 proto_tree *c_section_tree = NULL((void*)0);
2287 proto_item *sectionHeading = NULL((void*)0);
2288
2289 /* Section subtree */
2290 sectionHeading = proto_tree_add_string_format(tree, hf_oran_c_section,
2291 tvb, offset, 0, "", "Section");
2292 c_section_tree = proto_item_add_subtree(sectionHeading, ett_oran_c_section);
2293
2294 uint32_t sectionId = 0;
2295
2296 uint32_t startPrbc=0, startPrbu=0;
2297 uint32_t numPrbc=0, numPrbu=0;
2298 uint32_t ueId = 0;
2299 proto_item *ueId_ti = NULL((void*)0);
2300 uint32_t beamId = 0;
2301 proto_item *beamId_ti = NULL((void*)0);
2302 bool_Bool beamId_ignored = false0;
2303
2304 proto_item *numsymbol_ti = NULL((void*)0);
2305 bool_Bool numsymbol_ignored = false0;
2306
2307 proto_item *numprbc_ti = NULL((void*)0);
2308
2309 /* Config affecting ext11 bundles (initially unset) */
2310 ext11_settings_t ext11_settings;
2311 memset(&ext11_settings, 0, sizeof(ext11_settings));
2312
2313 /* Section Type 10 needs to keep track of PRB range that should be reported
2314 for msgTypeId=5 (Interference plus Noise for unallocated PRBs) */
2315 /* All PRBs start as false */
2316#define MAX_PRBS273 273
2317 bool_Bool prbs_for_st10_type5[MAX_PRBS273];
2318 memset(&prbs_for_st10_type5, 0, sizeof(prbs_for_st10_type5));
2319
2320
2321#define MAX_UEIDS16 16
2322 uint32_t ueids[MAX_UEIDS16];
2323 uint32_t number_of_ueids = 0;
2324
2325 bool_Bool extension_flag = false0;
2326
2327 /* These sections (ST0, ST1, ST2, ST3, ST5, ST9, ST10, ST11) are similar, so handle as common with per-type differences */
2328 if (((sectionType <= SEC_C_UE_SCHED) || (sectionType >= SEC_C_SINR_REPORTING)) &&
1
Assuming 'sectionType' is > SEC_C_UE_SCHED
2
Assuming 'sectionType' is < SEC_C_SINR_REPORTING
2329 (sectionType != SEC_C_SLOT_CONTROL)) {
2330
2331 /* sectionID */
2332 proto_item *ti = proto_tree_add_item_ret_uint(c_section_tree, hf_oran_section_id, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &sectionId);
2333 if (sectionId == 4095) {
2334 proto_item_append_text(ti, " (not default coupling C/U planes using sectionId)");
2335 }
2336 offset++;
2337
2338 if (tap_info->num_section_ids < MAX_SECTION_IDs32) {
2339 tap_info->section_ids[tap_info->num_section_ids++] = sectionId;
2340 }
2341
2342 /* rb */
2343 uint32_t rb;
2344 proto_tree_add_item_ret_uint(c_section_tree, hf_oran_rb, tvb, offset, 1, ENC_NA0x00000000, &rb);
2345 /* symInc (1 bit) */
2346 if (sectionType != SEC_C_RRM_MEAS_REPORTS && /* Section Type 10 */
2347 sectionType != SEC_C_REQUEST_RRM_MEAS) { /* Section Type 11 */
2348 unsigned int sym_inc;
2349 proto_item *sym_inc_ti = proto_tree_add_item_ret_uint(c_section_tree, hf_oran_symInc, tvb, offset, 1, ENC_NA0x00000000, &sym_inc);
2350 if (sym_inc !=0 && (sectionType == SEC_C_SINR_REPORTING)) { /* Section Type 9 */
2351 /* "0 shall be used" */
2352 proto_item_append_text(sym_inc_ti, " (should be 0)");
2353 }
2354 }
2355 else {
2356 /* reserved (1 bit) */
2357 proto_tree_add_item(c_section_tree, hf_oran_reserved_bit5, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
2358 }
2359
2360 /* startPrbx and numPrbx */
2361 if (sectionType == SEC_C_SINR_REPORTING) {
2362 /* startPrbu (10 bits) */
2363 proto_tree_add_item_ret_uint(c_section_tree, hf_oran_startPrbu, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &startPrbu);
2364 offset += 2;
2365 /* numPrbu */
2366 numprbc_ti = proto_tree_add_item_ret_uint(c_section_tree, hf_oran_numPrbu, tvb, offset, 1, ENC_NA0x00000000, &numPrbu);
2367 if (numPrbu == 0) {
2368 proto_item_append_text(numprbc_ti, " (all PRBs - configured as %u)", pref_data_plane_section_total_rbs);
2369 numPrbu = pref_data_plane_section_total_rbs;
2370 }
2371 offset += 1;
2372 }
2373 else {
2374 /* startPrbc (10 bits) */
2375 proto_tree_add_item_ret_uint(c_section_tree, hf_oran_startPrbc, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &startPrbc);
2376 offset += 2;
2377 /* numPrbc */
2378 numprbc_ti = proto_tree_add_item_ret_uint(c_section_tree, hf_oran_numPrbc, tvb, offset, 1, ENC_NA0x00000000, &numPrbc);
2379 if (numPrbc == 0) {
2380 proto_item_append_text(numprbc_ti, " (all PRBs - configured as %u)", pref_data_plane_section_total_rbs);
2381 /* TODO: should probably set to pref_data_plane_section_total_rbs, and define MAX_PRBS to > 273 ? */
2382 numPrbc = MAX_PRBS273;
2383 }
2384 offset += 1;
2385 }
2386
2387 /* Start with range from section. May get changed by SE6, SE12, SE20 */
2388 for (unsigned n=startPrbc; n < startPrbc+numPrbc; n++) {
2389 if (n < MAX_PRBS273) {
2390 prbs_for_st10_type5[n] = true1;
2391 }
2392 }
2393
2394 if (sectionType != SEC_C_SINR_REPORTING) { /* Section Type 9 */
2395 static int * const remask_flags[] = {
2396 &hf_oran_reMask_re1,
2397 &hf_oran_reMask_re2,
2398 &hf_oran_reMask_re3,
2399 &hf_oran_reMask_re4,
2400 &hf_oran_reMask_re5,
2401 &hf_oran_reMask_re6,
2402 &hf_oran_reMask_re7,
2403 &hf_oran_reMask_re8,
2404 &hf_oran_reMask_re9,
2405 &hf_oran_reMask_re10,
2406 &hf_oran_reMask_re11,
2407 &hf_oran_reMask_re12,
2408 NULL((void*)0)
2409 };
2410
2411 /* reMask */
2412 uint64_t remask;
2413 proto_tree_add_bitmask_ret_uint64(c_section_tree, tvb, offset,
2414 hf_oran_reMask, ett_oran_remask, remask_flags, ENC_BIG_ENDIAN0x00000000, &remask);
2415 offset++;
2416 /* numSymbol */
2417 /* TODO: should warn if startSymbol + numSymbol would be > 14? */
2418 uint32_t numSymbol;
2419 numsymbol_ti = proto_tree_add_item_ret_uint(c_section_tree, hf_oran_numSymbol, tvb, offset, 1, ENC_NA0x00000000, &numSymbol);
2420 if ((sectionType == SEC_C_RRM_MEAS_REPORTS) && (numSymbol != 14)) { /* Section type 10 */
2421 proto_item_append_text(numsymbol_ti, " (for ST10, should be 14!)");
2422 expert_add_info_format(pinfo, numsymbol_ti, &ei_oran_st10_numsymbol_not_14,
2423 "numSymbol should be 14 for ST10 - found %u", numSymbol);
2424 }
2425 offset++;
2426
2427 /* [ef] (extension flag) */
2428 switch (sectionType) {
2429 case SEC_C_UNUSED_RB: /* Section Type 0 */
2430 case SEC_C_NORMAL: /* Section Type 1 */
2431 case SEC_C_PRACH: /* Section Type 3 */
2432 case SEC_C_UE_SCHED: /* Section Type 5 */
2433 case SEC_C_RRM_MEAS_REPORTS: /* Section Type 10 */
2434 case SEC_C_REQUEST_RRM_MEAS: /* Section Type 11 */
2435 proto_tree_add_item_ret_boolean(c_section_tree, hf_oran_ef, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &extension_flag);
2436 break;
2437 default:
2438 /* Other section types don't support extensions */
2439 break;
2440 }
2441
2442 write_section_info(sectionHeading, pinfo, protocol_item, sectionId, startPrbc, numPrbc, rb);
2443 proto_item_append_text(sectionHeading, ", Symbols: %2u", numSymbol);
2444
2445 if (numPrbc == 0) {
2446 /* Special case for all PRBs */
2447 numPrbc = pref_data_plane_section_total_rbs;
2448 startPrbc = 0; /* may already be 0... */
2449 }
2450 }
2451 else {
2452 /* Section Type 9 */
2453 write_section_info(sectionHeading, pinfo, protocol_item, sectionId, startPrbu, numPrbu, rb);
2454 proto_item_append_text(sectionHeading, ", numSinrPerPrb: %2u", num_sinr_per_prb);
2455 }
2456
2457 /* Section type specific fields (after 'numSymbol') */
2458 switch (sectionType) {
2459 case SEC_C_UNUSED_RB: /* Section Type 0 - Table 7.4.2-1 */
2460 /* reserved (15 bits) */
2461 proto_tree_add_item(c_section_tree, hf_oran_reserved_15bits, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
2462 offset += 2;
2463 break;
2464
2465 case SEC_C_NORMAL: /* Section Type 1 - Table 7.4.3-1 */
2466 /* beamId */
2467 beamId_ti = proto_tree_add_item_ret_uint(c_section_tree, hf_oran_beamId, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &beamId);
2468 offset += 2;
2469
2470 proto_item_append_text(sectionHeading, ", BeamId: %d", beamId);
2471 break;
2472
2473 case SEC_C_PRACH: /* Section Type 3 - Table 7.4.5-1 */
2474 {
2475 /* beamId */
2476 beamId_ti = proto_tree_add_item_ret_uint(c_section_tree, hf_oran_beamId, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &beamId);
2477 offset += 2;
2478
2479 /* freqOffset */
2480 int32_t freqOffset; /* Yes, this is signed, so the implicit cast is intentional. */
2481 proto_item *freq_offset_item = proto_tree_add_item_ret_uint(c_section_tree, hf_oran_freqOffset, tvb, offset, 3, ENC_BIG_ENDIAN0x00000000, &freqOffset);
2482 freqOffset |= 0xff000000; /* Must sign-extend */
2483 proto_item_set_text(freq_offset_item, "Frequency offset: %d \u0394f", freqOffset);
2484 offset += 3;
2485
2486 /* reserved */
2487 proto_tree_add_item(c_section_tree, hf_oran_reserved_8bits, tvb, offset, 1, ENC_NA0x00000000);
2488 offset += 1;
2489
2490 proto_item_append_text(sectionHeading, ", BeamId: %d, FreqOffset: %d \u0394f", beamId, freqOffset);
2491 break;
2492 }
2493
2494 case SEC_C_UE_SCHED: /* Section Type 5 - Table 7.4.7-1 */
2495 case SEC_C_RRM_MEAS_REPORTS: /* Section Type 10 - Table 7.4.12-1 */
2496 /* ueId */
2497 ueId_ti = proto_tree_add_item_ret_uint(c_section_tree, hf_oran_ueId, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &ueId);
2498 offset += 2;
2499 if (ueId == 0x7fff) {
2500 proto_item_append_text(ueId_ti, " (PRBs not scheduled for eAxC ID in transport header)");
2501 }
2502 else {
2503 ueids[number_of_ueids++] = ueId;
2504 }
2505
2506 proto_item_append_text(sectionHeading, ", UEId: %d", ueId);
2507 break;
2508
2509 case SEC_C_SINR_REPORTING: /* Section Type 9 - SINR Reporting */
2510 {
2511 /* Hidden filter for bf (DMFS-BF) */
2512 proto_item *bf_ti = proto_tree_add_item(tree, hf_oran_bf, tvb, 0, 0, ENC_NA0x00000000);
2513 PROTO_ITEM_SET_HIDDEN(bf_ti)proto_item_set_hidden((bf_ti));
2514
2515 unsigned bit_offset = offset*8;
2516
2517 /* sinr iqWidth */
2518 proto_item *iq_width_item = proto_tree_add_uint(c_section_tree, hf_oran_sinrCompHdrIqWidth_pref, tvb, 0, 0, pref_sample_bit_width_sinr);
2519 proto_item_append_text(iq_width_item, " (from preferences)");
2520 proto_item_set_generated(iq_width_item);
2521
2522 /* sinr compMethod */
2523 proto_item *sinr_comp_meth_item = proto_tree_add_uint(c_section_tree, hf_oran_sinrCompHdrMeth_pref, tvb, 0, 0, pref_iqCompressionSINR);
2524 proto_item_append_text(sinr_comp_meth_item, " (from preferences)");
2525 proto_item_set_generated(sinr_comp_meth_item);
2526
2527 /* Add SINR entries for each PRB */
2528 for (unsigned prb=0; prb < numPrbu; prb++) {
2529 /* TODO: create a subtree for each PRB entry with good summary? */
2530
2531 /* Each prb starts byte-aligned */
2532 bit_offset = ((bit_offset+7)/8) * 8;
2533
2534 /* N.B., using width/method from UL U-plane preferences, not certain that this is correct.. */
2535
2536 /* sinrCompParam (udCompParam format, may be empty) */
2537 uint32_t exponent = 0; /* N.B. init to silence warnings, but will always be set if read in COMP_BLOCK_FP case */
2538 uint16_t sReSMask;
2539 bit_offset = dissect_udcompparam(tvb, pinfo, c_section_tree, bit_offset/8,
2540 pref_iqCompressionSINR, &exponent, &sReSMask,
2541 true1) * 8; /* last param is for_sinr */
2542
2543 /* sinrValues for this PRB. */
2544 /* TODO: not sure how numSinrPerPrb interacts with rb==1... */
2545 for (unsigned n=0; n < num_sinr_per_prb; n++) {
2546 unsigned sinr_bits = tvb_get_bits32(tvb, bit_offset, pref_sample_bit_width_sinr, ENC_BIG_ENDIAN0x00000000);
2547
2548 /* Using SINR compression settings from preferences */
2549 float value = decompress_value(sinr_bits,
2550 pref_iqCompressionSINR, pref_sample_bit_width_sinr,
2551 exponent);
2552 unsigned sample_len_in_bytes = ((bit_offset%8)+pref_sample_bit_width_sinr+7)/8;
2553 proto_item *val_ti = proto_tree_add_float(c_section_tree, hf_oran_sinr_value, tvb,
2554 bit_offset/8, sample_len_in_bytes, value);
2555
2556 /* Show here which subcarriers share which values (they all divide 12..) */
2557 if (num_sinr_per_prb == 12) {
2558 proto_item_append_text(val_ti, " (PRB=%u, subcarrier %u)",
2559 startPrbu+(prb*(rb+1)),
2560 n*(12/num_sinr_per_prb));
2561 }
2562 else {
2563 proto_item_append_text(val_ti, " (PRB=%u, subcarriers %u-%u)",
2564 startPrbu+(prb*(rb+1)),
2565 n*(12/num_sinr_per_prb), (n+1)*(12/num_sinr_per_prb)-1);
2566 }
2567 bit_offset += pref_sample_bit_width_sinr;
2568 }
2569
2570 /* 1-byte alignment per PRB (7.2.11) */
2571 offset = (bit_offset+7)/8;
2572 bit_offset = offset*8;
2573 }
2574 break;
2575 }
2576 case SEC_C_REQUEST_RRM_MEAS: /* Section Type 11 - Request RRM Measurements */
2577 /* Reserved (15 bits) */
2578 proto_tree_add_item(c_section_tree, hf_oran_reserved_15bits, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
2579 offset += 2;
2580 break;
2581
2582 default:
2583 break;
2584 }
2585 }
2586 else if (sectionType == SEC_C_CH_INFO) { /* Section Type 6 */
3
Assuming 'sectionType' is equal to SEC_C_CH_INFO
4
Taking true branch
2587 /* ef */
2588 proto_tree_add_item_ret_boolean(c_section_tree, hf_oran_ef, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &extension_flag);
2589 /* ueId */
2590 proto_tree_add_item_ret_uint(c_section_tree, hf_oran_ueId, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &ueId);
2591 offset += 2;
2592 /* regularizationFactor */
2593 proto_tree_add_item(c_section_tree, hf_oran_regularizationFactor, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
2594 offset += 2;
2595 /* reserved (4 bits) */
2596 proto_tree_add_item(c_section_tree, hf_oran_reserved_4bits, tvb, offset, 1, ENC_NA0x00000000);
2597 /* rb ("Value=0 shall be set") */
2598 uint32_t rb;
2599 proto_item *rb_ti = proto_tree_add_item_ret_uint(c_section_tree, hf_oran_rb, tvb, offset, 1, ENC_NA0x00000000, &rb);
2600 if (rb != 0) {
5
Assuming 'rb' is equal to 0
6
Taking false branch
2601 proto_item_append_text(rb_ti, " (should be set to 0)");
2602 expert_add_info(pinfo, rb_ti, &ei_oran_st6_rb_shall_be_0);
2603 }
2604 /* symInc */
2605 proto_tree_add_item(c_section_tree, hf_oran_symInc, tvb, offset, 1, ENC_NA0x00000000);
2606 /* startPrbc */
2607 proto_tree_add_item_ret_uint(c_section_tree, hf_oran_startPrbc, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &startPrbc);
2608 offset += 2;
2609 /* numPrbc */
2610 proto_tree_add_item_ret_uint(c_section_tree, hf_oran_numPrbc, tvb, offset, 1, ENC_NA0x00000000, &numPrbc);
2611 offset += 1;
2612
2613 /* Hidden filter for bf */
2614 proto_item *bf_ti = proto_tree_add_item(tree, hf_oran_bf, tvb, 0, 0, ENC_NA0x00000000);
2615 PROTO_ITEM_SET_HIDDEN(bf_ti)proto_item_set_hidden((bf_ti));
2616
2617 /* ciIsample,ciQsample pairs */
2618 unsigned m;
2619 unsigned prb;
2620 uint32_t bit_offset = offset*8;
2621
2622 /* Antenna count from preference */
2623 unsigned num_trx = pref_num_bf_antennas;
2624
2625 write_channel_section_info(sectionHeading, pinfo,
2626 sectionId, ueId, startPrbc, numPrbc, num_trx);
2627
2628 bool_Bool first_prb = true1;
2629 uint8_t exponent = 0;
2630 for (prb=startPrbc; prb < startPrbc+numPrbc; prb++) {
7
Assuming the condition is false
8
Loop condition is false. Execution continues on line 2681
2631
2632 /* PRB subtree */
2633 unsigned prb_start_offset = bit_offset;
2634 proto_item *prb_ti = proto_tree_add_string_format(c_section_tree, hf_oran_samples_prb,
2635 tvb, bit_offset/8, 0,
2636 "", "PRB=%u", prb);
2637 proto_tree *prb_tree = proto_item_add_subtree(prb_ti, ett_oran_prb_cisamples);
2638
2639 /* There may be a ciCompParam here.. */
2640 if (first_prb || ci_comp_opt==1) {
2641 bit_offset = dissect_ciCompParam(tvb, prb_tree, pinfo, bit_offset, ci_comp_meth, &exponent);
2642 }
2643 first_prb = false0;
2644
2645 /* Antennas */
2646 for (m=0; m < num_trx; m++) {
2647
2648 unsigned sample_offset = bit_offset / 8;
2649 uint8_t sample_extent = ((bit_offset + (ci_iq_width*2)) / 8) - sample_offset;
2650
2651 /* Create subtree for antenna */
2652 proto_item *sample_ti = proto_tree_add_string_format(prb_tree, hf_oran_ciSample,
2653 tvb, sample_offset, sample_extent,
2654 "", "TRX=%2u: ", m);
2655 proto_tree *sample_tree = proto_item_add_subtree(sample_ti, ett_oran_cisample);
2656
2657 /* I */
2658 /* Get bits, and convert to float. */
2659 uint32_t bits = tvb_get_bits32(tvb, bit_offset, ci_iq_width, ENC_BIG_ENDIAN0x00000000);
2660 float value = decompress_value(bits, ci_comp_meth, ci_iq_width, exponent);
2661
2662 /* Add to tree. */
2663 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);
2664 bit_offset += ci_iq_width;
2665 proto_item_append_text(sample_ti, "I%u=%f ", m, value);
2666
2667 /* Q */
2668 /* Get bits, and convert to float. */
2669 bits = tvb_get_bits32(tvb, bit_offset, ci_iq_width, ENC_BIG_ENDIAN0x00000000);
2670 value = decompress_value(bits, ci_comp_meth, ci_iq_width, exponent);
2671
2672 /* Add to tree. */
2673 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);
2674 bit_offset += ci_iq_width;
2675 proto_item_append_text(sample_ti, "Q%u=%f ", m, value);
2676 }
2677 proto_item_set_len(prb_ti, (bit_offset-prb_start_offset+7)/8);
2678 }
2679
2680 /* Pad out by 1 or 4 bytes, according to preference */
2681 if (!st6_4byte_alignment) {
9
Assuming 'st6_4byte_alignment' is true
10
Taking false branch
2682 offset = (bit_offset + 7) / 8;
2683 }
2684 else {
2685 int mode = bit_offset % 32;
2686 if (mode
10.1
'mode' is not equal to 0
!= 0) {
11
Taking true branch
2687 offset = (bit_offset + (32-mode))/8;
2688 }
2689 else {
2690 offset = bit_offset/8;
2691 }
2692 }
2693 proto_item_set_end(c_section_tree, tvb, offset);
2694 }
2695
2696 bool_Bool seen_se10 = false0;
2697 uint32_t numPortc = 0;
2698 proto_item *bf_ti = NULL((void*)0);
2699
2700 /* Section extension commands */
2701 while (extension_flag) {
12
Loop condition is true. Entering loop body
2702 int extension_start_offset = offset;
2703
2704 /* Prefetch extType so can use specific extension type ett */
2705 uint32_t exttype = tvb_get_uint8(tvb, offset) & 0x7f;
2706 uint32_t exttype_ett_index = exttype;
2707 if (exttype == 0 || exttype > HIGHEST_EXTTYPE28) {
13
Assuming 'exttype' is not equal to 0
14
Assuming 'exttype' is <= HIGHEST_EXTTYPE
15
Taking false branch
2708 /* Just use first one if out of range */
2709 exttype_ett_index = 1;
2710 }
2711
2712 /* Create subtree for each extension (with summary) */
2713 proto_item *extension_ti = proto_tree_add_string_format(c_section_tree, hf_oran_extension,
2714 tvb, offset, 0, "", "Extension");
2715 proto_tree *extension_tree = proto_item_add_subtree(extension_ti, ett_oran_c_section_extension[exttype_ett_index-1]);
2716
2717 /* ef (i.e. another extension after this one?) */
2718 proto_tree_add_item_ret_boolean(extension_tree, hf_oran_ef, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &extension_flag);
2719
2720 /* extType */
2721 proto_item *exttype_ti;
2722 exttype_ti = proto_tree_add_item(extension_tree, hf_oran_exttype, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
2723 offset++;
2724 proto_item_append_text(sectionHeading, " (ext-%u)", exttype);
2725
2726 proto_item_append_text(extension_ti, " (ext-%u: %s)", exttype, val_to_str_const(exttype, exttype_vals, "Reserved"));
2727
2728 /* Don't tap if out of range. */
2729 if (exttype
15.1
'exttype' is > 0
> 0 && exttype
15.2
'exttype' is <= HIGHEST_EXTTYPE
<= HIGHEST_EXTTYPE28) {
16
Taking true branch
2730 tap_info->extensions[exttype] = true1;
2731 }
2732
2733 /* Is this SE allowed for this section type? */
2734 if (!se_allowed_in_st(exttype, sectionType)) {
17
Assuming the condition is false
2735 expert_add_info_format(pinfo, extension_tree, &ei_oran_se_on_unsupported_st,
2736 "SE %u (%s) should not appear in ST %u (%s)!",
2737 exttype, val_to_str_const(exttype, exttype_vals, "Reserved"),
2738 sectionType, rval_to_str_const(sectionType, section_types, "Unknown"));
2739 }
2740
2741
2742 /* extLen (number of 32-bit words) */
2743 uint32_t extlen_len = ((exttype==11)||(exttype==19)||(exttype==20)) ? 2 : 1; /* Extensions 11/19/20 are special */
18
Assuming 'exttype' is not equal to 11
19
Assuming 'exttype' is equal to 19
2744 uint32_t extlen;
2745 proto_item *extlen_ti = proto_tree_add_item_ret_uint(extension_tree, hf_oran_extlen, tvb,
2746 offset, extlen_len, ENC_BIG_ENDIAN0x00000000, &extlen);
2747 proto_item_append_text(extlen_ti, " (%u bytes)", extlen*4);
2748 offset += extlen_len;
2749 if (extlen == 0) {
20
Assuming 'extlen' is not equal to 0
21
Taking false branch
2750 expert_add_info_format(pinfo, extlen_ti, &ei_oran_extlen_zero,
2751 "extlen value of 0 is reserved");
2752 /* Break out to avoid infinitely looping! */
2753 break;
2754 }
2755
2756 bool_Bool ext_unhandled = false0;
2757
2758 switch (exttype) {
22
Control jumps to 'case 19:' at line 3694
2759
2760 case 1: /* SE 1: Beamforming Weights */
2761 {
2762 uint32_t bfwcomphdr_iq_width, bfwcomphdr_comp_meth;
2763 proto_item *comp_meth_ti = NULL((void*)0);
2764
2765 /* Hidden filter for bf */
2766 bf_ti = proto_tree_add_item(tree, hf_oran_bf, tvb, 0, 0, ENC_NA0x00000000);
2767 PROTO_ITEM_SET_HIDDEN(bf_ti)proto_item_set_hidden((bf_ti));
2768
2769 /* bfwCompHdr (2 subheaders - bfwIqWidth and bfwCompMeth)*/
2770 offset = dissect_bfwCompHdr(tvb, extension_tree, offset,
2771 &bfwcomphdr_iq_width, &bfwcomphdr_comp_meth, &comp_meth_ti);
2772
2773 /* bfwCompParam */
2774 uint32_t exponent = 0;
2775 bool_Bool compression_method_supported = false0;
2776 unsigned num_trx = 0;
2777 uint16_t *trx; /* ptr to array */
2778 offset = dissect_bfwCompParam(tvb, extension_tree, pinfo, offset, comp_meth_ti,
2779 &bfwcomphdr_comp_meth, &exponent, &compression_method_supported,
2780 &num_trx, &trx);
2781
2782 /* Can't show details of unsupported compression method */
2783 if (!compression_method_supported) {
2784 break;
2785 }
2786
2787 /* We know:
2788 - iq_width (above)
2789 - numBfWeights (taken from preference)
2790 - remaining bytes in extension
2791 We can therefore derive TRX (number of antennas).
2792 */
2793
2794 bool_Bool using_array = false0;
2795
2796 /* I & Q samples
2797 May know how many entries from activeBeamspaceCoefficientMask. */
2798 if (num_trx == 0) {
2799 /* Don't know how many there will be, so just fill available bytes... */
2800 unsigned weights_bytes = (extlen*4)-3;
2801 unsigned num_weights_pairs = (weights_bytes*8) / (bfwcomphdr_iq_width*2);
2802 num_trx = num_weights_pairs;
2803 }
2804 else {
2805 using_array = true1;
2806 num_trx = pref_num_bf_antennas;
2807 }
2808
2809 int bit_offset = offset*8;
2810
2811 for (unsigned n=0; n < num_trx; n++) {
2812 /* Create antenna subtree */
2813 int bfw_offset = bit_offset / 8;
2814
2815 uint16_t trx_index = (using_array) ? trx[n] : n+1;
2816
2817 proto_item *bfw_ti = proto_tree_add_string_format(extension_tree, hf_oran_bfw,
2818 tvb, bfw_offset, 0, "", "TRX %3u: (", trx_index);
2819 proto_tree *bfw_tree = proto_item_add_subtree(bfw_ti, ett_oran_bfw);
2820
2821 /* I value */
2822 /* Get bits, and convert to float. */
2823 uint32_t bits = tvb_get_bits32(tvb, bit_offset, bfwcomphdr_iq_width, ENC_BIG_ENDIAN0x00000000);
2824 float value = decompress_value(bits, bfwcomphdr_comp_meth, bfwcomphdr_iq_width, exponent);
2825 /* Add to tree. */
2826 proto_tree_add_float(bfw_tree, hf_oran_bfw_i, tvb, bit_offset/8,
2827 (bfwcomphdr_iq_width+7)/8, value);
2828 bit_offset += bfwcomphdr_iq_width;
2829 proto_item_append_text(bfw_ti, "I=%f ", value);
2830
2831 /* Leave a gap between I and Q values */
2832 proto_item_append_text(bfw_ti, " ");
2833
2834 /* Q value */
2835 /* Get bits, and convert to float. */
2836 bits = tvb_get_bits32(tvb, bit_offset, bfwcomphdr_iq_width, ENC_BIG_ENDIAN0x00000000);
2837 value = decompress_value(bits, bfwcomphdr_comp_meth, bfwcomphdr_iq_width, exponent);
2838 /* Add to tree. */
2839 proto_tree_add_float(bfw_tree, hf_oran_bfw_q, tvb, bit_offset/8,
2840 (bfwcomphdr_iq_width+7)/8, value);
2841 bit_offset += bfwcomphdr_iq_width;
2842 proto_item_append_text(bfw_ti, "Q=%f", value);
2843
2844 proto_item_append_text(bfw_ti, ")");
2845 proto_item_set_len(bfw_ti, (bit_offset+7)/8 - bfw_offset);
2846 }
2847 /* Need to round to next byte */
2848 offset = (bit_offset+7)/8;
2849
2850 break;
2851 }
2852
2853 case 2: /* SE 2: Beamforming attributes */
2854 {
2855 /* Hidden filter for bf */
2856 bf_ti = proto_tree_add_item(tree, hf_oran_bf, tvb, 0, 0, ENC_NA0x00000000);
2857 PROTO_ITEM_SET_HIDDEN(bf_ti)proto_item_set_hidden((bf_ti));
2858
2859 /* bfaCompHdr (get widths of fields to follow) */
2860 uint32_t bfAzPtWidth, bfZePtWidth, bfAz3ddWidth, bfZe3ddWidth;
2861 /* subtree */
2862 proto_item *bfa_ti = proto_tree_add_string_format(extension_tree, hf_oran_bfaCompHdr,
2863 tvb, offset, 2, "", "bfaCompHdr");
2864 proto_tree *bfa_tree = proto_item_add_subtree(bfa_ti, ett_oran_bfacomphdr);
2865
2866 /* reserved (2 bits) */
2867 proto_tree_add_item(bfa_tree, hf_oran_reserved_2bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
2868 /* bfAzPtWidth (3 bits) */
2869 proto_tree_add_item_ret_uint(bfa_tree, hf_oran_bfAzPtWidth, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &bfAzPtWidth);
2870 /* bfZePtWidth (3 bits) */
2871 proto_tree_add_item_ret_uint(bfa_tree, hf_oran_bfZePtWidth, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &bfZePtWidth);
2872 offset += 1;
2873
2874 /* reserved (2 bits) */
2875 proto_tree_add_item(bfa_tree, hf_oran_reserved_2bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
2876 /* bfAz3ddWidth (3 bits) */
2877 proto_tree_add_item_ret_uint(bfa_tree, hf_oran_bfAz3ddWidth, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &bfAz3ddWidth);
2878 /* bfZe3ddWidth (3 bits) */
2879 proto_tree_add_item_ret_uint(bfa_tree, hf_oran_bfZe3ddWidth, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &bfZe3ddWidth);
2880 offset += 1;
2881
2882 unsigned bit_offset = offset*8;
2883
2884 /* bfAzPt */
2885 if (bfAzPtWidth > 0) {
2886 proto_tree_add_bits_item(extension_tree, hf_oran_bfAzPt, tvb, bit_offset, bfAzPtWidth+1, ENC_BIG_ENDIAN0x00000000);
2887 bit_offset += (bfAzPtWidth+1);
2888 }
2889 /* bfZePt */
2890 if (bfZePtWidth > 0) {
2891 proto_tree_add_bits_item(extension_tree, hf_oran_bfZePt, tvb, bit_offset, bfZePtWidth+1, ENC_BIG_ENDIAN0x00000000);
2892 bit_offset += (bfZePtWidth+1);
2893 }
2894 /* bfAz3dd */
2895 if (bfAz3ddWidth > 0) {
2896 proto_tree_add_bits_item(extension_tree, hf_oran_bfAz3dd, tvb, bit_offset, bfAz3ddWidth+1, ENC_BIG_ENDIAN0x00000000);
2897 bit_offset += (bfAz3ddWidth+1);
2898 }
2899 /* bfZe3dd */
2900 if (bfZe3ddWidth > 0) {
2901 proto_tree_add_bits_item(extension_tree, hf_oran_bfZe3dd, tvb, bit_offset, bfZe3ddWidth+1, ENC_BIG_ENDIAN0x00000000);
2902 bit_offset += (bfZe3ddWidth+1);
2903 }
2904
2905 /* Pad to next byte (unless last 2 fields already fit in this one) */
2906 if ((bit_offset % 8) > 2) {
2907 offset = (bit_offset+7) / 8;
2908 }
2909 else {
2910 offset = bit_offset / 8;
2911 }
2912
2913 /* bfAzSl (3 bits) */
2914 proto_tree_add_item(extension_tree, hf_oran_bfAzSl, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
2915 /* bfZeSl (3 bits) */
2916 proto_tree_add_item(extension_tree, hf_oran_bfZeSl, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
2917 offset += 1;
2918 break;
2919 }
2920
2921 case 3: /* SE 3: DL precoding parameters */
2922 {
2923 /* codebookindex (8 bits) */
2924 /* "This parameter is not used and shall be set to zero." */
2925 proto_tree_add_item(extension_tree, hf_oran_codebook_index, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
2926 offset += 1;
2927 /* layerid */
2928 uint32_t layerid;
2929 proto_tree_add_item_ret_uint(extension_tree, hf_oran_layerid, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &layerid);
2930 /* numLayers */
2931 proto_tree_add_item(extension_tree, hf_oran_numlayers, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
2932 offset += 1;
2933
2934 /* Stop here for non-first data layer */
2935 if (layerid != 0 && layerid != 0xf) {
2936 break;
2937 }
2938
2939 /* First data layer case */
2940 /* txScheme */
2941 proto_tree_add_item(extension_tree, hf_oran_txscheme, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
2942 /* crsReMask */
2943 proto_tree_add_item(extension_tree, hf_oran_crs_remask, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
2944 offset += 2;
2945
2946 /* crsShift (1 bit) */
2947 proto_tree_add_item(extension_tree, hf_oran_crs_shift, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
2948 /* reserved (3 bits) */
2949 proto_tree_add_item(extension_tree, hf_oran_reserved_bits123, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
2950 /* crsSymNum (4 bits) */
2951 proto_tree_add_item(extension_tree, hf_oran_crs_symnum, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
2952 offset += 1;
2953 /* reserved */
2954 proto_tree_add_item(extension_tree, hf_oran_reserved_8bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
2955 offset += 1;
2956
2957 /* reserved (1 bit) */
2958 proto_tree_add_item(extension_tree, hf_oran_reserved_1bit, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
2959 /* beamIdAP1 (15 bits) */
2960 proto_tree_add_item(extension_tree, hf_oran_beamid_ap1, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
2961 offset += 2;
2962 /* reserved (1 bit) */
2963 proto_tree_add_item(extension_tree, hf_oran_reserved_1bit, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
2964 /* beamIdAP2 (15 bits) */
2965 proto_tree_add_item(extension_tree, hf_oran_beamid_ap2, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
2966 offset += 2;
2967 /* reserved (1 bit) */
2968 proto_tree_add_item(extension_tree, hf_oran_reserved_1bit, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
2969 /* beamIdAP3 (15 bits) */
2970 proto_tree_add_item(extension_tree, hf_oran_beamid_ap3, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
2971 offset += 2;
2972 break;
2973 }
2974
2975 case 4: /* SE 4: Modulation compression params (5.4.7.4) */
2976 {
2977 /* csf */
2978 dissect_csf(extension_tree, tvb, offset*8, ci_iq_width, NULL((void*)0));
2979
2980 /* modCompScaler */
2981 uint32_t modCompScaler;
2982 proto_item *ti = proto_tree_add_item_ret_uint(extension_tree, hf_oran_modcompscaler,
2983 tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &modCompScaler);
2984 offset += 2;
2985
2986 /* Work out and show floating point value too. exponent and mantissa are both unsigned */
2987 uint16_t exponent = (modCompScaler >> 11) & 0x000f; /* m.s. 4 bits */
2988 uint16_t mantissa = modCompScaler & 0x07ff; /* l.s. 11 bits */
2989 double value = ((double)mantissa/(1<<11)) * (1.0 / (1 << exponent));
2990 proto_item_append_text(ti, " (%f)", value);
2991
2992 /* TODO: need to store these in per-section data in state that gets looked up by U-Plane */
2993 break;
2994 }
2995
2996 case 5: /* SE 5: Modulation Compression Additional Parameters (7.7.5) */
2997 {
2998 /* Applies only to section types 1,3 and 5 */
2999 /* N.B. there may be multiple instances of this SE in the same frame */
3000
3001 /* There may be one or 2 entries, depending upon extlen */
3002 int sets = 1, reserved_bits = 0;
3003 switch (extlen) {
3004 case 2:
3005 sets = 1;
3006 reserved_bits = 20;
3007 break;
3008 case 3:
3009 sets = 2;
3010 reserved_bits = 24;
3011 break;
3012 case 4:
3013 /* sets can be 3 or 4, depending upon whether last 28 bits are 0.. */
3014 if ((tvb_get_ntohl(tvb, offset+10) & 0x0fffffff) == 0) {
3015 sets = 3;
3016 reserved_bits = 28;
3017 }
3018 else {
3019 sets = 4;
3020 reserved_bits = 0;
3021 }
3022 break;
3023
3024 default:
3025 /* Malformed error!!! */
3026 expert_add_info_format(pinfo, extlen_ti, &ei_oran_extlen_wrong,
3027 "For section 5, extlen must be 2, 3 or 4, but %u was dissected",
3028 extlen);
3029 break;
3030 }
3031
3032 unsigned bit_offset = offset*8;
3033
3034 for (int n=0; n < sets; n++) {
3035 /* Subtree for each set */
3036 unsigned set_start_offset = bit_offset/8;
3037 proto_item *set_ti = proto_tree_add_string(extension_tree, hf_oran_modcomp_param_set,
3038 tvb, set_start_offset, 0, "");
3039 proto_tree *set_tree = proto_item_add_subtree(set_ti, ett_oran_modcomp_param_set);
3040
3041 uint64_t mcScaleReMask, mcScaleOffset;
3042 bool_Bool csf;
3043
3044 /* mcScaleReMask (12 bits) */
3045 proto_tree_add_bits_ret_val(set_tree, hf_oran_mc_scale_re_mask, tvb, bit_offset, 12, &mcScaleReMask, ENC_BIG_ENDIAN0x00000000);
3046 bit_offset += 12;
3047 /* csf (1 bit) */
3048 bit_offset = dissect_csf(set_tree, tvb, bit_offset, ci_iq_width, &csf);
3049 /* mcScaleOffset (15 bits) */
3050 proto_item *ti = proto_tree_add_bits_ret_val(set_tree, hf_oran_mc_scale_offset, tvb, bit_offset, 15, &mcScaleOffset, ENC_BIG_ENDIAN0x00000000);
3051 uint16_t exponent = (mcScaleOffset >> 11) & 0x000f; /* m.s. 4 bits */
3052 uint16_t mantissa = mcScaleOffset & 0x07ff; /* l.s. 11 bits */
3053 double mcScaleOffset_value = ((double)mantissa/(1<<11)) * (1.0 / (1 << exponent));
3054 proto_item_append_text(ti, " (%f)", mcScaleOffset_value);
3055 bit_offset += 15;
3056
3057 /* Summary */
3058 proto_item_set_len(set_ti, (bit_offset+7)/8 - set_start_offset);
3059 proto_item_append_text(set_ti, " (mcScaleReMask=0x%03x csf=%5s mcScaleOffset=%f)",
3060 (unsigned)mcScaleReMask, tfs_get_true_false(csf)tfs_get_string(csf, ((void*)0)), mcScaleOffset_value);
3061 }
3062
3063 proto_item_append_text(extension_ti, " (%u sets)", sets);
3064
3065 /* Reserved (variable-length) */
3066 if (reserved_bits) {
3067 proto_tree_add_bits_item(extension_tree, hf_oran_reserved, tvb, bit_offset, reserved_bits, ENC_BIG_ENDIAN0x00000000);
3068 bit_offset += reserved_bits;
3069 }
3070
3071 offset = bit_offset/8;
3072 break;
3073 }
3074
3075 case 6: /* SE 6: Non-contiguous PRB allocation in time and frequency domain */
3076 {
3077 /* numSymbol not used in this case */
3078 if (numsymbol_ti && !numsymbol_ignored) {
3079 proto_item_append_text(numsymbol_ti, " (ignored)");
3080 numsymbol_ignored = true1;
3081 }
3082
3083 /* Will update ext6 recorded info */
3084 ext11_settings.ext6_set = true1;
3085
3086 /* repetition */
3087 proto_tree_add_bits_item(extension_tree, hf_oran_se6_repetition, tvb, offset*8, 1, ENC_BIG_ENDIAN0x00000000);
3088 /* rbgSize (PRBs per bit set in rbgMask) */
3089 uint32_t rbgSize;
3090 proto_item *rbg_size_ti;
3091 rbg_size_ti = proto_tree_add_item_ret_uint(extension_tree, hf_oran_rbgSize, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &rbgSize);
3092 if (rbgSize == 0) {
3093 /* N.B. this is only true if "se6-rb-bit-supported" is set... */
3094 expert_add_info_format(pinfo, rbg_size_ti, &ei_oran_rbg_size_reserved,
3095 "rbgSize value of 0 is reserved");
3096 }
3097 /* rbgMask (28 bits) */
3098 uint32_t rbgMask;
3099 proto_item *rbgmask_ti = proto_tree_add_item_ret_uint(extension_tree, hf_oran_rbgMask, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &rbgMask);
3100 if (rbgSize == 0) {
3101 proto_item_append_text(rbgmask_ti, " (value ignored since rbgSize is 0)");
3102 }
3103
3104 /* TODO: if receiver detects non-zero bits outside the valid range, those shall be ignored. */
3105 offset += 4;
3106 /* priority */
3107 proto_tree_add_item(extension_tree, hf_oran_noncontig_priority, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3108 /* symbolMask */
3109 offset = dissect_symbolmask(tvb, extension_tree, offset, NULL((void*)0), NULL((void*)0));
3110
3111 /* Look up rbg_size enum -> value */
3112 switch (rbgSize) {
3113 case 0:
3114 /* N.B. reserved, but covered above with expert info (would remain 0) */
3115 break;
3116 case 1:
3117 ext11_settings.ext6_rbg_size = 1; break;
3118 case 2:
3119 ext11_settings.ext6_rbg_size = 2; break;
3120 case 3:
3121 ext11_settings.ext6_rbg_size = 3; break;
3122 case 4:
3123 ext11_settings.ext6_rbg_size = 4; break;
3124 case 5:
3125 ext11_settings.ext6_rbg_size = 6; break;
3126 case 6:
3127 ext11_settings.ext6_rbg_size = 8; break;
3128 case 7:
3129 ext11_settings.ext6_rbg_size = 16; break;
3130 /* N.B., encoded in 3 bits, so no other values are possible */
3131 }
3132
3133 /* Set to looked-up value */
3134 rbgSize = ext11_settings.ext6_rbg_size;
3135
3136 uint32_t lastRbgid = 0;
3137 if (rbgSize != 0) {
3138 /* The O-DU shall not use combinations of startPrbc, numPrbc and rbgSize leading to a value of lastRbgid larger than 27 */
3139 /* i.e., leftmost bit used should not need to go off left end of rbgMask! */
3140 lastRbgid = (uint32_t)ceil((numPrbc + (startPrbc % rbgSize)) / (float)rbgSize) - 1;
3141 if (lastRbgid > 27) {
3142 expert_add_info_format(pinfo, rbg_size_ti, &ei_oran_lastRbdid_out_of_range,
3143 "SE6: rbgSize (%u) not compatible with startPrbc(%u) and numPrbc(%u)",
3144 rbgSize, startPrbc, numPrbc);
3145 break;
3146 }
3147 }
3148
3149 /* Record (and count) which bits are set in rbgMask */
3150 bool_Bool first_seen = false0;
3151 unsigned first_seen_pos=0, last_seen_pos=0;
3152 for (unsigned n=0; n < 28 && ext11_settings.ext6_num_bits_set < 28; n++) {
3153 if ((rbgMask >> n) & 0x01) {
3154 ext11_settings.ext6_bits_set[ext11_settings.ext6_num_bits_set++] = n;
3155 if (!first_seen) {
3156 first_seen = true1;
3157 first_seen_pos = n;
3158 }
3159 last_seen_pos = n;
3160 }
3161 }
3162
3163 /* Show how many bits were set in rbgMask */
3164 proto_item_append_text(rbgmask_ti, " (%u bits set)", ext11_settings.ext6_num_bits_set);
3165 /* Also, that is the range of bits */
3166 if (first_seen) {
3167 proto_item_append_text(rbgmask_ti, " (%u bits spread)", last_seen_pos-first_seen_pos+1);
3168 }
3169
3170 /* Complain if last set bit is beyond lastRbgid */
3171 if (first_seen) {
3172 if (last_seen_pos > lastRbgid) {
3173 expert_add_info_format(pinfo, rbgmask_ti, &ei_oran_rbgMask_beyond_last_rbdid,
3174 "SE6: rbgMask (0x%07x) has bit %u set, but lastRbgId is %u",
3175 rbgMask, last_seen_pos, lastRbgid);
3176 }
3177 }
3178
3179 /* Also update prbs_for_st10_type5[] */
3180 if (sectionType == 10 && rbgSize != 0) {
3181 /* Unset all entries */
3182 memset(&prbs_for_st10_type5, 0, sizeof(prbs_for_st10_type5));
3183
3184 /* Work out which PRB first bit corresponds to */
3185 unsigned firstPrbStart = (startPrbc/rbgSize) * rbgSize;
3186
3187 /* Add PRBs corresponding to each bit set */
3188 for (unsigned n=0; n < 28 ; n++) {
3189 if ((rbgMask >> n) & 0x01) {
3190 /* Lazy way to clip any values that lie outside of range for section */
3191 for (unsigned p=0; p < rbgSize; p++) {
3192 unsigned start = firstPrbStart + (n*rbgSize);
3193 if ((start+p < MAX_PRBS273) && (start+p >= startPrbc) && (start+p <= startPrbc+numPrbc-1)) {
3194 prbs_for_st10_type5[start+p] = true1;
3195 }
3196 }
3197 }
3198 }
3199 }
3200
3201 break;
3202 }
3203
3204 case 7: /* SE 7: eAxC mask */
3205 /* Allow ST0 to address multiple eAxC_ID values for transmission blanking */
3206 proto_tree_add_item(extension_tree, hf_oran_eAxC_mask, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
3207 offset += 2;
3208 break;
3209
3210 case 8: /* SE 8: Regularization factor */
3211 proto_tree_add_item(extension_tree, hf_oran_regularizationFactor, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
3212 offset += 2;
3213 break;
3214
3215 case 9: /* SE 9: Dynamic Spectrum Sharing parameters */
3216 proto_tree_add_item(extension_tree, hf_oran_technology, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3217 offset += 1;
3218 proto_tree_add_item(extension_tree, hf_oran_reserved_8bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3219 offset += 1;
3220 break;
3221
3222 case 10: /* SE 10: Group configuration of multiple ports */
3223 {
3224 seen_se10 = true1;
3225
3226 /* beamGroupType */
3227 uint32_t beam_group_type = 0;
3228 proto_item *bgt_ti;
3229 bgt_ti = proto_tree_add_item_ret_uint(extension_tree, hf_oran_beamGroupType,
3230 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &beam_group_type);
3231 proto_item_append_text(extension_ti, " (%s)", val_to_str_const(beam_group_type, beam_group_type_vals, "Unknown"));
3232
3233 /* numPortc */
3234 proto_tree_add_item_ret_uint(extension_tree, hf_oran_numPortc,
3235 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &numPortc);
3236 offset++;
3237
3238 /* Will append all beamId values to extension_ti, regardless of beamGroupType */
3239 unsigned n;
3240
3241 switch (beam_group_type) {
3242 case 0x0: /* common beam */
3243 case 0x1: /* beam matrix indication */
3244 /* Reserved byte */
3245 proto_tree_add_item(extension_tree, hf_oran_reserved_8bits, tvb, offset, 1, ENC_NA0x00000000);
3246 offset++;
3247
3248 /* Explain how entries are allocated */
3249 if (beam_group_type == 0x0) {
3250 proto_item_append_text(extension_ti, " (all %u ueid/Beam entries are %u)", numPortc, ueId);
3251 }
3252 else {
3253 /* 'numPortc' consecutive BeamIds from section header */
3254 proto_item_append_text(extension_ti, " (ueId/beam entries are %u -> %u)", ueId, ueId+numPortc);
3255 }
3256
3257 if (sectionType == 5) {
3258 /* These types are not allowed */
3259 expert_add_info_format(pinfo, bgt_ti, &ei_oran_se10_not_allowed,
3260 "SE10: beamGroupType %u is not allowed for section type 5", beam_group_type);
3261 }
3262 break;
3263
3264 case 0x2: /* beam vector listing */
3265 {
3266 proto_item_append_text(extension_ti, " [ ");
3267
3268 /* Beam listing vector case */
3269 /* Work out how many port beam entries there is room for */
3270 /* Using numPortC as visible in issue 18116 */
3271 for (n=0; n < numPortc; n++) {
3272 /* 1 reserved bit */
3273 proto_tree_add_item(extension_tree, hf_oran_reserved_1bit, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3274
3275 /* port beam ID (or UEID) (15 bits) */
3276 uint32_t id;
3277 proto_item *beamid_or_ueid_ti = proto_tree_add_item_ret_uint(extension_tree, hf_oran_beamId,
3278 tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &id);
3279 proto_item_append_text(beamid_or_ueid_ti, " port #%u beam ID (or UEId) %u", n, id);
3280 offset += 2;
3281
3282 if (id != 0x7fff) {
3283 if (number_of_ueids < MAX_UEIDS16) {
3284 ueids[number_of_ueids++] = id;
3285 }
3286 }
3287
3288 proto_item_append_text(extension_ti, "%u ", id);
3289 }
3290
3291 proto_item_append_text(extension_ti, "]");
3292 break;
3293 }
3294 case 0x3: /* beamId/ueId listing with associated port-list index */
3295 {
3296 proto_item_append_text(extension_ti, " [ ");
3297
3298 if (numPortc > 0) {
3299 /* first portListIndex is outside loop */
3300 uint32_t port_list_index;
3301 proto_item *pli_ti = proto_tree_add_item_ret_uint(extension_tree, hf_oran_port_list_index, tvb,
3302 offset, 1, ENC_BIG_ENDIAN0x00000000, &port_list_index);
3303 if (port_list_index == 0) {
3304 /* Value 0 is reserved */
3305 expert_add_info(pinfo, pli_ti, &ei_oran_port_list_index_zero);
3306 }
3307 offset += 1;
3308
3309 for (n=0; n < numPortc-1; n++) {
3310 /* 1 reserved bit */
3311 proto_tree_add_item(extension_tree, hf_oran_reserved_1bit, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3312
3313 /* port beam ID (or UEID) */
3314 uint32_t id;
3315 proto_item *beamid_or_ueid_ti = proto_tree_add_item_ret_uint(extension_tree, hf_oran_beamId,
3316 tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &id);
3317 proto_item_append_text(beamid_or_ueid_ti, " port #%u beam ID (or UEId) %u", n, id);
3318 offset += 2;
3319
3320 if (id != 0x7fff) {
3321 if (number_of_ueids < MAX_UEIDS16) {
3322 ueids[number_of_ueids++] = id;
3323 }
3324 }
3325
3326 /* subsequent portListIndex */
3327 pli_ti = proto_tree_add_item_ret_uint(extension_tree, hf_oran_port_list_index, tvb,
3328 offset, 1, ENC_BIG_ENDIAN0x00000000, &port_list_index);
3329 if (port_list_index == 0) {
3330 /* Value 0 is reserved */
3331 expert_add_info(pinfo, pli_ti, &ei_oran_port_list_index_zero);
3332 }
3333 offset += 1;
3334
3335 proto_item_append_text(extension_ti, "%u:%u ", port_list_index, id);
3336 }
3337 }
3338
3339 proto_item_append_text(extension_ti, "]");
3340 break;
3341 }
3342
3343
3344 default:
3345 /* Warning for unsupported/reserved value */
3346 expert_add_info(NULL((void*)0), bgt_ti, &ei_oran_se10_unknown_beamgrouptype);
3347 break;
3348 }
3349 break;
3350 }
3351
3352 case 11: /* SE 11: Flexible Weights Extension Type */
3353 {
3354 /* Hidden filter for bf */
3355 bf_ti = proto_tree_add_item(tree, hf_oran_bf, tvb, 0, 0, ENC_NA0x00000000);
3356 PROTO_ITEM_SET_HIDDEN(bf_ti)proto_item_set_hidden((bf_ti));
3357
3358 /* beamId in section header should be ignored. Guard against appending multiple times.. */
3359 if (beamId_ti && !beamId_ignored) {
3360 proto_item_append_text(beamId_ti, " (ignored)");
3361 beamId_ignored = true1;
3362 }
3363
3364 bool_Bool disableBFWs;
3365 uint32_t numBundPrb;
3366 bool_Bool rad;
3367
3368 /* disableBFWs */
3369 proto_tree_add_item_ret_boolean(extension_tree, hf_oran_disable_bfws,
3370 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &disableBFWs);
3371 if (disableBFWs) {
3372 proto_item_append_text(extension_ti, " (disableBFWs)");
3373 }
3374
3375 /* RAD */
3376 proto_tree_add_item_ret_boolean(extension_tree, hf_oran_rad,
3377 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &rad);
3378 /* bundleOffset (6 bits) */
3379 proto_tree_add_item(extension_tree, hf_oran_bundle_offset, tvb,
3380 offset, 1, ENC_BIG_ENDIAN0x00000000);
3381 offset++;
3382
3383 /* numBundPrb (number of prbs in each bundle) */
3384 proto_item *num_bund_prb_ti = proto_tree_add_item_ret_uint(extension_tree, hf_oran_num_bund_prbs,
3385 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &numBundPrb);
3386 offset++;
3387 /* value zero is reserved.. */
3388 if (numBundPrb == 0) {
3389 expert_add_info_format(pinfo, num_bund_prb_ti, &ei_oran_reserved_numBundPrb,
3390 "Reserved value 0 for numBundPrb seen - not valid");
3391 }
3392
3393 uint32_t num_bundles;
3394 bool_Bool orphaned_prbs = false0;
3395
3396 if (!disableBFWs) {
3397 /********************************************/
3398 /* Table 7.7.1.1-1 */
3399 /********************************************/
3400
3401 uint32_t bfwcomphdr_iq_width, bfwcomphdr_comp_meth;
3402 proto_item *comp_meth_ti = NULL((void*)0);
3403
3404 /* bfwCompHdr (2 subheaders - bfwIqWidth and bfwCompMeth)*/
3405 offset = dissect_bfwCompHdr(tvb, extension_tree, offset,
3406 &bfwcomphdr_iq_width, &bfwcomphdr_comp_meth, &comp_meth_ti);
3407
3408 /* Work out number of bundles, but take care not to divide by zero. */
3409 if (numBundPrb == 0) {
3410 break;
3411 }
3412
3413 /* Work out bundles! */
3414 ext11_work_out_bundles(startPrbc, numPrbc, numBundPrb, &ext11_settings);
3415 num_bundles = ext11_settings.num_bundles;
3416
3417 /* Add (complete) bundles */
3418 for (unsigned b=0; b < num_bundles; b++) {
3419
3420 offset = dissect_bfw_bundle(tvb, extension_tree, pinfo, offset,
3421 comp_meth_ti, bfwcomphdr_comp_meth,
3422 (ext11_settings.ext21_set) ?
3423 numPrbc :
3424 pref_num_bf_antennas,
3425 bfwcomphdr_iq_width,
3426 b, /* bundle number */
3427 ext11_settings.bundles[b].start,
3428 ext11_settings.bundles[b].end,
3429 ext11_settings.bundles[b].is_orphan);
3430 if (!offset) {
3431 break;
3432 }
3433 }
3434 if (num_bundles > 0) {
3435 /* Set flag from last bundle entry */
3436 orphaned_prbs = ext11_settings.bundles[num_bundles-1].is_orphan;
3437 }
3438 }
3439 else {
3440 /********************************************/
3441 /* Table 7.7.1.1-2 */
3442 /* No weights in this case */
3443 /********************************************/
3444
3445 /* Work out number of bundles, but take care not to divide by zero. */
3446 if (numBundPrb == 0) {
3447 break;
3448 }
3449
3450 ext11_work_out_bundles(startPrbc, numPrbc, numBundPrb, &ext11_settings);
3451 num_bundles = ext11_settings.num_bundles;
3452
3453 for (unsigned n=0; n < num_bundles; n++) {
3454 /* contInd */
3455 proto_tree_add_item(extension_tree, hf_oran_cont_ind,
3456 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3457 /* beamId */
3458 proto_item *ti = proto_tree_add_item(extension_tree, hf_oran_beam_id,
3459 tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
3460 if (!ext11_settings.bundles[n].is_orphan) {
3461 proto_item_append_text(ti, " (PRBs %3u-%3u) (Bundle %2u)",
3462 ext11_settings.bundles[n].start,
3463 ext11_settings.bundles[n].end,
3464 n);
3465 }
3466 else {
3467 orphaned_prbs = true1;
3468 proto_item_append_text(ti, " (PRBs %3u-%3u) (Orphaned PRBs)",
3469 ext11_settings.bundles[n].start,
3470 ext11_settings.bundles[n].end);
3471 }
3472 offset += 2;
3473 }
3474 }
3475
3476 /* Add summary to extension root */
3477 if (orphaned_prbs) {
3478 proto_item_append_text(extension_ti, " (%u full bundles + orphaned)", num_bundles-1);
3479 }
3480 else {
3481 proto_item_append_text(extension_ti, " (%u bundles)", num_bundles);
3482 }
3483 }
3484
3485 break;
3486
3487 case 12: /* SE 12: Non-Contiguous PRB Allocation with Frequency Ranges */
3488 {
3489 /* numSymbol not used in this case */
3490 if (numsymbol_ti && !numsymbol_ignored) {
3491 proto_item_append_text(numsymbol_ti, " (ignored)");
3492 numsymbol_ignored = true1;
3493 }
3494
3495 ext11_settings.ext12_set = true1;
3496
3497 /* priority */
3498 proto_tree_add_item(extension_tree, hf_oran_noncontig_priority, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3499
3500 /* symbolMask */
3501 offset = dissect_symbolmask(tvb, extension_tree, offset, NULL((void*)0), NULL((void*)0));
3502
3503 /* There are now 'R' pairs of (offStartPrb, numPrb) values. Fill extlen bytes with values. If last one is not set,
3504 should be populated with 0s. */
3505 uint32_t extlen_remaining_bytes = (extlen*4) - 4;
3506 uint8_t prb_index;
3507
3508 /* This is for ST10/ST11. First pair starts after frames signalled there */
3509 uint16_t st10_st11_offset = startPrbc + numPrbc;
3510
3511 for (prb_index = 1; extlen_remaining_bytes > 0; prb_index++)
3512 {
3513 /* Create a subtree for each pair */
3514 proto_item *pair_ti = proto_tree_add_string(extension_tree, hf_oran_frequency_range,
3515 tvb, offset, 2, "");
3516 proto_tree *pair_tree = proto_item_add_subtree(pair_ti, ett_oran_frequency_range);
3517
3518 /* offStartPrb */
3519 uint32_t off_start_prb;
3520 proto_tree_add_item_ret_uint(pair_tree, hf_oran_off_start_prb, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &off_start_prb);
3521 offset++;
3522
3523 /* numPrb */
3524 uint32_t num_prb;
3525 proto_tree_add_item_ret_uint(pair_tree, hf_oran_num_prb, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &num_prb);
3526 offset++;
3527
3528 extlen_remaining_bytes -= 2;
3529
3530 /* Last pair may be 0,0 if not used. Check for this */
3531 if ((extlen_remaining_bytes == 0) && (off_start_prb == 0) && (num_prb == 0)) {
3532 proto_item_append_text(pair_ti, " (not used)");
3533 }
3534 /* Add summary to pair root item, and configure details in ext11_settings */
3535 else {
3536 proto_item_append_text(pair_ti, "(%u) [%u : %u]",
3537 prb_index, off_start_prb, num_prb);
3538 proto_item_append_text(extension_ti, "[%u : %u]",
3539 off_start_prb, num_prb);
3540 if (ext11_settings.ext12_num_pairs < MAX_BFW_EXT12_PAIRS128) {
3541 ext11_settings.ext12_pairs[ext11_settings.ext12_num_pairs].off_start_prb = off_start_prb;
3542 ext11_settings.ext12_pairs[ext11_settings.ext12_num_pairs++].num_prb = num_prb;
3543 }
3544
3545 /* Also update PRBs to be covered for ST10 type 5 */
3546 /* Original range from section is added to.. */
3547 /* TODO: I don't think this is quite right.. */
3548 for (unsigned prb=st10_st11_offset+off_start_prb; prb < st10_st11_offset+off_start_prb+num_prb; prb++) {
3549 if (prb < MAX_PRBS273) {
3550 prbs_for_st10_type5[prb] = true1;
3551 }
3552 }
3553
3554 /* Any next pair will begin after this one */
3555 st10_st11_offset += (off_start_prb + num_prb);
3556 }
3557 }
3558 break;
3559 }
3560
3561 case 13: /* SE 13: PRB Allocation with Frequency Hopping */
3562 {
3563 /* Will update settings for ext11 */
3564 ext11_settings.ext13_set = true1;
3565
3566 uint32_t extlen_remaining_bytes = (extlen*4) - 2;
3567 uint8_t allocation_index;
3568
3569 unsigned prev_next_symbol_id = 0, prev_next_start_prbc = 0;
3570
3571 for (allocation_index = 1; extlen_remaining_bytes > 0; allocation_index++)
3572 {
3573 /* Subtree for allocation */
3574 proto_item *allocation_ti = proto_tree_add_string(extension_tree, hf_oran_prb_allocation,
3575 tvb, offset, 2, "");
3576 proto_tree *allocation_tree = proto_item_add_subtree(allocation_ti, ett_oran_prb_allocation);
3577
3578 /* Reserved (2 bits) */
3579 proto_tree_add_item(allocation_tree, hf_oran_reserved_2bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3580
3581 /* nextSymbolId (4 bits) */
3582 uint32_t next_symbol_id;
3583 proto_tree_add_item_ret_uint(allocation_tree, hf_oran_nextSymbolId, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &next_symbol_id);
3584
3585 /* nextStartPrbc (10 bits) */
3586 uint32_t next_start_prbc;
3587 proto_tree_add_item_ret_uint(allocation_tree, hf_oran_nextStartPrbc, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &next_start_prbc);
3588 offset += 2;
3589
3590 /* Add summary to allocation root item */
3591 proto_item_append_text(allocation_ti, "(%u) nextSymbolId=%3u, nextStartPrbc=%u",
3592 allocation_index, next_symbol_id, next_start_prbc);
3593
3594 /* Checking for duplicates (expected if e.g. had only 2 entries but extlen bytes still to fill */
3595 if ((allocation_index > 1) && (next_symbol_id == prev_next_symbol_id) && (next_start_prbc == prev_next_start_prbc)) {
3596 proto_item_append_text(allocation_ti, " (repeated - to fill up extlen)");
3597 }
3598 else {
3599 /* Add entry for configuring ext11. don't store out of range */
3600 if (ext11_settings.ext13_num_start_prbs < MAX_BFW_EXT13_ALLOCATIONS128) {
3601 ext11_settings.ext13_start_prbs[ext11_settings.ext13_num_start_prbs++] = next_start_prbc;
3602 }
3603 }
3604 prev_next_symbol_id = next_symbol_id;
3605 prev_next_start_prbc = next_start_prbc;
3606
3607 extlen_remaining_bytes -= 2;
3608 }
3609 break;
3610 }
3611
3612 case 14: /* SE 14: Nulling-layer Info. for ueId-based beamforming */
3613 /* Hidden filter for bf (DMRS BF) */
3614 bf_ti = proto_tree_add_item(tree, hf_oran_bf, tvb, 0, 0, ENC_NA0x00000000);
3615 PROTO_ITEM_SET_HIDDEN(bf_ti)proto_item_set_hidden((bf_ti));
3616
3617 if (!seen_se10) {
3618 proto_tree_add_item(extension_tree, hf_oran_nullLayerInd, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3619 offset += 1;
3620 proto_tree_add_item(extension_tree, hf_oran_reserved_8bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3621 offset += 1;
3622 }
3623 else {
3624 /* Loop over numPortc++1 (from SE 10) nullLayerInd fields */
3625 for (unsigned port=0; port < numPortc+1; port++) {
3626 proto_tree_add_item(extension_tree, hf_oran_nullLayerInd, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3627 offset += 1;
3628 }
3629 }
3630 break;
3631
3632 case 15: /* SE 15: Mixed-numerology Info. for ueId-based beamforming */
3633 {
3634 /* frameStructure */
3635 offset = dissect_frame_structure(extension_tree, tvb, offset,
3636 subframeId, slotId);
3637 /* freqOffset */
3638 proto_tree_add_item(extension_tree, hf_oran_freqOffset, tvb, offset, 3, ENC_BIG_ENDIAN0x00000000);
3639 offset += 3;
3640 /* cpLength */
3641 proto_item *cplength_ti = proto_tree_add_item(extension_tree, hf_oran_cpLength, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
3642 if (sectionType != 0 && sectionType != 3) {
3643 proto_item_append_text(cplength_ti, " (ignored - used only with ST0 and ST3)");
3644 }
3645 offset += 2;
3646 break;
3647 }
3648
3649 case 16: /* SE 16: Antenna mapping in UE channel information based UL beamforming */
3650 {
3651 /* Just filling available bytes with antMask entries.
3652 N.B., if SE 10 also used, could associate each antMask with (beamId or UEId) RX eAxC */
3653 uint32_t extlen_remaining_bytes = (extlen*4) - 2;
3654 unsigned num_ant_masks = extlen_remaining_bytes / 8;
3655 for (unsigned n=0; n < num_ant_masks; n++) {
3656 proto_item *ti = proto_tree_add_item(extension_tree, hf_oran_antMask, tvb, offset, 8, ENC_BIG_ENDIAN0x00000000);
3657 proto_item_append_text(ti, " (RX eAxC #%u)", n+1);
3658 offset += 8;
3659 }
3660 break;
3661 }
3662
3663 case 17: /* SE 17: Indication of user port group */
3664 {
3665 uint32_t extlen_remaining_bytes = (extlen*4) - 2;
3666 uint32_t end_bit = (offset+extlen_remaining_bytes) * 8;
3667 uint32_t ueid_index = 1;
3668 /* TODO: just filling up all available bytes - some may actually be padding.. */
3669 /* "the preceding Section Type and extension messages implicitly provide the number of scheduled users" */
3670 for (uint32_t bit_offset=offset*8; bit_offset < end_bit; bit_offset+=4, ueid_index++) {
3671 proto_item *ti = proto_tree_add_bits_item(extension_tree, hf_oran_num_ueid, tvb, bit_offset, 4, ENC_BIG_ENDIAN0x00000000);
3672 proto_item_append_text(ti, " (user #%u)", ueid_index);
3673 }
3674 break;
3675 }
3676
3677 case 18: /* SE 18: Uplink transmission management */
3678 /* transmissionWindowOffset */
3679 proto_tree_add_item(extension_tree, hf_oran_transmissionWindowOffset, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
3680 offset += 2;
3681 /* reserved (2 bits) */
3682 proto_tree_add_item(extension_tree, hf_oran_reserved_2bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3683 /* transmissionWindowSize (14 bits) */
3684 proto_tree_add_item(extension_tree, hf_oran_transmissionWindowSize, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
3685 offset += 2;
3686
3687 /* reserved (6 bits) */
3688 proto_tree_add_item(extension_tree, hf_oran_reserved_6bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3689 /* toT (2 bits) */
3690 proto_tree_add_item(extension_tree, hf_oran_toT, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3691 offset += 1;
3692 break;
3693
3694 case 19: /* SE 19: Compact beamforming information for multiple port */
3695 {
3696 /* beamId in section header should be ignored. Guard against appending multiple times.. */
3697 if (beamId_ti
22.1
'beamId_ti' is null
&& !beamId_ignored) {
3698 proto_item_append_text(beamId_ti, " (ignored)");
3699 beamId_ignored = true1;
3700 }
3701
3702 /* numSymbol not used in this case */
3703 if (numsymbol_ti
22.2
'numsymbol_ti' is null
&& !numsymbol_ignored) {
3704 proto_item_append_text(numsymbol_ti, " (ignored)");
3705 numsymbol_ignored = true1;
3706 }
3707
3708 /* disableBFWs */
3709 bool_Bool disableBFWs;
3710 proto_tree_add_item_ret_boolean(extension_tree, hf_oran_disable_bfws,
3711 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &disableBFWs);
3712 if (disableBFWs) {
23
Assuming 'disableBFWs' is false
24
Taking false branch
3713 proto_item_append_text(extension_ti, " (disableBFWs)");
3714 }
3715 /* repetition (1 bit) */
3716 uint64_t repetition;
3717 proto_tree_add_bits_ret_val(extension_tree, hf_oran_se19_repetition, tvb, (offset*8)+1, 1, &repetition, ENC_BIG_ENDIAN0x00000000);
3718 /* numPortc (6 bits) */
3719 proto_tree_add_item_ret_uint(extension_tree, hf_oran_numPortc,
3720 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &numPortc);
3721 offset++;
3722
3723 /* priority (2 bits) */
3724 proto_tree_add_item(extension_tree, hf_oran_noncontig_priority, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3725 /* symbolMask (14 bits) */
3726 offset = dissect_symbolmask(tvb, extension_tree, offset, NULL((void*)0), NULL((void*)0));
3727
3728 uint32_t bfwcomphdr_iq_width, bfwcomphdr_comp_meth;
3729 proto_item *comp_meth_ti = NULL((void*)0);
3730
3731 if (!repetition) {
25
Assuming 'repetition' is 0
26
Taking true branch
3732
3733 if (!disableBFWs
26.1
'disableBFWs' is false
) {
27
Taking true branch
3734 /* bfwCompHdr */
3735 offset = dissect_bfwCompHdr(tvb, extension_tree, offset,
3736 &bfwcomphdr_iq_width, &bfwcomphdr_comp_meth, &comp_meth_ti);
3737 }
3738
3739 /* Add entries for each port */
3740 for (unsigned port=0; port < numPortc; port++) {
28
Assuming 'port' is < 'numPortc'
29
Loop condition is true. Entering loop body
3741
3742 /* Create subtree for port entry*/
3743 int port_start_offset = offset;
3744 proto_item *port_ti = proto_tree_add_string_format(extension_tree, hf_oran_ext19_port,
3745 tvb, offset, 0,
3746 "", "Port %u: ", port);
3747 proto_tree *port_tree = proto_item_add_subtree(port_ti, ett_oran_ext19_port);
3748
3749 /* Reserved (4 bits) */
3750 proto_tree_add_item(port_tree, hf_oran_reserved_4bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3751 /* portReMask (12 bits) */
3752 proto_tree_add_item(port_tree, hf_oran_portReMask, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
3753 offset += 2;
3754
3755 /* Reserved (2 bits) */
3756 proto_tree_add_item(port_tree, hf_oran_reserved_2bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3757 /* portSymbolMask (14 bits) */
3758 proto_tree_add_item(port_tree, hf_oran_portSymbolMask, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
3759 offset += 2;
3760
3761 /* Reserved (1 bit) */
3762 proto_tree_add_item(port_tree, hf_oran_reserved_1bit, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3763 /* beamID (15 bits) */
3764 proto_tree_add_item_ret_uint(port_tree, hf_oran_beamId, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &beamId);
3765 proto_item_append_text(port_ti, " (beamId=%u)", beamId);
3766 offset += 2;
3767
3768 /* No weights present */
3769 if (!disableBFWs
29.1
'disableBFWs' is false
) {
30
Taking true branch
3770 /*******************************************************************/
3771 /* Table 7.7.19.1-1 (there is no part -2 for disableBFWs case...), */
3772 /* but for SE 11, bfwCompParam was only present for !disableBFWs */
3773 /*******************************************************************/
3774
3775 /* bfwCompParam */
3776 bool_Bool compression_method_supported = false0;
3777 uint32_t exponent = 0;
3778 unsigned num_trx_entries;
31
'num_trx_entries' declared without an initial value
3779 uint16_t *trx;
3780 offset = dissect_bfwCompParam(tvb, port_tree, pinfo, offset, comp_meth_ti,
32
Calling 'dissect_bfwCompParam'
36
Returning from 'dissect_bfwCompParam'
3781 &bfwcomphdr_comp_meth, &exponent, &compression_method_supported,
3782 &num_trx_entries, &trx);
3783
3784 int bit_offset = offset*8;
3785 int bfw_offset;
3786
3787 /* Add weights for each TRX */
3788 unsigned trx_to_add = (num_trx_entries==0) ? pref_num_bf_antennas : num_trx_entries;
37
The left operand of '==' is a garbage value
3789 for (unsigned b=0; b < trx_to_add; b++) {
3790
3791 uint16_t trx_index = (num_trx_entries) ? trx[b] : b+1;
3792
3793 /* Create BFW subtree */
3794 bfw_offset = bit_offset / 8;
3795 uint8_t bfw_extent = ((bit_offset + (bfwcomphdr_iq_width*2)) / 8) - bfw_offset;
3796 proto_item *bfw_ti = proto_tree_add_string_format(port_tree, hf_oran_bfw,
3797 tvb, bfw_offset, bfw_extent,
3798 "", "TRX %u: (", trx_index);
3799 proto_tree *bfw_tree = proto_item_add_subtree(bfw_ti, ett_oran_bfw);
3800
3801 /* I */
3802 uint32_t bits = tvb_get_bits32(tvb, bit_offset, bfwcomphdr_iq_width, ENC_BIG_ENDIAN0x00000000);
3803 float value = decompress_value(bits, bfwcomphdr_comp_meth, bfwcomphdr_iq_width, exponent);
3804 /* Add to tree. */
3805 proto_tree_add_float_format_value(bfw_tree, hf_oran_bfw_i, tvb, bit_offset/8,
3806 (bfwcomphdr_iq_width+7)/8, value, "#%u=%f", b, value);
3807 bit_offset += bfwcomphdr_iq_width;
3808 proto_item_append_text(bfw_ti, "I%u=%f ", b, value);
3809
3810 /* Q */
3811 bits = tvb_get_bits32(tvb, bit_offset, bfwcomphdr_iq_width, ENC_BIG_ENDIAN0x00000000);
3812 value = decompress_value(bits, bfwcomphdr_comp_meth, bfwcomphdr_iq_width, exponent);
3813 /* Add to tree. */
3814 proto_tree_add_float_format_value(bfw_tree, hf_oran_bfw_q, tvb, bit_offset/8,
3815 (bfwcomphdr_iq_width+7)/8, value, "#%u=%f", b, value);
3816 bit_offset += bfwcomphdr_iq_width;
3817 proto_item_append_text(bfw_ti, "Q%u=%f)", b, value);
3818 }
3819
3820 offset = (bit_offset+7)/8;
3821 }
3822 else {
3823 /* No weights... */
3824 }
3825
3826 /* Set length of this port entry */
3827 proto_item_set_len(port_ti, offset-port_start_offset);
3828 }
3829 }
3830 break;
3831 }
3832
3833 case 20: /* SE 20: Puncturing extension */
3834 {
3835 /* numPuncPatterns */
3836 uint32_t numPuncPatterns;
3837 proto_tree_add_item_ret_uint(extension_tree, hf_oran_numPuncPatterns, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &numPuncPatterns);
3838 offset += 1;
3839
3840 /* Add each puncturing pattern */
3841 for (uint32_t n=0; n < numPuncPatterns; n++) {
3842 unsigned pattern_start_offset = offset;
3843
3844 /* Subtree for this puncturing pattern */
3845 proto_item *pattern_ti = proto_tree_add_string_format(extension_tree, hf_oran_puncPattern,
3846 tvb, offset, 0,
3847 "", "Puncturing Pattern: %u/%u", n+1, numPuncPatterns);
3848 proto_tree *pattern_tree = proto_item_add_subtree(pattern_ti, ett_oran_punc_pattern);
3849
3850 /* SymbolMask (14 bits) */
3851 proto_tree_add_item(pattern_tree, hf_oran_symbolMask_ext20, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
3852 offset += 1;
3853
3854 uint32_t startPuncPrb, numPuncPrb;
3855
3856 /* startPuncPrb (10 bits) */
3857 proto_tree_add_item_ret_uint(pattern_tree, hf_oran_startPuncPrb, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &startPuncPrb);
3858 offset += 2;
3859 /* numPuncPrb (8 bits) */
3860 proto_tree_add_item_ret_uint(pattern_tree, hf_oran_numPuncPrb, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &numPuncPrb);
3861 offset += 1;
3862
3863 proto_item_append_text(pattern_ti, " [%u->%u]", startPuncPrb, startPuncPrb+numPuncPrb-1);
3864
3865 /* Make a hole in range of PRBs to report */
3866 for (unsigned p=startPuncPrb; p < startPuncPrb+numPuncPrb; p++) {
3867 if (p < MAX_PRBS273) {
3868 prbs_for_st10_type5[p] = false0;
3869 }
3870 }
3871
3872 /* puncReMask (12 bits) */
3873 proto_tree_add_item(pattern_tree, hf_oran_puncReMask, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
3874 offset += 1;
3875 /* rb (1 bit) */
3876 proto_item *rb_ti = proto_tree_add_item(pattern_tree, hf_oran_rb, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3877 /* reserved (1 bit) */
3878 proto_tree_add_item(pattern_tree, hf_oran_reserved_bit5, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3879 /* multiSDScope (1 bit) */
3880 proto_tree_add_item(pattern_tree, hf_oran_multiSDScope, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3881 /* rbgIncl (1 bit) */
3882 bool_Bool rbgIncl;
3883 proto_tree_add_item_ret_boolean(pattern_tree, hf_oran_RbgIncl, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &rbgIncl);
3884 offset += 1;
3885
3886 if (rbgIncl) {
3887 /* reserved (1 bit) */
3888 proto_tree_add_item(pattern_tree, hf_oran_reserved_1bit, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3889 /* rbgSize(3 bits) */
3890 proto_tree_add_item(pattern_tree, hf_oran_rbgSize, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3891 /* rbgMask (28 bits) */
3892 proto_tree_add_item(pattern_tree, hf_oran_rbgMask, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
3893 offset += 4;
3894
3895 proto_item_append_text(rb_ti, " (ignored)");
3896 }
3897
3898 proto_item_set_len(pattern_ti, offset-pattern_start_offset);
3899 }
3900
3901 break;
3902 }
3903 case 21: /* SE 21: Variable PRB group size for channel information */
3904 {
3905 /* ciPrbGroupSize */
3906 uint32_t ci_prb_group_size;
3907 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);
3908 offset += 1;
3909
3910 switch (ci_prb_group_size) {
3911 case 0:
3912 case 1:
3913 case 255:
3914 /* Reserved value */
3915 expert_add_info_format(pinfo, prb_group_size_ti, &ei_oran_ci_prb_group_size_reserved,
3916 "SE 11 ciPrbGroupSize is reserved value %u - must be 2-254",
3917 ci_prb_group_size);
3918 break;
3919 default:
3920 /* This value affects how SE 11 is interpreted */
3921 ext11_settings.ext21_set = true1;
3922 ext11_settings.ext21_ci_prb_group_size = ci_prb_group_size;
3923
3924 if (numPrbc == 0) {
3925 expert_add_info(pinfo, numprbc_ti, &ei_oran_numprbc_ext21_zero);
3926 }
3927 break;
3928 }
3929
3930 /* reserved (6 bits) */
3931 proto_tree_add_item(extension_tree, hf_oran_reserved_6bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3932
3933 /* prgSize (2 bits). Interpretation depends upon section type (5 or 6), but also mplane parameters? */
3934 if (sectionType == SEC_C_UE_SCHED) { /* Section Type 5 */
3935 proto_tree_add_item(extension_tree, hf_oran_prg_size_st5, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3936 }
3937 else if (sectionType == SEC_C_CH_INFO) { /* Section Type 6 */
3938 proto_tree_add_item(extension_tree, hf_oran_prg_size_st6, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3939 }
3940 offset += 1;
3941 break;
3942 }
3943
3944 case 22: /* SE 22: ACK/NACK request */
3945 {
3946 uint32_t ack_nack_req_id;
3947 proto_tree_add_item_ret_uint(extension_tree, hf_oran_ack_nack_req_id, tvb, offset, 2,
3948 ENC_BIG_ENDIAN0x00000000, &ack_nack_req_id);
3949 offset += 2;
3950
3951 if (state) {
3952 if (!PINFO_FD_VISITED(pinfo)((pinfo)->fd->visited)) {
3953 /* Add this request into conversation state on first pass */
3954 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)))
;
3955 request_details->request_frame_number = pinfo->num;
3956 request_details->request_frame_time = pinfo->abs_ts;
3957 request_details->requestType = SE22;
3958 /* Insert into flow's tree */
3959 wmem_tree_insert32(state->ack_nack_requests, ack_nack_req_id, request_details);
3960 }
3961 else {
3962 /* Try to link forward to ST8 response */
3963 ack_nack_request_t *response = wmem_tree_lookup32(state->ack_nack_requests,
3964 ack_nack_req_id);
3965 if (response) {
3966 show_link_to_acknack_response(extension_tree, tvb, pinfo, response);
3967 }
3968 }
3969 }
3970 break;
3971 }
3972
3973 case 23: /* SE 23: Arbitrary symbol pattern modulation compression parameters */
3974 {
3975 /* Green common header */
3976
3977 /* numSymPrbPattern (4 bits) */
3978 uint32_t num_sym_prb_pattern;
3979 proto_tree_add_item_ret_uint(extension_tree, hf_oran_num_sym_prb_pattern, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &num_sym_prb_pattern);
3980 /* reserved (3 bits) */
3981 proto_tree_add_item(extension_tree, hf_oran_reserved_bits456, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3982 /* prbMode (1 bit) */
3983 bool_Bool prb_mode;
3984 proto_tree_add_item_ret_boolean(extension_tree, hf_oran_prb_mode, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &prb_mode);
3985 offset += 1;
3986
3987 /* reserved (8 bits) */
3988 proto_tree_add_item(extension_tree, hf_oran_reserved_8bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3989 offset += 1;
3990
3991 /* Dissect each SymPrbPattern */
3992 for (uint32_t n=0; n < num_sym_prb_pattern; n++) {
3993
3994 /* Subtree */
3995 proto_item *pattern_ti = proto_tree_add_string_format(extension_tree, hf_oran_sym_prb_pattern,
3996 tvb, offset, 1, "",
3997 prb_mode ? "PRB-BLOCK" : "PRB-MASK");
3998 proto_tree *pattern_tree = proto_item_add_subtree(pattern_ti, ett_oran_sym_prb_pattern);
3999
4000
4001 /* Orange part */
4002
4003 /* Reserved (2 bits) */
4004 proto_tree_add_item(pattern_tree, hf_oran_reserved_2bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4005 /* symMask (14 bits) */
4006 proto_tree_add_item(pattern_tree, hf_oran_sym_mask, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
4007 offset += 2;
4008 /* numMcScaleOffset (4 bits) */
4009 proto_tree_add_item(pattern_tree, hf_oran_num_mc_scale_offset, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4010
4011 if (!prb_mode) { /* PRB-MASK */
4012 /* prbPattern (4 bits) */
4013 proto_tree_add_item(pattern_tree, hf_oran_prb_pattern, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4014 offset += 1;
4015 /* reserved (8 bits) */
4016 proto_tree_add_item(pattern_tree, hf_oran_reserved_8bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4017 offset += 1;
4018 }
4019 else { /* PRB-BLOCK */
4020 /* prbBlkOffset (8 bits) */
4021 proto_tree_add_item(pattern_tree, hf_oran_prb_block_offset, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4022 offset += 1;
4023 /* prbBlkSize (4 bits) */
4024 proto_tree_add_item(pattern_tree, hf_oran_prb_block_size, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4025 offset += 1;
4026 }
4027
4028 /* Yellowish part */
4029 if (prb_mode) { /* PRB-BLOCK */
4030 /* prbBlkSize (4 bits) */
4031 proto_tree_add_item(pattern_tree, hf_oran_prb_block_size, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4032 }
4033 else {
4034 /* reserved (4 bits) */
4035 proto_tree_add_item(pattern_tree, hf_oran_reserved_4bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4036 }
4037
4038 /* mcScaleReMask (12 bits) */
4039 uint64_t mcScaleReMask, mcScaleOffset;
4040 proto_tree_add_bits_ret_val(pattern_tree, hf_oran_mc_scale_re_mask, tvb, offset*8 + 4, 12, &mcScaleReMask, ENC_BIG_ENDIAN0x00000000);
4041 offset += 2;
4042 /* csf */
4043 dissect_csf(pattern_tree, tvb, offset*8, ci_iq_width, NULL((void*)0));
4044 /* mcScaleOffset (15 bits) */
4045 proto_tree_add_bits_ret_val(pattern_tree, hf_oran_mc_scale_offset, tvb, offset*8 + 1, 15, &mcScaleOffset, ENC_BIG_ENDIAN0x00000000);
4046 offset += 2;
4047
4048 proto_item_set_end(pattern_ti, tvb, offset);
4049 }
4050 break;
4051 }
4052
4053 case 24: /* SE 24: PUSCH DMRS configuration */
4054 {
4055 /* Hidden filter for bf (DMRS BF) */
4056 bf_ti = proto_tree_add_item(tree, hf_oran_bf, tvb, 0, 0, ENC_NA0x00000000);
4057 PROTO_ITEM_SET_HIDDEN(bf_ti)proto_item_set_hidden((bf_ti));
4058
4059 /* alpnPerSym (1 bit) */
4060 proto_tree_add_item(extension_tree, hf_oran_alpn_per_sym, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4061 /* antDmrsSnr (1 bit) */
4062 proto_tree_add_item(extension_tree, hf_oran_ant_dmrs_snr, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4063 /* reserved (1 bit) */
4064 proto_tree_add_item(extension_tree, hf_oran_reserved_bit2, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4065 /* userGroupSize (5 bits) */
4066 uint32_t user_group_size;
4067 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);
4068 if (user_group_size == 0) {
4069 proto_item_append_text(ugs_ti, " (not used)");
4070 }
4071 else if (user_group_size > 12) {
4072 proto_item_append_text(ugs_ti, " (reserved)");
4073 }
4074 offset += 1;
4075 /* userGroupId (8 bits)*/
4076 uint32_t user_group_id;
4077 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);
4078 if (user_group_id == 0) {
4079 /* TODO: Value 0 can happen in several cases, described in 7.7.24.7.. */
4080 }
4081 if (user_group_id == 255) {
4082 /* Value 255 is reserved */
4083 expert_add_info(pinfo, ugi_ti, &ei_oran_user_group_id_reserved_value);
4084 }
4085 offset += 1;
4086
4087 bool_Bool seen_value_to_inherit = false0;
4088 bool_Bool inherited_config_has_transform_precoding = false0;
4089 int dmrs_configs_seen = 0;
4090
4091 /* Dissect each entry until reach number of configured ueIds (or run out of extlen bytes..) */
4092 uint32_t ueid_index = 0;
4093 while ((offset < (extension_start_offset + extlen*4)) && (ueid_index < number_of_ueids)) {
4094 dmrs_configs_seen++;
4095
4096 /* Subtree */
4097 proto_item *entry_ti = proto_tree_add_string_format(extension_tree, hf_oran_dmrs_entry,
4098 tvb, offset, 0, "",
4099 "Entry");
4100 proto_tree *entry_tree = proto_item_add_subtree(entry_ti, ett_oran_dmrs_entry);
4101
4102 /* entryType (3 bits) */
4103 uint32_t entry_type;
4104 proto_item *entry_type_ti;
4105 entry_type_ti = proto_tree_add_item_ret_uint(entry_tree, hf_oran_entry_type, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &entry_type);
4106 if (entry_type > 3) {
4107 proto_item_append_text(entry_type_ti, " (reserved)");
4108 }
4109
4110 /* dmrsPortNumber (5 bits). Values 0-11 allowed */
4111 unsigned int dmrs_port_number;
4112 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);
4113 if (dmrs_port_number > 11) {
4114 proto_item_append_text(dpn_ti, " (12-31 are reserved)");
4115 }
4116 offset += 1;
4117
4118 /* What follows depends upon entryType */
4119 switch (entry_type) {
4120 case 0: /* dmrsPortNumber config same as previous, ueId ueIdReset=0 */
4121 case 1: /* dmrsPortNumber config same as previous, ueId ueIdReset=1 */
4122 /* No further fields for these */
4123 /* Error here if no previous values to inherit!! */
4124 if (!seen_value_to_inherit) {
4125 expert_add_info_format(pinfo, entry_type_ti, &ei_oran_se24_nothing_to_inherit,
4126 "SE24: have seen entry type %u, but no previous config (type 2 or 3) to inherit config from", entry_type);
4127
4128 }
4129 /* TODO: would be useful to repeat inherited config here? */
4130 break;
4131
4132 case 2: /* transform precoding disabled */
4133 case 3: /* transform precoding enabled */
4134 {
4135 /* Type 2/3 are very similar.. */
4136
4137 /* ueIdReset (1 bit) */
4138 proto_tree_add_item(entry_tree, hf_oran_ueid_reset, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4139 /* reserved (1 bit) */
4140 proto_tree_add_item(entry_tree, hf_oran_reserved_bit1, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4141
4142 /* dmrsSymbolMask (14 bits) */
4143 static int * const dmrs_symbol_mask_flags[] = {
4144 &hf_oran_dmrs_symbol_mask_s13,
4145 &hf_oran_dmrs_symbol_mask_s12,
4146 &hf_oran_dmrs_symbol_mask_s11,
4147 &hf_oran_dmrs_symbol_mask_s10,
4148 &hf_oran_dmrs_symbol_mask_s9,
4149 &hf_oran_dmrs_symbol_mask_s8,
4150 &hf_oran_dmrs_symbol_mask_s7,
4151 &hf_oran_dmrs_symbol_mask_s6,
4152 &hf_oran_dmrs_symbol_mask_s5,
4153 &hf_oran_dmrs_symbol_mask_s4,
4154 &hf_oran_dmrs_symbol_mask_s3,
4155 &hf_oran_dmrs_symbol_mask_s2,
4156 &hf_oran_dmrs_symbol_mask_s1,
4157 &hf_oran_dmrs_symbol_mask_s0,
4158 NULL((void*)0)
4159 };
4160 proto_tree_add_bitmask(entry_tree, tvb, offset,
4161 hf_oran_dmrs_symbol_mask, ett_oran_dmrs_symbol_mask, dmrs_symbol_mask_flags, ENC_BIG_ENDIAN0x00000000);
4162 offset += 2;
4163
4164 /* scrambling */
4165 proto_tree_add_item(entry_tree, hf_oran_scrambling, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
4166 offset += 2;
4167
4168 /* nscid (1 bit) */
4169 proto_tree_add_item(entry_tree, hf_oran_nscid, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4170
4171 /* These 5 bits differ depending upon entry type */
4172 if (entry_type == 2) { /* type 2 */
4173 /* dType (1 bit) */
4174 proto_tree_add_item(entry_tree, hf_oran_dtype, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4175 /* cdmWithoutData (2 bits) */
4176 proto_tree_add_item(entry_tree, hf_oran_cmd_without_data, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4177 /* lambda (2 bits) */
4178 proto_tree_add_item(entry_tree, hf_oran_lambda, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4179 }
4180 else { /* type 3 */
4181 /* reserved (1 bit) */
4182 proto_tree_add_item(entry_tree, hf_oran_reserved_bit1, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4183 /* lowPaprType (2 bits) */
4184 proto_tree_add_item(entry_tree, hf_oran_low_papr_type, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4185 /* hoppingMode (2 bits) */
4186 proto_tree_add_item(entry_tree, hf_oran_hopping_mode, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4187 }
4188
4189 /* firstPrb (9 bits) */
4190 proto_tree_add_item(entry_tree, hf_oran_first_prb, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
4191 offset += 1;
4192 /* lastPrb (9 bits) */
4193 proto_tree_add_item(entry_tree, hf_oran_last_prb, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
4194 offset += 2;
4195 /* Reserved (16 bits) */
4196 proto_tree_add_item(entry_tree, hf_oran_reserved_16bits, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
4197 offset += 2;
4198
4199 /* Could now see entry types 0 or 1 - they have these values to inherit */
4200 seen_value_to_inherit = true1;
4201 inherited_config_has_transform_precoding = (entry_type == 3);
4202 break;
4203 }
4204
4205 default:
4206 /* reserved - expert info */
4207 break;
4208 }
4209
4210 proto_item_append_text(entry_ti, " [UEId=%u] (dmrsPortNumber=%2u) (type %u - %s) ",
4211 ueids[ueid_index++], dmrs_port_number, entry_type, val_to_str_const(entry_type, entry_type_vals, "Unknown"));
4212 proto_item_set_end(entry_ti, tvb, offset);
4213
4214 if (entry_type <= 1) {
4215 proto_item_append_text(entry_ti, " [transform-precoding %s]",
4216 inherited_config_has_transform_precoding ? "enabled" : "disabled");
4217 }
4218 }
4219
4220 proto_item_append_text(extension_ti, " (%d DMRS configs seen)", dmrs_configs_seen);
4221 break;
4222 }
4223
4224 case 25: /* SE 25: Symbol reordering for DMRS-BF */
4225 /* Just dissect each available block of 7 bytes as the 14 symbols for a layer,
4226 where each layer could be one or apply to all layers. */
4227 {
4228 /* TODO: should only appear in one section of a message - check? */
4229 unsigned layer = 0;
4230 proto_item *layer_ti;
4231 while (offset+7 <= (extension_start_offset + extlen*4)) {
4232 /* Layer subtree */
4233 layer_ti = proto_tree_add_string_format(extension_tree, hf_oran_symbol_reordering_layer,
4234 tvb, offset, 7, "",
4235 "Layer");
4236 proto_tree *layer_tree = proto_item_add_subtree(layer_ti, ett_oran_symbol_reordering_layer);
4237
4238 /* All 14 symbols for a layer (or all layers) */
4239 for (unsigned s=0; s < 14; s++) {
4240 proto_item *sym_ti;
4241 /* txWinForOnAirSymbol */
4242 unsigned int tx_win_for_on_air_symbol;
4243 sym_ti = proto_tree_add_item_ret_uint(layer_tree,
4244 (s % 2) ? hf_oran_tx_win_for_on_air_symbol_r : hf_oran_tx_win_for_on_air_symbol_l,
4245 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &tx_win_for_on_air_symbol);
4246 if (tx_win_for_on_air_symbol == 0x0F) {
4247 /* Ordering not affected */
4248 proto_item_append_text(sym_ti, " (sym %u - no info)", s);
4249 }
4250 else {
4251 proto_item_append_text(sym_ti, " (sym %u)", s);
4252 }
4253 if (s % 2) {
4254 offset += 1;
4255 }
4256 }
4257
4258 proto_item_append_text(layer_ti, " (layer %u)", ++layer);
4259 proto_item_append_text(extension_ti, " (layer %u)", layer);
4260 }
4261 /* Set layer subtree label */
4262 if (layer == 1) {
4263 proto_item_append_text(layer_ti, " (all)");
4264 proto_item_append_text(extension_ti, " (all)");
4265 }
4266 if (layer == 0) {
4267 /* TODO: are no layers valid? What does it mean? */
4268 proto_item_append_text(extension_ti, " (none)");
4269 }
4270 break;
4271 }
4272
4273 case 26: /* SE 26: Frequency offset feedback */
4274 /* Reserved (8 bits). N.B., added after draft? */
4275 proto_tree_add_item(extension_tree, hf_oran_reserved_8bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4276 offset += 1;
4277 /* Reserved (1 bit) */
4278 proto_tree_add_item(extension_tree, hf_oran_reserved_1bit, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4279 /* numFoFb (7 bits) */
4280 unsigned num_fo_fb;
4281 proto_tree_add_item_ret_uint(extension_tree, hf_oran_num_fo_fb, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &num_fo_fb);
4282 offset += 1;
4283
4284 /* Add each freqOffsetFb value */
4285 for (unsigned n=0; n < num_fo_fb; n++) {
4286 unsigned freq_offset_fb;
4287 /* freqOffsetFb (16 bits) */
4288 proto_item *offset_ti = proto_tree_add_item_ret_uint(extension_tree, hf_oran_freq_offset_fb,
4289 tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &freq_offset_fb);
4290 /* Show if maps onto a -ve number */
4291 if ((freq_offset_fb >= 0x8ad0) && (freq_offset_fb <= 0xffff)) {
4292 proto_item_append_text(offset_ti, "(value %d)", -1 - (0xffff-freq_offset_fb));
4293 }
4294 proto_item_append_text(offset_ti, " [#%u]", n+1);
4295 offset += 2;
4296 }
4297 break;
4298
4299 case 27: /* SE 27: O-DU controlled dimensionality reduction */
4300 {
4301 /* Hidden filter for bf (DMRS BF) */
4302 bf_ti = proto_tree_add_item(tree, hf_oran_bf, tvb, 0, 0, ENC_NA0x00000000);
4303 PROTO_ITEM_SET_HIDDEN(bf_ti)proto_item_set_hidden((bf_ti));
4304
4305 /* beamType (2 bits) */
4306 unsigned beam_type;
4307 proto_tree_add_item_ret_uint(extension_tree, hf_oran_beam_type, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &beam_type);
4308 /* reserved (6 bits) */
4309 proto_tree_add_item(extension_tree, hf_oran_reserved_last_6bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4310 offset += 1;
4311
4312 /* numElements */
4313 unsigned num_elements;
4314 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);
4315 if (num_elements == 0) {
4316 num_elements = 256;
4317 proto_item_append_text(num_elements_ti, " (256");
4318 }
4319
4320 offset += 1;
4321
4322 /* beamId value(s) */
4323 switch (beam_type) {
4324 case 0:
4325 for (unsigned n=0; n < num_elements; n++) {
4326 /* reserved (1 bit) + beamId */
4327 proto_tree_add_item(extension_tree, hf_oran_reserved_1bit, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4328 proto_tree_add_item(c_section_tree, hf_oran_beamId, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
4329 offset += 2;
4330 }
4331 break;
4332 case 1:
4333 /* reserved (1 bit) + beamId */
4334 proto_tree_add_item(extension_tree, hf_oran_reserved_1bit, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4335 proto_tree_add_item(c_section_tree, hf_oran_beamId, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
4336 offset += 2;
4337 break;
4338 default:
4339 /* Unknown type... */
4340 break;
4341 }
4342 break;
4343 }
4344
4345 case 28: /* SE 28: O-DU controlled frequency resolution for SINR reporting */
4346 {
4347 /* reserved (3 bits) */
4348 proto_tree_add_item(extension_tree, hf_oran_reserved_3bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4349 /* numUeSinrRpt */
4350 uint32_t num_ue_sinr_rpt;
4351 proto_tree_add_item_ret_uint(extension_tree, hf_oran_num_ue_sinr_rpt, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &num_ue_sinr_rpt);
4352 offset += 1;
4353
4354 for (uint32_t n=0; n < num_ue_sinr_rpt; n++) {
4355 /* reserved (1 bit) */
4356 proto_tree_add_item(extension_tree, (n % 2) ? hf_oran_reserved_bit4 : hf_oran_reserved_1bit,
4357 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4358
4359 /* numSinrPerPrb (3 bits). Taken from alternate nibbles within byte. */
4360 proto_tree_add_item(extension_tree, (n % 2) ? hf_oran_num_sinr_per_prb_right : hf_oran_num_sinr_per_prb,
4361 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4362 if (n % 2) {
4363 offset += 1;
4364 }
4365 }
4366
4367 /* May need to skip beyond half-used byte */
4368 if (num_ue_sinr_rpt % 2) {
4369 offset += 1;
4370 }
4371 break;
4372 }
4373
4374
4375 default:
4376 /* Other/unexpected extension types */
4377 expert_add_info_format(pinfo, exttype_ti, &ei_oran_unhandled_se,
4378 "SE %u (%s) not supported by dissector",
4379 exttype, val_to_str_const(exttype, exttype_vals, "Reserved"));
4380 ext_unhandled = true1;
4381 break;
4382 }
4383
4384 /* Check offset compared with extlen. There should be 0-3 bytes of padding */
4385 int num_padding_bytes = (extension_start_offset + (extlen*4) - offset);
4386 if (!ext_unhandled && ((num_padding_bytes<0) || (num_padding_bytes>3))) {
4387 expert_add_info_format(pinfo, extlen_ti, &ei_oran_extlen_wrong,
4388 "extlen signalled %u bytes (+ 0-3 bytes padding), but %u were dissected",
4389 extlen*4, offset-extension_start_offset);
4390 }
4391
4392 /* Move offset to beyond signalled length of extension */
4393 offset = extension_start_offset + (extlen*4);
4394
4395 /* Set length of extension header. */
4396 proto_item_set_len(extension_ti, extlen*4);
4397 }
4398 /* End of section extension handling */
4399
4400
4401
4402 /* RRM measurement reports have measurement reports *after* extensions */
4403 if (sectionType == SEC_C_RRM_MEAS_REPORTS) /* Section Type 10 */
4404 {
4405 /* Hidden filter for bf (DMFS-BF). No BF weights though.. */
4406 bf_ti = proto_tree_add_item(c_section_tree, hf_oran_bf, tvb, 0, 0, ENC_NA0x00000000);
4407 PROTO_ITEM_SET_HIDDEN(bf_ti)proto_item_set_hidden((bf_ti));
4408
4409 bool_Bool mf;
4410 do {
4411 /* Measurement report subtree */
4412 proto_item *mr_ti = proto_tree_add_string_format(c_section_tree, hf_oran_measurement_report,
4413 tvb, offset, 1, "", "Measurement Report");
4414 proto_tree *mr_tree = proto_item_add_subtree(mr_ti, ett_oran_measurement_report);
4415 unsigned report_start_offset = offset;
4416
4417 /* more fragments (after this one) (1 bit) */
4418 proto_tree_add_item_ret_boolean(mr_tree, hf_oran_mf, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &mf);
4419
4420 /* measTypeId (7 bits) */
4421 uint32_t meas_type_id;
4422 proto_item *meas_type_id_ti;
4423 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);
4424 offset += 1;
4425
4426 /* Common to all measurement types */
4427 unsigned num_elements = 0;
4428 if (meas_type_id == 6) {
4429 /* numElements */
4430 proto_tree_add_item_ret_uint(mr_tree, hf_oran_num_elements, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &num_elements);
4431 }
4432 else {
4433 /* All other meas ids have a reserved byte */
4434 proto_tree_add_item(mr_tree, hf_oran_reserved_8bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4435 }
4436 offset += 1;
4437
4438 /* measDataSize (16 bits). N.B. begins at mf field, i.e. 2 bytes before this one */
4439 unsigned meas_data_size;
4440 proto_item *meas_data_size_ti;
4441 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);
4442 meas_data_size *= 4;
4443 proto_item_append_text(meas_data_size_ti, " (%u bytes)", meas_data_size);
4444 offset += 2;
4445
4446 /* Summary for measurement report root */
4447 proto_item_append_text(mr_ti, " (measTypeId=%u - %s)",
4448 meas_type_id, val_to_str_const(meas_type_id, meas_type_id_vals, "unknown"));
4449 /* And section header */
4450 proto_item_append_text(tree, " (%s)", val_to_str_const(meas_type_id, meas_type_id_vals, "unknown"));
4451 /* And Info column */
4452 col_append_fstr(pinfo->cinfo, COL_INFO, " (%s)", val_to_str_const(meas_type_id, meas_type_id_vals, "unknown"));
4453
4454 /* Handle specific message type fields */
4455 switch (meas_type_id) {
4456 case 1:
4457 {
4458 /* ueTae */
4459 unsigned ue_tae;
4460 proto_item *ue_tae_ti;
4461 ue_tae_ti = proto_tree_add_item_ret_uint(mr_tree, hf_oran_ue_tae, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &ue_tae);
4462 /* Show if maps onto a -ve number */
4463 if ((ue_tae >= 0x8ad0) && (ue_tae <= 0xffff)) {
4464 proto_item_append_text(ue_tae_ti, "(value %d)", -1 - (0xffff-ue_tae));
4465 }
4466 offset += 2;
4467
4468 /* Reserved (16 bits) */
4469 proto_tree_add_item(mr_tree, hf_oran_reserved_16bits, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
4470 offset += 2;
4471 break;
4472 }
4473 case 2:
4474 /* ueLayerPower entries (how many? for now just use up meas_data_size..) */
4475 /* TODO: add number of distinct dmrsPortNumber entries seen in SE24 and save in state? */
4476 /* Or would it make sense to use the preference 'pref_num_bf_antennas' ? */
4477 for (unsigned n=0; n < (meas_data_size-4)/2; n++) {
4478 unsigned ue_layer_power;
4479 proto_item *ue_layer_power_ti;
4480 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);
4481 /* Show if maps onto a -ve number */
4482 if ((ue_layer_power >= 0x8ad0) && (ue_layer_power <= 0xffff)) {
4483 proto_item_append_text(ue_layer_power_ti, "(value %d)", -1 - (0xffff-ue_layer_power));
4484 }
4485 offset += 2;
4486 }
4487 /* padding out to 4 bytes */
4488 break;
4489 case 3:
4490 {
4491 /* ueFreqOffset */
4492 unsigned ue_freq_offset;
4493 proto_item *ue_freq_offset_ti;
4494 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);
4495 /* Show if maps onto a -ve number */
4496 if ((ue_freq_offset >= 0x8ad0) && (ue_freq_offset <= 0xffff)) {
4497 proto_item_append_text(ue_freq_offset_ti, "(value %d)", -1 - (0xffff-ue_freq_offset));
4498 }
4499 offset += 2;
4500
4501 /* Reserved (16 bits) */
4502 proto_tree_add_item(mr_tree, hf_oran_reserved_16bits, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
4503 offset += 2;
4504 break;
4505 }
4506 case 4:
4507 case 5:
4508 /* reserved (2 bits) */
4509 proto_tree_add_item(mr_tree, hf_oran_reserved_2bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4510 /* symbolMask (14 bits) */
4511 offset = dissect_symbolmask(tvb, mr_tree, offset, NULL((void*)0), NULL((void*)0));
4512
4513 /* 2 bytes for each PRB ipnPower */
4514 for (unsigned prb=0; prb<MAX_PRBS273; prb++) {
4515 /* Skip if should not be reported */
4516 if (!prbs_for_st10_type5[prb]) {
4517 continue;
4518 }
4519 unsigned ipn_power;
4520 proto_item *ipn_power_ti;
4521 /* ipnPower (2 bytes) */
4522 ipn_power_ti = proto_tree_add_item_ret_uint(mr_tree, hf_oran_ipn_power, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &ipn_power);
4523 proto_item_append_text(ipn_power_ti, " (PRB %3d)", prb);
4524 /* Show if maps onto a -ve number */
4525 if ((ipn_power >= 0x8ad0) && (ipn_power <= 0xffff)) {
4526 proto_item_append_text(ipn_power_ti, " (value %d)", -1 - (0xffff-ipn_power));
4527 }
4528 offset += 2;
4529 }
4530 /* padding out to 4 bytes */
4531 break;
4532 case 6:
4533 /* antDmrsSnrVal entries */
4534 for (unsigned n=0; n < num_elements; n++) {
4535 unsigned snr_value;
4536 proto_item *snr_value_ti;
4537 /* antDmrsSnrVal (2 bytes) */
4538 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);
4539 proto_item_append_text(snr_value_ti, " (elem %2u)", n+1);
4540 /* Show if maps onto a -ve number */
4541 if ((snr_value >= 0x8ad0) && (snr_value <= 0xffff)) {
4542 proto_item_append_text(snr_value_ti, " (value %d)", -1 - (0xffff-snr_value));
4543 }
4544 offset += 2;
4545 }
4546 break;
4547
4548 default:
4549 /* Anything else is not expected */
4550 expert_add_info_format(pinfo, meas_type_id_ti, &ei_oran_unexpected_measTypeId,
4551 "measTypeId %u (%s) not supported - only 1-6 are expected",
4552 meas_type_id,
4553 val_to_str_const(meas_type_id, meas_type_id_vals, "reserved"));
4554 break;
4555
4556 }
4557
4558 /* Pad out to next 4 bytes */
4559 offset += WS_PADDING_TO_4(offset-report_start_offset)((4U - ((offset-report_start_offset) % 4U)) % 4U);
4560
4561 /* TODO: verify dissected size of report vs meas_data_size? */
4562
4563 /* End of measurement report tree */
4564 proto_item_set_end(mr_ti, tvb, offset);
4565 } while (mf);
4566 }
4567
4568 /* Request for RRM Measurements has measurement commands after extensions */
4569 else if (sectionType == SEC_C_REQUEST_RRM_MEAS) /* Section Type 11 */
4570 {
4571 bool_Bool mf = true1;
4572 do {
4573 /* Measurement command subtree */
4574 proto_item *mc_ti = proto_tree_add_string_format(c_section_tree, hf_oran_measurement_command,
4575 tvb, offset, 8, "", "Measurement Command");
4576 proto_tree *mc_tree = proto_item_add_subtree(mc_ti, ett_oran_measurement_command);
4577
4578 /* mf (1 bit). 1st measurement command is always preset */
4579 proto_tree_add_item_ret_boolean(mc_tree, hf_oran_mf, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &mf);
4580
4581 /* measTypeId (7 bits) */
4582 uint32_t meas_type_id;
4583 proto_item *meas_type_id_ti;
4584 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);
4585 offset += 1;
4586
4587 proto_item *meas_command_ti;
4588 uint32_t meas_command_size;
4589
4590 switch (meas_type_id) {
4591 case 5: /* command for IpN for unallocated PRBs */
4592 /* reserved (1 byte) */
4593 proto_tree_add_item(mc_tree, hf_oran_reserved_8bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4594 offset += 1;
4595 /* measCmdSize. Presumably number of words so in future could skip unrecognised command types.. */
4596 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);
4597 proto_item_append_text(meas_command_ti, " (%u bytes)", meas_command_size*4);
4598 offset += 2;
4599 /* reserved (2 bits) */
4600 proto_tree_add_item(mc_tree, hf_oran_reserved_2bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4601 /* symbolMask (14 bits) */
4602 offset = dissect_symbolmask(tvb, mc_tree, offset, NULL((void*)0), NULL((void*)0));
4603 /* reserved (16 bits) */
4604 proto_tree_add_item(mc_tree, hf_oran_reserved_16bits, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
4605 offset += 2;
4606 break;
4607
4608 default:
4609 /* Anything else is not expected */
4610 expert_add_info_format(pinfo, meas_type_id_ti, &ei_oran_unexpected_measTypeId,
4611 "measTypeId %u (%s) not supported - only 5 is expected",
4612 meas_type_id,
4613 val_to_str_const(meas_type_id, meas_type_id_vals, "reserved"));
4614 break;
4615 }
4616 proto_item_append_text(mc_ti, " (%s)", val_to_str_const(meas_type_id, meas_type_id_vals, "unknown"));
4617
4618 } while (mf);
4619 }
4620
4621 /* Set extent of overall section */
4622 proto_item_set_len(sectionHeading, offset);
4623
4624 return offset;
4625}
4626
4627/* Dissect udCompHdr (user data compression header, 7.5.2.10) */
4628/* bit_width and comp_meth are out params */
4629static int dissect_udcomphdr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, unsigned offset,
4630 bool_Bool ignore,
4631 unsigned *bit_width, unsigned *comp_meth, proto_item **comp_meth_ti)
4632{
4633 /* Subtree */
4634 proto_item *udcomphdr_ti = proto_tree_add_string_format(tree, hf_oran_udCompHdr,
4635 tvb, offset, 1, "",
4636 "udCompHdr");
4637 proto_tree *udcomphdr_tree = proto_item_add_subtree(udcomphdr_ti, ett_oran_udcomphdr);
4638
4639 /* udIqWidth */
4640 uint32_t hdr_iq_width;
4641 proto_item *iq_width_item = proto_tree_add_item_ret_uint(udcomphdr_tree, hf_oran_udCompHdrIqWidth , tvb, offset, 1, ENC_NA0x00000000, &hdr_iq_width);
4642 *bit_width = (hdr_iq_width) ? hdr_iq_width : 16;
4643 proto_item_append_text(iq_width_item, " (%u bits)", *bit_width);
4644
4645 /* udCompMeth */
4646 uint32_t ud_comp_meth;
4647 *comp_meth_ti = proto_tree_add_item_ret_uint(udcomphdr_tree, hf_oran_udCompHdrMeth, tvb, offset, 1, ENC_NA0x00000000, &ud_comp_meth);
4648 if (comp_meth) {
4649 *comp_meth = ud_comp_meth;
4650 }
4651
4652 /* Summary */
4653 if (!ignore) {
4654 proto_item_append_text(udcomphdr_ti, " (IqWidth=%u, udCompMeth=%s)",
4655 *bit_width, rval_to_str_const(ud_comp_meth, ud_comp_header_meth, "Unknown"));
4656 }
4657 else {
4658 proto_item_append_text(udcomphdr_ti, " (ignored)");
4659 if (hdr_iq_width || ud_comp_meth) {
4660 expert_add_info_format(pinfo, udcomphdr_ti, &ei_oran_udpcomphdr_should_be_zero,
4661 "udCompHdr in C-Plane for DL should be 0 - found 0x%02x",
4662 tvb_get_uint8(tvb, offset));
4663 }
4664
4665 }
4666 return offset+1;
4667}
4668
4669/* Dissect udCompParam (user data compression parameter, 8.3.3.15) */
4670/* bit_width and comp_meth are out params */
4671static int dissect_udcompparam(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, unsigned offset,
4672 unsigned comp_meth,
4673 uint32_t *exponent, uint16_t *sReSMask,
4674 bool_Bool for_sinr)
4675{
4676 if (for_sinr && (comp_meth != COMP_BLOCK_FP1)) {
4677 /* sinrCompParam only present when bfp is used */
4678 return offset;
4679 }
4680
4681 if (comp_meth == COMP_NONE0 ||
4682 comp_meth == COMP_MODULATION4 ||
4683 comp_meth == MOD_COMPR_AND_SELECTIVE_RE_WITH_MASKS8) {
4684
4685 /* Not even creating a subtree for udCompMeth 0, 4, 8 */
4686 return offset;
4687 }
4688
4689 /* Subtree */
4690 unsigned start_offset = offset;
4691 proto_item *udcompparam_ti = proto_tree_add_string_format(tree, hf_oran_udCompParam,
4692 tvb, offset, 1, "",
4693 (for_sinr) ? "sinrCompParam" : "udCompParam");
4694 proto_tree *udcompparam_tree = proto_item_add_subtree(udcompparam_ti, ett_oran_udcompparam);
4695
4696 /* Show comp_meth as a generated field */
4697 proto_item *meth_ti = proto_tree_add_uint(udcompparam_tree, hf_oran_udCompHdrMeth_pref, tvb, 0, 0, comp_meth);
4698 proto_item_set_generated(meth_ti);
4699
4700 uint32_t param_exponent;
4701 uint64_t param_sresmask;
4702
4703 static int * const sres_mask_flags[] = {
4704 &hf_oran_sReSMask_re12,
4705 &hf_oran_sReSMask_re11,
4706 &hf_oran_sReSMask_re10,
4707 &hf_oran_sReSMask_re9,
4708 &hf_oran_sReSMask_re8,
4709 &hf_oran_sReSMask_re7,
4710 &hf_oran_sReSMask_re6,
4711 &hf_oran_sReSMask_re5,
4712 &hf_oran_sReSMask_re4,
4713 &hf_oran_sReSMask_re3,
4714 &hf_oran_sReSMask_re2,
4715 &hf_oran_sReSMask_re1,
4716 NULL((void*)0)
4717 };
4718
4719 switch (comp_meth) {
4720 case COMP_BLOCK_FP1: /* 1 */
4721 case BFP_AND_SELECTIVE_RE_WITH_MASKS7: /* 7 */
4722 /* reserved (4 bits) */
4723 proto_tree_add_item(udcompparam_tree, hf_oran_reserved_4bits, tvb, offset, 1, ENC_NA0x00000000);
4724 /* exponent (4 bits) */
4725 proto_tree_add_item_ret_uint(udcompparam_tree, hf_oran_exponent,
4726 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &param_exponent);
4727 *exponent = param_exponent;
4728 proto_item_append_text(udcompparam_ti, " (Exponent=%u)", param_exponent);
4729 offset += 1;
4730 break;
4731
4732 case COMP_BLOCK_SCALE2: /* 2 */
4733 /* Separate into integer and fractional bits? */
4734 proto_tree_add_item(udcompparam_tree, hf_oran_blockScaler,
4735 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4736 offset++;
4737 break;
4738
4739 case COMP_U_LAW3: /* 3 */
4740 /* compBitWidth, compShift */
4741 proto_tree_add_item(udcompparam_tree, hf_oran_compBitWidth,
4742 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4743 proto_tree_add_item(udcompparam_tree, hf_oran_compShift,
4744 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4745 offset += 1;
4746 break;
4747
4748 case BFP_AND_SELECTIVE_RE5: /* 5 */
4749 {
4750 /* sReSMask (exponent in middle!) */
4751 proto_item *sresmask_ti;
4752 sresmask_ti = proto_tree_add_bitmask_ret_uint64(udcompparam_tree, tvb, offset,
4753 hf_oran_sReSMask,
4754 ett_oran_sresmask,
4755 sres_mask_flags,
4756 ENC_NA0x00000000,
4757 &param_sresmask);
4758
4759 /* Get rid of exponent-shaped gap */
4760 param_sresmask = ((param_sresmask >> 4) & 0x0f00) | (param_sresmask & 0xff);
4761 unsigned res = 0;
4762 for (unsigned n=0; n < 12; n++) {
4763 if ((param_sresmask >> n) & 0x1) {
4764 res++;
4765 }
4766 }
4767 proto_item_append_text(sresmask_ti, " (%2u REs)", res);
4768
4769 /* exponent */
4770 proto_tree_add_item_ret_uint(udcompparam_tree, hf_oran_exponent,
4771 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &param_exponent);
4772 *sReSMask = (uint16_t)param_sresmask;
4773 *exponent = param_exponent;
4774
4775 proto_item_append_text(udcompparam_ti, " (exponent=%u, %u REs)", *exponent, res);
4776 offset += 2;
4777 break;
4778 }
4779
4780 case MOD_COMPR_AND_SELECTIVE_RE6: /* 6 */
4781 {
4782 /* sReSMask (exponent in middle!) */
4783 proto_item *sresmask_ti;
4784
4785 sresmask_ti = proto_tree_add_bitmask_ret_uint64(udcompparam_tree, tvb, offset,
4786 hf_oran_sReSMask,
4787 ett_oran_sresmask,
4788 sres_mask_flags,
4789 ENC_NA0x00000000,
4790 &param_sresmask);
4791
4792 /* Get rid of reserved-shaped gap */
4793 param_sresmask = ((param_sresmask >> 4) & 0x0f00) | (param_sresmask & 0xff);
4794 unsigned res = 0;
4795 for (unsigned n=0; n < 12; n++) {
4796 if ((param_sresmask >> n) & 0x1) {
4797 res++;
4798 }
4799 }
4800 proto_item_append_text(sresmask_ti, " (%u REs)", res);
4801
4802 /* reserved (4 bits) */
4803 proto_tree_add_item(udcompparam_tree, hf_oran_reserved_last_4bits,
4804 tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
4805 *sReSMask = (uint16_t)param_sresmask;
4806
4807 proto_item_append_text(udcompparam_ti, " (%u REs)", res);
4808 offset += 2;
4809 break;
4810 }
4811
4812 default:
4813 /* reserved (set to all zeros), but how many bytes?? */
4814 break;
4815 }
4816
4817 proto_item_set_len(udcompparam_ti, offset-start_offset);
4818 return offset;
4819}
4820
4821
4822/* Dissect ciCompHdr (channel information compression header, 7.5.2.15) */
4823/* bit_width and comp_meth are out params */
4824static int dissect_cicomphdr(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree, unsigned offset,
4825 unsigned *bit_width, unsigned *comp_meth, uint8_t *comp_opt)
4826{
4827 /* Subtree */
4828 proto_item *cicomphdr_ti = proto_tree_add_string_format(tree, hf_oran_ciCompHdr,
4829 tvb, offset, 1, "",
4830 "ciCompHdr");
4831 proto_tree *cicomphdr_tree = proto_item_add_subtree(cicomphdr_ti, ett_oran_cicomphdr);
4832
4833 /* ciIqWidth */
4834 uint32_t hdr_iq_width;
4835 proto_item *iq_width_item = proto_tree_add_item_ret_uint(cicomphdr_tree, hf_oran_ciCompHdrIqWidth , tvb, offset, 1, ENC_NA0x00000000, &hdr_iq_width);
4836 hdr_iq_width = (hdr_iq_width) ? hdr_iq_width : 16;
4837 if (bit_width) {
4838 *bit_width = hdr_iq_width;
4839 }
4840 proto_item_append_text(iq_width_item, " (%u bits)", hdr_iq_width);
4841
4842 /* ciCompMeth */
4843 uint32_t ci_comp_meth;
4844 proto_tree_add_item_ret_uint(cicomphdr_tree, hf_oran_ciCompHdrMeth, tvb, offset, 1, ENC_NA0x00000000, &ci_comp_meth);
4845 if (comp_meth) {
4846 *comp_meth = ci_comp_meth;
4847 }
4848
4849 /* ciCompOpt */
4850 uint32_t opt;
4851 proto_tree_add_item_ret_uint(cicomphdr_tree, hf_oran_ciCompOpt, tvb, offset, 1, ENC_NA0x00000000, &opt);
4852 *comp_opt = opt;
4853 offset += 1;
4854
4855 /* Summary */
4856 proto_item_append_text(cicomphdr_ti, " (IqWidth=%u, ciCompMeth=%s, ciCompOpt=%s)",
4857 hdr_iq_width,
4858 rval_to_str_const(ci_comp_meth, ud_comp_header_meth, "Unknown"),
4859 (*comp_opt) ? "compression per PRB" : "compression per UE");
4860 return offset;
4861}
4862
4863static void dissect_payload_version(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, unsigned offset)
4864{
4865 unsigned version;
4866 proto_item *ti = proto_tree_add_item_ret_uint(tree, hf_oran_payload_version, tvb, offset, 1, ENC_NA0x00000000, &version);
4867 if (version != 1) {
4868 expert_add_info_format(pinfo, ti, &ei_oran_version_unsupported,
4869 "PayloadVersion %u not supported by dissector (only 1 is known)",
4870 version);
4871 /* TODO: should throw an exception? */
4872 }
4873}
4874
4875static void show_link_to_acknack_request(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo,
4876 ack_nack_request_t *request)
4877{
4878 /* Request frame */
4879 proto_item *ti = proto_tree_add_uint(tree, hf_oran_acknack_request_frame,
4880 tvb, 0, 0, request->request_frame_number);
4881 PROTO_ITEM_SET_GENERATED(ti)proto_item_set_generated((ti));
4882
4883 /* Work out gap between frames (in ms) */
4884 int seconds_between_packets = (int)
4885 (pinfo->abs_ts.secs - request->request_frame_time.secs);
4886 int nseconds_between_packets =
4887 pinfo->abs_ts.nsecs - request->request_frame_time.nsecs;
4888
4889 int total_gap = (seconds_between_packets*1000) +
4890 ((nseconds_between_packets+500000) / 1000000);
4891
4892 ti = proto_tree_add_uint(tree, hf_oran_acknack_request_time,
4893 tvb, 0, 0, total_gap);
4894 PROTO_ITEM_SET_GENERATED(ti)proto_item_set_generated((ti));
4895
4896 /* Type of request */
4897 ti = proto_tree_add_uint(tree, hf_oran_acknack_request_type,
4898 tvb, 0, 0, request->requestType);
4899 PROTO_ITEM_SET_GENERATED(ti)proto_item_set_generated((ti));
4900}
4901
4902static void show_link_to_acknack_response(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo,
4903 ack_nack_request_t *response)
4904{
4905 if (response->response_frame_number == 0) {
4906 /* Requests may not get a response, and can't always tell when to expect one */
4907 return;
4908 }
4909
4910 /* Response frame */
4911 proto_item *ti = proto_tree_add_uint(tree, hf_oran_acknack_response_frame,
4912 tvb, 0, 0, response->response_frame_number);
4913 PROTO_ITEM_SET_GENERATED(ti)proto_item_set_generated((ti));
4914
4915 /* Work out gap between frames (in ms) */
4916 int seconds_between_packets = (int)
4917 (response->response_frame_time.secs - pinfo->abs_ts.secs);
4918 int nseconds_between_packets =
4919 response->response_frame_time.nsecs - pinfo->abs_ts.nsecs;
4920
4921 int total_gap = (seconds_between_packets*1000) +
4922 ((nseconds_between_packets+500000) / 1000000);
4923
4924 ti = proto_tree_add_uint(tree, hf_oran_acknack_response_time,
4925 tvb, 0, 0, total_gap);
4926 PROTO_ITEM_SET_GENERATED(ti)proto_item_set_generated((ti));
4927}
4928
4929
4930
4931/* Control plane dissector (section 7). */
4932static int dissect_oran_c(tvbuff_t *tvb, packet_info *pinfo,
4933 proto_tree *tree, oran_tap_info *tap_info, void *data _U___attribute__((unused)))
4934{
4935 /* Hidden filter for plane */
4936 proto_item *plane_ti = proto_tree_add_item(tree, hf_oran_cplane, tvb, 0, 0, ENC_NA0x00000000);
4937 PROTO_ITEM_SET_HIDDEN(plane_ti)proto_item_set_hidden((plane_ti));
4938
4939 /* Set up structures needed to add the protocol subtree and manage it */
4940 unsigned offset = 0;
4941
4942 col_set_str(pinfo->cinfo, COL_PROTOCOL, "O-RAN-FH-C");
4943 col_set_str(pinfo->cinfo, COL_INFO, "C-Plane");
4944
4945 tap_info->userplane = false0;
4946
4947 /* Create display subtree for the protocol */
4948 proto_item *protocol_item = proto_tree_add_item(tree, proto_oran, tvb, 0, -1, ENC_NA0x00000000);
4949 proto_item_append_text(protocol_item, "-C");
4950 proto_tree *oran_tree = proto_item_add_subtree(protocol_item, ett_oran);
4951
4952 /* ecpriRtcid (eAxC ID) */
4953 uint16_t eAxC;
4954 addPcOrRtcid(tvb, oran_tree, &offset, hf_oran_ecpri_rtcid, &eAxC);
4955 tap_info->eaxc = eAxC;
4956
4957 /* Look up any existing conversation state for eAxC+plane */
4958 uint32_t key = make_flow_key(pinfo, eAxC, ORAN_C_PLANE0, false0);
4959 flow_state_t* state = (flow_state_t*)wmem_tree_lookup32(flow_states_table, key);
4960
4961 /* Message identifier */
4962 uint8_t seq_id;
4963 proto_item *seq_id_ti;
4964 offset = addSeqid(tvb, oran_tree, offset, ORAN_C_PLANE0, &seq_id, &seq_id_ti, pinfo);
4965
4966 /* Section common subtree */
4967 int section_tree_offset = offset;
4968 proto_item *sectionHeading = proto_tree_add_string_format(oran_tree, hf_oran_c_section_common,
4969 tvb, offset, 0, "", "C-Plane Section Type ");
4970 proto_tree *section_tree = proto_item_add_subtree(sectionHeading, ett_oran_c_section_common);
4971
4972 /* Peek ahead at the section type */
4973 uint32_t sectionType = 0;
4974 sectionType = tvb_get_uint8(tvb, offset+5);
4975
4976 uint32_t scs = 0;
4977 proto_item *scs_ti = NULL((void*)0);
4978
4979 /* dataDirection */
4980 uint32_t direction = 0;
4981 proto_item *datadir_ti = proto_tree_add_item_ret_uint(section_tree, hf_oran_data_direction, tvb, offset, 1, ENC_NA0x00000000, &direction);
4982 tap_info->uplink = (direction==0);
4983
4984 /* Update/report status of conversation */
4985 if (!PINFO_FD_VISITED(pinfo)((pinfo)->fd->visited)) {
4986
4987 if (state == NULL((void*)0)) {
4988 /* Allocate new state */
4989 state = wmem_new0(wmem_file_scope(), flow_state_t)((flow_state_t*)wmem_alloc0((wmem_file_scope()), sizeof(flow_state_t
)))
;
4990 state->ack_nack_requests = wmem_tree_new(wmem_epan_scope());
4991 wmem_tree_insert32(flow_states_table, key, state);
4992 }
4993
4994 /* Check sequence analysis status */
4995 if (state->last_frame_seen[direction] && (seq_id != state->next_expected_sequence_number[direction])) {
4996 /* Store this result */
4997 flow_result_t *result = wmem_new0(wmem_file_scope(), flow_result_t)((flow_result_t*)wmem_alloc0((wmem_file_scope()), sizeof(flow_result_t
)))
;
4998 result->unexpected_seq_number = true1;
4999 result->expected_sequence_number = state->next_expected_sequence_number[direction];
5000 result->previous_frame = state->last_frame[direction];
5001 wmem_tree_insert32(flow_results_table, pinfo->num, result);
5002 }
5003 /* Update conversation info */
5004 state->last_frame[direction] = pinfo->num;
5005 state->last_frame_seen[direction] = true1;
5006 state->next_expected_sequence_number[direction] = (seq_id+1) % 256;
5007 }
5008
5009 /* Show any issues associated with this frame number */
5010 flow_result_t *result = wmem_tree_lookup32(flow_results_table, pinfo->num);
5011 if (result!=NULL((void*)0) && result->unexpected_seq_number) {
5012 expert_add_info_format(pinfo, seq_id_ti,
5013 (direction == DIR_UPLINK0) ?
5014 &ei_oran_cplane_unexpected_sequence_number_ul :
5015 &ei_oran_cplane_unexpected_sequence_number_dl,
5016 "Sequence number %u expected, but got %u",
5017 result->expected_sequence_number, seq_id);
5018
5019 /* Update tap info */
5020 uint32_t missing_sns = (256 + seq_id - result->expected_sequence_number) % 256;
5021 /* Don't get confused by being slightly out of order.. */
5022 if (missing_sns < 128) {
5023 tap_info->missing_sns = missing_sns;
5024 }
5025 else {
5026 tap_info->missing_sns = 0;
5027 }
5028
5029 /* TODO: could add previous/next frames (in seqId tree?) ? */
5030 }
5031
5032 /* payloadVersion */
5033 dissect_payload_version(section_tree, tvb, pinfo, offset);
5034
5035 /* filterIndex */
5036 if (sectionType == SEC_C_SLOT_CONTROL || sectionType == SEC_C_ACK_NACK_FEEDBACK) {
5037 /* scs (for ST4 and ST8) */
5038 scs_ti = proto_tree_add_item_ret_uint(section_tree, hf_oran_frameStructure_subcarrier_spacing, tvb, offset, 1, ENC_NA0x00000000, &scs);
5039 }
5040 else if (sectionType == SEC_C_RRM_MEAS_REPORTS || sectionType == SEC_C_REQUEST_RRM_MEAS) {
5041 /* reserved (4 bits) */
5042 proto_tree_add_item(section_tree, hf_oran_reserved_last_4bits, tvb, offset, 1, ENC_NA0x00000000);
5043 }
5044 else if (sectionType != SEC_C_LAA) {
5045 /* filterIndex (most common case) */
5046 proto_tree_add_item(section_tree, hf_oran_filter_index, tvb, offset, 1, ENC_NA0x00000000);
5047 }
5048 offset += 1;
5049
5050 unsigned ref_a_offset = offset;
5051 /* frameId */
5052 uint32_t frameId = 0;
5053 proto_tree_add_item_ret_uint(section_tree, hf_oran_frame_id, tvb, offset, 1, ENC_NA0x00000000, &frameId);
5054 tap_info->frame = frameId;
5055 offset += 1;
5056
5057 /* subframeId */
5058 uint32_t subframeId = 0;
5059 proto_tree_add_item_ret_uint(section_tree, hf_oran_subframe_id, tvb, offset, 1, ENC_NA0x00000000, &subframeId);
5060 /* slotId */
5061 uint32_t slotId = 0;
5062 proto_tree_add_item_ret_uint(section_tree, hf_oran_slot_id, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &slotId);
5063 tap_info->slot = slotId;
5064 offset++;
5065
5066 /* startSymbolId */
5067 uint32_t startSymbolId = 0;
5068 proto_item *ssid_ti = NULL((void*)0);
5069 if ((sectionType == SEC_C_ACK_NACK_FEEDBACK) || /* Section Type 8 */
5070 (sectionType == SEC_C_SINR_REPORTING)) { /* Section Type 9 */
5071 /* symbolId */
5072 proto_tree_add_item_ret_uint(section_tree, hf_oran_symbolId, tvb, offset, 1, ENC_NA0x00000000, &startSymbolId);
5073 }
5074 else if (sectionType != SEC_C_LAA) {
5075 /* startSymbolId is in most section types */
5076 ssid_ti = proto_tree_add_item_ret_uint(section_tree, hf_oran_start_symbol_id, tvb, offset, 1, ENC_NA0x00000000, &startSymbolId);
5077 if (startSymbolId && (sectionType == SEC_C_RRM_MEAS_REPORTS)) { /* Section Type 10 */
5078 proto_item_append_text(ssid_ti, " (should be 0 for ST10!)");
5079 expert_add_info_format(pinfo, ssid_ti, &ei_oran_st10_startsymbolid_not_0,
5080 "startSymbolId should be 0 for ST10 - found %u", startSymbolId);
5081 }
5082 }
5083 else {
5084 /* reserved (6 bits) */
5085 proto_tree_add_item(section_tree, hf_oran_reserved_last_6bits, tvb, offset, 1, ENC_NA0x00000000);
5086 }
5087 offset++;
5088
5089 char id[16];
5090 snprintf(id, 16, "%d-%d-%d-%d", frameId, subframeId, slotId, startSymbolId);
5091 proto_item *pi = proto_tree_add_string(section_tree, hf_oran_refa, tvb, ref_a_offset, 3, id);
5092 proto_item_set_generated(pi);
5093
5094 uint32_t cmd_scope = 0;
5095 bool_Bool st8_ready = false0;
5096
5097 /* numberOfSections (or whatever section has instead) */
5098 uint32_t nSections = 0;
5099 if (sectionType == SEC_C_SLOT_CONTROL) { /* Section Type 4 */
5100 /* Slot Control has these fields instead */
5101 /* reserved (4 bits) */
5102 proto_tree_add_item(section_tree, hf_oran_reserved_4bits, tvb, offset, 1, ENC_NA0x00000000);
5103 /* cmdScope (4 bits) */
5104 proto_tree_add_item_ret_uint(section_tree, hf_oran_cmd_scope, tvb, offset, 1, ENC_NA0x00000000, &cmd_scope);
5105 }
5106 else if (sectionType == SEC_C_ACK_NACK_FEEDBACK) { /* Section Type 8 */
5107 /* reserved (7 bits) */
5108 proto_tree_add_item(section_tree, hf_oran_reserved_7bits, tvb, offset, 1, ENC_NA0x00000000);
5109 /* ready (1 bit) */
5110 /* TODO: when set, ready in slotId+1.. */
5111 proto_tree_add_item_ret_boolean(section_tree, hf_oran_ready, tvb, offset, 1, ENC_NA0x00000000, &st8_ready);
5112 if (!st8_ready) {
5113 /* SCS value is ignored, and may be set to any value by O-RU */
5114 proto_item_append_text(scs_ti, " (ignored)");
5115 }
5116 }
5117 else if (sectionType != SEC_C_LAA) {
5118 /* numberOfSections */
5119 proto_tree_add_item_ret_uint(section_tree, hf_oran_numberOfSections, tvb, offset, 1, ENC_NA0x00000000, &nSections);
5120 }
5121 else {
5122 proto_tree_add_item(section_tree, hf_oran_reserved_8bits, tvb, offset, 1, ENC_NA0x00000000);
5123 }
5124 offset++;
5125
5126 /* sectionType */
5127 proto_tree_add_item_ret_uint(section_tree, hf_oran_sectionType, tvb, offset, 1, ENC_NA0x00000000, &sectionType);
5128 offset += 1;
5129
5130 /* Check that dataDirection is consistent with section type */
5131 if (sectionType == SEC_C_SINR_REPORTING && direction != 0) { /* Section Type 9 */
5132 expert_add_info(pinfo, datadir_ti, &ei_oran_st9_not_ul);
5133 }
5134 if (sectionType == SEC_C_RRM_MEAS_REPORTS && direction != 0) { /* Section Type 10 */
5135 expert_add_info(pinfo, datadir_ti, &ei_oran_st10_not_ul);
5136 }
5137
5138 /* Note this section type in stats */
5139 if (sectionType < SEC_C_MAX_INDEX) {
5140 tap_info->section_types[sectionType] = true1;
5141 }
5142
5143 /* Section-type-specific fields following common header (white entries in Section Type diagrams) */
5144 unsigned bit_width = 0;
5145 int comp_meth = 0;
5146 proto_item *comp_meth_ti;
5147 unsigned ci_comp_method = 0;
5148 uint8_t ci_comp_opt = 0;
5149
5150 uint32_t num_ues = 0;
5151 uint32_t number_of_acks = 0, number_of_nacks = 0;
5152
5153 uint32_t num_sinr_per_prb = 0;
5154
5155 switch (sectionType) {
5156 case SEC_C_UNUSED_RB: /* Section Type 0 */
5157 /* timeOffset */
5158 proto_tree_add_item(section_tree, hf_oran_timeOffset, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5159 offset += 2;
5160 /* frameStructure */
5161 offset = dissect_frame_structure(section_tree, tvb, offset,
5162 subframeId, slotId);
5163
5164 /* cpLength */
5165 proto_tree_add_item(section_tree, hf_oran_cpLength, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5166 offset += 2;
5167 /* reserved */
5168 proto_tree_add_item(section_tree, hf_oran_reserved_8bits, tvb, offset, 1, ENC_NA0x00000000);
5169 offset += 1;
5170 break;
5171
5172 case SEC_C_NORMAL: /* Section Type 1 */
5173 case SEC_C_UE_SCHED: /* Section Type 5 */
5174 /* udCompHdr */
5175 offset = dissect_udcomphdr(tvb, pinfo, section_tree, offset,
5176 (direction==1), /* ignore for DL */
5177 &bit_width, &comp_meth, &comp_meth_ti);
5178 /* reserved */
5179 proto_tree_add_item(section_tree, hf_oran_reserved_8bits, tvb, offset, 1, ENC_NA0x00000000);
5180 offset += 1;
5181 break;
5182
5183 case SEC_C_SLOT_CONTROL: /* Section Type 4 */
5184 break;
5185
5186 case SEC_C_PRACH: /* Section Type 3 */
5187 /* timeOffset */
5188 proto_tree_add_item(section_tree, hf_oran_timeOffset, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5189 offset += 2;
5190 /* frameStructure */
5191 offset = dissect_frame_structure(section_tree, tvb, offset,
5192 subframeId, slotId);
5193 /* cpLength */
5194 proto_tree_add_item(section_tree, hf_oran_cpLength, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5195 offset += 2;
5196 /* udCompHdr */
5197 offset = dissect_udcomphdr(tvb, pinfo, section_tree, offset,
5198 (direction==1), /* ignore for DL */
5199 &bit_width, &comp_meth, &comp_meth_ti);
5200 break;
5201
5202 case SEC_C_CH_INFO: /* Section Type 6 */
5203 /* numberOfUEs */
5204 proto_tree_add_item_ret_uint(section_tree, hf_oran_numberOfUEs, tvb, offset, 1, ENC_NA0x00000000, &num_ues);
5205 offset += 1;
5206 /* ciCompHdr (was reserved) */
5207 offset = dissect_cicomphdr(tvb, pinfo, section_tree, offset, &bit_width, &ci_comp_method, &ci_comp_opt);
5208
5209 /* Number of sections may not be filled in (at all, or correctly), so set to the number of UEs.
5210 The data entries are per-UE... they don't have a sectionID, but they could have section extensions... */
5211 if (nSections == 0 || num_ues > nSections) {
5212 nSections = num_ues;
5213 }
5214 break;
5215
5216 case SEC_C_RSVD2:
5217 break;
5218
5219 case SEC_C_LAA: /* Section Type 7 */
5220 proto_tree_add_item(section_tree, hf_oran_reserved_16bits, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5221 offset += 2;
5222 break;
5223
5224 case SEC_C_ACK_NACK_FEEDBACK: /* Section Type 8 */
5225 /* numberOfAcks (1 byte) */
5226 proto_tree_add_item_ret_uint(section_tree, hf_oran_number_of_acks, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &number_of_acks);
5227 offset += 1;
5228 /* numberOfNacks (1 byte) */
5229 proto_tree_add_item_ret_uint(section_tree, hf_oran_number_of_nacks, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &number_of_nacks);
5230 offset += 1;
5231
5232 /* Show ACKs and NACKs. For both, try to link back to request. */
5233 for (unsigned int n=1; n <= number_of_acks; n++) {
5234 uint32_t ackid;
5235 proto_item *ack_ti;
5236 ack_ti = proto_tree_add_item_ret_uint(section_tree, hf_oran_ackid, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &ackid);
5237 offset += 2;
5238
5239 /* Look up request table in state (which really should be set by now, but test anyway). */
5240 if (state && state->ack_nack_requests) {
5241 ack_nack_request_t *request = wmem_tree_lookup32(state->ack_nack_requests, ackid);
5242 if (request != NULL((void*)0)) {
5243 /* On first pass, update with this response */
5244 if (!PINFO_FD_VISITED(pinfo)((pinfo)->fd->visited)) {
5245 request->response_frame_number = pinfo->num;
5246 request->response_frame_time = pinfo->abs_ts;
5247 }
5248
5249 /* Show request details */
5250 show_link_to_acknack_request(section_tree, tvb, pinfo, request);
5251 }
5252 else {
5253 /* Request not found */
5254 expert_add_info_format(pinfo, ack_ti, &ei_oran_acknack_no_request,
5255 "Response for ackId=%u received, but no request found",
5256 ackid);
5257 }
5258 }
5259 }
5260 for (unsigned int m=1; m <= number_of_nacks; m++) {
5261 uint32_t nackid;
5262 proto_item *nack_ti = proto_tree_add_item_ret_uint(section_tree, hf_oran_nackid, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &nackid);
5263 offset += 2;
5264
5265 expert_add_info_format(pinfo, nack_ti, &ei_oran_st8_nackid,
5266 "Received Nack for ackNackId=%u",
5267 nackid);
5268
5269 /* Look up request table in state. */
5270 if (state && state->ack_nack_requests) {
5271 ack_nack_request_t *request = wmem_tree_lookup32(state->ack_nack_requests, nackid);
5272 if (request) {
5273 /* On first pass, update with this response */
5274 if (!PINFO_FD_VISITED(pinfo)((pinfo)->fd->visited)) {
5275 request->response_frame_number = pinfo->num;
5276 request->response_frame_time = pinfo->abs_ts;
5277 }
5278
5279 /* Show request details */
5280 show_link_to_acknack_request(section_tree, tvb, pinfo, request);
5281 }
5282 else {
5283 /* Request not found */
5284 expert_add_info_format(pinfo, nack_ti, &ei_oran_acknack_no_request,
5285 "Response for nackId=%u received, but no request found",
5286 nackid);
5287 }
5288 }
5289 }
5290 break;
5291
5292 case SEC_C_SINR_REPORTING: /* Section Type 9 */
5293 {
5294 /* numSinrPerPrb (3 bits) */
5295 proto_item *nspp_ti;
5296 nspp_ti = proto_tree_add_item_ret_uint(section_tree, hf_oran_num_sinr_per_prb, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &num_sinr_per_prb);
5297 switch (num_sinr_per_prb) {
5298 case 0:
5299 num_sinr_per_prb = 1; break;
5300 case 1:
5301 num_sinr_per_prb = 2; break;
5302 case 2:
5303 num_sinr_per_prb = 3; break;
5304 case 3:
5305 num_sinr_per_prb = 4; break;
5306 case 4:
5307 num_sinr_per_prb = 6; break;
5308 case 5:
5309 num_sinr_per_prb = 12; break;
5310
5311 default:
5312 proto_item_append_text(nspp_ti, " (invalid)");
5313 num_sinr_per_prb = 1;
5314 expert_add_info_format(pinfo, nspp_ti, &ei_oran_num_sinr_per_prb_unknown,
5315 "Invalid numSinrPerPrb value (%u)",
5316 num_sinr_per_prb);
5317 }
5318
5319 /* reserved (13 bits) */
5320 proto_tree_add_item(section_tree, hf_oran_reserved_last_5bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5321 offset += 1;
5322 proto_tree_add_item(section_tree, hf_oran_reserved_8bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5323 offset += 1;
5324 break;
5325 }
5326
5327 case SEC_C_RRM_MEAS_REPORTS: /* Section Type 10 */
5328 case SEC_C_REQUEST_RRM_MEAS: /* Section Type 11 */
5329 /* reserved (16 bits) */
5330 proto_tree_add_item(section_tree, hf_oran_reserved_16bits, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5331 offset += 2;
5332 break;
5333 };
5334
5335 /* Update udCompHdr details in state for UL U-Plane */
5336 if (state && direction==0) {
5337 switch (sectionType) {
5338 case SEC_C_NORMAL: /* Section Type 1 */
5339 case SEC_C_PRACH: /* Section Type 3 */
5340 case SEC_C_UE_SCHED: /* Section Type 5 */
5341 state->ul_ud_comp_hdr_set = true1;
5342 state->ul_ud_comp_hdr_bit_width = bit_width;
5343 state->ul_ud_comp_hdr_compression = comp_meth;
5344 state->ul_ud_comp_hdr_frame = pinfo->num;
5345 break;
5346 default:
5347 break;
5348 }
5349 }
5350
5351
5352 proto_item_append_text(sectionHeading, "%d, %s, frameId: %d, subframeId: %d, slotId: %d, startSymbolId: %d",
5353 sectionType, val_to_str_const(direction, data_direction_vals, "Unknown"),
5354 frameId, subframeId, slotId, startSymbolId);
5355 if (nSections) {
5356 proto_item_append_text(sectionHeading, ", numberOfSections=%u", nSections);
5357 }
5358
5359 write_pdu_label_and_info(protocol_item, NULL((void*)0), pinfo, ", Type: %2d %s", sectionType,
5360 rval_to_str_const(sectionType, section_types_short, "Unknown"));
5361
5362 /* Set actual length of C-Plane section header */
5363 proto_item_set_len(section_tree, offset - section_tree_offset);
5364
5365 if (sectionType == SEC_C_ACK_NACK_FEEDBACK) {
5366 write_pdu_label_and_info(oran_tree, section_tree, pinfo,
5367 (st8_ready) ? " (Ready)" : " (ACK)");
5368 }
5369
5370
5371 /* Section type 4 doesn't have normal sections, so deal with here before normal sections */
5372 if (sectionType == SEC_C_SLOT_CONTROL) {
5373 /* numberOfST4Cmds */
5374 uint32_t no_st4_cmds, st4_cmd_len, num_slots, ack_nack_req_id, st4_cmd_type;
5375 proto_item *no_ti = proto_tree_add_item_ret_uint(section_tree, hf_oran_number_of_st4_cmds,
5376 tvb, offset, 1, ENC_NA0x00000000, &no_st4_cmds);
5377 if (no_st4_cmds == 0) {
5378 expert_add_info_format(pinfo, no_ti, &ei_oran_st4_no_cmds,
5379 "Not valid for ST4 to carry no commands");
5380 }
5381 offset += 1;
5382
5383 /* reserved (1 byte) */
5384 proto_tree_add_item(section_tree, hf_oran_reserved_8bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5385 offset += 1;
5386
5387 /* Loop over commands. Each has 8-byte common header, followed by cmd-specific payload */
5388 proto_item *len_ti;
5389 for (uint32_t n=0; n < no_st4_cmds; n++) {
5390 /* Table 7.4.6-2: Section Type 4 Command common header format */
5391 proto_item *hdr_ti = proto_tree_add_string_format(section_tree, hf_oran_st4_cmd_header,
5392 tvb, offset, 8, "",
5393 "Type 4 Command common header");
5394 proto_tree *hdr_tree = proto_item_add_subtree(hdr_ti, ett_oran_st4_cmd_header);
5395
5396 /* st4CmdType */
5397 proto_tree_add_item_ret_uint(hdr_tree, hf_oran_st4_cmd_type, tvb, offset, 1, ENC_NA0x00000000, &st4_cmd_type);
5398 offset += 1;
5399
5400 /* st4CmdLen */
5401 len_ti = proto_tree_add_item_ret_uint(hdr_tree, hf_oran_st4_cmd_len, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &st4_cmd_len);
5402 if (st4_cmd_len == 0) {
5403 /* Meaning of 0 not yet defined (v15.00) */
5404 proto_item_append_text(len_ti, " (reserved)");
5405 expert_add_info(pinfo, len_ti, &ei_oran_st4_zero_len_cmd);
5406 }
5407 else {
5408 proto_item_append_text(len_ti, " (%u bytes)", st4_cmd_len*4);
5409 }
5410 offset += 2;
5411
5412 /* numSlots */
5413 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);
5414 if (num_slots == 0) {
5415 proto_item_append_text(slots_ti, " (until changed)");
5416 }
5417 offset += 1;
5418
5419 /* ackNackReqId */
5420 proto_item *ack_nack_req_id_ti;
5421 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);
5422 offset += 2;
5423 if (ack_nack_req_id == 0) {
5424 proto_item_append_text(ack_nack_req_id_ti, " (no Section type 8 response expected)");
5425 }
5426
5427 /* reserved (16 bits) */
5428 proto_tree_add_item(hdr_tree, hf_oran_reserved_16bits, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5429 offset += 2;
5430
5431 /* Set common header summary */
5432 proto_item_append_text(hdr_ti, " (cmd=%s, len=%u, slots=%u, ackNackReqId=%u)",
5433 rval_to_str_const(st4_cmd_type, st4_cmd_type_vals, "Unknown"),
5434 st4_cmd_len, num_slots, ack_nack_req_id);
5435
5436 col_append_fstr(pinfo->cinfo, COL_INFO, " (%s)",
5437 rval_to_str_const(st4_cmd_type, st4_cmd_type_vals, "Unknown"));
5438
5439
5440 /* Subtree for this command body */
5441 proto_item *command_ti = proto_tree_add_string_format(section_tree, hf_oran_st4_cmd,
5442 tvb, offset, 0, "",
5443 "Type 4 Command (%s)", rval_to_str_const(st4_cmd_type, st4_cmd_type_vals, "Unknown"));
5444 proto_tree *command_tree = proto_item_add_subtree(command_ti, ett_oran_st4_cmd);
5445
5446 unsigned command_start_offset = offset;
5447
5448 /* Check fields compatible with chosen command. */
5449 if (st4_cmd_type==1) {
5450 if (num_slots != 0) {
5451 /* "the value of numSlots should be set to zero for this command type" */
5452 expert_add_info_format(pinfo, slots_ti, &ei_oran_numslots_not_zero,
5453 "numSlots should be zero for ST4 command 1 - found %u",
5454 num_slots);
5455 }
5456 }
5457
5458 if (st4_cmd_type==3 || st4_cmd_type==4) {
5459 if (startSymbolId != 0) {
5460 /* "expected reception window for the commands is the symbol zero reception window" */
5461 expert_add_info_format(pinfo, ssid_ti, &ei_oran_start_symbol_id_not_zero,
5462 "startSymbolId should be zero for ST4 commands 3&4 - found %u",
5463 startSymbolId);
5464 }
5465 }
5466
5467 /* Add format for this command */
5468 switch (st4_cmd_type) {
5469 case 1: /* TIME_DOMAIN_BEAM_CONFIG */
5470 {
5471 bool_Bool disable_tdbfns;
5472 uint32_t bfwcomphdr_iq_width, bfwcomphdr_comp_meth;
5473
5474 /* Hidden filter for bf */
5475 proto_item *bf_ti = proto_tree_add_item(command_tree, hf_oran_bf, tvb, 0, 0, ENC_NA0x00000000);
5476 PROTO_ITEM_SET_HIDDEN(bf_ti)proto_item_set_hidden((bf_ti));
5477
5478 /* reserved (2 bits) */
5479 proto_tree_add_item(command_tree, hf_oran_reserved_2bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5480 /* symbolMask (14 bits) */
5481 uint32_t symbol_mask;
5482 proto_item *symbol_mask_ti;
5483 offset = dissect_symbolmask(tvb, command_tree, offset, &symbol_mask, &symbol_mask_ti);
5484 /* 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 */
5485 /* lsb is symbol 0 */
5486 for (unsigned s=0; s < 14; s++) {
5487 if ((startSymbolId & (1 << s)) && (startSymbolId > s)) {
5488 proto_item_append_text(symbol_mask_ti, " (startSymbolId is %u, so some lower symbol bits ignored!)", startSymbolId);
5489 expert_add_info(pinfo, symbol_mask_ti, &ei_oran_start_symbol_id_bits_ignored);
5490 break;
5491 }
5492 }
5493
5494 /* disableTDBFNs (1 bit) */
5495 proto_tree_add_item_ret_boolean(command_tree, hf_oran_disable_tdbfns, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &disable_tdbfns);
5496
5497 /* tdBeamNum (15 bits) */
5498 proto_tree_add_item(command_tree, hf_oran_td_beam_num, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5499 offset += 2;
5500
5501 /* bfwCompHdr (2 subheaders - bfwIqWidth and bfwCompMeth)*/
5502 offset = dissect_bfwCompHdr(tvb, command_tree, offset,
5503 &bfwcomphdr_iq_width, &bfwcomphdr_comp_meth, &comp_meth_ti);
5504 /* reserved (3 bytes) */
5505 proto_tree_add_bits_item(command_tree, hf_oran_reserved, tvb, offset*8, 24, ENC_BIG_ENDIAN0x00000000);
5506 offset += 3;
5507
5508 if (disable_tdbfns) {
5509 /* No beamnum information to show so get out. */
5510 break;
5511 }
5512
5513 /* Read beam entries until reach end of command length */
5514 while ((offset - command_start_offset) < (st4_cmd_len * 4)) {
5515
5516 /* disableTDBFWs (1 bit) */
5517 bool_Bool disable_tdbfws;
5518 proto_tree_add_item_ret_boolean(command_tree, hf_oran_disable_tdbfws, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &disable_tdbfws);
5519
5520 /* tdBeamNum (15 bits) */
5521 proto_tree_add_item(command_tree, hf_oran_td_beam_num, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5522 offset += 2;
5523
5524 /* Showing BFWs? */
5525 if (!disable_tdbfws) {
5526
5527 /* bfwCompParam */
5528 unsigned exponent = 0;
5529 bool_Bool supported = false0;
5530 unsigned num_trx_entries;
5531 uint16_t *trx_entries;
5532 offset = dissect_bfwCompParam(tvb, command_tree, pinfo, offset, comp_meth_ti,
5533 &bfwcomphdr_comp_meth, &exponent, &supported,
5534 &num_trx_entries, &trx_entries);
5535
5536 /* Antenna count from preference */
5537 unsigned num_trx = pref_num_bf_antennas;
5538 int bit_offset = offset*8;
5539
5540 for (unsigned trx=0; trx < num_trx; trx++) {
5541 /* Create antenna subtree */
5542 int bfw_offset = bit_offset / 8;
5543 proto_item *bfw_ti = proto_tree_add_string_format(command_tree, hf_oran_bfw,
5544 tvb, bfw_offset, 0, "", "TRX %3u: (", trx);
5545 proto_tree *bfw_tree = proto_item_add_subtree(bfw_ti, ett_oran_bfw);
5546
5547 /* I value */
5548 /* Get bits, and convert to float. */
5549 uint32_t bits = tvb_get_bits32(tvb, bit_offset, bfwcomphdr_iq_width, ENC_BIG_ENDIAN0x00000000);
5550 float value = decompress_value(bits, bfwcomphdr_comp_meth, bfwcomphdr_iq_width, exponent);
5551 /* Add to tree. */
5552 proto_tree_add_float(bfw_tree, hf_oran_bfw_i, tvb, bit_offset/8,
5553 (bfwcomphdr_iq_width+7)/8, value);
5554 bit_offset += bfwcomphdr_iq_width;
5555 proto_item_append_text(bfw_ti, "I=%f ", value);
5556
5557 /* Leave a gap between I and Q values */
5558 proto_item_append_text(bfw_ti, " ");
5559
5560 /* Q value */
5561 /* Get bits, and convert to float. */
5562 bits = tvb_get_bits32(tvb, bit_offset, bfwcomphdr_iq_width, ENC_BIG_ENDIAN0x00000000);
5563 value = decompress_value(bits, bfwcomphdr_comp_meth, bfwcomphdr_iq_width, exponent);
5564 /* Add to tree. */
5565 proto_tree_add_float(bfw_tree, hf_oran_bfw_q, tvb, bit_offset/8,
5566 (bfwcomphdr_iq_width+7)/8, value);
5567 bit_offset += bfwcomphdr_iq_width;
5568 proto_item_append_text(bfw_ti, "Q=%f", value);
5569
5570 proto_item_append_text(bfw_ti, ")");
5571 proto_item_set_len(bfw_ti, (bit_offset+7)/8 - bfw_offset);
5572 }
5573 /* Need to round to next byte */
5574 offset = (bit_offset+7)/8;
5575 }
5576 }
5577 break;
5578 }
5579 case 2: /* TDD_CONFIG_PATTERN */
5580 /* reserved (2 bits) */
5581 proto_tree_add_item(command_tree, hf_oran_reserved_2bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5582 /* dirPattern (14 bits) */
5583 proto_tree_add_item(command_tree, hf_oran_dir_pattern, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5584 offset += 2;
5585
5586 /* reserved (2 bits) */
5587 proto_tree_add_item(command_tree, hf_oran_reserved_2bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5588 /* guardPattern (14 bits) */
5589 proto_tree_add_item(command_tree, hf_oran_guard_pattern, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5590 offset += 2;
5591 break;
5592
5593 case 3: /* TRX_CONTROL */
5594 {
5595 /* Only allowed cmdScope is ARRAY-COMMAND */
5596 if (cmd_scope != 0) {
5597 expert_add_info(pinfo, command_tree, &ei_oran_trx_control_cmd_scope);
5598 }
5599
5600 /* reserved (2 bits) */
5601 proto_tree_add_item(command_tree, hf_oran_reserved_2bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5602 /* log2MaskBits (4 bits) */
5603 unsigned log2maskbits;
5604 proto_tree_add_item_ret_uint(command_tree, hf_oran_log2maskbits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &log2maskbits);
5605 /* sleepMode */
5606 uint32_t sleep_mode;
5607 proto_tree_add_item_ret_uint(command_tree, hf_oran_sleepmode_trx, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &sleep_mode);
5608 offset += 1;
5609
5610 /* reserved (4 bits) */
5611 proto_tree_add_item(command_tree, hf_oran_reserved_4bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5612 /* numSlotsExt (20 bits) */
5613 uint32_t num_slots_ext;
5614 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);
5615 if (num_slots==0 && num_slots_ext==0) {
5616 proto_item_append_text(num_slots_ext_ti, " (undefined sleep period)");
5617 }
5618 else {
5619 /* Time should be rounded up according to SCS */
5620 float total = (float)(num_slots + num_slots_ext);
5621 /* From table 7.5.2.13-3 */
5622 float slot_length_by_scs[16] = { 1000, 500, 250, 125, 62.5, 31.25,
5623 0, 0, 0, 0, 0, 0, /* reserved */
5624 1000, 1000, 1000, 1000 };
5625 float slot_length = slot_length_by_scs[scs];
5626 /* Only using valid SCS. TODO: is this test ok? */
5627 if (slot_length != 0) {
5628 /* Round up to next slot */
5629 total = ((int)(total / slot_length) + 1) * slot_length;
5630 proto_item_append_text(num_slots_ext_ti, " (defined sleep period of %f us)", total);
5631 }
5632 }
5633 offset += 3;
5634
5635 /* reserved (2 bits) */
5636 proto_tree_add_item(command_tree, hf_oran_reserved_2bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5637
5638 /* symbolMask (14 bits) */
5639 uint32_t symbol_mask;
5640 proto_item *sm_ti;
5641 offset = dissect_symbolmask(tvb, command_tree, offset, &symbol_mask, &sm_ti);
5642 if (symbol_mask == 0x0) {
5643 proto_item_append_text(sm_ti, " (wake)");
5644 col_append_str(pinfo->cinfo, COL_INFO, " (wake)");
5645 }
5646 else if (symbol_mask == 0x3fff) {
5647 proto_item_append_text(sm_ti, " (sleep)");
5648 col_append_str(pinfo->cinfo, COL_INFO, " (sleep)");
5649 }
5650 else {
5651 expert_add_info_format(pinfo, sm_ti, &ei_oran_bad_symbolmask,
5652 "For non-zero sleepMode (%u), symbolMask should be 0x0 or 0x3fff - found 0x%05x",
5653 sleep_mode, symbol_mask);
5654 }
5655 offset += 2;
5656
5657 /* antMask (16-2048 bits). Size is lookup from log2MaskBits enum.. */
5658 unsigned antmask_length = 2;
5659 if (log2maskbits >= 4) {
5660 antmask_length = (1 << log2maskbits) / 8;
5661 }
5662 proto_item *ant_mask_ti = proto_tree_add_item(command_tree, hf_oran_antMask_trx_control, tvb, offset, antmask_length, ENC_NA0x00000000);
5663 /* show count */
5664 unsigned antenna_count = 0;
5665 for (unsigned b=0; b < antmask_length; b++) {
5666 uint8_t byte = tvb_get_uint8(tvb, offset+b);
5667 for (unsigned bit=0; bit < 8; bit++) {
5668 if ((1 << bit) & byte) {
5669 antenna_count++;
5670 }
5671 }
5672 }
5673 proto_item_append_text(ant_mask_ti, " (%u antennas)", antenna_count);
5674 offset += antmask_length;
5675
5676 /* Pad to next 4-byte boundary */
5677 offset = WS_ROUNDUP_4(offset)(((offset) + ((unsigned)(4U-1U))) & (~((unsigned)(4U-1U))
))
;
5678 break;
5679 }
5680
5681 case 4: /* ASM (advanced sleep mode) */
5682 /* reserved (2+4=6 bits) */
5683 proto_tree_add_item(command_tree, hf_oran_reserved_6bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5684 /* sleepMode (2 bits) */
5685 uint32_t sleep_mode;
5686 proto_tree_add_item_ret_uint(command_tree, hf_oran_sleepmode_asm, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &sleep_mode);
5687 offset += 1;
5688
5689 /* reserved (4 bits) */
5690 proto_tree_add_item(command_tree, hf_oran_reserved_4bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5691 /* numSlotsExt (20 bits) */
5692 proto_tree_add_item(command_tree, hf_oran_num_slots_ext, tvb, offset, 3, ENC_BIG_ENDIAN0x00000000);
5693 offset += 3;
5694
5695 /* reserved (2 bits) */
5696 proto_tree_add_item(command_tree, hf_oran_reserved_2bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5697 /* symbolMask (14 bits) */
5698 uint32_t symbol_mask;
5699 proto_item *sm_ti;
5700 offset = dissect_symbolmask(tvb, command_tree, offset, &symbol_mask, &sm_ti);
5701 if (symbol_mask == 0x0) {
5702 proto_item_append_text(sm_ti, " (wake)");
5703 col_append_str(pinfo->cinfo, COL_INFO, " (wake)");
5704 }
5705 else if (symbol_mask == 0x3fff) {
5706 proto_item_append_text(sm_ti, " (sleep)");
5707 col_append_str(pinfo->cinfo, COL_INFO, " (sleep)");
5708 }
5709 else {
5710 expert_add_info_format(pinfo, sm_ti, &ei_oran_bad_symbolmask,
5711 "For non-zero sleepMode (%u), symbolMask should be 0x0 or 0x3fff - found 0x%05x",
5712 sleep_mode, symbol_mask);
5713 }
5714 offset += 2;
5715
5716 /* reserved (2 bytes) */
5717 proto_tree_add_item(command_tree, hf_oran_reserved_16bits, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5718 offset += 2;
5719 break;
5720
5721 default:
5722 /* Error! */
5723 expert_add_info_format(pinfo, len_ti, &ei_oran_st4_unknown_cmd,
5724 "Dissected ST4 command (%u) not recognised",
5725 st4_cmd_type);
5726 break;
5727 }
5728
5729 /* Check apparent size of padding (0-3 bytes ok) */
5730 long padding_remaining = command_start_offset + (st4_cmd_len * 4) - offset;
5731 if (padding_remaining < 0 || padding_remaining > 3) {
5732 expert_add_info_format(pinfo, len_ti, &ei_oran_st4_wrong_len_cmd,
5733 "Dissected ST4 command does not match signalled st4CmdLen - set to %u (%u bytes) but dissected %u bytes",
5734 st4_cmd_len, st4_cmd_len*4, offset-command_start_offset);
5735 }
5736
5737 /* Advance by signalled length (needs to be aligned on 4-byte boundary) */
5738 offset = command_start_offset + (st4_cmd_len * 4);
5739
5740 /* Set end of command tree */
5741 proto_item_set_end(command_ti, tvb, offset);
5742
5743 if (ack_nack_req_id != 0 && state && state->ack_nack_requests) {
5744 if (!PINFO_FD_VISITED(pinfo)((pinfo)->fd->visited)) {
5745 /* Add this request into conversation state on first pass */
5746 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)))
;
5747 request_details->request_frame_number = pinfo->num;
5748 request_details->request_frame_time = pinfo->abs_ts;
5749 request_details->requestType = ST4Cmd1+st4_cmd_type-1;
5750
5751 wmem_tree_insert32(state->ack_nack_requests,
5752 ack_nack_req_id,
5753 request_details);
5754 }
5755 else {
5756 /* On later passes, try to link forward to ST8 response */
5757 ack_nack_request_t *response = wmem_tree_lookup32(state->ack_nack_requests,
5758 ack_nack_req_id);
5759 if (response) {
5760 show_link_to_acknack_response(section_tree, tvb, pinfo, response);
5761 }
5762 }
5763 }
5764 }
5765 }
5766 /* LAA doesn't have sections either.. */
5767 else if (sectionType == SEC_C_LAA) { /* Section Type 7 */
5768 /* 7.2.5 Table 6.4-6 */
5769 unsigned mcot;
5770 proto_item *mcot_ti;
5771
5772 /* laaMsgType */
5773 uint32_t laa_msg_type;
5774 proto_item *laa_msg_type_ti;
5775 laa_msg_type_ti = proto_tree_add_item_ret_uint(section_tree, hf_oran_laaMsgType, tvb, offset, 1, ENC_NA0x00000000, &laa_msg_type);
5776 /* laaMsgLen */
5777 uint32_t laa_msg_len;
5778 proto_item *len_ti = proto_tree_add_item_ret_uint(section_tree, hf_oran_laaMsgLen, tvb, offset, 1, ENC_NA0x00000000, &laa_msg_len);
5779 proto_item_append_text(len_ti, " (%u bytes)", 4*laa_msg_len);
5780 if (laa_msg_len == 0) {
5781 proto_item_append_text(len_ti, " (reserved)");
5782 }
5783 offset += 1;
5784
5785 int payload_offset = offset;
5786
5787 /* Payload */
5788 switch (laa_msg_type) {
5789 case 0:
5790 /* LBT_PDSCH_REQ */
5791 /* lbtHandle (16 bits) */
5792 proto_tree_add_item(section_tree, hf_oran_lbtHandle, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5793 offset += 2;
5794 /* lbtOffset (10 bits) */
5795 proto_tree_add_item(section_tree, hf_oran_lbtOffset, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5796 offset += 1;
5797 /* lbtMode (2 bits) */
5798 proto_tree_add_bits_item(section_tree, hf_oran_lbtMode, tvb, offset*8+2, 2, ENC_BIG_ENDIAN0x00000000);
5799 /* reserved (1 bit) */
5800 proto_tree_add_item(section_tree, hf_oran_reserved_bit4, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5801 /* lbtDeferFactor (3 bits) */
5802 proto_tree_add_item(section_tree, hf_oran_lbtDeferFactor, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5803 offset += 1;
5804 /* lbtBackoffCounter (10 bits) */
5805 proto_tree_add_item(section_tree, hf_oran_lbtBackoffCounter, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5806 offset += 1;
5807 /* MCOT (4 bits) */
5808 mcot_ti = proto_tree_add_item_ret_uint(section_tree, hf_oran_MCOT, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &mcot);
5809 if (mcot<1 || mcot>10) {
5810 proto_item_append_text(mcot_ti, " (should be in range 1-10!)");
5811 expert_add_info_format(pinfo, mcot_ti, &ei_oran_mcot_out_of_range,
5812 "MCOT seen with value %u (must be 1-10)", mcot);
5813
5814 }
5815 /* reserved (10 bits) */
5816 proto_tree_add_bits_item(section_tree, hf_oran_reserved, tvb, (offset*8)+6, 10, ENC_BIG_ENDIAN0x00000000);
5817 break;
5818 case 1:
5819 /* LBT_DRS_REQ */
5820 /* lbtHandle (16 bits) */
5821 proto_tree_add_item(section_tree, hf_oran_lbtHandle, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5822 offset += 2;
5823 /* lbtOffset (10 bits) */
5824 proto_tree_add_item(section_tree, hf_oran_lbtOffset, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5825 offset += 1;
5826 /* lbtMode (2 bits) */
5827 proto_tree_add_bits_item(section_tree, hf_oran_lbtMode, tvb, offset*8+2, 2, ENC_BIG_ENDIAN0x00000000);
5828 /* reserved (28 bits) */
5829 proto_tree_add_bits_item(section_tree, hf_oran_reserved, tvb, (offset*8)+4, 28, ENC_BIG_ENDIAN0x00000000);
5830 break;
5831 case 2:
5832 /* LBT_PDSCH_RSP */
5833 /* lbtHandle (16 bits) */
5834 proto_tree_add_item(section_tree, hf_oran_lbtHandle, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5835 offset += 2;
5836 /* lbtPdschRes (2 bits) */
5837 proto_tree_add_item(section_tree, hf_oran_lbtPdschRes, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5838 /* inParSF (1 bit) */
5839 proto_tree_add_item(section_tree, hf_oran_initialPartialSF, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5840 /* sfStatus (1 bit) */
5841 proto_tree_add_item(section_tree, hf_oran_sfStatus, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5842 /* sfnSf (12 bits) */
5843 proto_tree_add_item(section_tree, hf_oran_sfnSfEnd, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5844 offset += 2;
5845 /* reserved (24 bits) */
5846 proto_tree_add_bits_item(section_tree, hf_oran_reserved, tvb, (offset*8), 24, ENC_BIG_ENDIAN0x00000000);
5847 break;
5848 case 3:
5849 /* LBT_DRS_RSP */
5850 /* lbtHandle (16 bits) */
5851 proto_tree_add_item(section_tree, hf_oran_lbtHandle, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5852 offset += 2;
5853 /* lbtDrsRes (1 bit) */
5854 proto_tree_add_item(section_tree, hf_oran_lbtDrsRes, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5855 /* reserved (7 bits) */
5856 proto_tree_add_item(section_tree, hf_oran_reserved_last_7bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5857 break;
5858 case 4:
5859 /* LBT_Buffer_Error */
5860 /* lbtHandle (16 bits) */
5861 proto_tree_add_item(section_tree, hf_oran_lbtHandle, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5862 offset += 2;
5863 /* lbtBufErr (1 bit) */
5864 proto_tree_add_item(section_tree, hf_oran_lbtBufErr, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5865 /* reserved (7 bits) */
5866 proto_tree_add_item(section_tree, hf_oran_reserved_last_7bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5867 break;
5868 case 5:
5869 /* LBT_CWCONFIG_REQ */
5870 /* lbtHandle (16 bits) */
5871 proto_tree_add_item(section_tree, hf_oran_lbtHandle, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5872 offset += 2;
5873 /* lbtCWConfig_H (8 bits) */
5874 proto_tree_add_item(section_tree, hf_oran_lbtCWConfig_H, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5875 offset += 1;
5876 /* lbtCWConfig_T (8 bits) */
5877 proto_tree_add_item(section_tree, hf_oran_lbtCWConfig_T, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5878 offset += 1;
5879 /* lbtMode (2 bits) */
5880 proto_tree_add_bits_item(section_tree, hf_oran_lbtMode, tvb, offset*8, 2, ENC_BIG_ENDIAN0x00000000);
5881 /* lbtTrafficClass (3 bits) */
5882 proto_tree_add_item(section_tree, hf_oran_lbtTrafficClass, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5883 /* reserved (19 bits) */
5884 proto_tree_add_bits_item(section_tree, hf_oran_reserved, tvb, (offset*8)+5, 19, ENC_BIG_ENDIAN0x00000000);
5885 break;
5886 case 6:
5887 /* LBT_CWCONFIG_RSP */
5888 /* lbtHandle (16 bits) */
5889 proto_tree_add_item(section_tree, hf_oran_lbtHandle, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
5890 offset += 2;
5891 /* lbtCWR_Rst (1 bit) */
5892 proto_tree_add_item(section_tree, hf_oran_lbtCWR_Rst, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5893 /* reserved (7 bits) */
5894 proto_tree_add_item(section_tree, hf_oran_reserved_last_7bits, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
5895 break;
5896
5897 default:
5898 /* Unhandled! */
5899 expert_add_info_format(pinfo, laa_msg_type_ti, &ei_oran_laa_msg_type_unsupported,
5900 "laaMsgType %u not supported by dissector",
5901 laa_msg_type);
5902
5903 break;
5904 }
5905 /* For now just skip indicated length of bytes */
5906 offset = payload_offset + 4*(laa_msg_len+1);
5907 }
5908
5909
5910 /* Dissect each C section */
5911 for (uint32_t i = 0; i < nSections; ++i) {
5912 tvbuff_t *section_tvb = tvb_new_subset_length_caplen(tvb, offset, -1, -1);
5913 offset += dissect_oran_c_section(section_tvb, oran_tree, pinfo, state, sectionType, tap_info,
5914 protocol_item,
5915 subframeId, slotId,
5916 bit_width, ci_comp_method, ci_comp_opt,
5917 num_sinr_per_prb);
5918 }
5919
5920 /* Expert error if we are short of tvb by > 3 bytes */
5921 if (tvb_reported_length_remaining(tvb, offset) > 3) {
5922 expert_add_info_format(pinfo, protocol_item, &ei_oran_frame_length,
5923 "%u bytes remain at end of frame - should be 0-3",
5924 tvb_reported_length_remaining(tvb, offset));
5925 }
5926
5927 return tvb_captured_length(tvb);
5928}
5929
5930static int dissect_oran_u_re(tvbuff_t *tvb, proto_tree *tree,
5931 unsigned sample_number, int samples_offset,
5932 oran_tap_info *tap_info,
5933 unsigned sample_bit_width,
5934 int comp_meth,
5935 uint32_t exponent)
5936{
5937 /* I */
5938 unsigned i_bits = tvb_get_bits32(tvb, samples_offset, sample_bit_width, ENC_BIG_ENDIAN0x00000000);
5939 float i_value = decompress_value(i_bits, comp_meth, sample_bit_width, exponent);
5940 unsigned sample_len_in_bytes = ((samples_offset%8)+sample_bit_width+7)/8;
5941 proto_item *i_ti = proto_tree_add_float(tree, hf_oran_iSample, tvb, samples_offset/8, sample_len_in_bytes, i_value);
5942 proto_item_set_text(i_ti, "iSample: % 0.7f 0x%04x (RE-%2u in the PRB)", i_value, i_bits, sample_number);
5943 samples_offset += sample_bit_width;
5944 /* Q */
5945 unsigned q_bits = tvb_get_bits32(tvb, samples_offset, sample_bit_width, ENC_BIG_ENDIAN0x00000000);
5946 float q_value = decompress_value(q_bits, comp_meth, sample_bit_width, exponent);
5947 sample_len_in_bytes = ((samples_offset%8)+sample_bit_width+7)/8;
5948 proto_item *q_ti = proto_tree_add_float(tree, hf_oran_qSample, tvb, samples_offset/8, sample_len_in_bytes, q_value);
5949 proto_item_set_text(q_ti, "qSample: % 0.7f 0x%04x (RE-%2u in the PRB)", q_value, q_bits, sample_number);
5950 samples_offset += sample_bit_width;
5951
5952 /* Update RE stats */
5953 tap_info->num_res++;
5954 /* if (i_value == 0.0 && q_value == 0.0) { */
5955 /* TODO: is just checking bits from frame good enough - assuming this always corresponds to a zero value? */
5956 if (i_bits == 0 && q_bits == 0) {
5957 tap_info->num_res_zero++;
5958 }
5959 else {
5960 tap_info->non_zero_re_in_current_prb = true1;
5961 }
5962 return samples_offset;
5963}
5964
5965
5966static bool_Bool udcomplen_appears_present(bool_Bool udcomphdr_present, tvbuff_t *tvb, int offset)
5967{
5968 if (!udcomplen_heuristic_result_set) {
5969 /* All sections will start the same way */
5970 unsigned int section_bytes_before_field = (udcomphdr_present) ? 6 : 4;
5971
5972 /* Move offset back to the start of the section */
5973 offset -= section_bytes_before_field;
5974
5975 do {
5976 /* This field appears several bytes into the U-plane section */
5977 uint32_t length_remaining = tvb_reported_length_remaining(tvb, offset);
5978 /* Are there enough bytes to still read the length field? */
5979 if (section_bytes_before_field+2 > length_remaining) {
5980 udcomplen_heuristic_result = false0;
5981 udcomplen_heuristic_result_set = true1;
5982 break;
5983 }
5984
5985 /* Read the length field */
5986 uint16_t udcomplen = tvb_get_ntohs(tvb, offset+section_bytes_before_field);
5987
5988 /* Is this less than a valid section? Realistic minimal section will be bigger than this..
5989 * Could take into account numPrbU, etc */
5990 if (udcomplen < section_bytes_before_field+2) {
5991 udcomplen_heuristic_result = false0;
5992 udcomplen_heuristic_result_set = true1;
5993 break;
5994 }
5995
5996 /* Does this section fit into the frame? */
5997 if (udcomplen > length_remaining) {
5998 udcomplen_heuristic_result = false0;
5999 udcomplen_heuristic_result_set = true1;
6000 break;
6001 }
6002
6003 /* Move past this section */
6004 offset += udcomplen;
6005
6006 /* Are we at the end of the frame? */
6007 /* TODO: if frame is less than 60 bytes, there may be > 4 bytes, likely zeros.. */
6008 if (tvb_reported_length_remaining(tvb, offset) < 4) {
6009 udcomplen_heuristic_result = true1;
6010 udcomplen_heuristic_result_set = true1;
6011 }
6012 } while (!udcomplen_heuristic_result_set);
6013 }
6014 return udcomplen_heuristic_result;
6015}
6016
6017static bool_Bool at_udcomphdr(tvbuff_t *tvb, int offset)
6018{
6019 if (tvb_captured_length_remaining(tvb, offset) < 2) {
6020 return false0;
6021 }
6022 uint8_t first_byte = tvb_get_uint8(tvb, offset);
6023 uint8_t reserved_byte = tvb_get_uint8(tvb, offset+1);
6024
6025 /* - iq width could be anything, though unlikely to be signalled as (say) < 1-3? */
6026 /* - meth should be 0-8 */
6027 /* - reserved byte should be 0 */
6028 return (((first_byte & 0x0f) <= MOD_COMPR_AND_SELECTIVE_RE_WITH_MASKS8) && (reserved_byte == 0));
6029}
6030
6031static bool_Bool udcomphdr_appears_present(flow_state_t *flow, uint32_t direction, tvbuff_t *tvb, int offset)
6032{
6033 /* Should really not happen, but guard against this anyway. */
6034 if (flow == NULL((void*)0)) {
6035 /* No state to update. */
6036 return false0;
6037 }
6038
6039 if (direction == DIR_UPLINK0) {
6040 if (flow->udcomphdrUplink_heuristic_result_set) {
6041 /* Return cached value */
6042 return flow->udcomphdrUplink_heuristic_result;
6043 }
6044 else {
6045 /* Work it out, and save answer for next time */
6046 flow->udcomphdrUplink_heuristic_result_set = true1;
6047 flow->udcomphdrUplink_heuristic_result = at_udcomphdr(tvb, offset);
6048 return flow->udcomphdrUplink_heuristic_result;
6049 }
6050 }
6051 else {
6052 /* Downlink */
6053 if (flow->udcomphdrDownlink_heuristic_result_set) {
6054 /* Return cached value */
6055 return flow->udcomphdrDownlink_heuristic_result;
6056 }
6057 else {
6058 /* Work it out, and save answer for next time */
6059 flow->udcomphdrDownlink_heuristic_result_set = true1;
6060 flow->udcomphdrDownlink_heuristic_result = at_udcomphdr(tvb, offset);
6061 return flow->udcomphdrDownlink_heuristic_result;
6062 }
6063 }
6064}
6065
6066/* User plane dissector (section 8) */
6067static int
6068dissect_oran_u(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
6069 oran_tap_info *tap_info, void *data _U___attribute__((unused)))
6070{
6071 /* Hidden filter for plane */
6072 proto_item *plane_ti = proto_tree_add_item(tree, hf_oran_uplane, tvb, 0, 0, ENC_NA0x00000000);
6073 PROTO_ITEM_SET_HIDDEN(plane_ti)proto_item_set_hidden((plane_ti));
6074
6075 /* Set up structures needed to add the protocol subtree and manage it */
6076 int offset = 0;
6077
6078 col_set_str(pinfo->cinfo, COL_PROTOCOL, "O-RAN-FH-U");
6079 col_set_str(pinfo->cinfo, COL_INFO, "U-Plane");
6080
6081 tap_info->userplane = true1;
6082
6083 /* Create display subtree for the protocol */
6084 proto_item *protocol_item = proto_tree_add_item(tree, proto_oran, tvb, 0, -1, ENC_NA0x00000000);
6085 proto_item_append_text(protocol_item, "-U");
6086 proto_tree *oran_tree = proto_item_add_subtree(protocol_item, ett_oran);
6087
6088 /* Transport header */
6089 /* Real-time control data / IQ data transfer message series identifier */
6090 uint16_t eAxC;
6091 addPcOrRtcid(tvb, oran_tree, &offset, hf_oran_ecpri_pcid, &eAxC);
6092 tap_info->eaxc = eAxC;
6093
6094 /* Update/report status of conversation */
6095 uint32_t key = make_flow_key(pinfo, eAxC, ORAN_U_PLANE1, false0);
6096 flow_state_t* state = (flow_state_t*)wmem_tree_lookup32(flow_states_table, key);
6097
6098 /* Message identifier */
6099 uint8_t seq_id;
6100 proto_item *seq_id_ti;
6101 offset = addSeqid(tvb, oran_tree, offset, ORAN_U_PLANE1, &seq_id, &seq_id_ti, pinfo);
6102
6103 /* Common header for time reference */
6104 proto_item *timingHeader = proto_tree_add_string_format(oran_tree, hf_oran_timing_header,
6105 tvb, offset, 4, "", "Timing Header (");
6106 proto_tree *timing_header_tree = proto_item_add_subtree(timingHeader, ett_oran_u_timing);
6107
6108 /* dataDirection */
6109 uint32_t direction;
6110 proto_tree_add_item_ret_uint(timing_header_tree, hf_oran_data_direction, tvb, offset, 1, ENC_NA0x00000000, &direction);
6111 tap_info->uplink = (direction==0);
6112 /* payloadVersion */
6113 dissect_payload_version(timing_header_tree, tvb, pinfo, offset);
6114 /* filterIndex */
6115 proto_tree_add_item(timing_header_tree, hf_oran_filter_index, tvb, offset, 1, ENC_NA0x00000000);
6116 offset += 1;
6117
6118 int ref_a_offset = offset;
6119
6120 /* frameId */
6121 uint32_t frameId = 0;
6122 proto_tree_add_item_ret_uint(timing_header_tree, hf_oran_frame_id, tvb, offset, 1, ENC_NA0x00000000, &frameId);
6123 tap_info->frame = frameId;
6124 offset += 1;
6125
6126 /* subframeId */
6127 uint32_t subframeId = 0;
6128 proto_tree_add_item_ret_uint(timing_header_tree, hf_oran_subframe_id, tvb, offset, 1, ENC_NA0x00000000, &subframeId);
6129 /* slotId */
6130 uint32_t slotId = 0;
6131 proto_tree_add_item_ret_uint(timing_header_tree, hf_oran_slot_id, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &slotId);
6132 tap_info->slot = slotId;
6133 offset++;
6134 /* symbolId */
6135 uint32_t symbolId = 0;
6136 proto_tree_add_item_ret_uint(timing_header_tree, hf_oran_symbolId, tvb, offset, 1, ENC_NA0x00000000, &symbolId);
6137 offset++;
6138
6139 char id[16];
6140 snprintf(id, 16, "%d-%d-%d-%d", frameId, subframeId, slotId, symbolId);
6141 proto_item *pi = proto_tree_add_string(timing_header_tree, hf_oran_refa, tvb, ref_a_offset, 3, id);
6142 proto_item_set_generated(pi);
6143
6144 proto_item_append_text(timingHeader, "%s, frameId: %d, subframeId: %d, slotId: %d, symbolId: %d)",
6145 val_to_str_const(direction, data_direction_vals, "Unknown"), frameId, subframeId, slotId, symbolId);
6146
6147 unsigned sample_bit_width;
6148 int compression;
6149 int includeUdCompHeader;
6150
6151 /* Also look up C-PLANE state (sent in opposite direction) so may check current compression settings */
6152 uint32_t cplane_key = make_flow_key(pinfo, eAxC, ORAN_C_PLANE0, true1);
6153 flow_state_t* cplane_state = (flow_state_t*)wmem_tree_lookup32(flow_states_table, cplane_key);
6154
6155 if (!PINFO_FD_VISITED(pinfo)((pinfo)->fd->visited)) {
6156 /* Create conversation if doesn't exist yet */
6157 if (!state) {
6158 /* Allocate new state */
6159 state = wmem_new0(wmem_file_scope(), flow_state_t)((flow_state_t*)wmem_alloc0((wmem_file_scope()), sizeof(flow_state_t
)))
;
6160 state->ack_nack_requests = wmem_tree_new(wmem_epan_scope());
6161 wmem_tree_insert32(flow_states_table, key, state);
6162 }
6163
6164 /* Check sequence analysis status */
6165 if (state->last_frame_seen[direction] && (seq_id != state->next_expected_sequence_number[direction])) {
6166 /* Store this result */
6167 flow_result_t *result = wmem_new0(wmem_file_scope(), flow_result_t)((flow_result_t*)wmem_alloc0((wmem_file_scope()), sizeof(flow_result_t
)))
;
6168 result->unexpected_seq_number = true1;
6169 result->expected_sequence_number = state->next_expected_sequence_number[direction];
6170 result->previous_frame = state->last_frame[direction];
6171 wmem_tree_insert32(flow_results_table, pinfo->num, result);
6172 }
6173 /* Update sequence analysis state */
6174 state->last_frame[direction] = pinfo->num;
6175 state->last_frame_seen[direction] = true1;
6176 state->next_expected_sequence_number[direction] = (seq_id+1) % 256;
6177 }
6178
6179 /* Show any issues associated with this frame number */
6180 flow_result_t *result = wmem_tree_lookup32(flow_results_table, pinfo->num);
6181 if (result) {
6182 if (result->unexpected_seq_number) {
6183 expert_add_info_format(pinfo, seq_id_ti,
6184 (direction == DIR_UPLINK0) ?
6185 &ei_oran_uplane_unexpected_sequence_number_ul :
6186 &ei_oran_uplane_unexpected_sequence_number_dl,
6187 "Sequence number %u expected, but got %u",
6188 result->expected_sequence_number, seq_id);
6189 tap_info->missing_sns = (256 + seq_id - result->expected_sequence_number) % 256;
6190 /* TODO: could add previous/next frame (in seqId tree?) ? */
6191 }
6192 }
6193
6194 /* Checking UL timing within current slot. Disabled if limit set to 0. */
6195 /* N.B., timing is relative to first seen frame,
6196 not some notion of the beginning of the slot from sync, offset by some timing.. */
6197 if (direction == DIR_UPLINK0 && us_allowed_for_ul_in_symbol > 0) {
6198 uint32_t timing_key = get_timing_key(frameId, subframeId, slotId, symbolId);
6199 if (!PINFO_FD_VISITED(pinfo)((pinfo)->fd->visited)) {
6200 /* Set state on first pass */
6201 ul_timing_for_slot* timing = (ul_timing_for_slot*)wmem_tree_lookup32(ul_symbol_timing, timing_key);
6202 if (!timing) {
6203 /* Allocate new state */
6204 timing = wmem_new0(wmem_file_scope(), ul_timing_for_slot)((ul_timing_for_slot*)wmem_alloc0((wmem_file_scope()), sizeof
(ul_timing_for_slot)))
;
6205 timing->first_frame = pinfo->num;
6206 timing->first_frame_time = pinfo->abs_ts;
6207 timing->frames_seen_in_symbol = 1;
6208 timing->last_frame_in_symbol = pinfo->num;
6209 wmem_tree_insert32(ul_symbol_timing, timing_key, timing);
6210 }
6211 else {
6212 /* Update existing state */
6213 timing->frames_seen_in_symbol++;
6214 timing->last_frame_in_symbol = pinfo->num;
6215 }
6216 }
6217 else {
6218 /* Subsequent passes - look up result */
6219 ul_timing_for_slot* timing = (ul_timing_for_slot*)wmem_tree_lookup32(ul_symbol_timing, timing_key);
6220 if (timing) { /* Really shouldn't fail! */
6221 if (timing->frames_seen_in_symbol > 1) {
6222 /* Work out gap between frames (in microseconds) back to frame carrying first seen symbol */
6223 int seconds_between_packets = (int)
6224 (pinfo->abs_ts.secs - timing->first_frame_time.secs);
6225 int nseconds_between_packets =
6226 pinfo->abs_ts.nsecs - timing->first_frame_time.nsecs;
6227
6228
6229 /* Round to nearest microsecond. */
6230 uint32_t total_gap = (seconds_between_packets*1000000) +
6231 ((nseconds_between_packets+500) / 1000);
6232
6233 /* Show how long it has been */
6234 proto_item *ti = NULL((void*)0);
6235 if (pinfo->num != timing->first_frame) {
6236 ti = proto_tree_add_uint(timingHeader, hf_oran_u_section_ul_symbol_time, tvb, 0, 0, total_gap);
6237 proto_item_set_generated(ti);
6238 }
6239
6240 if (total_gap > us_allowed_for_ul_in_symbol) {
6241 expert_add_info_format(pinfo, ti, &ei_oran_ul_uplane_symbol_too_long,
6242 "UL U-Plane Tx took longer (%u us) than limit set in preferences (%u us)",
6243 total_gap, us_allowed_for_ul_in_symbol);
6244 }
6245
6246 /* Show how many frames were received */
6247 ti = proto_tree_add_uint(timingHeader, hf_oran_u_section_ul_symbol_frames, tvb, 0, 0, timing->frames_seen_in_symbol);
6248 proto_item_set_generated(ti);
6249
6250 /* Link to first frame for this symbol */
6251 if (pinfo->num != timing->first_frame) {
6252 ti = proto_tree_add_uint(timingHeader, hf_oran_u_section_ul_symbol_first_frame, tvb, 0, 0, timing->first_frame);
6253 proto_item_set_generated(ti);
6254 }
6255
6256 /* And also last frame */
6257 if (pinfo->num != timing->last_frame_in_symbol) {
6258 ti = proto_tree_add_uint(timingHeader, hf_oran_u_section_ul_symbol_last_frame, tvb, 0, 0, timing->last_frame_in_symbol);
6259 proto_item_set_generated(ti);
6260 }
6261
6262 tap_info->ul_delay_in_us = total_gap;
6263 }
6264 }
6265 }
6266 }
6267
6268
6269 /* Look up preferences for samples */
6270 if (direction == DIR_UPLINK0) {
6271 sample_bit_width = pref_sample_bit_width_uplink;
6272 compression = pref_iqCompressionUplink;
6273 includeUdCompHeader = pref_includeUdCompHeaderUplink;
6274 } else {
6275 sample_bit_width = pref_sample_bit_width_downlink;
6276 compression = pref_iqCompressionDownlink;
6277 includeUdCompHeader = pref_includeUdCompHeaderDownlink;
6278 }
6279
6280 /* If uplink, load any udCompHdr settings written by C-Plane */
6281 bool_Bool ud_cmp_hdr_cplane = false0;
6282 if (cplane_state && direction == 0) {
6283 /* Initialise settings from udpCompHdr from C-Plane */
6284 if (cplane_state->ul_ud_comp_hdr_set) {
6285 sample_bit_width = cplane_state->ul_ud_comp_hdr_bit_width;
6286 compression = cplane_state->ul_ud_comp_hdr_compression;
6287 ud_cmp_hdr_cplane = true1;
6288 }
6289 }
6290
6291 /* Need a valid value (e.g. 9, 14). 0 definitely won't work, as won't progress around loop! */
6292 /* N.B. may yet be overwritten by udCompHdr settings in sections below! */
6293 if (sample_bit_width == 0) {
6294 expert_add_info_format(pinfo, protocol_item, &ei_oran_invalid_sample_bit_width,
6295 "%cL Sample bit width from %s (%u) not valid, so can't decode sections",
6296 (direction == DIR_UPLINK0) ? 'U' : 'D',
6297 !ud_cmp_hdr_cplane ? "preference" : "C-Plane",
6298 sample_bit_width);
6299 return offset;
6300 }
6301
6302 unsigned bytesLeft;
6303 unsigned number_of_sections = 0;
6304 unsigned nBytesPerPrb =0;
6305
6306 /* Add each section (not from count, just keep parsing until payload used) */
6307 do {
6308 /* Section subtree */
6309 unsigned section_start_offset = offset;
6310 proto_item *sectionHeading = proto_tree_add_string_format(oran_tree, hf_oran_u_section,
6311 tvb, offset, 0, "", "Section");
6312 proto_tree *section_tree = proto_item_add_subtree(sectionHeading, ett_oran_u_section);
6313
6314 /* Section Header fields (darker green part) */
6315
6316 /* sectionId */
6317 uint32_t sectionId = 0;
6318 proto_item *ti = proto_tree_add_item_ret_uint(section_tree, hf_oran_section_id, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &sectionId);
6319 if (sectionId == 4095) {
6320 proto_item_append_text(ti, " (not default coupling C/U planes using sectionId)");
6321 }
6322 offset++;
6323
6324 if (tap_info->num_section_ids < MAX_SECTION_IDs32) {
6325 tap_info->section_ids[tap_info->num_section_ids++] = sectionId;
6326 }
6327
6328 /* rb */
6329 uint32_t rb;
6330 proto_tree_add_item_ret_uint(section_tree, hf_oran_rb, tvb, offset, 1, ENC_NA0x00000000, &rb);
6331 /* symInc */
6332 proto_tree_add_item(section_tree, hf_oran_symInc, tvb, offset, 1, ENC_NA0x00000000);
6333 /* startPrbu */
6334 uint32_t startPrbu = 0;
6335 proto_tree_add_item_ret_uint(section_tree, hf_oran_startPrbu, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &startPrbu);
6336 offset += 2;
6337
6338 /* numPrbu */
6339 uint32_t numPrbu = 0;
6340 proto_tree_add_item_ret_uint(section_tree, hf_oran_numPrbu, tvb, offset, 1, ENC_NA0x00000000, &numPrbu);
6341 offset += 1;
6342
6343 proto_item *ud_comp_meth_item, *ud_comp_len_ti=NULL((void*)0);
6344 uint32_t ud_comp_len;
6345
6346 /* udCompHdr (if preferences indicate will be present) */
6347 bool_Bool included = (includeUdCompHeader==1) || /* 1 means present.. */
6348 (includeUdCompHeader==2 && udcomphdr_appears_present(state, direction, tvb, offset));
6349 if (included) {
6350 /* 7.5.2.10 */
6351 /* Extract these values to inform how wide IQ samples in each PRB will be. */
6352 offset = dissect_udcomphdr(tvb, pinfo, section_tree, offset, false0, &sample_bit_width,
6353 &compression, &ud_comp_meth_item);
6354
6355 /* Not part of udCompHdr */
6356 proto_tree_add_item(section_tree, hf_oran_reserved_8bits, tvb, offset, 1, ENC_NA0x00000000);
6357 offset += 1;
6358 }
6359 else {
6360 /* No fields to dissect - just showing comp values from prefs */
6361 /* iqWidth */
6362 proto_item *iq_width_item = proto_tree_add_uint(section_tree, hf_oran_udCompHdrIqWidth_pref, tvb, 0, 0, sample_bit_width);
6363 proto_item_append_text(iq_width_item, (ud_cmp_hdr_cplane) ? " (from c-plane)" : " (from preferences)");
6364 proto_item_set_generated(iq_width_item);
6365
6366 /* udCompMethod */
6367 ud_comp_meth_item = proto_tree_add_uint(section_tree, hf_oran_udCompHdrMeth_pref, tvb, 0, 0, compression);
6368 proto_item_append_text(ud_comp_meth_item, (ud_cmp_hdr_cplane) ? " (from c-plane)" : " (from preferences)");
6369 proto_item_set_generated(ud_comp_meth_item);
6370
6371 /* Point back to C-Plane, if used */
6372 /* TODO: doesn't work with multiple port mappings using SE10.. */
6373 if (ud_cmp_hdr_cplane) {
6374 proto_item *cplane_ti = proto_tree_add_uint(section_tree, hf_oran_ul_cplane_ud_comp_hdr_frame, tvb, offset, 0, cplane_state->ul_ud_comp_hdr_frame);
6375 proto_item_set_generated(cplane_ti);
6376 }
6377 }
6378
6379 /* Not supported! TODO: other places where comp method is looked up (e.g., bfw?) */
6380 switch (compression) {
6381 case COMP_NONE0:
6382 case COMP_BLOCK_FP1:
6383 case BFP_AND_SELECTIVE_RE5:
6384 break;
6385 default:
6386 expert_add_info_format(pinfo, ud_comp_meth_item, &ei_oran_unsupported_compression_method,
6387 "Compression method %u (%s) not supported by dissector",
6388 compression,
6389 rval_to_str_const(compression, ud_comp_header_meth, "reserved"));
6390 }
6391
6392 /* udCompLen (when supported, methods 5,6,7,8) */
6393 if (compression >= BFP_AND_SELECTIVE_RE5) {
6394 bool_Bool supported = (pref_support_udcompLen==1) || /* supported */
6395 (pref_support_udcompLen==2 && udcomplen_appears_present(includeUdCompHeader, tvb, offset));
6396
6397 if (supported) {
6398 ud_comp_len_ti = proto_tree_add_item_ret_uint(section_tree, hf_oran_udCompLen, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &ud_comp_len);
6399 if (ud_comp_len <= 1) {
6400 proto_item_append_text(ud_comp_len_ti, " (reserved)");
6401 }
6402 /* TODO: report if less than a viable section in frame? */
6403 /* Check that there is this much length left in the frame */
6404 if ((int)ud_comp_len > tvb_reported_length_remaining(tvb, section_start_offset)) {
6405 expert_add_info_format(pinfo, ud_comp_len_ti, &ei_oran_ud_comp_len_wrong_size,
6406 "udCompLen indicates %u bytes in section, but only %u are left in frame",
6407 ud_comp_len, tvb_reported_length_remaining(tvb, section_start_offset));
6408 }
6409 /* Actual length of section will be checked below, at the end of the section */
6410 offset += 2;
6411 }
6412 }
6413
6414 /* sReSMask1 + sReSMask2 (depends upon compression method) */
6415 uint64_t sresmask1=0, sresmask2=0;
6416 if (compression == BFP_AND_SELECTIVE_RE_WITH_MASKS7 ||
6417 compression == MOD_COMPR_AND_SELECTIVE_RE_WITH_MASKS8)
6418 {
6419 static int * const sres_mask1_2_flags[] = {
6420 &hf_oran_sReSMask1_2_re12,
6421 &hf_oran_sReSMask1_2_re11,
6422 &hf_oran_sReSMask1_2_re10,
6423 &hf_oran_sReSMask1_2_re9,
6424 &hf_oran_sReSMask_re8,
6425 &hf_oran_sReSMask_re7,
6426 &hf_oran_sReSMask_re6,
6427 &hf_oran_sReSMask_re5,
6428 &hf_oran_sReSMask_re4,
6429 &hf_oran_sReSMask_re3,
6430 &hf_oran_sReSMask_re2,
6431 &hf_oran_sReSMask_re1,
6432 NULL((void*)0)
6433 };
6434
6435 /* reserved (4 bits) */
6436 proto_tree_add_item(section_tree, hf_oran_reserved_4bits, tvb, offset, 1, ENC_NA0x00000000);
6437 /* sReSMask1 (12 bits) */
6438 proto_item *sresmask_ti;
6439 sresmask_ti = proto_tree_add_bitmask_ret_uint64(section_tree, tvb, offset,
6440 hf_oran_sReSMask1,
6441 ett_oran_sresmask,
6442 sres_mask1_2_flags,
6443 ENC_NA0x00000000,
6444 &sresmask1);
6445 offset += 2;
6446 /* Count REs present */
6447 unsigned res = 0;
6448 for (unsigned n=0; n < 12; n++) {
6449 if ((sresmask1 >> n) & 0x1) {
6450 res++;
6451 }
6452 }
6453 proto_item_append_text(sresmask_ti, " (%u REs)", res);
6454
6455
6456 /* reserved (4 bits) */
6457 proto_tree_add_item(section_tree, hf_oran_reserved_4bits, tvb, offset, 1, ENC_NA0x00000000);
6458 /* sReSMask2 (12 bits) */
6459 sresmask_ti = proto_tree_add_bitmask_ret_uint64(section_tree, tvb, offset,
6460 hf_oran_sReSMask2,
6461 ett_oran_sresmask,
6462 sres_mask1_2_flags,
6463 ENC_NA0x00000000,
6464 &sresmask2);
6465 offset += 2;
6466
6467 if (rb == 1) {
6468 proto_item_append_text(sresmask_ti, " (ignored)");
6469 if (sresmask2 != 0) {
6470 expert_add_info(pinfo, ud_comp_len_ti, &ei_oran_sresmask2_not_zero_with_rb);
6471 }
6472 }
6473 else {
6474 /* Count REs present */
6475 res = 0;
6476 for (unsigned n=0; n < 12; n++) {
6477 if ((sresmask2 >> n) & 0x1) {
6478 res++;
6479 }
6480 }
6481 proto_item_append_text(sresmask_ti, " (%u REs)", res);
6482 }
6483 }
6484
6485 write_section_info(sectionHeading, pinfo, protocol_item, sectionId, startPrbu, numPrbu, rb);
6486
6487 /* TODO: should this use the same pref as c-plane? */
6488 if (numPrbu == 0) {
6489 /* Special case for all PRBs (NR: the total number of PRBs may be > 255) */
6490 numPrbu = pref_data_plane_section_total_rbs;
6491 startPrbu = 0; /* may already be 0... */
6492 }
6493
6494 /* Add each PRB */
6495 for (unsigned i = 0; i < numPrbu; i++) {
6496 /* Create subtree */
6497 proto_item *prbHeading = proto_tree_add_string_format(section_tree, hf_oran_samples_prb,
6498 tvb, offset, 0,
6499 "", "PRB");
6500 proto_tree *rb_tree = proto_item_add_subtree(prbHeading, ett_oran_u_prb);
6501 uint32_t exponent = 0;
6502 uint16_t sresmask = 0;
6503
6504 /* udCompParam (depends upon compression method) */
6505 int before = offset;
6506 offset = dissect_udcompparam(tvb, pinfo, rb_tree, offset, compression, &exponent, &sresmask, false0);
6507 int udcompparam_len = offset-before;
6508
6509 /* Show PRB number in root */
6510 proto_item_append_text(prbHeading, " %3u", startPrbu + i*(1+rb));
6511
6512 /* Work out how many REs / PRB */
6513 unsigned res_per_prb = 12;
6514 uint16_t sresmask_to_use = 0x0fff;
6515
6516 if (compression >= BFP_AND_SELECTIVE_RE5) {
6517 /* Work out which mask should be used */
6518 if (compression==BFP_AND_SELECTIVE_RE5 || compression==MOD_COMPR_AND_SELECTIVE_RE6) {
6519 /* Selective RE cases, use value from compModParam */
6520 sresmask_to_use = (uint16_t)sresmask;
6521 }
6522 else {
6523 /* With masks (in section). Choose between sresmask1 and sresmask2 */
6524 if (rb==1 || (i%1)==0) {
6525 /* Even values */
6526 sresmask_to_use = (uint16_t)sresmask1;
6527 }
6528 else {
6529 /* Odd values */
6530 sresmask_to_use = (uint16_t)sresmask2;
6531 }
6532 }
6533
6534 /* Count REs present using sresmask */
6535 res_per_prb = 0;
6536 /* Use sresmask to pick out which REs are present */
6537 for (unsigned n=0; n<12; n++) {
6538 if (sresmask_to_use & (1<<n)) {
6539 res_per_prb++;
6540 }
6541 }
6542 }
6543
6544 /* N.B. bytes for samples need to be padded out to next byte
6545 (certainly where there aren't 12 REs in PRB..) */
6546 unsigned nBytesForSamples = (sample_bit_width * res_per_prb * 2 + 7) / 8;
6547 nBytesPerPrb = nBytesForSamples + udcompparam_len;
6548
6549 proto_tree_add_item(rb_tree, hf_oran_iq_user_data, tvb, offset, nBytesForSamples, ENC_NA0x00000000);
6550
6551 tap_info->non_zero_re_in_current_prb = false0;
6552
6553 /* Optionally trying to show I/Q RE values */
6554 if (pref_showIQSampleValues) {
6555 /* Individual values */
6556 unsigned samples_offset = offset*8;
6557 unsigned samples = 0;
6558
6559 if (compression >= BFP_AND_SELECTIVE_RE5) {
6560 /* Use sresmask to pick out which REs are present */
6561 for (unsigned n=1; n<=12; n++) {
6562 if (sresmask_to_use & (1<<(n-1))) {
6563 samples_offset = dissect_oran_u_re(tvb, rb_tree,
6564 n, samples_offset, tap_info, sample_bit_width, compression, exponent);
6565 samples++;
6566 }
6567 }
6568 }
6569 else {
6570 /* All 12 REs are present */
6571 for (unsigned n=1; n<=12; n++) {
6572 samples_offset = dissect_oran_u_re(tvb, rb_tree,
6573 n, samples_offset, tap_info, sample_bit_width, compression, exponent);
6574 samples++;
6575 }
6576 }
6577 proto_item_append_text(prbHeading, " (%u REs)", samples);
6578
6579 /* Was this PRB all zeros? */
6580 if (!tap_info->non_zero_re_in_current_prb) {
6581 tap_info->num_prbs_zero++;
6582 /* Add a filter to make zero-valued PRBs more findable */
6583 proto_tree_add_item(rb_tree, hf_oran_zero_prb, tvb,
6584 samples_offset/8, nBytesForSamples, ENC_NA0x00000000);
6585 proto_item_append_text(prbHeading, " (all zeros)");
6586 }
6587 }
6588
6589 tap_info->num_prbs++;
6590
6591
6592 /* Advance past samples */
6593 offset += nBytesForSamples;
6594
6595 /* Set end of prb subtree */
6596 proto_item_set_end(prbHeading, tvb, offset);
6597 }
6598
6599 /* Set extent of section */
6600 proto_item_set_len(sectionHeading, offset-section_start_offset);
6601 if (ud_comp_len_ti != NULL((void*)0) && ((offset-section_start_offset != ud_comp_len))) {
6602 expert_add_info_format(pinfo, ud_comp_len_ti, &ei_oran_ud_comp_len_wrong_size,
6603 "udCompLen indicates %u bytes in section, but dissected %u instead",
6604 ud_comp_len, offset-section_start_offset);
6605 }
6606
6607 bytesLeft = tvb_captured_length(tvb) - offset;
6608 number_of_sections++;
6609 } while (bytesLeft >= (4 + nBytesPerPrb)); /* FIXME: bad heuristic */
6610
6611 /* Show number of sections found */
6612 proto_item *ti = proto_tree_add_uint(oran_tree, hf_oran_numberOfSections, tvb, 0, 0, number_of_sections);
6613 proto_item_set_generated(ti);
6614
6615 /* Expert error if we are short of tvb by > 3 bytes */
6616 if (tvb_reported_length_remaining(tvb, offset) > 3) {
6617 expert_add_info_format(pinfo, protocol_item, &ei_oran_frame_length,
6618 "%u bytes remain at end of frame - should be 0-3",
6619 tvb_reported_length_remaining(tvb, offset));
6620 }
6621
6622 return tvb_captured_length(tvb);
6623}
6624
6625
6626/**********************************************************************/
6627/* Main dissection function. */
6628/* N.B. ecpri message type passed in as 'data' arg by eCPRI dissector */
6629static int
6630dissect_oran(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
6631{
6632 uint32_t ecpri_message_type = *(uint32_t *)data;
6633 int offset = 0;
6634
6635 /* Allocate and zero tap struct */
6636 oran_tap_info *tap_info = wmem_new0(wmem_file_scope(), oran_tap_info)((oran_tap_info*)wmem_alloc0((wmem_file_scope()), sizeof(oran_tap_info
)))
;
6637 tap_info->pdu_size = pinfo->fd->pkt_len;
6638
6639 switch (ecpri_message_type) {
6640 case ECPRI_MT_IQ_DATA0:
6641 offset = dissect_oran_u(tvb, pinfo, tree, tap_info, data);
6642 break;
6643 case ECPRI_MT_RT_CTRL_DATA2:
6644 offset = dissect_oran_c(tvb, pinfo, tree, tap_info, data);
6645 break;
6646 default:
6647 /* Not dissecting other types - assume these are handled by eCPRI dissector */
6648 return 0;
6649 }
6650
6651 tap_queue_packet(oran_tap, pinfo, tap_info);
6652
6653 return offset;
6654}
6655
6656static void oran_init_protocol(void)
6657{
6658 udcomplen_heuristic_result_set = false0;
6659 udcomplen_heuristic_result = false0;
6660}
6661
6662
6663/* Register the protocol with Wireshark. */
6664void
6665proto_register_oran(void)
6666{
6667 static hf_register_info hf[] = {
6668
6669 /* Section 5.1.3.2.7 */
6670 { &hf_oran_du_port_id,
6671 { "DU Port ID", "oran_fh_cus.du_port_id",
6672 FT_UINT16, BASE_DEC,
6673 NULL((void*)0), 0x0,
6674 "Processing unit at O-RU - width set in dissector preference", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
6675 },
6676
6677 /* Section 5.1.3.2.7 */
6678 { &hf_oran_bandsector_id,
6679 { "BandSector ID", "oran_fh_cus.bandsector_id",
6680 FT_UINT16, BASE_DEC,
6681 NULL((void*)0), 0x0,
6682 "Aggregated cell identified - width set in dissector preference", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
6683 },
6684
6685 /* Section 5.1.3.2.7 */
6686 { &hf_oran_cc_id,
6687 { "CC ID", "oran_fh_cus.cc_id",
6688 FT_UINT16, BASE_DEC,
6689 NULL((void*)0), 0x0,
6690 "Component Carrier - width set in dissector preference", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
6691 },
6692
6693 /* Section 5.1.3.2.7 */
6694 { &hf_oran_ru_port_id,
6695 { "RU Port ID", "oran_fh_cus.ru_port_id",
6696 FT_UINT16, BASE_DEC,
6697 NULL((void*)0), 0x0,
6698 "Logical flow - width set in dissector preference", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
6699 },
6700
6701 /* Section 5.1.3.2.8 */
6702 { &hf_oran_sequence_id,
6703 { "Sequence ID", "oran_fh_cus.sequence_id",
6704 FT_UINT8, BASE_DEC,
6705 NULL((void*)0), 0x0,
6706 "The Sequence ID wraps around individually per eAxC", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
6707 },
6708
6709 /* Section 5.1.3.2.8 */
6710 { &hf_oran_e_bit,
6711 { "E Bit", "oran_fh_cus.e_bit",
6712 FT_UINT8, BASE_DEC,
6713 VALS(e_bit)((0 ? (const struct _value_string*)0 : ((e_bit)))), 0x80,
6714 "Indicate the last message of a subsequence (U-Plane only)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
6715 },
6716
6717 /* Section 5.1.3.2.8 */
6718 { &hf_oran_subsequence_id,
6719 { "Subsequence ID", "oran_fh_cus.subsequence_id",
6720 FT_UINT8, BASE_DEC,
6721 NULL((void*)0), 0x7f,
6722 "The subsequence ID (for eCPRI layer fragmentation)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
6723 },
6724
6725 { &hf_oran_previous_frame,
6726 { "Previous frame in stream", "oran_fh_cus.previous-frame",
6727 FT_FRAMENUM, BASE_NONE,
6728 FRAMENUM_TYPE(FT_FRAMENUM_NONE)((gpointer) (glong) (FT_FRAMENUM_NONE)), 0x0,
6729 "Previous frame in sequence", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
6730 },
6731
6732 /* Section 7.5.2.1 */
6733 { &hf_oran_data_direction,
6734 { "Data Direction", "oran_fh_cus.data_direction",
6735 FT_UINT8, BASE_DEC,
6736 VALS(data_direction_vals)((0 ? (const struct _value_string*)0 : ((data_direction_vals)
)))
, 0x80,
6737 "gNB data direction", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
6738 },
6739
6740 /* Section 7.5.2.2 */
6741 { &hf_oran_payload_version,
6742 { "Payload Version", "oran_fh_cus.payloadVersion",
6743 FT_UINT8, BASE_DEC,
6744 NULL((void*)0), 0x70,
6745 "Payload protocol version the following IEs", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6746 },
6747
6748 /* Section 7.5.2.3 */
6749 { &hf_oran_filter_index,
6750 { "Filter Index", "oran_fh_cus.filterIndex",
6751 FT_UINT8, BASE_DEC | BASE_RANGE_STRING0x00000100,
6752 RVALS(filter_indices)((0 ? (const struct _range_string*)0 : ((filter_indices)))), 0x0f,
6753 "used between IQ data and air interface, both in DL and UL", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6754 },
6755
6756 /* Section 7.5.2.4 */
6757 { &hf_oran_frame_id,
6758 { "Frame ID", "oran_fh_cus.frameId",
6759 FT_UINT8, BASE_DEC,
6760 NULL((void*)0), 0x0,
6761 "A counter for 10 ms frames (wrapping period 2.56 seconds)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6762 },
6763
6764 /* Section 7.5.2.5 */
6765 { &hf_oran_subframe_id,
6766 { "Subframe ID", "oran_fh_cus.subframe_id",
6767 FT_UINT8, BASE_DEC,
6768 NULL((void*)0), 0xf0,
6769 "A counter for 1 ms sub-frames within 10ms frame", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6770 },
6771
6772 /* Section 7.5.2.6 */
6773 { &hf_oran_slot_id,
6774 { "Slot ID", "oran_fh_cus.slotId",
6775 FT_UINT16, BASE_DEC,
6776 NULL((void*)0), 0x0fc0,
6777 "Slot number within a 1ms sub-frame", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6778 },
6779
6780 /* Generated for convenience */
6781 { &hf_oran_slot_within_frame,
6782 { "Slot within frame", "oran_fh_cus.slot-within-frame",
6783 FT_UINT16, BASE_DEC,
6784 NULL((void*)0), 0x0,
6785 "Slot within frame, to match DCT logs", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6786 },
6787
6788 /* Section 7.5.2.7 */
6789 { &hf_oran_start_symbol_id,
6790 { "Start Symbol ID", "oran_fh_cus.startSymbolId",
6791 FT_UINT8, BASE_DEC,
6792 NULL((void*)0), 0x3f,
6793 "The first symbol number within slot affected", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6794 },
6795
6796 /* Section 7.5.2.8 */
6797 { &hf_oran_numberOfSections,
6798 { "Number of Sections", "oran_fh_cus.numberOfSections",
6799 FT_UINT8, BASE_DEC,
6800 NULL((void*)0), 0x0,
6801 "The number of section IDs included in this message", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6802 },
6803
6804 /* Section 7.5.2.9 */
6805 { &hf_oran_sectionType,
6806 { "Section Type", "oran_fh_cus.sectionType",
6807 FT_UINT8, BASE_DEC | BASE_RANGE_STRING0x00000100,
6808 RVALS(section_types)((0 ? (const struct _range_string*)0 : ((section_types)))), 0x0,
6809 "Determines the characteristics of U-plane data", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6810 },
6811
6812 /* Section 7.5.2.10 */
6813 { &hf_oran_udCompHdr,
6814 { "udCompHdr", "oran_fh_cus.udCompHdr",
6815 FT_STRING, BASE_NONE,
6816 NULL((void*)0), 0x0,
6817 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6818 },
6819
6820 /* Section 7.5.2.11 */
6821 { &hf_oran_numberOfUEs,
6822 { "Number Of UEs", "oran_fh_cus.numberOfUEs",
6823 FT_UINT8, BASE_DEC,
6824 NULL((void*)0), 0x0,
6825 "Indicates number of UEs for which channel info is provided", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6826 },
6827
6828 /* Section 7.5.2.12 */
6829 { &hf_oran_timeOffset,
6830 { "Time Offset", "oran_fh_cus.timeOffset",
6831 FT_UINT16, BASE_DEC,
6832 NULL((void*)0), 0x0,
6833 "from start of the slot to start of CP in samples", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6834 },
6835
6836 /* Section 7.5.2.13 */
6837 { &hf_oran_frameStructure_fft,
6838 { "FFT Size", "oran_fh_cus.frameStructure.fft",
6839 FT_UINT8, BASE_HEX | BASE_RANGE_STRING0x00000100,
6840 RVALS(frame_structure_fft)((0 ? (const struct _range_string*)0 : ((frame_structure_fft)
)))
, 0xf0,
6841 "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) }
6842 },
6843
6844 /* Section 7.5.2.13 */
6845 { &hf_oran_frameStructure_subcarrier_spacing,
6846 { "Subcarrier Spacing", "oran_fh_cus.frameStructure.spacing",
6847 FT_UINT8, BASE_HEX | BASE_RANGE_STRING0x00000100,
6848 RVALS(subcarrier_spacings)((0 ? (const struct _range_string*)0 : ((subcarrier_spacings)
)))
, 0x0f,
6849 "The sub carrier spacing as well as the number of slots per 1ms sub-frame",
6850 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
6851 },
6852
6853 /* Section 7.5.2.14 */
6854 { &hf_oran_cpLength,
6855 { "cpLength", "oran_fh_cus.cpLength",
6856 FT_UINT16, BASE_DEC,
6857 NULL((void*)0), 0x0,
6858 "cyclic prefix length", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6859 },
6860
6861 { &hf_oran_timing_header,
6862 { "Timing Header", "oran_fh_cus.timingHeader",
6863 FT_STRING, BASE_NONE,
6864 NULL((void*)0), 0x0,
6865 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6866 },
6867
6868 /* Section 7.5.3.1 */
6869 { &hf_oran_section_id,
6870 { "sectionId", "oran_fh_cus.sectionId",
6871 FT_UINT16, BASE_DEC,
6872 NULL((void*)0), 0xfff0,
6873 "section identifier of data", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6874 },
6875
6876 /* Section 7.5.3.2 */
6877 { &hf_oran_rb,
6878 { "rb", "oran_fh_cus.rb",
6879 FT_UINT8, BASE_DEC,
6880 VALS(rb_vals)((0 ? (const struct _value_string*)0 : ((rb_vals)))), 0x08,
6881 "resource block indicator", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6882 },
6883
6884 /* Section 7.5.5.3 */
6885 { &hf_oran_symInc,
6886 { "symInc", "oran_fh_cus.symInc",
6887 FT_UINT8, BASE_DEC,
6888 VALS(sym_inc_vals)((0 ? (const struct _value_string*)0 : ((sym_inc_vals)))), 0x04,
6889 "Symbol Number Increment Command", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6890 },
6891
6892 /* Section 7.5.3.4 */
6893 { &hf_oran_startPrbc,
6894 { "startPrbc", "oran_fh_cus.startPrbc",
6895 FT_UINT16, BASE_DEC,
6896 NULL((void*)0), 0x03ff,
6897 "Starting PRB of Control Plane Section", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6898 },
6899
6900 /* Section 7.5.3.5 */
6901 { &hf_oran_reMask_re1,
6902 { "RE 1", "oran_fh_cus.reMask-RE1",
6903 FT_BOOLEAN, 16,
6904 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x8000,
6905 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6906 },
6907 { &hf_oran_reMask_re2,
6908 { "RE 2", "oran_fh_cus.reMask-RE2",
6909 FT_BOOLEAN, 16,
6910 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x4000,
6911 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6912 },
6913 { &hf_oran_reMask_re3,
6914 { "RE 3", "oran_fh_cus.reMask-RE3",
6915 FT_BOOLEAN, 16,
6916 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x2000,
6917 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6918 },
6919 { &hf_oran_reMask_re4,
6920 { "RE 4", "oran_fh_cus.reMask-RE4",
6921 FT_BOOLEAN, 16,
6922 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x1000,
6923 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6924 },
6925 { &hf_oran_reMask_re5,
6926 { "RE 5", "oran_fh_cus.reMask-RE5",
6927 FT_BOOLEAN, 16,
6928 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0800,
6929 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6930 },
6931 { &hf_oran_reMask_re6,
6932 { "RE 6", "oran_fh_cus.reMask-RE6",
6933 FT_BOOLEAN, 16,
6934 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0400,
6935 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6936 },
6937 { &hf_oran_reMask_re7,
6938 { "RE 7", "oran_fh_cus.reMask-RE7",
6939 FT_BOOLEAN, 16,
6940 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0200,
6941 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6942 },
6943 { &hf_oran_reMask_re8,
6944 { "RE 8", "oran_fh_cus.reMask-RE8",
6945 FT_BOOLEAN, 16,
6946 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0100,
6947 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6948 },
6949 { &hf_oran_reMask_re9,
6950 { "RE 9", "oran_fh_cus.reMask-RE9",
6951 FT_BOOLEAN, 16,
6952 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0080,
6953 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6954 },
6955 { &hf_oran_reMask_re10,
6956 { "RE 10", "oran_fh_cus.reMask-RE10",
6957 FT_BOOLEAN, 16,
6958 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0040,
6959 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6960 },
6961 { &hf_oran_reMask_re11,
6962 { "RE 11", "oran_fh_cus.reMask-RE11",
6963 FT_BOOLEAN, 16,
6964 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0020,
6965 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6966 },
6967 { &hf_oran_reMask_re12,
6968 { "RE 12", "oran_fh_cus.reMask-RE12",
6969 FT_BOOLEAN, 16,
6970 TFS(&tfs_applicable_not_applicable)((0 ? (const struct true_false_string*)0 : ((&tfs_applicable_not_applicable
))))
, 0x0010,
6971 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6972 },
6973 { &hf_oran_reMask,
6974 { "RE Mask", "oran_fh_cus.reMask",
6975 FT_UINT16, BASE_HEX,
6976 NULL((void*)0), 0xfff0,
6977 "The Resource Element (RE) mask within a PRB", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6978 },
6979
6980 /* Section 7.5.3.6 */
6981 { &hf_oran_numPrbc,
6982 { "numPrbc", "oran_fh_cus.numPrbc",
6983 FT_UINT8, BASE_DEC,
6984 NULL((void*)0), 0x0,
6985 "Number of contiguous PRBs per data section description", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6986 },
6987
6988 /* Section 7.5.3.7 */
6989 { &hf_oran_numSymbol,
6990 { "Number of Symbols", "oran_fh_cus.numSymbol",
6991 FT_UINT8, BASE_DEC,
6992 NULL((void*)0), 0x0f,
6993 "Defines number of symbols to which the section control is applicable", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
6994 },
6995
6996 /* Section 7.5.3.8 */
6997 { &hf_oran_ef,
6998 { "Extension Flag", "oran_fh_cus.ef",
6999 FT_BOOLEAN, 8,
7000 NULL((void*)0), 0x80,
7001 "Indicates if more section extensions follow", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7002 },
7003
7004 /* Section 7.5.3.9 */
7005 { &hf_oran_beamId,
7006 { "Beam ID", "oran_fh_cus.beamId",
7007 FT_UINT16, BASE_DEC,
7008 NULL((void*)0), 0x7fff,
7009 "Defines the beam pattern to be applied to the U-Plane data", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7010 },
7011
7012 { &hf_oran_extension,
7013 { "Extension", "oran_fh_cus.extension",
7014 FT_STRING, BASE_NONE,
7015 NULL((void*)0), 0x0,
7016 "Section extension", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7017 },
7018
7019 /* Section 7.6.2.1 */
7020 { &hf_oran_exttype,
7021 { "extType", "oran_fh_cus.extType",
7022 FT_UINT8, BASE_DEC,
7023 VALS(exttype_vals)((0 ? (const struct _value_string*)0 : ((exttype_vals)))), 0x7f,
7024 "The extension type, which provides additional parameters specific to subject data extension", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7025 },
7026
7027 /* Section 7.6.2.3 */
7028 { &hf_oran_extlen,
7029 { "extLen", "oran_fh_cus.extLen",
7030 FT_UINT16, BASE_DEC,
7031 NULL((void*)0), 0x0,
7032 "Extension length in 32-bit words", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7033 },
7034
7035 /* Section 7.7.1 */
7036 { &hf_oran_bfw,
7037 { "bfw", "oran_fh_cus.bfw",
7038 FT_STRING, BASE_NONE,
7039 NULL((void*)0), 0x0,
7040 "Set of weights for a particular antenna", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7041 },
7042 { &hf_oran_bfw_bundle,
7043 { "Bundle", "oran_fh_cus.bfw.bundle",
7044 FT_STRING, BASE_NONE,
7045 NULL((void*)0), 0x0,
7046 "Bundle of BFWs", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7047 },
7048 { &hf_oran_bfw_bundle_id,
7049 { "Bundle Id", "oran_fh_cus.bfw.bundleId",
7050 FT_UINT32, BASE_DEC,
7051 NULL((void*)0), 0x0,
7052 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7053 },
7054 /* Section 7.7.1.4 */
7055 { &hf_oran_bfw_i,
7056 { "bfwI", "oran_fh_cus.bfwI",
7057 FT_FLOAT, BASE_NONE,
7058 NULL((void*)0), 0x0,
7059 "In-phase", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7060 },
7061 /* Section 7.7.1.5 */
7062 { &hf_oran_bfw_q,
7063 { "bfwQ", "oran_fh_cus.bfwQ",
7064 FT_FLOAT, BASE_NONE,
7065 NULL((void*)0), 0x0,
7066 "Quadrature", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7067 },
7068
7069 /* Section 7.5.3.10 */
7070 { &hf_oran_ueId,
7071 { "UE ID", "oran_fh_cus.ueId",
7072 FT_UINT16, BASE_DEC,
7073 NULL((void*)0), 0x7fff,
7074 "logical identifier for set of channel info", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7075 },
7076
7077 /* Section 7.5.3.11 */
7078 { &hf_oran_freqOffset,
7079 { "Frequency Offset", "oran_fh_cus.freqOffset",
7080 FT_UINT24, BASE_DEC,
7081 NULL((void*)0), 0x0,
7082 "with respect to the carrier center frequency before additional filtering", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7083 },
7084
7085 /* Section 7.5.3.12 */
7086 { &hf_oran_regularizationFactor,
7087 { "Regularization Factor", "oran_fh_cus.regularizationFactor",
7088 FT_INT16, BASE_DEC,
7089 NULL((void*)0), 0x0,
7090 "Signed value to support MMSE operation within O-RU", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7091 },
7092
7093 /* Section 7.5.3.14 */
7094 { &hf_oran_laaMsgType,
7095 { "LAA Message Type", "oran_fh_cus.laaMsgType",
7096 FT_UINT8, BASE_DEC | BASE_RANGE_STRING0x00000100,
7097 RVALS(laaMsgTypes)((0 ? (const struct _range_string*)0 : ((laaMsgTypes)))), 0xf0,
7098 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7099 },
7100
7101 /* Section 7.5.3.15 */
7102 { &hf_oran_laaMsgLen,
7103 { "LAA Message Length", "oran_fh_cus.laaMsgLen",
7104 FT_UINT8, BASE_DEC,
7105 NULL((void*)0), 0x0f,
7106 "number of 32-bit words in the LAA section", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7107 },
7108
7109 /* Section 7.5.3.16 */
7110 { &hf_oran_lbtHandle,
7111 { "LBT Handle", "oran_fh_cus.lbtHandle",
7112 FT_UINT16, BASE_HEX,
7113 NULL((void*)0), 0x0,
7114 "label to identify transaction", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7115 },
7116
7117 /* Section 7.5.3.17 */
7118 { &hf_oran_lbtDeferFactor,
7119 { "Defer Factor", "oran_fh_cus.lbtDeferFactor",
7120 FT_UINT8, BASE_DEC,
7121 NULL((void*)0), 0x07,
7122 "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)}
7123 },
7124
7125 /* Section 7.5.3.18 */
7126 { &hf_oran_lbtBackoffCounter,
7127 { "Backoff Counter", "oran_fh_cus.lbtBackoffCounter",
7128 FT_UINT16, BASE_DEC,
7129 NULL((void*)0), 0xffc0,
7130 "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)}
7131 },
7132
7133 /* Section 7.5.3.19 */
7134 { &hf_oran_lbtOffset,
7135 { "LBT Offset", "oran_fh_cus.lbtOffset",
7136 FT_UINT16, BASE_DEC,
7137 NULL((void*)0), 0xffc0,
7138 "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)}
7139 },
7140
7141 /* Section 7.5.3.20 */
7142 { &hf_oran_MCOT,
7143 { "Maximum Channel Occupancy Time", "oran_fh_cus.MCOT",
7144 FT_UINT8, BASE_DEC,
7145 NULL((void*)0), 0x3c,
7146 "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)}
7147 },
7148
7149 /* Section 7.5.3.21 */
7150 { &hf_oran_lbtMode,
7151 { "LBT Mode", "oran_fh_cus.lbtMode",
7152 FT_UINT8, BASE_DEC,
7153 VALS(lbtMode_vals)((0 ? (const struct _value_string*)0 : ((lbtMode_vals)))), 0x0,
7154 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7155 },
7156
7157 /* Section 7.5.3.22 */
7158 { &hf_oran_lbtPdschRes,
7159 { "lbtPdschRes", "oran_fh_cus.lbtPdschRes",
7160 FT_UINT8, BASE_DEC,
7161 VALS(lbtPdschRes_vals)((0 ? (const struct _value_string*)0 : ((lbtPdschRes_vals)))), 0xc0,
7162 "LBT result of SFN/SF", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7163 },
7164
7165 /* Section 7.5.3.23 */
7166 { &hf_oran_sfStatus,
7167 { "sfStatus", "oran_fh_cus.sfStatus",
7168 FT_BOOLEAN, 8,
7169 TFS(&tfs_sfStatus)((0 ? (const struct true_false_string*)0 : ((&tfs_sfStatus
))))
, 0x10,
7170 "Indicates whether the subframe was dropped or transmitted", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7171 },
7172
7173 /* Section 7.5.3.22 */
7174 { &hf_oran_lbtDrsRes,
7175 { "lbtDrsRes", "oran_fh_cus.lbtDrsRes",
7176 FT_BOOLEAN, 8,
7177 TFS(&tfs_fail_success)((0 ? (const struct true_false_string*)0 : ((&tfs_fail_success
))))
, 0x80,
7178 "Indicates whether the subframe was dropped or transmitted", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7179 },
7180
7181 /* Section 7.5.3.25 */
7182 { &hf_oran_initialPartialSF,
7183 { "Initial partial SF", "oran_fh_cus.initialPartialSF",
7184 FT_BOOLEAN, 8,
7185 TFS(&tfs_partial_full_sf)((0 ? (const struct true_false_string*)0 : ((&tfs_partial_full_sf
))))
, 0x40,
7186 "Indicates whether the initial SF in the LBT process is full or partial", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7187 },
7188
7189 /* Section 7.5.3.26. */
7190 { &hf_oran_lbtBufErr,
7191 { "lbtBufErr", "oran_fh_cus.lbtBufErr",
7192 FT_BOOLEAN, 8,
7193 TFS(&tfs_lbtBufErr)((0 ? (const struct true_false_string*)0 : ((&tfs_lbtBufErr
))))
, 0x80,
7194 "LBT buffer error", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7195 },
7196
7197 /* Section 7.5.3.27 */
7198 { &hf_oran_sfnSfEnd,
7199 { "SFN/SF End", "oran_fh_cus.sfnSfEnd",
7200 FT_UINT16, BASE_DEC,
7201 NULL((void*)0), 0x0fff,
7202 "SFN/SF by which the DRS window must end", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7203 },
7204
7205 /* Section 7.5.3.28 */
7206 { &hf_oran_lbtCWConfig_H,
7207 { "lbtCWConfig_H", "oran_fh_cus.lbtCWConfig_H",
7208 FT_UINT8, BASE_DEC,
7209 NULL((void*)0), 0x0,
7210 "HARQ parameters for congestion window management", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7211 },
7212
7213 /* Section 7.5.3.29 */
7214 { &hf_oran_lbtCWConfig_T,
7215 { "lbtCWConfig_T", "oran_fh_cus.lbtCWConfig_T",
7216 FT_UINT8, BASE_DEC,
7217 NULL((void*)0), 0x0,
7218 "TB parameters for congestion window management", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7219 },
7220
7221 /* Section 7.5.3.30 */
7222 { &hf_oran_lbtTrafficClass,
7223 { "lbtTrafficClass", "oran_fh_cus.lbtTrafficClass",
7224 FT_UINT8, BASE_DEC,
7225 VALS(lbtTrafficClass_vals)((0 ? (const struct _value_string*)0 : ((lbtTrafficClass_vals
))))
, 0x38,
7226 "Traffic class priority for congestion window management", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7227 },
7228
7229 /* Section 7.5.3.31 */
7230 { &hf_oran_lbtCWR_Rst,
7231 { "lbtCWR_Rst", "oran_fh_cus.lbtCWR_Rst",
7232 FT_BOOLEAN, 8,
7233 TFS(&tfs_fail_success)((0 ? (const struct true_false_string*)0 : ((&tfs_fail_success
))))
, 0x80,
7234 "notification about packet reception successful or not", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7235 },
7236
7237 /* Reserved fields */
7238 { &hf_oran_reserved,
7239 { "reserved", "oran_fh_cus.reserved",
7240 FT_UINT64, BASE_HEX,
7241 NULL((void*)0), 0x0,
7242 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7243 },
7244
7245 { &hf_oran_reserved_1bit,
7246 { "reserved", "oran_fh_cus.reserved",
7247 FT_UINT8, BASE_HEX,
7248 NULL((void*)0), 0x80,
7249 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7250 },
7251 { &hf_oran_reserved_2bits,
7252 { "reserved", "oran_fh_cus.reserved",
7253 FT_UINT8, BASE_HEX,
7254 NULL((void*)0), 0xc0,
7255 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7256 },
7257 { &hf_oran_reserved_3bits,
7258 { "reserved", "oran_fh_cus.reserved",
7259 FT_UINT8, BASE_HEX,
7260 NULL((void*)0), 0xe0,
7261 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7262 },
7263 { &hf_oran_reserved_4bits,
7264 { "reserved", "oran_fh_cus.reserved",
7265 FT_UINT8, BASE_HEX,
7266 NULL((void*)0), 0xf0,
7267 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7268 },
7269 { &hf_oran_reserved_last_4bits,
7270 { "reserved", "oran_fh_cus.reserved",
7271 FT_UINT8, BASE_HEX,
7272 NULL((void*)0), 0x0f,
7273 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7274 },
7275 { &hf_oran_reserved_last_5bits,
7276 { "reserved", "oran_fh_cus.reserved",
7277 FT_UINT8, BASE_HEX,
7278 NULL((void*)0), 0x1f,
7279 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7280 },
7281 { &hf_oran_reserved_6bits,
7282 { "reserved", "oran_fh_cus.reserved",
7283 FT_UINT8, BASE_HEX,
7284 NULL((void*)0), 0xfc,
7285 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7286 },
7287 { &hf_oran_reserved_last_6bits,
7288 { "reserved", "oran_fh_cus.reserved",
7289 FT_UINT8, BASE_HEX,
7290 NULL((void*)0), 0x3f,
7291 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7292 },
7293 { &hf_oran_reserved_7bits,
7294 { "reserved", "oran_fh_cus.reserved",
7295 FT_UINT8, BASE_HEX,
7296 NULL((void*)0), 0xfe,
7297 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7298 },
7299 { &hf_oran_reserved_last_7bits,
7300 { "reserved", "oran_fh_cus.reserved",
7301 FT_UINT8, BASE_HEX,
7302 NULL((void*)0), 0x7f,
7303 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7304 },
7305 { &hf_oran_reserved_8bits,
7306 { "reserved", "oran_fh_cus.reserved",
7307 FT_UINT8, BASE_HEX,
7308 NULL((void*)0), 0x0,
7309 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7310 },
7311 { &hf_oran_reserved_16bits,
7312 { "reserved", "oran_fh_cus.reserved",
7313 FT_UINT16, BASE_HEX,
7314 NULL((void*)0), 0x0,
7315 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7316 },
7317 { &hf_oran_reserved_15bits,
7318 { "reserved", "oran_fh_cus.reserved",
7319 FT_UINT16, BASE_HEX,
7320 NULL((void*)0), 0x7fff,
7321 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7322 },
7323 { &hf_oran_reserved_bit1,
7324 { "reserved", "oran_fh_cus.reserved",
7325 FT_UINT8, BASE_HEX,
7326 NULL((void*)0), 0x40,
7327 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7328 },
7329 { &hf_oran_reserved_bit2,
7330 { "reserved", "oran_fh_cus.reserved",
7331 FT_UINT8, BASE_HEX,
7332 NULL((void*)0), 0x20,
7333 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7334 },
7335 { &hf_oran_reserved_bit4,
7336 { "reserved", "oran_fh_cus.reserved",
7337 FT_UINT8, BASE_HEX,
7338 NULL((void*)0), 0x08,
7339 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7340 },
7341 { &hf_oran_reserved_bit5,
7342 { "reserved", "oran_fh_cus.reserved",
7343 FT_UINT8, BASE_HEX,
7344 NULL((void*)0), 0x04,
7345 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7346 },
7347 { &hf_oran_reserved_bits123,
7348 { "reserved", "oran_fh_cus.reserved",
7349 FT_UINT8, BASE_HEX,
7350 NULL((void*)0), 0x70,
7351 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7352 },
7353 { &hf_oran_reserved_bits456,
7354 { "reserved", "oran_fh_cus.reserved",
7355 FT_UINT8, BASE_HEX,
7356 NULL((void*)0), 0x0e,
7357 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7358 },
7359
7360
7361 /* 7.7.11.10 */
7362 { &hf_oran_bundle_offset,
7363 { "BundleOffset", "oran_fh_cus.bundleOffset",
7364 FT_UINT8, BASE_DEC,
7365 NULL((void*)0), 0x3f,
7366 "offset between start of first PRB bundle and startPrbc", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7367 },
7368 /* 7.7.11.9 */
7369 { &hf_oran_cont_ind,
7370 { "contInd", "oran_fh_cus.contInd",
7371 FT_BOOLEAN, 8,
7372 TFS(&continuity_indication_tfs)((0 ? (const struct true_false_string*)0 : ((&continuity_indication_tfs
))))
, 0x80,
7373 "PRB region continuity flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7374 },
7375
7376 /* 7.7.1.2 bfwCompHdr (beamforming weight compression header) */
7377 { &hf_oran_bfwCompHdr,
7378 { "bfwCompHdr", "oran_fh_cus.bfwCompHdr",
7379 FT_STRING, BASE_NONE,
7380 NULL((void*)0), 0x0,
7381 "Compression method and IQ bit width for beamforming weights", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7382 },
7383 { &hf_oran_bfwCompHdr_iqWidth,
7384 { "IQ Bit Width", "oran_fh_cus.bfwCompHdr_iqWidth",
7385 FT_UINT8, BASE_HEX,
7386 VALS(bfw_comp_headers_iq_width)((0 ? (const struct _value_string*)0 : ((bfw_comp_headers_iq_width
))))
, 0xf0,
7387 "IQ bit width for the beamforming weights", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7388 },
7389 { &hf_oran_bfwCompHdr_compMeth,
7390 { "Compression Method", "oran_fh_cus.bfwCompHdr_compMeth",
7391 FT_UINT8, BASE_HEX,
7392 VALS(bfw_comp_headers_comp_meth)((0 ? (const struct _value_string*)0 : ((bfw_comp_headers_comp_meth
))))
, 0x0f,
7393 "compression method for the beamforming weights", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7394 },
7395
7396 /* 7.5.3.32 */
7397 { &hf_oran_ciCompParam,
7398 { "ciCompParam", "oran_fh_cus.ciCompParam",
7399 FT_STRING, BASE_NONE,
7400 NULL((void*)0), 0x0,
7401 "channel information compression parameter", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7402 },
7403
7404 /* Table 7.5.3.32-1 */
7405 { &hf_oran_blockScaler,
7406 { "blockScaler", "oran_fh_cus.blockScaler",
7407 FT_UINT8, BASE_HEX,
7408 NULL((void*)0), 0x0,
7409 "unsigned, 1 integer bit, 7 fractional bits", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7410 },
7411 { &hf_oran_compBitWidth,
7412 { "compBitWidth", "oran_fh_cus.compBitWidth",
7413 FT_UINT8, BASE_DEC,
7414 NULL((void*)0), 0xf0,
7415 "Length of I bits and length of Q bits after compression over entire PRB", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7416 },
7417 { &hf_oran_compShift,
7418 { "compShift", "oran_fh_cus.compShift",
7419 FT_UINT8, BASE_DEC,
7420 NULL((void*)0), 0x0f,
7421 "The shift applied to the entire PRB", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7422 },
7423
7424 { &hf_oran_active_beamspace_coefficient_n1,
7425 { "N1", "oran_fh_cus.activeBeamspace_Coefficient_n1",
7426 FT_BOOLEAN, 8,
7427 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x80,
7428 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7429 },
7430 { &hf_oran_active_beamspace_coefficient_n2,
7431 { "N2", "oran_fh_cus.activeBeamspace_Coefficient_n2",
7432 FT_BOOLEAN, 8,
7433 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x40,
7434 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7435 },
7436 { &hf_oran_active_beamspace_coefficient_n3,
7437 { "N3", "oran_fh_cus.activeBeamspace_Coefficient_n3",
7438 FT_BOOLEAN, 8,
7439 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x20,
7440 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7441 },
7442 { &hf_oran_active_beamspace_coefficient_n4,
7443 { "N4", "oran_fh_cus.activeBeamspace_Coefficient_n4",
7444 FT_BOOLEAN, 8,
7445 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x10,
7446 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7447 },
7448 { &hf_oran_active_beamspace_coefficient_n5,
7449 { "N5", "oran_fh_cus.activeBeamspace_Coefficient_n5",
7450 FT_BOOLEAN, 8,
7451 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x08,
7452 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7453 },
7454 { &hf_oran_active_beamspace_coefficient_n6,
7455 { "N6", "oran_fh_cus.activeBeamspace_Coefficient_n6",
7456 FT_BOOLEAN, 8,
7457 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x04,
7458 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7459 },
7460 { &hf_oran_active_beamspace_coefficient_n7,
7461 { "N7", "oran_fh_cus.activeBeamspace_Coefficient_n7",
7462 FT_BOOLEAN, 8,
7463 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x02,
7464 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7465 },
7466 { &hf_oran_active_beamspace_coefficient_n8,
7467 { "N8", "oran_fh_cus.activeBeamspace_Coefficient_n8",
7468 FT_BOOLEAN, 8,
7469 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x01,
7470 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7471 },
7472
7473 { &hf_oran_activeBeamspaceCoefficientMask,
7474 { "activeBeamspaceCoefficientMask", "oran_fh_cus.activeBeamspaceCoefficientMask",
7475 FT_UINT8, BASE_HEX,
7476 NULL((void*)0), 0xff,
7477 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7478 },
7479 { &hf_oran_activeBeamspaceCoefficientMask_bits_set,
7480 { "Array elements set", "oran_fh_cus.activeBeamspaceCoefficientMask.bits-set",
7481 FT_UINT32, BASE_DEC,
7482 NULL((void*)0), 0x0,
7483 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7484 },
7485
7486 /* Section 7.7.6.6 */
7487 { &hf_oran_se6_repetition,
7488 { "repetition", "oran_fh_cus.repetition",
7489 FT_BOOLEAN, BASE_NONE,
7490 TFS(&repetition_se6_tfs)((0 ? (const struct true_false_string*)0 : ((&repetition_se6_tfs
))))
, 0x0,
7491 "Repetition of a highest priority data section for C-Plane", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7492 },
7493 /* 7.7.20.9 */
7494 { &hf_oran_rbgSize,
7495 { "rbgSize", "oran_fh_cus.rbgSize",
7496 FT_UINT8, BASE_HEX,
7497 VALS(rbg_size_vals)((0 ? (const struct _value_string*)0 : ((rbg_size_vals)))), 0x70,
7498 "Number of PRBs of the resource block groups allocated by the bit mask", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7499 },
7500 /* 7.7.20.10 */
7501 { &hf_oran_rbgMask,
7502 { "rbgMask", "oran_fh_cus.rbgMask",
7503 FT_UINT32, BASE_HEX,
7504 NULL((void*)0), 0x0fffffff,
7505 "Each bit indicates whether a corresponding resource block group is present", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7506 },
7507 /* 7.7.6.5. Also 7.7.12.3 and 7.7.19.5 */
7508 { &hf_oran_noncontig_priority,
7509 { "priority", "oran_fh_cus.priority",
7510 FT_UINT8, BASE_HEX,
7511 VALS(priority_vals)((0 ? (const struct _value_string*)0 : ((priority_vals)))), 0xc0,
7512 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7513 },
7514
7515 /* 7.7.6.4 */
7516 { &hf_oran_symbol_mask,
7517 { "symbolMask", "oran_fh_cus.symbolMask",
7518 FT_UINT16, BASE_HEX,
7519 NULL((void*)0), 0x3fff,
7520 "Each bit indicates whether the rbgMask applies to a given symbol in the slot", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7521 },
7522 { &hf_oran_symbol_mask_s13,
7523 { "symbol 13", "oran_fh_cus.symbolMask.symbol-13",
7524 FT_BOOLEAN, 16,
7525 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x2000,
7526 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7527 },
7528 { &hf_oran_symbol_mask_s12,
7529 { "symbol 12", "oran_fh_cus.symbolMask.symbol-12",
7530 FT_BOOLEAN, 16,
7531 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x1000,
7532 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7533 },
7534 { &hf_oran_symbol_mask_s11,
7535 { "symbol 11", "oran_fh_cus.symbolMask.symbol-11",
7536 FT_BOOLEAN, 16,
7537 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0800,
7538 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7539 },
7540 { &hf_oran_symbol_mask_s10,
7541 { "symbol 10", "oran_fh_cus.symbolMask.symbol-10",
7542 FT_BOOLEAN, 16,
7543 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0400,
7544 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7545 },
7546 { &hf_oran_symbol_mask_s9,
7547 { "symbol 9", "oran_fh_cus.symbolMask.symbol-9",
7548 FT_BOOLEAN, 16,
7549 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0200,
7550 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7551 },
7552 { &hf_oran_symbol_mask_s8,
7553 { "symbol 8", "oran_fh_cus.symbolMask.symbol-8",
7554 FT_BOOLEAN, 16,
7555 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0100,
7556 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7557 },
7558 { &hf_oran_symbol_mask_s7,
7559 { "symbol 7", "oran_fh_cus.symbolMask.symbol-7",
7560 FT_BOOLEAN, 16,
7561 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0080,
7562 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7563 },
7564 { &hf_oran_symbol_mask_s6,
7565 { "symbol 6", "oran_fh_cus.symbolMask.symbol-6",
7566 FT_BOOLEAN, 16,
7567 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0040,
7568 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7569 },
7570 { &hf_oran_symbol_mask_s5,
7571 { "symbol 5", "oran_fh_cus.symbolMask.symbol-5",
7572 FT_BOOLEAN, 16,
7573 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0020,
7574 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7575 },
7576 { &hf_oran_symbol_mask_s4,
7577 { "symbol 4", "oran_fh_cus.symbolMask.symbol-4",
7578 FT_BOOLEAN, 16,
7579 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0010,
7580 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7581 },
7582 { &hf_oran_symbol_mask_s3,
7583 { "symbol 3", "oran_fh_cus.symbolMask.symbol-3",
7584 FT_BOOLEAN, 16,
7585 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0008,
7586 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7587 },
7588 { &hf_oran_symbol_mask_s2,
7589 { "symbol 2", "oran_fh_cus.symbolMask.symbol-2",
7590 FT_BOOLEAN, 16,
7591 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0004,
7592 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7593 },
7594 { &hf_oran_symbol_mask_s1,
7595 { "symbol 1", "oran_fh_cus.symbolMask.symbol-1",
7596 FT_BOOLEAN, 16,
7597 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0002,
7598 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7599 },
7600 { &hf_oran_symbol_mask_s0,
7601 { "symbol 0", "oran_fh_cus.symbolMask.symbol-0",
7602 FT_BOOLEAN, 16,
7603 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0001,
7604 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7605 },
7606
7607
7608 /* 7.7.22.2 */
7609 { &hf_oran_ack_nack_req_id,
7610 { "ackNackReqId", "oran_fh_cus.ackNackReqId",
7611 FT_UINT16, BASE_HEX,
7612 NULL((void*)0), 0x0,
7613 "Indicates the ACK/NACK request ID of a section description", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7614 },
7615
7616 /* Subtree for next 2 items */
7617 { &hf_oran_frequency_range,
7618 { "Frequency Range", "oran_fh_cus.frequencyRange",
7619 FT_STRING, BASE_NONE,
7620 NULL((void*)0), 0x0,
7621 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7622 },
7623
7624 /* 7.7.12.4 */
7625 { &hf_oran_off_start_prb,
7626 { "offStartPrb", "oran_fh_cus.offStartPrb",
7627 FT_UINT8, BASE_DEC,
7628 NULL((void*)0), 0x0,
7629 "Offset of PRB range start", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7630 },
7631 /* 7.7.12.5 */
7632 { &hf_oran_num_prb,
7633 { "numPrb", "oran_fh_cus.numPrb",
7634 FT_UINT8, BASE_DEC,
7635 NULL((void*)0), 0x0,
7636 "Number of PRBs in PRB range", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7637 },
7638
7639 /* symbolId 8.3.3.7 */
7640 { &hf_oran_symbolId,
7641 { "Symbol Identifier", "oran_fh_cus.symbolId",
7642 FT_UINT8, BASE_DEC,
7643 NULL((void*)0), 0x3f,
7644 "Identifies a symbol number within a slot", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7645 },
7646
7647 /* startPrbu 8.3.3.11 */
7648 { &hf_oran_startPrbu,
7649 { "startPrbu", "oran_fh_cus.startPrbu",
7650 FT_UINT16, BASE_DEC,
7651 NULL((void*)0), 0x03ff,
7652 "starting PRB of user plane section", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7653 },
7654
7655 /* numPrbu 8.3.3.12 */
7656 { &hf_oran_numPrbu,
7657 { "numPrbu", "oran_fh_cus.numPrbu",
7658 FT_UINT8, BASE_DEC,
7659 NULL((void*)0), 0x0,
7660 "number of PRBs per user plane section", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7661 },
7662
7663 /* 7.7.1.3 */
7664 { &hf_oran_bfwCompParam,
7665 { "bfwCompParam", "oran_fh_cus.bfwCompParam",
7666 FT_STRING, BASE_NONE,
7667 NULL((void*)0), 0x0,
7668 "Beamforming weight compression parameter", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7669 },
7670
7671 /* 6.3.3.13 */
7672 { &hf_oran_udCompHdrMeth,
7673 { "User Data Compression Method", "oran_fh_cus.udCompHdrMeth",
7674 FT_UINT8, BASE_DEC | BASE_RANGE_STRING0x00000100,
7675 RVALS(ud_comp_header_meth)((0 ? (const struct _range_string*)0 : ((ud_comp_header_meth)
)))
, 0x0f,
7676 "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)}
7677 },
7678 { &hf_oran_udCompHdrMeth_pref,
7679 { "User Data Compression Method", "oran_fh_cus.udCompHdrMeth",
7680 FT_UINT8, BASE_DEC | BASE_RANGE_STRING0x00000100,
7681 RVALS(ud_comp_header_meth)((0 ? (const struct _range_string*)0 : ((ud_comp_header_meth)
)))
, 0x0,
7682 "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)}
7683 },
7684 /* 8.3.3.18 */
7685 { &hf_oran_udCompLen,
7686 { "udCompLen", "oran_fh_cus.udCompLen",
7687 FT_UINT16, BASE_DEC,
7688 NULL((void*)0), 0x0,
7689 "PRB field length in octets", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7690 },
7691
7692 /* 6.3.3.13 */
7693 { &hf_oran_udCompHdrIqWidth,
7694 { "User Data IQ width", "oran_fh_cus.udCompHdrWidth",
7695 FT_UINT8, BASE_DEC | BASE_RANGE_STRING0x00000100,
7696 RVALS(ud_comp_header_width)((0 ? (const struct _range_string*)0 : ((ud_comp_header_width
))))
, 0xf0,
7697 "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)}
7698 },
7699 { &hf_oran_udCompHdrIqWidth_pref,
7700 { "User Data IQ width", "oran_fh_cus.udCompHdrWidth",
7701 FT_UINT8, BASE_DEC,
7702 NULL((void*)0), 0x0,
7703 "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)}
7704 },
7705
7706 { &hf_oran_sinrCompHdrIqWidth_pref,
7707 { "SINR IQ width", "oran_fh_cus.sinrCompHdrWidth",
7708 FT_UINT8, BASE_DEC,
7709 NULL((void*)0), 0x0,
7710 "Defines the IQ bit width for SINR data in section type 9", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7711 },
7712 { &hf_oran_sinrCompHdrMeth_pref,
7713 { "SINR Compression Method", "oran_fh_cus.sinrCompHdrMeth",
7714 FT_UINT8, BASE_DEC | BASE_RANGE_STRING0x00000100,
7715 RVALS(ud_comp_header_meth)((0 ? (const struct _range_string*)0 : ((ud_comp_header_meth)
)))
, 0x0,
7716 "Defines the compression method for SINR data in section type 9", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7717 },
7718
7719 /* Section 8.3.3.15 (not always present - depends upon meth) */
7720 { &hf_oran_udCompParam,
7721 { "User Data Compression Parameter", "oran_fh_cus.udCompParam",
7722 FT_STRING, BASE_NONE,
7723 NULL((void*)0), 0x0,
7724 "Applies to whatever compression method is specified by the associated sectionID's compMeth value", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7725 },
7726 /* 8.3.3.18 */
7727 { &hf_oran_sReSMask,
7728 { "sReSMask", "oran_fh_cus.sReSMask",
7729 FT_UINT16, BASE_HEX,
7730 NULL((void*)0), 0xf0ff,
7731 "selective RE sending mask", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7732 },
7733
7734 { &hf_oran_sReSMask_re12,
7735 { "RE-12", "oran_fh_cus.sReSMask-re12",
7736 FT_BOOLEAN, 16,
7737 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x8000,
7738 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7739 },
7740 { &hf_oran_sReSMask_re11,
7741 { "RE-11", "oran_fh_cus.sReSMask-re11",
7742 FT_BOOLEAN, 16,
7743 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x4000,
7744 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7745 },
7746 { &hf_oran_sReSMask_re10,
7747 { "RE-10", "oran_fh_cus.sReSMask-re10",
7748 FT_BOOLEAN, 16,
7749 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x2000,
7750 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7751 },
7752 { &hf_oran_sReSMask_re9,
7753 { "RE-9", "oran_fh_cus.sReSMask-re9",
7754 FT_BOOLEAN, 16,
7755 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x1000,
7756 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7757 },
7758 { &hf_oran_sReSMask_re8,
7759 { "RE-8", "oran_fh_cus.sReSMask-re8",
7760 FT_BOOLEAN, 16,
7761 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0080,
7762 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7763 },
7764 { &hf_oran_sReSMask_re7,
7765 { "RE-7", "oran_fh_cus.sReSMask-re7",
7766 FT_BOOLEAN, 16,
7767 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0040,
7768 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7769 },
7770 { &hf_oran_sReSMask_re6,
7771 { "RE-6", "oran_fh_cus.sReSMask-re6",
7772 FT_BOOLEAN, 16,
7773 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0020,
7774 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7775 },
7776 { &hf_oran_sReSMask_re5,
7777 { "RE-5", "oran_fh_cus.sReSMask-re5",
7778 FT_BOOLEAN, 16,
7779 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0010,
7780 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7781 },
7782 { &hf_oran_sReSMask_re4,
7783 { "RE-4", "oran_fh_cus.sReSMask-re4",
7784 FT_BOOLEAN, 16,
7785 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0008,
7786 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7787 },
7788 { &hf_oran_sReSMask_re3,
7789 { "RE-3", "oran_fh_cus.sReSMask-re3",
7790 FT_BOOLEAN, 16,
7791 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0004,
7792 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7793 },
7794 { &hf_oran_sReSMask_re2,
7795 { "RE-2", "oran_fh_cus.sReSMask-re2",
7796 FT_BOOLEAN, 16,
7797 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0002,
7798 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7799 },
7800 { &hf_oran_sReSMask_re1,
7801 { "RE-1", "oran_fh_cus.sReSMask-re1",
7802 FT_BOOLEAN, 16,
7803 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0001,
7804 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7805 },
7806
7807 /* 8.3.3.20 */
7808 { &hf_oran_sReSMask1,
7809 { "sReSMask1", "oran_fh_cus.sReSMask1",
7810 FT_UINT16, BASE_HEX,
7811 NULL((void*)0), 0x0fff,
7812 "selective RE sending mask 1", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7813 },
7814 /* 8.3.3.21 */
7815 { &hf_oran_sReSMask2,
7816 { "sReSMask2", "oran_fh_cus.sReSMask2",
7817 FT_UINT16, BASE_HEX,
7818 NULL((void*)0), 0x0fff,
7819 "selective RE sending mask 2", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7820 },
7821
7822 { &hf_oran_sReSMask1_2_re12,
7823 { "RE-12", "oran_fh_cus.sReSMask-re12",
7824 FT_BOOLEAN, 16,
7825 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0800,
7826 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7827 },
7828 { &hf_oran_sReSMask1_2_re11,
7829 { "RE-11", "oran_fh_cus.sReSMask-re11",
7830 FT_BOOLEAN, 16,
7831 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0400,
7832 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7833 },
7834 { &hf_oran_sReSMask1_2_re10,
7835 { "RE-10", "oran_fh_cus.sReSMask-re10",
7836 FT_BOOLEAN, 16,
7837 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0200,
7838 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7839 },
7840 { &hf_oran_sReSMask1_2_re9,
7841 { "RE-9", "oran_fh_cus.sReSMask-re9",
7842 FT_BOOLEAN, 16,
7843 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0100,
7844 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7845 },
7846
7847 /* Section 6.3.3.15 */
7848 { &hf_oran_iSample,
7849 { "iSample", "oran_fh_cus.iSample",
7850 FT_FLOAT, BASE_NONE,
7851 NULL((void*)0), 0x0,
7852 "In-phase Sample value", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7853 },
7854
7855 /* Section 6.3.3.16 */
7856 { &hf_oran_qSample,
7857 { "qSample", "oran_fh_cus.qSample",
7858 FT_FLOAT, BASE_NONE,
7859 NULL((void*)0), 0x0,
7860 "Quadrature Sample value", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7861 },
7862
7863 { &hf_oran_exponent,
7864 { "Exponent", "oran_fh_cus.exponent",
7865 FT_UINT8, BASE_DEC,
7866 NULL((void*)0), 0x0f,
7867 "Exponent applicable to the I & Q mantissas", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7868 },
7869
7870 { &hf_oran_iq_user_data,
7871 { "IQ User Data", "oran_fh_cus.iq_user_data",
7872 FT_BYTES, BASE_NONE,
7873 NULL((void*)0), 0x0,
7874 "Used for the In-phase and Quadrature sample mantissa", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7875 },
7876
7877
7878 { &hf_oran_u_section_ul_symbol_time,
7879 { "Microseconds since first UL U-plane frame for this symbol", "oran_fh_cus.us-since-first-ul-frame",
7880 FT_UINT32, BASE_DEC,
7881 NULL((void*)0), 0x0,
7882 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7883 },
7884 { &hf_oran_u_section_ul_symbol_frames,
7885 { "Number of UL frames sent for this symbol", "oran_fh_cus.number-ul-frames-in-symbol",
7886 FT_UINT32, BASE_DEC,
7887 NULL((void*)0), 0x0,
7888 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7889 },
7890 { &hf_oran_u_section_ul_symbol_first_frame,
7891 { "First UL frame for this symbol", "oran_fh_cus.first-ul-frame-in-symbol",
7892 FT_FRAMENUM, BASE_NONE,
7893 FRAMENUM_TYPE(FT_FRAMENUM_NONE)((gpointer) (glong) (FT_FRAMENUM_NONE)), 0x0,
7894 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7895 },
7896 { &hf_oran_u_section_ul_symbol_last_frame,
7897 { "Last UL frame for this symbol", "oran_fh_cus.last-ul-frame-in-symbol",
7898 FT_FRAMENUM, BASE_NONE,
7899 FRAMENUM_TYPE(FT_FRAMENUM_NONE)((gpointer) (glong) (FT_FRAMENUM_NONE)), 0x0,
7900 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7901 },
7902
7903 { &hf_oran_c_eAxC_ID,
7904 { "c_eAxC_ID", "oran_fh_cus.c_eaxc_id",
7905 FT_STRING, BASE_NONE,
7906 NULL((void*)0), 0x0,
7907 "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) }
7908 },
7909
7910 { &hf_oran_refa,
7911 { "RefA", "oran_fh_cus.refa",
7912 FT_STRING, BASE_NONE,
7913 NULL((void*)0), 0x0,
7914 "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) }
7915 },
7916
7917
7918 /* Section 7.5.2.15 */
7919 { &hf_oran_ciCompHdr,
7920 { "ciCompHdr", "oran_fh_cus.ciCompHdr",
7921 FT_STRING, BASE_NONE,
7922 NULL((void*)0), 0x0,
7923 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7924 },
7925 { &hf_oran_ciCompHdrMeth,
7926 { "User Data Compression Method", "oran_fh_cus.ciCompHdrMeth",
7927 FT_UINT8, BASE_DEC | BASE_RANGE_STRING0x00000100,
7928 RVALS(ud_comp_header_meth)((0 ? (const struct _range_string*)0 : ((ud_comp_header_meth)
)))
, 0x0e,
7929 "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)}
7930 },
7931 { &hf_oran_ciCompHdrIqWidth,
7932 { "User Data IQ width", "oran_fh_cus.udCompHdrWidth",
7933 FT_UINT8, BASE_DEC | BASE_RANGE_STRING0x00000100,
7934 RVALS(ud_comp_header_width)((0 ? (const struct _range_string*)0 : ((ud_comp_header_width
))))
, 0xf0,
7935 "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)}
7936 },
7937 { &hf_oran_ciCompOpt,
7938 { "ciCompOpt", "oran_fh_cus.ciCompOpt",
7939 FT_UINT8, BASE_DEC,
7940 VALS(ci_comp_opt_vals)((0 ? (const struct _value_string*)0 : ((ci_comp_opt_vals)))), 0x01,
7941 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7942 },
7943
7944 /* 7.7.11.7 */
7945 { &hf_oran_disable_bfws,
7946 { "disableBFWs", "oran_fh_cus.disableBFWs",
7947 FT_BOOLEAN, 8,
7948 NULL((void*)0), 0x80,
7949 "Indicate if BFWs under section extension are disabled", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7950 },
7951 /* 7.7.11.8 */
7952 { &hf_oran_rad,
7953 { "RAD", "oran_fh_cus.rad",
7954 FT_BOOLEAN, 8,
7955 NULL((void*)0), 0x40,
7956 "Reset After PRB Discontinuity", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7957 },
7958 /* 7.7.11.4 */
7959 { &hf_oran_num_bund_prbs,
7960 { "numBundPrb", "oran_fh_cus.numBundPrb",
7961 FT_UINT8, BASE_DEC,
7962 NULL((void*)0), 0x0,
7963 "Number of bundled PRBs per BFWs", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7964 },
7965 { &hf_oran_beam_id,
7966 { "beamId", "oran_fh_cus.beamId",
7967 FT_UINT16, BASE_DEC,
7968 NULL((void*)0), 0x7fff,
7969 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7970 },
7971 { &hf_oran_num_weights_per_bundle,
7972 { "Num weights per bundle", "oran_fh_cus.num_weights_per_bundle",
7973 FT_UINT16, BASE_DEC,
7974 NULL((void*)0), 0x0,
7975 "From dissector preference", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7976 },
7977
7978 { &hf_oran_samples_prb,
7979 {"PRB", "oran_fh_cus.prb",
7980 FT_STRING, BASE_NONE,
7981 NULL((void*)0), 0x0,
7982 "Grouping of samples for a particular Physical Resource Block", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7983 },
7984
7985 /* 7.5.3.13 */
7986 { &hf_oran_ciSample,
7987 { "ciSample", "oran_fh_cus.ciSample",
7988 FT_STRING, BASE_NONE,
7989 NULL((void*)0), 0x0,
7990 "Sample (I and Q values)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7991 },
7992 { &hf_oran_ciIsample,
7993 { "ciIsample", "oran_fh_cus.ciISample",
7994 FT_FLOAT, BASE_NONE,
7995 NULL((void*)0), 0x0,
7996 "Channel information complex value - I part", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7997 },
7998 { &hf_oran_ciQsample,
7999 { "ciQsample", "oran_fh_cus.ciQSample",
8000 FT_FLOAT, BASE_NONE,
8001 NULL((void*)0), 0x0,
8002 "Channel information complex value - Q part", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8003 },
8004
8005 /* 7.7.10.2 */
8006 { &hf_oran_beamGroupType,
8007 { "beamGroupType", "oran_fh_cus.beamGroupType",
8008 FT_UINT8, BASE_DEC,
8009 VALS(beam_group_type_vals)((0 ? (const struct _value_string*)0 : ((beam_group_type_vals
))))
, 0xc0,
8010 "The type of beam grouping", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8011 },
8012 /* 7.7.10.3 */
8013 { &hf_oran_numPortc,
8014 { "numPortc", "oran_fh_cus.numPortc",
8015 FT_UINT8, BASE_DEC,
8016 NULL((void*)0), 0x3f,
8017 "The number of eAxC ports", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8018 },
8019
8020 /* 7.7.4.2 (1 bit) */
8021 { &hf_oran_csf,
8022 { "csf", "oran_fh_cus.csf",
8023 FT_BOOLEAN, BASE_NONE,
8024 NULL((void*)0), 0x0,
8025 "constellation shift flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8026 },
8027 /* 7.7.4.3 */
8028 { &hf_oran_modcompscaler,
8029 { "modCompScaler", "oran_fh_cus.modcompscaler",
8030 FT_UINT16, BASE_DEC,
8031 NULL((void*)0), 0x7fff,
8032 "modulation compression scaler value", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8033 },
8034
8035 /* 7.7.5.1 */
8036 { &hf_oran_modcomp_param_set,
8037 { "Set", "oran_fh_cus.modcomp-param-set",
8038 FT_STRING, BASE_NONE,
8039 NULL((void*)0), 0x0,
8040 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8041 },
8042
8043 /* mcScaleReMask 7.7.5.2 (12 bits) */
8044 { &hf_oran_mc_scale_re_mask,
8045 { "mcScaleReMask", "oran_fh_cus.mcscaleremask",
8046 FT_BOOLEAN, BASE_NONE,
8047 NULL((void*)0), 0x0,
8048 "modulation compression power scale RE mask", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8049 },
8050 /* mcScaleOffset 7.7.5.4 (15 bits) */
8051 { &hf_oran_mc_scale_offset,
8052 { "mcScaleOffset", "oran_fh_cus.mcscaleoffset",
8053 FT_UINT24, BASE_DEC,
8054 NULL((void*)0), 0x0,
8055 "scaling value for modulation compression", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8056 },
8057 /* eAxCmask (7.7.7.2) */
8058 { &hf_oran_eAxC_mask,
8059 { "eAxC Mask", "oran_fh_cus.eaxcmask",
8060 FT_UINT16, BASE_HEX,
8061 NULL((void*)0), 0xffff,
8062 "Which eAxC_ID values the C-Plane message applies to", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8063 },
8064 /* technology (interface name) 7.7.9.2 */
8065 { &hf_oran_technology,
8066 { "Technology", "oran_fh_cus.technology",
8067 FT_UINT8, BASE_DEC,
8068 VALS(interface_name_vals)((0 ? (const struct _value_string*)0 : ((interface_name_vals)
)))
, 0x0,
8069 "Interface name (that C-PLane section applies to)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8070 },
8071 /* Exttype 14 (7.7.14.2) */
8072 { &hf_oran_nullLayerInd,
8073 { "nullLayerInd", "oran_fh_cus.nulllayerind",
8074 FT_BOOLEAN, BASE_NONE,
8075 NULL((void*)0), 0x0,
8076 "Whether corresponding layer is nulling-layer or not", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8077 },
8078
8079 /* Exttype 19 */
8080 /* 7.7.19.3 */
8081 { &hf_oran_se19_repetition,
8082 { "repetition", "oran_fh_cus.repetition",
8083 FT_BOOLEAN, BASE_NONE,
8084 TFS(&repetition_se19_tfs)((0 ? (const struct true_false_string*)0 : ((&repetition_se19_tfs
))))
, 0x0,
8085 "repeat port info flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8086 },
8087 /* 7.7.19.8 */
8088 /* TODO: break down into each RE as done for 7.5.3.5 ? */
8089 { &hf_oran_portReMask,
8090 { "portReMask", "oran_fh_cus.portReMask",
8091 FT_BOOLEAN, 16,
8092 TFS(&tfs_set_notset)((0 ? (const struct true_false_string*)0 : ((&tfs_set_notset
))))
, 0x0fff,
8093 "RE bitmask per port", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8094 },
8095 /* 7.7.19.9 */
8096 { &hf_oran_portSymbolMask,
8097 { "portSymbolMask", "oran_fh_cus.portSymbolMask",
8098 FT_BOOLEAN, 16,
8099 TFS(&tfs_set_notset)((0 ? (const struct true_false_string*)0 : ((&tfs_set_notset
))))
, 0x3fff,
8100 "Symbol bitmask port port", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8101 },
8102
8103 { &hf_oran_ext19_port,
8104 {"Port", "oran_fh_cus.ext19.port",
8105 FT_STRING, BASE_NONE,
8106 NULL((void*)0), 0x0,
8107 "Entry for a given port in ext19", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8108 },
8109
8110 /* Ext 13 */
8111 { &hf_oran_prb_allocation,
8112 {"PRB allocation", "oran_fh_cus.prb-allocation",
8113 FT_STRING, BASE_NONE,
8114 NULL((void*)0), 0x0,
8115 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8116 },
8117 /* 7.7.13.2 */
8118 { &hf_oran_nextSymbolId,
8119 { "nextSymbolId", "oran_fh_cus.nextSymbolId",
8120 FT_UINT8, BASE_DEC,
8121 NULL((void*)0), 0x3c,
8122 "offset of PRB range start", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8123 },
8124 /* 7.7.13.3 */
8125 { &hf_oran_nextStartPrbc,
8126 { "nextStartPrbc", "oran_fh_cus.nextStartPrbc",
8127 FT_UINT16, BASE_DEC,
8128 NULL((void*)0), 0x03ff,
8129 "number of PRBs in PRB range", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8130 },
8131
8132 /* Puncturing patters as appears in SE 20 */
8133 { &hf_oran_puncPattern,
8134 { "puncPattern", "oran_fh_cus.puncPattern",
8135 FT_STRING, BASE_NONE,
8136 NULL((void*)0), 0x0,
8137 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8138 },
8139
8140 /* 7.7.20.2 numPuncPatterns */
8141 { &hf_oran_numPuncPatterns,
8142 { "numPuncPatterns", "oran_fh_cus.numPuncPatterns",
8143 FT_UINT8, BASE_DEC,
8144 NULL((void*)0), 0x0,
8145 "number of puncturing patterns", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8146 },
8147 /* 7.7.20.3 symbolMask */
8148 { &hf_oran_symbolMask_ext20,
8149 { "symbolMask", "oran_fh_cus.symbolMask",
8150 FT_UINT16, BASE_HEX,
8151 NULL((void*)0), 0xfffc,
8152 "Bitmask where each bit indicates the symbols associated with the puncturing pattern", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8153 },
8154 /* 7.7.20.4 startPuncPrb */
8155 { &hf_oran_startPuncPrb,
8156 { "startPuncPrb", "oran_fh_cus.startPuncPrb",
8157 FT_UINT16, BASE_DEC,
8158 NULL((void*)0), 0x03ff,
8159 "starting PRB to which one puncturing pattern applies", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8160 },
8161 /* 7.7.20.5 numPuncPrb */
8162 { &hf_oran_numPuncPrb,
8163 { "numPuncPrb", "oran_fh_cus.numPuncPrb",
8164 FT_UINT8, BASE_DEC,
8165 NULL((void*)0), 0x0,
8166 "the number of PRBs of the puncturing pattern", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8167 },
8168 /* 7.7.20.6 puncReMask */
8169 { &hf_oran_puncReMask,
8170 { "puncReMask", "oran_fh_cus.puncReMask",
8171 FT_UINT16, BASE_DEC,
8172 NULL((void*)0), 0xffc0,
8173 "puncturing pattern RE mask", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8174 },
8175 /* 7.7.20.12 multiSDScope */
8176 { &hf_oran_multiSDScope,
8177 { "multiSDScope", "oran_fh_cus.multiSDScope",
8178 FT_BOOLEAN, 8,
8179 TFS(&multi_sd_scope_tfs)((0 ? (const struct true_false_string*)0 : ((&multi_sd_scope_tfs
))))
, 0x02,
8180 "multiple section description scope flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8181 },
8182 /* 7.7.20.4 rbgIncl */
8183 { &hf_oran_RbgIncl,
8184 { "rbgIncl", "oran_fh_cus.rbgIncl",
8185 FT_BOOLEAN, 8,
8186 NULL((void*)0), 0x01,
8187 "rbg included flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8188 },
8189
8190 /* 7.7.21.2 ciPrbGroupSize */
8191 { &hf_oran_ci_prb_group_size,
8192 { "ciPrbGroupSize", "oran_fh_cus.ciPrbGroupSize",
8193 FT_UINT8, BASE_DEC,
8194 NULL((void*)0), 0x0,
8195 "channel information PRB group size", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8196 },
8197 /* 7.21.3 */
8198 { &hf_oran_prg_size_st5,
8199 { "prgSize", "oran_fh_cus.prgSize",
8200 FT_UINT8, BASE_DEC,
8201 VALS(prg_size_st5_vals)((0 ? (const struct _value_string*)0 : ((prg_size_st5_vals)))
)
, 0x03,
8202 "precoding resource block group size", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8203 },
8204 { &hf_oran_prg_size_st6,
8205 { "prgSize", "oran_fh_cus.prgSize",
8206 FT_UINT8, BASE_DEC,
8207 VALS(prg_size_st6_vals)((0 ? (const struct _value_string*)0 : ((prg_size_st6_vals)))
)
, 0x03,
8208 "precoding resource block group size", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8209 },
8210
8211 /* 7.7.17.2 numUeID */
8212 { &hf_oran_num_ueid,
8213 { "numUeID", "oran_fh_cus.numUeID",
8214 FT_UINT8, BASE_DEC,
8215 NULL((void*)0), 0x0,
8216 "number of ueIDs per user", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8217 },
8218
8219 /* 7.7.16.2 antMask */
8220 { &hf_oran_antMask,
8221 { "antMask", "oran_fh_cus.antMask",
8222 FT_UINT64, BASE_HEX,
8223 NULL((void*)0), 0xffffffffffffffff,
8224 "indices of antennas to be pre-combined per RX endpoint", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8225 },
8226
8227 /* 7.7.18.2 transmissionWindowOffset */
8228 { &hf_oran_transmissionWindowOffset,
8229 { "transmissionWindowOffset", "oran_fh_cus.transmissionWindowOffset",
8230 FT_UINT16, BASE_DEC,
8231 NULL((void*)0), 0x0,
8232 "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)}
8233 },
8234 /* 7.7.18.3 transmissionWindowSize */
8235 { &hf_oran_transmissionWindowSize,
8236 { "transmissionWindowSize", "oran_fh_cus.transmissionWindowSize",
8237 FT_UINT16, BASE_DEC,
8238 NULL((void*)0), 0x3fff,
8239 "size of the transmission window in resolution µs", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8240 },
8241 /* 7.7.18.4 toT */
8242 { &hf_oran_toT,
8243 { "toT", "oran_fh_cus.toT",
8244 FT_UINT8, BASE_DEC,
8245 VALS(type_of_transmission_vals)((0 ? (const struct _value_string*)0 : ((type_of_transmission_vals
))))
, 0x03,
8246 "type of transmission", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8247 },
8248
8249 /* 7.7.2.2 bfaCompHdr */
8250 { &hf_oran_bfaCompHdr,
8251 { "bfaCompHdr", "oran_fh_cus.bfaCompHdr",
8252 FT_STRING, BASE_NONE,
8253 NULL((void*)0), 0x0,
8254 "beamforming attributes compression header", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8255 },
8256 /* 7.7.2.2-2: bfAzPtWidth */
8257 { &hf_oran_bfAzPtWidth,
8258 { "bfAzPtWidth", "oran_fh_cus.bfAzPtWidth",
8259 FT_UINT8, BASE_DEC,
8260 VALS(bfa_bw_vals)((0 ? (const struct _value_string*)0 : ((bfa_bw_vals)))), 0x38,
8261 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8262 },
8263 /* 7.7.2.2-3: bfZePtWidth */
8264 { &hf_oran_bfZePtWidth,
8265 { "bfZePtWidth", "oran_fh_cus.bfZePtWidth",
8266 FT_UINT8, BASE_DEC,
8267 VALS(bfa_bw_vals)((0 ? (const struct _value_string*)0 : ((bfa_bw_vals)))), 0x07,
8268 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8269 },
8270 /* 7.7.2.2-4: bfAz3ddWidth */
8271 { &hf_oran_bfAz3ddWidth,
8272 { "bfAz3ddWidth", "oran_fh_cus.bfAz3ddWidth",
8273 FT_UINT8, BASE_DEC,
8274 VALS(bfa_bw_vals)((0 ? (const struct _value_string*)0 : ((bfa_bw_vals)))), 0x38,
8275 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8276 },
8277 /* 7.7.2.2-5: bfZe3ddWidth */
8278 { &hf_oran_bfZe3ddWidth,
8279 { "bfZe3ddWidth", "oran_fh_cus.bfZe3ddWidth",
8280 FT_UINT8, BASE_DEC,
8281 VALS(bfa_bw_vals)((0 ? (const struct _value_string*)0 : ((bfa_bw_vals)))), 0x07,
8282 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8283 },
8284
8285 /* 7.7.2.3 bfAzPt */
8286 { &hf_oran_bfAzPt,
8287 { "bfAzPt", "oran_fh_cus.bfAzPt",
8288 FT_UINT8, BASE_DEC,
8289 NULL((void*)0), 0x0,
8290 "beamforming azimuth pointing parameter", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8291 },
8292 /* 7.7.2.4 bfZePt */
8293 { &hf_oran_bfZePt,
8294 { "bfZePt", "oran_fh_cus.bfZePt",
8295 FT_UINT8, BASE_DEC,
8296 NULL((void*)0), 0x0,
8297 "beamforming zenith pointing parameter", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8298 },
8299 /* 7.7.2.5 bfAz3dd */
8300 { &hf_oran_bfAz3dd,
8301 { "bfAz3dd", "oran_fh_cus.bfAz3dd",
8302 FT_UINT8, BASE_DEC,
8303 NULL((void*)0), 0x0,
8304 "beamforming azimuth beamwidth parameter", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8305 },
8306 /* 7.7.2.6 bfZe3dd */
8307 { &hf_oran_bfZe3dd,
8308 { "bfZe3dd", "oran_fh_cus.bfZe3dd",
8309 FT_UINT8, BASE_DEC,
8310 NULL((void*)0), 0x0,
8311 "beamforming zenith beamwidth parameter", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8312 },
8313
8314 /* 7.7.2.7 bfAzSl */
8315 { &hf_oran_bfAzSl,
8316 { "bfAzSl", "oran_fh_cus.bfAzSl",
8317 FT_UINT8, BASE_DEC,
8318 VALS(sidelobe_suppression_vals)((0 ? (const struct _value_string*)0 : ((sidelobe_suppression_vals
))))
, 0x38,
8319 "beamforming azimuth sidelobe parameter", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8320 },
8321 /* 7.7.2.8 bfZeSl */
8322 { &hf_oran_bfZeSl,
8323 { "bfZeSl", "oran_fh_cus.bfZeSl",
8324 FT_UINT8, BASE_DEC,
8325 VALS(sidelobe_suppression_vals)((0 ? (const struct _value_string*)0 : ((sidelobe_suppression_vals
))))
, 0x07,
8326 "beamforming zenith sidelobe parameter", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8327 },
8328
8329 /* 7.5.2.17 */
8330 { &hf_oran_cmd_scope,
8331 { "cmdScope", "oran_fh_cus.cmdScope",
8332 FT_UINT8, BASE_DEC | BASE_RANGE_STRING0x00000100,
8333 RVALS(cmd_scope_vals)((0 ? (const struct _range_string*)0 : ((cmd_scope_vals)))), 0x0f,
8334 "command scope", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8335 },
8336 /* 7.5.2.18 */
8337 { &hf_oran_number_of_st4_cmds,
8338 { "numberOfST4Cmds", "oran_fh_cus.numberOfST4Cmds",
8339 FT_UINT8, BASE_DEC,
8340 NULL((void*)0), 0x0,
8341 "Number of Section Type 4 commands", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8342 },
8343
8344 { &hf_oran_st4_cmd_header,
8345 { "Command common header", "oran_fh_cus.st4CmdCommonHeader",
8346 FT_STRING, BASE_NONE,
8347 NULL((void*)0), 0x0,
8348 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8349 },
8350
8351 /* 7.5.3.38 */
8352 { &hf_oran_st4_cmd_type,
8353 { "st4CmdType", "oran_fh_cus.st4CmdType",
8354 FT_UINT8, BASE_DEC | BASE_RANGE_STRING0x00000100,
8355 RVALS(st4_cmd_type_vals)((0 ? (const struct _range_string*)0 : ((st4_cmd_type_vals)))
)
, 0x0,
8356 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8357 },
8358 /* 7.5.3.39 */
8359 { &hf_oran_st4_cmd_len,
8360 { "st4CmdLen", "oran_fh_cus.st4CmdLen",
8361 FT_UINT16, BASE_DEC,
8362 NULL((void*)0), 0x0,
8363 "Length of command in 32-bit words", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8364 },
8365 /* 7.5.3.40 */
8366 { &hf_oran_st4_cmd_num_slots,
8367 { "numSlots", "oran_fh_cus.st4NumSlots",
8368 FT_UINT8, BASE_DEC,
8369 NULL((void*)0), 0x0,
8370 "Contiguous slots for which command is applicable", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8371 },
8372 /* 7.5.3.41 */
8373 { &hf_oran_st4_cmd_ack_nack_req_id,
8374 { "ackNackReqId", "oran_fh_cus.ackNackReqId",
8375 FT_UINT16, BASE_DEC,
8376 NULL((void*)0), 0x0,
8377 "ACK/NACK Request Id", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8378 },
8379
8380 { &hf_oran_st4_cmd,
8381 { "Command", "oran_fh_cus.st4Cmd",
8382 FT_STRING, BASE_NONE,
8383 NULL((void*)0), 0x0,
8384 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8385 },
8386
8387 /* 7.5.3.52 */
8388 { &hf_oran_sleepmode_trx,
8389 { "sleepMode", "oran_fh_cus.sleepMode",
8390 FT_UINT8, BASE_HEX,
8391 VALS(sleep_mode_trx_vals)((0 ? (const struct _value_string*)0 : ((sleep_mode_trx_vals)
)))
, 0x03,
8392 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8393 },
8394 { &hf_oran_sleepmode_asm,
8395 { "sleepMode", "oran_fh_cus.sleepMode",
8396 FT_UINT8, BASE_HEX,
8397 VALS(sleep_mode_asm_vals)((0 ? (const struct _value_string*)0 : ((sleep_mode_asm_vals)
)))
, 0x03,
8398 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8399 },
8400
8401 /* 7.5.3.51 */
8402 { &hf_oran_log2maskbits,
8403 { "log2MaskBits", "oran_fh_cus.log2MaskBits",
8404 FT_UINT8, BASE_HEX,
8405 VALS(log2maskbits_vals)((0 ? (const struct _value_string*)0 : ((log2maskbits_vals)))
)
, 0x3c,
8406 "Number of bits to appear in antMask", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8407 },
8408 /* 7.5.3.53 */
8409 { &hf_oran_num_slots_ext,
8410 { "numSlotsExt", "oran_fh_cus.numSlotsExt",
8411 FT_UINT24, BASE_HEX,
8412 NULL((void*)0), 0x0fffff,
8413 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8414 },
8415 /* 7.5.3.54 */
8416 { &hf_oran_antMask_trx_control,
8417 { "antMask", "oran_fh_cus.trxControl.antMask",
8418 FT_BYTES, BASE_NONE,
8419 NULL((void*)0), 0x0,
8420 "which antennas should sleep or wake-up", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8421 },
8422 /* 7.5.3.55 */
8423 { &hf_oran_ready,
8424 { "ready", "oran_fh_cus.ready",
8425 FT_BOOLEAN, 8,
8426 TFS(&ready_tfs)((0 ? (const struct true_false_string*)0 : ((&ready_tfs))
))
, 0x01,
8427 "wake-up ready indicator", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8428 },
8429 /* 7.5.3.34 */
8430 { &hf_oran_number_of_acks,
8431 { "numberOfAcks", "oran_fh_cus.numberOfAcks",
8432 FT_UINT8, BASE_DEC,
8433 NULL((void*)0), 0x0,
8434 "number of ACKs for one eAxC_ID", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8435 },
8436 /* 7.5.3.35 */
8437 { &hf_oran_number_of_nacks,
8438 { "numberOfNacks", "oran_fh_cus.numberOfNacks",
8439 FT_UINT8, BASE_DEC,
8440 NULL((void*)0), 0x0,
8441 "number of NACKs for one eAxC_ID", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8442 },
8443 /* 7.5.3.36 */
8444 { &hf_oran_ackid,
8445 { "ackId", "oran_fh_cus.ackId",
8446 FT_UINT16, BASE_DEC,
8447 NULL((void*)0), 0x0,
8448 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8449 },
8450 /* 7.5.3.37 */
8451 { &hf_oran_nackid,
8452 { "nackId", "oran_fh_cus.nackId",
8453 FT_UINT16, BASE_DEC,
8454 NULL((void*)0), 0x0,
8455 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8456 },
8457
8458 /* Links between acknack requests & responses */
8459 { &hf_oran_acknack_request_frame,
8460 { "Request Frame", "oran_fh_cus.ackNackId.request-frame",
8461 FT_FRAMENUM, BASE_NONE,
8462 FRAMENUM_TYPE(FT_FRAMENUM_REQUEST)((gpointer) (glong) (FT_FRAMENUM_REQUEST)), 0x0,
8463 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8464 },
8465 { &hf_oran_acknack_request_time,
8466 { "Time since request in ms", "oran_fh_cus.ackNackId.time-since-request",
8467 FT_UINT32, BASE_DEC,
8468 NULL((void*)0), 0x0,
8469 "Time between request and response", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8470 },
8471 { &hf_oran_acknack_request_type,
8472 { "Request Type", "oran_fh_cus.ackNackId.request-type",
8473 FT_UINT32, BASE_DEC,
8474 VALS(acknack_type_vals)((0 ? (const struct _value_string*)0 : ((acknack_type_vals)))
)
, 0x0,
8475 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8476 },
8477 { &hf_oran_acknack_response_frame,
8478 { "Response Frame", "oran_fh_cus.ackNackId.response-frame",
8479 FT_FRAMENUM, BASE_NONE,
8480 FRAMENUM_TYPE(FT_FRAMENUM_RESPONSE)((gpointer) (glong) (FT_FRAMENUM_RESPONSE)), 0x0,
8481 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8482 },
8483 { &hf_oran_acknack_response_time,
8484 { "Time to response in ms", "oran_fh_cus.ackNackId.time-to-response",
8485 FT_UINT32, BASE_DEC,
8486 NULL((void*)0), 0x0,
8487 "Time between request and response", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8488 },
8489
8490 /* 7.5.3.43 */
8491 { &hf_oran_disable_tdbfns,
8492 { "disableTDBFNs", "oran_fh_cus.disableTDBFNs",
8493 FT_BOOLEAN, 8,
8494 TFS(&disable_tdbfns_tfs)((0 ? (const struct true_false_string*)0 : ((&disable_tdbfns_tfs
))))
, 0x80,
8495 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8496 },
8497
8498 /* 7.5.3.44 */
8499 { &hf_oran_td_beam_group,
8500 { "tdBeamGrp", "oran_fh_cus.tdBeamGrp",
8501 FT_UINT16, BASE_HEX,
8502 NULL((void*)0), 0x7fff,
8503 "Applies to symbolMask in command header", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8504 },
8505 /* 7.5.3.43 */
8506 { &hf_oran_disable_tdbfws,
8507 { "disableTDBFWs", "oran_fh_cus.disableTDBFWs",
8508 FT_BOOLEAN, 8,
8509 TFS(&beam_numbers_included_tfs)((0 ? (const struct true_false_string*)0 : ((&beam_numbers_included_tfs
))))
, 0x80,
8510 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8511 },
8512
8513 /* 7.5.3.56 */
8514 { &hf_oran_td_beam_num,
8515 { "tdBeamNum", "oran_fh_cus.tdBeamNum",
8516 FT_UINT16, BASE_HEX,
8517 NULL((void*)0), 0x7fff,
8518 "time-domain beam number", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8519 },
8520
8521 /* 7.5.3.49 */
8522 { &hf_oran_dir_pattern,
8523 { "dirPattern", "oran_fh_cus.dirPattern",
8524 FT_BOOLEAN, 16,
8525 TFS(&symbol_direction_tfs)((0 ? (const struct true_false_string*)0 : ((&symbol_direction_tfs
))))
, 0x3fff,
8526 "symbol data direction (gNB Tx/Rx) pattern", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8527 },
8528 /* 7.5.3.50 */
8529 { &hf_oran_guard_pattern,
8530 { "guardPattern", "oran_fh_cus.guardPattern",
8531 FT_BOOLEAN, 16,
8532 TFS(&symbol_guard_tfs)((0 ? (const struct true_false_string*)0 : ((&symbol_guard_tfs
))))
, 0x3fff,
8533 "guard pattern bitmask", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8534 },
8535
8536 /* For convenient filtering */
8537 { &hf_oran_cplane,
8538 { "C-Plane", "oran_fh_cus.c-plane",
8539 FT_NONE, BASE_NONE,
8540 NULL((void*)0), 0x0,
8541 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8542 },
8543 { &hf_oran_uplane,
8544 { "U-Plane", "oran_fh_cus.u-plane",
8545 FT_NONE, BASE_NONE,
8546 NULL((void*)0), 0x0,
8547 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8548 },
8549 { &hf_oran_bf,
8550 { "BeamForming", "oran_fh_cus.bf",
8551 FT_NONE, BASE_NONE,
8552 NULL((void*)0), 0x0,
8553 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8554 },
8555 { &hf_oran_zero_prb,
8556 { "Zero PRB", "oran_fh_cus.zero-prb",
8557 FT_NONE, BASE_NONE,
8558 NULL((void*)0), 0x0,
8559 "All of the REs in this PRB are zero", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8560 },
8561
8562 /* 5.1.3.2.7 */
8563 { &hf_oran_ecpri_pcid,
8564 { "ecpriPcid", "oran_fh_cus.ecpriPcid",
8565 FT_NONE, BASE_NONE,
8566 NULL((void*)0), 0x0,
8567 "IQ data transfer message series identifier", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8568 },
8569 { &hf_oran_ecpri_rtcid,
8570 { "ecpriRtcid", "oran_fh_cus.ecpriRtcid",
8571 FT_NONE, BASE_NONE,
8572 NULL((void*)0), 0x0,
8573 "Real time control data identifier", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8574 },
8575 /* 5.1.3.2.8 */
8576 { &hf_oran_ecpri_seqid,
8577 { "ecpriSeqid", "oran_fh_cus.ecpriSeqid",
8578 FT_NONE, BASE_NONE,
8579 NULL((void*)0), 0x0,
8580 "message identifier", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8581 },
8582
8583 /* 7.7.23.2 */
8584 { &hf_oran_num_sym_prb_pattern,
8585 { "numSymPrbPattern", "oran_fh_cus.numSymPrbPattern",
8586 FT_UINT8, BASE_DEC,
8587 NULL((void*)0), 0xf0,
8588 "number of symbol and resource block patterns", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8589 },
8590 /* 7.7.23.11 */
8591 { &hf_oran_prb_mode,
8592 { "prbMode", "oran_fh_cus.prbMode",
8593 FT_BOOLEAN, 8,
8594 TFS(&prb_mode_tfs)((0 ? (const struct true_false_string*)0 : ((&prb_mode_tfs
))))
, 0x01,
8595 "PRB Mode", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8596 },
8597
8598 { &hf_oran_sym_prb_pattern,
8599 { "symPrbPattern", "oran_fh_cus.symPrbPattern",
8600 FT_STRING, BASE_NONE,
8601 NULL((void*)0), 0x0,
8602 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8603 },
8604
8605 /* 7.7.23.3 */
8606 { &hf_oran_sym_mask,
8607 { "symMask", "oran_fh_cus.symMask",
8608 FT_UINT16, BASE_HEX,
8609 NULL((void*)0), 0x3fff,
8610 "symbol mask part of symPrbPattern", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8611 },
8612 /* 7.7.23.5 */
8613 {&hf_oran_num_mc_scale_offset,
8614 {"numMcScaleOffset", "oran_fh_cus.numMcScaleOffset",
8615 FT_UINT8, BASE_DEC,
8616 NULL((void*)0), 0xf0,
8617 "number of modulation compression scaling value per symPrbPattern",
8618 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8619 },
8620 /* 7.7.23.4 */
8621 { &hf_oran_prb_pattern,
8622 { "prbPattern", "oran_fh_cus.prbPattern",
8623 FT_UINT8, BASE_DEC,
8624 NULL((void*)0), 0x0f,
8625 "resource block pattern part of symPrbPattern", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8626 },
8627
8628 /* 7.7.3.2 */
8629 { &hf_oran_codebook_index,
8630 { "codebookIndex", "oran_fh_cus.codebookIndex",
8631 FT_UINT8, BASE_DEC,
8632 NULL((void*)0), 0x0,
8633 "precoder codebook used for transmission", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8634 },
8635 /* 7.7.3.3 */
8636 { &hf_oran_layerid,
8637 { "layerID", "oran_fh_cus.layerID",
8638 FT_UINT8, BASE_DEC,
8639 NULL((void*)0), 0xf0,
8640 "Layer ID for DL transmission", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8641 },
8642 /* 7.7.3.5 */
8643 { &hf_oran_numlayers,
8644 { "numLayers", "oran_fh_cus.numLayers",
8645 FT_UINT8, BASE_DEC,
8646 NULL((void*)0), 0x0f,
8647 "number of layers for DL transmission", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8648 },
8649 /* 7.7.3.4 */
8650 { &hf_oran_txscheme,
8651 { "txScheme", "oran_fh_cus.txScheme",
8652 FT_UINT8, BASE_DEC,
8653 NULL((void*)0), 0xf0,
8654 "transmission scheme", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8655 },
8656 /* 7.7.3.6 */
8657 { &hf_oran_crs_remask,
8658 { "crsReMask", "oran_fh_cus.crsReMask",
8659 FT_UINT16, BASE_HEX,
8660 NULL((void*)0), 0x0fff,
8661 "CRS resource element mask", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8662 },
8663 /* 7.7.3.8 */
8664 { &hf_oran_crs_shift,
8665 { "crsShift", "oran_fh_cus.crsShift",
8666 FT_UINT8, BASE_HEX,
8667 NULL((void*)0), 0x80,
8668 "CRS resource element mask", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8669 },
8670 /* 7.7.3.7 */
8671 { &hf_oran_crs_symnum,
8672 { "crsSymNum", "oran_fh_cus.crsSymNum",
8673 FT_UINT8, BASE_DEC,
8674 NULL((void*)0), 0x0f,
8675 "CRS symbol number indication", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8676 },
8677 /* 7.7.3.9 */
8678 { &hf_oran_beamid_ap1,
8679 { "beamIdAP1", "oran_fh_cus.beamIdAP1",
8680 FT_UINT16, BASE_DEC,
8681 NULL((void*)0), 0x7f,
8682 "beam id to be used for antenna port 1", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8683 },
8684 /* 7.7.3.10 */
8685 { &hf_oran_beamid_ap2,
8686 { "beamIdAP2", "oran_fh_cus.beamIdAP2",
8687 FT_UINT16, BASE_DEC,
8688 NULL((void*)0), 0x7f,
8689 "beam id to be used for antenna port 2", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8690 },
8691 /* 7.7.3.11 */
8692 { &hf_oran_beamid_ap3,
8693 { "beamIdAP3", "oran_fh_cus.beamIdAP3",
8694 FT_UINT16, BASE_DEC,
8695 NULL((void*)0), 0x7f,
8696 "beam id to be used for antenna port 3", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8697 },
8698
8699 /* 7.7.10.3a */
8700 { &hf_oran_port_list_index,
8701 { "portListIndex", "oran_fh_cus.portListIndex",
8702 FT_UINT8, BASE_DEC,
8703 NULL((void*)0), 0x0,
8704 "the index of an eAxC_ID in the port-list", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8705 },
8706
8707 { &hf_oran_alpn_per_sym,
8708 { "alpnPerSym", "oran_fh_cus.alpnPerSym",
8709 FT_UINT8, BASE_HEX,
8710 VALS(alpn_per_sym_vals)((0 ? (const struct _value_string*)0 : ((alpn_per_sym_vals)))
)
, 0x80,
8711 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8712 },
8713 { &hf_oran_ant_dmrs_snr,
8714 { "antDmrsSnr", "oran_fh_cus.antDmrsSnr",
8715 FT_UINT8, BASE_HEX,
8716 VALS(ant_dmrs_snr_vals)((0 ? (const struct _value_string*)0 : ((ant_dmrs_snr_vals)))
)
, 0x40,
8717 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8718 },
8719
8720 /* 7.7.24.6 */
8721 { &hf_oran_user_group_size,
8722 { "userGroupSize", "oran_fh_cus.userGroupSize",
8723 FT_UINT8, BASE_DEC,
8724 NULL((void*)0), 0x1f,
8725 "number of UE data layers in the user group identified by userGroupId", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8726 },
8727 /* 7.7.24.7 */
8728 { &hf_oran_user_group_id,
8729 { "userGroupId", "oran_fh_cus.userGroupId",
8730 FT_UINT8, BASE_DEC,
8731 NULL((void*)0), 0x0,
8732 "indicates user group described by the section", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8733 },
8734 /* 7.7.24.8 */
8735 { &hf_oran_entry_type,
8736 { "entryType", "oran_fh_cus.entryType",
8737 FT_UINT8, BASE_DEC,
8738 VALS(entry_type_vals)((0 ? (const struct _value_string*)0 : ((entry_type_vals)))), 0xe0,
8739 "indicates format of the entry", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8740 },
8741 /* 7.7.24.9 */
8742 { &hf_oran_dmrs_port_number,
8743 { "dmrsPortNumber", "oran_fh_cus.dmrsPortNumber",
8744 FT_UINT8, BASE_DEC,
8745 NULL((void*)0), 0x1f,
8746 "DMRS antenna port number for the associated ueId", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8747 },
8748 /* 7.7.24.10 */
8749 { &hf_oran_ueid_reset,
8750 { "ueidReset", "oran_fh_cus.ueidReset",
8751 FT_BOOLEAN, 8,
8752 TFS(&tfs_ueid_reset)((0 ? (const struct true_false_string*)0 : ((&tfs_ueid_reset
))))
, 0x80,
8753 "same UEID as the previous slot", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8754 },
8755 /* 7.7.24.11 */
8756 { &hf_oran_dmrs_symbol_mask,
8757 { "dmrsSymbolMask", "oran_fh_cus.dmrsSymbolMask",
8758 FT_UINT16, BASE_HEX,
8759 NULL((void*)0), 0x3fff,
8760 "symbols within the slot containing DMRS", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8761 },
8762 { &hf_oran_dmrs_symbol_mask_s13,
8763 { "symbol 13", "oran_fh_cus.dmrsSymbolMask.symbol-13",
8764 FT_BOOLEAN, 16,
8765 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x2000,
8766 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8767 },
8768 { &hf_oran_dmrs_symbol_mask_s12,
8769 { "symbol 12", "oran_fh_cus.dmrsSymbolMask.symbol-12",
8770 FT_BOOLEAN, 16,
8771 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x1000,
8772 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8773 },
8774 { &hf_oran_dmrs_symbol_mask_s11,
8775 { "symbol 11", "oran_fh_cus.dmrsSymbolMask.symbol-11",
8776 FT_BOOLEAN, 16,
8777 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0800,
8778 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8779 },
8780 { &hf_oran_dmrs_symbol_mask_s10,
8781 { "symbol 10", "oran_fh_cus.dmrsSymbolMask.symbol-10",
8782 FT_BOOLEAN, 16,
8783 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0400,
8784 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8785 },
8786 { &hf_oran_dmrs_symbol_mask_s9,
8787 { "symbol 9", "oran_fh_cus.dmrsSymbolMask.symbol-9",
8788 FT_BOOLEAN, 16,
8789 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0200,
8790 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8791 },
8792 { &hf_oran_dmrs_symbol_mask_s8,
8793 { "symbol 8", "oran_fh_cus.dmrsSymbolMask.symbol-8",
8794 FT_BOOLEAN, 16,
8795 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0100,
8796 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8797 },
8798 { &hf_oran_dmrs_symbol_mask_s7,
8799 { "symbol 7", "oran_fh_cus.dmrsSymbolMask.symbol-7",
8800 FT_BOOLEAN, 16,
8801 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0080,
8802 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8803 },
8804 { &hf_oran_dmrs_symbol_mask_s6,
8805 { "symbol 6", "oran_fh_cus.dmrsSymbolMask.symbol-6",
8806 FT_BOOLEAN, 16,
8807 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0040,
8808 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8809 },
8810 { &hf_oran_dmrs_symbol_mask_s5,
8811 { "symbol 5", "oran_fh_cus.dmrsSymbolMask.symbol-5",
8812 FT_BOOLEAN, 16,
8813 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0020,
8814 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8815 },
8816 { &hf_oran_dmrs_symbol_mask_s4,
8817 { "symbol 4", "oran_fh_cus.dmrsSymbolMask.symbol-4",
8818 FT_BOOLEAN, 16,
8819 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0010,
8820 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8821 },
8822 { &hf_oran_dmrs_symbol_mask_s3,
8823 { "symbol 3", "oran_fh_cus.dmrsSymbolMask.symbol-3",
8824 FT_BOOLEAN, 16,
8825 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0008,
8826 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8827 },
8828 { &hf_oran_dmrs_symbol_mask_s2,
8829 { "symbol 2", "oran_fh_cus.dmrsSymbolMask.symbol-2",
8830 FT_BOOLEAN, 16,
8831 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0004,
8832 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8833 },
8834 { &hf_oran_dmrs_symbol_mask_s1,
8835 { "symbol 1", "oran_fh_cus.dmrsSymbolMask.symbol-1",
8836 FT_BOOLEAN, 16,
8837 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0002,
8838 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8839 },
8840 { &hf_oran_dmrs_symbol_mask_s0,
8841 { "symbol 0", "oran_fh_cus.dmrsSymbolMask.symbol-0",
8842 FT_BOOLEAN, 16,
8843 TFS(&tfs_present_not_present)((0 ? (const struct true_false_string*)0 : ((&tfs_present_not_present
))))
, 0x0001,
8844 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8845 },
8846
8847 /* 7.7.24.12 */
8848 { &hf_oran_scrambling,
8849 { "scrambling", "oran_fh_cus.scrambling",
8850 FT_UINT16, BASE_HEX,
8851 NULL((void*)0), 0x0,
8852 "used to calculate the seed value required to initialize pseudo-random generator", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8853 },
8854 /* 7.7.24.13 */
8855 { &hf_oran_nscid,
8856 { "nscid", "oran_fh_cus.nscid",
8857 FT_UINT8, BASE_HEX,
8858 NULL((void*)0), 0x80,
8859 "used to calculate the seed value for pseudo-random generator", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8860 },
8861 /* 7.7.24.14 */
8862 { &hf_oran_dtype,
8863 { "dType", "oran_fh_cus.dType",
8864 FT_UINT8, BASE_HEX,
8865 VALS(dtype_vals)((0 ? (const struct _value_string*)0 : ((dtype_vals)))), 0x40,
8866 "PUSCH DMRS configuration type", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8867 },
8868 /* 7.7.24.15 */
8869 { &hf_oran_cmd_without_data,
8870 { "cmdWithoutData", "oran_fh_cus.cmdWithoutData",
8871 FT_UINT8, BASE_HEX,
8872 NULL((void*)0), 0x30,
8873 "number of DMRS CDM groups without data", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8874 },
8875 /* 7.7.24.16 */
8876 { &hf_oran_lambda,
8877 { "lambda", "oran_fh_cus.lambda",
8878 FT_UINT8, BASE_HEX,
8879 NULL((void*)0), 0x0c,
8880 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8881 },
8882 /* 7.7.24.19 */
8883 { &hf_oran_first_prb,
8884 { "firstPrb", "oran_fh_cus.firstPrb",
8885 FT_UINT16, BASE_DEC,
8886 NULL((void*)0), 0x03fe,
8887 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8888 },
8889 /* 7.7.24.20 */
8890 { &hf_oran_last_prb,
8891 { "lastPrb", "oran_fh_cus.lastPrb",
8892 FT_UINT16, BASE_DEC,
8893 NULL((void*)0), 0x01ff,
8894 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8895 },
8896
8897 /* 7.7.24.17 */
8898 /* TODO: add value_string */
8899 { &hf_oran_low_papr_type,
8900 { "lowPaprType", "oran_fh_cus.lowPaprType",
8901 FT_UINT8, BASE_HEX,
8902 VALS(papr_type_vals)((0 ? (const struct _value_string*)0 : ((papr_type_vals)))), 0x30,
8903 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8904 },
8905 /* 7.7.24.18 */
8906 { &hf_oran_hopping_mode,
8907 { "hoppingMode", "oran_fh_cus.hoppingMode",
8908 FT_UINT8, BASE_HEX,
8909 VALS(hopping_mode_vals)((0 ? (const struct _value_string*)0 : ((hopping_mode_vals)))
)
, 0x0c,
8910 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8911 },
8912
8913 { &hf_oran_tx_win_for_on_air_symbol_l,
8914 { "txWinForOnAirSymbol", "oran_fh_cus.txWinForOnAirSymbol",
8915 FT_UINT8, BASE_DEC,
8916 NULL((void*)0), 0xf0,
8917 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8918 },
8919 { &hf_oran_tx_win_for_on_air_symbol_r,
8920 { "txWinForOnAirSymbol", "oran_fh_cus.txWinForOnAirSymbol",
8921 FT_UINT8, BASE_DEC,
8922 NULL((void*)0), 0x0f,
8923 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8924 },
8925 /* 7.7.26.2 */
8926 { &hf_oran_num_fo_fb,
8927 { "numFoFb", "oran_fh_cus.numFoFb",
8928 FT_UINT8, BASE_DEC,
8929 NULL((void*)0), 0x7f,
8930 "number of frequency offset feedback", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8931 },
8932 /* 7.7.26.3 */
8933 { &hf_oran_freq_offset_fb,
8934 { "freqOffsetFb", "oran_fh_cus.freqOffsetFb",
8935 FT_UINT16, BASE_HEX_DEC | BASE_RANGE_STRING0x00000100,
8936 RVALS(freq_offset_fb_values)((0 ? (const struct _range_string*)0 : ((freq_offset_fb_values
))))
, 0x0,
8937 "UE frequency offset feedback", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8938 },
8939
8940 /* 7.7.28.2 */
8941 { &hf_oran_num_ue_sinr_rpt,
8942 { "numUeSinrRpt", "oran_fh_cus.numUeSinrRpt",
8943 FT_UINT8, BASE_DEC,
8944 NULL((void*)0), 0x1f,
8945 "number of sinr reported UEs {1 - 12}", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8946 },
8947
8948 /* 7.5.2.19 */
8949 { &hf_oran_num_sinr_per_prb,
8950 { "numSinrPerPrb", "oran_fh_cus.numSinrPerPrb",
8951 FT_UINT8, BASE_DEC,
8952 VALS(num_sinr_per_prb_vals)((0 ? (const struct _value_string*)0 : ((num_sinr_per_prb_vals
))))
, 0x70,
8953 "number of SINR values per PRB", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8954 },
8955 { &hf_oran_num_sinr_per_prb_right,
8956 { "numSinrPerPrb", "oran_fh_cus.numSinrPerPrb",
8957 FT_UINT8, BASE_DEC,
8958 VALS(num_sinr_per_prb_vals)((0 ? (const struct _value_string*)0 : ((num_sinr_per_prb_vals
))))
, 0x07,
8959 "number of SINR values per PRB", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8960 },
8961
8962 /* 7.5.3.68 */
8963 { &hf_oran_sinr_value,
8964 { "sinrValue", "oran_fh_cus.sinrValue",
8965 FT_FLOAT, BASE_NONE,
8966 NULL((void*)0), 0x0,
8967 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8968 },
8969
8970 { &hf_oran_measurement_report,
8971 { "Measurement Report", "oran_fh_cus.measurement-report",
8972 FT_STRING, BASE_NONE,
8973 NULL((void*)0), 0x0,
8974 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8975 },
8976 /* 7.5.3.57 */
8977 { &hf_oran_mf,
8978 { "mf", "oran_fh_cus.mf",
8979 FT_BOOLEAN, 8,
8980 TFS(&measurement_flag_tfs)((0 ? (const struct true_false_string*)0 : ((&measurement_flag_tfs
))))
, 0x80,
8981 "measurement flag", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8982 },
8983 /* 7.5.3.59 */
8984 { &hf_oran_meas_data_size,
8985 { "measDataSize", "oran_fh_cus.measDataSize",
8986 FT_UINT16, BASE_DEC,
8987 NULL((void*)0), 0x0,
8988 "measurement data size (in words)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8989 },
8990
8991 /* 7.5.3.58 */
8992 { &hf_oran_meas_type_id,
8993 { "measTypeId", "oran_fh_cus.measTypeId",
8994 FT_UINT8, BASE_DEC,
8995 VALS(meas_type_id_vals)((0 ? (const struct _value_string*)0 : ((meas_type_id_vals)))
)
, 0x7F,
8996 "measurement report type identifier", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8997 },
8998 /* 7.5.3.66 */
8999 { &hf_oran_num_elements,
9000 { "numElements", "oran_fh_cus.numElements",
9001 FT_UINT8, BASE_DEC,
9002 NULL((void*)0), 0x0,
9003 "measurement report type identifier", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9004 },
9005 /* 7.5.3.60 */
9006 { &hf_oran_ue_tae,
9007 { "ueTae", "oran_fh_cus.ueTae",
9008 FT_UINT16, BASE_DEC | BASE_RANGE_STRING0x00000100,
9009 RVALS(freq_offset_fb_values)((0 ? (const struct _range_string*)0 : ((freq_offset_fb_values
))))
, 0x0,
9010 "UE Timing Advance Error", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9011 },
9012 /* 7.5.3.61 */
9013 { &hf_oran_ue_layer_power,
9014 { "ueLayerPower", "oran_fh_cus.ueLayerPower",
9015 FT_UINT16, BASE_DEC | BASE_RANGE_STRING0x00000100,
9016 RVALS(freq_offset_fb_values)((0 ? (const struct _range_string*)0 : ((freq_offset_fb_values
))))
, 0x0,
9017 "UE Layer Power", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9018 },
9019
9020 /* 7.5.3.62 */
9021 { &hf_oran_ue_freq_offset,
9022 { "ueFreqOffset", "oran_fh_cus.ueFreqOffset",
9023 FT_UINT16, BASE_DEC | BASE_RANGE_STRING0x00000100,
9024 RVALS(freq_offset_fb_values)((0 ? (const struct _range_string*)0 : ((freq_offset_fb_values
))))
, 0x0,
9025 "UE frequency offset", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9026 },
9027 /* 7.5.3.63 */
9028 { &hf_oran_ipn_power,
9029 { "ipnPower", "oran_fh_cus.ipnPower",
9030 FT_UINT16, BASE_DEC | BASE_RANGE_STRING0x00000100,
9031 RVALS(freq_offset_fb_values)((0 ? (const struct _range_string*)0 : ((freq_offset_fb_values
))))
, 0x0,
9032 "Interference plus Noise power", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9033 },
9034 /* 7.5.3.64 */
9035 { &hf_oran_ant_dmrs_snr_val,
9036 { "antDmrsSnrVal", "oran_fh_cus.antDmrsSnrVal",
9037 FT_UINT16, BASE_DEC | BASE_RANGE_STRING0x00000100,
9038 RVALS(freq_offset_fb_values)((0 ? (const struct _range_string*)0 : ((freq_offset_fb_values
))))
, 0x0,
9039 "antenna DMRS-SNR", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9040 },
9041
9042 { &hf_oran_measurement_command,
9043 { "Measurement Command", "oran_fh_cus.measurement-command",
9044 FT_STRING, BASE_NONE,
9045 NULL((void*)0), 0x0,
9046 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9047 },
9048
9049 /* 7.5.27.2 */
9050 { &hf_oran_beam_type,
9051 {"beamType", "oran_fh_cus.beamType",
9052 FT_UINT16, BASE_DEC,
9053 VALS(beam_type_vals)((0 ? (const struct _value_string*)0 : ((beam_type_vals)))), 0xc0,
9054 NULL((void*)0),
9055 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9056 },
9057 /* 7.5.3.65 */
9058 { &hf_oran_meas_cmd_size,
9059 {"measCmdSize", "oran_fh_cus.measCmdSize",
9060 FT_UINT16, BASE_DEC,
9061 NULL((void*)0), 0x0,
9062 "measurement command size in words",
9063 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9064 },
9065
9066 { &hf_oran_symbol_reordering_layer,
9067 { "Layer", "oran_fh_cus.layer",
9068 FT_STRING, BASE_NONE,
9069 NULL((void*)0), 0x0,
9070 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9071 },
9072 { &hf_oran_dmrs_entry,
9073 { "Entry", "oran_fh_cus.dmrs-entry",
9074 FT_STRING, BASE_NONE,
9075 NULL((void*)0), 0x0,
9076 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9077 },
9078
9079 { &hf_oran_c_section_common,
9080 { "Common Section", "oran_fh_cus.c-plane.section.common",
9081 FT_STRING, BASE_NONE,
9082 NULL((void*)0), 0x0,
9083 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9084 },
9085 { &hf_oran_c_section,
9086 { "Section", "oran_fh_cus.c-plane.section",
9087 FT_STRING, BASE_NONE,
9088 NULL((void*)0), 0x0,
9089 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9090 },
9091 { &hf_oran_u_section,
9092 { "Section", "oran_fh_cus.u-plane.section",
9093 FT_STRING, BASE_NONE,
9094 NULL((void*)0), 0x0,
9095 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9096 },
9097
9098 /* Link back to UL C-plane where udCompHdr was recorded */
9099 { &hf_oran_ul_cplane_ud_comp_hdr_frame,
9100 { "C-Plane UL udCompHdr frame", "oran_fh_cus.ul-cplane.udCompHdr",
9101 FT_FRAMENUM, BASE_NONE,
9102 FRAMENUM_TYPE(FT_FRAMENUM_REQUEST)((gpointer) (glong) (FT_FRAMENUM_REQUEST)), 0x0,
9103 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
9104 },
9105 };
9106
9107 /* Setup protocol subtree array */
9108 static int *ett[] = {
9109 &ett_oran,
9110 &ett_oran_ecpri_pcid,
9111 &ett_oran_ecpri_rtcid,
9112 &ett_oran_ecpri_seqid,
9113 &ett_oran_section_type,
9114 &ett_oran_u_timing,
9115 &ett_oran_u_section,
9116 &ett_oran_u_prb,
9117 &ett_oran_section,
9118 &ett_oran_iq,
9119 &ett_oran_bfw_bundle,
9120 &ett_oran_bfw,
9121 &ett_oran_frequency_range,
9122 &ett_oran_prb_cisamples,
9123 &ett_oran_cisample,
9124 &ett_oran_udcomphdr,
9125 &ett_oran_udcompparam,
9126 &ett_oran_cicomphdr,
9127 &ett_oran_cicompparam,
9128 &ett_oran_bfwcomphdr,
9129 &ett_oran_bfwcompparam,
9130 &ett_oran_ext19_port,
9131 &ett_oran_prb_allocation,
9132 &ett_oran_punc_pattern,
9133 &ett_oran_bfacomphdr,
9134 &ett_oran_modcomp_param_set,
9135 &ett_oran_st4_cmd_header,
9136 &ett_oran_st4_cmd,
9137 &ett_oran_sym_prb_pattern,
9138 &ett_oran_measurement_report,
9139 &ett_oran_measurement_command,
9140 &ett_oran_sresmask,
9141 &ett_oran_c_section_common,
9142 &ett_oran_c_section,
9143 &ett_oran_remask,
9144 &ett_oran_symbol_reordering_layer,
9145 &ett_oran_dmrs_entry,
9146 &ett_oran_dmrs_symbol_mask,
9147 &ett_oran_symbol_mask,
9148 &ett_active_beamspace_coefficient_mask
9149 };
9150
9151 static int *ext_ett[HIGHEST_EXTTYPE28];
9152 for (unsigned extno=0; extno<HIGHEST_EXTTYPE28; extno++) {
9153 ext_ett[extno] = &ett_oran_c_section_extension[extno];
9154 }
9155
9156 expert_module_t* expert_oran;
9157
9158 static ei_register_info ei[] = {
9159 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9160 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9161 { &ei_oran_reserved_numBundPrb, { "oran_fh_cus.reserved_numBundPrb", PI_MALFORMED0x07000000, PI_ERROR0x00800000, "Reserved value of numBundPrb", EXPFILL0, ((void*)0), 0, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9162 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9163 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9164 { &ei_oran_extlen_zero, { "oran_fh_cus.extlen_zero", PI_MALFORMED0x07000000, PI_ERROR0x00800000, "extlen - zero is reserved value", EXPFILL0, ((void*)0), 0, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9165 { &ei_oran_rbg_size_reserved, { "oran_fh_cus.rbg_size_reserved", PI_MALFORMED0x07000000, PI_ERROR0x00800000, "rbgSize - zero is reserved value", EXPFILL0, ((void*)0), 0, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9166 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9167 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9168 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9169 { &ei_oran_st8_nackid, { "oran_fh_cus.st8_nackid", PI_SEQUENCE0x02000000, PI_WARN0x00600000, "operation for this ackId failed", EXPFILL0, ((void*)0), 0, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9170 { &ei_oran_st4_no_cmds, { "oran_fh_cus.st4_nackid", PI_MALFORMED0x07000000, PI_ERROR0x00800000, "Not valid to have no commands in ST4", EXPFILL0, ((void*)0), 0, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9171 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9172 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9173 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9174 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9175 { &ei_oran_se10_unknown_beamgrouptype, { "oran_fh_cus.se10_unknown_beamgrouptype", PI_MALFORMED0x07000000, PI_WARN0x00600000, "SE10 - unknown BeamGroupType value", EXPFILL0, ((void*)0), 0, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9176 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9177 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9178 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9179 { &ei_oran_unhandled_se, { "oran_fh_cus.se_not_handled", PI_UNDECODED0x05000000, PI_WARN0x00600000, "SE not recognised/handled by dissector", EXPFILL0, ((void*)0), 0, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9180 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9181 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9182 { &ei_oran_version_unsupported, { "oran_fh_cus.version_unsupported", PI_UNDECODED0x05000000, PI_WARN0x00600000, "Protocol version unsupported", EXPFILL0, ((void*)0), 0, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9183 { &ei_oran_laa_msg_type_unsupported, { "oran_fh_cus.laa_msg_type_unsupported", PI_UNDECODED0x05000000, PI_WARN0x00600000, "laaMsgType unsupported", EXPFILL0, ((void*)0), 0, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9184 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9185 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9186 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9187 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9188 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9189 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9190 { &ei_oran_udpcomphdr_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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9191 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9192 { &ei_oran_radio_fragmentation_u_plane, { "oran_fh_cus.radio_fragmentation_u_plane", PI_UNDECODED0x05000000, PI_WARN0x00600000, "Radio fragmentation in C-PLane not yet supported", EXPFILL0, ((void*)0), 0, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9193 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9194 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9195 { &ei_oran_unexpected_measTypeId, { "oran_fh_cus.unexpected_meastypeid", PI_MALFORMED0x07000000, PI_WARN0x00600000, "unexpected measTypeId", EXPFILL0, ((void*)0), 0, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9196 { &ei_oran_unsupported_compression_method, { "oran_fh_cus.compression_type_unsupported", PI_UNDECODED0x05000000, PI_WARN0x00600000, "Unsupported compression type", EXPFILL0, ((void*)0), 0, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9197 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9198 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9199 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9200 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9201 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9202 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9203 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9204 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9205 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9206 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9207 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9208 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9209 { &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, {0, {((void*)0), ((void*)0), FT_NONE, BASE_NONE
, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE, -1, ((void
*)0)}}
}},
9210 };
9211
9212 /* Register the protocol name and description */
9213 proto_oran = proto_register_protocol("O-RAN Fronthaul CUS", "O-RAN FH CUS", "oran_fh_cus");
9214
9215 /* Allow dissector to find be found by name. */
9216 register_dissector("oran_fh_cus", dissect_oran, proto_oran);
9217
9218 /* Register the tap name. */
9219 oran_tap = register_tap("oran-fh-cus");
9220
9221 /* Required function calls to register the header fields and subtrees */
9222 proto_register_field_array(proto_oran, hf, array_length(hf)(sizeof (hf) / sizeof (hf)[0]));
9223 proto_register_subtree_array(ett, array_length(ett)(sizeof (ett) / sizeof (ett)[0]));
9224 proto_register_subtree_array(ext_ett, array_length(ext_ett)(sizeof (ext_ett) / sizeof (ext_ett)[0]));
9225
9226
9227 expert_oran = expert_register_protocol(proto_oran);
9228 expert_register_field_array(expert_oran, ei, array_length(ei)(sizeof (ei) / sizeof (ei)[0]));
9229
9230 module_t * oran_module = prefs_register_protocol(proto_oran, NULL((void*)0));
9231
9232 /* prefs_register_static_text_preference(oran_module, "oran.stream", "", ""); */
9233
9234 /* Register bit width/compression preferences separately by direction. */
9235 prefs_register_uint_preference(oran_module, "oran.du_port_id_bits", "DU Port ID bits [a]",
9236 "The bit width of DU Port ID - sum of a,b,c&d (eAxC) must be 16", 10, &pref_du_port_id_bits);
9237 prefs_register_uint_preference(oran_module, "oran.bandsector_id_bits", "BandSector ID bits [b]",
9238 "The bit width of BandSector ID - sum of a,b,c&d (eAxC) must be 16", 10, &pref_bandsector_id_bits);
9239 prefs_register_uint_preference(oran_module, "oran.cc_id_bits", "CC ID bits [c]",
9240 "The bit width of CC ID - sum of a,b,c&d (eAxC) must be 16", 10, &pref_cc_id_bits);
9241 prefs_register_uint_preference(oran_module, "oran.ru_port_id_bits", "RU Port ID bits [d]",
9242 "The bit width of RU Port ID - sum of a,b,c&d (eAxC) must be 16", 10, &pref_ru_port_id_bits);
9243
9244 prefs_register_static_text_preference(oran_module, "oran.ul", "", "");
9245
9246 /* Uplink userplane */
9247 prefs_register_uint_preference(oran_module, "oran.iq_bitwidth_up", "IQ Bitwidth Uplink",
9248 "The bit width of a sample in the Uplink (if no udcompHdr and no C-Plane)", 10, &pref_sample_bit_width_uplink);
9249 prefs_register_enum_preference(oran_module, "oran.ud_comp_up", "Uplink User Data Compression",
9250 "Uplink User Data Compression (if no udcompHdr and no C-Plane)", &pref_iqCompressionUplink, ul_compression_options, false0);
9251 prefs_register_enum_preference(oran_module, "oran.ud_comp_hdr_up", "udCompHdr field is present for uplink",
9252 "The udCompHdr field in U-Plane messages may or may not be present, depending on the "
9253 "configuration of the O-RU. This preference instructs the dissector to expect "
9254 "this field to be present in uplink messages",
9255 &pref_includeUdCompHeaderUplink, udcomphdr_present_options, false0);
9256 prefs_register_uint_preference(oran_module, "oran.ul_slot_us_limit", "Microseconds allowed for UL tx in symbol",
9257 "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",
9258 10, &us_allowed_for_ul_in_symbol);
9259
9260
9261
9262 prefs_register_static_text_preference(oran_module, "oran.dl", "", "");
9263
9264 /* Downlink userplane */
9265 prefs_register_uint_preference(oran_module, "oran.iq_bitwidth_down", "IQ Bitwidth Downlink",
9266 "The bit width of a sample in the Downlink (if no udcompHdr)", 10, &pref_sample_bit_width_downlink);
9267 prefs_register_enum_preference(oran_module, "oran.ud_comp_down", "Downlink User Data Compression",
9268 "Downlink User Data Compression", &pref_iqCompressionDownlink, dl_compression_options, false0);
9269 prefs_register_enum_preference(oran_module, "oran.ud_comp_hdr_down", "udCompHdr field is present for downlink",
9270 "The udCompHdr field in U-Plane messages may or may not be present, depending on the "
9271 "configuration of the O-RU. This preference instructs the dissector to expect "
9272 "this field to be present in downlink messages",
9273 &pref_includeUdCompHeaderDownlink, udcomphdr_present_options, false0);
9274
9275 prefs_register_static_text_preference(oran_module, "oran.sinr", "", "");
9276
9277 /* SINR */
9278 prefs_register_uint_preference(oran_module, "oran.iq_bitwidth_sinr", "IQ Bitwidth SINR",
9279 "The bit width of a sample in SINR", 10, &pref_sample_bit_width_sinr);
9280 prefs_register_enum_preference(oran_module, "oran.ud_comp_sinr", "SINR Compression",
9281 "SINR Compression", &pref_iqCompressionSINR, ul_compression_options, false0);
9282
9283
9284 /* BF-related */
9285 prefs_register_static_text_preference(oran_module, "oran.bf", "", "");
9286
9287 prefs_register_obsolete_preference(oran_module, "oran.num_weights_per_bundle");
9288
9289 prefs_register_uint_preference(oran_module, "oran.num_bf_antennas", "Number of beam weights",
9290 "Number of array elements that BF weights will be provided for", 10, &pref_num_bf_antennas);
9291
9292 prefs_register_obsolete_preference(oran_module, "oran.num_bf_weights");
9293
9294 prefs_register_bool_preference(oran_module, "oran.st6_4byte_alignment_required", "Use 4-byte alignment for ST6 sections",
9295 "Default is 1-byte alignment", &st6_4byte_alignment);
9296
9297
9298 /* Misc (and will seldom need to be accessed) */
9299 prefs_register_static_text_preference(oran_module, "oran.misc", "", "");
9300
9301 prefs_register_bool_preference(oran_module, "oran.show_iq_samples", "Show IQ Sample values",
9302 "When enabled, for U-Plane frames show each I and Q value in PRB", &pref_showIQSampleValues);
9303
9304 prefs_register_enum_preference(oran_module, "oran.support_udcomplen", "udCompLen supported",
9305 "When enabled, U-Plane messages with relevant compression schemes will include udCompLen",
9306 &pref_support_udcompLen, udcomplen_support_options, false0);
9307
9308 prefs_register_uint_preference(oran_module, "oran.rbs_in_uplane_section", "Total RBs in User-Plane data section",
9309 "This is used if numPrbu is signalled as 0", 10, &pref_data_plane_section_total_rbs);
9310
9311 prefs_register_bool_preference(oran_module, "oran.unscaled_iq", "Show unscaled I/Q values",
9312 "", &show_unscaled_values);
9313
9314 prefs_register_obsolete_preference(oran_module, "oran.k_antenna_ports");
9315
9316
9317 flow_states_table = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
9318 flow_results_table = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
9319 ul_symbol_timing = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
9320
9321 register_init_routine(&oran_init_protocol);
9322}
9323
9324/* Simpler form of proto_reg_handoff_oran which can be used if there are
9325 * no prefs-dependent registration function calls. */
9326void
9327proto_reg_handoff_oran(void)
9328{
9329}
9330
9331/*
9332* Editor modelines - http://www.wireshark.org/tools/modelines.html
9333*
9334* Local Variables:
9335* c-basic-offset: 4
9336* tab-width: 8
9337* indent-tabs-mode: nil
9338* End:
9339*
9340* ex: set shiftwidth=4 tabstop=8 expandtab:
9341* :indentSize=4:tabSize=8:noTabs=true:
9342*/