Bug Summary

File:builds/wireshark/wireshark/epan/dissectors/packet-oran.c
Warning:line 5385, column 41
Assigned value is garbage or undefined

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