1 /* packet-nfapi.c
2 * Routines for Network Function Application Platform Interface (nFAPI) dissection
3 * Copyright 2017 Cisco Systems, Inc.
4 *
5 * Wireshark - Network traffic analyzer
6 * By Gerald Combs <gerald@wireshark.org>
7 * Copyright 1998 Gerald Combs
8 *
9 * SPDX-License-Identifier: GPL-2.0-or-later
10 *
11 * References:
12 * SCF082.09.04 http://scf.io/en/documents/082_-_nFAPI_and_FAPI_specifications.php
13 *
14 */
15
16 #include "config.h"
17
18 #include <epan/packet.h>
19 #include <epan/exceptions.h>
20 #include <epan/expert.h>
21 #include <epan/reassemble.h>
22 #include <epan/wmem_scopes.h>
23
24 #include <ptvcursor.h>
25
26 void proto_register_nfapi(void);
27 void proto_reg_handoff_nfapi(void);
28
29 #define NFAPI_HEADER_LENGTH 8
30 #define NFAPI_P7_HEADER_LENGTH 16
31
32 static const unit_name_string khz_100_units_db = { " (100)khz", NULL };
33
34 typedef enum{
35 NFAPI_DL_CONFIG_REQUEST_MSG_ID = 0x0080,
36 NFAPI_UL_CONFIG_REQUEST_MSG_ID,
37 NFAPI_SUBFRAME_INDICATION_MSG_ID,
38 NFAPI_HI_DCI0_REQUEST_MSG_ID,
39 NFAPI_TX_REQUEST_MSG_ID,
40 NFAPI_HARQ_INDICATION_MSG_ID,
41 NFAPI_CRC_INDICATION_MSG_ID,
42 NFAPI_RX_ULSCH_INDICATION_MSG_ID,
43 NFAPI_RACH_INDICATION_MSG_ID,
44 NFAPI_SRS_INDICATION_MSG_ID,
45 NFAPI_RX_SR_INDICATION_MSG_ID,
46 NFAPI_RX_CQI_INDICATION_MSG_ID,
47 NFAPI_LBT_DL_CONFIG_REQUEST_MSG_ID,
48 NFAPI_LBT_DL_INDICATION_MSG_ID,
49
50 NFAPI_PNF_PARAM_REQUEST_MSG_ID = 0x0100,
51 NFAPI_PNF_PARAM_RESPONSE_MSG_ID,
52 NFAPI_PNF_CONFIG_REQUEST_MSG_ID,
53 NFAPI_PNF_CONFIG_RESPONSE_MSG_ID,
54 NFAPI_PNF_START_REQUEST_MSG_ID,
55 NFAPI_PNF_START_RESPONSE_MSG_ID,
56 NFAPI_PNF_STOP_REQUEST_MSG_ID,
57 NFAPI_PNF_STOP_RESPONSE_MSG_ID,
58 NFAPI_PARAM_REQUEST_MSG_ID,
59 NFAPI_PARAM_RESPONSE_MSG_ID,
60 NFAPI_CONFIG_REQUEST_MSG_ID,
61 NFAPI_CONFIG_RESPONSE_MSG_ID,
62 NFAPI_START_REQUEST_MSG_ID,
63 NFAPI_START_RESPONSE_MSG_ID,
64 NFAPI_STOP_REQUEST_MSG_ID,
65 NFAPI_STOP_RESPONSE_MSG_ID,
66 NFAPI_MEASUREMENT_REQUEST_MSG_ID,
67 NFAPI_MEASUREMENT_RESPONSE_MSG_ID,
68
69 NFAPI_DL_NODE_SYNC_MSG_ID = 0x0180,
70 NFAPI_UL_NODE_SYNC_MSG_ID,
71 NFAPI_TIMING_INFO_MSG_ID,
72
73 NFAPI_RSSI_REQUEST_MSG_ID = 0x0200,
74 NFAPI_RSSI_RESPONSE_MSG_ID,
75 NFAPI_RSSI_INDICATION_MSG_ID,
76 NFAPI_CELL_SEARCH_REQUEST_MSG_ID,
77 NFAPI_CELL_SEARCH_RESPONSE_MSG_ID,
78 NFAPI_CELL_SEARCH_INDICATION_MSG_ID,
79 NFAPI_BROADCAST_DETECT_REQUEST_MSG_ID,
80 NFAPI_BROADCAST_DETECT_RESPONSE_MSG_ID,
81 NFAPI_BROADCAST_DETECT_INDICATION_MSG_ID,
82 NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST_MSG_ID,
83 NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE_MSG_ID,
84 NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION_MSG_ID,
85 NFAPI_SYSTEM_INFORMATION_REQUEST_MSG_ID,
86 NFAPI_SYSTEM_INFORMATION_RESPONSE_MSG_ID,
87 NFAPI_SYSTEM_INFORMATION_INDICATION_MSG_ID,
88 NFAPI_NMM_STOP_REQUEST_MSG_ID,
89 NFAPI_NMM_STOP_RESPONSE_MSG_ID,
90 } nfapi_message_id_e;
91
92 static const value_string nfapi_error_vals[] = {
93 { 0x0, "MSG_OK" },
94 { 0x1, "MSG_INVALID_STATE" },
95 { 0x2, "MSG_INVALID_CONFIG" },
96 { 0x3, "SFN_OUT_OF_SYNC" },
97 { 0x4, "MSG_SUBFRAME_ERR" },
98 { 0x5, "MSG_BCH_MISSING" },
99 { 0x6, "MSG_INVALID_SFN" },
100 { 0x7, "MSG_HI_ERR" },
101 { 0x8, "MSG_TX_ERR" },
102 { 0, NULL },
103 };
104
105 static const value_string nfapi_p4_error_vals[] = {
106 { 100, "MSG_OK" },
107 { 101, "MSG_INVALID_STATE" },
108 { 102, "MSG_INVALID_CONFIG" },
109 { 103, "MSG_RAT_NOT_SUPPORTED" },
110 { 200, "MSG_NMM_STOP_OK" },
111 { 201, "MSG_NMM_STOP_IGNORED" },
112 { 202, "MSG_NMM_STOP_INVALID_STATE" },
113 { 300, "MSG_PROCEDURE_COMPLETE" },
114 { 301, "MSG_PROCEDURE_STOPPED" },
115 { 302, "MSG_PARTIAL_RESULTS" },
116 { 303, "MSG_TIMEOUT" },
117 { 0, NULL },
118 };
119
120 static const value_string nfapi_rat_type_vals[] = {
121 { 0, "LTE" },
122 { 1, "UTRAN" },
123 { 2, "GERAN" },
124 { 0, NULL },
125 };
126
127 typedef enum{
128 UN_ALIGNED_SYNCHRONIZATION = 0,
129 INTERNAL_PNF_FRAME_ALIGNMENT,
130 ABSOLUTE_TIME_ALIGNED_SYNCHRONIZATION
131 } nfapi_sync_mode_e;
132
133 static const value_string nfapi_sync_mode_vals[] = {
134 { UN_ALIGNED_SYNCHRONIZATION, "UN-ALIGNED SYNCHRONIZATION" },
135 { INTERNAL_PNF_FRAME_ALIGNMENT, "INTERNAL PNF FRAME ALIGNMENT" },
136 { ABSOLUTE_TIME_ALIGNED_SYNCHRONIZATION, "ABSOLUTE TIME ALIGNED SYNCHRONIZATION" },
137 { 0, NULL },
138 };
139
140 typedef enum {
141 NONE = 0,
142 GPS,
143 GLONASS,
144 BEIDOU
145 } location_mode_e;
146
147 static const value_string location_mode_vals[] = {
148 { NONE, "NONE" },
149 { GPS, "GPS" },
150 { GLONASS, "GLONASS" },
151 { BEIDOU, "BeiDou" },
152 { 0, NULL }
153 };
154
155 static const value_string nfapi_uplink_rs_hopping_vals[] = {
156 { 0, "RS_NO_HOPPING" },
157 { 1, "RS_GROUP_HOPPING" },
158 { 2, "RS_SEQUENCE_HOPPING" },
159 { 0, NULL }
160 };
161
162 static const value_string nfapi_laa_carrier_type_vals[] = {
163 { 0, "No multi carrier support" },
164 { 1, "Mode A1" },
165 { 2, "Mode A12" },
166 { 3, "Mode B1" },
167 { 4, "Mode B2" },
168 { 0, NULL }
169 };
170
171 static const value_string nfapi_multi_carrier_lbt_support_vals[] = {
172 { 0, "Multi carrier Mode A1" },
173 { 1, "Multi carrier Mode A2" },
174 { 2, "Multi carrier Mode B1" },
175 { 3, "Multi carrier Mode B2" },
176 { 0, NULL }
177 };
178
179 static const value_string nfapi_lbt_dl_req_pdu_type[] = {
180 { 0, "LBT_PDSCH_REQ PDU" },
181 { 1, "LBT_DRS_REQ PDU" },
182 { 0, NULL }
183 };
184
185
186 static const value_string nfapi_lbt_dl_ind_pdu_type[] = {
187 { 0, "LBT_PDSCH_RSP PDU" },
188 { 1, "LBT_DRS_RSP PDU" },
189 { 0, NULL }
190 };
191
192 static const value_string nfapi_phy_state_vals[] = {
193 { 0, "IDLE" },
194 { 1, "CONFIGURED" },
195 { 2, "RUNNING" },
196 { 0, NULL },
197 };
198
199
200 /* These are definitions where data 0 & 1 represent/provide a string name*/
201 static const true_false_string nfapi_csi_report_type_strname = {
202 "Periodic",
203 "Aperiodic",
204 };
205
206 static const true_false_string nfapi_control_type_string_name = {
207 "CQI/PMI",
208 "RI",
209 };
210
211 static const true_false_string cyclic_prefix_type_strname = {
212 "CP_NORMAL",
213 "CP_EXTENDED"
214 };
215
216 static const true_false_string support_strname = {
217 "No Support",
218 "Support"
219 };
220
221 static const true_false_string partial_sf_support_strname =
222 {
223 "Start partial SF support",
224 "End partial SF support"
225 };
226
227 static const true_false_string phich_duration_strname = {
228 "PHICH_D_NORMAL",
229 "PHICH_D_EXTENDED"
230 };
231
232 static const true_false_string high_speed_flag_strname = {
233 "HS_UNRESTRICTED_SET",
234 "HS_RESTRICTED_SET"
235 };
236
237 static const true_false_string hopping_mode_strname = {
238 "HM_INTER_SF",
239 "HM_INTRA_INTER_SF"
240 };
241
242 static const true_false_string srs_simult_tx_strname = {
243 "No Simultaneous Transmission",
244 "Simultaneous Transmission"
245 };
246
247 static const true_false_string crc_flag_strname = {
248 "CRC_CORRECT",
249 "CRC_ERROR"
250 };
251
252 static const true_false_string hi_value_strname = {
253 "HI_NACK",
254 "HI_ACK"
255 };
256
257 static const true_false_string flag_tb2_strname = {
258 "HI_NOT_PRESENT",
259 "HI_PRESENT"
260 };
261
262 static const true_false_string nfapi_multi_carrier_tx_strname = {
263 "Mutual transmission (self-deferral support for current carrier)",
264 "Transmit on channel access win (no self-deferral)"
265 };
266
267 static const true_false_string nfapi_multi_carrier_freeze_strname = {
268 "Absence of other technology is not guaranteed",
269 "Absence of other technology is guaranteed"
270 };
271
272 static const true_false_string initial_partial_sf_strname = {
273 "Full SF",
274 "Partial SF"
275 };
276
277 static const true_false_string lbt_mode_strname = {
278 "Full LBT",
279 "Partial LBT"
280 };
281
282 static const true_false_string data_report_mode_vals = {
283 "Crc reported in CRC.indication",
284 "Crc reported in RX.indication"
285 };
286
287 static const true_false_string mcch_flag_string_name = {
288 "MCCH or SC-MCCH change notification field is not valid",
289 "MCCH or SC-MCCH change notification field is valid"
290 };
291
292 static const true_false_string cross_carrier_scheduling_flag_strname = {
293 "Carrier indicator field is not valid",
294 "Carrier indicator field is valid"
295 };
296
297 static const true_false_string srs_flag_strname = {
298 "SRS request field is not valid",
299 "SRS request field is valid"
300 };
301 static const true_false_string srs_request_strname = {
302 "SRS not requested",
303 "SRS requested"
304 };
305
306 static const true_false_string ul_dl_configuration_flag_strname = {
307 "UL/DL configuration field is not valid",
308 "UL/DL configuration field is valid"
309 };
310
311 static const true_false_string prs_cyclic_prefix_type_strname = {
312 "normal cyclic prefix",
313 "extended cyclic prefix"
314 };
315
316 static const true_false_string prs_muting_strname = {
317 "no muting",
318 "muting"
319 };
320
321
322 static const value_string nfapi_dl_config_pdu_type_vals[] = {
323 { 0, "DL_CONFIG_DCI_DL_PDU" },
324 { 1, "DL_CONFIG_BCH_PDU" },
325 { 2, "DL_CONFIG_MCH_PDU" },
326 { 3, "DL_CONFIG_DLSCH_PDU" },
327 { 4, "DL_CONFIG_PCH_PDU" },
328 { 5, "DL_CONFIG_PRS_PDU" },
329 { 6, "DL_CONFIG_CSI_RS_PDU" },
330 { 7, "DL_CONFIG_EPDCCH_DL_PDU" },
331 { 8, "DL_MPDCCH" },
332 { 0, NULL }
333 };
334
335 static const value_string nfapi_duplex_mode_vals[] = {
336 { 0, "TDD" },
337 { 1, "FDD" },
338 { 2, "HD-FDD" },
339 { 0, NULL }
340 };
341
342 static const value_string modulation_vals[] = {
343 { 2, "QPSK" },
344 { 4, "16QAM" },
345 { 6, "64QAM" },
346 { 8, "256QAM" },
347 { 0, NULL }
348 };
349
350 static const value_string pch_modulation_vals[] = {
351 { 0, "QPSK" },
352 { 0, NULL }
353 };
354
355 static const value_string ue_mode_vals[] = {
356 { 0, "non LC/CE UE" },
357 { 1, "LC/CE UE" },
358 { 0, NULL }
359 };
360
361 static const value_string csi_rs_class_vals[] = {
362 { 0, "not used" },
363 { 1, "Class A" },
364 { 2, "Class B" },
365 { 0, NULL }
366 };
367
368 static const value_string csi_rs_cdm_type_vals[] = {
369 { 0, "cdm 2" },
370 { 1, "cdm 4" },
371 { 0, NULL }
372 };
373
374 static const value_string antenna_ports_vals[] = {
375 { 0, "1 antenna ports" },
376 { 1, "2 antenna ports" },
377 { 2, "4 antenna ports" },
378 { 0, NULL }
379 };
380
381 static const value_string combs_vals[] = {
382 { 0, "2 TC" },
383 { 1, "4 TC" },
384 { 0, NULL }
385 };
386
387 static const value_string resource_allocation_type_vals[] = {
388 { 0, "type 0" },
389 { 1, "type 1" },
390 { 2, "type 2 1A/1B/1D" },
391 { 3, "type 2 1C" },
392 { 4, "type 2 6-1A" },
393 { 5, "type UEModeB" },
394 { 6, "NB Index" },
395 { 0, NULL }
396 };
397
398 static const value_string transmission_scheme_vals[] = {
399 { 0, "SINGLE_ANTENNA_PORT_0" },
400 { 1, "TX_DIVERSITY" },
401 { 2, "LARGE_DELAY_CDD" },
402 { 3, "CLOSED_LOOP_SPATIAL_MULTIPLEXING" },
403 { 4, "MULTI_USER_MIMO" },
404 { 5, "CLOSED_LOOP_RANK_1_PRECODING" },
405 { 6, "SINGLE_ANTENNA_PORT_5" },
406 { 7, "SINGLE_ANTENNA_PORT_7" },
407 { 8, "SINGLE_ANTENNA_PORT_8" },
408 { 9, "DUAL_LAYER_TX_PORT_7_AND_8" },
409 { 10, "UP_TO_8_LAYER_TX" },
410 { 11, "SINGLE_ANTENNA_PORT_11" },
411 { 12, "SINGLE_ANTENNA_PORT_13" },
412 { 13, "DUAL_LAYER_TX_PORT_11_13" },
413 { 0, NULL }
414 };
415
416 static const value_string ul_transmission_scheme_vals[] = {
417 { 0, "SINGLE_ANTENNA_PORT_10" },
418 { 1, "CLOSED_LOOP_SPATIAL_MULTIPLEXING" },
419 { 0, NULL },
420 };
421
422 static const value_string dl_dci_format_vals[] = {
423 { 0, "1" },
424 { 1, "1A" },
425 { 2, "1B" },
426 { 3, "1C" },
427 { 4, "1D" },
428 { 5, "2" },
429 { 6, "2A" },
430 { 7, "2B" },
431 { 8, "2C" },
432 { 9, "2D" },
433 { 10, "6-1A" },
434 { 11, "6-1B" },
435 { 12, "6-2" },
436 { 0, NULL }
437 };
438
439 static const value_string ul_dci_format_vals[] = {
440 { 0, "0" },
441 { 1, "3" },
442 { 2, "3A" },
443 { 3, "4" },
444 { 4, "5" },
445 { 0, NULL }
446 };
447
448 static const value_string mpdcch_ul_dci_format_vals[] = {
449 { 1, "3" },
450 { 2, "3A" },
451 { 4, "6-0A" },
452 { 5, "6-0B" },
453 { 0, NULL }
454 };
455
456
457 static const value_string pa_vals[] = {
458 { 0, "-6dB" },
459 { 1, "-4.77dB" },
460 { 2, "-3dB" },
461 { 3, "-1.77dB" },
462 { 4, "0dB" },
463 { 5, "1dB" },
464 { 6, "2dB" },
465 { 7, "3dB" },
466 { 0, NULL }
467 };
468
469 static const value_string transmission_mode_vals[] = {
470 { 1, "Mode 1" },
471 { 2, "Mode 2" },
472 { 3, "Mode 3" },
473 { 4, "Mode 4" },
474 { 5, "Mode 5" },
475 { 6, "Mode 6" },
476 { 7, "Mode 7" },
477 { 8, "Mode 8" },
478 { 9, "Mode 9" },
479 { 10, "Mode 10" },
480 { 0, NULL }
481 };
482
483 static const value_string nfapi_ul_config_pdu_type_vals[] = {
484 { 0, "ULSCH" },
485 { 1, "ULSCH_CQI_RI" },
486 { 2, "ULSCH_HARQ" },
487 { 3, "ULSCH_CQI_HARQ_RI" },
488 { 4, "UCI_CQI" },
489 { 5, "UCI_SR" },
490 { 6, "UCI_HARQ" },
491 { 7, "UCI_SR_HARQ" },
492 { 8, "UCI_CQI_HARQ" },
493 { 9, "UCI_CQI_SR" },
494 { 10, "UCI_CQI_SR_HARQ" },
495 { 11, "SRS" },
496 { 12, "HARQ_BUFFER" },
497 { 13, "ULSCH_UCI_CSI" },
498 { 14, "ULSCH_UCI_HARQ" },
499 { 15, "ULSCH_CSI_UCI_HARQ" },
500 { 0, NULL }
501 };
502
503 static const value_string nfapi_tdd_ack_nack_mode_vals[] = {
504 { 0, "Bundling" },
505 { 1, "Multiplexing" },
506 { 2, "Format 1b with channel selection" },
507 { 3, "Format 3" },
508 { 4, "Format 4" },
509 { 5, "Format 5" },
510 { 0, NULL }
511 };
512 static const value_string nfapi_fdd_ack_nack_mode_vals[] = {
513 { 0, "Format 1a/1b" },
514 { 1, "Channel selection" },
515 { 2, "Format 3" },
516 { 3, "Format 4" },
517 { 4, "Format 5" },
518 { 0, NULL }
519 };
520
521 static const value_string nfapi_phich_resource_vals[] = {
522 { 0, "PHICH_R_ONE_SIXTH " },
523 { 1, "PHICH_R_HALF" },
524 { 2, "PHICH_R_ONE" },
525 { 3, "PHICH_R_TWO" },
526 { 0, NULL }
527 };
528
529 static const value_string local_distributed_vals[] = {
530 { 0, "localized" },
531 { 1, "distributed" },
532 { 0, NULL }
533 };
534
535 static const value_string transport_block_to_codeword_swap_flag_vals[] = {
536 { 0, "no swapping" },
537 { 1, "swapped" },
538 { 0, NULL }
539 };
540
541 static const value_string ngap_vals[] = {
542 { 0, "Ngap1" },
543 { 1, "Ngap2" },
544 { 0, NULL }
545 };
546
547 static const value_string pmi_vals[] = {
548 { 0, "Use precoding indicated in TPMI field" },
549 { 1, "Use precoding indicated in last PMI report on PUSCH" },
550 { 2, "use precoding indicated in TPM field" },
551 { 0, NULL }
552 };
553
554 static const value_string true_false_vals[] = {
555 { 0, "false" },
556 { 1, "true" },
557 { 0, NULL }
558 };
559
560 static const value_string exhustive_search_vals[] = {
561 { 0, "non-exhaustive search" },
562 { 1, "exhaustive search" },
563 { 0, NULL }
564 };
565
566 static const value_string not_used_enabled_vals[] = {
567 { 0, "not used" },
568 { 1, "enabled" },
569 { 0, NULL }
570 };
571
572 static const value_string hopping_vals[] = {
573 { 0, "no hopping" },
574 { 1, "hopping enabled" },
575 { 0, NULL }
576 };
577
578
579 static const value_string mpdcch_rnti_type_vals[] = {
580 { 1, "Temporary C-RNTI" },
581 { 2, "RA-RNTI" },
582 { 3, "P-RNTI" },
583 { 4, "other" },
584 { 0, NULL }
585 };
586
587 static const value_string rnti_type_vals[] = {
588 { 1, "C-RNTI" },
589 { 2, "RA-RNTI, P-RNTI, SI-RNTI, SC-RNTI, G-RNTI" },
590 { 3, "SPS-CRNTI" },
591 { 0, NULL }
592 };
593
594 static const value_string primary_cells_type_vals[] = {
595 { 1, "TDD" },
596 { 2, "FDD" },
597 { 3, "HD_FDD" },
598 { 0, NULL }
599 };
600
601 static const value_string ul_rssi_supported_vals[] = {
602 { 0, "Uplink RSSI not supported" },
603 { 1, "Uplink RSSI supported" },
604 { 0, NULL }
605 };
606
607 static const value_string nprb_vals[] = {
608 { 0, "2" },
609 { 1, "3" },
610 { 0, NULL }
611 };
612
613 static const value_string nmm_modes_supported_vals[] =
614 {
615 { 0, "NONE" },
616 { 1, "NMM_ONLY" },
617 { 2, "NMM_IN_CONFIGURED_STATE" },
618 { 3, "NMM_IN_RUNNING_STATE" },
619 { 4, "NMM_IN_CONFIGURED_AND_RUNNING_STATE" },
620 { 0, NULL }
621 };
622
623 static const value_string dlsch_re13_ue_type_vals[] = {
624 { 0, "non LC/CE UE" },
625 { 1, "LC/CE CEModeA UE" },
626 { 2, "LC/CE CEModeB UE" },
627 { 0, NULL }
628 };
629
630 static const value_string dlsch_re13_pdsch_payload_type_vals[] = {
631 { 0, "PDSCH carrying SIB1-BR " },
632 { 1, "PDSCH carrying SI message (except for SIB1-BR or PCH)" },
633 { 2, "PDSCH carrying other" },
634 { 0, NULL }
635 };
636
637
638 static const value_string paging_direct_indication_differtiation_flag_vals[] = {
639 { 0, "Direct Information" },
640 { 1, "Paging" },
641 { 0, NULL }
642 };
643
644 static const value_string ul_tx_mode_vals[] = {
645 { 0, "SISO/MIMO" },
646 { 1, "MIMO" },
647 { 0, NULL }
648 };
649
650 static const value_string n_srs_vals[] = {
651 { 0, "No overlap" },
652 { 1, "Overlap" },
653 { 0, NULL }
654 };
655
656 static const value_string n_srs_initial_vals[] = {
657 { 0, "Last OFDM symbol is not punctured" },
658 { 1, "Last OFDM symbol is punctured." },
659 { 0, NULL }
660 };
661
662
663 static const value_string csi_mode_vals[] = {
664 { 0, "PUCCH format 2/2a/2b/3" },
665 { 1, "PUCCH format 4" },
666 { 2, "PUCCH format 5" },
667 { 0, NULL }
668 };
669
670 static const value_string hi_dci0_pdu_type_vals[] = {
671 { 0, "HI" },
672 { 1, "DCI UL" },
673 { 2, "EPDCCH DCI UL" },
674 { 3, "MDPCCH DCI UL" },
675 { 0, NULL }
676 };
677
678 static const value_string ue_tx_antenna_selection_vals[] = {
679 { 0, "Not Configured" },
680 { 1, "Configured and using UE port 0" },
681 { 2, "Configured and using UE port 1" },
682 { 0, NULL }
683 };
684
685 static const value_string size_of_cqi_csi_field_vals[] = {
686 { 0, "1 bit" },
687 { 1, "2 bits" },
688 { 2, "3 bits" },
689 { 0, NULL }
690 };
691
692 static const value_string number_of_antenna_port_vals[] = {
693 { 0, "1 antenna port" },
694 { 1, "2 antenna ports" },
695 { 2, "4 antenna ports" },
696 { 0, NULL }
697 };
698
699 static const value_string ce_mode_vals[] = {
700 { 1, "CEModeA" },
701 { 2, "CEModeB" },
702 { 0, NULL }
703 };
704
705
706 static const value_string csi_request_vals[] = {
707 { 0, "Aperiodic CSI not requested" },
708 { 1, "Aperiodic CSI requested" },
709 { 0, NULL }
710 };
711
712 static const value_string tdd_harq_mode_vals[] = {
713 { 0, "Format 1a/1b BUNDLING" },
714 { 1, "Format 1a/1b MULTIPLEXING" },
715 { 2, "Format 1a/1b SPECIAL BUNDLING" },
716 { 3, "Channel Selection" },
717 { 4, "Format 3" },
718 { 5, "Format 4" },
719 { 6, "Format 5" },
720 { 0, NULL }
721 };
722
723 static const value_string fdd_harq_mode_vals[] = {
724 { 0, "Format 1a/1b" },
725 { 1, "Channel Selection" },
726 { 2, "Format 3" },
727 { 3, "Format 4" },
728 { 4, "Format 5" },
729 { 0, NULL }
730 };
731
732 static const value_string harq_value_vals[] = {
733 { 1, "ACK" },
734 { 2, "NACK" },
735 { 3, "ACK or NACK" },
736 { 4, "DTX" },
737 { 5, "ACK or DTX" },
738 { 6, "NACK or DTX" },
739 { 7, "ACK or NACK or DTX" },
740 { 0, NULL }
741 };
742
743
744 static const value_string harq_special_value_vals[] = {
745 { 0, "0 or None" },
746 { 1, "1 or 4 or 7 ACKs reported" },
747 { 2, "2 or 5 or 8 ACKs reported" },
748 { 3, "3 or 6 or 9 ACKs reported" },
749 { 4, "DTX (UE did not transmit anything)" },
750 { 0, NULL }
751 };
752
753 static const value_string channel_vals[] = {
754 { 0, "PUCCH" },
755 { 1, "PUSCH" },
756 { 0, NULL }
757 };
758
759 static const value_string rach_resource_type_vals[] = {
760 { 0, "Non LC / CE RACH" },
761 { 1, "LC / CE RACH CE level 0" },
762 { 2, "LC / CE RACH CE level 1" },
763 { 3, "LC / CE RACH CE level 2" },
764 { 4, "LC / CE RACH CE level 3" },
765 { 0, NULL }
766 };
767
768 static const value_string up_pts_symbol_vals[] = {
769 { 0, "Symbol 0" },
770 { 1, "Symbol 1" },
771 { 0, NULL }
772 };
773
774 static const value_string arfcn_direction_vals[] = {
775 { 0, "DL" },
776 { 1, "UL" },
777 { 0, NULL }
778 };
779
780 static int proto_nfapi = -1;
781
782 /* These are for the subtrees */
783 static gint ett_nfapi = -1;
784 static gint ett_nfapi_p4_p5_message_header = -1;
785 static gint ett_nfapi_p7_message_header = -1;
786 static gint ett_nfapi_tlv_tree = -1;
787 static gint ett_nfapi_tl = -1;
788 static gint ett_nfapi_pnf_phy = -1;
789 static gint ett_nfapi_pnf_phy_rel10 = -1;
790 static gint ett_nfapi_pnf_phy_rel11 = -1;
791 static gint ett_nfapi_pnf_phy_rel12 = -1;
792 static gint ett_nfapi_pnf_phy_rel13 = -1;
793 static gint ett_nfapi_pnf_phy_rf_config = -1;
794 static gint ett_nfapi_rf_bands = -1;
795 static gint ett_nfapi_tx_antenna_ports = -1;
796 static gint ett_nfapi_harq_ack_nack_data = -1;
797 static gint ett_nfapi_harq_data = -1;
798 static gint ett_nfapi_cc = -1;
799 static gint ett_nfapi_rbs = -1;
800 static gint ett_nfapi_antennas = -1;
801 static gint ett_nfapi_dl_config_request_pdu_list = -1;
802 static gint ett_nfapi_ul_config_request_pdu_list = -1;
803 static gint ett_nfapi_hi_dci0_request_pdu_list = -1;
804 static gint ett_nfapi_tx_request_pdu_list = -1;
805 static gint ett_nfapi_rx_indication_pdu_list = -1;
806 static gint ett_nfapi_harq_indication_pdu_list = -1;
807 static gint ett_nfapi_crc_indication_pdu_list = -1;
808 static gint ett_nfapi_sr_indication_pdu_list = -1;
809 static gint ett_nfapi_cqi_indication_pdu_list = -1;
810 static gint ett_nfapi_preamble_indication_pdu_list = -1;
811 static gint ett_nfapi_srs_indication_pdu_list = -1;
812 static gint ett_nfapi_lbt_dl_config_pdu_list = -1;
813 static gint ett_nfapi_lbt_dl_indication_pdu_list = -1;
814 static gint ett_nfapi_subbands = -1;
815 static gint ett_nfapi_bf_vector_antennas = -1;
816 static gint ett_nfapi_bf_vectors = -1;
817 static gint ett_nfapi_csi_rs_resource_configs = -1;
818 static gint ett_nfapi_csi_rs_bf_vector = -1;
819 static gint ett_nfapi_epdcch_prbs = -1;
820 static gint ett_nfapi_precoding = -1;
821 static gint ett_nfapi_earfcn_list = -1;
822 static gint ett_nfapi_uarfcn_list = -1;
823 static gint ett_nfapi_arfcn_list = -1;
824 static gint ett_nfapi_rssi_list = -1;
825 static gint ett_nfapi_pci_list = -1;
826 static gint ett_nfapi_psc_list = -1;
827 static gint ett_nfapi_lte_cells_found_list = -1;
828 static gint ett_nfapi_utran_cells_found_list = -1;
829 static gint ett_nfapi_geran_cells_found_list = -1;
830 static gint ett_nfapi_si_periodicity_list = -1;
831 static gint ett_nfapi_downlink_bandwidth_support = -1;
832 static gint ett_nfapi_uplink_bandwidth_support = -1;
833 static gint ett_nfapi_downlink_modulation_support = -1;
834 static gint ett_nfapi_uplink_modulation_support = -1;
835 static gint ett_nfapi_received_interference_power_mesurement_results = -1;
836 static gint ett_nfapi_release_support = -1;
837 static expert_field ei_invalid_range = EI_INIT;
838 static expert_field ei_invalid_tlv_length = EI_INIT;
839
840 static int hf_nfapi_p4_p5_message_header_phy_id = -1;
841 static int hf_nfapi_p4_p5_message_header_message_id = -1;
842 static int hf_nfapi_p4_p5_message_header_message_length = -1;
843 static int hf_nfapi_p4_p5_message_header_spare = -1;
844 static int hf_nfapi_p7_message_header_phy_id = -1;
845 static int hf_nfapi_p7_message_header_message_id = -1;
846 static int hf_nfapi_p7_message_header_message_length = -1;
847 static int hf_nfapi_p7_message_header_m = -1;
848 static int hf_nfapi_p7_message_header_segment = -1;
849 static int hf_nfapi_p7_message_header_sequence_number = -1;
850 static int hf_nfapi_p7_message_header_checksum = -1;
851 static int hf_nfapi_p7_message_header_transmit_timestamp = -1;
852 static int hf_nfapi_tl_tag = -1;
853 static int hf_nfapi_tl_length = -1;
854 static int hf_nfapi_sync_mode = -1;
855 static int hf_nfapi_location_mode = -1;
856 static int hf_nfapi_location_coordinates = -1;
857 static int hf_nfapi_dl_config_timing = -1;
858 static int hf_nfapi_tx_timing = -1;
859 static int hf_nfapi_ul_config_timing = -1;
860 static int hf_nfapi_hi_dci0_timing = -1;
861 static int hf_nfapi_maximum_number_phys = -1;
862 static int hf_nfapi_maximum_total_bandwidth = -1;
863 static int hf_nfapi_maximum_total_number_dl_layers = -1;
864 static int hf_nfapi_maximum_total_number_ul_layers = -1;
865 static int hf_nfapi_shared_bands = -1;
866 static int hf_nfapi_shared_pa = -1;
867 static int hf_nfapi_maximum_total_power = -1;
868 static int hf_nfapi_oui = -1;
869 static int hf_nfapi_pdu = -1;
870 static int hf_nfapi_pnf_phy_number_phy = -1;
871 static int hf_nfapi_pnf_phy_config_index = -1;
872 static int hf_nfapi_number_of_rf_exclusions = -1;
873 static int hf_nfapi_dl_bandwidth_support = -1;
874 static int hf_nfapi_dl_bandwidth_support_6 = -1;
875 static int hf_nfapi_dl_bandwidth_support_15 = -1;
876 static int hf_nfapi_dl_bandwidth_support_25 = -1;
877 static int hf_nfapi_dl_bandwidth_support_50 = -1;
878 static int hf_nfapi_dl_bandwidth_support_75 = -1;
879 static int hf_nfapi_dl_bandwidth_support_100 = -1;
880 static int hf_nfapi_ul_bandwidth_support = -1;
881 static int hf_nfapi_ul_bandwidth_support_6 = -1;
882 static int hf_nfapi_ul_bandwidth_support_15= -1;
883 static int hf_nfapi_ul_bandwidth_support_25 = -1;
884 static int hf_nfapi_ul_bandwidth_support_50 = -1;
885 static int hf_nfapi_ul_bandwidth_support_75 = -1;
886 static int hf_nfapi_ul_bandwidth_support_100 = -1;
887 static int hf_nfapi_downlink_channel_bandwidth_supported = -1;
888 static int hf_nfapi_uplink_channel_bandwidth_supported = -1;
889 static int hf_nfapi_number_of_dl_layers_supported = -1;
890 static int hf_nfapi_number_of_ul_layers_supported = -1;
891 static int hf_nfapi_maximum_3gpp_release_supported = -1;
892 static int hf_nfapi_maximum_3gpp_release_supported_rel8 = -1;
893 static int hf_nfapi_maximum_3gpp_release_supported_rel9 = -1;
894 static int hf_nfapi_maximum_3gpp_release_supported_rel10 = -1;
895 static int hf_nfapi_maximum_3gpp_release_supported_rel11 = -1;
896 static int hf_nfapi_maximum_3gpp_release_supported_rel12 = -1;
897 static int hf_nfapi_maximum_3gpp_release_supported_rel13 = -1;
898 static int hf_nfapi_nmm_modes_supported = -1;
899 static int hf_nfapi_number_of_rfs = -1;
900 static int hf_nfapi_rf_config_index = -1;
901 static int hf_nfapi_band = -1;
902 static int hf_nfapi_maximum_transmit_power = -1;
903 static int hf_nfapi_maximum_transmit_power_2 = -1;
904 static int hf_nfapi_earfcn = -1;
905 static int hf_nfapi_minimum_transmit_power = -1;
906 static int hf_nfapi_number_of_antennas_suppported = -1;
907 static int hf_nfapi_minimum_downlink_frequency = -1;
908 static int hf_nfapi_maximum_downlink_frequency = -1;
909 static int hf_nfapi_minimum_uplink_frequency = -1;
910 static int hf_nfapi_maximum_uplink_frequency = -1;
911 static int hf_nfapi_number_of_rf_bands = -1;
912 static int hf_nfapi_nmm_uplink_rssi_supported = -1;
913 static int hf_nfapi_phy_rf_config_info_phy_id = -1;
914 static int hf_nfapi_transmission_mode7_supported = -1;
915 static int hi_nfapi_transmission_mode8_supported = -1;
916 static int hi_nfapi_two_antennas_ports_for_pucch = -1;
917 static int hi_nfapi_transmission_mode_9_supported = -1;
918 static int hi_nfapi_simultaneous_pucch_pusch = -1;
919 static int hi_nfapi_four_layer_tx_with_tm3_and_tm4 = -1;
920 static int hf_nfapi_epdcch_supported = -1;
921 static int hi_nfapi_multi_ack_csi_reporting = -1;
922 static int hi_nfapi_pucch_tx_diversity_with_channel_selection = -1;
923 static int hi_nfapi_ul_comp_supported = -1;
924 static int hi_nfapi_transmission_mode_5_supported = -1;
925 static int hf_nfapi_csi_subframe_set = -1;
926 static int hi_nfapi_enhanced_4tx_codebook = -1;
927 static int hi_nfapi_drs_supported = -1;
928 static int hi_nfapi_ul_64qam_supported = -1;
929 static int hi_nfapi_transmission_mode_10_supported = -1;
930 static int hi_nfapi_alternative_tbs_indices = -1;
931 static int hf_nfapi_pucch_format_4_supported = -1;
932 static int hf_nfapi_pucch_format_5_supported = -1;
933 static int hf_nfapi_more_than_5_ca_supported = -1;
934 static int hf_nfapi_laa_supported = -1;
935 static int hf_nfapi_laa_ending_in_dwpts_supported = -1;
936 static int hf_nfapi_laa_starting_in_second_slot_supported = -1;
937 static int hf_nfapi_beamforming_supported = -1;
938 static int hf_nfapi_csi_rs_enhancements_supported = -1;
939 static int hf_nfapi_drms_enhancements_supported = -1;
940 static int hf_nfapi_srs_enhancements_supported = -1;
941 static int hf_nfapi_dl_rs_tx_power = -1;
942 static int hf_nfapi_received_interference_power = -1;
943 static int hf_nfapi_thermal_noise_power = -1;
944 static int hf_nfapi_dl_rs_tx_power_measurement = -1;
945 static int hf_nfapi_received_interference_power_measurement = -1;
946 static int hf_nfapi_thermal_noise_power_measurement = -1;
947
948 // P5 Message Structures
949 static int hf_nfapi_error_code = -1;
950 static int hf_nfapi_p4_error_code = -1;
951 static int hf_nfapi_rat_type = -1;
952 static int hf_nfapi_num_tlv = -1;
953 static int hf_nfapi_phy_state = -1;
954 static int hf_nfapi_phy_antenna_capability = -1;
955 static int hf_nfapi_release_capability = -1;
956 static int hf_nfapi_mbsfn_capability = -1;
957 static int hf_nfapi_laa_capability = -1;
958 static int hf_nfapi_pd_sensing_lbt_support = -1;
959 static int hf_nfapi_multi_carrier_lbt_support = -1;
960 static int hf_nfapi_partial_sf_support = -1;
961
962 static int hf_nfapi_pnf_address_ipv4 = -1;
963 static int hf_nfapi_pnf_address_ipv6 = -1;
964 static int hf_nfapi_vnf_address_ipv4 = -1;
965 static int hf_nfapi_vnf_address_ipv6 = -1;
966 static int hf_nfapi_pnf_port = -1;
967 static int hf_nfapi_vnf_port = -1;
968 static int hf_nfapi_dl_ue_per_sf = -1;
969 static int hf_nfapi_ul_ue_per_sf = -1;
970 static int hf_nfapi_timing_window = -1;
971 static int hf_nfapi_timing_info_mode = -1;
972 static int hf_nfapi_timing_info_period = -1;
973 static int hf_nfapi_duplex_mode = -1;
974 static int hf_nfapi_pcfich_power_offset = -1;
975 static int hf_nfapi_pb = -1;
976 static int hf_nfapi_dl_cyclic_prefix_type = -1;
977 static int hf_nfapi_ul_cyclic_prefix_type = -1;
978 static int hf_nfapi_tx_antenna_ports = -1;
979 static int hf_nfapi_rx_antenna_ports = -1;
980 static int hf_nfapi_downlink_channel_bandwidth = -1;
981 static int hf_nfapi_uplink_channel_bandwidth = -1;
982 static int hf_nfapi_reference_signal_power = -1;
983 static int hf_nfapi_phich_resource = -1;
984 static int hf_nfapi_phich_duration = -1;
985 static int hf_nfapi_phich_power_offset = -1;
986 static int hf_nfapi_primary_synchronization_signal_epre_eprers = -1;
987 static int hf_nfapi_secondary_synchronization_signal_epre_eprers = -1;
988 static int hf_nfapi_physical_cell_id = -1;
989 static int hf_nfapi_configuration_index = -1;
990 static int hf_nfapi_root_sequence_index = -1;
991 static int hf_nfapi_zero_correlation_zone_configuration = -1;
992 static int hf_nfapi_high_speed_flag = -1;
993 static int hf_nfapi_frequency_offset = -1;
994 static int hf_nfapi_hopping_mode = -1;
995 static int hf_nfapi_hopping_offset = -1;
996 static int hf_nfapi_delta_pucch_shift = -1;
997 static int hf_nfapi_n_cqi_rb = -1;
998 static int hf_nfapi_n_an_cs = -1;
999 static int hf_nfapi_n1_pucch_an = -1;
1000 static int hf_nfapi_bandwidth_configuration = -1;
1001 static int hf_nfapi_max_up_pts = -1;
1002 static int hf_nfapi_srs_subframe_configuration = -1;
1003 static int hf_nfapi_srs_acknack_srs_simultaneous_transmission = -1;
1004 static int hf_nfapi_uplink_rs_hopping = -1;
1005 static int hf_nfapi_group_assignment = -1;
1006 static int hf_nfapi_cyclic_shift_1_for_drms = -1;
1007 static int hf_nfapi_subframe_assignment = -1;
1008 static int hf_nfapi_special_subframe_patterns = -1;
1009 static int hf_nfapi_ed_threshold_for_lbt_for_pdsch = -1;
1010 static int hf_nfapi_ed_threshold_for_lbt_for_drs = -1;
1011 static int hf_nfapi_pd_threshold = -1;
1012 static int hf_nfapi_multi_carrier_type = -1;
1013 static int hf_nfapi_multi_carrier_tx = -1;
1014 static int hf_nfapi_multi_carrier_freeze = -1;
1015 static int hf_nfapi_tx_antenna_ports_for_drs = -1;
1016 static int hf_nfapi_transmission_power_for_drs = -1;
1017 static int hf_nfapi_pbch_repetitions_enabled_r13 = -1;
1018 static int hf_nfapi_prach_cat_m_root_sequence_index = -1;
1019 static int hf_nfapi_prach_cat_m_zero_correlation_zone_configuration = -1;
1020 static int hf_nfapi_prach_cat_m_high_speed_flag = -1;
1021 static int hf_nfapi_prach_ce_level_0_enable = -1;
1022 static int hf_nfapi_prach_ce_level_0_configuration_index = -1;
1023 static int hf_nfapi_prach_ce_level_0_frequency_offset = -1;
1024 static int hf_nfapi_prach_ce_level_0_number_of_repetitions_per_attempt = -1;
1025 static int hf_nfapi_prach_ce_level_0_starting_subframe_periodicity = -1;
1026 static int hf_nfapi_prach_ce_level_0_hopping_enabled = -1;
1027 static int hf_nfapi_prach_ce_level_0_hopping_offset = -1;
1028 static int hf_nfapi_prach_ce_level_1_enable = -1;
1029 static int hf_nfapi_prach_ce_level_1_configuration_index = -1;
1030 static int hf_nfapi_prach_ce_level_1_frequency_offset = -1;
1031 static int hf_nfapi_prach_ce_level_1_number_of_repetitions_per_attempt = -1;
1032 static int hf_nfapi_prach_ce_level_1_starting_subframe_periodicity = -1;
1033 static int hf_nfapi_prach_ce_level_1_hopping_enabled = -1;
1034 static int hf_nfapi_prach_ce_level_1_hopping_offset = -1;
1035 static int hf_nfapi_prach_ce_level_2_enable = -1;
1036 static int hf_nfapi_prach_ce_level_2_configuration_index = -1;
1037 static int hf_nfapi_prach_ce_level_2_frequency_offset = -1;
1038 static int hf_nfapi_prach_ce_level_2_number_of_repetitions_per_attempt = -1;
1039 static int hf_nfapi_prach_ce_level_2_starting_subframe_periodicity = -1;
1040 static int hf_nfapi_prach_ce_level_2_hopping_enabled = -1;
1041 static int hf_nfapi_prach_ce_level_2_hopping_offset = -1;
1042 static int hf_nfapi_prach_ce_level_3_enable = -1;
1043 static int hf_nfapi_prach_ce_level_3_configuration_index = -1;
1044 static int hf_nfapi_prach_ce_level_3_frequency_offset = -1;
1045 static int hf_nfapi_prach_ce_level_3_number_of_repetitions_per_attempt = -1;
1046 static int hf_nfapi_prach_ce_level_3_starting_subframe_periodicity = -1;
1047 static int hf_nfapi_prach_ce_level_3_hopping_enabled = -1;
1048 static int hf_nfapi_prach_ce_level_3_hopping_offset = -1;
1049 static int hf_nfapi_pucch_internal_ul_hopping_config_common_mode_b = -1;
1050 static int hf_nfapi_pucch_internal_ul_hopping_config_common_mode_a = -1;
1051 static int hf_nfapi_dl_modulation_support = -1;
1052 static int hf_nfapi_dl_modulation_support_qpsk = -1;
1053 static int hf_nfapi_dl_modulation_support_16qam = -1;
1054 static int hf_nfapi_dl_modulation_support_64qam = -1;
1055 static int hf_nfapi_dl_modulation_support_256qam = -1;
1056 static int hf_nfapi_ul_modulation_support = -1;
1057 static int hf_nfapi_ul_modulation_support_qpsk = -1;
1058 static int hf_nfapi_ul_modulation_support_16qam = -1;
1059 static int hf_nfapi_ul_modulation_support_64qam = -1;
1060 static int hf_nfapi_data_report_mode = -1;
1061 static int hf_nfapi_sfnsf = -1;
1062
1063 // P7 Sub Structures
1064 static int hf_nfapi_dl_dci_format = -1;
1065 static int hf_nfapi_ul_dci_format = -1;
1066 static int hf_nfapi_mpdcch_ul_dci_format = -1;
1067 static int hf_nfapi_cce_idx = -1;
1068 static int hf_nfapi_aggregation_level = -1;
1069 static int hf_nfapi_mcs_1 = -1;
1070 static int hf_nfapi_redundancy_version_1 = -1;
1071 static int hf_nfapi_new_data_indicator_1 = -1;
1072 static int hf_nfapi_mcs_2 = -1;
1073 static int hf_nfapi_redundancy_version_2 = -1;
1074 static int hf_nfapi_new_data_indicator_2 = -1;
1075 static int hf_nfapi_harq_process = -1;
1076 static int hf_nfapi_tpmi = -1;
1077 static int hf_nfapi_pmi = -1;
1078 static int hf_nfapi_precoding_information = -1;
1079 static int hf_nfapi_tpc = -1;
1080 static int hf_nfapi_downlink_assignment_index = -1;
1081 static int hf_nfapi_transport_block_size_index = -1;
1082 static int hf_nfapi_downlink_power_offset = -1;
1083 static int hf_nfapi_allocate_prach_flag = -1;
1084 static int hf_nfapi_preamble_index = -1;
1085 static int hf_nfapi_prach_mask_index = -1;
1086 static int hf_nfapi_rnti_type = -1;
1087 static int hf_nfapi_mpdcch_rnti_type = -1;
1088 static int hf_nfapi_mcch_flag = -1;
1089 static int hf_nfapi_mcch_change_notification = -1;
1090 static int hf_nfapi_scrambling_identity = -1;
1091 static int hf_nfapi_cross_carrier_scheduling_flag = -1;
1092 static int hf_nfapi_carrier_indicator = -1;
1093 static int hf_nfapi_srs_flag = -1;
1094 static int hf_nfapi_srs_request = -1;
1095 static int hf_nfapi_antenna_ports_scrambling_and_layers = -1;
1096 static int hf_nfapi_total_dci_length_including_padding = -1;
1097 static int hf_nfapi_harq_ack_resource_offset = -1;
1098 static int hf_nfapi_pdsch_re_mapping_and_quasi_co_location_indicator = -1;
1099 static int hf_nfapi_primary_cell_type = -1;
1100 static int hf_nfapi_ul_dl_configuration_flag = -1;
1101 static int hf_nfapi_number_of_ul_dl_configurations = -1;
1102 static int hf_nfapi_ul_dl_configuration_index = -1;
1103 static int hf_nfapi_laa_end_partial_sf_flag = -1;
1104 static int hf_nfapi_laa_end_partial_sf_configuration = -1;
1105 static int hf_nfapi_initial_lbt_sf = -1;
1106 static int hf_nfapi_codebooksize_determination_r13 = -1;
1107 static int hf_nfapi_rel13_drms_table_flag = -1;
1108 static int hf_nfapi_csi_rs_resource_config = -1;
1109 static int hf_nfapi_csi_rs_number_of_nzp_configurations = -1;
1110 static int hf_nfapi_pdsch_start = -1;
1111 static int hf_nfapi_drms_config_flag = -1;
1112 static int hf_nfapi_drms_scrambling = -1;
1113 static int hf_nfapi_csi_config_flag = -1;
1114 static int hf_nfapi_csi_scrambling = -1;
1115 static int hf_nfapi_pdsch_re_mapping_flag = -1;
1116 static int hf_nfapi_pdsch_re_mapping_antenna_ports = -1;
1117 static int hf_nfapi_pdsch_re_mapping_freq_shift = -1;
1118 static int hf_nfapi_alt_cqi_table_r12 = -1;
1119 static int hf_nfapi_max_layers = -1;
1120 static int hf_nfapi_n_dl_harq = -1;
1121 static int hf_nfapi_dwpts_symbols = -1;
1122 static int hf_nfapi_ue_type = -1;
1123 static int hf_nfapi_pdsch_payload_type = -1;
1124 static int hf_nfapi_initial_transmission_sf = -1;
1125 static int hf_nfapi_req13_drms_table_flag = -1;
1126 static int hf_nfapi_prnti = -1;
1127 static int hf_nfapi_mcs = -1;
1128 static int hf_nfapi_number_of_transport_blocks = -1;
1129 static int hf_nfapi_ue_mode = -1;
1130 static int hf_prs_bandwidth = -1;
1131 static int hf_prs_cyclic_prefix_type = -1;
1132 static int hf_prs_muting = -1;
1133 static int hf_nfapi_csi_rs_resource_index = -1;
1134 static int hf_nfapi_csi_rs_class = -1;
1135 static int hf_nfapi_cdm_type = -1;
1136 static int hf_nfapi_epdcch_prb_index = -1;
1137 static int hf_nfapi_epdcch_resource_assignment_flag = -1;
1138 static int hf_nfapi_epdcch_id = -1;
1139 static int hf_nfapi_epdcch_start_symbol = -1;
1140 static int hf_nfapi_epdcch_num_prb = -1;
1141 static int hf_nfapi_precoding_value = -1;
1142 static int hf_nfapi_mpdcch_narrowband = -1;
1143 static int hf_nfapi_number_of_prb_pairs = -1;
1144 static int hf_nfapi_resource_block_assignment = -1;
1145 static int hf_nfapi_start_symbol = -1;
1146 static int hf_nfapi_ecce_index = -1;
1147 static int hf_nfapi_ce_mode = -1;
1148 static int hf_nfapi_drms_scrabmling_init = -1;
1149 static int hf_nfapi_pdsch_reception_levels = -1;
1150 static int hf_nfapi_new_data_indicator = -1;
1151 static int hf_nfapi_tpmi_length = -1;
1152 static int hf_nfapi_pmi_flag = -1;
1153 static int hf_nfapi_harq_resource_offset = -1;
1154 static int hf_nfapi_dci_subframe_repetition_number = -1;
1155 static int hf_nfapi_downlink_assignment_index_length = -1;
1156 static int hf_nfapi_starting_ce_level = -1;
1157 static int hf_nfapi_antenna_ports_and_scrambling_identity_flag = -1;
1158 static int hf_nfapi_antenna_ports_and_scrambling_identity = -1;
1159 static int hf_nfapi_paging_direct_indication_differentiation_flag = -1;
1160 static int hf_nfapi_direct_indication = -1;
1161 static int hf_nfapi_number_of_tx_antenna_ports = -1;
1162
1163 // P7 Message Structures
1164 static int hf_nfapi_dl_node_sync_t1 = -1;
1165 static int hf_nfapi_dl_node_sync_delta_sfn_sf = -1;
1166 static int hf_nfapi_ul_node_sync_t1 = -1;
1167 static int hf_nfapi_ul_node_sync_t2 = -1;
1168 static int hf_nfapi_ul_node_sync_t3 = -1;
1169 static int hf_nfapi_timing_info_last_sfn_sf = -1;
1170 static int hf_nfapi_timing_info_time_since_last_timing_info = -1;
1171 static int hf_nfapi_timing_info_dl_config_jitter = -1;
1172 static int hf_nfapi_timing_info_tx_request_jitter = -1;
1173 static int hf_nfapi_timing_info_ul_config_jitter = -1;
1174 static int hf_nfapi_timing_info_hi_dci0_jitter = -1;
1175 static int hf_nfapi_timing_info_dl_config_latest_delay = -1;
1176 static int hf_nfapi_timing_info_tx_request_latest_delay = -1;
1177 static int hf_nfapi_timing_info_ul_config_latest_delay = -1;
1178 static int hf_nfapi_timing_info_hi_dci0_latest_delay = -1;
1179 static int hf_nfapi_timing_info_dl_config_earliest_arrival = -1;
1180 static int hf_nfapi_timing_info_tx_request_earliest_arrival = -1;
1181 static int hf_nfapi_timing_info_ul_config_earliest_arrival = -1;
1182 static int hf_nfapi_timing_info_hi_dci0_earliest_arrival = -1;
1183 static int hf_nfapi_sfn_sf = -1;
1184 static int hf_nfapi_number_pdcch_ofdm_symbols = -1;
1185 static int hf_nfapi_number_dci = -1;
1186 static int hf_nfapi_number_pdus = -1;
1187 static int hf_nfapi_number_pdsch_rnti = -1;
1188 static int hf_nfapi_transmission_power_pcfich = -1;
1189 static int hf_nfapi_number_of_harqs = -1;
1190 static int hf_nfapi_number_of_crcs = -1;
1191 static int hf_nfapi_number_of_srs = -1;
1192 static int hf_nfapi_number_of_cqi = -1;
1193 static int hf_nfapi_number_of_preambles = -1;
1194 static int hf_nfapi_number_of_srss = -1;
1195 static int hf_nfapi_lbt_dl_req_pdu_type = -1;
1196 static int hf_nfapi_lbt_dl_ind_pdu_type = -1;
1197 static int hf_nfapi_dl_config_pdu_type = -1;
1198 static int hf_nfapi_pdu_size = -1;
1199 static int hf_nfapi_instance_length = -1;
1200 static int hf_nfapi_length;
1201 static int hf_nfapi_pdu_index = -1;
1202 static int hf_nfapi_rnti = -1;
1203 static int hf_nfapi_resource_allocation_type = -1;
1204 static int hf_nfapi_virtual_resource_block_assignment_flag = -1;
1205 static int hf_nfapi_resource_block_coding = -1;
1206 static int hf_nfapi_modulation = -1;
1207 static int hf_nfapi_redundancy_version = -1;
1208 static int hf_nfapi_transport_blocks = -1;
1209 static int hf_nfapi_transport_block_to_codeword_swap_flag = -1;
1210 static int hf_nfapi_transmission_scheme = -1;
1211 static int hf_nfapi_ul_transmission_scheme = -1;
1212 static int hf_nfapi_number_of_layers = -1;
1213 static int hf_nfapi_number_of_subbands = -1;
1214 static int hf_nfapi_codebook_index = -1;
1215 static int hf_nfapi_ue_category_capacity = -1;
1216 static int hf_nfapi_pa = -1;
1217 static int hf_nfapi_delta_power_offset_index = -1;
1218 static int hf_nfapi_ngap = -1;
1219 static int hf_nfapi_nprb = -1;
1220 static int hf_nfapi_transmission_mode = -1;
1221 static int hf_nfapi_num_bf_prb_per_subband = -1;
1222 static int hf_nfapi_num_bf_vector = -1;
1223 static int hf_nfapi_bf_vector_subband_index = -1;
1224 static int hf_nfapi_bf_vector_num_antennas = -1;
1225 static int hf_nfapi_bf_vector_bf_value = -1;
1226 static int hf_nfapi_nscid = -1;
1227 static int hf_nfapi_csi_rs_flag = -1;
1228 static int hf_nfapi_csi_rs_resource_config_r10 = -1;
1229 static int hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10 = -1;
1230 static int hf_nfapi_transmission_power = -1;
1231 static int hf_nfapi_mbsfn_area_id = -1;
1232 static int hf_nfapi_csi_rs_antenna_port_count_r10 = -1;
1233 static int hf_nfapi_ul_config_pdu_type = -1;
1234 static int hf_nfapi_rach_prach_frequency_resources = -1;
1235 static int hf_nfapi_srs_present = -1;
1236 static int hf_nfapi_handle = -1;
1237 static int hf_nfapi_pucch_index = -1;
1238 static int hf_nfapi_size = -1;
1239 static int hf_nfapi_resource_block_start = -1;
1240 static int hf_nfapi_number_of_resource_blocks = -1;
1241 static int hf_nfapi_cyclic_shift_2_for_drms = -1;
1242 static int hf_nfapi_frequency_hopping_enabled_flag = -1;
1243 static int hf_nfapi_frequency_hopping_bits = -1;
1244 static int hf_nfapi_new_data_indication = -1;
1245 static int hf_nfapi_harq_process_number = -1;
1246 static int hf_nfapi_ul_tx_mode = -1;
1247 static int hf_nfapi_current_tx_nb = -1;
1248 static int hf_nfapi_n_srs = -1;
1249 static int hf_nfapi_disable_sequence_hopping_flag = -1;
1250 static int hf_nfapi_dl_cqi_pmi_size_rank_1 = -1;
1251 static int hf_nfapi_dl_cqi_pmi_size_rank_greater_1 = -1;
1252 static int hf_nfapi_ri_size = -1;
1253 static int hf_nfapi_delta_offset_cqi = -1;
1254 static int hf_nfapi_delta_offset_ri = -1;
1255 static int hf_nfapi_harq_size = -1;
1256 static int hf_nfapi_delta_offset_harq = -1;
1257 static int hf_nfapi_tdd_ack_nack_mode = -1;
1258 static int hf_nfapi_fdd_ack_nack_mode = -1;
1259 static int hf_nfapi_n_srs_initial = -1;
1260 static int hf_nfapi_initial_number_of_resource_blocks = -1;
1261 static int hf_nfapi_dl_cqi_pmi_size = -1;
1262 static int hf_nfapi_report_type = -1;
1263 static int hf_nfapi_dl_cqi_ri_pmi_size = -1;
1264 static int hf_nfapi_control_type = -1;
1265 static int hf_nfapi_number_of_cc = -1;
1266 static int hf_nfapi_virtual_cell_id_enabled_flag = -1;
1267 static int hf_nfapi_npusch_identity = -1;
1268 static int hf_nfapi_ndrms_csh_identity = -1;
1269 static int hf_nfapi_total_number_of_repetitions = -1;
1270 static int hf_nfapi_repetition_number = -1;
1271 static int hf_nfapi_initial_sf_io = -1;
1272 static int hf_nfapi_empty_symbols_due_to_retunning = -1;
1273 static int hf_nfapi_dl_cqi_ri_pmi_size_2 = -1;
1274 static int hf_nfapi_npucch_identity = -1;
1275 static int hf_nfapi_harq_size_2 = -1;
1276 static int hf_nfapi_delta_offset_harq_2 = -1;
1277 static int hf_nfapi_empty_symbols = -1;
1278 static int hf_nfapi_csi_mode = -1;
1279 static int hf_nfapi_dl_cqi_pmi_size_2 = -1;
1280 static int hf_nfapi_statring_prb = -1;
1281 static int hf_nfapi_cdm_index = -1;
1282 static int hf_nfapi_nsrs = -1;
1283 static int hf_nfapi_num_ant_ports = -1;
1284 static int hf_nfapi_n_pucch_2_0 = -1;
1285 static int hf_nfapi_n_pucch_2_1 = -1;
1286 static int hf_nfapi_n_pucch_2_2 = -1;
1287 static int hf_nfapi_n_pucch_2_3 = -1;
1288 static int hf_nfapi_starting_prb = -1;
1289 static int hf_nfapi_antenna_port = -1;
1290 static int hf_nfapi_number_of_combs = -1;
1291 static int hf_nfapi_number_of_pucch_resource = -1;
1292 static int hf_nfapi_pucch_index_p1 = -1;
1293 static int hf_nfapi_n_pucch_1_0 = -1;
1294 static int hf_nfapi_n_pucch_1_1 = -1;
1295 static int hf_nfapi_n_pucch_1_2 = -1;
1296 static int hf_nfapi_n_pucch_1_3 = -1;
1297 static int hf_nfapi_srs_bandwidth = -1;
1298 static int hf_nfapi_frequency_domain_position = -1;
1299 static int hf_nfapi_srs_hopping_bandwidth = -1;
1300 static int hf_nfapi_transmission_comb = -1;
1301 static int hf_nfapi_i_srs = -1;
1302 static int hf_nfapi_sounding_reference_cyclic_shift = -1;
1303 static int hf_nfapi_pdu_length = -1;
1304 static int hf_nfapi_crc_flag = -1;
1305 static int hf_nfapi_number_of_hi_pdus = -1;
1306 static int hf_nfapi_number_of_dci_pdus = -1;
1307 static int hf_nfapi_hi_dci0_pdu_type = -1;
1308 static int hf_nfapi_hi_value = -1;
1309 static int hf_nfapi_i_phich = -1;
1310 static int hf_nfapi_flag_tb2 = -1;
1311 static int hf_nfapi_hi_value_2 = -1;
1312 static int hf_nfapi_ue_tx_antenna_selection = -1;
1313 static int hf_nfapi_cqi_csi_request = -1;
1314 static int hf_nfapi_ul_index = -1;
1315 static int hf_nfapi_dl_assignment_index = -1;
1316 static int hf_nfapi_tpc_bitmap = -1;
1317 static int hf_nfapi_new_data_indication_two = -1;
1318 static int hf_nfapi_size_of_cqi_csi_field = -1;
1319 static int hf_nfapi_resource_allocation_flag = -1;
1320 static int hf_nfapi_number_of_antenna_ports = -1;
1321 static int hf_nfapi_n_ul_rb = -1;
1322 static int hf_nfapi_pscch_resource = -1;
1323 static int hf_nfapi_time_resource_pattern = -1;
1324 static int hf_nfapi_mpdcch_transmission_type = -1;
1325 static int hf_nfapi_drms_scrambling_init = -1;
1326 static int hf_nfapi_pusch_repetition_levels = -1;
1327 static int hf_nfapi_frequency_hopping_flag = -1;
1328 static int hf_nfapi_csi_request = -1;
1329 static int hf_nfapi_dai_presence_flag = -1;
1330 static int hf_nfapi_total_dci_length_include_padding = -1;
1331 static int hf_nfapi_data_offset = -1;
1332 static int hf_nfapi_ul_cqi = -1;
1333 static int hf_nfapi_timing_advance_r9 = -1;
1334 static int hf_nfapi_timing_advance = -1;
1335 static int hf_nfapi_harq_data_value_0 = -1;
1336 static int hf_nfapi_harq_data_value_0_special = -1;
1337 static int hf_nfapi_harq_data_value_1 = -1;
1338 static int hf_nfapi_harq_data_value_2 = -1;
1339 static int hf_nfapi_harq_data_value_3 = -1;
1340 static int hf_nfapi_tdd_harq_mode = -1;
1341 static int hf_nfapi_fdd_harq_mode = -1;
1342 static int hf_nfapi_number_of_ack_nack = -1;
1343 static int hf_nfapi_harq_tb_1 = -1;
1344 static int hf_nfapi_harq_tb_2 = -1;
1345 static int hf_nfapi_harq_tb_n = -1;
1346 static int hf_nfapi_channel = -1;
1347 static int hf_nfapi_ri = -1;
1348 static int hf_nfapi_number_of_cc_reported = -1;
1349 static int hf_nfapi_preamble = -1;
1350 static int hf_nfapi_rach_resource_type = -1;
1351 static int hf_nfapi_snr = -1;
1352 static int hf_nfapi_doppler_estimation = -1;
1353 static int hf_nfapi_rb_start = -1;
1354 static int hf_nfapi_up_pts_symbol = -1;
1355 static int hf_nfapi_number_prb_per_subband = -1;
1356 static int hf_nfapi_number_antennas = -1;
1357 static int hf_nfapi_subband_index = -1;
1358 static int hf_nfapi_channel_coefficient = -1;
1359 static int hf_nfapi_ul_rtoa = -1;
1360 static int hf_nfapi_mp_cca = -1;
1361 static int hf_nfapi_n_cca = -1;
1362 static int hf_nfapi_offset = -1;
1363 static int hf_nfapi_lte_txop_sf = -1;
1364 static int hf_nfapi_txop_sfn_sf_end = -1;
1365 static int hf_nfapi_lbt_mode = -1;
1366 static int hf_nfapi_sfn_sf_end = -1;
1367 static int hf_nfapi_result = -1;
1368 static int hf_nfapi_txop_symbols = -1;
1369 static int hf_nfapi_initial_partial_sf = -1;
1370 static int hf_nfapi_frequency_band_indicator = -1;
1371 static int hf_nfapi_measurement_period = -1;
1372 static int hf_nfapi_bandwidth = -1;
1373 static int hf_nfapi_timeout = -1;
1374 static int hf_nfapi_number_of_earfcns = -1;
1375 static int hf_nfapi_uarfcn = -1;
1376 static int hf_nfapi_number_of_uarfcns = -1;
1377 static int hf_nfapi_arfcn = -1;
1378 static int hf_nfapi_arfcn_direction = -1;
1379 static int hf_nfapi_number_of_arfcns = -1;
1380 static int hf_nfapi_rssi = -1;
1381 static int hf_nfapi_number_of_rssi = -1;
1382 static int hf_nfapi_pci = -1;
1383 static int hf_nfapi_measurement_bandwidth = -1;
1384 static int hf_nfapi_exhaustive_search = -1;
1385 static int hf_nfapi_number_of_pci = -1;
1386 static int hf_nfapi_psc = -1;
1387 static int hf_nfapi_number_of_psc = -1;
1388 static int hf_nfapi_rsrp = -1;
1389 static int hf_nfapi_rsrq = -1;
1390 static int hf_nfapi_number_of_lte_cells_found = -1;
1391 static int hf_nfapi_rscp = -1;
1392 static int hf_nfapi_enco = -1;
1393 static int hf_nfapi_number_of_utran_cells_found = -1;
1394 static int hf_nfapi_bsic = -1;
1395 static int hf_nfapi_rxlev = -1;
1396 static int hf_nfapi_rxqual = -1;
1397 static int hf_nfapi_sfn_offset = -1;
1398 static int hf_nfapi_number_of_geran_cells_found = -1;
1399 static int hf_nfapi_number_of_tx_antenna = -1;
1400 static int hf_nfapi_mib = -1;
1401 static int hf_nfapi_phich_configuration = -1;
1402 static int hf_nfapi_retry_count = -1;
1403 static int hf_nfapi_sib1 = -1;
1404 static int hf_nfapi_si_periodicity = -1;
1405 static int hf_nfapi_si_index = -1;
1406 static int hf_nfapi_number_of_si_periodicity = -1;
1407 static int hf_nfapi_si_window_length = -1;
1408 static int hf_nfapi_sib_type = -1;
1409 static int hf_nfapi_sib = -1;
1410 static int hf_nfapi_si = -1;
1411 static int hf_nfapi_pnf_search_state = -1;
1412 static int hf_nfapi_pnf_broadcast_state = -1;
1413
1414 static const value_string message_id_vals[] =
1415 {
1416 { NFAPI_DL_CONFIG_REQUEST_MSG_ID, "DL_CONFIG.request" },
1417 { NFAPI_UL_CONFIG_REQUEST_MSG_ID, "UL_CONFIG.request" },
1418 { NFAPI_SUBFRAME_INDICATION_MSG_ID, "SUBFRAME_INDICATION" },
1419 { NFAPI_HI_DCI0_REQUEST_MSG_ID, "HI_DCI0.request" },
1420 { NFAPI_TX_REQUEST_MSG_ID, "TX.request" },
1421 { NFAPI_HARQ_INDICATION_MSG_ID, "HARQ.indication" },
1422 { NFAPI_CRC_INDICATION_MSG_ID, "CRC.indication" },
1423 { NFAPI_RX_ULSCH_INDICATION_MSG_ID, "RX_ULSCH.indication" },
1424 { NFAPI_RACH_INDICATION_MSG_ID, "RACH.indication" },
1425 { NFAPI_SRS_INDICATION_MSG_ID, "SRS.indication" },
1426 { NFAPI_RX_SR_INDICATION_MSG_ID, "RX_SR.indication" },
1427 { NFAPI_RX_CQI_INDICATION_MSG_ID, "RX_CQI.indication" },
1428 { NFAPI_LBT_DL_CONFIG_REQUEST_MSG_ID, "LBT_DL_CONFIG.request" },
1429 { NFAPI_LBT_DL_INDICATION_MSG_ID, "LBT_DL.indication" },
1430
1431 { NFAPI_PNF_PARAM_REQUEST_MSG_ID, "PNF_PARAM.request" },
1432 { NFAPI_PNF_PARAM_RESPONSE_MSG_ID, "PNF_PARAM.response" },
1433 { NFAPI_PNF_CONFIG_REQUEST_MSG_ID, "PNF_CONFIG.request" },
1434 { NFAPI_PNF_CONFIG_RESPONSE_MSG_ID, "PNF_CONFIG.response" },
1435 { NFAPI_PNF_START_REQUEST_MSG_ID, "PNF_START.request" },
1436 { NFAPI_PNF_START_RESPONSE_MSG_ID, "PNF_START.response" },
1437 { NFAPI_PNF_STOP_REQUEST_MSG_ID, "PNF_STOP.request" },
1438 { NFAPI_PNF_STOP_RESPONSE_MSG_ID, "PNF_STOP.response" },
1439 { NFAPI_PARAM_REQUEST_MSG_ID, "PARAM.request" },
1440 { NFAPI_PARAM_RESPONSE_MSG_ID, "PARAM.response" },
1441 { NFAPI_CONFIG_REQUEST_MSG_ID, "CONFIG.request" },
1442 { NFAPI_CONFIG_RESPONSE_MSG_ID, "CONFIG.response" },
1443 { NFAPI_START_REQUEST_MSG_ID, "START.request" },
1444 { NFAPI_START_RESPONSE_MSG_ID, "START.response" },
1445 { NFAPI_STOP_REQUEST_MSG_ID, "STOP.request" },
1446 { NFAPI_STOP_RESPONSE_MSG_ID, "STOP.response" },
1447 { NFAPI_MEASUREMENT_REQUEST_MSG_ID, "MEASUREMENT.request" },
1448 { NFAPI_MEASUREMENT_RESPONSE_MSG_ID, "MEASUREMENT.response" },
1449
1450 { NFAPI_DL_NODE_SYNC_MSG_ID, "UL_NODE_SYNC" },
1451 { NFAPI_UL_NODE_SYNC_MSG_ID, "DL_NODE_SYNC" },
1452 { NFAPI_TIMING_INFO_MSG_ID, "TIMING_INFO" },
1453
1454 { NFAPI_RSSI_REQUEST_MSG_ID, "RSSI.request" },
1455 { NFAPI_RSSI_RESPONSE_MSG_ID, "RSSI.response" },
1456 { NFAPI_RSSI_INDICATION_MSG_ID, "RSSI.indication" },
1457 { NFAPI_CELL_SEARCH_REQUEST_MSG_ID, "CELL_SEARCH.request" },
1458 { NFAPI_CELL_SEARCH_RESPONSE_MSG_ID, "CELL_SEARCH.response" },
1459 { NFAPI_CELL_SEARCH_INDICATION_MSG_ID, "CELL_SEARCH.indication" },
1460 { NFAPI_BROADCAST_DETECT_REQUEST_MSG_ID, "BROADCAST_DETECT.request" },
1461 { NFAPI_BROADCAST_DETECT_RESPONSE_MSG_ID, "BROADCAST_DETECT.response" },
1462 { NFAPI_BROADCAST_DETECT_INDICATION_MSG_ID, "BROADCAST_DETECT.indication" },
1463 { NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST_MSG_ID, "SYSTEM_INFORMATION_SCHEDULE.request" },
1464 { NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE_MSG_ID, "SYSTEM_INFORMATION_SCHEDULE.response" },
1465 { NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION_MSG_ID, "SYSTEM_INFORMATION_SCHEDULE.indication" },
1466 { NFAPI_SYSTEM_INFORMATION_REQUEST_MSG_ID, "SYSTEM_INFORMATION.request" },
1467 { NFAPI_SYSTEM_INFORMATION_RESPONSE_MSG_ID, "SYSTEM_INFORMATION.response" },
1468 { NFAPI_SYSTEM_INFORMATION_INDICATION_MSG_ID, "SYSTEM_INFORMATION.indication" },
1469 { NFAPI_NMM_STOP_REQUEST_MSG_ID, "NMM_STOP.request" },
1470 { NFAPI_NMM_STOP_RESPONSE_MSG_ID, "NMM_STOP.response" },
1471
1472 { 0, NULL },
1473 };
1474
1475 static dissector_handle_t nfapi_handle;
1476 static dissector_table_t message_table;
1477
1478 static int * const dl_bandwidth_support_fields[] = {
1479 &hf_nfapi_dl_bandwidth_support_6,
1480 &hf_nfapi_dl_bandwidth_support_15,
1481 &hf_nfapi_dl_bandwidth_support_25,
1482 &hf_nfapi_dl_bandwidth_support_50,
1483 &hf_nfapi_dl_bandwidth_support_75,
1484 &hf_nfapi_dl_bandwidth_support_100,
1485 NULL
1486 };
1487
1488 static int * const ul_bandwidth_support_fields[] = {
1489 &hf_nfapi_ul_bandwidth_support_6,
1490 &hf_nfapi_ul_bandwidth_support_15,
1491 &hf_nfapi_ul_bandwidth_support_25,
1492 &hf_nfapi_ul_bandwidth_support_50,
1493 &hf_nfapi_ul_bandwidth_support_75,
1494 &hf_nfapi_ul_bandwidth_support_100,
1495 NULL
1496 };
1497
1498 static int * const maximum_3gpp_release_supported_fields[] = {
1499 &hf_nfapi_maximum_3gpp_release_supported_rel8,
1500 &hf_nfapi_maximum_3gpp_release_supported_rel9,
1501 &hf_nfapi_maximum_3gpp_release_supported_rel10,
1502 &hf_nfapi_maximum_3gpp_release_supported_rel11,
1503 &hf_nfapi_maximum_3gpp_release_supported_rel12,
1504 &hf_nfapi_maximum_3gpp_release_supported_rel13,
1505 &hf_nfapi_dl_bandwidth_support_100,
1506 NULL
1507 };
1508
1509 typedef void(*tlv_decode)(ptvcursor_t * ptvc, packet_info* pinfo);
1510
1511 typedef struct
1512 {
1513 guint16 tag_id;
1514 char* name;
1515 tlv_decode decode;
1516 } tlv_t;
1517
1518 static void dissect_tlv_list(ptvcursor_t * ptvc, packet_info* pinfo, gint len);
1519
dissect_array_value(ptvcursor_t * ptvc,packet_info * pinfo,const char * name,guint32 ett_idx,guint32 count,tlv_decode decode)1520 static void dissect_array_value(ptvcursor_t * ptvc, packet_info* pinfo, const char* name, guint32 ett_idx, guint32 count, tlv_decode decode)
1521 {
1522 guint16 i = 0;
1523
1524 if (count > 0)
1525 {
1526 ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_idx, "%s", name);
1527
1528 for (i = 0; i < count; ++i)
1529 {
1530 ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_idx, "[%d]", i);
1531 decode(ptvc, pinfo);
1532 ptvcursor_pop_subtree(ptvc);
1533 }
1534
1535 ptvcursor_pop_subtree(ptvc);
1536 }
1537 }
1538
dissect_pnf_param_general_value(ptvcursor_t * ptvc,packet_info * pinfo)1539 static void dissect_pnf_param_general_value(ptvcursor_t * ptvc, packet_info* pinfo)
1540 {
1541 proto_item* item;
1542 gint32 test_value;
1543
1544 // nFAPI Sync Mode
1545 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_sync_mode, 1, ENC_BIG_ENDIAN, &test_value);
1546 if (test_value > 2)
1547 {
1548 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nfapi sync mode value [0..2]");
1549 }
1550
1551 // Location Mode
1552 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_location_mode, 1, ENC_BIG_ENDIAN, &test_value);
1553 if (test_value > 3)
1554 {
1555 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid location mode value [0..3]");
1556 }
1557
1558 ptvcursor_add(ptvc, hf_nfapi_location_coordinates, 2, ENC_BIG_ENDIAN|ENC_NA);
1559 ptvcursor_add(ptvc, hf_nfapi_dl_config_timing, 4, ENC_BIG_ENDIAN);
1560 ptvcursor_add(ptvc, hf_nfapi_tx_timing, 4, ENC_BIG_ENDIAN);
1561 ptvcursor_add(ptvc, hf_nfapi_ul_config_timing, 4, ENC_BIG_ENDIAN);
1562 ptvcursor_add(ptvc, hf_nfapi_hi_dci0_timing, 4, ENC_BIG_ENDIAN);
1563 ptvcursor_add(ptvc, hf_nfapi_maximum_number_phys, 2, ENC_BIG_ENDIAN);
1564 ptvcursor_add(ptvc, hf_nfapi_maximum_total_bandwidth, 2, ENC_BIG_ENDIAN);
1565 ptvcursor_add(ptvc, hf_nfapi_maximum_total_number_dl_layers, 1, ENC_BIG_ENDIAN);
1566 ptvcursor_add(ptvc, hf_nfapi_maximum_total_number_ul_layers, 1, ENC_BIG_ENDIAN);
1567
1568 // Shared Bands
1569 item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_shared_bands, 1, ENC_BIG_ENDIAN, &test_value);
1570 if (test_value > 1)
1571 {
1572 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid shared bands value [0..1]");
1573 }
1574
1575 // Shared PA
1576 item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_shared_pa, 1, ENC_BIG_ENDIAN, &test_value);
1577 if (test_value > 1)
1578 {
1579 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid shared pa value [0..1]");
1580 }
1581
1582 ptvcursor_add(ptvc, hf_nfapi_maximum_total_power, 2, ENC_BIG_ENDIAN);
1583 ptvcursor_add(ptvc, hf_nfapi_oui, 3, ENC_HOST_ENDIAN);
1584 }
dissect_pnf_rf_config_instance_value(ptvcursor_t * ptvc,packet_info * pinfo _U_)1585 static void dissect_pnf_rf_config_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
1586 {
1587 ptvcursor_add(ptvc, hf_nfapi_rf_config_index, 2, ENC_BIG_ENDIAN);
1588 }
1589
dissect_pnf_phy_instance_value(ptvcursor_t * ptvc,packet_info * pinfo)1590 static void dissect_pnf_phy_instance_value(ptvcursor_t * ptvc, packet_info* pinfo)
1591 {
1592 proto_item* item;
1593 guint32 array_size, test_value;
1594 guint64 test_value64;
1595
1596 ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN);
1597
1598 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_rfs, 2, ENC_BIG_ENDIAN, &array_size);
1599 dissect_array_value(ptvc, pinfo, "RF Config List", ett_nfapi_pnf_phy, array_size, dissect_pnf_rf_config_instance_value);
1600
1601 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_rf_exclusions, 2, ENC_BIG_ENDIAN, &array_size);
1602 dissect_array_value(ptvc, pinfo, "RF Exclusion List", ett_nfapi_pnf_phy, array_size, dissect_pnf_rf_config_instance_value);
1603
1604 // Downlink Channel Bandwidth Supported
1605 item = proto_tree_add_bitmask_ret_uint64(ptvcursor_tree(ptvc), ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc),
1606 hf_nfapi_downlink_channel_bandwidth_supported, ett_nfapi_downlink_bandwidth_support, dl_bandwidth_support_fields, ENC_BIG_ENDIAN, &test_value64);
1607 if (test_value64 > 0x3F)
1608 {
1609 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink channel bandwidth supported bits [0..0x3F]");
1610 }
1611 ptvcursor_advance(ptvc, 2);
1612
1613 // Uplink Channel Bandwidth Supported
1614 item = proto_tree_add_bitmask_ret_uint64(ptvcursor_tree(ptvc), ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc),
1615 hf_nfapi_uplink_channel_bandwidth_supported, ett_nfapi_uplink_bandwidth_support, ul_bandwidth_support_fields, ENC_BIG_ENDIAN, &test_value64);
1616 if (test_value64 > 0x3F)
1617 {
1618 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid uplink channel bandwidth supported bits [0..0x3F]");
1619 }
1620 ptvcursor_advance(ptvc, 2);
1621
1622 // Number of DL layers supported
1623 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_dl_layers_supported, 1, ENC_BIG_ENDIAN, &test_value);
1624 switch (test_value)
1625 {
1626 case 1:
1627 case 2:
1628 case 4:
1629 case 8:
1630 break;
1631 default:
1632 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of dl layers supported value [1, 2, 4, 8]");
1633 break;
1634 }
1635
1636 // Number of DL layers supported
1637 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_ul_layers_supported, 1, ENC_BIG_ENDIAN, &test_value);
1638 switch (test_value)
1639 {
1640 case 1:
1641 case 2:
1642 case 4:
1643 case 8:
1644 break;
1645 default:
1646 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ul layers supported value [1, 2, 4, 8]");
1647 break;
1648 }
1649
1650 // Maximum 3GPP Release Supported
1651 item = proto_tree_add_bitmask_ret_uint64(ptvcursor_tree(ptvc), ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc),
1652 hf_nfapi_maximum_3gpp_release_supported, ett_nfapi_release_support, maximum_3gpp_release_supported_fields, ENC_BIG_ENDIAN, &test_value64);
1653 if (test_value64 > 0x3F)
1654 {
1655 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid maximum 3GPP release supported value [0..0x3F]");
1656 }
1657 ptvcursor_advance(ptvc, 2);
1658
1659 // NMM Modes Supported
1660 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_nmm_modes_supported, 1, ENC_BIG_ENDIAN, &test_value);
1661 if (test_value > 3)
1662 {
1663 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nmm modes supported value [0..3]");
1664 }
1665 }
1666
dissect_pnf_phy_value(ptvcursor_t * ptvc,packet_info * pinfo)1667 static void dissect_pnf_phy_value(ptvcursor_t * ptvc, packet_info* pinfo)
1668 {
1669 guint32 num_phy;
1670 ptvcursor_add_ret_uint(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN, &num_phy);
1671 dissect_array_value(ptvc, pinfo, "PHY List", ett_nfapi_pnf_phy, num_phy, dissect_pnf_phy_instance_value);
1672 }
1673
dissect_pnf_rf_config_value(ptvcursor_t * ptvc,packet_info * pinfo)1674 static void dissect_pnf_rf_config_value(ptvcursor_t * ptvc, packet_info* pinfo)
1675 {
1676 proto_item* item;
1677 guint32 test_value;
1678
1679 ptvcursor_add(ptvc, hf_nfapi_rf_config_index, 2, ENC_BIG_ENDIAN);
1680 ptvcursor_add(ptvc, hf_nfapi_band, 2, ENC_BIG_ENDIAN);
1681 ptvcursor_add(ptvc, hf_nfapi_maximum_transmit_power, 2, ENC_BIG_ENDIAN);
1682 ptvcursor_add(ptvc, hf_nfapi_minimum_transmit_power, 2, ENC_BIG_ENDIAN);
1683
1684 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_antennas_suppported, 1, ENC_BIG_ENDIAN, &test_value);
1685 switch (test_value)
1686 {
1687 case 1:
1688 case 2:
1689 case 4:
1690 case 8:
1691 break;
1692 default:
1693 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of supported antennas [1, 2, 4, 8]");
1694 break;
1695 }
1696
1697 ptvcursor_add(ptvc, hf_nfapi_minimum_downlink_frequency, 4, ENC_BIG_ENDIAN);
1698 ptvcursor_add(ptvc, hf_nfapi_maximum_downlink_frequency, 4, ENC_BIG_ENDIAN);
1699 ptvcursor_add(ptvc, hf_nfapi_minimum_uplink_frequency, 4, ENC_BIG_ENDIAN);
1700 ptvcursor_add(ptvc, hf_nfapi_maximum_uplink_frequency, 4, ENC_BIG_ENDIAN);
1701 }
1702
1703
dissect_pnf_rf_value(ptvcursor_t * ptvc,packet_info * pinfo)1704 static void dissect_pnf_rf_value(ptvcursor_t * ptvc, packet_info* pinfo)
1705 {
1706 guint32 num_rf;
1707 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_rfs, 2, ENC_BIG_ENDIAN, &num_rf);
1708 dissect_array_value(ptvc, pinfo, "RF List", ett_nfapi_pnf_phy_rf_config, num_rf, dissect_pnf_rf_config_value);
1709 }
1710
dissect_pnf_phy_rel10_instance_value(ptvcursor_t * ptvc,packet_info * pinfo)1711 static void dissect_pnf_phy_rel10_instance_value(ptvcursor_t * ptvc, packet_info* pinfo)
1712 {
1713 proto_item* item;
1714 guint32 test_value;
1715
1716 // PHY Config Index
1717 ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN);
1718
1719 // Transmission mode 7 supported
1720 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_transmission_mode7_supported, 2, ENC_BIG_ENDIAN, &test_value);
1721 if (test_value > 1)
1722 {
1723 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode 7 supported value [0..1]");
1724 }
1725
1726 // Two antennas ports for PUCCH
1727 item = ptvcursor_add_ret_uint(ptvc, hi_nfapi_transmission_mode8_supported, 2, ENC_BIG_ENDIAN, &test_value);
1728 if (test_value > 1)
1729 {
1730 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode 8 supported value [0..1]");
1731 }
1732
1733 // Transmission mode 8 supported
1734 item = ptvcursor_add_ret_uint(ptvc, hi_nfapi_two_antennas_ports_for_pucch, 2, ENC_BIG_ENDIAN, &test_value);
1735 if (test_value > 1)
1736 {
1737 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid two antennas ports for pucch value [0..1]");
1738 }
1739
1740 // Transmission mode 9 supported
1741 item = ptvcursor_add_ret_uint(ptvc, hi_nfapi_transmission_mode_9_supported, 2, ENC_BIG_ENDIAN, &test_value);
1742 if (test_value > 1)
1743 {
1744 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode 9 supported value [0..1]");
1745 }
1746
1747 // Simultaneous PUCCH PUSCH
1748 item = ptvcursor_add_ret_uint(ptvc, hi_nfapi_simultaneous_pucch_pusch, 2, ENC_BIG_ENDIAN, &test_value);
1749 if (test_value > 1)
1750 {
1751 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid simultaneous pucch pusch supported value [0..1]");
1752 }
1753
1754 // Four layer Tx with TM3 and TM4
1755 item = ptvcursor_add_ret_uint(ptvc, hi_nfapi_four_layer_tx_with_tm3_and_tm4, 2, ENC_BIG_ENDIAN, &test_value);
1756 if (test_value > 1)
1757 {
1758 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid four layer tx with tm3 and tm4 value [0..1]");
1759 }
1760 }
1761
dissect_pnf_phy_rel10_value(ptvcursor_t * ptvc,packet_info * pinfo)1762 static void dissect_pnf_phy_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo)
1763 {
1764 guint32 num_phy;
1765 ptvcursor_add_ret_uint(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN, &num_phy);
1766 dissect_array_value(ptvc, pinfo, "PHY Rel 10 List", ett_nfapi_pnf_phy_rel10, num_phy, dissect_pnf_phy_rel10_instance_value);
1767 }
1768
dissect_pnf_phy_rel11_instance_value(ptvcursor_t * ptvc,packet_info * pinfo)1769 static void dissect_pnf_phy_rel11_instance_value(ptvcursor_t * ptvc, packet_info* pinfo)
1770 {
1771 proto_item* item;
1772 guint32 test_value;
1773
1774 // PHY Config Index
1775 ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN);
1776
1777 // ePDCCH supported
1778 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_epdcch_supported, 2, ENC_BIG_ENDIAN, &test_value);
1779 if (test_value > 1)
1780 {
1781 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid epdcch supported value [0..1]");
1782 }
1783
1784 // Multi ACK CSI reporting
1785 item = ptvcursor_add_ret_uint(ptvc, hi_nfapi_multi_ack_csi_reporting, 2, ENC_BIG_ENDIAN, &test_value);
1786 if (test_value > 1)
1787 {
1788 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid multi ack csi reporting value [0..1]");
1789 }
1790
1791 // PUCCH Tx diversity with channel selection
1792 item = ptvcursor_add_ret_uint(ptvc, hi_nfapi_pucch_tx_diversity_with_channel_selection, 2, ENC_BIG_ENDIAN, &test_value);
1793 if (test_value > 1)
1794 {
1795 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch tx diversity with channel selection value [0..1]");
1796 }
1797
1798 // UL CoMP supported
1799 item = ptvcursor_add_ret_uint(ptvc, hi_nfapi_ul_comp_supported, 2, ENC_BIG_ENDIAN, &test_value);
1800 if (test_value > 1)
1801 {
1802 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul comp supported value [0..1]");
1803 }
1804
1805 // Transmission mode 5 supported
1806 item = ptvcursor_add_ret_uint(ptvc, hi_nfapi_transmission_mode_5_supported, 2, ENC_BIG_ENDIAN, &test_value);
1807 if (test_value > 1)
1808 {
1809 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode 5 supported value [0..1]");
1810 }
1811 }
1812
dissect_pnf_phy_rel11_value(ptvcursor_t * ptvc,packet_info * pinfo)1813 static void dissect_pnf_phy_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo)
1814 {
1815 guint32 num_phy;
1816 ptvcursor_add_ret_uint(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN, &num_phy);
1817 dissect_array_value(ptvc, pinfo, "PHY Rel 11 List", ett_nfapi_pnf_phy_rel11, num_phy, dissect_pnf_phy_rel11_instance_value);
1818 }
1819
dissect_pnf_phy_rel12_instance_value(ptvcursor_t * ptvc,packet_info * pinfo)1820 static void dissect_pnf_phy_rel12_instance_value(ptvcursor_t * ptvc, packet_info* pinfo)
1821 {
1822 proto_item* item;
1823 guint32 test_value;
1824
1825 // PHY Config Index
1826 ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN);
1827
1828 // CSI subframe set
1829 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_csi_subframe_set, 2, ENC_BIG_ENDIAN, &test_value);
1830 if (test_value > 1)
1831 {
1832 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi subframe set value [0..1]");
1833 }
1834
1835 // Enhanced 4TX codebook
1836 item = ptvcursor_add_ret_uint(ptvc, hi_nfapi_enhanced_4tx_codebook, 2, ENC_BIG_ENDIAN, &test_value);
1837 if (test_value > 1)
1838 {
1839 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid enhanced 4TX codebook value [0..1]");
1840 }
1841
1842 // DRS supported
1843 item = ptvcursor_add_ret_uint(ptvc, hi_nfapi_drs_supported, 2, ENC_BIG_ENDIAN, &test_value);
1844 if (test_value > 1)
1845 {
1846 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drs supported value [0..1]");
1847 }
1848
1849 // UL 64QAM supported
1850 item = ptvcursor_add_ret_uint(ptvc, hi_nfapi_ul_64qam_supported, 2, ENC_BIG_ENDIAN, &test_value);
1851 if (test_value > 1)
1852 {
1853 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul 64 QAM supported value [0..1]");
1854 }
1855
1856 // Transmission mode 10 supported
1857 item = ptvcursor_add_ret_uint(ptvc, hi_nfapi_transmission_mode_10_supported, 2, ENC_BIG_ENDIAN, &test_value);
1858 if (test_value > 1)
1859 {
1860 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode 10 supported value [0..1]");
1861 }
1862
1863 // Alternative TBS indices
1864 item = ptvcursor_add_ret_uint(ptvc, hi_nfapi_alternative_tbs_indices, 2, ENC_BIG_ENDIAN, &test_value);
1865 if (test_value > 1)
1866 {
1867 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid alternative tbs indices supported value [0..1]");
1868 }
1869 }
1870
dissect_pnf_phy_rel12_value(ptvcursor_t * ptvc,packet_info * pinfo)1871 static void dissect_pnf_phy_rel12_value(ptvcursor_t * ptvc, packet_info* pinfo)
1872 {
1873 guint32 num_phy;
1874 ptvcursor_add_ret_uint(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN, &num_phy);
1875 dissect_array_value(ptvc, pinfo, "PHY Rel 12 List", ett_nfapi_pnf_phy_rel12, num_phy, dissect_pnf_phy_rel12_instance_value);
1876 }
1877
dissect_pnf_phy_rel13_instance_value(ptvcursor_t * ptvc,packet_info * pinfo)1878 static void dissect_pnf_phy_rel13_instance_value(ptvcursor_t * ptvc, packet_info* pinfo)
1879 {
1880 proto_item* item;
1881 guint32 test_value;
1882
1883 // PHY Config Index
1884 ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN);
1885
1886 // PUCCH format 4 supported
1887 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_pucch_format_4_supported, 2, ENC_BIG_ENDIAN, &test_value);
1888 if (test_value > 1)
1889 {
1890 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch format 4 supported value [0..1]");
1891 }
1892
1893 // PUCCH format 5 supported
1894 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_pucch_format_5_supported, 2, ENC_BIG_ENDIAN, &test_value);
1895 if (test_value > 1)
1896 {
1897 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch format 5 supported value [0..1]");
1898 }
1899
1900 // More than 5 CA support
1901 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_more_than_5_ca_supported, 2, ENC_BIG_ENDIAN, &test_value);
1902 if (test_value > 1)
1903 {
1904 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid more than 5 ca supported value [0..1]");
1905 }
1906
1907 // LAA supported
1908 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_laa_supported, 2, ENC_BIG_ENDIAN, &test_value);
1909 if (test_value > 1)
1910 {
1911 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid laa supported value [0..1]");
1912 }
1913
1914 // LAA ending in DwPTS supported
1915 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_laa_ending_in_dwpts_supported, 2, ENC_BIG_ENDIAN, &test_value);
1916 if (test_value > 1)
1917 {
1918 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid laa ending in dwpts supported value [0..1]");
1919 }
1920
1921 // LAA starting in second slot Supported
1922 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_laa_starting_in_second_slot_supported, 2, ENC_BIG_ENDIAN, &test_value);
1923 if (test_value > 1)
1924 {
1925 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid laa starting in second slot supported value [0..1]");
1926 }
1927
1928 // Beamforming Supported
1929 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_beamforming_supported, 2, ENC_BIG_ENDIAN, &test_value);
1930 if (test_value > 1)
1931 {
1932 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid beamforming supported value [0..1]");
1933 }
1934
1935 // CSI-RS enhancements supported
1936 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_csi_rs_enhancements_supported, 2, ENC_BIG_ENDIAN, &test_value);
1937 if (test_value > 1)
1938 {
1939 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi rs enhancements supported value [0..1]");
1940 }
1941
1942 // DMRS enhancements supported
1943 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_drms_enhancements_supported, 2, ENC_BIG_ENDIAN, &test_value);
1944 if (test_value > 1)
1945 {
1946 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms enhancements supported value [0..1]");
1947 }
1948
1949 // SRS enhancements supported
1950 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_srs_enhancements_supported, 2, ENC_BIG_ENDIAN, &test_value);
1951 if (test_value > 1)
1952 {
1953 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs enhancements supported value [0..1]");
1954 }
1955
1956 }
1957
dissect_pnf_phy_rel13_value(ptvcursor_t * ptvc,packet_info * pinfo)1958 static void dissect_pnf_phy_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo)
1959 {
1960 guint32 num_phy;
1961 ptvcursor_add_ret_uint(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN, &num_phy);
1962 dissect_array_value(ptvc, pinfo, "PHY Rel 13 List", ett_nfapi_pnf_phy_rel13, num_phy, dissect_pnf_phy_rel13_instance_value);
1963 }
1964
dissect_pnf_phy_rf_config_instance_value(ptvcursor_t * ptvc,packet_info * pinfo _U_)1965 static void dissect_pnf_phy_rf_config_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
1966 {
1967 ptvcursor_add(ptvc, hf_nfapi_phy_rf_config_info_phy_id, 2, ENC_BIG_ENDIAN);
1968 ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN);
1969 ptvcursor_add(ptvc, hf_nfapi_rf_config_index, 2, ENC_BIG_ENDIAN);
1970 }
dissect_pnf_phy_rf_config_value(ptvcursor_t * ptvc,packet_info * pinfo)1971 static void dissect_pnf_phy_rf_config_value(ptvcursor_t * ptvc, packet_info* pinfo)
1972 {
1973 guint32 num_configs;
1974 ptvcursor_add_ret_uint(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN, &num_configs);
1975 dissect_array_value(ptvc, pinfo, "PHY RF Config List", ett_nfapi_pnf_phy_rf_config, num_configs, dissect_pnf_phy_rf_config_instance_value);
1976 }
1977
dissect_dl_rs_tx_power_value(ptvcursor_t * ptvc,packet_info * pinfo)1978 static void dissect_dl_rs_tx_power_value(ptvcursor_t * ptvc, packet_info* pinfo)
1979 {
1980 guint32 test_value;
1981 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_dl_rs_tx_power, 2, ENC_BIG_ENDIAN, &test_value);
1982
1983 if (!(test_value >= 1 && test_value <= 255))
1984 {
1985 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value [1..255]");
1986 }
1987 }
dissect_received_interference_power_value(ptvcursor_t * ptvc,packet_info * pinfo)1988 static void dissect_received_interference_power_value(ptvcursor_t * ptvc, packet_info* pinfo)
1989 {
1990 guint32 test_value;
1991 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_received_interference_power, 2, ENC_BIG_ENDIAN, &test_value);
1992
1993 if (!(test_value >= 1 && test_value <= 255))
1994 {
1995 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value [1..255]");
1996 }
1997 }
dissect_thermal_noise_power_value(ptvcursor_t * ptvc,packet_info * pinfo _U_)1998 static void dissect_thermal_noise_power_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
1999 {
2000 ptvcursor_add(ptvc, hf_nfapi_thermal_noise_power, 2, ENC_BIG_ENDIAN);
2001 }
dissect_dl_rs_tx_power_measurement_value(ptvcursor_t * ptvc,packet_info * pinfo _U_)2002 static void dissect_dl_rs_tx_power_measurement_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
2003 {
2004 ptvcursor_add(ptvc, hf_nfapi_dl_rs_tx_power_measurement, 2, ENC_BIG_ENDIAN);
2005 }
2006
dissect_received_interference_power_result_value(ptvcursor_t * ptvc,packet_info * pinfo _U_)2007 static void dissect_received_interference_power_result_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
2008 {
2009 ptvcursor_add(ptvc, hf_nfapi_received_interference_power_measurement, 2, ENC_BIG_ENDIAN);
2010 }
dissect_received_interference_power_measurement_value(ptvcursor_t * ptvc,packet_info * pinfo)2011 static void dissect_received_interference_power_measurement_value(ptvcursor_t * ptvc, packet_info* pinfo)
2012 {
2013 guint32 num_resource_block;
2014 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_resource_blocks, 2, ENC_BIG_ENDIAN, &num_resource_block);
2015 dissect_array_value(ptvc, pinfo, "Results", ett_nfapi_received_interference_power_mesurement_results, num_resource_block, dissect_received_interference_power_result_value);
2016 }
dissect_thermal_noise_power_measurement_value(ptvcursor_t * ptvc,packet_info * pinfo _U_)2017 static void dissect_thermal_noise_power_measurement_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
2018 {
2019 ptvcursor_add(ptvc, hf_nfapi_thermal_noise_power_measurement, 2, ENC_BIG_ENDIAN);
2020 }
dissect_duplex_mode_value(ptvcursor_t * ptvc,packet_info * pinfo)2021 static void dissect_duplex_mode_value(ptvcursor_t * ptvc, packet_info* pinfo)
2022 {
2023 guint32 test_value;
2024 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_duplex_mode, 2, ENC_BIG_ENDIAN, &test_value);
2025
2026 if (test_value > 2)
2027 {
2028 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid duplex mode [0..2]");
2029 }
2030 }
dissect_pcfich_power_offset_value(ptvcursor_t * ptvc,packet_info * pinfo)2031 static void dissect_pcfich_power_offset_value(ptvcursor_t* ptvc, packet_info *pinfo)
2032 {
2033 guint32 test_value;
2034 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_pcfich_power_offset, 2, ENC_BIG_ENDIAN, &test_value);
2035
2036 if (test_value > 10000)
2037 {
2038 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid power level [0..10000]");
2039 }
2040 }
dissect_pb_value(ptvcursor_t * ptvc,packet_info * pinfo)2041 static void dissect_pb_value(ptvcursor_t * ptvc, packet_info* pinfo)
2042 {
2043 guint32 test_value;
2044 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_pb, 2, ENC_BIG_ENDIAN, &test_value);
2045
2046 if (test_value > 3)
2047 {
2048 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink power allocation Index [0..3]");
2049 }
2050 }
2051
dissect_dl_cyclic_prefix_value(ptvcursor_t * ptvc,packet_info * pinfo)2052 static void dissect_dl_cyclic_prefix_value(ptvcursor_t * ptvc, packet_info* pinfo)
2053 {
2054 gint32 test_value;
2055 proto_item* item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_dl_cyclic_prefix_type, 2, ENC_BIG_ENDIAN, &test_value);
2056
2057 if (test_value > 1)
2058 {
2059 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dl cyclic prefix type [0..1]");
2060 }
2061 }
dissect_ul_cyclic_prefix_value(ptvcursor_t * ptvc,packet_info * pinfo)2062 static void dissect_ul_cyclic_prefix_value(ptvcursor_t * ptvc, packet_info* pinfo)
2063 {
2064 gint32 test_value;
2065 proto_item* item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_ul_cyclic_prefix_type, 2, ENC_BIG_ENDIAN, &test_value);
2066
2067 if (test_value > 1)
2068 {
2069 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul cyclic prefix type [0..1]");
2070 }
2071 }
dissect_dl_channel_bandwidth_value(ptvcursor_t * ptvc,packet_info * pinfo)2072 static void dissect_dl_channel_bandwidth_value(ptvcursor_t * ptvc, packet_info* pinfo)
2073 {
2074 guint32 test_value;
2075 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_downlink_channel_bandwidth, 2, ENC_BIG_ENDIAN, &test_value);
2076
2077 if (!(test_value == 6 || test_value == 15 || test_value == 25 || test_value == 50 || test_value == 75 || test_value == 100))
2078 {
2079 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink bandwidth value [6, 15, 25, 50, 75, 100]");
2080 }
2081 }
dissect_ul_channel_bandwidth_value(ptvcursor_t * ptvc,packet_info * pinfo)2082 static void dissect_ul_channel_bandwidth_value(ptvcursor_t * ptvc, packet_info* pinfo)
2083 {
2084 guint32 test_value;
2085 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_uplink_channel_bandwidth, 2, ENC_BIG_ENDIAN, &test_value);
2086
2087 if (!(test_value == 6 || test_value == 15 || test_value == 25 || test_value == 50 || test_value == 75 || test_value == 100))
2088 {
2089 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid uplink bandwidth value [6, 15, 25, 50, 75, 100]");
2090 }
2091 }
dissect_reference_signal_power_value(ptvcursor_t * ptvc,packet_info * pinfo)2092 static void dissect_reference_signal_power_value(ptvcursor_t * ptvc, packet_info* pinfo)
2093 {
2094 guint32 test_value;
2095 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_reference_signal_power, 2, ENC_BIG_ENDIAN, &test_value);
2096
2097 if (test_value > 255)
2098 {
2099 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid reference signal power [0..255]");
2100 }
2101
2102 }
dissect_tx_antenna_ports_value(ptvcursor_t * ptvc,packet_info * pinfo)2103 static void dissect_tx_antenna_ports_value(ptvcursor_t * ptvc, packet_info* pinfo)
2104 {
2105 guint32 test_value;
2106 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_tx_antenna_ports, 2, ENC_BIG_ENDIAN, &test_value);
2107
2108 if (!(test_value == 1 || test_value == 2 || test_value == 4 || test_value == 8 || test_value == 16))
2109 {
2110 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tx antenna ports value [1, 2, 4, 8, 16]");
2111 }
2112 }
dissect_rx_antenna_ports_value(ptvcursor_t * ptvc,packet_info * pinfo)2113 static void dissect_rx_antenna_ports_value(ptvcursor_t * ptvc, packet_info* pinfo)
2114 {
2115 guint32 test_value;
2116 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_rx_antenna_ports, 2, ENC_BIG_ENDIAN, &test_value);
2117
2118 if (!(test_value == 1 || test_value == 2 || test_value == 4 || test_value == 8 || test_value == 16))
2119 {
2120 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rx antenna ports value [1, 2, 4, 8, 16]");
2121 }
2122 }
dissect_phich_resource_value(ptvcursor_t * ptvc,packet_info * pinfo)2123 static void dissect_phich_resource_value(ptvcursor_t * ptvc, packet_info* pinfo)
2124 {
2125 guint32 test_value;
2126 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_phich_resource, 2, ENC_BIG_ENDIAN, &test_value);
2127
2128 if (test_value > 3)
2129 {
2130 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid phich resource value [0..3]");
2131 }
2132 }
dissect_phich_duration_value(ptvcursor_t * ptvc,packet_info * pinfo)2133 static void dissect_phich_duration_value(ptvcursor_t * ptvc, packet_info* pinfo)
2134 {
2135 gint32 test_value;
2136 proto_item* item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_phich_duration, 2, ENC_BIG_ENDIAN, &test_value);
2137
2138 if (test_value > 1)
2139 {
2140 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid phich duration value [0..1]");
2141 }
2142 }
dissect_phich_power_offset_value(ptvcursor_t * ptvc,packet_info * pinfo)2143 static void dissect_phich_power_offset_value(ptvcursor_t * ptvc, packet_info* pinfo)
2144 {
2145 guint32 test_value;
2146 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_phich_power_offset, 2, ENC_BIG_ENDIAN, &test_value);
2147
2148 if (test_value > 10000)
2149 {
2150 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid phich power offset value [0..10000]");
2151 }
2152 }
dissect_psch_synch_signal_epre_eprers_value(ptvcursor_t * ptvc,packet_info * pinfo)2153 static void dissect_psch_synch_signal_epre_eprers_value(ptvcursor_t * ptvc, packet_info* pinfo)
2154 {
2155 guint32 test_value;
2156 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_primary_synchronization_signal_epre_eprers, 2, ENC_BIG_ENDIAN, &test_value);
2157
2158 if (test_value > 10000)
2159 {
2160 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid primary synchronization signal epre/eprers value [0..10000]");
2161 }
2162 }
dissect_physical_cell_id_value(ptvcursor_t * ptvc,packet_info * pinfo)2163 static void dissect_physical_cell_id_value(ptvcursor_t * ptvc, packet_info* pinfo)
2164 {
2165 guint32 test_value;
2166 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_physical_cell_id, 2, ENC_BIG_ENDIAN, &test_value);
2167
2168 if (test_value > 503)
2169 {
2170 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid physical cell id [0..503]");
2171 }
2172 }
dissect_ssch_synch_signal_epre_eprers_value(ptvcursor_t * ptvc,packet_info * pinfo)2173 static void dissect_ssch_synch_signal_epre_eprers_value(ptvcursor_t * ptvc, packet_info* pinfo)
2174 {
2175 guint32 test_value;
2176 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_secondary_synchronization_signal_epre_eprers, 2, ENC_BIG_ENDIAN, &test_value);
2177
2178 if (test_value > 10000)
2179 {
2180 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid secondary synchronization signal epre/eprers value [0..10000]");
2181 }
2182 }
dissect_prach_configuration_index_value(ptvcursor_t * ptvc,packet_info * pinfo)2183 static void dissect_prach_configuration_index_value(ptvcursor_t * ptvc, packet_info* pinfo)
2184 {
2185 guint32 test_value;
2186 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_configuration_index, 2, ENC_BIG_ENDIAN, &test_value);
2187
2188 if (test_value > 63)
2189 {
2190 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach configuration Index [0..63]");
2191 }
2192 }
dissect_prach_root_sequence_index_value(ptvcursor_t * ptvc,packet_info * pinfo)2193 static void dissect_prach_root_sequence_index_value(ptvcursor_t * ptvc, packet_info* pinfo)
2194 {
2195 guint32 test_value;
2196 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_root_sequence_index, 2, ENC_BIG_ENDIAN, &test_value);
2197
2198 if (test_value > 837)
2199 {
2200 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach root sequence Index [0..837]");
2201 }
2202 }
dissect_prach_zero_correlation_zone_configuration_value(ptvcursor_t * ptvc,packet_info * pinfo)2203 static void dissect_prach_zero_correlation_zone_configuration_value(ptvcursor_t * ptvc, packet_info* pinfo)
2204 {
2205 guint32 test_value;
2206 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_zero_correlation_zone_configuration, 2, ENC_BIG_ENDIAN, &test_value);
2207
2208 // How do differentiate between fdd 0..6 and tdd 0..15 ranges?
2209 if (test_value > 15)
2210 {
2211 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid zero correlation zone configuration [0..15]");
2212 }
2213 }
dissect_prach_high_speed_flag_value(ptvcursor_t * ptvc,packet_info * pinfo)2214 static void dissect_prach_high_speed_flag_value(ptvcursor_t * ptvc, packet_info* pinfo)
2215 {
2216 gint32 test_value;
2217 proto_item* item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_high_speed_flag, 2, ENC_BIG_ENDIAN, &test_value);
2218
2219 if (test_value > 1)
2220 {
2221 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid high speed flag value [0..1]");
2222 }
2223 }
dissect_prach_frequency_offset_value(ptvcursor_t * ptvc,packet_info * pinfo)2224 static void dissect_prach_frequency_offset_value(ptvcursor_t * ptvc, packet_info* pinfo)
2225 {
2226 guint32 test_value;
2227 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_frequency_offset, 2, ENC_BIG_ENDIAN, &test_value);
2228
2229 // How to determine the ul channel bandwidth?
2230 if (test_value > (100 -6))
2231 {
2232 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach frequency offset value [0..94]");
2233 }
2234 }
dissect_pusch_hopping_mode_value(ptvcursor_t * ptvc,packet_info * pinfo)2235 static void dissect_pusch_hopping_mode_value(ptvcursor_t * ptvc, packet_info* pinfo)
2236 {
2237 gint32 test_value;
2238 proto_item* item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_hopping_mode, 2, ENC_BIG_ENDIAN, &test_value);
2239
2240 if (test_value > 1)
2241 {
2242 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pusch hopping mode value [0..1]");
2243 }
2244 }
dissect_pusch_hopping_offset_value(ptvcursor_t * ptvc,packet_info * pinfo)2245 static void dissect_pusch_hopping_offset_value(ptvcursor_t * ptvc, packet_info* pinfo)
2246 {
2247 guint32 test_value;
2248 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_hopping_offset, 2, ENC_BIG_ENDIAN, &test_value);
2249
2250 if (test_value > 98)
2251 {
2252 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pusch hopping offset value [0..98]");
2253 }
2254 }
dissect_pusch_number_of_subbands_value(ptvcursor_t * ptvc,packet_info * pinfo)2255 static void dissect_pusch_number_of_subbands_value(ptvcursor_t * ptvc, packet_info* pinfo)
2256 {
2257 guint32 test_value;
2258 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_subbands, 2, ENC_BIG_ENDIAN, &test_value);
2259
2260 if (!(test_value >= 1 && test_value <= 4))
2261 {
2262 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of sub-bands [1..4]");
2263 }
2264 }
dissect_pucch_delta_pucch_shift_value(ptvcursor_t * ptvc,packet_info * pinfo)2265 static void dissect_pucch_delta_pucch_shift_value(ptvcursor_t * ptvc, packet_info* pinfo)
2266 {
2267 guint32 test_value;
2268 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_delta_pucch_shift, 2, ENC_BIG_ENDIAN, &test_value);
2269
2270 if (!(test_value >= 1 && test_value <= 3))
2271 {
2272 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta pucch shift [1..3]");
2273 }
2274 }
dissect_pucch_n_cqi_rb_value(ptvcursor_t * ptvc,packet_info * pinfo)2275 static void dissect_pucch_n_cqi_rb_value(ptvcursor_t * ptvc, packet_info* pinfo)
2276 {
2277 guint32 test_value;
2278 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_n_cqi_rb, 2, ENC_BIG_ENDIAN, &test_value);
2279
2280 if (test_value > 98)
2281 {
2282 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n cqi rb value [0..98]");
2283 }
2284 }
dissect_pucch_n_an_cs_value(ptvcursor_t * ptvc,packet_info * pinfo)2285 static void dissect_pucch_n_an_cs_value(ptvcursor_t * ptvc, packet_info* pinfo)
2286 {
2287 guint32 test_value;
2288 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_n_an_cs, 2, ENC_BIG_ENDIAN, &test_value);
2289
2290 if (test_value > 7)
2291 {
2292 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n an cs value [0..7]");
2293 }
2294 }
dissect_pucch_n1_pucch_an_value(ptvcursor_t * ptvc,packet_info * pinfo)2295 static void dissect_pucch_n1_pucch_an_value(ptvcursor_t * ptvc, packet_info* pinfo)
2296 {
2297 guint32 test_value;
2298 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_n1_pucch_an, 2, ENC_BIG_ENDIAN, &test_value);
2299
2300 if (test_value > 2047)
2301 {
2302 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n1pucch an value [0..2047]");
2303 }
2304 }
dissect_srs_bandwidth_configuration_value(ptvcursor_t * ptvc,packet_info * pinfo)2305 static void dissect_srs_bandwidth_configuration_value(ptvcursor_t * ptvc, packet_info* pinfo)
2306 {
2307 guint32 test_value;
2308 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_bandwidth_configuration, 2, ENC_BIG_ENDIAN, &test_value);
2309
2310 if (test_value > 7)
2311 {
2312 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs bandwidth configuration value [0..7]");
2313 }
2314 }
dissect_srs_max_uppts_value(ptvcursor_t * ptvc,packet_info * pinfo)2315 static void dissect_srs_max_uppts_value(ptvcursor_t * ptvc, packet_info* pinfo)
2316 {
2317 gint32 test_value;
2318 proto_item* item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_max_up_pts, 2, ENC_BIG_ENDIAN, &test_value);
2319
2320 if (test_value > 1)
2321 {
2322 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid max up pts value [0..1]");
2323 }
2324 }
dissect_srs_subframe_configuration_value(ptvcursor_t * ptvc,packet_info * pinfo)2325 static void dissect_srs_subframe_configuration_value(ptvcursor_t * ptvc, packet_info* pinfo)
2326 {
2327 guint32 test_value;
2328 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_srs_subframe_configuration, 2, ENC_BIG_ENDIAN, &test_value);
2329
2330 if (test_value > 15)
2331 {
2332 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs subframe configuration value [0..15]");
2333 }
2334 }
dissect_srs_acknack_srs_sim_tx_value(ptvcursor_t * ptvc,packet_info * pinfo)2335 static void dissect_srs_acknack_srs_sim_tx_value(ptvcursor_t * ptvc, packet_info* pinfo)
2336 {
2337 gint32 test_value;
2338 proto_item* item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_srs_acknack_srs_simultaneous_transmission, 2, ENC_BIG_ENDIAN, &test_value);
2339
2340 if (test_value > 1)
2341 {
2342 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs ack nack srs simultaneous transmission value [0..1]");
2343 }
2344 }
dissect_uplink_rs_hopping_value(ptvcursor_t * ptvc,packet_info * pinfo)2345 static void dissect_uplink_rs_hopping_value(ptvcursor_t * ptvc, packet_info* pinfo)
2346 {
2347 guint32 test_value;
2348 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_uplink_rs_hopping, 2, ENC_BIG_ENDIAN, &test_value);
2349
2350 if (test_value > 2)
2351 {
2352 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid uplink rs hopping value [0..2]");
2353 }
2354 }
dissect_group_assignment_value(ptvcursor_t * ptvc,packet_info * pinfo)2355 static void dissect_group_assignment_value(ptvcursor_t * ptvc, packet_info* pinfo)
2356 {
2357 guint32 test_value;
2358 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_group_assignment, 2, ENC_BIG_ENDIAN, &test_value);
2359
2360 if (test_value > 29)
2361 {
2362 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid group assignment value [0..29]");
2363 }
2364 }
dissect_cyclic_shift_1_for_drms_value(ptvcursor_t * ptvc,packet_info * pinfo)2365 static void dissect_cyclic_shift_1_for_drms_value(ptvcursor_t * ptvc, packet_info* pinfo)
2366 {
2367 guint32 test_value;
2368 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_cyclic_shift_1_for_drms, 2, ENC_BIG_ENDIAN, &test_value);
2369
2370 if (test_value > 7)
2371 {
2372 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cyclic shift 1 for drms value [0..7]");
2373 }
2374 }
dissect_tdd_subframe_assignment_value(ptvcursor_t * ptvc,packet_info * pinfo)2375 static void dissect_tdd_subframe_assignment_value(ptvcursor_t * ptvc, packet_info* pinfo)
2376 {
2377 guint32 test_value;
2378 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_subframe_assignment, 2, ENC_BIG_ENDIAN, &test_value);
2379
2380 if (test_value > 6)
2381 {
2382 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tdd subframe assignment value [0..6]");
2383 }
2384 }
dissect_tdd_subframe_patterns_value(ptvcursor_t * ptvc,packet_info * pinfo)2385 static void dissect_tdd_subframe_patterns_value(ptvcursor_t * ptvc, packet_info* pinfo)
2386 {
2387 guint32 test_value;
2388 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_special_subframe_patterns, 2, ENC_BIG_ENDIAN, &test_value);
2389
2390 if (test_value > 9)
2391 {
2392 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid special subframe pattern value [0..9]");
2393 }
2394 }
dissect_laa_ed_threashold_for_lbt_for_pdsch_value(ptvcursor_t * ptvc,packet_info * pinfo)2395 static void dissect_laa_ed_threashold_for_lbt_for_pdsch_value(ptvcursor_t * ptvc, packet_info* pinfo)
2396 {
2397 guint32 test_value;
2398 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_ed_threshold_for_lbt_for_pdsch, 2, ENC_BIG_ENDIAN, &test_value);
2399
2400 if (test_value > 70)
2401 {
2402 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ed threshold for ltb for pdsch value [0..70]");
2403 }
2404 }
dissect_laa_ed_threashold_for_lbt_for_drs_value(ptvcursor_t * ptvc,packet_info * pinfo)2405 static void dissect_laa_ed_threashold_for_lbt_for_drs_value(ptvcursor_t * ptvc, packet_info* pinfo)
2406 {
2407 guint32 test_value;
2408 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_ed_threshold_for_lbt_for_drs, 2, ENC_BIG_ENDIAN, &test_value);
2409
2410 if (test_value > 70)
2411 {
2412 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ed threshold for ltb for drs value [0..70]");
2413 }
2414 }
dissect_laa_pd_threshold_value(ptvcursor_t * ptvc,packet_info * pinfo)2415 static void dissect_laa_pd_threshold_value(ptvcursor_t * ptvc, packet_info* pinfo)
2416 {
2417 guint32 test_value;
2418 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_pd_threshold, 2, ENC_BIG_ENDIAN, &test_value);
2419
2420 if (test_value > 70 && test_value != 65535)
2421 {
2422 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pd threshold value [0..70, 65536]");
2423 }
2424 }
dissect_laa_multi_carrier_type_value(ptvcursor_t * ptvc,packet_info * pinfo)2425 static void dissect_laa_multi_carrier_type_value(ptvcursor_t * ptvc, packet_info* pinfo)
2426 {
2427 guint32 test_value;
2428 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_multi_carrier_type, 2, ENC_BIG_ENDIAN, &test_value);
2429
2430 if (test_value > 4)
2431 {
2432 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid multi carrier type [0..4]");
2433 }
2434 }
dissect_laa_multi_carrier_tx_value(ptvcursor_t * ptvc,packet_info * pinfo)2435 static void dissect_laa_multi_carrier_tx_value(ptvcursor_t * ptvc, packet_info* pinfo)
2436 {
2437 gint32 test_value;
2438 proto_item* item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_multi_carrier_tx, 2, ENC_BIG_ENDIAN, &test_value);
2439
2440 if (test_value > 1)
2441 {
2442 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid multi carrier tx value [0..1]");
2443 }
2444 }
dissect_laa_multi_carrier_freeze_value(ptvcursor_t * ptvc,packet_info * pinfo)2445 static void dissect_laa_multi_carrier_freeze_value(ptvcursor_t * ptvc, packet_info* pinfo)
2446 {
2447 gint32 test_value;
2448 proto_item* item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_multi_carrier_freeze, 2, ENC_BIG_ENDIAN, &test_value);
2449
2450 if (test_value > 1)
2451 {
2452 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid multi carrier freeze value [0..1]");
2453 }
2454 }
dissect_laa_tx_antenna_port_for_drs_value(ptvcursor_t * ptvc,packet_info * pinfo)2455 static void dissect_laa_tx_antenna_port_for_drs_value(ptvcursor_t * ptvc, packet_info* pinfo)
2456 {
2457 guint32 test_value;
2458 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_tx_antenna_ports_for_drs, 2, ENC_BIG_ENDIAN, &test_value);
2459
2460 if (!(test_value == 1 || test_value == 2 || test_value == 4))
2461 {
2462 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tx antenna ports for drs value [1, 2, 4]");
2463 }
2464 }
dissect_laa_transmission_power_for_drs_value(ptvcursor_t * ptvc,packet_info * pinfo)2465 static void dissect_laa_transmission_power_for_drs_value(ptvcursor_t * ptvc, packet_info* pinfo)
2466 {
2467 guint32 test_value;
2468 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_transmission_power_for_drs, 2, ENC_BIG_ENDIAN, &test_value);
2469
2470 if (test_value > 10000)
2471 {
2472 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power for drs [0..10000]");
2473 }
2474 }
dissect_emtc_pbch_repeitions_enabled_r13_value(ptvcursor_t * ptvc,packet_info * pinfo)2475 static void dissect_emtc_pbch_repeitions_enabled_r13_value(ptvcursor_t * ptvc, packet_info* pinfo)
2476 {
2477 gint32 test_value;
2478 proto_item* item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_pbch_repetitions_enabled_r13, 2, ENC_BIG_ENDIAN, &test_value);
2479
2480 if (test_value > 1)
2481 {
2482 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pbch repetitions enabled r13 value [0..1]");
2483 }
2484 }
dissect_emtc_prach_cat_m_root_sequence_index_value(ptvcursor_t * ptvc,packet_info * pinfo)2485 static void dissect_emtc_prach_cat_m_root_sequence_index_value(ptvcursor_t * ptvc, packet_info* pinfo)
2486 {
2487 guint32 test_value;
2488 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_prach_cat_m_root_sequence_index, 2, ENC_BIG_ENDIAN, &test_value);
2489
2490 if (test_value > 837)
2491 {
2492 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach cat-m root sequence Index value [0..837]");
2493 }
2494 }
dissect_emtc_prach_cat_m_zero_correlation_zone_configuration_value(ptvcursor_t * ptvc,packet_info * pinfo)2495 static void dissect_emtc_prach_cat_m_zero_correlation_zone_configuration_value(ptvcursor_t * ptvc, packet_info* pinfo)
2496 {
2497 guint32 test_value;
2498 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_prach_cat_m_zero_correlation_zone_configuration, 2, ENC_BIG_ENDIAN, &test_value);
2499
2500 if (test_value > 15)
2501 {
2502 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach cat-m zero correlation zone configuration value [0..15]");
2503 }
2504 }
dissect_emtc_prach_cat_m_high_speed_flag_value(ptvcursor_t * ptvc,packet_info * pinfo)2505 static void dissect_emtc_prach_cat_m_high_speed_flag_value(ptvcursor_t * ptvc, packet_info* pinfo)
2506 {
2507 gint32 test_value;
2508 proto_item* item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_prach_cat_m_high_speed_flag, 2, ENC_BIG_ENDIAN, &test_value);
2509
2510 if (test_value > 1)
2511 {
2512 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach cat-m high speed flag value [0..1]");
2513 }
2514 }
dissect_emtc_prach_ce_level_0_enabled_value(ptvcursor_t * ptvc,packet_info * pinfo)2515 static void dissect_emtc_prach_ce_level_0_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo)
2516 {
2517 gint32 test_value;
2518 proto_item* item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_prach_ce_level_0_enable, 2, ENC_BIG_ENDIAN, &test_value);
2519
2520 if (test_value > 1)
2521 {
2522 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 enable value [0..1]");
2523 }
2524 }
dissect_emtc_prach_ce_level_0_configuration_offset_value(ptvcursor_t * ptvc,packet_info * pinfo)2525 static void dissect_emtc_prach_ce_level_0_configuration_offset_value(ptvcursor_t * ptvc, packet_info* pinfo)
2526 {
2527 guint32 test_value;
2528 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_prach_ce_level_0_configuration_index, 2, ENC_BIG_ENDIAN, &test_value);
2529
2530 if (test_value > 63)
2531 {
2532 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 configuration Index value [0..63]");
2533 }
2534 }
dissect_emtc_prach_ce_level_0_frequency_offset_value(ptvcursor_t * ptvc,packet_info * pinfo)2535 static void dissect_emtc_prach_ce_level_0_frequency_offset_value(ptvcursor_t * ptvc, packet_info* pinfo)
2536 {
2537 guint32 test_value;
2538 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_prach_ce_level_0_frequency_offset, 2, ENC_BIG_ENDIAN, &test_value);
2539
2540 if (test_value > (100 - 6))
2541 {
2542 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 frequency offset value [0..94]");
2543 }
2544 }
dissect_emtc_preach_ce_level_0_num_of_repeitions_per_attempt_value(ptvcursor_t * ptvc,packet_info * pinfo)2545 static void dissect_emtc_preach_ce_level_0_num_of_repeitions_per_attempt_value(ptvcursor_t * ptvc, packet_info* pinfo)
2546 {
2547 guint32 test_value;
2548 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_prach_ce_level_0_number_of_repetitions_per_attempt, 2, ENC_BIG_ENDIAN, &test_value);
2549
2550 if (!( test_value == 1 || test_value == 2 || test_value == 4 || test_value == 8 || test_value == 16 || test_value == 32 ||
2551 test_value == 64 || test_value == 128))
2552 {
2553 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 number of repetitions per attempt value [1, 2, 4, 8, 16, 32, 64, 128]");
2554 }
2555 }
dissect_emtc_ce_level_0_starting_subframe_periodicity_value(ptvcursor_t * ptvc,packet_info * pinfo)2556 static void dissect_emtc_ce_level_0_starting_subframe_periodicity_value(ptvcursor_t * ptvc, packet_info* pinfo)
2557 {
2558 guint32 test_value;
2559 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_prach_ce_level_0_starting_subframe_periodicity, 2, ENC_BIG_ENDIAN, &test_value);
2560
2561 if (!(test_value == 0xFFF || test_value == 2 || test_value == 4 || test_value == 8 || test_value == 16 || test_value == 32 ||
2562 test_value == 64 || test_value == 128 || test_value == 256))
2563 {
2564 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 starting subframe periodicity value [2, 4, 8, 16, 32, 64, 128, 256, 0xFFFF]");
2565 }
2566 }
dissect_emtc_preach_ce_level_0_hopping_enabled_value(ptvcursor_t * ptvc,packet_info * pinfo)2567 static void dissect_emtc_preach_ce_level_0_hopping_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo)
2568 {
2569 gint32 test_value;
2570 proto_item* item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_prach_ce_level_0_hopping_enabled, 2, ENC_BIG_ENDIAN, &test_value);
2571
2572 if (test_value > 1)
2573 {
2574 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 hopping enabled value [0..1]");
2575 }
2576 }
dissect_emtc_preach_ce_level_0_hopping_offset_value(ptvcursor_t * ptvc,packet_info * pinfo)2577 static void dissect_emtc_preach_ce_level_0_hopping_offset_value(ptvcursor_t * ptvc, packet_info* pinfo)
2578 {
2579 guint32 test_value;
2580 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_prach_ce_level_0_hopping_offset, 2, ENC_BIG_ENDIAN, &test_value);
2581
2582 if (test_value > 94)
2583 {
2584 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 hopping offset value [0..94]");
2585 }
2586 }
dissect_emtc_prach_ce_level_1_enabled_value(ptvcursor_t * ptvc,packet_info * pinfo)2587 static void dissect_emtc_prach_ce_level_1_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo)
2588 {
2589 gint32 test_value;
2590 proto_item* item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_prach_ce_level_1_enable, 2, ENC_BIG_ENDIAN, &test_value);
2591
2592 if (test_value > 1)
2593 {
2594 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 enable value [0..1]");
2595 }
2596 }
dissect_emtc_prach_ce_level_1_configuration_offset_value(ptvcursor_t * ptvc,packet_info * pinfo)2597 static void dissect_emtc_prach_ce_level_1_configuration_offset_value(ptvcursor_t * ptvc, packet_info* pinfo)
2598 {
2599 guint32 test_value;
2600 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_prach_ce_level_1_configuration_index, 2, ENC_BIG_ENDIAN, &test_value);
2601
2602 if (test_value > 63)
2603 {
2604 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 configuration Index value [0..63]");
2605 }
2606 }
dissect_emtc_prach_ce_level_1_frequency_offset_value(ptvcursor_t * ptvc,packet_info * pinfo)2607 static void dissect_emtc_prach_ce_level_1_frequency_offset_value(ptvcursor_t * ptvc, packet_info* pinfo)
2608 {
2609 guint32 test_value;
2610 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_prach_ce_level_1_frequency_offset, 2, ENC_BIG_ENDIAN, &test_value);
2611
2612 if (test_value > (100 - 6))
2613 {
2614 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 frequency offset value [0..94]");
2615 }
2616 }
dissect_emtc_preach_ce_level_1_num_of_repeitions_per_attempt_value(ptvcursor_t * ptvc,packet_info * pinfo)2617 static void dissect_emtc_preach_ce_level_1_num_of_repeitions_per_attempt_value(ptvcursor_t * ptvc, packet_info* pinfo)
2618 {
2619 guint32 test_value;
2620 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_prach_ce_level_1_number_of_repetitions_per_attempt, 2, ENC_BIG_ENDIAN, &test_value);
2621
2622 if (!(test_value == 1 || test_value == 2 || test_value == 4 || test_value == 8 || test_value == 16 || test_value == 32 ||
2623 test_value == 64 || test_value == 128))
2624 {
2625 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 number of repetitions per attempt value [1, 2, 4, 8, 16, 32, 64, 128]");
2626 }
2627 }
dissect_emtc_ce_level_1_starting_subframe_periodicity_value(ptvcursor_t * ptvc,packet_info * pinfo)2628 static void dissect_emtc_ce_level_1_starting_subframe_periodicity_value(ptvcursor_t * ptvc, packet_info* pinfo)
2629 {
2630 guint32 test_value;
2631 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_prach_ce_level_1_starting_subframe_periodicity, 2, ENC_BIG_ENDIAN, &test_value);
2632
2633 if (!(test_value == 0xFFF || test_value == 2 || test_value == 4 || test_value == 8 || test_value == 16 || test_value == 32 ||
2634 test_value == 64 || test_value == 128 || test_value == 256))
2635 {
2636 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 starting subframe periodicity value [2, 4, 8, 16, 32, 64, 128, 256, 0xFFFF]");
2637 }
2638 }
dissect_emtc_preach_ce_level_1_hopping_enabled_value(ptvcursor_t * ptvc,packet_info * pinfo)2639 static void dissect_emtc_preach_ce_level_1_hopping_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo)
2640 {
2641 gint32 test_value;
2642 proto_item* item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_prach_ce_level_1_hopping_enabled, 2, ENC_BIG_ENDIAN, &test_value);
2643
2644 if (test_value > 1)
2645 {
2646 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 hopping enabled value [0..1]");
2647 }
2648 }
dissect_emtc_preach_ce_level_1_hopping_offset_value(ptvcursor_t * ptvc,packet_info * pinfo)2649 static void dissect_emtc_preach_ce_level_1_hopping_offset_value(ptvcursor_t * ptvc, packet_info* pinfo)
2650 {
2651 guint32 test_value;
2652 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_prach_ce_level_1_hopping_offset, 2, ENC_BIG_ENDIAN, &test_value);
2653
2654 if (test_value > 94)
2655 {
2656 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 hopping offset value [0..94]");
2657 }
2658 }
dissect_emtc_prach_ce_level_2_enabled_value(ptvcursor_t * ptvc,packet_info * pinfo)2659 static void dissect_emtc_prach_ce_level_2_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo)
2660 {
2661 gint32 test_value;
2662 proto_item* item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_prach_ce_level_2_enable, 2, ENC_BIG_ENDIAN, &test_value);
2663
2664 if (test_value > 1)
2665 {
2666 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 enable value [0..1]");
2667 }
2668 }
dissect_emtc_prach_ce_level_2_configuration_offset_value(ptvcursor_t * ptvc,packet_info * pinfo)2669 static void dissect_emtc_prach_ce_level_2_configuration_offset_value(ptvcursor_t * ptvc, packet_info* pinfo)
2670 {
2671 guint32 test_value;
2672 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_prach_ce_level_2_configuration_index, 2, ENC_BIG_ENDIAN, &test_value);
2673
2674 if (test_value > 63)
2675 {
2676 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 configuration Index value [0..63]");
2677 }
2678 }
dissect_emtc_prach_ce_level_2_frequency_offset_value(ptvcursor_t * ptvc,packet_info * pinfo)2679 static void dissect_emtc_prach_ce_level_2_frequency_offset_value(ptvcursor_t * ptvc, packet_info* pinfo)
2680 {
2681 guint32 test_value;
2682 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_prach_ce_level_2_frequency_offset, 2, ENC_BIG_ENDIAN, &test_value);
2683
2684 if (test_value > (100 - 6))
2685 {
2686 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 frequency offset value [0..94]");
2687 }
2688 }
dissect_emtc_preach_ce_level_2_num_of_repeitions_per_attempt_value(ptvcursor_t * ptvc,packet_info * pinfo)2689 static void dissect_emtc_preach_ce_level_2_num_of_repeitions_per_attempt_value(ptvcursor_t * ptvc, packet_info* pinfo)
2690 {
2691 guint32 test_value;
2692 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_prach_ce_level_2_number_of_repetitions_per_attempt, 2, ENC_BIG_ENDIAN, &test_value);
2693
2694 if (!(test_value == 1 || test_value == 2 || test_value == 4 || test_value == 8 || test_value == 16 || test_value == 32 ||
2695 test_value == 64 || test_value == 128))
2696 {
2697 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 number of repetitions per attempt value [1, 2, 4, 8, 16, 32, 64, 128]");
2698 }
2699 }
dissect_emtc_ce_level_2_starting_subframe_periodicity_value(ptvcursor_t * ptvc,packet_info * pinfo)2700 static void dissect_emtc_ce_level_2_starting_subframe_periodicity_value(ptvcursor_t * ptvc, packet_info* pinfo)
2701 {
2702 guint32 test_value;
2703 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_prach_ce_level_2_starting_subframe_periodicity, 2, ENC_BIG_ENDIAN, &test_value);
2704
2705 if (!(test_value == 0xFFF || test_value == 2 || test_value == 4 || test_value == 8 || test_value == 16 || test_value == 32 ||
2706 test_value == 64 || test_value == 128 || test_value == 256))
2707 {
2708 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 starting subframe periodicity value [2, 4, 8, 16, 32, 64, 128, 256, 0xFFFF]");
2709 }
2710 }
dissect_emtc_preach_ce_level_2_hopping_enabled_value(ptvcursor_t * ptvc,packet_info * pinfo)2711 static void dissect_emtc_preach_ce_level_2_hopping_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo)
2712 {
2713 gint32 test_value;
2714 proto_item* item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_prach_ce_level_2_hopping_enabled, 2, ENC_BIG_ENDIAN, &test_value);
2715
2716 if (test_value > 1)
2717 {
2718 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 hopping enabled value [0..1]");
2719 }
2720 }
dissect_emtc_preach_ce_level_2_hopping_offset_value(ptvcursor_t * ptvc,packet_info * pinfo)2721 static void dissect_emtc_preach_ce_level_2_hopping_offset_value(ptvcursor_t * ptvc, packet_info* pinfo)
2722 {
2723 guint32 test_value;
2724 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_prach_ce_level_2_hopping_offset, 2, ENC_BIG_ENDIAN, &test_value);
2725
2726 if (test_value > 94)
2727 {
2728 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 hopping offset value [0..94]");
2729 }
2730 }
dissect_emtc_prach_ce_level_3_enabled_value(ptvcursor_t * ptvc,packet_info * pinfo)2731 static void dissect_emtc_prach_ce_level_3_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo)
2732 {
2733 gint32 test_value;
2734 proto_item* item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_prach_ce_level_3_enable, 2, ENC_BIG_ENDIAN, &test_value);
2735
2736 if (test_value > 1)
2737 {
2738 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #3 enable value [0..1]");
2739 }
2740 }
dissect_emtc_prach_ce_level_3_configuration_offset_value(ptvcursor_t * ptvc,packet_info * pinfo)2741 static void dissect_emtc_prach_ce_level_3_configuration_offset_value(ptvcursor_t * ptvc, packet_info* pinfo)
2742 {
2743 guint32 test_value;
2744 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_prach_ce_level_3_configuration_index, 2, ENC_BIG_ENDIAN, &test_value);
2745
2746 if (test_value > 63)
2747 {
2748 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 configuration Index value [0..63]");
2749 }
2750 }
dissect_emtc_prach_ce_level_3_frequency_offset_value(ptvcursor_t * ptvc,packet_info * pinfo)2751 static void dissect_emtc_prach_ce_level_3_frequency_offset_value(ptvcursor_t * ptvc, packet_info* pinfo)
2752 {
2753 guint32 test_value;
2754 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_prach_ce_level_3_frequency_offset, 2, ENC_BIG_ENDIAN, &test_value);
2755
2756 if (test_value > (100 - 6))
2757 {
2758 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #3 frequency offset value [0..94]");
2759 }
2760 }
dissect_emtc_preach_ce_level_3_num_of_repeitions_per_attempt_value(ptvcursor_t * ptvc,packet_info * pinfo)2761 static void dissect_emtc_preach_ce_level_3_num_of_repeitions_per_attempt_value(ptvcursor_t * ptvc, packet_info* pinfo)
2762 {
2763 guint32 test_value;
2764 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_prach_ce_level_3_number_of_repetitions_per_attempt, 2, ENC_BIG_ENDIAN, &test_value);
2765
2766 if (!(test_value == 1 || test_value == 2 || test_value == 4 || test_value == 8 || test_value == 16 || test_value == 32 ||
2767 test_value == 64 || test_value == 128))
2768 {
2769 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #3 number of repetitions per attempt value [1, 2, 4, 8, 16, 32, 64, 128]");
2770 }
2771 }
dissect_emtc_ce_level_3_starting_subframe_periodicity_value(ptvcursor_t * ptvc,packet_info * pinfo)2772 static void dissect_emtc_ce_level_3_starting_subframe_periodicity_value(ptvcursor_t * ptvc, packet_info* pinfo)
2773 {
2774 guint32 test_value;
2775 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_prach_ce_level_3_starting_subframe_periodicity, 2, ENC_BIG_ENDIAN, &test_value);
2776
2777 if (!(test_value == 0xFFF || test_value == 2 || test_value == 4 || test_value == 8 || test_value == 16 || test_value == 32 ||
2778 test_value == 64 || test_value == 128 || test_value == 256))
2779 {
2780 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #3 starting subframe periodicity value [2, 4, 8, 16, 32, 64, 128, 256, 0xFFFF]");
2781 }
2782 }
dissect_emtc_preach_ce_level_3_hopping_enabled_value(ptvcursor_t * ptvc,packet_info * pinfo)2783 static void dissect_emtc_preach_ce_level_3_hopping_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo)
2784 {
2785 gint32 test_value;
2786 proto_item* item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_prach_ce_level_3_hopping_enabled, 2, ENC_BIG_ENDIAN, &test_value);
2787
2788 if (test_value > 1)
2789 {
2790 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #3 hopping enabled value [0..1]");
2791 }
2792 }
dissect_emtc_preach_ce_level_3_hopping_offset_value(ptvcursor_t * ptvc,packet_info * pinfo)2793 static void dissect_emtc_preach_ce_level_3_hopping_offset_value(ptvcursor_t * ptvc, packet_info* pinfo)
2794 {
2795 guint32 test_value;
2796 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_prach_ce_level_3_hopping_offset, 2, ENC_BIG_ENDIAN, &test_value);
2797
2798 if (test_value > 94)
2799 {
2800 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #3 hopping offset value [0..94]");
2801 }
2802 }
dissect_emtc_pucch_interval_ul_hopping_config_common_mode_a_value(ptvcursor_t * ptvc,packet_info * pinfo)2803 static void dissect_emtc_pucch_interval_ul_hopping_config_common_mode_a_value(ptvcursor_t * ptvc, packet_info* pinfo)
2804 {
2805 guint32 test_value;
2806 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_pucch_internal_ul_hopping_config_common_mode_a, 2, ENC_BIG_ENDIAN, &test_value);
2807
2808 if (!(test_value == 1 || test_value == 2 || test_value == 4 || test_value == 8 || test_value == 5 || test_value == 10 || test_value == 20))
2809 {
2810 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch internal ul hopping config common mode a value [1, 2, 4, 8] or [1, 5, 10, 20]");
2811 }
2812 }
dissect_emtc_pucch_interval_ul_hopping_config_common_mode_b_value(ptvcursor_t * ptvc,packet_info * pinfo)2813 static void dissect_emtc_pucch_interval_ul_hopping_config_common_mode_b_value(ptvcursor_t * ptvc, packet_info* pinfo)
2814 {
2815 guint32 test_value;
2816 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_pucch_internal_ul_hopping_config_common_mode_b, 2, ENC_BIG_ENDIAN, &test_value);
2817
2818 if (!(test_value == 2 || test_value == 4 || test_value == 8 || test_value == 16 || test_value == 5 || test_value == 10 || test_value == 20 || test_value == 40))
2819 {
2820 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch internal ul hopping config common mode a value [2, 4, 8, 16] or [5, 10, 20, 40]");
2821 }
2822 }
dissect_dl_bandwidth_support_value(ptvcursor_t * ptvc,packet_info * pinfo)2823 static void dissect_dl_bandwidth_support_value(ptvcursor_t * ptvc, packet_info* pinfo)
2824 {
2825 guint64 test_value64;
2826 proto_item* item = proto_tree_add_bitmask_ret_uint64(ptvcursor_tree(ptvc), ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc),
2827 hf_nfapi_dl_bandwidth_support, ett_nfapi_downlink_bandwidth_support, dl_bandwidth_support_fields, ENC_BIG_ENDIAN, &test_value64);
2828 if (test_value64 > 0x3F)
2829 {
2830 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink bandwidth supported bits [0..0x3F]");
2831 }
2832
2833 ptvcursor_advance(ptvc, 2);
2834 }
dissect_ul_bandwidth_support_value(ptvcursor_t * ptvc,packet_info * pinfo)2835 static void dissect_ul_bandwidth_support_value(ptvcursor_t * ptvc, packet_info* pinfo)
2836 {
2837 guint64 test_value64;
2838 proto_item* item = proto_tree_add_bitmask_ret_uint64(ptvcursor_tree(ptvc), ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc),
2839 hf_nfapi_ul_bandwidth_support, ett_nfapi_uplink_bandwidth_support, ul_bandwidth_support_fields, ENC_BIG_ENDIAN, &test_value64);
2840 if (test_value64 > 0x3F)
2841 {
2842 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid uplink bandwidth supported bits [0..0x3F]");
2843 }
2844
2845 ptvcursor_advance(ptvc, 2);
2846
2847 }
dissect_dl_modulation_value(ptvcursor_t * ptvc,packet_info * pinfo)2848 static void dissect_dl_modulation_value(ptvcursor_t * ptvc, packet_info* pinfo)
2849 {
2850 static int * const dl_modulation_support_fields[] = {
2851 &hf_nfapi_dl_modulation_support_qpsk,
2852 &hf_nfapi_dl_modulation_support_16qam,
2853 &hf_nfapi_dl_modulation_support_64qam,
2854 &hf_nfapi_dl_modulation_support_256qam,
2855 NULL
2856 };
2857
2858 guint64 test_value64;
2859 proto_item* item = proto_tree_add_bitmask_ret_uint64(ptvcursor_tree(ptvc), ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc),
2860 hf_nfapi_dl_modulation_support, ett_nfapi_downlink_modulation_support, dl_modulation_support_fields, ENC_BIG_ENDIAN, &test_value64);
2861
2862 if (test_value64 > 0xF)
2863 {
2864 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink modulation support bit [0..0xF]");
2865 }
2866
2867 ptvcursor_advance(ptvc, 2);
2868 }
dissect_ul_modulation_value(ptvcursor_t * ptvc,packet_info * pinfo)2869 static void dissect_ul_modulation_value(ptvcursor_t * ptvc, packet_info* pinfo)
2870 {
2871 static int * const ul_modulation_support_fields[] = {
2872 &hf_nfapi_ul_modulation_support_qpsk,
2873 &hf_nfapi_ul_modulation_support_16qam,
2874 &hf_nfapi_ul_modulation_support_64qam,
2875 NULL
2876 };
2877
2878 guint64 test_value64;
2879 proto_item* item = proto_tree_add_bitmask_ret_uint64(ptvcursor_tree(ptvc), ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc),
2880 hf_nfapi_ul_modulation_support, ett_nfapi_uplink_modulation_support, ul_modulation_support_fields, ENC_BIG_ENDIAN, &test_value64);
2881
2882 if (test_value64 > 0x7)
2883 {
2884 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid uplink modulation support bit [0..0x7]");
2885 }
2886
2887 ptvcursor_advance(ptvc, 2);
2888 }
dissect_phy_antenna_capability_value(ptvcursor_t * ptvc,packet_info * pinfo)2889 static void dissect_phy_antenna_capability_value(ptvcursor_t * ptvc, packet_info* pinfo)
2890 {
2891 guint32 test_value;
2892 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_phy_antenna_capability, 2, ENC_BIG_ENDIAN, &test_value);
2893
2894 if (!(test_value == 1 || test_value == 2 || test_value == 4 || test_value == 8 || test_value == 16))
2895 {
2896 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid phy antenna capability [1, 2, 4, 8, 16]");
2897 }
2898 }
dissect_release_capability_value(ptvcursor_t * ptvc,packet_info * pinfo)2899 static void dissect_release_capability_value(ptvcursor_t * ptvc, packet_info* pinfo)
2900 {
2901 guint64 test_value64;
2902 proto_item* item = proto_tree_add_bitmask_ret_uint64(ptvcursor_tree(ptvc), ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc),
2903 hf_nfapi_release_capability, ett_nfapi_release_support, maximum_3gpp_release_supported_fields, ENC_BIG_ENDIAN, &test_value64);
2904 if (test_value64 > 0x3F)
2905 {
2906 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid release capability value [0..0x3F]");
2907 }
2908
2909 ptvcursor_advance(ptvc, 2);
2910 }
dissect_mbsfn_value(ptvcursor_t * ptvc,packet_info * pinfo)2911 static void dissect_mbsfn_value(ptvcursor_t * ptvc, packet_info* pinfo)
2912 {
2913 gint32 test_value;
2914 proto_item* item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_mbsfn_capability, 2, ENC_BIG_ENDIAN, &test_value);
2915
2916 if (test_value > 1)
2917 {
2918 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mbsfn capability bit [0..0x1]");
2919 }
2920 }
dissect_laa_support_value(ptvcursor_t * ptvc,packet_info * pinfo)2921 static void dissect_laa_support_value(ptvcursor_t * ptvc, packet_info* pinfo)
2922 {
2923 gint32 test_value;
2924 proto_item* item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_laa_capability, 2, ENC_BIG_ENDIAN, &test_value);
2925
2926 if (test_value > 1)
2927 {
2928 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid laa support bit [0..0x1]");
2929 }
2930 }
dissect_laa_pd_sensing_lbt_support_value(ptvcursor_t * ptvc,packet_info * pinfo)2931 static void dissect_laa_pd_sensing_lbt_support_value(ptvcursor_t * ptvc, packet_info* pinfo)
2932 {
2933 gint32 test_value;
2934 proto_item* item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_pd_sensing_lbt_support, 2, ENC_BIG_ENDIAN, &test_value);
2935
2936 if (test_value > 1)
2937 {
2938 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pd sensing lbt support bit [0..0x1]");
2939 }
2940 }
dissect_laa_multi_carrier_lbt_support_value(ptvcursor_t * ptvc,packet_info * pinfo)2941 static void dissect_laa_multi_carrier_lbt_support_value(ptvcursor_t * ptvc, packet_info* pinfo)
2942 {
2943 guint32 test_value;
2944 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_multi_carrier_lbt_support, 2, ENC_BIG_ENDIAN, &test_value);
2945
2946 if (test_value > 0xF)
2947 {
2948 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid multi carrier LBT support bit [0..0xF]");
2949 }
2950 }
dissect_laa_partial_sf_support_value(ptvcursor_t * ptvc,packet_info * pinfo)2951 static void dissect_laa_partial_sf_support_value(ptvcursor_t * ptvc, packet_info* pinfo)
2952 {
2953 gint32 test_value;
2954 proto_item* item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_partial_sf_support, 2, ENC_BIG_ENDIAN, &test_value);
2955
2956 if (test_value > 0x1)
2957 {
2958 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid partial SF support bit [0..0x1]");
2959 }
2960 }
dissect_data_report_mode_value(ptvcursor_t * ptvc,packet_info * pinfo)2961 static void dissect_data_report_mode_value(ptvcursor_t * ptvc, packet_info* pinfo)
2962 {
2963 gboolean test_value;
2964 proto_item* item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_data_report_mode, 2, ENC_BIG_ENDIAN, &test_value);
2965
2966 if (test_value > 1)
2967 {
2968 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid data report mode value [0..1]");
2969 }
2970 }
dissect_sfn_sf_value(ptvcursor_t * ptvc,packet_info * pinfo)2971 static void dissect_sfn_sf_value(ptvcursor_t * ptvc, packet_info* pinfo)
2972 {
2973 guint32 test_value;
2974 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_sfnsf, 2, ENC_BIG_ENDIAN, &test_value);
2975
2976 guint32 sfn = test_value >> 0x4;
2977 guint32 sf = test_value & 0x000F;
2978 if (sfn > 1023 || sf > 9)
2979 {
2980 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid sfn/sf value sfn:%u [0..1023] sf:%u [0..9]", sfn, sf);
2981 }
2982 }
dissect_phy_state_value(ptvcursor_t * ptvc,packet_info * pinfo)2983 static void dissect_phy_state_value(ptvcursor_t * ptvc, packet_info* pinfo)
2984 {
2985 guint32 test_value;
2986 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_phy_state, 2, ENC_BIG_ENDIAN, &test_value);
2987
2988 if (test_value > 2)
2989 {
2990 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid phy state [0..2]");
2991 }
2992 }
dissect_p7_vnf_address_ipv4_value(ptvcursor_t * ptvc,packet_info * pinfo _U_)2993 static void dissect_p7_vnf_address_ipv4_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
2994 {
2995 ptvcursor_add(ptvc, hf_nfapi_vnf_address_ipv4, 4, ENC_NA);
2996 }
dissect_p7_vnf_address_ipv6_value(ptvcursor_t * ptvc,packet_info * pinfo _U_)2997 static void dissect_p7_vnf_address_ipv6_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
2998 {
2999 ptvcursor_add(ptvc, hf_nfapi_vnf_address_ipv6, 16, ENC_NA);
3000 }
dissect_p7_vnf_port_value(ptvcursor_t * ptvc,packet_info * pinfo _U_)3001 static void dissect_p7_vnf_port_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
3002 {
3003 ptvcursor_add(ptvc, hf_nfapi_vnf_port, 2, ENC_BIG_ENDIAN);
3004 }
dissect_p7_pnf_address_ipv4_value(ptvcursor_t * ptvc,packet_info * pinfo _U_)3005 static void dissect_p7_pnf_address_ipv4_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
3006 {
3007 ptvcursor_add(ptvc, hf_nfapi_pnf_address_ipv4, 4, ENC_NA);
3008 }
dissect_p7_pnf_address_ipv6_value(ptvcursor_t * ptvc,packet_info * pinfo _U_)3009 static void dissect_p7_pnf_address_ipv6_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
3010 {
3011 ptvcursor_add(ptvc, hf_nfapi_pnf_address_ipv6, 16, ENC_NA);
3012 }
dissect_p7_pnf_port_value(ptvcursor_t * ptvc,packet_info * pinfo _U_)3013 static void dissect_p7_pnf_port_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
3014 {
3015 ptvcursor_add(ptvc, hf_nfapi_pnf_port, 2, ENC_BIG_ENDIAN);
3016 }
dissect_downlink_ues_per_subframe_value(ptvcursor_t * ptvc,packet_info * pinfo _U_)3017 static void dissect_downlink_ues_per_subframe_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
3018 {
3019 ptvcursor_add(ptvc, hf_nfapi_dl_ue_per_sf, 1, ENC_BIG_ENDIAN);
3020 }
dissect_uplink_ues_per_subframe_value(ptvcursor_t * ptvc,packet_info * pinfo _U_)3021 static void dissect_uplink_ues_per_subframe_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
3022 {
3023 ptvcursor_add(ptvc, hf_nfapi_ul_ue_per_sf, 1, ENC_BIG_ENDIAN);
3024 }
dissect_rf_band_value(ptvcursor_t * ptvc,packet_info * pinfo _U_)3025 static void dissect_rf_band_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
3026 {
3027 ptvcursor_add(ptvc, hf_nfapi_band, 2, ENC_BIG_ENDIAN);
3028 }
dissect_rf_bands_value(ptvcursor_t * ptvc,packet_info * pinfo)3029 static void dissect_rf_bands_value(ptvcursor_t * ptvc, packet_info* pinfo)
3030 {
3031 guint32 count;
3032 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_rf_bands, 2, ENC_BIG_ENDIAN, &count);
3033 dissect_array_value(ptvc, pinfo, "RF Band List", ett_nfapi_rf_bands, count, dissect_rf_band_value);
3034 }
dissect_timing_window_value(ptvcursor_t * ptvc,packet_info * pinfo)3035 static void dissect_timing_window_value(ptvcursor_t * ptvc, packet_info* pinfo)
3036 {
3037 guint32 test_value;
3038 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_timing_window, 1, ENC_BIG_ENDIAN, &test_value);
3039
3040 if (test_value > 30)
3041 {
3042 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing window value [0..30]");
3043 }
3044 }
dissect_timing_info_mode_value(ptvcursor_t * ptvc,packet_info * pinfo)3045 static void dissect_timing_info_mode_value(ptvcursor_t * ptvc, packet_info* pinfo)
3046 {
3047 guint32 test_value;
3048 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_timing_info_mode, 1, ENC_BIG_ENDIAN, &test_value);
3049
3050 if (test_value > 0x3)
3051 {
3052 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing info mode [0..0x3]");
3053 }
3054 }
dissect_timing_info_period_value(ptvcursor_t * ptvc,packet_info * pinfo)3055 static void dissect_timing_info_period_value(ptvcursor_t * ptvc, packet_info* pinfo)
3056 {
3057 guint32 test_value;
3058 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_timing_info_period, 1, ENC_BIG_ENDIAN, &test_value);
3059
3060 if (!(test_value >= 1 && test_value <= 255))
3061 {
3062 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing info period [1..255]");
3063 }
3064 }
dissect_maximum_transmit_power_value(ptvcursor_t * ptvc,packet_info * pinfo)3065 static void dissect_maximum_transmit_power_value(ptvcursor_t * ptvc, packet_info* pinfo)
3066 {
3067 guint32 test_value;
3068 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_maximum_transmit_power_2, 2, ENC_BIG_ENDIAN, &test_value);
3069
3070 if (test_value > 700)
3071 {
3072 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid maximum transmit power [0..700]");
3073 }
3074 }
dissect_earfcn_value(ptvcursor_t * ptvc,packet_info * pinfo _U_)3075 static void dissect_earfcn_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
3076 {
3077 ptvcursor_add(ptvc, hf_nfapi_earfcn, 2, ENC_BIG_ENDIAN);
3078 }
dissect_nmm_gsm_frequency_bands_value(ptvcursor_t * ptvc,packet_info * pinfo)3079 static void dissect_nmm_gsm_frequency_bands_value(ptvcursor_t * ptvc, packet_info* pinfo)
3080 {
3081 guint32 count;
3082 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_rf_bands, 2, ENC_BIG_ENDIAN, &count);
3083 dissect_array_value(ptvc, pinfo, "RF Band List", ett_nfapi_rf_bands, count, dissect_rf_band_value);
3084 }
dissect_nmm_umts_frequency_bands_value(ptvcursor_t * ptvc,packet_info * pinfo)3085 static void dissect_nmm_umts_frequency_bands_value(ptvcursor_t * ptvc, packet_info* pinfo)
3086 {
3087 guint32 count;
3088 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_rf_bands, 2, ENC_BIG_ENDIAN, &count);
3089 dissect_array_value(ptvc, pinfo, "RF Band List", ett_nfapi_rf_bands, count, dissect_rf_band_value);
3090 }
dissect_nmm_lte_frequency_bands_value(ptvcursor_t * ptvc,packet_info * pinfo)3091 static void dissect_nmm_lte_frequency_bands_value(ptvcursor_t * ptvc, packet_info* pinfo)
3092 {
3093 guint32 count;
3094 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_rf_bands, 2, ENC_BIG_ENDIAN, &count);
3095 dissect_array_value(ptvc, pinfo, "RF Band List", ett_nfapi_rf_bands, count, dissect_rf_band_value);
3096 }
dissect_nmm_uplink_rssi_supported_value(ptvcursor_t * ptvc,packet_info * pinfo)3097 static void dissect_nmm_uplink_rssi_supported_value(ptvcursor_t * ptvc, packet_info* pinfo)
3098 {
3099 guint32 test_value;
3100 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_nmm_uplink_rssi_supported, 1, ENC_BIG_ENDIAN, &test_value);
3101
3102 if (test_value > 1)
3103 {
3104 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nmm uplink rssi supported value [0..1]");
3105 }
3106 }
dissect_dl_config_pdu(ptvcursor_t * ptvc,packet_info * pinfo)3107 static void dissect_dl_config_pdu(ptvcursor_t * ptvc, packet_info* pinfo)
3108 {
3109 guint32 size;
3110 ptvcursor_add(ptvc, hf_nfapi_dl_config_pdu_type, 1, ENC_BIG_ENDIAN);
3111 ptvcursor_add_ret_uint(ptvc, hf_nfapi_pdu_size, 1, ENC_BIG_ENDIAN, &size);
3112
3113 guint pdu_end = (ptvcursor_current_offset(ptvc) + size - 2);
3114 dissect_tlv_list(ptvc, pinfo, pdu_end);
3115 }
dissect_dl_config_request_body_value(ptvcursor_t * ptvc,packet_info * pinfo)3116 static void dissect_dl_config_request_body_value(ptvcursor_t * ptvc, packet_info* pinfo)
3117 {
3118 proto_item* item;
3119 guint32 test_value, number_of_dcis_value, number_of_pdus_value;
3120
3121 // Number of PDCCH OFDM symbols
3122 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_pdcch_ofdm_symbols, 1, ENC_BIG_ENDIAN, &test_value);
3123 if (test_value > 4)
3124 {
3125 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pdcch ofdm symbols value [0..4]");
3126 }
3127
3128 // Number of DCIs
3129 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_dci, 1, ENC_BIG_ENDIAN, &number_of_dcis_value);
3130
3131 // Number of PDUs
3132 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_pdus, 2, ENC_BIG_ENDIAN, &number_of_pdus_value);
3133 if (number_of_pdus_value > 514)
3134 {
3135 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pdus value [0..514]");
3136 }
3137
3138 // Number of PDSCH RNTIs
3139 ptvcursor_add(ptvc, hf_nfapi_number_pdsch_rnti, 1, ENC_BIG_ENDIAN);
3140
3141 // Transmission power for PCFICH
3142 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_transmission_power_pcfich, 2, ENC_BIG_ENDIAN, &test_value);
3143 if (test_value > 10000)
3144 {
3145 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power for pcfich value [0..10000]");
3146 }
3147
3148 dissect_array_value(ptvc, pinfo, "DL Config PDU List", ett_nfapi_dl_config_request_pdu_list, number_of_dcis_value + number_of_pdus_value, dissect_dl_config_pdu);
3149 }
dissect_dl_config_request_bch_pdu_rel8_value(ptvcursor_t * ptvc,packet_info * pinfo)3150 static void dissect_dl_config_request_bch_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo)
3151 {
3152 proto_item* item;
3153 guint32 test_value;
3154
3155 // Length
3156 ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN);
3157
3158 // PDU index
3159 ptvcursor_add(ptvc, hf_nfapi_pdu_index, 2, ENC_BIG_ENDIAN);
3160
3161 // Transmission power
3162 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN, &test_value);
3163 if (test_value > 10000)
3164 {
3165 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]");
3166 }
3167
3168 }
dissect_dl_config_request_dl_dci_pdu_rel8_value(ptvcursor_t * ptvc,packet_info * pinfo)3169 static void dissect_dl_config_request_dl_dci_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo)
3170 {
3171 proto_item* item;
3172 guint32 test_value;
3173
3174 // DCI format
3175 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_dl_dci_format, 1, ENC_BIG_ENDIAN, &test_value);
3176 if (test_value > 9)
3177 {
3178 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci format value [0..9]");
3179 }
3180
3181 // CCE index
3182 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_cce_idx, 1, ENC_BIG_ENDIAN, &test_value);
3183 if (test_value > 88)
3184 {
3185 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cce Index value [0..88]");
3186 }
3187
3188 // Aggregation level
3189 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_aggregation_level, 1, ENC_BIG_ENDIAN, &test_value);
3190 if (!(test_value == 1 || test_value == 2 || test_value == 4 ||
3191 test_value == 8 || test_value == 16 || test_value == 32))
3192 {
3193 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid aggregation level value [1, 2, 4, 8, 16, 32]");
3194 }
3195
3196 // RNTI
3197 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN, &test_value);
3198 if (test_value < 1)
3199 {
3200 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]");
3201 }
3202
3203 // Resource allocation type
3204 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN, &test_value);
3205 if (test_value > 1)
3206 {
3207 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocation type value [0..1]");
3208 }
3209
3210 // Virtual resource block assignment flag
3211 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_virtual_resource_block_assignment_flag, 1, ENC_BIG_ENDIAN, &test_value);
3212 if (test_value > 1)
3213 {
3214 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid virtual resource block assignment flag value [0..1]");
3215 }
3216
3217 // Resource block coding
3218 ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN);
3219
3220 // MCS_1
3221 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_mcs_1, 1, ENC_BIG_ENDIAN, &test_value);
3222 if (test_value > 31)
3223 {
3224 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs 1 value [0..31]");
3225 }
3226
3227 // Redundancy version_1
3228 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_redundancy_version_1, 1, ENC_BIG_ENDIAN, &test_value);
3229 if (test_value > 3)
3230 {
3231 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy version 1 value [0..3]");
3232 }
3233
3234 // New data indicator_1
3235 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_new_data_indicator_1, 1, ENC_BIG_ENDIAN, &test_value);
3236 if (test_value > 3)
3237 {
3238 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indicator 1 value [0..1]");
3239 }
3240
3241 // Transport block to codeword swap flag
3242 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_transport_block_to_codeword_swap_flag, 1, ENC_BIG_ENDIAN, &test_value);
3243 if (test_value > 3)
3244 {
3245 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport block to codeword swap flag value [0..1]");
3246 }
3247
3248 // MCS_2
3249 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_mcs_2, 1, ENC_BIG_ENDIAN, &test_value);
3250 if (test_value > 31)
3251 {
3252 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs 2 value [0..31]");
3253 }
3254
3255 // Redundancy version_2
3256 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_redundancy_version_2, 1, ENC_BIG_ENDIAN, &test_value);
3257 if (test_value > 3)
3258 {
3259 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy version 2 value [0..3]");
3260 }
3261
3262 // New Data indicator_2
3263 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_new_data_indicator_2, 1, ENC_BIG_ENDIAN, &test_value);
3264 if (test_value > 3)
3265 {
3266 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indicator 2 value [0..1]");
3267 }
3268
3269 // HARQ process
3270 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_harq_process, 1, ENC_BIG_ENDIAN, &test_value);
3271 if (test_value > 3)
3272 {
3273 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq process value [0..15]");
3274 }
3275
3276 // TPMI
3277 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_tpmi, 1, ENC_BIG_ENDIAN, &test_value);
3278 if (test_value > 3)
3279 {
3280 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi value [0..3]");
3281 }
3282
3283 // PMI
3284 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_pmi, 1, ENC_BIG_ENDIAN, &test_value);
3285 if (test_value > 2)
3286 {
3287 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi value [0..2]");
3288 }
3289
3290 // Precoding information
3291 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_precoding_information, 1, ENC_BIG_ENDIAN, &test_value);
3292 if (test_value > 2)
3293 {
3294 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid precoding information value [0..15]");
3295 }
3296
3297 // TPC
3298 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_tpc, 1, ENC_BIG_ENDIAN, &test_value);
3299 if (test_value > 3)
3300 {
3301 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpc value [0..3]");
3302 }
3303
3304 // Downlink assignment index
3305 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_downlink_assignment_index, 1, ENC_BIG_ENDIAN, &test_value);
3306 if (test_value > 15)
3307 {
3308 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink assignment value [0..15]");
3309 }
3310
3311 // NGAP
3312 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_ngap, 1, ENC_BIG_ENDIAN, &test_value);
3313 if (test_value > 1)
3314 {
3315 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ngap value [0..1]");
3316 }
3317
3318 // Transport block size index
3319 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_transport_block_size_index, 1, ENC_BIG_ENDIAN, &test_value);
3320 if (test_value > 31)
3321 {
3322 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport block size Index value [0..31]");
3323 }
3324
3325 // Downlink power offset
3326 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_downlink_power_offset, 1, ENC_BIG_ENDIAN, &test_value);
3327 if (test_value > 1)
3328 {
3329 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink power offset value [0..1]");
3330 }
3331
3332 // Allocate PRACH flag
3333 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_allocate_prach_flag, 1, ENC_BIG_ENDIAN, &test_value);
3334 if (test_value > 1)
3335 {
3336 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid allocate prach flag value [0..1]");
3337 }
3338
3339 // Preamble index
3340 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_preamble_index, 1, ENC_BIG_ENDIAN, &test_value);
3341 if (test_value > 63)
3342 {
3343 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid preamble Index value [0..63]");
3344 }
3345
3346 // PRACH mask index
3347 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_prach_mask_index, 1, ENC_BIG_ENDIAN, &test_value);
3348 if (test_value > 15)
3349 {
3350 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach mask Index value [0..15]");
3351 }
3352
3353 // RNTI type
3354 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_rnti_type, 1, ENC_BIG_ENDIAN, &test_value);
3355 if (!(test_value >= 1 && test_value <= 3))
3356 {
3357 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti type value [1..3]");
3358 }
3359
3360 // Transmission power
3361 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN, &test_value);
3362 if (test_value > 10000)
3363 {
3364 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value value [0..10000]");
3365 }
3366
3367 }
dissect_dl_config_request_dl_dci_pdu_rel9_value(ptvcursor_t * ptvc,packet_info * pinfo)3368 static void dissect_dl_config_request_dl_dci_pdu_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo)
3369 {
3370 proto_item* item;
3371 guint32 test_value;
3372 gboolean test_boolean;
3373
3374 // MCCH flag
3375 item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_mcch_flag, 1, ENC_BIG_ENDIAN, &test_boolean);
3376 if (test_boolean > 1)
3377 {
3378 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcch flag value [0..1]");
3379 }
3380
3381 // MCCH change notification
3382 ptvcursor_add(ptvc, hf_nfapi_mcch_change_notification, 1, ENC_BIG_ENDIAN);
3383
3384 // Scrambling identity
3385 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_scrambling_identity, 1, ENC_BIG_ENDIAN, &test_value);
3386 if (test_value > 1)
3387 {
3388 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid scrambling identity value [0..1]");
3389 }
3390
3391 }
dissect_dl_config_request_dl_dci_pdu_rel10_value(ptvcursor_t * ptvc,packet_info * pinfo)3392 static void dissect_dl_config_request_dl_dci_pdu_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo)
3393 {
3394 proto_item* item;
3395 guint32 test_value;
3396 gboolean test_boolean;
3397
3398 // Cross carrier scheduling flag
3399 item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_cross_carrier_scheduling_flag, 1, ENC_BIG_ENDIAN, &test_boolean);
3400 if (test_boolean > 1)
3401 {
3402 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cross carrier scheduling flag value [0..1]");
3403 }
3404
3405 // Carrier indicator
3406 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_carrier_indicator, 1, ENC_BIG_ENDIAN, &test_value);
3407 if (test_value > 7)
3408 {
3409 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid carrier indicator value [0..7]");
3410 }
3411
3412 // SRS flag
3413 item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_srs_flag, 1, ENC_BIG_ENDIAN, &test_boolean);
3414 if (test_boolean > 1)
3415 {
3416 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs flag value [0..1]");
3417 }
3418
3419 // SRS request
3420 item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_srs_request, 1, ENC_BIG_ENDIAN, &test_boolean);
3421 if (test_boolean > 1)
3422 {
3423 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs request value [0..1]");
3424 }
3425
3426 // Antenna ports, scrambling and layers
3427 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_antenna_ports_scrambling_and_layers, 1, ENC_BIG_ENDIAN, &test_value);
3428 if (test_value > 15)
3429 {
3430 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid antenna ports scrambling and layers value [0..15]");
3431 }
3432
3433 // Total DCI length including padding
3434 ptvcursor_add(ptvc, hf_nfapi_total_dci_length_including_padding, 1, ENC_BIG_ENDIAN);
3435
3436 // N_DL_RB
3437 // TODO : This is missing from the encoder....
3438 //ptvcursor_add(ptvc, hf_nfapi_n_dl_rb, 1, ENC_BIG_ENDIAN);
3439 }
dissect_dl_config_request_dl_dci_pdu_rel11_value(ptvcursor_t * ptvc,packet_info * pinfo)3440 static void dissect_dl_config_request_dl_dci_pdu_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo)
3441 {
3442 proto_item* item;
3443 guint32 test_value;
3444
3445 // HARQ-ACK resource offset
3446 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_harq_ack_resource_offset, 1, ENC_BIG_ENDIAN, &test_value);
3447 if (test_value > 3)
3448 {
3449 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid hack ack resource offset value [0..3]");
3450 }
3451
3452 // PDSCH RE Mapping and Quasi-Co-Location Indicator
3453 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_pdsch_re_mapping_and_quasi_co_location_indicator, 1, ENC_BIG_ENDIAN, &test_value);
3454 if (test_value > 3)
3455 {
3456 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch re mapping value [0..3]");
3457 }
3458
3459 }
dissect_ul_dl_configuration_index_value(ptvcursor_t * ptvc,packet_info * pinfo)3460 static void dissect_ul_dl_configuration_index_value(ptvcursor_t * ptvc, packet_info* pinfo)
3461 {
3462 guint32 test_value;
3463
3464 // UL/DL configuration indication
3465 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_ul_dl_configuration_index, 1, ENC_BIG_ENDIAN, &test_value);
3466 if (!(test_value >= 1 && test_value <= 5))
3467 {
3468 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul/dl configuration indication value [1..5]");
3469 }
3470 }
dissect_dl_config_request_dl_dci_pdu_rel12_value(ptvcursor_t * ptvc,packet_info * pinfo)3471 static void dissect_dl_config_request_dl_dci_pdu_rel12_value(ptvcursor_t * ptvc, packet_info* pinfo)
3472 {
3473 proto_item* item;
3474 guint32 test_value, count;
3475 gboolean test_boolean;
3476
3477 // Primary cell type
3478 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_primary_cell_type, 1, ENC_BIG_ENDIAN, &test_value);
3479 if (test_value > 2)
3480 {
3481 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid primary cell type value [0..2]");
3482 }
3483
3484 // UL/DL configuration flag
3485 item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_ul_dl_configuration_flag, 1, ENC_BIG_ENDIAN, &test_boolean);
3486 if (test_boolean > 1)
3487 {
3488 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul/dl configuration flag value [0..1]");
3489 }
3490
3491 // Number of UL / DL configurations
3492 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_ul_dl_configurations, 1, ENC_BIG_ENDIAN, &count);
3493
3494 dissect_array_value(ptvc, pinfo, "UL/DL Configurations", ett_nfapi_pnf_phy, count, dissect_ul_dl_configuration_index_value);
3495 }
dissect_dl_config_request_dl_dci_pdu_rel13_value(ptvcursor_t * ptvc,packet_info * pinfo _U_)3496 static void dissect_dl_config_request_dl_dci_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
3497 {
3498 ptvcursor_add(ptvc, hf_nfapi_laa_end_partial_sf_flag, 1, ENC_BIG_ENDIAN);
3499 ptvcursor_add(ptvc, hf_nfapi_laa_end_partial_sf_configuration, 1, ENC_BIG_ENDIAN);
3500 ptvcursor_add(ptvc, hf_nfapi_initial_lbt_sf, 1, ENC_BIG_ENDIAN);
3501 ptvcursor_add(ptvc, hf_nfapi_codebooksize_determination_r13, 1, ENC_BIG_ENDIAN);
3502 ptvcursor_add(ptvc, hf_nfapi_rel13_drms_table_flag, 1, ENC_BIG_ENDIAN);
3503 }
dissect_dl_config_request_mch_pdu_rel8_value(ptvcursor_t * ptvc,packet_info * pinfo _U_)3504 static void dissect_dl_config_request_mch_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
3505 {
3506 ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN);
3507 ptvcursor_add(ptvc, hf_nfapi_pdu_index, 2, ENC_BIG_ENDIAN);
3508 ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN);
3509 ptvcursor_add(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN);
3510 ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN);
3511 ptvcursor_add(ptvc, hf_nfapi_modulation, 1, ENC_BIG_ENDIAN);
3512 ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN);
3513 ptvcursor_add(ptvc, hf_nfapi_mbsfn_area_id, 2, ENC_BIG_ENDIAN);
3514 }
dissect_codebook_index_value(ptvcursor_t * ptvc,packet_info * pinfo)3515 static void dissect_codebook_index_value(ptvcursor_t * ptvc, packet_info* pinfo)
3516 {
3517 guint32 test_value;
3518
3519 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_codebook_index, 1, ENC_BIG_ENDIAN, &test_value);
3520 if (test_value > 15)
3521 {
3522 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid codebook Index value [0..15]");
3523 }
3524 }
dissect_bf_vector_value(ptvcursor_t * ptvc,packet_info * pinfo _U_)3525 static void dissect_bf_vector_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
3526 {
3527 ptvcursor_add(ptvc, hf_nfapi_bf_vector_bf_value, 2, ENC_BIG_ENDIAN);
3528 }
dissect_bf_vector_type_value(ptvcursor_t * ptvc,packet_info * pinfo)3529 static void dissect_bf_vector_type_value(ptvcursor_t * ptvc, packet_info* pinfo)
3530 {
3531 guint32 count;
3532
3533 ptvcursor_add(ptvc, hf_nfapi_bf_vector_subband_index, 1, ENC_BIG_ENDIAN);
3534 ptvcursor_add_ret_uint(ptvc, hf_nfapi_bf_vector_num_antennas, 1, ENC_BIG_ENDIAN, &count);
3535 dissect_array_value(ptvc, pinfo, "Antennas", ett_nfapi_bf_vector_antennas, count, dissect_bf_vector_value);
3536 }
dissect_dl_config_request_dlsch_pdu_rel8_value(ptvcursor_t * ptvc,packet_info * pinfo)3537 static void dissect_dl_config_request_dlsch_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo)
3538 {
3539 proto_item* item;
3540 guint32 test_value, num_subbands, num_vectors;
3541
3542 // Length
3543 ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN);
3544
3545 // PDU index
3546 ptvcursor_add(ptvc, hf_nfapi_pdu_index, 2, ENC_BIG_ENDIAN);
3547
3548 // RNTI
3549 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN, &test_value);
3550 if (!(test_value >= 1 /* && rnti_value <= 65535)*/))
3551 {
3552 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid codebook Index value [1..65535]");
3553 }
3554
3555 // Resource allocation type
3556 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN, &test_value);
3557 if (test_value > 5)
3558 {
3559 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocation type value [0..5]");
3560 }
3561
3562 // Virtual resource block assignment flag
3563 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_virtual_resource_block_assignment_flag, 1, ENC_BIG_ENDIAN, &test_value);
3564 if (test_value > 1)
3565 {
3566 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid virtual resource block allocation assignment value [0..1]");
3567 }
3568
3569 // Resource block coding
3570 ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN);
3571
3572 // Modulation
3573 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_modulation, 1, ENC_BIG_ENDIAN, &test_value);
3574 if (!(test_value == 2 || test_value == 4 || test_value == 6 || test_value == 8))
3575 {
3576 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid modulation value [2, 4, 6, 8]");
3577 }
3578
3579 // Redundancy version
3580 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_redundancy_version, 1, ENC_BIG_ENDIAN, &test_value);
3581 if (test_value > 3)
3582 {
3583 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy value [0..3]");
3584 }
3585
3586 // Transport blocks
3587 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_transport_blocks, 1, ENC_BIG_ENDIAN, &test_value);
3588 if (!(test_value >= 1 && test_value <= 2))
3589 {
3590 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport blocks value [1..2]");
3591 }
3592
3593 // Transport block to codeword swap flag
3594 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_transport_block_to_codeword_swap_flag, 1, ENC_BIG_ENDIAN, &test_value);
3595 if (test_value > 1)
3596 {
3597 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport block to codeword swap flag value [0..1]");
3598 }
3599
3600 // Transmission scheme
3601 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_transmission_scheme, 1, ENC_BIG_ENDIAN, &test_value);
3602 if (test_value > 13)
3603 {
3604 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission scheme value [0..13]");
3605 }
3606
3607 // Number of layers
3608 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_layers, 1, ENC_BIG_ENDIAN, &test_value);
3609 if (!(test_value >= 1 && test_value <= 8))
3610 {
3611 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of layers value [1..8]");
3612 }
3613
3614 // Number of subbands
3615 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_subbands, 1, ENC_BIG_ENDIAN, &num_subbands);
3616 if (num_subbands > 13)
3617 {
3618 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of subbands value [0..13]");
3619 }
3620
3621 dissect_array_value(ptvc, pinfo, "Subbands", ett_nfapi_subbands, num_subbands, dissect_codebook_index_value);
3622
3623 // UE category capacity
3624 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_ue_category_capacity, 1, ENC_BIG_ENDIAN, &test_value);
3625 if (test_value > 14)
3626 {
3627 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue category capacity value [0..14]");
3628 }
3629
3630 // P-A
3631 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_pa, 1, ENC_BIG_ENDIAN, &test_value);
3632 if (test_value > 7)
3633 {
3634 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid p-a value [0..7]");
3635 }
3636
3637 // Delta power offset index
3638 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_delta_power_offset_index, 1, ENC_BIG_ENDIAN, &test_value);
3639 if (test_value > 1)
3640 {
3641 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta power offset value [0..1]");
3642 }
3643
3644 // NGAP
3645 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_ngap, 1, ENC_BIG_ENDIAN, &test_value);
3646 if (test_value > 1)
3647 {
3648 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ngap value [0..1]");
3649 }
3650
3651 // NPRB
3652 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_nprb, 1, ENC_BIG_ENDIAN, &test_value);
3653 if (test_value > 1)
3654 {
3655 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nprb value [0..1]");
3656 }
3657
3658 // Transmission mode
3659 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_transmission_mode, 1, ENC_BIG_ENDIAN, &test_value);
3660 if (!(test_value >= 1 && test_value <= 10))
3661 {
3662 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode value [1..10]");
3663 }
3664
3665 // numBfPRBperSubband
3666 ptvcursor_add(ptvc, hf_nfapi_num_bf_prb_per_subband, 1, ENC_BIG_ENDIAN);
3667
3668 // numBfVector
3669 ptvcursor_add_ret_uint(ptvc, hf_nfapi_num_bf_vector, 1, ENC_BIG_ENDIAN, &num_vectors);
3670
3671 dissect_array_value(ptvc, pinfo, "Beamforming Vectors", ett_nfapi_bf_vectors, num_vectors, dissect_bf_vector_type_value);
3672 }
dissect_csi_rs_resource_config_value(ptvcursor_t * ptvc,packet_info * pinfo)3673 static void dissect_csi_rs_resource_config_value(ptvcursor_t * ptvc, packet_info* pinfo)
3674 {
3675 guint32 test_value;
3676
3677 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_csi_rs_resource_config, 1, ENC_BIG_ENDIAN, &test_value);
3678 if (test_value > 31)
3679 {
3680 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi-rs resource config value [0..31]");
3681 }
3682 }
dissect_dl_config_request_dlsch_pdu_rel9_value(ptvcursor_t * ptvc,packet_info * pinfo)3683 static void dissect_dl_config_request_dlsch_pdu_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo)
3684 {
3685 guint32 test_value;
3686
3687 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_nscid, 1, ENC_BIG_ENDIAN, &test_value);
3688 if (test_value > 1)
3689 {
3690 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nscid value [0..1]");
3691 }
3692 }
dissect_dl_config_request_dlsch_pdu_rel10_value(ptvcursor_t * ptvc,packet_info * pinfo)3693 static void dissect_dl_config_request_dlsch_pdu_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo)
3694 {
3695 proto_item* item;
3696 guint32 test_value, count;
3697 gboolean test_boolean;
3698
3699 // CSI-RS flag
3700 item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_csi_rs_flag, 1, ENC_BIG_ENDIAN, &test_boolean);
3701 if (test_boolean > 1)
3702 {
3703 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi-rs flag value [0..1]");
3704 }
3705
3706 // CSI-RS resource config R10
3707 ptvcursor_add(ptvc, hf_nfapi_csi_rs_resource_config_r10, 1, ENC_BIG_ENDIAN);
3708
3709 // CSI-RS zero Tx power resource config bitmap R10
3710 ptvcursor_add(ptvc, hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10, 2, ENC_BIG_ENDIAN);
3711
3712 // CSI-RS Number of NZP configuration
3713 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_csi_rs_number_of_nzp_configurations, 1, ENC_BIG_ENDIAN, &count);
3714 if (count > 3)
3715 {
3716 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi-rs number of nzp configuration value [0..3]");
3717 }
3718
3719 // CSI-RS configuration
3720 dissect_array_value(ptvc, pinfo, "CSI-RS Resource Configs", ett_nfapi_csi_rs_resource_configs, count, dissect_csi_rs_resource_config_value);
3721
3722 // PDSCH start
3723 ptvcursor_add_ret_uint(ptvc, hf_nfapi_pdsch_start, 1, ENC_BIG_ENDIAN, &test_value);
3724 if (test_value > 4)
3725 {
3726 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch start value [0..4]");
3727 }
3728
3729 }
dissect_dl_config_request_dlsch_pdu_rel11_value(ptvcursor_t * ptvc,packet_info * pinfo)3730 static void dissect_dl_config_request_dlsch_pdu_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo)
3731 {
3732 proto_item* item;
3733 guint32 test_value;
3734
3735 // DMRS Config flag
3736 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_drms_config_flag, 1, ENC_BIG_ENDIAN, &test_value);
3737 if (test_value > 1)
3738 {
3739 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms config flag value [0..1]");
3740 }
3741
3742 // DMRS-Scrambling
3743 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_drms_scrambling, 2, ENC_BIG_ENDIAN, &test_value);
3744 if (test_value > 503)
3745 {
3746 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms scrambling value [0..503]");
3747 }
3748
3749 // CSI Config flag
3750 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_csi_config_flag, 1, ENC_BIG_ENDIAN, &test_value);
3751 if (test_value > 1)
3752 {
3753 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi config flag value [0..1]");
3754 }
3755
3756 // CSI- Scrambling
3757 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_csi_scrambling, 2, ENC_BIG_ENDIAN, &test_value);
3758 if (test_value > 503)
3759 {
3760 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi scrambling value [0..503]");
3761 }
3762
3763 // PDSCH RE mapping flag
3764 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_pdsch_re_mapping_flag, 1, ENC_BIG_ENDIAN, &test_value);
3765 if (test_value > 1)
3766 {
3767 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch re mapping flag value [0..1]");
3768 }
3769
3770 // PDSCH RE mapping antenna ports
3771 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_pdsch_re_mapping_antenna_ports, 1, ENC_BIG_ENDIAN, &test_value);
3772 if (!(test_value == 1 || test_value == 2 || test_value == 4))
3773 {
3774 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch re mapping antenna ports value [1, 2, 4]");
3775 }
3776
3777 // PDSCH RE mapping freq shift
3778 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_pdsch_re_mapping_freq_shift, 1, ENC_BIG_ENDIAN, &test_value);
3779 if (test_value > 5)
3780 {
3781 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch re mapping freq shift value [0..5]");
3782 }
3783 }
dissect_dl_config_request_dlsch_pdu_rel12_value(ptvcursor_t * ptvc,packet_info * pinfo)3784 static void dissect_dl_config_request_dlsch_pdu_rel12_value(ptvcursor_t * ptvc, packet_info* pinfo)
3785 {
3786 proto_item* item;
3787 guint32 test_value;
3788
3789 // altCQI-Table-r12
3790 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_alt_cqi_table_r12, 1, ENC_BIG_ENDIAN, &test_value);
3791 if (test_value > 1)
3792 {
3793 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid alt cqi table r12 value [0..1]");
3794 }
3795
3796 // MaxLayers
3797 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_max_layers, 1, ENC_BIG_ENDIAN, &test_value);
3798 if (!(test_value >= 1 && test_value <= 8))
3799 {
3800 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid max layers value [1..8]");
3801 }
3802
3803 ptvcursor_add(ptvc, hf_nfapi_n_dl_harq, 1, ENC_BIG_ENDIAN);
3804 }
dissect_dl_config_request_dlsch_pdu_rel13_value(ptvcursor_t * ptvc,packet_info * pinfo)3805 static void dissect_dl_config_request_dlsch_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo)
3806 {
3807 proto_item* item;
3808 guint32 test_value;
3809
3810 // DwPTS Symbols
3811 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_dwpts_symbols, 1, ENC_BIG_ENDIAN, &test_value);
3812 if (!(test_value == 3 || test_value == 6 || test_value == 9 ||
3813 test_value == 10 || test_value == 11 || test_value == 12 ||
3814 test_value == 14))
3815 {
3816 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dwpts symbols value [3, 6, 9, 10, 11, 12, 14]");
3817 }
3818
3819 // Initial LBT SF
3820 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_initial_lbt_sf, 1, ENC_BIG_ENDIAN, &test_value);
3821 if (test_value > 1)
3822 {
3823 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial lbt sf value [0..1]");
3824 }
3825
3826 // UE Type
3827 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_ue_type, 1, ENC_BIG_ENDIAN, &test_value);
3828 if (test_value > 2)
3829 {
3830 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue type value [0..2]");
3831 }
3832
3833 // PDSCH Payload Type
3834 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_pdsch_payload_type, 1, ENC_BIG_ENDIAN, &test_value);
3835 if (test_value > 2)
3836 {
3837 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch payload type value [0..2]");
3838 }
3839
3840 // Initial transmission SF (io)
3841 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_initial_transmission_sf, 2, ENC_BIG_ENDIAN, &test_value);
3842 if (!(test_value <= 10239 || test_value == 0xFFFF))
3843 {
3844 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial transmission sf io value [0..10239, 0xFFFF]");
3845 }
3846
3847 // Rel-13-DMRS-tabe flag
3848 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_req13_drms_table_flag, 1, ENC_BIG_ENDIAN, &test_value);
3849 if (test_value > 1)
3850 {
3851 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rel13 drms table flag value [0..1]");
3852 }
3853 }
dissect_dl_config_request_pch_pdu_rel8_value(ptvcursor_t * ptvc,packet_info * pinfo)3854 static void dissect_dl_config_request_pch_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo)
3855 {
3856 proto_item* item;
3857 guint32 test_value;
3858
3859 // Length
3860 ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN);
3861
3862 // PDU index
3863 ptvcursor_add(ptvc, hf_nfapi_pdu_index, 2, ENC_BIG_ENDIAN);
3864
3865 // P-RNTI
3866 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_prnti, 2, ENC_BIG_ENDIAN, &test_value);
3867 if (test_value != 0xFFFE)
3868 {
3869 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prnti value [0xFFFE]");
3870 }
3871
3872 // Resource allocation type
3873 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN, &test_value);
3874 if (!(test_value == 2 || test_value == 3 || test_value == 6))
3875 {
3876 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocate type value [2, 3, 6]");
3877 }
3878
3879 // Virtual resource block assignment flag
3880 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_virtual_resource_block_assignment_flag, 1, ENC_BIG_ENDIAN, &test_value);
3881 if (test_value > 1)
3882 {
3883 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid virtual resource block assignment flag value [0..1]");
3884 }
3885
3886 // Resource block coding
3887 ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN);
3888
3889 // MCS
3890 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_mcs, 1, ENC_BIG_ENDIAN, &test_value);
3891 if (test_value != 0)
3892 {
3893 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs value [0]");
3894 }
3895
3896 // Redundancy version
3897 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_redundancy_version, 1, ENC_BIG_ENDIAN, &test_value);
3898 if (test_value != 0)
3899 {
3900 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy value [0]");
3901 }
3902
3903 // Number of transport blocks
3904 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_transport_blocks, 1, ENC_BIG_ENDIAN, &test_value);
3905 if (test_value != 1)
3906 {
3907 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport blocks value [1]");
3908 }
3909
3910 // Transport block to codeword swap flag
3911 ptvcursor_add(ptvc, hf_nfapi_transport_block_to_codeword_swap_flag, 1, ENC_BIG_ENDIAN);
3912
3913 // Transmission scheme
3914 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_transmission_scheme, 1, ENC_BIG_ENDIAN, &test_value);
3915 if (!(test_value == 0 || test_value == 1 || test_value == 6))
3916 {
3917 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission schemes value [0, 1, 6]");
3918 }
3919
3920 // Number of layers
3921 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_layers, 1, ENC_BIG_ENDIAN, &test_value);
3922 if (!(test_value >= 1 && test_value <= 4))
3923 {
3924 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of layers value [1..4]");
3925 }
3926
3927 // Codebook index
3928 ptvcursor_add(ptvc, hf_nfapi_codebook_index, 1, ENC_BIG_ENDIAN);
3929
3930 // UE category capacity
3931 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_ue_category_capacity, 1, ENC_BIG_ENDIAN, &test_value);
3932 if (test_value > 14)
3933 {
3934 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue category capacity value [0..14]");
3935 }
3936
3937 // P-A
3938 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_pa, 1, ENC_BIG_ENDIAN, &test_value);
3939 if (test_value > 7)
3940 {
3941 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid p-a value value [0..7]");
3942 }
3943
3944 // Transmission power
3945 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN, &test_value);
3946 if (test_value > 10000)
3947 {
3948 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]");
3949 }
3950
3951 // NPRB
3952 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_nprb, 1, ENC_BIG_ENDIAN, &test_value);
3953 if (test_value > 1)
3954 {
3955 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nprb value [0..1]");
3956 }
3957
3958 // NGAP
3959 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_ngap, 1, ENC_BIG_ENDIAN, &test_value);
3960 if (test_value > 1)
3961 {
3962 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ngap value [0..1]");
3963 }
3964
3965 }
dissect_dl_config_request_pch_pdu_rel13_value(ptvcursor_t * ptvc,packet_info * pinfo)3966 static void dissect_dl_config_request_pch_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo)
3967 {
3968 proto_item* item;
3969 guint32 test_value;
3970
3971 // UE mode
3972 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_ue_mode, 1, ENC_BIG_ENDIAN, &test_value);
3973 if (test_value > 1)
3974 {
3975 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue mode value [0..1]");
3976 }
3977
3978 // Initial transmission SF (io)
3979 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_initial_transmission_sf, 2, ENC_BIG_ENDIAN, &test_value);
3980 if (!(test_value <= 10239 || test_value == 0xFFFF))
3981 {
3982 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial transmission sf io value [0..10239, 0xFFFF]");
3983 }
3984 }
dissect_dl_config_request_prs_pdu_rel9_value(ptvcursor_t * ptvc,packet_info * pinfo)3985 static void dissect_dl_config_request_prs_pdu_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo)
3986 {
3987 proto_item* item;
3988 guint32 test_value;
3989 gboolean test_boolean;
3990
3991 // Transmission power
3992 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN, &test_value);
3993 if (test_value > 10000)
3994 {
3995 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]");
3996 }
3997
3998 // PRS bandwidth
3999 item = ptvcursor_add_ret_uint(ptvc, hf_prs_bandwidth, 1, ENC_BIG_ENDIAN, &test_value);
4000 if (!(test_value == 6 || test_value == 15 || test_value == 25 ||
4001 test_value == 50 || test_value == 75 || test_value == 100))
4002 {
4003 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prs bandwidth value [6, 15, 25, 50, 75, 100]");
4004 }
4005
4006 // PRS cyclic prefix type
4007 item = ptvcursor_add_ret_boolean(ptvc, hf_prs_cyclic_prefix_type, 1, ENC_BIG_ENDIAN, &test_boolean);
4008 if (test_boolean > 1)
4009 {
4010 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prs cyclic prefix value [0..1]");
4011 }
4012
4013 // PRS muting
4014 item = ptvcursor_add_ret_boolean(ptvc, hf_prs_muting, 1, ENC_BIG_ENDIAN, &test_boolean);
4015 if (test_boolean > 1)
4016 {
4017 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prs muting value [0..1]");
4018 }
4019 }
dissect_dl_config_request_csi_rs_pdu_rel10_value(ptvcursor_t * ptvc,packet_info * pinfo)4020 static void dissect_dl_config_request_csi_rs_pdu_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo)
4021 {
4022 proto_item* item;
4023 guint32 test_value, count;
4024
4025 // CSI-RS antenna port count R10
4026 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_csi_rs_antenna_port_count_r10, 1, ENC_BIG_ENDIAN, &test_value);
4027 if (!(test_value == 1 || test_value == 2 ||
4028 test_value == 4 || test_value == 8 ||
4029 test_value == 12 || test_value == 16))
4030 {
4031 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi rs antenna port count r10 value [1, 2, 4, 6, 8, 10]");
4032 }
4033
4034 // CSI-RS resource config R10
4035 ptvcursor_add(ptvc, hf_nfapi_csi_rs_resource_config_r10, 1, ENC_BIG_ENDIAN);
4036
4037 // Transmission power
4038 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN, &test_value);
4039 if (test_value > 10000)
4040 {
4041 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]");
4042 }
4043
4044 // CSI-RS zero Tx power resource config bitmap R10
4045 ptvcursor_add(ptvc, hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10, 2, ENC_BIG_ENDIAN);
4046
4047 // CSI-RS Number of NZP configuration
4048 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_csi_rs_number_of_nzp_configurations, 1, ENC_BIG_ENDIAN, &count);
4049 if (count > 8)
4050 {
4051 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi-rs number of nzp configuration value [0..8]");
4052 }
4053
4054 // CSI-RS configuration
4055 dissect_array_value(ptvc, pinfo, "CSI-RS Resource Configs", ett_nfapi_csi_rs_resource_configs, count, dissect_csi_rs_resource_config_value);
4056 }
dissect_csi_rs_bf_vector_value(ptvcursor_t * ptvc,packet_info * pinfo)4057 static void dissect_csi_rs_bf_vector_value(ptvcursor_t * ptvc, packet_info* pinfo)
4058 {
4059 guint32 count;
4060 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_csi_rs_resource_index, 1, ENC_BIG_ENDIAN, &count);
4061 if (count > 7)
4062 {
4063 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi-rs resource Index value [0..7]");
4064 }
4065
4066 // todo : how to work out the antenna port count for the bfValue
4067 }
dissect_dl_config_request_csi_rs_pdu_rel13_value(ptvcursor_t * ptvc,packet_info * pinfo)4068 static void dissect_dl_config_request_csi_rs_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo)
4069 {
4070 proto_item* item;
4071 guint32 test_value, class_value, count;
4072
4073 // Class
4074 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_csi_rs_class, 1, ENC_BIG_ENDIAN, &class_value);
4075 if (class_value > 2)
4076 {
4077 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid class value [0..2]");
4078 }
4079
4080 // cdmType
4081 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_cdm_type, 1, ENC_BIG_ENDIAN, &test_value);
4082 if (test_value > 1)
4083 {
4084 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cdm type value [0..1]");
4085 }
4086
4087 // numBfVector
4088 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_num_bf_vector, 1, ENC_BIG_ENDIAN, &count);
4089 if (!((class_value == 1 && count == 0) || (class_value == 2 && count <= 8)))
4090 {
4091 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid num bf vector value [0] or [0..8]");
4092 }
4093
4094 dissect_array_value(ptvc, pinfo, "Beamforming Vector", ett_nfapi_csi_rs_bf_vector, count, dissect_csi_rs_bf_vector_value);
4095 }
dissect_epdcch_prb_index_value(ptvcursor_t * ptvc,packet_info * pinfo)4096 static void dissect_epdcch_prb_index_value(ptvcursor_t * ptvc, packet_info* pinfo)
4097 {
4098 guint32 test_value;
4099
4100 // EPDCCH PRB index
4101 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_epdcch_prb_index, 1, ENC_BIG_ENDIAN, &test_value);
4102 if (test_value > 99)
4103 {
4104 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid epdcch prb_index value [0..99]");
4105 }
4106 }
dissect_dl_config_request_depdcch_params_rel11_value(ptvcursor_t * ptvc,packet_info * pinfo)4107 static void dissect_dl_config_request_depdcch_params_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo)
4108 {
4109 proto_item* item;
4110 guint32 test_value, count;
4111
4112 // EPDCCH Resource assignment flag
4113 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_epdcch_resource_assignment_flag, 1, ENC_BIG_ENDIAN, &test_value);
4114 if (test_value > 1)
4115 {
4116 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid epdcch resource assignment flag value [0..1]");
4117 }
4118
4119 // EPDCCH ID
4120 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_epdcch_id, 2, ENC_BIG_ENDIAN, &test_value);
4121 if (test_value > 503)
4122 {
4123 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid epdcch id value [0..503]");
4124 }
4125
4126 // EPDCCH Start Symbol
4127 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_epdcch_start_symbol, 1, ENC_BIG_ENDIAN, &test_value);
4128 if (!(test_value >= 1 && test_value <= 4))
4129 {
4130 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid epdcch start symbol value [1..4]");
4131 }
4132
4133 // EPDCCH NumPRB
4134 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_epdcch_num_prb, 1, ENC_BIG_ENDIAN, &count);
4135 if (!(count == 2 || count == 4 || count == 8))
4136 {
4137 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid epdcch num prb value [2, 4, 8]");
4138 }
4139
4140 dissect_array_value(ptvc, pinfo, "PRBs", ett_nfapi_epdcch_prbs, count, dissect_epdcch_prb_index_value);
4141
4142 dissect_bf_vector_type_value(ptvc, pinfo);
4143 }
dissect_dl_config_request_depdcch_params_rel13_value(ptvcursor_t * ptvc,packet_info * pinfo)4144 static void dissect_dl_config_request_depdcch_params_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo)
4145 {
4146 proto_item* item;
4147 guint32 test_value;
4148
4149 // DwPTS Symbols
4150 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_initial_lbt_sf, 1, ENC_BIG_ENDIAN, &test_value);
4151 if (!(test_value == 3 || test_value == 6 || test_value == 9 ||
4152 test_value == 10 || test_value == 11 || test_value == 12 ||
4153 test_value == 14))
4154 {
4155 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dwpts symbols value [3, 6, 9, 10, 11, 12, 14]");
4156 }
4157
4158 // Initial LBT SF
4159 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_dwpts_symbols, 1, ENC_BIG_ENDIAN, &test_value);
4160 if (test_value > 1)
4161 {
4162 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial lbt sf value [0..1]");
4163 }
4164
4165 }
dissect_precoding_value(ptvcursor_t * ptvc,packet_info * pinfo _U_)4166 static void dissect_precoding_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
4167 {
4168 ptvcursor_add(ptvc, hf_nfapi_precoding_value, 2, ENC_BIG_ENDIAN);
4169 }
dissect_dl_config_request_mpdpcch_pdu_rel13_value(ptvcursor_t * ptvc,packet_info * pinfo)4170 static void dissect_dl_config_request_mpdpcch_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo)
4171 {
4172 proto_item* item;
4173 guint32 test_value, count;
4174 gboolean test_boolean;
4175
4176 // MPDCCH Narrowband
4177 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_mpdcch_narrowband, 1, ENC_BIG_ENDIAN, &test_value);
4178 if (test_value > 15)
4179 {
4180 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mpdcch narrowband value [0..15]");
4181 }
4182
4183 // Number of PRB pairs
4184 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_prb_pairs, 1, ENC_BIG_ENDIAN, &test_value);
4185 if (!(test_value == 2 || test_value == 4 || test_value == 6))
4186 {
4187 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of prb pair value [2, 4, 6]");
4188 }
4189
4190 // Resource Block Assignment
4191 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_resource_block_assignment, 1, ENC_BIG_ENDIAN, &test_value);
4192 if (test_value > 14)
4193 {
4194 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block assignment value [0..14]");
4195 }
4196
4197 // MPDCCH transmission type
4198 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_mpdcch_transmission_type, 1, ENC_BIG_ENDIAN, &test_value);
4199 if (test_value > 1)
4200 {
4201 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mpdcch transmission type value [0..1]");
4202 }
4203
4204 // Start symbol
4205 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_start_symbol, 1, ENC_BIG_ENDIAN, &test_value);
4206 if (!(test_value >= 1 && test_value <=4))
4207 {
4208 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid start symbol value [1..4]");
4209 }
4210
4211 // ECCE index
4212 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_ecce_index, 1, ENC_BIG_ENDIAN, &test_value);
4213 if (test_value > 22)
4214 {
4215 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ecce Index value [0..22]");
4216 }
4217
4218 // Aggregation level
4219 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_aggregation_level, 1, ENC_BIG_ENDIAN, &test_value);
4220 if (!(test_value == 2 || test_value == 4 || test_value == 8 ||
4221 test_value == 16 || test_value == 24))
4222 {
4223 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid aggregation level value [2, 4, 8, 16, 24]");
4224 }
4225
4226 // RNTI type
4227 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_mpdcch_rnti_type, 1, ENC_BIG_ENDIAN, &test_value);
4228 if (test_value > 4)
4229 {
4230 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti type value [0..4]");
4231 }
4232
4233 // RNTI
4234 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN, &test_value);
4235 if (!(test_value >= 1))
4236 {
4237 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]");
4238 }
4239
4240 // CEMode
4241 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_ce_mode, 1, ENC_BIG_ENDIAN, &test_value);
4242 if (!(test_value >= 1 && test_value <= 2))
4243 {
4244 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cemode value [1..2]");
4245 }
4246
4247 // DMRS scrambling init
4248 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_drms_scrabmling_init, 2, ENC_BIG_ENDIAN, &test_value);
4249 if (test_value > 503)
4250 {
4251 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms scrambling init value [0..503]");
4252 }
4253
4254 // Initial transmission SF (io)
4255 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_initial_transmission_sf, 2, ENC_BIG_ENDIAN, &test_value);
4256 if (!(test_value <= 10239 || test_value == 0xFFFF))
4257 {
4258 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial transmission sf io value [0..10239, 0xFFFF]");
4259 }
4260
4261 // Transmission power
4262 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN, &test_value);
4263 if (test_value > 10000)
4264 {
4265 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]");
4266 }
4267
4268 // DCI format
4269 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_dl_dci_format, 1, ENC_BIG_ENDIAN, &test_value);
4270 if (!(test_value == 10 || test_value == 11 || test_value == 12))
4271 {
4272 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci format value [10, 11, 12]");
4273 }
4274
4275 // Resource block coding
4276 ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 2, ENC_BIG_ENDIAN);
4277
4278 // MCS
4279 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_mcs, 1, ENC_BIG_ENDIAN, &test_value);
4280 if (test_value > 15)
4281 {
4282 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..15]");
4283 }
4284
4285 // PDSCH repetition levels
4286 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_pdsch_reception_levels, 1, ENC_BIG_ENDIAN, &test_value);
4287 if (!(test_value >= 1 && test_value <= 8))
4288 {
4289 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch repetition levels value [1..8]");
4290 }
4291
4292 // Redundancy version
4293 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_redundancy_version, 1, ENC_BIG_ENDIAN, &test_value);
4294 if (test_value > 3)
4295 {
4296 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy version value [0..3]");
4297 }
4298
4299 // New data indicator
4300 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_new_data_indicator, 1, ENC_BIG_ENDIAN, &test_value);
4301 if (test_value > 1)
4302 {
4303 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indicator value [0..1]");
4304 }
4305
4306 // HARQ process
4307 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_harq_process, 1, ENC_BIG_ENDIAN, &test_value);
4308 if (test_value > 15)
4309 {
4310 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq process value [0..15]");
4311 }
4312
4313 // TPMI length
4314 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_tpmi_length, 1, ENC_BIG_ENDIAN, &test_value);
4315 if (!(test_value == 0 || test_value == 2 || test_value == 4))
4316 {
4317 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi length value [0, 2, 4]");
4318 }
4319
4320 // TPMI
4321 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_tpmi, 1, ENC_BIG_ENDIAN, &test_value);
4322 if (test_value > 15)
4323 {
4324 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi value [0..15]");
4325 }
4326
4327 // PMI flag
4328 item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_pmi_flag, 1, ENC_BIG_ENDIAN, &test_boolean);
4329 if (test_boolean > 1)
4330 {
4331 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pmi flag value [0..1]");
4332 }
4333
4334 // PMI
4335 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_pmi, 1, ENC_BIG_ENDIAN, &test_value);
4336 if (test_value > 1)
4337 {
4338 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pmi value [0..1]");
4339 }
4340
4341 // HARQ resource offset
4342 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_harq_resource_offset, 1, ENC_BIG_ENDIAN, &test_value);
4343 if (test_value > 3)
4344 {
4345 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq resource offset value [0..3]");
4346 }
4347
4348 // DCI subframe repetition number
4349 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_dci_subframe_repetition_number, 1, ENC_BIG_ENDIAN, &test_value);
4350 if (!(test_value >= 1 && test_value <= 4))
4351 {
4352 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci subframe repetition number value [1..4]");
4353 }
4354
4355 // TPC
4356 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_tpc, 1, ENC_BIG_ENDIAN, &test_value);
4357 if (test_value > 3)
4358 {
4359 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpc value [0..3]");
4360 }
4361
4362 // Downlink assignment Index Length
4363 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_downlink_assignment_index_length, 1, ENC_BIG_ENDIAN, &test_value);
4364 if (!(test_value == 0 || test_value == 2 || test_value == 4))
4365 {
4366 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink assignment Index length value [0, 2, 4]");
4367 }
4368
4369 // Downlink assignment index
4370 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_downlink_assignment_index, 1, ENC_BIG_ENDIAN, &test_value);
4371 if (test_value > 15)
4372 {
4373 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink assignment Index value [0..15]");
4374 }
4375
4376 // Allocate PRACH flag
4377 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_allocate_prach_flag, 1, ENC_BIG_ENDIAN, &test_value);
4378 if (test_value > 1)
4379 {
4380 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid allocate prach flag value [0..1]");
4381 }
4382
4383 // Preamble index
4384 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_preamble_index, 1, ENC_BIG_ENDIAN, &test_value);
4385 if (test_value > 63)
4386 {
4387 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid preamble Index value [0..63]");
4388 }
4389
4390 // PRACH mask index
4391 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_prach_mask_index, 1, ENC_BIG_ENDIAN, &test_value);
4392 if (test_value > 15)
4393 {
4394 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach mask Index value [0..15]");
4395 }
4396
4397 // Starting CE Level
4398 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_starting_ce_level, 1, ENC_BIG_ENDIAN, &test_value);
4399 if (test_value > 3)
4400 {
4401 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid starting ce level value [0..3]");
4402 }
4403
4404 // SRS request
4405 item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_srs_request, 1, ENC_BIG_ENDIAN, &test_boolean);
4406 if (test_boolean > 1)
4407 {
4408 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs request value [0..1]");
4409 }
4410
4411 // Antenna ports and scrambling identity flag
4412 item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_antenna_ports_and_scrambling_identity_flag, 1, ENC_BIG_ENDIAN, &test_boolean);
4413 if (test_boolean > 1)
4414 {
4415 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid antenna ports and scrambling identity flag value [0..1]");
4416 }
4417
4418 // Antenna ports and scrambling identity
4419 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_antenna_ports_and_scrambling_identity, 1, ENC_BIG_ENDIAN, &test_value);
4420 if (test_value > 3)
4421 {
4422 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid antenna ports and scrambling identity value [0..3]");
4423 }
4424
4425 // Frequency hopping enabled flag
4426 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_frequency_hopping_enabled_flag, 1, ENC_BIG_ENDIAN, &test_value);
4427 if (test_value > 1)
4428 {
4429 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping enabled flag value [0..1]");
4430 }
4431
4432 // Paging/Direct indication differentiation flag
4433 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_paging_direct_indication_differentiation_flag, 1, ENC_BIG_ENDIAN, &test_value);
4434 if (test_value > 1)
4435 {
4436 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid paging/direct indication differentiation flag value [0..1]");
4437 }
4438
4439 // Direct indication
4440 ptvcursor_add(ptvc, hf_nfapi_direct_indication, 1, ENC_BIG_ENDIAN);
4441
4442 // Total DCI length including padding
4443 ptvcursor_add(ptvc, hf_nfapi_total_dci_length_including_padding, 1, ENC_BIG_ENDIAN);
4444
4445 // Number of TX Antenna ports
4446 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_tx_antenna_ports, 1, ENC_BIG_ENDIAN, &count);
4447
4448 dissect_array_value(ptvc, pinfo, "Precoding", ett_nfapi_precoding, count, dissect_precoding_value);
4449 }
dissect_ul_config_pdu(ptvcursor_t * ptvc,packet_info * pinfo)4450 static void dissect_ul_config_pdu(ptvcursor_t * ptvc, packet_info* pinfo)
4451 {
4452 proto_item* item;
4453 guint32 test_value, size;
4454
4455 // PDU Type
4456 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_ul_config_pdu_type, 1, ENC_BIG_ENDIAN, &test_value);
4457 if (test_value > 15)
4458 {
4459 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul pdu type value [0..15]");
4460 }
4461
4462 ptvcursor_add_ret_uint(ptvc, hf_nfapi_pdu_size, 1, ENC_BIG_ENDIAN, &size);
4463
4464 guint pdu_end = (ptvcursor_current_offset(ptvc) + size - 2);
4465 dissect_tlv_list(ptvc, pinfo, pdu_end);
4466 }
dissect_ul_config_request_body_value(ptvcursor_t * ptvc,packet_info * pinfo)4467 static void dissect_ul_config_request_body_value(ptvcursor_t * ptvc, packet_info* pinfo)
4468 {
4469 proto_item* item;
4470 guint32 test_value, num_pdu;
4471 gboolean test_boolean;
4472
4473 // Number of PDUs
4474 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_pdus, 1, ENC_BIG_ENDIAN, &num_pdu);
4475
4476 // RACH/PRACH frequency resources
4477 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_rach_prach_frequency_resources, 1, ENC_BIG_ENDIAN, &test_value);
4478 if (test_value > 1)
4479 {
4480 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rach prach frequency resources value [0..1]");
4481 }
4482
4483 // SRS present
4484 item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_srs_present, 1, ENC_BIG_ENDIAN, &test_boolean);
4485 if (test_boolean > 1)
4486 {
4487 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs present value [0..1]");
4488 }
4489
4490 dissect_array_value(ptvc, pinfo, "UL Config PDU List", ett_nfapi_ul_config_request_pdu_list, num_pdu, dissect_ul_config_pdu);
4491 }
dissect_ul_config_ulsch_pdu_rel8_value(ptvcursor_t * ptvc,packet_info * pinfo)4492 static void dissect_ul_config_ulsch_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo)
4493 {
4494 proto_item* item;
4495 guint32 test_value;
4496
4497 // Handle
4498 ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN);
4499
4500 // Size
4501 ptvcursor_add(ptvc, hf_nfapi_size, 2, ENC_BIG_ENDIAN);
4502
4503 // RNTI
4504 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN, &test_value);
4505 if (!(test_value >= 1))
4506 {
4507 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]");
4508 }
4509
4510 // Resource block start
4511 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_resource_block_start, 1, ENC_BIG_ENDIAN, &test_value);
4512 if (test_value > 99)
4513 {
4514 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block start value [0..99]");
4515 }
4516
4517 // Number of resource blocks
4518 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_resource_blocks, 1, ENC_BIG_ENDIAN, &test_value);
4519 if (!(test_value >= 1 && test_value <= 100))
4520 {
4521 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of resource blocks value [1..100]");
4522 }
4523
4524 // Modulation type
4525 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_modulation, 1, ENC_BIG_ENDIAN, &test_value);
4526 if (!(test_value == 2 || test_value == 4 || test_value == 6))
4527 {
4528 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid modulation type value [2, 4, 6]");
4529 }
4530
4531 // Cyclic Shift 2 for DMRS
4532 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_cyclic_shift_2_for_drms, 1, ENC_BIG_ENDIAN, &test_value);
4533 if (test_value > 99)
4534 {
4535 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cyclic shift 2 for drms value [0..7]");
4536 }
4537
4538 // Frequency hopping enabled flag
4539 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_frequency_hopping_enabled_flag, 1, ENC_BIG_ENDIAN, &test_value);
4540 if (test_value > 1)
4541 {
4542 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping enabled flag value [0..1]");
4543 }
4544
4545 // Frequency hopping bits
4546 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_frequency_hopping_bits, 1, ENC_BIG_ENDIAN, &test_value);
4547 if (test_value > 3)
4548 {
4549 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping bits value [0..3]");
4550 }
4551
4552 // New data indication
4553 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_new_data_indication, 1, ENC_BIG_ENDIAN, &test_value);
4554 if (test_value > 1)
4555 {
4556 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indicator value [0..1]");
4557 }
4558
4559 // Redundancy version
4560 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_redundancy_version, 1, ENC_BIG_ENDIAN, &test_value);
4561 if (test_value > 3)
4562 {
4563 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy version value [0..3]");
4564 }
4565
4566 // HARQ process number
4567 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_harq_process_number, 1, ENC_BIG_ENDIAN, &test_value);
4568 if (test_value > 15)
4569 {
4570 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq process number value [0..15]");
4571 }
4572
4573 // UL Tx mode
4574 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_ul_tx_mode, 1, ENC_BIG_ENDIAN, &test_value);
4575 if (test_value > 1)
4576 {
4577 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul tx mode value [0..1]");
4578 }
4579
4580 // Current TX NB
4581 ptvcursor_add(ptvc, hf_nfapi_current_tx_nb, 1, ENC_BIG_ENDIAN);
4582
4583 // N srs
4584 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_n_srs, 1, ENC_BIG_ENDIAN, &test_value);
4585 if (test_value > 1)
4586 {
4587 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n_srs value [0..1]");
4588 }
4589 }
dissect_ul_config_ulsch_pdu_rel10_value(ptvcursor_t * ptvc,packet_info * pinfo)4590 static void dissect_ul_config_ulsch_pdu_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo)
4591 {
4592 proto_item* item;
4593 guint32 test_value;
4594
4595 // Resource allocation type
4596 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN, &test_value);
4597 if (test_value > 1)
4598 {
4599 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocation type value [0..1]");
4600 }
4601
4602 // Resource block coding
4603 ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN);
4604
4605 // Transport blocks
4606 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_transport_blocks, 1, ENC_BIG_ENDIAN, &test_value);
4607 if (!(test_value >= 1 && test_value <= 2))
4608 {
4609 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport blocks value [1..2]");
4610 }
4611
4612 // Transmission scheme
4613 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_ul_transmission_scheme, 1, ENC_BIG_ENDIAN, &test_value);
4614 if (test_value > 1)
4615 {
4616 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission scheme value [0..1]");
4617 }
4618
4619 // Number Of layers
4620 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_layers, 1, ENC_BIG_ENDIAN, &test_value);
4621 if (!(test_value >= 1 && test_value <=4 ))
4622 {
4623 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of layers value [1..4]");
4624 }
4625
4626 // Codebook Index
4627 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_codebook_index, 1, ENC_BIG_ENDIAN, &test_value);
4628 if (test_value > 23)
4629 {
4630 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid codebook Index value [0..23]");
4631 }
4632
4633 // Disable sequence hopping flag
4634 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_disable_sequence_hopping_flag, 1, ENC_BIG_ENDIAN, &test_value);
4635 if (test_value > 1)
4636 {
4637 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid disable sequence hopping flag value [0..1]");
4638 }
4639 }
dissect_ul_config_ulsch_pdu_rel11_value(ptvcursor_t * ptvc,packet_info * pinfo)4640 static void dissect_ul_config_ulsch_pdu_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo)
4641 {
4642 proto_item* item;
4643 guint32 test_value;
4644
4645 // Virtual cell ID enabled flag
4646 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_virtual_cell_id_enabled_flag, 1, ENC_BIG_ENDIAN, &test_value);
4647 if (test_value > 1)
4648 {
4649 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid virtual cell id enabled flag value [0..1]");
4650 }
4651
4652 // nPUSCH Identity
4653 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_npusch_identity, 2, ENC_BIG_ENDIAN, &test_value);
4654 if (test_value > 509)
4655 {
4656 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npusch identity value [0..509]");
4657 }
4658
4659 // DMRS Config flag
4660 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_drms_config_flag, 1, ENC_BIG_ENDIAN, &test_value);
4661 if (test_value > 1)
4662 {
4663 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms config flag value [0..1]");
4664 }
4665
4666 // nDMRS-CSH Identity
4667 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_ndrms_csh_identity, 2, ENC_BIG_ENDIAN, &test_value);
4668 if (test_value > 509)
4669 {
4670 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ndrms-csh identity value [0..509]");
4671 }
4672
4673 }
dissect_ul_config_ulsch_pdu_rel13_value(ptvcursor_t * ptvc,packet_info * pinfo)4674 static void dissect_ul_config_ulsch_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo)
4675 {
4676 proto_item* item;
4677 guint32 test_value;
4678
4679 // UE Type
4680 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_ue_type, 1, ENC_BIG_ENDIAN, &test_value);
4681 if (test_value > 2)
4682 {
4683 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue type value [0..2]");
4684 }
4685
4686 // Total Number of repetitions
4687 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_total_number_of_repetitions, 2, ENC_BIG_ENDIAN, &test_value);
4688 if (!(test_value >= 1 && test_value <= 2048))
4689 {
4690 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid total number of repetitions value [1..2048]");
4691 }
4692
4693 // Repetition Number
4694 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_repetition_number, 2, ENC_BIG_ENDIAN, &test_value);
4695 if (!(test_value >= 1 && test_value <= 2048))
4696 {
4697 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid repetition number value [1..2048]");
4698 }
4699
4700 // Initial transmission SF (io)
4701 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_initial_sf_io, 2, ENC_BIG_ENDIAN, &test_value);
4702 if (!(test_value <= 10239 || test_value == 0xFFFF))
4703 {
4704 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid repetition number value [0..10239, 0xFFFF]");
4705 }
4706
4707 // Empty symbols due to re-tunning
4708 // todo : decode as a bitmap
4709 ptvcursor_add(ptvc, hf_nfapi_empty_symbols_due_to_retunning, 1, ENC_BIG_ENDIAN);
4710 }
dissect_ul_config_init_tx_params_rel8_value(ptvcursor_t * ptvc,packet_info * pinfo)4711 static void dissect_ul_config_init_tx_params_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo)
4712 {
4713 proto_item* item;
4714 guint32 test_value;
4715
4716 // N srs initial
4717 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_n_srs_initial, 1, ENC_BIG_ENDIAN, &test_value);
4718 if (test_value > 1)
4719 {
4720 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n srs initial value [0..1]");
4721 }
4722
4723 // Initial number of resource blocks
4724 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_initial_number_of_resource_blocks, 1, ENC_BIG_ENDIAN, &test_value);
4725 if (!(test_value >= 1 && test_value <= 100))
4726 {
4727 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial number of resource blocks value [1..100]");
4728 }
4729
4730 }
dissect_ul_config_cqi_ri_info_rel8_value(ptvcursor_t * ptvc,packet_info * pinfo)4731 static void dissect_ul_config_cqi_ri_info_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo)
4732 {
4733 proto_item* item;
4734 guint32 test_value;
4735
4736 // DL CQI/PMI Size Rank = 1
4737 ptvcursor_add(ptvc, hf_nfapi_dl_cqi_pmi_size_rank_1, 1, ENC_BIG_ENDIAN);
4738
4739 // DL CQI/PMI Size Rank>1
4740 ptvcursor_add(ptvc, hf_nfapi_dl_cqi_pmi_size_rank_greater_1, 1, ENC_BIG_ENDIAN);
4741
4742 // RI Size
4743 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_ri_size, 1, ENC_BIG_ENDIAN, &test_value);
4744 if (test_value > 3)
4745 {
4746 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ri size value [0..3]");
4747 }
4748
4749 // Delta Offset CQI
4750 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_delta_offset_cqi, 1, ENC_BIG_ENDIAN, &test_value);
4751 if (test_value > 15)
4752 {
4753 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset cqi value [0..15]");
4754 }
4755
4756 // Delta Offset RI
4757 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_delta_offset_ri, 1, ENC_BIG_ENDIAN, &test_value);
4758 if (test_value > 15)
4759 {
4760 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset ri value [0..15]");
4761 }
4762
4763 }
dissect_ul_config_cqi_ri_info_rel9_later_value(ptvcursor_t * ptvc,packet_info * pinfo)4764 static void dissect_ul_config_cqi_ri_info_rel9_later_value(ptvcursor_t * ptvc, packet_info* pinfo)
4765 {
4766 proto_item* item;
4767 guint32 test_value;
4768 gboolean type, test_boolean;
4769
4770 // Report type
4771 item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_report_type, 1, ENC_BIG_ENDIAN, &type);
4772 if (type > 1)
4773 {
4774 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid report type value [0..1]");
4775 }
4776
4777 // Delta offset CQI
4778 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_delta_offset_cqi, 1, ENC_BIG_ENDIAN, &test_value);
4779 if (test_value > 15)
4780 {
4781 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset cqi value [0..15]");
4782 }
4783
4784 // Delta offset RI
4785 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_delta_offset_ri, 1, ENC_BIG_ENDIAN, &test_value);
4786 if (test_value > 15)
4787 {
4788 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset ri value [0..15]");
4789 }
4790
4791 switch (type)
4792 {
4793 case 0:
4794 {
4795 // DL CQI/PMI/RI size
4796 ptvcursor_add(ptvc, hf_nfapi_dl_cqi_ri_pmi_size, 1, ENC_BIG_ENDIAN);
4797
4798 // Control Type
4799 ptvcursor_add_ret_boolean(ptvc, hf_nfapi_control_type, 1, ENC_BIG_ENDIAN, &test_boolean);
4800 if (test_boolean > 1)
4801 {
4802 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid control type value [0..1]");
4803 }
4804 break;
4805 }
4806 case 1:
4807 {
4808 // todo : encoder not right for this case.
4809 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_cc, 1, ENC_BIG_ENDIAN, &test_value);
4810
4811 if (!(test_value >= 1 && test_value <= 32))
4812 {
4813 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of cc value [1..32]");
4814 }
4815
4816 /*
4817 ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "CCs");
4818
4819 for (int i = 0; i < num_cc; ++i)
4820 {
4821 ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "[%d]", i);
4822
4823 guint8 ri_size = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
4824 ptvcursor_add(ptvc, hf_nfapi_ri_size, 1, ENC_BIG_ENDIAN);
4825
4826 ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "Rank");
4827
4828 for (int j = 0; j < ri_size; ++j)
4829 {
4830 ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "[%d]", j);
4831 ptvcursor_add(ptvc, hf_nfapi_dl_cqi_pmi_size, 1, ENC_BIG_ENDIAN);
4832 ptvcursor_pop_subtree(ptvc);
4833 }
4834
4835 ptvcursor_pop_subtree(ptvc);
4836
4837 ptvcursor_pop_subtree(ptvc);
4838 }
4839
4840 ptvcursor_pop_subtree(ptvc);
4841 */
4842
4843 break;
4844 }
4845 }
4846 }
dissect_ul_config_cqi_ri_info_rel13_value(ptvcursor_t * ptvc,packet_info * pinfo)4847 static void dissect_ul_config_cqi_ri_info_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo)
4848 {
4849 guint32 test_value;
4850
4851 // DL CQI/PMI/RI size 2
4852 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_dl_cqi_ri_pmi_size_2, 2, ENC_BIG_ENDIAN, &test_value);
4853 if (test_value < 255)
4854 {
4855 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dl cqi ri pmi size 2 value [>= 255]");
4856 }
4857 }
dissect_ul_config_harq_info_ulsch_rel10_value(ptvcursor_t * ptvc,packet_info * pinfo)4858 static void dissect_ul_config_harq_info_ulsch_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo)
4859 {
4860 proto_item* item;
4861 guint32 test_value;
4862
4863 // HARQ Size
4864 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_harq_size, 1, ENC_BIG_ENDIAN, &test_value);
4865 if (test_value > 21)
4866 {
4867 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq size value [0..21]");
4868 }
4869
4870 // Delta Offset HARQ
4871 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_delta_offset_harq, 1, ENC_BIG_ENDIAN, &test_value);
4872 if (test_value > 15)
4873 {
4874 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset harq value [0..15]");
4875 }
4876
4877 // ACK_NACK mode
4878 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_tdd_ack_nack_mode, 1, ENC_BIG_ENDIAN, &test_value);
4879 if (test_value > 5)
4880 {
4881 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ack nack mode value [0..5]");
4882 }
4883 }
dissect_ul_config_harq_info_ulsch_rel13_value(ptvcursor_t * ptvc,packet_info * pinfo)4884 static void dissect_ul_config_harq_info_ulsch_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo)
4885 {
4886 proto_item* item;
4887 guint32 test_value;
4888
4889 // HARQ Size 2
4890 ptvcursor_add(ptvc, hf_nfapi_harq_size_2, 2, ENC_BIG_ENDIAN);
4891
4892 // Delta Offset HARQ 2
4893 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_delta_offset_harq_2, 1, ENC_BIG_ENDIAN, &test_value);
4894 if (test_value > 15)
4895 {
4896 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset harq 2 value [0..15]");
4897 }
4898 }
dissect_ul_config_ue_info_rel8_value(ptvcursor_t * ptvc,packet_info * pinfo)4899 static void dissect_ul_config_ue_info_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo)
4900 {
4901 proto_item* item;
4902 guint32 test_value;
4903
4904 // Handle
4905 ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN);
4906
4907 // RNTI
4908 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN, &test_value);
4909 if (test_value < 1)
4910 {
4911 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]");
4912 }
4913 }
dissect_ul_config_ue_info_rel11_value(ptvcursor_t * ptvc,packet_info * pinfo)4914 static void dissect_ul_config_ue_info_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo)
4915 {
4916 proto_item* item;
4917 guint32 test_value;
4918
4919 // Virtual cell ID enabled flag
4920 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_virtual_cell_id_enabled_flag, 1, ENC_BIG_ENDIAN, &test_value);
4921 if (test_value > 1)
4922 {
4923 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid virtual cell id enabled flag value [0..1]");
4924 }
4925
4926 // nPUCCH Identity
4927 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_npucch_identity, 2, ENC_BIG_ENDIAN, &test_value);
4928 if (test_value > 503)
4929 {
4930 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch identity value [0..503]");
4931 }
4932
4933 }
dissect_ul_config_ue_info_rel13_value(ptvcursor_t * ptvc,packet_info * pinfo)4934 static void dissect_ul_config_ue_info_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo)
4935 {
4936 proto_item* item;
4937 guint32 test_value;
4938
4939 // UE Type
4940 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_ue_type, 1, ENC_BIG_ENDIAN, &test_value);
4941 if (test_value > 2)
4942 {
4943 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue type value [0..2]");
4944 }
4945
4946 // Empty symbols
4947 // todo : use bit map decoding
4948 ptvcursor_add(ptvc, hf_nfapi_empty_symbols, 1, ENC_BIG_ENDIAN);
4949
4950 // Total Number of repetitions
4951 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_total_number_of_repetitions, 2, ENC_BIG_ENDIAN, &test_value);
4952 if (!(test_value >= 1 && test_value <= 32))
4953 {
4954 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid total number of repetitions value [1..32]");
4955 }
4956
4957 // Repetition Number
4958 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_repetition_number, 2, ENC_BIG_ENDIAN, &test_value);
4959 if (!(test_value >= 1 && test_value <= 32))
4960 {
4961 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid repetition number value [1..32]");
4962 }
4963
4964 }
dissect_ul_config_cqi_info_rel8_value(ptvcursor_t * ptvc,packet_info * pinfo)4965 static void dissect_ul_config_cqi_info_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo)
4966 {
4967 proto_item* item;
4968 guint32 test_value;
4969
4970 // PUCCH index
4971 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_pucch_index, 2, ENC_BIG_ENDIAN, &test_value);
4972 if (test_value > 1184)
4973 {
4974 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch Index value [0..1184]");
4975 }
4976
4977 // DL CQI/PMI Size
4978 ptvcursor_add(ptvc, hf_nfapi_dl_cqi_pmi_size, 1, ENC_BIG_ENDIAN);
4979 }
dissect_ul_config_cqi_info_rel10_value(ptvcursor_t * ptvc,packet_info * pinfo)4980 static void dissect_ul_config_cqi_info_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo)
4981 {
4982 proto_item* item;
4983 guint32 test_value;
4984
4985 // Number of PUCCH Resources
4986 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_pucch_resource, 1, ENC_BIG_ENDIAN, &test_value);
4987 if (!(test_value >= 1 && test_value <= 2))
4988 {
4989 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pucch resources value [1..2]");
4990 }
4991
4992 //PUCCH Index P1
4993 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_pucch_index_p1, 2, ENC_BIG_ENDIAN, &test_value);
4994 if (test_value > 1184)
4995 {
4996 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch Index p1 value [0..1184]");
4997 }
4998 }
dissect_ul_config_cqi_info_rel13_value(ptvcursor_t * ptvc,packet_info * pinfo)4999 static void dissect_ul_config_cqi_info_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo)
5000 {
5001 proto_item* item;
5002 guint32 test_value;
5003
5004 // CSI_mode
5005 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_csi_mode, 1, ENC_BIG_ENDIAN, &test_value);
5006 if (test_value > 2)
5007 {
5008 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi mode value [0..2]");
5009 }
5010
5011 // DL CQI/PMI Size 2
5012 ptvcursor_add(ptvc, hf_nfapi_dl_cqi_pmi_size_2, 2, ENC_BIG_ENDIAN);
5013
5014 // Starting PRB
5015 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_statring_prb, 1, ENC_BIG_ENDIAN, &test_value);
5016 if (test_value > 109)
5017 {
5018 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid starting prb value [0..109]");
5019 }
5020
5021 // n_PRB
5022 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_nprb, 1, ENC_BIG_ENDIAN, &test_value);
5023 if (test_value > 7)
5024 {
5025 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n prb value [0..7]");
5026 }
5027
5028 // cdm_Index
5029 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_cdm_index, 1, ENC_BIG_ENDIAN, &test_value);
5030 if (test_value > 1)
5031 {
5032 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cdm Index value [0..1]");
5033 }
5034
5035 // N srs
5036 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_nsrs, 1, ENC_BIG_ENDIAN, &test_value);
5037 if (test_value > 1)
5038 {
5039 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n srs value [0..1]");
5040 }
5041
5042 }
dissect_ul_config_sr_info_rel8_value(ptvcursor_t * ptvc,packet_info * pinfo)5043 static void dissect_ul_config_sr_info_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo)
5044 {
5045 guint32 test_value;
5046 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_pucch_index, 1, ENC_BIG_ENDIAN, &test_value);
5047 if (test_value > 2047)
5048 {
5049 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch Index value [0..2047]");
5050 }
5051 }
dissect_ul_config_sr_info_rel10_value(ptvcursor_t * ptvc,packet_info * pinfo)5052 static void dissect_ul_config_sr_info_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo)
5053 {
5054 proto_item* item;
5055 guint32 test_value;
5056
5057 // Number of PUCCH Resources
5058 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_pucch_resource, 1, ENC_BIG_ENDIAN, &test_value);
5059 if (!(test_value >= 1 && test_value <= 2))
5060 {
5061 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pucch resources value [1..2]");
5062 }
5063
5064 // PUCCH Index P1
5065 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_pucch_index_p1, 2, ENC_BIG_ENDIAN, &test_value);
5066 if (test_value > 2047)
5067 {
5068 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch Index p1 value [0..2047]");
5069 }
5070 }
dissect_ul_config_harq_info_uci_rel10_tdd_value(ptvcursor_t * ptvc,packet_info * pinfo)5071 static void dissect_ul_config_harq_info_uci_rel10_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo)
5072 {
5073 proto_item* item;
5074 guint32 test_value, ack_nack_mode_value;
5075
5076 // HARQ size
5077 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_harq_size, 1, ENC_BIG_ENDIAN, &test_value);
5078 if (test_value > 21)
5079 {
5080 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq size value [0..21]");
5081 }
5082
5083 // ACK_NACK mode
5084 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_tdd_ack_nack_mode, 1, ENC_BIG_ENDIAN, &ack_nack_mode_value);
5085 if (ack_nack_mode_value > 5)
5086 {
5087 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ack nack mode value [0..5]");
5088 }
5089
5090 // Number of PUCCH resources
5091 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_pucch_resource, 1, ENC_BIG_ENDIAN, &test_value);
5092 if (test_value > 4)
5093 {
5094 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pucch resources value [0..4]");
5095 }
5096
5097 // n_PUCCH_1_0
5098 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_n_pucch_1_0, 2, ENC_BIG_ENDIAN, &test_value);
5099 if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1 || ack_nack_mode_value == 2)
5100 {
5101 if (test_value > 2047)
5102 {
5103 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 0 value [0..2047] (All Format 1a/1b)");
5104 }
5105 }
5106 else if (ack_nack_mode_value == 3)
5107 {
5108 if (test_value > 549)
5109 {
5110 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 0 value [0..549] (Format 3)");
5111 }
5112 }
5113
5114 // n_PUCCH_1_1
5115 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_n_pucch_1_1, 2, ENC_BIG_ENDIAN, &test_value);
5116 if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1 || ack_nack_mode_value == 2)
5117 {
5118 if (test_value > 2047)
5119 {
5120 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 1 value [0..2047] (All Format 1a/1b)");
5121 }
5122 }
5123
5124 // n_PUCCH_1_2
5125 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_n_pucch_1_2, 2, ENC_BIG_ENDIAN, &test_value);
5126 if (ack_nack_mode_value == 2)
5127 {
5128 if (test_value > 2047)
5129 {
5130 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 2 value [0..2047] (All Format 1a/1b)");
5131 }
5132 }
5133
5134 // n_PUCCH_1_3
5135 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_n_pucch_1_3, 2, ENC_BIG_ENDIAN, &test_value);
5136 if (ack_nack_mode_value == 2)
5137 {
5138 if (test_value > 2047)
5139 {
5140 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 3 value [0..2047] (All Format 1a/1b)");
5141 }
5142 }
5143 }
dissect_ul_config_harq_info_uci_rel8_fdd_value(ptvcursor_t * ptvc,packet_info * pinfo)5144 static void dissect_ul_config_harq_info_uci_rel8_fdd_value(ptvcursor_t * ptvc, packet_info* pinfo)
5145 {
5146 proto_item* item;
5147 guint32 test_value;
5148
5149 // n_PUCCH_1_0
5150 // todo : how to work out the ack_nack mode?
5151 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_n_pucch_1_0, 2, ENC_BIG_ENDIAN, &test_value);
5152 if (test_value > 2047)
5153 {
5154 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 0 value [0..2047]");
5155 }
5156
5157 // HARQ Size
5158 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_harq_size, 1, ENC_BIG_ENDIAN, &test_value);
5159 if (!(test_value >= 1 && test_value <= 2))
5160 {
5161 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq size value [1..2]");
5162 }
5163 }
dissect_ul_config_harq_info_uci_rel9_later_fdd_value(ptvcursor_t * ptvc,packet_info * pinfo)5164 static void dissect_ul_config_harq_info_uci_rel9_later_fdd_value(ptvcursor_t * ptvc, packet_info* pinfo)
5165 {
5166 proto_item *item, *harq_size_item;
5167 guint32 test_value, harq_size_value, ack_nack_mode_value;
5168
5169 // HARQ Size
5170 harq_size_item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_harq_size, 1, ENC_BIG_ENDIAN, &harq_size_value);
5171
5172 // ACK_NAK mode
5173 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_fdd_ack_nack_mode, 1, ENC_BIG_ENDIAN, &ack_nack_mode_value);
5174 if (ack_nack_mode_value > 4)
5175 {
5176 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ack nack mode value [0..4]");
5177 }
5178
5179 if (ack_nack_mode_value == 0 || ack_nack_mode_value == 2)
5180 {
5181 if (!(harq_size_value >= 1 && harq_size_value <= 10))
5182 {
5183 expert_add_info_format(pinfo, harq_size_item, &ei_invalid_range, "Invalid harq size value [1..10] (Format 1a/1b/3)");
5184 }
5185 }
5186 else if (ack_nack_mode_value == 3 || ack_nack_mode_value == 4)
5187 {
5188 if (harq_size_value != 0)
5189 {
5190 expert_add_info_format(pinfo, harq_size_item, &ei_invalid_range, "Invalid harq size value [0] (Format 4/5)");
5191 }
5192 }
5193
5194 // Number of PUCCH Resources
5195 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_pucch_resource, 1, ENC_BIG_ENDIAN, &test_value);
5196 if (test_value == 0 || test_value == 2)
5197 {
5198 if (!(harq_size_value >= 1 && harq_size_value <= 4))
5199 {
5200 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq size value [1..4] (Format 1a/1b/3)");
5201 }
5202 }
5203 else if (test_value == 3 || test_value == 4)
5204 {
5205 if (harq_size_value != 0)
5206 {
5207 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq size value [0] (Format 4/5)");
5208 }
5209 }
5210
5211 // n_PUCCH_1_0
5212 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_n_pucch_1_0, 2, ENC_BIG_ENDIAN, &test_value);
5213 if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1)
5214 {
5215 if (test_value > 2047)
5216 {
5217 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 1 0 value [0..2047] (Format 1a/1b/channel selection)");
5218 }
5219 }
5220 else if (ack_nack_mode_value == 2)
5221 {
5222 if (test_value > 549)
5223 {
5224 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 1 0 value [0..549] (Format 3)");
5225 }
5226 }
5227
5228 // n_PUCCH_1_1
5229 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_n_pucch_1_1, 2, ENC_BIG_ENDIAN, &test_value);
5230 if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1)
5231 {
5232 if (test_value > 2047)
5233 {
5234 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 1 1 value [0..2047] (Format 1a/1b/channel selection)");
5235 }
5236 }
5237
5238 // n_PUCCH_1_2
5239 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_n_pucch_1_2, 2, ENC_BIG_ENDIAN, &test_value);
5240 if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1)
5241 {
5242 if (test_value > 2047)
5243 {
5244 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 1 2 value [0..2047] (Format 1a/1b/channel selection)");
5245 }
5246 }
5247
5248 // n_PUCCH_1_3
5249 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_n_pucch_1_3, 2, ENC_BIG_ENDIAN, &test_value);
5250 if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1)
5251 {
5252 if (test_value > 2047)
5253 {
5254 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 1 3 value [0..2047] (Format 1a/1b/channel selection)");
5255 }
5256 }
5257 }
dissect_ul_config_harq_info_uci_rel11_fdd_tdd_value(ptvcursor_t * ptvc,packet_info * pinfo)5258 static void dissect_ul_config_harq_info_uci_rel11_fdd_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo)
5259 {
5260 proto_item* item;
5261 guint32 test_value;
5262
5263 // Num_ant_ports
5264 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_num_ant_ports, 1, ENC_BIG_ENDIAN, &test_value);
5265 if (!(test_value >= 1 && test_value <= 2))
5266 {
5267 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid num ant ports value [1..2]");
5268 }
5269
5270 // n_PUCCH_2_0
5271 // todo : how to work out the ack nack mode
5272 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_n_pucch_2_0, 2, ENC_BIG_ENDIAN, &test_value);
5273 if (test_value > 2047)
5274 {
5275 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 2 0 value [0..2047]");
5276 }
5277
5278 // n_PUCCH_2_1
5279 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_n_pucch_2_1, 2, ENC_BIG_ENDIAN, &test_value);
5280 if (test_value > 2047)
5281 {
5282 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 2 1 value [0..2047]");
5283 }
5284
5285 // n_PUCCH_2_2
5286 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_n_pucch_2_2, 2, ENC_BIG_ENDIAN, &test_value);
5287 if (test_value > 2047)
5288 {
5289 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 2 2 value [0..2047]");
5290 }
5291
5292 // n_PUCCH_2_3
5293 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_n_pucch_2_3, 2, ENC_BIG_ENDIAN, &test_value);
5294 if (test_value > 2047)
5295 {
5296 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 2 3 value [0..2047]");
5297 }
5298
5299 }
dissect_ul_config_harq_info_uci_rel13_fdd_tdd_value(ptvcursor_t * ptvc,packet_info * pinfo)5300 static void dissect_ul_config_harq_info_uci_rel13_fdd_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo)
5301 {
5302 proto_item* item;
5303 guint32 test_value;
5304
5305 // HARQ Size 2
5306 ptvcursor_add(ptvc, hf_nfapi_harq_size_2, 2, ENC_BIG_ENDIAN);
5307
5308 // Starting PRB
5309 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_starting_prb, 1, ENC_BIG_ENDIAN, &test_value);
5310 if (test_value > 109)
5311 {
5312 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid starting prb value [0..109]");
5313 }
5314
5315 // n_PRB
5316 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_nprb, 1, ENC_BIG_ENDIAN, &test_value);
5317 if (test_value > 109)
5318 {
5319 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n prb value [0..7]");
5320 }
5321
5322 // cdm_Index
5323 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_cdm_index, 1, ENC_BIG_ENDIAN, &test_value);
5324 if (test_value > 1)
5325 {
5326 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cdm Index value [0..1]");
5327 }
5328
5329 // N srs
5330 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_nsrs, 1, ENC_BIG_ENDIAN, &test_value);
5331 if (test_value > 1)
5332 {
5333 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n srs value [0..1]");
5334 }
5335 }
dissect_ul_config_srs_info_rel8_value(ptvcursor_t * ptvc,packet_info * pinfo)5336 static void dissect_ul_config_srs_info_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo)
5337 {
5338 proto_item* item;
5339 guint32 test_value;
5340
5341 // Handle
5342 ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN);
5343
5344 // Size
5345 ptvcursor_add(ptvc, hf_nfapi_size, 2, ENC_BIG_ENDIAN);
5346
5347 // RNTI
5348 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN, &test_value);
5349 if (test_value < 1)
5350 {
5351 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]");
5352 }
5353
5354 // SRS Bandwidth
5355 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_srs_bandwidth, 1, ENC_BIG_ENDIAN, &test_value);
5356 if (test_value > 3)
5357 {
5358 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs bandwidth value [0..3]");
5359 }
5360
5361 // Frequency Domain Position
5362 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_frequency_domain_position, 1, ENC_BIG_ENDIAN, &test_value);
5363 if (test_value > 23)
5364 {
5365 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency domain bandwidth value [0..23]");
5366 }
5367
5368 // SRS Hopping Bandwidth
5369 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_srs_hopping_bandwidth, 1, ENC_BIG_ENDIAN, &test_value);
5370 if (test_value > 3)
5371 {
5372 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs hopping bandwidth value [0..3]");
5373 }
5374
5375 // Transmission Comb
5376 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_transmission_comb, 1, ENC_BIG_ENDIAN, &test_value);
5377 if (test_value > 3)
5378 {
5379 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission comb value [0..3]");
5380 }
5381
5382 // ISRS / SRS-ConfigIndex
5383 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_i_srs, 2, ENC_BIG_ENDIAN, &test_value);
5384 if (test_value > 1023)
5385 {
5386 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid isrs/srs-configindex value [0..1023]");
5387 }
5388
5389 // Sounding Reference Cyclic Shift
5390 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_sounding_reference_cyclic_shift, 1, ENC_BIG_ENDIAN, &test_value);
5391 if (test_value > 11)
5392 {
5393 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid sounding reference cyclic shift value [0..11]");
5394 }
5395 }
dissect_ul_config_srs_info_rel10_value(ptvcursor_t * ptvc,packet_info * pinfo)5396 static void dissect_ul_config_srs_info_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo)
5397 {
5398 guint32 test_value;
5399
5400 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_antenna_port, 1, ENC_BIG_ENDIAN, &test_value);
5401 if (test_value > 2)
5402 {
5403 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid antenna port value [0..2]");
5404 }
5405 }
dissect_ul_config_srs_info_rel13_value(ptvcursor_t * ptvc,packet_info * pinfo)5406 static void dissect_ul_config_srs_info_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo)
5407 {
5408 guint32 test_value;
5409
5410 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_combs, 1, ENC_BIG_ENDIAN, &test_value);
5411 if (test_value > 1)
5412 {
5413 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of combs value [0..1]");
5414 }
5415 }
dissect_hi_dci0_pdu(ptvcursor_t * ptvc,packet_info * pinfo)5416 static void dissect_hi_dci0_pdu(ptvcursor_t * ptvc, packet_info* pinfo)
5417 {
5418 guint32 test_value, size;
5419
5420 // PDU Type
5421 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_hi_dci0_pdu_type, 1, ENC_BIG_ENDIAN, &test_value);
5422 if (test_value > 3)
5423 {
5424 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdu type value [0..3]");
5425 }
5426
5427 // PDU Size
5428 ptvcursor_add_ret_uint(ptvc, hf_nfapi_pdu_size, 1, ENC_BIG_ENDIAN, &size);
5429
5430 guint pdu_end = (ptvcursor_current_offset(ptvc) + size - 2);
5431 dissect_tlv_list(ptvc, pinfo, pdu_end);
5432 }
dissect_hi_dci0_request_body_value(ptvcursor_t * ptvc,packet_info * pinfo)5433 static void dissect_hi_dci0_request_body_value(ptvcursor_t * ptvc, packet_info* pinfo)
5434 {
5435 guint32 test_value, num_pdu;
5436
5437 // SFN/SF
5438 ptvcursor_add(ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN);
5439
5440 // Number of DCI
5441 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_dci_pdus, 1, ENC_BIG_ENDIAN, &num_pdu);
5442
5443 // Number of HI
5444 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_hi_pdus, 1, ENC_BIG_ENDIAN, &test_value);
5445 num_pdu += test_value;
5446
5447 dissect_array_value(ptvc, pinfo, "HI DCI0 PDU List", ett_nfapi_hi_dci0_request_pdu_list, num_pdu, dissect_hi_dci0_pdu);
5448 }
dissect_hi_dci0_hi_rel8_value(ptvcursor_t * ptvc,packet_info * pinfo)5449 static void dissect_hi_dci0_hi_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo)
5450 {
5451 proto_item* item;
5452 guint32 test_value;
5453 gboolean test_boolean;
5454
5455 // Resource block start
5456 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_resource_block_start, 1, ENC_BIG_ENDIAN, &test_value);
5457 if (test_value > 100)
5458 {
5459 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block start value [0..100]");
5460 }
5461
5462 // Cyclic Shift 2 for DMRS
5463 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_cyclic_shift_2_for_drms, 1, ENC_BIG_ENDIAN, &test_value);
5464 if (test_value > 7)
5465 {
5466 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cyclic shift 2 for drms value [0..7]");
5467 }
5468
5469 // HI value
5470 item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_hi_value, 1, ENC_BIG_ENDIAN, &test_boolean);
5471 if (test_boolean > 1)
5472 {
5473 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid hi value [0..1]");
5474 }
5475
5476 // I_PHICH
5477 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_i_phich, 1, ENC_BIG_ENDIAN, &test_value);
5478 if (test_value > 1)
5479 {
5480 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid i phich value [0..1]");
5481 }
5482
5483 // Transmission power
5484 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN, &test_value);
5485 if (test_value > 10000)
5486 {
5487 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]");
5488 }
5489
5490 }
dissect_hi_dci0_hi_rel10_value(ptvcursor_t * ptvc,packet_info * pinfo)5491 static void dissect_hi_dci0_hi_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo)
5492 {
5493 proto_item* item;
5494 gboolean test_boolean;
5495
5496 // Flag TB2
5497 item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_flag_tb2, 1, ENC_BIG_ENDIAN, &test_boolean);
5498 if (test_boolean > 1)
5499 {
5500 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid flag tb2 value [0..1]");
5501 }
5502
5503 // HI Value 2
5504 item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_hi_value_2, 1, ENC_BIG_ENDIAN, &test_boolean);
5505 if (test_boolean > 1)
5506 {
5507 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid hi2 value [0..1]");
5508 }
5509
5510 }
dissect_hi_dci0_dci_ul_rel8_value(ptvcursor_t * ptvc,packet_info * pinfo)5511 static void dissect_hi_dci0_dci_ul_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo)
5512 {
5513 proto_item* item;
5514 guint32 test_value;
5515
5516 // DCI format
5517 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_ul_dci_format, 1, ENC_BIG_ENDIAN, &test_value);
5518 if (test_value > 4)
5519 {
5520 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci format value [0..4]");
5521 }
5522
5523 // CCE index
5524 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_cce_idx, 1, ENC_BIG_ENDIAN, &test_value);
5525 if (test_value > 88)
5526 {
5527 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cce Index value [0..88]");
5528 }
5529
5530 // Aggregation level
5531 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_aggregation_level, 1, ENC_BIG_ENDIAN, &test_value);
5532 if (!(test_value == 1 || test_value == 2 || test_value == 4 ||
5533 test_value == 8))
5534 {
5535 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid aggregation level value [1, 2, 4, 8]");
5536 }
5537
5538 // RNTI
5539 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN, &test_value);
5540 if (test_value < 1)
5541 {
5542 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]");
5543 }
5544
5545 // Resource block start
5546 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_resource_block_start, 1, ENC_BIG_ENDIAN, &test_value);
5547 if (test_value > 100)
5548 {
5549 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block start value [0..100]");
5550 }
5551
5552 // Number of resource blocks
5553 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_resource_blocks, 1, ENC_BIG_ENDIAN, &test_value);
5554 if (test_value > 100)
5555 {
5556 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of resource blocks value [0..100]");
5557 }
5558
5559 // MCS_1
5560 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_mcs_1, 1, ENC_BIG_ENDIAN, &test_value);
5561 if (test_value > 31)
5562 {
5563 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs 1 value [0..31]");
5564 }
5565
5566 // Cyclic Shift 2 for DMRS
5567 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_cyclic_shift_2_for_drms, 1, ENC_BIG_ENDIAN, &test_value);
5568 if (test_value > 7)
5569 {
5570 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cyclic shift 2 for drms value [0..7]");
5571 }
5572
5573 // Frequency hopping enabled flag
5574 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_frequency_hopping_enabled_flag, 1, ENC_BIG_ENDIAN, &test_value);
5575 if (test_value > 1)
5576 {
5577 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping enabled flag value [0..1]");
5578 }
5579
5580 // Frequency hopping bits
5581 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_frequency_hopping_bits, 1, ENC_BIG_ENDIAN, &test_value);
5582 if (test_value > 3)
5583 {
5584 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping bits value [0..3]");
5585 }
5586
5587 // New Data indication_1
5588 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_new_data_indication, 1, ENC_BIG_ENDIAN, &test_value);
5589 if (test_value > 1)
5590 {
5591 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indication value [0..1]");
5592 }
5593
5594 // UE TX antenna selection
5595 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_ue_tx_antenna_selection, 1, ENC_BIG_ENDIAN, &test_value);
5596 if (test_value > 2)
5597 {
5598 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue tx antenna selection value [0..2]");
5599 }
5600
5601 // TPC
5602 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_tpc, 1, ENC_BIG_ENDIAN, &test_value);
5603 if (test_value > 3)
5604 {
5605 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpc value value [0..3]");
5606 }
5607
5608 // CQI/CSI request
5609 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_cqi_csi_request, 1, ENC_BIG_ENDIAN, &test_value);
5610 if (test_value > 7)
5611 {
5612 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cqi csi value [0..7]");
5613 }
5614
5615 // UL index
5616 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_ul_index, 1, ENC_BIG_ENDIAN, &test_value);
5617 if (test_value > 3)
5618 {
5619 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul Index value [0..3]");
5620 }
5621
5622 // DL assignment index
5623 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_dl_assignment_index, 1, ENC_BIG_ENDIAN, &test_value);
5624 if (!(test_value >= 1 && test_value <= 4))
5625 {
5626 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dl assignment Index value [1..4]");
5627 }
5628
5629 // TPC bitmap
5630 ptvcursor_add(ptvc, hf_nfapi_tpc_bitmap, 4, ENC_BIG_ENDIAN);
5631
5632 // Transmission power
5633 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN, &test_value);
5634 if (test_value > 10000)
5635 {
5636 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]");
5637 }
5638 }
5639
dissect_hi_dci0_dci_ul_rel10_value(ptvcursor_t * ptvc,packet_info * pinfo)5640 static void dissect_hi_dci0_dci_ul_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo)
5641 {
5642 proto_item* item;
5643 guint32 test_value, number_of_antenna_ports_value;
5644 gboolean test_boolean;
5645
5646 // Cross carrier scheduling flag
5647 item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_cross_carrier_scheduling_flag, 1, ENC_BIG_ENDIAN, &test_boolean);
5648 if (test_boolean > 1)
5649 {
5650 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cross carrier scheduling flag value [0..1]");
5651 }
5652
5653 // Carrier indicator
5654 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_carrier_indicator, 1, ENC_BIG_ENDIAN, &test_value);
5655 if (test_value > 7)
5656 {
5657 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid carrier indicator value [0..7]");
5658 }
5659
5660 // Size of CQI/CSI field
5661 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_size_of_cqi_csi_field, 1, ENC_BIG_ENDIAN, &test_value);
5662 if (test_value > 2)
5663 {
5664 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid size of cqi/csi field value [0..2]");
5665 }
5666
5667 // SRS flag
5668 item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_srs_flag, 1, ENC_BIG_ENDIAN, &test_boolean);
5669 if (test_boolean > 1)
5670 {
5671 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs field value [0..1]");
5672 }
5673
5674 // SRS request
5675 ptvcursor_add(ptvc, hf_nfapi_srs_request, 1, ENC_BIG_ENDIAN);
5676
5677 // Resource allocation flag
5678 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_resource_allocation_flag, 1, ENC_BIG_ENDIAN, &test_value);
5679 if (test_value > 1)
5680 {
5681 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocation flag value [0..1]");
5682 }
5683
5684 // Resource allocation type
5685 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN, &test_value);
5686 if (test_value > 1)
5687 {
5688 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocation type value [0..1]");
5689 }
5690
5691 // Resource block coding
5692 ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN);
5693
5694 // MCS_2
5695 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_mcs_2, 1, ENC_BIG_ENDIAN, &test_value);
5696 if (test_value > 31)
5697 {
5698 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs 2 value [0..31]");
5699 }
5700
5701 // New data indication_2
5702 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_new_data_indication_two, 1, ENC_BIG_ENDIAN, &test_value);
5703 if (test_value > 1)
5704 {
5705 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indication 2 value [0..1]");
5706 }
5707
5708 // Number of antenna ports
5709 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_antenna_ports, 1, ENC_BIG_ENDIAN, &number_of_antenna_ports_value);
5710 if (number_of_antenna_ports_value > 2)
5711 {
5712 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of antenna ports value [0..2]");
5713 }
5714
5715 // TPMI
5716 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_tpmi, 1, ENC_BIG_ENDIAN, &test_value);
5717 if (number_of_antenna_ports_value == 2)
5718 {
5719 if (test_value > 7)
5720 {
5721 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi value [0..7]");
5722 }
5723 }
5724 else if (number_of_antenna_ports_value == 4)
5725 {
5726 if (test_value > 63)
5727 {
5728 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi value [0..63]");
5729 }
5730 }
5731
5732 // Total DCI length including padding
5733 ptvcursor_add(ptvc, hf_nfapi_total_dci_length_including_padding, 1, ENC_BIG_ENDIAN);
5734
5735 // N_UL_RB
5736 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_n_ul_rb, 1, ENC_BIG_ENDIAN, &test_value);
5737 if (!(test_value == 6 || test_value == 15 || test_value == 25 || test_value == 50 ||
5738 test_value == 75 || test_value == 100))
5739 {
5740 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n ul rb value [6, 15, 25, 50, 75, 100]");
5741 }
5742 }
dissect_hi_dci0_dci_ul_rel12_value(ptvcursor_t * ptvc,packet_info * pinfo)5743 static void dissect_hi_dci0_dci_ul_rel12_value(ptvcursor_t * ptvc, packet_info* pinfo)
5744 {
5745 proto_item* item;
5746 guint32 test_value;
5747
5748 // PSCCH Resource
5749 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_pscch_resource, 1, ENC_BIG_ENDIAN, &test_value);
5750 if (test_value > 0x3F)
5751 {
5752 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pscch resource value [0..0x3F]");
5753 }
5754
5755 // Time resource pattern
5756 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_time_resource_pattern, 1, ENC_BIG_ENDIAN, &test_value);
5757 if (test_value > 0x7F)
5758 {
5759 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid time resource pattern value [0..0x7F]");
5760 }
5761
5762 }
dissect_hi_dci0_mdpcch_dci_ul_rel13_value(ptvcursor_t * ptvc,packet_info * pinfo)5763 static void dissect_hi_dci0_mdpcch_dci_ul_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo)
5764 {
5765 proto_item* item;
5766 guint32 test_value, dci_format_value, count;
5767 gboolean test_boolean;
5768
5769 // MPDCCH Narrowband
5770 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_mpdcch_narrowband, 1, ENC_BIG_ENDIAN, &test_value);
5771 if (test_value > 15)
5772 {
5773 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mpdcch narrowband value [0..15]");
5774 }
5775
5776 // Number of PRB pairs
5777 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_prb_pairs, 1, ENC_BIG_ENDIAN, &test_value);
5778 if (!(test_value == 2 || test_value == 4 || test_value == 6))
5779 {
5780 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of prb pairs value [2, 4, 6]");
5781 }
5782
5783 // Resource Block Assignment
5784 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_resource_block_assignment, 1, ENC_BIG_ENDIAN, &test_value);
5785 if (test_value > 14)
5786 {
5787 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block assignment value [0..14]");
5788 }
5789
5790 // MPDCCH transmission type
5791 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_mpdcch_transmission_type, 1, ENC_BIG_ENDIAN, &test_value);
5792 if (test_value > 1)
5793 {
5794 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mpdcch transmission type value [0..1]");
5795 }
5796
5797 // Start symbol
5798 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_start_symbol, 1, ENC_BIG_ENDIAN, &test_value);
5799 if (!(test_value >= 1 && test_value <=4))
5800 {
5801 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid start symbol value [0..1]");
5802 }
5803
5804 // ECCE index
5805 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_ecce_index, 1, ENC_BIG_ENDIAN, &test_value);
5806 if (test_value > 22)
5807 {
5808 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ecce Index value [0..22]");
5809 }
5810
5811 // Aggregation level
5812 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_aggregation_level, 1, ENC_BIG_ENDIAN, &test_value);
5813 if (!(test_value == 2 || test_value == 4 || test_value == 8 ||
5814 test_value == 16 || test_value == 24))
5815 {
5816 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid aggregation level value [2, 4, 8, 16, 24]");
5817 }
5818
5819 // RNTI type
5820 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_mpdcch_rnti_type, 1, ENC_BIG_ENDIAN, &test_value);
5821 if (!(test_value == 0 || test_value == 4))
5822 {
5823 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti type value [0, 4]");
5824 }
5825
5826 // RNTI
5827 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN, &test_value);
5828 if (test_value < 1)
5829 {
5830 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]");
5831 }
5832
5833 // CEMode
5834 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_ce_mode, 1, ENC_BIG_ENDIAN, &test_value);
5835 if (!(test_value == 1 || test_value == 2))
5836 {
5837 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cemode value [1,2]");
5838 }
5839
5840 // DMRS scrambling init
5841 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_drms_scrambling_init, 2, ENC_BIG_ENDIAN, &test_value);
5842 if (test_value < 503)
5843 {
5844 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms scrambling init value [0..503]");
5845 }
5846
5847 // Initial transmission SF (io)
5848 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_initial_transmission_sf, 2, ENC_BIG_ENDIAN, &test_value);
5849 if (!(test_value <= 10239 || test_value == 0xFFFF))
5850 {
5851 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial transmission sf io value [0..10239, 0xFFFF]");
5852 }
5853
5854 // Transmission power
5855 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN, &test_value);
5856 if (test_value > 10000)
5857 {
5858 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]");
5859 }
5860
5861 // DCI format
5862 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_mpdcch_ul_dci_format, 1, ENC_BIG_ENDIAN, &dci_format_value);
5863 if (!(dci_format_value == 1 || dci_format_value == 2 || dci_format_value == 4 || dci_format_value == 5))
5864 {
5865 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci format value [1, 2, 4, 5]");
5866 }
5867
5868 // Resource block start
5869 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_resource_block_start, 1, ENC_BIG_ENDIAN, &test_value);
5870 if (test_value > 99)
5871 {
5872 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block start value [0..99]");
5873 }
5874
5875 // Number of resource blocks
5876 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_resource_blocks, 1, ENC_BIG_ENDIAN, &test_value);
5877 if (!(test_value >= 1 && test_value <= 6))
5878 {
5879 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of resource blocks value [1..6]");
5880 }
5881
5882 // MCS
5883 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_mcs, 1, ENC_BIG_ENDIAN, &test_value);
5884 if (test_value > 15)
5885 {
5886 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs value [0..15]");
5887 }
5888
5889 // PUSCH repetition levels
5890 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_pusch_repetition_levels, 1, ENC_BIG_ENDIAN, &test_value);
5891 if (dci_format_value == 4)
5892 {
5893 if (!(test_value >= 1 && test_value <= 4))
5894 {
5895 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pusch repetition levels value [1..4]");
5896 }
5897 }
5898 else if (dci_format_value == 5)
5899 {
5900 if (!(test_value >= 1 && test_value <= 8))
5901 {
5902 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pusch repetition levels value [1..8]");
5903 }
5904 }
5905
5906 // Frequency hopping flag
5907 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_frequency_hopping_flag, 1, ENC_BIG_ENDIAN, &test_value);
5908 if (test_value > 1)
5909 {
5910 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping flag value [0..1]");
5911 }
5912
5913 // New Data indication
5914 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_new_data_indication, 1, ENC_BIG_ENDIAN, &test_value);
5915 if (test_value > 1)
5916 {
5917 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indication value [0..1]");
5918 }
5919
5920 // HARQ process
5921 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_harq_process, 1, ENC_BIG_ENDIAN, &test_value);
5922 if (test_value > 7)
5923 {
5924 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq process value [0..7]");
5925 }
5926
5927 // Redundancy version
5928 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_redundancy_version, 1, ENC_BIG_ENDIAN, &test_value);
5929 if (test_value > 3)
5930 {
5931 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy version value [0..3]");
5932 }
5933
5934 // TPC
5935 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_tpc, 1, ENC_BIG_ENDIAN, &test_value);
5936 if (test_value > 3)
5937 {
5938 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpc value [0..3]");
5939 }
5940
5941 // CSI request
5942 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_csi_request, 1, ENC_BIG_ENDIAN, &test_value);
5943 if (test_value > 1)
5944 {
5945 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi request value [0..1]");
5946 }
5947
5948 // UL index
5949 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_ul_index, 1, ENC_BIG_ENDIAN, &test_value);
5950 if (test_value > 3)
5951 {
5952 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul Index value [0..3]");
5953 }
5954
5955 // DAI presence flag
5956 item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_dai_presence_flag, 1, ENC_BIG_ENDIAN, &test_boolean);
5957 if (test_boolean > 1)
5958 {
5959 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dai presence value [0..1]");
5960 }
5961
5962 // DL assignment index
5963 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_dl_assignment_index, 1, ENC_BIG_ENDIAN, &test_value);
5964 if (!(test_value >=1 && test_value <= 4))
5965 {
5966 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dl assignment value [1, 2, 3, 4]");
5967 }
5968
5969 // SRS request
5970 item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_srs_request, 1, ENC_BIG_ENDIAN, &test_boolean);
5971 if (test_boolean > 1)
5972 {
5973 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs request value [0..1]");
5974 }
5975
5976 // DCI subframe repetition number
5977 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_dci_subframe_repetition_number, 1, ENC_BIG_ENDIAN, &test_value);
5978 if (!(test_value >= 1 && test_value <= 4))
5979 {
5980 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci subframe repetition number value [1..4]");
5981 }
5982
5983 //TPC bitmap
5984 ptvcursor_add(ptvc, hf_nfapi_tpc_bitmap, 4, ENC_BIG_ENDIAN);
5985
5986 // Total DCI length including padding
5987 ptvcursor_add(ptvc, hf_nfapi_total_dci_length_include_padding, 1, ENC_BIG_ENDIAN);
5988
5989 // Number of TX Antenna ports
5990 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_tx_antenna_ports, 1, ENC_BIG_ENDIAN, &count);
5991
5992 dissect_array_value(ptvc, pinfo, "TX Antenna Ports", ett_nfapi_tx_antenna_ports, count, dissect_precoding_value);
5993 }
dissect_rx_ue_info_value(ptvcursor_t * ptvc,packet_info * pinfo)5994 static void dissect_rx_ue_info_value(ptvcursor_t * ptvc, packet_info* pinfo)
5995 {
5996 guint32 test_value;
5997
5998 // Handle
5999 ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN);
6000
6001 // RNTI
6002 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN, &test_value);
6003 if (test_value < 1)
6004 {
6005 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]");
6006 }
6007 }
dissect_rx_indication_rel8_value(ptvcursor_t * ptvc,packet_info * pinfo)6008 static void dissect_rx_indication_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo)
6009 {
6010 proto_item* item;
6011 guint32 test_value;
6012
6013 // Length
6014 ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN);
6015
6016 // Data offset
6017 ptvcursor_add(ptvc, hf_nfapi_data_offset, 2, ENC_BIG_ENDIAN);
6018
6019 // UL_CQI
6020 ptvcursor_add(ptvc, hf_nfapi_ul_cqi, 1, ENC_BIG_ENDIAN);
6021
6022 // Timing advance
6023 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN, &test_value);
6024 if (test_value > 63)
6025 {
6026 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..63]");
6027 }
6028 }
dissect_rx_indication_rel9_value(ptvcursor_t * ptvc,packet_info * pinfo)6029 static void dissect_rx_indication_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo)
6030 {
6031 guint32 test_value;
6032
6033 // Timing advance R9
6034 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_timing_advance_r9, 2, ENC_BIG_ENDIAN, &test_value);
6035 if (test_value > 7690)
6036 {
6037 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance r9 value [0..7690]");
6038 }
6039
6040 }
dissect_harq_indication_data_bundling_value(ptvcursor_t * ptvc,packet_info * pinfo)6041 static void dissect_harq_indication_data_bundling_value(ptvcursor_t * ptvc, packet_info* pinfo)
6042 {
6043 proto_item* item;
6044 guint32 test_value;
6045
6046 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN, &test_value);
6047 if (!(test_value >= 1 && test_value <= 7))
6048 {
6049 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]");
6050 }
6051
6052 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_harq_data_value_1, 1, ENC_BIG_ENDIAN, &test_value);
6053 if (!(test_value >= 1 && test_value <= 7))
6054 {
6055 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 1 [1..7]");
6056 }
6057 }
dissect_harq_indication_data_format_1a_1b_bundling_value(ptvcursor_t * ptvc,packet_info * pinfo)6058 static void dissect_harq_indication_data_format_1a_1b_bundling_value(ptvcursor_t * ptvc, packet_info* pinfo)
6059 {
6060 guint32 test_value;
6061
6062 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN, &test_value);
6063 if (!(test_value >= 1 && test_value <= 7))
6064 {
6065 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]");
6066 }
6067 }
dissect_harq_indication_data_multplexing_value(ptvcursor_t * ptvc,packet_info * pinfo)6068 static void dissect_harq_indication_data_multplexing_value(ptvcursor_t * ptvc, packet_info* pinfo)
6069 {
6070 proto_item* item;
6071 guint32 test_value;
6072
6073 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN, &test_value);
6074 if (!(test_value >= 1 && test_value <= 7))
6075 {
6076 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]");
6077 }
6078
6079 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_harq_data_value_1, 1, ENC_BIG_ENDIAN, &test_value);
6080 if (!(test_value >= 1 && test_value <= 7))
6081 {
6082 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 1 [1..7]");
6083 }
6084
6085 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_harq_data_value_2, 1, ENC_BIG_ENDIAN, &test_value);
6086 if (!(test_value >= 1 && test_value <= 7))
6087 {
6088 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 2 [1..7]");
6089 }
6090
6091 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_harq_data_value_3, 1, ENC_BIG_ENDIAN, &test_value);
6092 if (!(test_value >= 1 && test_value <= 7))
6093 {
6094 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 3 [1..7]");
6095 }
6096
6097 }
dissect_harq_indication_data_format_1a_1b_multplexing_value(ptvcursor_t * ptvc,packet_info * pinfo)6098 static void dissect_harq_indication_data_format_1a_1b_multplexing_value(ptvcursor_t * ptvc, packet_info* pinfo)
6099 {
6100 guint32 test_value;
6101 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN, &test_value);
6102 if (!(test_value >= 1 && test_value <= 7))
6103 {
6104 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]");
6105 }
6106 }
dissect_harq_indication_data_special_bundling_value(ptvcursor_t * ptvc,packet_info * pinfo)6107 static void dissect_harq_indication_data_special_bundling_value(ptvcursor_t * ptvc, packet_info* pinfo)
6108 {
6109 guint32 test_value;
6110 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_harq_data_value_0_special, 1, ENC_BIG_ENDIAN, &test_value);
6111
6112 if (test_value > 4)
6113 {
6114 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [0..4]");
6115 }
6116 }
dissect_harq_indication_data_format_1a_1b_special_bundling_value(ptvcursor_t * ptvc,packet_info * pinfo)6117 static void dissect_harq_indication_data_format_1a_1b_special_bundling_value(ptvcursor_t * ptvc, packet_info* pinfo)
6118 {
6119 guint32 test_value;
6120 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_harq_data_value_0_special, 1, ENC_BIG_ENDIAN, &test_value);
6121 if (test_value > 4)
6122 {
6123 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [0..4]");
6124 }
6125 }
dissect_harq_indication_data_channel_selection_value(ptvcursor_t * ptvc,packet_info * pinfo)6126 static void dissect_harq_indication_data_channel_selection_value(ptvcursor_t * ptvc, packet_info* pinfo)
6127 {
6128 guint32 test_value;
6129 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN, &test_value);
6130 if (!(test_value >= 1 && test_value <= 7))
6131 {
6132 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]");
6133 }
6134 }
dissect_harq_indication_data_format_3_value(ptvcursor_t * ptvc,packet_info * pinfo)6135 static void dissect_harq_indication_data_format_3_value(ptvcursor_t * ptvc, packet_info* pinfo)
6136 {
6137 guint32 test_value;
6138 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN, &test_value);
6139 if (!(test_value >= 1 && test_value <= 7))
6140 {
6141 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]");
6142 }
6143 }
dissect_harq_indication_data_format_4_value(ptvcursor_t * ptvc,packet_info * pinfo)6144 static void dissect_harq_indication_data_format_4_value(ptvcursor_t * ptvc, packet_info* pinfo)
6145 {
6146 guint32 test_value;
6147 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN, &test_value);
6148 if (!(test_value >= 1 && test_value <= 7))
6149 {
6150 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]");
6151 }
6152 }
dissect_harq_indication_data_format_5_value(ptvcursor_t * ptvc,packet_info * pinfo)6153 static void dissect_harq_indication_data_format_5_value(ptvcursor_t * ptvc, packet_info* pinfo)
6154 {
6155 guint32 test_value;
6156 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN, &test_value);
6157 if (!(test_value >= 1 && test_value <= 7))
6158 {
6159 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]");
6160 }
6161 }
dissect_harq_indication_rel8_tdd_value(ptvcursor_t * ptvc,packet_info * pinfo)6162 static void dissect_harq_indication_rel8_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo)
6163 {
6164 proto_item* item;
6165 guint32 test_value, mode;
6166
6167 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_tdd_harq_mode, 1, ENC_BIG_ENDIAN, &mode);
6168 if (mode > 4)
6169 {
6170 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mode value [0..4]");
6171 }
6172
6173 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_ack_nack, 1, ENC_BIG_ENDIAN, &test_value);
6174 if (!(test_value >= 1 && test_value <= 4))
6175 {
6176 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..4]");
6177 }
6178
6179 switch (mode)
6180 {
6181 case 0:
6182 {
6183 dissect_harq_indication_data_bundling_value(ptvc, pinfo);
6184 break;
6185 }
6186 case 1:
6187 {
6188 dissect_harq_indication_data_multplexing_value(ptvc, pinfo);
6189 break;
6190 }
6191 case 2:
6192 {
6193 dissect_harq_indication_data_special_bundling_value(ptvc, pinfo);
6194 break;
6195 }
6196 };
6197 }
dissect_harq_indication_rel9_later_tdd_value(ptvcursor_t * ptvc,packet_info * pinfo)6198 static void dissect_harq_indication_rel9_later_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo)
6199 {
6200 proto_item* item;
6201 guint32 mode, i, count;
6202
6203 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_tdd_harq_mode, 1, ENC_BIG_ENDIAN, &mode);
6204 if (mode > 4)
6205 {
6206 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mode value [0..4]");
6207 }
6208
6209 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_ack_nack, 1, ENC_BIG_ENDIAN, &count);
6210 if (mode == 0 || mode == 1)
6211 {
6212 if (!(count >= 1 && count <= 4))
6213 {
6214 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..4]");
6215 }
6216 }
6217 else if (mode == 3)
6218 {
6219 if (!(count >= 1 && count <= 8))
6220 {
6221 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..8]");
6222 }
6223 }
6224 else if (mode == 4)
6225 {
6226 if (!(count >= 1 && count <= 21))
6227 {
6228 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..21]");
6229 }
6230 }
6231
6232
6233 ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_harq_ack_nack_data, "ACK/NACK Data");
6234
6235 for (i = 0; i < count; ++i)
6236 {
6237 ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_harq_ack_nack_data, "[%u]", i);
6238
6239 switch (mode)
6240 {
6241 case 0:
6242 {
6243 dissect_harq_indication_data_format_1a_1b_bundling_value(ptvc, pinfo);
6244 break;
6245 }
6246 case 1:
6247 {
6248 dissect_harq_indication_data_format_1a_1b_multplexing_value(ptvc, pinfo);
6249 break;
6250 }
6251 case 2:
6252 {
6253 dissect_harq_indication_data_format_1a_1b_special_bundling_value(ptvc, pinfo);
6254 break;
6255 }
6256 case 3:
6257 {
6258 dissect_harq_indication_data_channel_selection_value(ptvc, pinfo);
6259 break;
6260 }
6261 case 4:
6262 {
6263 dissect_harq_indication_data_format_3_value(ptvc, pinfo);
6264 break;
6265 }
6266 };
6267
6268 ptvcursor_pop_subtree(ptvc);
6269 }
6270
6271 ptvcursor_pop_subtree(ptvc);
6272 }
dissect_harq_indication_rel13_later_tdd_value(ptvcursor_t * ptvc,packet_info * pinfo)6273 static void dissect_harq_indication_rel13_later_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo)
6274 {
6275 proto_item* item;
6276 guint32 mode, i, count;
6277
6278 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_tdd_harq_mode, 1, ENC_BIG_ENDIAN, &mode);
6279 if (mode > 6)
6280 {
6281 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mode value [0..6]");
6282 }
6283
6284 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_ack_nack, 2, ENC_BIG_ENDIAN, &count);
6285 if (mode == 0 || mode == 1)
6286 {
6287 if (!(count >= 1 && count <= 4))
6288 {
6289 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..4]");
6290 }
6291 }
6292 else if (mode == 3)
6293 {
6294 if (!(count >= 1 && count <= 8))
6295 {
6296 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..8]");
6297 }
6298 }
6299 else if (mode == 4)
6300 {
6301 if (!(count >= 1 && count <= 21))
6302 {
6303 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..21]");
6304 }
6305 }
6306 else if (mode == 5 || mode == 6)
6307 {
6308 if (count < 22)
6309 {
6310 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [>= 22]");
6311 }
6312
6313 }
6314
6315 ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_harq_ack_nack_data, "ACK/NACK Data");
6316
6317 for (i = 0; i < count; ++i)
6318 {
6319 ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_harq_ack_nack_data, "[%u]", i);
6320
6321 switch (mode)
6322 {
6323 case 0:
6324 {
6325 dissect_harq_indication_data_format_1a_1b_bundling_value(ptvc, pinfo);
6326 break;
6327 }
6328 case 1:
6329 {
6330 dissect_harq_indication_data_format_1a_1b_multplexing_value(ptvc, pinfo);
6331 break;
6332 }
6333 case 2:
6334 {
6335 dissect_harq_indication_data_special_bundling_value(ptvc, pinfo);
6336 break;
6337 }
6338 case 3:
6339 {
6340 dissect_harq_indication_data_channel_selection_value(ptvc, pinfo);
6341 break;
6342 }
6343 case 4:
6344 {
6345 dissect_harq_indication_data_format_3_value(ptvc, pinfo);
6346 break;
6347 }
6348 case 5:
6349 {
6350 dissect_harq_indication_data_format_4_value(ptvc, pinfo);
6351 break;
6352 }
6353 case 6:
6354 {
6355 dissect_harq_indication_data_format_5_value(ptvc, pinfo);
6356 break;
6357 }
6358 };
6359
6360 ptvcursor_pop_subtree(ptvc);
6361 }
6362
6363 ptvcursor_pop_subtree(ptvc);
6364 }
dissect_harq_indication_rel8_fdd_value(ptvcursor_t * ptvc,packet_info * pinfo)6365 static void dissect_harq_indication_rel8_fdd_value(ptvcursor_t * ptvc, packet_info* pinfo)
6366 {
6367 proto_item* item;
6368 guint32 test_value;
6369
6370 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_harq_tb_1, 1, ENC_BIG_ENDIAN, &test_value);
6371 if (!(test_value >= 1 && test_value <= 7))
6372 {
6373 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq tb 1 [1..7]");
6374 }
6375
6376 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_harq_tb_2, 1, ENC_BIG_ENDIAN, &test_value);
6377 if (!(test_value >= 1 && test_value <= 7))
6378 {
6379 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq tb 2 [1..7]");
6380 }
6381
6382 }
dissect_harq_tb_value(ptvcursor_t * ptvc,packet_info * pinfo)6383 static void dissect_harq_tb_value(ptvcursor_t * ptvc, packet_info* pinfo)
6384 {
6385 guint32 test_value;
6386 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_harq_tb_n, 1, ENC_BIG_ENDIAN, &test_value);
6387
6388 if (!(test_value >= 1 && test_value <= 7))
6389 {
6390 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq tb n [1..7]");
6391 }
6392 }
dissect_harq_indication_rel9_later_fdd_value(ptvcursor_t * ptvc,packet_info * pinfo)6393 static void dissect_harq_indication_rel9_later_fdd_value(ptvcursor_t * ptvc, packet_info* pinfo)
6394 {
6395 guint32 harq_mode_value, count;
6396
6397 // Mode
6398 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_fdd_harq_mode, 1, ENC_BIG_ENDIAN, &harq_mode_value);
6399 if (harq_mode_value > 2)
6400 {
6401 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq mode value [0..2]");
6402 }
6403
6404 // Number of ACK/NACK
6405 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_ack_nack, 1, ENC_BIG_ENDIAN, &count);
6406
6407 if (harq_mode_value == 0)
6408 {
6409 if (!(count >=1 && count <= 2))
6410 {
6411 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..2]");
6412 }
6413 }
6414 else if (harq_mode_value == 1)
6415 {
6416 if (!(count >= 1 && count <= 4))
6417 {
6418 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..4]");
6419 }
6420
6421 }
6422 else if (harq_mode_value == 2)
6423 {
6424 if (!(count >= 1 && count <= 10))
6425 {
6426 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..10]");
6427 }
6428
6429 }
6430
6431 dissect_array_value(ptvc, pinfo, "HARQ TB List", ett_nfapi_harq_data, count, dissect_harq_tb_value);
6432 }
dissect_harq_indication_rel13_later_fdd_value(ptvcursor_t * ptvc,packet_info * pinfo)6433 static void dissect_harq_indication_rel13_later_fdd_value(ptvcursor_t * ptvc, packet_info* pinfo)
6434 {
6435 guint32 harq_mode_value, count;
6436
6437 // Mode
6438 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_fdd_harq_mode, 1, ENC_BIG_ENDIAN, &harq_mode_value);
6439 if (harq_mode_value > 4)
6440 {
6441 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq mode value [0..4]");
6442 }
6443
6444 // Number of ACK/NACK
6445 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_ack_nack, 2, ENC_BIG_ENDIAN, &count);
6446
6447 if (harq_mode_value == 0)
6448 {
6449 if (!(count >= 1 && count <= 2))
6450 {
6451 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..2]");
6452 }
6453 }
6454 else if (harq_mode_value == 1)
6455 {
6456 if (!(count >= 1 && count <= 4))
6457 {
6458 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..4]");
6459 }
6460
6461 }
6462 else if (harq_mode_value == 2)
6463 {
6464 if (!(count >= 1 && count <= 10))
6465 {
6466 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..10]");
6467 }
6468 }
6469 else if (harq_mode_value == 3 || harq_mode_value == 4)
6470 {
6471 if (count < 22)
6472 {
6473 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [>= 22]");
6474 }
6475 }
6476
6477 dissect_array_value(ptvc, pinfo, "HARQ TB List", ett_nfapi_harq_data, count, dissect_harq_tb_value);
6478 }
dissect_ul_cqi_information_value(ptvcursor_t * ptvc,packet_info * pinfo)6479 static void dissect_ul_cqi_information_value(ptvcursor_t * ptvc, packet_info* pinfo)
6480 {
6481 proto_item* item;
6482 guint32 test_value;
6483
6484 // UL_CQI
6485 ptvcursor_add(ptvc, hf_nfapi_ul_cqi, 1, ENC_BIG_ENDIAN);
6486
6487 // Channel
6488 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_channel, 1, ENC_BIG_ENDIAN, &test_value);
6489 if (test_value > 1)
6490 {
6491 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid channel value [0..1]");
6492 }
6493 }
dissect_crc_indication_rel8_value(ptvcursor_t * ptvc,packet_info * pinfo)6494 static void dissect_crc_indication_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo)
6495 {
6496 gboolean test_boolean;
6497
6498 // CRC Flag
6499 proto_item* item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_crc_flag, 1, ENC_BIG_ENDIAN, &test_boolean);
6500 if (test_boolean > 1)
6501 {
6502 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid crc flag value [0..1]");
6503 }
6504 }
dissect_rx_cqi_indication_rel8_value(ptvcursor_t * ptvc,packet_info * pinfo)6505 static void dissect_rx_cqi_indication_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo)
6506 {
6507 proto_item* item;
6508 guint32 test_value;
6509
6510 //Length
6511 ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN);
6512
6513 // Data Offset
6514 ptvcursor_add(ptvc, hf_nfapi_data_offset, 2, ENC_BIG_ENDIAN);
6515
6516 // UL_CQI
6517 ptvcursor_add(ptvc, hf_nfapi_ul_cqi, 1, ENC_BIG_ENDIAN);
6518
6519 // RI
6520 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_ri, 1, ENC_BIG_ENDIAN, &test_value);
6521 if (test_value > 8)
6522 {
6523 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ri value [0..8]");
6524 }
6525
6526 // Timing Advance
6527 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN, &test_value);
6528 if (test_value > 63)
6529 {
6530 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..63]");
6531 }
6532 }
dissect_ri_value(ptvcursor_t * ptvc,packet_info * pinfo)6533 static void dissect_ri_value(ptvcursor_t * ptvc, packet_info* pinfo)
6534 {
6535 guint32 test_value;
6536
6537 // RI
6538 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_ri, 1, ENC_BIG_ENDIAN, &test_value);
6539 if (test_value > 8)
6540 {
6541 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ri value [0..8]");
6542 }
6543 }
dissect_rx_cqi_indication_rel9_value(ptvcursor_t * ptvc,packet_info * pinfo)6544 static void dissect_rx_cqi_indication_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo)
6545 {
6546 proto_item* item;
6547 guint32 test_value, count;
6548
6549 // Length
6550 ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN);
6551
6552 // Data Offset
6553 ptvcursor_add(ptvc, hf_nfapi_data_offset, 2, ENC_BIG_ENDIAN);
6554
6555 // UL_CQI
6556 ptvcursor_add(ptvc, hf_nfapi_ul_cqi, 1, ENC_BIG_ENDIAN);
6557
6558 // Number of CC reported
6559 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_cc_reported, 1, ENC_BIG_ENDIAN, &count);
6560 if (!(count >= 1 && count <= 5))
6561 {
6562 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of CC reported value [1..5]");
6563 }
6564
6565 dissect_array_value(ptvc, pinfo, "CC List", ett_nfapi_cc, count, dissect_ri_value);
6566
6567 // Timing Advance
6568 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN, &test_value);
6569 if (test_value > 63)
6570 {
6571 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..63]");
6572 }
6573
6574 // Timing Advance R9
6575 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_timing_advance_r9, 2, ENC_BIG_ENDIAN, &test_value);
6576 if (test_value > 7690)
6577 {
6578 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..7690]");
6579 }
6580 }
dissect_rach_indication_rel8_value(ptvcursor_t * ptvc,packet_info * pinfo)6581 static void dissect_rach_indication_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo)
6582 {
6583 proto_item* item;
6584 guint32 test_value;
6585
6586 // RNTI
6587 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN, &test_value);
6588 if (test_value < 1)
6589 {
6590 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]");
6591 }
6592
6593 // Preamble
6594 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_preamble, 1, ENC_BIG_ENDIAN, &test_value);
6595 if (test_value > 63)
6596 {
6597 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid preamble value [0..63]");
6598 }
6599
6600 // Timing Advance
6601 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN, &test_value);
6602 if (test_value > 1282)
6603 {
6604 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..1282]");
6605 }
6606
6607 }
dissect_rach_indication_rel9_value(ptvcursor_t * ptvc,packet_info * pinfo)6608 static void dissect_rach_indication_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo)
6609 {
6610 guint32 test_value;
6611
6612 // Timing Advance R9
6613 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_timing_advance_r9, 2, ENC_BIG_ENDIAN, &test_value);
6614 if (test_value > 7690)
6615 {
6616 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..7690]");
6617 }
6618 }
dissect_rach_indication_rel13_value(ptvcursor_t * ptvc,packet_info * pinfo)6619 static void dissect_rach_indication_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo)
6620 {
6621 guint32 test_value;
6622
6623 // RACH resource type
6624 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_rach_resource_type, 1, ENC_BIG_ENDIAN, &test_value);
6625 if (test_value > 4)
6626 {
6627 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rach resource type value [0..4]");
6628 }
6629 }
dissect_snr_value(ptvcursor_t * ptvc,packet_info * pinfo _U_)6630 static void dissect_snr_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
6631 {
6632 // SNR
6633 ptvcursor_add(ptvc, hf_nfapi_snr, 1, ENC_BIG_ENDIAN);
6634 }
dissect_srs_indication_rel8_value(ptvcursor_t * ptvc,packet_info * pinfo)6635 static void dissect_srs_indication_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo)
6636 {
6637 proto_item* item;
6638 guint32 test_value, count;
6639
6640 // Doppler estimation
6641 ptvcursor_add(ptvc, hf_nfapi_doppler_estimation, 2, ENC_BIG_ENDIAN);
6642
6643 // Timing Advance
6644 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN, &test_value);
6645 if (test_value > 1282)
6646 {
6647 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..1282]");
6648 }
6649
6650 // Number of resource blocks
6651 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_resource_blocks, 1, ENC_BIG_ENDIAN, &count);
6652
6653 // RB start
6654 ptvcursor_add(ptvc, hf_nfapi_rb_start, 1, ENC_BIG_ENDIAN);
6655
6656
6657 dissect_array_value(ptvc, pinfo, "RB List", ett_nfapi_rbs, count, dissect_snr_value);
6658 }
dissect_srs_indication_rel9_value(ptvcursor_t * ptvc,packet_info * pinfo)6659 static void dissect_srs_indication_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo)
6660 {
6661 guint32 test_value;
6662
6663 // Timing Advance R9
6664 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_timing_advance_r9, 2, ENC_BIG_ENDIAN, &test_value);
6665 if (test_value > 7690)
6666 {
6667 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..7690]");
6668 }
6669 }
dissect_srs_indication_rel10_tdd_value(ptvcursor_t * ptvc,packet_info * pinfo)6670 static void dissect_srs_indication_rel10_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo)
6671 {
6672 guint32 test_value;
6673
6674 // UpPTS Symbol
6675 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_up_pts_symbol, 1, ENC_BIG_ENDIAN, &test_value);
6676 if (test_value > 1)
6677 {
6678 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid up pts symbol value [0..1]");
6679 }
6680
6681 }
dissect_tdd_channel_measurement_value(ptvcursor_t * ptvc,packet_info * pinfo _U_)6682 static void dissect_tdd_channel_measurement_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
6683 {
6684 guint32 i, j, num_subbands, num_phy_ant;
6685
6686 // numPRBperSubband
6687 ptvcursor_add(ptvc, hf_nfapi_number_prb_per_subband, 1, ENC_BIG_ENDIAN);
6688
6689 // Number of subbands
6690 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_subbands, 1, ENC_BIG_ENDIAN, &num_subbands);
6691
6692 // numAntennas
6693 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_antennas, 1, ENC_BIG_ENDIAN, &num_phy_ant);
6694
6695 ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_subbands, "Subbands");
6696
6697 for (i = 0; i < num_subbands; ++i)
6698 {
6699 ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_subbands, "[%u]", i);
6700
6701 // subbandIndex
6702 ptvcursor_add(ptvc, hf_nfapi_subband_index, 1, ENC_BIG_ENDIAN);
6703
6704 ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_antennas, "Physical Antennas");
6705
6706 for (j = 0; j < num_phy_ant; ++j)
6707 {
6708 ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_antennas, "[%u]", j);
6709
6710 // Channel
6711 ptvcursor_add(ptvc, hf_nfapi_channel_coefficient, 2, ENC_BIG_ENDIAN);
6712
6713 ptvcursor_pop_subtree(ptvc);
6714 }
6715
6716 ptvcursor_pop_subtree(ptvc);
6717
6718 ptvcursor_pop_subtree(ptvc);
6719 }
6720
6721 ptvcursor_pop_subtree(ptvc);
6722 }
dissect_srs_indication_rel11_value(ptvcursor_t * ptvc,packet_info * pinfo)6723 static void dissect_srs_indication_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo)
6724 {
6725 guint32 test_value;
6726
6727 //UL_RTOA
6728 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_ul_rtoa, 2, ENC_BIG_ENDIAN, &test_value);
6729 if (test_value > 4800)
6730 {
6731 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul rtoa value [0..4800]");
6732 }
6733 }
dissect_lbt_dl_config_request_pdsch_req_rel13_value(ptvcursor_t * ptvc,packet_info * pinfo)6734 static void dissect_lbt_dl_config_request_pdsch_req_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo)
6735 {
6736 proto_item* item;
6737 guint32 test_value;
6738 gint32 test_boolean;
6739
6740 // Handle
6741 ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN);
6742
6743 // nCCA
6744 ptvcursor_add(ptvc, hf_nfapi_mp_cca, 4, ENC_BIG_ENDIAN);
6745
6746 // NCCA
6747 ptvcursor_add(ptvc, hf_nfapi_n_cca, 4, ENC_BIG_ENDIAN);
6748
6749 // Offset
6750 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_offset, 4, ENC_BIG_ENDIAN, &test_value);
6751 if (test_value > 999)
6752 {
6753 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid offset value [0..999]");
6754 }
6755
6756 // LTE TXOP SF
6757 ptvcursor_add(ptvc, hf_nfapi_lte_txop_sf, 4, ENC_BIG_ENDIAN);
6758
6759 // TXOP SFN/SF End
6760 ptvcursor_add(ptvc, hf_nfapi_txop_sfn_sf_end, 2, ENC_BIG_ENDIAN);
6761
6762 // LBT mode
6763 item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_lbt_mode, 4, ENC_BIG_ENDIAN, &test_boolean);
6764 if (test_boolean > 1)
6765 {
6766 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid offset value [0..1]");
6767 }
6768 }
dissect_lbt_dl_config_request_drs_req_rel13_value(ptvcursor_t * ptvc,packet_info * pinfo)6769 static void dissect_lbt_dl_config_request_drs_req_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo)
6770 {
6771 proto_item* item;
6772 guint32 test_value;
6773 gint32 test_boolean;
6774
6775 // Handle
6776 ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN);
6777
6778 // Offset
6779 item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_offset, 4, ENC_BIG_ENDIAN, &test_value);
6780 if (test_value > 999)
6781 {
6782 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid offset value [0..999]");
6783 }
6784
6785 // SFN/SF End
6786 ptvcursor_add(ptvc, hf_nfapi_sfn_sf_end, 2, ENC_BIG_ENDIAN);
6787
6788 // LBT mode
6789 item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_lbt_mode, 4, ENC_BIG_ENDIAN, &test_boolean);
6790 if (test_boolean > 1)
6791 {
6792 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid offset value [0..1]");
6793 }
6794 }
dissect_lbt_dl_config_request_pdsch_resp_rel13_value(ptvcursor_t * ptvc,packet_info * pinfo)6795 static void dissect_lbt_dl_config_request_pdsch_resp_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo)
6796 {
6797 proto_item* item;
6798 gint32 test_boolean;
6799
6800 // Handle
6801 ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN);
6802
6803 // result
6804 item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_result, 4, ENC_BIG_ENDIAN, &test_boolean);
6805 if (test_boolean > 1)
6806 {
6807 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid result value [0..1]");
6808 }
6809
6810 // LTE TXOP symbols
6811 ptvcursor_add(ptvc, hf_nfapi_txop_symbols, 4, ENC_BIG_ENDIAN);
6812
6813 // Initial Partial SF
6814 item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_initial_partial_sf, 4, ENC_BIG_ENDIAN, &test_boolean);
6815 if (test_boolean > 1)
6816 {
6817 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial partial sf value [0..1]");
6818 }
6819 }
dissect_lbt_dl_config_request_drs_resp_rel13_value(ptvcursor_t * ptvc,packet_info * pinfo)6820 static void dissect_lbt_dl_config_request_drs_resp_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo)
6821 {
6822 proto_item* item;
6823 gint32 test_boolean;
6824
6825 // Handle
6826 ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN);
6827
6828 // result
6829 item = ptvcursor_add_ret_boolean(ptvc, hf_nfapi_result, 4, ENC_BIG_ENDIAN, &test_boolean);
6830 if (test_boolean > 1)
6831 {
6832 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid result value [0..1]");
6833 }
6834 }
dissect_tx_pdu(ptvcursor_t * ptvc,packet_info * pinfo _U_)6835 static void dissect_tx_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_)
6836 {
6837 guint32 len;
6838
6839 // PDU length
6840 ptvcursor_add_ret_uint(ptvc, hf_nfapi_pdu_length, 2, ENC_BIG_ENDIAN, &len);
6841
6842 // PDU index
6843 ptvcursor_add(ptvc, hf_nfapi_pdu_index, 2, ENC_BIG_ENDIAN);
6844
6845 // PDU#N
6846 ptvcursor_add(ptvc, hf_nfapi_pdu, len, ENC_NA);
6847 }
dissect_tx_request_body_value(ptvcursor_t * ptvc,packet_info * pinfo)6848 static void dissect_tx_request_body_value(ptvcursor_t * ptvc, packet_info* pinfo)
6849 {
6850 guint32 num_pdu;
6851
6852 // Number of PDUs
6853 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_pdus, 2, ENC_BIG_ENDIAN, &num_pdu);
6854
6855 dissect_array_value(ptvc, pinfo, "TX PDU List", ett_nfapi_tx_request_pdu_list, num_pdu, dissect_tx_pdu);
6856 }
dissect_harq_indication_pdu(ptvcursor_t * ptvc,packet_info * pinfo)6857 static void dissect_harq_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo)
6858 {
6859 guint32 instance_len;
6860
6861 // Instance Length
6862 ptvcursor_add_ret_uint(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN, &instance_len);
6863
6864 guint32 instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2);
6865 dissect_tlv_list(ptvc, pinfo, instance_end);
6866 }
dissect_harq_indication_body_value(ptvcursor_t * ptvc,packet_info * pinfo)6867 static void dissect_harq_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo)
6868 {
6869 guint32 num_pdu;
6870
6871 // Number of HARQs
6872 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_harqs, 2, ENC_BIG_ENDIAN, &num_pdu);
6873
6874 dissect_array_value(ptvc, pinfo, "HARQ PDU List", ett_nfapi_harq_indication_pdu_list, num_pdu, dissect_harq_indication_pdu);
6875 }
dissect_crc_indication_pdu(ptvcursor_t * ptvc,packet_info * pinfo)6876 static void dissect_crc_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo)
6877 {
6878 guint32 instance_len;
6879
6880 // Instance Length
6881 ptvcursor_add_ret_uint(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN, &instance_len);
6882
6883 guint32 instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2);
6884 dissect_tlv_list(ptvc, pinfo, instance_end);
6885 }
dissect_crc_indication_body_value(ptvcursor_t * ptvc,packet_info * pinfo)6886 static void dissect_crc_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo)
6887 {
6888 guint32 num_pdu;
6889
6890 // Number of CRCs
6891 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_crcs, 2, ENC_BIG_ENDIAN, &num_pdu);
6892 dissect_array_value(ptvc, pinfo, "CRC PDU List", ett_nfapi_crc_indication_pdu_list, num_pdu, dissect_crc_indication_pdu);
6893 }
dissect_sr_indication_pdu(ptvcursor_t * ptvc,packet_info * pinfo)6894 static void dissect_sr_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo)
6895 {
6896 guint32 instance_len;
6897
6898 // Instance Length
6899 ptvcursor_add_ret_uint(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN, &instance_len);
6900
6901 guint32 instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2);
6902 dissect_tlv_list(ptvc, pinfo, instance_end);
6903 }
dissect_rx_sr_indication_body_value(ptvcursor_t * ptvc,packet_info * pinfo)6904 static void dissect_rx_sr_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo)
6905 {
6906 guint32 num_pdu;
6907
6908 // Number of SRs
6909 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_srs, 2, ENC_BIG_ENDIAN, &num_pdu);
6910
6911 dissect_array_value(ptvc, pinfo, "SR PDU List", ett_nfapi_sr_indication_pdu_list, num_pdu, dissect_sr_indication_pdu);
6912 }
dissect_cqi_indication_pdu(ptvcursor_t * ptvc,packet_info * pinfo)6913 static void dissect_cqi_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo)
6914 {
6915 guint32 instance_len;
6916
6917 // Instance Length
6918 ptvcursor_add_ret_uint(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN, &instance_len);
6919
6920 guint32 instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2);
6921 dissect_tlv_list(ptvc, pinfo, instance_end);
6922 }
dissect_rx_cqi_indication_body_value(ptvcursor_t * ptvc,packet_info * pinfo)6923 static void dissect_rx_cqi_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo)
6924 {
6925 guint32 i, num_pdu;
6926 guint16* lengths = NULL;
6927
6928 // Number of PDUs
6929 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_cqi, 2, ENC_BIG_ENDIAN, &num_pdu);
6930
6931
6932 tvbuff_t* tvb = ptvcursor_tvbuff(ptvc);
6933 guint32 tmp_offset = ptvcursor_current_offset(ptvc);
6934
6935 if (num_pdu > 0)
6936 {
6937 lengths = (guint16*)wmem_alloc0(pinfo->pool, num_pdu * 2);
6938 }
6939
6940 for (i = 0; i < num_pdu; ++i)
6941 {
6942 guint32 instance_len = tvb_get_ntohs(tvb, tmp_offset);
6943 tmp_offset += 2;
6944 guint32 pdu_end = tmp_offset + instance_len;
6945
6946 while (tmp_offset < pdu_end)
6947 {
6948 guint16 tlv_id = tvb_get_ntohs(tvb, tmp_offset);
6949 tmp_offset += 2;
6950 guint16 tlv_len = tvb_get_ntohs(tvb, tmp_offset);
6951 tmp_offset += 2;
6952
6953 if (tlv_id == 0x202F)
6954 {
6955 lengths[i] = tvb_get_ntohs(tvb, tmp_offset);
6956 }
6957 else if (tlv_id == 0x2030)
6958 {
6959 lengths[i] = tvb_get_ntohs(tvb, tmp_offset);
6960 }
6961
6962 tmp_offset += tlv_len;
6963 }
6964 }
6965
6966 dissect_array_value(ptvc, pinfo, "CQI PDU List", ett_nfapi_cqi_indication_pdu_list, num_pdu, dissect_cqi_indication_pdu);
6967
6968 for (i = 0; i < num_pdu; ++i)
6969 {
6970 ptvcursor_add(ptvc, hf_nfapi_pdu, lengths[i], ENC_NA);
6971 }
6972 }
dissect_preamble_indication_pdu(ptvcursor_t * ptvc,packet_info * pinfo)6973 static void dissect_preamble_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo)
6974 {
6975 guint32 instance_len;
6976
6977 // Instance Length
6978 ptvcursor_add_ret_uint(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN, &instance_len);
6979
6980 guint32 instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2);
6981 dissect_tlv_list(ptvc, pinfo, instance_end);
6982 }
dissect_rach_indication_body_value(ptvcursor_t * ptvc,packet_info * pinfo)6983 static void dissect_rach_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo)
6984 {
6985 guint32 num_pdu;
6986
6987 // Number of Preambles
6988 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_preambles, 2, ENC_BIG_ENDIAN, &num_pdu);
6989 dissect_array_value(ptvc, pinfo, "Preamble PDU List", ett_nfapi_preamble_indication_pdu_list, num_pdu, dissect_preamble_indication_pdu);
6990 }
dissect_srs_indication_pdu(ptvcursor_t * ptvc,packet_info * pinfo)6991 static void dissect_srs_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo)
6992 {
6993 guint32 instance_len;
6994
6995 // Instance Length
6996 ptvcursor_add_ret_uint(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN, &instance_len);
6997 guint32 instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2);
6998 dissect_tlv_list(ptvc, pinfo, instance_end);
6999 }
dissect_srs_indication_body_value(ptvcursor_t * ptvc,packet_info * pinfo)7000 static void dissect_srs_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo)
7001 {
7002 guint32 num_pdu;
7003
7004 // Number of UEs
7005 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_srss, 1, ENC_BIG_ENDIAN, &num_pdu);
7006 dissect_array_value(ptvc, pinfo, "SRS PDU List", ett_nfapi_srs_indication_pdu_list, num_pdu, dissect_srs_indication_pdu);
7007 }
dissect_lbt_dl_config_pdu(ptvcursor_t * ptvc,packet_info * pinfo)7008 static void dissect_lbt_dl_config_pdu(ptvcursor_t * ptvc, packet_info* pinfo)
7009 {
7010 guint32 test_value, size;
7011
7012 // PDU Type
7013 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_lbt_dl_req_pdu_type, 1, ENC_BIG_ENDIAN, &test_value);
7014 if (test_value > 1)
7015 {
7016 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdu type value [0..1]");
7017 }
7018
7019 ptvcursor_add_ret_uint(ptvc, hf_nfapi_pdu_size, 1, ENC_BIG_ENDIAN, &size);
7020 guint pdu_end = (ptvcursor_current_offset(ptvc) + size - 2);
7021
7022 dissect_tlv_list(ptvc, pinfo, pdu_end);
7023 }
dissect_lbt_dl_config_request_body_value(ptvcursor_t * ptvc,packet_info * pinfo)7024 static void dissect_lbt_dl_config_request_body_value(ptvcursor_t * ptvc, packet_info* pinfo)
7025 {
7026 guint32 num_pdu;
7027
7028 // Number of PDUs
7029 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_pdus, 2, ENC_BIG_ENDIAN, &num_pdu);
7030 if (!(num_pdu >= 1 && num_pdu <= 2))
7031 {
7032 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pdus value [1..2]");
7033 }
7034
7035 dissect_array_value(ptvc, pinfo, "LBT DL PDU List", ett_nfapi_lbt_dl_config_pdu_list, num_pdu, dissect_lbt_dl_config_pdu);
7036 }
dissect_lbt_dl_indication_pdu(ptvcursor_t * ptvc,packet_info * pinfo)7037 static void dissect_lbt_dl_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo)
7038 {
7039 guint32 test_value, size;
7040
7041 // PDU Type
7042 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_lbt_dl_ind_pdu_type, 1, ENC_BIG_ENDIAN, &test_value);
7043 if (test_value > 1)
7044 {
7045 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdu type value [0..1]");
7046 }
7047
7048 // PDU Size
7049 ptvcursor_add_ret_uint(ptvc, hf_nfapi_pdu_size, 1, ENC_BIG_ENDIAN, &size);
7050 guint32 pdu_end = (ptvcursor_current_offset(ptvc) + size - 2);
7051 dissect_tlv_list(ptvc, pinfo, pdu_end);
7052 }
dissect_lbt_indication_message_body_value(ptvcursor_t * ptvc,packet_info * pinfo)7053 static void dissect_lbt_indication_message_body_value(ptvcursor_t * ptvc, packet_info* pinfo)
7054 {
7055 guint32 num_pdu;
7056
7057 // Number of PDUs
7058 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_pdus, 2, ENC_BIG_ENDIAN, &num_pdu);
7059 if (!(num_pdu >= 1 && num_pdu <= 2))
7060 {
7061 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pdus value [1..2]");
7062 }
7063
7064 dissect_array_value(ptvc, pinfo, "LBT DL PDU List", ett_nfapi_lbt_dl_indication_pdu_list, num_pdu, dissect_lbt_dl_indication_pdu);
7065 }
dissect_lte_rssi_request_value(ptvcursor_t * ptvc,packet_info * pinfo)7066 static void dissect_lte_rssi_request_value(ptvcursor_t * ptvc, packet_info* pinfo)
7067 {
7068 guint32 test_value, num_earfcns;
7069
7070 // Frequency Band Indicator
7071 ptvcursor_add(ptvc, hf_nfapi_frequency_band_indicator, 1, ENC_BIG_ENDIAN);
7072
7073 // Measurement Period
7074 ptvcursor_add(ptvc, hf_nfapi_measurement_period, 2, ENC_BIG_ENDIAN);
7075
7076 // Bandwidth
7077 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_bandwidth, 1, ENC_BIG_ENDIAN, &test_value);
7078 if (!(test_value == 6 || test_value == 15 || test_value == 25 ||
7079 test_value == 50 || test_value == 75 || test_value == 100))
7080 {
7081 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid bandwidth value [6, 15, 25, 50, 75, 100]");
7082 }
7083
7084 // Timeout
7085 ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN);
7086
7087 // Number of EARFCNs
7088 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_earfcns, 1, ENC_BIG_ENDIAN, &num_earfcns);
7089
7090 dissect_array_value(ptvc, pinfo, "EARFCNs", ett_nfapi_earfcn_list, num_earfcns, dissect_earfcn_value);
7091 }
dissect_uarfcn_value(ptvcursor_t * ptvc,packet_info * pinfo _U_)7092 static void dissect_uarfcn_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
7093 {
7094 // UARFCN
7095 ptvcursor_add(ptvc, hf_nfapi_uarfcn, 2, ENC_BIG_ENDIAN);
7096 }
dissect_utran_rssi_request_value(ptvcursor_t * ptvc,packet_info * pinfo)7097 static void dissect_utran_rssi_request_value(ptvcursor_t * ptvc, packet_info* pinfo)
7098 {
7099 guint32 num_uarfcns;
7100
7101 // Frequency Band Indicator
7102 ptvcursor_add(ptvc, hf_nfapi_frequency_band_indicator, 1, ENC_BIG_ENDIAN);
7103
7104 // Measurement Period
7105 ptvcursor_add(ptvc, hf_nfapi_measurement_period, 2, ENC_BIG_ENDIAN);
7106
7107 // Timeout
7108 ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN);
7109
7110 // Number of UARFCNs
7111 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_uarfcns, 1, ENC_BIG_ENDIAN, &num_uarfcns);
7112
7113 dissect_array_value(ptvc, pinfo, "UARFCNs", ett_nfapi_uarfcn_list, num_uarfcns, dissect_uarfcn_value);
7114 }
dissect_arfcn_dir_value(ptvcursor_t * ptvc,packet_info * pinfo)7115 static void dissect_arfcn_dir_value(ptvcursor_t * ptvc, packet_info* pinfo)
7116 {
7117 guint32 test_value;
7118
7119 // ARFCN
7120 ptvcursor_add(ptvc, hf_nfapi_arfcn, 2, ENC_BIG_ENDIAN);
7121
7122 // Direction
7123 proto_item* item = ptvcursor_add_ret_uint(ptvc, hf_nfapi_arfcn_direction, 1, ENC_BIG_ENDIAN, &test_value);
7124 if (test_value > 1)
7125 {
7126 expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid direction value [0..1]");
7127 }
7128
7129 }
dissect_geran_rssi_request_value(ptvcursor_t * ptvc,packet_info * pinfo)7130 static void dissect_geran_rssi_request_value(ptvcursor_t * ptvc, packet_info* pinfo)
7131 {
7132 guint32 num_arfcns;
7133
7134 // Frequency Band Indicator
7135 ptvcursor_add(ptvc, hf_nfapi_frequency_band_indicator, 1, ENC_BIG_ENDIAN);
7136
7137 // Measurement Period
7138 ptvcursor_add(ptvc, hf_nfapi_measurement_period, 2, ENC_BIG_ENDIAN);
7139
7140 // Timeout
7141 ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN);
7142
7143 // Number of ARFCNs
7144 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_arfcns, 1, ENC_BIG_ENDIAN, &num_arfcns);
7145
7146 dissect_array_value(ptvc, pinfo, "ARFCNs", ett_nfapi_arfcn_list, num_arfcns, dissect_arfcn_dir_value);
7147 }
dissect_rssi_value(ptvcursor_t * ptvc,packet_info * pinfo _U_)7148 static void dissect_rssi_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
7149 {
7150 // RSSI
7151 ptvcursor_add(ptvc, hf_nfapi_rssi, 2, ENC_BIG_ENDIAN);
7152 }
dissect_rssi_indication_value(ptvcursor_t * ptvc,packet_info * pinfo)7153 static void dissect_rssi_indication_value(ptvcursor_t * ptvc, packet_info* pinfo)
7154 {
7155 guint32 num_rssi;
7156
7157 // Number of RSSI
7158 ptvcursor_add_ret_uint(ptvc, hf_nfapi_number_of_rssi, 2, ENC_BIG_ENDIAN, &num_rssi);
7159
7160 dissect_array_value(ptvc, pinfo, "ARFCNs", ett_nfapi_rssi_list, num_rssi, dissect_rssi_value);
7161 }
dissect_pci_value(ptvcursor_t * ptvc,packet_info * pinfo _U_)7162