diff --git a/CMakeLists.txt b/CMakeLists.txt index c2ac55465b..8e2457630a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -710,6 +710,7 @@ set(NFAPI_PNF_SRC ) add_library(NFAPI_PNF_LIB ${NFAPI_PNF_SRC}) target_link_libraries(NFAPI_PNF_LIB PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs) +target_link_libraries(NFAPI_PNF_LIB PUBLIC nr_fapi_p7) include_directories(${NFAPI_DIR}/pnf/public_inc) include_directories(${NFAPI_DIR}/pnf/inc) @@ -740,6 +741,9 @@ set(NFAPI_USER_SRC add_library(NFAPI_USER_LIB ${NFAPI_USER_SRC}) target_link_libraries(NFAPI_USER_LIB PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs UTIL) target_link_libraries(NFAPI_USER_LIB PRIVATE nr_fapi_p7) +if(OAI_AERIAL) + target_compile_definitions(NFAPI_USER_LIB PRIVATE ENABLE_AERIAL) +endif() include_directories(${NFAPI_USER_DIR}) # Layer 1 diff --git a/ci-scripts/conf_files/gnb-pnf.band66.rfsim.conf b/ci-scripts/conf_files/gnb-pnf.band66.rfsim.conf new file mode 100644 index 0000000000..d61d3032be --- /dev/null +++ b/ci-scripts/conf_files/gnb-pnf.band66.rfsim.conf @@ -0,0 +1,43 @@ +L1s = ( +{ + num_cc = 1; + tr_n_preference = "nfapi"; + remote_n_address = "192.168.71.140"; // vnf addr + local_n_address = "192.168.71.141"; // pnf addr + local_n_portc = 50000; // pnf p5 port [!] + remote_n_portc = 50001; // vnf p5 port + local_n_portd = 50010; // pnf p7 port + remote_n_portd = 50011; // vnf p7 port + prach_dtx_threshold = 120; + pucch0_dtx_threshold = 150; + ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 +} +); + +RUs = ({ + local_rf = "yes"; + nb_tx = 1; + nb_rx = 1; + att_tx = 0; + att_rx = 0; + bands = [7]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 114; + sf_extension = 0; + eNB_instances = [0]; +}); + +rfsimulator : +{ + serveraddr = "server"; + serverport = 4043; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; + +log_config: { + global_log_level = "info"; + hw_log_level = "info"; + phy_log_level = "info"; +}; diff --git a/ci-scripts/conf_files/gnb-pnf.band77.usrpn310.4x4.conf b/ci-scripts/conf_files/gnb-pnf.band77.usrpn310.4x4.conf new file mode 100644 index 0000000000..6a7f4b4642 --- /dev/null +++ b/ci-scripts/conf_files/gnb-pnf.band77.usrpn310.4x4.conf @@ -0,0 +1,31 @@ +usrp-tx-thread-config = 1; +tune-offset = 30720000; + +L1s = ({ + num_cc = 1; + tr_n_preference = "nfapi"; + remote_n_address = "127.0.0.1"; // vnf addr + local_n_address = "127.0.0.1"; // pnf addr + local_n_portc = 50000; // pnf p5 port [!] + remote_n_portc = 50001; // vnf p5 port + local_n_portd = 50010; // pnf p7 port + remote_n_portd = 50011; // vnf p7 port + prach_dtx_threshold = 120; + pusch_dtx_threshold = 20; + max_ldpc_iterations = 10; +}); + +RUs = ({ + local_rf = "yes" + nb_tx = 4; + nb_rx = 4; + att_tx = 0; + att_rx = 0; + bands = [77]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 75; + eNB_instances = [0]; + #clock_src = "internal"; + sdr_addrs = "addr=192.168.80.53, clock_source=internal,time_source=internal" +}); + diff --git a/ci-scripts/conf_files/gnb-vnf.sa.band66.u0.25prb.nfapi.conf b/ci-scripts/conf_files/gnb-vnf.sa.band66.u0.25prb.nfapi.conf new file mode 100644 index 0000000000..c14759c6af --- /dev/null +++ b/ci-scripts/conf_files/gnb-vnf.sa.band66.u0.25prb.nfapi.conf @@ -0,0 +1,218 @@ +Active_gNBs = ( "5G-GOA-gNB"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "5G-GOA-gNB"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1 }) }); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + sib1_tda = 5; + min_rxtxtime = 6; + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 0; + +# downlinkConfigCommon + #frequencyInfoDL + # this is 2150.43 MHz + 14 PRBs@15kHz SCS (same as initial BWP), points to Subcarrier 0 of RB#10 of SSB block + absoluteFrequencySSB = 430590; + dl_frequencyBand = 66; + # this is 2150.43 MHz + dl_absoluteFrequencyPointA = 430086; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 0; + dl_carrierBandwidth = 25; + #initialDownlinkBWP + #genericParameters + # this is RBstart=0,L=25 (275*(L-1))+RBstart + initialDLBWPlocationAndBandwidth = 6600; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 0; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 2; + initialDLBWPsearchSpaceZero = 0; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 66; + # this is 1750.43 MHz + ul_absoluteFrequencyPointA = 350086; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 0; + ul_carrierBandwidth = 25; + pMax = 20; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 6600; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 0; + #rach-ConfigCommon + #rach-ConfigGeneric + prach_ConfigurationIndex = 98; +#prach_msg1_FDM +#0 = one, 1=two, 2=four, 3=eight + prach_msg1_FDM = 0; + prach_msg1_FrequencyStart = 0; + zeroCorrelationZoneConfig = 13; + preambleReceivedTargetPower = -118; +#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) + preambleTransMax = 6; +#powerRampingStep +# 0=dB0,1=dB2,2=dB4,3=dB6 + powerRampingStep = 1; +#ra_ReponseWindow +#1,2,4,8,10,20,40,80 + ra_ResponseWindow = 5; +#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR +#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen + ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4; +#one (0..15) 4,8,12,16,...60,64 + ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15; +#ra_ContentionResolutionTimer +#(0..7) 8,16,24,32,40,48,56,64 + ra_ContentionResolutionTimer = 7; + rsrp_ThresholdSSB = 19; +#prach-RootSequenceIndex_PR +#1 = 839, 2 = 139 + prach_RootSequenceIndex_PR = 2; + prach_RootSequenceIndex = 1; + # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex + # + msg1_SubcarrierSpacing = 0; +# restrictedSetConfig +# 0=unrestricted, 1=restricted type A, 2=restricted type B + restrictedSetConfig = 0; + + msg3_DeltaPreamble = 1; + p0_NominalWithGrant =-90; + +# pucch-ConfigCommon setup : +# pucchGroupHopping +# 0 = neither, 1= group hopping, 2=sequence hopping + pucchGroupHopping = 0; + hoppingId = 40; + p0_nominal = -90; + + ssb_PositionsInBurst_Bitmap = 1; + +# ssb_periodicityServingCell +# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 + ssb_periodicityServingCell = 2; + +# dmrs_TypeA_position +# 0 = pos2, 1 = pos3 + dmrs_TypeA_Position = 0; + +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + subcarrierSpacing = 0; + + + #tdd-UL-DL-ConfigurationCommon +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + referenceSubcarrierSpacing = 0; + # pattern1 + # dl_UL_TransmissionPeriodicity + # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 + dl_UL_TransmissionPeriodicity = 6; + nrofDownlinkSlots = 7; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 2; + nrofUplinkSymbols = 4; + + ssPBCH_BlockPower = -25; + } + + ); + + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ({ ipv4 = "192.168.71.132"; }); + + NETWORK_INTERFACES : + { + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.71.140/26"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.71.140/26"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "nfapi"; + remote_s_address = "192.168.71.141"; // pnf addr [!] + local_s_address = "192.168.71.140"; // vnf addr + local_s_portc = 50001; // vnf p5 port + remote_s_portc = 50000; // pnf p5 port [!] + local_s_portd = 50011; // vnf p7 port [!] + remote_s_portd = 50010; // pnf p7 port [!] + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 150; + pucch_TargetSNRx10 = 200; +} +); + +security = { + # preferred ciphering algorithms + # the first one of the list that an UE supports in chosen + # valid values: nea0, nea1, nea2, nea3 + ciphering_algorithms = ( "nea0" ); + + # preferred integrity algorithms + # the first one of the list that an UE supports in chosen + # valid values: nia0, nia1, nia2, nia3 + integrity_algorithms = ( "nia2", "nia0" ); + + # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter + # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' + drb_ciphering = "yes"; + drb_integrity = "no"; +}; + +log_config : +{ + global_log_level ="info"; + hw_log_level ="info"; + phy_log_level ="info"; + mac_log_level ="info"; + rlc_log_level ="info"; + pdcp_log_level ="info"; + rrc_log_level ="info"; + ngap_log_level ="debug"; + f1ap_log_level ="info"; +}; diff --git a/ci-scripts/conf_files/gnb-vnf.sa.band77.162prb.nfapi.4x4.conf b/ci-scripts/conf_files/gnb-vnf.sa.band77.162prb.nfapi.4x4.conf new file mode 100644 index 0000000000..d9f09dca3d --- /dev/null +++ b/ci-scripts/conf_files/gnb-vnf.sa.band77.162prb.nfapi.4x4.conf @@ -0,0 +1,224 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({ mcc = 208; mnc = 97; mnc_length = 2; snssaiList = ({ sst = 1; }) }); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + pdsch_AntennaPorts_XP = 2; + pusch_AntennaPorts = 4; + pdsch_AntennaPorts_N1 = 2; + maxMIMO_layers = 4; + do_CSIRS = 1; + do_SRS = 1; + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 0; + +# downlinkConfigCommon + #frequencyInfoDL + # this is 4100.16 MHz + absoluteFrequencySSB = 673344; + # this is 4071 MHz + dl_absoluteFrequencyPointA = 671400; + dl_frequencyBand = 77; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 1; + dl_carrierBandwidth = 162; + #initialDownlinkBWP + #genericParameters + # this is RBstart=0,L=162 (275*(275-L+1))+(274-RBstart)) + initialDLBWPlocationAndBandwidth = 31624; + # +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 1; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 12; + initialDLBWPsearchSpaceZero = 0; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 77; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 1; + ul_carrierBandwidth = 162; + pMax = 20; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 31624; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 1; + #rach-ConfigCommon + #rach-ConfigGeneric + prach_ConfigurationIndex = 98; +#prach_msg1_FDM +#0 = one, 1=two, 2=four, 3=eight + prach_msg1_FDM = 0; + prach_msg1_FrequencyStart = 0; + zeroCorrelationZoneConfig = 12; + preambleReceivedTargetPower = -96; +#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) + preambleTransMax = 6; +#powerRampingStep +# 0=dB0,1=dB2,2=dB4,3=dB6 + powerRampingStep = 1; +#ra_ReponseWindow +#1,2,4,8,10,20,40,80 + ra_ResponseWindow = 5; +#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR +#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen + ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4; +#one (0..15) 4,8,12,16,...60,64 + ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15; +#ra_ContentionResolutionTimer +#(0..7) 8,16,24,32,40,48,56,64 + ra_ContentionResolutionTimer = 7; + rsrp_ThresholdSSB = 19; +#prach-RootSequenceIndex_PR +#1 = 839, 2 = 139 + prach_RootSequenceIndex_PR = 2; + prach_RootSequenceIndex = 1; + # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex + # + msg1_SubcarrierSpacing = 1, +# restrictedSetConfig +# 0=unrestricted, 1=restricted type A, 2=restricted type B + restrictedSetConfig = 0, + + msg3_DeltaPreamble = 1; + p0_NominalWithGrant =-90; + +# pucch-ConfigCommon setup : +# pucchGroupHopping +# 0 = neither, 1= group hopping, 2=sequence hopping + pucchGroupHopping = 0; + hoppingId = 40; + p0_nominal = -70; + + ssb_PositionsInBurst_Bitmap = 1; + +# ssb_periodicityServingCell +# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 + ssb_periodicityServingCell = 2; + +# dmrs_TypeA_position +# 0 = pos2, 1 = pos3 + dmrs_TypeA_Position = 0; + +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + subcarrierSpacing = 1; + + + #tdd-UL-DL-ConfigurationCommon +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + referenceSubcarrierSpacing = 1; + # pattern1 + # dl_UL_TransmissionPeriodicity + # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 + dl_UL_TransmissionPeriodicity = 5; + nrofDownlinkSlots = 3; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 1; + nrofUplinkSymbols = 4; + + ssPBCH_BlockPower = -25; + } + + ); + + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ({ ipv4 = "192.168.61.132"; }); + + NETWORK_INTERFACES : + { + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.61.129/26"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.61.129/26"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "nfapi"; + remote_s_address = "127.0.0.1"; // pnf addr [!] + local_s_address = "127.0.0.1"; // vnf addr + local_s_portc = 50001; // vnf p5 port + remote_s_portc = 50000; // pnf p5 port [!] + local_s_portd = 50011; // vnf p7 port [!] + remote_s_portd = 50010; // pnf p7 port [!] + + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 250; + pucch_TargetSNRx10 = 250; + pusch_FailureThres = 100; + ul_max_mcs = 28; +} +); + +security = { + # preferred ciphering algorithms + # the first one of the list that an UE supports in chosen + # valid values: nea0, nea1, nea2, nea3 + ciphering_algorithms = ( "nea1", "nea0" ); + + # preferred integrity algorithms + # the first one of the list that an UE supports in chosen + # valid values: nia0, nia1, nia2, nia3 + integrity_algorithms = ( "nia1", "nia0" ); + + # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter + # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' + drb_ciphering = "yes"; + drb_integrity = "yes"; +}; + +log_config : +{ + global_log_level ="info"; + hw_log_level ="info"; + phy_log_level ="info"; + mac_log_level ="info"; + rlc_log_level ="info"; + pdcp_log_level ="info"; + rrc_log_level ="info"; + ngap_log_level ="debug"; + f1ap_log_level ="debug"; +}; diff --git a/ci-scripts/xml_files/container_5g_rfsim_u0_25prb.xml b/ci-scripts/xml_files/container_5g_rfsim_u0_25prb.xml index 7014c54a2a..ee4c334cee 100644 --- a/ci-scripts/xml_files/container_5g_rfsim_u0_25prb.xml +++ b/ci-scripts/xml_files/container_5g_rfsim_u0_25prb.xml @@ -22,7 +22,7 @@ --> rfsim-5gnr-fdd-u0-25prb - Monolithic SA FDD u0 25PRB gNB + VNF-PNF nFAPI FDD u0 25PRB gNB wrench 111111 @@ -62,9 +62,9 @@ Deploy_Object - Deploy OAI 5G gNB+nrUE RF sim SA + Deploy OAI 5G VNF+PNF+nrUE RF sim SA ci-scripts/yaml_files/5g_rfsimulator_u0_25prb - oai-gnb oai-nr-ue + oai-vnf oai-pnf oai-nr-ue 0 0 @@ -122,6 +122,7 @@ Undeploy_Object true Undeploy all OAI 5G stack + oai-vnf oai-pnf ci-scripts/yaml_files/5g_rfsimulator_u0_25prb 1,0,0,0 1,0,0,0 diff --git a/ci-scripts/xml_files/container_sa_n310_4X4_60MHz_quectel.xml b/ci-scripts/xml_files/container_sa_n310_4X4_60MHz_quectel.xml index e9833887df..9ec5b37245 100644 --- a/ci-scripts/xml_files/container_sa_n310_4X4_60MHz_quectel.xml +++ b/ci-scripts/xml_files/container_sa_n310_4X4_60MHz_quectel.xml @@ -22,7 +22,7 @@ --> TEST-SA-FR1-N310-4x4-60MHz - 60 MHz 4x4 TDD SA + nFAPI 60 MHz 4x4 TDD SA tasks 100000 @@ -85,7 +85,7 @@ Deploy_Object - Deploy gNB (TDD/Band77/60MHz/N310) in a container + Deploy VNF-PNF (TDD/Band77/60MHz/N310) in a container ci-scripts/yaml_files/5g_sa_n310_4x4_60MHz 0 0 @@ -144,11 +144,11 @@ Undeploy_Object true - Undeploy gNB + Undeploy VNF-PNF ci-scripts/yaml_files/5g_sa_n310_4x4_60MHz 0 0 - oai-gnb + oai-vnf oai-pnf 10,100,100,100 10,100,100,100 diff --git a/ci-scripts/yaml_files/5g_rfsimulator_u0_25prb/docker-compose.yaml b/ci-scripts/yaml_files/5g_rfsimulator_u0_25prb/docker-compose.yaml index 50871c5131..05b2122ccb 100644 --- a/ci-scripts/yaml_files/5g_rfsimulator_u0_25prb/docker-compose.yaml +++ b/ci-scripts/yaml_files/5g_rfsimulator_u0_25prb/docker-compose.yaml @@ -80,13 +80,15 @@ services: interval: 10s timeout: 5s retries: 5 - oai-gnb: + + oai-vnf: image: ${REGISTRY:-oaisoftwarealliance}/${GNB_IMG:-oai-gnb}:${TAG:-develop} - container_name: rfsim5g-oai-gnb + container_name: rfsim5g-oai-vnf cap_drop: - ALL environment: - USE_ADDITIONAL_OPTIONS: --rfsim --log_config.global_log_options level,nocolor,time + USE_ADDITIONAL_OPTIONS: --nfapi VNF --log_config.global_log_options level,nocolor,time + NFAPI_TRACE_LEVEL: info ASAN_OPTIONS: detect_leaks=0 depends_on: - oai-ext-dn @@ -94,7 +96,29 @@ services: public_net: ipv4_address: 192.168.71.140 volumes: - - ../../conf_files/gnb.sa.band66.u0.25prb.rfsim.conf:/opt/oai-gnb/etc/gnb.conf + - ../../conf_files/gnb-vnf.sa.band66.u0.25prb.nfapi.conf:/opt/oai-gnb/etc/gnb.conf + healthcheck: + test: /bin/bash -c "pgrep nr-softmodem" + interval: 10s + timeout: 5s + retries: 5 + + oai-pnf: + image: ${REGISTRY:-oaisoftwarealliance}/${GNB_IMG:-oai-gnb}:${TAG:-develop} + container_name: rfsim5g-oai-pnf + cap_drop: + - ALL + environment: + USE_ADDITIONAL_OPTIONS: --nfapi PNF --rfsim --log_config.global_log_options level,nocolor,time + NFAPI_TRACE_LEVEL: info + ASAN_OPTIONS: detect_leaks=0 + depends_on: + - oai-vnf + networks: + public_net: + ipv4_address: 192.168.71.141 + volumes: + - ../../conf_files/gnb-pnf.band66.rfsim.conf:/opt/oai-gnb/etc/gnb.conf healthcheck: test: /bin/bash -c "pgrep nr-softmodem" interval: 10s @@ -110,9 +134,9 @@ services: - NET_ADMIN # for interface bringup - NET_RAW # for ping environment: - USE_ADDITIONAL_OPTIONS: --rfsim -r 25 --numerology 0 --uicc0.imsi 208990100001100 --band 66 -C 2152680000 --CO -400000000 --ssb 48 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time + USE_ADDITIONAL_OPTIONS: --rfsim -r 25 --numerology 0 --uicc0.imsi 208990100001100 --band 66 -C 2152680000 --CO -400000000 --ssb 48 --rfsimulator.serveraddr 192.168.71.141 --log_config.global_log_options level,nocolor,time depends_on: - - oai-gnb + - oai-pnf networks: public_net: ipv4_address: 192.168.71.150 diff --git a/ci-scripts/yaml_files/5g_sa_n310_4x4_60MHz/docker-compose.yml b/ci-scripts/yaml_files/5g_sa_n310_4x4_60MHz/docker-compose.yml index ed6c76ae78..c349ac0406 100644 --- a/ci-scripts/yaml_files/5g_sa_n310_4x4_60MHz/docker-compose.yml +++ b/ci-scripts/yaml_files/5g_sa_n310_4x4_60MHz/docker-compose.yml @@ -1,8 +1,8 @@ services: - oai-gnb: + oai-vnf: image: ${REGISTRY:-oaisoftwarealliance}/${GNB_IMG:-oai-gnb}:${TAG:-develop} network_mode: "host" - container_name: oai-gnb + container_name: oai-vnf cap_drop: - ALL cap_add: @@ -10,9 +10,30 @@ services: - IPC_LOCK environment: TZ: Europe/Paris - USE_ADDITIONAL_OPTIONS: --log_config.global_log_options level,nocolor,time + USE_ADDITIONAL_OPTIONS: --nfapi VNF + NFAPI_TRACE_LEVEL: info volumes: - - ../../conf_files/gnb.sa.band77.162prb.usrpn310.4x4.conf:/opt/oai-gnb/etc/gnb.conf + - ../../conf_files/gnb-vnf.sa.band77.162prb.nfapi.4x4.conf:/opt/oai-gnb/etc/gnb.conf + healthcheck: + test: /bin/bash -c "pgrep nr-softmodem" + interval: 10s + timeout: 5s + retries: 5 + oai-pnf: + image: ${REGISTRY:-oaisoftwarealliance}/${GNB_IMG:-oai-gnb}:${TAG:-develop} + network_mode: "host" + container_name: oai-pnf + cap_drop: + - ALL + cap_add: + - SYS_NICE + - IPC_LOCK + environment: + TZ: Europe/Paris + USE_ADDITIONAL_OPTIONS: --nfapi PNF + NFAPI_TRACE_LEVEL: info + volumes: + - ../../conf_files/gnb-pnf.band77.usrpn310.4x4.conf:/opt/oai-gnb/etc/gnb.conf healthcheck: test: /bin/bash -c "pgrep nr-softmodem" interval: 10s diff --git a/doc/MAC/mac-usage.md b/doc/MAC/mac-usage.md index 31461f68eb..c3dbd6f199 100644 --- a/doc/MAC/mac-usage.md +++ b/doc/MAC/mac-usage.md @@ -145,8 +145,8 @@ In the last lines: ## Split-related options (running in a DU) -See [nFAPI documentation](../L2NFAPI.md) or [Aerial -tutorial](../Aerial_FAPI_Split_Tutorial.md) for information about the FAPI +See [nFAPI documentation](../nfapi.md) or [Aerial +tutorial](../Aerial_FAPI_Split_Tutorial.md) for information about the (n)FAPI split. See [F1 documentation](../F1-design.md) for information about the F1 split. diff --git a/doc/README.md b/doc/README.md index c4b24f39ec..2e84db217c 100644 --- a/doc/README.md +++ b/doc/README.md @@ -57,7 +57,8 @@ There is some general information in the [OpenAirInterface Gitlab Wiki](https:// - [How to use the L2 simulator](./L2NFAPI.md) - [How to use the OAI channel simulator](../openair1/SIMULATION/TOOLS/DOC/channel_simulation.md) - [How to use multiple BWPs](./RUN_NR_multiple_BWPs.md) -- [How to run OAI-VNF and OAI-PNF](./RUN_NR_NFAPI.md) _Note: does not work currently_ +- [How to run OAI-VNF and OAI-PNF](./nfapi.md): how to run the nFAPI split, + including some general remarks on FAPI/nFAPI. - [How to use the positioning reference signal (PRS)](./RUN_NR_PRS.md) - [How to use device-to-device communication (D2D, 4G)](./d2d_emulator_setup.txt) - [How to run with E2 agent](../openair2/E2AP/README.md) diff --git a/doc/RUN_NR_NFAPI.md b/doc/RUN_NR_NFAPI.md deleted file mode 100644 index 5b597aa326..0000000000 --- a/doc/RUN_NR_NFAPI.md +++ /dev/null @@ -1,54 +0,0 @@ -# Procedure to run nFAPI in 5G NR - -## Contributed by 5G Testbed IISc - -### Developers: Gokul S, Mahesh A, Aniq U R - -## Procedure to Build gNB and UE - -The regular commands to build gNB and UE can be used -``` -sudo ./build_oai --gNB --nrUE - -``` -## Procedure to run NR nFAPI using RF-Simulator - -### Bring up another loopback interface - -If running for the first time on your computer, or you have restarted your computer, bring up another loopback interface with this command: - -sudo ifconfig lo: 127.0.0.2 netmask 255.0.0.0 up - -### VNF command -``` -sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf --nfapi VNF --noS1 --phy-test - -``` -### PNF command -``` -sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpx300.conf --nfapi PNF --rfsim --phy-test --rfsimulator.serveraddr server - -``` -### UE command -``` -sudo ./nr-uesoftmodem --rfsim --phy-test -d --rfsimulator.serveraddr 127.0.0.1 - -``` -## Procedure to run NR nFAPI using Hardware (tested with USRP x310) - -### VNF command -``` -sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf --nfapi VNF --noS1 --phy-test - -``` -### PNF command -``` -sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpx300.conf --nfapi PNF --phy-test - -``` -### UE command -``` -sudo ./nr-uesoftmodem --usrp-args "addr=*USRP_ADDRESS*,clock_source=external,time_source=external" --phy-test - -``` - diff --git a/doc/environment-variables.md b/doc/environment-variables.md index 31520b0a2d..9778665afe 100644 --- a/doc/environment-variables.md +++ b/doc/environment-variables.md @@ -2,7 +2,7 @@ OAI uses/supports a number of environment variables, documented in the following: -- `NFAPI_TRACE_LEVEL`: set the nfapi custom logging framework's log level; can be one of `error`, `warn`, `note`, `info`, `debug` +- `NFAPI_TRACE_LEVEL`: set the nfapi custom logging framework's log level; can be one of `error`, `warn`, `note`, `info`, `debug`. Default is `warn`. - `NR_AWGN_RESULTS_DIR`: directory containing BLER curves for L2simulator channel modelling in SISO case - `NR_MIMO2x2_AWGN_RESULTS_DIR`: directory containing BLER curves for L2simulator channel modelling in 2x2 MIMO case - `NVRAM_DIR`: directory to read/write NVRAM data in (5G) `nvram` tool; if not defined, will use `PWD` (working directory) diff --git a/doc/nfapi.md b/doc/nfapi.md new file mode 100644 index 0000000000..366b5fb4ac --- /dev/null +++ b/doc/nfapi.md @@ -0,0 +1,137 @@ +This document describes the SmallCellForum (SCF) (n)FAPI split in 5G, i.e., +between the MAC/L2 and PHY/L1. + +The interested reader is recommended to read a copy of the SCF 222.10 +specification ("FAPI"). This includes information on what is P5, P7, and how +FAPI works. The currently used version is SCF 222.10.02, with some messages +upgraded to SCF 222.10.04 due to bugfixes in the spec. Further information +about nFAPI can be found in SCF 225.2.0. + +# Quickstart + +Compile OAI as normal. Start the CN and make sure that the VNF configuration +matches the PLMN/IP addresses. Then, run the VNF + + sudo NFAPI_TRACE_LEVEL=info ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-vnf.sa.band78.106prb.nfapi.conf --nfapi VNF + +Afterwards, start and connect the PNF + + sudo NFAPI_TRACE_LEVEL=info ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-pnf.band78.rfsim.conf --nfapi PNF --rfsim + +Finally, you can start the UE (observe the radio configuration info in the +VNF!) + + sudo ./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 -O ue.conf + +You should not observe a difference between nFAPI split and monolithic. + + +# Status + +All FAPI message can be transferred between VNF and PNF. This is because OAI +uses FAPI with its corresponding messages internally, whether a split is in use +or not. + +The nFAPI split mode supports any radio configuration that is also supported by +the monolithic gNB, with the notable exceptions that only numerologies of 15kHz +and 30kHz (mu=0 and mu=1, respectively) are supported. + +The VNF requests to be notified about every slot by the PNF. No delay +management is employed as of now; instead, the PNF sends a Slot.indication to +the VNF in every slot (in divergence from the nFAPI spec). + +Currently, downlink transmissions work the same in monolithic and nFAPI. In +uplink, we observe an increased number of retransmissions, which limits the MCS +and hence the achievable throughput (which is limited to 10-20Mbps). We are still +debugging the root cause of this. + +After stopping the PNF, you also have to restart the VNF. + +When using RFsim, the system might run slower than in monolithic. This is +because the PNF needs to slow down the execution time of a specific slot, +because it has to send a Slot.indication to the VNF for scheduling. + +# Configuration + +Both PNF and VNF are run through the `nr-softmodem` executable. The type of +mode is switched through the `--nfapi` switch, with options `MONOLITHIC` +(default if not provided), `VNF`, `PNF`. + +If the type is `VNF`, you have to modify the `MACRLCs.tr_s_preference` +(transport south preference) to `nfapi`. Further, configure these options: + +- `MACRLCs.remote_s_address` (remote south address): IP of the PNF +- `MACRLCs.local_s_address` (local south address): IP of the VNF +- `MACRLCs.local_s_portc` (local south port for control): VNF's P5 local port +- `MACRLCs.remote_s_portc` (remote south port for data): PNF's P5 remote port +- `MACRLCs.local_s_portd` (local south port for control): VNF's P5 local port +- `MACRLCs.remote_s_portd` (remote south port for data): PNF's P7 remote port + +Note that any L1-specific section (`L1s`, `RUs`, +RFsimulator-specific/IF7.2-specific configuration or other radios, if +necessary) will be ignored and can be deleted. + +If the type is `PNF`, you have to modify modify the `L1s.tr_n_preference` +(transport north preference) to `nfapi`. Further, configure these options: + +- `L1s.remote_n_address` (remote north address): IP of the VNF +- `L1s.local_n_address` (local north address): IP of the PNF +- `L1s.local_n_portc` (local north port for control): PNF's P5 local port +- `L1s.remote_n_portc` (remote north port for control): VNF's P5 remote port +- `L1s.local_n_portd` (local north port for data): PNF's P7 local port +- `L1s.remote_n_portd` (remote north port for data): VNF's P7 remote port + +Note that this file should contain additional, L1-specific sections (`L1s`, +`RUs` RFsimulator-specific/IF7.2-specific configuration or other radios, if +necessary). + +To split an existing config file `monolithic.conf` for nFAPI operation, you +can proceed as follows: + +- copy `monolithic.conf`, which will be your VNF file (`vnf.conf`) +- in `vnf.conf` + * modify `MACRLCs` section to configure south-bound nFAPI transport + * delete `L1s`, `RUs`, and radio-specific sections. + * in `gNBs` section, increase the `ra_ResponseWindow` by one to extend the RA + window: this is necessary because the PNF triggers the scheduler in the VNF + in advance, which might make the RA window more likely to run out +- copy `monolithic.conf`, which will be your PNF file (`pnf.conf`) +- in `pnf.conf` + * modify `L1s` section to configure north-bound nFAPI transport (make sure it + matches the `MACRLCs` section for `vnf.conf` + * delete all the `gNBs`, `MACRLCs`, `security` sections (they are not needed) +- if you have root-level options in `monolithic.conf`, such as + `usrp-tx-thread-config` or `tune-offset`, make sure to to add them to + `pnf.conf`, or provide them on the command line for the PNF. +- to run, proceed as described in the quick start above. + +Note: all L1-specific options have to be passed to the PNF, and remaining +options to the VNF. + +# nFAPI logging system + +nFAPI has its own logging system, independent of OAI's. It can be activated by +setting the `NFAPI_TRACE_LEVEL` environment variable to an appropriate value; +see [the environment variables documentation](./environment-variables.md) for +more info. + +To see the (any) periodical output at the PNF, define `NFAPI_TRACE_LEVEL=info`. +This output shows: + +``` +41056.739654 [I] 3556767424: pnf_p7_slot_ind: [P7:1] msgs ontime 489 thr DL 0.06 UL 0.01 msg late 0 (vtime) +``` + +The first numbers are timestamps. `pnf_p7_slot_ind` is the name of the +functions that prints the output. `[P7:1]` refers to the fact that these are +information on P7, of PHY ID 1. Finally, `msgs ontime 489` means that in the +last window (since the last print), 489 messages arrived at the PNF in total. +The combined throughput of `TX_data.requests` (DL traffic) was 0.06 Mbps; note +that this includes SIB1 and other periodical data channels. In UL, 0.01 Mbps +have been sent through `RX_data.indication`. `msg late 0` means that 0 packets +have been late. _This number is an aggregate over the total runtime_, unlike +the other messages. Finally, `(vtime)` is a reminder that the calculations are +done over virtual time, i.e., frames/slots as executed by the 5G Systems. For +instance, these numbers might be slightly higher or slower in RFsim than in +wall-clock time, depending if the system advances faster or slower than +wall-clock time. diff --git a/executables/lte-softmodem.c b/executables/lte-softmodem.c index 2a0b73c019..6a7e607586 100644 --- a/executables/lte-softmodem.c +++ b/executables/lte-softmodem.c @@ -195,6 +195,15 @@ void handle_nr_srs_measurements(const module_id_t module_id, /* forward declarations */ void set_default_frame_parms(LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]); +/* TODO these declarations are to be removed */ +void nr_schedule_dl_tti_req(void) {}; +void nr_schedule_ul_dci_req() {}; +void nr_schedule_tx_req() {}; +void nr_schedule_ul_tti_req() {}; +void nr_slot_select() {}; +void NR_UL_indication(NR_UL_IND_t *UL_INFO) {}; +void gNB_dlsch_ulsch_scheduler() {}; + /*---------------------BMC: timespec helpers -----------------------------*/ struct timespec min_diff_time = { .tv_sec = 0, .tv_nsec = 0 }; diff --git a/executables/lte-uesoftmodem.c b/executables/lte-uesoftmodem.c index 0a4a4e8d0e..ea48edd801 100644 --- a/executables/lte-uesoftmodem.c +++ b/executables/lte-uesoftmodem.c @@ -155,6 +155,12 @@ double cpuf; extern char uecap_xer[1024]; char uecap_xer_in=0; +/* TODO these declarations are to be removed */ +void nr_schedule_dl_tti_req(void) {}; +void nr_schedule_ul_dci_req() {}; +void nr_schedule_tx_req() {}; +void nr_schedule_ul_tti_req() {}; +void nr_slot_select() {}; /* see file openair2/LAYER2/MAC/main.c for why abstraction_flag is needed * this is very hackish - find a proper solution diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c index f80c5f2e49..0aa538c348 100644 --- a/executables/nr-gnb.c +++ b/executables/nr-gnb.c @@ -138,9 +138,14 @@ static void tx_func(processingData_L1tx_t *info) ru_tx_func((void *)&syncMsgRU); stop_meas(&info->gNB->phy_proc_tx); } - /* this thread is done with the sched_info, decrease the reference counter */ - LOG_D(NR_PHY, "Calling deref_sched_response for id %d (tx_func) in %d.%d\n", info->sched_response_id, frame_tx, slot_tx); - deref_sched_response(info->sched_response_id); + + if (NFAPI_MODE == NFAPI_MONOLITHIC) { + /* this thread is done with the sched_info, decrease the reference counter. + * This only applies for monolithic; in the PNF, the memory is allocated in + * a ring buffer that should never be overwritten (one frame duration). */ + LOG_D(NR_PHY, "Calling deref_sched_response for id %d (tx_func) in %d.%d\n", info->sched_response_id, frame_tx, slot_tx); + deref_sched_response(info->sched_response_id); + } } void *L1_rx_thread(void *arg) @@ -179,15 +184,6 @@ static void rx_func(processingData_L1_t *info) int slot_rx = info->slot_rx; nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config; - // ******************************************************************* - - if (NFAPI_MODE == NFAPI_MODE_PNF) { - // I am a PNF and I need to let nFAPI know that we have a (sub)frame tick - // LOG_D(PHY, "oai_nfapi_slot_ind(frame:%u, slot:%d) ********\n", frame_rx, slot_rx); - handle_nr_slot_ind(frame_rx, slot_rx); - } - // **************************************** - // RX processing int rx_slot_type = nr_slot_select(cfg, frame_rx, slot_rx); if (rx_slot_type == NR_UPLINK_SLOT || rx_slot_type == NR_MIXED_SLOT) { @@ -312,7 +308,13 @@ void *nrL1_stats_thread(void *param) { return(NULL); } -void init_gNB_Tpool(int inst) { +void init_gNB_Tpool(int inst) +{ + AssertFatal(NFAPI_MODE == NFAPI_MODE_PNF || NFAPI_MODE == NFAPI_MONOLITHIC, + "illegal NFAPI_MODE %d (%s): it cannot have an L1\n", + NFAPI_MODE, + nfapi_get_strmode()); + PHY_VARS_gNB *gNB; gNB = RC.gNB[inst]; gNB_L1_proc_t *proc = &gNB->proc; @@ -345,8 +347,7 @@ void init_gNB_Tpool(int inst) { // this will be removed when the msgDataTx is not necessary anymore gNB->msgDataTx = msgDataTx; - if ((!get_softmodem_params()->emulate_l1) && (!IS_SOFTMODEM_NOSTATS) && (NFAPI_MODE != NFAPI_MODE_VNF) - && (NFAPI_MODE != NFAPI_MODE_AERIAL)) + if (!IS_SOFTMODEM_NOSTATS) threadCreate(&proc->L1_stats_thread, nrL1_stats_thread, (void *)gNB, "L1_stats", -1, OAI_PRIORITY_RT_LOW); } @@ -365,8 +366,7 @@ void term_gNB_Tpool(int inst) { abortNotifiedFIFO(&gNB->L1_rx_out); gNB_L1_proc_t *proc = &gNB->proc; - if (!get_softmodem_params()->emulate_l1) - pthread_join(proc->L1_stats_thread, NULL); + pthread_join(proc->L1_stats_thread, NULL); } /// eNB kept in function name for nffapi calls, TO FIX @@ -374,7 +374,7 @@ void init_eNB_afterRU(void) { int inst,ru_id,i,aa; PHY_VARS_gNB *gNB; - for (inst=0; inst curr_time.tv_sec) || - (slot_start.tv_sec == curr_time.tv_sec && slot_start.tv_nsec > curr_time.tv_nsec)){ - sleep_time = timespec_sub(slot_start,curr_time); - usleep(sleep_time.tv_nsec * 1e-3); - } - } - if (slot==(fp->slots_per_frame-1)) { slot=0; frame++; diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c index a200b1e8a4..e14e482b6d 100644 --- a/executables/nr-softmodem.c +++ b/executables/nr-softmodem.c @@ -678,26 +678,29 @@ int main( int argc, char **argv ) { #endif // E2_AGENT + // wait for F1 Setup Response before starting L1 for real + if (NFAPI_MODE != NFAPI_MODE_PNF && (NODE_IS_DU(node_type) || NODE_IS_MONOLITHIC(node_type))) + wait_f1_setup_response(); + + if (RC.nb_RU > 0) + start_NR_RU(); + +#ifdef ENABLE_AERIAL + gNB_MAC_INST *nrmac = RC.nrmac[0]; + nvIPC_Init(nrmac->nvipc_params_s); +#endif + + for (int idx = 0; idx < RC.nb_nr_L1_inst; idx++) + RC.gNB[idx]->if_inst->sl_ahead = sl_ahead; if (NFAPI_MODE==NFAPI_MODE_PNF) { wait_nfapi_init("main?"); } - // wait for F1 Setup Response before starting L1 for real - if (NODE_IS_DU(node_type) || NODE_IS_MONOLITHIC(node_type)) - wait_f1_setup_response(); - - if (RC.nb_RU > 0) - start_NR_RU(); -#ifdef ENABLE_AERIAL - gNB_MAC_INST *nrmac = RC.nrmac[0]; - nvIPC_Init(nrmac->nvipc_params_s); -#endif if (RC.nb_nr_L1_inst > 0) { wait_RUs(); // once all RUs are ready initialize the rest of the gNBs ((dependence on final RU parameters after configuration) - for (int idx=0;idxif_inst->sl_ahead = sl_ahead; if (IS_SOFTMODEM_DOSCOPE || IS_SOFTMODEM_IMSCOPE_ENABLED) { sleep(1); scopeParms_t p; diff --git a/executables/nr-ue.c b/executables/nr-ue.c index e54af77ab6..ef45cd3cb7 100644 --- a/executables/nr-ue.c +++ b/executables/nr-ue.c @@ -190,17 +190,21 @@ void init_nrUE_standalone_thread(int ue_idx) pthread_setname_np(phy_thread, "oai:nrue-stand-phy"); } -static void process_queued_nr_nfapi_msgs(NR_UE_MAC_INST_t *mac, int sfn_slot) +static void process_queued_nr_nfapi_msgs(NR_UE_MAC_INST_t *mac, int sfn, int slot) { + struct sfn_slot_s sfn_slot = {.sfn = sfn, .slot = slot}; nfapi_nr_rach_indication_t *rach_ind = unqueue_matching(&nr_rach_ind_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &sfn_slot); nfapi_nr_dl_tti_request_t *dl_tti_request = get_queue(&nr_dl_tti_req_queue); nfapi_nr_ul_dci_request_t *ul_dci_request = get_queue(&nr_ul_dci_req_queue); for (int i = 0; i < NR_MAX_HARQ_PROCESSES; i++) { - LOG_D(NR_MAC, "Try to get a ul_tti_req by matching CRC active SFN %d/SLOT %d from queue with %lu items\n", - NFAPI_SFNSLOT2SFN(mac->nr_ue_emul_l1.harq[i].active_ul_harq_sfn_slot), - NFAPI_SFNSLOT2SLOT(mac->nr_ue_emul_l1.harq[i].active_ul_harq_sfn_slot), nr_ul_tti_req_queue.num_items); - nfapi_nr_ul_tti_request_t *ul_tti_request_crc = unqueue_matching(&nr_ul_tti_req_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &mac->nr_ue_emul_l1.harq[i].active_ul_harq_sfn_slot); + LOG_D(NR_MAC, + "Try to get a ul_tti_req by matching CRC active sfn/slot %d.%d from queue with %lu items\n", + sfn, + slot, + nr_ul_tti_req_queue.num_items); + struct sfn_slot_s sfn_sf = {.sfn = mac->nr_ue_emul_l1.harq[i].active_ul_harq_sfn, .slot = mac->nr_ue_emul_l1.harq[i].active_ul_harq_slot }; + nfapi_nr_ul_tti_request_t *ul_tti_request_crc = unqueue_matching(&nr_ul_tti_req_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &sfn_sf); if (ul_tti_request_crc && ul_tti_request_crc->n_pdus > 0) { check_and_process_dci(NULL, NULL, NULL, ul_tti_request_crc); free_and_zero(ul_tti_request_crc); @@ -216,11 +220,11 @@ static void process_queued_nr_nfapi_msgs(NR_UE_MAC_INST_t *mac, int sfn_slot) free_and_zero(rach_ind); } if (dl_tti_request) { - int dl_tti_sfn_slot = NFAPI_SFNSLOT2HEX(dl_tti_request->SFN, dl_tti_request->Slot); - nfapi_nr_tx_data_request_t *tx_data_request = unqueue_matching(&nr_tx_req_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &dl_tti_sfn_slot); + struct sfn_slot_s sfn_slot = {.sfn = dl_tti_request->SFN, .slot = dl_tti_request->Slot}; + nfapi_nr_tx_data_request_t *tx_data_request = unqueue_matching(&nr_tx_req_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &sfn_slot); if (!tx_data_request) { - LOG_E(NR_MAC, "[%d %d] No corresponding tx_data_request for given dl_tti_request sfn/slot\n", - NFAPI_SFNSLOT2SFN(dl_tti_sfn_slot), NFAPI_SFNSLOT2SLOT(dl_tti_sfn_slot)); + LOG_E(NR_MAC, "[%d.%d] No corresponding tx_data_request for given dl_tti_request sfn/slot\n", + dl_tti_request->SFN, dl_tti_request->Slot); if (get_softmodem_params()->nsa) save_nr_measurement_info(dl_tti_request); free_and_zero(dl_tti_request); @@ -262,7 +266,8 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg) NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id); for (int i = 0; i < NR_MAX_HARQ_PROCESSES; i++) { mac->nr_ue_emul_l1.harq[i].active = false; - mac->nr_ue_emul_l1.harq[i].active_ul_harq_sfn_slot = -1; + mac->nr_ue_emul_l1.harq[i].active_ul_harq_sfn = -1; + mac->nr_ue_emul_l1.harq[i].active_ul_harq_slot = -1; } while (!oai_exit) { @@ -285,8 +290,9 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg) free_and_zero(ch_info); } - frame_t frame = NFAPI_SFNSLOT2SFN(sfn_slot); - int slot = NFAPI_SFNSLOT2SLOT(sfn_slot); + int mu = 1; // NR-UE emul-L1 is hardcoded to 30kHZ, see check_and_process_dci() + frame_t frame = NFAPI_SFNSLOTDEC2SFN(mu, sfn_slot); + int slot = NFAPI_SFNSLOTDEC2SLOT(mu, sfn_slot); if (sfn_slot == last_sfn_slot) { LOG_D(NR_MAC, "repeated sfn_sf = %d.%d\n", frame, slot); @@ -300,7 +306,7 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg) if (IS_SA_MODE(get_softmodem_params()) && mac->mib == NULL) { LOG_D(NR_MAC, "We haven't gotten MIB. Lets see if we received it\n"); nr_ue_dl_indication(&mac->dl_info); - process_queued_nr_nfapi_msgs(mac, sfn_slot); + process_queued_nr_nfapi_msgs(mac, frame, slot); } int CC_id = 0; @@ -340,7 +346,7 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg) LOG_D(NR_MAC, "Slot %d. calling nr_ue_ul_ind()\n", ul_info.slot); nr_ue_ul_scheduler(mac, &ul_info); } - process_queued_nr_nfapi_msgs(mac, sfn_slot); + process_queued_nr_nfapi_msgs(mac, frame, slot); } return NULL; } diff --git a/nfapi/oai_integration/aerial/fapi_vnf_p5.c b/nfapi/oai_integration/aerial/fapi_vnf_p5.c index 26c59c8301..1b01fd6c09 100644 --- a/nfapi/oai_integration/aerial/fapi_vnf_p5.c +++ b/nfapi/oai_integration/aerial/fapi_vnf_p5.c @@ -49,7 +49,6 @@ void *aerial_vnf_nr_p7_config_init(void *ptr) init_queue(&gnb_rx_ind_queue); init_queue(&gnb_crc_ind_queue); init_queue(&gnb_uci_ind_queue); - init_queue(&gnb_slot_ind_queue); p7_vnf->config->port = p7_vnf->local_port; p7_vnf->config->sync_indication = NULL; @@ -335,12 +334,6 @@ int aerial_nr_config_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_nr_co int aerial_nr_start_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_nr_start_response_scf_t *resp) { NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Received NFAPI_START_RESP idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id); - vnf_info *vnf = (vnf_info *)(config->user_data); - pnf_info *pnf = vnf->pnfs; - phy_info *phy = pnf->phys; - vnf_p7_info *p7_vnf = vnf->p7_vnfs; - - nfapi_vnf_p7_add_pnf((p7_vnf->config), phy->remote_addr, phy->remote_port, phy->id); return 0; } diff --git a/nfapi/oai_integration/aerial/fapi_vnf_p7.c b/nfapi/oai_integration/aerial/fapi_vnf_p7.c index 85308472f3..45f3aa1a05 100644 --- a/nfapi/oai_integration/aerial/fapi_vnf_p7.c +++ b/nfapi/oai_integration/aerial/fapi_vnf_p7.c @@ -93,56 +93,17 @@ int aerial_phy_nr_uci_indication(nfapi_nr_uci_indication_t *ind) return 1; } -NR_Sched_Rsp_t g_sched_resp; void gNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frame, sub_frame_t slot, NR_Sched_Rsp_t* sched_info); int oai_fapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req); int oai_fapi_ul_tti_req(nfapi_nr_ul_tti_request_t *ul_tti_req); int oai_fapi_tx_data_req(nfapi_nr_tx_data_request_t* tx_data_req); int oai_fapi_ul_dci_req(nfapi_nr_ul_dci_request_t* ul_dci_req); int oai_fapi_send_end_request(int cell, uint32_t frame, uint32_t slot); - -int trigger_scheduler(nfapi_nr_slot_indication_scf_t *slot_ind) -{ - - NR_UL_IND_t ind = {.frame = slot_ind->sfn, .slot = slot_ind->slot, }; - NR_UL_indication(&ind); - // Call into the scheduler (this is hardcoded and should be init properly!) - // memset(sched_resp, 0, sizeof(*sched_resp)); - gNB_dlsch_ulsch_scheduler(0, slot_ind->sfn, slot_ind->slot, &g_sched_resp); - - bool send_slt_resp = false; - if (g_sched_resp.DL_req.dl_tti_request_body.nPDUs> 0) { - oai_fapi_dl_tti_req(&g_sched_resp.DL_req); - send_slt_resp = true; - } - if (g_sched_resp.UL_tti_req.n_pdus > 0) { - oai_fapi_ul_tti_req(&g_sched_resp.UL_tti_req); - send_slt_resp = true; - } - if (g_sched_resp.TX_req.Number_of_PDUs > 0) { - oai_fapi_tx_data_req(&g_sched_resp.TX_req); - send_slt_resp = true; - } - if (g_sched_resp.UL_dci_req.numPdus > 0) { - oai_fapi_ul_dci_req(&g_sched_resp.UL_dci_req); - send_slt_resp = true; - } - if (send_slt_resp) { - oai_fapi_send_end_request(0,slot_ind->sfn, slot_ind->slot); - } - - return 1; -} - +extern int trigger_scheduler(nfapi_nr_slot_indication_scf_t *slot_ind); int aerial_phy_nr_slot_indication(nfapi_nr_slot_indication_scf_t *ind) { - uint8_t vnf_slot_ahead = 0; - uint32_t vnf_sfn_slot = sfnslot_add_slot(ind->sfn, ind->slot, vnf_slot_ahead); - uint16_t vnf_sfn = NFAPI_SFNSLOT2SFN(vnf_sfn_slot); - uint8_t vnf_slot = NFAPI_SFNSLOT2SLOT(vnf_sfn_slot); - LOG_D(MAC, "VNF SFN/Slot %d.%d \n", vnf_sfn, vnf_slot); - // printf( "VNF SFN/Slot %d.%d \n", vnf_sfn, vnf_slot); + LOG_D(MAC, "VNF SFN/Slot %d.%d \n", ind->sfn, ind->slot); trigger_scheduler(ind); return 1; diff --git a/nfapi/oai_integration/gnb_ind_vars.c b/nfapi/oai_integration/gnb_ind_vars.c index f1f22bcc66..80ed29d318 100644 --- a/nfapi/oai_integration/gnb_ind_vars.c +++ b/nfapi/oai_integration/gnb_ind_vars.c @@ -25,4 +25,3 @@ queue_t gnb_rach_ind_queue; queue_t gnb_rx_ind_queue; queue_t gnb_crc_ind_queue; queue_t gnb_uci_ind_queue; -queue_t gnb_slot_ind_queue; diff --git a/nfapi/oai_integration/gnb_ind_vars.h b/nfapi/oai_integration/gnb_ind_vars.h index 8561037d3e..0f03ba1174 100644 --- a/nfapi/oai_integration/gnb_ind_vars.h +++ b/nfapi/oai_integration/gnb_ind_vars.h @@ -6,4 +6,3 @@ extern queue_t gnb_rach_ind_queue; extern queue_t gnb_rx_ind_queue; extern queue_t gnb_crc_ind_queue; extern queue_t gnb_uci_ind_queue; -extern queue_t gnb_slot_ind_queue; diff --git a/nfapi/oai_integration/nfapi_pnf.c b/nfapi/oai_integration/nfapi_pnf.c index 8880a5f315..10d635562f 100644 --- a/nfapi/oai_integration/nfapi_pnf.c +++ b/nfapi/oai_integration/nfapi_pnf.c @@ -544,7 +544,6 @@ int param_request(nfapi_pnf_config_t *config, nfapi_pnf_phy_config_t *phy, nfapi nfapi_resp.num_tlv++; nfapi_pnf_param_resp(config, &nfapi_resp); printf("[PNF] Sent NFAPI_PARAM_RESPONSE phy_id:%d number_of_tlvs:%u\n", req->header.phy_id, nfapi_resp.num_tlv); - printf("[PNF] param request .. exit\n"); return 0; } @@ -763,7 +762,6 @@ int nr_param_request(nfapi_pnf_config_t *config, nfapi_pnf_phy_config_t *phy, nf nfapi_nr_pnf_param_resp(config, &nfapi_resp); printf("[PNF] Sent NFAPI_PNF_PARAM_RESPONSE phy_id:%d number_of_tlvs:%u\n", req->header.phy_id, nfapi_resp.num_tlv); - printf("[PNF] param request .. exit\n"); return 0; } @@ -1102,38 +1100,13 @@ void pnf_nr_phy_deallocate_p7_vendor_ext(void *header) free(header); } -notifiedFIFO_elt_t *l1tx_message_extract(PHY_VARS_gNB *gNB, int frame, int slot) { - notifiedFIFO_elt_t *res; - - //TODO: This needs to be reworked for nfapi to work - res = pullNotifiedFIFO(&gNB->L1_tx_free); - return res; -} - -int pnf_phy_ul_dci_req(gNB_L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7, nfapi_nr_ul_dci_request_t *req) { +extern void nr_schedule_ul_dci_req(PHY_VARS_gNB *gNB, nfapi_nr_ul_dci_request_t *UL_dci_req); +int pnf_phy_ul_dci_req(gNB_L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7, nfapi_nr_ul_dci_request_t *req) +{ + DevAssert(RC.gNB != NULL && RC.gNB[0] != NULL); + PHY_VARS_gNB *gNB = RC.gNB[0]; // phy_inst? - // LOG_D(PHY,"[PNF] HI_DCI0_REQUEST SFN/SF:%05d dci:%d hi:%d\n", NFAPI_SFNSF2DEC(req->sfn_sf), req->hi_dci0_request_body.number_of_dci, req->hi_dci0_request_body.number_of_hi); - - struct PHY_VARS_gNB_s *gNB = RC.gNB[0]; - - // extract the next available thread message (priority to message with current slot, then free message) - notifiedFIFO_elt_t *res; - res = l1tx_message_extract(gNB, req->SFN, req->Slot); - processingData_L1tx_t *msgTx = (processingData_L1tx_t *)NotifiedFifoData(res); - - if (proc ==NULL) - proc = &gNB->proc.L1_proc; - - if (req->numPdus > 0) { - for (int i=0; inumPdus; i++) { - if (req->ul_dci_pdu_list[i].PDUType == NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE) // only possible value 0: PDCCH PDU - msgTx->ul_pdcch_pdu[i] = req->ul_dci_pdu_list[i]; - else - LOG_E(PHY,"[PNF] UL_DCI_REQ sfn_slot:%d PDU[%d] - unknown pdu type:%d\n", NFAPI_SFNSLOT2DEC(req->SFN, req->Slot), req->numPdus-1, req->ul_dci_pdu_list[req->numPdus-1].PDUType); - } - } - - pushNotifiedFIFO(&gNB->L1_tx_filled, res); + nr_schedule_ul_dci_req(gNB, req); return 0; } @@ -1168,84 +1141,16 @@ int pnf_phy_hi_dci0_req(L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7, nfa } -int pnf_phy_dl_tti_req(gNB_L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7, nfapi_nr_dl_tti_request_t *req) { - if (RC.ru == 0) { - return -1; - } +// from dl_tti_req_fn fptr +extern void nr_schedule_dl_tti_req(PHY_VARS_gNB *gNB, nfapi_nr_dl_tti_request_t *DL_req); +int pnf_phy_dl_tti_req(gNB_L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7, nfapi_nr_dl_tti_request_t *DL_req) +{ + DevAssert(proc == NULL); + DevAssert(sync_var == 0); + DevAssert(RC.gNB != NULL && RC.gNB[0] != NULL); + PHY_VARS_gNB *gNB = RC.gNB[0]; // phy_inst? - if (RC.gNB == 0) { - return -2; - } - - if (RC.gNB[0] == 0) { - return -3; - } - - if (sync_var != 0) { - NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() Main system not up - is this a dummy subframe?\n", __FUNCTION__); - return -4; - } - - int sfn = req->SFN; - int slot = req->Slot; - struct PHY_VARS_gNB_s *gNB = RC.gNB[0]; - if (proc==NULL) - proc = &gNB->proc.L1_proc; - nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdu_list = req->dl_tti_request_body.dl_tti_pdu_list; - - if (req->dl_tti_request_body.nPDUs) - NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() TX:%d/%d RX:%d/%d; sfn:%d, slot:%d, nGroup:%u, nPDUs: %u, nUE: %p, PduIdx: %p,\n", - __FUNCTION__, proc->frame_tx, proc->slot_tx, proc->frame_rx, proc->slot_rx, // TODO: change subframes to slot - req->SFN, - req->Slot, - req->dl_tti_request_body.nGroup, - req->dl_tti_request_body.nPDUs, - req->dl_tti_request_body.nUe, - req->dl_tti_request_body.PduIdx); - - for (int i=0; idl_tti_request_body.nPDUs; i++) { - // NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() sfn/sf:%d PDU[%d] size:%d pdcch_vars->num_dci:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), i, dl_config_pdu_list[i].pdu_size,pdcch_vars->num_dci); - notifiedFIFO_elt_t *res; - res = l1tx_message_extract(gNB, sfn, slot); - processingData_L1tx_t *msgTx = (processingData_L1tx_t *)NotifiedFifoData(res); - - if (dl_tti_pdu_list[i].PDUType == NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE) { - msgTx->pdcch_pdu[i] = dl_tti_pdu_list[i].pdcch_pdu; // copies all the received PDCCH PDUs - } - else if (dl_tti_pdu_list[i].PDUType == NFAPI_NR_DL_TTI_SSB_PDU_TYPE) { - //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() PDU:%d BCH: pdu_index:%u pdu_length:%d sdu_length:%d BCH_SDU:%x,%x,%x\n", __FUNCTION__, i, pdu_index, bch_pdu->bch_pdu_rel8.length, tx_request_pdu[sfn][sf][pdu_index]->segments[0].segment_length, sdu[0], sdu[1], sdu[2]); - handle_nr_nfapi_ssb_pdu(msgTx, sfn, slot, &dl_tti_pdu_list[i]); - } - else if (dl_tti_pdu_list[i].PDUType == NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE) { - nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu = &dl_tti_pdu_list[i].pdsch_pdu; - nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15_pdu = &pdsch_pdu->pdsch_pdu_rel15; - nfapi_nr_pdu_t *tx_data = tx_data_request[sfn][slot][rel15_pdu->pduIndex]; - - if (tx_data != NULL) { - uint8_t *dlsch_sdu = (uint8_t *)tx_data->TLVs[0].value.direct; - //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() DLSCH:pdu_index:%d handle_nfapi_dlsch_pdu(eNB, proc_rxtx, dlsch_pdu, transport_blocks:%d sdu:%p) eNB->pdcch_vars[proc->subframe_tx & 1].num_pdcch_symbols:%d\n", __FUNCTION__, rel8_pdu->pdu_index, rel8_pdu->transport_blocks, dlsch_sdu, eNB->pdcch_vars[proc->subframe_tx & 1].num_pdcch_symbols); - AssertFatal(msgTx->num_pdsch_slot < gNB->max_nb_pdsch, - "Number of PDSCH PDUs %d exceeded the limit %d\n", - msgTx->num_pdsch_slot, - gNB->max_nb_pdsch); - handle_nr_nfapi_pdsch_pdu(msgTx, pdsch_pdu, dlsch_sdu); - } - else { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() DLSCH NULL TX PDU SFN/SF:%d PDU_INDEX:%d\n", __FUNCTION__, NFAPI_SFNSLOT2DEC(sfn,slot), rel15_pdu->pduIndex); - } - } - else if (dl_tti_pdu_list[i].PDUType == NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE) { - nfapi_nr_dl_tti_csi_rs_pdu *csi_rs_pdu = &dl_tti_pdu_list[i].csi_rs_pdu; - handle_nfapi_nr_csirs_pdu(msgTx, sfn, slot, csi_rs_pdu); - } - else { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() UNKNOWN:%d\n", __FUNCTION__, dl_tti_pdu_list[i].PDUType); - } - pushNotifiedFIFO(&gNB->L1_tx_filled, res); - } - - if(req->vendor_extension) - free(req->vendor_extension); + nr_schedule_dl_tti_req(gNB, DL_req); return 0; } @@ -1343,29 +1248,13 @@ int pnf_phy_dl_config_req(L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7, n } +extern void nr_schedule_tx_req(PHY_VARS_gNB *gNB, nfapi_nr_tx_data_request_t *TX_req); +int pnf_phy_tx_data_req(nfapi_pnf_p7_config_t *pnf_p7, nfapi_nr_tx_data_request_t *req) +{ + DevAssert(RC.gNB != NULL && RC.gNB[0] != NULL); + PHY_VARS_gNB *gNB = RC.gNB[0]; // phy_inst? -int pnf_phy_tx_data_req(nfapi_pnf_p7_config_t *pnf_p7, nfapi_nr_tx_data_request_t *req) { - uint16_t sfn = req->SFN; - uint16_t slot = req->Slot; - - if (req->Number_of_PDUs == 0) - LOG_D(PHY,"%s() SFN/SLOT:%d%d PDUs:%d\n", __FUNCTION__, sfn, slot, req->Number_of_PDUs); - - //if (req->pdu_list[0].TLVs->tag == NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST) { - for (int i=0; iNumber_of_PDUs; i++) { - // LOG_D(PHY,"%s() SFN/SF:%d%d number_of_pdus:%d [PDU:%d] pdu_length:%d pdu_index:%d num_segments:%d\n", - // __FUNCTION__, - // sfn, sf, - // req->tx_request_body.number_of_pdus, - // i, - // req->tx_request_body.tx_pdu_list[i].pdu_length, - // req->tx_request_body.tx_pdu_list[i].pdu_index, - // req->tx_request_body.tx_pdu_list[i].num_segments - // ); - // tx_request_pdu[sfn][sf][i] = &req->tx_request_body.tx_pdu_list[i]; - tx_data_request[sfn][slot][i] = &req->pdu_list[i]; - } - //} + nr_schedule_tx_req(gNB, req); return 0; } @@ -1396,77 +1285,13 @@ int pnf_phy_tx_req(nfapi_pnf_p7_config_t *pnf_p7, nfapi_tx_request_t *req) { return 0; } +extern void nr_schedule_ul_tti_req(PHY_VARS_gNB *gNB, nfapi_nr_ul_tti_request_t *UL_tti_req); +int pnf_phy_ul_tti_req(gNB_L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7, nfapi_nr_ul_tti_request_t *req) +{ + DevAssert(RC.gNB != NULL && RC.gNB[0] != NULL); + PHY_VARS_gNB *gNB = RC.gNB[0]; // phy_inst? - -int pnf_phy_ul_tti_req(gNB_L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7, nfapi_nr_ul_tti_request_t *req) { - LOG_D(PHY,"[PNF] UL_TTI_REQ recvd, writing into structs, SFN/slot:%d.%d pdu:%d \n", - req->SFN,req->Slot, - req->n_pdus - ); - - if (RC.ru == 0) { - return -1; - } - - if (RC.gNB == 0) { - return -2; - } - - if (RC.gNB[0] == 0) { - return -3; - } - - if (sync_var != 0) { - NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() Main system not up - is this a dummy slot?\n", __FUNCTION__); - return -4; - } - uint16_t curr_sfn = req->SFN; - uint16_t curr_slot = req->Slot; - struct PHY_VARS_gNB_s *gNB = RC.gNB[0]; - - if (proc==NULL) - proc = &gNB->proc.L1_proc; - - nfapi_nr_ul_tti_request_number_of_pdus_t *ul_tti_pdu_list = req->pdus_list; - - for (int i=0; i< req->n_pdus; i++) { - switch (ul_tti_pdu_list[i].pdu_type) { - case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE: - //LOG_D(PHY,"frame %d, slot %d, Got NFAPI_NR_UL_TTI_PUSCH_PDU_TYPE for %d.%d\n", frame, slot, UL_tti_req->SFN, UL_tti_req->Slot); - //curr_sfn = curr_sfn + 3; //Gokul - nr_fill_ulsch(gNB,curr_sfn, curr_slot, &ul_tti_pdu_list[i].pusch_pdu); - break; - case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE: - //LOG_D(PHY,"frame %d, slot %d, Got NFAPI_NR_UL_TTI_PUCCH_PDU_TYPE for %d.%d\n", frame, slot, UL_tti_req->SFN, UL_tti_req->Slot); - nr_fill_pucch(gNB,curr_sfn, curr_slot, &ul_tti_pdu_list[i].pucch_pdu); - break; - case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE: - //LOG_D(PHY,"frame %d, slot %d, Got NFAPI_NR_UL_TTI_PRACH_PDU_TYPE for %d.%d\n", frame, slot, UL_tti_req->SFN, UL_tti_req->Slot); - nr_fill_prach(gNB, curr_sfn, curr_slot, &ul_tti_pdu_list[i].prach_pdu); - if (gNB->RU_list[0]->if_south == LOCAL_RF) nr_fill_prach_ru(gNB->RU_list[0], curr_sfn, curr_slot, &ul_tti_pdu_list[i].prach_pdu); - break; - default: - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() PDU:%i UNKNOWN type :%d\n", __FUNCTION__, i, ul_tti_pdu_list[i].pdu_type); - break; - - } - // //LOG_D(PHY, "%s() sfn/sf:%d PDU[%d] size:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), i, ul_config_pdu_list[i].pdu_size); - // if ( - // ul_tti_pdu_list[i].pdu_type == NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE || - // ul_tti_pdu_list[i].pdu_type == NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE || - // ul_tti_pdu_list[i].pdu_type == NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE || - // ul_tti_pdu_list[i].pdu_type == NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE - // ) { - // //LOG_D(PHY, "%s() handle_nfapi_ul_pdu() for PDU:%d\n", __FUNCTION__, i); - // // handle_nfapi_ul_pdu(eNB,proc,&ul_config_pdu_list[i],curr_sfn,curr_sf,req->ul_config_request_body.srs_present); - - // // TODO: dont have an NR function for this, also srs_present flag not there - - // } else { - // NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() PDU:%i UNKNOWN type :%d\n", __FUNCTION__, i, ul_tti_pdu_list[i].pdu_type); - // } - } - + nr_schedule_ul_tti_req(gNB, req); return 0; } @@ -1931,6 +1756,18 @@ int nr_start_request(nfapi_pnf_config_t *config, nfapi_pnf_phy_config_t *phy, nf NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] HACK - Set p7_config global ready for subframe ind%s\n", __FUNCTION__); p7_config_g = p7_config; + // Hack? in the config request (which comes before the start request here), + // we receive the SCS/mu. The PNF needs that for calculating frame/slot + // offsets. However, the memory for the structure which actually keeps track + // of the time, is only allocated here, so "pick" the SCS from memory. + PHY_VARS_gNB *gNB = RC.gNB[0]; + DevAssert(gNB != NULL); + // check that SCS has actually been received + const nfapi_uint8_tlv_t *scs = &gNB->gNB_config.ssb_config.scs_common; + DevAssert(scs->tl.tag == NFAPI_NR_CONFIG_SCS_COMMON_TAG); + pnf_p7_t* pnf_p7 = (pnf_p7_t*)(p7_config); + pnf_p7->mu = scs->value; + // Need to wait for main thread to create RU structures while (config_sync_var < 0) { usleep(5000000); @@ -1955,7 +1792,7 @@ int nr_start_request(nfapi_pnf_config_t *config, nfapi_pnf_phy_config_t *phy, nf } while(sync_var<0) { - usleep(5000000); + usleep(50000); printf("[PNF] waiting for OAI to be started\n"); } @@ -2430,24 +2267,53 @@ void oai_subframe_ind(uint16_t sfn, uint16_t sf) { } } -void handle_nr_slot_ind(uint16_t sfn, uint16_t slot) { +#define SLOT_DURATION 800 // in microseconds +static void maybe_slow_down_pnf(int mu) +{ + /* uses a usleep to wait for approximately the same time period (300 us) */ + static struct timespec last_execution = {0}; + struct timespec current_execution; + clock_gettime(CLOCK_REALTIME, ¤t_execution); + // Calculate elapsed time since last execution + long elapsed_time = (current_execution.tv_sec - last_execution.tv_sec) * 1000000; // Convert seconds to microseconds + elapsed_time += (current_execution.tv_nsec - last_execution.tv_nsec) / 1000; // Convert nanoseconds to microseconds + int duration = SLOT_DURATION >> mu; + if (elapsed_time < duration) + usleep(duration - elapsed_time); + // Update last_execution time + last_execution = current_execution; +} + +void handle_nr_slot_ind(uint16_t sfn, uint16_t slot) +{ + nfapi_pnf_p7_config_t *config = p7_config_g; + pnf_p7_t *_this = (pnf_p7_t *)(config); + int mu = _this->mu; + + if (IS_SOFTMODEM_RFSIM) { + // RFsim can run faster than realtime. However, we need to give the VNF + // some time to send an answer, so the PNF can run faster than realtime, + // but it should not too much. This function will "maybe" slow down, up to + // a slot length + maybe_slow_down_pnf(mu); + } //send VNF slot indication, which is aligned with TX thread, so that it can call the scheduler - nfapi_nr_slot_indication_scf_t *ind; - ind = (nfapi_nr_slot_indication_scf_t *) malloc(sizeof(nfapi_nr_slot_indication_scf_t)); - int slot_ahead = 6; - uint32_t sfn_slot_tx = sfnslot_add_slot(sfn, slot, slot_ahead); - uint16_t sfn_tx = NFAPI_SFNSLOT2SFN(sfn_slot_tx); - uint8_t slot_tx = NFAPI_SFNSLOT2SLOT(sfn_slot_tx); + //we give four additional slots (2ms) which should be enough time for the VNF to + //answer + int slot_ahead = 2 << mu; + uint16_t sfn_tx = sfn; + uint16_t slot_tx = slot; + sfnslot_add_slot(mu, &sfn_tx, &slot_tx, slot_ahead); // modify: do in place - ind->sfn = sfn_tx; - ind->slot = slot_tx; - oai_nfapi_nr_slot_indication(ind); + // printf("send slot indication for sfn/slot:%4d.%2d current:%4d.%2d\n", sfn_tx, slot_tx, sfn, slot); + nfapi_nr_slot_indication_scf_t ind = {.sfn = sfn_tx, .slot = slot_tx}; + oai_nfapi_nr_slot_indication(&ind); - //copy data from appropriate p7 slot buffers into channel structures for PHY processing - nfapi_pnf_p7_slot_ind(p7_config_g, p7_config_g->phy_id, sfn, slot); + // copy data from appropriate p7 slot buffers into channel structures for PHY processing + nfapi_pnf_p7_slot_ind(config, config->phy_id, sfn, slot); - return; + return; } int oai_nfapi_rach_ind(nfapi_rach_indication_t *rach_ind) { diff --git a/nfapi/oai_integration/nfapi_pnf.h b/nfapi/oai_integration/nfapi_pnf.h index b7ebdb36ea..0ba0676f10 100644 --- a/nfapi/oai_integration/nfapi_pnf.h +++ b/nfapi/oai_integration/nfapi_pnf.h @@ -19,6 +19,8 @@ * contact@openairinterface.org */ +#ifndef NFAPI_PNF_H_ +#define NFAPI_PNF_H_ extern nfapi_ue_release_request_body_t release_rntis; int oai_nfapi_rach_ind(nfapi_rach_indication_t *rach_ind); @@ -27,7 +29,7 @@ void configure_nr_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_add void oai_subframe_ind(uint16_t sfn, uint16_t sf); void handle_nr_slot_ind(uint16_t sfn, uint16_t slot); -uint32_t sfnslot_add_slot(uint16_t sfn, uint16_t slot, int offset); +void sfnslot_add_slot(int mu, uint16_t *sfn, uint16_t *slot, int offset); int oai_nfapi_nr_slot_indication(nfapi_nr_slot_indication_scf_t *ind); int oai_nfapi_nr_rx_data_indication(nfapi_nr_rx_data_indication_t *ind); @@ -36,3 +38,4 @@ int oai_nfapi_nr_srs_indication(nfapi_nr_srs_indication_t *ind); int oai_nfapi_nr_uci_indication(nfapi_nr_uci_indication_t *ind); int oai_nfapi_nr_rach_indication(nfapi_nr_rach_indication_t *ind); +#endif /* NFAPI_PNF_H_ */ diff --git a/nfapi/oai_integration/nfapi_vnf.c b/nfapi/oai_integration/nfapi_vnf.c index 9bc3c37452..ff4dcfa393 100644 --- a/nfapi/oai_integration/nfapi_vnf.c +++ b/nfapi/oai_integration/nfapi_vnf.c @@ -50,6 +50,9 @@ #include "nr_fapi_p7_utils.h" #include +#ifdef ENABLE_AERIAL +#include "aerial/fapi_vnf_p5.h" +#endif #define TEST @@ -272,49 +275,6 @@ void oai_enb_init(void) { init_eNB_afterRU(); } - -void oai_create_gnb(void) { - int bodge_counter=0; - - if (RC.gNB == NULL) { - RC.gNB = (PHY_VARS_gNB **) calloc(1, sizeof(PHY_VARS_gNB *)); - LOG_D(PHY,"gNB L1 structure RC.gNB allocated @ %p\n",RC.gNB); - } - - - if (RC.gNB[0] == NULL) { - RC.gNB[0] = (PHY_VARS_gNB *) calloc(1, sizeof(PHY_VARS_gNB)); - LOG_D(PHY,"[nr-gnb.c] gNB structure RC.gNB[%d] allocated @ %p\n",0,RC.gNB[0]); - } - - PHY_VARS_gNB *gNB = RC.gNB[0]; - RC.nb_nr_CC = (int *)malloc(sizeof(int)); // TODO: find a better function to place this in - - gNB->Mod_id = bodge_counter; - gNB->CC_id = bodge_counter; - RC.nb_nr_CC[bodge_counter] = 1; - - if (gNB->if_inst==0) { - gNB->if_inst = NR_IF_Module_init(bodge_counter); - } - - - // This will cause phy_config_request to be installed. That will result in RRC configuring the PHY - // that will result in gNB->configured being set to true. - // See we need to wait for that to happen otherwise the NFAPI message exchanges won't contain the right parameter values - if (RC.gNB[0]->if_inst==0 || RC.gNB[0]->if_inst->NR_PHY_config_req==0 || RC.gNB[0]->if_inst->NR_Schedule_response==0) { - NFAPI_TRACE(NFAPI_TRACE_INFO, "RC.gNB[0][0]->if_inst->NR_PHY_config_req is not installed - install it\n"); - install_nr_schedule_handlers(RC.gNB[0]->if_inst); - } - - do { - NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() Waiting for gNB to become configured (by RRC/PHY) - need to wait otherwise NFAPI messages won't contain correct values\n", __FUNCTION__); - usleep(50000); - } while(gNB->configured != 1); - - NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() gNB is now configured\n", __FUNCTION__); -} - int pnf_connection_indication_cb(nfapi_vnf_config_t *config, int p5_idx) { NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] pnf connection indication idx:%d\n", p5_idx); oai_create_enb(); @@ -327,7 +287,6 @@ int pnf_connection_indication_cb(nfapi_vnf_config_t *config, int p5_idx) { int pnf_nr_connection_indication_cb(nfapi_vnf_config_t *config, int p5_idx) { NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] pnf connection indication idx:%d\n", p5_idx); - oai_create_gnb(); nfapi_nr_pnf_param_request_t req; memset(&req, 0, sizeof(req)); req.header.message_id = NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_REQUEST; @@ -650,7 +609,7 @@ int phy_slot_indication(struct nfapi_vnf_p7_config *config, uint16_t phy_id, uin static uint8_t first_time = 1; if (first_time) { - NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] slot indication %d\n", NFAPI_SFNSLOT2DEC(sfn, slot)); + NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] slot indication %d.%d\n", sfn, slot); first_time = 0; } @@ -1118,24 +1077,66 @@ int phy_cqi_indication(struct nfapi_vnf_p7_config *config, nfapi_cqi_indication_ //NR phy indication -int phy_nr_slot_indication(nfapi_nr_slot_indication_scf_t *ind) { - uint8_t vnf_slot_ahead = 0; - uint32_t vnf_sfn_slot = sfnslot_add_slot(ind->sfn, ind->slot, vnf_slot_ahead); - uint16_t vnf_sfn = NFAPI_SFNSLOT2SFN(vnf_sfn_slot); - uint8_t vnf_slot = NFAPI_SFNSLOT2SLOT(vnf_sfn_slot); - LOG_D(MAC, "VNF SFN/Slot %d.%d \n", vnf_sfn, vnf_slot); +NR_Sched_Rsp_t g_sched_resp; +void gNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frame, sub_frame_t slot, NR_Sched_Rsp_t* sched_info); +int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req); +int oai_nfapi_ul_tti_req(nfapi_nr_ul_tti_request_t *ul_tti_req); +int oai_nfapi_tx_data_req(nfapi_nr_tx_data_request_t* tx_data_req); +int oai_nfapi_ul_dci_req(nfapi_nr_ul_dci_request_t* ul_dci_req); - nfapi_nr_slot_indication_scf_t *nr_slot_ind = CALLOC(1, sizeof(*nr_slot_ind)); - nr_slot_ind->header = ind->header; - nr_slot_ind->sfn = vnf_sfn; - nr_slot_ind->slot = vnf_slot; - if (!put_queue(&gnb_slot_ind_queue, nr_slot_ind)) - { - LOG_E(NR_MAC, "Put_queue failed for slot_ind\n"); - free(nr_slot_ind); - nr_slot_ind = NULL; - } +int trigger_scheduler(nfapi_nr_slot_indication_scf_t *slot_ind) +{ + // Call into the scheduler (this is hardcoded and should be init properly!) + // memset(sched_resp, 0, sizeof(*sched_resp)); + gNB_dlsch_ulsch_scheduler(0, slot_ind->sfn, slot_ind->slot, &g_sched_resp); + +#ifdef ENABLE_AERIAL + bool send_slt_resp = false; + if (g_sched_resp.DL_req.dl_tti_request_body.nPDUs> 0) { + oai_fapi_dl_tti_req(&g_sched_resp.DL_req); + send_slt_resp = true; + } + if (g_sched_resp.UL_tti_req.n_pdus > 0) { + oai_fapi_ul_tti_req(&g_sched_resp.UL_tti_req); + send_slt_resp = true; + } + if (g_sched_resp.TX_req.Number_of_PDUs > 0) { + oai_fapi_tx_data_req(&g_sched_resp.TX_req); + send_slt_resp = true; + } + if (g_sched_resp.UL_dci_req.numPdus > 0) { + oai_fapi_ul_dci_req(&g_sched_resp.UL_dci_req); + send_slt_resp = true; + } + if (send_slt_resp) { + oai_fapi_send_end_request(0,slot_ind->sfn, slot_ind->slot); + } +#else + if (g_sched_resp.DL_req.dl_tti_request_body.nPDUs > 0) + oai_nfapi_dl_tti_req(&g_sched_resp.DL_req); + + if (g_sched_resp.UL_tti_req.n_pdus > 0) + oai_nfapi_ul_tti_req(&g_sched_resp.UL_tti_req); + + if (g_sched_resp.TX_req.Number_of_PDUs > 0) + oai_nfapi_tx_data_req(&g_sched_resp.TX_req); + + if (g_sched_resp.UL_dci_req.numPdus > 0) + oai_nfapi_ul_dci_req(&g_sched_resp.UL_dci_req); +#endif + + NR_UL_IND_t ind = {.frame = slot_ind->sfn, .slot = slot_ind->slot, }; + NR_UL_indication(&ind); + + return 1; +} + +int phy_nr_slot_indication(nfapi_nr_slot_indication_scf_t *ind) +{ + LOG_D(MAC, "VNF SFN/Slot %d.%d \n", ind->sfn, ind->slot); + + trigger_scheduler(ind); return 1; } @@ -1413,7 +1414,6 @@ void *vnf_nr_p7_thread_start(void *ptr) init_queue(&gnb_rx_ind_queue); init_queue(&gnb_crc_ind_queue); init_queue(&gnb_uci_ind_queue); - init_queue(&gnb_slot_ind_queue); vnf_p7_info *p7_vnf = (vnf_p7_info *)ptr; p7_vnf->config->port = p7_vnf->local_port; @@ -1551,6 +1551,17 @@ int nr_param_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_nr_param_resp // for now just 1 NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] %d.%d pnf p7 %s:%d timing %u %u %u %u\n", p5_idx, phy->id, phy->remote_addr, phy->remote_port, p7_vnf->timing_window, p7_vnf->periodic_timing_period, p7_vnf->aperiodic_timing_enabled, p7_vnf->periodic_timing_period); + // Hack? the VNF might need the subcarrier spacing for some calculations + // (that we actually don't use as of now...). We therefore need to save the + // mu, for the current PNF connection (together with where we have frame/slot + // info). nfapi_vnf_p7_add_pnf() prepends the current P7 connection to the + // beginning of the list. Pick it from there, and save the mu. + // check that SCS has actually been set + const nfapi_uint8_tlv_t *scs = &req->ssb_config.scs_common; + DevAssert(scs->tl.tag == NFAPI_NR_CONFIG_SCS_COMMON_TAG); + int mu = scs->value; + nfapi_vnf_p7_add_pnf((p7_vnf->config), phy->remote_addr, phy->remote_port, phy->id, mu); + req->header.message_id = NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST; req->header.phy_id = phy->id; NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Send NFAPI_CONFIG_REQUEST\n"); @@ -1683,18 +1694,12 @@ int start_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_start_response_t pnf_info *pnf = vnf->pnfs; phy_info *phy = pnf->phys; vnf_p7_info *p7_vnf = vnf->p7_vnfs; - nfapi_vnf_p7_add_pnf((p7_vnf->config), phy->remote_addr, htons(phy->remote_port), phy->id); + nfapi_vnf_p7_add_pnf((p7_vnf->config), phy->remote_addr, htons(phy->remote_port), phy->id, 0); return 0; } int nr_start_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_nr_start_response_scf_t *resp) { NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Received NFAPI_START_RESP idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id); - vnf_info *vnf = (vnf_info *)(config->user_data); - pnf_info *pnf = vnf->pnfs; - phy_info *phy = pnf->phys; - vnf_p7_info *p7_vnf = vnf->p7_vnfs; - - nfapi_vnf_p7_add_pnf((p7_vnf->config), phy->remote_addr, phy->remote_port, phy->id); return 0; } @@ -1816,7 +1821,7 @@ void configure_nr_nfapi_vnf(char *vnf_addr, int vnf_p5_port, char *pnf_ip_addr, vnf.p7_vnfs[0].timing_window = 30; vnf.p7_vnfs[0].periodic_timing_enabled = 0; vnf.p7_vnfs[0].aperiodic_timing_enabled = 0; - vnf.p7_vnfs[0].periodic_timing_period = 10; + vnf.p7_vnfs[0].periodic_timing_period = 1; vnf.p7_vnfs[0].config = nfapi_vnf_p7_config_create(); NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] %s() vnf.p7_vnfs[0].config:%p VNF ADDRESS:%s:%d\n", diff --git a/nfapi/oai_integration/nfapi_vnf.h b/nfapi/oai_integration/nfapi_vnf.h index 12126465fe..71cc50c2f7 100644 --- a/nfapi/oai_integration/nfapi_vnf.h +++ b/nfapi/oai_integration/nfapi_vnf.h @@ -19,9 +19,10 @@ * contact@openairinterface.org */ +#ifndef NFAPI_VNF_H_ +#define NFAPI_VNF_H_ void configure_nfapi_vnf(char *vnf_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port); void configure_nr_nfapi_vnf(char *vnf_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port); -uint32_t sfnslot_add_slot(uint16_t sfn, uint16_t slot, int offset); - +#endif /* NFAPI_VNF_H_ */ diff --git a/nfapi/open-nFAPI/common/src/debug.c b/nfapi/open-nFAPI/common/src/debug.c index 628e64d947..cd872afc11 100644 --- a/nfapi/open-nFAPI/common/src/debug.c +++ b/nfapi/open-nFAPI/common/src/debug.c @@ -66,7 +66,7 @@ void nfapi_trace(nfapi_trace_level_t level, { struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); - printf("%ld%06ld [%c] %10u: %s: ", + printf("%ld.%06ld [%c] %10u: %s: ", ts.tv_sec, ts.tv_nsec / 1000, "XEWNID"[level], // NFAPI_TRACE_NONE, NFAPI_TRACE_ERROR, ... diff --git a/nfapi/open-nFAPI/fapi/src/nr_fapi_p5.c b/nfapi/open-nFAPI/fapi/src/nr_fapi_p5.c index b5ff0a2490..796f424abe 100644 --- a/nfapi/open-nFAPI/fapi/src/nr_fapi_p5.c +++ b/nfapi/open-nFAPI/fapi/src/nr_fapi_p5.c @@ -714,16 +714,7 @@ uint8_t unpack_nr_param_response(uint8_t **ppReadPackedMsg, uint8_t *end, void * {NFAPI_NR_NFAPI_TIMING_INFO_MODE_TAG, &pNfapiMsg->nfapi_config.timing_info_mode, &unpack_uint8_tlv_value}, {NFAPI_NR_NFAPI_TIMING_INFO_PERIOD_TAG, &pNfapiMsg->nfapi_config.timing_info_period, &unpack_uint8_tlv_value}, }; - // print ppReadPackedMsg - uint8_t *ptr = *ppReadPackedMsg; - printf("\n Read message unpack_param_response: "); - while (ptr < end) { - printf(" 0x%02x", *ptr); - ptr++; - } - - printf("\n"); return (pull8(ppReadPackedMsg, &pNfapiMsg->error_code, end) && pull8(ppReadPackedMsg, &pNfapiMsg->num_tlv, end) && unpack_nr_tlv_list(unpack_fns, sizeof(unpack_fns) / sizeof(unpack_tlv_t), @@ -1017,22 +1008,24 @@ uint8_t pack_nr_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *e // END SSB Table // START TDD Table - retval &= - pack_nr_tlv(NFAPI_NR_CONFIG_TDD_PERIOD_TAG, &(pNfapiMsg->tdd_table.tdd_period), ppWritePackedMsg, end, &pack_uint8_tlv_value); - numTLVs++; - const uint8_t slotsperframe[5] = {10, 20, 40, 80, 160}; - // Assuming always CP_Normal, because Cyclic prefix is not included in CONFIG.request 10.02, but is present in 10.04 - uint8_t cyclicprefix = 1; - // 3GPP 38.211 Table 4.3.2.1 & Table 4.3.2.2 - uint8_t number_of_symbols_per_slot = cyclicprefix ? 14 : 12; - for (int i = 0; i < slotsperframe[pNfapiMsg->ssb_config.scs_common.value]; i++) { // TODO check right number of slots - for (int k = 0; k < number_of_symbols_per_slot; k++) { // TODO can change? - retval &= pack_nr_tlv(NFAPI_NR_CONFIG_SLOT_CONFIG_TAG, - &pNfapiMsg->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config, - ppWritePackedMsg, - end, - &pack_uint8_tlv_value); - numTLVs++; + if (pNfapiMsg->cell_config.frame_duplex_type.value == 1 /* TDD */) { + retval &= + pack_nr_tlv(NFAPI_NR_CONFIG_TDD_PERIOD_TAG, &(pNfapiMsg->tdd_table.tdd_period), ppWritePackedMsg, end, &pack_uint8_tlv_value); + numTLVs++; + const uint8_t slotsperframe[5] = {10, 20, 40, 80, 160}; + // Assuming always CP_Normal, because Cyclic prefix is not included in CONFIG.request 10.02, but is present in 10.04 + uint8_t cyclicprefix = 1; + // 3GPP 38.211 Table 4.3.2.1 & Table 4.3.2.2 + uint8_t number_of_symbols_per_slot = cyclicprefix ? 14 : 12; + for (int i = 0; i < slotsperframe[pNfapiMsg->ssb_config.scs_common.value]; i++) { // TODO check right number of slots + for (int k = 0; k < number_of_symbols_per_slot; k++) { // TODO can change? + retval &= pack_nr_tlv(NFAPI_NR_CONFIG_SLOT_CONFIG_TAG, + &pNfapiMsg->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config, + ppWritePackedMsg, + end, + &pack_uint8_tlv_value); + numTLVs++; + } } } @@ -1232,27 +1225,28 @@ uint8_t unpack_nr_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void * pNfapiMsg->prach_config.num_prach_fd_occasions.tl.tag = generic_tl.tag; pNfapiMsg->prach_config.num_prach_fd_occasions.tl.length = generic_tl.length; result = (*unpack_fns[idx].unpack_func)(&pNfapiMsg->prach_config.num_prach_fd_occasions, ppReadPackedMsg, end); - pNfapiMsg->prach_config.num_prach_fd_occasions_list = (nfapi_nr_num_prach_fd_occasions_t *)malloc( - pNfapiMsg->prach_config.num_prach_fd_occasions.value * sizeof(nfapi_nr_num_prach_fd_occasions_t)); + pNfapiMsg->prach_config.num_prach_fd_occasions_list = calloc(pNfapiMsg->prach_config.num_prach_fd_occasions.value, sizeof(nfapi_nr_num_prach_fd_occasions_t)); prach_root_seq_idx = 0; break; case NFAPI_NR_CONFIG_SCS_COMMON_TAG: pNfapiMsg->ssb_config.scs_common.tl.tag = generic_tl.tag; pNfapiMsg->ssb_config.scs_common.tl.length = generic_tl.length; result = (*unpack_fns[idx].unpack_func)(&pNfapiMsg->ssb_config.scs_common, ppReadPackedMsg, end); - const uint8_t slotsperframe[5] = {10, 20, 40, 80, 160}; + // Assuming always CP_Normal, because Cyclic prefix is not included in CONFIG.request 10.02, but is present in 10.04 uint8_t cyclicprefix = 1; // 3GPP 38.211 Table 4.3.2.1 & Table 4.3.2.2 uint8_t number_of_symbols_per_slot = cyclicprefix ? 14 : 12; - pNfapiMsg->tdd_table.max_tdd_periodicity_list = (nfapi_nr_max_tdd_periodicity_t *)malloc( - slotsperframe[pNfapiMsg->ssb_config.scs_common.value] * sizeof(nfapi_nr_max_tdd_periodicity_t)); + if (pNfapiMsg->cell_config.frame_duplex_type.value == 1 /* TDD */) { + const uint8_t slotsperframe[5] = {10, 20, 40, 80, 160}; + int n = slotsperframe[pNfapiMsg->ssb_config.scs_common.value]; + pNfapiMsg->tdd_table.max_tdd_periodicity_list = calloc(n, sizeof(nfapi_nr_max_tdd_periodicity_t)); - for (int i = 0; i < slotsperframe[pNfapiMsg->ssb_config.scs_common.value]; i++) { - pNfapiMsg->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list = - (nfapi_nr_max_num_of_symbol_per_slot_t *)malloc(number_of_symbols_per_slot - * sizeof(nfapi_nr_max_num_of_symbol_per_slot_t)); + for (int i = 0; i < n; i++) { + pNfapiMsg->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list = + calloc(number_of_symbols_per_slot, sizeof(nfapi_nr_max_num_of_symbol_per_slot_t)); + } } break; case NFAPI_NR_CONFIG_PRACH_ROOT_SEQUENCE_INDEX_TAG: diff --git a/nfapi/open-nFAPI/fapi/src/nr_fapi_p5_utils.c b/nfapi/open-nFAPI/fapi/src/nr_fapi_p5_utils.c index e1a1d921cf..4267992d07 100644 --- a/nfapi/open-nFAPI/fapi/src/nr_fapi_p5_utils.c +++ b/nfapi/open-nFAPI/fapi/src/nr_fapi_p5_utils.c @@ -240,18 +240,20 @@ bool eq_config_request(const nfapi_nr_config_request_scf_t *unpacked_req, const EQ_TLV(unpacked_req->ssb_table.ssb_beam_id_list[i].beam_id, req->ssb_table.ssb_beam_id_list[i].beam_id); } - EQ_TLV(unpacked_req->tdd_table.tdd_period, req->tdd_table.tdd_period); + if (req->cell_config.frame_duplex_type.value == 1 /* TDD */) { + EQ_TLV(unpacked_req->tdd_table.tdd_period, req->tdd_table.tdd_period); - const uint8_t slotsperframe[5] = {10, 20, 40, 80, 160}; - // Assuming always CP_Normal, because Cyclic prefix is not included in CONFIG.request 10.02, but is present in 10.04 - uint8_t cyclicprefix = 1; - // 3GPP 38.211 Table 4.3.2.1 & Table 4.3.2.2 - uint8_t number_of_symbols_per_slot = cyclicprefix ? 14 : 12; + const uint8_t slotsperframe[5] = {10, 20, 40, 80, 160}; + // Assuming always CP_Normal, because Cyclic prefix is not included in CONFIG.request 10.02, but is present in 10.04 + uint8_t cyclicprefix = 1; + // 3GPP 38.211 Table 4.3.2.1 & Table 4.3.2.2 + uint8_t number_of_symbols_per_slot = cyclicprefix ? 14 : 12; - for (int i = 0; i < slotsperframe[unpacked_req->ssb_config.scs_common.value]; i++) { - for (int k = 0; k < number_of_symbols_per_slot; k++) { - EQ_TLV(unpacked_req->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config, - req->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config); + for (int i = 0; i < slotsperframe[unpacked_req->ssb_config.scs_common.value]; i++) { + for (int k = 0; k < number_of_symbols_per_slot; k++) { + EQ_TLV(unpacked_req->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config, + req->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config); + } } } @@ -768,24 +770,26 @@ void copy_config_request(const nfapi_nr_config_request_scf_t *src, nfapi_nr_conf COPY_TLV(dst->ssb_table.ssb_beam_id_list[i].beam_id, src->ssb_table.ssb_beam_id_list[i].beam_id); } - COPY_TLV(dst->tdd_table.tdd_period, src->tdd_table.tdd_period); + if (src->cell_config.frame_duplex_type.value == 1 /* TDD */) { + COPY_TLV(dst->tdd_table.tdd_period, src->tdd_table.tdd_period); - const uint8_t slotsperframe[5] = {10, 20, 40, 80, 160}; - // Assuming always CP_Normal, because Cyclic prefix is not included in CONFIG.request 10.02, but is present in 10.04 - uint8_t cyclicprefix = 1; - // 3GPP 38.211 Table 4.3.2.1 & Table 4.3.2.2 - uint8_t number_of_symbols_per_slot = cyclicprefix ? 14 : 12; - dst->tdd_table.max_tdd_periodicity_list = (nfapi_nr_max_tdd_periodicity_t *)malloc(slotsperframe[dst->ssb_config.scs_common.value] - * sizeof(nfapi_nr_max_tdd_periodicity_t)); + const uint8_t slotsperframe[5] = {10, 20, 40, 80, 160}; + // Assuming always CP_Normal, because Cyclic prefix is not included in CONFIG.request 10.02, but is present in 10.04 + uint8_t cyclicprefix = 1; + // 3GPP 38.211 Table 4.3.2.1 & Table 4.3.2.2 + uint8_t number_of_symbols_per_slot = cyclicprefix ? 14 : 12; + dst->tdd_table.max_tdd_periodicity_list = (nfapi_nr_max_tdd_periodicity_t *)malloc(slotsperframe[dst->ssb_config.scs_common.value] + * sizeof(nfapi_nr_max_tdd_periodicity_t)); - for (int i = 0; i < slotsperframe[dst->ssb_config.scs_common.value]; i++) { - dst->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list = - (nfapi_nr_max_num_of_symbol_per_slot_t *)malloc(number_of_symbols_per_slot * sizeof(nfapi_nr_max_num_of_symbol_per_slot_t)); - } - for (int i = 0; i < slotsperframe[dst->ssb_config.scs_common.value]; i++) { // TODO check right number of slots - for (int k = 0; k < number_of_symbols_per_slot; k++) { // TODO can change? - COPY_TLV(dst->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config, - src->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config); + for (int i = 0; i < slotsperframe[dst->ssb_config.scs_common.value]; i++) { + dst->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list = + (nfapi_nr_max_num_of_symbol_per_slot_t *)malloc(number_of_symbols_per_slot * sizeof(nfapi_nr_max_num_of_symbol_per_slot_t)); + } + for (int i = 0; i < slotsperframe[dst->ssb_config.scs_common.value]; i++) { // TODO check right number of slots + for (int k = 0; k < number_of_symbols_per_slot; k++) { // TODO can change? + COPY_TLV(dst->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config, + src->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config); + } } } diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h index 2d761bab88..f830e904e2 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h @@ -120,16 +120,14 @@ typedef struct { #define NFAPI_TAG_LENGTH_PACKED_LEN 4 // Convenience methods to convert between SFN/SLOT formats -#define NFAPI_SFNSLOT2DEC(_sfn,_slot) ( _sfn*20 + _slot ) // total count of slots -#define NFAPI_SFNSLOTDEC2SFNSLOT(_sfnslot_dec) ((((_sfnslot_dec) / 20) << 6) | (((_sfnslot_dec) - (((_sfnslot_dec) / 20) * 20)) & 0x3F)) +#define NFAPI_SLOTNUM(_mu) (10 << (_mu)) +#define NFAPI_SLOTLEN(_mu) (1000.f / (1 << _mu)) -#define NFAPI_SFNSLOT2SFN(_sfnslot) ((_sfnslot) >> 6) -#define NFAPI_SFNSLOT2SLOT(_sfnslot) ((_sfnslot) & 0x3F) -#define NFAPI_SFNSLOTDEC2SFN(_sfnslot_dec) ((_sfnslot_dec) / 20) -#define NFAPI_SFNSLOTDEC2SLOT(_sfnslot_dec) ((_sfnslot_dec) % 20) -#define NFAPI_SFNSLOT2HEX(_sfn,_slot) ((_sfn << 6) | (_slot & 0x3F)) +#define NFAPI_SFNSLOT2DEC(_mu, _sfn, _slot) ((_sfn) * NFAPI_SLOTNUM(_mu) + (_slot)) +#define NFAPI_SFNSLOTDEC2SFN(_mu, _sfnslot_dec) ((_sfnslot_dec) / NFAPI_SLOTNUM(_mu)) +#define NFAPI_SFNSLOTDEC2SLOT(_mu, _sfnslot_dec) ((_sfnslot_dec) % NFAPI_SLOTNUM(_mu)) -#define NFAPI_MAX_SFNSLOTDEC 1024*20 // 20 is for numerology 1 +#define NFAPI_MAX_SFNSLOTDEC(_mu) (1024 * NFAPI_SLOTNUM(_mu)) // Convenience methods to convert between SFN/SFN formats #define NFAPI_SFNSF2DEC(_sfnsf) ((((_sfnsf) >> 4) * 10) + ((_sfnsf) & 0xF)) diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h index c68566634d..39e9eca3e0 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h @@ -10,6 +10,8 @@ #define _NFAPI_NR_INTERFACE_H_ #include "nfapi_common_interface.h" +#include + #define NFAPI_NR_P5_HEADER_LENGTH 10 #define NFAPI_NR_P7_HEADER_LENGTH 18 @@ -177,6 +179,18 @@ int nfapi_nr_p7_message_unpack(void *pMessageBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t *config); +/*! \brief Peeks the SFN and Slot of an (n)FAPI P7 message + * \param pMessageBuf A pointer to an encoded P7 message header + * \param messageBufLen The size of the encoded P7 message header + * \param SFN A pointer to store the peeked SFN + * \param Slot A pointer to store the peeked Slot + * \return true on success, false, otherwise. + * + * The function will decode the encoded SFN and Slot from an encoded P7 (n)FAPI message + + */ +bool peek_nr_nfapi_p7_sfn_slot(void *pMessageBuf, uint32_t messageBufLen, uint16_t *SFN, uint16_t *Slot); + /*! \brief Calculates the checksum of a message * * \param buffer Pointer to the packed message diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c index df554ab599..8cf42cf511 100644 --- a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c +++ b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c @@ -6202,6 +6202,18 @@ int nfapi_p7_message_unpack(void *pMessageBuf, return 0; } +bool peek_nr_nfapi_p7_sfn_slot(void *pMessageBuf, uint32_t messageBufLen, uint16_t *SFN, uint16_t *Slot) +{ + uint8_t *pReadPackedMessage = &((uint8_t *)pMessageBuf)[NFAPI_NR_P7_HEADER_LENGTH]; + uint8_t *end = (uint8_t*)pMessageBuf + messageBufLen; + if(!(pull16(&pReadPackedMessage, SFN, end) && pull16(&pReadPackedMessage, Slot, end))) { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to peek SFN.Slot\n"); + return false; + } + NFAPI_TRACE(NFAPI_TRACE_DEBUG, "Peeked SFN.Slot is (%d.%d)\n", *SFN, *Slot); + return true; +} + int nfapi_nr_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, diff --git a/nfapi/open-nFAPI/pnf/inc/pnf_p7.h b/nfapi/open-nFAPI/pnf/inc/pnf_p7.h index 737e76e04f..0c14fcebef 100644 --- a/nfapi/open-nFAPI/pnf/inc/pnf_p7.h +++ b/nfapi/open-nFAPI/pnf/inc/pnf_p7.h @@ -29,37 +29,32 @@ typedef struct { uint16_t dl_conf_ontime; - uint16_t dl_tti_ontime; uint16_t dl_conf_late; - uint16_t dl_tti_late; uint16_t ul_conf_ontime; - uint16_t ul_tti_ontime; uint16_t ul_conf_late; - uint16_t ul_tti_late; uint16_t hi_dci0_ontime; uint16_t hi_dci0_late; - uint16_t ul_dci_ontime; - uint16_t ul_dci_late; uint16_t tx_ontime; uint16_t tx_late; - uint16_t tx_data_ontime; - uint16_t tx_data_late; } pnf_p7_stats_t; -typedef struct { // TODO: replace with the stats - uint16_t dl_tti_ontime; - uint16_t dl_tti_late; - uint16_t ul_tti_ontime; - uint16_t ul_tti_late; - uint16_t ul_dci_ontime; - uint16_t ul_dci_late; - uint16_t tx_data_ontime; - uint16_t tx_data_late; +typedef struct pnf_p7_arr_time { + uint16_t ontime; + uint16_t late; +} pnf_p7_arr_time_t; +typedef struct pnf_p7_dir { + uint32_t bytes; +} pnf_p7_dir_t; +typedef struct { + pnf_p7_arr_time_t dl_tti; + pnf_p7_arr_time_t ul_tti; + pnf_p7_arr_time_t ul_dci; + pnf_p7_arr_time_t tx_data; + pnf_p7_dir_t dl; + pnf_p7_dir_t ul; } pnf_p7_nr_stats_t; - - typedef struct { uint8_t* buffer; uint16_t length; @@ -119,6 +114,7 @@ typedef struct { uint16_t sfn; uint16_t slot; + int mu; uint16_t sfn_slot; uint32_t slot_start_time_hr; int32_t slot_shift; diff --git a/nfapi/open-nFAPI/pnf/public_inc/nfapi_pnf_interface.h b/nfapi/open-nFAPI/pnf/public_inc/nfapi_pnf_interface.h index cb8dd6f6d7..5e964f10fa 100644 --- a/nfapi/open-nFAPI/pnf/public_inc/nfapi_pnf_interface.h +++ b/nfapi/open-nFAPI/pnf/public_inc/nfapi_pnf_interface.h @@ -573,11 +573,10 @@ typedef struct //uint16_t sfn_slot uint16_t sfn; uint16_t slot; - //TODO: Change P7 structs to NR - nfapi_nr_dl_tti_request_t* dl_tti_req;//nfapi_dl_config_request_t* dl_config_req; - nfapi_nr_ul_tti_request_t* ul_tti_req;//nfapi_ul_config_request_t* ul_config_req; - nfapi_nr_ul_dci_request_t* ul_dci_req;//nfapi_hi_dci0_request_t* hi_dci0_req; - nfapi_nr_tx_data_request_t* tx_data_req;//nfapi_tx_request_t* tx_req; + nfapi_nr_dl_tti_request_t dl_tti_req; + nfapi_nr_ul_tti_request_t ul_tti_req; + nfapi_nr_ul_dci_request_t ul_dci_req; + nfapi_nr_tx_data_request_t tx_data_req; //TODO: check these two later //nfapi_lbt_dl_config_request_t* lbt_dl_config_req; diff --git a/nfapi/open-nFAPI/pnf/src/pnf_p7.c b/nfapi/open-nFAPI/pnf/src/pnf_p7.c index 4232bb27de..81de4d7acc 100644 --- a/nfapi/open-nFAPI/pnf/src/pnf_p7.c +++ b/nfapi/open-nFAPI/pnf/src/pnf_p7.c @@ -28,14 +28,17 @@ #include #include "pnf_p7.h" +#include "nr_fapi_p7_utils.h" // for 5G/NR message utils +#include "common/ran_context.h" +#include #define FAPI2_IP_DSCP 0 extern int sf_ahead; -void add_slot(uint16_t *frameP, uint16_t *slotP, int offset) +static void add_slot(int mu, uint16_t *frameP, uint16_t *slotP, int offset) { - uint16_t num_slots = 20; // set based on numerlogy (fixing for 1) + uint16_t num_slots = NFAPI_SLOTNUM(mu); *frameP = (*frameP + ((*slotP + offset) / num_slots))%1024; @@ -58,20 +61,12 @@ void subtract_sf(uint16_t *frameP, uint16_t *subframeP, int offset) *subframeP = (*subframeP+10-offset)%10; } -uint32_t sfnslot_add_slot(uint16_t sfn, uint16_t slot, int offset) +void sfnslot_add_slot(int mu, uint16_t *sfn, uint16_t *slot, int offset) { - uint32_t new_sfnslot; -// uint16_t sfn = NFAPI_SFNSLOT2SFN(sfnslot); -// uint16_t slot = NFAPI_SFNSLOT2SLOT(sfnslot); - //printf("%s() sfn:%u sf:%u\n", __FUNCTION__, sfn, sf); - add_slot(&sfn, &slot, offset); - - new_sfnslot = sfn<<6|slot; + add_slot(mu, sfn, slot, offset); //printf("%s() sfn:%u sf:%u offset:%d sfnsf:%d(DEC:%d) new:%d(DEC:%d)\n", __FUNCTION__, sfn, sf, offset, sfnsf, NFAPI_SFNSF2DEC(sfnsf), new_sfnsf, NFAPI_SFNSF2DEC(new_sfnsf)); - - return new_sfnslot; } uint16_t sfnsf_add_sf(uint16_t sfnsf, int offset) @@ -137,34 +132,12 @@ void pnf_p7_free(pnf_p7_t* pnf_p7, void* ptr) } } -// todo : for now these just malloc/free need to move to a memory cache -nfapi_nr_dl_tti_request_t* allocate_nfapi_dl_tti_request(pnf_p7_t* pnf_p7) -{ - void *ptr= pnf_p7_malloc(pnf_p7, sizeof(nfapi_nr_dl_tti_request_t)); - //printf("%s() ptr:%p\n", __FUNCTION__, ptr); - return ptr; -} nfapi_dl_config_request_t* allocate_nfapi_dl_config_request(pnf_p7_t* pnf_p7) { void *ptr= pnf_p7_malloc(pnf_p7, sizeof(nfapi_dl_config_request_t)); //printf("%s() ptr:%p\n", __FUNCTION__, ptr); return ptr; } -void deallocate_nfapi_dl_tti_request(nfapi_nr_dl_tti_request_t* req, pnf_p7_t* pnf_p7) -{ - //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->dl_config_request_body.dl_config_pdu_list); - - // if(pnf_p7->_public.codec_config.deallocate) - // { - // (pnf_p7->_public.codec_config.deallocate)(req); - // } - // else - // { - // free(req); - // } - - pnf_p7_free(pnf_p7, req); -} void deallocate_nfapi_dl_config_request(nfapi_dl_config_request_t* req, pnf_p7_t* pnf_p7) { @@ -182,13 +155,6 @@ void deallocate_nfapi_dl_config_request(nfapi_dl_config_request_t* req, pnf_p7_t pnf_p7_free(pnf_p7, req); } -nfapi_nr_ul_tti_request_t* allocate_nfapi_ul_tti_request(pnf_p7_t* pnf_p7) -{ - void *ptr= pnf_p7_malloc(pnf_p7, sizeof(nfapi_nr_ul_tti_request_t)); - //printf("%s() ptr:%p\n", __FUNCTION__, ptr); - return ptr; -} - nfapi_ul_config_request_t* allocate_nfapi_ul_config_request(pnf_p7_t* pnf_p7) { void *ptr= pnf_p7_malloc(pnf_p7, sizeof(nfapi_ul_config_request_t)); @@ -196,23 +162,6 @@ nfapi_ul_config_request_t* allocate_nfapi_ul_config_request(pnf_p7_t* pnf_p7) return ptr; } -void deallocate_nfapi_ul_tti_request(nfapi_nr_ul_tti_request_t* req, pnf_p7_t* pnf_p7) -{ - //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->ul_config_request_body.ul_config_pdu_list); - /*if(pnf_p7->_public.codec_config.deallocate) - { - (pnf_p7->_public.codec_config.deallocate)(req->pdus_list); - (pnf_p7->_public.codec_config.deallocate)(req->groups_list); - } - else - { - free(req->pdus_list); - free(req->groups_list); - } - */ - pnf_p7_free(pnf_p7, req); -} - void deallocate_nfapi_ul_config_request(nfapi_ul_config_request_t* req, pnf_p7_t* pnf_p7) { //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->ul_config_request_body.ul_config_pdu_list); @@ -229,31 +178,11 @@ void deallocate_nfapi_ul_config_request(nfapi_ul_config_request_t* req, pnf_p7_t pnf_p7_free(pnf_p7, req); } -nfapi_nr_ul_dci_request_t* allocate_nfapi_ul_dci_request(pnf_p7_t* pnf_p7) -{ - return pnf_p7_malloc(pnf_p7, sizeof(nfapi_nr_ul_dci_request_t)); -} - nfapi_hi_dci0_request_t* allocate_nfapi_hi_dci0_request(pnf_p7_t* pnf_p7) { return pnf_p7_malloc(pnf_p7, sizeof(nfapi_hi_dci0_request_t)); } -void deallocate_nfapi_ul_dci_request(nfapi_nr_ul_dci_request_t* req, pnf_p7_t* pnf_p7) -{ - //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->hi_dci0_request_body.hi_dci0_pdu_list); - // if(pnf_p7->_public.codec_config.deallocate) - // { - // (pnf_p7->_public.codec_config.deallocate)(req->ul_dci_pdu_list); - // } - // else - // { - // free(req->ul_dci_pdu_list); - // } - - pnf_p7_free(pnf_p7, req); -} - void deallocate_nfapi_hi_dci0_request(nfapi_hi_dci0_request_t* req, pnf_p7_t* pnf_p7) { //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->hi_dci0_request_body.hi_dci0_pdu_list); @@ -270,32 +199,11 @@ void deallocate_nfapi_hi_dci0_request(nfapi_hi_dci0_request_t* req, pnf_p7_t* pn pnf_p7_free(pnf_p7, req); } -nfapi_nr_tx_data_request_t* allocate_nfapi_tx_data_request(pnf_p7_t* pnf_p7) -{ - return pnf_p7_malloc(pnf_p7, sizeof(nfapi_nr_tx_data_request_t)); -} - nfapi_tx_request_t* allocate_nfapi_tx_request(pnf_p7_t* pnf_p7) { return pnf_p7_malloc(pnf_p7, sizeof(nfapi_tx_request_t)); } -//TODO: Check if deallocate_nfapi_tx_data_request defn is proper -void deallocate_nfapi_tx_data_request(nfapi_nr_tx_data_request_t* req, pnf_p7_t* pnf_p7) -{ -/* - if(pnf_p7->_public.codec_config.deallocate) - { - (pnf_p7->_public.codec_config.deallocate)(req->pdu_list); - } - else - { - free(req->pdu_list); - } -*/ - pnf_p7_free(pnf_p7, req); -} - void deallocate_nfapi_tx_request(nfapi_tx_request_t* req, pnf_p7_t* pnf_p7) { int i = 0; @@ -471,7 +379,7 @@ void pnf_p7_rx_reassembly_queue_remove_old_msgs(pnf_p7_t* pnf_p7, pnf_p7_rx_reas previous->next = iterator->next; } - NFAPI_TRACE(NFAPI_TRACE_INFO, "Deleting stale reassembly message (%u %u %d)\n", iterator->rx_hr_time, rx_hr_time, delta); + NFAPI_TRACE(NFAPI_TRACE_WARN, "Deleting stale reassembly message (packet rx_hr_time %u current rx_hr_time %u delta %d us)\n", iterator->rx_hr_time, rx_hr_time, delta); pnf_p7_rx_message_t* to_delete = iterator; iterator = iterator->next; @@ -544,10 +452,7 @@ static uint32_t get_sf_time(uint32_t now_hr, uint32_t sf_start_hr) int pnf_p7_send_message(pnf_p7_t* pnf_p7, uint8_t* msg, uint32_t len) { // todo : consider how to do this only once - struct sockaddr_in remote_addr; - memset((char*)&remote_addr, 0, sizeof(struct sockaddr_in)); - remote_addr.sin_family = AF_INET; - remote_addr.sin_port = htons(pnf_p7->_public.remote_p7_port); + struct sockaddr_in remote_addr = {.sin_family = AF_INET, .sin_port = htons(pnf_p7->_public.remote_p7_port)}; if(inet_aton(pnf_p7->_public.remote_p7_addr, &remote_addr.sin_addr) == -1) @@ -674,8 +579,8 @@ int pnf_nr_p7_pack_and_send_p7_message(pnf_p7_t* pnf_p7, nfapi_nr_p7_message_hea return -1; } - int len = - nfapi_nr_p7_message_pack(header, pnf_p7->tx_message_buffer, sizeof(pnf_p7->tx_message_buffer), &pnf_p7->_public.codec_config); + uint8_t tx_buf[131072]; // four times NFAPI_MAX_PACKED_MESSAGE_SIZE as of this commit + int len = nfapi_nr_p7_message_pack(header, tx_buf, sizeof(tx_buf), &pnf_p7->_public.codec_config); if (len < 0) { if (pthread_mutex_unlock(&(pnf_p7->pack_mutex)) != 0) { @@ -706,7 +611,7 @@ int pnf_nr_p7_pack_and_send_p7_message(pnf_p7_t* pnf_p7, nfapi_nr_p7_message_hea uint16_t segment_size = size + NFAPI_NR_P7_HEADER_LENGTH; // Update the header with the m and segement - memcpy(&buffer[0], pnf_p7->tx_message_buffer, NFAPI_NR_P7_HEADER_LENGTH); + memcpy(&buffer[0], tx_buf, NFAPI_NR_P7_HEADER_LENGTH); // set the segment length buffer[6] = (segment_size & 0xFF00) >> 8; @@ -715,7 +620,7 @@ int pnf_nr_p7_pack_and_send_p7_message(pnf_p7_t* pnf_p7, nfapi_nr_p7_message_hea // set the m & segment number buffer[8] = ((!last) << 7) + segment; - memcpy(&buffer[NFAPI_NR_P7_HEADER_LENGTH], pnf_p7->tx_message_buffer + offset, size); + memcpy(&buffer[NFAPI_NR_P7_HEADER_LENGTH], tx_buf + offset, size); offset += size; if (pnf_p7->_public.checksum_enabled) { @@ -726,11 +631,11 @@ int pnf_nr_p7_pack_and_send_p7_message(pnf_p7_t* pnf_p7, nfapi_nr_p7_message_hea } } else { if (pnf_p7->_public.checksum_enabled) { - nfapi_nr_p7_update_checksum(pnf_p7->tx_message_buffer, len); + nfapi_nr_p7_update_checksum(tx_buf, len); } // simple case that the message fits in a single segment - pnf_p7_send_message(pnf_p7, pnf_p7->tx_message_buffer, len); + pnf_p7_send_message(pnf_p7, tx_buf, len); } pnf_p7->sequence_number++; @@ -807,55 +712,6 @@ void pnf_nr_pack_and_send_timing_info(pnf_p7_t* pnf_p7) pnf_p7->timing_info_ms_counter = 0; } - -void send_dummy_slot(pnf_p7_t* pnf_p7, uint16_t sfn, uint16_t slot) -{ - struct timespec t; - clock_gettime( CLOCK_MONOTONIC, &t); - - //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s(sfn_sf:%d) t:%ld.%09ld\n", __FUNCTION__, NFAPI_SFNSF2DEC(sfn_sf), t.tv_sec, t.tv_nsec); - - if(pnf_p7->_public.tx_data_req_fn && pnf_p7->_public.dummy_slot.tx_data_req) - { - pnf_p7->_public.dummy_slot.tx_data_req->SFN = sfn; - pnf_p7->_public.dummy_slot.tx_data_req->Slot = slot; - //NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy tx_req - enter\n"); - (pnf_p7->_public.tx_data_req_fn)(&pnf_p7->_public, pnf_p7->_public.dummy_slot.tx_data_req); - //NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy tx_req - exit\n"); - } - if(pnf_p7->_public.dl_tti_req_fn && pnf_p7->_public.dummy_slot.dl_tti_req) - { - pnf_p7->_public.dummy_slot.dl_tti_req->SFN = sfn; - pnf_p7->_public.dummy_slot.dl_tti_req->Slot = slot; - //NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy dl_config_req - enter\n"); - (pnf_p7->_public.dl_tti_req_fn)(NULL, &(pnf_p7->_public), pnf_p7->_public.dummy_slot.dl_tti_req); - //NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy dl_config_req - exit\n"); - } - if(pnf_p7->_public.ul_tti_req_fn && pnf_p7->_public.dummy_slot.ul_tti_req) - { - pnf_p7->_public.dummy_slot.ul_tti_req->SFN = sfn; - pnf_p7->_public.dummy_slot.ul_tti_req->Slot = slot; - NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy ul_config_req - enter\n"); - (pnf_p7->_public.ul_tti_req_fn)(NULL, &pnf_p7->_public, pnf_p7->_public.dummy_slot.ul_tti_req); - } - if(pnf_p7->_public.ul_dci_req_fn && pnf_p7->_public.dummy_slot.ul_dci_req) - { - pnf_p7->_public.dummy_slot.ul_dci_req->SFN = sfn; - pnf_p7->_public.dummy_slot.ul_dci_req->Slot = slot; - NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy hi_dci0 - enter\n"); - (pnf_p7->_public.ul_dci_req_fn)(NULL, &pnf_p7->_public, pnf_p7->_public.dummy_slot.ul_dci_req); - } - #if 0 - if(pnf_p7->_public.lbt_dl_config_req && pnf_p7->_public.dummy_subframe.lbt_dl_config_req) // TODO: Change later - { - pnf_p7->_public.dummy_slot.lbt_dl_config_req->sfn_sf = sfn; - NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy lbt - enter\n"); - (pnf_p7->_public.lbt_dl_config_req)(&pnf_p7->_public, pnf_p7->_public.dummy_slot.lbt_dl_config_req); - } - #endif -} - - void send_dummy_subframe(pnf_p7_t* pnf_p7, uint16_t sfn_sf) { struct timespec t; @@ -918,21 +774,14 @@ int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t sl // save the curren time, sfn and slot pnf_p7->slot_start_time_hr = pnf_get_current_time_hr(); - int slot_ahead = 6; - uint32_t sfn_slot_tx = sfnslot_add_slot(sfn, slot, slot_ahead); - uint16_t sfn_tx = NFAPI_SFNSLOT2SFN(sfn_slot_tx); - uint8_t slot_tx = NFAPI_SFNSLOT2SLOT(sfn_slot_tx); //We align the pnf_p7 sfn/slot with tx sfn/slot, and vnf is synced with pnf_p7 sfn/slot. This is so that the scheduler runs slot_ahead from rx thread. - pnf_p7->sfn = sfn_tx; - pnf_p7->slot = slot_tx; + pnf_p7->sfn = sfn; + pnf_p7->slot = slot; - uint32_t rx_slot_dec = NFAPI_SFNSLOT2DEC(sfn, slot); - uint8_t buffer_index_rx = rx_slot_dec % 20; - - uint32_t tx_slot_dec = NFAPI_SFNSLOT2DEC(sfn_tx,slot_tx); - uint8_t buffer_index_tx = tx_slot_dec % 20; + uint32_t tx_slot_dec = NFAPI_SFNSLOT2DEC(pnf_p7->mu, sfn,slot); + uint8_t buffer_index_tx = tx_slot_dec % NFAPI_SLOTNUM(pnf_p7->mu); // If the subframe_buffer has been configured if(pnf_p7->_public.slot_buffer_size!= 0) // for now value is same as sf_buffer_size @@ -945,9 +794,9 @@ int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t sl // adjust for wrap-around if(shifted_slot < 0) - shifted_slot += NFAPI_MAX_SFNSLOTDEC; - else if(shifted_slot > NFAPI_MAX_SFNSLOTDEC) - shifted_slot -= NFAPI_MAX_SFNSLOTDEC; + shifted_slot += NFAPI_MAX_SFNSLOTDEC(pnf_p7->mu); + else if(shifted_slot > NFAPI_MAX_SFNSLOTDEC(pnf_p7->mu)) + shifted_slot -= NFAPI_MAX_SFNSLOTDEC(pnf_p7->mu); // NFAPI_TRACE(NFAPI_TRACE_INFO, "Applying shift %d to sfn/slot (%d -> %d)\n", pnf_p7->sfn_slot_shift, NFAPI_SFNSF2DEC(sfn_slot), shifted_sfn_slot); slot = shifted_slot; @@ -959,174 +808,47 @@ int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t sl pnf_p7->slot_shift = 0; } - nfapi_pnf_p7_slot_buffer_t* rx_slot_buffer = &(pnf_p7->slot_buffer[buffer_index_rx]); - nfapi_pnf_p7_slot_buffer_t* tx_slot_buffer = &(pnf_p7->slot_buffer[buffer_index_tx]); - // if (0) NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() shift:%d slot_buffer->sfn_sf:%d tx_slot_buffer->sfn_slot:%d sfn_sf:%d subframe_buffer[buffer_index:%u dl_config_req:%p tx_req:%p] " - // "TX:sfn_sf:%d:tx_buffer_index:%d[dl_config_req:%p tx_req:%p]\n", - // __FUNCTION__, - // pnf_p7->slot_shift, - // NFAPI_SFNSLOT2DEC(rx_slot_buffer->sfn, rx_slot_buffer->slot), - // NFAPI_SFNSLOT2DEC(tx_slot_buffer->sfn, tx_slot_buffer->slot), - // slot_dec, buffer_index_rx, rx_slot_buffer->dl_tti_req, rx_slot_buffer->tx_data_req, - // tx_slot_dec, buffer_index_tx, tx_slot_buffer->dl_tti_req, tx_slot_buffer->tx_data_req); - //TODO: Change later if required + nfapi_nr_dl_tti_request_t* dl_tti_req = &tx_slot_buffer->dl_tti_req; + nfapi_nr_tx_data_request_t* tx_data_req = &tx_slot_buffer->tx_data_req; + if (dl_tti_req->dl_tti_request_body.nPDUs > 0 && dl_tti_req->SFN == sfn && dl_tti_req->Slot == slot) { + DevAssert(pnf_p7->_public.dl_tti_req_fn != NULL); + DevAssert(pnf_p7->_public.tx_data_req_fn != NULL); + if (tx_data_req->Number_of_PDUs > 0 && tx_data_req->SFN == sfn && tx_data_req->Slot == slot) { + (pnf_p7->_public.dl_tti_req_fn)(NULL, &(pnf_p7->_public), dl_tti_req); + (pnf_p7->_public.tx_data_req_fn)(&(pnf_p7->_public), tx_data_req); + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%4d.%2d no corresponding tx_data.request for dl_tti.request, dropping\n", sfn, slot); + } + tx_slot_buffer->dl_tti_req.SFN = -1; + tx_slot_buffer->dl_tti_req.Slot = -1; + tx_slot_buffer->tx_data_req.SFN = -1; + tx_slot_buffer->tx_data_req.Slot = -1; + } + if (tx_data_req->Number_of_PDUs > 0 && tx_data_req->SFN == sfn && tx_data_req->Slot == slot) { + // there is a tx_data.request in this slot, but no corresponding + // dl_tti.request (when they need to come pairwise) + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%4d.%2d no corresponding dl_tti.request for tx_data.request, dropping\n", sfn, slot); + tx_slot_buffer->tx_data_req.SFN = -1; + tx_slot_buffer->tx_data_req.Slot = -1; + } - // todo : how to handle the messages we don't have, send dummies for - // now - - //printf("tx_subframe_buffer->sfn_sf:%d sfn_sf_tx:%d\n", tx_subframe_buffer->sfn_sf, sfn_sf_tx); - //printf("subframe_buffer->sfn_sf:%d sfn_sf:%d\n", subframe_buffer->sfn_sf, sfn_sf); - //printf("tx_slot_buff_sfn - %d, tx_slot_buf_slot - %d, sfn_tx = %d, sllot_tx - %d \n",tx_slot_buffer->sfn,tx_slot_buffer->slot,sfn_tx,slot_tx); - // if(tx_slot_buffer->slot == slot_tx && tx_slot_buffer->sfn == sfn_tx) - // { - - //checking in the tx slot buffers to see if a p7 msg is present. todo: what if it's a mixed slot? - - if(tx_slot_buffer->tx_data_req != 0 && tx_slot_buffer->tx_data_req->SFN == sfn_tx && tx_slot_buffer->tx_data_req->Slot == slot_tx) + if(tx_slot_buffer->ul_tti_req.n_pdus > 0 && tx_slot_buffer->ul_tti_req.SFN == sfn && tx_slot_buffer->ul_tti_req.Slot == slot) { - - if(pnf_p7->_public.tx_data_req_fn) - { - //NFAPI_TRACE(NFAPI_TRACE_INFO, "Calling tx_data_req_fn in SFN/slot %d.%d \n",sfn,slot); - LOG_D(PHY, "Process tx_data SFN/slot %d.%d buffer index: %d \n",sfn_tx,slot_tx,buffer_index_tx); - (pnf_p7->_public.tx_data_req_fn)(&(pnf_p7->_public), tx_slot_buffer->tx_data_req); - } - } - else - { - // send dummy - if(pnf_p7->_public.tx_data_req_fn && pnf_p7->_public.dummy_slot.tx_data_req) - { - pnf_p7->_public.dummy_slot.tx_data_req->SFN = sfn_tx; - pnf_p7->_public.dummy_slot.tx_data_req->Slot = slot_tx; - - (pnf_p7->_public.tx_data_req_fn)(&(pnf_p7->_public), pnf_p7->_public.dummy_slot.tx_data_req); - } - } - - if(tx_slot_buffer->dl_tti_req != 0 && tx_slot_buffer->dl_tti_req->SFN == sfn_tx && tx_slot_buffer->dl_tti_req->Slot == slot_tx) - { - if(pnf_p7->_public.dl_tti_req_fn) - { - LOG_D(PHY, "Process dl_tti SFN/slot %d.%d buffer index: %d \n",sfn_tx,slot_tx,buffer_index_tx); - (pnf_p7->_public.dl_tti_req_fn)(NULL, &(pnf_p7->_public), tx_slot_buffer->dl_tti_req); - } - } - else - { - // send dummy - if(pnf_p7->_public.dl_tti_req_fn && pnf_p7->_public.dummy_slot.dl_tti_req) - { - pnf_p7->_public.dummy_slot.dl_tti_req->SFN = sfn_tx; - pnf_p7->_public.dummy_slot.dl_tti_req->Slot = slot_tx; - (pnf_p7->_public.dl_tti_req_fn)(NULL, &(pnf_p7->_public), pnf_p7->_public.dummy_slot.dl_tti_req); - } + DevAssert(pnf_p7->_public.ul_tti_req_fn != NULL); + (pnf_p7->_public.ul_tti_req_fn)(NULL, &(pnf_p7->_public), &tx_slot_buffer->ul_tti_req); + tx_slot_buffer->ul_tti_req.SFN = -1; + tx_slot_buffer->ul_tti_req.Slot = -1; } - - if(tx_slot_buffer->ul_dci_req!= 0 && tx_slot_buffer->ul_dci_req->SFN == sfn_tx && tx_slot_buffer->ul_dci_req->Slot == slot_tx) + if(tx_slot_buffer->ul_dci_req.numPdus > 0 && tx_slot_buffer->ul_dci_req.SFN == sfn && tx_slot_buffer->ul_dci_req.Slot == slot) { - if(pnf_p7->_public.ul_dci_req_fn) - { - //NFAPI_TRACE(NFAPI_TRACE_INFO, "Calling UL_dci_req_fn in SFN/slot %d.%d \n",sfn,slot); - LOG_D(PHY, "Process ul_dci SFN/slot %d.%d buffer index: %d \n",sfn_tx,slot_tx,buffer_index_tx); - (pnf_p7->_public.ul_dci_req_fn)(NULL, &(pnf_p7->_public), tx_slot_buffer->ul_dci_req); - } + DevAssert(pnf_p7->_public.ul_dci_req_fn != NULL); + (pnf_p7->_public.ul_dci_req_fn)(NULL, &(pnf_p7->_public), &tx_slot_buffer->ul_dci_req); + tx_slot_buffer->ul_dci_req.SFN = -1; + tx_slot_buffer->ul_dci_req.Slot = -1; } - else - { - //send dummy - if(pnf_p7->_public.ul_dci_req_fn && pnf_p7->_public.dummy_slot.ul_dci_req) - { - pnf_p7->_public.dummy_slot.ul_dci_req->SFN = sfn_tx; - pnf_p7->_public.dummy_slot.ul_dci_req->Slot = slot_tx; - (pnf_p7->_public.ul_dci_req_fn)(NULL, &(pnf_p7->_public), pnf_p7->_public.dummy_slot.ul_dci_req); - } - } - if(tx_slot_buffer->ul_tti_req != 0) - { - if(pnf_p7->_public.ul_tti_req_fn) - { - (pnf_p7->_public.ul_tti_req_fn)(NULL, &(pnf_p7->_public), tx_slot_buffer->ul_tti_req); - } - } - else - { - // send dummy - if(pnf_p7->_public.ul_tti_req_fn && pnf_p7->_public.dummy_slot.ul_tti_req) - { - pnf_p7->_public.dummy_slot.ul_tti_req->SFN = sfn_tx; - pnf_p7->_public.dummy_slot.ul_tti_req->Slot = slot_tx; - (pnf_p7->_public.ul_tti_req_fn)(NULL, &(pnf_p7->_public), pnf_p7->_public.dummy_slot.ul_tti_req); - } - } - - //deallocate slot buffers after passing down the PDUs to PHY processing - - if(tx_slot_buffer->dl_tti_req != 0) - { - deallocate_nfapi_dl_tti_request(tx_slot_buffer->dl_tti_req, pnf_p7); - tx_slot_buffer->dl_tti_req = 0; - LOG_D(PHY,"SFN/slot %d.%d Buffer index : %d freed \n",sfn_tx,slot_tx,buffer_index_tx); - } - - if(tx_slot_buffer->tx_data_req != 0) - { - deallocate_nfapi_tx_data_request(tx_slot_buffer->tx_data_req, pnf_p7); - tx_slot_buffer->tx_data_req = 0; - } - - if(tx_slot_buffer->ul_dci_req != 0) - { - deallocate_nfapi_ul_dci_request(tx_slot_buffer->ul_dci_req, pnf_p7); - tx_slot_buffer->ul_dci_req = 0; - } - - - //checking in the rx slot buffers to see if a p7 msg is present. - - if(rx_slot_buffer->ul_tti_req != 0 && rx_slot_buffer->ul_tti_req->SFN == sfn && rx_slot_buffer->ul_tti_req->Slot == slot) - { - if(pnf_p7->_public.ul_tti_req_fn) - { - //NFAPI_TRACE(NFAPI_TRACE_INFO, "Calling UL_tti_req_fn in SFN/slot %d.%d \n",sfn,slot); - (pnf_p7->_public.ul_tti_req_fn)(NULL, &(pnf_p7->_public), rx_slot_buffer->ul_tti_req); - } - } - else - { - // send dummy - if(pnf_p7->_public.ul_tti_req_fn && pnf_p7->_public.dummy_slot.ul_tti_req) - { - pnf_p7->_public.dummy_slot.ul_tti_req->SFN = sfn; - pnf_p7->_public.dummy_slot.ul_tti_req->Slot = slot; - LOG_D(PHY, "Process ul_tti SFN/slot %d.%d buffer index: %d \n",sfn,slot,buffer_index_rx); - (pnf_p7->_public.ul_tti_req_fn)(NULL, &(pnf_p7->_public), pnf_p7->_public.dummy_slot.ul_tti_req); - } - } - if(rx_slot_buffer->ul_tti_req != 0) - { - deallocate_nfapi_ul_tti_request(rx_slot_buffer->ul_tti_req, pnf_p7); - rx_slot_buffer->ul_tti_req = 0; - - } - - //reset slot buffer - - if ( rx_slot_buffer->dl_tti_req == 0 && - rx_slot_buffer->tx_data_req == 0 && - rx_slot_buffer->ul_tti_req == 0) - { - memset(&(pnf_p7->slot_buffer[buffer_index_rx]), 0, sizeof(nfapi_pnf_p7_slot_buffer_t)); - pnf_p7->slot_buffer[buffer_index_rx].sfn = -1; - pnf_p7->slot_buffer[buffer_index_rx].slot = -1; - } - - //printf("pnf_p7->_public.timing_info_mode_periodic:%d pnf_p7->timing_info_period_counter:%d pnf_p7->_public.timing_info_period:%d\n", pnf_p7->_public.timing_info_mode_periodic, pnf_p7->timing_info_period_counter, pnf_p7->_public.timing_info_period); - //printf("pnf_p7->_public.timing_info_mode_aperiodic:%d pnf_p7->timing_info_aperiodic_send:%d\n", pnf_p7->_public.timing_info_mode_aperiodic, pnf_p7->timing_info_aperiodic_send); - //printf("pnf_p7->timing_info_ms_counter:%d\n", pnf_p7->timing_info_ms_counter); //send the periodic timing info if configured if(pnf_p7->_public.timing_info_mode_periodic && (pnf_p7->timing_info_period_counter++) == pnf_p7->_public.timing_info_period) @@ -1148,7 +870,18 @@ int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t sl } - if(pthread_mutex_unlock(&(pnf_p7->mutex)) != 0) + if (sfn % 128 == 0 && slot == 0) { + pnf_p7_nr_stats_t* s = &pnf_p7->nr_stats; + int ontime = s->dl_tti.ontime + s->ul_tti.ontime + s->ul_dci.ontime + s->tx_data.ontime; + int late = s->dl_tti.late + s->ul_tti.late + s->ul_dci.late + s->tx_data.late; + + float dl_thr = (float) s->dl.bytes * 8 / 1000 / 1000 / 1.28f; // every 128 frames = 1.28 s + float ul_thr = (float) s->ul.bytes * 8 / 1000 / 1000 / 1.28f; + NFAPI_TRACE(NFAPI_TRACE_INFO, "[P7:%d] msgs ontime %d thr DL %.2f UL %.2f msg late %d (vtime)\n", pnf_p7->_public.phy_id, ontime, dl_thr, ul_thr, late); + memset(s, 0, sizeof(*s)); + } + + if(pthread_mutex_unlock(&(pnf_p7->mutex)) != 0) { NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unlock mutex\n"); return -1; @@ -1446,85 +1179,44 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf) return 0; } - - -// return 1 if in window -// return 0 if out of window - -uint8_t is_nr_p7_request_in_window(uint16_t sfn,uint16_t slot, const char* name, pnf_p7_t* phy) +bool is_nr_p7_request_in_window(const uint16_t sfn, const uint16_t slot, const char* name, const pnf_p7_t* phy) { - uint32_t recv_sfn_slot_dec = NFAPI_SFNSLOT2DEC(sfn,slot); - uint32_t current_sfn_slot_dec = NFAPI_SFNSLOT2DEC(phy->sfn,phy->slot); - //printf("p7_msg_sfn: %d, p7_msg_slot: %d, phy_sfn:%d , phy_slot:%d \n",sfn,slot,phy->sfn,phy->slot); - uint8_t in_window = 0; - uint8_t timing_window = phy->_public.slot_buffer_size; - - // if(recv_sfn_slot_dec <= current_sfn_slot_dec) - // { - // // Need to check for wrap in window - // if(((recv_sfn_slot_dec + timing_window) % NFAPI_MAX_SFNSLOTDEC) < recv_sfn_slot_dec) - // { - // if(current_sfn_slot_dec > ((recv_sfn_slot_dec + timing_window) % NFAPI_MAX_SFNSLOTDEC)) - // { - // // out of window - // NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is late %d (with wrap)\n", current_sfn_slot_dec, name, recv_sfn_slot_dec); - // } - // else - // { - // // ok - // //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is in window %d (with wrap)\n", current_sfn_sf_dec, name, recv_sfn_sf_dec); - // in_window = 1; - // } - // } - // else - // { - // if((current_sfn_slot_dec - recv_sfn_slot_dec) <= timing_window) - // { - // // in window - // //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is in window %d\n", current_sfn_slot_dec, name, recv_sfn_slot_dec); - // in_window = 1; - // } - // //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is in late %d (delta:%d)\n", current_sfn_slot_dec, name, recv_sfn_slot_dec, (current_sfn_slot_dec - recv_sfn_slot_dec)); - // } - - // } - // else - // { - // // Need to check it is in window - // if((recv_sfn_slot_dec - current_sfn_slot_dec) <= timing_window) - // { - // // in window - // //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is in window %d\n", current_sfn_sf_dec, name, recv_sfn_sf_dec); - // in_window = 1; - // } - // else - // { - // // too far in the future - // NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is out of window %d (delta:%d) [max:%d]\n", current_sfn_slot_dec, name, recv_sfn_slot_dec, (recv_sfn_slot_dec - current_sfn_slot_dec), timing_window); - // } - - // } - if(current_sfn_slot_dec <= recv_sfn_slot_dec + timing_window){ - in_window = 1; - //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is in window %d\n", current_sfn_slot_dec, name, recv_sfn_slot_dec); - } - else if(current_sfn_slot_dec + NFAPI_MAX_SFNSLOTDEC <= recv_sfn_slot_dec + timing_window){ //checking for wrap - in_window = 1; - //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is in window %d\n", current_sfn_slot_dec, name, recv_sfn_slot_dec); - } - - else - { - - NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is out of window %d (delta:%d) [max:%d]\n", current_sfn_slot_dec, name, recv_sfn_slot_dec, (current_sfn_slot_dec - recv_sfn_slot_dec), timing_window); - - }//Need to add more cases - - - return in_window; + const uint32_t recv = NFAPI_SFNSLOT2DEC(phy->mu, sfn, slot); // unpack sfn/slot + const uint32_t curr = NFAPI_SFNSLOT2DEC(phy->mu, phy->sfn, phy->slot); + const uint8_t timing_window = phy->_public.slot_buffer_size; // TODO check + uint32_t diff = curr < recv ? recv - curr : curr - recv; + if (diff > NFAPI_MAX_SFNSLOTDEC(phy->mu) / 2) + diff = NFAPI_MAX_SFNSLOTDEC(phy->mu) - diff; + if (diff > timing_window) { + NFAPI_TRACE(NFAPI_TRACE_WARN, "[%d] %s is out of window %d (delta:%d) [max:%d]\n", curr, name, recv, diff, timing_window); + return false; + } + return true; } - +/*! \brief Checks if the slot a message is intended to configure is of the appropriate type ( DL or UL slot ) + * \param sfn The SFN from a P7 message + * \param slot The Slot from a P7 message + * \param name A string with the message name (e.g. DL_TTI.request) for the warning + * \param type The slot type intended for the message ( NR_DOWNLINK_SLOT or NR_UPLINK_SLOT ) + * \return true if the slot type is correct, false if not + * + * The function will take a SFN and Slot and check if it is of the intended type ( DL or UL ), indicated by parameter type + * Will print a warning if the check fails and return false + * returns true on success + */ +bool check_nr_nfapi_p7_slot_type(const uint16_t sfn, const uint16_t slot, const char* name, int type) +{ + DevAssert(RC.gNB != NULL && RC.gNB[0] != NULL); + PHY_VARS_gNB *gNB = RC.gNB[0]; + nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config; + const int slot_type = nr_slot_select(cfg, sfn, slot); + if(slot_type != type && slot_type != NR_MIXED_SLOT) { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%4d.%2d Slot type is not appropriate for %s\n", sfn, slot, name); + return false; + } + return true; +} uint8_t is_p7_request_in_window(uint16_t sfnsf, const char* name, pnf_p7_t* phy) { @@ -1579,80 +1271,50 @@ uint8_t is_p7_request_in_window(uint16_t sfnsf, const char* name, pnf_p7_t* phy) } -// P7 messages +// P7 messages void pnf_handle_dl_tti_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7) { - //NFAPI_TRACE(NFAPI_TRACE_INFO, "DL_CONFIG.req Received\n"); - nfapi_nr_dl_tti_request_t* req = allocate_nfapi_dl_tti_request(pnf_p7); + // NFAPI_TRACE(NFAPI_TRACE_INFO, "DL_CONFIG.req Received\n"); + uint16_t frame, slot; + if (peek_nr_nfapi_p7_sfn_slot(pRecvMsg, recvMsgLen, &frame, &slot)) { + if (pthread_mutex_lock(&(pnf_p7->mutex)) != 0) { + NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to lock mutex\n"); + return; + } + if (check_nr_nfapi_p7_slot_type(frame, slot, "DL_TTI.request", NR_DOWNLINK_SLOT) + && is_nr_p7_request_in_window(frame, slot, "dl_tti_request", pnf_p7)) { + uint32_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(pnf_p7->mu, frame, slot); + uint8_t buffer_index = sfn_slot_dec % NFAPI_SLOTNUM(pnf_p7->mu); + pnf_p7->slot_buffer[buffer_index].sfn = frame; + pnf_p7->slot_buffer[buffer_index].slot = slot; + nfapi_nr_dl_tti_request_t *req = &pnf_p7->slot_buffer[buffer_index].dl_tti_req; + pnf_p7->nr_stats.dl_tti.ontime++; - if(req == NULL) - { - NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to allocate nfapi_dl_tti_request structure\n"); - return; - } - int unpack_result = nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, req, sizeof(nfapi_nr_dl_tti_request_t), &(pnf_p7->_public.codec_config)); + NFAPI_TRACE(NFAPI_TRACE_DEBUG, + "POPULATE DL_TTI_REQ current tx sfn/slot:%d.%d p7 msg sfn/slot: %d.%d buffer_index:%d\n", + pnf_p7->sfn, + pnf_p7->slot, + frame, + slot, + buffer_index); - if(unpack_result == 0) - { - if(pthread_mutex_lock(&(pnf_p7->mutex)) != 0) - { - NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to lock mutex\n"); - return; - } + if (nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, req, sizeof(*req), &(pnf_p7->_public.codec_config)) != 0) + NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unpack request\n"); + } else { + if (pnf_p7->_public.timing_info_mode_aperiodic) + pnf_p7->timing_info_aperiodic_send = 1; - if(is_nr_p7_request_in_window(req->SFN,req->Slot, "dl_tti_request", pnf_p7)) - { - uint32_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(req->SFN,req->Slot); - uint8_t buffer_index = sfn_slot_dec % 20; - - struct timespec t; - clock_gettime(CLOCK_MONOTONIC, &t); - - NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE DL_TTI_REQ current tx sfn/slot:%d.%d p7 msg sfn/slot: %d.%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, pnf_p7->sfn,pnf_p7->slot, req->SFN, req->Slot, buffer_index); - - // if there is already an dl_tti_req make sure we free it. - if(pnf_p7->slot_buffer[buffer_index].dl_tti_req != 0) - { - NFAPI_TRACE(NFAPI_TRACE_NOTE, "%s() is_nr_p7_request_in_window()=TRUE buffer_index occupied - free it first sfn_slot:%d buffer_index:%d\n", __FUNCTION__, NFAPI_SFNSLOT2DEC(req->SFN,req->Slot), buffer_index); - //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing dl_config_req at index %d (%d/%d)", - // pMyPhyInfo->sfnSf, bufferIdx, - // SFNSF2SFN(dreq->sfn_sf), SFNSF2SF(dreq->sfn_sf)); - deallocate_nfapi_dl_tti_request(pnf_p7->slot_buffer[buffer_index].dl_tti_req, pnf_p7); - } - - // filling dl_tti_request in slot buffer - pnf_p7->slot_buffer[buffer_index].sfn = req->SFN; - pnf_p7->slot_buffer[buffer_index].slot = req->Slot; - pnf_p7->slot_buffer[buffer_index].dl_tti_req = req; - - pnf_p7->stats.dl_tti_ontime++; - } - else - { - //NFAPI_TRACE(NFAPI_TRACE_NOTE, "NOT storing dl_config_req SFN/SF %d\n", req->sfn_sf); - deallocate_nfapi_dl_tti_request(req, pnf_p7); - - if(pnf_p7->_public.timing_info_mode_aperiodic) - { - pnf_p7->timing_info_aperiodic_send = 1; - } - - pnf_p7->stats.dl_tti_late++; - } - if(pthread_mutex_unlock(&(pnf_p7->mutex)) != 0) - { - NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unlock mutex\n"); - return; - } - } - else - { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to unpack dl_tti_req"); - deallocate_nfapi_dl_tti_request(req, pnf_p7); - } + pnf_p7->nr_stats.dl_tti.late++; + } + if (pthread_mutex_unlock(&(pnf_p7->mutex)) != 0) { + NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unlock mutex\n"); + return; + } + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to unpack dl_tti_req"); + } } - void pnf_handle_dl_config_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7) { //NFAPI_TRACE(NFAPI_TRACE_INFO, "DL_CONFIG.req Received\n"); @@ -1743,80 +1405,52 @@ void pnf_handle_dl_config_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_ } } - void pnf_handle_ul_tti_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7) { - //NFAPI_TRACE(NFAPI_TRACE_INFO, "UL_CONFIG.req Received\n"); + uint16_t frame, slot; + if (peek_nr_nfapi_p7_sfn_slot(pRecvMsg, recvMsgLen, &frame, &slot)) { + if (pthread_mutex_lock(&(pnf_p7->mutex)) != 0) { + NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to lock mutex\n"); + return; + } - nfapi_nr_ul_tti_request_t* req = allocate_nfapi_ul_tti_request(pnf_p7); + if (check_nr_nfapi_p7_slot_type(frame, slot, "UL_TTI.request", NR_UPLINK_SLOT) + && is_nr_p7_request_in_window(frame, slot, "ul_tti_request", pnf_p7)) { + uint32_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(pnf_p7->mu, frame, slot); + uint8_t buffer_index = sfn_slot_dec % NFAPI_SLOTNUM(pnf_p7->mu); + pnf_p7->slot_buffer[buffer_index].sfn = frame; + pnf_p7->slot_buffer[buffer_index].slot = slot; + nfapi_nr_ul_tti_request_t* req = &pnf_p7->slot_buffer[buffer_index].ul_tti_req; + pnf_p7->nr_stats.ul_tti.ontime++; - if(req == NULL) - { - NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to allocate nfapi_ul_tti_request structure\n"); - return; - } + NFAPI_TRACE(NFAPI_TRACE_DEBUG, + "POPULATE UL_TTI.request current tx sfn/slot:%d.%d p7 msg sfn/slot: %d.%d buffer_index:%d\n", + pnf_p7->sfn, + pnf_p7->slot, + frame, + slot, + buffer_index); - int unpack_result = nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, req, sizeof(nfapi_nr_ul_tti_request_t), &(pnf_p7->_public.codec_config)); + if (nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, req, sizeof(*req), &(pnf_p7->_public.codec_config)) != 0) + NFAPI_TRACE(NFAPI_TRACE_ERROR, "failed to unpack UL_TTI.request\n"); + } else { + NFAPI_TRACE(NFAPI_TRACE_NOTE, + "[%d.%d] NOT storing ul_tti_req OUTSIDE OF TRANSMIT BUFFER WINDOW SFN/SLOT %d.%d\n", + pnf_p7->sfn, pnf_p7->slot, + frame, slot); + if (pnf_p7->_public.timing_info_mode_aperiodic) + pnf_p7->timing_info_aperiodic_send = 1; - if(unpack_result == 0) - { - if(pthread_mutex_lock(&(pnf_p7->mutex)) != 0) - { - NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to lock mutex\n"); - return; - } + pnf_p7->nr_stats.ul_tti.late++; + } - if(is_nr_p7_request_in_window(req->SFN,req->Slot, "ul_tti_request", pnf_p7)) - { - uint32_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(req->SFN,req->Slot); - uint8_t buffer_index = (sfn_slot_dec % 20); - - struct timespec t; - clock_gettime(CLOCK_MONOTONIC, &t); - - NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE UL_TTI_REQ current tx sfn/slot:%d.%d p7 msg sfn/slot: %d.%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, pnf_p7->sfn,pnf_p7->slot, req->SFN, req->Slot, buffer_index); - - if(pnf_p7->slot_buffer[buffer_index].ul_tti_req != 0) - { - //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing ul_config_req at index %d (%d/%d)", - // pMyPhyInfo->sfnSf, bufferIdx, - // SFNSF2SFN(dreq->sfn_sf), SFNSF2SF(dreq->sfn_sf)); - - deallocate_nfapi_ul_tti_request(pnf_p7->slot_buffer[buffer_index].ul_tti_req, pnf_p7); - } - - //filling slot buffer - - pnf_p7->slot_buffer[buffer_index].sfn = req->SFN; - pnf_p7->slot_buffer[buffer_index].slot = req->Slot; - pnf_p7->slot_buffer[buffer_index].ul_tti_req = req; - - pnf_p7->stats.ul_tti_ontime++; - } - else - { - NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] NOT storing ul_tti_req OUTSIDE OF TRANSMIT BUFFER WINDOW SFN/SLOT %d\n", NFAPI_SFNSLOT2DEC(pnf_p7->sfn,pnf_p7->slot), NFAPI_SFNSLOT2DEC(req->SFN,req->Slot)); - deallocate_nfapi_ul_tti_request(req, pnf_p7); - - if(pnf_p7->_public.timing_info_mode_aperiodic) - { - pnf_p7->timing_info_aperiodic_send = 1; - } - - pnf_p7->stats.ul_tti_late++; - } - - if(pthread_mutex_unlock(&(pnf_p7->mutex)) != 0) - { - NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unlock mutex\n"); - return; - } - } - else - { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to unpack ul_tti_req\n"); - deallocate_nfapi_ul_tti_request(req, pnf_p7); - } + if (pthread_mutex_unlock(&(pnf_p7->mutex)) != 0) { + NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unlock mutex\n"); + return; + } + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to unpack ul_tti_req\n"); + } } void pnf_handle_ul_config_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7) @@ -1891,77 +1525,50 @@ void pnf_handle_ul_config_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_ } } - void pnf_handle_ul_dci_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7) { - //NFAPI_TRACE(NFAPI_TRACE_INFO, "HI_DCI0.req Received\n"); + uint16_t frame, slot; + if (peek_nr_nfapi_p7_sfn_slot(pRecvMsg, recvMsgLen, &frame, &slot)) { + if (pthread_mutex_lock(&(pnf_p7->mutex)) != 0) { + NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to lock mutex\n"); + return; + } + if (check_nr_nfapi_p7_slot_type(frame, slot, "UL_DCI.request", NR_DOWNLINK_SLOT) + && is_nr_p7_request_in_window(frame, slot, "ul_dci_request", pnf_p7)) { + uint32_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(pnf_p7->mu, frame, slot); + uint8_t buffer_index = sfn_slot_dec % NFAPI_SLOTNUM(pnf_p7->mu); + pnf_p7->slot_buffer[buffer_index].sfn = frame; + pnf_p7->slot_buffer[buffer_index].slot = slot; + nfapi_nr_ul_dci_request_t *req = &pnf_p7->slot_buffer[buffer_index].ul_dci_req; + pnf_p7->nr_stats.ul_dci.ontime++; - nfapi_nr_ul_dci_request_t* req = allocate_nfapi_ul_dci_request(pnf_p7); + NFAPI_TRACE(NFAPI_TRACE_DEBUG, + "POPULATE UL_DCI.request current tx sfn/slot:%d.%d p7 msg sfn/slot: %d.%d buffer_index:%d\n", + pnf_p7->sfn, + pnf_p7->slot, + frame, + slot, + buffer_index); - if(req == NULL) - { - NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to allocate nfapi_ul_dci_request structure\n"); - return; - } + if (nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, req, sizeof(*req), &pnf_p7->_public.codec_config) != 0) + NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unpack request\n"); + } else { + if (pnf_p7->_public.timing_info_mode_aperiodic) { + pnf_p7->timing_info_aperiodic_send = 1; + } - int unpack_result = nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, req, sizeof(nfapi_nr_ul_dci_request_t), &pnf_p7->_public.codec_config); + pnf_p7->nr_stats.ul_dci.late++; + } - if(unpack_result == 0) - { - if(pthread_mutex_lock(&(pnf_p7->mutex)) != 0) - { - NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to lock mutex\n"); - return; - } - - if(is_nr_p7_request_in_window(req->SFN,req->Slot,"ul_dci_request", pnf_p7)) - { - uint32_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(req->SFN,req->Slot); - uint8_t buffer_index = sfn_slot_dec % 20; - - if(pnf_p7->slot_buffer[buffer_index].ul_dci_req!= 0) - { - //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing hi_dci0_req at index %d (%d/%d)", - // pMyPhyInfo->sfnSf, bufferIdx, - // SFNSF2SFN(dreq->sfn_sf), SFNSF2SF(dreq->sfn_sf)); - - deallocate_nfapi_ul_dci_request(pnf_p7->slot_buffer[buffer_index].ul_dci_req, pnf_p7); - } - - pnf_p7->slot_buffer[buffer_index].sfn = req->SFN; - pnf_p7->slot_buffer[buffer_index].ul_dci_req = req; - - pnf_p7->stats.ul_dci_ontime++; - - } - else - { - //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] NOT storing hi_dci0_req SFN/SF %d/%d\n", pMyPhyInfo->sfnSf, SFNSF2SFN(req->sfn_sf), SFNSF2SF(req->sfn_sf)); - deallocate_nfapi_ul_dci_request(req, pnf_p7); - - if(pnf_p7->_public.timing_info_mode_aperiodic) - { - pnf_p7->timing_info_aperiodic_send = 1; - } - - pnf_p7->stats.ul_dci_late++; - } - - if(pthread_mutex_unlock(&(pnf_p7->mutex)) != 0) - { - NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unlock mutex\n"); - return; - } - } - else - { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to unpack UL DCI req\n"); - deallocate_nfapi_ul_dci_request(req, pnf_p7); - } + if (pthread_mutex_unlock(&(pnf_p7->mutex)) != 0) { + NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unlock mutex\n"); + return; + } + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to unpack UL DCI req\n"); + } } - - void pnf_handle_hi_dci0_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7) { @@ -2031,87 +1638,57 @@ void pnf_handle_hi_dci0_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7 } } - void pnf_handle_tx_data_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7) { - //NFAPI_TRACE(NFAPI_TRACE_INFO, "TX.req Received\n"); - - nfapi_nr_tx_data_request_t* req = allocate_nfapi_tx_data_request(pnf_p7); + uint16_t frame, slot; + if (peek_nr_nfapi_p7_sfn_slot(pRecvMsg, recvMsgLen, &frame, &slot)) { + if (pthread_mutex_lock(&(pnf_p7->mutex)) != 0) { + NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to lock mutex\n"); + return; + } + if (check_nr_nfapi_p7_slot_type(frame, slot, "TX_DATA.REQUEST", NR_DOWNLINK_SLOT) + && is_nr_p7_request_in_window(frame, slot, "tx_request", pnf_p7)) { + uint32_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(pnf_p7->mu, frame, slot); + uint8_t buffer_index = sfn_slot_dec % NFAPI_SLOTNUM(pnf_p7->mu); // TODO where is buffer length? + pnf_p7->slot_buffer[buffer_index].sfn = frame; + pnf_p7->slot_buffer[buffer_index].slot = slot; + nfapi_nr_tx_data_request_t *req = &pnf_p7->slot_buffer[buffer_index].tx_data_req; + pnf_p7->nr_stats.tx_data.ontime++; - if(req == NULL) - { - NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to allocate nfapi_tx_request structure\n"); - return; - } + NFAPI_TRACE(NFAPI_TRACE_DEBUG, + "POPULATE TX_data.request current tx sfn/slot:%d.%d p7 msg sfn/slot: %d.%d buffer_index:%d\n", + pnf_p7->sfn, + pnf_p7->slot, + frame, + slot, + buffer_index); - int unpack_result = nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, req, sizeof(nfapi_nr_tx_data_request_t), &pnf_p7->_public.codec_config); - if(unpack_result == 0) - { - if(pthread_mutex_lock(&(pnf_p7->mutex)) != 0) - { - NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to lock mutex\n"); - return; - } + if (nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, req, sizeof(*req), &pnf_p7->_public.codec_config) == 0) { + for (int i = 0; i < req->Number_of_PDUs; ++i) + pnf_p7->nr_stats.dl.bytes += req->pdu_list[i].PDU_length; + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "failed to unpack TX_data.request\n"); + } + } else { + NFAPI_TRACE(NFAPI_TRACE_INFO, + "TX_DATA_REQUEST Request is outside of window REQ:SFN_SLOT:%d.%d CURR:SFN_SLOT:%d.%d\n", + frame, slot, + pnf_p7->sfn, pnf_p7->slot); - if(is_nr_p7_request_in_window(req->SFN, req->Slot,"tx_request", pnf_p7)) - { - uint32_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(req->SFN,req->Slot); - uint8_t buffer_index = sfn_slot_dec % 20; + if (pnf_p7->_public.timing_info_mode_aperiodic) { + pnf_p7->timing_info_aperiodic_send = 1; + } - struct timespec t; - clock_gettime(CLOCK_MONOTONIC, &t); + pnf_p7->nr_stats.tx_data.late++; + } - //NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE TX_DATA_REQ sfn_sf:%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, sfn_slot_dec, buffer_index); -#if 0 - if (0 && NFAPI_SFNSF2DEC(req->sfn_sf)%100==0) NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() TX_REQ.req sfn_sf:%d pdus:%d - TX_REQ is within window\n", - __FUNCTION__, - NFAPI_SFNSF2DEC(req->sfn_sf), - req->tx_request_body.number_of_pdus); -#endif - - if(pnf_p7->slot_buffer[buffer_index].tx_data_req != 0) - { - //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing tx_req at index %d (%d/%d)", - // pMyPhyInfo->sfnSf, bufferIdx, - // SFNSF2SFN(dreq->sfn_sf), SFNSF2SF(dreq->sfn_sf)); - - deallocate_nfapi_tx_data_request(pnf_p7->slot_buffer[buffer_index].tx_data_req, pnf_p7); - } - - pnf_p7->slot_buffer[buffer_index].sfn = req->SFN; - pnf_p7->slot_buffer[buffer_index].slot = req->Slot; - pnf_p7->slot_buffer[buffer_index].tx_data_req = req; - - pnf_p7->stats.tx_data_ontime++; - } - else - { - NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() TX_DATA_REQUEST Request is outside of window REQ:SFN_SLOT:%d CURR:SFN_SLOT:%d\n", __FUNCTION__, NFAPI_SFNSLOT2DEC(req->SFN,req->Slot), NFAPI_SFNSLOT2DEC(pnf_p7->sfn,pnf_p7->slot)); - - deallocate_nfapi_tx_data_request(req, pnf_p7); - - if(pnf_p7->_public.timing_info_mode_aperiodic) - { - pnf_p7->timing_info_aperiodic_send = 1; - } - - pnf_p7->stats.tx_data_late++; - } - - if(pthread_mutex_unlock(&(pnf_p7->mutex)) != 0) - { - NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unlock mutex\n"); - return; - } - } - else - { - deallocate_nfapi_tx_data_request(req, pnf_p7); - } + if (pthread_mutex_unlock(&(pnf_p7->mutex)) != 0) { + NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unlock mutex\n"); + return; + } + } } - - void pnf_handle_tx_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7) { //NFAPI_TRACE(NFAPI_TRACE_INFO, "TX.req Received\n"); @@ -2374,18 +1951,17 @@ uint32_t calculate_t2(uint32_t now_time_hr, uint16_t sfn_sf, uint32_t sf_start_t return t2; } -uint32_t calculate_nr_t2(uint32_t now_time_hr, uint16_t sfn,uint16_t slot, uint32_t slot_start_time_hr) +static uint32_t calculate_nr_t2(uint32_t now_time_hr, int mu, uint16_t sfn,uint16_t slot, uint32_t slot_start_time_hr) { uint32_t slot_time_us = get_slot_time(now_time_hr, slot_start_time_hr); - uint32_t t2 = (NFAPI_SFNSLOT2DEC(sfn, slot) * 500) + slot_time_us; + uint32_t t2 = NFAPI_SFNSLOT2DEC(mu, sfn, slot) * NFAPI_SLOTLEN(mu) + slot_time_us; if (0) { static uint32_t prev_t2 = 0; - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(now_time_hr:%u sfn to slot:%d slot_start_time_Hr:%u) slot_time_us:%u t2:%u prev_t2:%u diff:%u\n", - __FUNCTION__, - now_time_hr, NFAPI_SFNSLOT2DEC(sfn, slot), slot_start_time_hr, + NFAPI_TRACE(NFAPI_TRACE_ERROR, "(now_time_hr:%u sfn.slot:%d.%d slot_start_time_Hr:%u) slot_time_us:%u t2:%u prev_t2:%u diff:%u\n", + now_time_hr, sfn, slot, slot_start_time_hr, slot_time_us, t2, prev_t2, @@ -2408,13 +1984,13 @@ uint32_t calculate_t3(uint16_t sfn_sf, uint32_t sf_start_time_hr) return t3; } -uint32_t calculate_nr_t3(uint16_t sfn, uint16_t slot, uint32_t slot_start_time_hr) +static uint32_t calculate_nr_t3(int mu, uint16_t sfn, uint16_t slot, uint32_t slot_start_time_hr) { uint32_t now_time_hr = pnf_get_current_time_hr(); uint32_t slot_time_us = get_slot_time(now_time_hr, slot_start_time_hr); - uint32_t t3 = (NFAPI_SFNSLOT2DEC(sfn, slot) * 500) + slot_time_us; + uint32_t t3 = NFAPI_SFNSLOT2DEC(mu, sfn, slot) * NFAPI_SLOTLEN(mu) + slot_time_us; return t3; } @@ -2510,8 +2086,8 @@ void pnf_nr_handle_dl_node_sync(void *pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7 ul_node_sync.header.message_id = NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC; ul_node_sync.header.phy_id = dl_node_sync.header.phy_id; ul_node_sync.t1 = dl_node_sync.t1; - ul_node_sync.t2 = calculate_nr_t2(rx_hr_time, pnf_p7->sfn,pnf_p7->slot, pnf_p7->slot_start_time_hr); - ul_node_sync.t3 = calculate_nr_t3(pnf_p7->sfn,pnf_p7->slot, pnf_p7->slot_start_time_hr); + ul_node_sync.t2 = calculate_nr_t2(rx_hr_time, pnf_p7->mu, pnf_p7->sfn,pnf_p7->slot, pnf_p7->slot_start_time_hr); + ul_node_sync.t3 = calculate_nr_t3(pnf_p7->mu, pnf_p7->sfn,pnf_p7->slot, pnf_p7->slot_start_time_hr); if(pthread_mutex_unlock(&(pnf_p7->mutex)) != 0) { @@ -2844,7 +2420,13 @@ void pnf_nr_handle_p7_message(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7, } } - pnf_p7_rx_reassembly_queue_remove_old_msgs(pnf_p7, &(pnf_p7->reassembly_queue), rx_hr_time, 1000); + // The timeout used to be 1000, i.e., 1ms, which is too short. The below 10ms + // is selected to be able to encompass any "reasonable" slot ahead time for the VNF. + // Ideally, we would remove old msg (segments) if we detect packet loss + // (e.g., if the sequence numbers advances sufficiently); in the branch of + // this commit, our goal is to make the PNF work, so we content ourselves to + // just remove very old messages. + pnf_p7_rx_reassembly_queue_remove_old_msgs(pnf_p7, &(pnf_p7->reassembly_queue), rx_hr_time, 10000); } diff --git a/nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c b/nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c index 9b78d80fd3..6e5569d972 100644 --- a/nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c +++ b/nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c @@ -21,14 +21,15 @@ nfapi_pnf_p7_config_t* nfapi_pnf_p7_config_create() { - pnf_p7_t* _this = (pnf_p7_t*)calloc(1, sizeof(pnf_p7_t)); + pnf_p7_t* _this = NULL; + int rc = posix_memalign((void**)&_this, 32, sizeof(pnf_p7_t)); - if(_this == 0) - return 0; + if (_this == NULL || rc != 0) + return 0; // set the default parameters - _this->_public.segment_size = 1400; + _this->_public.segment_size = 65000; // UDP max packet size is 65535 _this->max_num_segments = 8; _this->_public.subframe_buffer_size = 8;// TODO: Initialize the slot_buffer size @@ -271,7 +272,13 @@ int nfapi_pnf_p7_nr_rx_data_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_rx_data_ } pnf_p7_t* _this = (pnf_p7_t*)(config); - return pnf_nr_p7_pack_and_send_p7_message(_this, (nfapi_nr_p7_message_header_t*)ind, sizeof(nfapi_nr_rx_data_indication_t)); + + int ret = pnf_nr_p7_pack_and_send_p7_message(_this, (nfapi_nr_p7_message_header_t*)ind, sizeof(nfapi_nr_rx_data_indication_t)); + if (ret == 0) { + for (int i = 0; i < ind->number_of_pdus; ++i) + _this->nr_stats.ul.bytes += ind->pdu_list[i].pdu_length; + } + return ret; } int nfapi_pnf_p7_nr_crc_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_crc_indication_t* ind) diff --git a/nfapi/open-nFAPI/vnf/inc/vnf_p7.h b/nfapi/open-nFAPI/vnf/inc/vnf_p7.h index 31512124ac..3684997c22 100644 --- a/nfapi/open-nFAPI/vnf/inc/vnf_p7.h +++ b/nfapi/open-nFAPI/vnf/inc/vnf_p7.h @@ -91,6 +91,8 @@ typedef struct nfapi_vnf_p7_connection_info { int sfn_sf; int sfn; int slot; + int mu; // some 5G slot calculations need the numerology to know the number + // of slots int socket; struct sockaddr_in local_addr; diff --git a/nfapi/open-nFAPI/vnf/public_inc/nfapi_vnf_interface.h b/nfapi/open-nFAPI/vnf/public_inc/nfapi_vnf_interface.h index 30d1edfe32..77f0358e40 100644 --- a/nfapi/open-nFAPI/vnf/public_inc/nfapi_vnf_interface.h +++ b/nfapi/open-nFAPI/vnf/public_inc/nfapi_vnf_interface.h @@ -901,7 +901,6 @@ void nfapi_vnf_p7_config_destory(nfapi_vnf_p7_config_t* config); * This function is blocking and will not return until the nfapi_vnf_p7_stop * function is called. */ -extern queue_t gnb_slot_ind_queue; int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config); int nfapi_nr_vnf_p7_start(nfapi_vnf_p7_config_t* config); @@ -933,13 +932,14 @@ int nfapi_vnf_p7_release_pdu(nfapi_vnf_p7_config_t* config, void*); * \param pnf_p7_addr The udp address the pnf p7 entity has chosen * \param pnf_p7_port The udp port the pnf p7 entity has chosen * \param phy_id The unique phy id for the pnf p7 entity + * \param mu The subcarrier spacing the PNF is operating with. * \return A status value. 0 equal success, -1 indicates failure * * This function should be used to each pnf p7 entity that is to be added to this * vnf p7 entity. Once added the vnf p7 entity will start establish sync with the * pnf p7 entity and that has been sucessfull will generate subframe indications for it */ -int nfapi_vnf_p7_add_pnf(nfapi_vnf_p7_config_t* config, const char* pnf_p7_addr, int pnf_p7_port, int phy_id); +int nfapi_vnf_p7_add_pnf(nfapi_vnf_p7_config_t* config, const char* pnf_p7_addr, int pnf_p7_port, int phy_id, int mu); /*! Delete a vnf p7 instance to the vnf p7 module * \param config A pointer to the vnf p7 configuration diff --git a/nfapi/open-nFAPI/vnf/src/vnf.c b/nfapi/open-nFAPI/vnf/src/vnf.c index cf8a945264..390c4b15d9 100644 --- a/nfapi/open-nFAPI/vnf/src/vnf.c +++ b/nfapi/open-nFAPI/vnf/src/vnf.c @@ -93,20 +93,14 @@ nfapi_vnf_pnf_info_t* nfapi_vnf_pnf_list_find(nfapi_vnf_config_t* config, int p5 NFAPI_TRACE(NFAPI_TRACE_DEBUG, "config->pnf_list:%p\n", config->pnf_list); nfapi_vnf_pnf_info_t* curr = config->pnf_list; - while(curr != 0) - { - if(curr->p5_idx == p5_idx) - { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s : curr->p5_idx:%d p5_idx:%d\n", __FUNCTION__, curr->p5_idx, p5_idx); - return curr; - } + while (curr != 0) { + if (curr->p5_idx == p5_idx) + return curr; + curr = curr->next; + } + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(): could not find P5 connection for p5_idx %d\n", __func__, p5_idx); - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s : curr->next:%p\n", __FUNCTION__, curr->next); - - curr = curr->next; - } - - return 0; + return 0; } void vnf_nr_handle_pnf_param_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx) @@ -129,7 +123,9 @@ void vnf_nr_handle_pnf_param_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_ if(config->pnf_nr_param_resp) { (config->pnf_nr_param_resp)(config, p5_idx, &msg); - } + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(): no pnf_nr_param_resp cb installed\n", __func__); + } } else { @@ -162,7 +158,9 @@ void vnf_handle_pnf_param_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_con if(config->pnf_param_resp) { (config->pnf_param_resp)(config, p5_idx, &msg); - } + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(): no pnf_params_resp cb installed\n", __func__); + } } else { @@ -196,7 +194,9 @@ void vnf_nr_handle_pnf_config_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf if(config->pnf_nr_config_resp) { (config->pnf_nr_config_resp)(config, p5_idx, &msg); - } + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(): no pnf_nr_config_resp cb installed\n", __func__); + } } else { @@ -229,7 +229,9 @@ void vnf_handle_pnf_config_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_co if(config->pnf_config_resp) { (config->pnf_config_resp)(config, p5_idx, &msg); - } + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(): no pnf_config_resp cb installed\n", __func__); + } } else { @@ -261,7 +263,9 @@ void vnf_nr_handle_pnf_start_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_ if(config->pnf_nr_start_resp) { (config->pnf_nr_start_resp)(config, p5_idx, &msg); - } + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(): no pnf_nr_start_resp cb installed\n", __func__); + } } else { @@ -293,7 +297,9 @@ void vnf_handle_pnf_start_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_con if(config->pnf_start_resp) { (config->pnf_start_resp)(config, p5_idx, &msg); - } + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(): no pnf_start_resp cb installed\n", __func__); + } } else { @@ -325,7 +331,9 @@ void vnf_handle_pnf_stop_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_conf if(config->pnf_stop_resp) { (config->pnf_stop_resp)(config, p5_idx, &msg); - } + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(): no pnf_stop_resp cb installed\n", __func__); + } } else { @@ -565,7 +573,9 @@ void vnf_handle_start_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_ if(config->start_resp) { (config->start_resp)(config, p5_idx, &msg); - } + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(): no start_resp cb installed\n", __func__); + } } else { @@ -598,7 +608,9 @@ void vnf_nr_handle_start_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_conf if(config->nr_start_resp) { (config->nr_start_resp)(config, p5_idx, &msg); - } + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(): no nr_start_resp cb installed\n", __func__); + } } } else diff --git a/nfapi/open-nFAPI/vnf/src/vnf_p7.c b/nfapi/open-nFAPI/vnf/src/vnf_p7.c index e687121312..0caebd2130 100644 --- a/nfapi/open-nFAPI/vnf/src/vnf_p7.c +++ b/nfapi/open-nFAPI/vnf/src/vnf_p7.c @@ -89,16 +89,14 @@ void vnf_p7_connection_info_list_add(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_i nfapi_vnf_p7_connection_info_t* vnf_p7_connection_info_list_find(vnf_p7_t* vnf_p7, uint16_t phy_id) { nfapi_vnf_p7_connection_info_t* curr = vnf_p7->p7_connections; - while(curr != 0) - { - if(curr->phy_id == phy_id) - { - return curr; - } - curr = curr->next; - } + while (curr != 0) { + if (curr->phy_id == phy_id) + return curr; + curr = curr->next; + } + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(): could not find P7 connection for phy_id %d\n", __func__, phy_id); - return 0; + return 0; } nfapi_vnf_p7_connection_info_t* vnf_p7_connection_info_list_delete(vnf_p7_t* vnf_p7, uint16_t phy_id) @@ -243,7 +241,7 @@ void vnf_p7_rx_reassembly_queue_remove_old_msgs(vnf_p7_t* vnf_p7, vnf_p7_rx_reas previous->next = iterator->next; } - NFAPI_TRACE(NFAPI_TRACE_INFO, "Deleting stale reassembly message (%u %u %d)\n", iterator->rx_hr_time, rx_hr_time, delta); + NFAPI_TRACE(NFAPI_TRACE_WARN, "Deleting stale reassembly message (packet rx_hr_time %u current rx_hr_time %u delta %d us)\n", iterator->rx_hr_time, rx_hr_time, delta); vnf_p7_rx_message_t* to_delete = iterator; iterator = iterator->next; @@ -364,13 +362,13 @@ uint32_t calculate_t1(uint16_t sfn_sf, uint32_t sf_start_time_hr) return t1; } -uint32_t calculate_nr_t1(uint16_t sfn, uint16_t slot, uint32_t slot_start_time_hr) +uint32_t calculate_nr_t1(int mu, uint16_t sfn, uint16_t slot, uint32_t slot_start_time_hr) { uint32_t now_time_hr = vnf_get_current_time_hr(); uint32_t slot_time_us = get_slot_time(now_time_hr, slot_start_time_hr); - uint32_t t1 = (NFAPI_SFNSLOT2DEC(sfn,slot) * 500) + slot_time_us; + uint32_t t1 = NFAPI_SFNSLOT2DEC(mu, sfn,slot) * NFAPI_SLOTLEN(mu) + slot_time_us; return t1; } @@ -386,24 +384,24 @@ uint32_t calculate_t4(uint32_t now_time_hr, uint16_t sfn_sf, uint32_t sf_start_t } -uint32_t calculate_nr_t4(uint32_t now_time_hr, uint16_t sfn, uint16_t slot, uint32_t slot_start_time_hr) +uint32_t calculate_nr_t4(uint32_t now_time_hr, int mu, uint16_t sfn, uint16_t slot, uint32_t slot_start_time_hr) { uint32_t slot_time_us = get_slot_time(now_time_hr, slot_start_time_hr); - uint32_t t4 = (NFAPI_SFNSLOT2DEC(sfn,slot) * 500) + slot_time_us; + uint32_t t4 = NFAPI_SFNSLOT2DEC(mu, sfn,slot) * NFAPI_SLOTLEN(mu) + slot_time_us; return t4; } -uint32_t calculate_transmit_timestamp(uint16_t sfn, uint16_t slot, uint32_t slot_start_time_hr) +uint32_t calculate_transmit_timestamp(int mu, uint16_t sfn, uint16_t slot, uint32_t slot_start_time_hr) { uint32_t now_time_hr = vnf_get_current_time_hr(); uint32_t slot_time_us = get_slot_time(now_time_hr, slot_start_time_hr); - uint32_t tt = (NFAPI_SFNSLOT2DEC(sfn, slot) * 500) + slot_time_us; + uint32_t tt = NFAPI_SFNSLOT2DEC(mu, sfn, slot) * NFAPI_SLOTLEN(mu) + slot_time_us; return tt; } @@ -509,7 +507,7 @@ int vnf_nr_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_nr_p7_message_header_ int segment = 0; int offset = NFAPI_NR_P7_HEADER_LENGTH; uint8_t tx_buffer[vnf_p7->_public.segment_size]; - NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() MORE THAN ONE SEGMENT phy_id:%d nfapi_p7_message_pack()=len=%d vnf_p7->_public.segment_size:%u\n", __FUNCTION__, header->phy_id, len, vnf_p7->_public.segment_size); + NFAPI_TRACE(NFAPI_TRACE_DEBUG, "%s() MORE THAN ONE SEGMENT phy_id:%d nfapi_p7_message_pack()=len=%d vnf_p7->_public.segment_size:%u\n", __FUNCTION__, header->phy_id, len, vnf_p7->_public.segment_size); for(segment = 0; segment < segment_count; ++segment) { uint8_t last = 0; @@ -540,7 +538,7 @@ int vnf_nr_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_nr_p7_message_header_ nfapi_nr_p7_update_checksum(tx_buffer, segment_size); } - nfapi_nr_p7_update_transmit_timestamp(buffer, calculate_transmit_timestamp(p7_connection->sfn, p7_connection->slot, vnf_p7->slot_start_time_hr)); + nfapi_nr_p7_update_transmit_timestamp(buffer, calculate_transmit_timestamp(p7_connection->mu, p7_connection->sfn, p7_connection->slot, vnf_p7->slot_start_time_hr)); send_result = vnf_send_p7_msg(vnf_p7, p7_connection, &tx_buffer[0], segment_size); @@ -553,7 +551,7 @@ int vnf_nr_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_nr_p7_message_header_ nfapi_nr_p7_update_checksum(buffer, len); } - nfapi_nr_p7_update_transmit_timestamp(buffer, calculate_transmit_timestamp(p7_connection->sfn, p7_connection->slot, vnf_p7->slot_start_time_hr)); + nfapi_nr_p7_update_transmit_timestamp(buffer, calculate_transmit_timestamp(p7_connection->mu, p7_connection->sfn, p7_connection->slot, vnf_p7->slot_start_time_hr)); // simple case that the message fits in a single segement send_result = vnf_send_p7_msg(vnf_p7, p7_connection, &buffer[0], len); @@ -634,7 +632,7 @@ int vnf_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t* hea nfapi_p7_update_checksum(tx_buffer, segment_size); } - nfapi_p7_update_transmit_timestamp(buffer, calculate_transmit_timestamp(p7_connection->sfn, p7_connection->slot, vnf_p7->slot_start_time_hr)); + nfapi_p7_update_transmit_timestamp(buffer, calculate_transmit_timestamp(p7_connection->mu, p7_connection->sfn, p7_connection->slot, vnf_p7->slot_start_time_hr)); send_result = vnf_send_p7_msg(vnf_p7, p7_connection, &tx_buffer[0], segment_size); } @@ -646,7 +644,7 @@ int vnf_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t* hea nfapi_p7_update_checksum(buffer, len); } - nfapi_p7_update_transmit_timestamp(buffer, calculate_transmit_timestamp(p7_connection->sfn, p7_connection->slot, vnf_p7->slot_start_time_hr)); + nfapi_p7_update_transmit_timestamp(buffer, calculate_transmit_timestamp(p7_connection->mu, p7_connection->sfn, p7_connection->slot, vnf_p7->slot_start_time_hr)); // simple case that the message fits in a single segement send_result = vnf_send_p7_msg(vnf_p7, p7_connection, &buffer[0], len); @@ -683,7 +681,7 @@ int vnf_nr_build_send_dl_node_sync(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_inf dl_node_sync.header.phy_id = p7_info->phy_id; dl_node_sync.header.message_id = NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC; //dl_node_sync.t1 = calculate_t1(p7_info->sfn_sf, vnf_p7->sf_start_time_hr); - dl_node_sync.t1 = calculate_nr_t1(p7_info->sfn,p7_info->slot, vnf_p7->slot_start_time_hr); + dl_node_sync.t1 = calculate_nr_t1(p7_info->mu, p7_info->sfn,p7_info->slot, vnf_p7->slot_start_time_hr); dl_node_sync.delta_sfn_slot = 0; return vnf_nr_p7_pack_and_send_p7_msg(vnf_p7, &dl_node_sync.header); @@ -695,11 +693,9 @@ int vnf_nr_sync(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t* p7_info) if(p7_info->in_sync == 1) { uint16_t dl_sync_period_mask = p7_info->dl_in_sync_period-1; - // uint16_t sfn_sf_dec = NFAPI_SFNSF2DEC(p7_info->sfn_sf); - uint16_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(p7_info->sfn,p7_info->slot); + uint16_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(p7_info->mu, p7_info->sfn,p7_info->slot); - //if ((((sfn_sf_dec + p7_info->dl_in_sync_offset) % NFAPI_MAX_SFNSFDEC) & dl_sync_period_mask) == 0) - if ((((sfn_slot_dec + p7_info->dl_in_sync_offset) % NFAPI_MAX_SFNSLOTDEC) & dl_sync_period_mask) == 0) + if ((((sfn_slot_dec + p7_info->dl_in_sync_offset) % NFAPI_MAX_SFNSLOTDEC(p7_info->mu)) & dl_sync_period_mask) == 0) { vnf_nr_build_send_dl_node_sync(vnf_p7, p7_info); } @@ -708,10 +704,9 @@ int vnf_nr_sync(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t* p7_info) { uint16_t dl_sync_period_mask = p7_info->dl_out_sync_period-1; //uint16_t sfn_sf_dec = NFAPI_SFNSF2DEC(p7_info->sfn_sf); - uint16_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(p7_info->sfn, p7_info->slot); + uint16_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(p7_info->mu, p7_info->sfn, p7_info->slot); - //if ((((sfn_sf_dec + p7_info->dl_out_sync_offset) % NFAPI_MAX_SFNSFDEC) & dl_sync_period_mask) == 0) - if ((((sfn_slot_dec + p7_info->dl_out_sync_offset) % NFAPI_MAX_SFNSLOTDEC) & dl_sync_period_mask) == 0) + if ((((sfn_slot_dec + p7_info->dl_out_sync_offset) % NFAPI_MAX_SFNSLOTDEC(p7_info->mu)) & dl_sync_period_mask) == 0) { vnf_nr_build_send_dl_node_sync(vnf_p7, p7_info); } @@ -1499,7 +1494,7 @@ void vnf_handle_nr_slot_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf } else { - nfapi_nr_slot_indication_scf_t ind; + nfapi_nr_slot_indication_scf_t ind = {0}; if(nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0) { @@ -1534,7 +1529,7 @@ void vnf_handle_nr_rx_data_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* } else { - NFAPI_TRACE(NFAPI_TRACE_INFO, "%s: Handling RX Indication\n", __FUNCTION__); + NFAPI_TRACE(NFAPI_TRACE_DEBUG, "%s: Handling RX Indication\n", __FUNCTION__); if(vnf_p7->_public.nr_rx_data_indication) { (vnf_p7->_public.nr_rx_data_indication)(&ind); @@ -1561,7 +1556,7 @@ void vnf_handle_nr_crc_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_ } else { - NFAPI_TRACE(NFAPI_TRACE_INFO, "%s: Handling CRC Indication\n", __FUNCTION__); + NFAPI_TRACE(NFAPI_TRACE_DEBUG, "%s: Handling CRC Indication\n", __FUNCTION__); if(vnf_p7->_public.nr_crc_indication) { (vnf_p7->_public.nr_crc_indication)(&ind); @@ -1614,7 +1609,7 @@ void vnf_handle_nr_uci_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_ } else { - NFAPI_TRACE(NFAPI_TRACE_INFO, "%s: Handling UCI Indication\n", __FUNCTION__); + NFAPI_TRACE(NFAPI_TRACE_DEBUG, "%s: Handling UCI Indication\n", __FUNCTION__); if(vnf_p7->_public.nr_uci_indication) { (vnf_p7->_public.nr_uci_indication)(&ind); @@ -1673,9 +1668,9 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7 //NFAPI_TRACE(NFAPI_TRACE_INFO, "Received UL_NODE_SYNC phy_id:%d t1:%d t2:%d t3:%d\n", ind.header.phy_id, ind.t1, ind.t2, ind.t3); nfapi_vnf_p7_connection_info_t* phy = vnf_p7_connection_info_list_find(vnf_p7, ind.header.phy_id); - uint32_t t4 = calculate_nr_t4(now_time_hr, phy->sfn, phy->slot, vnf_p7->slot_start_time_hr); + uint32_t t4 = calculate_nr_t4(now_time_hr, phy->mu, phy->sfn, phy->slot, vnf_p7->slot_start_time_hr); - uint32_t tx_2_rx = t4>ind.t1 ? t4 - ind.t1 : t4 + NFAPI_MAX_SFNSLOTDEC - ind.t1 ; //time taken to receive ul node sync - time taken to send dl node sync + uint32_t tx_2_rx = t4>ind.t1 ? t4 - ind.t1 : t4 + NFAPI_MAX_SFNSLOTDEC(phy->mu) - ind.t1 ; //time taken to receive ul node sync - time taken to send dl node sync uint32_t pnf_proc_time = ind.t3 - ind.t2; // divide by 2 using shift operator @@ -1700,12 +1695,12 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7 if (ind.t2 < phy->previous_t2 && ind.t1 > phy->previous_t1) { // Only t2 wrap has occurred!!! - phy->slot_offset = (NFAPI_MAX_SFNSLOTDEC + ind.t2) - ind.t1 - latency; + phy->slot_offset = (NFAPI_MAX_SFNSLOTDEC(phy->mu) + ind.t2) - ind.t1 - latency; } else if (ind.t2 > phy->previous_t2 && ind.t1 < phy->previous_t1) { // Only t1 wrap has occurred - phy->slot_offset = ind.t2 - ( ind.t1 + NFAPI_MAX_SFNSLOTDEC) - latency; + phy->slot_offset = ind.t2 - ( ind.t1 + NFAPI_MAX_SFNSLOTDEC(phy->mu)) - latency; } else { @@ -1757,7 +1752,7 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7 { uint32_t curr_sfn = phy->sfn; uint32_t curr_slot = phy->slot; - int32_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(phy->sfn,phy->slot); + int32_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(phy->mu, phy->sfn,phy->slot); if(!phy->filtered_adjust) { @@ -1774,7 +1769,7 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7 sfn_slot_dec += (phy->slot_offset / 500); - NFAPI_TRACE(NFAPI_TRACE_NOTE, "PNF to VNF slot offset:%d sfn :%d slot:%d \n",phy->slot_offset,NFAPI_SFNSLOTDEC2SFN(sfn_slot_dec),NFAPI_SFNSLOTDEC2SLOT(sfn_slot_dec) ); + NFAPI_TRACE(NFAPI_TRACE_NOTE, "PNF to VNF slot offset:%d sfn :%d slot:%d \n",phy->slot_offset,NFAPI_SFNSLOTDEC2SFN(phy->mu, sfn_slot_dec),NFAPI_SFNSLOTDEC2SLOT(phy->mu, sfn_slot_dec) ); } @@ -1786,19 +1781,19 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7 if(sfn_slot_dec < 0) { - sfn_slot_dec += NFAPI_MAX_SFNSLOTDEC; + sfn_slot_dec += NFAPI_MAX_SFNSLOTDEC(phy->mu); } - else if( sfn_slot_dec >= NFAPI_MAX_SFNSLOTDEC) + else if( sfn_slot_dec >= NFAPI_MAX_SFNSLOTDEC(phy->mu)) { - sfn_slot_dec -= NFAPI_MAX_SFNSLOTDEC; + sfn_slot_dec -= NFAPI_MAX_SFNSLOTDEC(phy->mu); } - uint16_t new_sfn = NFAPI_SFNSLOTDEC2SFN(sfn_slot_dec); - uint16_t new_slot = NFAPI_SFNSLOTDEC2SLOT(sfn_slot_dec); + uint16_t new_sfn = NFAPI_SFNSLOTDEC2SFN(phy->mu, sfn_slot_dec); + uint16_t new_slot = NFAPI_SFNSLOTDEC2SLOT(phy->mu, sfn_slot_dec); { - phy->adjustment = NFAPI_SFNSLOT2DEC(new_sfn, new_slot) - NFAPI_SFNSLOT2DEC(curr_sfn, curr_slot); + phy->adjustment = NFAPI_SFNSLOT2DEC(phy->mu, new_sfn, new_slot) - NFAPI_SFNSLOT2DEC(phy->mu, curr_sfn, curr_slot); //NFAPI_TRACE(NFAPI_TRACE_NOTE, "PNF to VNF phy_id:%d adjustment%d phy->previous_slot_offset_filtered:%d phy->previous_slot_offset_filtered:%d phy->slot_offset_trend:%d\n", ind.header.phy_id, phy->adjustment, phy->previous_slot_offset_filtered, phy->previous_slot_offset_filtered, phy->slot_offset_trend); @@ -1906,15 +1901,24 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7 if(phy->insync_minor_adjustment != 0) { - // NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d slots (slot_offset_filtered:%d) %d %d %d NEW:%d CURR:%d adjustment:%d\n", - // phy->sfn, phy->slot, ind.header.phy_id, - // phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration, - // phy->slot_offset_filtered, - // insync_minor_adjustment_1, insync_minor_adjustment_2, phy->slot_offset_trend, - // NFAPI_SFNSLOT2DEC(new_sfn, new_slot), - // NFAPI_SFNSLOT2DEC(curr_sfn, curr_slot), - // phy->adjustment); - } + NFAPI_TRACE(NFAPI_TRACE_DEBUG, + "(%4d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d slots (slot_offset_filtered:%d) %d %d " + "%d NEW:%d.%d CURR:%d.%d adjustment:%d\n", + phy->sfn, + phy->slot, + ind.header.phy_id, + phy->insync_minor_adjustment, + phy->insync_minor_adjustment_duration, + phy->slot_offset_filtered, + insync_minor_adjustment_1, + insync_minor_adjustment_2, + phy->slot_offset_trend, + new_sfn, + new_slot, + curr_sfn, + curr_slot, + phy->adjustment); + } } } else @@ -1948,16 +1952,27 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7 { // out of sync? } - - // NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d slots (adjustment:%d slot_offset_filtered:%d) %d %d %d NEW:%d CURR:%d adj:%d\n", - // phy->sfn, phy->slot, ind.header.phy_id, - // phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration, phy->adjustment, phy->slot_offset_filtered, - // insync_minor_adjustment_1, insync_minor_adjustment_2, phy->slot_offset_trend, - // NFAPI_SFNSLOT2DEC(new_sfn, new_slot), - // NFAPI_SFNSLOT2DEC(curr_sfn, curr_slot), - // phy->adjustment); - - } + + NFAPI_TRACE(NFAPI_TRACE_DEBUG, + "(%4d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d slots (adjustment:%d " + "slot_offset_filtered:%d) %d %d %d NEW:%d.%d CURR:%d.%d adj:%d\n", + phy->sfn, + phy->slot, + ind.header.phy_id, + phy->insync_minor_adjustment, + phy->insync_minor_adjustment_duration, + phy->adjustment, + phy->slot_offset_filtered, + insync_minor_adjustment_1, + insync_minor_adjustment_2, + phy->slot_offset_trend, + new_sfn, + new_slot, + curr_sfn, + curr_slot, + phy->adjustment); + + } else if(phy->adjustment < 0) { // VNF is fast @@ -2088,15 +2103,16 @@ void vnf_nr_handle_timing_info(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) if (vnf_p7 && vnf_p7->p7_connections) { //int16_t vnf_pnf_sfnsf_delta = NFAPI_SFNSF2DEC(vnf_p7->p7_connections[0].sfn_sf) - NFAPI_SFNSF2DEC(ind.last_sfn_sf); - vnf_pnf_sfnslot_delta = NFAPI_SFNSLOT2DEC(vnf_p7->p7_connections[0].sfn,vnf_p7->p7_connections[0].slot) - NFAPI_SFNSLOT2DEC(ind.last_sfn,ind.last_slot); + nfapi_vnf_p7_connection_info_t *p7_con = &vnf_p7->p7_connections[0]; + vnf_pnf_sfnslot_delta = NFAPI_SFNSLOT2DEC(p7_con->mu, p7_con->sfn,p7_con->slot) - NFAPI_SFNSLOT2DEC(p7_con->mu, ind.last_sfn,ind.last_slot); //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() PNF:SFN/SF:%d VNF:SFN/SF:%d deltaSFNSF:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(ind.last_sfn_sf), NFAPI_SFNSF2DEC(vnf_p7->p7_connections[0].sfn_sf), vnf_pnf_sfnsf_delta); // Panos: Careful here!!! Modification of the original nfapi-code //if (vnf_pnf_sfnsf_delta>1 || vnf_pnf_sfnsf_delta < -1) //printf("VNF-PNF delta - %d", vnf_pnf_sfnslot_delta); - if (vnf_pnf_sfnslot_delta != 0) + if (vnf_pnf_sfnslot_delta > 1) // we need to have a small delta, otherwise it would mean we don't advance { - NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() LARGE SFN/SLOT DELTA between PNF and VNF. Delta %d. PNF:%d.%d VNF:%d.%d\n\n\n\n\n\n\n\n\n", + NFAPI_TRACE(NFAPI_TRACE_WARN, "%s() LARGE SFN/SLOT DELTA between PNF and VNF. Delta %d slots. PNF:%d.%d VNF:%d.%d\n", __FUNCTION__, vnf_pnf_sfnslot_delta, ind.last_sfn, ind.last_slot, vnf_p7->p7_connections[0].sfn, vnf_p7->p7_connections[0].slot); @@ -2507,7 +2523,8 @@ void vnf_nr_handle_p7_message(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) vnf_p7_rx_reassembly_queue_remove_msg(vnf_p7, &(phy->reassembly_queue), rx_msg); } - vnf_p7_rx_reassembly_queue_remove_old_msgs(vnf_p7, &(phy->reassembly_queue), 1000); + // see corresponding comment in pnf_nr_handle_p7_message() [same commit] + vnf_p7_rx_reassembly_queue_remove_old_msgs(vnf_p7, &(phy->reassembly_queue), 10000); } else { diff --git a/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c b/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c index a883ccf4a2..d3160f4e30 100644 --- a/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c +++ b/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c @@ -42,7 +42,7 @@ nfapi_vnf_p7_config_t* nfapi_vnf_p7_config_create() return 0; // todo : initialize - _this->_public.segment_size = 1400; + _this->_public.segment_size = 65000; // UDP max packet size is 65535 _this->_public.max_num_segments = 8; _this->_public.checksum_enabled = 1; @@ -98,8 +98,6 @@ struct timespec timespec_sub(struct timespec lhs, struct timespec rhs) // send indications to mac int nfapi_nr_vnf_p7_start(nfapi_vnf_p7_config_t* config) { - struct PHY_VARS_gNB_s *gNB = RC.gNB[0]; - uint8_t prev_slot = 0; if(config == 0) return -1; @@ -157,7 +155,6 @@ int nfapi_nr_vnf_p7_start(nfapi_vnf_p7_config_t* config) struct timespec ref_time; clock_gettime(CLOCK_MONOTONIC, &ref_time); - uint8_t setup_done; while(vnf_p7->terminate == 0) { fd_set rfds; @@ -169,39 +166,6 @@ int nfapi_nr_vnf_p7_start(nfapi_vnf_p7_config_t* config) FD_SET(vnf_p7->socket, &rfds); maxSock = vnf_p7->socket; - if (setup_done == 0) { - struct timespec curr_time; - clock_gettime(CLOCK_MONOTONIC, &curr_time); - uint8_t setup_time = curr_time.tv_sec - ref_time.tv_sec; - if (setup_time > 3) { - setup_done = 1; - } - } - - nfapi_nr_slot_indication_scf_t *slot_ind = get_queue(&gnb_slot_ind_queue); - NFAPI_TRACE(NFAPI_TRACE_DEBUG, "This is the slot_ind queue size %ld in %s():%d\n", - gnb_slot_ind_queue.num_items, __FUNCTION__, __LINE__); - if (slot_ind) { - NR_UL_IND_t UL_INFO = {.frame = slot_ind->sfn, .slot = slot_ind->slot}; - - NFAPI_TRACE(NFAPI_TRACE_DEBUG, "UL_INFO.frame = %d and slot %d, prev_slot = %d\n", UL_INFO.frame, UL_INFO.slot, prev_slot); - if (setup_done && prev_slot != UL_INFO.slot) { // Give the VNF sufficient time to setup before starting scheduling && - // prev_slot != UL_INFO.slot - - // Call the scheduler - UL_INFO.module_id = gNB->Mod_id; - UL_INFO.CC_id = gNB->CC_id; - NFAPI_TRACE(NFAPI_TRACE_DEBUG, - "Calling NR_UL_indication for UL_INFO.frame = %d and slot %d\n", - UL_INFO.frame, - UL_INFO.slot); - gNB->if_inst->NR_UL_indication(&UL_INFO); - prev_slot = UL_INFO.slot; - } - free(slot_ind); - slot_ind = NULL; - } - selectRetval = pselect(maxSock+1, &rfds, NULL, NULL, &pselect_timeout, NULL); if(selectRetval == 0) @@ -570,7 +534,7 @@ int nfapi_vnf_p7_stop(nfapi_vnf_p7_config_t* config) return 0; } -int nfapi_vnf_p7_add_pnf(nfapi_vnf_p7_config_t* config, const char* pnf_p7_addr, int pnf_p7_port, int phy_id) +int nfapi_vnf_p7_add_pnf(nfapi_vnf_p7_config_t* config, const char* pnf_p7_addr, int pnf_p7_port, int phy_id, int mu) { NFAPI_TRACE(NFAPI_TRACE_INFO, "%s(config:%p phy_id:%d pnf_addr:%s pnf_p7_port:%d)\n", __FUNCTION__, config, phy_id, pnf_p7_addr, pnf_p7_port); @@ -594,6 +558,7 @@ int nfapi_vnf_p7_add_pnf(nfapi_vnf_p7_config_t* config, const char* pnf_p7_addr, node->sfn = 0; node->slot = 0; node->min_sync_cycle_count = 8; + node->mu = mu; // save the remote endpoint information node->remote_addr.sin_family = AF_INET; diff --git a/nfapi/open-nFAPI/vnf/tests/vnf_cunit_main.c b/nfapi/open-nFAPI/vnf/tests/vnf_cunit_main.c index 4df5da7c26..0b951047da 100644 --- a/nfapi/open-nFAPI/vnf/tests/vnf_cunit_main.c +++ b/nfapi/open-nFAPI/vnf/tests/vnf_cunit_main.c @@ -769,7 +769,7 @@ int start_response(nfapi_vnf_config_t* config, int p5_idx, nfapi_start_response_ vnf_test_config_vnf_t* vnf = &(vnf_test_config[0].vnfs[phy->vnf_idx]); - nfapi_vnf_p7_add_pnf(vnf->config, addr, port, response->header.phy_id); + nfapi_vnf_p7_add_pnf(vnf->config, addr, port, response->header.phy_id, 0); return 0; } diff --git a/nfapi/open-nfapi.oai.patch b/nfapi/open-nfapi.oai.patch deleted file mode 100644 index 5b91e3675b..0000000000 --- a/nfapi/open-nfapi.oai.patch +++ /dev/null @@ -1,20010 +0,0 @@ -diff --git a/common/public_inc/debug.h b/common/public_inc/debug.h -index 05e9870..14f97a1 100644 ---- a/common/public_inc/debug.h -+++ b/common/public_inc/debug.h -@@ -39,7 +39,8 @@ extern nfapi_trace_fn_t nfapi_trace_g; - extern nfapi_trace_level_t nfapi_trace_level_g; - - /*! NFAPI trace macro */ --#define NFAPI_TRACE(level, format, ...) { if(nfapi_trace_g && ((nfapi_trace_level_t)level <= nfapi_trace_level_g)) (*nfapi_trace_g)(level, format, ##__VA_ARGS__); } -+//#define NFAPI_TRACE(level, format, ...) { if(nfapi_trace_g && ((nfapi_trace_level_t)level <= nfapi_trace_level_g)) (*nfapi_trace_g)(level, format, ##__VA_ARGS__); } -+#define NFAPI_TRACE(level, format, ...) { if (nfapi_trace_g) (*nfapi_trace_g)(level, format, ##__VA_ARGS__); } - - /*! Function to change the trace level - * \param new_level The modified trace level -diff --git a/nfapi/public_inc/nfapi_interface.h b/nfapi/public_inc/nfapi_interface.h -index 2d58c2a..f665d11 100644 ---- a/nfapi/public_inc/nfapi_interface.h -+++ b/nfapi/public_inc/nfapi_interface.h -@@ -1772,7 +1772,7 @@ typedef struct { - uint8_t number_of_cc; - struct { - uint8_t ri_size; -- uint8_t dl_cqi_pmi_size; -+ uint8_t dl_cqi_pmi_size[8]; - } cc[NFAPI_MAX_CC]; - } nfapi_ul_config_aperiodic_cqi_pmi_ri_report_t; - -diff --git a/nfapi/src/nfapi.c b/nfapi/src/nfapi.c -index 0e06963..3f017bc 100644 ---- a/nfapi/src/nfapi.c -+++ b/nfapi/src/nfapi.c -@@ -823,6 +823,10 @@ uint8_t pack_tlv(uint16_t tag, void *tlv, uint8_t **ppWritePackedMsg, uint8_t *e - { - NFAPI_TRACE(NFAPI_TRACE_WARN, "Warning pack_tlv tag 0x%x does not match expected 0x%x\n", tl->tag, tag); - } -+ else -+ { -+ //NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning pack_tlv tag 0x%x ZERO does not match expected 0x%x\n", tl->tag, tag); -+ } - } - - return 1; -diff --git a/nfapi/src/nfapi_p7.c b/nfapi/src/nfapi_p7.c -index a3b0141..69ff860 100644 ---- a/nfapi/src/nfapi_p7.c -+++ b/nfapi/src/nfapi_p7.c -@@ -111,6 +111,8 @@ static uint8_t pack_dl_config_dci_dl_pdu_rel8_value(void* tlv, uint8_t **ppWrite - { - nfapi_dl_config_dci_dl_pdu_rel8_t* value = (nfapi_dl_config_dci_dl_pdu_rel8_t*)tlv; - -+ //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() dci_format:%u\n", __FUNCTION__, value->dci_format); -+ - return ( push8(value->dci_format, ppWritePackedMsg, end) && - push8(value->cce_idx, ppWritePackedMsg, end) && - push8(value->aggregation_level, ppWritePackedMsg, end) && -@@ -234,6 +236,8 @@ static uint8_t pack_dl_config_bch_pdu_rel8_value(void* tlv, uint8_t **ppWritePac - { - nfapi_dl_config_bch_pdu_rel8_t* value = (nfapi_dl_config_bch_pdu_rel8_t*)tlv; - -+ //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s()\n", __FUNCTION__); -+ - return( push16(value->length, ppWritePackedMsg, end) && - push16(value->pdu_index, ppWritePackedMsg, end) && - push16(value->transmission_power, ppWritePackedMsg, end)); -@@ -545,6 +549,8 @@ static uint8_t pack_dl_config_request_body_value(void* tlv, uint8_t **ppWritePac - { - nfapi_dl_config_request_body_t* value = (nfapi_dl_config_request_body_t*)tlv; - -+ //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() dci:%u pdu:%u pdsch:%u rnti:%u pcfich:%u\n", __FUNCTION__, value->number_dci, value->number_pdu, value->number_pdsch_rnti, value->transmission_power_pcfich); -+ - if(!(push8(value->number_pdcch_ofdm_symbols, ppWritePackedMsg, end) && - push8(value->number_dci, ppWritePackedMsg, end) && - push16(value->number_pdu, ppWritePackedMsg, end) && -@@ -574,6 +580,8 @@ static uint8_t pack_dl_config_request_body_value(void* tlv, uint8_t **ppWritePac - { - case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE: - { -+ //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE\n", __FUNCTION__); -+ - if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel8_value) && - pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL9_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel9_value) && - pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL10_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel10_value) && -@@ -587,6 +595,8 @@ static uint8_t pack_dl_config_request_body_value(void* tlv, uint8_t **ppWritePac - break; - case NFAPI_DL_CONFIG_BCH_PDU_TYPE: - { -+ //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() NFAPI_DL_CONFIG_BCH_PDU_TYPE\n", __FUNCTION__); -+ - if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_BCH_PDU_REL8_TAG, &pdu->bch_pdu.bch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_bch_pdu_rel8_value))) - return 0; - } -@@ -684,10 +694,21 @@ static uint8_t pack_dl_config_request(void *msg, uint8_t **ppWritePackedMsg, uin - { - nfapi_dl_config_request_t *pNfapiMsg = (nfapi_dl_config_request_t*)msg; - -- return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) && -- pack_tlv(NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, ppWritePackedMsg, end, &pack_dl_config_request_body_value) && -- pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); -+ //return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) && -+ //pack_tlv(NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, ppWritePackedMsg, end, &pack_dl_config_request_body_value) && -+ //pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); -+ { -+ uint8_t x = push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end); -+ uint8_t y = pack_tlv(NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, ppWritePackedMsg, end, &pack_dl_config_request_body_value); -+ uint8_t z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config); - -+ if (!x || !y || !z) -+ { -+ NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() NFAPI_DL_CONFIG_REQUEST x:%u y:%u z:%u \n", __FUNCTION__,x,y,z); -+ } -+ -+ return x && y && z; -+ } - } - - static uint8_t pack_ul_config_request_ulsch_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t * end) -@@ -796,9 +817,10 @@ static uint8_t pack_ul_config_request_cqi_ri_rel9_value(void *tlv, uint8_t **ppW - if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size, ppWritePackedMsg, end) == 0) - return 0; - -- if(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size > 0) -+ uint8_t j; -+ for(j = 0; j < 8; ++j) - { -- if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].dl_cqi_pmi_size, ppWritePackedMsg, end) == 0) -+ if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].dl_cqi_pmi_size[j], ppWritePackedMsg, end) == 0) - return 0; - } - } -@@ -1518,7 +1540,21 @@ static uint8_t pack_tx_request_body_value(void* tlv, uint8_t **ppWritePackedMsg, - for(j = 0; j < pdu->num_segments; ++j) - { - // Use -1 as it is unbounded -- if(pusharray8(pdu->segments[j].segment_data, (uint32_t)(-1), pdu->segments[j].segment_length, ppWritePackedMsg, end) == 0) -+ // DJP - does not handle -1 -+ // DJP - if(pusharray8(pdu->segments[j].segment_data, (uint32_t)(-1), pdu->segments[j].segment_length, ppWritePackedMsg, end) == 0) -+ int push_ret = pusharray8(pdu->segments[j].segment_data, 65535, pdu->segments[j].segment_length, ppWritePackedMsg, end); -+ -+ if (0 && pdu->segments[j].segment_length == 3) -+ { -+ NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() BCH? segment_data:%x %x %x\n", __FUNCTION__, -+ pdu->segments[j].segment_data[0], -+ pdu->segments[j].segment_data[1], -+ pdu->segments[j].segment_data[2] -+ ); -+ } -+ //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() segment_data:%p segment_length:%u pusharray8()=%d\n", __FUNCTION__, pdu->segments[j].segment_data, pdu->segments[j].segment_length, push_ret); -+ -+ if (push_ret == 0) - { - return 0; - } -@@ -1532,9 +1568,13 @@ static uint8_t pack_tx_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *e - { - nfapi_tx_request_t *pNfapiMsg = (nfapi_tx_request_t*)msg; - -- return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) && -- pack_tlv(NFAPI_TX_REQUEST_BODY_TAG, &pNfapiMsg->tx_request_body, ppWritePackedMsg, end, &pack_tx_request_body_value) && -- pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); -+ int x = push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end); -+ int y = pack_tlv(NFAPI_TX_REQUEST_BODY_TAG, &pNfapiMsg->tx_request_body, ppWritePackedMsg, end, &pack_tx_request_body_value); -+ int z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config); -+ -+ //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() x:%d y:%d z:%d\n", __FUNCTION__, x, y, z); -+ -+ return x && y && z; - } - - static uint8_t pack_rx_ue_information_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) -@@ -1844,6 +1884,8 @@ static uint8_t pack_rx_ulsch_indication_body_value(void *tlv, uint8_t **ppWriteP - { - nfapi_rx_indication_body_t* value = (nfapi_rx_indication_body_t*)tlv; - -+ //printf("RX ULSCH BODY\n"); -+ - if( push16(value->number_of_pdus, ppWritePackedMsg, end) == 0) - return 0; - -@@ -1851,21 +1893,26 @@ static uint8_t pack_rx_ulsch_indication_body_value(void *tlv, uint8_t **ppWriteP - uint16_t i = 0; - uint16_t offset = 2; // taking into account the number_of_pdus - uint16_t total_number_of_pdus = value->number_of_pdus; -+ //printf("ULSCH:pdus:%d\n", total_number_of_pdus); -+ - for(i = 0; i < total_number_of_pdus; ++i) - { - nfapi_rx_indication_pdu_t* pdu = &(value->rx_pdu_list[i]); - if(pdu->rx_ue_information.tl.tag == NFAPI_RX_UE_INFORMATION_TAG) - { -+ //printf("NFAPI_RX_UE_INFORMATION_TAG\n"); - offset += 4 + 6; - } - - if(pdu->rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG) - { -+ //printf("NFAPI_RX_INDICATION_REL8_TAG\n"); - offset += 4 + 7; - } - - if(pdu->rx_indication_rel9.tl.tag == NFAPI_RX_INDICATION_REL9_TAG) - { -+ //printf("NFAPI_RX_INDICATION_REL9_TAG\n"); - offset += 4 + 2; - } - } -@@ -2592,11 +2639,16 @@ int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBu - return -1; - } - -+ if (pMessageHeader->message_id != NFAPI_TIMING_INFO) -+ { -+ //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() message_id:0x%04x phy_id:%u m_segment_sequence:%u timestamp:%u\n", __FUNCTION__, pMessageHeader->message_id, pMessageHeader->phy_id, pMessageHeader->m_segment_sequence, pMessageHeader->transmit_timestamp); -+ } - // look for the specific message - uint8_t result = 0; - switch (pMessageHeader->message_id) - { - case NFAPI_DL_CONFIG_REQUEST: -+ //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() NFAPI_DL_CONFIG_REQUEST\n", __FUNCTION__); - result = pack_dl_config_request(pMessageHeader, &pWritePackedMessage, end, config); - break; - -@@ -2609,6 +2661,7 @@ int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBu - break; - - case NFAPI_TX_REQUEST: -+ //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() NFAPI_TX_REQUEST\n", __FUNCTION__); - result = pack_tx_request(pMessageHeader, &pWritePackedMessage, end, config); - break; - -@@ -2621,6 +2674,7 @@ int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBu - break; - - case NFAPI_RX_ULSCH_INDICATION: -+ //printf("RX ULSCH\n"); - result = pack_rx_ulsch_indication(pMessageHeader, &pWritePackedMessage, end, config); - break; - -@@ -3482,9 +3536,10 @@ static uint8_t unpack_ul_config_cqi_ri_info_rel9_value(void *tlv, uint8_t **ppRe - if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size, end) == 0) - return 0; - -- if(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size > 0) -+ uint8_t j; -+ for(j = 0; j < 8; ++j) - { -- if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].dl_cqi_pmi_size, end) == 0) -+ if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].dl_cqi_pmi_size[j], end) == 0) - return 0; - } - } -@@ -4394,6 +4449,14 @@ static uint8_t unpack_tx_request(uint8_t **ppReadPackedMsg, uint8_t *end, void * - { - if(!pullarray8(ppReadPackedMsg, pdu->segments[0].segment_data, pdu->segments[0].segment_length, pdu->segments[0].segment_length, end)) - return 0; -+ if (0 && pdu->segments[0].segment_length == 3) -+ { -+ NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() BCH? segment_data:%x %x %x\n", __FUNCTION__, -+ pdu->segments[0].segment_data[0], -+ pdu->segments[0].segment_data[1], -+ pdu->segments[0].segment_data[2] -+ ); -+ } - } - else - { -diff --git a/pnf/public_inc/nfapi_pnf_interface.h b/pnf/public_inc/nfapi_pnf_interface.h -index f93624d..b25caf2 100644 ---- a/pnf/public_inc/nfapi_pnf_interface.h -+++ b/pnf/public_inc/nfapi_pnf_interface.h -@@ -319,10 +319,10 @@ typedef struct nfapi_pnf_config - * 0 will be returned if it fails. - * - * \code -- * nfapi_pnf_config_t* config = nfapi_pnf_config_create(); -+ * nfapi_pnf_config_t* config = nfapi_pnf_config_create(void); - * \endcode - */ --nfapi_pnf_config_t* nfapi_pnf_config_create(); -+nfapi_pnf_config_t* nfapi_pnf_config_create(void); - - /*! Delete a pnf configuration - * \param config A pointer to a pnf configuraiton -@@ -681,7 +681,7 @@ typedef struct nfapi_pnf_p7_config - /*! Create and initialise a nfapi_pnf_p7_config structure - * \return A pointer to a PNF P7 config structure - */ --nfapi_pnf_p7_config_t* nfapi_pnf_p7_config_create(); -+nfapi_pnf_p7_config_t* nfapi_pnf_p7_config_create(void); - - /*! Delete an nfapi_pnf_p7_config structure - * \param config -diff --git a/pnf/src/pnf.c b/pnf/src/pnf.c -index d6cf364..d0a7fa6 100644 ---- a/pnf/src/pnf.c -+++ b/pnf/src/pnf.c -@@ -412,10 +412,10 @@ void pnf_handle_start_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen) - { - nfapi_start_request_t req; - -- NFAPI_TRACE(NFAPI_TRACE_INFO, "START.request received\n"); -- - nfapi_pnf_config_t* config = &(pnf->_public); - -+ NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() START.request received state:%d\n", __FUNCTION__, config->state); -+ - // unpack the message - if (nfapi_p5_message_unpack(pRecvMsg, recvMsgLen, &req, sizeof(req), &config->codec_config) >= 0) - { -diff --git a/pnf/src/pnf_interface.c b/pnf/src/pnf_interface.c -index 74f29a0..7310fc0 100644 ---- a/pnf/src/pnf_interface.c -+++ b/pnf/src/pnf_interface.c -@@ -76,6 +76,7 @@ int nfapi_pnf_start(nfapi_pnf_config_t* config) - - sleep(1); - } -+ NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() terminate=1 - EXITTING............\n", __FUNCTION__); - - return 0; - } -@@ -227,7 +228,7 @@ int nfapi_pnf_start_resp(nfapi_pnf_config_t* config, nfapi_start_response_t* res - } - else - { -- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: unknow phy id %d\n", __FUNCTION__, resp->header.phy_id); -+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: unknown phy id %d\n", __FUNCTION__, resp->header.phy_id); - return -1; - } - -diff --git a/pnf/src/pnf_p7.c b/pnf/src/pnf_p7.c -index 0fd7828..02b828d 100644 ---- a/pnf/src/pnf_p7.c -+++ b/pnf/src/pnf_p7.c -@@ -25,12 +25,64 @@ - #include - #include - #include -+#include - - #include "pnf_p7.h" - - #define FAPI2_IP_DSCP 0 - --uint32_t get_current_time_hr() -+extern uint16_t sf_ahead; -+//uint16_t sf_ahead=4; -+ -+void add_sf(uint16_t *frameP, uint16_t *subframeP, int offset) -+{ -+ *frameP = *frameP + ((*subframeP + offset) / 10); -+ -+ *subframeP = ((*subframeP + offset) % 10); -+} -+ -+void subtract_sf(uint16_t *frameP, uint16_t *subframeP, int offset) -+{ -+ if (*subframeP < offset) -+ { -+ *frameP = (*frameP+1024-1)%1024; -+ } -+ *subframeP = (*subframeP+10-offset)%10; -+} -+ -+uint16_t sfnsf_add_sf(uint16_t sfnsf, int offset) -+{ -+ uint16_t new_sfnsf; -+ uint16_t sfn = NFAPI_SFNSF2SFN(sfnsf); -+ uint16_t sf = NFAPI_SFNSF2SF(sfnsf); -+ -+ //printf("%s() sfn:%u sf:%u\n", __FUNCTION__, sfn, sf); -+ add_sf(&sfn, &sf, offset); -+ -+ new_sfnsf = sfn<<4|sf; -+ -+ //printf("%s() sfn:%u sf:%u offset:%d sfnsf:%d(DEC:%d) new:%d(DEC:%d)\n", __FUNCTION__, sfn, sf, offset, sfnsf, NFAPI_SFNSF2DEC(sfnsf), new_sfnsf, NFAPI_SFNSF2DEC(new_sfnsf)); -+ -+ return new_sfnsf; -+} -+ -+uint16_t sfnsf_subtract_sf(uint16_t sfnsf, int offset) -+{ -+ uint16_t new_sfnsf; -+ uint16_t sfn = NFAPI_SFNSF2SFN(sfnsf); -+ uint16_t sf = NFAPI_SFNSF2SF(sfnsf); -+ -+ //printf("%s() sfn:%u sf:%u\n", __FUNCTION__, sfn, sf); -+ subtract_sf(&sfn, &sf, offset); -+ -+ new_sfnsf = sfn<<4|sf; -+ -+ //printf("%s() offset:%d sfnsf:%d(DEC:%d) new:%d(DEC:%d)\n", __FUNCTION__, offset, sfnsf, NFAPI_SFNSF2DEC(sfnsf), new_sfnsf, NFAPI_SFNSF2DEC(new_sfnsf)); -+ -+ return new_sfnsf; -+} -+ -+uint32_t pnf_get_current_time_hr(void) - { - struct timeval now; - (void)gettimeofday(&now, NULL); -@@ -64,11 +116,14 @@ void pnf_p7_free(pnf_p7_t* pnf_p7, void* ptr) - // todo : for now these just malloc/free need to move to a memory cache - nfapi_dl_config_request_t* allocate_nfapi_dl_config_request(pnf_p7_t* pnf_p7) - { -- return pnf_p7_malloc(pnf_p7, sizeof(nfapi_dl_config_request_t)); -+ void *ptr= pnf_p7_malloc(pnf_p7, sizeof(nfapi_dl_config_request_t)); -+ //printf("%s() ptr:%p\n", __FUNCTION__, ptr); -+ return ptr; - } - - void deallocate_nfapi_dl_config_request(nfapi_dl_config_request_t* req, pnf_p7_t* pnf_p7) - { -+ //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->dl_config_request_body.dl_config_pdu_list); - if(pnf_p7->_public.codec_config.deallocate) - { - (pnf_p7->_public.codec_config.deallocate)(req->dl_config_request_body.dl_config_pdu_list); -@@ -77,17 +132,21 @@ void deallocate_nfapi_dl_config_request(nfapi_dl_config_request_t* req, pnf_p7_t - { - free(req->dl_config_request_body.dl_config_pdu_list); - } -+ req->dl_config_request_body.dl_config_pdu_list=0; - - pnf_p7_free(pnf_p7, req); - } - - nfapi_ul_config_request_t* allocate_nfapi_ul_config_request(pnf_p7_t* pnf_p7) - { -- return pnf_p7_malloc(pnf_p7, sizeof(nfapi_ul_config_request_t)); -+ void *ptr= pnf_p7_malloc(pnf_p7, sizeof(nfapi_ul_config_request_t)); -+ //printf("%s() ptr:%p\n", __FUNCTION__, ptr); -+ return ptr; - } - - void deallocate_nfapi_ul_config_request(nfapi_ul_config_request_t* req, pnf_p7_t* pnf_p7) - { -+ //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->ul_config_request_body.ul_config_pdu_list); - if(pnf_p7->_public.codec_config.deallocate) - { - (pnf_p7->_public.codec_config.deallocate)(req->ul_config_request_body.ul_config_pdu_list); -@@ -96,6 +155,7 @@ void deallocate_nfapi_ul_config_request(nfapi_ul_config_request_t* req, pnf_p7_t - { - free(req->ul_config_request_body.ul_config_pdu_list); - } -+ req->ul_config_request_body.ul_config_pdu_list=0; - - pnf_p7_free(pnf_p7, req); - } -@@ -107,6 +167,7 @@ nfapi_hi_dci0_request_t* allocate_nfapi_hi_dci0_request(pnf_p7_t* pnf_p7) - - void deallocate_nfapi_hi_dci0_request(nfapi_hi_dci0_request_t* req, pnf_p7_t* pnf_p7) - { -+ //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->hi_dci0_request_body.hi_dci0_pdu_list); - if(pnf_p7->_public.codec_config.deallocate) - { - (pnf_p7->_public.codec_config.deallocate)(req->hi_dci0_request_body.hi_dci0_pdu_list); -@@ -115,6 +176,7 @@ void deallocate_nfapi_hi_dci0_request(nfapi_hi_dci0_request_t* req, pnf_p7_t* pn - { - free(req->hi_dci0_request_body.hi_dci0_pdu_list); - } -+ req->hi_dci0_request_body.hi_dci0_pdu_list=0; - - pnf_p7_free(pnf_p7, req); - } -@@ -127,6 +189,9 @@ nfapi_tx_request_t* allocate_nfapi_tx_request(pnf_p7_t* pnf_p7) - void deallocate_nfapi_tx_request(nfapi_tx_request_t* req, pnf_p7_t* pnf_p7) - { - int i = 0; -+ -+ //printf("%s() SFN/SF:%d %s req:%p pdu[0]:data:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->tx_request_body.tx_pdu_list[i].segments[0].segment_data); -+ - for(i = 0; i < req->tx_request_body.number_of_pdus; ++i) - { - void* data = req->tx_request_body.tx_pdu_list[i].segments[0].segment_data; -@@ -139,6 +204,7 @@ void deallocate_nfapi_tx_request(nfapi_tx_request_t* req, pnf_p7_t* pnf_p7) - { - free(data); - } -+ data=0; - } - - -@@ -150,6 +216,7 @@ void deallocate_nfapi_tx_request(nfapi_tx_request_t* req, pnf_p7_t* pnf_p7) - { - free(req->tx_request_body.tx_pdu_list); - } -+ req->tx_request_body.tx_pdu_list=0; - - pnf_p7_free(pnf_p7, req); - } -@@ -169,6 +236,7 @@ void deallocate_nfapi_lbt_dl_config_request(nfapi_lbt_dl_config_request_t* req, - { - free(req->lbt_dl_config_request_body.lbt_dl_config_req_pdu_list); - } -+ req->lbt_dl_config_request_body.lbt_dl_config_req_pdu_list=0; - - pnf_p7_free(pnf_p7, req); - } -@@ -307,11 +375,11 @@ void pnf_p7_rx_reassembly_queue_remove_old_msgs(pnf_p7_t* pnf_p7, pnf_p7_rx_reas - } - - --uint32_t get_sf_time(uint32_t now_hr, uint32_t sf_start_hr) -+static uint32_t get_sf_time(uint32_t now_hr, uint32_t sf_start_hr) - { - if(now_hr < sf_start_hr) - { -- NFAPI_TRACE(NFAPI_TRACE_INFO, "now is earlier that start of subframe\n"); -+ NFAPI_TRACE(NFAPI_TRACE_INFO, "now is earlier than start of subframe now_hr:%u sf_start_hr:%u\n", now_hr, sf_start_hr); - return 0; - } - else -@@ -482,29 +550,41 @@ void pnf_pack_and_send_timing_info(pnf_p7_t* pnf_p7) - - void send_dummy_subframe(pnf_p7_t* pnf_p7, uint16_t sfn_sf) - { -+ struct timespec t; -+ clock_gettime( CLOCK_MONOTONIC, &t); -+ -+ //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s(sfn_sf:%d) t:%ld.%09ld\n", __FUNCTION__, NFAPI_SFNSF2DEC(sfn_sf), t.tv_sec, t.tv_nsec); -+ -+ if(pnf_p7->_public.tx_req && pnf_p7->_public.dummy_subframe.tx_req) -+ { -+ pnf_p7->_public.dummy_subframe.tx_req->sfn_sf = sfn_sf; -+ //NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy tx_req - enter\n"); -+ (pnf_p7->_public.tx_req)(&pnf_p7->_public, pnf_p7->_public.dummy_subframe.tx_req); -+ //NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy tx_req - exit\n"); -+ } - if(pnf_p7->_public.dl_config_req && pnf_p7->_public.dummy_subframe.dl_config_req) - { - pnf_p7->_public.dummy_subframe.dl_config_req->sfn_sf = sfn_sf; -+ //NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy dl_config_req - enter\n"); - (pnf_p7->_public.dl_config_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.dl_config_req); -+ //NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy dl_config_req - exit\n"); - } - if(pnf_p7->_public.ul_config_req && pnf_p7->_public.dummy_subframe.ul_config_req) - { - pnf_p7->_public.dummy_subframe.ul_config_req->sfn_sf = sfn_sf; -+ NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy ul_config_req - enter\n"); - (pnf_p7->_public.ul_config_req)(&pnf_p7->_public, pnf_p7->_public.dummy_subframe.ul_config_req); - } - if(pnf_p7->_public.hi_dci0_req && pnf_p7->_public.dummy_subframe.hi_dci0_req) - { - pnf_p7->_public.dummy_subframe.hi_dci0_req->sfn_sf = sfn_sf; -+ NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy hi_dci0 - enter\n"); - (pnf_p7->_public.hi_dci0_req)(&pnf_p7->_public, pnf_p7->_public.dummy_subframe.hi_dci0_req); - } -- if(pnf_p7->_public.tx_req && pnf_p7->_public.dummy_subframe.tx_req) -- { -- pnf_p7->_public.dummy_subframe.tx_req->sfn_sf = sfn_sf; -- (pnf_p7->_public.tx_req)(&pnf_p7->_public, pnf_p7->_public.dummy_subframe.tx_req); -- } - if(pnf_p7->_public.lbt_dl_config_req && pnf_p7->_public.dummy_subframe.lbt_dl_config_req) - { - pnf_p7->_public.dummy_subframe.lbt_dl_config_req->sfn_sf = sfn_sf; -+ NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy lbt - enter\n"); - (pnf_p7->_public.lbt_dl_config_req)(&pnf_p7->_public, pnf_p7->_public.dummy_subframe.lbt_dl_config_req); - } - } -@@ -526,10 +606,14 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf) - return -1; - } - -+#if 1 - // save the curren time and sfn_sf -- pnf_p7->sf_start_time_hr = get_current_time_hr(); -+ pnf_p7->sf_start_time_hr = pnf_get_current_time_hr(); - pnf_p7->sfn_sf = sfn_sf; - -+ uint32_t sfn_sf_tx = sfnsf_add_sf(sfn_sf, sf_ahead); -+ uint32_t tx_sfn_sf_dec = NFAPI_SFNSF2DEC(sfn_sf_tx); -+ - // If the subframe_buffer has been configured - if(pnf_p7->_public.subframe_buffer_size != 0) - { -@@ -550,6 +634,10 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf) - NFAPI_TRACE(NFAPI_TRACE_INFO, "Applying shift %d to sfn/sf (%d -> %d)\n", pnf_p7->sfn_sf_shift, NFAPI_SFNSF2DEC(sfn_sf), shifted_sfn_sf); - sfn_sf = shifted_sfn_sf; - -+ // -+ // DJP - why does the shift not apply to pnf_p7->sfn_sf??? -+ // -+ - pnf_p7->sfn_sf_shift = 0; - } - -@@ -558,77 +646,119 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf) - - nfapi_pnf_p7_subframe_buffer_t* subframe_buffer = &(pnf_p7->subframe_buffer[buffer_index]); - -+ uint8_t tx_buffer_index = tx_sfn_sf_dec % pnf_p7->_public.subframe_buffer_size; -+ nfapi_pnf_p7_subframe_buffer_t* tx_subframe_buffer = &(pnf_p7->subframe_buffer[tx_buffer_index]); -+ -+ //printf("sfn_sf_dec:%d tx_sfn_sf_dec:%d\n", sfn_sf_dec, tx_sfn_sf_dec); -+ -+ if (0) NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() shift:%d subframe_buffer->sfn_sf:%d tx_subframe_buffer->sfn_sf:%d sfn_sf:%d subframe_buffer[buffer_index:%u dl_config_req:%p tx_req:%p] " -+ "TX:sfn_sf:%d:tx_buffer_index:%d[dl_config_req:%p tx_req:%p]\n", -+ __FUNCTION__, -+ pnf_p7->sfn_sf_shift, -+ NFAPI_SFNSF2DEC(subframe_buffer->sfn_sf), -+ NFAPI_SFNSF2DEC(tx_subframe_buffer->sfn_sf), -+ sfn_sf_dec, buffer_index, subframe_buffer->dl_config_req, subframe_buffer->tx_req, -+ tx_sfn_sf_dec, tx_buffer_index, tx_subframe_buffer->dl_config_req, tx_subframe_buffer->tx_req); -+ - // if the subframe buffer sfn sf is set then we have atlease 1 message - // from the vnf. - // todo : how to handle the messages we don't have, send dummies for - // now -- if(subframe_buffer->sfn_sf == sfn_sf) -+ -+ //printf("tx_subframe_buffer->sfn_sf:%d sfn_sf_tx:%d\n", tx_subframe_buffer->sfn_sf, sfn_sf_tx); -+ //printf("subframe_buffer->sfn_sf:%d sfn_sf:%d\n", subframe_buffer->sfn_sf, sfn_sf); -+ if(tx_subframe_buffer->sfn_sf == sfn_sf_tx) - { -- if(subframe_buffer->dl_config_req != 0) -+ if(tx_subframe_buffer->tx_req != 0) - { -- if(pnf_p7->_public.dl_config_req) -- (pnf_p7->_public.dl_config_req)(&(pnf_p7->_public), subframe_buffer->dl_config_req); -+ if(pnf_p7->_public.tx_req) -+ (pnf_p7->_public.tx_req)(&(pnf_p7->_public), tx_subframe_buffer->tx_req); - -- deallocate_nfapi_dl_config_request(subframe_buffer->dl_config_req, pnf_p7); -+ //deallocate_nfapi_tx_request(subframe_buffer->tx_req, pnf_p7); - } - else - { - // send dummy -- if(pnf_p7->_public.dl_config_req && pnf_p7->_public.dummy_subframe.dl_config_req) -+ if(pnf_p7->_public.tx_req && pnf_p7->_public.dummy_subframe.tx_req) - { -- pnf_p7->_public.dummy_subframe.dl_config_req->sfn_sf = sfn_sf; -- (pnf_p7->_public.dl_config_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.dl_config_req); -+ pnf_p7->_public.dummy_subframe.tx_req->sfn_sf = sfn_sf_tx; -+ (pnf_p7->_public.tx_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.tx_req); - } - } - -- if(subframe_buffer->ul_config_req != 0) -+ if(tx_subframe_buffer->dl_config_req != 0) - { -- if(pnf_p7->_public.ul_config_req) -- (pnf_p7->_public.ul_config_req)(&(pnf_p7->_public), subframe_buffer->ul_config_req); -+ if(pnf_p7->_public.dl_config_req) -+ (pnf_p7->_public.dl_config_req)(&(pnf_p7->_public), tx_subframe_buffer->dl_config_req); - -- deallocate_nfapi_ul_config_request(subframe_buffer->ul_config_req, pnf_p7); -+ //deallocate_nfapi_dl_config_request(subframe_buffer->dl_config_req, pnf_p7); - } - else - { - // send dummy -- if(pnf_p7->_public.ul_config_req && pnf_p7->_public.dummy_subframe.ul_config_req) -+ if(pnf_p7->_public.dl_config_req && pnf_p7->_public.dummy_subframe.dl_config_req) - { -- pnf_p7->_public.dummy_subframe.ul_config_req->sfn_sf = sfn_sf; -- (pnf_p7->_public.ul_config_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.ul_config_req); -+ pnf_p7->_public.dummy_subframe.dl_config_req->sfn_sf = sfn_sf_tx; -+ (pnf_p7->_public.dl_config_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.dl_config_req); - } - } - -- if(subframe_buffer->hi_dci0_req != 0) -+ if(tx_subframe_buffer->hi_dci0_req != 0) - { - if(pnf_p7->_public.hi_dci0_req) -- (pnf_p7->_public.hi_dci0_req)(&(pnf_p7->_public), subframe_buffer->hi_dci0_req); -+ (pnf_p7->_public.hi_dci0_req)(&(pnf_p7->_public), tx_subframe_buffer->hi_dci0_req); - -- deallocate_nfapi_hi_dci0_request(subframe_buffer->hi_dci0_req, pnf_p7); -+ //deallocate_nfapi_hi_dci0_request(subframe_buffer->hi_dci0_req, pnf_p7); - } - else - { - //send dummy - if(pnf_p7->_public.hi_dci0_req && pnf_p7->_public.dummy_subframe.hi_dci0_req) - { -- pnf_p7->_public.dummy_subframe.hi_dci0_req->sfn_sf = sfn_sf; -+ pnf_p7->_public.dummy_subframe.hi_dci0_req->sfn_sf = sfn_sf_tx; - (pnf_p7->_public.hi_dci0_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.hi_dci0_req); - } - } - -- if(subframe_buffer->tx_req != 0) -+ if(tx_subframe_buffer->dl_config_req != 0) -+ { -+ deallocate_nfapi_dl_config_request(tx_subframe_buffer->dl_config_req, pnf_p7); -+ tx_subframe_buffer->dl_config_req = 0; -+ } -+ if(tx_subframe_buffer->tx_req != 0) -+ { -+ deallocate_nfapi_tx_request(tx_subframe_buffer->tx_req, pnf_p7); -+ tx_subframe_buffer->tx_req = 0; -+ } -+ if(tx_subframe_buffer->hi_dci0_req != 0) -+ { -+ deallocate_nfapi_hi_dci0_request(tx_subframe_buffer->hi_dci0_req, pnf_p7); -+ tx_subframe_buffer->hi_dci0_req = 0; -+ } -+ } -+ else -+ { -+ // If we ever need to "send" a dummy ul_config this won't work!!! -+ send_dummy_subframe(pnf_p7, sfn_sf_tx); -+ } -+ -+ if(subframe_buffer->sfn_sf == sfn_sf) -+ { -+ -+ if(subframe_buffer->ul_config_req != 0) - { -- if(pnf_p7->_public.tx_req) -- (pnf_p7->_public.tx_req)(&(pnf_p7->_public), subframe_buffer->tx_req); -+ if(pnf_p7->_public.ul_config_req) -+ (pnf_p7->_public.ul_config_req)(&(pnf_p7->_public), subframe_buffer->ul_config_req); - -- deallocate_nfapi_tx_request(subframe_buffer->tx_req, pnf_p7); -+ //deallocate_nfapi_ul_config_request(subframe_buffer->ul_config_req, pnf_p7); - } - else - { - // send dummy -- if(pnf_p7->_public.tx_req && pnf_p7->_public.dummy_subframe.tx_req) -+ if(pnf_p7->_public.ul_config_req && pnf_p7->_public.dummy_subframe.ul_config_req) - { -- pnf_p7->_public.dummy_subframe.tx_req->sfn_sf = sfn_sf; -- (pnf_p7->_public.tx_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.tx_req); -+ pnf_p7->_public.dummy_subframe.ul_config_req->sfn_sf = sfn_sf; -+ (pnf_p7->_public.ul_config_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.ul_config_req); - } - } - -@@ -637,7 +767,7 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf) - if(pnf_p7->_public.lbt_dl_config_req) - (pnf_p7->_public.lbt_dl_config_req)(&(pnf_p7->_public), subframe_buffer->lbt_dl_config_req); - -- deallocate_nfapi_lbt_dl_config_request(subframe_buffer->lbt_dl_config_req, pnf_p7); -+ //deallocate_nfapi_lbt_dl_config_request(subframe_buffer->lbt_dl_config_req, pnf_p7); - } - else - { -@@ -650,14 +780,35 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf) - - } - -- memset(&(pnf_p7->subframe_buffer[buffer_index]), 0, sizeof(nfapi_pnf_p7_subframe_buffer_t)); -- pnf_p7->subframe_buffer[buffer_index].sfn_sf = -1; -- } -- else -- { -- send_dummy_subframe(pnf_p7, sfn_sf); -+ //if(subframe_buffer->dl_config_req != 0) -+ //deallocate_nfapi_dl_config_request(subframe_buffer->dl_config_req, pnf_p7); -+ //if(subframe_buffer->tx_req != 0) -+ //deallocate_nfapi_tx_request(subframe_buffer->tx_req, pnf_p7); -+ if(subframe_buffer->ul_config_req != 0) -+ { -+ deallocate_nfapi_ul_config_request(subframe_buffer->ul_config_req, pnf_p7); -+ subframe_buffer->ul_config_req = 0; -+ -+ } -+ //if(subframe_buffer->hi_dci0_req != 0) -+ //deallocate_nfapi_hi_dci0_request(subframe_buffer->hi_dci0_req, pnf_p7); -+ if(subframe_buffer->lbt_dl_config_req != 0) -+ { -+ deallocate_nfapi_lbt_dl_config_request(subframe_buffer->lbt_dl_config_req, pnf_p7); -+ subframe_buffer->lbt_dl_config_req = 0; -+ } -+ } // sfn_sf match -+ -+ if (subframe_buffer->dl_config_req == 0 && subframe_buffer->tx_req == 0 && subframe_buffer->ul_config_req == 0 && subframe_buffer->lbt_dl_config_req == 0) -+ { -+ memset(&(pnf_p7->subframe_buffer[buffer_index]), 0, sizeof(nfapi_pnf_p7_subframe_buffer_t)); -+ pnf_p7->subframe_buffer[buffer_index].sfn_sf = -1; - } - -+ //printf("pnf_p7->_public.timing_info_mode_periodic:%d pnf_p7->timing_info_period_counter:%d pnf_p7->_public.timing_info_period:%d\n", pnf_p7->_public.timing_info_mode_periodic, pnf_p7->timing_info_period_counter, pnf_p7->_public.timing_info_period); -+ //printf("pnf_p7->_public.timing_info_mode_aperiodic:%d pnf_p7->timing_info_aperiodic_send:%d\n", pnf_p7->_public.timing_info_mode_aperiodic, pnf_p7->timing_info_aperiodic_send); -+ //printf("pnf_p7->timing_info_ms_counter:%d\n", pnf_p7->timing_info_ms_counter); -+ - // send the periodic timing info if configured - if(pnf_p7->_public.timing_info_mode_periodic && (pnf_p7->timing_info_period_counter++) == pnf_p7->_public.timing_info_period) - { -@@ -678,14 +829,15 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf) - } - else - { -- send_dummy_subframe(pnf_p7, sfn_sf); -+ //send_dummy_subframe(pnf_p7, sfn_sf_tx); - } - - -+ //printf("pnf_p7->tick:%d\n", pnf_p7->tick); - if(pnf_p7->tick == 1000) - { - -- NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF P7:%d] DL:(%d/%d) UL:(%d/%d) HI:(%d/%d) TX:(%d/%d)\n", pnf_p7->_public.phy_id, -+ NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF P7:%d] (ONTIME/LATE) DL:(%d/%d) UL:(%d/%d) HI:(%d/%d) TX:(%d/%d)\n", pnf_p7->_public.phy_id, - pnf_p7->stats.dl_conf_ontime, pnf_p7->stats.dl_conf_late, - pnf_p7->stats.ul_conf_ontime, pnf_p7->stats.ul_conf_late, - pnf_p7->stats.hi_dci0_ontime, pnf_p7->stats.hi_dci0_late, -@@ -694,6 +846,7 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf) - memset(&pnf_p7->stats, 0, sizeof(pnf_p7->stats)); - } - pnf_p7->tick++; -+#endif - - if(pthread_mutex_unlock(&(pnf_p7->mutex)) != 0) - { -@@ -724,7 +877,7 @@ uint8_t is_p7_request_in_window(uint16_t sfnsf, const char* name, pnf_p7_t* phy) - if(recv_sfn_sf_dec > ((current_sfn_sf_dec + timing_window) % NFAPI_MAX_SFNSFDEC)) - { - // out of window -- //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is late %d (with wrap)\n", current_sfn_sf_dec, name, recv_sfn_sf_dec); -+ NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is late %d (with wrap)\n", current_sfn_sf_dec, name, recv_sfn_sf_dec); - } - else - { -@@ -736,7 +889,7 @@ uint8_t is_p7_request_in_window(uint16_t sfnsf, const char* name, pnf_p7_t* phy) - else - { - // too late -- //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is in late %d (%d)\n", current_sfn_sf_dec, name, recv_sfn_sf_dec, (current_sfn_sf_dec - recv_sfn_sf_dec)); -+ NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is in late %d (delta:%d)\n", current_sfn_sf_dec, name, recv_sfn_sf_dec, (current_sfn_sf_dec - recv_sfn_sf_dec)); - } - - } -@@ -751,8 +904,8 @@ uint8_t is_p7_request_in_window(uint16_t sfnsf, const char* name, pnf_p7_t* phy) - } - else - { -- // to far in the future -- //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is out of window %d (%d) [%d]\n", current_sfn_sf_dec, name, recv_sfn_sf_dec, (recv_sfn_sf_dec - current_sfn_sf_dec), timing_window); -+ // too far in the future -+ NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is out of window %d (delta:%d) [max:%d]\n", current_sfn_sf_dec, name, recv_sfn_sf_dec, (recv_sfn_sf_dec - current_sfn_sf_dec), timing_window); - } - - } -@@ -785,15 +938,35 @@ void pnf_handle_dl_config_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_ - return; - } - -- if(is_p7_request_in_window(req->sfn_sf, "dl_config_request", pnf_p7)) -- { -- uint32_t sfn_sf_dec = NFAPI_SFNSF2DEC(req->sfn_sf); -- uint8_t buffer_index = sfn_sf_dec % pnf_p7->_public.subframe_buffer_size; -+ if ( -+ 0 && -+ (NFAPI_SFNSF2DEC(req->sfn_sf) % 100 ==0 || -+ NFAPI_SFNSF2DEC(req->sfn_sf) % 105 ==0 -+ ) -+ ) -+ NFAPI_TRACE(NFAPI_TRACE_INFO, "DL_CONFIG.req sfn_sf:%d pdcch:%u dci:%u pdu:%u pdsch_rnti:%u pcfich:%u\n", -+ NFAPI_SFNSF2DEC(req->sfn_sf), -+ req->dl_config_request_body.number_pdcch_ofdm_symbols, -+ req->dl_config_request_body.number_dci, -+ req->dl_config_request_body.number_pdu, -+ req->dl_config_request_body.number_pdsch_rnti, -+ req->dl_config_request_body.transmission_power_pcfich -+ ); -+ -+ if(is_p7_request_in_window(req->sfn_sf, "dl_config_request", pnf_p7)) -+ { -+ uint32_t sfn_sf_dec = NFAPI_SFNSF2DEC(req->sfn_sf); -+ uint8_t buffer_index = sfn_sf_dec % pnf_p7->_public.subframe_buffer_size; -+ -+ struct timespec t; -+ clock_gettime(CLOCK_MONOTONIC, &t); -+ -+ NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE DL_CONFIG_REQ sfn_sf:%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, sfn_sf_dec, buffer_index); - - // if there is already an dl_config_req make sure we free it. - if(pnf_p7->subframe_buffer[buffer_index].dl_config_req != 0) - { -- NFAPI_TRACE(NFAPI_TRACE_NOTE, "HERE HERE HERE\n"); -+ NFAPI_TRACE(NFAPI_TRACE_NOTE, "%s() is_p7_request_in_window()=TRUE buffer_index occupied - free it first sfn_sf:%d buffer_index:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), buffer_index); - //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing dl_config_req at index %d (%d/%d)", - // pMyPhyInfo->sfnSf, bufferIdx, - // SFNSF2SFN(dreq->sfn_sf), SFNSF2SF(dreq->sfn_sf)); -@@ -860,6 +1033,11 @@ void pnf_handle_ul_config_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_ - uint32_t sfn_sf_dec = NFAPI_SFNSF2DEC(req->sfn_sf); - uint8_t buffer_index = sfn_sf_dec % pnf_p7->_public.subframe_buffer_size; - -+ struct timespec t; -+ clock_gettime(CLOCK_MONOTONIC, &t); -+ -+ NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE UL_CONFIG_REQ sfn_sf:%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, sfn_sf_dec, buffer_index); -+ - if(pnf_p7->subframe_buffer[buffer_index].ul_config_req != 0) - { - //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing ul_config_req at index %d (%d/%d)", -@@ -876,7 +1054,7 @@ void pnf_handle_ul_config_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_ - } - else - { -- //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] NOT storing ul_config_req SFN/SF %d/%d\n", pMyPhyInfo->sfnSf, SFNSF2SFN(req->sfn_sf), SFNSF2SF(req->sfn_sf)); -+ NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] NOT storing ul_config_req OUTSIDE OF TRANSMIT BUFFER WINDOW SFN/SF %d\n", NFAPI_SFNSF2DEC(pnf_p7->sfn_sf), NFAPI_SFNSF2DEC(req->sfn_sf)); - deallocate_nfapi_ul_config_request(req, pnf_p7); - - if(pnf_p7->_public.timing_info_mode_aperiodic) -@@ -994,6 +1172,16 @@ void pnf_handle_tx_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7) - uint32_t sfn_sf_dec = NFAPI_SFNSF2DEC(req->sfn_sf); - uint8_t buffer_index = sfn_sf_dec % pnf_p7->_public.subframe_buffer_size; - -+ struct timespec t; -+ clock_gettime(CLOCK_MONOTONIC, &t); -+ -+ NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE TX_REQ sfn_sf:%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, sfn_sf_dec, buffer_index); -+ -+ if (0 && NFAPI_SFNSF2DEC(req->sfn_sf)%100==0) NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() TX_REQ.req sfn_sf:%d pdus:%d - TX_REQ is within window\n", -+ __FUNCTION__, -+ NFAPI_SFNSF2DEC(req->sfn_sf), -+ req->tx_request_body.number_of_pdus); -+ - if(pnf_p7->subframe_buffer[buffer_index].tx_req != 0) - { - //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing tx_req at index %d (%d/%d)", -@@ -1010,6 +1198,8 @@ void pnf_handle_tx_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7) - } - else - { -+ NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() TX_REQUEST Request is outside of window REQ:SFN_SF:%d CURR:SFN_SF:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), NFAPI_SFNSF2DEC(pnf_p7->sfn_sf)); -+ - deallocate_nfapi_tx_request(req, pnf_p7); - - if(pnf_p7->_public.timing_info_mode_aperiodic) -@@ -1126,12 +1316,27 @@ uint32_t calculate_t2(uint32_t now_time_hr, uint16_t sfn_sf, uint32_t sf_start_t - uint32_t sf_time_us = get_sf_time(now_time_hr, sf_start_time_hr); - uint32_t t2 = (NFAPI_SFNSF2DEC(sfn_sf) * 1000) + sf_time_us; - -+ if (0) -+ { -+ static uint32_t prev_t2 = 0; -+ -+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(now_time_hr:%u sfn_sf:%d sf_start_time_Hr:%u) sf_time_us:%u t2:%u prev_t2:%u diff:%u\n", -+ __FUNCTION__, -+ now_time_hr, NFAPI_SFNSF2DEC(sfn_sf), sf_start_time_hr, -+ sf_time_us, -+ t2, -+ prev_t2, -+ t2-prev_t2); -+ -+ prev_t2 = t2; -+ } -+ - return t2; - } - - uint32_t calculate_t3(uint16_t sfn_sf, uint32_t sf_start_time_hr) - { -- uint32_t now_time_hr = get_current_time_hr(); -+ uint32_t now_time_hr = pnf_get_current_time_hr(); - - uint32_t sf_time_us = get_sf_time(now_time_hr, sf_start_time_hr); - -@@ -1391,6 +1596,8 @@ void pnf_nfapi_p7_read_dispatch_message(pnf_p7_t* pnf_p7, uint32_t now_hr_time) - // read the segment - recvfrom_result = recvfrom(pnf_p7->p7_sock, pnf_p7->rx_message_buffer, header.message_length, MSG_DONTWAIT, (struct sockaddr*)&remote_addr, &remote_addr_size); - -+ now_hr_time = pnf_get_current_time_hr(); //DJP - moved to here - get closer timestamp??? -+ - if(recvfrom_result > 0) - { - pnf_handle_p7_message(pnf_p7->rx_message_buffer, recvfrom_result, pnf_p7, now_hr_time); -@@ -1417,7 +1624,10 @@ void pnf_nfapi_p7_read_dispatch_message(pnf_p7_t* pnf_p7, uint32_t now_hr_time) - - // need to update the time as we would only use the value from the - // select -- now_hr_time = get_current_time_hr(); -+#if 0 -+// DJP - why do this here and not on return from recv??? -+ now_hr_time = pnf_get_current_time_hr(); -+#endif - } - while(recvfrom_result > 0); - } -@@ -1512,7 +1722,7 @@ int pnf_p7_message_pump(pnf_p7_t* pnf_p7) - - selectRetval = select(pnf_p7->p7_sock+1, &rfds, NULL, NULL, &timeout); - -- uint32_t now_hr_time = get_current_time_hr(); -+ uint32_t now_hr_time = pnf_get_current_time_hr(); - - if(selectRetval == 0) - { -diff --git a/pnf_sim/src/main.cpp b/pnf_sim/src/main.cpp -index 38767d8..e2622cf 100644 ---- a/pnf_sim/src/main.cpp -+++ b/pnf_sim/src/main.cpp -@@ -1124,16 +1124,18 @@ int fapi_rx_ulsch_ind(fapi_t* fapi, fapi_rx_ulsch_ind_t* ind) - rx_ind.header.phy_id = data->p7_config->phy_id; - rx_ind.sfn_sf = ind->sfn_sf; - -- if(((pnf_info*)(data->config->user_data))->wireshark_test_mode) -+ if(1)//((pnf_info*)(data->config->user_data))->wireshark_test_mode) - { - rx_ind.rx_indication_body.tl.tag = NFAPI_RX_INDICATION_BODY_TAG; -- rx_ind.rx_indication_body.number_of_pdus = 8; -+ rx_ind.rx_indication_body.number_of_pdus = 1; - - uint8_t rx_data[1024]; - - nfapi_rx_indication_pdu_t pdus[rx_ind.rx_indication_body.number_of_pdus]; - memset(&pdus, 0, sizeof(pdus)); - -+ strcpy((char*)rx_data, (char*)"123456789"); -+ - for(int i = 0; i < rx_ind.rx_indication_body.number_of_pdus;++i) - { - -@@ -1142,13 +1144,13 @@ int fapi_rx_ulsch_ind(fapi_t* fapi, fapi_rx_ulsch_ind_t* ind) - pdus[i].rx_ue_information.rnti = rand_range(1, 65535); - - pdus[i].rx_indication_rel8.tl.tag = NFAPI_RX_INDICATION_REL8_TAG; -- pdus[i].rx_indication_rel8.length = rand_range(0, 1024); -- pdus[i].rx_indication_rel8.offset = 1; -+ pdus[i].rx_indication_rel8.length = 10;//rand_range(0, 1024); -+ pdus[i].rx_indication_rel8.offset = 0;//djp - 1; - pdus[i].rx_indication_rel8.ul_cqi = rand_range(0, 255); - pdus[i].rx_indication_rel8.timing_advance = rand_range(0, 63); - -- pdus[i].rx_indication_rel9.tl.tag = NFAPI_RX_INDICATION_REL9_TAG; -- pdus[i].rx_indication_rel9.timing_advance_r9 = rand_range(0, 7690); -+ //pdus[i].rx_indication_rel9.tl.tag = NFAPI_RX_INDICATION_REL9_TAG; -+ //pdus[i].rx_indication_rel9.timing_advance_r9 = rand_range(0, 7690); - - pdus[i].data = &rx_data[0]; - } -diff --git a/vnf/inc/vnf_p7.h b/vnf/inc/vnf_p7.h -index ab9a335..fc2ab4e 100644 ---- a/vnf/inc/vnf_p7.h -+++ b/vnf/inc/vnf_p7.h -@@ -116,7 +116,8 @@ typedef struct { - - } vnf_p7_t; - --uint32_t get_current_time_hr(); -+uint32_t vnf_get_current_time_hr(void); -+ - uint16_t increment_sfn_sf(uint16_t sfn_sf); - int vnf_sync(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t* p7_info); - int send_mac_subframe_indications(vnf_p7_t* config); -diff --git a/vnf/public_inc/nfapi_vnf_interface.h b/vnf/public_inc/nfapi_vnf_interface.h -index 6659e5d..4629013 100644 ---- a/vnf/public_inc/nfapi_vnf_interface.h -+++ b/vnf/public_inc/nfapi_vnf_interface.h -@@ -450,7 +450,7 @@ typedef struct nfapi_vnf_config - /*! Creates and initialise the vnf config structure before use - * \return A pointer to a vnf config structure - */ --nfapi_vnf_config_t* nfapi_vnf_config_create(); -+nfapi_vnf_config_t* nfapi_vnf_config_create(void); - - /*! Delete an vnf config - */ -@@ -864,7 +864,7 @@ typedef struct nfapi_vnf_p7_config - /*! Creates and initializes the nfapi_vnf_p7_config structure before use - * \return A pointer to an allocated vnf p7 configuration - */ --nfapi_vnf_p7_config_t* nfapi_vnf_p7_config_create(); -+nfapi_vnf_p7_config_t* nfapi_vnf_p7_config_create(void); - - /*! Cleanup and delete nfapi_vnf_p7_config structure - * \param config A pointer to an vnf p7 configuration structure -diff --git a/vnf/src/vnf.c b/vnf/src/vnf.c -index fea3cf7..6800ee2 100644 ---- a/vnf/src/vnf.c -+++ b/vnf/src/vnf.c -@@ -82,11 +82,18 @@ void nfapi_vnf_pnf_list_add(nfapi_vnf_config_t* config, nfapi_vnf_pnf_info_t* no - - nfapi_vnf_pnf_info_t* nfapi_vnf_pnf_list_find(nfapi_vnf_config_t* config, int p5_idx) - { -+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s : config->pnf_list:%p\n", __FUNCTION__, config->pnf_list); -+ - nfapi_vnf_pnf_info_t* curr = config->pnf_list; - while(curr != 0) - { - if(curr->p5_idx == p5_idx) -+ { -+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s : curr->p5_idx:%d p5_idx:%d\n", __FUNCTION__, curr->p5_idx, p5_idx); - return curr; -+ } -+ -+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s : curr->next:%p\n", __FUNCTION__, curr->next); - - curr = curr->next; - } -diff --git a/vnf/src/vnf_interface.c b/vnf/src/vnf_interface.c -index e559730..0aba0a2 100644 ---- a/vnf/src/vnf_interface.c -+++ b/vnf/src/vnf_interface.c -@@ -342,6 +342,7 @@ int nfapi_vnf_start(nfapi_vnf_config_t* config) - { - NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF connection (fd:%d) accepted from %s:%d \n", p5Sock, inet_ntoa(addr.sin_addr), ntohs(addr.sin_port)); - nfapi_vnf_pnf_info_t* pnf = (nfapi_vnf_pnf_info_t*)malloc(sizeof(nfapi_vnf_pnf_info_t)); -+ NFAPI_TRACE(NFAPI_TRACE_INFO, "MALLOC nfapi_vnf_pnf_info_t for pnf_list pnf:%p\n", pnf); - memset(pnf, 0, sizeof(nfapi_vnf_pnf_info_t)); - pnf->p5_sock = p5Sock; - pnf->p5_idx = p5_idx++; -@@ -663,7 +664,7 @@ int nfapi_vnf_allocate_phy(nfapi_vnf_config_t* config, int p5_idx, uint16_t* phy - info->p5_idx = p5_idx; - info->phy_id = vnf->next_phy_id++; - -- info->timing_window = 10; -+ info->timing_window = 30; // This seems to override what gets set by the user - why??? - info->timing_info_mode = 0x03; - info->timing_info_period = 128; - -diff --git a/vnf/src/vnf_p7.c b/vnf/src/vnf_p7.c -index 8630385..1304176 100644 ---- a/vnf/src/vnf_p7.c -+++ b/vnf/src/vnf_p7.c -@@ -15,6 +15,8 @@ - */ - - -+#include -+ - #include - #include - #include -@@ -159,7 +161,7 @@ vnf_p7_rx_message_t* vnf_p7_rx_reassembly_queue_add_segment(vnf_p7_t* vnf_p7, vn - msg->sequence_number = sequence_number; - msg->num_segments_expected = m ? 255 : segment_number + 1; - msg->num_segments_received = 1; -- msg->rx_hr_time = get_current_time_hr(); -+ msg->rx_hr_time = vnf_get_current_time_hr(); - - msg->segments[segment_number].buffer = (uint8_t*)vnf_p7_malloc(vnf_p7, data_len); - memcpy(msg->segments[segment_number].buffer, data, data_len); -@@ -216,7 +218,7 @@ void vnf_p7_rx_reassembly_queue_remove_old_msgs(vnf_p7_t* vnf_p7, vnf_p7_rx_reas - vnf_p7_rx_message_t* iterator = queue->msg_queue; - vnf_p7_rx_message_t* previous = 0; - -- uint32_t rx_hr_time = get_current_time_hr(); -+ uint32_t rx_hr_time = vnf_get_current_time_hr(); - - while(iterator != 0) - { -@@ -254,7 +256,7 @@ void vnf_p7_rx_reassembly_queue_remove_old_msgs(vnf_p7_t* vnf_p7, vnf_p7_rx_reas - } - } - --uint32_t get_current_time_hr() -+uint32_t vnf_get_current_time_hr() - { - struct timeval now; - (void)gettimeofday(&now, NULL); -@@ -297,7 +299,7 @@ struct timespec timespec_delta(struct timespec start, struct timespec end) - return temp; - } - --uint32_t get_sf_time(uint32_t now_hr, uint32_t sf_start_hr) -+static uint32_t get_sf_time(uint32_t now_hr, uint32_t sf_start_hr) - { - if(now_hr < sf_start_hr) - { -@@ -321,7 +323,7 @@ uint32_t get_sf_time(uint32_t now_hr, uint32_t sf_start_hr) - - uint32_t calculate_t1(uint16_t sfn_sf, uint32_t sf_start_time_hr) - { -- uint32_t now_time_hr = get_current_time_hr(); -+ uint32_t now_time_hr = vnf_get_current_time_hr(); - - uint32_t sf_time_us = get_sf_time(now_time_hr, sf_start_time_hr); - -@@ -344,7 +346,7 @@ uint32_t calculate_t4(uint32_t now_time_hr, uint16_t sfn_sf, uint32_t sf_start_t - - uint32_t calculate_transmit_timestamp(uint16_t sfn_sf, uint32_t sf_start_time_hr) - { -- uint32_t now_time_hr = get_current_time_hr(); -+ uint32_t now_time_hr = vnf_get_current_time_hr(); - - uint32_t sf_time_us = get_sf_time(now_time_hr, sf_start_time_hr); - -@@ -410,6 +412,8 @@ int vnf_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t* hea - - int len = nfapi_p7_message_pack(header, buffer, sizeof(buffer), &vnf_p7->_public.codec_config); - -+ //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() phy_id:%d nfapi_p7_message_pack()=len=%d vnf_p7->_public.segment_size:%u\n", __FUNCTION__, header->phy_id, len, vnf_p7->_public.segment_size); -+ - if(len < 0) - { - NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() failed to pack p7 message phy_id:%d\n", __FUNCTION__, header->phy_id); -@@ -429,6 +433,7 @@ int vnf_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t* hea - int segment = 0; - int offset = NFAPI_P7_HEADER_LENGTH; - uint8_t tx_buffer[vnf_p7->_public.segment_size]; -+ NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() MORE THAN ONE SEGMENT phy_id:%d nfapi_p7_message_pack()=len=%d vnf_p7->_public.segment_size:%u\n", __FUNCTION__, header->phy_id, len, vnf_p7->_public.segment_size); - for(segment = 0; segment < segment_count; ++segment) - { - uint8_t last = 0; -@@ -851,7 +856,7 @@ void vnf_handle_p7_vendor_extension(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vn - - void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) - { -- uint32_t now_time_hr = get_current_time_hr(); -+ uint32_t now_time_hr = vnf_get_current_time_hr(); - - if (pRecvMsg == NULL || vnf_p7 == NULL) - { -@@ -871,7 +876,7 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) - nfapi_vnf_p7_connection_info_t* phy = vnf_p7_connection_info_list_find(vnf_p7, ind.header.phy_id); - uint32_t t4 = calculate_t4(now_time_hr, phy->sfn_sf, vnf_p7->sf_start_time_hr); - -- uint32_t tx_2_rx = t4 - ind.t1; -+ uint32_t tx_2_rx = t4>ind.t1 ? t4 - ind.t1 : t4 + NFAPI_MAX_SFNSFDEC - ind.t1 ; - uint32_t pnf_proc_time = ind.t3 - ind.t2; - - // divide by 2 using shift operator -@@ -881,7 +886,7 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) - { - phy->latency[phy->min_sync_cycle_count] = latency; - -- NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%d/%d) PNF to VNF !sync phy_id:%d (t1/2/3/4:%8u, %8u, %8u, %8u) txrx:%4u procT:%3u latency(us):%4d\n", -+ NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) PNF to VNF !sync phy_id:%d (t1/2/3/4:%8u, %8u, %8u, %8u) txrx:%4u procT:%3u latency(us):%4d\n", - NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id, ind.t1, ind.t2, ind.t3, t4, - tx_2_rx, pnf_proc_time, latency); - } -@@ -923,15 +928,27 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) - - if(1) - { -- NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%1d) PNF to VNF phy_id:%2d (t1/2/3/4:%8u, %8u, %8u, %8u) txrx:%4u procT:%3u latency(us):%4d offset(us):%8d filtered(us):%8d wrap[t1:%u t2:%u]\n", -- NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id, -+ struct timespec ts; -+ clock_gettime(CLOCK_MONOTONIC, &ts); -+ -+ NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%1d) %d.%d PNF to VNF phy_id:%2d (t1/2/3/4:%8u, %8u, %8u, %8u) txrx:%4u procT:%3u latency(us):%4d(avg:%4d) offset(us):%8d filtered(us):%8d wrap[t1:%u t2:%u]\n", -+ NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ts.tv_sec, ts.tv_nsec, ind.header.phy_id, - ind.t1, ind.t2, ind.t3, t4, -- tx_2_rx, pnf_proc_time, latency, phy->sf_offset, phy->sf_offset_filtered, -+ tx_2_rx, pnf_proc_time, latency, phy->average_latency, phy->sf_offset, phy->sf_offset_filtered, - (ind.t1previous_t1), (ind.t2previous_t2)); - } - - } - -+ if (phy->filtered_adjust && (phy->sf_offset_filtered > 1e6 || phy->sf_offset_filtered < -1e6)) -+ { -+ phy->filtered_adjust = 0; -+ phy->zero_count=0; -+ phy->min_sync_cycle_count = 2; -+ phy->in_sync = 0; -+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s - ADJUST TOO BAD - go out of filtered phy->sf_offset_filtered:%d\n", __FUNCTION__, phy->sf_offset_filtered); -+ } -+ - if(phy->min_sync_cycle_count) - phy->min_sync_cycle_count--; - -@@ -954,7 +971,6 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) - phy->sf_offset = ind.t2 - (ind.t1 - phy->average_latency); - - sfn_sf_dec += (phy->sf_offset / 1000); -- - } - else - { -@@ -976,12 +992,11 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) - { - phy->adjustment = NFAPI_SFNSF2DEC(new_sfn_sf) - NFAPI_SFNSF2DEC(curr_sfn_sf); - -- //NFAPI_TRACE(NFAPI_TRACE_NOTE, "PNF to VNF phy_id:%d adjustment%d\n", ind.header.phy_id, phy->adjustment); -+ NFAPI_TRACE(NFAPI_TRACE_NOTE, "PNF to VNF phy_id:%d adjustment%d phy->previous_sf_offset_filtered:%d phy->previous_sf_offset_filtered:%d phy->sf_offset_trend:%d\n", ind.header.phy_id, phy->adjustment, phy->previous_sf_offset_filtered, phy->previous_sf_offset_filtered, phy->sf_offset_trend); - - phy->previous_t1 = 0; - phy->previous_t2 = 0; - -- - if(phy->previous_sf_offset_filtered > 0) - { - if( phy->sf_offset_filtered > phy->previous_sf_offset_filtered) -@@ -1083,9 +1098,14 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) - - if(phy->insync_minor_adjustment != 0) - { -- NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d suframes (sf_offset_filtered:%d) %d %d %d\n", -+ NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d subframes (sf_offset_filtered:%d) %d %d %d NEW:%d CURR:%d adjustment:%d\n", - NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id, -- phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration, phy->sf_offset_filtered, insync_minor_adjustment_1, insync_minor_adjustment_2, phy->sf_offset_trend); -+ phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration, -+ phy->sf_offset_filtered, -+ insync_minor_adjustment_1, insync_minor_adjustment_2, phy->sf_offset_trend, -+ NFAPI_SFNSF2DEC(new_sfn_sf), -+ NFAPI_SFNSF2DEC(curr_sfn_sf), -+ phy->adjustment); - } - } - } -@@ -1121,10 +1141,13 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) - // out of sync? - } - -- NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d suframes (adjusment:%d sf_offset_filtered:%d) %d %d %d\n", -+ NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d subframes (adjustment:%d sf_offset_filtered:%d) %d %d %d NEW:%d CURR:%d adj:%d\n", - NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id, - phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration, phy->adjustment, phy->sf_offset_filtered, -- insync_minor_adjustment_1, insync_minor_adjustment_2, phy->sf_offset_trend); -+ insync_minor_adjustment_1, insync_minor_adjustment_2, phy->sf_offset_trend, -+ NFAPI_SFNSF2DEC(new_sfn_sf), -+ NFAPI_SFNSF2DEC(curr_sfn_sf), -+ phy->adjustment); - - } - else if(phy->adjustment < 0) -@@ -1151,7 +1174,7 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) - // out of sync? - } - -- NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d suframes (adjusment:%d sf_offset_filtered:%d) %d %d %d\n", -+ NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d subframes (adjustment:%d sf_offset_filtered:%d) %d %d %d\n", - NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id, - phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration, phy->adjustment, phy->sf_offset_filtered, - insync_minor_adjustment_1, insync_minor_adjustment_2, phy->sf_offset_trend); -@@ -1219,7 +1242,16 @@ void vnf_handle_timing_info(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) - return; - } - -- // todo : how to use this? -+ if (vnf_p7 && vnf_p7->p7_connections) -+ { -+ int16_t vnf_pnf_sfnsf_delta = NFAPI_SFNSF2DEC(vnf_p7->p7_connections[0].sfn_sf) - NFAPI_SFNSF2DEC(ind.last_sfn_sf); -+ -+ //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() PNF:SFN/SF:%d VNF:SFN/SF:%d deltaSFNSF:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(ind.last_sfn_sf), NFAPI_SFNSF2DEC(vnf_p7->p7_connections[0].sfn_sf), vnf_pnf_sfnsf_delta); -+ if (vnf_pnf_sfnsf_delta>1 || vnf_pnf_sfnsf_delta < -1) -+ { -+ NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() LARGE SFN/SF DELTA between PNF and VNF delta:%d VNF:%d PNF:%d\n\n\n\n\n\n\n\n\n", __FUNCTION__, vnf_pnf_sfnsf_delta, NFAPI_SFNSF2DEC(vnf_p7->p7_connections[0].sfn_sf), NFAPI_SFNSF2DEC(ind.last_sfn_sf)); -+ } -+ } - } - - void vnf_dispatch_p7_message(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) -diff --git a/vnf/src/vnf_p7_interface.c b/vnf/src/vnf_p7_interface.c -index ab4f00c..a35d8e3 100644 ---- a/vnf/src/vnf_p7_interface.c -+++ b/vnf/src/vnf_p7_interface.c -@@ -142,6 +142,7 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config) - NFAPI_TRACE(NFAPI_TRACE_INFO, "VNF P7 bind succeeded...\n"); - - -+ //struct timespec original_pselect_timeout; - struct timespec pselect_timeout; - pselect_timeout.tv_sec = 0; - pselect_timeout.tv_nsec = 1000000; // ns in a 1 us -@@ -157,13 +158,13 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config) - - struct timespec sf_duration; - sf_duration.tv_sec = 0; -- sf_duration.tv_nsec = 1000000; // ns in a 1 us -+ sf_duration.tv_nsec = 1e6; // We want 1ms pause - - struct timespec sf_start; - clock_gettime(CLOCK_MONOTONIC, &sf_start); - long millisecond = sf_start.tv_nsec / 1e6; - sf_start = timespec_add(sf_start, sf_duration); -- //NFAPI_TRACE(NFAPI_TRACE_INFO, "next subframe will start at %d.%d\n", sf_start.tv_sec, sf_start.tv_nsec); -+ NFAPI_TRACE(NFAPI_TRACE_INFO, "next subframe will start at %d.%d\n", sf_start.tv_sec, sf_start.tv_nsec); - - while(vnf_p7->terminate == 0) - { -@@ -181,6 +182,8 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config) - - if((last_millisecond == -1) || (millisecond == last_millisecond) || (millisecond == (last_millisecond + 1) % 1000) ) - { -+ //NFAPI_TRACE(NFAPI_TRACE_INFO, "pselect_start:%d.%d sf_start:%d.%d\n", pselect_start.tv_sec, pselect_start.tv_nsec, sf_start.tv_sec, sf_start.tv_nsec); -+ - - if((pselect_start.tv_sec > sf_start.tv_sec) || - ((pselect_start.tv_sec == sf_start.tv_sec) && (pselect_start.tv_nsec > sf_start.tv_nsec))) -@@ -196,16 +199,26 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config) - { - // still time before the end of the subframe wait - pselect_timeout = timespec_sub(sf_start, pselect_start); -+ -+#if 0 -+ NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() sf_start:%d.%ld pselect_start:%d.%ld pseclect_timeout:%d.%ld\n", -+ __FUNCTION__, -+ sf_start.tv_sec, sf_start.tv_nsec, -+ pselect_start.tv_sec, pselect_start.tv_nsec, -+ pselect_timeout.tv_sec, pselect_timeout.tv_nsec); -+#endif - } - -+//original_pselect_timeout = pselect_timeout; -+ - // detemine how long to sleep in ns before the start of the next 1ms - //pselect_timeout.tv_nsec = 1e6 - (pselect_start.tv_nsec % 1000000); - -- //uint8_t underun_possiable =0; -+ //uint8_t underrun_possible =0; - - // if we are not sleeping until the next milisecond due to the - // insycn minor adjment flag it so we don't consider it an error -- //uint8_t underun_possiable =0; -+ //uint8_t underrun_possible =0; - /* - { - nfapi_vnf_p7_connection_info_t* phy = vnf_p7->p7_connections; -@@ -222,7 +235,7 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config) - pselect_timeout.tv_nsec = pselect_timeout.tv_nsec - (phy->insync_minor_adjustment * 1000); - - -- //underun_possiable = 1; -+ //underrun_possible = 1; - } - else if(phy->insync_minor_adjustment < 0) - { -@@ -237,41 +250,98 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config) - */ - - -+//long wraps = pselect_timeout.tv_nsec % 1e9; -+ -+ - selectRetval = pselect(maxSock+1, &rfds, NULL, NULL, &pselect_timeout, NULL); - - clock_gettime(CLOCK_MONOTONIC, &pselect_stop); - -+ nfapi_vnf_p7_connection_info_t* phy = vnf_p7->p7_connections; -+ -+if (selectRetval==-1 && errno == 22) -+{ -+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "INVAL: pselect_timeout:%d.%ld adj[dur:%d adj:%d], sf_dur:%d.%ld\n", -+ pselect_timeout.tv_sec, pselect_timeout.tv_nsec, -+ phy->insync_minor_adjustment_duration, phy->insync_minor_adjustment, -+ sf_duration.tv_sec, sf_duration.tv_nsec); -+} -+#if 0 -+ if (selectRetval != 0 || phy->insync_minor_adjustment_duration != 0) -+ NFAPI_TRACE(NFAPI_TRACE_NOTE, "pselect()=%d maxSock:%d vnf_p7->socket:%d pselect_timeout:%u.%u original_pselect_timeout:%u.%u\n", -+ selectRetval, maxSock, vnf_p7->socket, pselect_timeout.tv_sec, pselect_timeout.tv_nsec, -+ original_pselect_timeout.tv_sec, original_pselect_timeout.tv_nsec); -+#endif -+ - if(selectRetval == 0) - { -- // calcualte the start of the next subframe -+ // calculate the start of the next subframe - sf_start = timespec_add(sf_start, sf_duration); - //NFAPI_TRACE(NFAPI_TRACE_INFO, "next subframe will start at %d.%d\n", sf_start.tv_sec, sf_start.tv_nsec); - -- nfapi_vnf_p7_connection_info_t* phy = vnf_p7->p7_connections; - if(phy && phy->in_sync && phy->insync_minor_adjustment != 0 && phy->insync_minor_adjustment_duration > 0) - { -- NFAPI_TRACE(NFAPI_TRACE_NOTE, "[VNF] Subframe minor adjustment %dus\n", phy->insync_minor_adjustment); -+ long insync_minor_adjustment_ns = (phy->insync_minor_adjustment * 1000); -+ -+ sf_start.tv_nsec -= insync_minor_adjustment_ns; -+ -+#if 1 -+ if (sf_start.tv_nsec > 1e9) -+ { -+ sf_start.tv_sec++; -+ sf_start.tv_nsec-=1e9; -+ } -+ else if (sf_start.tv_nsec < 0) -+ { -+ sf_start.tv_sec--; -+ sf_start.tv_nsec+=1e9; -+ } -+#else -+ //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[VNF] BEFORE adjustment - Subframe minor adjustment %dus sf_start.tv_nsec:%d\n", phy->insync_minor_adjustment, sf_start.tv_nsec); - if(phy->insync_minor_adjustment > 0) - { - // decrease the subframe duration a little -- sf_start.tv_nsec = sf_start.tv_nsec - (phy->insync_minor_adjustment * 1000); -+ if (sf_start.tv_nsec > insync_minor_adjustment_ns) -+ sf_start.tv_nsec -= insync_minor_adjustment_ns; -+ else -+ { -+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "[VNF] Adjustment would make it negative sf:%d.%ld adjust:%ld\n\n\n", sf_start.tv_sec, sf_start.tv_nsec, insync_minor_adjustment_ns); -+ sf_start.tv_sec--; -+ sf_start.tv_nsec += 1e9 - insync_minor_adjustment_ns; -+ } - } - else if(phy->insync_minor_adjustment < 0) - { - // todo check we don't go below 0 - // increase the subframe duration a little -- sf_start.tv_nsec = sf_start.tv_nsec - (phy->insync_minor_adjustment * 1000); -+ sf_start.tv_nsec += insync_minor_adjustment_ns; -+ -+ if (sf_start.tv_nsec < 0) -+ { -+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "[VNF] OVERFLOW %d.%ld\n\n\n\n", sf_start.tv_sec, sf_start.tv_nsec); -+ sf_start.tv_sec++; -+ sf_start.tv_nsec += 1e9; -+ } - } -+#endif - - //phy->insync_minor_adjustment = 0; -- phy->insync_minor_adjustment_duration--; -+ phy->insync_minor_adjustment_duration--; -+ -+ NFAPI_TRACE(NFAPI_TRACE_NOTE, "[VNF] AFTER adjustment - Subframe minor adjustment %dus sf_start.tv_nsec:%d duration:%u\n", -+ phy->insync_minor_adjustment, sf_start.tv_nsec, phy->insync_minor_adjustment_duration); -+ -+ if (phy->insync_minor_adjustment_duration==0) -+ { -+ phy->insync_minor_adjustment = 0; -+ } - } - /* - long pselect_stop_millisecond = pselect_stop.tv_nsec / 1e6; - if(millisecond == pselect_stop_millisecond) - { - // we have woke up in the same subframe -- if(underun_possiable == 0) -+ if(underrun_possible == 0) - NFAPI_TRACE(NFAPI_TRACE_WARN, "subframe pselect underrun %ld (%d.%d)\n", millisecond, pselect_stop.tv_sec, pselect_stop.tv_nsec); - } - else if(((millisecond + 1) % 1000) != pselect_stop_millisecond) -@@ -298,7 +368,7 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config) - - if(selectRetval == 0) - { -- vnf_p7->sf_start_time_hr = get_current_time_hr(); -+ vnf_p7->sf_start_time_hr = vnf_get_current_time_hr(); - - // pselect timed out - nfapi_vnf_p7_connection_info_t* curr = vnf_p7->p7_connections; -@@ -326,14 +396,18 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config) - else - { - // pselect error -- if(selectRetval == EINTR) -+ if(selectRetval == -1 && errno == EINTR) - { - // a sigal was received. - } - else - { -- NFAPI_TRACE(NFAPI_TRACE_INFO, "P7 select failed result %d errno %d timeout:%d.%d\n", selectRetval, errno, pselect_timeout.tv_sec, pselect_timeout.tv_nsec); -+ NFAPI_TRACE(NFAPI_TRACE_INFO, "P7 select failed result %d errno %d timeout:%d.%d orginal:%d.%d last_ms:%ld ms:%ld\n", selectRetval, errno, pselect_timeout.tv_sec, pselect_timeout.tv_nsec, pselect_timeout.tv_sec, pselect_timeout.tv_nsec, last_millisecond, millisecond); - // should we exit now? -+ if (selectRetval == -1 && errno == 22) // invalid argument??? not sure about timeout duration -+ { -+ usleep(100000); -+ } - } - } - -@@ -360,10 +434,12 @@ int nfapi_vnf_p7_stop(nfapi_vnf_p7_config_t* config) - - int nfapi_vnf_p7_add_pnf(nfapi_vnf_p7_config_t* config, const char* pnf_p7_addr, int pnf_p7_port, int phy_id) - { -- NFAPI_TRACE(NFAPI_TRACE_INFO, "%s(phy_id:%d pnf_addr:%s:%d)\n", __FUNCTION__, phy_id, pnf_p7_addr, pnf_p7_port); -+ NFAPI_TRACE(NFAPI_TRACE_INFO, "%s(config:%p phy_id:%d pnf_addr:%s pnf_p7_port:%d)\n", __FUNCTION__, config, phy_id, pnf_p7_addr, pnf_p7_port); - - if(config == 0) -- return -1; -+ { -+ return -1; -+ } - - vnf_p7_t* vnf_p7 = (vnf_p7_t*)config; - -@@ -411,6 +487,8 @@ int nfapi_vnf_p7_del_pnf(nfapi_vnf_p7_config_t* config, int phy_id) - } - int nfapi_vnf_p7_dl_config_req(nfapi_vnf_p7_config_t* config, nfapi_dl_config_request_t* req) - { -+ //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s(config:%p req:%p)\n", __FUNCTION__, config, req); -+ - if(config == 0 || req == 0) - return -1; - -diff --git a/vnf_sim/src/mac.cpp b/vnf_sim/src/mac.cpp -index aa97f72..fa6f487 100644 ---- a/vnf_sim/src/mac.cpp -+++ b/vnf_sim/src/mac.cpp -@@ -743,7 +743,7 @@ extern "C" - { - cqi_ri_information.cqi_ri_information_rel9.aperiodic_cqi_pmi_ri_report.number_of_cc = 1; - cqi_ri_information.cqi_ri_information_rel9.aperiodic_cqi_pmi_ri_report.cc[0].ri_size = rand_range(0, 3); -- cqi_ri_information.cqi_ri_information_rel9.aperiodic_cqi_pmi_ri_report.cc[0].dl_cqi_pmi_size = rand_range(0, 255); -+ cqi_ri_information.cqi_ri_information_rel9.aperiodic_cqi_pmi_ri_report.cc[0].dl_cqi_pmi_size[0] = rand_range(0, 255); - } - - cqi_ri_information.cqi_ri_information_rel13.tl.tag = NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL13_TAG; -diff --git a/vnf_sim/src/main.cpp b/vnf_sim/src/main.cpp -index b79ac40..5dc7161 100644 ---- a/vnf_sim/src/main.cpp -+++ b/vnf_sim/src/main.cpp -@@ -428,6 +428,20 @@ void phy_deallocate_p7_vendor_ext(nfapi_p7_message_header_t* header) - free(header); - } - -+//static pthread_t vnf_start_pthread; -+static pthread_t vnf_p7_start_pthread; -+void* vnf_p7_start_thread(void *ptr) -+{ -+ printf("%s()\n", __FUNCTION__); -+ -+ //std::shared_ptr config = std::shared_ptr(ptr); -+ nfapi_vnf_p7_config_t *config = (nfapi_vnf_p7_config_t *)ptr; -+ -+ nfapi_vnf_p7_start(config); -+ -+ return 0; -+} -+ - void set_thread_priority(int priority) - { - //printf("%s(priority:%d)\n", __FUNCTION__, priority); -@@ -458,6 +472,8 @@ void set_thread_priority(int priority) - - void* vnf_p7_thread_start(void* ptr) - { -+ printf("%s()\n", __FUNCTION__); -+ - set_thread_priority(79); - - vnf_p7_info* p7_vnf = (vnf_p7_info*)ptr; -@@ -494,10 +510,10 @@ void* vnf_p7_thread_start(void* ptr) - p7_vnf->config->allocate_p7_vendor_ext = &phy_allocate_p7_vendor_ext; - p7_vnf->config->deallocate_p7_vendor_ext = &phy_deallocate_p7_vendor_ext; - -- nfapi_vnf_p7_start(p7_vnf->config.get()); -+ printf("[VNF] Creating VNF NFAPI start thread %s\n", __FUNCTION__); -+ pthread_create(&vnf_p7_start_pthread, NULL, &vnf_p7_start_thread, p7_vnf->config.get()); - - return 0; -- - } - - int pnf_connection_indication_cb(nfapi_vnf_config_t* config, int p5_idx) -diff --git a/wireshark/packet-nfapi.c b/wireshark/packet-nfapi.c -index da0edb0..7e0f23f 100755 ---- a/wireshark/packet-nfapi.c -+++ b/wireshark/packet-nfapi.c -@@ -1,6069 +1,12284 @@ --/* -+/* packet-nfapi.c -+* Routines for Network Function Application Platform Interface (nFAPI) dissection - * Copyright 2017 Cisco Systems, Inc. - * --* Licensed under the Apache License, Version 2.0 (the "License"); --* you may not use this file except in compliance with the License. --* You may obtain a copy of the License at -+* Wireshark - Network traffic analyzer -+* By Gerald Combs -+* Copyright 1998 Gerald Combs -+* -+* This program is free software; you can redistribute it and/or -+* modify it under the terms of the GNU General Public License -+* as published by the Free Software Foundation; either version 2 -+* of the License, or (at your option) any later version. -+* -+* This program is distributed in the hope that it will be useful, -+* but WITHOUT ANY WARRANTY; without even the implied warranty of -+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+* GNU General Public License for more details. -+* -+* You should have received a copy of the GNU General Public License -+* along with this program; if not, write to the Free Software -+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * --* http://www.apache.org/licenses/LICENSE-2.0 -+* References: -+* SCF082.09.04 http://scf.io/en/documents/082_-_nFAPI_and_FAPI_specifications.php - * --* Unless required by applicable law or agreed to in writing, software --* distributed under the License is distributed on an "AS IS" BASIS, --* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --* See the License for the specific language governing permissions and --* limitations under the License. - */ -- -- --#include "config.h" -- --#include --#include --#include -- --#include --#include --#include --#include --#include -- -+ -+#include "config.h" -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include -+ -+void proto_register_nfapi(void); -+void proto_reg_handoff_nfapi(void); -+ - #define NFAPI_HEADER_LENGTH 8 --#define NFAPI_P7_HEADER_LENGTH 16 -- --typedef int(*Decode_operation)(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset); -- --static const value_string nfapi_error_vals[] = { -- { 0x0, "MSG_OK" }, -- { 0x1, "MSG_INVALID_STATE" }, -- { 0x2, "MSG_INVALID_CONFIG" }, -- { 0x3, "SFN_OUT_OF_SYNC" }, -- { 0x4, "MSG_SUBFRAME_ERR" }, -- { 0x5, "MSG_BCH_MISSING" }, -- { 0x6, "MSG_BCH_MISSING" }, -- { 0x7, "MSG_HI_ERR" }, -- { 0x8, "MSG_TX_ERR" }, -- { 0, NULL }, --}; -- --static const value_string nfapi_p4_error_vals[] = { -- { 100, "MSG_OK" }, -- { 101, "MSG_INVALID_STATE" }, -- { 102, "MSG_INVALID_CONFIG" }, -- { 103, "MSG_RAT_NOT_SUPPORTED" }, -- { 200, "MSG_NMM_STOP_OK" }, -- { 201, "MSG_NMM_STOP_IGNORED" }, -- { 202, "MSG_NMM_STOP_INVALID_STATE" }, -- { 300, "MSG_PROCEDURE_COMPLETE" }, -- { 301, "MSG_PROCEDURE_STOPPED" }, -- { 302, "MSG_PARTIAL_RESULTS" }, -- { 303, "MSG_TIMEOUT" }, -- { 0, NULL }, --}; -- --static const value_string nfapi_rat_type_vals[] = { -- { 0, "LTE" }, -- { 1, "UTRAN" }, -- { 2, "GERAN" }, -- { 0, NULL }, --}; -- --typedef enum{ -- UN_ALIGNED_SYNCHRONIZATION = 0, -- INTERNAL_PNF_FRAME_ALIGNMENT, -- ABSOLUTE_TIME_ALIGNED_SYNCHRONIZATION --} nfapi_sync_mode_e; -- --static const value_string nfapi_sync_mode_vals[] = { -- { UN_ALIGNED_SYNCHRONIZATION, "UN-ALIGNED SYNCHRONIZATION" }, -- { INTERNAL_PNF_FRAME_ALIGNMENT, "INTERNAL PNF FRAME ALIGNMENT" }, -- { ABSOLUTE_TIME_ALIGNED_SYNCHRONIZATION, "ABSOLUTE TIME ALIGNED SYNCHRONIZATION" } --}; -- --typedef enum { -- NONE = 0, -- GPS, -- GLONASS, -- BEIDOU --} location_mode_e; -- --static const value_string location_mode_vals[] = { -- { NONE, "NONE" }, -- { GPS, "GPS" }, -- { GLONASS, "GLONASS" }, -- { BEIDOU, "BeiDou" }, -- { 0, NULL } --}; -- --static const value_string nfapi_uplink_rs_hopping_vals[] = { -- { 0, "RS_NO_HOPPING" }, -- { 1, "RS_GROUP_HOPPING" }, -- { 2, "RS_SEQUENCE_HOPPING" }, -- { 0, NULL } --}; -- --static const value_string nfapi_laa_carrier_type_vals[] = { -- { 0, "No multi carrier support" }, -- { 1, "Mode A1" }, -- { 2, "Mode A12" }, -- { 3, "Mode B1" }, -- { 4, "Mode B2" }, -- { 0, NULL } --}; -- --static const value_string nfapi_mutli_carrier_lbt_support_vals[] = { -- { 0, "Multi carrier Mode A1" }, -- { 1, "Multi carrier Mode A2" }, -- { 2, "Multi carrier Mode B1" }, -- { 3, "Multi carrier Mode B2" }, -- { 0, NULL } --}; -- --static const value_string nfapi_lbt_dl_req_pdu_type[] = { -- { 0, "LBT_PDSCH_REQ PDU" }, -- { 1, "LBT_DRS_REQ PDU" }, -- { 0, NULL } --}; -- -- --static const value_string nfapi_lbt_dl_ind_pdu_type[] = { -- { 0, "LBT_PDSCH_RSP PDU" }, -- { 1, "LBT_DRS_RSP PDU" }, -- -- { 0, NULL } --}; -- -- -- -- --/* These are definitions where data 0 & 1 represent/provide a string name*/ -- --static const true_false_string true_false_strname = { -- "TRUE", -- "FALSE" --}; -- --static const true_false_string nfapi_csi_report_type_strname = { -- "Periodic", -- "Aperiodic", --}; -- --static const true_false_string nfapi_control_type_string_name = { -- "CQI/PMI", -- "RI", --}; -- --static const true_false_string transport_block_to_codeword_swap_flag = { -- "NO_SWAPPING", -- "SWAPPED" --}; -- --static const true_false_string virtual_resource_block_assignment_flag = { -- "LOCALIZED", -- "DISTRIBUTED" --}; -- --static const true_false_string ngap_string_name = { -- "N-GAP 1", -- "N-GAP 2" --}; -- --static const true_false_string nprb_strname = { -- "= 2", -- "= 3", --}; -- --static const true_false_string cyclic_prefix_type_strname = { -- "CP_NORMAL", -- "CP_EXTENDED" --}; -- --static const true_false_string support_strname = { -- "No Support", -- "Support" --}; -- --static const true_false_string partial_sf_support_strname = --{ -- "Start partial SF support", -- "End partial SF support" --}; -- --static const true_false_string phich_duration_strname = { -- "PHICH_D_NORMAL", -- "PHICH_D_EXTENDED" --}; -- --static const true_false_string high_speed_flag_strname = { -- "HS_UNRESTRICTED_SET", -- "HS_RESTRICTED_SET" --}; -- --static const true_false_string hopping_mode_strname = { -- "HM_INTER_SF", -- "HM_INTRA_INTER_SF" --}; -- --static const true_false_string enabled_disabled_strname = { -- "Enabled", -- "Disabled" --}; -- --static const true_false_string srs_simult_tx_strname = { -- "No Simultaneous Transmission", -- "Simultaneous Transmission" --}; -- --static const true_false_string crc_flag_strname = { -- "CRC_CORRECT", -- "CRC_ERROR" --}; -- --static const true_false_string hi_value_strname = { -- "HI_NACK", -- "HI_ACK" --}; -- --static const true_false_string flag_tb2_strname = { -- "HI_NOT_PRESENT", -- "HI_PRESENT" --}; -- --static const true_false_string nfapi_multi_carrier_tx_strname = { -- "Mutual transmission (self-deferral support for current carrier)", -- "Transmit on channel access win (no self-deferral)" --}; -- --static const true_false_string nfapi_multi_carrier_freeze_strname = { -- "Absence of other technology isn’t guaranteed", -- "Absence of other technology is guaranteed" --}; -- --static const value_string nfapi_dl_config_pdu_type_vals[] = { -- { 0, "DL_CONFIG_DCI_DL_PDU" }, -- { 1, "DL_CONFIG_BCH_PDU" }, -- { 2, "DL_CONFIG_MCH_PDU" }, -- { 3, "DL_CONFIG_DLSCH_PDU" }, -- { 4, "DL_CONFIG_PCH_PDU" }, -- { 5, "DL_CONFIG_PRS_PDU" }, -- { 6, "DL_CONFIG_CSI_RS_PDU" }, -- { 7, "DL_CONFIG_EPDCCH_DL_PDU" }, -- { 8, "DL_CONFIG_EPDCCH_DL_PDU" }, -- { 0, NULL } --}; -- --static const value_string nfapi_duplex_mode_vals[] = { -- { 0, "TDD" }, -- { 1, "FDD" }, -- { 2, "HD-FDD" }, -- { 0, NULL } --}; -- --static const value_string modulation_vals[] = { -- { 2, "QPSK" }, -- { 4, "16QAM" }, -- { 6, "64QAM" }, -- { 8, "256QAM" }, -- { 0, NULL } --}; -- --static const value_string pch_modulation_vals[] = { -- { 0, "QPSK" }, -- { 0, NULL } --}; -- --static const value_string ue_mode_vals[] = { -- { 0, "non LC/CE UE" }, -- { 1, "LC/CE UE" }, -- { 0, NULL } --}; -- --static const value_string csi_rs_class_vals[] = { -- { 0, "not used" }, -- { 1, "Class A" }, -- { 1, "Class B" }, -- { 0, NULL } --}; -- --static const value_string csi_rs_cdm_type_vals[] = { -- { 0, "cdm 2" }, -- { 1, "cdm 4" }, -- { 0, NULL } --}; -- --static const value_string antenna_ports_vals[] = { -- { 0, "1 antenna ports" }, -- { 1, "2 antenna ports" }, -- { 2, "4 antenna ports" }, -- { 0, NULL } --}; -- --static const value_string combs_vals[] = { -- { 0, "2 TC" }, -- { 1, "4 TC" }, -- { 0, NULL } --}; -- --static const value_string resource_allocation_type_vals[] = { -- { 0, "type 0" }, -- { 1, "type 1" }, -- { 2, "type 2 1A/1B/1D" }, -- { 3, "type 2 1C" }, -- { 4, "type 2 6-1A" }, -- { 5, "type UEModeB" }, -- { 0, NULL } --}; -- --static const value_string transmission_scheme_vals[] = { -- { 0, "SINGLE_ANTENNA_PORT_0" }, -- { 1, "TX_DIVERSITY" }, -- { 2, "LARGE_DELAY_CDD" }, -- { 3, "CLOSED_LOOP_SPATIAL_MULTIPLEXING" }, -- { 4, "MULTI_USER_MIMO" }, -- { 5, "CLOSED_LOOP_RANK_1_PRECODING" }, -- { 6, "SINGLE_ANTENNA_PORT_5" }, -- { 7, "SINGLE_ANTENNA_PORT_7" }, -- { 8, "SINGLE_ANTENNA_PORT_8" }, -- { 9, "DUAL_LAYER_TX_PORT_7_AND_8" }, -- { 10, "UP_TO_8_LAYER_TX" }, -- { 11, "SINGLE_ANTENNA_PORT_11" }, -- { 12, "SINGLE_ANTENNA_PORT_13" }, -- { 13, "SINGLE_ANTENNA_PORT_11_13" }, -- { 0, NULL } --}; -- --static const value_string ul_transmission_scheme_vals[] = { -- { 0, "SINGLE_ANTENNA_PORT_10" }, -- { 1, "CLOSED_LOOP_SPATIAL_MULTIPLEXING" }, --}; -- --static const value_string dci_format_vals[] = { -- { 0, "1" }, -- { 1, "1A" }, -- { 2, "1B" }, -- { 3, "1C" }, -- { 4, "1D" }, -- { 5, "2" }, -- { 6, "2A" }, -- { 7, "2B" }, -- { 8, "2C" }, -- { 9, "2D" }, -- { 0, NULL } --}; -- --static const value_string pa_vals[] = { -- { 0, "-6dB" }, -- { 1, "-4.77dB" }, -- { 2, "-3dB" }, -- { 3, "-1.77dB" }, -- { 4, "0dB" }, -- { 5, "1dB" }, -- { 6, "2dB" }, -- { 7, "3dB" }, -- { 0, NULL } --}; -- --static const value_string transmission_mode_vals[] = { -- { 1, "Mode 1" }, -- { 2, "Mode 2" }, -- { 3, "Mode 3" }, -- { 4, "Mode 4" }, -- { 5, "Mode 5" }, -- { 6, "Mode 6" }, -- { 7, "Mode 7" }, -- { 8, "Mode 8" }, -- { 9, "Mode 9" }, -- { 10, "Mode 10" }, -- { 0, NULL } --}; -- --static const value_string nfapi_ul_config_pdu_type_vals[] = { -- { 0, "ULSCH" }, -- { 1, "ULSCH_CQI_RI" }, -- { 2, "ULSCH_HARQ" }, -- { 3, "ULSCH_CQI_HARQ_RI" }, -- { 4, "UCI_CQI" }, -- { 5, "UCI_SR" }, -- { 6, "UCI_HARQ" }, -- { 7, "UCI_SR_HARQ" }, -- { 8, "UCI_CQI_HARQ" }, -- { 9, "UCI_CQI_SR" }, -- { 10, "UCI_CQI_SR_HARQ" }, -- { 11, "SRS" }, -- { 12, "HARQ_BUFFER" }, -- { 13, "ULSCH_UCI_CSI" }, -- { 14, "ULSCH_UCI_HARQ" }, -- { 15, "ULSCH_CSI_UCI_HARQ" }, -- { 0, NULL } --}; -- --typedef enum { -- NFAPI_ACK_NACK_MODE_BUNDLING = 0, -- NFAPI_ACK_NACK_MODE_MULTIPLEXING, -- NFAPI_ACK_NACK_MODE_FORMAT_1B_WITH_CHAN_SEL, -- NFAPI_ACK_NACK_MODE_FORMAT_3, --} nfapi_ack_nack_mode_e; -- --static const value_string nfapi_ack_nack_mode_vals[] = { -- { NFAPI_ACK_NACK_MODE_BUNDLING, "Bundling" }, -- { NFAPI_ACK_NACK_MODE_MULTIPLEXING, "Multiplexing" }, -- { NFAPI_ACK_NACK_MODE_FORMAT_1B_WITH_CHAN_SEL, "Format 1b with channel selection" }, -- { NFAPI_ACK_NACK_MODE_FORMAT_3, "Format 3" }, -- { 0, NULL } --}; -- --typedef enum { -- NFAPI_ANTENNA_PORT1 = 0, -- NFAPI_ANTENNA_PORT2, -- NFAPI_ANTENNA_PORT4, --} nfapi_ack_nack_mode_e; -- --static const value_string nfapi_antenna_port_vals[] = { -- { NFAPI_ANTENNA_PORT1, "1 " }, -- { NFAPI_ANTENNA_PORT2, "2 " }, -- { NFAPI_ANTENNA_PORT4, "4 " }, -- { 0, NULL } --}; -- --typedef enum{ -- PHICH_R_ONE_SIXTH = 0, -- PHICH_R_HALF, -- PHICH_R_ONE, -- PHICH_R_TWO --} nfapi_phich_resource_e; -- --static const value_string nfapi_phich_resource_vals[] = { -- { PHICH_R_ONE_SIXTH, "PHICH_R_ONE_SIXTH " }, -- { PHICH_R_HALF, "PHICH_R_HALF" }, -- { PHICH_R_ONE, "PHICH_R_ONE" }, -- { PHICH_R_TWO, "PHICH_R_TWO" }, -- { 0, NULL } --}; -- --static const value_string local_distributed_vals[] = { -- { 0, "localized" }, -- { 1, "distributed" }, -- { 0, NULL } --}; -- --static const value_string transport_block_to_codeword_swap_flag_vals[] = { -- { 0, "no swapping" }, -- { 1, "swapped" }, -- { 0, NULL } --}; -- --static const value_string ngap_vals[] = { -- { 0, "Ngap1" }, -- { 1, "Ngap2" }, -- { 0, NULL } --}; -- --static const value_string true_false_vals[] = { -- { 0, "false" }, -- { 1, "true" }, -- { 0, NULL } --}; -- --static const value_string exhustive_search_vals[] = { -- { 0, "non-exhaustive search" }, -- { 1, "exhaustive search" }, -- { 0, NULL } --}; -- --static const value_string not_used_enabled_vals[] = { -- { 0, "not used" }, -- { 1, "enabled" }, -- { 0, NULL } --}; -- --static const value_string hopping_vals[] = { -- { 0, "no hopping" }, -- { 1, "hopping enabled" }, -- { 0, NULL } --}; -- -- --static const value_string rnti_type_vals[] = { -- { 1, "C-RNTI" }, -- { 2, "RA-RNTI, P-RNTI, SI-RNTI, SC-RNTI, G-RNTI" }, -- { 3, "SPS-CRNTI" }, -- { 0, NULL } --}; -- --static const value_string primary_cells_type_vals[] = { -- { 1, "TDD" }, -- { 2, "FDD" }, -- { 3, "HD_FDD" }, -- { 0, NULL } --}; -- --static const value_string ul_rssi_supported_vals[] = { -- { 0, "Uplink RSSI not supported" }, -- { 1, "Uplink RSSI supported" }, -- { 0, NULL} --}; -- -- --typedef enum --{ -- NMM_NONE = 0, -- NMM_ONLY, -- NMM_IN_CONFIGURED_STATE, -- NMM_IN_RUNNING_STATE, -- NMM_IN_CONFIGURED_AND_RUNNING_STATE --} nmm_modes_supported_e; -- --static const value_string nmm_modes_supported_vals[] = --{ -- { NMM_NONE, "NONE" }, -- { NMM_ONLY, "NMM_ONLY" }, -- { NMM_IN_CONFIGURED_STATE, "NMM_IN_CONFIGURED_STATE" }, -- { NMM_IN_RUNNING_STATE, "NMM_IN_RUNNING_STATE" }, -- { NMM_IN_CONFIGURED_AND_RUNNING_STATE, "NMM_IN_CONFIGURED_AND_RUNNING_STAT" }, -- { 0, NULL } --}; -- -- -- -- -- --static int proto_nfapi = -1; -- --/* These are for the subtrees */ --static gint ett_nfapi_message_tree = -1; --static gint ett_nfapi_p4_p5_message_header = -1; --static gint ett_nfapi_p7_message_header = -1; --static gint ett_nfapi_tlv_tree = -1; --static gint ett_nfapi_tl = -1; --static gint ett_nfapi_pnf_param_response = -1; --static gint ett_nfapi_pnf_phy = -1; --static gint ett_nfapi_pnf_phy_rel10 = -1; --static gint ett_nfapi_pnf_phy_rel11 = -1; --static gint ett_nfapi_pnf_phy_rel12 = -1; --static gint ett_nfapi_pnf_phy_rel13 = -1; --static gint ett_nfapi_pnf_rf = -1; --static gint ett_nfapi_phy_rf_config_info = -1; --static gint ett_nfapi_pnf_phy_rf_config = -1; --static gint ett_nfapi_pnf_phy_rf_config_instance = -1; --static gint ett_nfapi_phy_state = -1; --static gint ett_nfapi_l1_status = -1; --static gint ett_nfapi_rf_bands = -1; --static gint ett_nfapi_tx_antenna_ports = -1; --static gint ett_nfapi_harq_ack_nack_data = -1; --static gint ett_nfapi_harq_data = -1; --static gint ett_nfapi_cc = -1; --static gint ett_nfapi_rbs = -1; --static gint ett_nfapi_antennas = -1; --static gint ett_nfapi_dl_config_dci_dl_pdu_rel8 = -1; --static gint ett_nfapi_dl_config_dci_dl_pdu_rel9 = -1; --static gint ett_nfapi_dl_config_dci_dl_pdu_rel10 = -1; --static gint ett_nfapi_dl_config_dci_dl_pdu = -1; --static gint ett_nfapi_dl_config_request_pdu = -1; --static gint ett_nfapi_dl_config_request_body = -1; --static gint ett_nfapi_dl_config_request_pdu_list = -1; --static gint ett_nfapi_ul_config_request_pdu_list = -1; --static gint ett_nfapi_hi_dci0_request_pdu_list = -1; --static gint ett_nfapi_tx_request_pdu_list = -1; --static gint ett_nfapi_rx_indication_pdu_list = -1; --static gint ett_nfapi_harq_indication_pdu_list = -1; --static gint ett_nfapi_crc_indication_pdu_list = -1; --static gint ett_nfapi_sr_indication_pdu_list = -1; --static gint ett_nfapi_cqi_indication_pdu_list = -1; --static gint ett_nfapi_preamble_indication_pdu_list = -1; --static gint ett_nfapi_srs_indication_pdu_list = -1; --static gint ett_nfapi_lbt_dl_config_pdu_list = -1; --static gint ett_nfapi_lbt_dl_indication_pdu_list = -1; --static gint ett_nfapi_dl_node_sync = -1; --static gint ett_nfapi_ul_node_sync = -1; --static gint ett_nfapi_timing_info = -1; --static gint ett_nfapi_dl_config_request_dlsch_pdu_rel8 = -1; --static gint ett_nfapi_subbands = -1; --static gint ett_nfapi_dl_config_request_dlsch_pdu_rel9 = -1; --static gint ett_nfapi_dl_config_request_dlsch_pdu_rel10 = -1; --static gint ett_nfapi_dl_config_bch_pdu_rel8 = -1; --static gint ett_nfapi_dl_config_mch_pdu_rel8 = -1; --static gint ett_nfapi_dl_config_pch_pdu_rel8 = -1; --static gint ett_nfapi_dl_config_prs_pdu_rel9 = -1; --static gint ett_nfapi_dl_config_csi_rs_pdu_rel10 = -1; --static gint ett_nfapi_ul_config_request_body = -1; --static gint ett_nfapi_ul_config_harq_buffer_pdu = -1; --static gint ett_nfapi_ul_config_ue_information_rel8 = -1; --static gint ett_nfapi_ul_config_sr_information_pdu_rel8 = -1; --static gint ett_nfapi_ul_config_ulsch_pdu_rel8 = -1; --static gint ett_nfapi_ul_config_ulsch_pdu_rel10 = -1; --static gint ett_nfapi_ul_config_cqi_ri_information_rel8 = -1; --static gint ett_nfapi_ul_config_cqi_ri_information_rel9 = -1; --static gint ett_nfapi_ul_config_ulsch_harq_information_rel10 = -1; --static gint ett_nfapi_ul_config_initial_transmission_parameters_rel8 = -1; --static gint ett_nfapi_ul_config_cqi_information_rel8 = -1; --static gint ett_nfapi_ul_config_cqi_information_rel10 = -1; --static gint ett_nfapi_ul_config_sr_information_rel8 = -1; --static gint ett_nfapi_ul_config_sr_information_rel10 = -1; --static gint ett_nfapi_ul_config_harq_information_rel10_tdd = -1; --static gint ett_nfapi_ul_config_harq_information_rel8_fdd = -1; --static gint ett_nfapi_ul_config_harq_information_rel9_fdd = -1; --static gint ett_nfapi_ul_config_srs_pdu_rel8 = -1; --static gint ett_nfapi_ul_config_srs_pdu_rel10 = -1; --static gint ett_nfapi_crc_indication_body = -1; --static gint ett_nfapi_bf_vector_antennas = -1; --static gint ett_nfapi_bf_vectors = -1; --static gint ett_nfapi_csi_rs_resource_configs = -1; --static gint ett_nfapi_csi_rs_bf_vector = -1; --static gint ett_nfapi_epdcch_prbs = -1; --static gint ett_nfapi_precoding = -1; --static gint ett_nfapi_earfcn_list = -1; --static gint ett_nfapi_uarfcn_list = -1; --static gint ett_nfapi_arfcn_list = -1; --static gint ett_nfapi_rssi_list = -1; --static gint ett_nfapi_pci_list = -1; --static gint ett_nfapi_psc_list = -1; --static gint ett_nfapi_lte_cells_found_list = -1; --static gint ett_nfapi_utran_cells_found_list = -1; --static gint ett_nfapi_geran_cells_found_list = -1; --static gint ett_nfapi_si_periodicity_list = -1; -- --static expert_field ei_invalid_range = EI_INIT; --static expert_field ei_power_invalid = EI_INIT; --static expert_field ei_ref_sig_power_invalid = EI_INIT; -- -- --static int hf_nfapi_message_tree = -1; -- --static int hf_nfapi_p4_p5_message_header = -1; --static int hf_nfapi_p4_p5_message_header_phy_id = -1; --static int hf_nfapi_p4_p5_message_header_message_id = -1; --static int hf_nfapi_p4_p5_message_header_message_length = -1; --static int hf_nfapi_p4_p5_message_header_spare = -1; -- --static int hf_nfapi_p7_message_header = -1; --static int hf_nfapi_p7_message_header_phy_id = -1; --static int hf_nfapi_p7_message_header_message_id = -1; --static int hf_nfapi_p7_message_header_message_length = -1; --static int hf_nfapi_p7_message_header_m = -1; --static int hf_nfapi_p7_message_header_segment = -1; --static int hf_nfapi_p7_message_header_sequence_number = -1; --static int hf_nfapi_p7_message_header_checksum = -1; --static int hf_nfapi_p7_message_header_transmit_timestamp = -1; -- --static int hf_nfapi_tlv_tree = -1; -- --static int hf_nfapi_tl = -1; --static int hf_nfapi_tl_tag = -1; --static int hf_nfapi_tl_length = -1; --static int hf_nfapi_tag_uint8_value = -1; --static int hf_nfapi_tag_uint16_value = -1; -- --static int hf_nfapi_pnf_param_general = -1; --static int hf_nfapi_sync_mode = -1; --static int hf_nfapi_location_mode = -1; --static int hf_nfapi_location_coordinates = -1; --static int hf_nfapi_location_coordinates_length = -1; --static int hf_nfapi_dl_config_timing = -1; --static int hf_nfapi_tx_timing = -1; --static int hf_nfapi_ul_config_timing = -1; --static int hf_nfapi_hi_dci0_timing = -1; --static int hf_nfapi_maximum_number_phys = -1; --static int hf_nfapi_maximum_total_bandwidth = -1; --static int hf_nfapi_maximum_total_number_dl_layers = -1; --static int hf_nfapi_maximum_total_number_ul_layers = -1; --static int hf_nfapi_shared_bands = -1; --static int hf_nfapi_shared_pa = -1; --static int hf_nfapi_maximum_total_power = -1; --static int hf_nfapi_oui= -1; -- --static int hf_nfapi_pdu = -1; -- --static int hf_nfapi_pnf_phy = -1; --static int hf_nfapi_pnf_phy_nfapi_tl = -1; /* structure hf_nfapi_tl*/ --static int hf_nfapi_pnf_phy_number_phy = -1; --static int hf_nfapi_pnf_phy_config_index = -1; --static int hf_nfapi_number_of_rf_exclusions = -1; --static int hf_nfapi_dl_bandwidth_support = -1; --static int hf_nfapi_ul_bandwidth_support = -1; --static int hf_nfapi_downlink_channel_bandwidth_supported = -1; --static int hf_nfapi_uplink_channel_bandwidth_supported = -1; --static int hf_nfapi_number_of_dl_layers_supported = -1; --static int hf_nfapi_number_of_ul_layers_supported = -1; --static int hf_nfapi_maximum_3gpp_release_supported = -1; --static int hf_nfapi_nmm_modes_supported = -1; -- -- --static int hf_nfapi_pnf_rf = -1; --static int hf_nfapi_pnf_rf_nfapi_tl = -1; --static int hf_nfapi_number_of_rfs = -1; --static int hf_nfapi_rf_config_index = -1; --static int hf_nfapi_band = -1; --static int hf_nfapi_maximum_transmit_power = -1; --static int hf_nfapi_earfcn = -1; --static int hf_nfapi_minimum_transmit_power = -1; --static int hf_nfapi_number_of_antennas_suppported = -1; --static int hf_nfapi_minimum_downlink_frequency = -1; --static int hf_nfapi_maximum_downlink_frequency = -1; --static int hf_nfapi_minimum_uplink_frequency = -1; --static int hf_nfapi_maximum_uplink_frequency = -1; -- --static int hf_nfapi_number_of_rf_bands = -1; --static int hf_nfapi_nmm_uplink_rssi_supported = -1; -- --static int hf_nfapi_phy_rf_config_info = -1; --static int hf_nfapi_phy_rf_config_info_phy_id = -1; --static int hf_nfapi_phy_rf_config_info_band = -1; -- --static int hf_nfapi_pnf_phy_rf_config = -1; --static int hf_nfapi_pnf_phy_rf_config_number_phy_rf_config_info = -1; --static int hf_nfapi_pnf_phy_rf_config_array_phy_rf_config_info = -1; -- --static int hf_nfapi_pnf_phy_rel10 = -1; --static int hf_nfapi_transmission_mode7_supported = -1; --static int hi_nfapi_transmission_mode8_supported = -1; --static int hi_nfapi_two_antennas_ports_for_pucch = -1; --static int hi_nfapi_transmission_mode_9_supported = -1; --static int hi_nfapi_simultaneous_pucch_pusch = -1; --static int hi_nfapi_for_layer_tx_with_tm3_and_tm4 = -1; -- --static int hf_nfapi_pnf_phy_rel11 = -1; --static int hf_nfapi_epdcch_supported = -1; --static int hi_nfapi_multi_ack_csi_reporting = -1; --static int hi_nfapi_pucch_tx_diversity_with_channel_selection = -1; --static int hi_nfapi_ul_comp_supported = -1; --static int hi_nfapi_transmission_mode_5_supported = -1; -- --static int hf_nfapi_pnf_phy_rel12 = -1; --static int hf_nfapi_csi_subframe_set = -1; --static int hi_nfapi_enhanced_4tx_codebook = -1; --static int hi_nfapi_drs_supported = -1; --static int hi_nfapi_ul_64qam_supported = -1; --static int hi_nfapi_transmission_mode_10_supported = -1; --static int hi_nfapi_alternative_tbs_indices = -1; -- --static int hf_nfapi_pnf_phy_rel13 = -1; --static int hf_nfapi_pucch_format_4_supported = -1; --static int hf_nfapi_pucch_format_5_supported = -1; --static int hf_nfapi_more_than_5_ca_supported = -1; --static int hf_nfapi_laa_supported = -1; --static int hf_nfapi_laa_ending_in_dwpts_supported = -1; --static int hf_nfapi_laa_starting_in_second_slot_supported = -1; --static int hf_nfapi_beamforming_supported = -1; --static int hf_nfapi_csi_rs_enhancements_supported = -1; --static int hf_nfapi_drms_enhancements_supported = -1; --static int hf_nfapi_srs_enhancements_supported = -1; -- -- --// P5 Message Structures --static int hf_nfapi_pnf_param_response_pnf_param_general = -1; --static int hf_nfapi_pnf_param_response_pnf_phy = -1; --static int hf_nfapi_pnf_param_response_pnf_rf = -1; -- --static int hf_nfapi_pnf_param_request = -1; --static int hf_nfapi_pnf_param_response = -1; --static int hf_nfapi_pnf_config_request = -1; --static int hf_nfapi_pnf_config_response = -1; --static int hf_nfapi_pnf_start_request = -1; --static int hf_nfapi_pnf_start_response = -1; --static int hf_nfapi_pnf_stop_request = -1; --static int hf_nfapi_pnf_stop_response = -1; --static int hf_nfapi_param_response = -1; --static int hf_nfapi_start_request = -1; --static int hf_nfapi_start_response = -1; --static int hf_nfapi_stop_request = -1; --static int hf_nfapi_stop_response = -1; -- --static int hf_nfapi_uint8_tag = -1; --static int hf_nfapi_uint16_tag = -1; -- --static int hf_nfapi_error_code = -1; --static int hf_nfapi_p4_error_code = -1; --static int hf_nfapi_rat_type = -1; --static int hf_nfapi_num_tlv = -1; --static int hf_nfapi_phy_state = -1; --// static int hf_nfapi_bandwidth_support = -1; -- --static int hf_nfapi_modulation_support = -1; --static int hf_nfapi_phy_antenna_capability = -1; --static int hf_nfapi_release_capability = -1; --static int hf_nfapi_mbsfn_capability = -1; -- --static int hf_nfapi_laa_capability = -1; --static int hf_nfapi_pd_sensing_lbt_support = -1; --static int hf_nfapi_multi_carrier_lbt_support = -1; --static int hf_nfapi_partial_sf_support = -1; -- --/* nfapi nfapi */ --static int hf_nfapi_pnf_address = -1; --static int hf_nfapi_pnf_address_ipv4 = -1; --static int hf_nfapi_pnf_address_ipv6 = -1; -- --static int hf_nfapi_vnf_address = -1; --static int hf_nfapi_vnf_address_ipv4 = -1; --static int hf_nfapi_vnf_address_ipv6 = -1; -- --static int hf_nfapi_pnf_port = -1; --static int hf_nfapi_vnf_port = -1; --static int hf_nfapi_dl_ue_per_sf = -1; --static int hf_nfapi_ul_ue_per_sf = -1; -- --static int hf_nfapi_rf_bands = -1; --static int hf_nfapi_rf_bands_nfapi_tl = -1; --static int hf_nfapi_rf_bands_count = -1; --static int hf_nfapi_rf_bands_value = -1; -- --static int hf_nfapi_timing_window = -1; --static int hf_nfapi_timing_info_mode = -1; --static int hf_nfapi_timing_info_period = -1; --static int hf_nfapi_max_transmit_power = -1; -- --/* subframe config */ --static int hf_nfapi_duplex_mode = -1; --static int hf_nfapi_pcfich_power_offset = -1; --static int hf_nfapi_pb = -1; --static int hf_nfapi_dl_cyclic_prefix_type = -1; --static int hf_nfapi_ul_cyclic_prefix_type = -1; -- --static int hf_nfapi_tx_antenna_ports = -1; --static int hf_nfapi_rx_antenna_ports = -1; -- -- -- --/* RF Config */ --static int hf_nfapi_downlink_channel_bandwidth = -1; --static int hf_nfapi_uplink_channel_bandwidth = -1; --static int hf_nfapi_reference_signal_power = -1; -- --/* PHICH config*/ --static int hf_nfapi_phich_resource = -1; --static int hf_nfapi_phich_duration = -1; --static int hf_nfapi_phich_power_offset = -1; -- --static int hf_nfapi_value_float = -1; -- --/* SCH Config */ --static int hf_nfapi_primary_synchronization_signal_epre_eprers = -1; --static int hf_nfapi_secondary_synchronization_signal_epre_eprers = -1; --static int hf_nfapi_physical_cell_id = -1; -- --/* PRACH config */ --static int hf_nfapi_configuration_index = -1; --static int hf_nfapi_root_sequence_index = -1; --static int hf_nfapi_zero_correlation_zone_configuration = -1; --static int hf_nfapi_high_speed_flag = -1; --static int hf_nfapi_frequency_offset = -1; -- --/* PUSCH config */ --static int hf_nfapi_hopping_mode = -1; --static int hf_nfapi_hopping_offset = -1; -- --/* PUCCH config */ --static int hf_nfapi_delta_pucch_shift = -1; --static int hf_nfapi_n_cqi_rb = -1; --static int hf_nfapi_n_an_cs = -1; --static int hf_nfapi_n1_pucch_an = -1; -- --/* SRS config */ --static int hf_nfapi_bandwidth_configuration = -1; --static int hf_nfapi_max_up_pts = -1; --static int hf_nfapi_srs_subframe_configuration = -1; --static int hf_nfapi_srs_acknack_srs_simultaneous_transmission = -1; -- --/* uplink reference signal config */ --static int hf_nfapi_uplink_rs_hopping = -1; --static int hf_nfapi_group_assignment = -1; --static int hf_nfapi_cyclic_shift_1_for_drms = -1; -- --/* tdd frame structure */ --static int hf_nfapi_subframe_assignment = -1; --static int hf_nfapi_special_subframe_patterns = -1; -- --/* laa config */ --static int hf_nfapi_ed_threshold_for_lbt_for_pdsch = -1; --static int hf_nfapi_ed_threshold_for_lbt_for_drs = -1; --static int hf_nfapi_pd_threshold = -1; --static int hf_nfapi_multi_carrier_type = -1; --static int hf_nfapi_multi_carrier_tx = -1; --static int hf_nfapi_multi_carrier_freeze = -1; --static int hf_nfapi_tx_antenna_ports_for_drs = -1; --static int hf_nfapi_transmission_power_for_drs = -1; -- --/* eMTC config */ --static int hf_nfapi_pbch_repetitions_enabled_r13 = -1; --static int hf_nfapi_prach_cat_m_root_sequence_index = -1; --static int hf_nfapi_prach_cat_m_zero_correlation_zone_configuration = -1; --static int hf_nfapi_prach_cat_m_high_speed_flag = -1; -- --static int hf_nfapi_prach_ce_level_0_enable = -1; --static int hf_nfapi_prach_ce_level_0_configuration_index = -1; --static int hf_nfapi_prach_ce_level_0_frequency_offset = -1; --static int hf_nfapi_prach_ce_level_0_number_of_repetitions_per_attempt = -1; --static int hf_nfapi_prach_ce_level_0_starting_subframe_periodicity = -1; --static int hf_nfapi_prach_ce_level_0_hopping_enabled = -1; --static int hf_nfapi_prach_ce_level_0_hopping_offset = -1; -- --static int hf_nfapi_prach_ce_level_1_enable = -1; --static int hf_nfapi_prach_ce_level_1_configuration_index = -1; --static int hf_nfapi_prach_ce_level_1_frequency_offset = -1; --static int hf_nfapi_prach_ce_level_1_number_of_repetitions_per_attempt = -1; --static int hf_nfapi_prach_ce_level_1_starting_subframe_periodicity = -1; --static int hf_nfapi_prach_ce_level_1_hopping_enabled = -1; --static int hf_nfapi_prach_ce_level_1_hopping_offset = -1; -- --static int hf_nfapi_prach_ce_level_2_enable = -1; --static int hf_nfapi_prach_ce_level_2_configuration_index = -1; --static int hf_nfapi_prach_ce_level_2_frequency_offset = -1; --static int hf_nfapi_prach_ce_level_2_number_of_repetitions_per_attempt = -1; --static int hf_nfapi_prach_ce_level_2_starting_subframe_periodicity = -1; --static int hf_nfapi_prach_ce_level_2_hopping_enabled = -1; --static int hf_nfapi_prach_ce_level_2_hopping_offset = -1; -- --static int hf_nfapi_prach_ce_level_3_enable = -1; --static int hf_nfapi_prach_ce_level_3_configuration_index = -1; --static int hf_nfapi_prach_ce_level_3_frequency_offset = -1; --static int hf_nfapi_prach_ce_level_3_number_of_repetitions_per_attempt = -1; --static int hf_nfapi_prach_ce_level_3_starting_subframe_periodicity = -1; --static int hf_nfapi_prach_ce_level_3_hopping_enabled = -1; --static int hf_nfapi_prach_ce_level_3_hopping_offset = -1; --static int hf_nfapi_pucch_internal_ul_hopping_config_common_mode_b = -1; --static int hf_nfapi_pucch_internal_ul_hopping_config_common_mode_a = -1; -- --static int hf_nfapi_dl_modulation_support = -1; --static int hf_nfapi_ul_modulation_support = -1; -- --/* 123 config */ --static int hf_nfapi_data_report_mode = -1; --static int hf_nfapi_sfnsf = -1; -- --// P7 Sub Structures --static int hf_nfapi_dl_config_dci_dl_pdu_rel8 = -1; --static int hf_nfapi_dci_format = -1; --static int hf_nfapi_cce_idx = -1; --static int hf_nfapi_aggregation_level = -1; --static int hf_nfapi_mcs_1 = -1; --static int hf_nfapi_redundancy_version_1 = -1; --static int hf_nfapi_new_data_indicator_1 = -1; --static int hf_nfapi_mcs_2 = -1; --static int hf_nfapi_redundancy_version_2 = -1; --static int hf_nfapi_new_data_indicator_2 = -1; --static int hf_nfapi_harq_process = -1; --static int hf_nfapi_tpmi = -1; --static int hf_nfapi_pmi = -1; --static int hf_nfapi_precoding_information = -1; --static int hf_nfapi_tpc = -1; --static int hf_nfapi_downlink_assignment_index = -1; --static int hf_nfapi_transport_block_size_index = -1; --static int hf_nfapi_downlink_power_offset = -1; --static int hf_nfapi_allocate_prach_flag = -1; --static int hf_nfapi_preamble_index = -1; --static int hf_nfapi_prach_mask_index = -1; --static int hf_nfapi_rnti_type = -1; -- --static int hf_nfapi_dl_config_dci_dl_pdu_rel9 = -1; --static int hf_nfapi_mcch_flag = -1; --static int hf_nfapi_mcch_change_notification = -1; --static int hf_nfapi_scrambling_identity = -1; -- --static int hf_nfapi_dl_config_dci_dl_pdu_rel10 = -1; --static int hf_nfapi_cross_carrier_scheduling_flag = -1; --static int hf_nfapi_carrier_indicator = -1; --static int hf_nfapi_srs_flag = -1; --static int hf_nfapi_srs_request = -1; --static int hf_nfapi_antenna_ports_scrambling_and_layers = -1; --static int hf_nfapi_total_dci_length_including_padding = -1; --static int hf_nfapi_n_dl_rb = -1; -- --static int hf_nfapi_dl_config_dci_dl_pdu_rel11 = -1; --static int hf_nfapi_harq_ack_resource_offset = -1; --static int hf_nfapi_pdsch_re_mapping_and_quasi_co_location_indicator = -1; --static int hf_nfapi_dl_config_dci_dl_pdu_rel12 = -1; --static int hf_nfapi_primary_cell_type = -1; --static int hf_nfapi_ul_dl_configuration_flag = -1; --static int hf_nfapi_number_of_ul_dl_configurations = -1; --static int hf_nfapi_ul_dl_configuration_index = -1; --static int hf_nfapi_dl_config_dci_dl_pdu_rel13 = -1; --static int hf_nfapi_laa_end_partial_sf_flag = -1; --static int hf_nfapi_laa_end_partial_sf_configuration = -1; --static int hf_nfapi_initial_lbt_sf = -1; --static int hf_nfapi_codebooksize_determination_r13 = -1; --static int hf_nfapi_rel13_drms_table_flag = -1; -- -- --static int hf_nfapi_dl_config_dci_dl_pdu = -1; --static int hf_nfapi_dl_config_dci_dl_pdu_nfapi_dl_config_dci_dl_pdu_rel8 = -1; --static int hf_nfapi_dl_config_dci_dl_pdu_nfapi_dl_config_dci_dl_pdu_rel9 = -1; --static int hf_nfapi_dl_config_dci_dl_pdu_nfapi_dl_config_dci_dl_pdu_rel10 = -1; -- --static int hf_nfapi_bf_vector_antennas = -1; --static int hf_nfapi_subbands = -1; --static int hf_nfapi_bf_vectors = -1; --static int hf_nfapi_csi_rs_resource_config = -1; --static int hf_nfapi_csi_rs_number_if_nzp_configurations = -1; --static int hf_nfapi_csi_rs_resource_configs = -1; --static int hf_nfapi_pdsch_start = -1; --static int hf_nfapi_drms_config_flag = -1; --static int hf_nfapi_drms_scrambling = -1; --static int hf_nfapi_csi_config_flag = -1; --static int hf_nfapi_csi_scrambling = -1; --static int hf_nfapi_pdsch_re_mapping_flag = -1; --static int hf_nfapi_pdsch_re_mapping_antenna_ports = -1; --static int hf_nfapi_pdsch_re_mapping_freq_shift = -1; --static int hf_nfapi_alt_cqi_table_r12 = -1; --static int hf_nfapi_max_layers = -1; --static int hf_nfapi_n_dl_harq = -1; --static int hf_nfapi_dwpts_symbols = -1; --static int hf_nfapi_ue_type = -1; --static int hf_nfapi_pdsch_payload_type = -1; --static int hf_nfapi_initial_transmission_sf = -1; --static int hf_nfapi_req13_drms_table_flag = -1; --static int hf_nfapi_prnti = -1; --static int hf_nfapi_mcs = -1; --static int hf_nfapi_number_of_transport_blocks = -1; --static int hf_nfapi_ue_mode = -1; --static int hf_prs_bandwidth = -1; --static int hf_prs_cyclic_prefix_type = -1; --static int hf_prs_muting = -1; --static int hf_nfapi_csi_rs_number_of_nzp_configuration = -1; --static int hf_nfapi_csi_rs_resource_index = -1; --static int hf_nfapi_csi_rs_class = -1; --static int hf_nfapi_cdm_type = -1; --static int hf_nfapi_csi_rs_bf_vector = -1; --static int hf_nfapi_edpcch_prb_index = -1; --static int hf_nfapi_epdcch_resource_assignment_flag = -1; --static int hf_nfapi_epdcch_id = -1; --static int hf_nfapi_epdcch_start_symbol = -1; --static int hf_nfapi_epdcch_num_prb = -1; --static int hf_nfapi_epdcch_prbs = -1; --static int hf_nfapi_precoding_value = -1; --static int hf_nfapi_mpdcch_narrowband = -1; --static int hf_nfapi_number_of_prb_pairs = -1; --static int hf_nfapi_resource_block_assignment = -1; --static int hf_nfapi_start_symbol = -1; --static int hf_nfapi_ecce_index = -1; --static int hf_nfapi_ce_mode = -1; --static int hf_nfapi_drms_scrabmling_init = -1; --static int hf_nfapi_pdsch_reception_levels = -1; --static int hf_nfapi_new_data_indicator = -1; --static int hf_nfapi_tpmi_length = -1; --static int hf_nfapi_pmi_flag = -1; --static int hf_nfapi_harq_resource_offset = -1; --static int hf_nfapi_dci_subframe_repetition_number = -1; --static int hf_nfapi_downlink_assignment_index_length = -1; --static int hf_nfapi_starting_ce_level = -1; --static int hf_nfapi_antenna_ports_and_scrambling_identity_flag = -1; --static int hf_nfapi_antenna_ports_and_scrambling_identity = -1; --static int hf_nfapi_paging_direct_indication_differentiation_flag = -1; --static int hf_nfapi_direct_indication = -1; --static int hf_nfapi_number_of_tx_antenna_ports = -1; --static int hf_nfapi_precoding = -1; -- -- -- --// P7 Message Structures --static int hf_nfapi_dl_node_sync = -1; --static int hf_nfapi_dl_node_sync_nfapi_p7_message_header = -1; --static int hf_nfapi_dl_node_sync_t1 = -1; --static int hf_nfapi_dl_node_sync_delta_sfn_sf = -1; -- --static int hf_nfapi_ul_node_sync = -1; --static int hf_nfapi_ul_node_sync_nfapi_p7_message_header = -1; --static int hf_nfapi_ul_node_sync_t1 = -1; --static int hf_nfapi_ul_node_sync_t2 = -1; --static int hf_nfapi_ul_node_sync_t3 = -1; -- --static int hf_nfapi_timing_info = -1; --static int hf_nfapi_timing_info_nfapi_p7_message_header = -1; --static int hf_nfapi_timing_info_last_sfn_sf = -1; --static int hf_nfapi_timing_info_time_since_last_timing_info = -1; --static int hf_nfapi_timing_info_dl_config_jitter = -1; --static int hf_nfapi_timing_info_tx_request_jitter = -1; --static int hf_nfapi_timing_info_ul_config_jitter = -1; --static int hf_nfapi_timing_info_hi_dci0_jitter = -1; --static int hf_nfapi_timing_info_dl_config_latest_delay = -1; --static int hf_nfapi_timing_info_tx_request_latest_delay = -1; --static int hf_nfapi_timing_info_ul_config_latest_delay = -1; --static int hf_nfapi_timing_info_hi_dci0_latest_delay = -1; --static int hf_nfapi_timing_info_dl_config_earliest_arrival = -1; --static int hf_nfapi_timing_info_tx_request_earliest_arrival = -1; --static int hf_nfapi_timing_info_ul_config_earliest_arrival = -1; --static int hf_nfapi_timing_info_hi_dci0_earliest_arrival = -1; -- --static int hf_nfapi_dl_config_request = -1; --static int hf_nfapi_sfn_sf = -1; -- --static int hf_nfapi_dl_config_request_body = -1; --static int hf_nfapi_number_pdcch_ofdm_symbols = -1; --static int hf_nfapi_number_dci = -1; --static int hf_nfapi_number_pdus = -1; --static int hf_nfapi_number_pdsch_rnti = -1; --static int hf_nfapi_transmission_power_pcfich = -1; -- --static int hf_nfapi_number_of_harqs = -1; --static int hf_nfapi_number_of_crcs = -1; --static int hf_nfapi_number_of_srs = -1; --static int hf_nfapi_number_of_cqi = -1; --static int hf_nfapi_number_of_preambles = -1; --static int hf_nfapi_number_of_srss = -1; --static int hf_nfapi_lbt_dl_req_pdu_type = -1; --static int hf_nfapi_lbt_dl_ind_pdu_type = -1; -- --static int hf_nfapi_dl_config_request_pdu_list = -1; --static int hf_nfapi_ul_config_request_pdu_list = -1; --static int hf_nfapi_hi_dci0_request_pdu_list = -1; --static int hf_nfapi_tx_request_pdu_list = -1; --static int hf_nfapi_rx_indication_pdu_list = -1; --static int hf_nfapi_harq_indication_pdu_list = -1; --static int hf_nfapi_crc_indication_pdu_list = -1; --static int hf_nfapi_sr_indication_pdu_list = -1; --static int hf_nfapi_cqi_indication_pdu_list = -1; --static int hf_nfapi_preamble_indication_pdu_list = -1; --static int hf_nfapi_srs_indication_pdu_list = -1; --static int hf_nfapi_lbt_dl_config_pdu_list = -1; --static int hf_nfapi_lbt_dl_indication_pdu_list = -1; -- -- --static int hf_nfapi_dl_config_pdu_type = -1; --static int hf_nfapi_pdu_size = -1; --static int hf_nfapi_instance_length = -1; -- --static int hf_nfapi_dl_config_dlsch_pdu_rel8 = -1; --static int hf_nfapi_length; --static int hf_nfapi_pdu_index = -1; --static int hf_nfapi_rnti = -1; --static int hf_nfapi_resource_allocation_type = -1; --static int hf_nfapi_virtual_resource_block_assignment_flag = -1; --static int hf_nfapi_resource_block_coding = -1; --static int hf_nfapi_modulation = -1; --static int hf_nfapi_redundancy_version = -1; --static int hf_nfapi_transport_blocks = -1; --static int hf_nfapi_transport_block_to_codeword_swap_flag = -1; --static int hf_nfapi_transmission_scheme = -1; --static int hf_nfapi_ul_transmission_scheme = -1; --static int hf_nfapi_number_of_layers = -1; --static int hf_nfapi_number_of_subbands = -1; --static int hf_nfapi_codebook_index = -1; --static int hf_nfapi_ue_category_capacity = -1; --static int hf_nfapi_pa = -1; --static int hf_nfapi_delta_power_offset_index = -1; --static int hf_nfapi_ngap = -1; --static int hf_nfapi_nprb = -1; --static int hf_nfapi_transmission_mode = -1; --static int hf_nfapi_num_bf_prb_per_subband = -1; -- --static int hf_nfapi_num_bf_vector = -1; --static int hf_nfapi_bf_vector_subband_index = -1; --static int hf_nfapi_bf_vector_num_antennas = -1; --static int hf_nfapi_bf_vector_bf_value = -1; -- --static int hf_nfapi_dl_config_dlsch_pdu_rel9 = -1; --static int hf_nfapi_nscid = -1; -- --static int hf_nfapi_dl_config_dlsch_pdu_rel10 = -1; --static int hf_nfapi_csi_rs_flag = -1; --static int hf_nfapi_csi_rs_resource_config_r10 = -1; --static int hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10 = -1; -- --static int hf_nfapi_dl_config_bch_pdu_rel8 = -1; --static int hf_nfapi_transmission_power = -1; -- --static int hf_nfapi_dl_config_mch_pdu_rel8 = -1; --static int hf_nfapi_mbsfn_area_id = -1; -- --static int hf_nfapi_dl_config_pch_pdu_rel8 = -1; -- --static int hf_nfapi_dl_config_prs_pdu_rel9 = -1; --static int hf_nfapi_prs_bandwidth = -1; --static int hf_nfapi_prs_cyclic_prefix_type = -1; -- --static int hf_nfapi_dl_config_csi_rs_pdu_rel10 = -1; --static int hf_nfapi_csi_rs_antenna_port_count_r10 = -1; -- --static int hf_nfapi_ul_config_request = -1; --static int hf_nfapi_ul_config_request_body = -1; --static int hf_nfapi_ul_config_pdu_type = -1; -- --static int hf_nfapi_rach_prach_frequency_resources = -1; --static int hf_nfapi_srs_present = -1; --static int hf_nfapi_ul_config_harq_buffer_pdu = -1; -- --static int hf_nfapi_ul_config_ue_information_rel8 = -1; --static int hf_nfapi_handle = -1; --static int hf_nfapi_ul_config_sr_information_pdu_rel8 = -1; --static int hf_nfapi_pucch_index = -1; --static int hf_nfapi_size = -1; --static int hf_nfapi_resource_block_start = -1; --static int hf_nfapi_number_of_resource_blocks = -1; --static int hf_nfapi_cyclic_shift_2_for_drms = -1; --static int hf_nfapi_frequency_hopping_enabled_flag = -1; --static int hf_nfapi_frequency_hopping_bits = -1; --static int hf_nfapi_new_data_indication = -1; --static int hf_nfapi_harq_process_number = -1; --static int hf_nfapi_ul_tx_mode = -1; --static int hf_nfapi_current_tx_nb = -1; --static int hf_nfapi_n_srs = -1; --static int hf_nfapi_disable_sequence_hopping_flag = -1; --static int hf_nfapi_dl_cqi_pmi_size_rank_1 = -1; --static int hf_nfapi_dl_cqi_pmi_size_rank_greater_1 = -1; --static int hf_nfapi_ri_size = -1; --static int hf_nfapi_delta_offset_cqi = -1; --static int hf_nfapi_delta_offset_ri = -1; --static int hf_nfapi_harq_size = -1; --static int hf_nfapi_delta_offset_harq = -1; --static int hf_nfapi_ack_nack_mode = -1; --static int hf_nfapi_n_srs_initial = -1; --static int hf_nfapi_initial_number_of_resource_blocks = -1; --static int hf_nfapi_dl_cqi_pmi_size = -1; --static int hf_nfapi_report_type = -1; --static int hf_nfapi_dl_cqi_ri_pmi_size = -1; --static int hf_nfapi_control_type = -1; --static int hf_nfapi_number_of_cc = -1; --static int hf_nfapi_virtual_cell_id_enabled_flag = -1; --static int hf_nfapi_npusch_identity = -1; --static int hf_nfapi_ndrms_csh_identity = -1; --static int hf_nfapi_total_number_of_repetitions = -1; --static int hf_nfapi_repetition_number = -1; --static int hf_nfapi_initial_sf_io = -1; --static int hf_nfapi_empty_symbols_due_to_retunning = -1; --static int hf_nfapi_dl_cqi_ri_pmi_size_2 = -1; --static int hf_nfapi_npucch_identity = -1; --static int hf_nfapi_harq_size_2 = -1; --static int hf_nfapi_delta_offset_harq_2 = -1; --static int hf_nfapi_empty_symbols = -1; --static int hf_nfapi_total_number_of_repetitons = -1; --static int hf_nfapi_csi_mode = -1; --static int hf_nfapi_dl_cqi_pmi_size_2 = -1; --static int hf_nfapi_statring_prb = -1; --static int hf_nfapi_cdm_index = -1; --static int hf_nfapi_nsrs = -1; --static int hf_nfapi_num_ant_ports = -1; --static int hf_nfapi_n_pucch_2_0 = -1; --static int hf_nfapi_n_pucch_2_1 = -1; --static int hf_nfapi_n_pucch_2_2 = -1; --static int hf_nfapi_n_pucch_2_3 = -1; --static int hf_nfapi_starting_prb = -1; --static int hf_nfapi_antenna_port = -1; --static int hf_nfapi_number_of_combs = -1; -- -- -- --static int hf_nfapi_number_of_pucch_resource = -1; --static int hf_nfapi_pucch_index_p1 = -1; --static int hf_nfapi_n_pucch_1_0 = -1; --static int hf_nfapi_n_pucch_1_1 = -1; --static int hf_nfapi_n_pucch_1_2 = -1; --static int hf_nfapi_n_pucch_1_3 = -1; --static int hf_nfapi_srs_bandwidth = -1; --static int hf_nfapi_frequency_domain_position = -1; --static int hf_nfapi_srs_hopping_bandwidth = -1; --static int hf_nfapi_transmission_comb = -1; --static int hf_nfapi_i_srs = -1; --static int hf_nfapi_sounding_reference_cyclic_shift = -1; --static int hf_nfapi_antenna_ports = -1; --static int hf_nfapi_ul_config_srs_pdu_rel10 = -1; --static int hf_nfapi_ul_config_srs_pdu_rel8 = -1; --static int hf_nfapi_ul_config_harq_information_rel9_fdd = -1; --static int hf_nfapi_ul_config_harq_information_rel8_fdd = -1; --static int hf_nfapi_ul_config_harq_information_rel10_tdd = -1; --static int hf_nfapi_ul_config_sr_information_rel10 = -1; --static int hf_nfapi_ul_config_sr_information_rel8 = -1; --static int hf_nfapi_ul_config_cqi_information_rel10 = -1; --static int hf_nfapi_ul_config_cqi_information_rel8 = -1; --static int hf_nfapi_ul_config_initial_transmission_parameters_rel8 = -1; --static int hf_nfapi_ul_config_ulsch_harq_information_rel10 = -1; -- --/* Tx request */ --static int hf_nfapi_pdu_length = -1; --static int hf_nfapi_num_segments = -1; --static int hf_nfapi_segment_length = -1; --static int hf_nfapi_segment_data = -1; -- --/* CRC Indication */ --static int hf_nfapi_crc_indication_body = -1; --static int hf_nfapi_crc_flag = -1; -- --static int hf_nfapi_number_of_hi_pdus = -1; --static int hf_nfapi_number_of_dci_pdus = -1; --static int hf_nfapi_pdu_type = -1; --static int hf_nfapi_hi_value = -1; --static int hf_nfapi_i_phich = -1; --static int hf_nfapi_flag_tb2 = -1; --static int hf_nfapi_hi_value_2 = -1; --static int hf_nfapi_ue_tx_antenna_selection = -1; --static int hf_nfapi_cqi_csi_request = -1; --static int hf_nfapi_ul_index = -1; --static int hf_nfapi_dl_assignment_index = -1; --static int hf_nfapi_tpc_bitmap = -1; --static int hf_nfapi_new_data_indication_two = -1; --static int hf_nfapi_size_of_cqi_csi_feild = -1; --static int hf_nfapi_resource_allocation_flag = -1; --static int hf_nfapi_number_of_antenna_ports =-1 ; -- --static int hf_nfapi_n_ul_rb = -1; --static int hf_nfapi_pscch_resource = -1; --static int hf_nfapi_time_resource_pattern = -1; --static int hf_nfapi_mpdcch_transmission_type = -1; --static int hf_nfapi_drms_scrambling_init = -1; --static int hf_nfapi_pusch_repetition_levels = -1; --static int hf_nfapi_frequency_hopping_flag = -1; --static int hf_nfapi_csi_request = -1; --static int hf_nfapi_dai_presence_flag = -1; --static int hf_nfapi_total_dci_length_include_padding = -1; --static int hf_nfapi_data_offset = -1; --static int hf_nfapi_ul_cqi = -1; --static int hf_nfapi_timing_advance_r9 = -1; --static int hf_nfapi_timing_advance = -1; --static int hf_nfapi_harq_data_value_0 = -1; --static int hf_nfapi_harq_data_value_1 = -1; --static int hf_nfapi_harq_data_value_2 = -1; --static int hf_nfapi_harq_data_value_3 = -1; --static int hf_nfapi_harq_mode = -1; --static int hf_nfapi_number_of_ack_nack = -1; --static int hf_nfapi_harq_ack_nack_data = -1; --static int hf_nfapi_harq_tb_1 = -1; --static int hf_nfapi_harq_tb_2 = -1; --static int hf_nfapi_harq_tb_n = -1; --static int hf_nfapi_harq_data = -1; --static int hf_nfapi_channel = -1; --static int hf_nfapi_ri = -1; --static int hf_nfapi_number_of_cc_reported = -1; --static int hf_nfapi_cc = -1; --static int hf_nfapi_preamble = -1; --static int hf_nfapi_rach_resource_type = -1; --static int hf_nfapi_snr = -1; --static int hf_nfapi_doppler_estimation = -1; --static int hf_nfapi_rb_start = -1; --static int hf_nfapi_rbs = -1; --static int hf_nfapi_up_pts_symbol = -1; --static int hf_nfapi_number_prb_per_subband = -1; --static int hf_nfapi_number_antennas = -1; --static int hf_nfapi_subband_index = -1; --static int hf_nfapi_antennas = -1; --static int hf_nfapi_channel_coefficient = -1; --static int hf_nfapi_ul_rtoa = -1; --static int hf_nfapi_mp_cca = -1; --static int hf_nfapi_n_cca = -1; --static int hf_nfapi_offset = -1; --static int hf_nfapi_lte_txop_sf = -1; --static int hf_nfapi_txop_sfn_sf_end = -1; --static int hf_nfapi_lbt_mode = -1; --static int hf_nfapi_sfn_sf_end = -1; --static int hf_nfapi_result = -1; --static int hf_nfapi_txop_symbols = -1; --static int hf_nfapi_initial_partial_sf = -1; -- -- --static int hf_nfapi_frequency_band_indicator = -1; --static int hf_nfapi_measurement_period = -1; --static int hf_nfapi_bandwidth = -1; --static int hf_nfapi_timeout = -1; --static int hf_nfapi_number_of_earfcns = -1; --static int hf_nfapi_earfcn_list = -1; --static int hf_nfapi_uarfcn = -1; --static int hf_nfapi_number_of_uarfcns = -1; --static int hf_nfapi_uarfcn_list = -1; --static int hf_nfapi_arfcn = -1; --static int hf_nfapi_arfcn_direction = -1; --static int hf_nfapi_number_of_arfcns = -1; --static int hf_nfapi_arfcn_list = -1; --static int hf_nfapi_rssi = -1; --static int hf_nfapi_number_of_rssi = -1; --static int hf_nfapi_rssi_list = -1; --static int hf_nfapi_pci = -1; --static int hf_nfapi_measurement_bandwidth = -1; --static int hf_nfapi_exhaustive_search = -1; --static int hf_nfapi_number_of_pci = -1; --static int hf_nfapi_pci_list = -1; --static int hf_nfapi_psc = -1; --static int hf_nfapi_number_of_psc = -1; --static int hf_nfapi_psc_list = -1; --static int hf_nfapi_rsrp = -1; --static int hf_nfapi_rsrq = -1; --static int hf_nfapi_number_of_lte_cells_found = -1; --static int hf_nfapi_lte_cells_found_list = -1; --static int hf_nfapi_rscp = -1; --static int hf_nfapi_enco = -1; --static int hf_nfapi_number_of_utran_cells_found = -1; --static int hf_nfapi_utran_cells_found_list = -1; --static int hf_nfapi_bsic = -1; --static int hf_nfapi_rxlev = -1; --static int hf_nfapi_rxqual = -1; --static int hf_nfapi_sfn_offset = -1; --static int hf_nfapi_number_of_geran_cells_found = -1; --static int hf_nfapi_geran_cells_found_list = -1; --static int hf_nfapi_number_of_tx_antenna = -1; --static int hf_nfapi_mib_length = -1; --static int hf_nfapi_mib = -1; --static int hf_nfapi_phich_configuration = -1; --static int hf_nfapi_retry_count = -1; --static int hf_nfapi_sib1 = -1; --static int hf_nfapi_si_periodicity = -1; --static int hf_nfapi_si_index = -1; --static int hf_nfapi_number_of_si_periodicity = -1; --static int hf_nfapi_si_periodicity_list = -1; --static int hf_nfapi_si_window_length = -1; --static int hf_nfapi_sib_type = -1; --static int hf_nfapi_sib_len = -1; --static int hf_nfapi_sib = -1; --static int hf_nfapi_si_len = -1; --static int hf_nfapi_si = -1; -- --static int hf_nfapi_pnf_search_state = -1; --static int hf_nfapi_pnf_broadcast_state = -1; -- --static const value_string message_id_vals[] = { { 0x80, "DL_CONFIG.request"}, -- { 0x81, "UL_CONFIG.request"}, -- { 0x82, "SUBFRAME_INDICATION"}, -- { 0x83, "HI_DCI0.request"}, -- { 0x84, "TX.request"}, -- { 0x85, "HARQ.indication"}, -- { 0x86, "CRC.indication"}, -- { 0x87, "RX_ULSCH.indication"}, -- { 0x88, "RACH.indication" }, -- { 0x89, "SRS.indication" }, -- { 0x8A, "RX_SR.indication" }, -- { 0x8B, "RX_CQI.indication" }, -- { 0x8C, "LBT_DL_CONFIG.request" } , -- { 0x8D, "LBT_DL.indication" } , -- -- { 0x0100, "PNF_PARAM.request" }, -- { 0x0101, "PNF_PARAM.response" }, -- { 0x0102, "PNF_CONFIG.request" }, -- { 0x0103, "PNF_CONFIG.response" }, -- { 0x0104, "PNF_START.request" }, -- { 0x0105, "PNF_START.response" }, -- { 0x0106, "PNF_STOP.request" }, -- { 0x0107, "PNF_STOP.response" }, -- { 0x0108, "PARAM.request" }, -- { 0x0109, "PARAM.response" }, -- { 0x010A, "CONFIG.request" }, -- { 0x010B, "CONFIG.response" }, -- { 0x010C, "START.request" }, -- { 0x010D, "START.response" }, -- { 0x010E, "STOP.request" }, -- { 0x010F, "STOP.response" }, -- { 0x0110, "MEASUREMENT.request" }, -- { 0x0111, "MEASUREMENT.response" }, -- -- { 0x0180, "UL_NODE_SYNC" }, -- { 0x0181, "DL_NODE_SYNC" }, -- { 0x0182, "TIMING_INFO" }, -- -- { 0x0200, "RSSI.request" }, -- { 0x0201, "RSSI.response" }, -- { 0x0202, "RSSI.indication" }, -- { 0x0203, "CELL_SEARCH.request" }, -- { 0x0204, "CELL_SEARCH.response" }, -- { 0x0205, "CELL_SEARCH.indication" }, -- { 0x0206, "BROADCAST_DETECT.request" }, -- { 0x0207, "BROADCAST_DETECT.response" }, -- { 0x0208, "BROADCAST_DETECT.indication" }, -- { 0x0209, "SYSTEM_INFORMATION_SCHEDULE.request" }, -- { 0x020A, "SYSTEM_INFORMATION_SCHEDULE.response" }, -- { 0x020B, "SYSTEM_INFORMATION_SCHEDULE.indication" }, -- { 0x020C, "SYSTEM_INFORMATION.request" }, -- { 0x020D, "SYSTEM_INFORMATION.response" }, -- { 0x020E, "SYSTEM_INFORMATION.indication" }, -- { 0x020F, "NMM_STOP.request" }, -- { 0x0210, "NMM_STOP.response" }, -- -- { 0 , NULL }, --}; -- -- --typedef int(*tlv_decode)(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end); -- --typedef struct --{ -- uint16_t tag_id; -- char* name; -- tlv_decode decode; --} tlv_t; -- --static int dissect_tlv_list(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint end); -- -- -- -- --static guint8 proto_tree_add_uint8(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, char* units) --{ -- guint8 value = tvb_get_guint8(tvb, *offset); -- proto_item * item = proto_tree_add_item(tree, hfindex, tvb, *offset, 1, ENC_NA); -- -- if (units != NULL) -- { -- proto_item_append_text(item, " "); -- proto_item_append_text(item, units); -- } -- -- *offset += 1; -- -- return value; --} -- --static guint8 proto_tree_add_uint8_with_range(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, packet_info *pinfo, guint8 min, guint8 max, char* units) --{ -- guint8 value = tvb_get_guint8(tvb, *offset); -- proto_item * item = proto_tree_add_item(tree, hfindex, tvb, *offset, 1, ENC_NA); -- -- if (units != NULL) -- { -- proto_item_append_text(item, " "); -- proto_item_append_text(item, units); -- } -- -- *offset += 1; -- -- if (value < min || value > max) -- { -- expert_add_info(pinfo, tree, &ei_invalid_range); -- } -- -- -- return value; --} -- --static guint16 proto_tree_add_uint16(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, char* units) --{ -- guint16 value = tvb_get_guint16(tvb, *offset, ENC_NA); -- proto_item * item = proto_tree_add_item(tree, hfindex, tvb, *offset, 2, ENC_NA); -- -- if (units != NULL) -- { -- proto_item_append_text(item, " "); -- proto_item_append_text(item, units); -- } -- -- *offset += 2; -- -- return value; --} -- --static void proto_tree_add_int16(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, char* units) --{ -- proto_item * item = proto_tree_add_item(tree, hfindex, tvb, *offset, 2, ENC_NA); -- -- if (units != NULL) -- { -- proto_item_append_text(item, " "); -- proto_item_append_text(item, units); -- } -- -- *offset += 2; --} -- --typedef int(*uint8_value_conversion)(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint8 value); -- --static guint8 proto_tree_add_uint8_with_conversion(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, uint8_value_conversion conversion) --{ -- guint8 value = tvb_get_guint8(tvb, *offset); -- -- conversion(tree, hfindex, tvb, offset, value); -- -- *offset += 1; -- -- return value; --} -- --typedef int(*uint16_value_conversion)(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value); -- --static guint16 proto_tree_add_uint16_with_conversion(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, uint16_value_conversion conversion) --{ -- guint16 value = tvb_get_guint16(tvb, *offset, ENC_NA); -- -- conversion(tree, hfindex, tvb, offset, value); -- -- *offset += 2; -- -- return value; --} -- --typedef int(*int16_value_conversion)(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, gint16 value); -- --static gint16 proto_tree_add_int16_with_conversion(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, int16_value_conversion conversion) --{ -- gint16 value = (gint16)(tvb_get_guint16(tvb, *offset, ENC_NA)); -- -- conversion(tree, hfindex, tvb, offset, value); -- -- *offset += 2; -- -- return value; --} -- -- --static void proto_tree_add_uint32(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, char* units) --{ -- proto_item * item = proto_tree_add_item(tree, hfindex, tvb, *offset, 4, ENC_NA); -- -- if (units != NULL) -- { -- proto_item_append_text(item, " "); -- proto_item_append_text(item, units); -- } -- -- *offset += 4; --} -- --static void proto_tree_add_uint8_array(proto_tree *tree, int hfindex, guint len, tvbuff_t *tvb, guint* offset) --{ -- proto_tree_add_item(tree, hfindex, tvb, *offset, len, ENC_NA); -- -- *offset += len; --} -- -- -- -- -- --int dissect_array_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end, const char* name, guint32 hf_idx, guint32 ett_idx, guint32 count, tlv_decode decode) --{ -- guint16 i = 0; -- -- if (count > 0) -- { -- proto_item *list_ti = proto_tree_add_string_format(tree, hf_idx, tvb, *offset, 2, "", name); -- proto_tree *list_tree = proto_item_add_subtree(list_ti, ett_idx); -- -- gint start_of_list = *offset; -- -- for (i = 0; i < count; ++i) -- { -- proto_item *item_ti = proto_tree_add_string_format(list_tree, hf_idx, tvb, *offset, 2, "", "[%d]", i); -- proto_tree *item_tree = proto_item_add_subtree(item_ti, ett_idx); -- -- gint start_of_item = *offset; -- -- decode(tvb, pinfo, item_tree, data, offset, end); -- -- if (item_ti != NULL) -- item_ti->finfo->length = *offset - start_of_item; -- } -- -- if (list_ti != NULL) -- list_ti->finfo->length = *offset - start_of_list; -- } -- -- return 0; --} -- --int dissect_pnf_param_general_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_sync_mode, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_location_mode, tvb, offset, 0); -- guint16 len = proto_tree_add_uint16(tree, hf_nfapi_location_coordinates_length, tvb, offset, 0); -- if (len > 0) -- proto_tree_add_uint8_array(tree, hf_nfapi_location_coordinates, len, tvb, offset); -- proto_tree_add_uint32(tree, hf_nfapi_dl_config_timing, tvb, offset, "milliseconds"); -- proto_tree_add_uint32(tree, hf_nfapi_tx_timing, tvb, offset, "milliseconds"); -- proto_tree_add_uint32(tree, hf_nfapi_ul_config_timing, tvb, offset, "milliseconds"); -- proto_tree_add_uint32(tree, hf_nfapi_hi_dci0_timing, tvb, offset, "milliseconds"); -- proto_tree_add_uint16(tree, hf_nfapi_maximum_number_phys, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_maximum_total_bandwidth, tvb, offset, "(100 khz)"); -- proto_tree_add_uint8(tree, hf_nfapi_maximum_total_number_dl_layers, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_maximum_total_number_ul_layers, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_shared_bands, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_shared_pa, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_maximum_total_power, tvb, offset, 0); -- proto_tree_add_uint8_array(tree, hf_nfapi_oui, 3, tvb, offset); -- -- return 0; --} -- --int dissect_pnf_rf_config_instance_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_rf_config_index, tvb, offset, 0); -- return 0; --} -- --int dissect_pnf_phy_instance_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_config_index, tvb, offset, 0); -- guint16 num_rf_configs = proto_tree_add_uint16(tree, hf_nfapi_number_of_rfs, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "RF Config List", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy, num_rf_configs, dissect_pnf_rf_config_instance_value); -- guint16 num_rf_exclusions = proto_tree_add_uint16(tree, hf_nfapi_number_of_rf_exclusions, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "RF Exclustion List", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy, num_rf_exclusions, dissect_pnf_rf_config_instance_value); -- proto_tree_add_uint16(tree, hf_nfapi_downlink_channel_bandwidth_supported, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_uplink_channel_bandwidth_supported, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_number_of_dl_layers_supported, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_number_of_ul_layers_supported, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_maximum_3gpp_release_supported, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_nmm_modes_supported, tvb, offset, 0); -- return 0; --} -- --int dissect_pnf_phy_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 num_phy = proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_number_phy, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "PHY List", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy, num_phy, dissect_pnf_phy_instance_value); -- -- -- return 0; -- --} -- -- --int dissect_pnf_rf_config_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_rf_config_index, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_band, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_maximum_transmit_power, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_minimum_transmit_power, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_number_of_antennas_suppported, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_minimum_downlink_frequency, tvb, offset, "(100 khz)"); -- proto_tree_add_uint32(tree, hf_nfapi_maximum_downlink_frequency, tvb, offset, "(100 khz)"); -- proto_tree_add_uint32(tree, hf_nfapi_minimum_uplink_frequency, tvb, offset, "(100 khz)"); -- proto_tree_add_uint32(tree, hf_nfapi_maximum_uplink_frequency, tvb, offset, "(100 khz)"); -- -- return 0; --} -- -- --int dissect_pnf_rf_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 num_rf = proto_tree_add_uint16(tree, hf_nfapi_number_of_rfs, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "RF List", hf_nfapi_pnf_phy_rf_config_array_phy_rf_config_info, ett_nfapi_pnf_phy_rf_config, num_rf, dissect_pnf_rf_config_value); -- -- return 0; -- --} -- --int dissect_pnf_phy_rel10_instance_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_config_index, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_transmission_mode7_supported, tvb, offset, 0); -- proto_tree_add_uint16(tree, hi_nfapi_transmission_mode8_supported, tvb, offset, 0); -- proto_tree_add_uint16(tree, hi_nfapi_two_antennas_ports_for_pucch, tvb, offset, 0); -- proto_tree_add_uint16(tree, hi_nfapi_transmission_mode_9_supported, tvb, offset, 0); -- proto_tree_add_uint16(tree, hi_nfapi_simultaneous_pucch_pusch, tvb, offset, 0); -- proto_tree_add_uint16(tree, hi_nfapi_for_layer_tx_with_tm3_and_tm4, tvb, offset, 0); -- -- return 0; --} -- --int dissect_pnf_phy_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 num_phy = proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_number_phy, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "PHY Rel 10 List", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy_rel10, num_phy, dissect_pnf_phy_rel10_instance_value); -- -- return 0; --} -- --int dissect_pnf_phy_rel11_instance_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_config_index, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_epdcch_supported, tvb, offset, 0); -- proto_tree_add_uint16(tree, hi_nfapi_multi_ack_csi_reporting, tvb, offset, 0); -- proto_tree_add_uint16(tree, hi_nfapi_pucch_tx_diversity_with_channel_selection, tvb, offset, 0); -- proto_tree_add_uint16(tree, hi_nfapi_ul_comp_supported, tvb, offset, 0); -- proto_tree_add_uint16(tree, hi_nfapi_transmission_mode_5_supported, tvb, offset, 0); -- return 0; --} -- --int dissect_pnf_phy_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 num_phy = proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_number_phy, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "PHY Rel 11 List", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy_rel11, num_phy, dissect_pnf_phy_rel11_instance_value); -- return 0; --} -- --int dissect_pnf_phy_rel12_instance_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_config_index, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_csi_subframe_set, tvb, offset, 0); -- proto_tree_add_uint16(tree, hi_nfapi_enhanced_4tx_codebook, tvb, offset, 0); -- proto_tree_add_uint16(tree, hi_nfapi_drs_supported, tvb, offset, 0); -- proto_tree_add_uint16(tree, hi_nfapi_ul_64qam_supported, tvb, offset, 0); -- proto_tree_add_uint16(tree, hi_nfapi_transmission_mode_10_supported, tvb, offset, 0); -- proto_tree_add_uint16(tree, hi_nfapi_alternative_tbs_indices, tvb, offset, 0); -- return 0; --} -- --int dissect_pnf_phy_rel12_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 num_phy = proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_number_phy, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "PHY Rel 12 List", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy_rel12, num_phy, dissect_pnf_phy_rel12_instance_value); -- return 0; --} -- --int dissect_pnf_phy_rel13_instance_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_config_index, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_pucch_format_4_supported, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_pucch_format_5_supported, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_more_than_5_ca_supported, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_laa_supported, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_laa_ending_in_dwpts_supported, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_laa_starting_in_second_slot_supported, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_beamforming_supported, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_csi_rs_enhancements_supported, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_drms_enhancements_supported, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_srs_enhancements_supported, tvb, offset, 0); -- return 0; --} -- --int dissect_pnf_phy_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 num_phy = proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_number_phy, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "PHY Rel 13 List", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy_rel13, num_phy, dissect_pnf_phy_rel13_instance_value); -- return 0; --} -- --int dissect_pnf_phy_rf_config_instance_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_phy_rf_config_info_phy_id, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_config_index, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_rf_config_index, tvb, offset, 0); -- return 0; --} -- -- --int dissect_pnf_phy_rf_config_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 num_configs = proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_number_phy, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "PHY RF Config List", hf_nfapi_pnf_phy_rf_config, ett_nfapi_pnf_phy_rf_config, num_configs, dissect_pnf_phy_rf_config_instance_value); -- return 0; --} -- --int bandwidth_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value) --{ -- /* -- guint8 comma = 0; -- -- proto_item_append_text(item, "("); -- -- if (value & 0x1) -- { -- proto_item_append_text(item, "6 Mhz"); -- comma = 1; -- } -- -- if (comma) -- proto_item_append_text(item, ", "); -- -- if (value & 0x2) -- { -- proto_item_append_text(item, "15 Mhz"); -- comma = 1; -- } -- -- if (comma) -- proto_item_append_text(item, ", "); -- -- if (value & 0x4) -- { -- proto_item_append_text(item, "25 Mhz"); -- comma = 1; -- } -- -- if (comma) -- proto_item_append_text(item, ", "); -- -- if (value & 0x8) -- { -- proto_item_append_text(item, "50 Mhz"); -- comma = 1; -- } -- -- if (comma) -- proto_item_append_text(item, ", "); -- -- if (value & 0x10) -- { -- proto_item_append_text(item, "75 Mhz"); -- comma = 1; -- } -- -- if (comma) -- proto_item_append_text(item, ", "); -- -- if (value & 0x20) -- { -- proto_item_append_text(item, "100 Mhz"); -- comma = 1; -- } -- -- proto_item_append_text(item, ")"); -- */ -- proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "?? (%d)", value); -- return 0; -- --} -- --int sfn_sf_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value) --{ -- proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "%d/%d (%d)", value >> 3, value & 0x0007, value); -- return 0; --} -- -- --int dissect_duplex_mode_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_duplex_mode, tvb, offset, 0); -- return 0; --} -- --int power_offset_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value) --{ -- proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "%.2f dB (%d)", (((float)value * 0.001) - 6.0), value); -- return 0; --} -- --int dissect_pcfich_power_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 value = proto_tree_add_uint16_with_conversion(tree, hf_nfapi_pcfich_power_offset, tvb, offset, power_offset_conversion); -- -- if (value > 10000) -- { -- expert_add_info(pinfo, tree, &ei_power_invalid); -- } -- -- return 0; --} -- --int dissect_pb_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 value = proto_tree_add_uint16(tree, hf_nfapi_pb, tvb, offset, 0); -- -- if (value > 3) -- { -- expert_add_info(pinfo, tree, &ei_power_invalid); -- } -- return 0; --} -- --int dissect_dl_cyclic_prefix_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_dl_cyclic_prefix_type, tvb, offset, 0); -- return 0; --} --int dissect_ul_cyclic_prefix_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_ul_cyclic_prefix_type, tvb, offset, 0); -- return 0; --} --int dissect_dl_channel_bandwidth_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_downlink_channel_bandwidth, tvb, offset, bandwidth_conversion); -- return 0; --} --int dissect_ul_channel_bandwidth_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_uplink_channel_bandwidth, tvb, offset, bandwidth_conversion); -- return 0; --} -- -- --int reference_signal_power_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value) --{ -- proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "%.2f dB (%d)", (((float)value * 0.25) - 63.75), value); -- return 0; --} -- --int dissect_reference_signal_power_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_reference_signal_power, tvb, offset, reference_signal_power_conversion); -- return 0; --} --int dissect_tx_antenna_ports_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_tx_antenna_ports, tvb, offset, 0); -- return 0; --} --int dissect_rx_antenna_ports_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_rx_antenna_ports, tvb, offset, 0); -- return 0; --} --int dissect_phich_resource_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_phich_resource, tvb, offset, 0); -- return 0; --} --int dissect_phich_duration_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_phich_duration, tvb, offset, 0); -- return 0; --} --int dissect_phich_power_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_phich_power_offset, tvb, offset, power_offset_conversion); -- return 0; --} --int dissect_psch_synch_signal_epre_eprers_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_primary_synchronization_signal_epre_eprers, tvb, offset, power_offset_conversion); -- return 0; --} --int dissect_physical_cell_id_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_physical_cell_id, tvb, offset, 0); -- return 0; --} --int dissect_ssch_synch_signal_epre_eprers_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_secondary_synchronization_signal_epre_eprers, tvb, offset, power_offset_conversion); -- return 0; --} --int dissect_prach_configuration_index_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_configuration_index, tvb, offset, 0); -- return 0; --} --int dissect_prach_root_sequence_index_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_root_sequence_index, tvb, offset, 0); -- return 0; --} --int dissect_prach_zero_correlation_zone_configuration_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_zero_correlation_zone_configuration, tvb, offset, 0); -- return 0; --} --int dissect_prach_high_speed_flag_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_high_speed_flag, tvb, offset, 0); -- return 0; --} --int dissect_prach_frequency_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_frequency_offset, tvb, offset, 0); -- return 0; --} --int dissect_pusch_hopping_mode_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_hopping_mode, tvb, offset, 0); -- return 0; --} --int dissect_pusch_hopping_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_hopping_offset, tvb, offset, 0); -- return 0; --} --int dissect_pusch_number_of_subbands_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_number_of_subbands, tvb, offset, 0); -- return 0; --} --int dissect_pucch_delta_pucch_shift_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_delta_pucch_shift, tvb, offset, 0); -- return 0; --} --int dissect_pucch_n_cqi_rb_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_n_cqi_rb, tvb, offset, 0); -- return 0; --} --int dissect_pucch_n_an_cs_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_n_an_cs, tvb, offset, 0); -- return 0; --} --int dissect_pucch_n1_pucch_an_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_n1_pucch_an, tvb, offset, 0); -- return 0; --} --int dissect_srs_bandwidth_configuration_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_bandwidth_configuration, tvb, offset, 0); -- return 0; --} --int dissect_srs_max_uppts_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_max_up_pts, tvb, offset, 0); -- return 0; --} --int dissect_srs_subframe_configuration_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_srs_subframe_configuration, tvb, offset, 0); -- return 0; --} --int dissect_srs_acknack_srs_sim_tx_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_srs_acknack_srs_simultaneous_transmission, tvb, offset, 0); -- return 0; --} --int dissect_uplink_rs_hopping_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_uplink_rs_hopping, tvb, offset, 0); -- return 0; --} --int dissect_group_assignment_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_group_assignment, tvb, offset, 0); -- return 0; --} --int dissect_cyclic_shift_1_for_drms_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_cyclic_shift_1_for_drms, tvb, offset, 0); -- return 0; --} --int dissect_tdd_subframe_assignement_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_subframe_assignment, tvb, offset, 0); -- return 0; --} --int dissect_tdd_subframe_patterns_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_special_subframe_patterns, tvb, offset, 0); -- return 0; --} -- --int laa_threshold_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value) --{ -- proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "%.2f dB (%d)", (float)(value * -100.00), value); -- return 0; --} -- --int dissect_laa_ed_threashold_for_lbt_for_pdsch_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_ed_threshold_for_lbt_for_pdsch, tvb, offset, laa_threshold_conversion); -- return 0; --} --int dissect_laa_ed_threashold_for_lbt_for_drs_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_ed_threshold_for_lbt_for_drs, tvb, offset, laa_threshold_conversion); -- return 0; --} --int dissect_laa_pd_threshold_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_pd_threshold, tvb, offset, laa_threshold_conversion); -- return 0; --} --int dissect_laa_multi_carrier_type_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_multi_carrier_type, tvb, offset, 0); -- return 0; --} --int dissect_laa_multi_carrier_tx_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_multi_carrier_tx, tvb, offset, 0); -- return 0; --} --int dissect_laa_multi_carrier_freeze_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_multi_carrier_freeze, tvb, offset, 0); -- return 0; --} --int dissect_laa_tx_antenna_port_for_drs_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_tx_antenna_ports_for_drs, tvb, offset, 0); -- return 0; --} --int dissect_laa_transmission_power_for_drs_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power_for_drs, tvb, offset, power_offset_conversion); -- return 0; --} -- --int dissect_emtc_pbch_repeitions_enabled_r13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_pbch_repetitions_enabled_r13, tvb, offset, 0); -- return 0; --} --int dissect_emtc_prach_cat_m_root_sequence_index_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_cat_m_root_sequence_index, tvb, offset, 0); -- return 0; --} --int dissect_emtc_prach_cat_m_zero_correlation_zone_configuration_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_cat_m_zero_correlation_zone_configuration, tvb, offset, 0); -- return 0; --} --int dissect_emtc_prach_cat_m_high_speed_flag_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_cat_m_high_speed_flag, tvb, offset, 0); -- return 0; --} -- --int dissect_emtc_prach_ce_level_0_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_0_enable, tvb, offset, 0); -- return 0; --} --int dissect_emtc_prach_ce_level_0_configuration_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_0_configuration_index, tvb, offset, 0); -- return 0; --} --int dissect_emtc_prach_ce_level_0_frequency_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_0_frequency_offset, tvb, offset, 0); -- return 0; --} --int dissect_emtc_preach_ce_level_0_num_of_repeitions_per_attempt_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_0_number_of_repetitions_per_attempt, tvb, offset, 0); -- return 0; --} --int dissect_emtc_ce_level_0_starting_subframe_periodicity_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_0_starting_subframe_periodicity, tvb, offset, 0); -- return 0; --} --int dissect_emtc_preach_ce_level_0_hopping_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_0_hopping_enabled, tvb, offset, 0); -- return 0; --} --int dissect_emtc_preach_ce_level_0_hopping_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_0_hopping_offset, tvb, offset, 0); -- return 0; --} -- --int dissect_emtc_prach_ce_level_1_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_1_enable, tvb, offset, 0); -- return 0; --} --int dissect_emtc_prach_ce_level_1_configuration_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_1_configuration_index, tvb, offset, 0); -- return 0; --} --int dissect_emtc_prach_ce_level_1_frequency_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_1_frequency_offset, tvb, offset, 0); -- return 0; --} --int dissect_emtc_preach_ce_level_1_num_of_repeitions_per_attempt_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_1_number_of_repetitions_per_attempt, tvb, offset, 0); -- return 0; --} --int dissect_emtc_ce_level_1_starting_subframe_periodicity_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_1_starting_subframe_periodicity, tvb, offset, 0); -- return 0; --} --int dissect_emtc_preach_ce_level_1_hopping_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_1_hopping_enabled, tvb, offset, 0); -- return 0; --} --int dissect_emtc_preach_ce_level_1_hopping_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_1_hopping_offset, tvb, offset, 0); -- return 0; --} -- --int dissect_emtc_prach_ce_level_2_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_2_enable, tvb, offset, 0); -- return 0; --} --int dissect_emtc_prach_ce_level_2_configuration_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_2_configuration_index, tvb, offset, 0); -- return 0; --} --int dissect_emtc_prach_ce_level_2_frequency_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_2_frequency_offset, tvb, offset, 0); -- return 0; --} --int dissect_emtc_preach_ce_level_2_num_of_repeitions_per_attempt_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_2_number_of_repetitions_per_attempt, tvb, offset, 0); -- return 0; --} --int dissect_emtc_ce_level_2_starting_subframe_periodicity_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_2_starting_subframe_periodicity, tvb, offset, 0); -- return 0; --} --int dissect_emtc_preach_ce_level_2_hopping_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_2_hopping_enabled, tvb, offset, 0); -- return 0; --} --int dissect_emtc_preach_ce_level_2_hopping_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_2_hopping_offset, tvb, offset, 0); -- return 0; --} -- --int dissect_emtc_prach_ce_level_3_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_3_enable, tvb, offset, 0); -- return 0; --} --int dissect_emtc_prach_ce_level_3_configuration_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_3_configuration_index, tvb, offset, 0); -- return 0; --} --int dissect_emtc_prach_ce_level_3_frequency_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_3_frequency_offset, tvb, offset, 0); -- return 0; --} --int dissect_emtc_preach_ce_level_3_num_of_repeitions_per_attempt_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_3_number_of_repetitions_per_attempt, tvb, offset, 0); -- return 0; --} --int dissect_emtc_ce_level_3_starting_subframe_periodicity_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_3_starting_subframe_periodicity, tvb, offset, 0); -- return 0; --} --int dissect_emtc_preach_ce_level_3_hopping_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_3_hopping_enabled, tvb, offset, 0); -- return 0; --} --int dissect_emtc_preach_ce_level_3_hopping_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_3_hopping_offset, tvb, offset, 0); -- return 0; --} -- --int dissect_emtc_pucch_interval_ul_hopping_config_common_mode_a_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_pucch_internal_ul_hopping_config_common_mode_a, tvb, offset, 0); -- return 0; --} --int dissect_emtc_pucch_interval_ul_hopping_config_common_mode_b_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_pucch_internal_ul_hopping_config_common_mode_b, tvb, offset, 0); -- return 0; --} -- -- --int dissect_dl_bandwidth_support_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_dl_bandwidth_support, tvb, offset, bandwidth_conversion); -- return 0; --} -- --int dissect_ul_bandwidth_support_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_ul_bandwidth_support, tvb, offset, bandwidth_conversion); -- return 0; --} -- --int dl_modulation_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value) --{ -- proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "?? (%d)", value); -- return 0; --} -- --int dissect_dl_modulation_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_dl_modulation_support, tvb, offset, dl_modulation_conversion); -- return 0; --} -- --int ul_modulation_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value) --{ -- proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "?? (%d)", value); -- return 0; --} --int dissect_ul_modulation_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_ul_modulation_support, tvb, offset, ul_modulation_conversion); -- return 0; --} --int dissect_phy_antenna_capability_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_phy_antenna_capability, tvb, offset, 0); -- return 0; --} -- --int release_capability_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value) --{ -- proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "?? (%d)", value); -- return 0; --} --int dissect_release_capability_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_release_capability, tvb, offset, release_capability_conversion); -- return 0; --} --int dissect_mbsfn_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_mbsfn_capability, tvb, offset, 0); -- return 0; --} -- --int dissect_laa_support_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_laa_capability, tvb, offset, 0); -- return 0; --} --int dissect_laa_pd_sensing_lbt_support_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_pd_sensing_lbt_support, tvb, offset, 0); -- return 0; --} --int dissect_laa_multi_carrier_lbt_support_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_multi_carrier_lbt_support, tvb, offset, 0); -- return 0; --} --int dissect_laa_partial_sf_support_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_partial_sf_support, tvb, offset, 0); -- return 0; --} -- --int dissect_data_report_mode_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_data_report_mode, tvb, offset, 0); -- return 0; --} --int dissect_sfn_sf_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_sfnsf, tvb, offset, 0); -- return 0; --} --int dissect_phy_state_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_phy_state, tvb, offset, 0); -- return 0; --} -- -- -- --int dissect_p7_vnf_address_ipv4_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8_array(tree, hf_nfapi_vnf_address_ipv4, 4, tvb, offset); -- return 0; --} --int dissect_p7_vnf_address_ipv6_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8_array(tree, hf_nfapi_vnf_address_ipv4, 16, tvb, offset); -- return 0; --} --int dissect_p7_vnf_port_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_vnf_port, tvb, offset, 0); -- return 0; --} -- --int dissect_p7_pnf_address_ipv4_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8_array(tree, hf_nfapi_pnf_address_ipv4, 4, tvb, offset); -- return 0; --} --int dissect_p7_pnf_address_ipv6_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8_array(tree, hf_nfapi_pnf_address_ipv4, 16, tvb, offset); -- return 0; --} --int dissect_p7_pnf_port_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_pnf_port, tvb, offset, 0); -- return 0; --} -- --int dissect_downlink_ues_per_subframe_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_dl_ue_per_sf, tvb, offset, 0); -- return 0; --} -- --int dissect_uplink_ues_per_subframe_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_ul_ue_per_sf, tvb, offset, 0); -- return 0; --} -- --int dissect_rf_band_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_band, tvb, offset, 0); -- return 0; --} -- --int dissect_rf_bands_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 count = proto_tree_add_uint16(tree, hf_nfapi_number_of_rf_bands, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "RF Band List", hf_nfapi_rf_bands, ett_nfapi_rf_bands, count, dissect_rf_band_value); -- return 0; --} -- --int dissect_timing_window_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_timing_window, tvb, offset, 0); -- return 0; --} --int dissect_timing_info_mode_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_timing_info_mode, tvb, offset, 0); -- return 0; --} --int dissect_timing_info_period_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_timing_info_period, tvb, offset, 0); -- return 0; --} -- --int dissect_maximum_transmit_power_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_maximum_transmit_power, tvb, offset, 0); -- return 0; --} --int dissect_earfcn_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_earfcn, tvb, offset, 0); -- return 0; --} -- --int dissect_nmm_gsm_frequency_bands_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 count = proto_tree_add_uint16(tree, hf_nfapi_number_of_rf_bands, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "RF Band List", hf_nfapi_rf_bands, ett_nfapi_rf_bands, count, dissect_rf_band_value); -- return 0; --} --int dissect_nmm_umts_frequency_bands_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 count = proto_tree_add_uint16(tree, hf_nfapi_number_of_rf_bands, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "RF Band List", hf_nfapi_rf_bands, ett_nfapi_rf_bands, count, dissect_rf_band_value); -- return 0; --} --int dissect_nmm_lte_frequency_bands_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 count = proto_tree_add_uint16(tree, hf_nfapi_number_of_rf_bands, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "RF Band List", hf_nfapi_rf_bands, ett_nfapi_rf_bands, count, dissect_rf_band_value); -- return 0; --} --int dissect_nmm_uplink_rssi_supported_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_nmm_uplink_rssi_supported, tvb, offset, 0); -- return 0; --} -- --int dissect_dl_config_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_dl_config_pdu_type, tvb, offset, 0); -- guint8 size = proto_tree_add_uint8(tree, hf_nfapi_pdu_size, tvb, offset, 0); -- -- guint pdu_end = (*offset + size - 2); -- dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); -- -- return 0; --} -- -- --static int dissect_dl_config_request_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_number_pdcch_ofdm_symbols, tvb, offset, 0); -- guint16 num_pdu = proto_tree_add_uint8(tree, hf_nfapi_number_dci, tvb, offset, 0); -- num_pdu += proto_tree_add_uint16(tree, hf_nfapi_number_pdus, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_number_pdsch_rnti, tvb, offset, 0); -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power_pcfich, tvb, offset, power_offset_conversion); -- -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "DL Config PDU List", hf_nfapi_dl_config_request_pdu_list, ett_nfapi_dl_config_request_pdu_list, num_pdu, dissect_dl_config_pdu); -- -- -- return 0; --} -- --static int dissect_dl_config_request_bch_pdu_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_length, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_pdu_index, tvb, offset, 0); -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion); -- return 0; --} -- --static int dissect_dl_config_request_dl_dci_pdu_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_dci_format, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_cce_idx, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_aggregation_level, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_resource_allocation_type, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_virtual_resource_block_assignment_flag, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_resource_block_coding, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_mcs_1, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_redundancy_version_1, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_new_data_indicator_1, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_transport_block_to_codeword_swap_flag, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_mcs_2, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_redundancy_version_2, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_new_data_indicator_2, tvb, offset, 0); -- proto_tree_add_uint8_with_range(tree, hf_nfapi_harq_process, tvb, offset, pinfo, 0, 15, 0); -- proto_tree_add_uint8(tree, hf_nfapi_tpmi, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_precoding_information, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_tpc, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_downlink_assignment_index, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_ngap, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_transport_block_size_index, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_downlink_power_offset, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_allocate_prach_flag, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_preamble_index, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_prach_mask_index, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_rnti_type, tvb, offset, 0); -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion); -- return 0; --} --static int dissect_dl_config_request_dl_dci_pdu_rel9_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_mcch_flag, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_mcch_change_notification, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_scrambling_identity, tvb, offset, 0); -- return 0; --} --static int dissect_dl_config_request_dl_dci_pdu_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_cross_carrier_scheduling_flag, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_carrier_indicator, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_size_of_cqi_csi_feild, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_srs_flag, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_srs_request, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_antenna_ports_scrambling_and_layers, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_total_dci_length_including_padding, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_n_dl_rb, tvb, offset, 0); -- return 0; --} --static int dissect_dl_config_request_dl_dci_pdu_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_harq_ack_resource_offset, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_pdsch_re_mapping_and_quasi_co_location_indicator, tvb, offset, 0); -- return 0; --} -- --int dissect_ul_dl_configuration_index_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_ul_dl_configuration_index, tvb, offset, 0); -- return 0; --} -- -- --static int dissect_dl_config_request_dl_dci_pdu_rel12_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_primary_cell_type, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_ul_dl_configuration_flag, tvb, offset, 0); -- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_ul_dl_configurations, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "UL/DL Configurations", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy, count, dissect_ul_dl_configuration_index_value); -- -- return 0; --} --static int dissect_dl_config_request_dl_dci_pdu_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_laa_end_partial_sf_flag, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_laa_end_partial_sf_configuration, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_initial_lbt_sf, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_codebooksize_determination_r13, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_rel13_drms_table_flag, tvb, offset, 0); -- return 0; --} -- --static int dissect_dl_config_request_mch_pdu_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_length, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_pdu_index, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_resource_allocation_type, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_resource_block_coding, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_modulation, tvb, offset, 0); -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion); -- proto_tree_add_uint16(tree, hf_nfapi_mbsfn_area_id, tvb, offset, 0); -- -- return 0; --} -- --int dissect_codebook_index_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_codebook_index, tvb, offset, 0); -- return 0; --} -- --int dissect_bf_vector_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_bf_vector_bf_value, tvb, offset, 0); -- return 0; --} -- --int dissect_bf_vector_type_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_bf_vector_subband_index, tvb, offset, 0); -- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_bf_vector_num_antennas, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "Antennas", hf_nfapi_bf_vector_antennas, ett_nfapi_bf_vector_antennas, count, dissect_bf_vector_value); -- return 0; --} -- --static int dissect_dl_config_request_dlsch_pdu_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_length, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_pdu_index, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_resource_allocation_type, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_virtual_resource_block_assignment_flag, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_resource_block_coding, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_modulation, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_redundancy_version, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_transport_blocks, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_transport_block_to_codeword_swap_flag, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_transmission_scheme, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_number_of_layers, tvb, offset, 0); -- guint8 num_subbands = proto_tree_add_uint8(tree, hf_nfapi_number_of_subbands, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "Subbands", hf_nfapi_subbands, ett_nfapi_subbands, num_subbands, dissect_codebook_index_value); -- proto_tree_add_uint8(tree, hf_nfapi_ue_category_capacity, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_pa, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_delta_power_offset_index, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_ngap, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_nprb, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_transmission_mode, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_num_bf_prb_per_subband, tvb, offset, 0); -- guint8 num_vectors = proto_tree_add_uint8(tree, hf_nfapi_num_bf_vector, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "Beamforming Vectors", hf_nfapi_bf_vectors, ett_nfapi_bf_vectors, num_vectors, dissect_bf_vector_type_value); -- -- -- return 0; --} -- --int dissect_csi_rs_resource_config_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_csi_rs_resource_config, tvb, offset, 0); -- return 0; --} -- --static int dissect_dl_config_request_dlsch_pdu_rel9_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_nscid, tvb, offset, 0); -- -- return 0; --} --static int dissect_dl_config_request_dlsch_pdu_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_csi_rs_flag, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_csi_rs_resource_config_r10, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10, tvb, offset, 0); -- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_csi_rs_number_if_nzp_configurations, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "CSI-RS Resource Configs", hf_nfapi_csi_rs_resource_configs, ett_nfapi_csi_rs_resource_configs, count, dissect_csi_rs_resource_config_value); -- proto_tree_add_uint8(tree, hf_nfapi_pdsch_start, tvb, offset, 0); -- -- return 0; --} --static int dissect_dl_config_request_dlsch_pdu_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_drms_config_flag, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_drms_scrambling, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_csi_config_flag, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_csi_scrambling, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_pdsch_re_mapping_flag, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_pdsch_re_mapping_antenna_ports, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_pdsch_re_mapping_freq_shift, tvb, offset, 0); -- return 0; --} --static int dissect_dl_config_request_dlsch_pdu_rel12_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_alt_cqi_table_r12, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_max_layers, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_n_dl_harq, tvb, offset, 0); -- return 0; --} --static int dissect_dl_config_request_dlsch_pdu_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_dwpts_symbols, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_initial_lbt_sf, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_ue_type, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_pdsch_payload_type, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_initial_transmission_sf, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_req13_drms_table_flag, tvb, offset, 0); -- return 0; --} --static int dissect_dl_config_request_pch_pdu_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_length, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_pdu_index, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_prnti, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_resource_allocation_type, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_virtual_resource_block_assignment_flag, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_resource_block_coding, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_mcs, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_redundancy_version, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_number_of_transport_blocks, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_transport_block_to_codeword_swap_flag, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_transmission_scheme, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_number_of_layers, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_codebook_index, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_ue_category_capacity, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_pa, tvb, offset, 0); -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion); -- proto_tree_add_uint8(tree, hf_nfapi_nprb, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_ngap, tvb, offset, 0); -- return 0; --} --static int dissect_dl_config_request_pch_pdu_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_ue_mode, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_initial_transmission_sf, tvb, offset, 0); -- return 0; --} --static int dissect_dl_config_request_prs_pdu_rel9_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion); -- proto_tree_add_uint8(tree, hf_prs_bandwidth, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_prs_cyclic_prefix_type, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_prs_muting, tvb, offset, 0); -- return 0; --} --static int dissect_dl_config_request_csi_rs_pdu_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_csi_rs_antenna_port_count_r10, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_csi_rs_resource_config_r10, tvb, offset, 0); -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion); -- proto_tree_add_uint16(tree, hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10, tvb, offset, 0); -- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_csi_rs_number_if_nzp_configurations, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "CSI-RS Resource Configs", hf_nfapi_csi_rs_resource_configs, ett_nfapi_csi_rs_resource_configs, count, dissect_csi_rs_resource_config_value); -- return 0; --} -- -- --int dissect_csi_rs_bf_vector_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_csi_rs_resource_index, tvb, offset, 0); -- //proto_tree_add_uint8(tree, hf_nfapi_csi_rs_resource_config, tvb, offset, 0); -- return 0; --} -- --static int dissect_dl_config_request_csi_rs_pdu_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_csi_rs_class, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_cdm_type, tvb, offset, 0); -- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_num_bf_vector, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "Beamforming Vector", hf_nfapi_csi_rs_bf_vector, ett_nfapi_csi_rs_bf_vector, count, dissect_csi_rs_bf_vector_value); -- return 0; --} -- --int dissect_epdcch_prb_index_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_edpcch_prb_index, tvb, offset, 0); -- return 0; --} -- --static int dissect_dl_config_request_edpcch_params_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_epdcch_resource_assignment_flag, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_epdcch_id, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_epdcch_start_symbol, tvb, offset, 0); -- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_epdcch_num_prb, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "PRBs", hf_nfapi_epdcch_prbs, ett_nfapi_epdcch_prbs, count, dissect_epdcch_prb_index_value); -- dissect_bf_vector_type_value(tvb, pinfo, tree, data, offset, end); -- -- return 0; --} --static int dissect_dl_config_request_edpcch_params_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_dwpts_symbols, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_initial_lbt_sf, tvb, offset, 0); -- return 0; --} -- --int dissect_precoding_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_precoding_value, tvb, offset, 0); -- return 0; --} -- --static int dissect_dl_config_request_mpdpcch_pdu_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_mpdcch_narrowband, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_number_of_prb_pairs, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_resource_block_assignment, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_start_symbol, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_ecce_index, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_aggregation_level, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_rnti_type, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_ce_mode, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_drms_scrabmling_init, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_initial_transmission_sf, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_transmission_power, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_dci_format, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_resource_block_coding , tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_mcs, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_pdsch_reception_levels , tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_redundancy_version, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_new_data_indicator, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_harq_process, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_tpmi_length, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_tpmi, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_pmi_flag, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_harq_resource_offset, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_dci_subframe_repetition_number, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_tpc, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_downlink_assignment_index_length, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_downlink_assignment_index, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_allocate_prach_flag, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_preamble_index, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_prach_mask_index, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_starting_ce_level, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_srs_request, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_antenna_ports_and_scrambling_identity_flag, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_antenna_ports_and_scrambling_identity, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_frequency_hopping_enabled_flag , tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_paging_direct_indication_differentiation_flag, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_direct_indication, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_total_dci_length_including_padding, tvb, offset, 0); -- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_tx_antenna_ports, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "Precoding", hf_nfapi_precoding, ett_nfapi_precoding, count, dissect_precoding_value); -- -- return 0; --} -- --int dissect_ul_config_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_ul_config_pdu_type, tvb, offset, 0); -- guint8 size = proto_tree_add_uint8(tree, hf_nfapi_pdu_size, tvb, offset, 0); -- -- guint pdu_end = (*offset + size - 2); -- dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); -- -- return 0; --} -- --static int dissect_ul_config_request_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint8 num_pdu = proto_tree_add_uint8(tree, hf_nfapi_number_pdus, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_rach_prach_frequency_resources, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_srs_present, tvb, offset, 0); -- -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "UL Config PDU List", hf_nfapi_ul_config_request_pdu_list, ett_nfapi_ul_config_request_pdu_list, num_pdu, dissect_ul_config_pdu); -- -- return 0; --} -- -- --int dissect_ul_config_ulsch_pdu_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_size, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_resource_block_start, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_number_of_resource_blocks, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_modulation, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_cyclic_shift_2_for_drms, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_frequency_hopping_enabled_flag, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_frequency_hopping_bits, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_new_data_indication, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_redundancy_version, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_harq_process_number, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_ul_tx_mode, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_current_tx_nb, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_n_srs, tvb, offset, 0); -- return 0; --} --int dissect_ul_config_ulsch_pdu_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_resource_allocation_type, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_resource_block_coding, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_transport_blocks, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_ul_transmission_scheme, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_number_of_layers, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_codebook_index, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_disable_sequence_hopping_flag, tvb, offset, 0); -- return 0; --} --int dissect_ul_config_ulsch_pdu_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_virtual_cell_id_enabled_flag, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_npusch_identity, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_drms_config_flag, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_ndrms_csh_identity, tvb, offset, 0); -- return 0; --} --int dissect_ul_config_ulsch_pdu_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_ue_type, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_total_number_of_repetitions, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_repetition_number, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_initial_sf_io, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_empty_symbols_due_to_retunning, tvb, offset, 0); -- return 0; --} --int dissect_ul_config_init_tx_params_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_n_srs_initial, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_initial_number_of_resource_blocks, tvb, offset, 0); -- return 0; --} --int dissect_ul_config_cqi_ri_info_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_dl_cqi_pmi_size_rank_1, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_dl_cqi_pmi_size_rank_greater_1, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_ri_size, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_delta_offset_cqi, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_delta_offset_ri, tvb, offset, 0); -- return 0; --} --int dissect_ul_config_cqi_ri_info_rel9_later_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint8 type = proto_tree_add_uint8(tree, hf_nfapi_report_type, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_delta_offset_cqi, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_delta_offset_ri, tvb, offset, 0); -- -- switch (type) -- { -- case 0: -- { -- proto_tree_add_uint8(tree, hf_nfapi_dl_cqi_ri_pmi_size, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_control_type, tvb, offset, 0); -- break; -- } -- case 1: -- { -- /*guint8 num_cc = */proto_tree_add_uint8(tree, hf_nfapi_number_of_cc, tvb, offset, 0); -- -- // todo ... -- -- break; -- } -- } -- return 0; --} --int dissect_ul_config_cqi_ri_info_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_dl_cqi_ri_pmi_size_2, tvb, offset, 0); -- return 0; --} --int dissect_ul_config_harq_info_ulsch_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_harq_size, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_delta_offset_harq, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_ack_nack_mode, tvb, offset, 0); -- -- return 0; --} --int dissect_ul_config_harq_info_ulsch_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_harq_size_2, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_delta_offset_harq_2, tvb, offset, 0); -- return 0; --} --int dissect_ul_config_ue_info_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); -- return 0; --} --int dissect_ul_config_ue_info_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_virtual_cell_id_enabled_flag, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_npucch_identity, tvb, offset, 0); -- return 0; --} --int dissect_ul_config_ue_info_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_ue_type, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_empty_symbols, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_total_number_of_repetitions, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_repetition_number, tvb, offset, 0); -- return 0; --} --int dissect_ul_config_cqi_info_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_pucch_index, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_dl_cqi_pmi_size, tvb, offset, 0); -- return 0; --} --int dissect_ul_config_cqi_info_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_number_of_pucch_resource, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_pucch_index_p1, tvb, offset, 0); -- return 0; --} --int dissect_ul_config_cqi_info_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_csi_mode, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_dl_cqi_pmi_size_2, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_statring_prb, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_nprb, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_cdm_index, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_nsrs, tvb, offset, 0); -- return 0; --} --int dissect_ul_config_sr_info_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_pucch_index, tvb, offset, 0); -- return 0; --} --int dissect_ul_config_sr_info_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_number_of_pucch_resource, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_pucch_index_p1, tvb, offset, 0); -- return 0; --} --int dissect_ul_config_harq_info_uci_rel10_tdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_harq_size, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_ack_nack_mode, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_number_of_pucch_resource, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_0, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_1, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_2, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_3, tvb, offset, 0); -- return 0; --} --int dissect_ul_config_harq_info_uci_rel8_fdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_0, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_harq_size, tvb, offset, 0); -- return 0; --} --int dissect_ul_config_harq_info_uci_rel9_later_fdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_harq_size, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_ack_nack_mode, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_number_of_pucch_resource, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_0, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_1, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_2, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_3, tvb, offset, 0); -- return 0; --} --int dissect_ul_config_harq_info_uci_rel11_fdd_tdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_num_ant_ports, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_n_pucch_2_0, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_n_pucch_2_1, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_n_pucch_2_2, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_n_pucch_2_3, tvb, offset, 0); -- return 0; --} --int dissect_ul_config_harq_info_uci_rel13_fdd_tdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_harq_size_2, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_starting_prb, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_nprb, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_cdm_index, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_nsrs, tvb, offset, 0); -- return 0; --} --int dissect_ul_config_srs_info_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_size, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_srs_bandwidth, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_frequency_domain_position, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_srs_hopping_bandwidth, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_transmission_comb, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_i_srs, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_sounding_reference_cyclic_shift, tvb, offset, 0); -- return 0; --} --int dissect_ul_config_srs_info_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_antenna_port, tvb, offset, 0); -- return 0; --} --int dissect_ul_config_srs_info_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_number_of_combs, tvb, offset, 0); -- return 0; --} -- --int dissect_hi_dci0_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_pdu_type, tvb, offset, 0); -- guint8 size = proto_tree_add_uint8(tree, hf_nfapi_pdu_size, tvb, offset, 0); -- -- guint pdu_end = (*offset + size - 2); -- dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); -- -- return 0; --} -- --static int dissect_hi_dci0_request_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_sfn_sf, tvb, offset, 0); -- guint8 num_pdu = proto_tree_add_uint8(tree, hf_nfapi_number_of_dci_pdus, tvb, offset, 0); -- num_pdu += proto_tree_add_uint8(tree, hf_nfapi_number_of_hi_pdus, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "HI DCI0 PDU List", hf_nfapi_hi_dci0_request_pdu_list, ett_nfapi_hi_dci0_request_pdu_list, num_pdu, dissect_hi_dci0_pdu); -- return 0; --} -- --static int dissect_hi_dci0_hi_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_resource_block_start, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_cyclic_shift_2_for_drms, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_hi_value, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_i_phich, tvb, offset, 0); -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion); -- return 0; --} --static int dissect_hi_dci0_hi_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_flag_tb2, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_hi_value_2, tvb, offset, 0); -- return 0; --} --static int dissect_hi_dci0_dci_ul_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_dci_format, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_cce_idx, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_aggregation_level, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_resource_block_start, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_number_of_resource_blocks, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_mcs_1, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_cyclic_shift_2_for_drms, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_frequency_hopping_enabled_flag, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_frequency_hopping_bits, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_new_data_indication, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_ue_tx_antenna_selection, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_tpc, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_cqi_csi_request, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_ul_index, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_dl_assignment_index, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_tpc_bitmap, tvb, offset, 0); -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion); -- return 0; --} --static int dissect_hi_dci0_dci_ul_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_cross_carrier_scheduling_flag, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_carrier_indicator, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_size_of_cqi_csi_feild, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_srs_flag, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_srs_request, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_resource_allocation_flag, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_resource_allocation_type, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_resource_block_coding, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_mcs_2, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_new_data_indication_two, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_number_of_antenna_ports, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_tpmi, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_total_dci_length_including_padding, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_n_ul_rb, tvb, offset, 0); -- return 0; --} --static int dissect_hi_dci0_dci_ul_rel12_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_pscch_resource, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_time_resource_pattern, tvb, offset, 0); -- return 0; --} --static int dissect_hi_dci0_edpcch_dci_ul_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_epdcch_resource_assignment_flag, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_epdcch_id, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_epdcch_start_symbol, tvb, offset, 0); -- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_epdcch_num_prb, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "PRBs", hf_nfapi_epdcch_prbs, ett_nfapi_epdcch_prbs, count, dissect_epdcch_prb_index_value); -- dissect_bf_vector_type_value(tvb, pinfo, tree, data, offset, end); -- return 0; --} -- --static int dissect_hi_dci0_mdpcch_dci_ul_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_mpdcch_narrowband, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_number_of_prb_pairs, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_resource_block_assignment, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_mpdcch_transmission_type, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_start_symbol, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_ecce_index, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_aggregation_level, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_rnti_type, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_ce_mode, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_drms_scrambling_init, tvb, offset, 0); -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion); -- proto_tree_add_uint8(tree, hf_nfapi_dci_format, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_number_of_resource_blocks, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_mcs, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_pusch_repetition_levels, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_frequency_hopping_flag, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_new_data_indication, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_harq_process, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_redundancy_version, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_tpc, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_csi_request, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_ul_index, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_dai_presence_flag, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_dl_assignment_index, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_srs_request, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_dci_subframe_repetition_number, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_tpc_bitmap, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_total_dci_length_include_padding, tvb, offset, 0); -- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_tx_antenna_ports, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "TX Antenna Ports", hf_nfapi_tx_antenna_ports, ett_nfapi_tx_antenna_ports, count, dissect_precoding_value); -- -- -- return 0; --} --static int dissect_rx_ue_info_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); -- return 0; --} --static int dissect_rx_indication_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_length, tvb, offset, 0); -- int data_offset = proto_tree_add_uint16(tree, hf_nfapi_data_offset, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_ul_cqi, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_timing_advance, tvb, offset, 0); -- return data_offset; --} --static int dissect_rx_indication_rel9_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_timing_advance_r9, tvb, offset, 0); -- return 0; --} -- --static int dissect_harq_indication_data_bundling_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_0, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_1, tvb, offset, 0); -- return 0; --} -- --static int dissect_harq_indication_data_multplexing_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_0, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_1, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_2, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_3, tvb, offset, 0); -- return 0; --} -- --static int dissect_harq_indication_data_special_bundling_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_0, tvb, offset, 0); -- return 0; --} -- --static int dissect_harq_indication_data_channel_selection_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_0, tvb, offset, 0); -- return 0; --} -- --static int dissect_harq_indication_data_format_3_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_0, tvb, offset, 0); -- return 0; --} -- --static int dissect_harq_indication_data_format_4_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_0, tvb, offset, 0); -- return 0; --} -- -- --static int dissect_harq_indication_data_format_5_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_0, tvb, offset, 0); -- return 0; --} -- -- -- --static int dissect_harq_indication_rel8_tdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint8 mode = proto_tree_add_uint8(tree, hf_nfapi_harq_mode, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_number_of_ack_nack, tvb, offset, 0); -- -- switch (mode) -- { -- case 0: -- { -- dissect_harq_indication_data_bundling_value(tvb, pinfo, tree, data, offset, end); -- break; -- } -- case 1: -- { -- dissect_harq_indication_data_multplexing_value(tvb, pinfo, tree, data, offset, end); -- break; -- } -- case 2: -- { -- dissect_harq_indication_data_special_bundling_value(tvb, pinfo, tree, data, offset, end); -- break; -- } -- }; -- -- return 0; --} --static int dissect_harq_indication_rel9_later_tdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint8 mode = proto_tree_add_uint8(tree, hf_nfapi_harq_mode, tvb, offset, 0); -- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_ack_nack, tvb, offset, 0); -- -- // Have to do this as the mode value is need to decode the value -- guint16 i = 0; -- -- proto_item *list_ti = proto_tree_add_string_format(tree, hf_nfapi_harq_ack_nack_data, tvb, *offset, 2, "", "ACK/NACK Data"); -- proto_tree *list_tree = proto_item_add_subtree(list_ti, ett_nfapi_harq_ack_nack_data); -- -- for (i = 0; i < count; ++i) -- { -- -- proto_item *item_ti = proto_tree_add_string_format(list_tree, hf_nfapi_harq_ack_nack_data, tvb, *offset, 2, "", "[%d]", i); -- proto_tree *item_tree = proto_item_add_subtree(item_ti, ett_nfapi_harq_ack_nack_data); -- -- switch (mode) -- { -- case 0: -- { -- dissect_harq_indication_data_bundling_value(tvb, pinfo, item_tree, data, offset, end); -- break; -- } -- case 1: -- { -- dissect_harq_indication_data_multplexing_value(tvb, pinfo, item_tree, data, offset, end); -- break; -- } -- case 2: -- { -- dissect_harq_indication_data_special_bundling_value(tvb, pinfo, item_tree, data, offset, end); -- break; -- } -- case 3: -- { -- dissect_harq_indication_data_channel_selection_value(tvb, pinfo, item_tree, data, offset, end); -- break; -- } -- case 4: -- { -- dissect_harq_indication_data_format_3_value(tvb, pinfo, item_tree, data, offset, end); -- break; -- } -- }; -- } -- -- return 0; --} --static int dissect_harq_indication_rel13_later_tdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint8 mode = proto_tree_add_uint8(tree, hf_nfapi_harq_mode, tvb, offset, 0); -- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_ack_nack, tvb, offset, 0); -- -- // Have to do this as the mode value is need to decode the value -- guint16 i = 0; -- -- proto_item *list_ti = proto_tree_add_string_format(tree, hf_nfapi_harq_ack_nack_data, tvb, *offset, 2, "", "ACK/NACK Data"); -- proto_tree *list_tree = proto_item_add_subtree(list_ti, ett_nfapi_harq_ack_nack_data); -- -- for (i = 0; i < count; ++i) -- { -- proto_item *item_ti = proto_tree_add_string_format(list_tree, hf_nfapi_harq_ack_nack_data, tvb, *offset, 2, "", "[%d]", i); -- proto_tree *item_tree = proto_item_add_subtree(item_ti, ett_nfapi_harq_ack_nack_data); -- -- switch (mode) -- { -- case 0: -- { -- dissect_harq_indication_data_bundling_value(tvb, pinfo, item_tree, data, offset, end); -- break; -- } -- case 1: -- { -- dissect_harq_indication_data_multplexing_value(tvb, pinfo, item_tree, data, offset, end); -- break; -- } -- case 2: -- { -- dissect_harq_indication_data_special_bundling_value(tvb, pinfo, item_tree, data, offset, end); -- break; -- } -- case 3: -- { -- dissect_harq_indication_data_channel_selection_value(tvb, pinfo, item_tree, data, offset, end); -- break; -- } -- case 4: -- { -- dissect_harq_indication_data_format_3_value(tvb, pinfo, item_tree, data, offset, end); -- break; -- } -- case 5: -- { -- dissect_harq_indication_data_format_4_value(tvb, pinfo, item_tree, data, offset, end); -- break; -- } -- case 6: -- { -- dissect_harq_indication_data_format_5_value(tvb, pinfo, item_tree, data, offset, end); -- break; -- } -- }; -- } -- -- return 0; --} --static int dissect_harq_indication_rel8_fdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_harq_tb_1, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_harq_tb_2, tvb, offset, 0); -- return 0; --} -- --int dissect_harq_tb_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_harq_tb_n, tvb, offset, 0); -- return 0; --} -- -- --static int dissect_harq_indication_rel9_later_fdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_harq_mode, tvb, offset, 0); -- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_ack_nack, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "HARQ TB List", hf_nfapi_harq_data, ett_nfapi_harq_data, count, dissect_harq_tb_value); -- return 0; --} --static int dissect_harq_indication_rel13_later_fdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_harq_mode, tvb, offset, 0); -- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_ack_nack, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "HARQ TB List", hf_nfapi_harq_data, ett_nfapi_harq_data, count, dissect_harq_tb_value); -- return 0; --} --static int dissect_ul_cqi_information_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_ul_cqi, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_channel, tvb, offset, 0); -- return 0; --} --static int dissect_crc_indication_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_crc_flag, tvb, offset, 0); -- return 0; --} --static int dissect_rx_cqi_indication_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_length, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_data_offset, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_ul_cqi, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_ri, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_timing_advance, tvb, offset, 0); -- return 0; --} -- --int dissect_ri_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_ri, tvb, offset, 0); -- return 0; --} --static int dissect_rx_cqi_indication_rel9_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_length, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_data_offset, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_ul_cqi, tvb, offset, 0); -- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_cc_reported, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "CC List", hf_nfapi_cc, ett_nfapi_cc, count, dissect_ri_value); -- proto_tree_add_uint16(tree, hf_nfapi_timing_advance, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_timing_advance_r9, tvb, offset, 0); -- -- return 0; --} --static int dissect_rach_indication_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_preamble, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_timing_advance, tvb, offset, 0); -- return 0; --} --static int dissect_rach_indication_rel9_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_timing_advance_r9, tvb, offset, 0); -- return 0; --} --static int dissect_rach_indication_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_rach_resource_type, tvb, offset, 0); -- return 0; --} -- --int dissect_snr_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_snr, tvb, offset, 0); -- return 0; --} -- --static int dissect_srs_indication_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_doppler_estimation, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_timing_advance, tvb, offset, 0); -- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_resource_blocks, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_rb_start, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "RB List", hf_nfapi_rbs, ett_nfapi_rbs, count, dissect_snr_value); -- -- -- return 0; --} --static int dissect_srs_indication_rel9_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_timing_advance_r9, tvb, offset, 0); -- return 0; --} --static int dissect_srs_indication_rel10_tdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_up_pts_symbol, tvb, offset, 0); -- return 0; --} --static int dissect_tdd_channel_measuerment_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_number_prb_per_subband, tvb, offset, 0); -- guint8 num_subbands = proto_tree_add_uint8(tree, hf_nfapi_number_of_subbands, tvb, offset, 0); -- guint8 num_phy_ant = proto_tree_add_uint8(tree, hf_nfapi_number_antennas, tvb, offset, 0); -- -- guint16 i = 0; -- guint16 j = 0; -- -- proto_item *sb_list_ti = proto_tree_add_string_format(tree, hf_nfapi_subbands, tvb, *offset, 2, "", "Subbands"); -- proto_tree *sb_list_tree = proto_item_add_subtree(sb_list_ti, ett_nfapi_subbands); -- -- for (i = 0; i < num_subbands; ++i) -- { -- proto_item *sb_item_ti = proto_tree_add_string_format(sb_list_tree, hf_nfapi_subbands, tvb, *offset, 2, "", "[%d]", i); -- proto_tree *sb_item_tree = proto_item_add_subtree(sb_item_ti, ett_nfapi_subbands); -- -- proto_tree_add_uint8(sb_item_ti, hf_nfapi_subband_index, tvb, offset, 0); -- -- -- proto_item *ant_list_ti = proto_tree_add_string_format(sb_item_tree, hf_nfapi_antennas, tvb, *offset, 2, "", "Physical Antennas"); -- proto_tree *ant_list_tree = proto_item_add_subtree(ant_list_ti, ett_nfapi_antennas); -- -- for (j = 0; j < num_phy_ant; ++j) -- { -- proto_item *ant_item_ti = proto_tree_add_string_format(ant_list_tree, hf_nfapi_antennas, tvb, *offset, 2, "", "[%d]", j); -- proto_tree *ant_item_tree = proto_item_add_subtree(ant_item_ti, ett_nfapi_antennas); -- -- proto_tree_add_uint16(ant_item_tree, hf_nfapi_channel_coefficient, tvb, offset, 0); -- } -- } -- -- return 0; --} -- --static int dissect_srs_indication_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_ul_rtoa, tvb, offset, 0); -- return 0; --} -- --static int dissect_lbt_dl_config_request_pdsch_req_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_mp_cca, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_n_cca, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_offset, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_lte_txop_sf, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_txop_sfn_sf_end, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_lbt_mode, tvb, offset, 0); -- return 0; --} --static int dissect_lbt_dl_config_request_drs_req_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_offset, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_sfn_sf_end, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_lbt_mode, tvb, offset, 0); -- return 0; --} --static int dissect_lbt_dl_config_request_pdsch_resp_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_result, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_txop_symbols, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_initial_partial_sf, tvb, offset, 0); -- return 0; --} --static int dissect_lbt_dl_config_request_drs_resp_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_result, tvb, offset, 0); -- return 0; --} -- --int dissect_tx_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 len = proto_tree_add_uint16(tree, hf_nfapi_pdu_length, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_pdu_index, tvb, offset, 0); -- -- proto_tree_add_uint8_array(tree, hf_nfapi_pdu, len, tvb, offset); -- -- return 0; --} -- --static int dissect_tx_request_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 num_pdu = proto_tree_add_uint16(tree, hf_nfapi_number_pdus, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "TX PDU List", hf_nfapi_tx_request_pdu_list, ett_nfapi_tx_request_pdu_list, num_pdu, dissect_tx_pdu); -- return 0; -- --} -- --int dissect_rx_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- //guint end = (*offset + size - 2); -- //dissect_tlv_list(tvb, pinfo, tree, data, offset, end); -- return 0; --} -- -- -- --int dissect_harq_indication_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 pdu_len = proto_tree_add_uint16(tree, hf_nfapi_instance_length, tvb, offset, 0); -- guint pdu_end = (*offset + pdu_len - 2); -- dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); -- return 0; --} -- --static int dissect_harq_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 num_pdu = proto_tree_add_uint16(tree, hf_nfapi_number_of_harqs, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "HARQ PDU List", hf_nfapi_harq_indication_pdu_list, ett_nfapi_harq_indication_pdu_list, num_pdu, dissect_harq_indication_pdu); -- return 0; --} -- --int dissect_crc_indication_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 pdu_len = proto_tree_add_uint16(tree, hf_nfapi_instance_length, tvb, offset, 0); -- guint pdu_end = (*offset + pdu_len - 2); -- dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); -- return 0; --} -- -- --static int dissect_crc_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 num_pdu = proto_tree_add_uint16(tree, hf_nfapi_number_of_crcs, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "CRC PDU List", hf_nfapi_crc_indication_pdu_list, ett_nfapi_crc_indication_pdu_list, num_pdu, dissect_crc_indication_pdu); -- return 0; --} --int dissect_sr_indication_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 pdu_len = proto_tree_add_uint16(tree, hf_nfapi_instance_length, tvb, offset, 0); -- guint pdu_end = (*offset + pdu_len - 2); -- dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); -- return 0; --} -- --static int dissect_rx_sr_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 num_pdu = proto_tree_add_uint16(tree, hf_nfapi_number_of_srs, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "SR PDU List", hf_nfapi_sr_indication_pdu_list, ett_nfapi_sr_indication_pdu_list, num_pdu, dissect_sr_indication_pdu); -- return 0; --} --int dissect_cqi_indication_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 pdu_len = proto_tree_add_uint16(tree, hf_nfapi_instance_length, tvb, offset, 0); -- guint pdu_end = (*offset + pdu_len - 2); -- dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); -- return 0; --} --static int dissect_rx_cqi_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 num_pdu = proto_tree_add_uint16(tree, hf_nfapi_number_of_cqi, tvb, offset, 0); -- -- guint16* lengths = malloc(num_pdu * 2); -- memset(lengths, 0, num_pdu * 2); -- -- guint8 tmp_offset = *offset; -- -- int i = 0; -- for (i = 0; i < num_pdu; ++i) -- { -- guint16 instance_len = tvb_get_guint16(tvb, tmp_offset, ENC_NA); -- tmp_offset += 2; -- guint8 pdu_end = tmp_offset + instance_len; -- -- while (tmp_offset < pdu_end) -- { -- guint16 tlv_id = tvb_get_guint16(tvb, tmp_offset, ENC_NA); -- tmp_offset += 2; -- guint16 tlv_len = tvb_get_guint16(tvb, tmp_offset, ENC_NA); -- tmp_offset += 2; -- -- if (tlv_id == 0x202F) -- { -- lengths[i] = tvb_get_guint16(tvb, tmp_offset, ENC_NA); -- } -- else if (tlv_id == 0x2030) -- { -- lengths[i] = tvb_get_guint16(tvb, tmp_offset, ENC_NA); -- } -- -- tmp_offset += tlv_len; -- } -- -- } -- -- -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "CQI PDU List", hf_nfapi_cqi_indication_pdu_list, ett_nfapi_cqi_indication_pdu_list, num_pdu, dissect_cqi_indication_pdu); -- -- -- for (i = 0; i < num_pdu; ++i) -- { -- proto_tree_add_uint8_array(tree, hf_nfapi_pdu, lengths[i], tvb, offset); -- } -- -- free(lengths); -- -- return 0; --} --int dissect_preamble_indication_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 pdu_len = proto_tree_add_uint16(tree, hf_nfapi_instance_length, tvb, offset, 0); -- guint pdu_end = (*offset + pdu_len - 2); -- dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); -- return 0; --} --static int dissect_rach_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 num_pdu = proto_tree_add_uint16(tree, hf_nfapi_number_of_preambles, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "Preamble PDU List", hf_nfapi_preamble_indication_pdu_list, ett_nfapi_preamble_indication_pdu_list, num_pdu, dissect_preamble_indication_pdu); -- return 0; --} --int dissect_srs_indication_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 pdu_len = proto_tree_add_uint16(tree, hf_nfapi_instance_length, tvb, offset, 0); -- guint pdu_end = (*offset + pdu_len - 2); -- dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); -- return 0; --} --static int dissect_srs_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- -- guint8 num_pdu = proto_tree_add_uint8(tree, hf_nfapi_number_of_srss, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "SRS PDU List", hf_nfapi_srs_indication_pdu_list, ett_nfapi_srs_indication_pdu_list, num_pdu, dissect_srs_indication_pdu); -- return 0; --} --int dissect_lbt_dl_config_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_lbt_dl_req_pdu_type, tvb, offset, 0); -- guint8 size = proto_tree_add_uint8(tree, hf_nfapi_pdu_size, tvb, offset, 0); -- guint pdu_end = (*offset + size - 2); -- dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); -- return 0; --} --static int dissect_lbt_dl_config_request_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint8 num_pdu = proto_tree_add_uint8(tree, hf_nfapi_number_pdus, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "LBT DL PDU List", hf_nfapi_lbt_dl_config_pdu_list, ett_nfapi_lbt_dl_config_pdu_list, num_pdu, dissect_lbt_dl_config_pdu); -- -- return 0; --} --int dissect_lbt_dl_indication_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_lbt_dl_ind_pdu_type, tvb, offset, 0); -- guint8 size = proto_tree_add_uint8(tree, hf_nfapi_pdu_size, tvb, offset, 0); -- guint pdu_end = (*offset + size - 2); -- dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); -- return 0; --} --static int dissect_lbt_indication_message_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint8 num_pdu = proto_tree_add_uint8(tree, hf_nfapi_number_pdus, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "LBT DL PDU List", hf_nfapi_lbt_dl_indication_pdu_list, ett_nfapi_lbt_dl_indication_pdu_list, num_pdu, dissect_lbt_dl_indication_pdu); -- return 0; --} -- --static int dissect_lte_rssi_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_frequency_band_indicator, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_measurement_period, tvb, offset, "ms"); -- proto_tree_add_uint8(tree, hf_nfapi_bandwidth, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms"); -- guint8 num_earfcns = proto_tree_add_uint8(tree, hf_nfapi_number_of_earfcns, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "EARFCNs", hf_nfapi_earfcn_list, ett_nfapi_earfcn_list, num_earfcns, dissect_earfcn_value); -- return 0; --} -- --int dissect_uarfcn_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_uarfcn, tvb, offset, 0); -- return 0; --} --static int dissect_utran_rssi_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_frequency_band_indicator, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_measurement_period, tvb, offset, "ms"); -- proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms"); -- guint8 num_uarfcns = proto_tree_add_uint8(tree, hf_nfapi_number_of_uarfcns, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "UARFCNs", hf_nfapi_uarfcn_list, ett_nfapi_uarfcn_list, num_uarfcns, dissect_uarfcn_value); -- return 0; --} -- --int dissect_arfcn_dir_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_arfcn, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_arfcn_direction, tvb, offset, 0); -- return 0; --} --static int dissect_geran_rssi_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_frequency_band_indicator, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_measurement_period, tvb, offset, "ms"); -- proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms"); -- guint8 num_arfcns = proto_tree_add_uint8(tree, hf_nfapi_number_of_arfcns, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "ARFCNs", hf_nfapi_arfcn_list, ett_nfapi_arfcn_list, num_arfcns, dissect_arfcn_dir_value); -- return 0; --} -- -- --int rssi_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, gint16 value) --{ -- proto_tree_add_int_format_value(tree, hfindex, tvb, *offset, 2, value, "%.2f dB (%d)", ((float)value * 0.1), value); -- return 0; --} --int dissect_rssi_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_int16_with_conversion(tree, hf_nfapi_rssi, tvb, offset, rssi_conversion); -- return 0; --} --static int dissect_rssi_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 num_rssi = proto_tree_add_uint16(tree, hf_nfapi_number_of_rssi, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "ARFCNs", hf_nfapi_rssi_list, ett_nfapi_rssi_list, num_rssi, dissect_rssi_value); -- return 0; --} -- --int dissect_pci_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_pci, tvb, offset, 0); -- return 0; --} --static int dissect_lte_cell_search_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_earfcn, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_measurement_bandwidth, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_exhaustive_search, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms"); -- guint8 num_pci = proto_tree_add_uint8(tree, hf_nfapi_number_of_pci, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "PCIs", hf_nfapi_pci_list, ett_nfapi_pci_list, num_pci, dissect_pci_value); -- return 0; --} -- --int dissect_psc_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_psc, tvb, offset, 0); -- return 0; --} --static int dissect_utran_cell_search_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_uarfcn, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_exhaustive_search, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms"); -- guint8 num_psc = proto_tree_add_uint8(tree, hf_nfapi_number_of_psc, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "PSCs", hf_nfapi_psc_list, ett_nfapi_psc_list, num_psc, dissect_psc_value); -- return 0; --} -- --int dissect_arfcn_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_arfcn, tvb, offset, 0); -- return 0; --} -- --static int dissect_geran_cell_search_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms"); -- guint8 num_arfcn = proto_tree_add_uint8(tree, hf_nfapi_number_of_arfcns, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "ARFCNs", hf_nfapi_arfcn_list, ett_nfapi_arfcn_list, num_arfcn, dissect_arfcn_value); -- return 0; --} -- --int neg_pow_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint8 value) --{ -- proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 1, value, "%d dB (%d)", ((gint16)value * (-1)), value); -- return 0; --} -- --int dissect_lte_cell_found_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_pci, tvb, offset, 0); -- proto_tree_add_uint8_with_conversion(tree, hf_nfapi_rsrp, tvb, offset, neg_pow_conversion); -- proto_tree_add_uint8_with_conversion(tree, hf_nfapi_rsrq, tvb, offset, neg_pow_conversion); -- proto_tree_add_int16(tree, hf_nfapi_frequency_offset, tvb, offset, 0); -- return 0; --} --static int dissect_lte_cell_search_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 num_lte_cells = proto_tree_add_uint16(tree, hf_nfapi_number_of_lte_cells_found, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "LTE Cells Found", hf_nfapi_lte_cells_found_list, ett_nfapi_lte_cells_found_list, num_lte_cells, dissect_lte_cell_found_value); -- return 0; --} --int dissect_utran_cell_found_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_psc, tvb, offset, 0); -- proto_tree_add_uint8_with_conversion(tree, hf_nfapi_rscp, tvb, offset, neg_pow_conversion); -- proto_tree_add_uint8_with_conversion(tree, hf_nfapi_enco, tvb, offset, neg_pow_conversion); -- proto_tree_add_int16(tree, hf_nfapi_frequency_offset, tvb, offset, 0); -- return 0; --} --static int dissect_utran_cell_search_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 num_utran_cells = proto_tree_add_uint16(tree, hf_nfapi_number_of_utran_cells_found, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "UTRAN Cells Found", hf_nfapi_utran_cells_found_list, ett_nfapi_utran_cells_found_list, num_utran_cells, dissect_utran_cell_found_value); -- return 0; --} -- --int dissect_geran_cell_found_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_arfcn, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_bsic, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_rxlev, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_rxqual, tvb, offset, 0); -- proto_tree_add_int16(tree, hf_nfapi_frequency_offset, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_sfn_offset, tvb, offset, 0); -- return 0; --} --static int dissect_geran_cell_search_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 num_geran_cells = proto_tree_add_uint16(tree, hf_nfapi_number_of_geran_cells_found, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "GERAN Cells Found", hf_nfapi_geran_cells_found_list, ett_nfapi_geran_cells_found_list, num_geran_cells, dissect_geran_cell_found_value); -- -- return 0; --} --static int dissect_pnf_cell_search_state_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8_array(tree, hf_nfapi_pnf_search_state, *end - *offset, tvb, offset); -- return 0; --} -- --static int dissect_pnf_cell_broadcast_state_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8_array(tree, hf_nfapi_pnf_broadcast_state, *end - *offset, tvb, offset); -- return 0; --} --static int dissect_lte_broadcast_detect_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_earfcn, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_pci, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms"); -- return 0; --} --static int dissect_utran_broadcast_detect_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_uarfcn, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_psc, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms"); -- return 0; --} -- --static int dissect_lte_broadcast_detect_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_number_of_tx_antenna, tvb, offset, 0); -- guint16 mib_len = proto_tree_add_uint16(tree, hf_nfapi_mib_length, tvb, offset, 0); -- proto_tree_add_uint8_array(tree, hf_nfapi_mib, mib_len, tvb, offset); -- proto_tree_add_uint32(tree, hf_nfapi_sfn_offset, tvb, offset, 0); -- return 0; --} --static int dissect_utran_broadcast_detect_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 mib_len = proto_tree_add_uint16(tree, hf_nfapi_mib_length, tvb, offset, 0); -- proto_tree_add_uint8_array(tree, hf_nfapi_mib, mib_len, tvb, offset); -- proto_tree_add_uint32(tree, hf_nfapi_sfn_offset, tvb, offset, 0); -- return 0; --} -- --static int dissect_lte_system_information_schedule_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_earfcn, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_pci, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_downlink_channel_bandwidth, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_phich_configuration, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_number_of_tx_antenna, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_retry_count, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, 0); -- return 0; --} --//static int dissect_pnf_cell_broadcast_state_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --//{ --// return 0; --//} --static int dissect_lte_system_information_schedule_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- // this needs to be SIB 1 -- proto_tree_add_uint8_array(tree, hf_nfapi_sib1, (*end - *offset), tvb, offset); -- return 0; --} -- --int dissect_si_periodicity_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_si_periodicity, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_si_index, tvb, offset, 0); -- return 0; --} -- --static int dissect_lte_system_information_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_earfcn, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_pci, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_downlink_channel_bandwidth, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_phich_configuration, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_number_of_tx_antenna, tvb, offset, 0); -- guint8 si_priodicity = proto_tree_add_uint8(tree, hf_nfapi_number_of_si_periodicity, tvb, offset, 0); -- dissect_array_value(tvb, pinfo, tree, data, offset, end, "Number SI Periodicity", hf_nfapi_si_periodicity_list, ett_nfapi_si_periodicity_list, si_priodicity, dissect_si_periodicity_value); -- proto_tree_add_uint8(tree, hf_nfapi_si_window_length, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, 0); -- -- return 0; --} --static int dissect_utran_system_information_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_uarfcn, tvb, offset, 0); -- proto_tree_add_uint16(tree, hf_nfapi_psc, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, 0); -- return 0; --} --static int dissect_geran_system_information_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint16(tree, hf_nfapi_arfcn, tvb, offset, 0); -- proto_tree_add_uint8(tree, hf_nfapi_bsic, tvb, offset, 0); -- proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, 0); -- return 0; --} --//static int dissect_pnf_cell_broadcast_state_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --//{ --// return 0; --//} --static int dissect_lte_system_information_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- proto_tree_add_uint8(tree, hf_nfapi_sib_type, tvb, offset, 0); -- guint16 sib_len = proto_tree_add_uint16(tree, hf_nfapi_sib_len, tvb, offset, 0); -- proto_tree_add_uint8_array(tree, hf_nfapi_sib, sib_len, tvb, offset); -- return 0; --} --static int dissect_utran_system_information_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 sib_len = proto_tree_add_uint16(tree, hf_nfapi_sib_len, tvb, offset, 0); -- proto_tree_add_uint8_array(tree, hf_nfapi_sib, sib_len, tvb, offset); -- return 0; --} --static int dissect_geran_system_information_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint16 si_len = proto_tree_add_uint16(tree, hf_nfapi_si_len, tvb, offset, 0); -- proto_tree_add_uint8_array(tree, hf_nfapi_si, si_len, tvb, offset); -- return 0; --} -- --static int dissect_rx_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end); -- --const tlv_t tags[] = --{ -- { 0x1000, "PNF Param General", dissect_pnf_param_general_value }, -- { 0x1001, "PNF PHY", dissect_pnf_phy_value }, -- { 0x1002, "PNF RF", dissect_pnf_rf_value }, -- { 0x100A, "PNF PHY Rel 10", dissect_pnf_phy_rel10_value }, -- { 0x100B, "PNF PHY Rel 11", dissect_pnf_phy_rel11_value }, -- { 0x100C, "PNF PHY Rel 12", dissect_pnf_phy_rel12_value }, -- { 0x100D, "PNF PHY Rel 13", dissect_pnf_phy_rel13_value }, -- { 0x1003, "PNF PHY RF Config", dissect_pnf_phy_rf_config_value }, -- -- { 0x0001, "Subframe config - Duplex Mode", dissect_duplex_mode_value }, -- { 0x0002, "Subframe config - PCFICH power offset TLV", dissect_pcfich_power_offset_value }, -- { 0x0003, "Subframe config - P-B", dissect_pb_value }, -- { 0x0004, "Subframe config - DL cyclic prefix type", dissect_dl_cyclic_prefix_value }, -- { 0x0005, "Subframe config - UL cyclic prefix type", dissect_ul_cyclic_prefix_value }, -- { 0x000A, "RF config - Downlink channel bandwidth", dissect_dl_channel_bandwidth_value }, -- { 0x000B, "RF config - Uplink channel bandwidth", dissect_ul_channel_bandwidth_value }, -- { 0x000C, "RF config - Reference signal power", dissect_reference_signal_power_value }, -- { 0x000D, "RF config - Tx antenna ports", dissect_tx_antenna_ports_value }, -- { 0x000E, "RF config - Rx Antenna ports", dissect_rx_antenna_ports_value }, -- { 0x0014, "PHICH config - PHICH resource", dissect_phich_resource_value }, -- { 0x0015, "PHICH config - PHICH duration", dissect_phich_duration_value }, -- { 0x0016, "PHICH config - PHICH power offset", dissect_phich_power_offset_value }, -- { 0x001E, "SCH config - Primary synchronization signal EPRE/EPRERS", dissect_psch_synch_signal_epre_eprers_value }, -- { 0x001F, "SCH config - Secondary synchronization signal EPRE/EPRERS", dissect_ssch_synch_signal_epre_eprers_value }, -- { 0x0020, "SCH config - Physical Cell Id", dissect_physical_cell_id_value }, -- { 0x0028, "PRACH config - Configuration index", dissect_prach_configuration_index_value }, -- { 0x0029, "PRACH config - Root sequence index", dissect_prach_root_sequence_index_value }, -- { 0x002A, "PRACH config - Zero correlation zone configuration", dissect_prach_zero_correlation_zone_configuration_value }, -- { 0x002B, "PRACH config - High speed flag", dissect_prach_high_speed_flag_value }, -- { 0x002C, "PRACH config - Frequency offset", dissect_prach_frequency_offset_value }, -- { 0x0032, "PUSCH config - Hopping mode", dissect_pusch_hopping_mode_value }, -- { 0x0033, "PUSCH config - Hopping offset", dissect_pusch_hopping_offset_value }, -- { 0x0034, "PUSCH config - Number of sub-bands", dissect_pusch_number_of_subbands_value }, -- { 0x003C, "PUCCH config - Delta PUCCH Shift", dissect_pucch_delta_pucch_shift_value }, -- { 0x003D, "PUCCH config - N_CQI RB", dissect_pucch_n_cqi_rb_value }, -- { 0x003E, "PUCCH config - N_AN CS", dissect_pucch_n_an_cs_value }, -- { 0x003F, "PUCCH config - N1Pucch-AN", dissect_pucch_n1_pucch_an_value }, -- { 0x0046, "SRS config - Bandwidth configuration", dissect_srs_bandwidth_configuration_value }, -- { 0x0047, "SRS config - MaxUpPTS", dissect_srs_max_uppts_value }, -- { 0x0048, "SRS config - SRS subframe configuration", dissect_srs_subframe_configuration_value }, -- { 0x0049, "SRS config - SRS AckNack SRS simultaneous transmission", dissect_srs_acknack_srs_sim_tx_value }, -- { 0x0050, "Uplink reference signal config - Uplink RS hopping", dissect_uplink_rs_hopping_value }, -- { 0x0051, "Uplink reference signal config - Group assignment (delta sequence-shift pattern)", dissect_group_assignment_value }, -- { 0x0052, "Uplink reference signal config - Cyclic Shift 1 for DMRS", dissect_cyclic_shift_1_for_drms_value }, -- { 0x005A, "TDD frame structure config - Subframe assignment", dissect_tdd_subframe_assignement_value }, -- { 0x005B, "TDD frame structure config - Special sub-frame patterns", dissect_tdd_subframe_patterns_value }, -- { 0x0064, "LAA config - ED Threshold for LBT for PDSCH", dissect_laa_ed_threashold_for_lbt_for_pdsch_value }, -- { 0x0065, "LAA config - ED Threshold for LBT for DRS", dissect_laa_ed_threashold_for_lbt_for_drs_value }, -- { 0x0066, "LAA config - PD Threshold", dissect_laa_pd_threshold_value }, -- { 0x0067, "LAA config - Multi carrier type", dissect_laa_multi_carrier_type_value }, -- { 0x0068, "LAA config - Multi carrier TX", dissect_laa_multi_carrier_tx_value }, -- { 0x0069, "LAA config - Multi carrier freeze ", dissect_laa_multi_carrier_freeze_value }, -- { 0x006A, "LAA config - Tx antenna ports for DRS", dissect_laa_tx_antenna_port_for_drs_value }, -- { 0x006B, "LAA config - Transmission power for DRS", dissect_laa_transmission_power_for_drs_value }, -- -- { 0x0078, "eMTC config - PBCH Repetitions enable R13", dissect_emtc_pbch_repeitions_enabled_r13_value }, -- { 0x0079, "eMTC config - PRACH CAT-M Root sequence index", dissect_emtc_prach_cat_m_root_sequence_index_value }, -- { 0x007A, "eMTC config - PRACH CAT-M Zero correlation zone configuration", dissect_emtc_prach_cat_m_zero_correlation_zone_configuration_value }, -- { 0x007B, "eMTC config - PRACH CAT-M High speed flag", dissect_emtc_prach_cat_m_high_speed_flag_value }, -- { 0x007C, "eMTC config - PRACH CE level #0 Enable", dissect_emtc_prach_ce_level_0_enabled_value }, -- { 0x007D, "eMTC config - PRACH CE level #0 Configuration index", dissect_emtc_prach_ce_level_0_configuration_offset_value }, -- { 0x007E, "eMTC config - PRACH CE level #0 Frequency offset", dissect_emtc_prach_ce_level_0_frequency_offset_value }, -- { 0x007F, "eMTC config - PRACH CE level #0 Number of repetitions per attempt", dissect_emtc_preach_ce_level_0_num_of_repeitions_per_attempt_value }, -- { 0x0080, "eMTC config - CE level #0 Starting subframe periodicity", dissect_emtc_ce_level_0_starting_subframe_periodicity_value }, -- { 0x0081, "eMTC config - PRACH CE level #0 Hopping Enable", dissect_emtc_preach_ce_level_0_hopping_enabled_value }, -- { 0x0082, "eMTC config - PRACH CE level #0 Hopping Offset", dissect_emtc_preach_ce_level_0_hopping_offset_value }, -- { 0x0083, "eMTC config - PRACH CE level #1 Enable", dissect_emtc_prach_ce_level_1_enabled_value }, -- { 0x0084, "eMTC config - PRACH CE level #1 Configuration index", dissect_emtc_prach_ce_level_1_configuration_offset_value }, -- { 0x0085, "eMTC config - PRACH CE level #1 Frequency offset", dissect_emtc_prach_ce_level_1_frequency_offset_value }, -- { 0x0086, "eMTC config - PRACH CE level #1 Number of repetitions per attempt", dissect_emtc_preach_ce_level_1_num_of_repeitions_per_attempt_value }, -- { 0x0087, "eMTC config - CE level #1 Starting subframe periodicity", dissect_emtc_ce_level_1_starting_subframe_periodicity_value }, -- { 0x0088, "eMTC config - PRACH CE level #1 Hopping Enable", dissect_emtc_preach_ce_level_1_hopping_enabled_value }, -- { 0x0089, "eMTC config - PRACH CE level #1 Hopping Offset", dissect_emtc_preach_ce_level_1_hopping_offset_value }, -- { 0x008A, "eMTC config - PRACH CE level #2 Enable", dissect_emtc_prach_ce_level_2_enabled_value }, -- { 0x008B, "eMTC config - PRACH CE level #2 Configuration index", dissect_emtc_prach_ce_level_2_configuration_offset_value }, -- { 0x008C, "eMTC config - PRACH CE level #2 Frequency offset", dissect_emtc_prach_ce_level_2_frequency_offset_value }, -- { 0x008D, "eMTC config - PRACH CE level #2 Number of repetitions per attempt", dissect_emtc_preach_ce_level_2_num_of_repeitions_per_attempt_value }, -- { 0x008E, "eMTC config - CE level #2 Starting subframe periodicity", dissect_emtc_ce_level_2_starting_subframe_periodicity_value }, -- { 0x008F, "eMTC config - PRACH CE level #2 Hopping Enable", dissect_emtc_preach_ce_level_2_hopping_enabled_value }, -- { 0x0090, "eMTC config - PRACH CE level #2 Hopping Offset", dissect_emtc_preach_ce_level_2_hopping_offset_value }, -- { 0x0091, "eMTC config - PRACH CE level #3 Enable", dissect_emtc_prach_ce_level_3_enabled_value }, -- { 0x0092, "eMTC config - PRACH CE level #3 Configuration index", dissect_emtc_prach_ce_level_3_configuration_offset_value }, -- { 0x0093, "eMTC config - PRACH CE level #3 Frequency offset", dissect_emtc_prach_ce_level_3_frequency_offset_value }, -- { 0x0094, "eMTC config - PRACH CE level #3 Number of repetitions per attempt", dissect_emtc_preach_ce_level_3_num_of_repeitions_per_attempt_value }, -- { 0x0095, "eMTC config - CE level #3 Starting subframe periodicity", dissect_emtc_ce_level_3_starting_subframe_periodicity_value }, -- { 0x0096, "eMTC config - PRACH CE level #3 Hopping Enable", dissect_emtc_preach_ce_level_3_hopping_enabled_value }, -- { 0x0097, "eMTC config - PRACH CE level #3 Hopping Offset", dissect_emtc_preach_ce_level_3_hopping_offset_value }, -- { 0x0098, "eMTC config - PUCCH Interval - ULHoppingConfigCommonModeA", dissect_emtc_pucch_interval_ul_hopping_config_common_mode_a_value }, -- { 0x0099, "eMTC config - PUCCH Interval - ULHoppingConfigCommonModeB", dissect_emtc_pucch_interval_ul_hopping_config_common_mode_b_value }, -- -- { 0x00C8, "Layer 2/3 - Downlink Bandwidth Support", dissect_dl_bandwidth_support_value }, -- { 0x00C9, "Layer 2/3 - Uplink Bandwidth Support", dissect_ul_bandwidth_support_value }, -- { 0x00CA, "Layer 2/3 - Downlink modulation support", dissect_dl_modulation_value }, -- { 0x00CB, "Layer 2/3 - Uplink modulation support", dissect_ul_modulation_value }, -- { 0x00CC, "Layer 2/3 - PHY antenna capability", dissect_phy_antenna_capability_value }, -- { 0x00CD, "Layer 2/3 - Release capability", dissect_release_capability_value }, -- { 0x00CE, "Layer 2/3 - MBSFN capability", dissect_mbsfn_value }, -- -- { 0x00D1, "LAA Capability - LAA support", dissect_laa_support_value }, -- { 0x00D1, "LAA Capability - PD sensing LBT support", dissect_laa_pd_sensing_lbt_support_value }, -- { 0x00D1, "LAA Capability - Multi carrier LBT support", dissect_laa_multi_carrier_lbt_support_value }, -- { 0x00D1, "LAA Capability - Partial SF support", dissect_laa_partial_sf_support_value }, -- -- { 0x00F0, "Layer 2/3 - Data report mode", dissect_data_report_mode_value }, -- { 0x00F1, "Layer 2/3 - SFN/SF", dissect_sfn_sf_value }, -- { 0x00FA, "Layer 1 - PHY state", dissect_phy_state_value }, -- -- { 0x0100, "NFAPI - P7 VNF Address IPv4", dissect_p7_vnf_address_ipv4_value }, -- { 0x0101, "NFAPI - P7 VNF Address IPv4", dissect_p7_vnf_address_ipv6_value }, -- { 0x0102, "NFAPI - P7 Port", dissect_p7_vnf_port_value }, -- { 0x0103, "NFAPI - P7 PNF Address IPv4", dissect_p7_pnf_address_ipv4_value }, -- { 0x0104, "NFAPI - P7 PNF Address IPv4", dissect_p7_pnf_address_ipv6_value }, -- { 0x0105, "NFAPI - P7 Port", dissect_p7_pnf_port_value }, -- { 0x010A, "NFAPI - Downlink UEs per Subframe", dissect_downlink_ues_per_subframe_value }, -- { 0x010B, "NFAPI - Uplink UEs per Subframe", dissect_uplink_ues_per_subframe_value }, -- -- { 0x0114, "NFAPI - nFAPI RF Bands", dissect_rf_bands_value }, -- -- { 0x011E, "NFAPI - Timing window", dissect_timing_window_value }, -- { 0x011F, "NFAPI - Timing info mode", dissect_timing_info_mode_value }, -- { 0x0120, "NFAPI - Timing info period", dissect_timing_info_period_value }, -- { 0x0128, "NFAPI - Maximum Transmit Power", dissect_maximum_transmit_power_value }, -- { 0x0129, "NFAPI - EARFCN", dissect_earfcn_value }, -- { 0x0130, "NFAPI - NMM GSM Frequency Bands", dissect_nmm_gsm_frequency_bands_value }, -- { 0x0131, "NFAPI - NMM UMTS Frequency Bands", dissect_nmm_umts_frequency_bands_value }, -- { 0x0132, "NFAPI - NMM LTE Frequency Bands", dissect_nmm_lte_frequency_bands_value }, -- { 0x0133, "NFAPI - NMM Uplink RSSI supported", dissect_nmm_uplink_rssi_supported_value }, -- -- { 0x2000, "DL Config Request Body", dissect_dl_config_request_body_value }, -- -- { 0x2001, "DL DCI PDU Release 8", dissect_dl_config_request_dl_dci_pdu_rel8_value }, -- { 0x2002, "DL DCI PDU Release 9", dissect_dl_config_request_dl_dci_pdu_rel9_value }, -- { 0x2003, "DL DCI PDU Release 10", dissect_dl_config_request_dl_dci_pdu_rel10_value }, -- { 0x2039, "DL DCI PDU Release 11", dissect_dl_config_request_dl_dci_pdu_rel11_value }, -- { 0x203A, "DL DCI PDU Release 12", dissect_dl_config_request_dl_dci_pdu_rel12_value }, -- { 0x203B, "DL DCI PDU Release 13", dissect_dl_config_request_dl_dci_pdu_rel13_value }, -- -- -- { 0x2004, "BCH PDU Release 8", dissect_dl_config_request_bch_pdu_rel8_value }, -- -- { 0x2005, "MCH PDU Release 8", dissect_dl_config_request_mch_pdu_rel8_value }, -- -- { 0x2006, "DLSCH PDU Release 8", dissect_dl_config_request_dlsch_pdu_rel8_value }, -- { 0x2007, "DLSCH PDU Release 9", dissect_dl_config_request_dlsch_pdu_rel9_value }, -- { 0x2008, "DLSCH PDU Release 10", dissect_dl_config_request_dlsch_pdu_rel10_value }, -- { 0x203C, "DLSCH PDU Release 11", dissect_dl_config_request_dlsch_pdu_rel11_value }, -- { 0x203D, "DLSCH PDU Release 12", dissect_dl_config_request_dlsch_pdu_rel12_value }, -- { 0x203E, "DLSCH PDU Release 13", dissect_dl_config_request_dlsch_pdu_rel13_value }, -- -- { 0x2009, "PCH PDU Release 8", dissect_dl_config_request_pch_pdu_rel8_value }, -- { 0x203F, "PCH PDU Release 13", dissect_dl_config_request_pch_pdu_rel13_value }, -- -- { 0x200A, "PRS PDU Release 9", dissect_dl_config_request_prs_pdu_rel9_value }, -- -- { 0x200B, "CSI-RS PDU Release 10", dissect_dl_config_request_csi_rs_pdu_rel10_value }, -- { 0x2040, "CSI-RS PDU Release 13", dissect_dl_config_request_csi_rs_pdu_rel13_value }, -- -- //{ 0x2001, "EDPCCH PDU Release 8", ?? }, -- //{ 0x2002, "EDPCCH PDU Release 8", ?? }, -- //{ 0x2003, "EDPCCH PDU Release 8", ?? }, -- //{ 0x2039, "EDPCCH PDU Release 11", ?? }, -- //{ 0x203A, "EDPCCH PDU Release 12", ?? }, -- //{ 0x203B, "EDPCCH PDU Release 13", ?? }, -- { 0x2041, "EDPCCH PDU Release 11 Parameters", dissect_dl_config_request_edpcch_params_rel11_value }, -- { 0x2042, "EDPCCH PDU Release 13 Parameters", dissect_dl_config_request_edpcch_params_rel13_value }, -- -- { 0x205B, "MPDCCH PDU Release 13", dissect_dl_config_request_mpdpcch_pdu_rel13_value }, -- -- -- { 0x200C, "UL Config Request Body", dissect_ul_config_request_body_value }, -- { 0x200D, "ULSCH PDU Release 8", dissect_ul_config_ulsch_pdu_rel8_value }, -- { 0x200E, "ULSCH PDU Release 10", dissect_ul_config_ulsch_pdu_rel10_value }, -- { 0x2043, "ULSCH PDU Release 11", dissect_ul_config_ulsch_pdu_rel11_value }, -- { 0x2044, "ULSCH PDU Release 13", dissect_ul_config_ulsch_pdu_rel13_value }, -- { 0x200F, "Initial Transmission Paramters Release 8", dissect_ul_config_init_tx_params_rel8_value }, -- { 0x2010, "CQI RI Information Release 8", dissect_ul_config_cqi_ri_info_rel8_value }, -- { 0x2011, "CQI RI Information Release 9 or later", dissect_ul_config_cqi_ri_info_rel9_later_value }, -- { 0x2045, "CQI RI Information Release 13", dissect_ul_config_cqi_ri_info_rel13_value }, -- { 0x2012, "HARQ Information (ULSCH) Release 10", dissect_ul_config_harq_info_ulsch_rel10_value }, -- { 0x2046, "HARQ Information (ULSCH) Release 13", dissect_ul_config_harq_info_ulsch_rel13_value }, -- { 0x2013, "UE Information Release 8", dissect_ul_config_ue_info_rel8_value }, -- { 0x2047, "UE Information Release 11", dissect_ul_config_ue_info_rel11_value }, -- { 0x2048, "UE Information Release 13", dissect_ul_config_ue_info_rel13_value }, -- { 0x2014, "CQI Information Release 8", dissect_ul_config_cqi_info_rel8_value }, -- { 0x2015, "CQI Information Release 10", dissect_ul_config_cqi_info_rel10_value }, -- { 0x2049, "CQI Information Release 13", dissect_ul_config_cqi_info_rel13_value }, -- { 0x2016, "SR Information Release 8", dissect_ul_config_sr_info_rel8_value }, -- { 0x2017, "SR Information Release 10", dissect_ul_config_sr_info_rel10_value }, -- { 0x2018, "HARQ Information (UCI) Release 10 TDD", dissect_ul_config_harq_info_uci_rel10_tdd_value }, -- { 0x2019, "HARQ Information (UCI) Release 8 FDD", dissect_ul_config_harq_info_uci_rel8_fdd_value }, -- { 0x201A, "HARQ Information (UCI) Release 9 or later FDD", dissect_ul_config_harq_info_uci_rel9_later_fdd_value }, -- { 0x204A, "HARQ Information (UCI) Release 11 FDD/TDD", dissect_ul_config_harq_info_uci_rel11_fdd_tdd_value }, -- { 0x204B, "HARQ Information (UCI) Release 13 FDD/TDD", dissect_ul_config_harq_info_uci_rel13_fdd_tdd_value }, -- { 0x201B, "SRS Information Release 8", dissect_ul_config_srs_info_rel8_value }, -- { 0x201C, "SRS Information Release 10", dissect_ul_config_srs_info_rel10_value }, -- { 0x204C, "SRS Information Release 13", dissect_ul_config_srs_info_rel13_value }, -- -- { 0x201D, "HI DCI0 Request Body", dissect_hi_dci0_request_body_value }, -- { 0x201E, "HI PDU Release 8", dissect_hi_dci0_hi_rel8_value }, -- { 0x201F, "HI PDU Release 10", dissect_hi_dci0_hi_rel10_value }, -- { 0x2020, "DCI UL PDU Release 8", dissect_hi_dci0_dci_ul_rel8_value }, -- { 0x2021, "DCI UL PDU Release 10", dissect_hi_dci0_dci_ul_rel10_value }, -- { 0x204D, "DCI UL PDU Release 12", dissect_hi_dci0_dci_ul_rel12_value }, -- //{ 0x2041, "EDPCCH DCI UL PDU Release 11", dissect_hi_dci0_edpcch_dci_ul_rel11_value }, -- { 0x204E, "MDPCCH DCI UL PDU Release 13", dissect_hi_dci0_mdpcch_dci_ul_rel13_value }, -- -- { 0x2022, "Tx Request Body", dissect_tx_request_body_value }, -- -- { 0x2038, "RX UE Information", dissect_rx_ue_info_value }, -- -- { 0x2023, "RX Indication Body", dissect_rx_indication_body_value }, -- { 0x2024, "RX PDU Release 8", dissect_rx_indication_rel8_value }, -- { 0x2025, "RX PDU Release 9", dissect_rx_indication_rel9_value }, -- -- { 0x2026, "HARQ Indication Body", dissect_harq_indication_body_value }, -- { 0x2027, "HARQ PDU Release 8 TDD", dissect_harq_indication_rel8_tdd_value }, -- { 0x2028, "HARQ PDU Release 9 or later TDD", dissect_harq_indication_rel9_later_tdd_value }, -- { 0x204F, "HARQ PDU Release 13 or later TDD", dissect_harq_indication_rel13_later_tdd_value }, -- { 0x2029, "HARQ PDU Release 8 FDD", dissect_harq_indication_rel8_fdd_value }, -- { 0x202A, "HARQ PDU Release 9 or later FDD", dissect_harq_indication_rel9_later_fdd_value }, -- { 0x2050, "HARQ PDU Release 13 or later FDD", dissect_harq_indication_rel13_later_fdd_value }, -- { 0x2052, "UL CQI Information", dissect_ul_cqi_information_value }, -- -- { 0x202B, "CRC Indication Body", dissect_crc_indication_body_value }, -- { 0x202C, "CRC PDU Release 8", dissect_crc_indication_rel8_value }, -- -- { 0x202D, "RX SR Indication Body", dissect_rx_sr_indication_body_value }, -- -- { 0x202E, "RX CQI Indication Body", dissect_rx_cqi_indication_body_value }, -- { 0x202F, "CQI PDU Release 8", dissect_rx_cqi_indication_rel8_value }, -- { 0x2030, "CQI PDU Release 9", dissect_rx_cqi_indication_rel9_value }, -- -- { 0x2031, "RACH Indication Body", dissect_rach_indication_body_value }, -- { 0x2032, "Preamable PDU Release 8", dissect_rach_indication_rel8_value }, -- { 0x2033, "Preamable PDU Release 9", dissect_rach_indication_rel9_value }, -- { 0x2051, "Preamable PDU Release 13", dissect_rach_indication_rel13_value }, -- -- { 0x2034, "SRS Indication Body", dissect_srs_indication_body_value }, -- { 0x2035, "SRS PDU Release 8", dissect_srs_indication_rel8_value }, -- { 0x2036, "SRS PDU Release 9", dissect_srs_indication_rel9_value }, -- { 0x2037, "SRS PDU Release 10 TDD", dissect_srs_indication_rel10_tdd_value }, -- { 0x2054, "TDD Channel Measurement", dissect_tdd_channel_measuerment_value }, -- { 0x2053, "SRS PDU Release 11", dissect_srs_indication_rel11_value }, -- -- -- { 0x2055, "LBT DL Config Request Body", dissect_lbt_dl_config_request_body_value }, -- { 0x2056, "LBT PDSCH Req PDU Release 13", dissect_lbt_dl_config_request_pdsch_req_rel13_value }, -- { 0x2057, "LBT DRS req PDU Release 13", dissect_lbt_dl_config_request_drs_req_rel13_value }, -- -- { 0x2058, "LBT DL Indication Message Body", dissect_lbt_indication_message_body_value }, -- { 0x2056, "LBT PDSCH Resp PDU Release 13", dissect_lbt_dl_config_request_pdsch_resp_rel13_value }, -- { 0x2057, "LBT DRS Resp PDU Release 13", dissect_lbt_dl_config_request_drs_resp_rel13_value }, -- -- { 0x3000, "LTE RSSI Request", dissect_lte_rssi_request_value }, -- { 0x3001, "UTRAN RSSI Request", dissect_utran_rssi_request_value }, -- { 0x3002, "GERAN RSSI Request", dissect_geran_rssi_request_value }, -- { 0x3003, "RSSI Indication", dissect_rssi_indication_value }, -- { 0x3004, "LTE CELL SEARCH Request", dissect_lte_cell_search_value }, -- { 0x3005, "UTRAN CELL SEARCH Request", dissect_utran_cell_search_value }, -- { 0x3006, "GERAN CELL SEARCH Request", dissect_geran_cell_search_value }, -- { 0x3007, "LTE CELL SEARCH Indication", dissect_lte_cell_search_indication_value }, -- { 0x3008, "UTRAN CELL SEARCH Indication", dissect_utran_cell_search_indication_value }, -- { 0x3009, "GERAN CELL SEARCH Indication", dissect_geran_cell_search_indication_value }, -- { 0x300a, "PNF CELL SEARCH STATE", dissect_pnf_cell_search_state_value }, -- { 0x300b, "LTE BROADCAST DETECT Request", dissect_lte_broadcast_detect_request_value }, -- { 0x300c, "UTRAN BROADCAST DETECT Request", dissect_utran_broadcast_detect_request_value }, -- { 0x300d, "PNF CELL SEARCH STATE", dissect_pnf_cell_search_state_value }, -- { 0x300e, "LTE BROADCAST DETECT Indication", dissect_lte_broadcast_detect_indication_value }, -- { 0x300f, "UTRAN BROADCAST DETECT Indication", dissect_utran_broadcast_detect_indication_value }, -- { 0x3010, "PNF CELL BROADCAST STATE", dissect_pnf_cell_broadcast_state_value }, -- { 0x3011, "LTE SYSTEM INFORMATION SCHEDULE Request", dissect_lte_system_information_schedule_request_value }, -- { 0x3012, "PNF CELL BROADCAST STATE", dissect_pnf_cell_broadcast_state_value }, -- { 0x3013, "LTE SYSTEM INFORMATION SCHEDULE Indication", dissect_lte_system_information_schedule_indication_value }, -- { 0x3014, "LTE SYSTEM INFORMATION Request", dissect_lte_system_information_request_value }, -- { 0x3015, "UTRAN SYSTEM INFORMATION Request", dissect_utran_system_information_request_value }, -- { 0x3016, "GERAN SYSTEM INFORMATION Request", dissect_geran_system_information_request_value }, -- { 0x3017, "PNF CELL BROADCAST STATE", dissect_pnf_cell_broadcast_state_value }, -- { 0x3018, "LTE SYSTEM INFORMATION Indication", dissect_lte_system_information_indication_value }, -- { 0x3019, "UTRAN SYSTEM INFORMATION Indication", dissect_utran_system_information_indication_value }, -- { 0x301a, "GERAN SYSTEM INFORMATION Indication", dissect_geran_system_information_indication_value }, -- -- -- -- --}; -- --int look_up_tlv(int tag_id) --{ -- int i; -- int num_tags = sizeof(tags) / sizeof(tlv_t); -- -- for (i = 0; i < num_tags; i++) -- { -- if (tag_id == tags[i].tag_id) -- return i; -- } -- return -1; --} -- --static int dissect_tl_header(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset) --{ -- proto_item *tl_ti = proto_tree_add_string_format(tree, hf_nfapi_tl, tvb, *offset, 4, "", "TL"); -- proto_tree *tl_tree = proto_item_add_subtree(tl_ti, ett_nfapi_tl); -- -- proto_tree_add_uint16(tl_tree, hf_nfapi_tl_tag, tvb, offset, 0); -- proto_tree_add_uint16(tl_tree, hf_nfapi_tl_length, tvb, offset, "bytes"); -- -- return 0; -- --} -- --static int dissect_tlv_list(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint len) --{ -- while (*offset < len) -- { -- guint16 tlv_id = tvb_get_guint16(tvb, *offset, ENC_NA); -- guint16 tlv_len = tvb_get_guint16(tvb, *offset + 2, ENC_NA); -- -- int tlv_index = look_up_tlv(tlv_id); -- -- char* tlv_name = tlv_index != -1 ? tags[tlv_index].name : "Unknown"; -- -- proto_item *tlv_ti = proto_tree_add_string_format(tree, hf_nfapi_tlv_tree, tvb, *offset, tlv_len + 4, "", tlv_name); -- proto_tree *tlv_tree = proto_item_add_subtree(tlv_ti, ett_nfapi_tlv_tree); -- -- dissect_tl_header(tvb, pinfo, tlv_tree, data, offset); -- -- if (tags[tlv_index].decode != NULL) -- { -- guint tmp = *offset; -- guint end = *offset + tlv_len; -- tags[tlv_index].decode(tvb, pinfo, tlv_tree, data, &tmp, &end); -- *offset += tlv_len; -- } -- else -- { -- *offset += tlv_len; -- } -- } -- -- return 0; --} -- --static int dissect_rx_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) --{ -- guint number_of_pdu_addr = *offset; -- guint16 count = proto_tree_add_uint16(tree, hf_nfapi_number_pdus, tvb, offset, 0); -- //dissect_array_value(tvb, pinfo, tree, data, offset, "RX PDU List", hf_nfapi_rx_indication_pdu_list, ett_nfapi_rx_indication_pdu_list, num_pdu, dissect_rx_pdu); -- -- guint16* lengths = malloc(count * 2); -- memset(lengths, 0, count * 2); -- -- guint16 i = 0; -- -- if (count > 0) -- { -- proto_item *list_ti = proto_tree_add_string_format(tree, hf_nfapi_rx_indication_pdu_list, tvb, *offset, 2, "", "RX PDU List"); -- proto_tree *list_tree = proto_item_add_subtree(list_ti, ett_nfapi_rx_indication_pdu_list); -- -- //for (i = 0; i < count; ++i) -- proto_tree *item_tree = 0; -- -- guint pdu_end = *end; -- while (*offset < *end && *offset < pdu_end) -- { -- -- guint16 tlv_id = tvb_get_guint16(tvb, *offset, ENC_NA); -- guint16 tlv_len = tvb_get_guint16(tvb, *offset + 2, ENC_NA); -- -- if (tlv_id == 0x2038) -- { -- proto_item *item_ti = proto_tree_add_string_format(list_tree, hf_nfapi_rx_indication_pdu_list, tvb, *offset, 2, "", "[%d]", i); -- item_tree = proto_item_add_subtree(item_ti, ett_nfapi_rx_indication_pdu_list); -- -- i++; -- } -- -- int tlv_index = look_up_tlv(tlv_id); -- -- char* tlv_name = tlv_index != -1 ? tags[tlv_index].name : "Unknown"; -- -- proto_item *tlv_ti = proto_tree_add_string_format(item_tree, hf_nfapi_tlv_tree, tvb, *offset, tlv_len + 4, "", tlv_name); -- proto_tree *tlv_tree = proto_item_add_subtree(tlv_ti, ett_nfapi_tlv_tree); -- -- -- -- -- dissect_tl_header(tvb, pinfo, tlv_tree, data, offset); -- -- guint tmp_offset = *offset; -- -- if (tlv_id == 0x2038) -- { -- dissect_rx_ue_info_value(tvb, pinfo, tlv_tree, data, &tmp_offset, end); -- } -- -- else if (tlv_id == 0x2024) -- { -- //int data_offset = dissect_rx_indication_rel8_value(tvb, pinfo, tlv_tree, data, &tmp_offset, end); -- -- lengths[i-1] = proto_tree_add_uint16(tlv_tree, hf_nfapi_length, tvb, &tmp_offset, 0); -- int data_offset = proto_tree_add_uint16(tlv_tree, hf_nfapi_data_offset, tvb, &tmp_offset, 0); -- proto_tree_add_uint8(tlv_tree, hf_nfapi_ul_cqi, tvb, &tmp_offset, 0); -- proto_tree_add_uint16(tlv_tree, hf_nfapi_timing_advance, tvb, &tmp_offset, 0); -- -- if ((data_offset > 0) && (pdu_end == *end)) -- { -- pdu_end = number_of_pdu_addr + data_offset; -- } -- -- } -- else if (tlv_id == 0x2025) -- { -- dissect_rx_indication_rel9_value(tvb, pinfo, tlv_tree, data, &tmp_offset, end); -- } -- -- -- *offset += tlv_len; -- } -- -- } -- -- for (i = 0; i < count; ++i) -- { -- proto_tree_add_uint8_array(tree, hf_nfapi_pdu, lengths[i], tvb, offset); -- } -- -- free(lengths); -- -- // more to follow here ?? -- return 0; -- --} -- -- --// ----------------------------------------------------------------------------| -- -- --static int dissect_p45_header(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset) --{ -- proto_item *p4_p5_header_ti = proto_tree_add_string_format(tree, hf_nfapi_p4_p5_message_header, tvb, *offset, NFAPI_HEADER_LENGTH, "", "P4 P5 Header"); -- proto_tree *p4_p5_header_tree = proto_item_add_subtree(p4_p5_header_ti, ett_nfapi_p4_p5_message_header); -- -- proto_tree_add_uint16(p4_p5_header_tree, hf_nfapi_p4_p5_message_header_phy_id, tvb, offset, 0); -- proto_tree_add_uint16(p4_p5_header_tree, hf_nfapi_p4_p5_message_header_message_id, tvb, offset, 0); -- proto_tree_add_uint16(p4_p5_header_tree, hf_nfapi_p4_p5_message_header_message_length, tvb, offset, 0); -- proto_tree_add_uint16(p4_p5_header_tree, hf_nfapi_p4_p5_message_header_spare, tvb, offset, 0); -- -- return 0; --} -- --static int dissect_p7_header_new(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint8* m, guint8* seg, guint8* seq) --{ -- proto_item *p7_header_ti = proto_tree_add_string_format(tree, hf_nfapi_p7_message_header, tvb, *offset, NFAPI_P7_HEADER_LENGTH, "", "P7 Header"); -- proto_tree *p7_header_tree = proto_item_add_subtree(p7_header_ti, ett_nfapi_p7_message_header); -- -- proto_tree_add_uint16(p7_header_tree, hf_nfapi_p7_message_header_phy_id, tvb, offset, 0); -- proto_tree_add_uint16(p7_header_tree, hf_nfapi_p7_message_header_message_id, tvb, offset, 0); -- proto_tree_add_uint16(p7_header_tree, hf_nfapi_p7_message_header_message_length, tvb, offset, "bytes"); -- -- // decoding bits for p7 header -- -- guint8 m_seg = tvb_get_guint8(tvb, *offset); -- *m = (m_seg & 0x80) >> 7; -- *seg = m_seg & 0x7F; -- -- -- proto_tree_add_bits_item(p7_header_tree, hf_nfapi_p7_message_header_m, tvb, (*offset) * 8, 1, ENC_NA); -- proto_tree_add_bits_item(p7_header_tree, hf_nfapi_p7_message_header_segment, tvb, ((*offset) * 8) + 1, 7, ENC_NA); -- *offset += 1; -- -- *seq = tvb_get_guint8(tvb, *offset); -- proto_tree_add_uint8(p7_header_tree, hf_nfapi_p7_message_header_sequence_number, tvb, offset, 0); -- -- -- proto_tree_add_uint32(p7_header_tree, hf_nfapi_p7_message_header_checksum, tvb, offset, 0); -- proto_tree_add_uint32(p7_header_tree, hf_nfapi_p7_message_header_transmit_timestamp, tvb, offset, "microseconds"); -- -- return 0; -- --} -- -- -- -- --static int dissect_p7_header(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset) --{ -- proto_item *p7_header_ti = proto_tree_add_string_format(tree, hf_nfapi_p7_message_header, tvb, *offset, NFAPI_P7_HEADER_LENGTH, "", "P7 Header"); -- proto_tree *p7_header_tree = proto_item_add_subtree(p7_header_ti, ett_nfapi_p7_message_header); -- -- proto_tree_add_uint16(p7_header_tree, hf_nfapi_p7_message_header_phy_id, tvb, offset, 0); -- proto_tree_add_uint16(p7_header_tree, hf_nfapi_p7_message_header_message_id, tvb, offset, 0); -- proto_tree_add_uint16(p7_header_tree, hf_nfapi_p7_message_header_message_length, tvb, offset, "bytes"); -- -- -- proto_tree_add_bits_item(p7_header_tree, hf_nfapi_p7_message_header_m, tvb, (*offset) * 8, 1, ENC_NA); -- proto_tree_add_bits_item(p7_header_tree, hf_nfapi_p7_message_header_segment, tvb, ((*offset) * 8) + 1, 7, ENC_NA); -- *offset += 1; -- -- proto_tree_add_uint8(p7_header_tree, hf_nfapi_p7_message_header_sequence_number, tvb, offset, 0); -- -- -- proto_tree_add_uint32(p7_header_tree, hf_nfapi_p7_message_header_checksum, tvb, offset, 0); -- proto_tree_add_uint32(p7_header_tree, hf_nfapi_p7_message_header_transmit_timestamp, tvb, offset, "microseconds"); -- -- return 0; -- --} -- --static reassembly_table ul_p7_reassemble_table; --static reassembly_table dl_p7_reassemble_table; -- -- -- --static int hf_msg_fragments = -1; --static int hf_msg_fragment = -1; --static int hf_msg_fragment_overlap = -1; --static int hf_msg_fragment_overlap_conflicts = -1; --static int hf_msg_fragment_multiple_tails = -1; --static int hf_msg_fragment_too_long_fragment = -1; --static int hf_msg_fragment_error = -1; --static int hf_msg_fragment_count = -1; --static int hf_msg_reassembled_in = -1; --static int hf_msg_reassembled_length = -1; --static int hf_msg_reassembled_data = -1; --static gint ett_msg_fragment = -1; --static gint ett_msg_fragments = -1; -- --static const fragment_items msg_frag_items = { -- /* Fragment subtrees */ -- &ett_msg_fragment, -- &ett_msg_fragments, -- /* Fragment fields */ -- &hf_msg_fragments, -- &hf_msg_fragment, -- &hf_msg_fragment_overlap, -- &hf_msg_fragment_overlap_conflicts, -- &hf_msg_fragment_multiple_tails, -- &hf_msg_fragment_too_long_fragment, -- &hf_msg_fragment_error, -- &hf_msg_fragment_count, -- /* Reassembled in field */ -- &hf_msg_reassembled_in, -- /* Reassembled length field */ -- &hf_msg_reassembled_length, -- NULL, -- /* Tag */ -- "Message fragments" --}; -- --static int dissect_nfapi_ul_p7(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) --{ -- guint8 m; -- guint8 seg; -- guint8 seq; -- guint offset = 0; -- -- guint16 msg_id = tvb_get_guint16(tvb, 2, ENC_NA); -- guint16 msg_len = tvb_get_guint16(tvb, 4, ENC_NA); -- -- dissect_p7_header_new(tvb, pinfo, tree, data, &offset, &m, &seg, &seq); -- -- guint8 save_fragmented = pinfo->fragmented; -- -- // not sure why I need to do this, but if I don't it does not reasses the protocol -- pinfo->fd->flags.visited = 0; -- -- if (m == 1 || (m == 0 && seg > 0)) -- { -- pinfo->fragmented = TRUE; -- -- fragment_head *fd_head = fragment_add_seq_check(&ul_p7_reassemble_table, tvb, offset, pinfo, seq, NULL, seg, msg_len - offset, (m == 1)); -- -- guint8 reassembled = 0; -- if (fd_head) -- { -- tvbuff_t * new_tvb = process_reassembled_data(tvb, offset, pinfo, "Reassembled UL P7", fd_head, &msg_frag_items, NULL, tree); -- -- if (new_tvb) -- { -- // set the tvb to the new reassembled buffer. -- tvb = new_tvb; -- reassembled = 1; -- col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Reassembled %d]", seg); -- -- // reset the offset for the new tvb -- offset = 0; -- } -- else -- { -- // Is this a failure to reassemble the data -- return 0; -- } -- } -- else -- { -- // this is a segement skip the body -- col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Segment %d]", seg); -- return 0; -- } -- } -- -- pinfo->fragmented = save_fragmented; -- -- { -- switch (msg_id) -- { -- //HARQ.indication -- case 0x85: -- { -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); -- dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb)); -- } -- break; -- //CRC.indication -- case 0x86: -- { -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); -- dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb)); -- } -- break; -- //RX_ULSCH.indication -- case 0x87: -- { -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); -- dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb)); -- } -- break; -- //RACH.indication -- case 0x88: -- { -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); -- dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb)); -- } -- break; -- //SRS.indication -- case 0x89: -- { -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); -- dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb)); -- } -- break; -- //RX_SR.indication -- case 0x8A: -- { -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); -- dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb)); -- } -- break; -- //RX_CQI.indication -- case 0x8B: -- { -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); -- dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb)); -- } -- break; -- }; -- } -- -- return 0; --} -- --static int dissect_nfapi_dl_p7(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) --{ -- guint8 m; -- guint8 seg; -- guint8 seq; -- guint offset = 0; -- -- guint16 msg_id = tvb_get_guint16(tvb, 2, ENC_NA); -- guint16 msg_len = tvb_get_guint16(tvb, 4, ENC_NA); -- -- dissect_p7_header_new(tvb, pinfo, tree, data, &offset, &m, &seg, &seq); -- -- guint8 save_fragmented = pinfo->fragmented; -- -- // not sure why I need to do this, but if I don't it does not reasses the protocol -- pinfo->fd->flags.visited = 0; -- -- if (m == 1 || (m == 0 && seg > 0)) -- { -- pinfo->fragmented = TRUE; -- -- fragment_head *fd_head = fragment_add_seq_check(&dl_p7_reassemble_table, tvb, offset, pinfo, seq, NULL, seg, msg_len - offset, (m == 1)); -- -- guint8 reassembled = 0; -- if (fd_head) -- { -- tvbuff_t * new_tvb = process_reassembled_data(tvb, offset, pinfo, "Reassembled DL P7", fd_head, &msg_frag_items, NULL, tree); -- -- if (new_tvb) -- { -- // set the tvb to the new reassembled buffer. -- tvb = new_tvb; -- reassembled = 1; -- col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Reassembled %d]", seg); -- -- // reset the offset for the new tvb -- offset = 0; -- } -- else -- { -- // Is this a failure to reassemble the data -- return 0; -- } -- } -- else -- { -- // this is a segement skip the body -- col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Segment %d]", seg); -- return 0; -- } -- } -- -- pinfo->fragmented = save_fragmented; -- -- { -- switch (msg_id) -- { -- // DL_CONFIG.request -- case 0x80: -- { -- //dissect_p7_header(tvb, pinfo, tree, data, &offset); -- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); -- dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb)); -- break; -- } -- -- }; -- } -- -- return 0; --} -- -- --static int dissect_nfapi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) --{ -- col_set_str(pinfo->cinfo, COL_PROTOCOL, "NFAPI"); -- -- guint16 msg_id = tvb_get_guint16(tvb, 2, ENC_NA); -- guint16 msg_len = tvb_get_guint16(tvb, 4, ENC_NA); -- -- const gchar* message_str = val_to_str_const(msg_id, message_id_vals, "Unknown"); -- -- col_clear(pinfo->cinfo,COL_INFO); -- col_append_fstr(pinfo->cinfo, COL_INFO, " %s ", message_str); -- -- proto_item *msg_tree_ti = proto_tree_add_string_format(tree, hf_nfapi_message_tree, -- tvb, 0, msg_len, -- "", message_str); -- -- proto_tree *msg_tree = proto_item_add_subtree(msg_tree_ti, ett_nfapi_message_tree); -- -- guint offset = 0; -- -- -- switch (msg_id) -- { -- // HARQ.indication -- case 0x85: -- // CRC.indication -- case 0x86: -- // RX_ULSCH.indicatoin -- case 0x87: -- // RACH.indication -- case 0x88: -- // SRS.indication -- case 0x89: -- // RX_SR.indication -- case 0x8A: -- // RX_CQI.indication -- case 0x8B: -- { -- dissect_nfapi_ul_p7(tvb, pinfo, msg_tree, data); -- } -- break; -- -- // DL_CONFIG.request -- case 0x80: -- { -- dissect_nfapi_dl_p7(tvb, pinfo, msg_tree, data); -- //dissect_p7_header(tvb, pinfo, msg_tree, data, &offset); -- //proto_tree_add_uint16_with_conversion(msg_tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); -- //dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); -- break; -- } -- -- // UL_CONFIG.request -- case 0x81: -- { -- dissect_p7_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint16_with_conversion(msg_tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); -- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); -- } -- break; -- // HI_DCI0.request -- case 0x83: -- { -- dissect_p7_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint16_with_conversion(msg_tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); -- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); -- } -- break; -- // TX.request -- case 0x84: -- { -- dissect_p7_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint16_with_conversion(msg_tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); -- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); -- } -- break; -- -- // LBT_DL_CONFIG.request -- case 0x8C: -- { -- dissect_p7_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint16_with_conversion(msg_tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); -- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); -- } -+#define NFAPI_P7_HEADER_LENGTH 16 -+ -+static const unit_name_string khz_100_units_db = { " (100)khz", NULL }; -+ -+typedef enum{ -+ NFAPI_DL_CONFIG_REQUEST_MSG_ID = 0x0080, -+ NFAPI_UL_CONFIG_REQUEST_MSG_ID, -+ NFAPI_SUBFRAME_INDICATION_MSG_ID, -+ NFAPI_HI_DCI0_REQUEST_MSG_ID, -+ NFAPI_TX_REQUEST_MSG_ID, -+ NFAPI_HARQ_INDICATION_MSG_ID, -+ NFAPI_CRC_INDICATION_MSG_ID, -+ NFAPI_RX_ULSCH_INDICATION_MSG_ID, -+ NFAPI_RACH_INDICATION_MSG_ID, -+ NFAPI_SRS_INDICATION_MSG_ID, -+ NFAPI_RX_SR_INDICATION_MSG_ID, -+ NFAPI_RX_CQI_INDICATION_MSG_ID, -+ NFAPI_LBT_DL_CONFIG_REQUEST_MSG_ID, -+ NFAPI_LBT_DL_INDICATION_MSG_ID, -+ -+ NFAPI_PNF_PARAM_REQUEST_MSG_ID = 0x0100, -+ NFAPI_PNF_PARAM_RESPONSE_MSG_ID, -+ NFAPI_PNF_CONFIG_REQUEST_MSG_ID, -+ NFAPI_PNF_CONFIG_RESPONSE_MSG_ID, -+ NFAPI_PNF_START_REQUEST_MSG_ID, -+ NFAPI_PNF_START_RESPONSE_MSG_ID, -+ NFAPI_PNF_STOP_REQUEST_MSG_ID, -+ NFAPI_PNF_STOP_RESPONSE_MSG_ID, -+ NFAPI_PARAM_REQUEST_MSG_ID, -+ NFAPI_PARAM_RESPONSE_MSG_ID, -+ NFAPI_CONFIG_REQUEST_MSG_ID, -+ NFAPI_CONFIG_RESPONSE_MSG_ID, -+ NFAPI_START_REQUEST_MSG_ID, -+ NFAPI_START_RESPONSE_MSG_ID, -+ NFAPI_STOP_REQUEST_MSG_ID, -+ NFAPI_STOP_RESPONSE_MSG_ID, -+ NFAPI_MEASUREMENT_REQUEST_MSG_ID, -+ NFAPI_MEASUREMENT_RESPONSE_MSG_ID, -+ -+ NFAPI_DL_NODE_SYNC_MSG_ID = 0x0180, -+ NFAPI_UL_NODE_SYNC_MSG_ID, -+ NFAPI_TIMING_INFO_MSG_ID, -+ -+ NFAPI_RSSI_REQUEST_MSG_ID = 0x0200, -+ NFAPI_RSSI_RESPONSE_MSG_ID, -+ NFAPI_RSSI_INDICATION_MSG_ID, -+ NFAPI_CELL_SEARCH_REQUEST_MSG_ID, -+ NFAPI_CELL_SEARCH_RESPONSE_MSG_ID, -+ NFAPI_CELL_SEARCH_INDICATION_MSG_ID, -+ NFAPI_BROADCAST_DETECT_REQUEST_MSG_ID, -+ NFAPI_BROADCAST_DETECT_RESPONSE_MSG_ID, -+ NFAPI_BROADCAST_DETECT_INDICATION_MSG_ID, -+ NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST_MSG_ID, -+ NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE_MSG_ID, -+ NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION_MSG_ID, -+ NFAPI_SYSTEM_INFORMATION_REQUEST_MSG_ID, -+ NFAPI_SYSTEM_INFORMATION_RESPONSE_MSG_ID, -+ NFAPI_SYSTEM_INFORMATION_INDICATION_MSG_ID, -+ NFAPI_NMM_STOP_REQUEST_MSG_ID, -+ NFAPI_NMM_STOP_RESPONSE_MSG_ID, -+} nfapi_message_id_e; -+ -+static const value_string nfapi_error_vals[] = { -+ { 0x0, "MSG_OK" }, -+ { 0x1, "MSG_INVALID_STATE" }, -+ { 0x2, "MSG_INVALID_CONFIG" }, -+ { 0x3, "SFN_OUT_OF_SYNC" }, -+ { 0x4, "MSG_SUBFRAME_ERR" }, -+ { 0x5, "MSG_BCH_MISSING" }, -+ { 0x6, "MSG_BCH_MISSING" }, -+ { 0x7, "MSG_HI_ERR" }, -+ { 0x8, "MSG_TX_ERR" }, -+ { 0, NULL }, -+}; -+ -+static const value_string nfapi_p4_error_vals[] = { -+ { 100, "MSG_OK" }, -+ { 101, "MSG_INVALID_STATE" }, -+ { 102, "MSG_INVALID_CONFIG" }, -+ { 103, "MSG_RAT_NOT_SUPPORTED" }, -+ { 200, "MSG_NMM_STOP_OK" }, -+ { 201, "MSG_NMM_STOP_IGNORED" }, -+ { 202, "MSG_NMM_STOP_INVALID_STATE" }, -+ { 300, "MSG_PROCEDURE_COMPLETE" }, -+ { 301, "MSG_PROCEDURE_STOPPED" }, -+ { 302, "MSG_PARTIAL_RESULTS" }, -+ { 303, "MSG_TIMEOUT" }, -+ { 0, NULL }, -+}; -+ -+static const value_string nfapi_rat_type_vals[] = { -+ { 0, "LTE" }, -+ { 1, "UTRAN" }, -+ { 2, "GERAN" }, -+ { 0, NULL }, -+}; -+ -+typedef enum{ -+ UN_ALIGNED_SYNCHRONIZATION = 0, -+ INTERNAL_PNF_FRAME_ALIGNMENT, -+ ABSOLUTE_TIME_ALIGNED_SYNCHRONIZATION -+} nfapi_sync_mode_e; -+ -+static const value_string nfapi_sync_mode_vals[] = { -+ { UN_ALIGNED_SYNCHRONIZATION, "UN-ALIGNED SYNCHRONIZATION" }, -+ { INTERNAL_PNF_FRAME_ALIGNMENT, "INTERNAL PNF FRAME ALIGNMENT" }, -+ { ABSOLUTE_TIME_ALIGNED_SYNCHRONIZATION, "ABSOLUTE TIME ALIGNED SYNCHRONIZATION" }, -+ { 0, NULL }, -+}; -+ -+typedef enum { -+ NONE = 0, -+ GPS, -+ GLONASS, -+ BEIDOU -+} location_mode_e; -+ -+static const value_string location_mode_vals[] = { -+ { NONE, "NONE" }, -+ { GPS, "GPS" }, -+ { GLONASS, "GLONASS" }, -+ { BEIDOU, "BeiDou" }, -+ { 0, NULL } -+}; -+ -+static const value_string nfapi_uplink_rs_hopping_vals[] = { -+ { 0, "RS_NO_HOPPING" }, -+ { 1, "RS_GROUP_HOPPING" }, -+ { 2, "RS_SEQUENCE_HOPPING" }, -+ { 0, NULL } -+}; -+ -+static const value_string nfapi_laa_carrier_type_vals[] = { -+ { 0, "No multi carrier support" }, -+ { 1, "Mode A1" }, -+ { 2, "Mode A12" }, -+ { 3, "Mode B1" }, -+ { 4, "Mode B2" }, -+ { 0, NULL } -+}; -+ -+static const value_string nfapi_mutli_carrier_lbt_support_vals[] = { -+ { 0, "Multi carrier Mode A1" }, -+ { 1, "Multi carrier Mode A2" }, -+ { 2, "Multi carrier Mode B1" }, -+ { 3, "Multi carrier Mode B2" }, -+ { 0, NULL } -+}; -+ -+static const value_string nfapi_lbt_dl_req_pdu_type[] = { -+ { 0, "LBT_PDSCH_REQ PDU" }, -+ { 1, "LBT_DRS_REQ PDU" }, -+ { 0, NULL } -+}; -+ -+ -+static const value_string nfapi_lbt_dl_ind_pdu_type[] = { -+ { 0, "LBT_PDSCH_RSP PDU" }, -+ { 1, "LBT_DRS_RSP PDU" }, -+ { 0, NULL } -+}; -+ -+static const value_string nfapi_phy_state_vals[] = { -+ { 0, "IDLE" }, -+ { 1, "CONFIGURED" }, -+ { 2, "RUNNING" }, -+ { 0, NULL }, -+}; -+ -+ -+/* These are definitions where data 0 & 1 represent/provide a string name*/ -+static const true_false_string nfapi_csi_report_type_strname = { -+ "Periodic", -+ "Aperiodic", -+}; -+ -+static const true_false_string nfapi_control_type_string_name = { -+ "CQI/PMI", -+ "RI", -+}; -+ -+static const true_false_string cyclic_prefix_type_strname = { -+ "CP_NORMAL", -+ "CP_EXTENDED" -+}; -+ -+static const true_false_string support_strname = { -+ "No Support", -+ "Support" -+}; -+ -+static const true_false_string partial_sf_support_strname = -+{ -+ "Start partial SF support", -+ "End partial SF support" -+}; -+ -+static const true_false_string phich_duration_strname = { -+ "PHICH_D_NORMAL", -+ "PHICH_D_EXTENDED" -+}; -+ -+static const true_false_string high_speed_flag_strname = { -+ "HS_UNRESTRICTED_SET", -+ "HS_RESTRICTED_SET" -+}; -+ -+static const true_false_string hopping_mode_strname = { -+ "HM_INTER_SF", -+ "HM_INTRA_INTER_SF" -+}; -+ -+static const true_false_string srs_simult_tx_strname = { -+ "No Simultaneous Transmission", -+ "Simultaneous Transmission" -+}; -+ -+static const true_false_string crc_flag_strname = { -+ "CRC_ERROR", -+ "CRC_CORRECT" -+}; -+ -+static const true_false_string hi_value_strname = { -+ "HI_ACK", -+ "HI_NACK" -+}; -+ -+static const true_false_string flag_tb2_strname = { -+ "HI_NOT_PRESENT", -+ "HI_PRESENT" -+}; -+ -+static const true_false_string nfapi_multi_carrier_tx_strname = { -+ "Mutual transmission (self-deferral support for current carrier)", -+ "Transmit on channel access win (no self-deferral)" -+}; -+ -+static const true_false_string nfapi_multi_carrier_freeze_strname = { -+ "Absence of other technology is not guaranteed", -+ "Absence of other technology is guaranteed" -+}; -+ -+static const true_false_string initial_partial_sf_strname = { -+ "Full SF", -+ "Partial SF" -+}; -+ -+static const true_false_string lbt_mode_strname = { -+ "Full LBT", -+ "Partial LBT" -+}; -+ -+static const true_false_string data_report_mode_vals = { -+ "Crc reported in CRC.indication", -+ "Crc reported in RX.indication" -+}; -+ -+static const true_false_string mcch_flag_string_name = { -+ "MCCH or SC-MCCH change notification field is not valid", -+ "MCCH or SC-MCCH change notification field is valid" -+}; -+ -+static const true_false_string cross_carrier_scheduling_flag_strname = { -+ "Carrier indicator field is not valid", -+ "Carrier indicator field is valid" -+}; -+ -+static const true_false_string srs_flag_strname = { -+ "SRS request field is not valid", -+ "SRS request field is valid" -+}; -+static const true_false_string srs_request_strname = { -+ "SRS not requested", -+ "SRS requested" -+}; -+ -+static const true_false_string ul_dl_configuration_flag_strname = { -+ "UL/DL configuration field is not valid", -+ "UL/DL configuration field is valid" -+}; -+ -+static const true_false_string prs_cyclic_prefix_type_strname = { -+ "normal cyclic prefix", -+ "extended cyclic prefix" -+}; -+ -+static const true_false_string prs_muting_strname = { -+ "no muting", -+ "muting" -+}; -+ -+ -+static const value_string nfapi_dl_config_pdu_type_vals[] = { -+ { 0, "DL_CONFIG_DCI_DL_PDU" }, -+ { 1, "DL_CONFIG_BCH_PDU" }, -+ { 2, "DL_CONFIG_MCH_PDU" }, -+ { 3, "DL_CONFIG_DLSCH_PDU" }, -+ { 4, "DL_CONFIG_PCH_PDU" }, -+ { 5, "DL_CONFIG_PRS_PDU" }, -+ { 6, "DL_CONFIG_CSI_RS_PDU" }, -+ { 7, "DL_CONFIG_EPDCCH_DL_PDU" }, -+ { 8, "DL_CONFIG_EPDCCH_DL_PDU" }, -+ { 0, NULL } -+}; -+ -+static const value_string nfapi_duplex_mode_vals[] = { -+ { 0, "TDD" }, -+ { 1, "FDD" }, -+ { 2, "HD-FDD" }, -+ { 0, NULL } -+}; -+ -+static const value_string modulation_vals[] = { -+ { 2, "QPSK" }, -+ { 4, "16QAM" }, -+ { 6, "64QAM" }, -+ { 8, "256QAM" }, -+ { 0, NULL } -+}; -+ -+static const value_string pch_modulation_vals[] = { -+ { 0, "QPSK" }, -+ { 0, NULL } -+}; -+ -+static const value_string ue_mode_vals[] = { -+ { 0, "non LC/CE UE" }, -+ { 1, "LC/CE UE" }, -+ { 0, NULL } -+}; -+ -+static const value_string csi_rs_class_vals[] = { -+ { 0, "not used" }, -+ { 1, "Class A" }, -+ { 1, "Class B" }, -+ { 0, NULL } -+}; -+ -+static const value_string csi_rs_cdm_type_vals[] = { -+ { 0, "cdm 2" }, -+ { 1, "cdm 4" }, -+ { 0, NULL } -+}; -+ -+static const value_string antenna_ports_vals[] = { -+ { 0, "1 antenna ports" }, -+ { 1, "2 antenna ports" }, -+ { 2, "4 antenna ports" }, -+ { 0, NULL } -+}; -+ -+static const value_string combs_vals[] = { -+ { 0, "2 TC" }, -+ { 1, "4 TC" }, -+ { 0, NULL } -+}; -+ -+static const value_string resource_allocation_type_vals[] = { -+ { 0, "type 0" }, -+ { 1, "type 1" }, -+ { 2, "type 2 1A/1B/1D" }, -+ { 3, "type 2 1C" }, -+ { 4, "type 2 6-1A" }, -+ { 5, "type UEModeB" }, -+ { 6, "NB index" }, -+ { 0, NULL } -+}; -+ -+static const value_string transmission_scheme_vals[] = { -+ { 0, "SINGLE_ANTENNA_PORT_0" }, -+ { 1, "TX_DIVERSITY" }, -+ { 2, "LARGE_DELAY_CDD" }, -+ { 3, "CLOSED_LOOP_SPATIAL_MULTIPLEXING" }, -+ { 4, "MULTI_USER_MIMO" }, -+ { 5, "CLOSED_LOOP_RANK_1_PRECODING" }, -+ { 6, "SINGLE_ANTENNA_PORT_5" }, -+ { 7, "SINGLE_ANTENNA_PORT_7" }, -+ { 8, "SINGLE_ANTENNA_PORT_8" }, -+ { 9, "DUAL_LAYER_TX_PORT_7_AND_8" }, -+ { 10, "UP_TO_8_LAYER_TX" }, -+ { 11, "SINGLE_ANTENNA_PORT_11" }, -+ { 12, "SINGLE_ANTENNA_PORT_13" }, -+ { 13, "DUAL_LAYER_TX_PORT_11_13" }, -+ { 0, NULL } -+}; -+ -+static const value_string ul_transmission_scheme_vals[] = { -+ { 0, "SINGLE_ANTENNA_PORT_10" }, -+ { 1, "CLOSED_LOOP_SPATIAL_MULTIPLEXING" }, -+ { 0, NULL }, -+}; -+ -+static const value_string dl_dci_format_vals[] = { -+ { 0, "1" }, -+ { 1, "1A" }, -+ { 2, "1B" }, -+ { 3, "1C" }, -+ { 4, "1D" }, -+ { 5, "2" }, -+ { 6, "2A" }, -+ { 7, "2B" }, -+ { 8, "2C" }, -+ { 9, "2D" }, -+ { 10, "6-1A" }, -+ { 11, "6-1B" }, -+ { 12, "6-2" }, -+ { 0, NULL } -+}; -+ -+static const value_string ul_dci_format_vals[] = { -+ { 0, "0" }, -+ { 1, "3" }, -+ { 2, "3A" }, -+ { 3, "4" }, -+ { 4, "5" }, -+ { 0, NULL } -+}; -+ -+static const value_string mpdcch_ul_dci_format_vals[] = { -+ { 1, "3" }, -+ { 2, "3A" }, -+ { 4, "6-0A" }, -+ { 5, "6-0B" }, -+ { 0, NULL } -+}; -+ -+ -+static const value_string pa_vals[] = { -+ { 0, "-6dB" }, -+ { 1, "-4.77dB" }, -+ { 2, "-3dB" }, -+ { 3, "-1.77dB" }, -+ { 4, "0dB" }, -+ { 5, "1dB" }, -+ { 6, "2dB" }, -+ { 7, "3dB" }, -+ { 0, NULL } -+}; -+ -+static const value_string transmission_mode_vals[] = { -+ { 1, "Mode 1" }, -+ { 2, "Mode 2" }, -+ { 3, "Mode 3" }, -+ { 4, "Mode 4" }, -+ { 5, "Mode 5" }, -+ { 6, "Mode 6" }, -+ { 7, "Mode 7" }, -+ { 8, "Mode 8" }, -+ { 9, "Mode 9" }, -+ { 10, "Mode 10" }, -+ { 0, NULL } -+}; -+ -+static const value_string nfapi_ul_config_pdu_type_vals[] = { -+ { 0, "ULSCH" }, -+ { 1, "ULSCH_CQI_RI" }, -+ { 2, "ULSCH_HARQ" }, -+ { 3, "ULSCH_CQI_HARQ_RI" }, -+ { 4, "UCI_CQI" }, -+ { 5, "UCI_SR" }, -+ { 6, "UCI_HARQ" }, -+ { 7, "UCI_SR_HARQ" }, -+ { 8, "UCI_CQI_HARQ" }, -+ { 9, "UCI_CQI_SR" }, -+ { 10, "UCI_CQI_SR_HARQ" }, -+ { 11, "SRS" }, -+ { 12, "HARQ_BUFFER" }, -+ { 13, "ULSCH_UCI_CSI" }, -+ { 14, "ULSCH_UCI_HARQ" }, -+ { 15, "ULSCH_CSI_UCI_HARQ" }, -+ { 0, NULL } -+}; -+ -+static const value_string nfapi_tdd_ack_nack_mode_vals[] = { -+ { 0, "Bundling" }, -+ { 1, "Multiplexing" }, -+ { 2, "Format 1b with channel selection" }, -+ { 3, "Format 3" }, -+ { 4, "Format 4" }, -+ { 5, "Format 5" }, -+ { 0, NULL } -+}; -+static const value_string nfapi_fdd_ack_nack_mode_vals[] = { -+ { 0, "Format 1a/1b" }, -+ { 1, "Channel selection" }, -+ { 2, "Format 3" }, -+ { 3, "Format 4" }, -+ { 4, "Format 5" }, -+ { 0, NULL } -+}; -+ -+static const value_string nfapi_phich_resource_vals[] = { -+ { 0, "PHICH_R_ONE_SIXTH " }, -+ { 1, "PHICH_R_HALF" }, -+ { 2, "PHICH_R_ONE" }, -+ { 3, "PHICH_R_TWO" }, -+ { 0, NULL } -+}; -+ -+static const value_string local_distributed_vals[] = { -+ { 0, "localized" }, -+ { 1, "distributed" }, -+ { 0, NULL } -+}; -+ -+static const value_string transport_block_to_codeword_swap_flag_vals[] = { -+ { 0, "no swapping" }, -+ { 1, "swapped" }, -+ { 0, NULL } -+}; -+ -+static const value_string ngap_vals[] = { -+ { 0, "Ngap1" }, -+ { 1, "Ngap2" }, -+ { 0, NULL } -+}; -+ -+static const value_string pmi_vals[] = { -+ { 0, "Use precoding indicated in TPMI field" }, -+ { 1, "Use precoding indicated in last PMI report on PUSCH" }, -+ { 2, "use precoding indicated in TPM field" }, -+ { 0, NULL } -+}; -+ -+static const value_string true_false_vals[] = { -+ { 0, "false" }, -+ { 1, "true" }, -+ { 0, NULL } -+}; -+ -+static const value_string exhustive_search_vals[] = { -+ { 0, "non-exhaustive search" }, -+ { 1, "exhaustive search" }, -+ { 0, NULL } -+}; -+ -+static const value_string not_used_enabled_vals[] = { -+ { 0, "not used" }, -+ { 1, "enabled" }, -+ { 0, NULL } -+}; -+ -+static const value_string hopping_vals[] = { -+ { 0, "no hopping" }, -+ { 1, "hopping enabled" }, -+ { 0, NULL } -+}; -+ -+ -+static const value_string mpdcch_rnti_type_vals[] = { -+ { 1, "Temporary C-RNTI" }, -+ { 2, "RA-RNTI" }, -+ { 3, "P-RNTI" }, -+ { 4, "other" }, -+ { 0, NULL } -+}; -+ -+static const value_string rnti_type_vals[] = { -+ { 1, "C-RNTI" }, -+ { 2, "RA-RNTI, P-RNTI, SI-RNTI, SC-RNTI, G-RNTI" }, -+ { 3, "SPS-CRNTI" }, -+ { 0, NULL } -+}; -+ -+static const value_string primary_cells_type_vals[] = { -+ { 1, "TDD" }, -+ { 2, "FDD" }, -+ { 3, "HD_FDD" }, -+ { 0, NULL } -+}; -+ -+static const value_string ul_rssi_supported_vals[] = { -+ { 0, "Uplink RSSI not supported" }, -+ { 1, "Uplink RSSI supported" }, -+ { 0, NULL } -+}; -+ -+static const value_string nprb_vals[] = { -+ { 0, "2" }, -+ { 1, "3" }, -+ { 0, NULL } -+}; -+ -+static const value_string nmm_modes_supported_vals[] = -+{ -+ { 0, "NONE" }, -+ { 1, "NMM_ONLY" }, -+ { 2, "NMM_IN_CONFIGURED_STATE" }, -+ { 3, "NMM_IN_RUNNING_STATE" }, -+ { 4, "NMM_IN_CONFIGURED_AND_RUNNING_STATE" }, -+ { 0, NULL } -+}; -+ -+static const value_string dlsch_re13_ue_type_vals[] = { -+ { 0, "non LC/CE UE" }, -+ { 1, "LC/CE CEModeA UE" }, -+ { 2, "LC/CE CEModeB UE" }, -+ { 0, NULL } -+}; -+ -+static const value_string dlsch_re13_pdsch_payload_type_vals[] = { -+ { 0, "PDSCH carrying SIB1-BR " }, -+ { 1, "PDSCH carrying SI message (except for SIB1-BR or PCH)" }, -+ { 2, "PDSCH carrying other" }, -+ { 0, NULL } -+}; -+ -+static const value_string csi_rs_flags_strname[] = { -+ { 0, "CSI - RS parameters are not valid" }, -+ { 1, "CSI - RS parameters are valid" }, -+ { 0, NULL} -+}; -+ -+ -+static const value_string paging_direct_indication_differtiation_flag_vals[] = { -+ { 0, "Direct Information" }, -+ { 1, "Paging" }, -+ { 0, NULL } -+}; -+ -+static const value_string ul_tx_mode_vals[] = { -+ { 0, "SISO/MIMO" }, -+ { 1, "MIMO" }, -+ { 0, NULL } -+}; -+ -+static const value_string n_srs_vals[] = { -+ { 0, "No overlap" }, -+ { 1, "Overlap" }, -+ { 0, NULL } -+}; -+ -+static const value_string n_srs_initial_vals[] = { -+ { 0, "Last OFDM symbol is not punctured" }, -+ { 1, "Last OFDM symbol is punctured." }, -+ { 0, NULL } -+}; -+ -+ -+static const value_string csi_mode_vals[] = { -+ { 0, "PUCCH format 2/2a/2b/3" }, -+ { 1, "PUCCH format 4" }, -+ { 2, "PUCCH format 5" }, -+ { 0, NULL } -+}; -+ -+static const value_string hi_dci0_pdu_type_vals[] = { -+ { 0, "HI" }, -+ { 1, "DCI UL" }, -+ { 2, "EDPCCH DCI UL" }, -+ { 3, "MDPCCH DCI UL" }, -+ { 0, NULL } -+}; -+ -+static const value_string ue_tx_antenna_selection_vals[] = { -+ { 0, "Not Configured" }, -+ { 1, "Configured and using UE port 0" }, -+ { 2, "Configured and using UE port 1" }, -+ { 0, NULL } -+}; -+ -+static const value_string size_of_cqi_csi_feild_vals[] = { -+ { 0, "1 bit" }, -+ { 1, "2 bits" }, -+ { 2, "3 bits" }, -+ { 0, NULL } -+}; -+ -+static const value_string number_of_antenna_port_vals[] = { -+ { 0, "1 antenna port" }, -+ { 1, "2 antenna ports" }, -+ { 2, "4 antenna ports" }, -+ { 0, NULL } -+}; -+ -+static const value_string ce_mode_vals[] = { -+ { 1, "CEModeA" }, -+ { 2, "CEModeB" }, -+ { 0, NULL } -+}; -+ -+ -+static const value_string csi_request_vals[] = { -+ { 0, "Aperiodic CSI not requested" }, -+ { 1, "Aperiodic CSI requested" }, -+ { 0, NULL } -+}; -+ -+static const value_string tdd_harq_mode_vals[] = { -+ { 0, "Format 1a/1b BUNDLING" }, -+ { 1, "Format 1a/1b MULTIPLEXING" }, -+ { 2, "Format 1a/1b SPECIAL BUNDLING" }, -+ { 3, "Channel Selection" }, -+ { 4, "Format 3" }, -+ { 5, "Format 4" }, -+ { 6, "Format 5" }, -+ { 0, NULL } -+}; -+ -+static const value_string fdd_harq_mode_vals[] = { -+ { 0, "Format 1a/1b" }, -+ { 1, "Channel Selection" }, -+ { 2, "Format 3" }, -+ { 3, "Format 4" }, -+ { 4, "Format 5" }, -+ { 0, NULL } -+}; -+ -+static const value_string harq_value_vals[] = { -+ { 1, "ACK" }, -+ { 2, "NACK" }, -+ { 3, "ACK or NACK" }, -+ { 4, "DTX" }, -+ { 5, "ACK or DTX" }, -+ { 6, "NACK or DTX" }, -+ { 7, "ACK or NACK or DTX" }, -+ { 0, NULL } -+}; -+ -+ -+static const value_string harq_special_value_vals[] = { -+ { 0, "0 or None" }, -+ { 1, "1 or 4 or 7 ACKs reported" }, -+ { 2, "2 or 5 or 8 ACKs reported" }, -+ { 3, "3 or 6 or 9 ACKs reported" }, -+ { 4, "DTX (UE did not transmit anything)" }, -+ { 0, NULL } -+}; -+ -+static const value_string channel_vals[] = { -+ { 0, "PUCCH" }, -+ { 1, "PUSCH" }, -+ { 0, NULL } -+}; -+ -+static const value_string rach_resource_type_vals[] = { -+ { 0, "Non LC / CE RACH" }, -+ { 1, "LC / CE RACH CE level 0" }, -+ { 2, "LC / CE RACH CE level 1" }, -+ { 3, "LC / CE RACH CE level 2" }, -+ { 4, "LC / CE RACH CE level 3" }, -+ { 0, NULL } -+}; -+ -+static const value_string up_pts_symbol_vals[] = { -+ { 0, "Symbol 0" }, -+ { 1, "Symbol 1" }, -+ { 0, NULL } -+}; -+ -+static const value_string arfcn_direction_vals[] = { -+ { 0, "DL" }, -+ { 1, "UL" }, -+ { 0, NULL } -+}; -+ -+static int proto_nfapi = -1; -+ -+/* These are for the subtrees */ -+static gint ett_nfapi_message_tree = -1; -+static gint ett_nfapi_p4_p5_message_header = -1; -+static gint ett_nfapi_p7_message_header = -1; -+static gint ett_nfapi_tlv_tree = -1; -+static gint ett_nfapi_tl = -1; -+static gint ett_nfapi_pnf_phy = -1; -+static gint ett_nfapi_pnf_phy_rel10 = -1; -+static gint ett_nfapi_pnf_phy_rel11 = -1; -+static gint ett_nfapi_pnf_phy_rel12 = -1; -+static gint ett_nfapi_pnf_phy_rel13 = -1; -+static gint ett_nfapi_pnf_phy_rf_config = -1; -+static gint ett_nfapi_rf_bands = -1; -+static gint ett_nfapi_tx_antenna_ports = -1; -+static gint ett_nfapi_harq_ack_nack_data = -1; -+static gint ett_nfapi_harq_data = -1; -+static gint ett_nfapi_cqi_pmi_size = -1; -+static gint ett_nfapi_cc = -1; -+static gint ett_nfapi_rbs = -1; -+static gint ett_nfapi_antennas = -1; -+static gint ett_nfapi_dl_config_request_pdu_list = -1; -+static gint ett_nfapi_ul_config_request_pdu_list = -1; -+static gint ett_nfapi_hi_dci0_request_pdu_list = -1; -+static gint ett_nfapi_tx_request_pdu_list = -1; -+static gint ett_nfapi_rx_indication_pdu_list = -1; -+static gint ett_nfapi_harq_indication_pdu_list = -1; -+static gint ett_nfapi_crc_indication_pdu_list = -1; -+static gint ett_nfapi_sr_indication_pdu_list = -1; -+static gint ett_nfapi_cqi_indication_pdu_list = -1; -+static gint ett_nfapi_preamble_indication_pdu_list = -1; -+static gint ett_nfapi_srs_indication_pdu_list = -1; -+static gint ett_nfapi_lbt_dl_config_pdu_list = -1; -+static gint ett_nfapi_lbt_dl_indication_pdu_list = -1; -+static gint ett_nfapi_subbands = -1; -+static gint ett_nfapi_bf_vector_antennas = -1; -+static gint ett_nfapi_bf_vectors = -1; -+static gint ett_nfapi_csi_rs_resource_configs = -1; -+static gint ett_nfapi_csi_rs_bf_vector = -1; -+static gint ett_nfapi_epdcch_prbs = -1; -+static gint ett_nfapi_precoding = -1; -+static gint ett_nfapi_earfcn_list = -1; -+static gint ett_nfapi_uarfcn_list = -1; -+static gint ett_nfapi_arfcn_list = -1; -+static gint ett_nfapi_rssi_list = -1; -+static gint ett_nfapi_pci_list = -1; -+static gint ett_nfapi_psc_list = -1; -+static gint ett_nfapi_lte_cells_found_list = -1; -+static gint ett_nfapi_utran_cells_found_list = -1; -+static gint ett_nfapi_geran_cells_found_list = -1; -+static gint ett_nfapi_si_periodicity_list = -1; -+static gint ett_nfapi_downlink_bandwidth_support = -1; -+static gint ett_nfapi_uplink_bandwidth_support = -1; -+static gint ett_nfapi_downlink_modulation_support = -1; -+static gint ett_nfapi_uplink_modulation_support = -1; -+static gint ett_nfapi_received_interference_power_mesurement_results = -1; -+static gint ett_nfapi_release_support = -1; -+static expert_field ei_invalid_range = EI_INIT; -+static expert_field ei_invalid_tlv_length = EI_INIT; -+ -+static int hf_nfapi_p4_p5_message_header_phy_id = -1; -+static int hf_nfapi_p4_p5_message_header_message_id = -1; -+static int hf_nfapi_p4_p5_message_header_message_length = -1; -+static int hf_nfapi_p4_p5_message_header_spare = -1; -+static int hf_nfapi_p7_message_header_phy_id = -1; -+static int hf_nfapi_p7_message_header_message_id = -1; -+static int hf_nfapi_p7_message_header_message_length = -1; -+static int hf_nfapi_p7_message_header_m = -1; -+static int hf_nfapi_p7_message_header_segment = -1; -+static int hf_nfapi_p7_message_header_sequence_number = -1; -+static int hf_nfapi_p7_message_header_checksum = -1; -+static int hf_nfapi_p7_message_header_transmit_timestamp = -1; -+static int hf_nfapi_tl_tag = -1; -+static int hf_nfapi_tl_length = -1; -+static int hf_nfapi_sync_mode = -1; -+static int hf_nfapi_location_mode = -1; -+static int hf_nfapi_location_coordinates = -1; -+static int hf_nfapi_location_coordinates_length = -1; -+static int hf_nfapi_dl_config_timing = -1; -+static int hf_nfapi_tx_timing = -1; -+static int hf_nfapi_ul_config_timing = -1; -+static int hf_nfapi_hi_dci0_timing = -1; -+static int hf_nfapi_maximum_number_phys = -1; -+static int hf_nfapi_maximum_total_bandwidth = -1; -+static int hf_nfapi_maximum_total_number_dl_layers = -1; -+static int hf_nfapi_maximum_total_number_ul_layers = -1; -+static int hf_nfapi_shared_bands = -1; -+static int hf_nfapi_shared_pa = -1; -+static int hf_nfapi_maximum_total_power = -1; -+static int hf_nfapi_oui = -1; -+static int hf_nfapi_pdu = -1; -+static int hf_nfapi_pnf_phy_number_phy = -1; -+static int hf_nfapi_pnf_phy_config_index = -1; -+static int hf_nfapi_number_of_rf_exclusions = -1; -+static int hf_nfapi_dl_bandwidth_support = -1; -+static int hf_nfapi_dl_bandwidth_support_6 = -1; -+static int hf_nfapi_dl_bandwidth_support_15 = -1; -+static int hf_nfapi_dl_bandwidth_support_25 = -1; -+static int hf_nfapi_dl_bandwidth_support_50 = -1; -+static int hf_nfapi_dl_bandwidth_support_75 = -1; -+static int hf_nfapi_dl_bandwidth_support_100 = -1; -+static int hf_nfapi_ul_bandwidth_support = -1; -+static int hf_nfapi_ul_bandwidth_support_6 = -1; -+static int hf_nfapi_ul_bandwidth_support_15= -1; -+static int hf_nfapi_ul_bandwidth_support_25 = -1; -+static int hf_nfapi_ul_bandwidth_support_50 = -1; -+static int hf_nfapi_ul_bandwidth_support_75 = -1; -+static int hf_nfapi_ul_bandwidth_support_100 = -1; -+static int hf_nfapi_downlink_channel_bandwidth_supported = -1; -+static int hf_nfapi_uplink_channel_bandwidth_supported = -1; -+static int hf_nfapi_number_of_dl_layers_supported = -1; -+static int hf_nfapi_number_of_ul_layers_supported = -1; -+static int hf_nfapi_maximum_3gpp_release_supported = -1; -+static int hf_nfapi_maximum_3gpp_release_supported_rel8 = -1; -+static int hf_nfapi_maximum_3gpp_release_supported_rel9 = -1; -+static int hf_nfapi_maximum_3gpp_release_supported_rel10 = -1; -+static int hf_nfapi_maximum_3gpp_release_supported_rel11 = -1; -+static int hf_nfapi_maximum_3gpp_release_supported_rel12 = -1; -+static int hf_nfapi_maximum_3gpp_release_supported_rel13 = -1; -+static int hf_nfapi_nmm_modes_supported = -1; -+static int hf_nfapi_number_of_rfs = -1; -+static int hf_nfapi_rf_config_index = -1; -+static int hf_nfapi_band = -1; -+static int hf_nfapi_maximum_transmit_power = -1; -+static int hf_nfapi_maximum_transmit_power_2 = -1; -+static int hf_nfapi_earfcn = -1; -+static int hf_nfapi_minimum_transmit_power = -1; -+static int hf_nfapi_number_of_antennas_suppported = -1; -+static int hf_nfapi_minimum_downlink_frequency = -1; -+static int hf_nfapi_maximum_downlink_frequency = -1; -+static int hf_nfapi_minimum_uplink_frequency = -1; -+static int hf_nfapi_maximum_uplink_frequency = -1; -+static int hf_nfapi_number_of_rf_bands = -1; -+static int hf_nfapi_nmm_uplink_rssi_supported = -1; -+static int hf_nfapi_phy_rf_config_info_phy_id = -1; -+static int hf_nfapi_transmission_mode7_supported = -1; -+static int hi_nfapi_transmission_mode8_supported = -1; -+static int hi_nfapi_two_antennas_ports_for_pucch = -1; -+static int hi_nfapi_transmission_mode_9_supported = -1; -+static int hi_nfapi_simultaneous_pucch_pusch = -1; -+static int hi_nfapi_four_layer_tx_with_tm3_and_tm4 = -1; -+static int hf_nfapi_epdcch_supported = -1; -+static int hi_nfapi_multi_ack_csi_reporting = -1; -+static int hi_nfapi_pucch_tx_diversity_with_channel_selection = -1; -+static int hi_nfapi_ul_comp_supported = -1; -+static int hi_nfapi_transmission_mode_5_supported = -1; -+static int hf_nfapi_csi_subframe_set = -1; -+static int hi_nfapi_enhanced_4tx_codebook = -1; -+static int hi_nfapi_drs_supported = -1; -+static int hi_nfapi_ul_64qam_supported = -1; -+static int hi_nfapi_transmission_mode_10_supported = -1; -+static int hi_nfapi_alternative_tbs_indices = -1; -+static int hf_nfapi_pucch_format_4_supported = -1; -+static int hf_nfapi_pucch_format_5_supported = -1; -+static int hf_nfapi_more_than_5_ca_supported = -1; -+static int hf_nfapi_laa_supported = -1; -+static int hf_nfapi_laa_ending_in_dwpts_supported = -1; -+static int hf_nfapi_laa_starting_in_second_slot_supported = -1; -+static int hf_nfapi_beamforming_supported = -1; -+static int hf_nfapi_csi_rs_enhancements_supported = -1; -+static int hf_nfapi_drms_enhancements_supported = -1; -+static int hf_nfapi_srs_enhancements_supported = -1; -+static int hf_nfapi_dl_rs_tx_power = -1; -+static int hf_nfapi_received_interference_power = -1; -+static int hf_nfapi_thermal_noise_power = -1; -+static int hf_nfapi_dl_rs_tx_power_measurement = -1; -+static int hf_nfapi_received_interference_power_measurement = -1; -+static int hf_nfapi_thermal_noise_power_measurement = -1; -+ -+// P5 Message Structures -+static int hf_nfapi_error_code = -1; -+static int hf_nfapi_p4_error_code = -1; -+static int hf_nfapi_rat_type = -1; -+static int hf_nfapi_num_tlv = -1; -+static int hf_nfapi_phy_state = -1; -+static int hf_nfapi_phy_antenna_capability = -1; -+static int hf_nfapi_release_capability = -1; -+static int hf_nfapi_mbsfn_capability = -1; -+static int hf_nfapi_laa_capability = -1; -+static int hf_nfapi_pd_sensing_lbt_support = -1; -+static int hf_nfapi_multi_carrier_lbt_support = -1; -+static int hf_nfapi_partial_sf_support = -1; -+ -+static int hf_nfapi_pnf_address_ipv4 = -1; -+static int hf_nfapi_pnf_address_ipv6 = -1; -+static int hf_nfapi_vnf_address_ipv4 = -1; -+static int hf_nfapi_vnf_address_ipv6 = -1; -+static int hf_nfapi_pnf_port = -1; -+static int hf_nfapi_vnf_port = -1; -+static int hf_nfapi_dl_ue_per_sf = -1; -+static int hf_nfapi_ul_ue_per_sf = -1; -+static int hf_nfapi_timing_window = -1; -+static int hf_nfapi_timing_info_mode = -1; -+static int hf_nfapi_timing_info_period = -1; -+static int hf_nfapi_duplex_mode = -1; -+static int hf_nfapi_pcfich_power_offset = -1; -+static int hf_nfapi_pb = -1; -+static int hf_nfapi_dl_cyclic_prefix_type = -1; -+static int hf_nfapi_ul_cyclic_prefix_type = -1; -+static int hf_nfapi_tx_antenna_ports = -1; -+static int hf_nfapi_rx_antenna_ports = -1; -+static int hf_nfapi_downlink_channel_bandwidth = -1; -+static int hf_nfapi_uplink_channel_bandwidth = -1; -+static int hf_nfapi_reference_signal_power = -1; -+static int hf_nfapi_phich_resource = -1; -+static int hf_nfapi_phich_duration = -1; -+static int hf_nfapi_phich_power_offset = -1; -+static int hf_nfapi_primary_synchronization_signal_epre_eprers = -1; -+static int hf_nfapi_secondary_synchronization_signal_epre_eprers = -1; -+static int hf_nfapi_physical_cell_id = -1; -+static int hf_nfapi_configuration_index = -1; -+static int hf_nfapi_root_sequence_index = -1; -+static int hf_nfapi_zero_correlation_zone_configuration = -1; -+static int hf_nfapi_high_speed_flag = -1; -+static int hf_nfapi_frequency_offset = -1; -+static int hf_nfapi_hopping_mode = -1; -+static int hf_nfapi_hopping_offset = -1; -+static int hf_nfapi_delta_pucch_shift = -1; -+static int hf_nfapi_n_cqi_rb = -1; -+static int hf_nfapi_n_an_cs = -1; -+static int hf_nfapi_n1_pucch_an = -1; -+static int hf_nfapi_bandwidth_configuration = -1; -+static int hf_nfapi_max_up_pts = -1; -+static int hf_nfapi_srs_subframe_configuration = -1; -+static int hf_nfapi_srs_acknack_srs_simultaneous_transmission = -1; -+static int hf_nfapi_uplink_rs_hopping = -1; -+static int hf_nfapi_group_assignment = -1; -+static int hf_nfapi_cyclic_shift_1_for_drms = -1; -+static int hf_nfapi_subframe_assignment = -1; -+static int hf_nfapi_special_subframe_patterns = -1; -+static int hf_nfapi_ed_threshold_for_lbt_for_pdsch = -1; -+static int hf_nfapi_ed_threshold_for_lbt_for_drs = -1; -+static int hf_nfapi_pd_threshold = -1; -+static int hf_nfapi_multi_carrier_type = -1; -+static int hf_nfapi_multi_carrier_tx = -1; -+static int hf_nfapi_multi_carrier_freeze = -1; -+static int hf_nfapi_tx_antenna_ports_for_drs = -1; -+static int hf_nfapi_transmission_power_for_drs = -1; -+static int hf_nfapi_pbch_repetitions_enabled_r13 = -1; -+static int hf_nfapi_prach_cat_m_root_sequence_index = -1; -+static int hf_nfapi_prach_cat_m_zero_correlation_zone_configuration = -1; -+static int hf_nfapi_prach_cat_m_high_speed_flag = -1; -+static int hf_nfapi_prach_ce_level_0_enable = -1; -+static int hf_nfapi_prach_ce_level_0_configuration_index = -1; -+static int hf_nfapi_prach_ce_level_0_frequency_offset = -1; -+static int hf_nfapi_prach_ce_level_0_number_of_repetitions_per_attempt = -1; -+static int hf_nfapi_prach_ce_level_0_starting_subframe_periodicity = -1; -+static int hf_nfapi_prach_ce_level_0_hopping_enabled = -1; -+static int hf_nfapi_prach_ce_level_0_hopping_offset = -1; -+static int hf_nfapi_prach_ce_level_1_enable = -1; -+static int hf_nfapi_prach_ce_level_1_configuration_index = -1; -+static int hf_nfapi_prach_ce_level_1_frequency_offset = -1; -+static int hf_nfapi_prach_ce_level_1_number_of_repetitions_per_attempt = -1; -+static int hf_nfapi_prach_ce_level_1_starting_subframe_periodicity = -1; -+static int hf_nfapi_prach_ce_level_1_hopping_enabled = -1; -+static int hf_nfapi_prach_ce_level_1_hopping_offset = -1; -+static int hf_nfapi_prach_ce_level_2_enable = -1; -+static int hf_nfapi_prach_ce_level_2_configuration_index = -1; -+static int hf_nfapi_prach_ce_level_2_frequency_offset = -1; -+static int hf_nfapi_prach_ce_level_2_number_of_repetitions_per_attempt = -1; -+static int hf_nfapi_prach_ce_level_2_starting_subframe_periodicity = -1; -+static int hf_nfapi_prach_ce_level_2_hopping_enabled = -1; -+static int hf_nfapi_prach_ce_level_2_hopping_offset = -1; -+static int hf_nfapi_prach_ce_level_3_enable = -1; -+static int hf_nfapi_prach_ce_level_3_configuration_index = -1; -+static int hf_nfapi_prach_ce_level_3_frequency_offset = -1; -+static int hf_nfapi_prach_ce_level_3_number_of_repetitions_per_attempt = -1; -+static int hf_nfapi_prach_ce_level_3_starting_subframe_periodicity = -1; -+static int hf_nfapi_prach_ce_level_3_hopping_enabled = -1; -+static int hf_nfapi_prach_ce_level_3_hopping_offset = -1; -+static int hf_nfapi_pucch_internal_ul_hopping_config_common_mode_b = -1; -+static int hf_nfapi_pucch_internal_ul_hopping_config_common_mode_a = -1; -+static int hf_nfapi_dl_modulation_support = -1; -+static int hf_nfapi_dl_modulation_support_qpsk = -1; -+static int hf_nfapi_dl_modulation_support_16qam = -1; -+static int hf_nfapi_dl_modulation_support_64qam = -1; -+static int hf_nfapi_dl_modulation_support_256qam = -1; -+static int hf_nfapi_ul_modulation_support = -1; -+static int hf_nfapi_ul_modulation_support_qpsk = -1; -+static int hf_nfapi_ul_modulation_support_16qam = -1; -+static int hf_nfapi_ul_modulation_support_64qam = -1; -+static int hf_nfapi_data_report_mode = -1; -+static int hf_nfapi_sfnsf = -1; -+ -+// P7 Sub Structures -+static int hf_nfapi_dl_dci_format = -1; -+static int hf_nfapi_ul_dci_format = -1; -+static int hf_nfapi_mpdcch_ul_dci_format = -1; -+static int hf_nfapi_cce_idx = -1; -+static int hf_nfapi_aggregation_level = -1; -+static int hf_nfapi_mcs_1 = -1; -+static int hf_nfapi_redundancy_version_1 = -1; -+static int hf_nfapi_new_data_indicator_1 = -1; -+static int hf_nfapi_mcs_2 = -1; -+static int hf_nfapi_redundancy_version_2 = -1; -+static int hf_nfapi_new_data_indicator_2 = -1; -+static int hf_nfapi_harq_process = -1; -+static int hf_nfapi_tpmi = -1; -+static int hf_nfapi_pmi = -1; -+static int hf_nfapi_precoding_information = -1; -+static int hf_nfapi_tpc = -1; -+static int hf_nfapi_downlink_assignment_index = -1; -+static int hf_nfapi_transport_block_size_index = -1; -+static int hf_nfapi_downlink_power_offset = -1; -+static int hf_nfapi_allocate_prach_flag = -1; -+static int hf_nfapi_preamble_index = -1; -+static int hf_nfapi_prach_mask_index = -1; -+static int hf_nfapi_rnti_type = -1; -+static int hf_nfapi_mpdcch_rnti_type = -1; -+static int hf_nfapi_mcch_flag = -1; -+static int hf_nfapi_mcch_change_notification = -1; -+static int hf_nfapi_scrambling_identity = -1; -+static int hf_nfapi_cross_carrier_scheduling_flag = -1; -+static int hf_nfapi_carrier_indicator = -1; -+static int hf_nfapi_srs_flag = -1; -+static int hf_nfapi_srs_request = -1; -+static int hf_nfapi_antenna_ports_scrambling_and_layers = -1; -+static int hf_nfapi_total_dci_length_including_padding = -1; -+static int hf_nfapi_harq_ack_resource_offset = -1; -+static int hf_nfapi_pdsch_re_mapping_and_quasi_co_location_indicator = -1; -+static int hf_nfapi_primary_cell_type = -1; -+static int hf_nfapi_ul_dl_configuration_flag = -1; -+static int hf_nfapi_number_of_ul_dl_configurations = -1; -+static int hf_nfapi_ul_dl_configuration_index = -1; -+static int hf_nfapi_laa_end_partial_sf_flag = -1; -+static int hf_nfapi_laa_end_partial_sf_configuration = -1; -+static int hf_nfapi_initial_lbt_sf = -1; -+static int hf_nfapi_codebooksize_determination_r13 = -1; -+static int hf_nfapi_rel13_drms_table_flag = -1; -+static int hf_nfapi_csi_rs_resource_config = -1; -+static int hf_nfapi_csi_rs_number_of_nzp_configurations = -1; -+static int hf_nfapi_pdsch_start = -1; -+static int hf_nfapi_drms_config_flag = -1; -+static int hf_nfapi_drms_scrambling = -1; -+static int hf_nfapi_csi_config_flag = -1; -+static int hf_nfapi_csi_scrambling = -1; -+static int hf_nfapi_pdsch_re_mapping_flag = -1; -+static int hf_nfapi_pdsch_re_mapping_antenna_ports = -1; -+static int hf_nfapi_pdsch_re_mapping_freq_shift = -1; -+static int hf_nfapi_alt_cqi_table_r12 = -1; -+static int hf_nfapi_max_layers = -1; -+static int hf_nfapi_n_dl_harq = -1; -+static int hf_nfapi_dwpts_symbols = -1; -+static int hf_nfapi_ue_type = -1; -+static int hf_nfapi_pdsch_payload_type = -1; -+static int hf_nfapi_initial_transmission_sf = -1; -+static int hf_nfapi_req13_drms_table_flag = -1; -+static int hf_nfapi_prnti = -1; -+static int hf_nfapi_mcs = -1; -+static int hf_nfapi_number_of_transport_blocks = -1; -+static int hf_nfapi_ue_mode = -1; -+static int hf_prs_bandwidth = -1; -+static int hf_prs_cyclic_prefix_type = -1; -+static int hf_prs_muting = -1; -+static int hf_nfapi_csi_rs_resource_index = -1; -+static int hf_nfapi_csi_rs_class = -1; -+static int hf_nfapi_cdm_type = -1; -+static int hf_nfapi_edpcch_prb_index = -1; -+static int hf_nfapi_epdcch_resource_assignment_flag = -1; -+static int hf_nfapi_epdcch_id = -1; -+static int hf_nfapi_epdcch_start_symbol = -1; -+static int hf_nfapi_epdcch_num_prb = -1; -+static int hf_nfapi_precoding_value = -1; -+static int hf_nfapi_mpdcch_narrowband = -1; -+static int hf_nfapi_number_of_prb_pairs = -1; -+static int hf_nfapi_resource_block_assignment = -1; -+static int hf_nfapi_start_symbol = -1; -+static int hf_nfapi_ecce_index = -1; -+static int hf_nfapi_ce_mode = -1; -+static int hf_nfapi_drms_scrabmling_init = -1; -+static int hf_nfapi_pdsch_reception_levels = -1; -+static int hf_nfapi_new_data_indicator = -1; -+static int hf_nfapi_tpmi_length = -1; -+static int hf_nfapi_pmi_flag = -1; -+static int hf_nfapi_harq_resource_offset = -1; -+static int hf_nfapi_dci_subframe_repetition_number = -1; -+static int hf_nfapi_downlink_assignment_index_length = -1; -+static int hf_nfapi_starting_ce_level = -1; -+static int hf_nfapi_antenna_ports_and_scrambling_identity_flag = -1; -+static int hf_nfapi_antenna_ports_and_scrambling_identity = -1; -+static int hf_nfapi_paging_direct_indication_differentiation_flag = -1; -+static int hf_nfapi_direct_indication = -1; -+static int hf_nfapi_number_of_tx_antenna_ports = -1; -+ -+// P7 Message Structures -+static int hf_nfapi_dl_node_sync_t1 = -1; -+static int hf_nfapi_dl_node_sync_delta_sfn_sf = -1; -+static int hf_nfapi_ul_node_sync_t1 = -1; -+static int hf_nfapi_ul_node_sync_t2 = -1; -+static int hf_nfapi_ul_node_sync_t3 = -1; -+static int hf_nfapi_timing_info_last_sfn_sf = -1; -+static int hf_nfapi_timing_info_time_since_last_timing_info = -1; -+static int hf_nfapi_timing_info_dl_config_jitter = -1; -+static int hf_nfapi_timing_info_tx_request_jitter = -1; -+static int hf_nfapi_timing_info_ul_config_jitter = -1; -+static int hf_nfapi_timing_info_hi_dci0_jitter = -1; -+static int hf_nfapi_timing_info_dl_config_latest_delay = -1; -+static int hf_nfapi_timing_info_tx_request_latest_delay = -1; -+static int hf_nfapi_timing_info_ul_config_latest_delay = -1; -+static int hf_nfapi_timing_info_hi_dci0_latest_delay = -1; -+static int hf_nfapi_timing_info_dl_config_earliest_arrival = -1; -+static int hf_nfapi_timing_info_tx_request_earliest_arrival = -1; -+static int hf_nfapi_timing_info_ul_config_earliest_arrival = -1; -+static int hf_nfapi_timing_info_hi_dci0_earliest_arrival = -1; -+static int hf_nfapi_sfn_sf = -1; -+static int hf_nfapi_number_pdcch_ofdm_symbols = -1; -+static int hf_nfapi_number_dci = -1; -+static int hf_nfapi_number_pdus = -1; -+static int hf_nfapi_number_pdsch_rnti = -1; -+static int hf_nfapi_transmission_power_pcfich = -1; -+static int hf_nfapi_number_of_harqs = -1; -+static int hf_nfapi_number_of_crcs = -1; -+static int hf_nfapi_number_of_srs = -1; -+static int hf_nfapi_number_of_cqi = -1; -+static int hf_nfapi_number_of_preambles = -1; -+static int hf_nfapi_number_of_srss = -1; -+static int hf_nfapi_lbt_dl_req_pdu_type = -1; -+static int hf_nfapi_lbt_dl_ind_pdu_type = -1; -+static int hf_nfapi_dl_config_pdu_type = -1; -+static int hf_nfapi_pdu_size = -1; -+static int hf_nfapi_instance_length = -1; -+static int hf_nfapi_length; -+static int hf_nfapi_pdu_index = -1; -+static int hf_nfapi_rnti = -1; -+static int hf_nfapi_resource_allocation_type = -1; -+static int hf_nfapi_virtual_resource_block_assignment_flag = -1; -+static int hf_nfapi_resource_block_coding = -1; -+static int hf_nfapi_modulation = -1; -+static int hf_nfapi_redundancy_version = -1; -+static int hf_nfapi_transport_blocks = -1; -+static int hf_nfapi_transport_block_to_codeword_swap_flag = -1; -+static int hf_nfapi_transmission_scheme = -1; -+static int hf_nfapi_ul_transmission_scheme = -1; -+static int hf_nfapi_number_of_layers = -1; -+static int hf_nfapi_number_of_subbands = -1; -+static int hf_nfapi_codebook_index = -1; -+static int hf_nfapi_ue_category_capacity = -1; -+static int hf_nfapi_pa = -1; -+static int hf_nfapi_delta_power_offset_index = -1; -+static int hf_nfapi_ngap = -1; -+static int hf_nfapi_nprb = -1; -+static int hf_nfapi_transmission_mode = -1; -+static int hf_nfapi_num_bf_prb_per_subband = -1; -+static int hf_nfapi_num_bf_vector = -1; -+static int hf_nfapi_bf_vector_subband_index = -1; -+static int hf_nfapi_bf_vector_num_antennas = -1; -+static int hf_nfapi_bf_vector_bf_value = -1; -+static int hf_nfapi_nscid = -1; -+static int hf_nfapi_csi_rs_flag = -1; -+static int hf_nfapi_csi_rs_resource_config_r10 = -1; -+static int hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10 = -1; -+static int hf_nfapi_transmission_power = -1; -+static int hf_nfapi_mbsfn_area_id = -1; -+static int hf_nfapi_csi_rs_antenna_port_count_r10 = -1; -+static int hf_nfapi_ul_config_pdu_type = -1; -+static int hf_nfapi_rach_prach_frequency_resources = -1; -+static int hf_nfapi_srs_present = -1; -+static int hf_nfapi_handle = -1; -+static int hf_nfapi_pucch_index = -1; -+static int hf_nfapi_size = -1; -+static int hf_nfapi_resource_block_start = -1; -+static int hf_nfapi_number_of_resource_blocks = -1; -+static int hf_nfapi_cyclic_shift_2_for_drms = -1; -+static int hf_nfapi_frequency_hopping_enabled_flag = -1; -+static int hf_nfapi_frequency_hopping_bits = -1; -+static int hf_nfapi_new_data_indication = -1; -+static int hf_nfapi_harq_process_number = -1; -+static int hf_nfapi_ul_tx_mode = -1; -+static int hf_nfapi_current_tx_nb = -1; -+static int hf_nfapi_n_srs = -1; -+static int hf_nfapi_disable_sequence_hopping_flag = -1; -+static int hf_nfapi_dl_cqi_pmi_size_rank_1 = -1; -+static int hf_nfapi_dl_cqi_pmi_size_rank_greater_1 = -1; -+static int hf_nfapi_ri_size = -1; -+static int hf_nfapi_delta_offset_cqi = -1; -+static int hf_nfapi_delta_offset_ri = -1; -+static int hf_nfapi_harq_size = -1; -+static int hf_nfapi_delta_offset_harq = -1; -+static int hf_nfapi_tdd_ack_nack_mode = -1; -+static int hf_nfapi_fdd_ack_nack_mode = -1; -+static int hf_nfapi_n_srs_initial = -1; -+static int hf_nfapi_initial_number_of_resource_blocks = -1; -+static int hf_nfapi_dl_cqi_pmi_size = -1; -+static int hf_nfapi_report_type = -1; -+static int hf_nfapi_dl_cqi_ri_pmi_size = -1; -+static int hf_nfapi_control_type = -1; -+static int hf_nfapi_number_of_cc = -1; -+static int hf_nfapi_virtual_cell_id_enabled_flag = -1; -+static int hf_nfapi_npusch_identity = -1; -+static int hf_nfapi_ndrms_csh_identity = -1; -+static int hf_nfapi_total_number_of_repetitions = -1; -+static int hf_nfapi_repetition_number = -1; -+static int hf_nfapi_initial_sf_io = -1; -+static int hf_nfapi_empty_symbols_due_to_retunning = -1; -+static int hf_nfapi_dl_cqi_ri_pmi_size_2 = -1; -+static int hf_nfapi_npucch_identity = -1; -+static int hf_nfapi_harq_size_2 = -1; -+static int hf_nfapi_delta_offset_harq_2 = -1; -+static int hf_nfapi_empty_symbols = -1; -+static int hf_nfapi_csi_mode = -1; -+static int hf_nfapi_dl_cqi_pmi_size_2 = -1; -+static int hf_nfapi_statring_prb = -1; -+static int hf_nfapi_cdm_index = -1; -+static int hf_nfapi_nsrs = -1; -+static int hf_nfapi_num_ant_ports = -1; -+static int hf_nfapi_n_pucch_2_0 = -1; -+static int hf_nfapi_n_pucch_2_1 = -1; -+static int hf_nfapi_n_pucch_2_2 = -1; -+static int hf_nfapi_n_pucch_2_3 = -1; -+static int hf_nfapi_starting_prb = -1; -+static int hf_nfapi_antenna_port = -1; -+static int hf_nfapi_number_of_combs = -1; -+static int hf_nfapi_number_of_pucch_resource = -1; -+static int hf_nfapi_pucch_index_p1 = -1; -+static int hf_nfapi_n_pucch_1_0 = -1; -+static int hf_nfapi_n_pucch_1_1 = -1; -+static int hf_nfapi_n_pucch_1_2 = -1; -+static int hf_nfapi_n_pucch_1_3 = -1; -+static int hf_nfapi_srs_bandwidth = -1; -+static int hf_nfapi_frequency_domain_position = -1; -+static int hf_nfapi_srs_hopping_bandwidth = -1; -+static int hf_nfapi_transmission_comb = -1; -+static int hf_nfapi_i_srs = -1; -+static int hf_nfapi_sounding_reference_cyclic_shift = -1; -+static int hf_nfapi_pdu_length = -1; -+static int hf_nfapi_crc_flag = -1; -+static int hf_nfapi_number_of_hi_pdus = -1; -+static int hf_nfapi_number_of_dci_pdus = -1; -+static int hf_nfapi_hi_dci0_pdu_type = -1; -+static int hf_nfapi_hi_value = -1; -+static int hf_nfapi_i_phich = -1; -+static int hf_nfapi_flag_tb2 = -1; -+static int hf_nfapi_hi_value_2 = -1; -+static int hf_nfapi_ue_tx_antenna_selection = -1; -+static int hf_nfapi_cqi_csi_request = -1; -+static int hf_nfapi_ul_index = -1; -+static int hf_nfapi_dl_assignment_index = -1; -+static int hf_nfapi_tpc_bitmap = -1; -+static int hf_nfapi_new_data_indication_two = -1; -+static int hf_nfapi_size_of_cqi_csi_feild = -1; -+static int hf_nfapi_resource_allocation_flag = -1; -+static int hf_nfapi_number_of_antenna_ports = -1; -+static int hf_nfapi_n_ul_rb = -1; -+static int hf_nfapi_pscch_resource = -1; -+static int hf_nfapi_time_resource_pattern = -1; -+static int hf_nfapi_mpdcch_transmission_type = -1; -+static int hf_nfapi_drms_scrambling_init = -1; -+static int hf_nfapi_pusch_repetition_levels = -1; -+static int hf_nfapi_frequency_hopping_flag = -1; -+static int hf_nfapi_csi_request = -1; -+static int hf_nfapi_dai_presence_flag = -1; -+static int hf_nfapi_total_dci_length_include_padding = -1; -+static int hf_nfapi_data_offset = -1; -+static int hf_nfapi_ul_cqi = -1; -+static int hf_nfapi_timing_advance_r9 = -1; -+static int hf_nfapi_timing_advance = -1; -+static int hf_nfapi_harq_data_value_0 = -1; -+static int hf_nfapi_harq_data_value_0_special = -1; -+static int hf_nfapi_harq_data_value_1 = -1; -+static int hf_nfapi_harq_data_value_2 = -1; -+static int hf_nfapi_harq_data_value_3 = -1; -+static int hf_nfapi_tdd_harq_mode = -1; -+static int hf_nfapi_fdd_harq_mode = -1; -+static int hf_nfapi_number_of_ack_nack = -1; -+static int hf_nfapi_harq_tb_1 = -1; -+static int hf_nfapi_harq_tb_2 = -1; -+static int hf_nfapi_harq_tb_n = -1; -+static int hf_nfapi_channel = -1; -+static int hf_nfapi_ri = -1; -+static int hf_nfapi_number_of_cc_reported = -1; -+static int hf_nfapi_preamble = -1; -+static int hf_nfapi_rach_resource_type = -1; -+static int hf_nfapi_snr = -1; -+static int hf_nfapi_doppler_estimation = -1; -+static int hf_nfapi_rb_start = -1; -+static int hf_nfapi_up_pts_symbol = -1; -+static int hf_nfapi_number_prb_per_subband = -1; -+static int hf_nfapi_number_antennas = -1; -+static int hf_nfapi_subband_index = -1; -+static int hf_nfapi_channel_coefficient = -1; -+static int hf_nfapi_ul_rtoa = -1; -+static int hf_nfapi_mp_cca = -1; -+static int hf_nfapi_n_cca = -1; -+static int hf_nfapi_offset = -1; -+static int hf_nfapi_lte_txop_sf = -1; -+static int hf_nfapi_txop_sfn_sf_end = -1; -+static int hf_nfapi_lbt_mode = -1; -+static int hf_nfapi_sfn_sf_end = -1; -+static int hf_nfapi_result = -1; -+static int hf_nfapi_txop_symbols = -1; -+static int hf_nfapi_initial_partial_sf = -1; -+static int hf_nfapi_frequency_band_indicator = -1; -+static int hf_nfapi_measurement_period = -1; -+static int hf_nfapi_bandwidth = -1; -+static int hf_nfapi_timeout = -1; -+static int hf_nfapi_number_of_earfcns = -1; -+static int hf_nfapi_uarfcn = -1; -+static int hf_nfapi_number_of_uarfcns = -1; -+static int hf_nfapi_arfcn = -1; -+static int hf_nfapi_arfcn_direction = -1; -+static int hf_nfapi_number_of_arfcns = -1; -+static int hf_nfapi_rssi = -1; -+static int hf_nfapi_number_of_rssi = -1; -+static int hf_nfapi_pci = -1; -+static int hf_nfapi_measurement_bandwidth = -1; -+static int hf_nfapi_exhaustive_search = -1; -+static int hf_nfapi_number_of_pci = -1; -+static int hf_nfapi_psc = -1; -+static int hf_nfapi_number_of_psc = -1; -+static int hf_nfapi_rsrp = -1; -+static int hf_nfapi_rsrq = -1; -+static int hf_nfapi_number_of_lte_cells_found = -1; -+static int hf_nfapi_rscp = -1; -+static int hf_nfapi_enco = -1; -+static int hf_nfapi_number_of_utran_cells_found = -1; -+static int hf_nfapi_bsic = -1; -+static int hf_nfapi_rxlev = -1; -+static int hf_nfapi_rxqual = -1; -+static int hf_nfapi_sfn_offset = -1; -+static int hf_nfapi_number_of_geran_cells_found = -1; -+static int hf_nfapi_number_of_tx_antenna = -1; -+static int hf_nfapi_mib_length = -1; -+static int hf_nfapi_mib = -1; -+static int hf_nfapi_phich_configuration = -1; -+static int hf_nfapi_retry_count = -1; -+static int hf_nfapi_sib1 = -1; -+static int hf_nfapi_si_periodicity = -1; -+static int hf_nfapi_si_index = -1; -+static int hf_nfapi_number_of_si_periodicity = -1; -+static int hf_nfapi_si_window_length = -1; -+static int hf_nfapi_sib_type = -1; -+static int hf_nfapi_sib_len = -1; -+static int hf_nfapi_sib = -1; -+static int hf_nfapi_si_len = -1; -+static int hf_nfapi_si = -1; -+static int hf_nfapi_pnf_search_state = -1; -+static int hf_nfapi_pnf_broadcast_state = -1; -+ -+static const value_string message_id_vals[] = -+{ -+ { NFAPI_DL_CONFIG_REQUEST_MSG_ID, "DL_CONFIG.request" }, -+ { NFAPI_UL_CONFIG_REQUEST_MSG_ID, "UL_CONFIG.request" }, -+ { NFAPI_SUBFRAME_INDICATION_MSG_ID, "SUBFRAME_INDICATION" }, -+ { NFAPI_HI_DCI0_REQUEST_MSG_ID, "HI_DCI0.request" }, -+ { NFAPI_TX_REQUEST_MSG_ID, "TX.request" }, -+ { NFAPI_HARQ_INDICATION_MSG_ID, "HARQ.indication" }, -+ { NFAPI_CRC_INDICATION_MSG_ID, "CRC.indication" }, -+ { NFAPI_RX_ULSCH_INDICATION_MSG_ID, "RX_ULSCH.indication" }, -+ { NFAPI_RACH_INDICATION_MSG_ID, "RACH.indication" }, -+ { NFAPI_SRS_INDICATION_MSG_ID, "SRS.indication" }, -+ { NFAPI_RX_SR_INDICATION_MSG_ID, "RX_SR.indication" }, -+ { NFAPI_RX_CQI_INDICATION_MSG_ID, "RX_CQI.indication" }, -+ { NFAPI_LBT_DL_CONFIG_REQUEST_MSG_ID, "LBT_DL_CONFIG.request" }, -+ { NFAPI_LBT_DL_INDICATION_MSG_ID, "LBT_DL.indication" }, -+ -+ { NFAPI_PNF_PARAM_REQUEST_MSG_ID, "PNF_PARAM.request" }, -+ { NFAPI_PNF_PARAM_RESPONSE_MSG_ID, "PNF_PARAM.response" }, -+ { NFAPI_PNF_CONFIG_REQUEST_MSG_ID, "PNF_CONFIG.request" }, -+ { NFAPI_PNF_CONFIG_RESPONSE_MSG_ID, "PNF_CONFIG.response" }, -+ { NFAPI_PNF_START_REQUEST_MSG_ID, "PNF_START.request" }, -+ { NFAPI_PNF_START_RESPONSE_MSG_ID, "PNF_START.response" }, -+ { NFAPI_PNF_STOP_REQUEST_MSG_ID, "PNF_STOP.request" }, -+ { NFAPI_PNF_STOP_RESPONSE_MSG_ID, "PNF_STOP.response" }, -+ { NFAPI_PARAM_REQUEST_MSG_ID, "PARAM.request" }, -+ { NFAPI_PARAM_RESPONSE_MSG_ID, "PARAM.response" }, -+ { NFAPI_CONFIG_REQUEST_MSG_ID, "CONFIG.request" }, -+ { NFAPI_CONFIG_RESPONSE_MSG_ID, "CONFIG.response" }, -+ { NFAPI_START_REQUEST_MSG_ID, "START.request" }, -+ { NFAPI_START_RESPONSE_MSG_ID, "START.response" }, -+ { NFAPI_STOP_REQUEST_MSG_ID, "STOP.request" }, -+ { NFAPI_STOP_RESPONSE_MSG_ID, "STOP.response" }, -+ { NFAPI_MEASUREMENT_REQUEST_MSG_ID, "MEASUREMENT.request" }, -+ { NFAPI_MEASUREMENT_RESPONSE_MSG_ID, "MEASUREMENT.response" }, -+ -+ { NFAPI_DL_NODE_SYNC_MSG_ID, "UL_NODE_SYNC" }, -+ { NFAPI_UL_NODE_SYNC_MSG_ID, "DL_NODE_SYNC" }, -+ { NFAPI_TIMING_INFO_MSG_ID, "TIMING_INFO" }, -+ -+ { NFAPI_RSSI_REQUEST_MSG_ID, "RSSI.request" }, -+ { NFAPI_RSSI_RESPONSE_MSG_ID, "RSSI.response" }, -+ { NFAPI_RSSI_INDICATION_MSG_ID, "RSSI.indication" }, -+ { NFAPI_CELL_SEARCH_REQUEST_MSG_ID, "CELL_SEARCH.request" }, -+ { NFAPI_CELL_SEARCH_RESPONSE_MSG_ID, "CELL_SEARCH.response" }, -+ { NFAPI_CELL_SEARCH_INDICATION_MSG_ID, "CELL_SEARCH.indication" }, -+ { NFAPI_BROADCAST_DETECT_REQUEST_MSG_ID, "BROADCAST_DETECT.request" }, -+ { NFAPI_BROADCAST_DETECT_RESPONSE_MSG_ID, "BROADCAST_DETECT.response" }, -+ { NFAPI_BROADCAST_DETECT_INDICATION_MSG_ID, "BROADCAST_DETECT.indication" }, -+ { NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST_MSG_ID, "SYSTEM_INFORMATION_SCHEDULE.request" }, -+ { NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE_MSG_ID, "SYSTEM_INFORMATION_SCHEDULE.response" }, -+ { NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION_MSG_ID, "SYSTEM_INFORMATION_SCHEDULE.indication" }, -+ { NFAPI_SYSTEM_INFORMATION_REQUEST_MSG_ID, "SYSTEM_INFORMATION.request" }, -+ { NFAPI_SYSTEM_INFORMATION_RESPONSE_MSG_ID, "SYSTEM_INFORMATION.response" }, -+ { NFAPI_SYSTEM_INFORMATION_INDICATION_MSG_ID, "SYSTEM_INFORMATION.indication" }, -+ { NFAPI_NMM_STOP_REQUEST_MSG_ID, "NMM_STOP.request" }, -+ { NFAPI_NMM_STOP_RESPONSE_MSG_ID, "NMM_STOP.response" }, -+ -+ { 0, NULL }, -+}; -+ -+typedef void(*tlv_decode)(ptvcursor_t * ptvc, packet_info* pinfo); -+ -+typedef struct -+{ -+ guint16 tag_id; -+ char* name; -+ tlv_decode decode; -+} tlv_t; -+ -+static void dissect_tlv_list(ptvcursor_t * ptvc, packet_info* pinfo, gint len); -+ -+static void dissect_array_value(ptvcursor_t * ptvc, packet_info* pinfo, const char* name, guint32 ett_idx, guint32 count, tlv_decode decode) -+{ -+ guint16 i = 0; -+ -+ if (count > 0) -+ { -+ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_idx, "%s", name); -+ -+ for (i = 0; i < count; ++i) -+ { -+ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_idx, "[%d]", i); -+ decode(ptvc, pinfo); -+ ptvcursor_pop_subtree(ptvc); -+ } -+ -+ ptvcursor_pop_subtree(ptvc); -+ } -+} -+ -+static void dissect_pnf_param_general_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // nFAPI Sync Mode -+ guint8 nfapi_sync_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_sync_mode, 1, ENC_BIG_ENDIAN); -+ if (nfapi_sync_mode_value > 2) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nfapi sync mode value [0..2]"); -+ } -+ -+ // Location Mode -+ guint8 location_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_location_mode, 1, ENC_BIG_ENDIAN); -+ if (location_mode_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid location mode value [0..3]"); -+ } -+ -+ guint16 len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_location_coordinates_length, 2, ENC_BIG_ENDIAN); -+ if (len > 0) -+ ptvcursor_add(ptvc, hf_nfapi_location_coordinates, len, ENC_NA); -+ ptvcursor_add(ptvc, hf_nfapi_dl_config_timing, 4, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_tx_timing, 4, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_ul_config_timing, 4, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_hi_dci0_timing, 4, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_maximum_number_phys, 2, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_maximum_total_bandwidth, 2, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_maximum_total_number_dl_layers, 1, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_maximum_total_number_ul_layers, 1, ENC_BIG_ENDIAN); -+ -+ // Shared Bands -+ guint8 shared_bands_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_shared_bands, 1, ENC_BIG_ENDIAN); -+ if (shared_bands_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid shared bands value [0..1]"); -+ } -+ -+ // Shared PA -+ guint8 shared_pa_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_shared_pa, 1, ENC_BIG_ENDIAN); -+ if (shared_pa_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid shared pa value [0..1]"); -+ } -+ -+ ptvcursor_add(ptvc, hf_nfapi_maximum_total_power, 2, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_oui, 3, ENC_HOST_ENDIAN); -+} -+static void dissect_pnf_rf_config_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ ptvcursor_add(ptvc, hf_nfapi_rf_config_index, 2, ENC_BIG_ENDIAN); -+} -+static void dissect_pnf_phy_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN); -+ -+ guint16 num_rf_configs = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_rfs, 2, ENC_BIG_ENDIAN); -+ dissect_array_value(ptvc, pinfo, "RF Config List", ett_nfapi_pnf_phy, num_rf_configs, dissect_pnf_rf_config_instance_value); -+ -+ guint16 num_rf_exclusions = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_rf_exclusions, 2, ENC_BIG_ENDIAN); -+ dissect_array_value(ptvc, pinfo, "RF Exclustion List", ett_nfapi_pnf_phy, num_rf_exclusions, dissect_pnf_rf_config_instance_value); -+ -+ // Downlink Channel Bandwidth Supported -+ guint16 downlink_channel_bandwidth_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add_no_advance(ptvc, hf_nfapi_downlink_channel_bandwidth_supported, 2, ENC_BIG_ENDIAN); -+ if (downlink_channel_bandwidth_supported_value > 0x3F) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink channel bandwidht supported bits [0..0x3F]"); -+ } -+ -+ proto_tree* dl_bw_support_tree = proto_item_add_subtree(item, ett_nfapi_downlink_bandwidth_support); -+ -+ proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_6, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA); -+ proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_15, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA); -+ proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_25, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA); -+ proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_50, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 12, 1, ENC_NA); -+ proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_75, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 11, 1, ENC_NA); -+ proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_100, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 10, 1, ENC_NA); -+ -+ ptvcursor_advance(ptvc, 2); -+ -+ -+ -+ // Uplink Channel Bandwidth Supported -+ guint16 uplink_channel_bandwidth_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add_no_advance(ptvc, hf_nfapi_uplink_channel_bandwidth_supported, 2, ENC_BIG_ENDIAN); -+ if (uplink_channel_bandwidth_supported_value > 0x3F) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid uplink channel bandwidht supported bits [0..0x3F]"); -+ } -+ -+ proto_tree* ul_bw_support_tree = proto_item_add_subtree(item, ett_nfapi_uplink_bandwidth_support); -+ -+ proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_6, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA); -+ proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_15, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA); -+ proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_25, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA); -+ proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_50, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 12, 1, ENC_NA); -+ proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_75, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 11, 1, ENC_NA); -+ proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_100, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 10, 1, ENC_NA); -+ -+ ptvcursor_advance(ptvc, 2); -+ -+ // Number of DL layers supported -+ guint8 number_of_dl_layer_supported_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_of_dl_layers_supported, 1, ENC_BIG_ENDIAN); -+ if (!(number_of_dl_layer_supported_value == 1 || number_of_dl_layer_supported_value == 2 || -+ number_of_dl_layer_supported_value == 4 || number_of_dl_layer_supported_value == 8)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of dl layers supported value [1, 2, 4, 8]"); -+ } -+ -+ // Number of DL layers supported -+ guint8 number_of_ul_layer_supported_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_of_ul_layers_supported, 1, ENC_BIG_ENDIAN); -+ if (!(number_of_ul_layer_supported_value == 1 || number_of_ul_layer_supported_value == 2 || -+ number_of_ul_layer_supported_value == 4)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ul layers supported value [1, 2, 4]"); -+ } -+ -+ // Maximum 3GPP Release Supported -+ guint16 maximum_3gpp_release_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add_no_advance(ptvc, hf_nfapi_maximum_3gpp_release_supported, 2, ENC_BIG_ENDIAN); -+ if (maximum_3gpp_release_supported_value > 0x3F) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid maximum 3GPP release supported value [0..0x3F]"); -+ } -+ -+ proto_tree* release_support_tree = proto_item_add_subtree(item, ett_nfapi_release_support); -+ -+ proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel8, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA); -+ proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel9, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA); -+ proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel10, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA); -+ proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel11, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 12, 1, ENC_NA); -+ proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel12, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 11, 1, ENC_NA); -+ proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel13, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 10, 1, ENC_NA); -+ -+ ptvcursor_advance(ptvc, 2); -+ -+ -+ // NMM Modes Supported -+ guint8 nmm_modes_supported_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_nmm_modes_supported, 1, ENC_BIG_ENDIAN); -+ if (nmm_modes_supported_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nmm modes supported value [0..3]"); -+ } -+} -+ -+static void dissect_pnf_phy_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 num_phy = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN); -+ dissect_array_value(ptvc, pinfo, "PHY List", ett_nfapi_pnf_phy, num_phy, dissect_pnf_phy_instance_value); -+} -+ -+static void dissect_pnf_rf_config_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ ptvcursor_add(ptvc, hf_nfapi_rf_config_index, 2, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_band, 2, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_maximum_transmit_power, 2, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_minimum_transmit_power, 2, ENC_BIG_ENDIAN); -+ -+ guint8 number_of_antennas_supported_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_of_antennas_suppported, 1, ENC_BIG_ENDIAN); -+ if (!(number_of_antennas_supported_value == 1 || number_of_antennas_supported_value == 2 || -+ number_of_antennas_supported_value == 4 || number_of_antennas_supported_value == 8)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of supported antennas [1, 2, 4, 8]"); -+ } -+ -+ ptvcursor_add(ptvc, hf_nfapi_minimum_downlink_frequency, 4, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_maximum_downlink_frequency, 4, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_minimum_uplink_frequency, 4, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_maximum_uplink_frequency, 4, ENC_BIG_ENDIAN); -+} -+ -+ -+static void dissect_pnf_rf_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 num_rf = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_rfs, 2, ENC_BIG_ENDIAN); -+ dissect_array_value(ptvc, pinfo, "RF List", ett_nfapi_pnf_phy_rf_config, num_rf, dissect_pnf_rf_config_value); -+} -+ -+static void dissect_pnf_phy_rel10_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // PHY Config Index -+ ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN); -+ -+ // Transmission mode 7 supported -+ guint16 transmission_mode7_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_transmission_mode7_supported, 2, ENC_BIG_ENDIAN); -+ if (transmission_mode7_supported_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode 7 supported value [0..1]"); -+ } -+ -+ // Two antennas ports for PUCCH -+ guint16 transmission_mode8_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hi_nfapi_transmission_mode8_supported, 2, ENC_BIG_ENDIAN); -+ if (transmission_mode8_supported_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode 8 supported value [0..1]"); -+ } -+ -+ // Transmission mode 8 supported -+ guint16 two_antennas_port_for_pucch_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hi_nfapi_two_antennas_ports_for_pucch, 2, ENC_BIG_ENDIAN); -+ if (two_antennas_port_for_pucch_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid two antennas ports for pucch value [0..1]"); -+ } -+ -+ // Transmission mode 9 supported -+ guint16 transmission_mode9_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hi_nfapi_transmission_mode_9_supported, 2, ENC_BIG_ENDIAN); -+ if (transmission_mode9_supported_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode 9 supported value [0..1]"); -+ } -+ -+ // Simultaneous PUCCH PUSCH -+ guint16 simultaenous_pucch_pusch_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hi_nfapi_simultaneous_pucch_pusch, 2, ENC_BIG_ENDIAN); -+ if (simultaenous_pucch_pusch_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid simultaneous pucch pusch supported value [0..1]"); -+ } -+ -+ // Four layer Tx with TM3 and TM4 -+ guint16 four_layer_tx_with_tm3_and_tm4_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hi_nfapi_four_layer_tx_with_tm3_and_tm4, 2, ENC_BIG_ENDIAN); -+ if (four_layer_tx_with_tm3_and_tm4_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid four layer tx with tm3 and tm4 value [0..1]"); -+ } -+} -+ -+static void dissect_pnf_phy_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 num_phy = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN); -+ dissect_array_value(ptvc, pinfo, "PHY Rel 10 List", ett_nfapi_pnf_phy_rel10, num_phy, dissect_pnf_phy_rel10_instance_value); -+} -+ -+static void dissect_pnf_phy_rel11_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // PHY Config Index -+ ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN); -+ -+ // ePDCCH supported -+ guint16 epdcch_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_epdcch_supported, 2, ENC_BIG_ENDIAN); -+ if (epdcch_supported_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid edpcch supported value [0..1]"); -+ } -+ -+ // Multi ACK CSI reporting -+ guint16 multi_ack_csi_reporting_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hi_nfapi_multi_ack_csi_reporting, 2, ENC_BIG_ENDIAN); -+ if (multi_ack_csi_reporting_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid multi ack csi reporting value [0..1]"); -+ } -+ -+ // PUCCH Tx diversity with channel selection -+ guint16 pucch_tx_diversity_with_channel_selection_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hi_nfapi_pucch_tx_diversity_with_channel_selection, 2, ENC_BIG_ENDIAN); -+ if (pucch_tx_diversity_with_channel_selection_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch tx diversity with channel selection value [0..1]"); -+ } -+ -+ // UL CoMP supported -+ guint16 ul_comp_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hi_nfapi_ul_comp_supported, 2, ENC_BIG_ENDIAN); -+ if (ul_comp_supported_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul comp supported value [0..1]"); -+ } -+ -+ // Transmission mode 5 supported -+ guint16 transmission_mode_5_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hi_nfapi_transmission_mode_5_supported, 2, ENC_BIG_ENDIAN); -+ if (transmission_mode_5_supported_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode 5 supported value [0..1]"); -+ } -+} -+ -+static void dissect_pnf_phy_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 num_phy = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN); -+ dissect_array_value(ptvc, pinfo, "PHY Rel 11 List", ett_nfapi_pnf_phy_rel11, num_phy, dissect_pnf_phy_rel11_instance_value); -+} -+ -+static void dissect_pnf_phy_rel12_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // PHY Config Index -+ ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN); -+ -+ // CSI subframe set -+ guint16 csi_subframe_set_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_csi_subframe_set, 2, ENC_BIG_ENDIAN); -+ if (csi_subframe_set_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi subframe set value [0..1]"); -+ } -+ -+ // Enhanced 4TX codebook -+ guint16 enhanced_4tx_codebook_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hi_nfapi_enhanced_4tx_codebook, 2, ENC_BIG_ENDIAN); -+ if (enhanced_4tx_codebook_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid enhanced 4TX codebook value [0..1]"); -+ } -+ -+ // DRS supported -+ guint16 drs_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hi_nfapi_drs_supported, 2, ENC_BIG_ENDIAN); -+ if (drs_supported_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drs supported value [0..1]"); -+ } -+ -+ // UL 64QAM supported -+ guint16 ul_64qam_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hi_nfapi_ul_64qam_supported, 2, ENC_BIG_ENDIAN); -+ if (ul_64qam_supported_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul 64 QAM supported value [0..1]"); -+ } -+ -+ // Transmission mode 10 supported -+ guint16 transmission_mode_10_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hi_nfapi_transmission_mode_10_supported, 2, ENC_BIG_ENDIAN); -+ if (transmission_mode_10_supported_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode 10 supported value [0..1]"); -+ } -+ -+ // Alternative TBS indices -+ guint16 alternative_tbs_indices_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hi_nfapi_alternative_tbs_indices, 2, ENC_BIG_ENDIAN); -+ if (alternative_tbs_indices_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid alternative tbs indicies supported value [0..1]"); -+ } -+} -+ -+static void dissect_pnf_phy_rel12_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 num_phy = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN); -+ dissect_array_value(ptvc, pinfo, "PHY Rel 12 List", ett_nfapi_pnf_phy_rel12, num_phy, dissect_pnf_phy_rel12_instance_value); -+} -+ -+static void dissect_pnf_phy_rel13_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // PHY Config Index -+ ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN); -+ -+ // PUCCH format 4 supported -+ guint16 pucch_format_4_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_pucch_format_4_supported, 2, ENC_BIG_ENDIAN); -+ if (pucch_format_4_supported_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch format 4 supported value [0..1]"); -+ } -+ -+ // PUCCH format 5 supported -+ guint16 pucch_format_5_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_pucch_format_5_supported, 2, ENC_BIG_ENDIAN); -+ if (pucch_format_5_supported_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch format 5 supported value [0..1]"); -+ } -+ -+ // More than 5 CA support -+ guint16 more_than_5_ca_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_more_than_5_ca_supported, 2, ENC_BIG_ENDIAN); -+ if (more_than_5_ca_supported_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid more than 5 ca supported value [0..1]"); -+ } -+ -+ // LAA supported -+ guint16 laa_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_laa_supported, 2, ENC_BIG_ENDIAN); -+ if (laa_supported_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid laa supported value [0..1]"); -+ } -+ -+ // LAA ending in DwPTS supported -+ guint16 laa_ending_in_dwpts_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_laa_ending_in_dwpts_supported, 2, ENC_BIG_ENDIAN); -+ if (laa_ending_in_dwpts_supported_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid laa ending in dwpts supported value [0..1]"); -+ } -+ -+ // LAA starting in second slot Supported -+ guint16 laa_starting_in_second_slot_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_laa_starting_in_second_slot_supported, 2, ENC_BIG_ENDIAN); -+ if (laa_starting_in_second_slot_supported_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid laa starting in second slot supported value [0..1]"); -+ } -+ -+ // Beamforming Supported -+ guint16 beamingforming_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_beamforming_supported, 2, ENC_BIG_ENDIAN); -+ if (beamingforming_supported_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid beamforming supported value [0..1]"); -+ } -+ -+ // CSI-RS enhancements supported -+ guint16 csi_rs_enhancements_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_enhancements_supported, 2, ENC_BIG_ENDIAN); -+ if (csi_rs_enhancements_supported_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi rs enhancements supported value [0..1]"); -+ } -+ -+ // DMRS enhancements supported -+ guint16 drms_enhancements_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_drms_enhancements_supported, 2, ENC_BIG_ENDIAN); -+ if (drms_enhancements_supported_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms enhancements supported value [0..1]"); -+ } -+ -+ // SRS enhancements supported -+ guint16 srs_enhancements_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_srs_enhancements_supported, 2, ENC_BIG_ENDIAN); -+ if (srs_enhancements_supported_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs enhancements supported value [0..1]"); -+ } -+ -+} -+ -+static void dissect_pnf_phy_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 num_phy = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN); -+ dissect_array_value(ptvc, pinfo, "PHY Rel 13 List", ett_nfapi_pnf_phy_rel13, num_phy, dissect_pnf_phy_rel13_instance_value); -+} -+ -+static void dissect_pnf_phy_rf_config_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ ptvcursor_add(ptvc, hf_nfapi_phy_rf_config_info_phy_id, 2, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_rf_config_index, 2, ENC_BIG_ENDIAN); -+} -+static void dissect_pnf_phy_rf_config_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 num_configs = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN); -+ dissect_array_value(ptvc, pinfo, "PHY RF Config List", ett_nfapi_pnf_phy_rf_config, num_configs, dissect_pnf_phy_rf_config_instance_value); -+} -+ -+static void dissect_dl_rs_tx_power_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_dl_rs_tx_power, 2, ENC_BIG_ENDIAN); -+ -+ if (!(value >= 1 && value <= 255)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value [1..255]"); -+ } -+} -+static void dissect_received_interference_power_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_received_interference_power, 2, ENC_BIG_ENDIAN); -+ -+ if (!(value >= 1 && value <= 255)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value [1..255]"); -+ } -+} -+static void dissect_thermal_noise_power_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ ptvcursor_add(ptvc, hf_nfapi_thermal_noise_power, 2, ENC_BIG_ENDIAN); -+} -+static void dissect_dl_rs_tx_power_measurement_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ ptvcursor_add(ptvc, hf_nfapi_dl_rs_tx_power_measurement, 2, ENC_BIG_ENDIAN); -+} -+ -+static void dissect_received_interference_power_result_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ ptvcursor_add(ptvc, hf_nfapi_received_interference_power_measurement, 2, ENC_BIG_ENDIAN); -+} -+static void dissect_received_interference_power_measurement_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 num_resource_block = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_resource_blocks, 2, ENC_BIG_ENDIAN); -+ dissect_array_value(ptvc, pinfo, "Results", ett_nfapi_received_interference_power_mesurement_results, num_resource_block, dissect_received_interference_power_result_value); -+} -+static void dissect_thermal_noise_power_measurement_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ ptvcursor_add(ptvc, hf_nfapi_thermal_noise_power_measurement, 2, ENC_BIG_ENDIAN); -+} -+static void dissect_duplex_mode_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_duplex_mode, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 2) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid duplex mode [0..2]"); -+ } -+} -+static void dissect_pcfich_power_offset_value(ptvcursor_t* ptvc, packet_info *pinfo) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pcfich_power_offset, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 10000) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid power level [0..10000]"); -+ } -+} -+static void dissect_pb_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pb, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink power allocation index [0..3]"); -+ } -+} -+ -+static void dissect_dl_cyclic_prefix_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_dl_cyclic_prefix_type, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dl cyclic prefix type [0..1]"); -+ } -+} -+static void dissect_ul_cyclic_prefix_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_ul_cyclic_prefix_type, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul cyclic prefix type [0..1]"); -+ } -+} -+static void dissect_dl_channel_bandwidth_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_downlink_channel_bandwidth, 2, ENC_BIG_ENDIAN); -+ -+ if (!(value == 6 || value == 15 || value == 25 || value == 50 || value == 75 || value == 100)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink bandwidth value [6, 15, 25, 50, 75, 100]"); -+ } -+} -+static void dissect_ul_channel_bandwidth_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_uplink_channel_bandwidth, 2, ENC_BIG_ENDIAN); -+ -+ if (!(value == 6 || value == 15 || value == 25 || value == 50 || value == 75 || value == 100)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid uplink bandwidth value [6, 15, 25, 50, 75, 100]"); -+ } -+} -+static void dissect_reference_signal_power_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_reference_signal_power, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid reference signal power [0..255]"); -+ } -+ -+} -+static void dissect_tx_antenna_ports_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_tx_antenna_ports, 2, ENC_BIG_ENDIAN); -+ -+ if (!(value == 1 || value == 2 || value == 4 || value == 8 || value == 16)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tx antenna ports value [1, 2, 4, 8, 16]"); -+ } -+} -+static void dissect_rx_antenna_ports_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_rx_antenna_ports, 2, ENC_BIG_ENDIAN); -+ -+ if (!(value == 1 || value == 2 || value == 4 || value == 8 || value == 16)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rx antenna ports value [1, 2, 4, 8, 16]"); -+ } -+} -+static void dissect_phich_resource_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_phich_resource, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid phich resource value [0..3]"); -+ } -+} -+static void dissect_phich_duration_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_phich_duration, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid phich duration value [0..1]"); -+ } -+} -+static void dissect_phich_power_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_phich_power_offset, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 10000) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid phich power offset value [0..10000]"); -+ } -+} -+static void dissect_psch_synch_signal_epre_eprers_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_primary_synchronization_signal_epre_eprers, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 10000) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid primary synchronization signal epre/eprers value [0..10000]"); -+ } -+} -+static void dissect_physical_cell_id_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_physical_cell_id, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 503) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid physical cell id [0..503]"); -+ } -+} -+static void dissect_ssch_synch_signal_epre_eprers_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_secondary_synchronization_signal_epre_eprers, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 10000) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid secondary synchronization signal epre/eprers value [0..10000]"); -+ } -+} -+static void dissect_prach_configuration_index_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_configuration_index, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 63) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach configuration index [0..63]"); -+ } -+} -+static void dissect_prach_root_sequence_index_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_root_sequence_index, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 837) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach root sequency index [0..837]"); -+ } -+} -+static void dissect_prach_zero_correlation_zone_configuration_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_zero_correlation_zone_configuration, 2, ENC_BIG_ENDIAN); -+ -+ // How do differentiate between fdd 0..6 and tdd 0..15 ranges? -+ if (value > 15) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid zero correlation zone configuration [0..15]"); -+ } -+} -+static void dissect_prach_high_speed_flag_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_high_speed_flag, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid high speed flag value [0..1]"); -+ } -+} -+static void dissect_prach_frequency_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_frequency_offset, 2, ENC_BIG_ENDIAN); -+ -+ // How to determine the ul channel bandiwdth? -+ if (value > (100 -6)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach frequency offset value [0..94]"); -+ } -+} -+static void dissect_pusch_hopping_mode_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_hopping_mode, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pusch hopping mode value [0..1]"); -+ } -+} -+static void dissect_pusch_hopping_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_hopping_offset, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 98) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pusch hopping offset value [0..98]"); -+ } -+} -+static void dissect_pusch_number_of_subbands_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_number_of_subbands, 2, ENC_BIG_ENDIAN); -+ -+ if (!(value >= 1 && value <= 4)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of sub-bands [1..4]"); -+ } -+} -+static void dissect_pucch_delta_pucch_shift_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_delta_pucch_shift, 2, ENC_BIG_ENDIAN); -+ -+ if (!(value >= 1 && value <= 3)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta pucch shift [1..3]"); -+ } -+} -+static void dissect_pucch_n_cqi_rb_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_n_cqi_rb, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 98) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n cqi rb value [0..98]"); -+ } -+} -+static void dissect_pucch_n_an_cs_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_n_an_cs, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 7) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n an cs value [0..7]"); -+ } -+} -+static void dissect_pucch_n1_pucch_an_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_n1_pucch_an, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 2047) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n1pucch an value [0..2047]"); -+ } -+} -+static void dissect_srs_bandwidth_configuration_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_bandwidth_configuration, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 7) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs bandwidth configuration value [0..7]"); -+ } -+} -+static void dissect_srs_max_uppts_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_max_up_pts, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid max up pts value [0..1]"); -+ } -+} -+static void dissect_srs_subframe_configuration_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_srs_subframe_configuration, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 15) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs subframe configuration value [0..15]"); -+ } -+} -+static void dissect_srs_acknack_srs_sim_tx_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_srs_acknack_srs_simultaneous_transmission, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs ack nack srs simultaneous transmission value [0..1]"); -+ } -+} -+static void dissect_uplink_rs_hopping_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_uplink_rs_hopping, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 2) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid uplink rs hopping value [0..2]"); -+ } -+} -+static void dissect_group_assignment_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_group_assignment, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 29) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid group assignment value [0..29]"); -+ } -+} -+static void dissect_cyclic_shift_1_for_drms_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_cyclic_shift_1_for_drms, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 7) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cyclic shift 1 for drms value [0..7]"); -+ } -+} -+static void dissect_tdd_subframe_assignement_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_subframe_assignment, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 6) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tdd subframe assignment value [0..6]"); -+ } -+} -+static void dissect_tdd_subframe_patterns_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_special_subframe_patterns, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 9) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid special subframe pattern value [0..9]"); -+ } -+} -+static void dissect_laa_ed_threashold_for_lbt_for_pdsch_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_ed_threshold_for_lbt_for_pdsch, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 70) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ed threshold for ltb for pdsch value [0..70]"); -+ } -+} -+static void dissect_laa_ed_threashold_for_lbt_for_drs_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_ed_threshold_for_lbt_for_drs, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 70) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ed threshold for ltb for drs value [0..70]"); -+ } -+} -+static void dissect_laa_pd_threshold_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pd_threshold, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 70 && value != 65535) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pd threshold value [0..70, 65536]"); -+ } -+} -+static void dissect_laa_multi_carrier_type_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_multi_carrier_type, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 4) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mutli carrier type [0..4]"); -+ } -+} -+static void dissect_laa_multi_carrier_tx_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_multi_carrier_tx, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mutli carrier tx value [0..1]"); -+ } -+} -+static void dissect_laa_multi_carrier_freeze_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_multi_carrier_freeze, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mutli carrier freeze value [0..1]"); -+ } -+} -+static void dissect_laa_tx_antenna_port_for_drs_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_tx_antenna_ports_for_drs, 2, ENC_BIG_ENDIAN); -+ -+ if (!(value == 1 || value == 2 || value == 4)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tx antenna ports for drs value [1, 2, 4]"); -+ } -+} -+static void dissect_laa_transmission_power_for_drs_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_transmission_power_for_drs, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 10000) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power for drs [0..10000]"); -+ } -+} -+static void dissect_emtc_pbch_repeitions_enabled_r13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pbch_repetitions_enabled_r13, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pbch repetitions enabled r13 value [0..1]"); -+ } -+} -+static void dissect_emtc_prach_cat_m_root_sequence_index_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_cat_m_root_sequence_index, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 837) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach cat-m root sequence index value [0..837]"); -+ } -+} -+static void dissect_emtc_prach_cat_m_zero_correlation_zone_configuration_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_cat_m_zero_correlation_zone_configuration, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 15) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach cat-m zero correlation zone configuration value [0..15]"); -+ } -+} -+static void dissect_emtc_prach_cat_m_high_speed_flag_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_cat_m_high_speed_flag, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach cat-m high speed flag value [0..1]"); -+ } -+} -+static void dissect_emtc_prach_ce_level_0_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_0_enable, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 enable value [0..1]"); -+ } -+} -+static void dissect_emtc_prach_ce_level_0_configuration_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_0_configuration_index, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 63) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 configuration index value [0..63]"); -+ } -+} -+static void dissect_emtc_prach_ce_level_0_frequency_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_0_frequency_offset, 2, ENC_BIG_ENDIAN); -+ -+ if (value > (100 - 6)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 frequency offset value [0..94]"); -+ } -+} -+static void dissect_emtc_preach_ce_level_0_num_of_repeitions_per_attempt_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_0_number_of_repetitions_per_attempt, 2, ENC_BIG_ENDIAN); -+ -+ if (!( value == 1 || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 || -+ value == 64 || value == 128)) -+ { -+ 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]"); -+ } -+} -+static void dissect_emtc_ce_level_0_starting_subframe_periodicity_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_0_starting_subframe_periodicity, 2, ENC_BIG_ENDIAN); -+ -+ if (!(value == 0xFFF || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 || -+ value == 64 || value == 128 || value == 256)) -+ { -+ 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]"); -+ } -+} -+static void dissect_emtc_preach_ce_level_0_hopping_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_0_hopping_enabled, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 hopping enabled value [0..1]"); -+ } -+} -+static void dissect_emtc_preach_ce_level_0_hopping_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_0_hopping_offset, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 94) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 hopping offset value [0..94]"); -+ } -+} -+static void dissect_emtc_prach_ce_level_1_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_1_enable, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 enable value [0..1]"); -+ } -+} -+static void dissect_emtc_prach_ce_level_1_configuration_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_1_configuration_index, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 63) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 configuration index value [0..63]"); -+ } -+} -+static void dissect_emtc_prach_ce_level_1_frequency_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_1_frequency_offset, 2, ENC_BIG_ENDIAN); -+ -+ if (value > (100 - 6)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 frequency offset value [0..94]"); -+ } -+} -+static void dissect_emtc_preach_ce_level_1_num_of_repeitions_per_attempt_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_1_number_of_repetitions_per_attempt, 2, ENC_BIG_ENDIAN); -+ -+ if (!(value == 1 || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 || -+ value == 64 || value == 128)) -+ { -+ 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]"); -+ } -+} -+static void dissect_emtc_ce_level_1_starting_subframe_periodicity_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_1_starting_subframe_periodicity, 2, ENC_BIG_ENDIAN); -+ -+ if (!(value == 0xFFF || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 || -+ value == 64 || value == 128 || value == 256)) -+ { -+ 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]"); -+ } -+} -+static void dissect_emtc_preach_ce_level_1_hopping_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_1_hopping_enabled, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 hopping enabled value [0..1]"); -+ } -+} -+static void dissect_emtc_preach_ce_level_1_hopping_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_1_hopping_offset, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 94) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 hopping offset value [0..94]"); -+ } -+} -+static void dissect_emtc_prach_ce_level_2_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_2_enable, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 enable value [0..1]"); -+ } -+} -+static void dissect_emtc_prach_ce_level_2_configuration_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_2_configuration_index, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 63) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 configuration index value [0..63]"); -+ } -+} -+static void dissect_emtc_prach_ce_level_2_frequency_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_2_frequency_offset, 2, ENC_BIG_ENDIAN); -+ -+ if (value > (100 - 6)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 frequency offset value [0..94]"); -+ } -+} -+static void dissect_emtc_preach_ce_level_2_num_of_repeitions_per_attempt_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_2_number_of_repetitions_per_attempt, 2, ENC_BIG_ENDIAN); -+ -+ if (!(value == 1 || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 || -+ value == 64 || value == 128)) -+ { -+ 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]"); -+ } -+} -+static void dissect_emtc_ce_level_2_starting_subframe_periodicity_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_2_starting_subframe_periodicity, 2, ENC_BIG_ENDIAN); -+ -+ if (!(value == 0xFFF || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 || -+ value == 64 || value == 128 || value == 256)) -+ { -+ 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]"); -+ } -+} -+static void dissect_emtc_preach_ce_level_2_hopping_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_2_hopping_enabled, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 hopping enabled value [0..1]"); -+ } -+} -+static void dissect_emtc_preach_ce_level_2_hopping_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_2_hopping_offset, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 94) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 hopping offset value [0..94]"); -+ } -+} -+static void dissect_emtc_prach_ce_level_3_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_3_enable, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #3 enable value [0..1]"); -+ } -+} -+static void dissect_emtc_prach_ce_level_3_configuration_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_3_configuration_index, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 63) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 configuration index value [0..63]"); -+ } -+} -+static void dissect_emtc_prach_ce_level_3_frequency_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_3_frequency_offset, 2, ENC_BIG_ENDIAN); -+ -+ if (value > (100 - 6)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #3 frequency offset value [0..94]"); -+ } -+} -+static void dissect_emtc_preach_ce_level_3_num_of_repeitions_per_attempt_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_3_number_of_repetitions_per_attempt, 2, ENC_BIG_ENDIAN); -+ -+ if (!(value == 1 || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 || -+ value == 64 || value == 128)) -+ { -+ 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]"); -+ } -+} -+static void dissect_emtc_ce_level_3_starting_subframe_periodicity_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_3_starting_subframe_periodicity, 2, ENC_BIG_ENDIAN); -+ -+ if (!(value == 0xFFF || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 || -+ value == 64 || value == 128 || value == 256)) -+ { -+ 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]"); -+ } -+} -+static void dissect_emtc_preach_ce_level_3_hopping_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_3_hopping_enabled, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #3 hopping enabled value [0..1]"); -+ } -+} -+static void dissect_emtc_preach_ce_level_3_hopping_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_3_hopping_offset, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 94) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #3 hopping offset value [0..94]"); -+ } -+} -+static void dissect_emtc_pucch_interval_ul_hopping_config_common_mode_a_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pucch_internal_ul_hopping_config_common_mode_a, 2, ENC_BIG_ENDIAN); -+ -+ if (!(value == 1 || value == 2 || value == 4 || value == 8 || value == 5 || value == 10 || value == 20)) -+ { -+ 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]"); -+ } -+} -+static void dissect_emtc_pucch_interval_ul_hopping_config_common_mode_b_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pucch_internal_ul_hopping_config_common_mode_b, 2, ENC_BIG_ENDIAN); -+ -+ if (!(value == 2 || value == 4 || value == 8 || value == 16 || value == 5 || value == 10 || value == 20 || value == 40)) -+ { -+ 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]"); -+ } -+} -+static void dissect_dl_bandwidth_support_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add_no_advance(ptvc, hf_nfapi_dl_bandwidth_support, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 0x1F) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink bandwidth support bit [0..0x1F]"); -+ } -+ -+ proto_tree* dl_bw_support_tree = proto_item_add_subtree(item, ett_nfapi_downlink_bandwidth_support); -+ -+ proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_6, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA); -+ proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_15, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA); -+ proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_25, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA); -+ proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_50, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 12, 1, ENC_NA); -+ proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_75, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 11, 1, ENC_NA); -+ proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_100, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 10, 1, ENC_NA); -+ -+ ptvcursor_advance(ptvc, 2); -+} -+static void dissect_ul_bandwidth_support_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add_no_advance(ptvc, hf_nfapi_ul_bandwidth_support, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 0x1F) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid uplink bandwidth support bit [0..0x1F]"); -+ } -+ -+ proto_tree* ul_bw_support_tree = proto_item_add_subtree(item, ett_nfapi_uplink_bandwidth_support); -+ -+ proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_6, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA); -+ proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_15, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA); -+ proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_25, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA); -+ proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_50, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 12, 1, ENC_NA); -+ proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_75, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 11, 1, ENC_NA); -+ proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_100, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 10, 1, ENC_NA); -+ -+ ptvcursor_advance(ptvc, 2); -+ -+} -+static void dissect_dl_modulation_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add_no_advance(ptvc, hf_nfapi_dl_modulation_support, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 0x7) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink modulation support bit [0..0x7]"); -+ } -+ -+ proto_tree* dl_mod_support_tree = proto_item_add_subtree(item, ett_nfapi_downlink_modulation_support); -+ -+ proto_tree_add_bits_item(dl_mod_support_tree, hf_nfapi_dl_modulation_support_qpsk, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA); -+ proto_tree_add_bits_item(dl_mod_support_tree, hf_nfapi_dl_modulation_support_16qam, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA); -+ proto_tree_add_bits_item(dl_mod_support_tree, hf_nfapi_dl_modulation_support_64qam, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA); -+ proto_tree_add_bits_item(dl_mod_support_tree, hf_nfapi_dl_modulation_support_256qam, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 12, 1, ENC_NA); -+ -+ ptvcursor_advance(ptvc, 2); -+} -+static void dissect_ul_modulation_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add_no_advance(ptvc, hf_nfapi_ul_modulation_support, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 0x7) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid uplink modulation support bit [0..0x7]"); -+ } -+ -+ proto_tree* ul_mod_support_tree = proto_item_add_subtree(item, ett_nfapi_uplink_modulation_support); -+ -+ proto_tree_add_bits_item(ul_mod_support_tree, hf_nfapi_ul_modulation_support_qpsk, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA); -+ proto_tree_add_bits_item(ul_mod_support_tree, hf_nfapi_ul_modulation_support_16qam, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA); -+ proto_tree_add_bits_item(ul_mod_support_tree, hf_nfapi_ul_modulation_support_64qam, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA); -+ -+ ptvcursor_advance(ptvc, 2); -+} -+static void dissect_phy_antenna_capability_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_phy_antenna_capability, 2, ENC_BIG_ENDIAN); -+ -+ if (!(value == 1 || value == 2 || value == 4 || value == 8 || value == 16)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid phy antenna capability [1, 2, 4, 8, 16]"); -+ } -+} -+static void dissect_release_capability_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add_no_advance(ptvc, hf_nfapi_release_capability, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 0x3F) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid release capability value [0..0x3F]"); -+ } -+ -+ proto_tree* release_support_tree = proto_item_add_subtree(item, ett_nfapi_release_support); -+ -+ proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel8, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA); -+ proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel9, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA); -+ proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel10, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA); -+ proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel11, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 12, 1, ENC_NA); -+ proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel12, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 11, 1, ENC_NA); -+ proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel13, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 10, 1, ENC_NA); -+ -+ ptvcursor_advance(ptvc, 2); -+} -+static void dissect_mbsfn_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_mbsfn_capability, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mbsfn capability bit [0..0x1]"); -+ } -+} -+static void dissect_laa_support_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_laa_capability, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid laa support bit [0..0x1]"); -+ } -+} -+static void dissect_laa_pd_sensing_lbt_support_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pd_sensing_lbt_support, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pd sensing lbt support bit [0..0x1]"); -+ } -+} -+static void dissect_laa_multi_carrier_lbt_support_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_multi_carrier_lbt_support, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 0xF) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid multi carrier LBT support bit [0..0xF]"); -+ } -+} -+static void dissect_laa_partial_sf_support_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_partial_sf_support, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 0x1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid partial SF support bit [0..0x1]"); -+ } -+} -+static void dissect_data_report_mode_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_data_report_mode, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid data report mode value [0..1]"); -+ } -+} -+static void dissect_sfn_sf_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_sfnsf, 2, ENC_BIG_ENDIAN); -+ -+ guint16 sfn = value >> 0x4; -+ guint16 sf = value & 0x000F; -+ if (sfn > 1023 || sf > 9) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid sfn/sf value sfn:%d [0..1023] sf:%d [0..9]", sfn, sf); -+ } -+} -+static void dissect_phy_state_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_phy_state, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 2) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid phy state [0..2]"); -+ } -+} -+static void dissect_p7_vnf_address_ipv4_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ ptvcursor_add(ptvc, hf_nfapi_vnf_address_ipv4, 4, ENC_NA); -+} -+static void dissect_p7_vnf_address_ipv6_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ ptvcursor_add(ptvc, hf_nfapi_vnf_address_ipv6, 16, ENC_NA); -+} -+static void dissect_p7_vnf_port_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ ptvcursor_add(ptvc, hf_nfapi_vnf_port, 2, ENC_BIG_ENDIAN); -+} -+static void dissect_p7_pnf_address_ipv4_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ ptvcursor_add(ptvc, hf_nfapi_pnf_address_ipv4, 4, ENC_NA); -+} -+static void dissect_p7_pnf_address_ipv6_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ ptvcursor_add(ptvc, hf_nfapi_pnf_address_ipv6, 16, ENC_NA); -+} -+static void dissect_p7_pnf_port_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ ptvcursor_add(ptvc, hf_nfapi_pnf_port, 2, ENC_BIG_ENDIAN); -+} -+static void dissect_downlink_ues_per_subframe_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ ptvcursor_add(ptvc, hf_nfapi_dl_ue_per_sf, 1, ENC_BIG_ENDIAN); -+} -+static void dissect_uplink_ues_per_subframe_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ ptvcursor_add(ptvc, hf_nfapi_ul_ue_per_sf, 1, ENC_BIG_ENDIAN); -+} -+static void dissect_rf_band_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ ptvcursor_add(ptvc, hf_nfapi_band, 2, ENC_BIG_ENDIAN); -+} -+static void dissect_rf_bands_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 count = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_rf_bands, 2, ENC_BIG_ENDIAN); -+ dissect_array_value(ptvc, pinfo, "RF Band List", ett_nfapi_rf_bands, count, dissect_rf_band_value); -+} -+static void dissect_timing_window_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint8 value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_timing_window, 1, ENC_BIG_ENDIAN); -+ -+ if (value > 30) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing window value [0..30]"); -+ } -+} -+static void dissect_timing_info_mode_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint8 value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_timing_info_mode, 1, ENC_BIG_ENDIAN); -+ -+ if (value > 0x3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing info mode [0..0x3]"); -+ } -+} -+static void dissect_timing_info_period_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint8 value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_timing_info_period, 1, ENC_BIG_ENDIAN); -+ -+ // Compiler throws an hissy fit that value <= 255 is always true... Yes, but I am trying to -+ // follow the specification... -+ if (!(value >= 1 /* && value <= 255*/)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing info period [1..255]"); -+ } -+} -+static void dissect_maximum_transmit_power_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_maximum_transmit_power_2, 2, ENC_BIG_ENDIAN); -+ -+ if (value > 700) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid maxiumum transmit power [0..700]"); -+ } -+} -+static void dissect_earfcn_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ ptvcursor_add(ptvc, hf_nfapi_earfcn, 2, ENC_BIG_ENDIAN); -+} -+static void dissect_nmm_gsm_frequency_bands_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 count = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_rf_bands, 2, ENC_BIG_ENDIAN); -+ dissect_array_value(ptvc, pinfo, "RF Band List", ett_nfapi_rf_bands, count, dissect_rf_band_value); -+} -+static void dissect_nmm_umts_frequency_bands_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 count = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_rf_bands, 2, ENC_BIG_ENDIAN); -+ dissect_array_value(ptvc, pinfo, "RF Band List", ett_nfapi_rf_bands, count, dissect_rf_band_value); -+} -+static void dissect_nmm_lte_frequency_bands_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 count = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_rf_bands, 2, ENC_BIG_ENDIAN); -+ dissect_array_value(ptvc, pinfo, "RF Band List", ett_nfapi_rf_bands, count, dissect_rf_band_value); -+} -+static void dissect_nmm_uplink_rssi_supported_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint8 value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_nmm_uplink_rssi_supported, 1, ENC_BIG_ENDIAN); -+ -+ if (value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nmm uplink rssi supported value [0..1]"); -+ } -+} -+static void dissect_dl_config_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ ptvcursor_add(ptvc, hf_nfapi_dl_config_pdu_type, 1, ENC_BIG_ENDIAN); -+ guint8 size = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_pdu_size, 1, ENC_BIG_ENDIAN); -+ -+ guint pdu_end = (ptvcursor_current_offset(ptvc) + size - 2); -+ dissect_tlv_list(ptvc, pinfo, pdu_end); -+} -+static void dissect_dl_config_request_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // Number of PDCCH OFDM symbols -+ guint8 number_of_pdcch_ofdm_symbols_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_pdcch_ofdm_symbols, 1, ENC_BIG_ENDIAN); -+ if (number_of_pdcch_ofdm_symbols_value > 4) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pdcch ofdm symbols value [0..4]"); -+ } -+ -+ // Number of DCIs -+ guint8 number_of_dcis_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_dci, 1, ENC_BIG_ENDIAN); -+ -+ // Number of PDUs -+ guint16 number_of_pdus_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_pdus, 2, ENC_BIG_ENDIAN); -+ if (number_of_pdus_value > 514) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pdus value [0..514]"); -+ } -+ -+ // Number of PDSCH RNTIs -+ ptvcursor_add(ptvc, hf_nfapi_number_pdsch_rnti, 1, ENC_BIG_ENDIAN); -+ -+ // Transmission power for PCFICH -+ guint16 transmission_power_for_pdsch_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_transmission_power_pcfich, 2, ENC_BIG_ENDIAN); -+ if (transmission_power_for_pdsch_value > 10000) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power for pcfich value [0..10000]"); -+ } -+ -+ 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); -+} -+static void dissect_dl_config_request_bch_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // Length -+ ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN); -+ -+ // PDU index -+ ptvcursor_add(ptvc, hf_nfapi_pdu_index, 2, ENC_BIG_ENDIAN); -+ -+ // Transmission power -+ guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); -+ if (transmission_power_value > 10000) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]"); -+ } -+ -+} -+static void dissect_dl_config_request_dl_dci_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // DCI format -+ guint8 dci_format_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_dl_dci_format, 1, ENC_BIG_ENDIAN); -+ if (dci_format_value > 9) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci format value [0..9]"); -+ } -+ -+ // CCE index -+ guint8 cce_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_cce_idx, 1, ENC_BIG_ENDIAN); -+ if (cce_index_value > 88) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cce index value [0..88]"); -+ } -+ -+ // Aggregation level -+ guint8 aggregation_level_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_aggregation_level, 1, ENC_BIG_ENDIAN); -+ if (!(aggregation_level_value == 1 || aggregation_level_value == 2 || aggregation_level_value == 4 || -+ aggregation_level_value == 8 || aggregation_level_value == 16 || aggregation_level_value == 32)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid aggregation level value [1, 2, 4, 8, 16, 32]"); -+ } -+ -+ // RNTI -+ guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); -+ if (rnti_value < 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]"); -+ } -+ -+ // Resource allocation type -+ guint8 resource_allocation_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN); -+ if (resource_allocation_type_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocation type value [0..1]"); -+ } -+ -+ // Virtual resource block assignment flag -+ guint8 virtual_resource_block_assignment_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_virtual_resource_block_assignment_flag, 1, ENC_BIG_ENDIAN); -+ if (virtual_resource_block_assignment_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid virtual resource block assignment flag value [0..1]"); -+ } -+ -+ // Resource block coding -+ ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN); -+ -+ // MCS_1 -+ guint8 mcs_1_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_mcs_1, 1, ENC_BIG_ENDIAN); -+ if (mcs_1_value > 31) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs 1 value [0..31]"); -+ } -+ -+ // Redundancy version_1 -+ guint8 redundancy_version_1_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_redundancy_version_1, 1, ENC_BIG_ENDIAN); -+ if (redundancy_version_1_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy version 1 value [0..3]"); -+ } -+ -+ // New data indicator_1 -+ guint8 new_data_indicator_1_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_new_data_indicator_1, 1, ENC_BIG_ENDIAN); -+ if (new_data_indicator_1_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indicator 1 value [0..1]"); -+ } -+ -+ // Transport block to codeword swap flag -+ guint8 transport_block_to_codeword_swap_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_transport_block_to_codeword_swap_flag, 1, ENC_BIG_ENDIAN); -+ if (transport_block_to_codeword_swap_flag_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport block to codeword swap flag value [0..1]"); -+ } -+ -+ // MCS_2 -+ guint8 mcs_2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_mcs_2, 1, ENC_BIG_ENDIAN); -+ if (mcs_2_value > 31) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs 2 value [0..31]"); -+ } -+ -+ // Redundancy version_2 -+ guint8 redundancy_version_2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_redundancy_version_2, 1, ENC_BIG_ENDIAN); -+ if (redundancy_version_2_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy version 2 value [0..3]"); -+ } -+ -+ // New Data indicator_2 -+ guint8 new_data_indicator_2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_new_data_indicator_2, 1, ENC_BIG_ENDIAN); -+ if (new_data_indicator_2_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indicator 2 value [0..1]"); -+ } -+ -+ // HARQ process -+ guint8 harq_process_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_harq_process, 1, ENC_BIG_ENDIAN); -+ if (harq_process_value > 15) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq process value [0..15]"); -+ } -+ -+ // TPMI -+ guint8 tpmi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_tpmi, 1, ENC_BIG_ENDIAN); -+ if (tpmi_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi value [0..3]"); -+ } -+ -+ // PMI -+ guint8 pmi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_pmi, 1, ENC_BIG_ENDIAN); -+ if (pmi_value > 2) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi value [0..2]"); -+ } -+ -+ // Precoding information -+ guint8 precoding_information_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_precoding_information, 1, ENC_BIG_ENDIAN); -+ if (precoding_information_value > 2) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid precoding information value [0..15]"); -+ } -+ -+ // TPC -+ guint8 tpc_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_tpc, 1, ENC_BIG_ENDIAN); -+ if (tpc_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpc value [0..3]"); -+ } -+ -+ // Downlink assignment index -+ guint8 downlink_assignment_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_downlink_assignment_index, 1, ENC_BIG_ENDIAN); -+ if (downlink_assignment_index_value > 15) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink assignment value [0..15]"); -+ } -+ -+ // NGAP -+ guint8 ngap_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_ngap, 1, ENC_BIG_ENDIAN); -+ if (ngap_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ngap value [0..1]"); -+ } -+ -+ // Transport block size index -+ guint8 transport_block_size_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_transport_block_size_index, 1, ENC_BIG_ENDIAN); -+ if (transport_block_size_index_value > 31) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport block size index value [0..31]"); -+ } -+ -+ // Downlink power offset -+ guint8 downlink_power_offset_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_downlink_power_offset, 1, ENC_BIG_ENDIAN); -+ if (downlink_power_offset_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink power offset value [0..1]"); -+ } -+ -+ // Allocate PRACH flag -+ guint8 allocate_prach_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_allocate_prach_flag, 1, ENC_BIG_ENDIAN); -+ if (allocate_prach_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid allocate prach flag value [0..1]"); -+ } -+ -+ // Preamble index -+ guint8 preamble_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_preamble_index, 1, ENC_BIG_ENDIAN); -+ if (preamble_index_value > 63) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid preamble index value [0..63]"); -+ } -+ -+ // PRACH mask index -+ guint8 prach_mask_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_prach_mask_index, 1, ENC_BIG_ENDIAN); -+ if (prach_mask_index_value > 15) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach mask index value [0..15]"); -+ } -+ -+ // RNTI type -+ guint8 rnti_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_rnti_type, 1, ENC_BIG_ENDIAN); -+ if (!(rnti_type_value >= 1 && rnti_type_value <= 3)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti type value [1..3]"); -+ } -+ -+ // Transmission power -+ guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); -+ if (transmission_power_value > 10000) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value value [0..10000]"); -+ } -+ -+} -+static void dissect_dl_config_request_dl_dci_pdu_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // MCCH flag -+ guint8 mcch_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_mcch_flag, 1, ENC_BIG_ENDIAN); -+ if (mcch_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcch flag value [0..1]"); -+ } -+ -+ // MCCH change notification -+ ptvcursor_add(ptvc, hf_nfapi_mcch_change_notification, 1, ENC_BIG_ENDIAN); -+ -+ // Scrambling identity -+ guint8 scrambling_identity_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_scrambling_identity, 1, ENC_BIG_ENDIAN); -+ if (scrambling_identity_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid scrambling identity value [0..1]"); -+ } -+ -+} -+static void dissect_dl_config_request_dl_dci_pdu_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // Cross carrier scheduling flag -+ guint8 cross_carrier_scheduling_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_cross_carrier_scheduling_flag, 1, ENC_BIG_ENDIAN); -+ if (cross_carrier_scheduling_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cross carrier scheduling flag value [0..1]"); -+ } -+ -+ // Carrier indicator -+ guint8 carrier_indicator_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_carrier_indicator, 1, ENC_BIG_ENDIAN); -+ if (carrier_indicator_value > 7) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid carrier indicator value [0..7]"); -+ } -+ -+ // SRS flag -+ guint8 srs_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_srs_flag, 1, ENC_BIG_ENDIAN); -+ if (srs_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs flag value [0..1]"); -+ } -+ -+ // SRS request -+ guint8 srs_request_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_srs_request, 1, ENC_BIG_ENDIAN); -+ if (srs_request_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs request value [0..1]"); -+ } -+ -+ // Antenna ports, scrambling and layers -+ guint8 antenna_ports_scrambling_and_layers_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_antenna_ports_scrambling_and_layers, 1, ENC_BIG_ENDIAN); -+ if (antenna_ports_scrambling_and_layers_value > 15) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid antenna ports scrambling and layers value [0..15]"); -+ } -+ -+ // Total DCI length including padding -+ ptvcursor_add(ptvc, hf_nfapi_total_dci_length_including_padding, 1, ENC_BIG_ENDIAN); -+ -+ // N_DL_RB -+ // TODO : This is missing from the encoder.... -+ //ptvcursor_add(ptvc, hf_nfapi_n_dl_rb, 1, ENC_BIG_ENDIAN); -+} -+static void dissect_dl_config_request_dl_dci_pdu_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // HARQ-ACK resource offset -+ guint8 harq_ack_resource_offset_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_harq_ack_resource_offset, 1, ENC_BIG_ENDIAN); -+ if (harq_ack_resource_offset_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid hack ack resource offset value [0..3]"); -+ } -+ -+ // PDSCH RE Mapping and Quasi-Co-Location Indicator -+ guint8 pdsch_re_mapping_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_pdsch_re_mapping_and_quasi_co_location_indicator, 1, ENC_BIG_ENDIAN); -+ if (pdsch_re_mapping_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch re mapping value [0..3]"); -+ } -+ -+} -+static void dissect_ul_dl_configuration_index_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // UL/DL configuration indication -+ guint8 ul_dl_configuration_indication_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_ul_dl_configuration_index, 1, ENC_BIG_ENDIAN); -+ if (!(ul_dl_configuration_indication_value >= 1 && ul_dl_configuration_indication_value <= 5)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul/dl configuration indication value [1..5]"); -+ } -+} -+static void dissect_dl_config_request_dl_dci_pdu_rel12_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // Primary cell type -+ guint8 primary_cell_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_primary_cell_type, 1, ENC_BIG_ENDIAN); -+ if (primary_cell_type_value > 2) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid primary cell type value [0..2]"); -+ } -+ -+ // UL/DL configuration flag -+ guint8 ul_dl_configuration_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_ul_dl_configuration_flag, 1, ENC_BIG_ENDIAN); -+ if (ul_dl_configuration_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul/dl configuration flag value [0..1]"); -+ } -+ -+ // Number of UL / DL configurations -+ guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_of_ul_dl_configurations, 1, ENC_BIG_ENDIAN); -+ -+ dissect_array_value(ptvc, pinfo, "UL/DL Configurations", ett_nfapi_pnf_phy, count, dissect_ul_dl_configuration_index_value); -+} -+static void dissect_dl_config_request_dl_dci_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ ptvcursor_add(ptvc, hf_nfapi_laa_end_partial_sf_flag, 1, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_laa_end_partial_sf_configuration, 1, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_initial_lbt_sf, 1, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_codebooksize_determination_r13, 1, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_rel13_drms_table_flag, 1, ENC_BIG_ENDIAN); -+} -+static void dissect_dl_config_request_mch_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_pdu_index, 2, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_modulation, 1, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_mbsfn_area_id, 2, ENC_BIG_ENDIAN); -+} -+static void dissect_codebook_index_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint8 codebook_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_codebook_index, 1, ENC_BIG_ENDIAN); -+ if (codebook_index_value > 15) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid codebook index value [0..15]"); -+ } -+} -+static void dissect_bf_vector_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ ptvcursor_add(ptvc, hf_nfapi_bf_vector_bf_value, 2, ENC_BIG_ENDIAN); -+} -+static void dissect_bf_vector_type_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ ptvcursor_add(ptvc, hf_nfapi_bf_vector_subband_index, 1, ENC_BIG_ENDIAN); -+ guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_bf_vector_num_antennas, 1, ENC_BIG_ENDIAN); -+ dissect_array_value(ptvc, pinfo, "Antennas", ett_nfapi_bf_vector_antennas, count, dissect_bf_vector_value); -+} -+static void dissect_dl_config_request_dlsch_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // Length -+ ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN); -+ -+ // PDU index -+ ptvcursor_add(ptvc, hf_nfapi_pdu_index, 2, ENC_BIG_ENDIAN); -+ -+ // RNTI -+ guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); -+ if (!(rnti_value >= 1 /* && rnti_value <= 65535)*/)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid codebook index value [1..65535]"); -+ } -+ -+ // Resource allocation type -+ guint8 resource_allocation_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN); -+ if (resource_allocation_type_value > 5) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocation type value [0..5]"); -+ } -+ -+ // Virtual resource block assignment flag -+ guint8 virtual_resource_block_assignment_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_virtual_resource_block_assignment_flag, 1, ENC_BIG_ENDIAN); -+ if (virtual_resource_block_assignment_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid virtual resource block allocation assignment value [0..1]"); -+ } -+ -+ // Resource block coding -+ ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN); -+ -+ // Modulation -+ guint8 modulation_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_modulation, 1, ENC_BIG_ENDIAN); -+ if (!(modulation_value == 2 || modulation_value == 4 || modulation_value == 6 || modulation_value == 8)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid modulation value [2, 4, 6, 8]"); -+ } -+ -+ // Redundancy version -+ guint8 redundancy_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_redundancy_version, 1, ENC_BIG_ENDIAN); -+ if (redundancy_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy value [0..3]"); -+ } -+ -+ // Transport blocks -+ guint8 transport_blocks_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_transport_blocks, 1, ENC_BIG_ENDIAN); -+ if (!(transport_blocks_value >= 1 && transport_blocks_value <= 2)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport blocks value [1..2]"); -+ } -+ -+ // Transport block to codeword swap flag -+ guint8 transport_blocks_to_codeword_swap_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_transport_block_to_codeword_swap_flag, 1, ENC_BIG_ENDIAN); -+ if (transport_blocks_to_codeword_swap_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport block to codeword swap flag value [0..1]"); -+ } -+ -+ // Transmission scheme -+ guint8 transmission_scheme_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_transmission_scheme, 1, ENC_BIG_ENDIAN); -+ if (transmission_scheme_value > 13) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission scheme value [0..13]"); -+ } -+ -+ // Number of layers -+ guint8 number_of_layers_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_of_layers, 1, ENC_BIG_ENDIAN); -+ if (!(number_of_layers_value >= 1 && number_of_layers_value <= 8)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of layers value [1..8]"); -+ } -+ -+ // Number of subbands -+ guint8 num_subbands = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_of_subbands, 1, ENC_BIG_ENDIAN); -+ if (num_subbands > 13) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of subbands value [0..13]"); -+ } -+ -+ dissect_array_value(ptvc, pinfo, "Subbands", ett_nfapi_subbands, num_subbands, dissect_codebook_index_value); -+ -+ // UE category capacity -+ guint8 ue_category_capacity_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_ue_category_capacity, 1, ENC_BIG_ENDIAN); -+ if (ue_category_capacity_value > 14) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue category capacity value [0..14]"); -+ } -+ -+ // P-A -+ guint8 pa_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_pa, 1, ENC_BIG_ENDIAN); -+ if (pa_value > 7) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid p-a value [0..7]"); -+ } -+ -+ // Delta power offset index -+ guint8 delta_power_offset_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_delta_power_offset_index, 1, ENC_BIG_ENDIAN); -+ if (delta_power_offset_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta power offset value [0..1]"); -+ } -+ -+ // NGAP -+ guint8 ngap_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_ngap, 1, ENC_BIG_ENDIAN); -+ if (ngap_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ngap value [0..1]"); -+ } -+ -+ // NPRB -+ guint8 nrpb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_nprb, 1, ENC_BIG_ENDIAN); -+ if (nrpb_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nprb value [0..1]"); -+ } -+ -+ // Transmission mode -+ guint8 transmission_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_transmission_mode, 1, ENC_BIG_ENDIAN); -+ if (!(transmission_mode_value >= 1 && transmission_mode_value <= 10)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode value [1..10]"); -+ } -+ -+ // numBfPRBperSubband -+ ptvcursor_add(ptvc, hf_nfapi_num_bf_prb_per_subband, 1, ENC_BIG_ENDIAN); -+ -+ // numBfVector -+ guint8 num_vectors = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_num_bf_vector, 1, ENC_BIG_ENDIAN); -+ -+ dissect_array_value(ptvc, pinfo, "Beamforming Vectors", ett_nfapi_bf_vectors, num_vectors, dissect_bf_vector_type_value); -+} -+static void dissect_csi_rs_resource_config_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint8 csi_rs_resource_config_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_resource_config, 1, ENC_BIG_ENDIAN); -+ if (csi_rs_resource_config_value > 31) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi-rs resource config value [0..31]"); -+ } -+} -+static void dissect_dl_config_request_dlsch_pdu_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint8 nscid_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_nscid, 1, ENC_BIG_ENDIAN); -+ if (nscid_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nscid value [0..1]"); -+ } -+} -+static void dissect_dl_config_request_dlsch_pdu_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // CSI-RS flag -+ guint8 csi_rs_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_flag, 1, ENC_BIG_ENDIAN); -+ if (csi_rs_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi-rs flag value [0..1]"); -+ } -+ -+ // CSI-RS resource config R10 -+ ptvcursor_add(ptvc, hf_nfapi_csi_rs_resource_config_r10, 1, ENC_BIG_ENDIAN); -+ -+ // CSI-RS zero Tx power resource config bitmap R10 -+ ptvcursor_add(ptvc, hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10, 2, ENC_BIG_ENDIAN); -+ -+ // CSI-RS Number of NZP configuration -+ guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_number_of_nzp_configurations, 1, ENC_BIG_ENDIAN); -+ if (count > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi-rs number of nzp configuration value [0..3]"); -+ } -+ -+ // CSI-RS configuration -+ dissect_array_value(ptvc, pinfo, "CSI-RS Resource Configs", ett_nfapi_csi_rs_resource_configs, count, dissect_csi_rs_resource_config_value); -+ -+ // PDSCH start -+ guint8 pdsch_start_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_pdsch_start, 1, ENC_BIG_ENDIAN); -+ if (pdsch_start_value > 4) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch start value [0..4]"); -+ } -+ -+} -+static void dissect_dl_config_request_dlsch_pdu_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // DMRS Config flag -+ guint8 drms_config_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_drms_config_flag, 1, ENC_BIG_ENDIAN); -+ if (drms_config_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms config flag value [0..1]"); -+ } -+ -+ // DMRS-Scrambling -+ guint16 drms_scrambling_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_drms_scrambling, 2, ENC_BIG_ENDIAN); -+ if (drms_scrambling_value > 503) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms scrambling value [0..503]"); -+ } -+ -+ // CSI Config flag -+ guint8 csi_config_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_csi_config_flag, 1, ENC_BIG_ENDIAN); -+ if (csi_config_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi config flag value [0..1]"); -+ } -+ -+ // CSI- Scrambling -+ guint16 csi_scrambling_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_csi_scrambling, 2, ENC_BIG_ENDIAN); -+ if (csi_scrambling_value > 503) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi scrambling value [0..503]"); -+ } -+ -+ // PDSCH RE mapping flag -+ guint8 pdsch_re_mapping_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_pdsch_re_mapping_flag, 1, ENC_BIG_ENDIAN); -+ if (pdsch_re_mapping_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch re mapping flag value [0..1]"); -+ } -+ -+ // PDSCH RE mapping antenna ports -+ guint8 pdsch_re_mapping_antenna_ports_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_pdsch_re_mapping_antenna_ports, 1, ENC_BIG_ENDIAN); -+ if (!(pdsch_re_mapping_antenna_ports_value == 1 || pdsch_re_mapping_antenna_ports_value == 2 || -+ pdsch_re_mapping_antenna_ports_value == 4)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch re mapping antenna ports value [1, 2, 4]"); -+ } -+ -+ // PDSCH RE mapping freq shift -+ guint8 pdsch_re_mapping_freq_shift_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_pdsch_re_mapping_freq_shift, 1, ENC_BIG_ENDIAN); -+ if (pdsch_re_mapping_freq_shift_value > 5) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch re mapping freq shift value [0..5]"); -+ } -+} -+static void dissect_dl_config_request_dlsch_pdu_rel12_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // altCQI-Table-r12 -+ guint8 alt_cqi_table_r12_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_alt_cqi_table_r12, 1, ENC_BIG_ENDIAN); -+ if (alt_cqi_table_r12_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid alt cqi table r12 value [0..1]"); -+ } -+ -+ // MaxLayers -+ guint8 max_layers_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_max_layers, 1, ENC_BIG_ENDIAN); -+ if (!(max_layers_value >= 1 && max_layers_value <= 8)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid max layers value [1..8]"); -+ } -+ -+ ptvcursor_add(ptvc, hf_nfapi_n_dl_harq, 1, ENC_BIG_ENDIAN); -+} -+static void dissect_dl_config_request_dlsch_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // DwPTS Symbols -+ guint8 dwpts_symbols_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_dwpts_symbols, 1, ENC_BIG_ENDIAN); -+ if (!(dwpts_symbols_value == 3 || dwpts_symbols_value == 6 || dwpts_symbols_value == 9 || -+ dwpts_symbols_value == 10 || dwpts_symbols_value == 11 || dwpts_symbols_value == 12 || -+ dwpts_symbols_value == 14)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dwpts symbols value [3, 6, 9, 10, 11, 12, 14]"); -+ } -+ -+ // Initial LBT SF -+ guint8 initial_lbt_sf_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_initial_lbt_sf, 1, ENC_BIG_ENDIAN); -+ if (initial_lbt_sf_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial lbt sf value [0..1]"); -+ } -+ -+ // UE Type -+ guint8 ue_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_ue_type, 1, ENC_BIG_ENDIAN); -+ if (ue_type_value > 2) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue type value [0..2]"); -+ } -+ -+ // PDSCH Payload Type -+ guint8 pdsch_payload_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_pdsch_payload_type, 1, ENC_BIG_ENDIAN); -+ if (pdsch_payload_type_value > 2) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch payload type value [0..2]"); -+ } -+ -+ // Initial transmission SF (io) -+ guint16 initial_transmission_sf_io_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_initial_transmission_sf, 2, ENC_BIG_ENDIAN); -+ if (!(initial_transmission_sf_io_value <= 10239 || initial_transmission_sf_io_value == 0xFFFF)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial transmission sf io value [0..10239, 0xFFFF]"); -+ } -+ -+ // Rel-13-DMRS-tabe flag -+ guint8 rel13_drms_table_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_req13_drms_table_flag, 1, ENC_BIG_ENDIAN); -+ if (rel13_drms_table_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rel13 drms table flag value [0..1]"); -+ } -+} -+static void dissect_dl_config_request_pch_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // Length -+ ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN); -+ -+ // PDU index -+ ptvcursor_add(ptvc, hf_nfapi_pdu_index, 2, ENC_BIG_ENDIAN); -+ -+ // P-RNTI -+ guint16 prnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_prnti, 2, ENC_BIG_ENDIAN); -+ if (prnti_value != 0xFFFE) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prnti value [0xFFFE]"); -+ } -+ -+ // Resource allocation type -+ guint8 resource_allocation_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN); -+ if (!(resource_allocation_type_value == 2 || resource_allocation_type_value == 3 || resource_allocation_type_value == 6)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocate type value [2, 3, 6]"); -+ } -+ -+ // Virtual resource block assignment flag -+ guint8 virtual_resource_block_assignment_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_virtual_resource_block_assignment_flag, 1, ENC_BIG_ENDIAN); -+ if (virtual_resource_block_assignment_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid virtual resource block assignment flag value [0..1]"); -+ } -+ -+ // Resource block coding -+ ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN); -+ -+ // MCS -+ guint8 mcs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_mcs, 1, ENC_BIG_ENDIAN); -+ if (mcs_value != 0) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs value [0]"); -+ } -+ -+ // Redundancy version -+ guint8 redundancy_version_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_redundancy_version, 1, ENC_BIG_ENDIAN); -+ if (redundancy_version_value != 0) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy value [0]"); -+ } -+ -+ // Number of transport blocks -+ guint8 number_of_transport_blocks_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_of_transport_blocks, 1, ENC_BIG_ENDIAN); -+ if (number_of_transport_blocks_value != 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport blocks value [1]"); -+ } -+ -+ // Transport block to codeword swap flag -+ ptvcursor_add(ptvc, hf_nfapi_transport_block_to_codeword_swap_flag, 1, ENC_BIG_ENDIAN); -+ -+ // Transmission scheme -+ guint8 transmission_scheme_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_transmission_scheme, 1, ENC_BIG_ENDIAN); -+ if (!(transmission_scheme_value == 0 || transmission_scheme_value == 1 || transmission_scheme_value == 6)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission schemes value [0, 1, 6]"); -+ } -+ -+ // Number of layers -+ guint8 number_of_layers_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_of_layers, 1, ENC_BIG_ENDIAN); -+ if (!(number_of_layers_value >= 1 && number_of_layers_value <= 4)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of layers value [1..4]"); -+ } -+ -+ // Codebook index -+ ptvcursor_add(ptvc, hf_nfapi_codebook_index, 1, ENC_BIG_ENDIAN); -+ -+ // UE category capacity -+ guint8 ue_category_capacity_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_ue_category_capacity, 1, ENC_BIG_ENDIAN); -+ if (ue_category_capacity_value > 14) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue category capacity value [0..14]"); -+ } -+ -+ // P-A -+ guint8 p_a_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_pa, 1, ENC_BIG_ENDIAN); -+ if (p_a_value > 7) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid p-a value value [0..7]"); -+ } -+ -+ // Transmission power -+ guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); -+ if (transmission_power_value > 10000) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]"); -+ } -+ -+ // NPRB -+ guint8 nprb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_nprb, 1, ENC_BIG_ENDIAN); -+ if (nprb_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nprb value [0..1]"); -+ } -+ -+ // NGAP -+ guint8 ngap_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_ngap, 1, ENC_BIG_ENDIAN); -+ if (ngap_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ngap value [0..1]"); -+ } -+ -+} -+static void dissect_dl_config_request_pch_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // UE mode -+ guint8 ue_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_ue_mode, 1, ENC_BIG_ENDIAN); -+ if (ue_mode_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue mode value [0..1]"); -+ } -+ -+ // Initial transmission SF (io) -+ guint16 initial_transmission_sf_io_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_initial_transmission_sf, 2, ENC_BIG_ENDIAN); -+ if (!(initial_transmission_sf_io_value <= 10239 || initial_transmission_sf_io_value == 0xFFFF)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial transmission sf io value [0..10239, 0xFFFF]"); -+ } -+} -+static void dissect_dl_config_request_prs_pdu_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // Transmission power -+ guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); -+ if (transmission_power_value > 10000) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]"); -+ } -+ -+ // PRS bandwidth -+ guint8 prs_bandwidth_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_prs_bandwidth, 1, ENC_BIG_ENDIAN); -+ if (!(prs_bandwidth_value == 6 || prs_bandwidth_value == 15 || prs_bandwidth_value == 25 || -+ prs_bandwidth_value == 50 || prs_bandwidth_value == 75 || prs_bandwidth_value == 100)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prs bandwidth value [6, 15, 25, 50, 75, 100]"); -+ } -+ -+ // PRS cyclic prefix type -+ guint8 prs_cyclic_prefix_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_prs_cyclic_prefix_type, 1, ENC_BIG_ENDIAN); -+ if (prs_cyclic_prefix_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prs cyclic prefix value [0..1]"); -+ } -+ -+ // PRS muting -+ guint8 prs_muting_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_prs_muting, 1, ENC_BIG_ENDIAN); -+ if (prs_muting_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prs muting value [0..1]"); -+ } -+} -+static void dissect_dl_config_request_csi_rs_pdu_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // CSI-RS antenna port count R10 -+ guint8 csi_rs_antenna_port_count_r10_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_antenna_port_count_r10, 1, ENC_BIG_ENDIAN); -+ if (!(csi_rs_antenna_port_count_r10_value == 1 || csi_rs_antenna_port_count_r10_value == 2 || -+ csi_rs_antenna_port_count_r10_value == 4 || csi_rs_antenna_port_count_r10_value == 8 || -+ csi_rs_antenna_port_count_r10_value == 12 || csi_rs_antenna_port_count_r10_value == 16)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi rs antenna port count r10 value [1, 2, 4, 6, 8, 10]"); -+ } -+ -+ // CSI-RS resource config R10 -+ ptvcursor_add(ptvc, hf_nfapi_csi_rs_resource_config_r10, 1, ENC_BIG_ENDIAN); -+ -+ // Transmission power -+ guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); -+ if (transmission_power_value > 10000) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]"); -+ } -+ -+ // CSI-RS zero Tx power resource config bitmap R10 -+ ptvcursor_add(ptvc, hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10, 2, ENC_BIG_ENDIAN); -+ -+ // CSI-RS Number of NZP configuration -+ guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_number_of_nzp_configurations, 1, ENC_BIG_ENDIAN); -+ if (count > 8) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi-rs number of nzp configuration value [0..8]"); -+ } -+ -+ // CSI-RS configuration -+ dissect_array_value(ptvc, pinfo, "CSI-RS Resource Configs", ett_nfapi_csi_rs_resource_configs, count, dissect_csi_rs_resource_config_value); -+} -+static void dissect_csi_rs_bf_vector_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_resource_index, 1, ENC_BIG_ENDIAN); -+ if (count > 7) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi-rs resource index value [0..7]"); -+ } -+ -+ // todo : how to work out the antenna port count for the bfValue -+} -+static void dissect_dl_config_request_csi_rs_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // Class -+ guint8 class_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_class, 1, ENC_BIG_ENDIAN); -+ if (class_value > 2) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid class value [0..2]"); -+ } -+ -+ // cdmType -+ guint8 cdm_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_cdm_type, 1, ENC_BIG_ENDIAN); -+ if (cdm_type_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cdm type value [0..1]"); -+ } -+ -+ // numBfVector -+ guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_num_bf_vector, 1, ENC_BIG_ENDIAN); -+ if (!((class_value == 1 && count == 0) || (class_value == 2 && count <= 8))) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid num bf vector value [0] or [0..8]"); -+ } -+ -+ dissect_array_value(ptvc, pinfo, "Beamforming Vector", ett_nfapi_csi_rs_bf_vector, count, dissect_csi_rs_bf_vector_value); -+} -+static void dissect_epdcch_prb_index_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // EPDCCH PRB index -+ guint8 epdcch_prb_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_edpcch_prb_index, 1, ENC_BIG_ENDIAN); -+ if (epdcch_prb_index_value > 99) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid epdcch prb_index value [0..99]"); -+ } -+} -+static void dissect_dl_config_request_edpcch_params_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // EPDCCH Resource assignment flag -+ guint8 epdcch_resource_assignment_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_epdcch_resource_assignment_flag, 1, ENC_BIG_ENDIAN); -+ if (epdcch_resource_assignment_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid epdcch resource assignment flag value [0..1]"); -+ } -+ -+ // EPDCCH ID -+ guint16 epdcch_id_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_epdcch_id, 2, ENC_BIG_ENDIAN); -+ if (epdcch_id_value > 503) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid epdcch id value [0..503]"); -+ } -+ -+ // EPDCCH Start Symbol -+ guint8 epdcch_start_symbol_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_epdcch_start_symbol, 1, ENC_BIG_ENDIAN); -+ if (!(epdcch_start_symbol_value >= 1 && epdcch_start_symbol_value <= 4)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid epdcch start symbol value [1..4]"); -+ } -+ -+ // EPDCCH NumPRB -+ guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_epdcch_num_prb, 1, ENC_BIG_ENDIAN); -+ if (!(count == 2 || count == 4 || count == 8)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid epdcch num prb value [2, 4, 8]"); -+ } -+ -+ dissect_array_value(ptvc, pinfo, "PRBs", ett_nfapi_epdcch_prbs, count, dissect_epdcch_prb_index_value); -+ -+ dissect_bf_vector_type_value(ptvc, pinfo); -+} -+static void dissect_dl_config_request_edpcch_params_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // DwPTS Symbols -+ guint8 dwtps_symbols_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_initial_lbt_sf, 1, ENC_BIG_ENDIAN); -+ if (!(dwtps_symbols_value == 3 || dwtps_symbols_value == 6 || dwtps_symbols_value == 9 || -+ dwtps_symbols_value == 10 || dwtps_symbols_value == 11 || dwtps_symbols_value == 12 || -+ dwtps_symbols_value == 14)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dwpts symbols value [3, 6, 9, 10, 11, 12, 14]"); -+ } -+ -+ // Initial LBT SF -+ guint8 initial_lbt_sf_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_dwpts_symbols, 1, ENC_BIG_ENDIAN); -+ if (initial_lbt_sf_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial lbt sf value [0..1]"); -+ } -+ -+} -+static void dissect_precoding_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ ptvcursor_add(ptvc, hf_nfapi_precoding_value, 2, ENC_BIG_ENDIAN); -+} -+static void dissect_dl_config_request_mpdpcch_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // MPDCCH Narrowband -+ guint8 mpdcch_narrowband_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_mpdcch_narrowband, 1, ENC_BIG_ENDIAN); -+ if (mpdcch_narrowband_value > 15) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mpdcch narrowband value [0..15]"); -+ } -+ -+ // Number of PRB pairs -+ guint8 number_of_prb_pair_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_of_prb_pairs, 1, ENC_BIG_ENDIAN); -+ if (!(number_of_prb_pair_value == 2 || number_of_prb_pair_value == 4 || number_of_prb_pair_value == 6)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of prb pair value [2, 4, 6]"); -+ } -+ -+ // Resource Block Assignment -+ guint8 resource_block_assignment_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_resource_block_assignment, 1, ENC_BIG_ENDIAN); -+ if (resource_block_assignment_value > 14) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block assignment value [0..14]"); -+ } -+ -+ // MPDCCH transmission type -+ guint8 mpdcch_transmission_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_mpdcch_transmission_type, 1, ENC_BIG_ENDIAN); -+ if (mpdcch_transmission_type_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mpdcch transmission type value [0..1]"); -+ } -+ -+ // Start symbol -+ guint8 start_symbol_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_start_symbol, 1, ENC_BIG_ENDIAN); -+ if (!(start_symbol_value >= 1 && start_symbol_value <=4)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid start symbol value [1..4]"); -+ } -+ -+ // ECCE index -+ guint8 ecce_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_ecce_index, 1, ENC_BIG_ENDIAN); -+ if (ecce_index_value > 22) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ecce index value [0..22]"); -+ } -+ -+ // Aggregation level -+ guint8 aggregation_level_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_aggregation_level, 1, ENC_BIG_ENDIAN); -+ if (!(aggregation_level_value == 2 || aggregation_level_value == 4 || aggregation_level_value == 8 || -+ aggregation_level_value == 16 || aggregation_level_value == 24)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid aggregation level value [2, 4, 8, 16, 24]"); -+ } -+ -+ // RNTI type -+ guint8 rnti_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_mpdcch_rnti_type, 1, ENC_BIG_ENDIAN); -+ if (rnti_type_value > 4) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti type value [0..4]"); -+ } -+ -+ // RNTI -+ guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); -+ if (!(rnti_value >= 1)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]"); -+ } -+ -+ // CEMode -+ guint8 cemode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_ce_mode, 1, ENC_BIG_ENDIAN); -+ if (!(cemode_value >= 1 && cemode_value <= 2)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cemode value [1..2]"); -+ } -+ -+ // DMRS scrambling init -+ guint16 drms_scrambling_init_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_drms_scrabmling_init, 2, ENC_BIG_ENDIAN); -+ if (drms_scrambling_init_value > 503) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms scrambling init value [0..503]"); -+ } -+ -+ // Initial transmission SF (io) -+ guint16 initial_transmission_sf_io_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_initial_transmission_sf, 2, ENC_BIG_ENDIAN); -+ if (!(initial_transmission_sf_io_value <= 10239 || initial_transmission_sf_io_value == 0xFFFF)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial transmission sf io value [0..10239, 0xFFFF]"); -+ } -+ -+ // Transmission power -+ guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); -+ if (transmission_power_value > 10000) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]"); -+ } -+ -+ // DCI format -+ guint8 dci_format_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_dl_dci_format, 1, ENC_BIG_ENDIAN); -+ if (!(dci_format_value == 10 || dci_format_value == 11 || dci_format_value == 12)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci format value [10, 11, 12]"); -+ } -+ -+ // Resource block coding -+ ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 2, ENC_BIG_ENDIAN); -+ -+ // MCS -+ guint8 mcs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_mcs, 1, ENC_BIG_ENDIAN); -+ if (mcs_value > 15) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..15]"); -+ } -+ -+ // PDSCH repetition levels -+ guint8 pdsch_repetition_levels_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_pdsch_reception_levels, 1, ENC_BIG_ENDIAN); -+ if (!(pdsch_repetition_levels_value >= 1 && pdsch_repetition_levels_value <= 8)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch repetition levels value [1..8]"); -+ } -+ -+ // Redundancy version -+ guint8 redundancy_version_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_redundancy_version, 1, ENC_BIG_ENDIAN); -+ if (redundancy_version_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy version value [0..3]"); -+ } -+ -+ // New data indicator -+ guint8 new_data_indicator_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_new_data_indicator, 1, ENC_BIG_ENDIAN); -+ if (new_data_indicator_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indicator value [0..1]"); -+ } -+ -+ // HARQ process -+ guint8 harq_process_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_harq_process, 1, ENC_BIG_ENDIAN); -+ if (harq_process_value > 15) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq process value [0..15]"); -+ } -+ -+ // TPMI length -+ guint8 tpmi_length_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_tpmi_length, 1, ENC_BIG_ENDIAN); -+ if (!(tpmi_length_value == 0 || tpmi_length_value == 2 || tpmi_length_value == 4)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi length value [0, 2, 4]"); -+ } -+ -+ // TPMI -+ guint8 tpmi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_tpmi, 1, ENC_BIG_ENDIAN); -+ if (tpmi_value > 15) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi value [0..15]"); -+ } -+ -+ // PMI flag -+ guint8 pmi_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_pmi_flag, 1, ENC_BIG_ENDIAN); -+ if (pmi_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pmi flag value [0..1]"); -+ } -+ -+ // PMI -+ guint8 pmi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_pmi, 1, ENC_BIG_ENDIAN); -+ if (pmi_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pmi value [0..1]"); -+ } -+ -+ // HARQ resource offset -+ guint8 harq_resource_offset_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_harq_resource_offset, 1, ENC_BIG_ENDIAN); -+ if (harq_resource_offset_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq resource offset value [0..3]"); -+ } -+ -+ // DCI subframe repetition number -+ guint8 dci_subframe_reptition_number_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_dci_subframe_repetition_number, 1, ENC_BIG_ENDIAN); -+ if (!(dci_subframe_reptition_number_value >= 1 && dci_subframe_reptition_number_value <= 4)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci subframe repetition number value [1..4]"); -+ } -+ -+ // TPC -+ guint8 tpc_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_tpc, 1, ENC_BIG_ENDIAN); -+ if (tpc_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpc value [0..3]"); -+ } -+ -+ // Downlink assignment index Length -+ guint8 downlink_assignment_index_length_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_downlink_assignment_index_length, 1, ENC_BIG_ENDIAN); -+ if (!(downlink_assignment_index_length_value == 0 || downlink_assignment_index_length_value == 2 || -+ downlink_assignment_index_length_value == 4)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink assignmnet index value [0, 2, 4]"); -+ } -+ -+ // Downlink assignment index -+ guint8 downlink_assignment_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_downlink_assignment_index, 1, ENC_BIG_ENDIAN); -+ if (downlink_assignment_index_value > 15) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink assignment index value [0..15]"); -+ } -+ -+ // Allocate PRACH flag -+ guint8 allocate_prach_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_allocate_prach_flag, 1, ENC_BIG_ENDIAN); -+ if (allocate_prach_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid allocate prach flag value [0..1]"); -+ } -+ -+ // Preamble index -+ guint8 preamble_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_preamble_index, 1, ENC_BIG_ENDIAN); -+ if (preamble_index_value > 63) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid preamble index value [0..63]"); -+ } -+ -+ // PRACH mask index -+ guint8 prach_mask_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_prach_mask_index, 1, ENC_BIG_ENDIAN); -+ if (prach_mask_value > 15) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach mask index value [0..15]"); -+ } -+ -+ // Starting CE Level -+ guint8 starting_ce_level_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_starting_ce_level, 1, ENC_BIG_ENDIAN); -+ if (starting_ce_level_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid starting ce level value [0..3]"); -+ } -+ -+ // SRS request -+ guint8 srs_request_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_srs_request, 1, ENC_BIG_ENDIAN); -+ if (srs_request_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs request value [0..1]"); -+ } -+ -+ // Antenna ports and scrambling identity flag -+ guint8 antenna_ports_and_scrambling_identity_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_antenna_ports_and_scrambling_identity_flag, 1, ENC_BIG_ENDIAN); -+ if (antenna_ports_and_scrambling_identity_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid antenna ports and scrambling identity flag value [0..1]"); -+ } -+ -+ // Antenna ports and scrambling identity -+ guint8 antenna_ports_and_scrambling_identity_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_antenna_ports_and_scrambling_identity, 1, ENC_BIG_ENDIAN); -+ if (antenna_ports_and_scrambling_identity_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid antenna ports and scrambling identity value [0..3]"); -+ } -+ -+ // Frequency hopping enabled flag -+ guint8 frequency_hopping_enabled_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_frequency_hopping_enabled_flag, 1, ENC_BIG_ENDIAN); -+ if (frequency_hopping_enabled_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping enabled flag value [0..1]"); -+ } -+ -+ // Paging/Direct indication differentiation flag -+ guint8 paging_direct_indicaton_differentiation_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_paging_direct_indication_differentiation_flag, 1, ENC_BIG_ENDIAN); -+ if (paging_direct_indicaton_differentiation_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid paging/direct indication differentiation flag value [0..1]"); -+ } -+ -+ // Direct indication -+ ptvcursor_add(ptvc, hf_nfapi_direct_indication, 1, ENC_BIG_ENDIAN); -+ -+ // Total DCI length including padding -+ item = ptvcursor_add(ptvc, hf_nfapi_total_dci_length_including_padding, 1, ENC_BIG_ENDIAN); -+ -+ // Number of TX Antenna ports -+ guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_of_tx_antenna_ports, 1, ENC_BIG_ENDIAN); -+ -+ dissect_array_value(ptvc, pinfo, "Precoding", ett_nfapi_precoding, count, dissect_precoding_value); -+} -+static void dissect_ul_config_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // PDU Type -+ guint8 ul_pdu_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_ul_config_pdu_type, 1, ENC_BIG_ENDIAN); -+ if (ul_pdu_type_value > 15) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul pdu type value [0..15]"); -+ } -+ -+ guint8 size = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_pdu_size, 1, ENC_BIG_ENDIAN); -+ -+ guint pdu_end = (ptvcursor_current_offset(ptvc) + size - 2); -+ dissect_tlv_list(ptvc, pinfo, pdu_end); -+} -+static void dissect_ul_config_request_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // Number of PDUs -+ guint8 num_pdu = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_pdus, 1, ENC_BIG_ENDIAN); -+ -+ // RACH/PRACH frequency resources -+ guint8 rach_prach_frequency_resources_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_rach_prach_frequency_resources, 1, ENC_BIG_ENDIAN); -+ if (rach_prach_frequency_resources_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rach prach frequency resources value [0..1]"); -+ } -+ -+ // SRS present -+ guint8 srs_present_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_srs_present, 1, ENC_BIG_ENDIAN); -+ if (srs_present_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs present value [0..1]"); -+ } -+ -+ dissect_array_value(ptvc, pinfo, "UL Config PDU List", ett_nfapi_ul_config_request_pdu_list, num_pdu, dissect_ul_config_pdu); -+} -+static void dissect_ul_config_ulsch_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // Handle -+ ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN); -+ -+ // Size -+ ptvcursor_add(ptvc, hf_nfapi_size, 2, ENC_BIG_ENDIAN); -+ -+ // RNTI -+ guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); -+ if (!(rnti_value >= 1)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]"); -+ } -+ -+ // Resource block start -+ guint8 resource_block_start_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_resource_block_start, 1, ENC_BIG_ENDIAN); -+ if (resource_block_start_value > 99) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block start value [0..99]"); -+ } -+ -+ // Number of resource blocks -+ guint8 number_of_resource_blocks_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_of_resource_blocks, 1, ENC_BIG_ENDIAN); -+ if (!(number_of_resource_blocks_value >= 1 && number_of_resource_blocks_value <= 100)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of resource blocks value [1..100]"); -+ } -+ -+ // Modulation type -+ guint8 modulation_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_modulation, 1, ENC_BIG_ENDIAN); -+ if (!(modulation_type_value == 2 || modulation_type_value == 4 || modulation_type_value == 6)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid modulation type value [2, 4, 6]"); -+ } -+ -+ // Cyclic Shift 2 for DMRS -+ guint8 cyclic_shift_2_for_drms_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_cyclic_shift_2_for_drms, 1, ENC_BIG_ENDIAN); -+ if (cyclic_shift_2_for_drms_value > 99) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cyclic shift 2 for drms value [0..7]"); -+ } -+ -+ // Frequency hopping enabled flag -+ guint8 frequency_hopping_enabled_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_frequency_hopping_enabled_flag, 1, ENC_BIG_ENDIAN); -+ if (frequency_hopping_enabled_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping enabled flag value [0..1]"); -+ } -+ -+ // Frequency hopping bits -+ guint8 frequency_hopping_bits_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_frequency_hopping_bits, 1, ENC_BIG_ENDIAN); -+ if (frequency_hopping_bits_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping bits value [0..3]"); -+ } -+ -+ // New data indication -+ guint8 new_data_indication_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_new_data_indication, 1, ENC_BIG_ENDIAN); -+ if (new_data_indication_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indicator value [0..1]"); -+ } -+ -+ // Redundancy version -+ guint8 redundancy_version_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_redundancy_version, 1, ENC_BIG_ENDIAN); -+ if (redundancy_version_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy version value [0..3]"); -+ } -+ -+ // HARQ process number -+ guint8 harq_process_number_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_harq_process_number, 1, ENC_BIG_ENDIAN); -+ if (harq_process_number_value > 15) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq process number value [0..15]"); -+ } -+ -+ // UL Tx mode -+ guint8 ul_tx_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_ul_tx_mode, 1, ENC_BIG_ENDIAN); -+ if (ul_tx_mode_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul tx mode value [0..1]"); -+ } -+ -+ // Current TX NB -+ ptvcursor_add(ptvc, hf_nfapi_current_tx_nb, 1, ENC_BIG_ENDIAN); -+ -+ // N srs -+ guint8 n_srs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_n_srs, 1, ENC_BIG_ENDIAN); -+ if (n_srs_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n_srs value [0..1]"); -+ } -+} -+static void dissect_ul_config_ulsch_pdu_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // Resource allocation type -+ guint8 resource_allocation_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN); -+ if (resource_allocation_type_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocation type value [0..1]"); -+ } -+ -+ // Resource block coding -+ ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN); -+ -+ // Transport blocks -+ guint8 transport_blocks_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_transport_blocks, 1, ENC_BIG_ENDIAN); -+ if (!(transport_blocks_value >= 1 && transport_blocks_value <= 2)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport blocks value [1..2]"); -+ } -+ -+ // Transmission scheme -+ guint8 transmission_scheme_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_ul_transmission_scheme, 1, ENC_BIG_ENDIAN); -+ if (transmission_scheme_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission scheme value [0..1]"); -+ } -+ -+ // Number Of layers -+ guint8 number_of_layers_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_of_layers, 1, ENC_BIG_ENDIAN); -+ if (!(number_of_layers_value >= 1 && number_of_layers_value <=4 )) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of layers value [1..4]"); -+ } -+ -+ // Codebook Index -+ guint8 codebook_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_codebook_index, 1, ENC_BIG_ENDIAN); -+ if (codebook_index_value > 23) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid codebook index value [0..23]"); -+ } -+ -+ // Disable sequence hopping flag -+ guint8 disable_sequence_hopping_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_disable_sequence_hopping_flag, 1, ENC_BIG_ENDIAN); -+ if (disable_sequence_hopping_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid disable sequence hopping flag value [0..1]"); -+ } -+} -+static void dissect_ul_config_ulsch_pdu_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // Virtual cell ID enabled flag -+ guint8 virtual_cell_id_enabled_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_virtual_cell_id_enabled_flag, 1, ENC_BIG_ENDIAN); -+ if (virtual_cell_id_enabled_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid virtual cell id enabled flag value [0..1]"); -+ } -+ -+ // nPUSCH Identity -+ guint16 npusch_identity_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_npusch_identity, 2, ENC_BIG_ENDIAN); -+ if (npusch_identity_value > 509) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npusch identity value [0..509]"); -+ } -+ -+ // DMRS Config flag -+ guint8 drms_config_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_drms_config_flag, 1, ENC_BIG_ENDIAN); -+ if (drms_config_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms config flag value [0..1]"); -+ } -+ -+ // nDMRS-CSH Identity -+ guint16 ndrms_csh_identity_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_ndrms_csh_identity, 2, ENC_BIG_ENDIAN); -+ if (ndrms_csh_identity_value > 509) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ndrms-csh identity value [0..509]"); -+ } -+ -+} -+static void dissect_ul_config_ulsch_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // UE Type -+ guint8 ue_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_ue_type, 1, ENC_BIG_ENDIAN); -+ if (ue_type_value > 2) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue type value [0..2]"); -+ } -+ -+ // Total Number of repetitions -+ guint16 total_number_of_repetitions_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_total_number_of_repetitions, 2, ENC_BIG_ENDIAN); -+ if (!(total_number_of_repetitions_value >= 1 && total_number_of_repetitions_value <= 2048)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid total number of repetitions value [1..2048]"); -+ } -+ -+ // Repetition Number -+ guint16 repetition_number_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_repetition_number, 2, ENC_BIG_ENDIAN); -+ if (!(repetition_number_value >= 1 && repetition_number_value <= 2048)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid repetition number value [1..2048]"); -+ } -+ -+ // Initial transmission SF (io) -+ guint16 intial_transmission_sf_io_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_initial_sf_io, 2, ENC_BIG_ENDIAN); -+ if (!(intial_transmission_sf_io_value <= 10239 || intial_transmission_sf_io_value == 0xFFFF)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid repetition number value [0..10239, 0xFFFF]"); -+ } -+ -+ // Empy symbols due to re-tunning -+ // todo : decode as a bitmap -+ ptvcursor_add(ptvc, hf_nfapi_empty_symbols_due_to_retunning, 1, ENC_BIG_ENDIAN); -+} -+static void dissect_ul_config_init_tx_params_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // N srs initial -+ guint8 n_srs_initial_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_n_srs_initial, 1, ENC_BIG_ENDIAN); -+ if (n_srs_initial_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n srs initial value [0..1]"); -+ } -+ -+ // Initial number of resource blocks -+ guint8 initial_number_of_resource_blocks_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_initial_number_of_resource_blocks, 1, ENC_BIG_ENDIAN); -+ if (!(initial_number_of_resource_blocks_value >= 1 && initial_number_of_resource_blocks_value <= 100)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial number of reosurce blocks value [1..100]"); -+ } -+ -+} -+static void dissect_ul_config_cqi_ri_info_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // DL CQI/PMI Size Rank = 1 -+ ptvcursor_add(ptvc, hf_nfapi_dl_cqi_pmi_size_rank_1, 1, ENC_BIG_ENDIAN); -+ -+ // DL CQI/PMI Size Rank>1 -+ ptvcursor_add(ptvc, hf_nfapi_dl_cqi_pmi_size_rank_greater_1, 1, ENC_BIG_ENDIAN); -+ -+ // RI Size -+ guint8 ri_size_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_ri_size, 1, ENC_BIG_ENDIAN); -+ if (ri_size_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ri size value [0..3]"); -+ } -+ -+ // Delta Offset CQI -+ guint8 delta_offset_cqi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_delta_offset_cqi, 1, ENC_BIG_ENDIAN); -+ if (delta_offset_cqi_value > 15) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset cqi value [0..15]"); -+ } -+ -+ // Delta Offset RI -+ guint8 delta_offset_ri_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_delta_offset_ri, 1, ENC_BIG_ENDIAN); -+ if (delta_offset_ri_value > 15) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset ri value [0..15]"); -+ } -+} -+static void dissect_ul_cqi_pmi_size(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // Delta Offset RI -+ guint8 dl_cqi_pmi_size_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_delta_offset_ri, 1, ENC_BIG_ENDIAN); -+ if (dl_cqi_pmi_size_value > 255) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset ri value [0..255]"); -+ } -+} -+ -+static void dissect_ul_config_cqi_ri_info_rel9_later_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ // Report type -+ guint8 type = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_report_type, 1, ENC_BIG_ENDIAN); -+ if (type > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid report type value [0..1]"); -+ } -+ -+ // Delta offset CQI -+ guint8 delta_offset_cqi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_delta_offset_cqi, 1, ENC_BIG_ENDIAN); -+ if (delta_offset_cqi_value > 15) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset cqi value [0..15]"); -+ } -+ -+ // Delta offset RI -+ guint8 delta_offset_ri_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_delta_offset_ri, 1, ENC_BIG_ENDIAN); -+ if (delta_offset_ri_value > 15) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset ri value [0..15]"); -+ } -+ -+ switch (type) -+ { -+ case 0: -+ { -+ // DL CQI/PMI/RI size -+ ptvcursor_add(ptvc, hf_nfapi_dl_cqi_ri_pmi_size, 1, ENC_BIG_ENDIAN); -+ -+ // Control Type -+ guint8 control_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_control_type, 1, ENC_BIG_ENDIAN); -+ if (control_type_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid control type value [0..1]"); -+ } -+ break; -+ } -+ case 1: -+ { -+ // todo : encoder not right for this case. -+ gint8 num_cc_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_cc, 1, ENC_BIG_ENDIAN); -+ -+ if (!(num_cc_value >= 1 && num_cc_value <= 32)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of cc value [1..32]"); -+ } -+ -+ // UL CONFIG CQI PMI SIZE -+ dissect_array_value(ptvc, pinfo, "CQI PMI SIZE", ett_nfapi_cqi_pmi_size, 8, dissect_ul_cqi_pmi_size); -+ -+ /* -+ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "CCs"); -+ -+ for (int i = 0; i < num_cc; ++i) -+ { -+ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "[%d]", i); -+ -+ guint8 ri_size = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_ri_size, 1, ENC_BIG_ENDIAN); -+ -+ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "Rank"); -+ -+ for (int j = 0; j < ri_size; ++j) -+ { -+ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "[%d]", j); -+ ptvcursor_add(ptvc, hf_nfapi_dl_cqi_pmi_size, 1, ENC_BIG_ENDIAN); -+ ptvcursor_pop_subtree(ptvc); -+ } -+ -+ ptvcursor_pop_subtree(ptvc); -+ -+ ptvcursor_pop_subtree(ptvc); -+ } -+ -+ ptvcursor_pop_subtree(ptvc); -+ */ -+ -+ break; -+ } -+ } -+} -+static void dissect_ul_config_cqi_ri_info_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // DL CQI/PMI/RI size 2 -+ guint16 dl_cqi_ri_pmi_size_2_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_dl_cqi_ri_pmi_size_2, 2, ENC_BIG_ENDIAN); -+ if (dl_cqi_ri_pmi_size_2_value < 255) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dl cqi ri pmi size 2 value [>= 255]"); -+ } -+} -+static void dissect_ul_config_harq_info_ulsch_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // HARQ Size -+ guint8 harq_size_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_harq_size, 1, ENC_BIG_ENDIAN); -+ if (harq_size_value > 21) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq size value [0..21]"); -+ } -+ -+ // Delta Offset HARQ -+ guint8 delta_offset_harq_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_delta_offset_harq, 1, ENC_BIG_ENDIAN); -+ if (delta_offset_harq_value > 15) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset harq value [0..15]"); -+ } -+ -+ // ACK_NACK mode -+ guint8 ack_nack_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_tdd_ack_nack_mode, 1, ENC_BIG_ENDIAN); -+ if (ack_nack_mode_value > 5) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ack nack mode value [0..5]"); -+ } -+} -+static void dissect_ul_config_harq_info_ulsch_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // HARQ Size 2 -+ ptvcursor_add(ptvc, hf_nfapi_harq_size_2, 2, ENC_BIG_ENDIAN); -+ -+ // Delta Offset HARQ 2 -+ guint8 delta_offset_harq_2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_delta_offset_harq_2, 1, ENC_BIG_ENDIAN); -+ if (delta_offset_harq_2_value > 15) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset harq 2 value [0..15]"); -+ } -+} -+static void dissect_ul_config_ue_info_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Handle -+ ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN); -+ -+ // RNTI -+ guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); -+ if (rnti_value < 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]"); -+ } -+} -+static void dissect_ul_config_ue_info_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // Virtual cell ID enabled flag -+ guint8 virtual_cell_id_enabled_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_virtual_cell_id_enabled_flag, 1, ENC_BIG_ENDIAN); -+ if (virtual_cell_id_enabled_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid virtual cell id enabled flag value [0..1]"); -+ } -+ -+ // nPUCCH Identity -+ guint16 npucch_identity_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_npucch_identity, 2, ENC_BIG_ENDIAN); -+ if (npucch_identity_value > 503) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch identity value [0..503]"); -+ } -+ -+} -+static void dissect_ul_config_ue_info_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // UE Type -+ guint8 ue_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_ue_type, 1, ENC_BIG_ENDIAN); -+ if (ue_type_value > 2) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue type value [0..2]"); -+ } -+ -+ // Empty symbols -+ // todo : use bit map decoding -+ ptvcursor_add(ptvc, hf_nfapi_empty_symbols, 1, ENC_BIG_ENDIAN); -+ -+ // Total Number of repetitions -+ guint16 total_number_of_repetitions_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_total_number_of_repetitions, 2, ENC_BIG_ENDIAN); -+ if (!(total_number_of_repetitions_value >= 1 && total_number_of_repetitions_value <= 32)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid total number of repetitions value [1..32]"); -+ } -+ -+ // Repetition Number -+ guint16 repetition_number_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_repetition_number, 2, ENC_BIG_ENDIAN); -+ if (!(repetition_number_value >= 1 && repetition_number_value <= 32)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid repetition number value [1..32]"); -+ } -+ -+} -+static void dissect_ul_config_cqi_info_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // PUCCH index -+ guint16 pucch_index_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_pucch_index, 2, ENC_BIG_ENDIAN); -+ if (pucch_index_value > 1184) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch index value [0..1184]"); -+ } -+ -+ // DL CQI/PMI Size -+ ptvcursor_add(ptvc, hf_nfapi_dl_cqi_pmi_size, 1, ENC_BIG_ENDIAN); -+} -+static void dissect_ul_config_cqi_info_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // Number of PUCCH Resources -+ guint8 number_of_pucch_resources_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_of_pucch_resource, 1, ENC_BIG_ENDIAN); -+ if (!(number_of_pucch_resources_value >= 1 && number_of_pucch_resources_value <= 2)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pucch resources value [1..2]"); -+ } -+ -+ //PUCCH Index P1 -+ guint16 pucch_index_p1_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_pucch_index_p1, 2, ENC_BIG_ENDIAN); -+ if (pucch_index_p1_value > 1184) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch index p1 value [0..1184]"); -+ } -+} -+static void dissect_ul_config_cqi_info_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // CSI_mode -+ guint8 csi_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_csi_mode, 1, ENC_BIG_ENDIAN); -+ if (csi_mode_value > 2) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi mode value [0..2]"); -+ } -+ -+ // DL CQI/PMI Size 2 -+ ptvcursor_add(ptvc, hf_nfapi_dl_cqi_pmi_size_2, 2, ENC_BIG_ENDIAN); -+ -+ // Starting PRB -+ guint8 starting_prb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_statring_prb, 1, ENC_BIG_ENDIAN); -+ if (starting_prb_value > 109) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid starting prb value [0..109]"); -+ } -+ -+ // n_PRB -+ guint8 n_prb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_nprb, 1, ENC_BIG_ENDIAN); -+ if (n_prb_value > 7) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n prb value [0..7]"); -+ } -+ -+ // cdm_Index -+ guint8 cdm_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_cdm_index, 1, ENC_BIG_ENDIAN); -+ if (cdm_index_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cdm index value [0..1]"); -+ } -+ -+ // N srs -+ guint8 n_srs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_nsrs, 1, ENC_BIG_ENDIAN); -+ if (n_srs_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n srs value [0..1]"); -+ } -+ -+} -+static void dissect_ul_config_sr_info_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 pucch_index_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pucch_index, 2, ENC_BIG_ENDIAN); -+ if (pucch_index_value > 2047) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch index value [0..2047]"); -+ } -+} -+static void dissect_ul_config_sr_info_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // Number of PUCCH Resources -+ guint8 number_of_pucch_resources_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_of_pucch_resource, 1, ENC_BIG_ENDIAN); -+ if (!(number_of_pucch_resources_value >= 1 && number_of_pucch_resources_value <= 2)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pucch resources value [0..2047]"); -+ } -+ -+ // PUCCH Index P1 -+ guint16 pucch_index_p1_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_pucch_index_p1, 2, ENC_BIG_ENDIAN); -+ if (pucch_index_p1_value > 2047) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch index p1 value [0..2047]"); -+ } -+} -+static void dissect_ul_config_harq_info_uci_rel10_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // HARQ size -+ guint8 harq_size_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_harq_size, 1, ENC_BIG_ENDIAN); -+ if (harq_size_value > 21) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq size value [0..21]"); -+ } -+ -+ // ACK_NACK mode -+ guint8 ack_nack_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_tdd_ack_nack_mode, 1, ENC_BIG_ENDIAN); -+ if (ack_nack_mode_value > 5) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ack nack mode value [0..5]"); -+ } -+ -+ // Number of PUCCH resources -+ guint8 number_of_pucch_resources_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_of_pucch_resource, 1, ENC_BIG_ENDIAN); -+ if (number_of_pucch_resources_value > 4) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pucch resources value [0..4]"); -+ } -+ -+ // n_PUCCH_1_0 -+ guint16 npucch_1_0_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_0, 2, ENC_BIG_ENDIAN); -+ if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1 || ack_nack_mode_value == 2) -+ { -+ if (npucch_1_0_value > 2047) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 0 value [0..2047] (All Format 1a/1b)"); -+ } -+ } -+ else if (ack_nack_mode_value == 3) -+ { -+ if (npucch_1_0_value > 549) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 0 value [0..549] (Format 3)"); -+ } -+ } -+ -+ // n_PUCCH_1_1 -+ guint16 npucch_1_1_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_1, 2, ENC_BIG_ENDIAN); -+ if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1 || ack_nack_mode_value == 2) -+ { -+ if (npucch_1_1_value > 2047) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 1 value [0..2047] (All Format 1a/1b)"); -+ } -+ } -+ -+ // n_PUCCH_1_2 -+ guint16 npucch_1_2_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_2, 2, ENC_BIG_ENDIAN); -+ if (ack_nack_mode_value == 2) -+ { -+ if (npucch_1_2_value > 2047) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 2 value [0..2047] (All Format 1a/1b)"); -+ } -+ } -+ -+ // n_PUCCH_1_3 -+ guint16 npucch_1_3_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_3, 2, ENC_BIG_ENDIAN); -+ if (ack_nack_mode_value == 2) -+ { -+ if (npucch_1_3_value > 2047) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 3 value [0..2047] (All Format 1a/1b)"); -+ } -+ } -+} -+static void dissect_ul_config_harq_info_uci_rel8_fdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // n_PUCCH_1_0 -+ // todo : how to work out the ack_nack mode? -+ guint16 npucch_1_0_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_0, 2, ENC_BIG_ENDIAN); -+ if (npucch_1_0_value > 2047) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 0 value [0..2047]"); -+ } -+ -+ // HARQ Size -+ guint8 harq_size_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_harq_size, 1, ENC_BIG_ENDIAN); -+ if (!(harq_size_value >= 1 && harq_size_value <= 2)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq size value [1..2]"); -+ } -+} -+static void dissect_ul_config_harq_info_uci_rel9_later_fdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // HARQ Size -+ guint8 harq_size_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* harq_size_item = ptvcursor_add(ptvc, hf_nfapi_harq_size, 1, ENC_BIG_ENDIAN); -+ -+ // ACK_NAK mode -+ guint8 ack_nack_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_fdd_ack_nack_mode, 1, ENC_BIG_ENDIAN); -+ if (ack_nack_mode_value > 4) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ack nack mode value [0..4]"); -+ } -+ -+ if (ack_nack_mode_value == 0 || ack_nack_mode_value == 2) -+ { -+ if (!(harq_size_value >= 1 && harq_size_value <= 10)) -+ { -+ expert_add_info_format(pinfo, harq_size_item, &ei_invalid_range, "Invalid harq size value [1..10] (Format 1a/1b/3)"); -+ } -+ } -+ else if (ack_nack_mode_value == 3 || ack_nack_mode_value == 4) -+ { -+ if (harq_size_value != 0) -+ { -+ expert_add_info_format(pinfo, harq_size_item, &ei_invalid_range, "Invalid harq size value [0] (Format 4/5)"); -+ } -+ } -+ -+ // Number of PUCCH Resources -+ guint8 number_of_pucch_resources_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_of_pucch_resource, 1, ENC_BIG_ENDIAN); -+ if (number_of_pucch_resources_value == 0 || number_of_pucch_resources_value == 2) -+ { -+ if (!(number_of_pucch_resources_value >= 1 && number_of_pucch_resources_value <= 4)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq size value [1..4] (Format 1a/1b/3)"); -+ } -+ } -+ else if (number_of_pucch_resources_value == 3 || number_of_pucch_resources_value == 4) -+ { -+ if (number_of_pucch_resources_value != 0) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq size value [0] (Format 4/5)"); -+ } -+ } -+ -+ // n_PUCCH_1_0 -+ guint16 npucch_1_0_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_0, 2, ENC_BIG_ENDIAN); -+ if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1) -+ { -+ if (npucch_1_0_value > 2047) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 1 0 value [0..2047] (Format 1a/1b/channel selection)"); -+ } -+ } -+ else if (ack_nack_mode_value == 2) -+ { -+ if (npucch_1_0_value > 549) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 1 0 value [0..549] (Format 3)"); -+ } -+ } -+ -+ // n_PUCCH_1_1 -+ guint16 npucch_1_1_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_1, 2, ENC_BIG_ENDIAN); -+ if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1) -+ { -+ if (npucch_1_1_value > 2047) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 1 1 value [0..2047] (Format 1a/1b/channel selection)"); -+ } -+ } -+ -+ // n_PUCCH_1_2 -+ guint16 npucch_1_2_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_2, 2, ENC_BIG_ENDIAN); -+ if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1) -+ { -+ if (npucch_1_2_value > 2047) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 1 2 value [0..2047] (Format 1a/1b/channel selection)"); -+ } -+ } -+ -+ // n_PUCCH_1_3 -+ guint16 npucch_1_3_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_3, 2, ENC_BIG_ENDIAN); -+ if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1) -+ { -+ if (npucch_1_3_value > 2047) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 1 3 value [0..2047] (Format 1a/1b/channel selection)"); -+ } -+ } -+} -+static void dissect_ul_config_harq_info_uci_rel11_fdd_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // Num_ant_ports -+ guint8 num_ant_ports_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_num_ant_ports, 1, ENC_BIG_ENDIAN); -+ if (!(num_ant_ports_value >= 1 && num_ant_ports_value <= 2)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid num ant ports value [1..2]"); -+ } -+ -+ // n_PUCCH_2_0 -+ // todo : how to work out the ack nack mode -+ guint16 npucch_2_0_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_2_0, 2, ENC_BIG_ENDIAN); -+ if (npucch_2_0_value > 2047) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 2 0 value [0..2047]"); -+ } -+ -+ // n_PUCCH_2_1 -+ guint16 npucch_2_1_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_2_1, 2, ENC_BIG_ENDIAN); -+ if (npucch_2_1_value > 2047) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 2 1 value [0..2047]"); -+ } -+ -+ // n_PUCCH_2_2 -+ guint16 npucch_2_2_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_2_2, 2, ENC_BIG_ENDIAN); -+ if (npucch_2_2_value > 2047) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 2 2 value [0..2047]"); -+ } -+ -+ // n_PUCCH_2_3 -+ guint16 npucch_2_3_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_2_3, 2, ENC_BIG_ENDIAN); -+ if (npucch_2_3_value > 2047) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 2 3 value [0..2047]"); -+ } -+ -+} -+static void dissect_ul_config_harq_info_uci_rel13_fdd_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // HARQ Size 2 -+ ptvcursor_add(ptvc, hf_nfapi_harq_size_2, 2, ENC_BIG_ENDIAN); -+ -+ // Starting PRB -+ guint8 starting_prb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_starting_prb, 1, ENC_BIG_ENDIAN); -+ if (starting_prb_value > 109) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid starting prb value [0..109]"); -+ } -+ -+ // n_PRB -+ guint8 n_prb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_nprb, 1, ENC_BIG_ENDIAN); -+ if (n_prb_value > 109) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n prb value [0..7]"); -+ } -+ -+ // cdm_Index -+ guint8 cdm_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_cdm_index, 1, ENC_BIG_ENDIAN); -+ if (cdm_index_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cdm index value [0..1]"); -+ } -+ -+ // N srs -+ guint8 n_srs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_nsrs, 1, ENC_BIG_ENDIAN); -+ if (n_srs_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n srs value [0..1]"); -+ } -+} -+static void dissect_ul_config_srs_info_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // Handle -+ ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN); -+ -+ // Size -+ ptvcursor_add(ptvc, hf_nfapi_size, 2, ENC_BIG_ENDIAN); -+ -+ // RNTI -+ guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); -+ if (rnti_value < 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]"); -+ } -+ -+ // SRS Bandwidth -+ guint8 srs_bandwidth_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_srs_bandwidth, 1, ENC_BIG_ENDIAN); -+ if (srs_bandwidth_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs bandwidth value [0..3]"); -+ } -+ -+ // Frequency Domain Position -+ guint8 frequency_domain_position_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_frequency_domain_position, 1, ENC_BIG_ENDIAN); -+ if (frequency_domain_position_value > 23) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency domain bandwidth value [0..23]"); -+ } -+ -+ // SRS Hopping Bandwidth -+ guint8 srs_hopping_bandwidth_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_srs_hopping_bandwidth, 1, ENC_BIG_ENDIAN); -+ if (srs_hopping_bandwidth_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs hopping bandwidth value [0..3]"); -+ } -+ -+ // Transmission Comb -+ guint8 transmission_comb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_transmission_comb, 1, ENC_BIG_ENDIAN); -+ if (transmission_comb_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission comb value [0..3]"); -+ } -+ -+ // ISRS / SRS-ConfigIndex -+ guint16 srs_config_index_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_i_srs, 2, ENC_BIG_ENDIAN); -+ if (srs_config_index_value > 1023) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid isrs/srs-configindex value [0..1023]"); -+ } -+ -+ // Sounding Reference Cyclic Shift -+ guint8 sounding_reference_cyclic_shift_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_sounding_reference_cyclic_shift, 1, ENC_BIG_ENDIAN); -+ if (sounding_reference_cyclic_shift_value > 11) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid sounding reference cyclic shift value [0..11]"); -+ } -+} -+static void dissect_ul_config_srs_info_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint8 antenna_port_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_antenna_port, 1, ENC_BIG_ENDIAN); -+ if (antenna_port_value > 2) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid antenna port value [0..2]"); -+ } -+} -+static void dissect_ul_config_srs_info_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint8 number_of_combs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_number_of_combs, 1, ENC_BIG_ENDIAN); -+ if (number_of_combs_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of combs value [0..1]"); -+ } -+} -+static void dissect_hi_dci0_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ -+ // PDU Type -+ guint8 pdu_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_hi_dci0_pdu_type, 1, ENC_BIG_ENDIAN); -+ if (pdu_type_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdu type value [0..3]"); -+ } -+ -+ // PDU Size -+ guint8 size = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_pdu_size, 1, ENC_BIG_ENDIAN); -+ -+ guint pdu_end = (ptvcursor_current_offset(ptvc) + size - 2); -+ dissect_tlv_list(ptvc, pinfo, pdu_end); -+} -+static void dissect_hi_dci0_request_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // SFN/SF -+ ptvcursor_add(ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); -+ -+ // Number of DCI -+ guint8 num_pdu = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_dci_pdus, 1, ENC_BIG_ENDIAN); -+ -+ // Number of HI -+ num_pdu += tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_hi_pdus, 1, ENC_BIG_ENDIAN); -+ -+ dissect_array_value(ptvc, pinfo, "HI DCI0 PDU List", ett_nfapi_hi_dci0_request_pdu_list, num_pdu, dissect_hi_dci0_pdu); -+} -+static void dissect_hi_dci0_hi_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // Resource block start -+ guint8 resource_block_start_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_resource_block_start, 1, ENC_BIG_ENDIAN); -+ if (resource_block_start_value > 100) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block start value [0..100]"); -+ } -+ -+ // Cyclic Shift 2 for DMRS -+ guint8 cyclic_shift_2_for_drms_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_cyclic_shift_2_for_drms, 1, ENC_BIG_ENDIAN); -+ if (cyclic_shift_2_for_drms_value > 7) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cyclic shift 2 for drms value [0..7]"); -+ } -+ -+ // HI value -+ guint8 hi_value_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_hi_value, 1, ENC_BIG_ENDIAN); -+ if (hi_value_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid hi value [0..1]"); -+ } -+ -+ // I_PHICH -+ guint8 i_pich_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_i_phich, 1, ENC_BIG_ENDIAN); -+ if (i_pich_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid i phich value [0..1]"); -+ } -+ -+ // Transmission power -+ guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); -+ if (transmission_power_value > 10000) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]"); -+ } -+ -+} -+static void dissect_hi_dci0_hi_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // Flag TB2 -+ guint8 flag_tb2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_flag_tb2, 1, ENC_BIG_ENDIAN); -+ if (flag_tb2_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid flag tb2 value [0..1]"); -+ } -+ -+ // HI Value 2 -+ guint8 hi2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_hi_value_2, 1, ENC_BIG_ENDIAN); -+ if (hi2_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid hi2 value [0..1]"); -+ } -+ -+} -+static void dissect_hi_dci0_dci_ul_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // DCI format -+ guint8 dci_format_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_ul_dci_format, 1, ENC_BIG_ENDIAN); -+ if (dci_format_value > 4) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci format value [0..4]"); -+ } -+ -+ // CCE index -+ guint8 cce_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_cce_idx, 1, ENC_BIG_ENDIAN); -+ if (cce_index_value > 88) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cce index value [0..88]"); -+ } -+ -+ // Aggregation level -+ guint8 aggregation_level_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_aggregation_level, 1, ENC_BIG_ENDIAN); -+ if (!(aggregation_level_value == 1 || aggregation_level_value == 2 || aggregation_level_value == 4 || -+ aggregation_level_value == 8)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid aggregation level value [1, 2, 4, 8]"); -+ } -+ -+ // RNTI -+ guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); -+ if (rnti_value < 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]"); -+ } -+ -+ // Resource block start -+ guint8 resource_block_start_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_resource_block_start, 1, ENC_BIG_ENDIAN); -+ if (resource_block_start_value > 100) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block start value [0..100]"); -+ } -+ -+ // Number of resource blocks -+ guint8 number_of_resource_blocks_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_of_resource_blocks, 1, ENC_BIG_ENDIAN); -+ if (number_of_resource_blocks_value > 100) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of resource blocks value [0..100]"); -+ } -+ -+ // MCS_1 -+ guint8 mcs_1_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_mcs_1, 1, ENC_BIG_ENDIAN); -+ if (mcs_1_value > 31) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs 1 value [0..31]"); -+ } -+ -+ // Cyclic Shift 2 for DMRS -+ guint8 cyclic_shift_2_for_drms_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_cyclic_shift_2_for_drms, 1, ENC_BIG_ENDIAN); -+ if (cyclic_shift_2_for_drms_value > 7) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cyclic shift 2 for drms value [0..7]"); -+ } -+ -+ // Frequency hopping enabled flag -+ guint8 frequency_hopping_enabled_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_frequency_hopping_enabled_flag, 1, ENC_BIG_ENDIAN); -+ if (frequency_hopping_enabled_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping enabled flag value [0..1]"); -+ } -+ -+ // Frequency hopping bits -+ guint8 frequency_hopping_bit_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_frequency_hopping_bits, 1, ENC_BIG_ENDIAN); -+ if (frequency_hopping_bit_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping bits value [0..3]"); -+ } -+ -+ // New Data indication_1 -+ guint8 new_data_indication_1_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_new_data_indication, 1, ENC_BIG_ENDIAN); -+ if (new_data_indication_1_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indication value [0..1]"); -+ } -+ -+ // UE TX antenna selection -+ guint8 ue_tx_antenna_selection_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_ue_tx_antenna_selection, 1, ENC_BIG_ENDIAN); -+ if (ue_tx_antenna_selection_value > 2) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue tx antenna selection value [0..2]"); -+ } -+ -+ // TPC -+ guint8 tpc_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_tpc, 1, ENC_BIG_ENDIAN); -+ if (tpc_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpc value value [0..3]"); -+ } -+ -+ // CQI/CSI request -+ guint8 cqi_csi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_cqi_csi_request, 1, ENC_BIG_ENDIAN); -+ if (cqi_csi_value > 7) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cqi csi value [0..7]"); -+ } -+ -+ // UL index -+ guint8 ul_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_ul_index, 1, ENC_BIG_ENDIAN); -+ if (ul_index_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul index value [0..3]"); -+ } -+ -+ // DL assignment index -+ guint8 dl_assignment_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_dl_assignment_index, 1, ENC_BIG_ENDIAN); -+ if (!(dl_assignment_index_value >= 1 && dl_assignment_index_value <= 4)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dl assignment index value [1..4]"); -+ } -+ -+ // TPC bitmap -+ ptvcursor_add(ptvc, hf_nfapi_tpc_bitmap, 4, ENC_BIG_ENDIAN); -+ -+ // Transmission power -+ guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); -+ if (transmission_power_value > 10000) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]"); -+ } -+} -+static void dissect_hi_dci0_dci_ul_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // Cross carrier scheduling flag -+ guint8 cross_carrier_scheduling_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_cross_carrier_scheduling_flag, 1, ENC_BIG_ENDIAN); -+ if (cross_carrier_scheduling_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cross carrier scheduling flag value [0..1]"); -+ } -+ -+ // Carrier indicator -+ guint8 carrier_indicator_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_carrier_indicator, 1, ENC_BIG_ENDIAN); -+ if (carrier_indicator_value > 7) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid carrier indicator value [0..7]"); -+ } -+ -+ // Size of CQI/CSI field -+ guint8 size_of_cqi_csi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_size_of_cqi_csi_feild, 1, ENC_BIG_ENDIAN); -+ if (size_of_cqi_csi_value > 2) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid size of cqi/csi field value [0..2]"); -+ } -+ -+ // SRS flag -+ guint8 srs_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_srs_flag, 1, ENC_BIG_ENDIAN); -+ if (srs_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs field value [0..1]"); -+ } -+ -+ // SRS request -+ //guint8 srs_request_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ //item = ptvcursor_add(ptvc, hf_nfapi_srs_request, 1, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_srs_request, 1, ENC_BIG_ENDIAN); -+ -+ // Resource allocation flag -+ guint8 resource_allocation_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_resource_allocation_flag, 1, ENC_BIG_ENDIAN); -+ if (resource_allocation_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocation flag value [0..1]"); -+ } -+ -+ // Resource allocation type -+ guint8 resource_alloction_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN); -+ if (resource_alloction_type_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocation type value [0..1]"); -+ } -+ -+ // Resource block coding -+ ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN); -+ -+ // MCS_2 -+ guint8 mcs_2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_mcs_2, 1, ENC_BIG_ENDIAN); -+ if (mcs_2_value > 31) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs 2 value [0..31]"); -+ } -+ -+ // New data indication_2 -+ guint8 new_data_indication_2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_new_data_indication_two, 1, ENC_BIG_ENDIAN); -+ if (new_data_indication_2_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indication 2 value [0..1]"); -+ } -+ -+ // Number of antenna ports -+ guint8 number_of_antenna_ports_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_of_antenna_ports, 1, ENC_BIG_ENDIAN); -+ if (number_of_antenna_ports_value > 2) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of antenna ports value [0..2]"); -+ } -+ -+ // TPMI -+ guint8 tpmi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_tpmi, 1, ENC_BIG_ENDIAN); -+ if (number_of_antenna_ports_value == 2) -+ { -+ if (tpmi_value > 7) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi value [0..7]"); -+ } -+ } -+ else if (number_of_antenna_ports_value == 4) -+ { -+ if (tpmi_value > 63) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi value [0..63]"); -+ } -+ } -+ -+ // Total DCI length including padding -+ ptvcursor_add(ptvc, hf_nfapi_total_dci_length_including_padding, 1, ENC_BIG_ENDIAN); -+ -+ // N_UL_RB -+ guint8 n_ul_rb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_n_ul_rb, 1, ENC_BIG_ENDIAN); -+ if (!(n_ul_rb_value == 6 || n_ul_rb_value == 15 || n_ul_rb_value == 25 || n_ul_rb_value == 50 || -+ n_ul_rb_value == 75 || n_ul_rb_value == 100)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n ul rb value [6, 15, 25, 50, 75, 100]"); -+ } -+} -+static void dissect_hi_dci0_dci_ul_rel12_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // PSCCH Resource -+ guint8 pscch_resource_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_pscch_resource, 1, ENC_BIG_ENDIAN); -+ if (pscch_resource_value > 0x3F) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pscch resource value [0..0x3F]"); -+ } -+ -+ // Time resource pattern -+ guint8 time_resource_pattern_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_time_resource_pattern, 1, ENC_BIG_ENDIAN); -+ if (time_resource_pattern_value > 0x7F) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid time resource pattern value [0..0x7F]"); -+ } -+ -+} -+static void dissect_hi_dci0_mdpcch_dci_ul_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // MPDCCH Narrowband -+ guint8 mpdcch_narrowband_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_mpdcch_narrowband, 1, ENC_BIG_ENDIAN); -+ if (mpdcch_narrowband_value > 15) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mpdcch narrowband value [0..15]"); -+ } -+ -+ // Number of PRB pairs -+ guint8 number_of_prb_pairs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_of_prb_pairs, 1, ENC_BIG_ENDIAN); -+ if (!(number_of_prb_pairs_value == 2 || number_of_prb_pairs_value == 4 || number_of_prb_pairs_value == 6)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of prb pairs value [2, 4, 6]"); -+ } -+ -+ // Resource Block Assignment -+ guint8 resource_block_assignment_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_resource_block_assignment, 1, ENC_BIG_ENDIAN); -+ if (resource_block_assignment_value > 14) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block assignment value [0..14]"); -+ } -+ -+ // MPDCCH transmission type -+ guint8 mpdcch_transmission_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_mpdcch_transmission_type, 1, ENC_BIG_ENDIAN); -+ if (mpdcch_transmission_type_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mpdcch transmission type value [0..1]"); -+ } -+ -+ // Start symbol -+ guint8 start_symbol_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_start_symbol, 1, ENC_BIG_ENDIAN); -+ if (!(start_symbol_value >= 1 && start_symbol_value <=4)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid start symbol value [0..1]"); -+ } -+ -+ // ECCE index -+ guint8 ecce_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_ecce_index, 1, ENC_BIG_ENDIAN); -+ if (ecce_index_value > 22) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ecce index value [0..22]"); -+ } -+ -+ // Aggregation level -+ guint8 aggregation_level_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_aggregation_level, 1, ENC_BIG_ENDIAN); -+ if (!(aggregation_level_value == 2 || aggregation_level_value == 4 || aggregation_level_value == 8 || -+ aggregation_level_value == 16 || aggregation_level_value == 24)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid aggregation level value [2, 4, 8, 16, 24]"); -+ } -+ -+ // RNTI type -+ guint8 rnti_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_mpdcch_rnti_type, 1, ENC_BIG_ENDIAN); -+ if (!(rnti_type_value == 0 || rnti_type_value == 4)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti type value [0, 4]"); -+ } -+ -+ // RNTI -+ guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); -+ if (rnti_value < 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]"); -+ } -+ -+ // CEMode -+ guint8 cemode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_ce_mode, 1, ENC_BIG_ENDIAN); -+ if (!(cemode_value == 1 || cemode_value == 2)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cemode value [1,2]"); -+ } -+ -+ // DMRS scrambling init -+ guint16 drms_scrambling_init_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_drms_scrambling_init, 2, ENC_BIG_ENDIAN); -+ if (drms_scrambling_init_value < 503) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms scrambling init value [0..503]"); -+ } -+ -+ // Initial transmission SF (io) -+ guint16 initial_transmission_sf_io_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_initial_transmission_sf, 2, ENC_BIG_ENDIAN); -+ if (!(initial_transmission_sf_io_value <= 10239 || initial_transmission_sf_io_value == 0xFFFF)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial transmission sf io value [0..10239, 0xFFFF]"); -+ } -+ -+ // Transmission power -+ guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); -+ if (transmission_power_value > 10000) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]"); -+ } -+ -+ // DCI format -+ guint8 dci_format_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_mpdcch_ul_dci_format, 1, ENC_BIG_ENDIAN); -+ if (!(dci_format_value == 1 || dci_format_value == 2 || dci_format_value == 4 || dci_format_value == 5)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci format value [1, 2, 4, 5]"); -+ } -+ -+ // Resource block start -+ guint8 resource_block_start_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_resource_block_start, 1, ENC_BIG_ENDIAN); -+ if (resource_block_start_value > 99) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block start value [0..99]"); -+ } -+ -+ // Number of resource blocks -+ guint8 number_of_resource_blocks_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_of_resource_blocks, 1, ENC_BIG_ENDIAN); -+ if (!(number_of_resource_blocks_value >= 1 && number_of_resource_blocks_value <= 6)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of resource blocks value [1..6]"); -+ } -+ -+ // MCS -+ guint8 mcs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_mcs, 1, ENC_BIG_ENDIAN); -+ if (mcs_value > 15) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs value [0..15]"); -+ } -+ -+ // PUSCH repetition levels -+ guint8 pusch_repetition_levels_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_pusch_repetition_levels, 1, ENC_BIG_ENDIAN); -+ if (dci_format_value == 4) -+ { -+ if (!(pusch_repetition_levels_value >= 1 && pusch_repetition_levels_value <= 4)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pusch repetition levels value [1..4]"); -+ } -+ } -+ else if (dci_format_value == 5) -+ { -+ if (!(pusch_repetition_levels_value >= 1 && pusch_repetition_levels_value <= 8)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pusch repetition levels value [1..8]"); -+ } -+ } -+ -+ // Frequency hopping flag -+ guint8 frequency_hopping_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_frequency_hopping_flag, 1, ENC_BIG_ENDIAN); -+ if (frequency_hopping_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping flag value [0..1]"); -+ } -+ -+ // New Data indication -+ guint8 new_data_indication_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_new_data_indication, 1, ENC_BIG_ENDIAN); -+ if (new_data_indication_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indication value [0..1]"); -+ } -+ -+ // HARQ process -+ guint8 harq_process_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_harq_process, 1, ENC_BIG_ENDIAN); -+ if (harq_process_value > 7) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq process value [0..7]"); -+ } -+ -+ // Redundancy version -+ guint8 redundancy_version_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_redundancy_version, 1, ENC_BIG_ENDIAN); -+ if (redundancy_version_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy version value [0..3]"); -+ } -+ -+ // TPC -+ guint8 tpc_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_tpc, 1, ENC_BIG_ENDIAN); -+ if (tpc_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpc value [0..3]"); -+ } -+ -+ // CSI request -+ guint8 csi_request_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_csi_request, 1, ENC_BIG_ENDIAN); -+ if (csi_request_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi request value [0..1]"); -+ } -+ -+ // UL index -+ guint8 ul_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_ul_index, 1, ENC_BIG_ENDIAN); -+ if (ul_index_value > 3) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul index value [0..3]"); -+ } -+ -+ // DAI presence flag -+ guint8 dai_presence_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_dai_presence_flag, 1, ENC_BIG_ENDIAN); -+ if (dai_presence_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dai presence value [0..1]"); -+ } -+ -+ // DL assignment index -+ guint8 dl_assignment_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_dl_assignment_index, 1, ENC_BIG_ENDIAN); -+ if (!(dl_assignment_value >=1 && dl_assignment_value <= 4)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dl assignment value [1, 2, 3, 4]"); -+ } -+ -+ // SRS request -+ guint8 srs_request_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_srs_request, 1, ENC_BIG_ENDIAN); -+ if (srs_request_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs request value [0..1]"); -+ } -+ -+ // DCI subframe repetition number -+ guint8 dci_subframe_repetition_number_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_dci_subframe_repetition_number, 1, ENC_BIG_ENDIAN); -+ if (!(dci_subframe_repetition_number_value >= 1 && dci_subframe_repetition_number_value <= 4)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci subframe repetition number value [1..4]"); -+ } -+ -+ //TPC bitmap -+ ptvcursor_add(ptvc, hf_nfapi_tpc_bitmap, 4, ENC_BIG_ENDIAN); -+ -+ // Total DCI length including padding -+ ptvcursor_add(ptvc, hf_nfapi_total_dci_length_include_padding, 1, ENC_BIG_ENDIAN); -+ -+ // Number of TX Antenna ports -+ guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_of_tx_antenna_ports, 1, ENC_BIG_ENDIAN); -+ -+ dissect_array_value(ptvc, pinfo, "TX Antenna Ports", ett_nfapi_tx_antenna_ports, count, dissect_precoding_value); -+} -+static void dissect_rx_ue_info_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Handle -+ ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN); -+ -+ // RNTI -+ guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); -+ if (rnti_value < 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]"); -+ } -+} -+static void dissect_rx_indication_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // Length -+ ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN); -+ -+ // Data offset -+ ptvcursor_add(ptvc, hf_nfapi_data_offset, 2, ENC_BIG_ENDIAN); -+ -+ // UL_CQI -+ ptvcursor_add(ptvc, hf_nfapi_ul_cqi, 1, ENC_BIG_ENDIAN); -+ -+ // Timing advance -+ guint16 timing_advance_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN); -+ if (timing_advance_value > 63) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..63]"); -+ } -+} -+static void dissect_rx_indication_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Timing advance R9 -+ guint16 timing_advance_r9_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_timing_advance_r9, 2, ENC_BIG_ENDIAN); -+ if (timing_advance_r9_value > 7690) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance r9 value [0..7690]"); -+ } -+ -+} -+static void dissect_harq_indication_data_bundling_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN); -+ if (!(value_0 >= 1 && value_0 <= 7)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]"); -+ } -+ -+ guint8 value_1 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_1, 1, ENC_BIG_ENDIAN); -+ if (!(value_1 >= 1 && value_1 <= 7)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 1 [1..7]"); -+ } -+} -+static void dissect_harq_indication_data_format_1a_1b_bundling_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN); -+ if (!(value_0 >= 1 && value_0 <= 7)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]"); -+ } -+} -+static void dissect_harq_indication_data_multplexing_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN); -+ if (!(value_0 >= 1 && value_0 <= 7)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]"); -+ } -+ -+ guint8 value_1 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_1, 1, ENC_BIG_ENDIAN); -+ if (!(value_1 >= 1 && value_1 <= 7)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 1 [1..7]"); -+ } -+ -+ guint8 value_2 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_2, 1, ENC_BIG_ENDIAN); -+ if (!(value_2 >= 1 && value_2 <= 7)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 2 [1..7]"); -+ } -+ -+ guint8 value_3 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_3, 1, ENC_BIG_ENDIAN); -+ if (!(value_3 >= 1 && value_3 <= 7)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 3 [1..7]"); -+ } -+ -+} -+static void dissect_harq_indication_data_format_1a_1b_multplexing_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN); -+ if (!(value_0 >= 1 && value_0 <= 7)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]"); -+ } -+} -+static void dissect_harq_indication_data_special_bundling_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0_special, 1, ENC_BIG_ENDIAN); -+ if (value_0 > 4) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [0..4]"); -+ } -+} -+static void dissect_harq_indication_data_format_1a_1b_special_bundling_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0_special, 1, ENC_BIG_ENDIAN); -+ if (value_0 > 4) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [0..4]"); -+ } -+} -+static void dissect_harq_indication_data_channel_selection_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN); -+ if (!(value_0 >= 1 && value_0 <= 7)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]"); -+ } -+} -+static void dissect_harq_indication_data_format_3_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN); -+ if (!(value_0 >= 1 && value_0 <= 7)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]"); -+ } -+} -+static void dissect_harq_indication_data_format_4_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN); -+ if (!(value_0 >= 1 && value_0 <= 7)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]"); -+ } -+} -+static void dissect_harq_indication_data_format_5_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN); -+ if (!(value_0 >= 1 && value_0 <= 7)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]"); -+ } -+} -+static void dissect_harq_indication_rel8_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ guint8 mode = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_tdd_harq_mode, 1, ENC_BIG_ENDIAN); -+ if (mode > 4) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mode value [0..4]"); -+ } -+ -+ guint8 number_of_ack_nack_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_of_ack_nack, 1, ENC_BIG_ENDIAN); -+ if (!(number_of_ack_nack_value >= 1 && number_of_ack_nack_value <= 4)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..4]"); -+ } -+ -+ switch (mode) -+ { -+ case 0: -+ { -+ dissect_harq_indication_data_bundling_value(ptvc, pinfo); -+ break; -+ } -+ case 1: -+ { -+ dissect_harq_indication_data_multplexing_value(ptvc, pinfo); -+ break; -+ } -+ case 2: -+ { -+ dissect_harq_indication_data_special_bundling_value(ptvc, pinfo); -+ break; -+ } -+ }; -+} -+static void dissect_harq_indication_rel9_later_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 i; -+ proto_item* item; -+ -+ guint8 mode = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_tdd_harq_mode, 1, ENC_BIG_ENDIAN); -+ if (mode > 4) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mode value [0..4]"); -+ } -+ -+ guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_of_ack_nack, 1, ENC_BIG_ENDIAN); -+ if (mode == 0 || mode == 1) -+ { -+ if (!(count >= 1 && count <= 4)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..4]"); -+ } -+ } -+ else if (mode == 3) -+ { -+ if (!(count >= 1 && count <= 8)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..8]"); -+ } -+ } -+ else if (mode == 4) -+ { -+ if (!(count >= 1 && count <= 21)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..21]"); -+ } -+ } -+ -+ -+ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_harq_ack_nack_data, "ACK/NACK Data"); -+ -+ for (i = 0; i < count; ++i) -+ { -+ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_harq_ack_nack_data, "[%d]", i); -+ -+ switch (mode) -+ { -+ case 0: -+ { -+ dissect_harq_indication_data_format_1a_1b_bundling_value(ptvc, pinfo); -+ break; -+ } -+ case 1: -+ { -+ dissect_harq_indication_data_format_1a_1b_multplexing_value(ptvc, pinfo); -+ break; -+ } -+ case 2: -+ { -+ dissect_harq_indication_data_format_1a_1b_special_bundling_value(ptvc, pinfo); -+ break; -+ } -+ case 3: -+ { -+ dissect_harq_indication_data_channel_selection_value(ptvc, pinfo); -+ break; -+ } -+ case 4: -+ { -+ dissect_harq_indication_data_format_3_value(ptvc, pinfo); -+ break; -+ } -+ }; -+ -+ ptvcursor_pop_subtree(ptvc); -+ } -+ -+ ptvcursor_pop_subtree(ptvc); -+} -+static void dissect_harq_indication_rel13_later_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 i = 0; -+ proto_item* item; -+ -+ guint8 mode = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_tdd_harq_mode, 1, ENC_BIG_ENDIAN); -+ if (mode > 6) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mode value [0..6]"); -+ } -+ -+ -+ guint16 count = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_ack_nack, 2, ENC_BIG_ENDIAN); -+ if (mode == 0 || mode == 1) -+ { -+ if (!(count >= 1 && count <= 4)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..4]"); -+ } -+ } -+ else if (mode == 3) -+ { -+ if (!(count >= 1 && count <= 8)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..8]"); -+ } -+ } -+ else if (mode == 4) -+ { -+ if (!(count >= 1 && count <= 21)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..21]"); -+ } -+ } -+ else if (mode == 5 || mode == 6) -+ { -+ if (count < 22) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [>= 22]"); -+ } -+ -+ } -+ -+ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_harq_ack_nack_data, "ACK/NACK Data"); -+ -+ for (i = 0; i < count; ++i) -+ { -+ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_harq_ack_nack_data, "[%d]", i); -+ -+ switch (mode) -+ { -+ case 0: -+ { -+ dissect_harq_indication_data_format_1a_1b_bundling_value(ptvc, pinfo); -+ break; -+ } -+ case 1: -+ { -+ dissect_harq_indication_data_format_1a_1b_multplexing_value(ptvc, pinfo); -+ break; -+ } -+ case 2: -+ { -+ dissect_harq_indication_data_special_bundling_value(ptvc, pinfo); -+ break; -+ } -+ case 3: -+ { -+ dissect_harq_indication_data_channel_selection_value(ptvc, pinfo); -+ break; -+ } -+ case 4: -+ { -+ dissect_harq_indication_data_format_3_value(ptvc, pinfo); -+ break; -+ } -+ case 5: -+ { -+ dissect_harq_indication_data_format_4_value(ptvc, pinfo); -+ break; -+ } -+ case 6: -+ { -+ dissect_harq_indication_data_format_5_value(ptvc, pinfo); -+ break; -+ } -+ }; -+ -+ ptvcursor_pop_subtree(ptvc); -+ } -+ -+ ptvcursor_pop_subtree(ptvc); -+} -+static void dissect_harq_indication_rel8_fdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ guint8 harq_tb_1 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_harq_tb_1, 1, ENC_BIG_ENDIAN); -+ if (!(harq_tb_1 >= 1 && harq_tb_1 <= 7)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq tb 1 [1..7]"); -+ } -+ -+ guint8 harq_tb_2 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_harq_tb_2, 1, ENC_BIG_ENDIAN); -+ if (!(harq_tb_2 >= 1 && harq_tb_2 <= 7)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq tb 2 [1..7]"); -+ } -+ -+} -+static void dissect_harq_tb_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint8 harq_tb_1 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_tb_n, 1, ENC_BIG_ENDIAN); -+ if (!(harq_tb_1 >= 1 && harq_tb_1 <= 7)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq tb n [1..7]"); -+ } -+} -+static void dissect_harq_indication_rel9_later_fdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Mode -+ guint8 harq_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_fdd_harq_mode, 1, ENC_BIG_ENDIAN); -+ if (harq_mode_value > 2) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq mode value [0..2]"); -+ } -+ -+ // Number of ACK/NACK -+ guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_of_ack_nack, 1, ENC_BIG_ENDIAN); -+ -+ if (harq_mode_value == 0) -+ { -+ if (!(count >=1 && count <= 2)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..2]"); -+ } -+ } -+ else if (harq_mode_value == 1) -+ { -+ if (!(count >= 1 && count <= 4)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..4]"); -+ } -+ -+ } -+ else if (harq_mode_value == 2) -+ { -+ if (!(count >= 1 && count <= 10)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..10]"); -+ } -+ -+ } -+ -+ dissect_array_value(ptvc, pinfo, "HARQ TB List", ett_nfapi_harq_data, count, dissect_harq_tb_value); -+} -+static void dissect_harq_indication_rel13_later_fdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Mode -+ guint8 harq_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_fdd_harq_mode, 1, ENC_BIG_ENDIAN); -+ if (harq_mode_value > 4) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq mode value [0..4]"); -+ } -+ -+ // Number of ACK/NACK -+ guint16 count = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_of_ack_nack, 2, ENC_BIG_ENDIAN); -+ -+ if (harq_mode_value == 0) -+ { -+ if (!(count >= 1 && count <= 2)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..2]"); -+ } -+ } -+ else if (harq_mode_value == 1) -+ { -+ if (!(count >= 1 && count <= 4)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..4]"); -+ } -+ -+ } -+ else if (harq_mode_value == 2) -+ { -+ if (!(count >= 1 && count <= 10)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..10]"); -+ } -+ } -+ else if (harq_mode_value == 3 || harq_mode_value == 4) -+ { -+ if (count < 22) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [>= 22]"); -+ } -+ } -+ -+ dissect_array_value(ptvc, pinfo, "HARQ TB List", ett_nfapi_harq_data, count, dissect_harq_tb_value); -+} -+static void dissect_ul_cqi_information_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // UL_CQI -+ ptvcursor_add(ptvc, hf_nfapi_ul_cqi, 1, ENC_BIG_ENDIAN); -+ -+ // Channel -+ guint8 channel_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_channel, 1, ENC_BIG_ENDIAN); -+ if (channel_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid channel value [0..1]"); -+ } -+} -+static void dissect_crc_indication_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // CRC Flag -+ guint8 crc_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_crc_flag, 1, ENC_BIG_ENDIAN); -+ if (crc_flag_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid crc flag value [0..1]"); -+ } -+} -+static void dissect_rx_cqi_indication_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ //Length -+ ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN); -+ -+ // Data Offset -+ ptvcursor_add(ptvc, hf_nfapi_data_offset, 2, ENC_BIG_ENDIAN); -+ -+ // UL_CQI -+ ptvcursor_add(ptvc, hf_nfapi_ul_cqi, 1, ENC_BIG_ENDIAN); -+ -+ // RI -+ guint8 ri_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_ri, 1, ENC_BIG_ENDIAN); -+ if (ri_value > 8) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ri value [0..8]"); -+ } -+ -+ // Timing Advance -+ guint16 timing_advance_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN); -+ if (timing_advance_value > 8) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..63]"); -+ } -+} -+static void dissect_ri_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // RI -+ guint8 ri_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_ri, 1, ENC_BIG_ENDIAN); -+ if (ri_value > 8) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ri value [0..8]"); -+ } -+} -+static void dissect_rx_cqi_indication_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // Length -+ ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN); -+ -+ // Data Offset -+ ptvcursor_add(ptvc, hf_nfapi_data_offset, 2, ENC_BIG_ENDIAN); -+ -+ // UL_CQI -+ ptvcursor_add(ptvc, hf_nfapi_ul_cqi, 1, ENC_BIG_ENDIAN); -+ -+ // Number of CC reported -+ guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_of_cc_reported, 1, ENC_BIG_ENDIAN); -+ if (!(count >= 1 && count <= 5)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of CC reported value [1..5]"); -+ } -+ -+ dissect_array_value(ptvc, pinfo, "CC List", ett_nfapi_cc, count, dissect_ri_value); -+ -+ // Timing Advance -+ guint16 timing_advance_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN); -+ if (timing_advance_value > 63) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..63]"); -+ } -+ -+ // Timing Advance R9 -+ guint16 timing_advance_r9_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_timing_advance_r9, 2, ENC_BIG_ENDIAN); -+ if (timing_advance_r9_value > 7690) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..7690]"); -+ } -+} -+static void dissect_rach_indication_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // RNTI -+ guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); -+ if (rnti_value < 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]"); -+ } -+ -+ // Preamble -+ guint8 preamble_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_preamble, 1, ENC_BIG_ENDIAN); -+ if (preamble_value > 63) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid preamble value [0..63]"); -+ } -+ -+ // Timing Advance -+ guint16 timing_advance_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN); -+ if (timing_advance_value > 1282) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..1282]"); -+ } -+ -+} -+static void dissect_rach_indication_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Timing Advance R9 -+ guint16 timing_advance_r9_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_timing_advance_r9, 2, ENC_BIG_ENDIAN); -+ if (timing_advance_r9_value > 7690) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..7690]"); -+ } -+} -+static void dissect_rach_indication_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // RACH resource type -+ guint8 rach_resource_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_rach_resource_type, 1, ENC_BIG_ENDIAN); -+ if (rach_resource_type_value > 4) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rach resource type value [0..4]"); -+ } -+} -+static void dissect_snr_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // SNR -+ ptvcursor_add(ptvc, hf_nfapi_snr, 1, ENC_BIG_ENDIAN); -+} -+static void dissect_srs_indication_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // Doppler estimation -+ ptvcursor_add(ptvc, hf_nfapi_doppler_estimation, 2, ENC_BIG_ENDIAN); -+ -+ // Timing Advance -+ guint16 timing_advance_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN); -+ if (timing_advance_value > 1282) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..1282]"); -+ } -+ -+ // Number of resource blocks -+ guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_resource_blocks, 1, ENC_BIG_ENDIAN); -+ -+ // RB start -+ ptvcursor_add(ptvc, hf_nfapi_rb_start, 1, ENC_BIG_ENDIAN); -+ -+ -+ dissect_array_value(ptvc, pinfo, "RB List", ett_nfapi_rbs, count, dissect_snr_value); -+} -+static void dissect_srs_indication_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Timing Advance R9 -+ guint16 timing_advance_r9_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_timing_advance_r9, 2, ENC_BIG_ENDIAN); -+ if (timing_advance_r9_value > 7690) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..7690]"); -+ } -+} -+static void dissect_srs_indication_rel10_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // UpPTS Symbol -+ guint8 uppts_symbol_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_up_pts_symbol, 1, ENC_BIG_ENDIAN); -+ if (uppts_symbol_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid up pts symbol value [0..1]"); -+ } -+ -+} -+static void dissect_tdd_channel_measurement_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint16 i = 0; -+ guint16 j = 0; -+ -+ // numPRBperSubband -+ ptvcursor_add(ptvc, hf_nfapi_number_prb_per_subband, 1, ENC_BIG_ENDIAN); -+ -+ // Number of subbands -+ guint8 num_subbands = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_subbands, 1, ENC_BIG_ENDIAN); -+ -+ // numAntennas -+ guint8 num_phy_ant = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_antennas, 1, ENC_BIG_ENDIAN); -+ -+ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_subbands, "Subbands"); -+ -+ for (i = 0; i < num_subbands; ++i) -+ { -+ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_subbands, "[%d]", i); -+ -+ // subbandIndex -+ ptvcursor_add(ptvc, hf_nfapi_subband_index, 1, ENC_BIG_ENDIAN); -+ -+ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_antennas, "Physical Antennas"); -+ -+ for (j = 0; j < num_phy_ant; ++j) -+ { -+ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_antennas, "[%d]", j); -+ -+ // Channel -+ ptvcursor_add(ptvc, hf_nfapi_channel_coefficient, 2, ENC_BIG_ENDIAN); -+ -+ ptvcursor_pop_subtree(ptvc); -+ } -+ -+ ptvcursor_pop_subtree(ptvc); -+ -+ ptvcursor_pop_subtree(ptvc); -+ } -+ -+ ptvcursor_pop_subtree(ptvc); -+} -+static void dissect_srs_indication_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ //UL_RTOA -+ guint16 ul_rtoa_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_ul_rtoa, 2, ENC_BIG_ENDIAN); -+ if (ul_rtoa_value > 4800) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul rtoa value [0..4800]"); -+ } -+} -+static void dissect_lbt_dl_config_request_pdsch_req_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // Handle -+ ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN); -+ -+ // nCCA -+ ptvcursor_add(ptvc, hf_nfapi_mp_cca, 4, ENC_BIG_ENDIAN); -+ -+ // NCCA -+ ptvcursor_add(ptvc, hf_nfapi_n_cca, 4, ENC_BIG_ENDIAN); -+ -+ // Offset -+ guint32 ul_rtoa_value = tvb_get_guint32(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), ENC_BIG_ENDIAN); -+ item = ptvcursor_add(ptvc, hf_nfapi_offset, 4, ENC_BIG_ENDIAN); -+ if (ul_rtoa_value > 999) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid offset value [0..999]"); -+ } -+ -+ // LTE TXOP SF -+ ptvcursor_add(ptvc, hf_nfapi_lte_txop_sf, 4, ENC_BIG_ENDIAN); -+ -+ // TXOP SFN/SF End -+ ptvcursor_add(ptvc, hf_nfapi_txop_sfn_sf_end, 2, ENC_BIG_ENDIAN); -+ -+ // LBT mode -+ guint32 lbt_mode = tvb_get_guint32(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), ENC_BIG_ENDIAN); -+ item = ptvcursor_add(ptvc, hf_nfapi_lbt_mode, 4, ENC_BIG_ENDIAN); -+ if (lbt_mode > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid offset value [0..1]"); -+ } -+} -+static void dissect_lbt_dl_config_request_drs_req_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // Handle -+ ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN); -+ -+ // Offset -+ guint32 ul_rtoa_value = tvb_get_guint32(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), ENC_BIG_ENDIAN); -+ item = ptvcursor_add(ptvc, hf_nfapi_offset, 4, ENC_BIG_ENDIAN); -+ if (ul_rtoa_value > 999) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid offset value [0..999]"); -+ } -+ -+ // SFN/SF End -+ ptvcursor_add(ptvc, hf_nfapi_sfn_sf_end, 2, ENC_BIG_ENDIAN); -+ -+ // LBT mode -+ guint32 lbt_mode = tvb_get_guint32(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), ENC_BIG_ENDIAN); -+ item = ptvcursor_add(ptvc, hf_nfapi_lbt_mode, 4, ENC_BIG_ENDIAN); -+ if (lbt_mode > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid offset value [0..1]"); -+ } -+} -+static void dissect_lbt_dl_config_request_pdsch_resp_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // Handle -+ ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN); -+ -+ // result -+ guint32 result_value = tvb_get_guint32(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), ENC_BIG_ENDIAN); -+ item = ptvcursor_add(ptvc, hf_nfapi_result, 4, ENC_BIG_ENDIAN); -+ if (result_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid result value [0..1]"); -+ } -+ -+ // LTE TXOP symbols -+ ptvcursor_add(ptvc, hf_nfapi_txop_symbols, 4, ENC_BIG_ENDIAN); -+ -+ // Initial Partial SF -+ guint32 initial_partial_sf_value = tvb_get_guint32(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), ENC_BIG_ENDIAN); -+ item = ptvcursor_add(ptvc, hf_nfapi_initial_partial_sf, 4, ENC_BIG_ENDIAN); -+ if (initial_partial_sf_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial partial sf value [0..1]"); -+ } -+} -+static void dissect_lbt_dl_config_request_drs_resp_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // Handle -+ ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN); -+ -+ // result -+ guint32 result_value = tvb_get_guint32(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), ENC_BIG_ENDIAN); -+ item = ptvcursor_add(ptvc, hf_nfapi_result, 4, ENC_BIG_ENDIAN); -+ if (result_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid result value [0..1]"); -+ } -+} -+static void dissect_tx_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // PDU length -+ guint16 len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_pdu_length, 2, ENC_BIG_ENDIAN); -+ -+ // PDU index -+ ptvcursor_add(ptvc, hf_nfapi_pdu_index, 2, ENC_BIG_ENDIAN); -+ -+ // PDU#N -+ ptvcursor_add(ptvc, hf_nfapi_pdu, len, ENC_NA); -+} -+static void dissect_tx_request_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Number of PDUs -+ guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_pdus, 2, ENC_BIG_ENDIAN); -+ -+ dissect_array_value(ptvc, pinfo, "TX PDU List", ett_nfapi_tx_request_pdu_list, num_pdu, dissect_tx_pdu); -+} -+static void dissect_harq_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Instance Length -+ guint16 instance_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN); -+ -+ guint instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2); -+ dissect_tlv_list(ptvc, pinfo, instance_end); -+} -+static void dissect_harq_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Number of HARQs -+ guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_harqs, 2, ENC_BIG_ENDIAN); -+ -+ -+ dissect_array_value(ptvc, pinfo, "HARQ PDU List", ett_nfapi_harq_indication_pdu_list, num_pdu, dissect_harq_indication_pdu); -+} -+static void dissect_crc_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Instance Length -+ guint16 instance_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN); -+ -+ guint instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2); -+ dissect_tlv_list(ptvc, pinfo, instance_end); -+} -+static void dissect_crc_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Number of CRCs -+ guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_crcs, 2, ENC_BIG_ENDIAN); -+ dissect_array_value(ptvc, pinfo, "CRC PDU List", ett_nfapi_crc_indication_pdu_list, num_pdu, dissect_crc_indication_pdu); -+} -+static void dissect_sr_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Instance Length -+ guint16 instance_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN); -+ -+ guint instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2); -+ dissect_tlv_list(ptvc, pinfo, instance_end); -+} -+static void dissect_rx_sr_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Number of SRs -+ guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_srs, 2, ENC_BIG_ENDIAN); -+ -+ dissect_array_value(ptvc, pinfo, "SR PDU List", ett_nfapi_sr_indication_pdu_list, num_pdu, dissect_sr_indication_pdu); -+} -+static void dissect_cqi_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Instance Length -+ guint16 instance_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN); -+ -+ guint instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2); -+ dissect_tlv_list(ptvc, pinfo, instance_end); -+} -+static void dissect_rx_cqi_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Number of PDUs -+ guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_cqi, 2, ENC_BIG_ENDIAN); -+ -+ guint16* lengths = (guint16*)wmem_alloc0(wmem_packet_scope(), num_pdu * 2); -+ memset(lengths, 0, num_pdu * 2); -+ -+ tvbuff_t* tvb = ptvcursor_tvbuff(ptvc); -+ guint8 tmp_offset = ptvcursor_current_offset(ptvc); -+ -+ int i = 0; -+ for (i = 0; i < num_pdu; ++i) -+ { -+ guint16 instance_len = tvb_get_ntohs(tvb, tmp_offset); -+ tmp_offset += 2; -+ guint8 pdu_end = tmp_offset + instance_len; -+ -+ while (tmp_offset < pdu_end) -+ { -+ guint16 tlv_id = tvb_get_ntohs(tvb, tmp_offset); -+ tmp_offset += 2; -+ guint16 tlv_len = tvb_get_ntohs(tvb, tmp_offset); -+ tmp_offset += 2; -+ -+ if (tlv_id == 0x202F) -+ { -+ lengths[i] = tvb_get_ntohs(tvb, tmp_offset); -+ } -+ else if (tlv_id == 0x2030) -+ { -+ lengths[i] = tvb_get_ntohs(tvb, tmp_offset); -+ } -+ -+ tmp_offset += tlv_len; -+ } -+ } -+ -+ dissect_array_value(ptvc, pinfo, "CQI PDU List", ett_nfapi_cqi_indication_pdu_list, num_pdu, dissect_cqi_indication_pdu); -+ -+ for (i = 0; i < num_pdu; ++i) -+ { -+ ptvcursor_add(ptvc, hf_nfapi_pdu, lengths[i], ENC_NA); -+ } -+} -+static void dissect_preamble_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Instance Length -+ guint16 instance_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN); -+ -+ guint instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2); -+ dissect_tlv_list(ptvc, pinfo, instance_end); -+} -+static void dissect_rach_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Number of Preambles -+ guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_preambles, 2, ENC_BIG_ENDIAN); -+ dissect_array_value(ptvc, pinfo, "Preamble PDU List", ett_nfapi_preamble_indication_pdu_list, num_pdu, dissect_preamble_indication_pdu); -+} -+static void dissect_srs_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Instance Length -+ guint16 instance_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN); -+ guint instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2); -+ dissect_tlv_list(ptvc, pinfo, instance_end); -+} -+static void dissect_srs_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Number of UEs -+ guint8 num_pdu = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_srss, 1, ENC_BIG_ENDIAN); -+ dissect_array_value(ptvc, pinfo, "SRS PDU List", ett_nfapi_srs_indication_pdu_list, num_pdu, dissect_srs_indication_pdu); -+} -+static void dissect_lbt_dl_config_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // PDU Type -+ guint8 pdu_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_lbt_dl_req_pdu_type, 1, ENC_BIG_ENDIAN); -+ if (pdu_type_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdu type value [0..1]"); -+ } -+ -+ guint8 size = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_pdu_size, 1, ENC_BIG_ENDIAN); -+ guint pdu_end = (ptvcursor_current_offset(ptvc) + size - 2); -+ -+ dissect_tlv_list(ptvc, pinfo, pdu_end); -+} -+static void dissect_lbt_dl_config_request_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Number of PDUs -+ guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_number_pdus, 2, ENC_BIG_ENDIAN); -+ if (!(num_pdu >= 1 && num_pdu <= 2)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pdus value [1..2]"); -+ } -+ -+ dissect_array_value(ptvc, pinfo, "LBT DL PDU List", ett_nfapi_lbt_dl_config_pdu_list, num_pdu, dissect_lbt_dl_config_pdu); -+} -+static void dissect_lbt_dl_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // PDU Type -+ guint8 pdu_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_lbt_dl_ind_pdu_type, 1, ENC_BIG_ENDIAN); -+ if (pdu_type_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdu type value [0..1]"); -+ } -+ -+ // PDU Size -+ guint8 size = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_pdu_size, 1, ENC_BIG_ENDIAN); -+ guint pdu_end = (ptvcursor_current_offset(ptvc) + size - 2); -+ dissect_tlv_list(ptvc, pinfo, pdu_end); -+} -+static void dissect_lbt_indication_message_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Number of PDUs -+ guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_number_pdus, 2, ENC_BIG_ENDIAN); -+ if (!(num_pdu >= 1 && num_pdu <= 2)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pdus value [1..2]"); -+ } -+ -+ dissect_array_value(ptvc, pinfo, "LBT DL PDU List", ett_nfapi_lbt_dl_indication_pdu_list, num_pdu, dissect_lbt_dl_indication_pdu); -+} -+static void dissect_lte_rssi_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Frequency Band Indicator -+ ptvcursor_add(ptvc, hf_nfapi_frequency_band_indicator, 1, ENC_BIG_ENDIAN); -+ -+ // Measurement Period -+ ptvcursor_add(ptvc, hf_nfapi_measurement_period, 2, ENC_BIG_ENDIAN); -+ -+ // Bandwidth -+ guint8 bandwidth_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_bandwidth, 1, ENC_BIG_ENDIAN); -+ if (!(bandwidth_value == 6 || bandwidth_value == 15 || bandwidth_value == 25 || -+ bandwidth_value == 50 || bandwidth_value == 75 || bandwidth_value == 100)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid bandwidth value [6, 15, 25, 50, 75, 100]"); -+ } -+ -+ // Timeout -+ ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); -+ -+ // Number of EARFCNs -+ guint8 num_earfcns = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_earfcns, 1, ENC_BIG_ENDIAN); -+ -+ dissect_array_value(ptvc, pinfo, "EARFCNs", ett_nfapi_earfcn_list, num_earfcns, dissect_earfcn_value); -+} -+static void dissect_uarfcn_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // UARFCN -+ ptvcursor_add(ptvc, hf_nfapi_uarfcn, 2, ENC_BIG_ENDIAN); -+} -+static void dissect_utran_rssi_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Frequency Band Indicator -+ ptvcursor_add(ptvc, hf_nfapi_frequency_band_indicator, 1, ENC_BIG_ENDIAN); -+ -+ // Measurement Period -+ ptvcursor_add(ptvc, hf_nfapi_measurement_period, 2, ENC_BIG_ENDIAN); -+ -+ // Timeout -+ ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); -+ -+ // Number of UARFCNs -+ guint8 num_uarfcns = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_uarfcns, 1, ENC_BIG_ENDIAN); -+ -+ dissect_array_value(ptvc, pinfo, "UARFCNs", ett_nfapi_uarfcn_list, num_uarfcns, dissect_uarfcn_value); -+} -+static void dissect_arfcn_dir_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // ARFCN -+ ptvcursor_add(ptvc, hf_nfapi_arfcn, 2, ENC_BIG_ENDIAN); -+ -+ // Direction -+ guint8 direction_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_arfcn_direction, 1, ENC_BIG_ENDIAN); -+ if (direction_value > 1) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid direction value [0..1]"); -+ } -+ -+} -+static void dissect_geran_rssi_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Frequency Band Indicator -+ ptvcursor_add(ptvc, hf_nfapi_frequency_band_indicator, 1, ENC_BIG_ENDIAN); -+ -+ // Measurement Period -+ ptvcursor_add(ptvc, hf_nfapi_measurement_period, 2, ENC_BIG_ENDIAN); -+ -+ // Timeout -+ ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); -+ -+ // Number of ARFCNs -+ guint8 num_arfcns = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_arfcns, 1, ENC_BIG_ENDIAN); -+ -+ dissect_array_value(ptvc, pinfo, "ARFCNs", ett_nfapi_arfcn_list, num_arfcns, dissect_arfcn_dir_value); -+} -+static void dissect_rssi_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // RSSI -+ ptvcursor_add(ptvc, hf_nfapi_rssi, 2, ENC_BIG_ENDIAN); -+} -+static void dissect_rssi_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Number of RSSI -+ guint16 num_rssi = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_rssi, 2, ENC_BIG_ENDIAN); -+ -+ dissect_array_value(ptvc, pinfo, "ARFCNs", ett_nfapi_rssi_list, num_rssi, dissect_rssi_value); -+} -+static void dissect_pci_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // PCI -+ ptvcursor_add(ptvc, hf_nfapi_pci, 2, ENC_BIG_ENDIAN); -+} -+static void dissect_lte_cell_search_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // EARFCN -+ ptvcursor_add(ptvc, hf_nfapi_earfcn, 2, ENC_BIG_ENDIAN); -+ -+ // Measurement Bandwidth -+ ptvcursor_add(ptvc, hf_nfapi_measurement_bandwidth, 1, ENC_BIG_ENDIAN); -+ -+ // Exhaustive Search -+ ptvcursor_add(ptvc, hf_nfapi_exhaustive_search, 1, ENC_BIG_ENDIAN); -+ -+ // Timeout -+ ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); -+ -+ // Number of PCI -+ guint8 num_pci = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_pci, 1, ENC_BIG_ENDIAN); -+ -+ dissect_array_value(ptvc, pinfo, "PCIs", ett_nfapi_pci_list, num_pci, dissect_pci_value); -+} -+static void dissect_psc_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // PSC -+ ptvcursor_add(ptvc, hf_nfapi_psc, 2, ENC_BIG_ENDIAN); -+} -+static void dissect_utran_cell_search_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // UARFCN -+ ptvcursor_add(ptvc, hf_nfapi_uarfcn, 2, ENC_BIG_ENDIAN); -+ -+ // Exhaustive Search -+ ptvcursor_add(ptvc, hf_nfapi_exhaustive_search, 1, ENC_BIG_ENDIAN); -+ -+ // Timeout -+ ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); -+ -+ // Number of PSC -+ guint8 num_psc = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_psc, 1, ENC_BIG_ENDIAN); -+ -+ dissect_array_value(ptvc, pinfo, "PSCs", ett_nfapi_psc_list, num_psc, dissect_psc_value); -+} -+static void dissect_arfcn_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // ARFCN -+ ptvcursor_add(ptvc, hf_nfapi_arfcn, 2, ENC_BIG_ENDIAN); -+} -+static void dissect_geran_cell_search_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Timeout -+ ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); -+ -+ // Number of ARFCN -+ guint8 num_arfcn = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_arfcns, 1, ENC_BIG_ENDIAN); -+ -+ dissect_array_value(ptvc, pinfo, "ARFCNs", ett_nfapi_arfcn_list, num_arfcn, dissect_arfcn_value); -+} -+ -+static void dissect_lte_cell_found_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // PCI -+ ptvcursor_add(ptvc, hf_nfapi_pci, 2, ENC_BIG_ENDIAN); -+ -+ // RSRP -+ ptvcursor_add(ptvc, hf_nfapi_rsrp, 1, ENC_BIG_ENDIAN); -+ -+ // RSRQ -+ ptvcursor_add(ptvc, hf_nfapi_rsrq, 1, ENC_BIG_ENDIAN); -+ -+ // Frequency Offset -+ ptvcursor_add(ptvc, hf_nfapi_frequency_offset, 2, ENC_BIG_ENDIAN); -+} -+static void dissect_lte_cell_search_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Number of LTE Cells Found -+ guint16 num_lte_cells = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_lte_cells_found, 2, ENC_BIG_ENDIAN); -+ dissect_array_value(ptvc, pinfo, "LTE Cells Found", ett_nfapi_lte_cells_found_list, num_lte_cells, dissect_lte_cell_found_value); -+} -+static void dissect_utran_cell_found_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // PSC -+ ptvcursor_add(ptvc, hf_nfapi_psc, 2, ENC_BIG_ENDIAN); -+ -+ // RSCP -+ ptvcursor_add(ptvc, hf_nfapi_rscp, 1, ENC_BIG_ENDIAN); -+ -+ // EcN0 -+ ptvcursor_add(ptvc, hf_nfapi_enco, 1, ENC_BIG_ENDIAN); -+ -+ // Frequency Offset -+ ptvcursor_add(ptvc, hf_nfapi_frequency_offset, 2, ENC_BIG_ENDIAN); -+} -+static void dissect_utran_cell_search_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Number of UTRAN Cells Found -+ guint16 num_utran_cells = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_utran_cells_found, 2, ENC_BIG_ENDIAN); -+ dissect_array_value(ptvc, pinfo, "UTRAN Cells Found", ett_nfapi_utran_cells_found_list, num_utran_cells, dissect_utran_cell_found_value); -+} -+static void dissect_geran_cell_found_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // ARFCN -+ ptvcursor_add(ptvc, hf_nfapi_arfcn, 2, ENC_BIG_ENDIAN); -+ -+ // BSIC -+ ptvcursor_add(ptvc, hf_nfapi_bsic, 1, ENC_BIG_ENDIAN); -+ -+ // RxLev -+ ptvcursor_add(ptvc, hf_nfapi_rxlev, 1, ENC_BIG_ENDIAN); -+ -+ // RxQual -+ ptvcursor_add(ptvc, hf_nfapi_rxqual, 1, ENC_BIG_ENDIAN); -+ -+ // Frequency Offset -+ ptvcursor_add(ptvc, hf_nfapi_frequency_offset, 2, ENC_BIG_ENDIAN); -+ -+ // SFN Offset -+ ptvcursor_add(ptvc, hf_nfapi_sfn_offset, 4, ENC_BIG_ENDIAN); -+} -+static void dissect_geran_cell_search_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Number of GSM Cells Found -+ guint16 num_geran_cells = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_geran_cells_found, 2, ENC_BIG_ENDIAN); -+ dissect_array_value(ptvc, pinfo, "GERAN Cells Found", ett_nfapi_geran_cells_found_list, num_geran_cells, dissect_geran_cell_found_value); -+} -+static void dissect_pnf_cell_search_state_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint len = tvb_reported_length_remaining(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_pnf_search_state, len, ENC_NA); -+} -+static void dissect_pnf_cell_broadcast_state_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint len = tvb_reported_length_remaining(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_pnf_broadcast_state, len, ENC_NA); -+} -+static void dissect_lte_broadcast_detect_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // EARFCN -+ ptvcursor_add(ptvc, hf_nfapi_earfcn, 2, ENC_BIG_ENDIAN); -+ -+ // PCI -+ ptvcursor_add(ptvc, hf_nfapi_pci, 2, ENC_BIG_ENDIAN); -+ -+ // Timeout -+ ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); -+} -+static void dissect_utran_broadcast_detect_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // UARFCN -+ ptvcursor_add(ptvc, hf_nfapi_uarfcn, 2, ENC_BIG_ENDIAN); -+ -+ // PSC -+ ptvcursor_add(ptvc, hf_nfapi_psc, 2, ENC_BIG_ENDIAN); -+ -+ // Timeout -+ ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); -+} -+static void dissect_lte_broadcast_detect_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // Number of Tx Antenna -+ guint8 number_of_tx_antenna_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_number_of_tx_antenna, 1, ENC_BIG_ENDIAN); -+ if (!(number_of_tx_antenna_value == 1 || number_of_tx_antenna_value == 2 || number_of_tx_antenna_value == 4)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of tx antenna value [1, 2, 4]"); -+ } -+ -+ -+ // MIB Length -+ guint16 mib_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_mib_length, 2, ENC_BIG_ENDIAN); -+ -+ // MIB[MIB Length] -+ ptvcursor_add(ptvc, hf_nfapi_mib, mib_len, ENC_NA); -+ -+ // SFN Offset -+ ptvcursor_add(ptvc, hf_nfapi_sfn_offset, 4, ENC_BIG_ENDIAN); -+} -+static void dissect_utran_broadcast_detect_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // MIB Length -+ guint16 mib_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_mib_length, 2, ENC_BIG_ENDIAN); -+ -+ // MIB[MIB Length] -+ ptvcursor_add(ptvc, hf_nfapi_mib, mib_len, ENC_NA); -+ -+ // SFN Offset -+ ptvcursor_add(ptvc, hf_nfapi_sfn_offset, 4, ENC_BIG_ENDIAN); -+} -+static void dissect_lte_system_information_schedule_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // EARFCN -+ ptvcursor_add(ptvc, hf_nfapi_earfcn, 2, ENC_BIG_ENDIAN); -+ -+ // PCI -+ ptvcursor_add(ptvc, hf_nfapi_pci, 2, ENC_BIG_ENDIAN); -+ -+ // Bandwidth -+ guint16 bandwidth_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_bandwidth, 2, ENC_BIG_ENDIAN); -+ if (!(bandwidth_value == 6 || bandwidth_value == 15 || bandwidth_value == 25 || -+ bandwidth_value == 50 || bandwidth_value == 75 || bandwidth_value == 100)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid bandwidth value [6, 15, 25, 50, 75, 100]"); -+ } -+ -+ // PHICH Configuration -+ // todo : phich bit decode -+ ptvcursor_add(ptvc, hf_nfapi_phich_configuration, 1, ENC_BIG_ENDIAN); -+ -+ // Number of Tx Antenna -+ guint8 number_of_tx_antenna_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_of_tx_antenna, 1, ENC_BIG_ENDIAN); -+ if (!(number_of_tx_antenna_value == 1 || number_of_tx_antenna_value == 2 || number_of_tx_antenna_value == 4)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of tx antenna value [1, 2, 4]"); -+ } -+ -+ // retryCount -+ ptvcursor_add(ptvc, hf_nfapi_retry_count, 1, ENC_BIG_ENDIAN); -+ -+ // Timeout -+ ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); -+} -+static void dissect_lte_system_information_schedule_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // this needs to be SIB 1 -+ guint len = tvb_reported_length_remaining(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_sib1, len, ENC_NA); -+} -+static void dissect_si_periodicity_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ proto_item* item; -+ -+ // SI Periodicity -+ guint8 si_periodicity_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_si_periodicity, 1, ENC_BIG_ENDIAN); -+ if (si_periodicity_value > 7) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid si periodicity value [0..7]"); -+ } -+ -+ // SI Index -+ guint8 si_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_si_index, 1, ENC_BIG_ENDIAN); -+ if (si_index_value > 32) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid si index value [0..32]"); -+ } -+} -+ -+static void dissect_lte_system_information_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // EARFCN -+ ptvcursor_add(ptvc, hf_nfapi_earfcn, 2, ENC_BIG_ENDIAN); -+ -+ // PCI -+ ptvcursor_add(ptvc, hf_nfapi_pci, 2, ENC_BIG_ENDIAN); -+ -+ // Downlink channel bandwidth -+ guint16 bandwidth_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_downlink_channel_bandwidth, 2, ENC_BIG_ENDIAN); -+ if (!(bandwidth_value == 6 || bandwidth_value == 15 || bandwidth_value == 25 || -+ bandwidth_value == 50 || bandwidth_value == 75 || bandwidth_value == 100)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid bandwidth value [6, 15, 25, 50, 75, 100]"); -+ } -+ -+ // PHICH Configuration -+ ptvcursor_add(ptvc, hf_nfapi_phich_configuration, 1, ENC_BIG_ENDIAN); -+ -+ // Number of Tx Antenna -+ guint8 number_of_tx_antenna_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_number_of_tx_antenna, 1, ENC_BIG_ENDIAN); -+ if (!(number_of_tx_antenna_value == 1 || number_of_tx_antenna_value == 2 || number_of_tx_antenna_value == 4)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of tx antenna value [1, 2, 4]"); -+ } -+ -+ // Number of SI Periodicity -+ guint8 si_priodicity = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_of_si_periodicity, 1, ENC_BIG_ENDIAN); -+ -+ dissect_array_value(ptvc, pinfo, "Number SI Periodicity", ett_nfapi_si_periodicity_list, si_priodicity, dissect_si_periodicity_value); -+ -+ // SI Window Length -+ guint8 si_window_length_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ item = ptvcursor_add(ptvc, hf_nfapi_si_window_length, 1, ENC_BIG_ENDIAN); -+ if (!(si_window_length_value == 1 || si_window_length_value == 2 || si_window_length_value == 5 || si_window_length_value == 10 || -+ si_window_length_value == 15 || si_window_length_value == 20 || si_window_length_value == 40)) -+ { -+ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid si window length value [1, 2, 5, 10, 15, 20, 40]"); -+ } -+ -+ // Timeout -+ ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); -+} -+static void dissect_utran_system_information_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // UARFCN -+ ptvcursor_add(ptvc, hf_nfapi_uarfcn, 2, ENC_BIG_ENDIAN); -+ -+ // PSC -+ ptvcursor_add(ptvc, hf_nfapi_psc, 2, ENC_BIG_ENDIAN); -+ -+ // Timeout -+ ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); -+} -+static void dissect_geran_system_information_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // ARFCN -+ ptvcursor_add(ptvc, hf_nfapi_arfcn, 2, ENC_BIG_ENDIAN); -+ -+ // BSIC -+ ptvcursor_add(ptvc, hf_nfapi_bsic, 1, ENC_BIG_ENDIAN); -+ -+ // Timeout -+ ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); -+} -+static void dissect_lte_system_information_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // SIB Type -+ ptvcursor_add(ptvc, hf_nfapi_sib_type, 1, ENC_BIG_ENDIAN); -+ -+ // SIB Length -+ guint16 sib_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_sib_len, 2, ENC_BIG_ENDIAN); -+ -+ // SIB[SIB Length] -+ ptvcursor_add(ptvc, hf_nfapi_sib, sib_len, ENC_NA); -+} -+static void dissect_utran_system_information_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // SIB Length -+ guint16 sib_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_sib_len, 2, ENC_BIG_ENDIAN); -+ -+ // SIB[SIB Length] -+ ptvcursor_add(ptvc, hf_nfapi_sib, sib_len, ENC_NA); -+} -+static void dissect_geran_system_information_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ // SI Length -+ guint16 si_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_si_len, 2, ENC_BIG_ENDIAN); -+ -+ // SI[SI Length] -+ ptvcursor_add(ptvc, hf_nfapi_si, si_len, ENC_NA); -+} -+ -+static void dissect_rx_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_); -+ -+// Important the tags must be in numerical order so that they can be indexed correctly -+const tlv_t nfapi_tags[] = -+{ -+ { 0x1000, "PNF Param General", dissect_pnf_param_general_value }, -+ { 0x1001, "PNF PHY", dissect_pnf_phy_value }, -+ { 0x1002, "PNF RF", dissect_pnf_rf_value }, -+ { 0x1003, "PNF PHY RF Config", dissect_pnf_phy_rf_config_value }, -+ { 0x1004, "DL RS Tx power", dissect_dl_rs_tx_power_value }, -+ { 0x1005, "Received interference power", dissect_received_interference_power_value }, -+ { 0x1006, "Thermal noise power", dissect_thermal_noise_power_value }, -+ { 0x1007, "DL RS TX Power measurement", dissect_dl_rs_tx_power_measurement_value }, -+ { 0x1008, "Received Interference power measurement", dissect_received_interference_power_measurement_value }, -+ { 0x1009, "Thermal noise power measurement", dissect_thermal_noise_power_measurement_value }, -+ { 0x100A, "PNF PHY Rel 10", dissect_pnf_phy_rel10_value }, -+ { 0x100B, "PNF PHY Rel 11", dissect_pnf_phy_rel11_value }, -+ { 0x100C, "PNF PHY Rel 12", dissect_pnf_phy_rel12_value }, -+ { 0x100D, "PNF PHY Rel 13", dissect_pnf_phy_rel13_value }, -+}; -+ -+const tlv_t configuration_tags[] = -+{ -+ { 0x0000, NULL, NULL }, -+ { 0x0001, "Subframe config - Duplex Mode", dissect_duplex_mode_value }, -+ { 0x0002, "Subframe config - PCFICH power offset TLV", dissect_pcfich_power_offset_value }, -+ { 0x0003, "Subframe config - P-B", dissect_pb_value }, -+ { 0x0004, "Subframe config - DL cyclic prefix type", dissect_dl_cyclic_prefix_value }, -+ { 0x0005, "Subframe config - UL cyclic prefix type", dissect_ul_cyclic_prefix_value }, -+ { 0x0006, NULL, NULL }, -+ { 0x0007, NULL, NULL }, -+ { 0x0008, NULL, NULL }, -+ { 0x0009, NULL, NULL }, -+ { 0x000A, "RF config - Downlink channel bandwidth", dissect_dl_channel_bandwidth_value }, -+ { 0x000B, "RF config - Uplink channel bandwidth", dissect_ul_channel_bandwidth_value }, -+ { 0x000C, "RF config - Reference signal power", dissect_reference_signal_power_value }, -+ { 0x000D, "RF config - Tx antenna ports", dissect_tx_antenna_ports_value }, -+ { 0x000E, "RF config - Rx Antenna ports", dissect_rx_antenna_ports_value }, -+ { 0x000F, NULL, NULL }, -+ { 0x0010, NULL, NULL }, -+ { 0x0011, NULL, NULL }, -+ { 0x0012, NULL, NULL }, -+ { 0x0013, NULL, NULL }, -+ { 0x0014, "PHICH config - PHICH resource", dissect_phich_resource_value }, -+ { 0x0015, "PHICH config - PHICH duration", dissect_phich_duration_value }, -+ { 0x0016, "PHICH config - PHICH power offset", dissect_phich_power_offset_value }, -+ { 0x0017, NULL, NULL }, -+ { 0x0018, NULL, NULL }, -+ { 0x0019, NULL, NULL }, -+ { 0x001A, NULL, NULL }, -+ { 0x001B, NULL, NULL }, -+ { 0x001C, NULL, NULL }, -+ { 0x001D, NULL, NULL }, -+ { 0x001E, "SCH config - Primary synchronization signal EPRE/EPRERS", dissect_psch_synch_signal_epre_eprers_value }, -+ { 0x001F, "SCH config - Secondary synchronization signal EPRE/EPRERS", dissect_ssch_synch_signal_epre_eprers_value }, -+ { 0x0020, "SCH config - Physical Cell Id", dissect_physical_cell_id_value }, -+ { 0x0021, NULL, NULL }, -+ { 0x0022, NULL, NULL }, -+ { 0x0023, NULL, NULL }, -+ { 0x0024, NULL, NULL }, -+ { 0x0025, NULL, NULL }, -+ { 0x0026, NULL, NULL }, -+ { 0x0027, NULL, NULL }, -+ { 0x0028, "PRACH config - Configuration index", dissect_prach_configuration_index_value }, -+ { 0x0029, "PRACH config - Root sequence index", dissect_prach_root_sequence_index_value }, -+ { 0x002A, "PRACH config - Zero correlation zone configuration", dissect_prach_zero_correlation_zone_configuration_value }, -+ { 0x002B, "PRACH config - High speed flag", dissect_prach_high_speed_flag_value }, -+ { 0x002C, "PRACH config - Frequency offset", dissect_prach_frequency_offset_value }, -+ { 0x002D, NULL, NULL }, -+ { 0x002E, NULL, NULL }, -+ { 0x002F, NULL, NULL }, -+ { 0x0030, NULL, NULL }, -+ { 0x0031, NULL, NULL }, -+ { 0x0032, "PUSCH config - Hopping mode", dissect_pusch_hopping_mode_value }, -+ { 0x0033, "PUSCH config - Hopping offset", dissect_pusch_hopping_offset_value }, -+ { 0x0034, "PUSCH config - Number of sub-bands", dissect_pusch_number_of_subbands_value }, -+ { 0x0035, NULL, NULL }, -+ { 0x0036, NULL, NULL }, -+ { 0x0037, NULL, NULL }, -+ { 0x0038, NULL, NULL }, -+ { 0x0039, NULL, NULL }, -+ { 0x003A, NULL, NULL }, -+ { 0x003B, NULL, NULL }, -+ { 0x003C, "PUCCH config - Delta PUCCH Shift", dissect_pucch_delta_pucch_shift_value }, -+ { 0x003D, "PUCCH config - N_CQI RB", dissect_pucch_n_cqi_rb_value }, -+ { 0x003E, "PUCCH config - N_AN CS", dissect_pucch_n_an_cs_value }, -+ { 0x003F, "PUCCH config - N1Pucch-AN", dissect_pucch_n1_pucch_an_value }, -+ { 0x0040, NULL, NULL }, -+ { 0x0041, NULL, NULL }, -+ { 0x0042, NULL, NULL }, -+ { 0x0043, NULL, NULL }, -+ { 0x0044, NULL, NULL }, -+ { 0x0045, NULL, NULL }, -+ { 0x0046, "SRS config - Bandwidth configuration", dissect_srs_bandwidth_configuration_value }, -+ { 0x0047, "SRS config - MaxUpPTS", dissect_srs_max_uppts_value }, -+ { 0x0048, "SRS config - SRS subframe configuration", dissect_srs_subframe_configuration_value }, -+ { 0x0049, "SRS config - SRS AckNack SRS simultaneous transmission", dissect_srs_acknack_srs_sim_tx_value }, -+ { 0x004A, NULL, NULL }, -+ { 0x004B, NULL, NULL }, -+ { 0x004C, NULL, NULL }, -+ { 0x004D, NULL, NULL }, -+ { 0x004E, NULL, NULL }, -+ { 0x004F, NULL, NULL }, -+ { 0x0050, "Uplink reference signal config - Uplink RS hopping", dissect_uplink_rs_hopping_value }, -+ { 0x0051, "Uplink reference signal config - Group assignment (delta sequence-shift pattern)", dissect_group_assignment_value }, -+ { 0x0052, "Uplink reference signal config - Cyclic Shift 1 for DMRS", dissect_cyclic_shift_1_for_drms_value }, -+ { 0x0053, NULL, NULL }, -+ { 0x0054, NULL, NULL }, -+ { 0x0055, NULL, NULL }, -+ { 0x0056, NULL, NULL }, -+ { 0x0057, NULL, NULL }, -+ { 0x0058, NULL, NULL }, -+ { 0x0059, NULL, NULL }, -+ { 0x005A, "TDD frame structure config - Subframe assignment", dissect_tdd_subframe_assignement_value }, -+ { 0x005B, "TDD frame structure config - Special sub-frame patterns", dissect_tdd_subframe_patterns_value }, -+ { 0x005C, NULL, NULL }, -+ { 0x005D, NULL, NULL }, -+ { 0x005E, NULL, NULL }, -+ { 0x005F, NULL, NULL }, -+ { 0x0060, NULL, NULL }, -+ { 0x0061, NULL, NULL }, -+ { 0x0062, NULL, NULL }, -+ { 0x0063, NULL, NULL }, -+ { 0x0064, "LAA config - ED Threshold for LBT for PDSCH", dissect_laa_ed_threashold_for_lbt_for_pdsch_value }, -+ { 0x0065, "LAA config - ED Threshold for LBT for DRS", dissect_laa_ed_threashold_for_lbt_for_drs_value }, -+ { 0x0066, "LAA config - PD Threshold", dissect_laa_pd_threshold_value }, -+ { 0x0067, "LAA config - Multi carrier type", dissect_laa_multi_carrier_type_value }, -+ { 0x0068, "LAA config - Multi carrier TX", dissect_laa_multi_carrier_tx_value }, -+ { 0x0069, "LAA config - Multi carrier freeze", dissect_laa_multi_carrier_freeze_value }, -+ { 0x006A, "LAA config - Tx antenna ports for DRS", dissect_laa_tx_antenna_port_for_drs_value }, -+ { 0x006B, "LAA config - Transmission power for DRS", dissect_laa_transmission_power_for_drs_value }, -+ { 0x006C, NULL, NULL }, -+ { 0x006D, NULL, NULL }, -+ { 0x006E, NULL, NULL }, -+ { 0x006F, NULL, NULL }, -+ { 0x0070, NULL, NULL }, -+ { 0x0071, NULL, NULL }, -+ { 0x0072, NULL, NULL }, -+ { 0x0073, NULL, NULL }, -+ { 0x0074, NULL, NULL }, -+ { 0x0075, NULL, NULL }, -+ { 0x0076, NULL, NULL }, -+ { 0x0077, NULL, NULL }, -+ { 0x0078, "eMTC config - PBCH Repetitions enable R13", dissect_emtc_pbch_repeitions_enabled_r13_value }, -+ { 0x0079, "eMTC config - PRACH CAT-M Root sequence index", dissect_emtc_prach_cat_m_root_sequence_index_value }, -+ { 0x007A, "eMTC config - PRACH CAT-M Zero correlation zone configuration", dissect_emtc_prach_cat_m_zero_correlation_zone_configuration_value }, -+ { 0x007B, "eMTC config - PRACH CAT-M High speed flag", dissect_emtc_prach_cat_m_high_speed_flag_value }, -+ { 0x007C, "eMTC config - PRACH CE level #0 Enable", dissect_emtc_prach_ce_level_0_enabled_value }, -+ { 0x007D, "eMTC config - PRACH CE level #0 Configuration index", dissect_emtc_prach_ce_level_0_configuration_offset_value }, -+ { 0x007E, "eMTC config - PRACH CE level #0 Frequency offset", dissect_emtc_prach_ce_level_0_frequency_offset_value }, -+ { 0x007F, "eMTC config - PRACH CE level #0 Number of repetitions per attempt", dissect_emtc_preach_ce_level_0_num_of_repeitions_per_attempt_value }, -+ { 0x0080, "eMTC config - CE level #0 Starting subframe periodicity", dissect_emtc_ce_level_0_starting_subframe_periodicity_value }, -+ { 0x0081, "eMTC config - PRACH CE level #0 Hopping Enable", dissect_emtc_preach_ce_level_0_hopping_enabled_value }, -+ { 0x0082, "eMTC config - PRACH CE level #0 Hopping Offset", dissect_emtc_preach_ce_level_0_hopping_offset_value }, -+ { 0x0083, "eMTC config - PRACH CE level #1 Enable", dissect_emtc_prach_ce_level_1_enabled_value }, -+ { 0x0084, "eMTC config - PRACH CE level #1 Configuration index", dissect_emtc_prach_ce_level_1_configuration_offset_value }, -+ { 0x0085, "eMTC config - PRACH CE level #1 Frequency offset", dissect_emtc_prach_ce_level_1_frequency_offset_value }, -+ { 0x0086, "eMTC config - PRACH CE level #1 Number of repetitions per attempt", dissect_emtc_preach_ce_level_1_num_of_repeitions_per_attempt_value }, -+ { 0x0087, "eMTC config - CE level #1 Starting subframe periodicity", dissect_emtc_ce_level_1_starting_subframe_periodicity_value }, -+ { 0x0088, "eMTC config - PRACH CE level #1 Hopping Enable", dissect_emtc_preach_ce_level_1_hopping_enabled_value }, -+ { 0x0089, "eMTC config - PRACH CE level #1 Hopping Offset", dissect_emtc_preach_ce_level_1_hopping_offset_value }, -+ { 0x008A, "eMTC config - PRACH CE level #2 Enable", dissect_emtc_prach_ce_level_2_enabled_value }, -+ { 0x008B, "eMTC config - PRACH CE level #2 Configuration index", dissect_emtc_prach_ce_level_2_configuration_offset_value }, -+ { 0x008C, "eMTC config - PRACH CE level #2 Frequency offset", dissect_emtc_prach_ce_level_2_frequency_offset_value }, -+ { 0x008D, "eMTC config - PRACH CE level #2 Number of repetitions per attempt", dissect_emtc_preach_ce_level_2_num_of_repeitions_per_attempt_value }, -+ { 0x008E, "eMTC config - CE level #2 Starting subframe periodicity", dissect_emtc_ce_level_2_starting_subframe_periodicity_value }, -+ { 0x008F, "eMTC config - PRACH CE level #2 Hopping Enable", dissect_emtc_preach_ce_level_2_hopping_enabled_value }, -+ { 0x0090, "eMTC config - PRACH CE level #2 Hopping Offset", dissect_emtc_preach_ce_level_2_hopping_offset_value }, -+ { 0x0091, "eMTC config - PRACH CE level #3 Enable", dissect_emtc_prach_ce_level_3_enabled_value }, -+ { 0x0092, "eMTC config - PRACH CE level #3 Configuration index", dissect_emtc_prach_ce_level_3_configuration_offset_value }, -+ { 0x0093, "eMTC config - PRACH CE level #3 Frequency offset", dissect_emtc_prach_ce_level_3_frequency_offset_value }, -+ { 0x0094, "eMTC config - PRACH CE level #3 Number of repetitions per attempt", dissect_emtc_preach_ce_level_3_num_of_repeitions_per_attempt_value }, -+ { 0x0095, "eMTC config - CE level #3 Starting subframe periodicity", dissect_emtc_ce_level_3_starting_subframe_periodicity_value }, -+ { 0x0096, "eMTC config - PRACH CE level #3 Hopping Enable", dissect_emtc_preach_ce_level_3_hopping_enabled_value }, -+ { 0x0097, "eMTC config - PRACH CE level #3 Hopping Offset", dissect_emtc_preach_ce_level_3_hopping_offset_value }, -+ { 0x0098, "eMTC config - PUCCH Interval - ULHoppingConfigCommonModeA", dissect_emtc_pucch_interval_ul_hopping_config_common_mode_a_value }, -+ { 0x0099, "eMTC config - PUCCH Interval - ULHoppingConfigCommonModeB", dissect_emtc_pucch_interval_ul_hopping_config_common_mode_b_value }, -+ { 0x009A, NULL, NULL }, -+ { 0x009B, NULL, NULL }, -+ { 0x009C, NULL, NULL }, -+ { 0x009D, NULL, NULL }, -+ { 0x009E, NULL, NULL }, -+ { 0x009F, NULL, NULL }, -+ { 0x00A0, NULL, NULL }, -+ { 0x00A1, NULL, NULL }, -+ { 0x00A2, NULL, NULL }, -+ { 0x00A3, NULL, NULL }, -+ { 0x00A4, NULL, NULL }, -+ { 0x00A5, NULL, NULL }, -+ { 0x00A6, NULL, NULL }, -+ { 0x00A7, NULL, NULL }, -+ { 0x00A8, NULL, NULL }, -+ { 0x00A9, NULL, NULL }, -+ { 0x00AA, NULL, NULL }, -+ { 0x00AB, NULL, NULL }, -+ { 0x00AC, NULL, NULL }, -+ { 0x00AD, NULL, NULL }, -+ { 0x00AE, NULL, NULL }, -+ { 0x00AF, NULL, NULL }, -+ { 0x00B0, NULL, NULL }, -+ { 0x00B1, NULL, NULL }, -+ { 0x00B2, NULL, NULL }, -+ { 0x00B3, NULL, NULL }, -+ { 0x00B4, NULL, NULL }, -+ { 0x00B5, NULL, NULL }, -+ { 0x00B6, NULL, NULL }, -+ { 0x00B7, NULL, NULL }, -+ { 0x00B8, NULL, NULL }, -+ { 0x00B9, NULL, NULL }, -+ { 0x00BA, NULL, NULL }, -+ { 0x00BB, NULL, NULL }, -+ { 0x00BC, NULL, NULL }, -+ { 0x00BD, NULL, NULL }, -+ { 0x00BE, NULL, NULL }, -+ { 0x00BF, NULL, NULL }, -+ { 0x00C0, NULL, NULL }, -+ { 0x00C1, NULL, NULL }, -+ { 0x00C2, NULL, NULL }, -+ { 0x00C3, NULL, NULL }, -+ { 0x00C4, NULL, NULL }, -+ { 0x00C5, NULL, NULL }, -+ { 0x00C6, NULL, NULL }, -+ { 0x00C7, NULL, NULL }, -+ { 0x00C8, "Layer 2/3 - Downlink Bandwidth Support", dissect_dl_bandwidth_support_value }, -+ { 0x00C9, "Layer 2/3 - Uplink Bandwidth Support", dissect_ul_bandwidth_support_value }, -+ { 0x00CA, "Layer 2/3 - Downlink modulation support", dissect_dl_modulation_value }, -+ { 0x00CB, "Layer 2/3 - Uplink modulation support", dissect_ul_modulation_value }, -+ { 0x00CC, "Layer 2/3 - PHY antenna capability", dissect_phy_antenna_capability_value }, -+ { 0x00CD, "Layer 2/3 - Release capability", dissect_release_capability_value }, -+ { 0x00CE, "Layer 2/3 - MBSFN capability", dissect_mbsfn_value }, -+ { 0x00CF, NULL, NULL }, -+ { 0x00D0, NULL, NULL }, -+ { 0x00D1, "LAA Capability - LAA support", dissect_laa_support_value }, -+ { 0x00D2, "LAA Capability - PD sensing LBT support", dissect_laa_pd_sensing_lbt_support_value }, -+ { 0x00D3, "LAA Capability - Multi carrier LBT support", dissect_laa_multi_carrier_lbt_support_value }, -+ { 0x00D4, "LAA Capability - Partial SF support", dissect_laa_partial_sf_support_value }, -+ { 0x00D5, NULL, NULL }, -+ { 0x00D6, NULL, NULL }, -+ { 0x00D7, NULL, NULL }, -+ { 0x00D8, NULL, NULL }, -+ { 0x00D9, NULL, NULL }, -+ { 0x00DA, NULL, NULL }, -+ { 0x00DB, NULL, NULL }, -+ { 0x00DC, NULL, NULL }, -+ { 0x00DD, NULL, NULL }, -+ { 0x00DE, NULL, NULL }, -+ { 0x00DF, NULL, NULL }, -+ { 0x00E0, NULL, NULL }, -+ { 0x00E1, NULL, NULL }, -+ { 0x00E2, NULL, NULL }, -+ { 0x00E3, NULL, NULL }, -+ { 0x00E4, NULL, NULL }, -+ { 0x00E5, NULL, NULL }, -+ { 0x00E6, NULL, NULL }, -+ { 0x00E7, NULL, NULL }, -+ { 0x00E8, NULL, NULL }, -+ { 0x00E9, NULL, NULL }, -+ { 0x00EA, NULL, NULL }, -+ { 0x00EB, NULL, NULL }, -+ { 0x00EC, NULL, NULL }, -+ { 0x00ED, NULL, NULL }, -+ { 0x00EE, NULL, NULL }, -+ { 0x00EF, NULL, NULL }, -+ { 0x00F0, "Layer 2/3 - Data report mode", dissect_data_report_mode_value }, -+ { 0x00F1, "Layer 2/3 - SFN/SF", dissect_sfn_sf_value }, -+ { 0x00F2, NULL, NULL }, -+ { 0x00F3, NULL, NULL }, -+ { 0x00F4, NULL, NULL }, -+ { 0x00F5, NULL, NULL }, -+ { 0x00F6, NULL, NULL }, -+ { 0x00F7, NULL, NULL }, -+ { 0x00F8, NULL, NULL }, -+ { 0x00F9, NULL, NULL }, -+ { 0x00FA, "Layer 1 - PHY state", dissect_phy_state_value }, -+ { 0x00FB, NULL, NULL }, -+ { 0x00FC, NULL, NULL }, -+ { 0x00FD, NULL, NULL }, -+ { 0x00FE, NULL, NULL }, -+ { 0x00FF, NULL, NULL }, -+ { 0x0100, "NFAPI - P7 VNF Address IPv4", dissect_p7_vnf_address_ipv4_value }, -+ { 0x0101, "NFAPI - P7 VNF Address IPv4", dissect_p7_vnf_address_ipv6_value }, -+ { 0x0102, "NFAPI - P7 Port", dissect_p7_vnf_port_value }, -+ { 0x0103, "NFAPI - P7 PNF Address IPv4", dissect_p7_pnf_address_ipv4_value }, -+ { 0x0104, "NFAPI - P7 PNF Address IPv4", dissect_p7_pnf_address_ipv6_value }, -+ { 0x0105, "NFAPI - P7 Port", dissect_p7_pnf_port_value }, -+ { 0x0106, NULL, NULL }, -+ { 0x0107, NULL, NULL }, -+ { 0x0108, NULL, NULL }, -+ { 0x0109, NULL, NULL }, -+ { 0x010A, "NFAPI - Downlink UEs per Subframe", dissect_downlink_ues_per_subframe_value }, -+ { 0x010B, "NFAPI - Uplink UEs per Subframe", dissect_uplink_ues_per_subframe_value }, -+ { 0x010C, NULL, NULL }, -+ { 0x010D, NULL, NULL }, -+ { 0x010E, NULL, NULL }, -+ { 0x010F, NULL, NULL }, -+ { 0x0110, NULL, NULL }, -+ { 0x0111, NULL, NULL }, -+ { 0x0112, NULL, NULL }, -+ { 0x0113, NULL, NULL }, -+ { 0x0114, "NFAPI - nFAPI RF Bands", dissect_rf_bands_value }, -+ { 0x0115, NULL, NULL }, -+ { 0x0116, NULL, NULL }, -+ { 0x0117, NULL, NULL }, -+ { 0x0118, NULL, NULL }, -+ { 0x0119, NULL, NULL }, -+ { 0x011A, NULL, NULL }, -+ { 0x011B, NULL, NULL }, -+ { 0x011C, NULL, NULL }, -+ { 0x011D, NULL, NULL }, -+ { 0x011E, "NFAPI - Timing window", dissect_timing_window_value }, -+ { 0x011F, "NFAPI - Timing info mode", dissect_timing_info_mode_value }, -+ { 0x0120, "NFAPI - Timing info period", dissect_timing_info_period_value }, -+ { 0x0121, NULL, NULL }, -+ { 0x0122, NULL, NULL }, -+ { 0x0123, NULL, NULL }, -+ { 0x0124, NULL, NULL }, -+ { 0x0125, NULL, NULL }, -+ { 0x0126, NULL, NULL }, -+ { 0x0127, NULL, NULL }, -+ { 0x0128, "NFAPI - Maximum Transmit Power", dissect_maximum_transmit_power_value }, -+ { 0x0129, "NFAPI - EARFCN", dissect_earfcn_value }, -+ { 0x012A, NULL, NULL }, -+ { 0x012B, NULL, NULL }, -+ { 0x012C, NULL, NULL }, -+ { 0x012D, NULL, NULL }, -+ { 0x012E, NULL, NULL }, -+ { 0x012F, NULL, NULL }, -+ { 0x0130, "NFAPI - NMM GSM Frequency Bands", dissect_nmm_gsm_frequency_bands_value }, -+ { 0x0131, "NFAPI - NMM UMTS Frequency Bands", dissect_nmm_umts_frequency_bands_value }, -+ { 0x0132, "NFAPI - NMM LTE Frequency Bands", dissect_nmm_lte_frequency_bands_value }, -+ { 0x0133, "NFAPI - NMM Uplink RSSI supported", dissect_nmm_uplink_rssi_supported_value }, -+}; -+ -+const tlv_t p7_tags[] = -+{ -+ { 0x2000, "DL Config Request Body", dissect_dl_config_request_body_value }, -+ { 0x2001, "DL DCI PDU Release 8", dissect_dl_config_request_dl_dci_pdu_rel8_value }, -+ { 0x2002, "DL DCI PDU Release 9", dissect_dl_config_request_dl_dci_pdu_rel9_value }, -+ { 0x2003, "DL DCI PDU Release 10", dissect_dl_config_request_dl_dci_pdu_rel10_value }, -+ { 0x2004, "BCH PDU Release 8", dissect_dl_config_request_bch_pdu_rel8_value }, -+ { 0x2005, "MCH PDU Release 8", dissect_dl_config_request_mch_pdu_rel8_value }, -+ { 0x2006, "DLSCH PDU Release 8", dissect_dl_config_request_dlsch_pdu_rel8_value }, -+ { 0x2007, "DLSCH PDU Release 9", dissect_dl_config_request_dlsch_pdu_rel9_value }, -+ { 0x2008, "DLSCH PDU Release 10", dissect_dl_config_request_dlsch_pdu_rel10_value }, -+ { 0x2009, "PCH PDU Release 8", dissect_dl_config_request_pch_pdu_rel8_value }, -+ { 0x200A, "PRS PDU Release 9", dissect_dl_config_request_prs_pdu_rel9_value }, -+ { 0x200B, "CSI-RS PDU Release 10", dissect_dl_config_request_csi_rs_pdu_rel10_value }, -+ { 0x200C, "UL Config Request Body", dissect_ul_config_request_body_value }, -+ { 0x200D, "ULSCH PDU Release 8", dissect_ul_config_ulsch_pdu_rel8_value }, -+ { 0x200E, "ULSCH PDU Release 10", dissect_ul_config_ulsch_pdu_rel10_value }, -+ { 0x200F, "Initial Transmission Parameters Release 8", dissect_ul_config_init_tx_params_rel8_value }, -+ { 0x2010, "CQI RI Information Release 8", dissect_ul_config_cqi_ri_info_rel8_value }, -+ { 0x2011, "CQI RI Information Release 9 or later", dissect_ul_config_cqi_ri_info_rel9_later_value }, -+ { 0x2012, "HARQ Information (ULSCH) Release 10", dissect_ul_config_harq_info_ulsch_rel10_value }, -+ { 0x2013, "UE Information Release 8", dissect_ul_config_ue_info_rel8_value }, -+ { 0x2014, "CQI Information Release 8", dissect_ul_config_cqi_info_rel8_value }, -+ { 0x2015, "CQI Information Release 10", dissect_ul_config_cqi_info_rel10_value }, -+ { 0x2016, "SR Information Release 8", dissect_ul_config_sr_info_rel8_value }, -+ { 0x2017, "SR Information Release 10", dissect_ul_config_sr_info_rel10_value }, -+ { 0x2018, "HARQ Information (UCI) Release 10 TDD", dissect_ul_config_harq_info_uci_rel10_tdd_value }, -+ { 0x2019, "HARQ Information (UCI) Release 8 FDD", dissect_ul_config_harq_info_uci_rel8_fdd_value }, -+ { 0x201A, "HARQ Information (UCI) Release 9 or later FDD", dissect_ul_config_harq_info_uci_rel9_later_fdd_value }, -+ { 0x201B, "SRS Information Release 8", dissect_ul_config_srs_info_rel8_value }, -+ { 0x201C, "SRS Information Release 10", dissect_ul_config_srs_info_rel10_value }, -+ { 0x201D, "HI DCI0 Request Body", dissect_hi_dci0_request_body_value }, -+ { 0x201E, "HI PDU Release 8", dissect_hi_dci0_hi_rel8_value }, -+ { 0x201F, "HI PDU Release 10", dissect_hi_dci0_hi_rel10_value }, -+ { 0x2020, "DCI UL PDU Release 8", dissect_hi_dci0_dci_ul_rel8_value }, -+ { 0x2021, "DCI UL PDU Release 10", dissect_hi_dci0_dci_ul_rel10_value }, -+ { 0x2022, "Tx Request Body", dissect_tx_request_body_value }, -+ { 0x2023, "RX Indication Body", dissect_rx_indication_body_value }, -+ { 0x2024, "RX PDU Release 8", dissect_rx_indication_rel8_value }, -+ { 0x2025, "RX PDU Release 9", dissect_rx_indication_rel9_value }, -+ { 0x2026, "HARQ Indication Body", dissect_harq_indication_body_value }, -+ { 0x2027, "HARQ PDU Release 8 TDD", dissect_harq_indication_rel8_tdd_value }, -+ { 0x2028, "HARQ PDU Release 9 or later TDD", dissect_harq_indication_rel9_later_tdd_value }, -+ { 0x2029, "HARQ PDU Release 8 FDD", dissect_harq_indication_rel8_fdd_value }, -+ { 0x202A, "HARQ PDU Release 9 or later FDD", dissect_harq_indication_rel9_later_fdd_value }, -+ { 0x202B, "CRC Indication Body", dissect_crc_indication_body_value }, -+ { 0x202C, "CRC PDU Release 8", dissect_crc_indication_rel8_value }, -+ { 0x202D, "RX SR Indication Body", dissect_rx_sr_indication_body_value }, -+ { 0x202E, "RX CQI Indication Body", dissect_rx_cqi_indication_body_value }, -+ { 0x202F, "CQI PDU Release 8", dissect_rx_cqi_indication_rel8_value }, -+ { 0x2030, "CQI PDU Release 9", dissect_rx_cqi_indication_rel9_value }, -+ { 0x2031, "RACH Indication Body", dissect_rach_indication_body_value }, -+ { 0x2032, "Preamable PDU Release 8", dissect_rach_indication_rel8_value }, -+ { 0x2033, "Preamable PDU Release 9", dissect_rach_indication_rel9_value }, -+ { 0x2034, "SRS Indication Body", dissect_srs_indication_body_value }, -+ { 0x2035, "SRS PDU Release 8", dissect_srs_indication_rel8_value }, -+ { 0x2036, "SRS PDU Release 9", dissect_srs_indication_rel9_value }, -+ { 0x2037, "SRS PDU Release 10 TDD", dissect_srs_indication_rel10_tdd_value }, -+ { 0x2038, "RX UE Information", dissect_rx_ue_info_value }, -+ { 0x2039, "DL DCI PDU Release 11", dissect_dl_config_request_dl_dci_pdu_rel11_value }, -+ { 0x203A, "DL DCI PDU Release 12", dissect_dl_config_request_dl_dci_pdu_rel12_value }, -+ { 0x203B, "DL DCI PDU Release 13", dissect_dl_config_request_dl_dci_pdu_rel13_value }, -+ { 0x203C, "DLSCH PDU Release 11", dissect_dl_config_request_dlsch_pdu_rel11_value }, -+ { 0x203D, "DLSCH PDU Release 12", dissect_dl_config_request_dlsch_pdu_rel12_value }, -+ { 0x203E, "DLSCH PDU Release 13", dissect_dl_config_request_dlsch_pdu_rel13_value }, -+ { 0x203F, "PCH PDU Release 13", dissect_dl_config_request_pch_pdu_rel13_value }, -+ { 0x2040, "CSI-RS PDU Release 13", dissect_dl_config_request_csi_rs_pdu_rel13_value }, -+ { 0x2041, "EDPCCH PDU Release 11 Parameters", dissect_dl_config_request_edpcch_params_rel11_value }, -+ { 0x2042, "EDPCCH PDU Release 13 Parameters", dissect_dl_config_request_edpcch_params_rel13_value }, -+ { 0x2043, "ULSCH PDU Release 11", dissect_ul_config_ulsch_pdu_rel11_value }, -+ { 0x2044, "ULSCH PDU Release 13", dissect_ul_config_ulsch_pdu_rel13_value }, -+ { 0x2045, "CQI RI Information Release 13", dissect_ul_config_cqi_ri_info_rel13_value }, -+ { 0x2046, "HARQ Information (ULSCH) Release 13", dissect_ul_config_harq_info_ulsch_rel13_value }, -+ { 0x2047, "UE Information Release 11", dissect_ul_config_ue_info_rel11_value }, -+ { 0x2048, "UE Information Release 13", dissect_ul_config_ue_info_rel13_value }, -+ { 0x2049, "CQI Information Release 13", dissect_ul_config_cqi_info_rel13_value }, -+ { 0x204A, "HARQ Information (UCI) Release 11 FDD/TDD", dissect_ul_config_harq_info_uci_rel11_fdd_tdd_value }, -+ { 0x204B, "HARQ Information (UCI) Release 13 FDD/TDD", dissect_ul_config_harq_info_uci_rel13_fdd_tdd_value }, -+ { 0x204C, "SRS Information Release 13", dissect_ul_config_srs_info_rel13_value }, -+ { 0x204D, "DCI UL PDU Release 12", dissect_hi_dci0_dci_ul_rel12_value }, -+ { 0x204E, "MDPCCH DCI UL PDU Release 13", dissect_hi_dci0_mdpcch_dci_ul_rel13_value }, -+ { 0x204F, "HARQ PDU Release 13 or later TDD", dissect_harq_indication_rel13_later_tdd_value }, -+ { 0x2050, "HARQ PDU Release 13 or later FDD", dissect_harq_indication_rel13_later_fdd_value }, -+ { 0x2051, "Preamable PDU Release 13", dissect_rach_indication_rel13_value }, -+ { 0x2052, "UL CQI Information", dissect_ul_cqi_information_value }, -+ { 0x2053, "SRS PDU Release 11", dissect_srs_indication_rel11_value }, -+ { 0x2054, "TDD Channel Measurement", dissect_tdd_channel_measurement_value }, -+ { 0x2055, "LBT DL Config Request Body", dissect_lbt_dl_config_request_body_value }, -+ { 0x2056, "LBT PDSCH Req PDU Release 13", dissect_lbt_dl_config_request_pdsch_req_rel13_value }, -+ { 0x2057, "LBT DRS req PDU Release 13", dissect_lbt_dl_config_request_drs_req_rel13_value }, -+ { 0x2058, "LBT DL Indication Message Body", dissect_lbt_indication_message_body_value }, -+ { 0x2059, "LBT PDSCH Resp PDU Release 13", dissect_lbt_dl_config_request_pdsch_resp_rel13_value }, -+ { 0x205A, "LBT DRS Resp PDU Release 13", dissect_lbt_dl_config_request_drs_resp_rel13_value }, -+ { 0x205B, "MPDCCH PDU Release 13", dissect_dl_config_request_mpdpcch_pdu_rel13_value }, -+}; -+ -+const tlv_t p4_tags[] = -+{ -+ { 0x3000, "LTE RSSI Request", dissect_lte_rssi_request_value }, -+ { 0x3001, "UTRAN RSSI Request", dissect_utran_rssi_request_value }, -+ { 0x3002, "GERAN RSSI Request", dissect_geran_rssi_request_value }, -+ { 0x3003, "RSSI Indication", dissect_rssi_indication_value }, -+ { 0x3004, "LTE CELL SEARCH Request", dissect_lte_cell_search_value }, -+ { 0x3005, "UTRAN CELL SEARCH Request", dissect_utran_cell_search_value }, -+ { 0x3006, "GERAN CELL SEARCH Request", dissect_geran_cell_search_value }, -+ { 0x3007, "LTE CELL SEARCH Indication", dissect_lte_cell_search_indication_value }, -+ { 0x3008, "UTRAN CELL SEARCH Indication", dissect_utran_cell_search_indication_value }, -+ { 0x3009, "GERAN CELL SEARCH Indication", dissect_geran_cell_search_indication_value }, -+ { 0x300A, "PNF CELL SEARCH STATE", dissect_pnf_cell_search_state_value }, -+ { 0x300B, "LTE BROADCAST DETECT Request", dissect_lte_broadcast_detect_request_value }, -+ { 0x300C, "UTRAN BROADCAST DETECT Request", dissect_utran_broadcast_detect_request_value }, -+ { 0x300D, "PNF CELL SEARCH STATE", dissect_pnf_cell_search_state_value }, -+ { 0x300E, "LTE BROADCAST DETECT Indication", dissect_lte_broadcast_detect_indication_value }, -+ { 0x300F, "UTRAN BROADCAST DETECT Indication", dissect_utran_broadcast_detect_indication_value }, -+ { 0x3010, "PNF CELL BROADCAST STATE", dissect_pnf_cell_broadcast_state_value }, -+ { 0x3011, "LTE SYSTEM INFORMATION SCHEDULE Request", dissect_lte_system_information_schedule_request_value }, -+ { 0x3012, "PNF CELL BROADCAST STATE", dissect_pnf_cell_broadcast_state_value }, -+ { 0x3013, "LTE SYSTEM INFORMATION SCHEDULE Indication", dissect_lte_system_information_schedule_indication_value }, -+ { 0x3014, "LTE SYSTEM INFORMATION Request", dissect_lte_system_information_request_value }, -+ { 0x3015, "UTRAN SYSTEM INFORMATION Request", dissect_utran_system_information_request_value }, -+ { 0x3016, "GERAN SYSTEM INFORMATION Request", dissect_geran_system_information_request_value }, -+ { 0x3017, "PNF CELL BROADCAST STATE", dissect_pnf_cell_broadcast_state_value }, -+ { 0x3018, "LTE SYSTEM INFORMATION Indication", dissect_lte_system_information_indication_value }, -+ { 0x3019, "UTRAN SYSTEM INFORMATION Indication", dissect_utran_system_information_indication_value }, -+ { 0x301A, "GERAN SYSTEM INFORMATION Indication", dissect_geran_system_information_indication_value }, -+}; -+ -+ -+static const tlv_t* look_up_tlv(int tag_id) -+{ -+ const tlv_t* tlv = NULL; -+ -+ static const gint num_configuration_tags = sizeof(configuration_tags) / sizeof(tlv_t); -+ static const gint num_nfapi_tags = sizeof(nfapi_tags) / sizeof(tlv_t); -+ static const gint num_p7_tags = sizeof(p7_tags) / sizeof(tlv_t); -+ static const gint num_p4_tags = sizeof(p4_tags) / sizeof(tlv_t); -+ -+ if (tag_id >= 0x0000 && tag_id <= (0x0000 + num_configuration_tags - 1)) // 0x0133) -+ { -+ tlv = &configuration_tags[tag_id]; -+ } -+ else if (tag_id >= 0x1000 && tag_id <= (0x1000 + num_nfapi_tags - 1)) // 0x100D) -+ { -+ tlv = &nfapi_tags[tag_id - 0x1000]; -+ } -+ else if (tag_id >= 0x2000 && tag_id <= (0x2000 + num_p7_tags - 1)) //0x205B) -+ { -+ tlv = &p7_tags[tag_id - 0x2000]; -+ } -+ else if (tag_id >= 0x3000 && tag_id <= (0x3000 + num_p4_tags - 1)) // 0x301A) -+ { -+ tlv = &p4_tags[tag_id - 0x3000]; -+ } -+ return tlv; -+} -+ -+ -+static proto_item* dissect_tl_header(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tl, "TL"); -+ ptvcursor_add(ptvc, hf_nfapi_tl_tag, 2, ENC_BIG_ENDIAN); -+ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_tl_length, 2, ENC_BIG_ENDIAN); -+ ptvcursor_pop_subtree(ptvc); -+ -+ return item; -+} -+ -+static void dissect_tlv_list(ptvcursor_t* ptvc, packet_info* pinfo, gint len) -+{ -+ while (ptvcursor_current_offset(ptvc) < len) -+ { -+ guint16 tlv_id = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ guint16 tlv_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc) + 2); -+ -+ const tlv_t* tlv = look_up_tlv(tlv_id); -+ -+ if (tlv != NULL && tlv->name != NULL && tlv->tag_id == tlv_id) -+ { -+ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "%s", tlv->name); -+ proto_item* tlv_length_item = dissect_tl_header(ptvc, pinfo); -+ -+ // There are rare cases where the len of the tlv is 0. -+ if (tlv_len > 0) -+ { -+ -+ if (tlv->decode != NULL) -+ { -+ // Create a sub buff with the correct length, so we can detect reading off the end -+ tvbuff_t* sub_tvbuff = tvb_new_subset_length(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), tlv_len); -+ ptvcursor_t* sub_ptvc = ptvcursor_new(ptvcursor_tree(ptvc), sub_tvbuff, 0); -+ -+ tlv->decode(sub_ptvc, pinfo); -+ -+ if (ptvcursor_current_offset(sub_ptvc) != tlv_len) -+ { -+ // error in the tlv length -+ expert_add_info_format(pinfo, tlv_length_item, &ei_invalid_tlv_length, "TLV length does not match decoded length"); -+ } -+ -+ ptvcursor_free(sub_ptvc); -+ } -+ -+ ptvcursor_advance(ptvc, tlv_len); -+ } -+ -+ ptvcursor_pop_subtree(ptvc); -+ } -+ else -+ { -+ if (tlv_id >= 0xF000 /* && tlv_id <= 0xFFFF*/) -+ { -+ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "Unknown Vendor Extension Tag"); -+ } -+ else -+ { -+ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "Unknown"); -+ } -+ -+ dissect_tl_header(ptvc, pinfo); -+ ptvcursor_advance(ptvc, tlv_len); -+ ptvcursor_pop_subtree(ptvc); -+ } -+ } -+} -+ -+ -+static void dissect_rx_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ guint number_of_pdu_addr = ptvcursor_current_offset(ptvc); // *offset; -+ guint16 count = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_number_pdus, 2, ENC_BIG_ENDIAN); -+ -+ guint16* lengths = (guint16*)wmem_alloc0(wmem_packet_scope(), count * 2); -+ memset(lengths, 0, count * 2); -+ -+ guint16 i = 0; -+ -+ if (count > 0) -+ { -+ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_rx_indication_pdu_list, "RX PDU List"); -+ gint pdu_end = tvb_reported_length_remaining(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)) + ptvcursor_current_offset(ptvc); -+ -+ while (tvb_reported_length_remaining(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)) > 0 && -+ ptvcursor_current_offset(ptvc) < pdu_end ) -+ { -+ guint16 tlv_id = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ //guint16 tlv_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc) + 2); -+ -+ if (tlv_id == 0x2038) -+ { -+ if (i != 0) -+ ptvcursor_pop_subtree(ptvc); -+ -+ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_rx_indication_pdu_list, "[%d]", i); -+ -+ i++; -+ } -+ -+ char* tlv_name = "Unknown"; -+ const tlv_t* tlv = look_up_tlv(tlv_id); -+ -+ if (tlv != NULL && tlv->name != NULL && tlv->tag_id == tlv_id) -+ { -+ tlv_name = tlv->name; -+ } -+ -+ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_rx_indication_pdu_list, "%s", tlv_name); -+ -+ dissect_tl_header(ptvc, pinfo); -+ -+ -+ if (tlv_id == 0x2038) -+ { -+ dissect_rx_ue_info_value(ptvc, pinfo); -+ } -+ else if (tlv_id == 0x2024) -+ { -+ lengths[i - 1] = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN); -+ int data_offset = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_data_offset, 2, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_ul_cqi, 1, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN); -+ -+ if ((data_offset > 0) && (pdu_end == (tvb_reported_length_remaining(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)) + ptvcursor_current_offset(ptvc)))) -+ { -+ pdu_end = number_of_pdu_addr + data_offset; -+ } -+ -+ } -+ else if (tlv_id == 0x2025) -+ { -+ dissect_rx_indication_rel9_value(ptvc, pinfo); -+ } -+ -+ ptvcursor_pop_subtree(ptvc); -+ -+ } -+ -+ // pop the last pdu index. -+ ptvcursor_pop_subtree(ptvc); -+ -+ ptvcursor_pop_subtree(ptvc); -+ } -+ -+ for (i = 0; i < count; ++i) -+ { -+ ptvcursor_add(ptvc, hf_nfapi_pdu, lengths[i], ENC_NA); -+ } -+} -+ -+ -+// ----------------------------------------------------------------------------| -+ -+static void dissect_p45_header(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_p4_p5_message_header, "P4 P5 Header"); -+ ptvcursor_add(ptvc, hf_nfapi_p4_p5_message_header_phy_id, 2, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_p4_p5_message_header_message_id, 2, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_p4_p5_message_header_message_length, 2, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_p4_p5_message_header_spare, 2, ENC_BIG_ENDIAN); -+ ptvcursor_pop_subtree(ptvc); -+ -+} -+ -+static void dissect_p7_header_new(ptvcursor_t* ptvc, guint8* m, guint8* seg, guint8* seq) -+{ -+ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_p7_message_header, "P7 Header"); -+ -+ ptvcursor_add(ptvc, hf_nfapi_p7_message_header_phy_id, 2, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_p7_message_header_message_id, 2, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_p7_message_header_message_length, 2, ENC_BIG_ENDIAN); -+ -+ guint8 m_seg = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ *m = (m_seg & 0x80) >> 7; -+ *seg = m_seg & 0x7F; -+ -+ proto_tree_add_bits_item(ptvcursor_tree(ptvc), hf_nfapi_p7_message_header_m, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8, 1, ENC_NA); -+ proto_tree_add_bits_item(ptvcursor_tree(ptvc), hf_nfapi_p7_message_header_segment, ptvcursor_tvbuff(ptvc), ((ptvcursor_current_offset(ptvc)) * 8) + 1, 7, ENC_NA); -+ ptvcursor_advance(ptvc, 1); -+ -+ -+ *seq = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); -+ ptvcursor_add(ptvc, hf_nfapi_p7_message_header_sequence_number, 1, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_p7_message_header_checksum, 4, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_p7_message_header_transmit_timestamp, 4, ENC_BIG_ENDIAN); -+ -+ ptvcursor_pop_subtree(ptvc); -+} -+ -+ -+static void dissect_p7_header(ptvcursor_t * ptvc, packet_info* pinfo _U_) -+{ -+ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_p7_message_header, "P7 Header"); -+ ptvcursor_add(ptvc, hf_nfapi_p7_message_header_phy_id, 2, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_p7_message_header_message_id, 2, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_p7_message_header_message_length, 2, ENC_BIG_ENDIAN); -+ -+ proto_tree_add_bits_item(ptvcursor_tree(ptvc), hf_nfapi_p7_message_header_m, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8, 1, ENC_NA); -+ proto_tree_add_bits_item(ptvcursor_tree(ptvc), hf_nfapi_p7_message_header_segment, ptvcursor_tvbuff(ptvc), ((ptvcursor_current_offset(ptvc)) * 8) + 1, 7, ENC_NA); -+ ptvcursor_advance(ptvc, 1); -+ -+ ptvcursor_add(ptvc, hf_nfapi_p7_message_header_sequence_number, 1, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_p7_message_header_checksum, 4, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_p7_message_header_transmit_timestamp, 4, ENC_BIG_ENDIAN); -+ -+ ptvcursor_pop_subtree(ptvc); -+} -+ -+static reassembly_table ul_p7_reassemble_table; -+static reassembly_table dl_p7_reassemble_table; -+ -+static int hf_msg_fragments = -1; -+static int hf_msg_fragment = -1; -+static int hf_msg_fragment_overlap = -1; -+static int hf_msg_fragment_overlap_conflicts = -1; -+static int hf_msg_fragment_multiple_tails = -1; -+static int hf_msg_fragment_too_long_fragment = -1; -+static int hf_msg_fragment_error = -1; -+static int hf_msg_fragment_count = -1; -+static int hf_msg_reassembled_in = -1; -+static int hf_msg_reassembled_length = -1; -+static gint ett_msg_fragment = -1; -+static gint ett_msg_fragments = -1; -+ -+static const fragment_items msg_frag_items = { -+ /* Fragment subtrees */ -+ &ett_msg_fragment, -+ &ett_msg_fragments, -+ /* Fragment fields */ -+ &hf_msg_fragments, -+ &hf_msg_fragment, -+ &hf_msg_fragment_overlap, -+ &hf_msg_fragment_overlap_conflicts, -+ &hf_msg_fragment_multiple_tails, -+ &hf_msg_fragment_too_long_fragment, -+ &hf_msg_fragment_error, -+ &hf_msg_fragment_count, -+ /* Reassembled in field */ -+ &hf_msg_reassembled_in, -+ /* Reassembled length field */ -+ &hf_msg_reassembled_length, -+ NULL, -+ /* Tag */ -+ "Message fragments" -+}; -+ -+static void dissect_nfapi_ul_p7(ptvcursor_t *ptvc, packet_info *pinfo) -+{ -+ guint8 m; -+ guint8 seg; -+ guint8 seq; -+ -+ guint8 save_fragmented; -+ ptvcursor_t* sub_ptvc = 0; -+ -+ guint16 msg_id = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), 2); -+ guint16 msg_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), 4); -+ -+ dissect_p7_header_new(ptvc, &m, &seg, &seq); -+ save_fragmented = pinfo->fragmented; -+ -+ if (m == 1 || (m == 0 && seg > 0)) -+ { -+ tvbuff_t* tvbuff = ptvcursor_tvbuff(ptvc); -+ guint offset = ptvcursor_current_offset(ptvc); -+ proto_tree* tree = ptvcursor_tree(ptvc); -+ -+ pinfo->fragmented = TRUE; -+ -+ fragment_head *fd_head = fragment_add_seq_check(&ul_p7_reassemble_table, tvbuff, offset, pinfo, seq, NULL, seg, msg_len - offset, (m == 1)); -+ -+ if (fd_head) -+ { -+ tvbuff_t * new_tvb = process_reassembled_data(tvbuff, offset, pinfo, "Reassembled UL P7", fd_head, &msg_frag_items, NULL, tree); -+ if (new_tvb) -+ { -+ sub_ptvc = ptvcursor_new(tree, new_tvb, 0); -+ -+ col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Reassembled %d]", seg); -+ } -+ else -+ { -+ col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Segment %d]", seg); -+ return; -+ } -+ } -+ else -+ { -+ return; -+ } -+ } -+ -+ pinfo->fragmented = save_fragmented; -+ -+ { -+ switch (msg_id) -+ { -+ case NFAPI_HARQ_INDICATION_MSG_ID: -+ { -+ ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); -+ dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); -+ } -+ break; -+ case NFAPI_CRC_INDICATION_MSG_ID: -+ { -+ ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); -+ dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); -+ } -+ break; -+ case NFAPI_RX_ULSCH_INDICATION_MSG_ID: -+ { -+ ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); -+ dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); -+ } -+ break; -+ case NFAPI_RACH_INDICATION_MSG_ID: -+ { -+ ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); -+ dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); -+ } -+ break; -+ case NFAPI_SRS_INDICATION_MSG_ID: -+ { -+ ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); -+ dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); -+ } -+ break; -+ case NFAPI_RX_SR_INDICATION_MSG_ID: -+ { -+ ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); -+ dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); -+ } -+ break; -+ case NFAPI_RX_CQI_INDICATION_MSG_ID: -+ { -+ ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); -+ dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); -+ } -+ break; -+ -+ }; -+ } -+ -+ if (sub_ptvc) -+ ptvcursor_free(sub_ptvc); -+} -+ -+static void dissect_nfapi_dl_p7(ptvcursor_t *ptvc, packet_info *pinfo) -+{ -+ guint8 m; -+ guint8 seg; -+ guint8 seq; -+ -+ guint8 save_fragmented; -+ ptvcursor_t* sub_ptvc = 0; -+ -+ guint16 msg_id = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), 2); -+ guint16 msg_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), 4); -+ -+ dissect_p7_header_new(ptvc, &m, &seg, &seq); -+ save_fragmented = pinfo->fragmented; -+ -+ if (m == 1 || (m == 0 && seg > 0)) -+ { -+ tvbuff_t* tvbuff = ptvcursor_tvbuff(ptvc); -+ guint offset = ptvcursor_current_offset(ptvc); -+ proto_tree* tree = ptvcursor_tree(ptvc); -+ -+ pinfo->fragmented = TRUE; -+ -+ fragment_head *fd_head = fragment_add_seq_check(&dl_p7_reassemble_table, tvbuff, offset, pinfo, seq, NULL, seg, msg_len - offset, (m == 1)); -+ -+ if (fd_head) -+ { -+ tvbuff_t * new_tvb = process_reassembled_data(tvbuff, offset, pinfo, "Reassembled DL P7", fd_head, &msg_frag_items, NULL, tree); -+ if (new_tvb) -+ { -+ sub_ptvc = ptvcursor_new(tree, new_tvb, 0); -+ col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Reassembled %d]", seg); -+ } -+ else -+ { -+ col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Segment %d]", seg); -+ return; -+ } -+ } -+ else -+ { -+ return; -+ } -+ } -+ -+ pinfo->fragmented = save_fragmented; -+ -+ switch (msg_id) -+ { -+ case NFAPI_DL_CONFIG_REQUEST_MSG_ID: -+ { -+ ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); -+ dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); -+ break; -+ } -+ case NFAPI_UL_CONFIG_REQUEST_MSG_ID: -+ { -+ ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); -+ dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); -+ } -+ break; -+ case NFAPI_HI_DCI0_REQUEST_MSG_ID: -+ { -+ ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); -+ dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); -+ } -+ break; -+ case NFAPI_TX_REQUEST_MSG_ID: -+ { -+ ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); -+ dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); -+ } -+ break; -+ case NFAPI_LBT_DL_CONFIG_REQUEST_MSG_ID: -+ { -+ ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); -+ dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); -+ } -+ break; -+ case NFAPI_LBT_DL_INDICATION_MSG_ID: -+ { -+ ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); -+ dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); -+ break; -+ } -+ } -+ -+ if (sub_ptvc) -+ ptvcursor_free(sub_ptvc); -+} -+ -+ -+static int dissect_nfapi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) -+{ -+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "NFAPI"); -+ -+ ptvcursor_t* ptvc = ptvcursor_new(tree, tvb, 0); -+ -+ guint16 msg_id = tvb_get_ntohs(tvb, 2); -+ -+ // Get the name of the message -+ const gchar* message_str = val_to_str_const(msg_id, message_id_vals, "Unknown"); -+ -+ // Append to the Info string the nFAPI messages -+ col_clear(pinfo->cinfo, COL_INFO); -+ col_append_fstr(pinfo->cinfo, COL_INFO, " %s ", message_str); -+ -+ // Flag if this is a vendor extention message, could do it for P4, 5, 7 -+ if (msg_id >= 0x0300 && msg_id <= 0x03FF) -+ { -+ col_append_fstr(pinfo->cinfo, COL_INFO, " Vendor Extension"); -+ } -+ -+ // Create the top level tree -+ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_message_tree, "%s", message_str); -+ -+ switch (msg_id) -+ { -+ case NFAPI_HARQ_INDICATION_MSG_ID: -+ case NFAPI_CRC_INDICATION_MSG_ID: -+ case NFAPI_RX_ULSCH_INDICATION_MSG_ID: -+ case NFAPI_RACH_INDICATION_MSG_ID: -+ case NFAPI_SRS_INDICATION_MSG_ID: -+ case NFAPI_RX_SR_INDICATION_MSG_ID: -+ case NFAPI_RX_CQI_INDICATION_MSG_ID: -+ { -+ dissect_nfapi_ul_p7(ptvc, pinfo); -+ } - break; -- // LBT_DL.indication -- case 0x8D: -- { -- dissect_p7_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint16_with_conversion(msg_tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); -- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); -- break; -- } -- // PNF_PARAM.request -- case 0x100: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); -- break; -- } -- // PNF_PARAM.response -- case 0x101: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0); -- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); -- break; -- } -- // PNF_CONFIG.request -- case 0x102: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); -- break; -- } -- // PNF_CONFIG.response -- case 0x103: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0); -- break; -- } -- // PNF_START.request -- case 0x104: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- break; -- } -- // PNF_START.response -- case 0x105: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0); -- break; -- } -- // PNF_STOP.response -- case 0x106: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- break; -- } -- // PNF_STOP.request -- case 0x107: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0); -- break; -- } -- // PARAM.request -- case 0x108: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- break; -- } -- // PARAM.response -- case 0x109: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0); -- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); -- break; -- } -- // CONFIG.request -- case 0x10A: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint8(msg_tree, hf_nfapi_num_tlv, tvb, &offset, 0); -- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); -- break; -- } -- // CONFIG.response -- case 0x10B: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0); -- break; -- } -- // START.request -- case 0x10C: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- break; -- } -- // START.response -- case 0x10D: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0); -- break; -- } -- // STOP.request -- case 0x10E: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- break; -- } -- // STOP.response -- case 0x10F: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0); -- break; -- } -- // MEASUREMENT.request -- case 0x110: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); -- break; -+ -+ case NFAPI_DL_CONFIG_REQUEST_MSG_ID: -+ case NFAPI_UL_CONFIG_REQUEST_MSG_ID: -+ case NFAPI_HI_DCI0_REQUEST_MSG_ID: -+ case NFAPI_TX_REQUEST_MSG_ID: -+ case NFAPI_LBT_DL_CONFIG_REQUEST_MSG_ID: -+ case NFAPI_LBT_DL_INDICATION_MSG_ID: -+ { -+ dissect_nfapi_dl_p7(ptvc, pinfo); -+ break; -+ } -+ -+ case NFAPI_PNF_PARAM_REQUEST_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); -+ break; -+ } -+ case NFAPI_PNF_PARAM_RESPONSE_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN); -+ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); -+ -+ break; -+ } -+ case NFAPI_PNF_CONFIG_REQUEST_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); -+ break; -+ } -+ case NFAPI_PNF_CONFIG_RESPONSE_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN); -+ break; -+ } -+ case NFAPI_PNF_START_REQUEST_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ break; -+ } -+ case NFAPI_PNF_START_RESPONSE_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN); -+ break; -+ } -+ case NFAPI_PNF_STOP_REQUEST_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ break; -+ } -+ case NFAPI_PNF_STOP_RESPONSE_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN); -+ break; -+ } -+ case NFAPI_PARAM_REQUEST_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ break; -+ } -+ case NFAPI_PARAM_RESPONSE_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_error_code, 1, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_num_tlv, 1, ENC_BIG_ENDIAN); -+ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); -+ break; -+ } -+ case NFAPI_CONFIG_REQUEST_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_error_code, 1, ENC_BIG_ENDIAN); -+ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); -+ break; -+ } -+ case NFAPI_CONFIG_RESPONSE_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN); -+ break; -+ } -+ case NFAPI_START_REQUEST_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ break; -+ } -+ case NFAPI_START_RESPONSE_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN); -+ break; -+ } -+ case NFAPI_STOP_REQUEST_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ break; -+ } -+ case NFAPI_STOP_RESPONSE_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN); -+ break; -+ } -+ case NFAPI_MEASUREMENT_REQUEST_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); -+ break; -+ } -+ case NFAPI_MEASUREMENT_RESPONSE_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN); -+ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); -+ break; -+ } -+ -+ // P4 -+ case NFAPI_RSSI_REQUEST_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_rat_type, 1, ENC_BIG_ENDIAN); -+ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); -+ break; -+ } -+ case NFAPI_RSSI_RESPONSE_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); -+ break; -+ } -+ case NFAPI_RSSI_INDICATION_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); -+ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); -+ break; -+ } -+ case NFAPI_CELL_SEARCH_REQUEST_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_rat_type, 1, ENC_BIG_ENDIAN); -+ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); -+ break; - } -- // MEASUREMENT.response -- case 0x111: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0); -- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); -- break; -- } -- -- // P4 -- // RSSI.request -- case 0x200: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint8(msg_tree, hf_nfapi_rat_type, tvb, &offset, 0); -- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); -- break; -+ case NFAPI_CELL_SEARCH_RESPONSE_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); -+ break; - } -- // RSSI.response -- case 0x201: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); -- break; -+ case NFAPI_CELL_SEARCH_INDICATION_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); -+ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); -+ break; - } -- // RSSI.indication -- case 0x202: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); -- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); -- break; -+ case NFAPI_BROADCAST_DETECT_REQUEST_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_rat_type, 1, ENC_BIG_ENDIAN); -+ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); -+ break; - } -- // CELL_SEARCH.request -- case 0x203: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint8(msg_tree, hf_nfapi_rat_type, tvb, &offset, 0); -- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); -- break; -+ case NFAPI_BROADCAST_DETECT_RESPONSE_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); -+ break; - } -- // CELL_SEARCH.response -- case 0x204: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); -- break; -+ case NFAPI_BROADCAST_DETECT_INDICATION_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); -+ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); -+ break; - } -- // CELL_SEARCH.indication -- case 0x205: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); -- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); -- break; -+ case NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_rat_type, 1, ENC_BIG_ENDIAN); -+ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); -+ break; - } -- // BROADCAST_DETECT.request -- case 0x206: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint8(msg_tree, hf_nfapi_rat_type, tvb, &offset, 0); -- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); -- break; -+ case NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); -+ break; - } -- // BROADCAST_DETECT.response -- case 0x207: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); -- break; -+ case NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); -+ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); -+ break; - } -- // BROADCAST_DETECT.indication -- case 0x208: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); -- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); -- break; -+ case NFAPI_SYSTEM_INFORMATION_REQUEST_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_rat_type, 1, ENC_BIG_ENDIAN); -+ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); -+ break; - } -- // SYSTEM_INFORMATION_SCHEDULE.request -- case 0x209: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint8(msg_tree, hf_nfapi_rat_type, tvb, &offset, 0); -- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); -- break; -+ case NFAPI_SYSTEM_INFORMATION_RESPONSE_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); -+ break; - } -- // SYSTEM_INFORMATOIN_SCHEDULE.response -- case 0x20A: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); -- break; -+ case NFAPI_SYSTEM_INFORMATION_INDICATION_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); -+ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); -+ break; - } -- // SYSTEM_INFORMATION_SCHEDULE.indication -- case 0x20B: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); -- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); -- break; -+ case NFAPI_NMM_STOP_REQUEST_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ break; - } -- // SYSTEM_INFORMATION.request -- case 0x20C: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint8(msg_tree, hf_nfapi_rat_type, tvb, &offset, 0); -- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); -- break; -+ case NFAPI_NMM_STOP_RESPONSE_MSG_ID: -+ { -+ dissect_p45_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); -+ break; - } -- // SYSTEM_INFORMATION.response -- case 0x20D: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); -- break; -+ case NFAPI_DL_NODE_SYNC_MSG_ID: -+ { -+ dissect_p7_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_ul_node_sync_t1, 4, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_ul_node_sync_t2, 4, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_ul_node_sync_t3, 4, ENC_BIG_ENDIAN); -+ break; - } -- // SYSTEM_INFORMATION.indication -- case 0x20E: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); -- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); -- break; -+ case NFAPI_UL_NODE_SYNC_MSG_ID: -+ { -+ dissect_p7_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_dl_node_sync_t1, 4, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_dl_node_sync_delta_sfn_sf, 4, ENC_BIG_ENDIAN); -+ break; - } -- // NMM_STOP.request -- case 0x20F: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- break; -+ case NFAPI_TIMING_INFO_MSG_ID: -+ { -+ dissect_p7_header(ptvc, pinfo); -+ ptvcursor_add(ptvc, hf_nfapi_timing_info_last_sfn_sf, 4, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_timing_info_time_since_last_timing_info, 4, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_timing_info_dl_config_jitter, 4, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_timing_info_tx_request_jitter, 4, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_timing_info_ul_config_jitter, 4, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_timing_info_hi_dci0_jitter, 4, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_timing_info_dl_config_latest_delay, 4, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_timing_info_tx_request_latest_delay, 4, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_timing_info_ul_config_latest_delay, 4, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_timing_info_hi_dci0_latest_delay, 4, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_timing_info_dl_config_earliest_arrival, 4, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_timing_info_tx_request_earliest_arrival, 4, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_timing_info_ul_config_earliest_arrival, 4, ENC_BIG_ENDIAN); -+ ptvcursor_add(ptvc, hf_nfapi_timing_info_hi_dci0_earliest_arrival, 4, ENC_BIG_ENDIAN); -+ break; - } -- // NMM_STOP_response -- case 0x210: -- { -- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); -- break; -- } -- -- // DL_NODE.sync -- case 0x0180: -- { -- dissect_p7_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint32(msg_tree, hf_nfapi_ul_node_sync_t1, tvb, &offset, "microseconds"); -- proto_tree_add_uint32(msg_tree, hf_nfapi_ul_node_sync_t2, tvb, &offset, "microseconds"); -- proto_tree_add_uint32(msg_tree, hf_nfapi_ul_node_sync_t3, tvb, &offset, "microseconds"); -- break; -- } -- // UL_NODE.sync -- case 0x0181: -- { -- dissect_p7_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint32(msg_tree, hf_nfapi_dl_node_sync_t1, tvb, &offset, "microseconds"); -- proto_tree_add_uint32(msg_tree, hf_nfapi_dl_node_sync_delta_sfn_sf, tvb, &offset, 0); -- break; -- } -- // TIMING_INFO -- case 0x0182: -- { -- dissect_p7_header(tvb, pinfo, msg_tree, data, &offset); -- proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_last_sfn_sf, tvb, &offset, 0); -- proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_time_since_last_timing_info, tvb, &offset, 0); -- proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_dl_config_jitter, tvb, &offset, 0); -- proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_tx_request_jitter, tvb, &offset, 0); -- proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_ul_config_jitter, tvb, &offset, 0); -- proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_hi_dci0_jitter, tvb, &offset, 0); -- proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_dl_config_latest_delay, tvb, &offset, 0); -- proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_tx_request_latest_delay, tvb, &offset, 0); -- proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_ul_config_latest_delay, tvb, &offset, 0); -- proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_hi_dci0_latest_delay, tvb, &offset, 0); -- proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_dl_config_earliest_arrival, tvb, &offset, 0); -- proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_tx_request_earliest_arrival, tvb, &offset, 0); -- proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_ul_config_earliest_arrival, tvb, &offset, 0); -- proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_hi_dci0_earliest_arrival, tvb, &offset, 0); -- break; -- } -- default: -- { -- // todo : is this vendor extention? -- break; -- } -- }; -- -- return tvb_captured_length(tvb); --} -- --static void nfapi_tag_vals_fn(gchar* s, guint32 v) --{ -- int index = look_up_tlv(v); -- if (v >= 0) -- { -- g_snprintf(s, ITEM_LABEL_LENGTH, "%s (0x%x)", tags[index].name, v); -- } -- else -- { -- g_snprintf(s, ITEM_LABEL_LENGTH, "%s (0x%x)", "Unknown", v); -- } --} -- --// ----------------------------------------------------------------------------| -- --void proto_register_nfapi(void) --{ -- -- static hf_register_info hf[] = -- { -- { &hf_msg_fragments, { "Message fragments", "afs.fragments", FT_NONE, BASE_NONE, NULL, 0x00, NULL, HFILL } }, -- { &hf_msg_fragment, { "Message fragment", "afs.fragment", FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL } }, -- { &hf_msg_fragment_overlap, { "Message fragment overlap", "afs.fragment.overlap", FT_BOOLEAN, 0, NULL, 0x00, NULL, HFILL } }, -- { &hf_msg_fragment_overlap_conflicts, { "Message fragment overlapping with conflicting data", "afs.fragment.overlap.conflicts", FT_BOOLEAN, 0, NULL, 0x00, NULL, HFILL } }, -- { &hf_msg_fragment_multiple_tails, { "Message has multiple tail fragments", "afs.fragment.multiple_tails", FT_BOOLEAN, 0, NULL, 0x00, NULL, HFILL } }, -- { &hf_msg_fragment_too_long_fragment, { "Message fragment too long", "afs.fragment.too_long_fragment", FT_BOOLEAN, 0, NULL, 0x00, NULL, HFILL } }, -- { &hf_msg_fragment_error, { "Message defragmentation error", "afs.fragment.error", FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL } }, -- { &hf_msg_fragment_count, { "Message fragment count", "afs.fragment.count", FT_UINT32, BASE_DEC, NULL, 0x00, NULL, HFILL } }, -- { &hf_msg_reassembled_in, { "Reassembled in", "afs.reassembled.in", FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL } }, -- { &hf_msg_reassembled_length, { "Reassembled length", "afs.reassembled.length", FT_UINT32, BASE_DEC, NULL, 0x00, NULL, HFILL } }, -- { &hf_msg_reassembled_data, { "Reassembled data", "afs.reassembled.data", FT_UINT32, BASE_DEC, NULL, 0x00, NULL, HFILL } }, -- { &hf_nfapi_message_tree, { "Message tree", "nfapi.message_tree", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_p4_p5_message_header, { "P4 P5 Header", "nfapi.p4_p5_message_header", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_p4_p5_message_header_phy_id, { "PHY ID", "nfapi.p4_p5_message_header.phy_id", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_p4_p5_message_header_message_id, { "Message ID", "nfapi.p4_p5_message_header.message_id", FT_UINT16, BASE_HEX_DEC, VALS(message_id_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_p4_p5_message_header_message_length, { "Message Length", "nfapi.p4_p5_message_header.message_length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_p4_p5_message_header_spare, { "Spare", "nfapi.p4_p5_message_header.spare", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_p7_message_header, { "P7 Header", "nfapi.p7_message_header", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_p7_message_header_phy_id, { "Phy ID", "nfapi.p7_message_header.phy_id", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_p7_message_header_message_id, { "Message ID", "nfapi.p7.message_header.message_id", FT_UINT16, BASE_HEX_DEC, VALS(message_id_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_p7_message_header_message_length, { "Message Length", "nfapi.p7_message_header.message_length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_p7_message_header_m, { "M", "nfapi.p7_message_header.m_segment_sequence", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_p7_message_header_segment, { "Segment Number", "nfapi.p7_message_header.m_segment_sequence", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_p7_message_header_sequence_number, { "Sequence Number", "nfapi.p7_message_header.m_segment_sequence", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_p7_message_header_checksum, { "Checksum", "nfapi.p7_message_header.checksum", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_p7_message_header_transmit_timestamp, { "Transmit Timestamp", "nfapi.p7_message_header.timestamp", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_tlv_tree, { "TAG", "nfapi.tlv.tree", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_tl, { "TL", "nfapi.tl", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_tl_tag, { "TL Tag", "nfapi.tl_tag", FT_UINT16, BASE_CUSTOM, CF_FUNC(nfapi_tag_vals_fn), 0x0, NULL, HFILL } }, -- { &hf_nfapi_tl_length, { "TL Length", "nfapi.tl_length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_tag_uint8_value, { "Value", "nfapi.tag.uint8.value", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_tag_uint16_value, { "Value", "nfapi.tag.uint16.value", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_param_response, { "Param Request", "nfapi.param.request", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_error_code, { "Error Code", "nfapi.error.code", FT_UINT8, BASE_DEC, VALS(nfapi_error_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_p4_error_code, { "Error Code", "nfapi.p4_error.code", FT_UINT8, BASE_DEC, VALS(nfapi_p4_error_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_rat_type, { "RAT Type", "nfapi.rat_type", FT_UINT8, BASE_DEC, VALS(nfapi_rat_type_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_num_tlv, { "Number of TLV", "nfapi.param.response.num_tlv", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_phy_state, { "Phy state value", "nfapi.phy.state", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_modulation_support, { "Modulation value", "nfapi.modulation.support", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_ue_per_sf, { "Downlink UEs per Subframe", "nfapi.dl.ue.per.sf", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_ue_per_sf, { "Uplink UEs per Subframe", "nfapi.ul.ue.per.sf", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_duplex_mode, { "Duplex Mode", "nfapi.duplex.mode", FT_UINT16, BASE_DEC, VALS(nfapi_duplex_mode_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_bandwidth_support, { "Downlink bandwidth support", "nfapi.dl.bandwidth.support", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_bandwidth_support, { "Uplink bandwidth support", "nfapi.ul.bandwidth.support", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_modulation_support, { "Downlink modulation support", "nfapi.dl.modulation.support", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_modulation_support, { "Uplink modulation support", "nfapi.ul.modulation.support", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_phy_antenna_capability, { "Phy Antenna capability", "nfapi.phy.antenna.capability", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_release_capability, { "Release capability", "nfapi.release.capability", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_mbsfn_capability, { "MBSFN capability", "nfapi.mbsfn.capability", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_laa_capability, { "LAA Support", "nfapi.laa.support", FT_BOOLEAN, 8, TFS(&support_strname), 0x0, NULL, HFILL } }, -- { &hf_nfapi_pd_sensing_lbt_support, { "PD sensing LBT support", "nfapi.pd.sensing.lbt.support", FT_BOOLEAN, 8, TFS(&support_strname), 0x0, NULL, HFILL } }, -- { &hf_nfapi_multi_carrier_lbt_support, { "Multi carrier LBT support", "nfapi.multi.carrier.lbt.support", FT_UINT16, BASE_DEC, VALS(nfapi_mutli_carrier_lbt_support_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_partial_sf_support, { "Partial SF support", "nfapi.partial.sf.support", FT_BOOLEAN, 8, TFS(&partial_sf_support_strname), 0x0, NULL, HFILL } }, -- { &hf_nfapi_reference_signal_power, { "Reference signal power", "nfapi.ref_sig_power", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_primary_synchronization_signal_epre_eprers, { "Primary synchronization signal EPRE/EPRERS", "nfapi.primary.sync.signal", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_secondary_synchronization_signal_epre_eprers, { "Secondary synchronization signal EPRE/EPRERS", "nfapi.secondary.sync.signal", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_physical_cell_id, { "Physical Cell ID", "nfapi.physical.cell.id", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_phich_resource, { "PHICH Resource", "nfapi.phich.resource", FT_UINT16, BASE_DEC, VALS(nfapi_phich_resource_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_phich_duration, { "PHICH Duration", "nfapi.phich.duration", FT_BOOLEAN, 8, TFS(&phich_duration_strname), 0x0, NULL, HFILL } }, -- { &hf_nfapi_phich_power_offset, { "PHICH Power Offset", "nfapi.phich.power.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_configuration_index, { "Configuration Index", "nfapi.configuration.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_root_sequence_index, { "Root sequence Index", "nfapi.root.sequence.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_zero_correlation_zone_configuration, { "Zero correlation zone configuration", "nfapi.zero.correlation.zone.configuration", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_high_speed_flag, { "High Speed Flag", "nfapi.high.speed.flag", FT_BOOLEAN, 8, TFS(&high_speed_flag_strname), 0x0, NULL, HFILL } }, -- { &hf_nfapi_frequency_offset, { "Frequency offset", "nfapi.frequency.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_hopping_mode, { "Hopping Mode", "nfapi.hopping.mode", FT_BOOLEAN, 8, TFS(&hopping_mode_strname), 0x0, NULL, HFILL } }, -- { &hf_nfapi_hopping_offset, { "Hopping offset", "nfapi.hopping.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_delta_pucch_shift, { "Delta PUCCH Shift", "nfapi.delta.pucch.shift", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_n_cqi_rb, { "N CQI RB", "nfapi.n.cqi.rb", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_n_an_cs, { "N AN CS", "nfapi.n.an.cs", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_n1_pucch_an, { "N1 PUCCH AN", "nfapi.n1.pucch.an", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_bandwidth_configuration, { "Bandwidth configuration", "nfapi.bw.configuration", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_srs_subframe_configuration, { "SRS subframe configuration", "nfapi.srs.subframe.configuration", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_uplink_rs_hopping, { "Uplink RS hopping", "nfapi.uplink.rs.hopping", FT_UINT16, BASE_DEC, VALS(nfapi_uplink_rs_hopping_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_group_assignment, { "Group assigment", "nfapi.group.assignment", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_cyclic_shift_1_for_drms, { "Cyclic Shift 1 for DRMS", "nfapi.cyclic.shift.1.for.drms", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_subframe_assignment, { "Subframe_assignment", "nfapi.subframe.assignment", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_special_subframe_patterns, { "Special Subframe patterns", "nfapi.special.subframe.patterns", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ed_threshold_for_lbt_for_pdsch, { "ED Threshold for LBT for PDSCH", "nfapi.subframe.assignment", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ed_threshold_for_lbt_for_drs, { "ED Threshold for LBT for DRS", "nfapi.subframe.assignment", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pd_threshold, { "PD Threshold", "nfapi.subframe.assignment", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_multi_carrier_type, { "Multi carrier type", "nfapi.subframe.assignment", FT_UINT16, BASE_DEC, VALS(nfapi_laa_carrier_type_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_multi_carrier_tx, { "Multi carrier TX", "nfapi.subframe.assignment", FT_BOOLEAN, 8, TFS(&nfapi_multi_carrier_tx_strname), 0x0, NULL, HFILL } }, -- { &hf_nfapi_multi_carrier_freeze, { "Multi carrier freeze ", "nfapi.subframe.assignment", FT_BOOLEAN, 8, TFS(&nfapi_multi_carrier_freeze_strname), 0x0, NULL, HFILL } }, -- { &hf_nfapi_tx_antenna_ports_for_drs, { "Tx antenna ports for DRS", "nfapi.subframe.assignment", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_transmission_power_for_drs, { "Transmission power for DRS", "nfapi.subframe.assignment", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pbch_repetitions_enabled_r13, { "PBCH Repetitions enable R13", "nfapi.pbch.repetitions.enabled_r13", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_cat_m_root_sequence_index, { "PRACH CAT-M Root sequence index", "nfapi.prach.cat_m.root.squence.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_cat_m_zero_correlation_zone_configuration, { "PRACH CAT-M Zero correlation zone configuration", "nfapi.prach.cat_m.zero.correlation.zone.configuration", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_cat_m_high_speed_flag, { "PRACH CAT-M High speed flag", "nfapi.prach.cat_m.high.speed.flag", FT_BOOLEAN, 8, TFS(&high_speed_flag_strname), 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_ce_level_0_enable, { "PRACH CE level #0 Enable", "nfapi.prach.ce.level.0.enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_ce_level_0_configuration_index, { "PRACH CE level #0 Configuration index", "nfapi.prach.ce.level.0.configuration.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_ce_level_0_frequency_offset, { "PRACH CE level #0 Frequency offset", "nfapi.prach.ce.level.0.frequency_offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_ce_level_0_number_of_repetitions_per_attempt, { "PRACH CE level #0 Number of repetitions per attempt", "nfapi.prach.ce.level.0.number.of.repetitions.per_attempt", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_ce_level_0_starting_subframe_periodicity, { "CE level #0 Starting subframe periodicity", "nfapi.prach.ce.level.0.starting.subframe_periodicity", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_ce_level_0_hopping_enabled, { "PRACH CE level #0 Hopping Enable", "nfapi.prach.ce.level.0.hopping_enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_ce_level_0_hopping_offset, { "PRACH CE level #0 Hopping Offset", "nfapi.prach.ce.level.0.hopping.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_ce_level_1_enable, { "PRACH CE level #1 Enable", "nfapi.prach.ce.level.0.enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_ce_level_1_configuration_index, { "PRACH CE level #1 Configuration index", "nfapi.prach.ce.level.0.configuration.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_ce_level_1_frequency_offset, { "PRACH CE level #1 Frequency offset", "nfapi.prach.ce.level.0.frequency_offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_ce_level_1_number_of_repetitions_per_attempt, { "PRACH CE level #1 Number of repetitions per attempt", "nfapi.prach.ce.level.0.number.of.repetitions.per_attempt", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_ce_level_1_starting_subframe_periodicity, { "CE level #1 Starting subframe periodicity", "nfapi.prach.ce.level.0.starting.subframe_periodicity", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_ce_level_1_hopping_enabled, { "PRACH CE level #1 Hopping Enable", "nfapi.prach.ce.level.0.hopping_enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_ce_level_1_hopping_offset, { "PRACH CE level #1 Hopping Offset", "nfapi.prach.ce.level.0.hopping.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_ce_level_2_enable, { "PRACH CE level #2 Enable", "nfapi.prach.ce.level.0.enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_ce_level_2_configuration_index, { "PRACH CE level #2 Configuration index", "nfapi.prach.ce.level.0.configuration.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_ce_level_2_frequency_offset, { "PRACH CE level #2 Frequency offset", "nfapi.prach.ce.level.0.frequency_offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_ce_level_2_number_of_repetitions_per_attempt, { "PRACH CE level #2 Number of repetitions per attempt", "nfapi.prach.ce.level.0.number.of.repetitions.per_attempt", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_ce_level_2_starting_subframe_periodicity, { "CE level #2 Starting subframe periodicity", "nfapi.prach.ce.level.0.starting.subframe_periodicity", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_ce_level_2_hopping_enabled, { "PRACH CE level #2 Hopping Enable", "nfapi.prach.ce.level.0.hopping_enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_ce_level_2_hopping_offset, { "PRACH CE level #2 Hopping Offset", "nfapi.prach.ce.level.0.hopping.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_ce_level_3_enable, { "PRACH CE level #3 Enable", "nfapi.prach.ce.level.0.enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_ce_level_3_configuration_index, { "PRACH CE level #3 Configuration index", "nfapi.prach.ce.level.0.configuration.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_ce_level_3_frequency_offset, { "PRACH CE level #3 Frequency offset", "nfapi.prach.ce.level.0.frequency_offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_ce_level_3_number_of_repetitions_per_attempt, { "PRACH CE level #3 Number of repetitions per attempt", "nfapi.prach.ce.level.0.number.of.repetitions.per_attempt", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_ce_level_3_starting_subframe_periodicity, { "CE level #3 Starting subframe periodicity", "nfapi.prach.ce.level.0.starting.subframe_periodicity", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_ce_level_3_hopping_enabled, { "PRACH CE level #3 Hopping Enable", "nfapi.prach.ce.level.0.hopping_enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_ce_level_3_hopping_offset, { "PRACH CE level #3 Hopping Offset", "nfapi.prach.ce.level.0.hopping.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pucch_internal_ul_hopping_config_common_mode_a, { "PUCCH Interval-ULHoppingConfigCommonModeA", "nfapi.pucch.interval.ulhopping.config.common.mode.a", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pucch_internal_ul_hopping_config_common_mode_b, { "PUCCH Interval-ULHoppingConfigCommonModeB", "nfapi.pucch.interval.ulhopping.config.common.mode.b", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_data_report_mode, { "Data Report Mode", "nfapi.data.report.mode", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_sfnsf, { "SFN/SF", "nfapi.sfn.sf", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_max_up_pts, { "Max UpPTS frames", "nfapi.max.uppts.frame", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, -- { &hf_nfapi_srs_acknack_srs_simultaneous_transmission, { "SRS AckNack Simultaneous transmission", "nfapi.srs.acknack.simult.tx", FT_BOOLEAN, 8, TFS(&srs_simult_tx_strname), 0x0, NULL, HFILL } }, -- { &hf_nfapi_pnf_address, { "PNF address", "nfapi.p7.pnf.address", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pnf_address_ipv4, { "PNF IPV4", "nfapi.pnf.address.ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pnf_address_ipv6, { "PNF IPV6", "nfapi.pnf.address.ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_vnf_address, { "VNF address", "nfapi.vnf.address", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_vnf_address_ipv4, { "VNF IPV4 Address", "nfapi.vnf.address.ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_vnf_address_ipv6, { "VNF IPV6 Address", "nfapi.vnf.address.ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pnf_port, { "PNF PORT value", "nfapi.config.pnf.port.value", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_vnf_port, { "VNF PORT value", "nfapi.config.vnf.port.value", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_rf_bands, { "RF Bands", "nfapi.rf.bands", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_rf_bands_count, { "Number of RF Bands", "nfapi.rf.bands.count", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_rf_bands_value, { "Band value", "nfapi.rf.bands.value", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pnf_param_request, { "PNF Param Request", "nfapi.pnf.param.request", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pnf_param_response, { "PNF Param Response", "nfapi.pnf.param.response", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pnf_config_request, { "PNF Config Request", "nfapi.pnf.config.request", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pnf_config_response, { "PNF Config Response", "nfapi.pnf.config.response", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pnf_start_request, { "PNF Start Request", "nfapi.pnf.start.request", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pnf_start_response, { "PNF Start Response", "nfapi.pnf.start.response", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_start_request, { "PNF Start Request", "nfapi.start.request", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_start_response, { "PNF Start Response", "nfapi.start.response", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pnf_param_general, { "PNF Param General ", "nfapi.pnf.param.general", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_sync_mode, { "Sync Mode", "nfapi.sync.mode", FT_UINT8, BASE_DEC, VALS(nfapi_sync_mode_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_location_mode, { "Location Mode", "nfapi.location.mode", FT_UINT8, BASE_DEC, VALS(location_mode_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_location_coordinates_length, { "Location Coordinates Length", "nfapi.location.coordinates.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_location_coordinates, { "Location Coordinates", "nfapi.location.coordinates", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pdu, { "PDU", "nfapi.pdu", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_config_timing, { "DL config Timing", "nfapi.dl.config.timing", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_tx_timing, { "Tx Timing", "nfapi.general.tx.timing", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_config_timing, { "UL Config Timing", "nfapi.ul.config.timing", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_hi_dci0_timing, { "HI DCi0 Timing", "nfapi.hi.dci0.timing", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_maximum_number_phys, { "Maximum number of Phys", "nfapi.maximum.number.phys", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_maximum_total_bandwidth, { "Maximum Total Bandwidth", "nfapi.maximum.total.bandwidth", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_maximum_total_number_dl_layers, { "Maximum Total Number DL Layers", "nfapi.maximum.total.number.dl.layers", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_maximum_total_number_ul_layers, { "Maximum Total Number UL Layers", "nfapi.maximum.total.number.ul.layers", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_shared_bands, { "Shared bands", "nfapi.shared.bands", FT_BOOLEAN, 8, TFS(&true_false_strname), 0x0, NULL, HFILL } }, -- { &hf_nfapi_shared_pa, { "Shared pa", "nfapi.shared.pa", FT_BOOLEAN, 8, TFS(&true_false_strname), 0x0, NULL, HFILL } }, -- { &hf_nfapi_maximum_total_power, { "Maximum total power", "nfapi.maximum.total.power", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_oui, { "OUI", "nfapi.oui", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pnf_phy, { "PNF Phy", "nfapi.pnf.phy", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pnf_phy_number_phy, { "PNF Phy Number of Phy", "nfapi.pnf.phy.number.phy", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pnf_phy_config_index, { "PNF Phy Config Index", "nfapi.pnf.phy.config.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pnf_rf, { "PNF Phy RF", "nfapi.pnf.rf", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_rfs, { "Number of RFs", "nfapi.pnf.rf.number.rf", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_phy_rf_config_info, { "Phy RF Config Info", "nfapi.phy.rf.config.info", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_phy_rf_config_info_phy_id, { "Phy ID", "nfapi.pnf.phy.rf.config.phy.id", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_phy_rf_config_info_band, { "RF Band", "nfapi.pnf.phy.rf.config.phy.id", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pnf_phy_rf_config, { "PNF Phy RF Config", "nfapi.pnf.phy.rf.config", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pnf_phy_rf_config_number_phy_rf_config_info, { "Number of RF Config Info(s)", "nfapi.pnf.phy.rf.config.number.phy.rf.config.info", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pnf_phy_rf_config_array_phy_rf_config_info, { "PNF Phy RF Config array phy rf config info ", "nfapi.pnf.phy.rf.config.array.phy.rf.config.info", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_rf_config_index, { "RF Config Index", "nfapi.rf_config_index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_rf_exclusions, { "Number of RF exclusions", "nfapi.hf_nfapi_number_of_rf_exclusions", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_maximum_3gpp_release_supported, { "Maximum 3gpp Release Supported", "nfapi.maximum_3gpp_release_supported", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_downlink_channel_bandwidth_supported, { "Maximum Channel Downlink Bandwidth Supported", "nfapi.downlink_channel_bandwidth_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_uplink_channel_bandwidth_supported, { "Maximum Channel Uplink Bandwidth Supported", "nfapi.uplink_channel_bandwidth_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_dl_layers_supported, { "Number of DL Layers Supported", "nfapi.number_of_dl_layer_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_ul_layers_supported, { "Number of UL Layers Supported", "nfapi.number_of_ul_layer_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_nmm_modes_supported, { "NMM modes supported", "nfapi.nmm_modes_supported", FT_UINT8, BASE_DEC, VALS(nmm_modes_supported_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_band, { "Band", "nfapi.band", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_maximum_transmit_power, { "Maximum transmit power", "nfapi.maximum_transmit_power", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_earfcn, { "EARFCN", "nfapi.earfcn", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_rf_bands, { "Number of RF Bands", "nfapi.num.rf_bands", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_nmm_uplink_rssi_supported, { "NMM Uplink RSSI supported", "nfapi.nmm.uplink.rssi.supported", FT_UINT16, BASE_DEC, VALS(ul_rssi_supported_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_minimum_transmit_power, { "Minimum transmit power", "nfapi.minimum_transmit_power", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_antennas_suppported, { "Number of Supported Antennas", "nfapi.number_of_antennas_suppported", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_minimum_downlink_frequency, { "Minimum downlink frequency", "nfapi.minimum_downlink_frequency", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_maximum_downlink_frequency, { "Maximum downlink frequency", "nfapi.maximum_downlink_frequency", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_minimum_uplink_frequency, { "Minimum uplink frequency", "nfapi.minimum_downlink_frequency", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_maximum_uplink_frequency, { "Maximum uplink frequency", "nfapi.maximum_downlink_frequency", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_transmission_mode7_supported, { "Transmission Mode 7 Supported", "nfapi.pnf.phy_rel10.tx_mode7_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hi_nfapi_transmission_mode8_supported, { "Transmission Mode 8 Supported", "nfapi.pnf.phy_rel10.tx_mode8_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hi_nfapi_two_antennas_ports_for_pucch, { "Two antennas ports for PUCCH", "nfapi.pnf.phy_rel10.two_antennas_ports_for_pucch", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hi_nfapi_transmission_mode_9_supported, { "Transmission Mode 9 Supported", "nfapi.pnf.phy_rel10.tx_mode9_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hi_nfapi_simultaneous_pucch_pusch, { "Simultaneous PUCCH PUSCH", "nfapi.pnf.simultaneous_pucch_pusch", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hi_nfapi_for_layer_tx_with_tm3_and_tm4, { "Four layer Tx with TM3 and TM4", "nfapi.pnf.phy_rel10.layer_tx_with_tm3_and_tm4", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_epdcch_supported, { "ePDCCH supported", "nfapi.pnf.phy_rel11.epdcch_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hi_nfapi_multi_ack_csi_reporting, { "Multi ACK CSI reporting", "nfapi.pnf.phy_rel11.mutli_ack_csi_reporting", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hi_nfapi_pucch_tx_diversity_with_channel_selection, { "PUCCH Tx diversity with channel selection", "nfapi.pnf.phy_rel11.tx_div_with_channel_selection", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hi_nfapi_ul_comp_supported, { "UL CoMP supported", "nfapi.pnf.phy_rel11.ul_comp_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hi_nfapi_transmission_mode_5_supported, { "Transmission mode 5 supported", "nfapi.pnf.phy_rel11.tx_mode5_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_csi_subframe_set, { "CSI subframe set", "nfapi.pnf.phy_rel12.csi_subframe_set", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hi_nfapi_enhanced_4tx_codebook, { "Enhanced 4TX codebook", "nfapi.pnf.phy_rel12.exhanced_t4x_codebook", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hi_nfapi_drs_supported, { "DRS supported", "nfapi.pnf.phy_rel12.drs_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hi_nfapi_ul_64qam_supported, { "UL 64QAM supported", "nfapi.pnf.phy_rel12.ul_64qam_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hi_nfapi_transmission_mode_10_supported, { "Transmission mode 10 supported", "nfapi.pnf.phy_rel12.tx_mode10_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hi_nfapi_alternative_tbs_indices, { "Alternative TBS indices", "nfapi.pnf.phy_rel12.alternative_tbs_indices", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pucch_format_4_supported, { "PUCCH format 4 supported", "nfapi.pnf.phy_rel13.pucch_format4_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pucch_format_5_supported, { "PUCCH format 5 supported", "nfapi.pnf.phy_rel13.pucch_format5_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_more_than_5_ca_supported, { "More than 5 CA support", "nfapi.pnf.phy_rel13.mode_than_5_ca_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_laa_supported, { "LAA supported", "nfapi.pnf.phy_rel13.laa_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_laa_ending_in_dwpts_supported, { "LAA ending in DwPTS supported", "nfapi.pnf.phy_rel13.laa_ending_in_dwpts_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_laa_starting_in_second_slot_supported, { "LAA starting in second slot Supported", "nfapi.pnf.phy_rel13.laa_starting_in_second_slot_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_beamforming_supported, { "Beamforming Supported", "nfapi.pnf.phy_rel13.beamingforming_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_csi_rs_enhancements_supported, { "CSI-RS enhancements supported", "nfapi.pnf.phy_rel13.csi_rs_enchancements_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_drms_enhancements_supported, { "DMRS enhancements supported", "nfapi.pnf.phy_rel13.drms_enhancements_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_srs_enhancements_supported, { "SRS enhancements supported", "nfapi.pnf.phy_rel13.srs_enhancements_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_sfn_sf, { "SFN_SF", "nfapi.sfn_sf", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_config_request_body, { "DL Config Request body", "nfapi.dl.config.request.body", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_pdcch_ofdm_symbols, { "Number of PDCCH OFDM Symbols", "nfapi.number_pdcch_ofdm_symbols", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_dci, { "Number of DCI", "nfapi.number_dci", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_pdus, { "Number of PDUs", "nfapi.number_pdu", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_harqs, { "Number of HARQs", "nfapi.number_harqs", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_crcs, { "Number of CRCs", "nfapi.number_crcs", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_srs, { "Number of SRs", "nfapi.number_srs", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_cqi, { "Number of CQIs", "nfapi.number_cqi", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_preambles, { "Number of Preambles", "nfapi.number_preambles", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_srss, { "Number of SRSs", "nfapi.number_srss", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_lbt_dl_req_pdu_type, { "LBT DL Request PDU Type", "nfapi.number_srss", FT_UINT16, BASE_DEC, VALS(nfapi_lbt_dl_req_pdu_type), 0x0, NULL, HFILL } }, -- { &hf_nfapi_lbt_dl_ind_pdu_type, { "LBT DL Indication PDU Type", "nfapi.number_srss", FT_UINT16, BASE_DEC, VALS(nfapi_lbt_dl_ind_pdu_type), 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_pdsch_rnti, { "Number of PDSCH RNTI", "nfapi.number_pdsch_rnti", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_transmission_power_pcfich, { "Transmission Power PCFICH", "nfapi.transmission_power_pcfich", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_config_request_pdu_list, { "DL Config Request body", "nfapi.dl.config.request.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_config_request_pdu_list, { "UL Config Request body", "nfapi.ul.config.request.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_hi_dci0_request_pdu_list, { "HI DCI0 Request body", "nfapi.hi.dci0.config.request.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_tx_request_pdu_list, { "Tx Request body", "nfapi.tx.request.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_rx_indication_pdu_list, { "Rx Indication body", "nfapi.rx.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_harq_indication_pdu_list, { "Harq Indication body", "nfapi.harq.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_crc_indication_pdu_list, { "CRC Indication body", "nfapi.crc.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_sr_indication_pdu_list, { "SR Indication body", "nfapi.sr.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_cqi_indication_pdu_list, { "CQI Indication body", "nfapi.cqi.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_preamble_indication_pdu_list, { "Preamble Indication body", "nfapi.preamble.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_srs_indication_pdu_list, { "SRS Indication body", "nfapi.srs.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_lbt_dl_config_pdu_list, { "LBT DL Config Request body", "nfapi.lbt.dl.request.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_lbt_dl_indication_pdu_list, { "LBT DL Indicatoin body", "nfapi.lbt.dl.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_config_pdu_type, { "PDU Type", "nfapi.pdu.type", FT_UINT8, BASE_DEC, VALS(nfapi_dl_config_pdu_type_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_pdu_size, { "PDU size", "nfapi.pdu.size", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_instance_length, { "Instance length", "nfapi.instance.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_config_dlsch_pdu_rel8, { "DL CONFIG DLSCH PDU REL8", "nfapi.dl.config.dlsch.pdu.rel8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_length, { "PDU length", "nfapi.pdu.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pdu_index, { "PDU Index", "nfapi.pdu.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_rnti, { "RNTI", "nfapi.rnti", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_resource_allocation_type, { "Resource Allocation Type", "nfapi.resource.allocation.type", FT_UINT8, BASE_DEC, VALS(resource_allocation_type_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_virtual_resource_block_assignment_flag, { "Virtual resource block assignment flag", "nfapi.resource.block.assignment.flag", FT_UINT8, BASE_DEC, VALS(local_distributed_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_resource_block_coding, { "Resource block coding", "nfapi.resource.block.coding", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_modulation, { "Modulation", "nfapi.modulation", FT_UINT8, BASE_DEC, VALS(modulation_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_redundancy_version, { "Redundancy version", "nfapi.redundancy.version", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_transport_blocks, { "Transport blocks", "nfapi.transport.blocks", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_transport_block_to_codeword_swap_flag, { "Transport block to codeword swap flag", "nfapi.transport.block.to.codeword.swap.flag", FT_UINT8, BASE_DEC, VALS(transport_block_to_codeword_swap_flag_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_transmission_scheme, { "Transmission scheme", "nfapi.transmission.scheme", FT_UINT8, BASE_DEC, VALS(transmission_scheme_vals), 0x0, "The MIMO mode used in the PDU", HFILL } }, -- { &hf_nfapi_ul_transmission_scheme, { "Transmission scheme", "nfapi.transmission.scheme", FT_UINT8, BASE_DEC, VALS(ul_transmission_scheme_vals), 0x0, "The MIMO mode used in the PDU", HFILL } }, -- { &hf_nfapi_number_of_layers, { "Number of layers", "nfapi.number.of.layers", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_subbands, { "Number of subbands", "nfapi.number.of.subbands", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_codebook_index, { "Codebook index", "nfapi.number.of.codebook.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ue_category_capacity, { "UE category capacity", "nfapi.ue.category.capacity", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pa, { "P-A", "nfapi.pa", FT_UINT8, BASE_DEC, VALS(pa_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_delta_power_offset_index, { "Delta Power offset index", "nfapi.delta.power.offset.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_nprb, { "Nprb", "nfapi.nprb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_transmission_mode, { "Transmission Mode", "nfapi.transmission_nprb", FT_UINT8, BASE_DEC, VALS(transmission_mode_vals), 0x0, "Transmission mode associated with the UE", HFILL } }, -- { &hf_nfapi_prnti, { "P-RNTI", "nfapi.prnti", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_mcs, { "MCS", "nfapi.mcs", FT_UINT8, BASE_DEC, VALS(pch_modulation_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_transport_blocks, { "Number of transport blocks", "nfapi.number_of_transport_blocks", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ue_mode, { "UE Mode", "nfapi.ue.mode", FT_UINT8, BASE_DEC, VALS(ue_mode_vals), 0x0, NULL, HFILL } }, -- { &hf_prs_bandwidth, { "PRS bandwidth", "nfapi.prs.bandwidth", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_prs_cyclic_prefix_type, { "PRS cyclic prefix type", "nfapi.prs.cyclic.prefix.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_prs_muting, { "PRS muting", "nfapi.prs.muting", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_num_bf_prb_per_subband, { "Num of BF PRB per Subband", "nfapi.num.bf.prb.per.subband", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_num_bf_vector, { "Num of BF Vector", "nfapi.num.bf.vector", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_csi_rs_resource_config, { "CSI-RS resource config", "nfapi.csi.rs.resource.config", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_bf_vector_subband_index, { "BF Subband Index", "nfapi.num.bf.vector.subband.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_bf_vector_num_antennas, { "BF Num of Antennas", "nfapi.num.bf.vector.bf.value", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_bf_vector_bf_value, { "BF Value per Antenna", "nfapi.num.bf.vector.bf.value", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_config_dlsch_pdu_rel9, { "DL CONFIG DLSCH PDU REL9", "nfapi.dl.config.dlsch.pdu.rel9", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_nscid, { "NSC id", "nfapi.nscid", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_config_dlsch_pdu_rel10, { "DL CONFIG DLSCH PDU REL10", "nfapi.dl.config.dlsch.pdu.rel10", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_csi_rs_flag, { "CSI RS Flag", "nfapi.csi.rs.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_subbands, { "Subbands", "nfapi.subbands", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_bf_vectors, { "BF Vectors", "nfapi.bf.vectors", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_bf_vector_antennas, { "Antennas", "nfapi.antennas", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_csi_rs_resource_config_r10, { "CSI RS resource config R10", "nfapi.csi.rs.resource_config_r10", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10, { "CSI-RS Number of NZP configuration", "nfapi.csi.rs.num.of.nzp.configurations", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_csi_rs_number_if_nzp_configurations, { "CSI RS zero Tx Power Resource config bitmap R10", "nfapi.csi.rs.zero.tx.power.resource.config.bitmap.r10", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_csi_rs_resource_configs, { "CSR/RS Resource Configs", "nfapi.csi.rs.resource.configs", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pdsch_start, { "PDSCH_start", "nfapi.pdsch.start", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_drms_config_flag, { "DMRS Config flag", "nfapi.drms.config.flag", FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_drms_scrambling, { "DMRS Scrambling", "nfapi.drms.scrambling", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_csi_config_flag, { "CSI Config flag", "nfapi.csi.config.flag", FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_csi_scrambling, { "CSI Scrambling", "nfapi.csi.scrambling", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pdsch_re_mapping_flag, { "PDSCH RE mapping flag", "nfapi.pdsch.remapping.flag", FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_pdsch_re_mapping_antenna_ports, { "PDSCH RE mapping antenna ports", "nfapi.pdsch.remapping.antenna.ports", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pdsch_re_mapping_freq_shift, { "PDSCH RE mapping freq shift", "nfapi.pdsch.remapping.freq.shift", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_alt_cqi_table_r12, { "altCQI-Table-r12", "nfapi.alt.cqi.table.r12", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_max_layers, { "MaxLayers", "nfapi.max.layers", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_n_dl_harq, { "N_DL_HARQ", "nfapi.n.dl.harq", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dwpts_symbols, { "DwPTS Symbols", "nfapi.dwpts.symbols", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_initial_lbt_sf, { "Initial LBT SF", "nfapi.initial.lbt.sf", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ue_type, { "UE Type", "nfapi.ue.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pdsch_payload_type, { "PDSCH Payload Type", "nfapi.pdsch.payload.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_initial_transmission_sf, { "Initial transmission SF (io) ", "nfapi.init.tx.sf.io", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_req13_drms_table_flag, { "Rel-13-DMRS-tabe flag", "nfapi.r13.drms.table.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_csi_rs_resource_index, { "CSI-RS resource index", "nfapi.csi.rs.resource.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_csi_rs_class, { "Class", "nfapi.csi.rs.class", FT_UINT8, BASE_DEC, VALS(csi_rs_class_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_cdm_type, { "CDM Type", "nfapi.cdm.type", FT_UINT8, BASE_DEC, VALS(csi_rs_cdm_type_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_csi_rs_bf_vector, { "BF Vector", "nfapi.bf.vector", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_edpcch_prb_index, { "EPDCCH PRB index", "nfapi.edpcch.prb.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_epdcch_resource_assignment_flag, { "EPDCCH Resource assignment flag", "nfapi.epdcch.resource.assignment.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_epdcch_id, { "EPDCCH ID", "nfapi.epdcch.id", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_epdcch_start_symbol, { "EPDCCH Start Symbol", "nfapi.epdcch.start.symbol", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_epdcch_num_prb, { "EPDCCH NumPRB", "nfapi.epdcch.num.prb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_epdcch_prbs, { "EPDCCH PRBs", "nfapi.epdcch.prbs", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_precoding_value, { "Precoding value", "nfapi.precoding.value", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_mpdcch_narrowband, { "MPDCCH Narrowband", "nfapi.mpdcch.narrowband", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_prb_pairs, { "Number of PRB pairs", "nfapi.number.prb.pairs", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_resource_block_assignment, { "Resource Block Assignment", "nfapi.resource.block.assignement", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_start_symbol, { "Start symbol", "nfapi.start.symbol", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ecce_index, { "ECCE index", "nfapi.ecce.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ce_mode, { "Rel-13-DMRS-tabe flag", "nfapi.r13.drms.table.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_drms_scrabmling_init, { "DMRS scrambling init", "nfapi.drms.scrambling.init", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pdsch_reception_levels, { "PDSCH repetition levels", "nfapi.pdsch.repetition.levels", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_new_data_indicator, { "New data indicator", "nfapi.new.data.indicator", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_tpmi_length, { "TPMI length", "nfapi.tpmi.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pmi_flag, { "PMI flag", "nfapi.pmi.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_harq_resource_offset, { "HARQ resource offset", "nfapi.harq.resource.offset", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dci_subframe_repetition_number, { "DCI subframe repetition number", "nfapi.dci.subframe.repetition.number", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_downlink_assignment_index_length, { "Downlink assignment index Length", "nfapi.dl.assignement.index.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_starting_ce_level, { "Starting CE Level", "nfapi.starting.ce.level", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_antenna_ports_and_scrambling_identity_flag, { "Antenna ports and scrambling identity flag", "nfapi.antenna.ports.and.scrambling.identity.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_antenna_ports_and_scrambling_identity, { "Antenna ports and scrambling identity", "nfapi.antenna.ports.and.scrambling.identit", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_paging_direct_indication_differentiation_flag, { "Paging/Direct indication differentiation flag", "nfapi.paging.direct.indictation.differentiation.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_direct_indication, { "Direct indication", "nfapi.direct.indication", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_tx_antenna_ports, { "Number of TX Antenna ports", "nfapi.num.of.tx.antenna.ports.", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_precoding, { "Precoding", "nfapi.precodiing", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_config_bch_pdu_rel8, { "DL CONFIG BCH PDU Rel8", "nfapi.dl.config.bch.pdu.rel8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_value_float, { "Value", "nfapi.value.float", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_transmission_power, { "Transmission Power", "nfapi.transmission_power", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_config_mch_pdu_rel8, { "DL CONFIG MCH PDU Rel8", "nfapi.dl.config.mch.pdu.rel8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_mbsfn_area_id, { "MBSFN Area id", "nfapi.mbsfn.area.id", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_config_pch_pdu_rel8, { "DL CONFIG MCH PDU Rel8", "nfapi.dl.config.mch.pdu.rel8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_config_dci_dl_pdu_rel8, { "DL CONFIG DCI DL PDU Rel8", "nfapi.dl.config.mch.pdu.rel8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dci_format, { "DCI format", "nfapi.dci.format", FT_UINT8, BASE_DEC, VALS(dci_format_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_cce_idx, { "CCE index", "nfapi.cce.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_aggregation_level, { "Aggregation level", "nfapi.aggregation.level", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_mcs_1, { "MCS_1", "nfapi.mcs_1", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_mcs_2, { "MCS_2", "nfapi.mcs_2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_redundancy_version_1, { "Redundancy version_1", "nfapi.redundancy.version.1", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_redundancy_version_2, { "Redundancy version_2", "nfapi.redundancy.version.2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_new_data_indicator_1, { "New data indicator_1", "nfapi.new.data.indicator.1", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_new_data_indicator_2 ,{ "New data indicator_2", "nfapi.new.data.indicator.2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_harq_process, { "HARQ process", "nfapi.harq.process", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_tpmi, { "TPMI", "nfapi.tpmi", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pmi, { "PMI", "nfapi.pmi", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_precoding_information, { "Precoding information", "nfapi.precoding.information", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_tpc, { "TPC", "nfapi.tpc", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_downlink_assignment_index, { "Downlink assignment index", "nfapi.downlink.assignment.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ngap, { "Ngap", "nfapi.ngap", FT_UINT8, BASE_DEC, VALS(ngap_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_transport_block_size_index, { "Transport block size index", "nfapi.transport.block.size.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_downlink_power_offset, { "Downlink power offset", "nfapi.downlink.power.offset", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_allocate_prach_flag, { "Allocation PRACH flag", "nfapi.allocation.prach.flag", FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_preamble_index, { "Preamble index", "nfapi.preamable.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_prach_mask_index, { "PRACH mask index", "nfapi.prach.mask.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_rnti_type, { "RNTI type", "nfapi.rnti.type", FT_UINT8, BASE_DEC, VALS(rnti_type_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_config_dci_dl_pdu_rel9, { "DL CONFIG DCI DL PDU Rel9", "nfapi.dl.config.mch.pdu.rel9", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_mcch_flag, { "MCCH flag", "nfapi.mcch.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_mcch_change_notification, { "MCCH change notification", "nfapi.mcch.change.notification", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_scrambling_identity, { "Scrambling identity", "nfapi.scrambling.identity", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_config_dci_dl_pdu_rel10, { "DL CONFIG DCI DL PDU Rel10", "nfapi.dl.config.mch.pdu.rel10", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_cross_carrier_scheduling_flag, { "Cross Carrier scheduling flag", "nfapi.cross.carrier.scheduling.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_carrier_indicator, { "Carrier Indicator", "nfapi.carrier.indicator", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_srs_flag, { "SRS flag", "nfapi.srs.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_srs_request, { "SRS request", "nfapi.srs.request", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_antenna_ports_scrambling_and_layers, { "Antenna ports scrambling and layers", "nfapi.antenna.ports.scrambling.and.layers", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_total_dci_length_including_padding, { "Total DCI length including padding", "nfapi.total.dci.length.including.padding", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_n_dl_rb, { "N_DL_RB", "nfapi.n.dl.rb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_n_ul_rb, { "N_UL_RB", "nfapi.n.dl.rb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_harq_ack_resource_offset, { "HARQ-ACK resource offset", "nfapi.harq.ack.resource.offset", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pdsch_re_mapping_and_quasi_co_location_indicator, { "PDSCH RE Mapping and Quasi-Co-Location Indicator", "nfapi.pdsch.re.mapping", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_primary_cell_type, { "Primary cell type", "nfapi.primary.cell.type", FT_UINT8, BASE_DEC, VALS(primary_cells_type_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_dl_configuration_flag, { "UL/DL configuration flag", "nfapi.ul.dl.configuration.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_ul_dl_configurations, { "Number of UL/DL configurations", "nfapi.number.ul.dl.configurations", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_dl_configuration_index, { "UL/DL configuration indication", "nfapi.ul.dl.configuration.indication", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_laa_end_partial_sf_flag, { "LAA end partial SF flag", "nfapi.laa.end.partial.sf.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_laa_end_partial_sf_configuration, { "LAA end partial SF configuration", "nfapi.laa.end.partial.sf.configuration", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_codebooksize_determination_r13, { "Codebook Size Determination R13", "nfapi.codebook.size.determination.r13", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_rel13_drms_table_flag, { "Rel-13-DMRS-tabe flag", "nfapi.drms.table.flag.r13", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pscch_resource, { "PSCCH Resource", "nfapi.pscch.resource", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_time_resource_pattern, { "Time resource pattern", "nfapi.time.resource.pattern", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_mpdcch_transmission_type, { "MPDCCH transmission type", "nfapi.mpdcch.transmission.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_drms_scrambling_init, { "DMRS scrambling init", "nfapi.drms.scrambling.init", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pusch_repetition_levels, { "PUSCH repetition levels", "nfapi.pusch.repetition.levels", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_frequency_hopping_flag, { "Frequency hopping flag", "nfapi.frequency.hopping.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_csi_request, { "CSI request", "nfapi.csi.request", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dai_presence_flag, { "DAI presence flag", "nfapi.dia.presence.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_total_dci_length_include_padding, { "Total DCI length including padding", "nfapi.total.dci.length.including.padding", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_config_prs_pdu_rel9, { "DL CONFIG PRS PDU Rel9", "nfapi.dl.config.prs.pdu.rel9", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_prs_bandwidth, { "PRS Bandwidth", "nfapi.prs.bandwidth", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_prs_cyclic_prefix_type, { "PRS cyclic prefix type", "nfapi.prs.cyclic.prefix.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_config_csi_rs_pdu_rel10, { "DL CONFIG CSI RS PDU Rel10", "nfapi.dl.config.csi.rs.pdu.rel10", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_csi_rs_antenna_port_count_r10, { "Antenna port count r10", "nfapi.csi.rs.antenna.port.count.r10", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_config_request_body, { "UL Config Request body", "nfapi.ul.config.request.body", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_config_pdu_type, { "UL Config PDU Type", "nfapi.ul.config.pdu.type", FT_UINT8, BASE_DEC, VALS(nfapi_ul_config_pdu_type_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_rach_prach_frequency_resources, { "RACH PRACH Frequency resources", "nfapi.rach.prach.frequency.resources", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_srs_present, { "SRS present", "nfapi.srs.present", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_config_harq_buffer_pdu, { "HARQ Buffer PDU", "nfapi.ul.config.harq.buffer.pdu", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_config_ue_information_rel8, { "UE Information Rel 8", "nfapi.ul.config.ue.information.pdu.rel8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_handle, { "Handle", "nfapi.handle", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_config_sr_information_pdu_rel8, { "SR Information Rel 8", "nfapi.ul.config.sr.information.pdu.rel8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pucch_index, { "PUCCH Index", "nfapi.pucch.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_size, { "Size", "nfapi.size", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_resource_block_start, { "Resource block start", "nfapi.resource.block.start", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_resource_blocks, { "Number of resource blocks", "nfapi.resource.blocks", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_cyclic_shift_2_for_drms, { "Cyclic Shift 2 for DRMS", "nfapi.cyclic.shift.2.for.drms", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_frequency_hopping_enabled_flag, { "Frequency hopping enabled flag", "nfapi.frequency.hopping.enabled.flag", FT_UINT8, BASE_DEC, VALS(hopping_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_frequency_hopping_bits, { "Frequency hopping bits", "nfapi.frequency.hopping.bits", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_new_data_indication, { "New Data inidication", "nfapi.new.data.indication", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_harq_process_number, { "HARQ Process number", "nfapi.harq.process.number", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_tx_mode, { "UL Tx Mode", "nfapi.ul.tx.mode", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_current_tx_nb, { "Current Tx nb", "nfapi.current.tx.nb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_n_srs, { "N SRS", "nfapi.n.srs", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_disable_sequence_hopping_flag, { "Disable seqeunce hopping flag", "nfapi.disable.sequence.hopping.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_virtual_cell_id_enabled_flag, { "Virtual cell ID enabled flag", "nfapi.virtual.cell.id.enabled.flag", FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_npusch_identity, { "nPUSCH Identity", "nfapi.npusch.identity", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ndrms_csh_identity, { "nDMRS-CSH Identity", "nfapi.ndrms.csh.identity", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_total_number_of_repetitions, { "Total Number of repetitions", "nfapi.total.number.of.repetitions", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_repetition_number, { "Repetition Number", "nfapi.repetition.number", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_initial_sf_io, { "Initial transmission SF (io) ", "nfapi.initial.sf.io", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_empty_symbols_due_to_retunning, { "Empy symbols due to re-tunning", "nfapi.empty.symbols.due.to.retunning", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_cqi_ri_pmi_size_2, { "DL CQI/PMI/RI size 2", "nfapi.dl.cqi.ri.pmi.size.2", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_harq_size_2, { "HARQ Size 2", "nfapi.harq.size2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_delta_offset_harq_2, { "Delta Offset HARQ 2", "nfapi.delta.offset.harq.2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_starting_prb, { "Starting PRB", "nfapi.starting.prb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_antenna_port, { "Antenna Port", "nfapi.antenna.port", FT_UINT8, BASE_DEC, VALS(antenna_ports_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_combs, { "Number of Combs", "nfapi.num.of.combs", FT_UINT8, BASE_DEC, VALS(combs_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_npucch_identity, { "nPUCCH Identity", "nfapi.npucch.identity", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_empty_symbols, { "Empty symbols", "nfapi.empty.symbols", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_csi_mode, { "CSI_mode", "nfapi.csi.mode", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_cqi_pmi_size_2, { "DL CQI/PMI Size 2", "nfapi.dl.cqi.pmi.size.2", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_statring_prb, { "Starting PRB", "nfapi.starting.prb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_cdm_index, { "cdm_Index", "nfapi.cdm.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_nsrs, { "N srs", "nfapi.n.srs", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_num_ant_ports, { "Num_ant_ports", "nfapi.num.ant.port", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_n_pucch_2_0, { "n_PUCCH_2_0", "nfapi.n.pucch.2.0", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_n_pucch_2_1, { "n_PUCCH_2_1", "nfapi.n.pucch.2.1", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_n_pucch_2_2, { "n_PUCCH_2_2", "nfapi.n.pucch.2.2", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_n_pucch_2_3, { "n_PUCCH_2_3", "nfapi.n.pucch.2.3", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_cqi_pmi_size_rank_1, { "DL CQI PMI size rank 1", "nfapi.dl.cqi.pmi.size.rank.1", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_cqi_pmi_size_rank_greater_1, { "DL CQI PMI size rank greater 1", "nfapi.dl.cqi.pmi.size.rank.1", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ri_size, { "RI size", "nfapi.ri.size", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_delta_offset_cqi, { "Delta offset cqi", "nfapi.delta.offset.cqi", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_delta_offset_ri, { "Delta offset ri", "nfapi.delta.offset.ri", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_harq_size, { "HARQ size", "nfapi.harq_size", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_delta_offset_harq, { "Delta offset HARQ", "nfapi.delta.offset.harq", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ack_nack_mode, { "ACK NACK mode", "nfapi.ack.nack.mode", FT_UINT8, BASE_DEC, VALS(nfapi_ack_nack_mode_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_n_srs_initial, { "N srs initial", "nfapi.n.srs.initial", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_initial_number_of_resource_blocks, { "Initial number of resource blocks", "nfapi.initial.number.of.resource.blocks", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_cqi_pmi_size, { "DL cqi pmi size", "nfapi.dl.cqi.pmi.size", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_report_type, { "Report type", "nfapi.report.type", FT_BOOLEAN, 8, TFS(&nfapi_csi_report_type_strname), 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_cqi_ri_pmi_size, { "DL CQI RI PMI size", "nfapi.dl.cqi.ri.pmi.size", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_control_type, { "Control type", "nfapi.control.type", FT_BOOLEAN, 8, TFS(&nfapi_control_type_string_name), 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_cc, { "Number of cc", "nfapi.number.of.cc", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_pucch_resource, { "Number of PUCCH Resource", "nfapi.number.of.pucch.resource", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pucch_index_p1, { "PUCCH Index P1", "nfapi.pucch.index.p1", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_n_pucch_1_0, { "N PUCCH 1 0", "nfapi.n.pucch.1.0", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_n_pucch_1_1, { "N PUCCH 1 1", "nfapi.n.pucch.1.1", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_n_pucch_1_2, { "N PUCCH 1 2", "nfapi.n.pucch.1.2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_n_pucch_1_3, { "N PUCCH 1 3", "nfapi.n.pucch.1.3", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_srs_bandwidth, { "SRS Bandwidth", "nfapi.srs.bandwidth", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_frequency_domain_position, { "Frequency Domain position", "nfapi.frequency.domain.position", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_srs_hopping_bandwidth, { "SRS hopping bandwidth", "nfapi.srs.hopping.bandwidth", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_transmission_comb, { "Transmission comb", "nfapi.transmission.comb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_i_srs, { "I SRS", "nfapi.i.srs", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_sounding_reference_cyclic_shift, { "Sounding reference cyclic shift", "nfapi.sounding.reference.cyclic.shift", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_antenna_ports, { "Antenna port(s)", "nfapi.antenna.port", FT_UINT8, BASE_DEC, VALS(nfapi_antenna_port_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_config_srs_pdu_rel10, { "SRS PDU Rel 10", "nfapi.srs.pdu.rel.10", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_config_srs_pdu_rel8, { "SRS PDU Rel 8", "nfapi.srs.pdu.rel.8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_config_harq_information_rel9_fdd, { "HARQ information Rel 9 FDD", "nfapi.harq.information.rel.9.fdd", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_config_harq_information_rel8_fdd, { "HARQ information Rel 8 FDD", "nfapi.harq.information.rel.8.fdd", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_config_harq_information_rel10_tdd, { "HARQ information Rel 10 TDD", "nfapi.harq.information.rel.10.tdd", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_config_sr_information_rel10, { "SR information Rel 10", "nfapi.sr.information.rel.10", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_config_sr_information_rel8, { "SR information Rel 8", "nfapi.sr.information.rel.8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_config_cqi_information_rel10, { "CQI information Rel 10", "nfapi.cqi.information.rel.10", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_config_cqi_information_rel8, { "CQI information Rel 8", "nfapi.cqi.information.rel.8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_config_initial_transmission_parameters_rel8, { "Initial transmission parameters Rel 8", "nfapi.initial.transmission.parameters.rel.8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_config_ulsch_harq_information_rel10, { "HARQ Information Rel 10", "nfapi.harq.information.rel.10", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pdu_length, { "PDU length", "nfapi.pdu.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_num_segments, { "Num segments", "nfapi.num.segments", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_segment_length, { "Segment length", "nfapi.segment.length", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_segment_data, { "Segment data", "nfapi.segment.data", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_crc_indication_body, { "CRC Indication Body", "nfapi.crc_indication_body", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_crc_flag, { "CRC flag", "nfapi.crc.flag", FT_BOOLEAN, 8, TFS(&crc_flag_strname), 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_hi_pdus, { "Number of HI Pdu's", "nfapi.number_of_hi_pdus", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_dci_pdus, { "Number of DCI Pdu's", "nfapi.number_of_dci_pdus", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pdu_type, { "PDU Type", "nfapi.pdu_type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_hi_value, { "HI Value", "nfapi.hi_value", FT_BOOLEAN, 8, TFS(&hi_value_strname), 0x0, NULL, HFILL } }, -- { &hf_nfapi_i_phich, { "i phich", "nfapi.i_phich", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_flag_tb2, { "Flag TB2", "nfapi.flag_tb2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_hi_value_2, { "HI Value 2", "nfapi.hi_value_2", FT_BOOLEAN, BASE_NONE, TFS(&hi_value_strname), 0x0, NULL, HFILL } }, -- { &hf_nfapi_ue_tx_antenna_selection, { "UE Tx Antenna selection", "nfapi.ue_tx_antenna_selection", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_cqi_csi_request, { "cqi csi request", "nfapi.cqi_csi_request", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_index, { "UL index", "nfapi.ul_index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_assignment_index, { "DL Assignment index", "nfapi.dl_assignment_index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_tpc_bitmap, { "TPC bitmap", "nfapi.tpc_bitmap", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_antenna_ports, { "Number of antenna ports", "nfapi.number.of.antenna.ports", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_size_of_cqi_csi_feild, { "Size of cqi csi feild", "nfapi.size.of.cqi.csi.feild", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_new_data_indication_two, { "New data indicatipon 2", "nfapi.new.data.indication.two", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_resource_allocation_flag, { "Resource allocation flag", "nfapi.resource.allocation.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_node_sync, { "DL Node Sync", "nfapi.dl.node.sync", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_node_sync_t1, { "DL Node Sync t1", "nfapi.dl.node.sync.t1", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_node_sync_delta_sfn_sf, { "DL Node Sync Delta SFN SF", "nfapi.dl.node.sync.delta_sfn_sf", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_dl_cyclic_prefix_type, { "DL Cyclic Prefix type", "nfapi.dl.cyclic.prefix.type", FT_BOOLEAN, 8, TFS(&cyclic_prefix_type_strname), 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_cyclic_prefix_type, { "UL Cyclic Prefix type", "nfapi.ul.cyclic.prefix.type", FT_BOOLEAN, 8, TFS(&cyclic_prefix_type_strname), 0x0, NULL, HFILL } }, -- { &hf_nfapi_downlink_channel_bandwidth, { "Downlink Channel Bandwidth", "nfapi.dl.channel.bandwidth", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_uplink_channel_bandwidth, { "Uplink Channel Bandwidth", "nfapi.ul.channel_bandwidth", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_tx_antenna_ports, { "Tx Antenna Ports", "nfapi.tx.antenna.ports", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_rx_antenna_ports, { "Tx Antenna Ports", "nfapi.rx.antenna.ports", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_node_sync, { "UL Node Sync", "nfapi.ul.node.sync", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_node_sync_t1, { "UL Node Sync t1", "nfapi.ul.node.sync.t1", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_node_sync_t2, { "UL Node Sync t2", "nfapi.ul.node.sync.t2", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_node_sync_t3, { "UL Node Sync t3", "nfapi.ul.node.sync.t3", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pb, { "P-B", "nfapi.pb.allocation", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_timing_info_last_sfn_sf, { "Last SFN/SF", "nfapi.timing.info.last.sfn.sf", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_timing_info_time_since_last_timing_info, { "Time since last Timing Info", "nfapi.timing.info.time.since.last.timing.info", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_timing_info_dl_config_jitter, { "DL Config Jitter", "nfapi.timing.info.dl.config.jitter", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_timing_info_tx_request_jitter, { "Tx Request Jitter", "nfapi.timing.info.tx.req.jitter", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_timing_info_ul_config_jitter, { "UL Config Jitter", "nfapi.timing.info.ul.config.jitter", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_timing_info_hi_dci0_jitter, { "HI_DCI0 Jitter", "nfapi.timing.info.hi.dci0.jitter", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_timing_info_dl_config_latest_delay, { "DL Config Latest Delay", "nfapi.timing.info.dl.config.latest.delay", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_timing_info_tx_request_latest_delay, { "Tx Request Latest Delay", "nfapi.timing.info.tx.request.latest.delay", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_timing_info_ul_config_latest_delay, { "UL Config Latest Delay", "nfapi.timing.info.ul.config.latest.delay", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_timing_info_hi_dci0_latest_delay, { "HI_DCI0 Latest Delay", "nfapi.timing.info.hi.dci0.latest.delay", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_timing_info_dl_config_earliest_arrival, { "DL Config Earliest Arrival", "nfapi.timing.info.dl.config.earliest.arrival", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_timing_info_tx_request_earliest_arrival, { "Tx Request Earliest Arrival", "nfapi.timing.info.tx.request.earliest.arrival", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_timing_info_ul_config_earliest_arrival, { "UL Config Earliest Arrival", "nfapi.timing.info.ul.config.earliest.arrival", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_timing_info_hi_dci0_earliest_arrival, { "HI_DCI0 Earliest Arrival", "nfapi.timing.info.hi.dci0.earliest.arrival", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pcfich_power_offset, { "PCFICH Power Offset", "nfapi.pcfich.power.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_timing_window, { "NFAPI Timing window", "nfapi.timing.window", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_timing_info_mode, { "Timing Info mode", "nfapi.timing.info.mode", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_timing_info_period, { "Timing info period", "nfapi.timing.info.period", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_max_transmit_power, { "Max transmit power", "nfapi.max.transmit.power", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_uint8_tag, { "uint8 tag", "nfapi.uint8.tag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_uint16_tag, { "uint16 tag", "nfapi.uint16.tag", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_harq_mode, { "Mode", "nfapi.harq.mode", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_ack_nack, { "Number of ACK/NACK", "nfapi.uint16.tag", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_harq_data_value_0, { "Value 0", "nfapi.harq.value.0", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_harq_data_value_1, { "Value 1", "nfapi.harq.value.1", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_harq_data_value_2, { "Value 2", "nfapi.harq.value.2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_harq_data_value_3, { "Value 3", "nfapi.harq.value.3", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_harq_tb_1, { "HARQ TB1", "nfapi.harq.tb.", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_harq_tb_2, { "HARQ TB2", "nfapi.harq.tb.2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_harq_tb_n, { "HARQ TB_N", "nfapi.harq.tb.n", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_cqi, { "UL_CQI", "nfapi.ul.cqi", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_channel, { "Channel", "nfapi.channel", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_data_offset, { "Data Offset", "nfapi.data.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ri, { "RI", "nfapi.ri", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_harq_ack_nack_data, { "HARQ Ack/Nack Data", "nfapi.harq.ack.nack.data", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_harq_data, { "HARQ TB Data", "nfapi.harq.tb.data", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_cc, { "CC", "nfapi.cc", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_rbs, { "RBs", "nfapi.rbs", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_antennas, { "Physical Antennas", "nfapi.physical.antennas", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_timing_advance, { "Timing Advance", "nfapi.timing.advance", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_timing_advance_r9, { "Timing Advance R9", "nfapi.timing.advance.r9", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_cc_reported, { "Number of CC reported", "nfapi.number.of.cc.reported", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_preamble, { "Preamble", "nfapi.preamble", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_rach_resource_type, { "RACH resource type", "nfapi.rach.resource.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_doppler_estimation, { "Doppler estimation", "nfapi.doppler.estimation", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_rb_start, { "RB Start", "nfapi.rb.start", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_snr, { "SNR", "nfapi.snr", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_up_pts_symbol, { "UpPTS Symbol", "nfapi.uppts.symbol", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_prb_per_subband, { "numPRBperSubband", "nfapi.num.prb.per.subband", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_antennas, { "numAntennas", "nfapi.num.antennas", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_subband_index, { "subbandIndex", "nfapi.subband.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_channel_coefficient, { "Channel", "nfapi.channel.coefficient", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_ul_rtoa, { "UL_RTOA", "nfapi.ul.rtoa", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_frequency_band_indicator, { "Frequency Band Indicator", "nfapi.frequency.band.indicator", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_measurement_period, { "Measurement Period", "nfapi.measurement.period", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_bandwidth, { "Bandwidth", "nfapi.bandwidth", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_timeout, { "Timeout", "nfapi.timeout", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_earfcns, { "Number of EARFCNs", "nfapi.number.of.earfcns", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_earfcn_list, { "EARFCN List", "nfapi.earfcn.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_uarfcn, { "UARFCN", "nfapi.uarfcn", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_uarfcns, { "Number of UARFCNs", "nfapi.number.of.uarfcn", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_uarfcn_list, { "UARFCN List", "nfapi.uarfcn.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_arfcn, { "ARFCN", "nfapi.arfcn", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_arfcn_direction, { "Direction", "nfapi.arfcn.direction", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_arfcns, { "Number of ARFCNs", "nfapi.number.of.arfcn", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_arfcn_list, { "ARFCN List", "nfapi.arfcn.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_rssi, { "RSSI", "nfapi.rssi", FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_rssi, { "Number of RSSI", "nfapi.number.of.rssi", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_rssi_list, { "RSSI List", "nfapi.rssi.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pci, { "PCI", "nfapi.pci", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_measurement_bandwidth, { "Measurement Bandwidth", "nfapi.measurement.bandwidth", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_exhaustive_search, { "Exhaustive Search", "nfapi.exhaustive.search", FT_UINT8, BASE_DEC, VALS(exhustive_search_vals), 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_pci, { "Number of PCI", "nfapi.number.of.pci", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pci_list, { "PCI List", "nfapi.pci.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_psc, { "PSC", "nfapi.psc", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_psc, { "Number of PSC", "nfapi.number.of.psc", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_psc_list, { "PCS List", "nfapi.psc.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_rsrp, { "RSRP", "nfapi.rsrp", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_rsrq, { "RSRQ", "nfapi.rsrq", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_lte_cells_found, { "Number of LTE Cells Found", "nfapi.number.of.lte.cells.found", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_lte_cells_found_list, { "LTE Cells Found List", "nfapi.lte.cells.found.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_rscp, { "RSCP", "nfapi.rscp", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_enco, { "EcNo", "nfapi.ecno", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_utran_cells_found, { "Number of UTRAN Cells Found", "nfapi.number.of.utran.cells.found", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_utran_cells_found_list, { "UTRAN Cells Found List", "nfapi.utran.cells.found.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_bsic, { "BSIC", "nfapi.bsic", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_rxlev, { "RxLev", "nfapi.rxlev", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_rxqual, { "RxQual", "nfapi.rxqual", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_sfn_offset, { "SFN Offset", "nfapi.sfn.offset", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_geran_cells_found, { "Number of GSM Cells Found", "nfapi.number.of.geran.cells.found", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_geran_cells_found_list, { "GERAN Cells Found List", "nfapi.geran.cells.found.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_tx_antenna, { "Number of Tx Antenna", "nfapi.number.of.tx.antenna", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_mib_length, { "MIB Length", "nfapi.mib.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_mib, { "MIB", "nfapi.mib", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_phich_configuration, { "PHICH Configuration", "nfapi.phich.configuration", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_retry_count, { "retryCount", "nfapi.retry.count", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_sib1, { "SIB1", "nfapi.sib1", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_si_periodicity, { "SI Periodicity", "nfapi.si.periodicity", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_si_index, { "SI Index", "nfapi.si.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_number_of_si_periodicity, { "Number of SI Periodicity", "nfapi.number.of.si.periodicity", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_si_periodicity_list, { "SI Periodicity List", "nfapi.si.periodicity.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_si_window_length, { "SI Window Length", "nfapi.si.window.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_sib_type, { "SIB Type", "nfapi.sib.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_sib_len, { "SIB Length", "nfapi.sib.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_sib, { "SIB", "nfapi.sib", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_si_len, { "SI Length", "nfapi.si.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_si, { "SI", "nfapi.si", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pnf_search_state, { "State", "nfapi.state", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- { &hf_nfapi_pnf_broadcast_state, { "State", "nfapi.state", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, -- -- }; -- -- /* Setup protocol subtree array */ -- static gint *ett[] = { -- &ett_nfapi_message_tree, -- &ett_nfapi_p4_p5_message_header, -- &ett_nfapi_p7_message_header, -- &ett_nfapi_tlv_tree, -- &ett_nfapi_tl, -- &ett_nfapi_pnf_param_response, -- &ett_nfapi_pnf_phy_rf_config, -- &ett_nfapi_pnf_phy_rf_config_instance, -- &ett_nfapi_pnf_phy, -- &ett_nfapi_pnf_phy_rel10, -- &ett_nfapi_pnf_phy_rel11, -- &ett_nfapi_pnf_phy_rel12, -- &ett_nfapi_pnf_phy_rel13, -- &ett_nfapi_pnf_rf, -- &ett_nfapi_phy_state, -- &ett_nfapi_rf_bands, -- &ett_nfapi_bf_vectors, -- &ett_nfapi_csi_rs_bf_vector, -- &ett_nfapi_csi_rs_resource_configs, -- &ett_nfapi_tx_antenna_ports, -- &ett_nfapi_harq_ack_nack_data, -- &ett_nfapi_harq_data, -- &ett_nfapi_cc, -- &ett_nfapi_rbs, -- &ett_nfapi_antennas, -- &ett_nfapi_epdcch_prbs, -- &ett_nfapi_dl_config_request_body, -- &ett_nfapi_dl_config_request_pdu_list, -- &ett_nfapi_ul_config_request_pdu_list, -- &ett_nfapi_hi_dci0_request_pdu_list, -- &ett_nfapi_tx_request_pdu_list, -- &ett_nfapi_rx_indication_pdu_list, -- &ett_nfapi_harq_indication_pdu_list, -- &ett_nfapi_crc_indication_pdu_list, -- &ett_nfapi_sr_indication_pdu_list, -- &ett_nfapi_cqi_indication_pdu_list, -- &ett_nfapi_preamble_indication_pdu_list, -- &ett_nfapi_srs_indication_pdu_list, -- &ett_nfapi_lbt_dl_config_pdu_list, -- &ett_nfapi_lbt_dl_indication_pdu_list, -- &ett_nfapi_dl_config_request_dlsch_pdu_rel8, -- &ett_nfapi_dl_config_request_dlsch_pdu_rel9, -- &ett_nfapi_dl_config_request_dlsch_pdu_rel10, -- &ett_nfapi_dl_config_bch_pdu_rel8, -- &ett_nfapi_dl_config_mch_pdu_rel8, -- &ett_nfapi_dl_config_pch_pdu_rel8, -- &ett_nfapi_dl_config_dci_dl_pdu_rel8, -- &ett_nfapi_dl_config_dci_dl_pdu_rel9, -- &ett_nfapi_dl_config_dci_dl_pdu_rel10, -- &ett_nfapi_dl_config_prs_pdu_rel9, -- &ett_nfapi_dl_config_csi_rs_pdu_rel10, -- &ett_nfapi_subbands, -- &ett_nfapi_precoding, -- &ett_nfapi_bf_vector_antennas, -- &ett_nfapi_ul_config_request_body, -- &ett_nfapi_ul_config_harq_buffer_pdu, -- &ett_nfapi_ul_config_ue_information_rel8, -- &ett_nfapi_ul_config_sr_information_pdu_rel8, -- &ett_nfapi_ul_config_ulsch_pdu_rel8, -- &ett_nfapi_ul_config_ulsch_pdu_rel10, -- &ett_nfapi_ul_config_cqi_ri_information_rel8, -- &ett_nfapi_ul_config_cqi_ri_information_rel9, -- &ett_nfapi_ul_config_ulsch_harq_information_rel10, -- &ett_nfapi_ul_config_initial_transmission_parameters_rel8, -- &ett_nfapi_ul_config_cqi_information_rel8, -- &ett_nfapi_ul_config_cqi_information_rel10, -- &ett_nfapi_ul_config_sr_information_rel8, -- &ett_nfapi_ul_config_sr_information_rel10, -- &ett_nfapi_ul_config_harq_information_rel10_tdd, -- &ett_nfapi_ul_config_harq_information_rel8_fdd, -- &ett_nfapi_ul_config_harq_information_rel9_fdd, -- &ett_nfapi_ul_config_srs_pdu_rel8, -- &ett_nfapi_ul_config_srs_pdu_rel10, -- &ett_nfapi_crc_indication_body, -- -- &ett_nfapi_earfcn_list, -- &ett_nfapi_uarfcn_list, -- &ett_nfapi_arfcn_list, -- &ett_nfapi_rssi_list, -- &ett_nfapi_pci_list, -- &ett_nfapi_psc_list, -- &ett_nfapi_lte_cells_found_list, -- &ett_nfapi_utran_cells_found_list, -- &ett_nfapi_geran_cells_found_list, -- &ett_nfapi_si_periodicity_list, -- -- /* for fragmentation support*/ -- &ett_msg_fragment, -- &ett_msg_fragments -- }; -- -- static ei_register_info ei[] = -- { -- { &ei_power_invalid, { "nfapi.power.invalid", PI_PROTOCOL, PI_ERROR, "Tx Power range invalid [0 - 10000]", EXPFILL } }, -- { &ei_ref_sig_power_invalid, { "nfapi.ref_sig_power.invalid", PI_PROTOCOL, PI_ERROR, "Ref Sig Power range invalid [0 - 255]", EXPFILL }}, -- { &ei_invalid_range, { "nfapi.invalid.range", PI_PROTOCOL, PI_ERROR, "Out of valid range. Todo create more specific error", EXPFILL } }, -- }; -- -- -- -- expert_module_t* expert_nfapi; -- -- /* Register protocol */ -- proto_nfapi = proto_register_protocol("Nfapi", "NFAPI", "nfapi"); -- -- expert_nfapi = expert_register_protocol(proto_nfapi); -- -- expert_register_field_array(expert_nfapi, ei, array_length(ei)); -- -- proto_register_field_array(proto_nfapi, hf, array_length(hf)); -- proto_register_subtree_array(ett, array_length(ett)); -- -- reassembly_table_register(&ul_p7_reassemble_table, &addresses_ports_reassembly_table_functions); -- reassembly_table_register(&dl_p7_reassemble_table, &addresses_ports_reassembly_table_functions); -- -- register_dissector("nfapi", dissect_nfapi, proto_nfapi); -- --} -- --// ----------------------------------------------------------------------------| -- --void proto_reg_handoff_nfapi(void) --{ -- static dissector_handle_t nfapi_handle; -- -- nfapi_handle = create_dissector_handle(dissect_nfapi, proto_nfapi); -- -- dissector_add_for_decode_as("sctp.port", nfapi_handle); -- -- dissector_add_uint("udp.port", 41700, nfapi_handle); -- --} -+ -+ default: -+ { -+ if (msg_id >= 0x112 && msg_id <= 0x017f) -+ { -+ // reserved P5 message -+ } -+ else if (msg_id >= 0x183 && msg_id <= 0x01ff) -+ { -+ // reserved P7 message -+ } -+ else if (msg_id >= 0x0200 && msg_id <= 0x02ff) -+ { -+ // reserved P4 message -+ } -+ else if (msg_id >= 0x0300 && msg_id <= 0x03ff) -+ { -+ // reserved vendor extentions -+ } -+ -+ break; -+ } -+ }; -+ -+ ptvcursor_pop_subtree(ptvc); -+ ptvcursor_free(ptvc); -+ -+ return tvb_captured_length(tvb); -+} -+ -+static void nfapi_tag_vals_fn(gchar* s, guint32 v) -+{ -+ const tlv_t* tlv = look_up_tlv(v); -+ if (tlv != 0) -+ { -+ g_snprintf(s, ITEM_LABEL_LENGTH, "%s (0x%x)", tlv->name, v); -+ } -+ else -+ { -+ g_snprintf(s, ITEM_LABEL_LENGTH, "%s (0x%x)", "Unknown", v); -+ } -+} -+static void neg_pow_conversion_fn(gchar* s, guint8 v) -+{ -+ g_snprintf(s, ITEM_LABEL_LENGTH, "%d dB (%d)", ((gint16)v * (-1)), v); -+} -+static void power_offset_conversion_fn(gchar* s, guint16 v) -+{ -+ g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", (((float)v * 0.001) - 6.0), v); -+} -+static void reference_signal_power_conversion_fn(gchar* s, guint16 v) -+{ -+ g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", (((float)v * 0.25) - 63.75), v); -+} -+static void laa_threshold_conversion_fn(gchar* s, guint16 v) -+{ -+ g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", (float)(v * -100.00), v); -+} -+static void max_transmit_power_2_conversion_fn(gchar* s, guint16 v) -+{ -+ g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", ((float)v * 0.1) - 10.0, v); -+} -+static void max_transmit_power_conversion_fn(gchar* s, guint16 v) -+{ -+ g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", ((float)v * 0.1), v); -+} -+static void sfn_sf_conversion_fn(gchar* s, guint16 v) -+{ -+ g_snprintf(s, ITEM_LABEL_LENGTH, "%d/%d (%d)", v >> 0x4, v & 0x000F, v); -+} -+static void rssi_conversion_fn(gchar* s, guint16 v) -+{ -+ g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", ((float)v * 0.1), v); -+} -+static void dl_rs_tx_pow_measment_conversion_fn(gchar* s, guint16 v) -+{ -+ g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", ((float)v * 0.1), v); -+} -+ -+static void ul_cqi_conversion_fn(gchar* s, guint16 v) -+{ -+ g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", (((float)v / 2 ) - 64.0), v); -+} -+ -+// ----------------------------------------------------------------------------| -+ -+void proto_register_nfapi(void) -+{ -+ static hf_register_info hf[] = -+ { -+ { &hf_msg_fragments, -+ { "Message fragments", "nfapi.fragments", -+ FT_NONE, BASE_NONE, NULL, 0x00, -+ NULL, HFILL } -+ }, -+ { &hf_msg_fragment, -+ { "Message fragment", "nfapi.fragment", -+ FT_FRAMENUM, BASE_NONE, NULL, 0x00, -+ NULL, HFILL } -+ }, -+ { &hf_msg_fragment_overlap, -+ { "Message fragment overlap", "nfapi.fragment.overlap", -+ FT_BOOLEAN, 0, NULL, 0x00, -+ NULL, HFILL } -+ }, -+ { &hf_msg_fragment_overlap_conflicts, -+ { "Message fragment overlapping with conflicting data", "nfapi.fragment.overlap.conflicts", -+ FT_BOOLEAN, 0, NULL, 0x00, -+ NULL, HFILL } -+ }, -+ { &hf_msg_fragment_multiple_tails, -+ { "Message has multiple tail fragments", "nfapi.fragment.multiple_tails", -+ FT_BOOLEAN, 0, NULL, 0x00, -+ NULL, HFILL } -+ }, -+ { &hf_msg_fragment_too_long_fragment, -+ { "Message fragment too long", "nfapi.fragment.too_long_fragment", -+ FT_BOOLEAN, 0, NULL, 0x00, -+ NULL, HFILL } -+ }, -+ { &hf_msg_fragment_error, -+ { "Message defragmentation error", "nfapi.fragment.error", -+ FT_FRAMENUM, BASE_NONE, NULL, 0x00, -+ NULL, HFILL } -+ }, -+ { &hf_msg_fragment_count, -+ { "Message fragment count", "nfapi.fragment.count", -+ FT_UINT32, BASE_DEC, NULL, 0x00, -+ NULL, HFILL } -+ }, -+ { &hf_msg_reassembled_in, -+ { "Reassembled in", "nfapi.reassembled.in", -+ FT_FRAMENUM, BASE_NONE, NULL, 0x00, -+ NULL, HFILL } -+ }, -+ { &hf_msg_reassembled_length, -+ { "Reassembled length", "nfapi.reassembled.length", -+ FT_UINT32, BASE_DEC, NULL, 0x00, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_p4_p5_message_header_phy_id, -+ { "PHY ID", "nfapi.p4_p5_message_header.phy_id", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Within the PNF Device, the unique identity of the PHY instance as assigned through the PNF_CONFIG.request", HFILL } -+ }, -+ { &hf_nfapi_p4_p5_message_header_message_id, -+ { "Message ID", "nfapi.p4_p5_message_header.message_id", -+ FT_UINT16, BASE_HEX_DEC, VALS(message_id_vals), 0x0, -+ "The nFAPI message identity", HFILL } -+ }, -+ { &hf_nfapi_p4_p5_message_header_message_length, -+ { "Message Length", "nfapi.p4_p5_message_header.message_length", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The length in bytes of the message including the header", HFILL } -+ }, -+ { &hf_nfapi_p4_p5_message_header_spare, -+ { "Spare", "nfapi.p4_p5_message_header.spare", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Reserved field to be populated with zeros on transmission and ignored on reception", HFILL } -+ }, -+ { &hf_nfapi_p7_message_header_phy_id, -+ { "Phy ID", "nfapi.p7_message_header.phy_id", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Within the PNF Device, the unique identity of the PHY instance as assigned through the PNF_CONFIG.request", HFILL } -+ }, -+ { &hf_nfapi_p7_message_header_message_id, -+ { "Message ID", "nfapi.p7.message_header.message_id", -+ FT_UINT16, BASE_HEX_DEC, VALS(message_id_vals), 0x0, -+ "The nFAPI message identity", HFILL } -+ }, -+ { &hf_nfapi_p7_message_header_message_length, -+ { "Message Length", "nfapi.p7_message_header.message_length", -+ FT_UINT16, BASE_DEC | BASE_UNIT_STRING, &units_byte_bytes, 0x0, -+ "The length in bytes of the message segment including the header", HFILL } -+ }, -+ { &hf_nfapi_p7_message_header_m, -+ { "M", "nfapi.p7_message_header.m_segment_sequence", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "A More flag indicating there are more segments to follow to complete the entire message", HFILL } -+ }, -+ { &hf_nfapi_p7_message_header_segment, -+ { "Segment Number", "nfapi.p7_message_header.m_segment_sequence", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The segment number starting at zero and incrementing by one between each segment", HFILL } -+ }, -+ { &hf_nfapi_p7_message_header_sequence_number, -+ { "Sequence Number", "nfapi.p7_message_header.m_segment_sequence", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The incrementing sequence number for all complete messages over the P7 nFAPI interface per PHY instance", HFILL } -+ }, -+ { &hf_nfapi_p7_message_header_checksum, -+ { "Checksum", "nfapi.p7_message_header.checksum", -+ FT_UINT32, BASE_HEX_DEC, NULL, 0x0, -+ "The checksum of the whole message segment (including header) as calculated using " -+ "the CRC32c algorithm following the same method as the SCTP protocol defined in IETF RFC 4960 " -+ "The Checksum is optional to populate and must be filled with zero's when not used", HFILL } -+ }, -+ { &hf_nfapi_p7_message_header_transmit_timestamp, -+ { "Transmit Timestamp", "nfapi.p7_message_header.timestamp", -+ FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, -+ "The offset from VNF SFN/SF 0/0 time reference of the message transmission at the transport layer, in microseconds, with a range of 0 to 10239999", HFILL } -+ }, -+ { &hf_nfapi_tl_tag, -+ { "TLV Tag", "nfapi.tl_tag", -+ FT_UINT16, BASE_CUSTOM, CF_FUNC(nfapi_tag_vals_fn), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_tl_length, -+ { "TLV Length", "nfapi.tl_length", -+ FT_UINT16, BASE_DEC | BASE_UNIT_STRING, &units_byte_bytes, 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_error_code, -+ { "Error Code", "nfapi.error.code", -+ FT_UINT8, BASE_DEC, VALS(nfapi_error_vals), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_p4_error_code, -+ { "Error Code", "nfapi.p4_error.code", -+ FT_UINT8, BASE_DEC, VALS(nfapi_p4_error_vals), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_rat_type, -+ { "RAT Type", "nfapi.rat_type", -+ FT_UINT8, BASE_DEC, VALS(nfapi_rat_type_vals), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_num_tlv, -+ { "Number of TLV", "nfapi.param.response.num_tlv", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_phy_state, -+ { "Phy state value", "nfapi.phy.state", -+ FT_UINT16, BASE_DEC, VALS(nfapi_phy_state_vals), 0x0, -+ "Indicates the current operational state of the PHY", HFILL } -+ }, -+ { &hf_nfapi_dl_ue_per_sf, -+ { "Downlink UEs per Subframe", "nfapi.dl.ue.per.sf", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The maximum number of downlink UEs per subframe supported." -+ "This is the maximum number of downlink UEs that can be scheduled per " -+ "subframe, non-inclusive of broadcast, paging and common channels.", HFILL } -+ }, -+ { &hf_nfapi_ul_ue_per_sf, -+ { "Uplink UEs per Subframe", "nfapi.ul.ue.per.sf", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The maximum number of uplink UEs per subframe supported." -+ "This is the maximum number of uplink UEs that can be scheduled per " -+ "subframe, non-inclusive of common channels.", HFILL } -+ }, -+ { &hf_nfapi_duplex_mode, -+ { "Duplex Mode", "nfapi.duplex.mode", -+ FT_UINT16, BASE_DEC, VALS(nfapi_duplex_mode_vals), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_dl_bandwidth_support, -+ { "Downlink bandwidth support", "nfapi.dl.bandwidth.support", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The PHY downlink channel bandwidth capability (in resource blocks)", HFILL } -+ }, -+ { &hf_nfapi_dl_bandwidth_support_6, -+ { "6Mhz", "nfapi.dl.bandwidth.support.6", -+ FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_dl_bandwidth_support_15, -+ { "15Mhz", "nfapi.dl.bandwidth.support.15", -+ FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_dl_bandwidth_support_25, -+ { "25Mhz", "nfapi.dl.bandwidth.support.25", -+ FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_dl_bandwidth_support_50, -+ { "50Mhz", "nfapi.dl.bandwidth.support.50", -+ FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_dl_bandwidth_support_75, -+ { "75Mhz", "nfapi.dl.bandwidth.support.75", -+ FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_dl_bandwidth_support_100, -+ { "100Mhz", "nfapi.dl.bandwidth.support.100", -+ FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_ul_bandwidth_support, -+ { "Uplink bandwidth support", "nfapi.ul.bandwidth.support", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The PHY uplink channel bandwidth capability (in resource blocks)", HFILL } -+ }, -+ { &hf_nfapi_ul_bandwidth_support_6, -+ { "6Mhz", "nfapi.ul.bandwidth.support.6", -+ FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_ul_bandwidth_support_15, -+ { "15Mhz", "nfapi.ul.bandwidth.support.15", -+ FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_ul_bandwidth_support_25, -+ { "25Mhz", "nfapi.ul.bandwidth.support.25", -+ FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_ul_bandwidth_support_50, -+ { "50Mhz", "nfapi.ul.bandwidth.support.50", -+ FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_ul_bandwidth_support_75, -+ { "75Mhz", "nfapi.ul.bandwidth.support.75", -+ FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_ul_bandwidth_support_100, -+ { "100Mhz", "nfapi.ul.bandwidth.support.100", -+ FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_dl_modulation_support, -+ { "Downlink modulation support", "nfapi.dl.modulation.support", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The PHY downlink modulation capability", HFILL } -+ }, -+ { &hf_nfapi_dl_modulation_support_qpsk, -+ { "QPSK", "nfapi.dl.modulation.support.qpsk", -+ FT_BOOLEAN, 1, NULL, 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_dl_modulation_support_16qam, -+ { "16QAM", "nfapi.dl.modulation.support.16qam", -+ FT_BOOLEAN, 1, NULL, 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_dl_modulation_support_64qam, -+ { "64QAM", "nfapi.dl.modulation.support.64qam", -+ FT_BOOLEAN, 1, NULL, 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_dl_modulation_support_256qam, -+ { "256QAM", "nfapi.dl.modulation.support.256qam", -+ FT_BOOLEAN, 1, NULL, 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_ul_modulation_support, -+ { "Uplink modulation support", "nfapi.ul.modulation.support", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The PHY uplink modulation capability", HFILL } -+ }, -+ { &hf_nfapi_ul_modulation_support_qpsk, -+ { "QPSK", "nfapi.ul.modulation.support.qpsk", -+ FT_BOOLEAN, 1, NULL, 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_ul_modulation_support_16qam, -+ { "16QAM", "nfapi.ul.modulation.support.16qam", -+ FT_BOOLEAN, 1, NULL, 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_ul_modulation_support_64qam, -+ { "64QAM", "nfapi.ul.modulation.support.64qam", -+ FT_BOOLEAN, 1, NULL, 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_phy_antenna_capability, -+ { "Phy Antenna capability", "nfapi.phy.antenna.capability", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Number of antennas supported", HFILL } -+ }, -+ { &hf_nfapi_release_capability, -+ { "Release capability", "nfapi.release.capability", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates which release the PHY supports", HFILL } -+ }, -+ { &hf_nfapi_mbsfn_capability, -+ { "MBSFN capability", "nfapi.mbsfn.capability", -+ FT_BOOLEAN, 8, TFS(&support_strname), 0x0, -+ "Indicates support for MBSFN features", HFILL } -+ }, -+ { &hf_nfapi_laa_capability, -+ { "LAA Support", "nfapi.laa.support", -+ FT_BOOLEAN, 8, TFS(&support_strname), 0x0, -+ "Indicates support for LAA features", HFILL } -+ }, -+ { &hf_nfapi_pd_sensing_lbt_support, -+ { "PD sensing LBT support", "nfapi.pd.sensing.lbt.support", -+ FT_BOOLEAN, 8, TFS(&support_strname), 0x0, -+ "Indicates support for PD sensing in L1", HFILL } -+ }, -+ { &hf_nfapi_multi_carrier_lbt_support, -+ { "Multi carrier LBT support", "nfapi.multi.carrier.lbt.support", -+ FT_UINT16, BASE_DEC, VALS(nfapi_mutli_carrier_lbt_support_vals), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_partial_sf_support, -+ { "Partial SF support", "nfapi.partial.sf.support", -+ FT_BOOLEAN, 8, TFS(&partial_sf_support_strname), 0x0, -+ "Indicates support for Partial SF in L1", HFILL } -+ }, -+ { &hf_nfapi_reference_signal_power, -+ { "Reference signal power", "nfapi.ref_sig_power", -+ FT_UINT16, BASE_CUSTOM, CF_FUNC(reference_signal_power_conversion_fn), 0x0, -+ "Normalized value levels (relative) to accommodate different absolute Tx Power used by eNb", HFILL } -+ }, -+ { &hf_nfapi_primary_synchronization_signal_epre_eprers, -+ { "Primary synchronization signal EPRE/EPRERS", "nfapi.primary.sync.signal", -+ FT_UINT16, BASE_CUSTOM, CF_FUNC(power_offset_conversion_fn), 0x0, -+ "The power of synchronization signal with respect to the reference signal, (PSS for LTE cell, NPSS for NB-IOT cell)", HFILL } -+ }, -+ { &hf_nfapi_secondary_synchronization_signal_epre_eprers, -+ { "Secondary synchronization signal EPRE/EPRERS", "nfapi.secondary.sync.signal", -+ FT_UINT16, BASE_CUSTOM, CF_FUNC(power_offset_conversion_fn), 0x0, -+ "The power of synchronization signal with respect to the reference signal, (SSS for LTE cell, NSSS for NB-IOT cell)", HFILL } -+ }, -+ { &hf_nfapi_physical_cell_id, -+ { "Physical Cell ID", "nfapi.physical.cell.id", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The Cell ID sent with the synchronization signal", HFILL } -+ }, -+ { &hf_nfapi_phich_resource, -+ { "PHICH Resource", "nfapi.phich.resource", -+ FT_UINT16, BASE_DEC, VALS(nfapi_phich_resource_vals), 0x0, -+ "The number of resource element groups used for PHICH", HFILL } -+ }, -+ { &hf_nfapi_phich_duration, -+ { "PHICH Duration", "nfapi.phich.duration", -+ FT_BOOLEAN, 8, TFS(&phich_duration_strname), 0x0, -+ "The PHICH duration for MBSFN and non-MBSFN sub-frames", HFILL } -+ }, -+ { &hf_nfapi_phich_power_offset, -+ { "PHICH Power Offset", "nfapi.phich.power.offset", -+ FT_UINT16, BASE_CUSTOM, CF_FUNC(power_offset_conversion_fn), 0x0, -+ "The power per antenna of the PHICH with respect to the reference signal", HFILL } -+ }, -+ { &hf_nfapi_configuration_index, -+ { "Configuration Index", "nfapi.configuration.index", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Provides information about the location and format of the PRACH.", HFILL } -+ }, -+ { &hf_nfapi_root_sequence_index, -+ { "Root sequence Index", "nfapi.root.sequence.index", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "PRACH Root sequence index", HFILL } -+ }, -+ { &hf_nfapi_zero_correlation_zone_configuration, -+ { "Zero correlation zone configuration", "nfapi.zero.correlation.zone.configuration", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Equivalent to Ncs", HFILL } -+ }, -+ { &hf_nfapi_high_speed_flag, -+ { "High Speed Flag", "nfapi.high.speed.flag", -+ FT_BOOLEAN, 8, TFS(&high_speed_flag_strname), 0x0, -+ "Indicates if unrestricted, or restricted, set of preambles is used", HFILL } -+ }, -+ { &hf_nfapi_frequency_offset, -+ { "Frequency offset", "nfapi.frequency.offset", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The first physical resource block available for PRACH", HFILL } -+ }, -+ { &hf_nfapi_hopping_mode, -+ { "Hopping Mode", "nfapi.hopping.mode", -+ FT_BOOLEAN, 8, TFS(&hopping_mode_strname), 0x0, -+ "If hopping is enabled indicates the type of hopping used", HFILL } -+ }, -+ { &hf_nfapi_hopping_offset, -+ { "Hopping offset", "nfapi.hopping.offset", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The offset used if hopping is enabled", HFILL } -+ }, -+ { &hf_nfapi_delta_pucch_shift, -+ { "Delta PUCCH Shift", "nfapi.delta.pucch.shift", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The cyclic shift difference", HFILL } -+ }, -+ { &hf_nfapi_n_cqi_rb, -+ { "N CQI RB", "nfapi.n.cqi.rb", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The bandwidth, in units of resource blocks, that is available for use by PUCCH formats 2/2a/2b transmission in each slot", HFILL } -+ }, -+ { &hf_nfapi_n_an_cs, -+ { "N AN CS", "nfapi.n.an.cs", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The number of cyclic shifts used for PUCCH formats 1/1a/1b in a resource block with a mix of formats 1/a/1/ab and 2/2a/2b.", HFILL } -+ }, -+ { &hf_nfapi_n1_pucch_an, -+ { "N1 PUCCH AN", "nfapi.n1.pucch.an", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "N1 PUCCH", HFILL } -+ }, -+ { &hf_nfapi_bandwidth_configuration, -+ { "Bandwidth configuration", "nfapi.bw.configuration", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The available SRS bandwidth of the cell", HFILL } -+ }, -+ { &hf_nfapi_srs_subframe_configuration, -+ { "SRS subframe configuration", "nfapi.srs.subframe.configuration", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The subframe configuration. Needed if semi-static configuration is held in PHY", HFILL } -+ }, -+ { &hf_nfapi_uplink_rs_hopping, -+ { "Uplink RS hopping", "nfapi.uplink.rs.hopping", -+ FT_UINT16, BASE_DEC, VALS(nfapi_uplink_rs_hopping_vals), 0x0, -+ "Indicates the type of hopping to use", HFILL } -+ }, -+ { &hf_nfapi_group_assignment, -+ { "Group assignment", "nfapi.group.assignment", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The sequence shift pattern used if group hopping is enabled", HFILL } -+ }, -+ { &hf_nfapi_cyclic_shift_1_for_drms, -+ { "Cyclic Shift 1 for DRMS", "nfapi.cyclic.shift.1.for.drms", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Specifies the cyclic shift for the reference signal used in the cell.", HFILL } -+ }, -+ { &hf_nfapi_subframe_assignment, -+ { "Subframe_assignment", "nfapi.subframe.assignment", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "For TDD mode only, indicates the DL/UL subframe structure", HFILL } -+ }, -+ { &hf_nfapi_special_subframe_patterns, -+ { "Special Subframe patterns", "nfapi.special.subframe.patterns", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "For TDD mode only. Length of fields DwPTS, GP and UpPTS", HFILL } -+ }, -+ { &hf_nfapi_ed_threshold_for_lbt_for_pdsch, -+ { "ED Threshold for LBT for PDSCH", "nfapi.ed.threshold.for.lbt.pdsch", -+ FT_UINT16, BASE_CUSTOM, CF_FUNC(laa_threshold_conversion_fn), 0x0, -+ "Indicates the energy detection threshold in dBm for LBT for PDSCH", HFILL } -+ }, -+ { &hf_nfapi_ed_threshold_for_lbt_for_drs, -+ { "ED Threshold for LBT for DRS", "nfapi.ed.threshold.for.lbt.for.drs", -+ FT_UINT16, BASE_CUSTOM, CF_FUNC(laa_threshold_conversion_fn), 0x0, -+ "Indicates the energy detection threshold in dBm for LBT for DRS", HFILL } -+ }, -+ { &hf_nfapi_pd_threshold, -+ { "PD Threshold", "nfapi.pd.threshold", -+ FT_UINT16, BASE_CUSTOM, CF_FUNC(laa_threshold_conversion_fn), 0x0, -+ "Indicates the preamble detection threshold in dBm, if the L1 capabilities support PD", HFILL } -+ }, -+ { &hf_nfapi_multi_carrier_type, -+ { "Multi carrier type", "nfapi.multi.carrier.type", -+ FT_UINT16, BASE_DEC, VALS(nfapi_laa_carrier_type_vals), 0x0, -+ "Indicates multi carrier type configuration of L1 (according to L1 capabilities and L2 scheduler requirements", HFILL } -+ }, -+ { &hf_nfapi_multi_carrier_tx, -+ { "Multi carrier TX", "nfapi.multi.carrier.tx", -+ FT_BOOLEAN, 8, TFS(&nfapi_multi_carrier_tx_strname), 0x0, -+ "Indicates multi carrier transmission configuration of L1 (according to type if supporting multi carrier)", HFILL } -+ }, -+ { &hf_nfapi_multi_carrier_freeze, -+ { "Multi carrier freeze", "nfapi.multi.carrier.freeze", -+ FT_BOOLEAN, 8, TFS(&nfapi_multi_carrier_freeze_strname), 0x0, -+ "Indicates multi carrier freeze, configuration of L1 (applicable only to type A type if supporting multi carrier)", HFILL } -+ }, -+ { &hf_nfapi_tx_antenna_ports_for_drs, -+ { "Tx antenna ports for DRS", "nfapi.tx.antenna.ports.for.drs", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The number of cell specific transmit antenna ports within the DRS occasions", HFILL } -+ }, -+ { &hf_nfapi_transmission_power_for_drs, -+ { "Transmission power for DRS", "nfapi.transmission.power.for.drs.", -+ FT_UINT16, BASE_CUSTOM, CF_FUNC(power_offset_conversion_fn), 0x0, -+ "Offset of cell specific Reference signals power within DRS occasions to the reference signal power", HFILL } -+ }, -+ { &hf_nfapi_pbch_repetitions_enabled_r13, -+ { "PBCH Repetitions enable R13", "nfapi.pbch.repetitions.enabled_r13", -+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, -+ "Enable / Disable PBCH repetitions", HFILL } -+ }, -+ { &hf_nfapi_prach_cat_m_root_sequence_index, -+ { "PRACH CAT-M Root sequence index", "nfapi.prach.cat_m.root.squence.index", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "PRACH Root sequence index", HFILL } -+ }, -+ { &hf_nfapi_prach_cat_m_zero_correlation_zone_configuration, -+ { "PRACH CAT-M Zero correlation zone configuration", "nfapi.prach.cat_m.zero.correlation.zone.configuration", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Equivalent to Ncs", HFILL } -+ }, -+ { &hf_nfapi_prach_cat_m_high_speed_flag, -+ { "PRACH CAT-M High speed flag", "nfapi.prach.cat_m.high.speed.flag", -+ FT_BOOLEAN, 8, TFS(&high_speed_flag_strname), 0x0, -+ "Indicates if unrestricted, or restricted, set of preambles is used", HFILL } -+ }, -+ { &hf_nfapi_prach_ce_level_0_enable, -+ { "PRACH CE level #0 Enable", "nfapi.prach.ce.level.0.enable", -+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, -+ "Enable \\ Disable CE level #0.", HFILL } -+ }, -+ { &hf_nfapi_prach_ce_level_0_configuration_index, -+ { "PRACH CE level #0 Configuration index", "nfapi.prach.ce.level.0.configuration.index", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Provides information about the location and format of the PRACH", HFILL } -+ }, -+ { &hf_nfapi_prach_ce_level_0_frequency_offset, -+ { "PRACH CE level #0 Frequency offset", "nfapi.prach.ce.level.0.frequency_offset", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The first physical resource block available for PRACH for each CE", HFILL } -+ }, -+ { &hf_nfapi_prach_ce_level_0_number_of_repetitions_per_attempt, -+ { "PRACH CE level #0 Number of repetitions per attempt", "nfapi.prach.ce.level.0.number.of.repetitions.per_attempt", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Number of PRACH repetitions per attempt for each CE level", HFILL } -+ }, -+ { &hf_nfapi_prach_ce_level_0_starting_subframe_periodicity, -+ { "CE level #0 Starting subframe periodicity", "nfapi.prach.ce.level.0.starting.subframe_periodicity", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Optional. PRACH starting subframe periodicity, expressed in number of slots available for preamble transmission(PRACH opportunities)", HFILL } -+ }, -+ { &hf_nfapi_prach_ce_level_0_hopping_enabled, -+ { "PRACH CE level #0 Hopping Enable", "nfapi.prach.ce.level.0.hopping_enable", -+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, -+ "Enable \\ Disable PRACH frequency hopping for each CE level", HFILL } -+ }, -+ { &hf_nfapi_prach_ce_level_0_hopping_offset, -+ { "PRACH CE level #0 Hopping Offset", "nfapi.prach.ce.level.0.hopping.offset", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Valid in case 'PRACH Hopping Enable' is enabled", HFILL } -+ }, -+ { &hf_nfapi_prach_ce_level_1_enable, -+ { "PRACH CE level #1 Enable", "nfapi.prach.ce.level.0.enable", -+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, -+ "Enable \\ Disable CE level #1", HFILL } -+ }, -+ { &hf_nfapi_prach_ce_level_1_configuration_index, -+ { "PRACH CE level #1 Configuration index", "nfapi.prach.ce.level.1.configuration.index", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Provides information about the location and format of the PRACH", HFILL } -+ }, -+ { &hf_nfapi_prach_ce_level_1_frequency_offset, -+ { "PRACH CE level #1 Frequency offset", "nfapi.prach.ce.level.1.frequency_offset", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The first physical resource block available for PRACH for each CE", HFILL } -+ }, -+ { &hf_nfapi_prach_ce_level_1_number_of_repetitions_per_attempt, -+ { "PRACH CE level #1 Number of repetitions per attempt", "nfapi.prach.ce.level.1.number.of.repetitions.per_attempt", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Number of PRACH repetitions per attempt for each CE level", HFILL } -+ }, -+ { &hf_nfapi_prach_ce_level_1_starting_subframe_periodicity, -+ { "CE level #1 Starting subframe periodicity", "nfapi.prach.ce.level.1.starting.subframe_periodicity", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Optional.PRACH starting subframe periodicity, expressed in number of slots available for preamble transmission(PRACH opportunities),", HFILL } -+ }, -+ { &hf_nfapi_prach_ce_level_1_hopping_enabled, -+ { "PRACH CE level #1 Hopping Enable", "nfapi.prach.ce.level.1.hopping_enable", -+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, -+ "Enable \\ Disable PRACH frequency hopping for each CE level.", HFILL } -+ }, -+ { &hf_nfapi_prach_ce_level_1_hopping_offset, -+ { "PRACH CE level #1 Hopping Offset", "nfapi.prach.ce.level.1.hopping.offset", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Valid in case 'PRACH Hopping Enable' is enabled.", HFILL } -+ }, -+ { &hf_nfapi_prach_ce_level_2_enable, -+ { "PRACH CE level #2 Enable", "nfapi.prach.ce.level.2.enable", -+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, -+ "Enable \\ Disable CE level #2", HFILL } -+ }, -+ { &hf_nfapi_prach_ce_level_2_configuration_index, -+ { "PRACH CE level #2 Configuration index", "nfapi.prach.ce.level.2.configuration.index", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Provides information about the location and format of the PRACH", HFILL } -+ }, -+ { &hf_nfapi_prach_ce_level_2_frequency_offset, -+ { "PRACH CE level #2 Frequency offset", "nfapi.prach.ce.level.2.frequency_offset", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The first physical resource block available for PRACH for each CE", HFILL } -+ }, -+ { &hf_nfapi_prach_ce_level_2_number_of_repetitions_per_attempt, -+ { "PRACH CE level #2 Number of repetitions per attempt", "nfapi.prach.ce.level.2.number.of.repetitions.per_attempt", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Number of PRACH repetitions per attempt for each CE level", HFILL } -+ }, -+ { &hf_nfapi_prach_ce_level_2_starting_subframe_periodicity, -+ { "CE level #2 Starting subframe periodicity", "nfapi.prach.ce.level.2.starting.subframe_periodicity", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Optional. PRACH starting subframe periodicity, expressed in number of slots available for preamble transmission(PRACH opportunities)", HFILL } -+ }, -+ { &hf_nfapi_prach_ce_level_2_hopping_enabled, -+ { "PRACH CE level #2 Hopping Enable", "nfapi.prach.ce.level.2.hopping_enable", -+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, -+ "Enable \\ Disable PRACH frequency hopping for each CE level", HFILL } -+ }, -+ { &hf_nfapi_prach_ce_level_2_hopping_offset, -+ { "PRACH CE level #2 Hopping Offset", "nfapi.prach.ce.level.2.hopping.offset", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Valid in case 'PRACH Hopping Enable' is enabled.", HFILL } -+ }, -+ { &hf_nfapi_prach_ce_level_3_enable, -+ { "PRACH CE level #3 Enable", "nfapi.prach.ce.level.3.enable", -+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, -+ "Enable \\ Disable CE level #3.", HFILL } -+ }, -+ { &hf_nfapi_prach_ce_level_3_configuration_index, -+ { "PRACH CE level #3 Configuration index", "nfapi.prach.ce.level.3.configuration.index", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Provides information about the location and format of the PRACH.", HFILL } -+ }, -+ { &hf_nfapi_prach_ce_level_3_frequency_offset, -+ { "PRACH CE level #3 Frequency offset", "nfapi.prach.ce.level.3.frequency_offset", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The first physical resource block available for PRACH for each CE", HFILL } -+ }, -+ { &hf_nfapi_prach_ce_level_3_number_of_repetitions_per_attempt, -+ { "PRACH CE level #3 Number of repetitions per attempt", "nfapi.prach.ce.level.3.number.of.repetitions.per_attempt", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Number of PRACH repetitions per attempt for each CE level", HFILL } -+ }, -+ { &hf_nfapi_prach_ce_level_3_starting_subframe_periodicity, -+ { "CE level #3 Starting subframe periodicity", "nfapi.prach.ce.level.3.starting.subframe_periodicity", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Optional. PRACH starting subframe periodicity, expressed in number of slots available for preamble transmission(PRACH opportunities)", HFILL } -+ }, -+ { &hf_nfapi_prach_ce_level_3_hopping_enabled, -+ { "PRACH CE level #3 Hopping Enable", "nfapi.prach.ce.level.3.hopping_enable", -+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, -+ "Enable \\ Disable PRACH frequency hopping for each CE level.", HFILL } -+ }, -+ { &hf_nfapi_prach_ce_level_3_hopping_offset, -+ { "PRACH CE level #3 Hopping Offset", "nfapi.prach.ce.level.3.hopping.offset", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Valid in case 'PRACH Hopping Enable' is enabled.", HFILL } -+ }, -+ { &hf_nfapi_pucch_internal_ul_hopping_config_common_mode_a, -+ { "PUCCH Interval-ULHoppingConfigCommonModeA", "nfapi.pucch.interval.ulhopping.config.common.mode.a", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "NthULNB for UEModeA", HFILL } -+ }, -+ { &hf_nfapi_pucch_internal_ul_hopping_config_common_mode_b, -+ { "PUCCH Interval-ULHoppingConfigCommonModeB", "nfapi.pucch.interval.ulhopping.config.common.mode.b", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "NthULNB for UEModeB", HFILL } -+ }, -+ { &hf_nfapi_data_report_mode, -+ { "Data Report Mode", "nfapi.data.report.mode", -+ FT_BOOLEAN, 8, TFS(&data_report_mode_vals), 0x0, -+ "The data report mode for the uplink data", HFILL } -+ }, -+ { &hf_nfapi_sfnsf, -+ { "SFN/SF", "nfapi.sfn.sf", -+ FT_UINT16, BASE_CUSTOM, CF_FUNC(sfn_sf_conversion_fn), 0x0, -+ "The future SFN/SF subframe where the TLVs included in the message should be applied", HFILL } -+ }, -+ { &hf_nfapi_max_up_pts, -+ { "Max UpPTS frames", "nfapi.max.uppts.frame", -+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, -+ "Used for TDD only and indicates how SRS operates in UpPTS subframes", HFILL } -+ }, -+ { &hf_nfapi_srs_acknack_srs_simultaneous_transmission, -+ { "SRS AckNack Simultaneous transmission", "nfapi.srs.acknack.simult.tx", -+ FT_BOOLEAN, 8, TFS(&srs_simult_tx_strname), 0x0, -+ "Indicates if SRS and ACK/NACK can be received in the same subframe. Needed if semi-static configuration is held in PHY.", HFILL } -+ }, -+ { &hf_nfapi_pnf_address_ipv4, -+ { "PNF IPV4", "nfapi.pnf.address.ipv4", -+ FT_IPv4, BASE_NONE, NULL, 0x0, -+ "The IPv4 address of the PNF PHY instance to be used by the VNF for this PNF PHY instance", HFILL } -+ }, -+ { &hf_nfapi_pnf_address_ipv6, -+ { "PNF IPV6", "nfapi.pnf.address.ipv6", -+ FT_IPv6, BASE_NONE, NULL, 0x0, -+ "The IPv6 address of the PNF PHY instance to be used by the VNF for this PNF PHY instance", HFILL } -+ }, -+ { &hf_nfapi_vnf_address_ipv4, -+ { "VNF IPV4 Address", "nfapi.vnf.address.ipv4", -+ FT_IPv4, BASE_NONE, NULL, 0x0, -+ "The IPv4 address of the VNF to be used by the PNF for this P7 PHY instance", HFILL } -+ }, -+ { &hf_nfapi_vnf_address_ipv6, -+ { "VNF IPV6 Address", "nfapi.vnf.address.ipv6", -+ FT_IPv6, BASE_NONE, NULL, 0x0, -+ "The IPv6 address of the VNF to be used by the PNF for this P7 PHY instance", HFILL } -+ }, -+ { &hf_nfapi_pnf_port, -+ { "PNF PORT value", "nfapi.config.pnf.port.value", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The port of the PNF PHY instance to be used by the VNF for this PNF PHY instance", HFILL } -+ }, -+ { &hf_nfapi_vnf_port, -+ { "VNF PORT value", "nfapi.config.vnf.port.value", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The port of the VNF to be used by the PNF for this P7 PHY instance", HFILL } }, -+ { &hf_nfapi_sync_mode, -+ { "Sync Mode", "nfapi.sync.mode", -+ FT_UINT8, BASE_DEC, VALS(nfapi_sync_mode_vals), 0x0, -+ "The method of nFAPI Synchronization supported by the PNF", HFILL } -+ }, -+ { &hf_nfapi_location_mode, -+ { "Location Mode", "nfapi.location.mode", -+ FT_UINT8, BASE_DEC, VALS(location_mode_vals), 0x0, -+ "The method of location derivation supported by the PNF", HFILL } -+ }, -+ { &hf_nfapi_location_coordinates_length, -+ { "Location Coordinates Length", "nfapi.location.coordinates.length", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Length in bytes of the Location Coordinates Array field", HFILL } -+ }, -+ { &hf_nfapi_location_coordinates, -+ { "Location Coordinates", "nfapi.location.coordinates", -+ FT_BYTES, BASE_NONE, NULL, 0x0, -+ "The Location of the PNF. The value is formatted as the LocationCoordinates IE using BASIC-PER encoding as defined in " -+ "TS36.355 section 6.4.2. The first bit of the LocationCoordinates IE is in the LSB of the first byte of the array." -+ "The MSBs of the last element of the array may be padded with zeros if the ASN.1 element is not an integer number of bytes", HFILL } -+ }, -+ { &hf_nfapi_pdu, -+ { "PDU", "nfapi.pdu", -+ FT_BYTES, BASE_NONE, NULL, 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_dl_config_timing, -+ { "DL config Timing", "nfapi.dl.config.timing", -+ FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, -+ "The timing offset before the air interface subframe start that the DL_Config.request must be received at the PNF.", HFILL } -+ }, -+ { &hf_nfapi_tx_timing, -+ { "Tx Timing", "nfapi.general.tx.timing", -+ FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, -+ "The timing offset before the air interface subframe start that the TX.request must be received at the PNF.", HFILL } -+ }, -+ { &hf_nfapi_ul_config_timing, -+ { "UL Config Timing", "nfapi.ul.config.timing", -+ FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, -+ "The timing offset before the air interface subframe start that the UL_CONFIG.request must be received at the PNF.", HFILL } -+ }, -+ { &hf_nfapi_hi_dci0_timing, -+ { "HI DCi0 Timing", "nfapi.hi.dci0.timing", -+ FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, -+ "The timing offset before the air interface subframe start that the HI_DCI0.request must be received at the PNF.", HFILL } -+ }, -+ { &hf_nfapi_maximum_number_phys, -+ { "Maximum number of Phys", "nfapi.maximum.number.phys", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The maximum number of operational PHYs supported by the PNF device.", HFILL } -+ }, -+ { &hf_nfapi_maximum_total_bandwidth, -+ { "Maximum Total Bandwidth", "nfapi.maximum.total.bandwidth", -+ FT_UINT16, BASE_DEC | BASE_UNIT_STRING, &khz_100_units_db, 0x0, -+ "The total maximum bandwidth (in units of 100kHz) supported by the PNF device.", HFILL } -+ }, -+ { &hf_nfapi_maximum_total_number_dl_layers, -+ { "Maximum Total Number DL Layers", "nfapi.maximum.total.number.dl.layers", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The maximum total number of downlink layers supported.", HFILL } -+ }, -+ { &hf_nfapi_maximum_total_number_ul_layers, -+ { "Maximum Total Number UL Layers", "nfapi.maximum.total.number.ul.layers", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The maximum total number of uplink layers supported across all available PHYs.", HFILL } -+ }, -+ { &hf_nfapi_shared_bands, -+ { "Shared bands", "nfapi.shared.bands", -+ FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x0, -+ "Indication that the PNF device shares the list of RF band options available across all available PHYs, so each may only be used with a single PHY.", HFILL } -+ }, -+ { &hf_nfapi_shared_pa, -+ { "Shared pa", "nfapi.shared.pa", -+ FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x0, -+ "Indication that the PNF device shares a single RF PA across all available PHYs, so that the maximum Total Power is shared across all available PHYs.", HFILL } -+ }, -+ { &hf_nfapi_maximum_total_power, -+ { "Maximum total power", "nfapi.maximum.total.power", -+ FT_UINT16, BASE_CUSTOM, CF_FUNC(dl_rs_tx_pow_measment_conversion_fn), 0x0, -+ "The maximum transmit power of the PNF device summed across all PHYs.", HFILL } -+ }, -+ { &hf_nfapi_oui, -+ { "OUI", "nfapi.oui", -+ FT_STRING, BASE_NONE, NULL, 0x0, -+ "The PNF OUI in the format as specified by IEEE", HFILL } -+ }, -+ { &hf_nfapi_pnf_phy_number_phy, -+ { "PNF Phy Number of Phy", "nfapi.pnf.phy.number.phy", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The number of PHY instances", HFILL } -+ }, -+ { &hf_nfapi_pnf_phy_config_index, -+ { "PNF Phy Config Index", "nfapi.pnf.phy.config.index", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The unique index number of the PHY to permit the PNF to identify the PHY in the PNF_CONFIG.Request", HFILL } -+ }, -+ { &hf_nfapi_number_of_rfs, -+ { "Number of RFs", "nfapi.pnf.rf.number.rf", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The number of RF configurations", HFILL } -+ }, -+ { &hf_nfapi_phy_rf_config_info_phy_id, -+ { "Phy ID", "nfapi.pnf.phy.rf.config.phy.id", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_rf_config_index, -+ { "RF Config Index", "nfapi.rf_config_index", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The index number defined in the PNF RF struct that the PHY can support", -+ HFILL } -+ }, -+ { &hf_nfapi_number_of_rf_exclusions, -+ { "Number of RF exclusions", "nfapi.hf_nfapi_number_of_rf_exclusions", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The number of RF configurations excluded from use by this PHY", HFILL } -+ }, -+ { &hf_nfapi_maximum_3gpp_release_supported, -+ { "Maximum 3gpp Release Supported", "nfapi.maximum_3gpp_release_supported", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The major 3GPP releases supported", HFILL } -+ }, -+ { &hf_nfapi_maximum_3gpp_release_supported_rel8, -+ { "Release 8", "nfapi.maximum_3gpp_release_supported.rel8", -+ FT_BOOLEAN, 1, NULL, 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_maximum_3gpp_release_supported_rel9, -+ { "Release 9", "nfapi.maximum_3gpp_release_supported.rel9", -+ FT_BOOLEAN, 1, NULL, 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_maximum_3gpp_release_supported_rel10, -+ { "Release 10", "nfapi.maximum_3gpp_release_supported.rel10", -+ FT_BOOLEAN, 1, NULL, 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_maximum_3gpp_release_supported_rel11, -+ { "Release 11", "nfapi.maximum_3gpp_release_supported.rel11", -+ FT_BOOLEAN, 1, NULL, 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_maximum_3gpp_release_supported_rel12, -+ { "Release 12", "nfapi.maximum_3gpp_release_supported.rel12", -+ FT_BOOLEAN, 1, NULL, 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_maximum_3gpp_release_supported_rel13, -+ { "Release 13", "nfapi.maximum_3gpp_release_supported.rel13", -+ FT_BOOLEAN, 1, NULL, 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_downlink_channel_bandwidth_supported, -+ { "Maximum Channel Downlink Bandwidth Supported", "nfapi.downlink_channel_bandwidth_supported", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The downlink channel bandwidth supported in resource blocks as specified in 3GPP TS 36.104", HFILL } -+ }, -+ { &hf_nfapi_uplink_channel_bandwidth_supported, -+ { "Maximum Channel Uplink Bandwidth Supported", "nfapi.uplink_channel_bandwidth_supported", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The uplink channel bandwidth supported in resource blocks as specified in 3GPP TS 36.104.", HFILL } -+ }, -+ { &hf_nfapi_number_of_dl_layers_supported, -+ { "Number of DL Layers Supported", "nfapi.number_of_dl_layer_supported", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The maximum number of downlink layers supported", HFILL } -+ }, -+ { &hf_nfapi_number_of_ul_layers_supported, -+ { "Number of UL Layers Supported", "nfapi.number_of_ul_layer_supported", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The maximum number of uplink layers supported", HFILL } -+ }, -+ { &hf_nfapi_nmm_modes_supported, -+ { "NMM modes supported", "nfapi.nmm_modes_supported", -+ FT_UINT8, BASE_DEC, VALS(nmm_modes_supported_vals), 0x0, -+ "Network Monitor Modes Supported.", HFILL } -+ }, -+ { &hf_nfapi_band, -+ { "Band", "nfapi.band", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Band number as specified in 3GPP TS36.101", HFILL } -+ }, -+ { &hf_nfapi_maximum_transmit_power_2, -+ { "Maximum transmit power", "nfapi.maximum_transmit_power", -+ FT_UINT16, BASE_CUSTOM, CF_FUNC(max_transmit_power_2_conversion_fn), 0x0, -+ "The maximum transmit power for the PHY and RF operating at the configured bandwidth as defined in 3GPP TS 36.104.", HFILL } -+ }, -+ { &hf_nfapi_maximum_transmit_power, -+ { "Maximum transmit power", "nfapi.maximum_transmit_power", -+ FT_UINT16, BASE_CUSTOM, CF_FUNC(max_transmit_power_conversion_fn), 0x0, -+ "The maximum transmit power for the RF chain operating at the maximum supported bandwidth as defined in 3GPP TS 36.104.", HFILL } -+ }, -+ { &hf_nfapi_earfcn, -+ { "EARFCN", "nfapi.earfcn", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The EARFCN to be measured.", HFILL } -+ }, -+ { &hf_nfapi_number_of_rf_bands, -+ { "Number of RF Bands", "nfapi.num.rf_bands", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The number of RF Band instances", HFILL } -+ }, -+ { &hf_nfapi_nmm_uplink_rssi_supported, -+ { "NMM Uplink RSSI supported", "nfapi.nmm.uplink.rssi.supported", -+ FT_UINT8, BASE_DEC, VALS(ul_rssi_supported_vals), 0x0, -+ "Indicates if the uplink RSSI meausremnts are supported by NMM.", HFILL } -+ }, -+ { &hf_nfapi_minimum_transmit_power, -+ { "Minimum transmit power", "nfapi.minimum_transmit_power", -+ FT_UINT16, BASE_CUSTOM, CF_FUNC(max_transmit_power_conversion_fn), 0x0, -+ "The minimum transmit power for the RF chain operating at the maximum supported bandwidth as defined in 3GPP TS 36.104.", HFILL } -+ }, -+ { &hf_nfapi_number_of_antennas_suppported, -+ { "Number of Supported Antennas", "nfapi.number_of_antennas_suppported", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The maximum number of antennas supported.", HFILL } -+ }, -+ { &hf_nfapi_minimum_downlink_frequency, -+ { "Minimum downlink frequency", "nfapi.minimum_downlink_frequency", -+ FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &khz_100_units_db, 0x0, -+ "The minimum supported downlink frequency in 100kHz units", HFILL } -+ }, -+ { &hf_nfapi_maximum_downlink_frequency, -+ { "Maximum downlink frequency", "nfapi.maximum_downlink_frequency", -+ FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &khz_100_units_db, 0x0, -+ "The maximum supported downlink frequency in 100kHz units", HFILL } -+ }, -+ { &hf_nfapi_minimum_uplink_frequency, -+ { "Minimum uplink frequency", "nfapi.minimum_downlink_frequency", -+ FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &khz_100_units_db, 0x0, -+ "The minimum supported uplink frequency in 100kHz units", HFILL } -+ }, -+ { &hf_nfapi_maximum_uplink_frequency, -+ { "Maximum uplink frequency", "nfapi.maximum_downlink_frequency", -+ FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &khz_100_units_db, 0x0, -+ "The maximum supported uplink frequency in 100kHz units", HFILL } -+ }, -+ { &hf_nfapi_transmission_mode7_supported, -+ { "Transmission Mode 7 Supported", "nfapi.pnf.phy_rel10.tx_mode7_supported", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates if PHY supports TM7 for PDSCH", HFILL } -+ }, -+ { &hi_nfapi_transmission_mode8_supported, -+ { "Transmission Mode 8 Supported", "nfapi.pnf.phy_rel10.tx_mode8_supported", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates if PHY supports TM8 for PDSCH", HFILL } -+ }, -+ { &hi_nfapi_two_antennas_ports_for_pucch, -+ { "Two antennas ports for PUCCH", "nfapi.pnf.phy_rel10.two_antennas_ports_for_pucch", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates if PHY supports PUCCH transmit diversity introduced in Release 10. Equivalent to two-AntennaPortsForPUCCH-r10 in TS36.306", HFILL } -+ }, -+ { &hi_nfapi_transmission_mode_9_supported, -+ { "Transmission Mode 9 Supported", "nfapi.pnf.phy_rel10.tx_mode9_supported", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates if PHY supports TM9 for PDSCH with 8 antennas and 8 CSI. Equivalent to tm9-With-8Tx-FDD-r10 in TS36.306", HFILL } -+ }, -+ { &hi_nfapi_simultaneous_pucch_pusch, -+ { "Simultaneous PUCCH PUSCH", "nfapi.pnf.simultaneous_pucch_pusch", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates if PHY supports UE sending simultaneous PUCCH and PUSCH introduced in Release 10. Equivalent to simultaneousPUCCH-PUSCH-r10 in TS36.306", HFILL } -+ }, -+ { &hi_nfapi_four_layer_tx_with_tm3_and_tm4, -+ { "Four layer Tx with TM3 and TM4", "nfapi.pnf.phy_rel10.layer_tx_with_tm3_and_tm4", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates if PHY supports four layer transmission for TM3 and TM4. Equivalent to fourLayerTM3-TM4-r10 in TS36.306", HFILL } -+ }, -+ { &hf_nfapi_epdcch_supported, -+ { "ePDCCH supported", "nfapi.pnf.phy_rel11.epdcch_supported", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates if PHY supports Enhanced PDCCH", HFILL } -+ }, -+ { &hi_nfapi_multi_ack_csi_reporting, -+ { "Multi ACK CSI reporting", "nfapi.pnf.phy_rel11.mutli_ack_csi_reporting", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates if PHY supports the multi ACK and CSI reporting required with CA and mixed FDD/TDD carriers. Equivalent to multiACK-CSI-Reporting-r11 in TS36.306", HFILL } -+ }, -+ { &hi_nfapi_pucch_tx_diversity_with_channel_selection, -+ { "PUCCH Tx diversity with channel selection", "nfapi.pnf.phy_rel11.tx_div_with_channel_selection", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates if PHY supports transmit diversity for PUCCH format 1b with channel selection. Equivalent to txDiv-PUCCH1b-ChSelect in TS36.306", HFILL } -+ }, -+ { &hi_nfapi_ul_comp_supported, -+ { "UL CoMP supported", "nfapi.pnf.phy_rel11.ul_comp_supported", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates if PHY supports UL CoMP", HFILL } -+ }, -+ { &hi_nfapi_transmission_mode_5_supported, -+ { "Transmission mode 5 supported", "nfapi.pnf.phy_rel11.tx_mode5_supported", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates if PHY supports TM5 for PDSCH", HFILL } -+ }, -+ { &hf_nfapi_csi_subframe_set, -+ { "CSI subframe set", "nfapi.pnf.phy_rel12.csi_subframe_set", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Equivalent to csi-SubframeSet-r12 in TS36.306", HFILL } -+ }, -+ { &hi_nfapi_enhanced_4tx_codebook, -+ { "Enhanced 4TX codebook", "nfapi.pnf.phy_rel12.exhanced_t4x_codebook", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates if PHY supports the enhanced 4TX codebook. Equivalent to enhanced-4TxCodebook-r12 in TS36.306", HFILL } -+ }, -+ { &hi_nfapi_drs_supported, -+ { "DRS supported", "nfapi.pnf.phy_rel12.drs_supported", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates if PHY supports the Discovery Reference Signal", HFILL } -+ }, -+ { &hi_nfapi_ul_64qam_supported, -+ { "UL 64QAM supported", "nfapi.pnf.phy_rel12.ul_64qam_supported", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates if PHY support 64 QAM in the uplink", HFILL } -+ }, -+ { &hi_nfapi_transmission_mode_10_supported, -+ { "Transmission mode 10 supported", "nfapi.pnf.phy_rel12.tx_mode10_supported", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates if PHY supports TM10 for PDSCH (DL CoMP)", HFILL } -+ }, -+ { &hi_nfapi_alternative_tbs_indices, -+ { "Alternative TBS indices", "nfapi.pnf.phy_rel12.alternative_tbs_indices", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates if PHY supports the alternate TBS indices (256 QAM). Equivalent to alternativeTBS-Indices-r12 in TS36.306", HFILL } -+ }, -+ { &hf_nfapi_pucch_format_4_supported, -+ { "PUCCH format 4 supported", "nfapi.pnf.phy_rel13.pucch_format4_supported", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates if PHY supports PUCCH format 4", HFILL } -+ }, -+ { &hf_nfapi_pucch_format_5_supported, -+ { "PUCCH format 5 supported", "nfapi.pnf.phy_rel13.pucch_format5_supported", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates if PHY supports PUCCH format 5", HFILL } -+ }, -+ { &hf_nfapi_more_than_5_ca_supported, -+ { "More than 5 CA support", "nfapi.pnf.phy_rel13.mode_than_5_ca_supported", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates if PHY supports features required for more than 5 CA support on PUSCH. Equivalent to uci-PUSCH-Ext-r13 in TS36.306", HFILL } -+ }, -+ { &hf_nfapi_laa_supported, -+ { "LAA supported", "nfapi.pnf.phy_rel13.laa_supported", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates if PHY supports DL LAA (subframe format 3)", HFILL } -+ }, -+ { &hf_nfapi_laa_ending_in_dwpts_supported, -+ { "LAA ending in DwPTS supported", "nfapi.pnf.phy_rel13.laa_ending_in_dwpts_supported", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates if PHY supports DL LAA ending in a DwPTS subframe. Equivalent to endingDwPTS-r13i n TS36.306", HFILL } -+ }, -+ { &hf_nfapi_laa_starting_in_second_slot_supported, -+ { "LAA starting in second slot Supported", "nfapi.pnf.phy_rel13.laa_starting_in_second_slot_supported", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates if PHY supports DL LAA starting in the second slot in a subframe. Equivalent to secondSlotStartingPosition-r13 in TS36.306", HFILL } -+ }, -+ { &hf_nfapi_beamforming_supported, -+ { "Beamforming Supported", "nfapi.pnf.phy_rel13.beamingforming_supported", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates if PHY supports beamforming (FD-MIMO Class B). Equivalent to beamformed-r13 in TS36.306", HFILL } -+ }, -+ { &hf_nfapi_csi_rs_enhancements_supported, -+ { "CSI-RS enhancements supported", "nfapi.pnf.phy_rel13.csi_rs_enchancements_supported", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates if PHY supports CSI-RS enhancements (FD-MIMO Class A). Equivalent to csi-RS-EnhancementsTDD-r13 in TS36.306", HFILL } -+ }, -+ { &hf_nfapi_drms_enhancements_supported, -+ { "DMRS enhancements supported", "nfapi.pnf.phy_rel13.drms_enhancements_supported", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates if PHY supports DMRS enhancements added in Release 13. Equivalent to dmrs-Enhancements-r13 in TS36.306", HFILL } -+ }, -+ { &hf_nfapi_srs_enhancements_supported, -+ { "SRS enhancements supported", "nfapi.pnf.phy_rel13.srs_enhancements_supported", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates if PHY supports SRS enhancements added in Release 13. Equivalent to srs-Enhancements-r13in TS36.306", HFILL } -+ }, -+ { &hf_nfapi_sfn_sf, -+ { "SFN_SF", "nfapi.sfn_sf", -+ FT_UINT16, BASE_CUSTOM, CF_FUNC(sfn_sf_conversion_fn), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_number_pdcch_ofdm_symbols, -+ { "Number of PDCCH OFDM Symbols", "nfapi.number_pdcch_ofdm_symbols", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The number of OFDM symbols for the PDCCH", HFILL } -+ }, -+ { &hf_nfapi_number_dci, -+ { "Number of DCI", "nfapi.number_dci", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The number of DCI PDUs included in this message", HFILL } -+ }, -+ { &hf_nfapi_number_pdus, -+ { "Number of PDUs", "nfapi.number_pdu", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Number of PDUs that are included in this message", HFILL } -+ }, -+ { &hf_nfapi_number_of_harqs, -+ { "Number of HARQs", "nfapi.number_harqs", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Number of HARQs included in this message", HFILL } -+ }, -+ { &hf_nfapi_number_of_crcs, -+ { "Number of CRCs", "nfapi.number_crcs", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Number of CRCs included in this message", HFILL } -+ }, -+ { &hf_nfapi_number_of_srs, -+ { "Number of SRs", "nfapi.number_srs", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Number of SRs included in this message", HFILL } -+ }, -+ { &hf_nfapi_number_of_cqi, -+ { "Number of CQIs", "nfapi.number_cqi", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Number of CQIs included in this message", HFILL } -+ }, -+ { &hf_nfapi_number_of_preambles, -+ { "Number of Preambles", "nfapi.number_preambles", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Number of RACH preambles", HFILL } -+ }, -+ { &hf_nfapi_number_of_srss, -+ { "Number of SRSs", "nfapi.number_srss", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Number of UEs contributing to the uplink SRS", HFILL } -+ }, -+ { &hf_nfapi_lbt_dl_req_pdu_type, -+ { "LBT DL Request PDU Type", "nfapi.number_srss", -+ FT_UINT16, BASE_DEC, VALS(nfapi_lbt_dl_req_pdu_type), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_lbt_dl_ind_pdu_type, -+ { "LBT DL Indication PDU Type", "nfapi.number_srss", -+ FT_UINT16, BASE_DEC, VALS(nfapi_lbt_dl_ind_pdu_type), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_number_pdsch_rnti, -+ { "Number of PDSCH RNTI", "nfapi.number_pdsch_rnti", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Number of unique RNTIs sent on the PDSCH", HFILL } -+ }, -+ { &hf_nfapi_transmission_power_pcfich, -+ { "Transmission Power PCFICH", "nfapi.transmission_power_pcfich", -+ FT_UINT16, BASE_CUSTOM, CF_FUNC(power_offset_conversion_fn), 0x0, -+ "Offset to the reference signal power.", HFILL } -+ }, -+ { &hf_nfapi_dl_config_pdu_type, -+ { "PDU Type", "nfapi.pdu.type", -+ FT_UINT8, BASE_DEC, VALS(nfapi_dl_config_pdu_type_vals), 0x0, -+ "DL_CONFIG.request PDU Type", HFILL } -+ }, -+ { &hf_nfapi_pdu_size, -+ { "PDU size", "nfapi.pdu.size", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Size of the PDU control information (in bytes). This length value includes the 2 bytes required for the PDU type and PDU size parameters", HFILL } -+ }, -+ { &hf_nfapi_instance_length, -+ { "Instance length", "nfapi.instance.length", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The Length in bytes of all TLVs within this instance", HFILL } -+ }, -+ { &hf_nfapi_length, -+ { "PDU length", "nfapi.pdu.length", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Length of PDU in bytes.", HFILL } -+ }, -+ { &hf_nfapi_pdu_index, -+ { "PDU Index", "nfapi.pdu.index", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The PDU index parameter specified for each PDU", HFILL } -+ }, -+ { &hf_nfapi_rnti, -+ { "RNTI", "nfapi.rnti", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The RNTI used for identifying the UE when receiving the PDU", HFILL } -+ }, -+ { &hf_nfapi_resource_allocation_type, -+ { "Resource Allocation Type", "nfapi.resource.allocation.type", -+ FT_UINT8, BASE_DEC, VALS(resource_allocation_type_vals), 0x0, -+ "Resource allocation type/header Valid for DCI formats : 1, 2, 2A, 2B, 2C, 2D", HFILL } -+ }, -+ { &hf_nfapi_virtual_resource_block_assignment_flag, -+ { "Virtual resource block assignment flag", "nfapi.resource.block.assignment.flag", -+ FT_UINT8, BASE_DEC, VALS(local_distributed_vals), 0x0, -+ "Type of virtual resource block used Valid for DCI formats : 1A, 1B, 1D", HFILL } -+ }, -+ { &hf_nfapi_resource_block_coding, -+ { "Resource block coding", "nfapi.resource.block.coding", -+ FT_UINT32, BASE_DEC, NULL, 0x0, -+ "The encoding for the resource blocks. The coding is dependent on whether resource allocation type 0, 1, 2 is in use", HFILL } -+ }, -+ { &hf_nfapi_modulation, -+ { "Modulation", "nfapi.modulation", -+ FT_UINT8, BASE_DEC, VALS(modulation_vals), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_redundancy_version, -+ { "Redundancy version", "nfapi.redundancy.version", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "HARQ redundancy version", HFILL } -+ }, -+ { &hf_nfapi_transport_blocks, -+ { "Transport blocks", "nfapi.transport.blocks", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The transport block transmitted to this RNTI", HFILL } -+ }, -+ { &hf_nfapi_transport_block_to_codeword_swap_flag, -+ { "Transport block to codeword swap flag", "nfapi.transport.block.to.codeword.swap.flag", -+ FT_UINT8, BASE_DEC, VALS(transport_block_to_codeword_swap_flag_vals), 0x0, -+ "Indicates the mapping of transport block to codewords.", HFILL } -+ }, -+ { &hf_nfapi_transmission_scheme, -+ { "Transmission scheme", "nfapi.transmission.scheme", -+ FT_UINT8, BASE_DEC, VALS(transmission_scheme_vals), 0x0, -+ "The MIMO mode used in the PDU", HFILL } -+ }, -+ { &hf_nfapi_ul_transmission_scheme, -+ { "Transmission scheme", "nfapi.transmission.scheme", -+ FT_UINT8, BASE_DEC, VALS(ul_transmission_scheme_vals), 0x0, -+ "The MIMO mode used in the PDU", HFILL } -+ }, -+ { &hf_nfapi_number_of_layers, -+ { "Number of layers", "nfapi.number.of.layers", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The number of layers used in transmission", HFILL } -+ }, -+ { &hf_nfapi_number_of_subbands, -+ { "Number of subbands", "nfapi.number.of.subbands", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Only valid when transmission scheme = 3, 4, 5. Defines the number of subbands and " -+ "codebooks used for PMI.If value = 1 then a single PMI value is supplied which should be used over all RB", HFILL } -+ }, -+ { &hf_nfapi_codebook_index, -+ { "Codebook index", "nfapi.number.of.codebook.index", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Only valid when transmission scheme = 3, 4, 5. Defines the codebook used.", HFILL } -+ }, -+ { &hf_nfapi_ue_category_capacity, -+ { "UE category capacity", "nfapi.ue.category.capacity", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The UE capabilities category", HFILL } -+ }, -+ { &hf_nfapi_pa, -+ { "P-A", "nfapi.pa", -+ FT_UINT8, BASE_DEC, VALS(pa_vals), 0x0, -+ "The ratio of PDSCH EPRE to cell-specific RS EPRE among PDSCH REs in all the OFDM symbols not containing cell-specific RS in dB.", HFILL } -+ }, -+ { &hf_nfapi_delta_power_offset_index, -+ { "Delta Power offset index", "nfapi.delta.power.offset.index", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Delta power offset, value: 0..1", HFILL } -+ }, -+ { &hf_nfapi_nprb, -+ { "Nprb", "nfapi.nprb", -+ FT_UINT8, BASE_DEC, VALS(nprb_vals), 0x0, -+ "Used with DCI format 1A and RNTI=SI-RNTI or RA-RNTI. This should match the value sent in the TPC field of the DCI 1A PDU which allocated this grant.", HFILL } -+ }, -+ { &hf_nfapi_transmission_mode, -+ { "Transmission Mode", "nfapi.transmission_nprb", -+ FT_UINT8, BASE_DEC, VALS(transmission_mode_vals), 0x0, -+ "Transmission mode associated with the UE", HFILL } -+ }, -+ { &hf_nfapi_prnti, -+ { "P-RNTI", "nfapi.prnti", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The P-RNTI associated with the paging", HFILL } -+ }, -+ { &hf_nfapi_mcs, -+ { "MCS", "nfapi.mcs", -+ FT_UINT8, BASE_DEC, VALS(pch_modulation_vals), 0x0, -+ "The modulation and coding scheme for the transport block", HFILL } -+ }, -+ { &hf_nfapi_number_of_transport_blocks, -+ { "Number of transport blocks", "nfapi.number_of_transport_blocks", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The number of transport blocks transmitted to this RNTI", HFILL } -+ }, -+ { &hf_nfapi_ue_mode, -+ { "UE Mode", "nfapi.ue.mode", -+ FT_UINT8, BASE_DEC, VALS(ue_mode_vals), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_prs_bandwidth, -+ { "PRS bandwidth", "nfapi.prs.bandwidth", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "PRS bandwidth in resource blocks.", HFILL } -+ }, -+ { &hf_prs_cyclic_prefix_type, -+ { "PRS cyclic prefix type", "nfapi.prs.cyclic.prefix.type", -+ FT_BOOLEAN, 8, TFS(&prs_cyclic_prefix_type_strname), 0x0, -+ "The cyclic prefix used for PRS transmission", HFILL } -+ }, -+ { &hf_prs_muting, -+ { "PRS muting", "nfapi.prs.muting", -+ FT_BOOLEAN, 8, TFS(&prs_muting_strname), 0x0, -+ "PRS muting dictates if PRS REs are vacant (prsMutingInfo-r9 indicates the SF occasions)", HFILL } -+ }, -+ { &hf_nfapi_num_bf_prb_per_subband, -+ { "Num of BF PRB per Subband", "nfapi.num.bf.prb.per.subband", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Number of PRBs that are treated as one subband", HFILL } -+ }, -+ { &hf_nfapi_num_bf_vector, -+ { "Num of BF Vector", "nfapi.num.bf.vector", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Number of beam forming vectors. One beam forming vector is specified for each subband", HFILL } -+ }, -+ { &hf_nfapi_csi_rs_resource_config, -+ { "CSI-RS resource config", "nfapi.csi.rs.resource.config", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Indicates reference signal configuration for CSI-RS", HFILL } -+ }, -+ { &hf_nfapi_bf_vector_subband_index, -+ { "BF Subband Index", "nfapi.num.bf.vector.subband.index", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Index of subband for which the following beam forming vector is applied", HFILL } -+ }, -+ { &hf_nfapi_bf_vector_num_antennas, -+ { "BF Num of Antennas", "nfapi.num.bf.vector.bf.value", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Number of physical antennas", HFILL } -+ }, -+ { &hf_nfapi_bf_vector_bf_value, -+ { "BF Value per Antenna", "nfapi.num.bf.vector.bf.value", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Beam forming vector element for physical antenna #i real 8 bits followed by imaginary 8 bits", HFILL } -+ }, -+ { &hf_nfapi_nscid, -+ { "NSC id", "nfapi.nscid", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Used with DCI format 2B and 2C.", HFILL } -+ }, -+ { &hf_nfapi_csi_rs_flag, -+ { "CSI RS Flag", "nfapi.csi.rs.flag", -+ FT_BOOLEAN, 8, TFS(&csi_rs_flags_strname), 0x0, -+ "Indicates if parameters related to CSI-RS are valid or not.", HFILL } -+ }, -+ { &hf_nfapi_csi_rs_resource_config_r10, -+ { "CSI RS resource config R10", "nfapi.csi.rs.resource_config_r10", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "This value is deprecated", HFILL } -+ }, -+ { &hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10, -+ { "CSI-RS Number of NZP configuration", "nfapi.csi.rs.num.of.nzp.configurations", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Bitmap of 16 bits. Encoding format of bitmap follows section 6.10.5.2 of 36.211", HFILL } -+ }, -+ { &hf_nfapi_csi_rs_number_of_nzp_configurations, -+ { "CSI RS zero Tx Power Resource config bitmap R10", "nfapi.csi.rs.zero.tx.power.resource.config.bitmap.r10", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates the number of Non-Zero power CSI-RS configurations.", HFILL } -+ }, -+ { &hf_nfapi_pdsch_start, -+ { "PDSCH_start", "nfapi.pdsch.start", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Per UE starting OFDM symbol for the PDSCH, impacts the mapping of PDSCH to REs", HFILL } -+ }, -+ { &hf_nfapi_drms_config_flag, -+ { "DMRS Config flag", "nfapi.drms.config.flag", -+ FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0, -+ "Indicates if the DMRS Config parameter is valid", HFILL } -+ }, -+ { &hf_nfapi_drms_scrambling, -+ { "DMRS Scrambling", "nfapi.drms.scrambling", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The scrambling identity for UE specific reference signals.", HFILL } -+ }, -+ { &hf_nfapi_csi_config_flag, -+ { "CSI Config flag", "nfapi.csi.config.flag", -+ FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0, -+ "Indicates if the CSI Config parameter is valid", HFILL } -+ }, -+ { &hf_nfapi_csi_scrambling, -+ { "CSI Scrambling", "nfapi.csi.scrambling", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The scrambling identity for CSI.", HFILL } -+ }, -+ { &hf_nfapi_pdsch_re_mapping_flag, -+ { "PDSCH RE mapping flag", "nfapi.pdsch.remapping.flag", -+ FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0, -+ "Indicates if the PDSCH RE parameters are valid.", HFILL } -+ }, -+ { &hf_nfapi_pdsch_re_mapping_antenna_ports, -+ { "PDSCH RE mapping antenna ports", "nfapi.pdsch.remapping.antenna.ports", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Indicates number of antennas used for PDSCH RE mapping", HFILL } -+ }, -+ { &hf_nfapi_pdsch_re_mapping_freq_shift, -+ { "PDSCH RE mapping freq shift", "nfapi.pdsch.remapping.freq.shift", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Indicates the frequency shift used for PDSCH RE mapping.", HFILL } -+ }, -+ { &hf_nfapi_alt_cqi_table_r12, -+ { "altCQI-Table-r12", "nfapi.alt.cqi.table.r12", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "altCQI-Table-r12 is indicative of using an alternative MCS table for UEs supporting 256QAM." -+ "This is taken into account for calculation of soft buffer size for the transport block", HFILL } -+ }, -+ { &hf_nfapi_max_layers, -+ { "MaxLayers", "nfapi.max.layers", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Maximal number of negotiated / configured layers for a UE, used for the calculation of soft buffer size for the transport block", HFILL } -+ }, -+ { &hf_nfapi_n_dl_harq, -+ { "N_DL_HARQ", "nfapi.n.dl.harq", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_dwpts_symbols, -+ { "DwPTS Symbols", "nfapi.dwpts.symbols", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Valid if DCI format 1C is being used to signal LAA end partial SF. Indicates the number of starting symbols according to 36.213 Table 13-A-1", HFILL } -+ }, -+ { &hf_nfapi_initial_lbt_sf, -+ { "Initial LBT SF", "nfapi.initial.lbt.sf", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Indicates if the DCI PDU is prepared for full SF (regular) or for initial partial SF (2nd slot) according to [11] section 6.2.4 (if PDCCH) or 6.2.4A (if ePDCCH)", HFILL } -+ }, -+ { &hf_nfapi_ue_type, -+ { "UE Type", "nfapi.ue.type", -+ FT_UINT8, BASE_DEC, VALS(dlsch_re13_ue_type_vals), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_pdsch_payload_type, -+ { "PDSCH Payload Type", "nfapi.pdsch.payload.type", -+ FT_UINT8, BASE_DEC, VALS(dlsch_re13_pdsch_payload_type_vals), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_initial_transmission_sf, -+ { "Initial transmission SF (io)", "nfapi.init.tx.sf.io", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Absolute Sub-Frame of the initial transmission", HFILL } -+ }, -+ { &hf_nfapi_req13_drms_table_flag, -+ { "Rel-13-DMRS-tabe flag", "nfapi.r13.drms.table.flag", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Indicates if Release 13 DMRS table is used.", HFILL } -+ }, -+ { &hf_nfapi_csi_rs_resource_index, -+ { "CSI-RS resource index", "nfapi.csi.rs.resource.index", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Index of the CSI-RS resource. This is included to link bfValues to CSI-RS resources included in Release 10 parameters.", HFILL } -+ }, -+ { &hf_nfapi_csi_rs_class, -+ { "Class", "nfapi.csi.rs.class", -+ FT_UINT8, BASE_DEC, VALS(csi_rs_class_vals), 0x0, -+ "Indicates CSI-RS class", HFILL } -+ }, -+ { &hf_nfapi_cdm_type, -+ { "CDM Type", "nfapi.cdm.type", -+ FT_UINT8, BASE_DEC, VALS(csi_rs_cdm_type_vals), 0x0, -+ "Indicates CDM type for CSI-RS. See [36.211] section 6.10.5.2. Valid for Class A", HFILL } -+ }, -+ { &hf_nfapi_edpcch_prb_index, -+ { "EPDCCH PRB index", "nfapi.edpcch.prb.index", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "PRB index", HFILL } -+ }, -+ { &hf_nfapi_epdcch_resource_assignment_flag, -+ { "EPDCCH Resource assignment flag", "nfapi.epdcch.resource.assignment.flag", -+ FT_UINT8, BASE_DEC, VALS(local_distributed_vals), 0x0, -+ "Type of virtual resource block used", HFILL } -+ }, -+ { &hf_nfapi_epdcch_id, -+ { "EPDCCH ID", "nfapi.epdcch.id", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "EPDCCH index- used for the scrambler initiation The DMRS scrambling sequence initialization parameter defined in[11] section 6.10.3A.1", HFILL } -+ }, -+ { &hf_nfapi_epdcch_start_symbol, -+ { "EPDCCH Start Symbol", "nfapi.epdcch.start.symbol", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Indicates the OFDM starting symbol for any EPDCCH and PDSCH", HFILL } -+ }, -+ { &hf_nfapi_epdcch_num_prb, -+ { "EPDCCH NumPRB", "nfapi.epdcch.num.prb", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Number of PRBs allocated for EPDCCH", HFILL } -+ }, -+ { &hf_nfapi_precoding_value, -+ { "Precoding value", "nfapi.precoding.value", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Precoding element for physical antenna #i real 8 bits followed by imaginary 8 bits", HFILL } -+ }, -+ { &hf_nfapi_mpdcch_narrowband, -+ { "MPDCCH Narrowband", "nfapi.mpdcch.narrowband", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Narrowband for MPDCCH", HFILL } -+ }, -+ { &hf_nfapi_number_of_prb_pairs, -+ { "Number of PRB pairs", "nfapi.number.prb.pairs", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Number of PRB-pairs constituting the MPDCCH-PRB-pair set", HFILL } -+ }, -+ { &hf_nfapi_resource_block_assignment, -+ { "Resource Block Assignment", "nfapi.resource.block.assignement", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Combinational index r", HFILL } -+ }, -+ { &hf_nfapi_start_symbol, -+ { "Start symbol", "nfapi.start.symbol", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_ecce_index, -+ { "ECCE index", "nfapi.ecce.index", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "CCE index used to send the DCI", HFILL } -+ }, -+ { &hf_nfapi_ce_mode, -+ { "CE Mode", "nfapi.ce.mode", -+ FT_UINT8, BASE_DEC, VALS(ce_mode_vals), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_drms_scrabmling_init, -+ { "DMRS scrambling init", "nfapi.drms.scrambling.init", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The DMRS scrambling sequence initialization parameter defined in [11] section 6.10.3A.1", HFILL } -+ }, -+ { &hf_nfapi_pdsch_reception_levels, -+ { "PDSCH repetition levels", "nfapi.pdsch.repetition.levels", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Valid for DCI formats: 6-0A, 6-0B", HFILL } -+ }, -+ { &hf_nfapi_new_data_indicator, -+ { "New data indicator", "nfapi.new.data.indicator", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The new data indicator for the transport block", HFILL } -+ }, -+ { &hf_nfapi_tpmi_length, -+ { "TPMI length", "nfapi.tpmi.length", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Length of 'TPMI' field in units of bits", HFILL } -+ }, -+ { &hf_nfapi_pmi_flag, -+ { "PMI flag", "nfapi.pmi.flag", -+ FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x0, -+ "Indicates if 'PMI' field is present", HFILL } -+ }, -+ { &hf_nfapi_harq_resource_offset, -+ { "HARQ resource offset", "nfapi.harq.resource.offset", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "HARQ-ACK resource offset used", HFILL } -+ }, -+ { &hf_nfapi_dci_subframe_repetition_number, -+ { "DCI subframe repetition number", "nfapi.dci.subframe.repetition.number", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Indicates the number of MPDCCH repetitions", HFILL } -+ }, -+ { &hf_nfapi_downlink_assignment_index_length, -+ { "Downlink assignment index Length", "nfapi.dl.assignement.index.length", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Length of Downlink assignment index field in units of bits.", HFILL } -+ }, -+ { &hf_nfapi_starting_ce_level, -+ { "Starting CE Level", "nfapi.starting.ce.level", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "2 bits provide the PRACH starting CE level", HFILL } -+ }, -+ { &hf_nfapi_antenna_ports_and_scrambling_identity_flag, -+ { "Antenna ports and scrambling identity flag", "nfapi.antenna.ports.and.scrambling.identity.flag", -+ FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x0, -+ "Indicates if 'Antenna ports and scrambling identity' field is present.", HFILL } -+ }, -+ { &hf_nfapi_antenna_ports_and_scrambling_identity, -+ { "Antenna ports and scrambling identity", "nfapi.antenna.ports.and.scrambling.identit", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Indicates the Antenna port and, scrambling identity value", HFILL } -+ }, -+ { &hf_nfapi_paging_direct_indication_differentiation_flag, -+ { "Paging/Direct indication differentiation flag", "nfapi.paging.direct.indictation.differentiation.flag", -+ FT_UINT8, BASE_DEC, VALS(paging_direct_indication_differtiation_flag_vals), 0x0, -+ "Valid for DCI format 6-2", HFILL } -+ }, -+ { &hf_nfapi_direct_indication, -+ { "Direct indication", "nfapi.direct.indication", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Valid for DCI format 6-2", HFILL } -+ }, -+ { &hf_nfapi_number_of_tx_antenna_ports, -+ { "Number of TX Antenna ports", "nfapi.num.of.tx.antenna.ports.", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Number of TX physical antenna ports", HFILL } -+ }, -+ { &hf_nfapi_transmission_power, -+ { "Transmission Power", "nfapi.transmission_power", -+ FT_UINT16, BASE_CUSTOM, CF_FUNC(power_offset_conversion_fn), 0x0, -+ "Offset to the reference signal power.", HFILL } -+ }, -+ { &hf_nfapi_mbsfn_area_id, -+ { "MBSFN Area id", "nfapi.mbsfn.area.id", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates MBSFN area ID", HFILL } -+ }, -+ { &hf_nfapi_dl_dci_format, -+ { "DL DCI format", "nfapi.dl.dci.format", -+ FT_UINT8, BASE_DEC, VALS(dl_dci_format_vals), 0x0, -+ "Format of the DL DCI", HFILL } -+ }, -+ { &hf_nfapi_ul_dci_format, -+ { "UL DCI format", "nfapi.ul_dci.format", -+ FT_UINT8, BASE_DEC, VALS(ul_dci_format_vals), 0x0, -+ "Format of the UL DCI", HFILL } -+ }, -+ { &hf_nfapi_mpdcch_ul_dci_format, -+ { "UL DCI format", "nfapi.mpdcch.ul_dci.format", -+ FT_UINT8, BASE_DEC, VALS(mpdcch_ul_dci_format_vals), 0x0, -+ "Format of the UL DCI", HFILL } -+ }, -+ { &hf_nfapi_cce_idx, -+ { "CCE index", "nfapi.cce.index", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "CCE index used to send the DCI", HFILL } -+ }, -+ { &hf_nfapi_aggregation_level, -+ { "Aggregation level", "nfapi.aggregation.level", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The aggregation level used", HFILL } -+ }, -+ { &hf_nfapi_mcs_1, -+ { "MCS_1", "nfapi.mcs_1", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The modulation and coding scheme for 1st transport block", HFILL } -+ }, -+ { &hf_nfapi_mcs_2, -+ { "MCS_2", "nfapi.mcs_2", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The modulation and coding scheme for 2nd transport block", HFILL } -+ }, -+ { &hf_nfapi_redundancy_version_1, -+ { "Redundancy version_1", "nfapi.redundancy.version.1", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The redundancy version for 1st transport block.", HFILL } -+ }, -+ { &hf_nfapi_redundancy_version_2, -+ { "Redundancy version_2", "nfapi.redundancy.version.2", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The redundancy version for 2nd transport block", HFILL } -+ }, -+ { &hf_nfapi_new_data_indicator_1, -+ { "New data indicator_1", "nfapi.new.data.indicator.1", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The new data indicator for 1st transport block.", HFILL } -+ }, -+ { &hf_nfapi_new_data_indicator_2, -+ { "New data indicator_2", "nfapi.new.data.indicator.2", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The new data indicator for 2nd transport block.", HFILL } -+ }, -+ { &hf_nfapi_harq_process, -+ { "HARQ process", "nfapi.harq.process", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "HARQ process number", HFILL } -+ }, -+ { &hf_nfapi_tpmi, -+ { "TPMI", "nfapi.tpmi", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The codebook index to be used for precoding", HFILL } -+ }, -+ { &hf_nfapi_pmi, -+ { "PMI", "nfapi.pmi", -+ FT_UINT8, BASE_DEC, VALS(pmi_vals), 0x0, -+ "Confirmation for precoding", HFILL } -+ }, -+ { &hf_nfapi_precoding_information, -+ { "Precoding information", "nfapi.precoding.information", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_tpc, -+ { "TPC", "nfapi.tpc", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Tx power control command for PUCCH", HFILL } -+ }, -+ { &hf_nfapi_downlink_assignment_index, -+ { "Downlink assignment index", "nfapi.downlink.assignment.index", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The downlink assignment index. In release 8-11 this is only used in TDD mode, " -+ "value ignored for FDD. In release 12 or later a field indicating the structure " -+ "type of the primary cell is used to determine if this is valid with size 2 bits." -+ "In release 13 or later a field indicating codebooksizeDetermination - r13 = 0 is " -+ "used to determine is this field is valid with size 4 bits", HFILL } -+ }, -+ { &hf_nfapi_ngap, -+ { "Ngap", "nfapi.ngap", -+ FT_UINT8, BASE_DEC, VALS(ngap_vals), 0x0, -+ "Used in virtual resource block distribution", HFILL } -+ }, -+ { &hf_nfapi_transport_block_size_index, -+ { "Transport block size index", "nfapi.transport.block.size.index", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The transport block size", HFILL } -+ }, -+ { &hf_nfapi_downlink_power_offset, -+ { "Downlink power offset", "nfapi.downlink.power.offset", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Indicates the DL power offset type for multi-user MIMO transmission", HFILL } -+ }, -+ { &hf_nfapi_allocate_prach_flag, -+ { "Allocation PRACH flag", "nfapi.allocation.prach.flag", -+ FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0, -+ "Indicates that PRACH procedure is initiated", HFILL } -+ }, -+ { &hf_nfapi_preamble_index, -+ { "Preamble index", "nfapi.preamable.index", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The preamble index to be used on the PRACH", HFILL } -+ }, -+ { &hf_nfapi_prach_mask_index, -+ { "PRACH mask index", "nfapi.prach.mask.index", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The mask index to be used on the PRACH", HFILL } -+ }, -+ { &hf_nfapi_rnti_type, -+ { "RNTI type", "nfapi.rnti.type", -+ FT_UINT8, BASE_DEC, VALS(rnti_type_vals), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_mpdcch_rnti_type, -+ { "RNTI type", "nfapi.mpdcch.rnti.type", -+ FT_UINT8, BASE_DEC, VALS(mpdcch_rnti_type_vals), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_mcch_flag, -+ { "MCCH flag", "nfapi.mcch.flag", -+ FT_BOOLEAN, BASE_NONE, TFS(&mcch_flag_string_name), 0x0, -+ "Indicates if format 1C is being used to signal a MCCH or SC-MCCH change notification", HFILL } -+ }, -+ { &hf_nfapi_mcch_change_notification, -+ { "MCCH change notification", "nfapi.mcch.change.notification", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "MCCH or SC-MCCH Change Notification", HFILL } -+ }, -+ { &hf_nfapi_scrambling_identity, -+ { "Scrambling identity", "nfapi.scrambling.identity", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Indicates the scrambling identity value NSCID", HFILL } -+ }, -+ { &hf_nfapi_cross_carrier_scheduling_flag, -+ { "Cross Carrier scheduling flag", "nfapi.cross.carrier.scheduling.flag", -+ FT_BOOLEAN, 8, TFS(&cross_carrier_scheduling_flag_strname), 0x0, -+ "Indicates if cross carrier scheduling has been enabled for the UE receiving this DCI", HFILL } -+ }, -+ { &hf_nfapi_carrier_indicator, -+ { "Carrier Indicator", "nfapi.carrier.indicator", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Serving Cell Index", HFILL } -+ }, -+ { &hf_nfapi_srs_flag, -+ { "SRS flag", "nfapi.srs.flag", -+ FT_BOOLEAN, 8, TFS(&srs_flag_strname), 0x0, -+ "Indicates if the SRS request parameter is valid", HFILL } -+ }, -+ { &hf_nfapi_srs_request, -+ { "SRS request", "nfapi.srs.request", -+ FT_BOOLEAN, 8, TFS(&srs_request_strname), 0x0, -+ "SRS request flag", HFILL } -+ }, -+ { &hf_nfapi_antenna_ports_scrambling_and_layers, -+ { "Antenna ports scrambling and layers", "nfapi.antenna.ports.scrambling.and.layers", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Indicates the Antenna port, scrambling identity value NSCID and number of layers", HFILL } -+ }, -+ { &hf_nfapi_total_dci_length_including_padding, -+ { "Total DCI length including padding", "nfapi.total.dci.length.including.padding", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The total DCI length including padding bits", HFILL } -+ }, -+ { &hf_nfapi_n_ul_rb, -+ { "N_UL_RB", "nfapi.n.dl.rb", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "BW of serving cell for which the DCI was scheduled for. This is valid for " -+ "the case of cross carrier scheduling, for the case of a self - " -+ "scheduling(cross carrier scheduling is not valid or Carrier indicator has value '0', " -+ "the BW is the 'DL BW support' as configured in configuration phase(params) " -+ "Uplink channel bandwidth in resource blocks", HFILL } -+ }, -+ { &hf_nfapi_harq_ack_resource_offset, -+ { "HARQ-ACK resource offset", "nfapi.harq.ack.resource.offset", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "HARQ-ACK resource offset field is present only when this format is carried by EPDCCH.", HFILL } -+ }, -+ { &hf_nfapi_pdsch_re_mapping_and_quasi_co_location_indicator, -+ { "PDSCH RE Mapping and Quasi-Co-Location Indicator", "nfapi.pdsch.re.mapping", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Indicates the parameter set configured by the higher layers which the UE should use.", HFILL } -+ }, -+ { &hf_nfapi_primary_cell_type, -+ { "Primary cell type", "nfapi.primary.cell.type", -+ FT_UINT8, BASE_DEC, VALS(primary_cells_type_vals), 0x0, -+ "Indicates the type of the primary cell.", HFILL } -+ }, -+ { &hf_nfapi_ul_dl_configuration_flag, -+ { "UL/DL configuration flag", "nfapi.ul.dl.configuration.flag", -+ FT_BOOLEAN, 8, TFS(&ul_dl_configuration_flag_strname), 0x0, -+ "Indicates if format 1C is being used to signal UL/DL configuration", HFILL } -+ }, -+ { &hf_nfapi_number_of_ul_dl_configurations, -+ { "Number of UL/DL configurations", "nfapi.number.ul.dl.configurations", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_ul_dl_configuration_index, -+ { "UL/DL configuration indication", "nfapi.ul.dl.configuration.indication", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "UL/DL configuration index", HFILL } -+ }, -+ { &hf_nfapi_laa_end_partial_sf_flag, -+ { "LAA end partial SF flag", "nfapi.laa.end.partial.sf.flag", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Indicates if DCI format 1C is being used to signal LAA end partial SF (valid if end partial SF support configuraton is set)", HFILL } -+ }, -+ { &hf_nfapi_laa_end_partial_sf_configuration, -+ { "LAA end partial SF configuration", "nfapi.laa.end.partial.sf.configuration", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "If DCI format 1C scrambled by CC - RNTI is used to signal end partial SF, this field " -+ "contains LAA common information (4 bits used in [9] Table 13A-1 for configuration of " -+ "occupied OFDM symbols for current and next SF)", HFILL } -+ }, -+ { &hf_nfapi_codebooksize_determination_r13, -+ { "Codebook Size Determination R13", "nfapi.codebook.size.determination.r13", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Indicates if the downlink assignment index parameter (DAI) is 4 bits", HFILL } -+ }, -+ { &hf_nfapi_rel13_drms_table_flag, -+ { "Rel-13-DMRS-tabe flag", "nfapi.drms.table.flag.r13", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Indicates if Release 13 DMRS table for be used", HFILL } -+ }, -+ { &hf_nfapi_pscch_resource, -+ { "PSCCH Resource", "nfapi.pscch.resource", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "6-bits describing the resource blocks for transmitting PSCCH", HFILL } -+ }, -+ { &hf_nfapi_time_resource_pattern, -+ { "Time resource pattern", "nfapi.time.resource.pattern", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "7-bits describing the time resource pattern index", HFILL } -+ }, -+ { &hf_nfapi_mpdcch_transmission_type, -+ { "MPDCCH transmission type", "nfapi.mpdcch.transmission.type", -+ FT_UINT8, BASE_DEC, VALS(local_distributed_vals), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_drms_scrambling_init, -+ { "DMRS scrambling init", "nfapi.drms.scrambling.init", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The DMRS scrambling sequence initialization", HFILL } -+ }, -+ { &hf_nfapi_pusch_repetition_levels, -+ { "PUSCH repetition levels", "nfapi.pusch.repetition.levels", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Valid for DCI formats: 6-0A, 6-0B", HFILL } -+ }, -+ { &hf_nfapi_frequency_hopping_flag, -+ { "Frequency hopping flag", "nfapi.frequency.hopping.flag", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Indicates if hopping is being used.", HFILL } -+ }, -+ { &hf_nfapi_csi_request, -+ { "CSI request", "nfapi.csi.request", -+ FT_UINT8, BASE_DEC, VALS(csi_request_vals), 0x0, -+ "Aperiodic CSI request flag", HFILL } -+ }, -+ { &hf_nfapi_dai_presence_flag, -+ { "DAI presence flag", "nfapi.dia.presence.flag", -+ FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x0, -+ "Indicates if DL assignment index field is present in the DCI", HFILL } -+ }, -+ { &hf_nfapi_total_dci_length_include_padding, -+ { "Total DCI length including padding", "nfapi.total.dci.length.including.padding", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The total DCI length including padding bits", HFILL } -+ }, -+ { &hf_nfapi_csi_rs_antenna_port_count_r10, -+ { "CSI-RS antenna port count r10", "nfapi.csi.rs.antenna.port.count.r10", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Indicates number of antennas used for transmission of CSI reference signal.", HFILL } -+ }, -+ { &hf_nfapi_ul_config_pdu_type, -+ { "UL Config PDU Type", "nfapi.ul.config.pdu.type", -+ FT_UINT8, BASE_DEC, VALS(nfapi_ul_config_pdu_type_vals), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_rach_prach_frequency_resources, -+ { "RACH PRACH Frequency resources", "nfapi.rach.prach.frequency.resources", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "If semi-static information is held in the MAC", HFILL } -+ }, -+ { &hf_nfapi_srs_present, -+ { "SRS present", "nfapi.srs.present", -+ FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x0, -+ "If semi-static information is held in the MAC", HFILL } -+ }, -+ { &hf_nfapi_handle, -+ { "Handle", "nfapi.handle", -+ FT_UINT32, BASE_DEC, NULL, 0x0, -+ "An opaque handle", HFILL } -+ }, -+ { &hf_nfapi_pucch_index, -+ { "PUCCH Index", "nfapi.pucch.index", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The PUCCH index value", HFILL } -+ }, -+ { &hf_nfapi_size, -+ { "Size", "nfapi.size", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The size of the ULSCH PDU in bytes as defined by the relevant UL grant", HFILL } -+ }, -+ { &hf_nfapi_resource_block_start, -+ { "Resource block start", "nfapi.resource.block.start", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The starting resource block for this ULSCH allocation", HFILL } -+ }, -+ { &hf_nfapi_number_of_resource_blocks, -+ { "Number of resource blocks", "nfapi.resource.blocks", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The number of resource blocks allocated to this ULSCH grant", HFILL } -+ }, -+ { &hf_nfapi_cyclic_shift_2_for_drms, -+ { "Cyclic Shift 2 for DRMS", "nfapi.cyclic.shift.2.for.drms", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The 2nd cyclic shift for DMRS assigned to the UE in the ULSCH grant", HFILL } -+ }, -+ { &hf_nfapi_frequency_hopping_enabled_flag, -+ { "Frequency hopping enabled flag", "nfapi.frequency.hopping.enabled.flag", -+ FT_UINT8, BASE_DEC, VALS(hopping_vals), 0x0, -+ "Indicates if hopping is being used", HFILL } -+ }, -+ { &hf_nfapi_frequency_hopping_bits, -+ { "Frequency hopping bits", "nfapi.frequency.hopping.bits", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_new_data_indication, -+ { "New Data inidication", "nfapi.new.data.indication", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Specify whether this received transport block is a new transmission from UE", HFILL } -+ }, -+ { &hf_nfapi_harq_process_number, -+ { "HARQ Process number", "nfapi.harq.process.number", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_ul_tx_mode, -+ { "UL Tx Mode", "nfapi.ul.tx.mode", -+ FT_UINT8, BASE_DEC, VALS(ul_tx_mode_vals), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_current_tx_nb, -+ { "Current Tx nb", "nfapi.current.tx.nb", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The current HARQ transmission count of this transport block. Valid if frequency hopping enabled.", HFILL } -+ }, -+ { &hf_nfapi_n_srs, -+ { "N SRS", "nfapi.n.srs", -+ FT_UINT8, BASE_DEC, VALS(n_srs_vals), 0x0, -+ "Indicates if the resource blocks allocated for this grant overlap with the SRS configuration.", HFILL } -+ }, -+ { &hf_nfapi_disable_sequence_hopping_flag, -+ { "Disable seqeunce hopping flag", "nfapi.disable.sequence.hopping.flag", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Indicates if any configured group hopping should be disabled for this UE.", HFILL } -+ }, -+ { &hf_nfapi_virtual_cell_id_enabled_flag, -+ { "Virtual cell ID enabled flag", "nfapi.virtual.cell.id.enabled.flag", -+ FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0, -+ "Indicates if virtual cell is being used and nPUSCH identity is valid.", HFILL } -+ }, -+ { &hf_nfapi_npusch_identity, -+ { "nPUSCH Identity", "nfapi.npusch.identity", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Virtual cell ID for initialization of group hopping, sequence hopping and sequence shift pattern of PUSCH DMRS.", HFILL } -+ }, -+ { &hf_nfapi_ndrms_csh_identity, -+ { "nDMRS-CSH Identity", "nfapi.ndrms.csh.identity", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Virtual cell ID for initialization of cyclic shift hopping of PUSCH DMRS.", HFILL } -+ }, -+ { &hf_nfapi_total_number_of_repetitions, -+ { "Total Number of repetitions", "nfapi.total.number.of.repetitions", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_repetition_number, -+ { "Repetition Number", "nfapi.repetition.number", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Current transmission number", HFILL } -+ }, -+ { &hf_nfapi_initial_sf_io, -+ { "Initial transmission SF (io)", "nfapi.initial.sf.io", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Absolute Sub-Frame of the initial transmission", HFILL } -+ }, -+ { &hf_nfapi_empty_symbols_due_to_retunning, -+ { "Empy symbols due to re-tunning", "nfapi.empty.symbols.due.to.retunning", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Indicates the symbols that are left empty due to eMTC retuning.", HFILL } -+ }, -+ { &hf_nfapi_dl_cqi_ri_pmi_size_2, -+ { "DL CQI/PMI/RI size 2", "nfapi.dl.cqi.ri.pmi.size.2", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The size of the DL CQI/PMI/RI in bits. If the CQI/PMI/RI size exceeds 255 (8-bits) then the Release 9 size value = 0, and this field is used instead.", HFILL } -+ }, -+ { &hf_nfapi_harq_size_2, -+ { "HARQ Size 2", "nfapi.harq.size2", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The size of the ACK/NACK in bits.", HFILL } -+ }, -+ { &hf_nfapi_delta_offset_harq_2, -+ { "Delta Offset HARQ 2", "nfapi.delta.offset.harq.2", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Delta offset 2 for HARQ. This value is fixed for a UE, allocated in RRC connection setup and used for ACK_NACK mode = 4 or 5", HFILL } -+ }, -+ { &hf_nfapi_starting_prb, -+ { "Starting PRB", "nfapi.starting.prb", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The starting PRB for the PUCCH", HFILL } -+ }, -+ { &hf_nfapi_antenna_port, -+ { "Antenna Port", "nfapi.antenna.port", -+ FT_UINT8, BASE_DEC, VALS(antenna_ports_vals), 0x0, -+ "Defines the number of antenna ports used by the UE for the SRS. This value is fixed for a UE and allocated in RRC connection setup.", HFILL } -+ }, -+ { &hf_nfapi_number_of_combs, -+ { "Number of Combs", "nfapi.num.of.combs", -+ FT_UINT8, BASE_DEC, VALS(combs_vals), 0x0, -+ "Defines the maximum number of transmission combs (TC).", HFILL } -+ }, -+ { &hf_nfapi_npucch_identity, -+ { "nPUCCH Identity", "nfapi.npucch.identity", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Virtual cell ID for initialization of base sequence and cyclic shift hopping of PUCCH.", HFILL } -+ }, -+ { &hf_nfapi_empty_symbols, -+ { "Empty symbols", "nfapi.empty.symbols", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Indicates the symbols that are left empty due to eMTC retuning.", HFILL } -+ }, -+ { &hf_nfapi_csi_mode, -+ { "CSI_mode", "nfapi.csi.mode", -+ FT_UINT8, BASE_DEC, VALS(csi_mode_vals), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_dl_cqi_pmi_size_2, -+ { "DL CQI/PMI Size 2", "nfapi.dl.cqi.pmi.size.2", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The size of the DL CQI/PMI in bits", HFILL } -+ }, -+ { &hf_nfapi_statring_prb, -+ { "Starting PRB", "nfapi.starting.prb", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The starting PRB for the PUCCH", HFILL } -+ }, -+ { &hf_nfapi_cdm_index, -+ { "cdm_Index", "nfapi.cdm.index", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Selected CDM option", HFILL } -+ }, -+ { &hf_nfapi_nsrs, -+ { "N srs", "nfapi.n.srs", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Indicates if the resource blocks allocated for this grant overlap with the SRS configuration.", HFILL } -+ }, -+ { &hf_nfapi_num_ant_ports, -+ { "Num_ant_ports", "nfapi.num.ant.port", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The number of antenna ports used by the UE transmit", HFILL } -+ }, -+ { &hf_nfapi_n_pucch_2_0, -+ { "n_PUCCH_2_0", "nfapi.n.pucch.2.0", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The PUCCH Index value for ACK/NACK HARQ resource 4 on antenna port", HFILL } -+ }, -+ { &hf_nfapi_n_pucch_2_1, -+ { "n_PUCCH_2_1", "nfapi.n.pucch.2.1", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "HARQ resource 5", HFILL } -+ }, -+ { &hf_nfapi_n_pucch_2_2, -+ { "n_PUCCH_2_2", "nfapi.n.pucch.2.2", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "HARQ resource 6", HFILL } -+ }, -+ { &hf_nfapi_n_pucch_2_3, -+ { "n_PUCCH_2_3", "nfapi.n.pucch.2.3", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "HARQ resource 7", HFILL } -+ }, -+ { &hf_nfapi_dl_cqi_pmi_size_rank_1, -+ { "DL CQI PMI size rank 1", "nfapi.dl.cqi.pmi.size.rank.1", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The size of the DL CQI/PMI in bits in case of rank 1 report.", HFILL } -+ }, -+ { &hf_nfapi_dl_cqi_pmi_size_rank_greater_1, -+ { "DL CQI PMI size rank greater 1", "nfapi.dl.cqi.pmi.size.rank.1", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The size of the DL CQI/PMI in bits in case of rank>1 report.", HFILL } -+ }, -+ { &hf_nfapi_ri_size, -+ { "RI size", "nfapi.ri.size", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The size of RI in bits", HFILL } -+ }, -+ { &hf_nfapi_delta_offset_cqi, -+ { "Delta offset cqi", "nfapi.delta.offset.cqi", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Delta offset for CQI. This value is fixed for a UE and allocated in RRC connection setup.", HFILL } -+ }, -+ { &hf_nfapi_delta_offset_ri, -+ { "Delta offset ri", "nfapi.delta.offset.ri", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Delta offset for RI. This value is fixed for a UE and allocated in RRC connection setup.", HFILL } -+ }, -+ { &hf_nfapi_harq_size, -+ { "HARQ size", "nfapi.harq_size", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The size of the ACK/NACK in bits", HFILL } -+ }, -+ { &hf_nfapi_delta_offset_harq, -+ { "Delta offset HARQ", "nfapi.delta.offset.harq", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Delta offset for HARQ. This value is fixed for a UE and allocated in RRC connection setup.", HFILL } -+ }, -+ { &hf_nfapi_tdd_ack_nack_mode, -+ { "ACK NACK mode", "nfapi.tdd.ack.nack.mode", -+ FT_UINT8, BASE_DEC, VALS(nfapi_tdd_ack_nack_mode_vals), 0x0, -+ "The format of the ACK/NACK response expected. For TDD only.", HFILL } -+ }, -+ { &hf_nfapi_fdd_ack_nack_mode, -+ { "ACK NACK mode", "nfapi.fdd.ack.nack.mode", -+ FT_UINT8, BASE_DEC, VALS(nfapi_fdd_ack_nack_mode_vals), 0x0, -+ "The format of the ACK/NACK response expected. For TDD only.", HFILL } -+ }, -+ { &hf_nfapi_n_srs_initial, -+ { "N srs initial", "nfapi.n.srs.initial", -+ FT_UINT8, BASE_DEC, VALS(n_srs_initial_vals), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_initial_number_of_resource_blocks, -+ { "Initial number of resource blocks", "nfapi.initial.number.of.resource.blocks", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The number of resource blocks used in the initial transmission of this transport block.", HFILL } -+ }, -+ { &hf_nfapi_dl_cqi_pmi_size, -+ { "DL cqi pmi size", "nfapi.dl.cqi.pmi.size", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The size of the DL CQI/PMI in bits in case of this RI value. The size of the DL CQI / PMI / RI in bits in case of this CRI value", HFILL } -+ }, -+ { &hf_nfapi_report_type, -+ { "Report type", "nfapi.report.type", -+ FT_BOOLEAN, 8, TFS(&nfapi_csi_report_type_strname), 0x0, -+ "Type of CSI report", HFILL } -+ }, -+ { &hf_nfapi_dl_cqi_ri_pmi_size, -+ { "DL CQI/PMI/RI size", "nfapi.dl.cqi.ri.pmi.size", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The size of the DL CQI/PMI/RI/CRI in bits", HFILL } -+ }, -+ { &hf_nfapi_control_type, -+ { "Control type", "nfapi.control.type", -+ FT_BOOLEAN, 8, TFS(&nfapi_control_type_string_name), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_number_of_cc, -+ { "Number of cc", "nfapi.number.of.cc", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The number of CC in the aperiodic report", HFILL } -+ }, -+ { &hf_nfapi_number_of_pucch_resource, -+ { "Number of PUCCH Resource", "nfapi.number.of.pucch.resource", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "A value of 2 indicates that the UE is configured to transmit on two antenna ports", HFILL } -+ }, -+ { &hf_nfapi_pucch_index_p1, -+ { "PUCCH Index P1", "nfapi.pucch.index.p1", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The PUCCH index value for antenna port P1", HFILL } -+ }, -+ { &hf_nfapi_n_pucch_1_0, -+ { "N PUCCH 1 0", "nfapi.n.pucch.1.0", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "HARQ resource 0", HFILL } -+ }, -+ { &hf_nfapi_n_pucch_1_1, -+ { "N PUCCH 1 1", "nfapi.n.pucch.1.1", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "HARQ resource 1", HFILL } -+ }, -+ { &hf_nfapi_n_pucch_1_2, -+ { "N PUCCH 1 2", "nfapi.n.pucch.1.2", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "HARQ resource 2", HFILL } -+ }, -+ { &hf_nfapi_n_pucch_1_3, -+ { "N PUCCH 1 3", "nfapi.n.pucch.1.3", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "HARQ resource 3", HFILL } -+ }, -+ { &hf_nfapi_srs_bandwidth, -+ { "SRS Bandwidth", "nfapi.srs.bandwidth", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "SRS Bandwidth. This value is fixed for a UE and allocated in RRC connection setup.", HFILL } -+ }, -+ { &hf_nfapi_frequency_domain_position, -+ { "Frequency Domain position", "nfapi.frequency.domain.position", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Frequency-domain position, NRRC This value is fixed for a UE and allocated in RRC connection setup.", HFILL } -+ }, -+ { &hf_nfapi_srs_hopping_bandwidth, -+ { "SRS hopping bandwidth", "nfapi.srs.hopping.bandwidth", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Configures the frequency hopping on the SRS. This value is fixed for a UE and allocated in RRC connection setup.", HFILL } -+ }, -+ { &hf_nfapi_transmission_comb, -+ { "Transmission comb", "nfapi.transmission.comb", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Configures the frequency location of the SRS. This value is fixed for a UE and allocated in RRC connection setup.", HFILL } -+ }, -+ { &hf_nfapi_i_srs, -+ { "I SRS", "nfapi.i.srs", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Defines the periodicity and subframe location of the SRS. SRS Configuration Index. This value is fixed for a UE and allocated in RRC connection setup.", HFILL } -+ }, -+ { &hf_nfapi_sounding_reference_cyclic_shift, -+ { "Sounding reference cyclic shift", "nfapi.sounding.reference.cyclic.shift", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Configures the SRS sequence generation. This value is fixed for a UE and allocated in RRC connection setup.", HFILL } -+ }, -+ { &hf_nfapi_pdu_length, -+ { "PDU length", "nfapi.pdu.length", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The total length (in bytes) of the PDU description and PDU data, without the padding bytes", HFILL } -+ }, -+ { &hf_nfapi_crc_flag, -+ { "CRC flag", "nfapi.crc.flag", -+ FT_BOOLEAN, 8, TFS(&crc_flag_strname), 0x0, -+ "A flag indicating if a CRC error was detected", HFILL } -+ }, -+ { &hf_nfapi_number_of_hi_pdus, -+ { "Number of HI Pdu's", "nfapi.number_of_hi_pdus", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Number of HI PDUs included in this message", HFILL } -+ }, -+ { &hf_nfapi_number_of_dci_pdus, -+ { "Number of DCI Pdu's", "nfapi.number_of_dci_pdus", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Number of DCI PDUs included in this message", HFILL } -+ }, -+ { &hf_nfapi_hi_dci0_pdu_type, -+ { "PDU Type", "nfapi.pdu_type", -+ FT_UINT8, BASE_DEC, VALS(hi_dci0_pdu_type_vals), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_hi_value, -+ { "HI Value", "nfapi.hi_value", -+ FT_BOOLEAN, 8, TFS(&hi_value_strname), 0x0, -+ "The PHICH value which is sent on the resource", HFILL } -+ }, -+ { &hf_nfapi_i_phich, -+ { "i phich", "nfapi.i_phich", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Is used in the calculation of the PHICH location. For TDD only", HFILL } -+ }, -+ { &hf_nfapi_flag_tb2, -+ { "Flag TB2", "nfapi.flag_tb2", -+ FT_BOOLEAN, BASE_NONE, TFS(&flag_tb2_strname), 0x0, -+ "Indicates is HI is present for a second transport block", HFILL } -+ }, -+ { &hf_nfapi_hi_value_2, -+ { "HI Value 2", "nfapi.hi_value_2", -+ FT_BOOLEAN, BASE_NONE, TFS(&hi_value_strname), 0x0, -+ "The PHICH value for a second transport block.", HFILL } -+ }, -+ { &hf_nfapi_ue_tx_antenna_selection, -+ { "UE Tx Antenna selection", "nfapi.ue_tx_antenna_selection", -+ FT_UINT8, BASE_DEC, VALS(ue_tx_antenna_selection_vals), 0x0, -+ "Indicates how the CRC is calculated on the PDCCH.", HFILL } -+ }, -+ { &hf_nfapi_cqi_csi_request, -+ { "cqi csi request", "nfapi.cqi_csi_request", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Aperiodic CQI request flag", HFILL } -+ }, -+ { &hf_nfapi_ul_index, -+ { "UL index", "nfapi.ul_index", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Valid for TDD mode only", HFILL } -+ }, -+ { &hf_nfapi_dl_assignment_index, -+ { "DL Assignment index", "nfapi.dl_assignment_index", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Valid for TDD mode only.", HFILL } -+ }, -+ { &hf_nfapi_tpc_bitmap, -+ { "TPC bitmap", "nfapi.tpc_bitmap", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "TPC commands for PUCCH and PUSCH", HFILL } -+ }, -+ { &hf_nfapi_number_of_antenna_ports, -+ { "Number of antenna ports", "nfapi.number.of.antenna.ports", -+ FT_UINT8, BASE_DEC, VALS(number_of_antenna_port_vals), 0x0, -+ "Defines number of antenna ports for this ULSCH allocation", HFILL } -+ }, -+ { &hf_nfapi_size_of_cqi_csi_feild, -+ { "Size of cqi csi feild", "nfapi.size.of.cqi.csi.feild", -+ FT_UINT8, BASE_DEC, VALS(size_of_cqi_csi_feild_vals), 0x0, -+ "Indicates the size of the CQI/CSI request field", HFILL } -+ }, -+ { &hf_nfapi_new_data_indication_two, -+ { "New data indication 2", "nfapi.new.data.indication.two", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The new data indicator for the second transport block", HFILL } -+ }, -+ { &hf_nfapi_resource_allocation_flag, -+ { "Resource allocation flag", "nfapi.resource.allocation.flag", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Indicates if the Resource Allocation Type parameter is valid.", HFILL } -+ }, -+ { &hf_nfapi_dl_node_sync_t1, -+ { "DL Node Sync t1", "nfapi.dl.node.sync.t1", -+ FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, -+ "Offset from VNF SFN/SF 0/0 time reference of the DL Node Sync message transmission at the transport layer, in microseconds.", HFILL } -+ }, -+ { &hf_nfapi_dl_node_sync_delta_sfn_sf, -+ { "DL Node Sync Delta SFN SF", "nfapi.dl.node.sync.delta_sfn_sf", -+ FT_INT32, BASE_DEC, NULL, 0x0, -+ "The delta shift in subframes that the PNF PHY instance must update to on the next subframe boundary", HFILL } -+ }, -+ { &hf_nfapi_dl_cyclic_prefix_type, -+ { "DL Cyclic Prefix type", "nfapi.dl.cyclic.prefix.type", -+ FT_BOOLEAN, 8, TFS(&cyclic_prefix_type_strname), 0x0, -+ "Cyclic prefix type, used for DL", HFILL } -+ }, -+ { &hf_nfapi_ul_cyclic_prefix_type, -+ { "UL Cyclic Prefix type", "nfapi.ul.cyclic.prefix.type", -+ FT_BOOLEAN, 8, TFS(&cyclic_prefix_type_strname), 0x0, -+ "Cyclic prefix type, used for UL", HFILL } -+ }, -+ { &hf_nfapi_downlink_channel_bandwidth, -+ { "Downlink Channel Bandwidth", "nfapi.dl.channel.bandwidth", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Downlink channel bandwidth in resource blocks.", HFILL } -+ }, -+ { &hf_nfapi_uplink_channel_bandwidth, -+ { "Uplink Channel Bandwidth", "nfapi.ul.channel_bandwidth", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Uplink channel bandwidth in resource blocks.", HFILL } -+ }, -+ { &hf_nfapi_tx_antenna_ports, -+ { "Tx Antenna Ports", "nfapi.tx.antenna.ports", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The number of cell specific or NB transmit antenna ports.", HFILL } -+ }, -+ { &hf_nfapi_rx_antenna_ports, -+ { "Tx Antenna Ports", "nfapi.rx.antenna.ports", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The number of cell specific or NB receive antenna ports.", HFILL } -+ }, -+ { &hf_nfapi_ul_node_sync_t1, -+ { "UL Node Sync t1", "nfapi.ul.node.sync.t1", -+ FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, -+ "The supplied t1 field in the DL Node Sync", HFILL } -+ }, -+ { &hf_nfapi_ul_node_sync_t2, -+ { "UL Node Sync t2", "nfapi.ul.node.sync.t2", -+ FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, -+ "Offset from PNF SFN/SF 0/0 time reference of the DL Node Sync message reception at the transport layer, in microseconds.", HFILL } -+ }, -+ { &hf_nfapi_ul_node_sync_t3, -+ { "UL Node Sync t3", "nfapi.ul.node.sync.t3", -+ FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, -+ "Offset from PNF SFN/SF 0/0 time reference of the UL Node Sync message transmission at the transport layer, in microseconds.", HFILL } -+ }, -+ { &hf_nfapi_pb, -+ { "P-B", "nfapi.pb.allocation", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Refers to downlink power allocation. Value is an index into the referenced table.", HFILL } -+ }, -+ { &hf_nfapi_timing_info_last_sfn_sf, -+ { "Last SFN/SF", "nfapi.timing.info.last.sfn.sf", -+ FT_UINT32, BASE_DEC, NULL, 0x0, -+ "The completed SFN/SF at the PNF PHY instance that triggered the Timing Info message", HFILL } -+ }, -+ { &hf_nfapi_timing_info_time_since_last_timing_info, -+ { "Time since last Timing Info", "nfapi.timing.info.time.since.last.timing.info", -+ FT_UINT32, BASE_DEC, NULL, 0x0, -+ "The number of ms since the last Timing Info was sent from this PNF PHY instance.", HFILL } -+ }, -+ { &hf_nfapi_timing_info_dl_config_jitter, -+ { "DL Config Jitter", "nfapi.timing.info.dl.config.jitter", -+ FT_UINT32, BASE_DEC, NULL, 0x0, -+ "The inter message jitter of the DL Config message reception in microseconds", HFILL } -+ }, -+ { &hf_nfapi_timing_info_tx_request_jitter, -+ { "Tx Request Jitter", "nfapi.timing.info.tx.req.jitter", -+ FT_UINT32, BASE_DEC, NULL, 0x0, -+ "The inter message jitter of the Tx Request message reception in microseconds", HFILL } -+ }, -+ { &hf_nfapi_timing_info_ul_config_jitter, -+ { "UL Config Jitter", "nfapi.timing.info.ul.config.jitter", -+ FT_UINT32, BASE_DEC, NULL, 0x0, -+ "The inter message jitter of the UL Config message reception in microseconds", HFILL } -+ }, -+ { &hf_nfapi_timing_info_hi_dci0_jitter, -+ { "HI_DCI0 Jitter", "nfapi.timing.info.hi.dci0.jitter", -+ FT_UINT32, BASE_DEC, NULL, 0x0, -+ "The inter message jitter of the HI_DCI0 message reception in microseconds", HFILL } -+ }, -+ { &hf_nfapi_timing_info_dl_config_latest_delay, -+ { "DL Config Latest Delay", "nfapi.timing.info.dl.config.latest.delay", -+ FT_INT32, BASE_DEC, NULL, 0x0, -+ "The latest delay offset in microseconds from the latest acceptable time for the DL Config as defined in the DL Config Timing in the PNF_PARAM.Response since the last transmission of the Timing Info Message.", HFILL } -+ }, -+ { &hf_nfapi_timing_info_tx_request_latest_delay, -+ { "Tx Request Latest Delay", "nfapi.timing.info.tx.request.latest.delay", -+ FT_INT32, BASE_DEC, NULL, 0x0, -+ "The latest delay offset in microseconds from the latest acceptable time for the Tx Request as defined in the Tx Config Timing in the PNF_PARAM.Response since the last transmission of the Timing Info Message.", HFILL } -+ }, -+ { &hf_nfapi_timing_info_ul_config_latest_delay, -+ { "UL Config Latest Delay", "nfapi.timing.info.ul.config.latest.delay", -+ FT_INT32, BASE_DEC, NULL, 0x0, -+ "The latest delay offset in microseconds from the latest acceptable time for the UL Config as defined in the UL Config Timing in the PNF_PARAM.Response since the last transmission of the Timing Info Message.", HFILL } -+ }, -+ { &hf_nfapi_timing_info_hi_dci0_latest_delay, -+ { "HI_DCI0 Latest Delay", "nfapi.timing.info.hi.dci0.latest.delay", -+ FT_INT32, BASE_DEC, NULL, 0x0, -+ "The latest delay offset in microseconds from the latest acceptable time for the HI_DCI0 as defined in the HI_DCI0 Timing in the PNF_PARAM.Response since the last transmission of the Timing Info Message.", HFILL } -+ }, -+ { &hf_nfapi_timing_info_dl_config_earliest_arrival, -+ { "DL Config Earliest Arrival", "nfapi.timing.info.dl.config.earliest.arrival", -+ FT_INT32, BASE_DEC, NULL, 0x0, -+ "The earlierst arrival offset in microseconds from the latest time acceptable for the DL Config as defined in the Timing Window in the PARAM.Response since the last transmission of the Timing Info Message.", HFILL } -+ }, -+ { &hf_nfapi_timing_info_tx_request_earliest_arrival, -+ { "Tx Request Earliest Arrival", "nfapi.timing.info.tx.request.earliest.arrival", -+ FT_INT32, BASE_DEC, NULL, 0x0, -+ "The earlierst arrival offset in microseconds from the latest time acceptable for the Tx Request as defined in the Timing Window in the PARAM.Response since the last transmission of the Timing Info Message.", HFILL } -+ }, -+ { &hf_nfapi_timing_info_ul_config_earliest_arrival, -+ { "UL Config Earliest Arrival", "nfapi.timing.info.ul.config.earliest.arrival", -+ FT_INT32, BASE_DEC, NULL, 0x0, -+ "The earlierst arrival offset in microseconds from the latest time acceptable for the UL Config as defined in the Timing Window in the PARAM.Response since the last transmission of the Timing Info Message.", HFILL } -+ }, -+ { &hf_nfapi_timing_info_hi_dci0_earliest_arrival, -+ { "HI_DCI0 Earliest Arrival", "nfapi.timing.info.hi.dci0.earliest.arrival", -+ FT_INT32, BASE_DEC, NULL, 0x0, -+ "The earlierst arrival offset in microseconds from the latest time acceptable for the HI_DCI0 as defined in the Timing Window in the PARAM.Response since the last transmission of the Timing Info Message.", HFILL } -+ }, -+ { &hf_nfapi_pcfich_power_offset, -+ { "PCFICH Power Offset", "nfapi.pcfich.power.offset", -+ FT_UINT16, BASE_CUSTOM, CF_FUNC(power_offset_conversion_fn), 0x0, -+ "The power per antenna of the PCFICH with respect to the reference signal.", HFILL } -+ }, -+ { &hf_nfapi_timing_window, -+ { "NFAPI Timing window", "nfapi.timing.window", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The window in milliseconds that the PHY must receive and queue the P7 messages.", HFILL } -+ }, -+ { &hf_nfapi_timing_info_mode, -+ { "Timing Info mode", "nfapi.timing.info.mode", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The configured mode of operation for the timing info message to be sent to the VNF from the PHY", HFILL } -+ }, -+ { &hf_nfapi_timing_info_period, -+ { "Timing info period", "nfapi.timing.info.period", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "If Periodic timing mode is enabled, this defines the periodicity in subframes. This field is ignored if periodic timing mode is disabled.", HFILL } -+ }, -+ { &hf_nfapi_tdd_harq_mode, -+ { "Mode", "nfapi.tdd.harq.mode", -+ FT_UINT8, BASE_DEC, VALS(tdd_harq_mode_vals), 0x0, -+ "The format of the ACK/NACK response expected", HFILL } -+ }, -+ { &hf_nfapi_fdd_harq_mode, -+ { "Mode", "nfapi.fdd.harq.mode", -+ FT_UINT8, BASE_DEC, VALS(fdd_harq_mode_vals), 0x0, -+ "The format of the ACK/NACK response expected", HFILL } -+ }, -+ { &hf_nfapi_number_of_ack_nack, -+ { "Number of ACK/NACK", "nfapi.uint16.tag", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The number of ACK/NACK results reported for this UE", HFILL } -+ }, -+ { &hf_nfapi_harq_data_value_0, -+ { "Value 0", "nfapi.harq.value.0", -+ FT_UINT8, BASE_DEC, VALS(harq_value_vals), 0x0, -+ "Indicates HARQ results", HFILL } -+ }, -+ { &hf_nfapi_harq_data_value_0_special, -+ { "Value 0", "nfapi.harq.value.0.special", -+ FT_UINT8, BASE_DEC, VALS(harq_special_value_vals), 0x0, -+ "Indicates HARQ results", HFILL } -+ }, -+ { &hf_nfapi_harq_data_value_1, -+ { "Value 1", "nfapi.harq.value.1", -+ FT_UINT8, BASE_DEC, VALS(harq_value_vals), 0x0, -+ "Indicates HARQ results", HFILL } -+ }, -+ { &hf_nfapi_harq_data_value_2, -+ { "Value 2", "nfapi.harq.value.2", -+ FT_UINT8, BASE_DEC, VALS(harq_value_vals), 0x0, -+ "Indicates HARQ results", HFILL } -+ }, -+ { &hf_nfapi_harq_data_value_3, -+ { "Value 3", "nfapi.harq.value.3", -+ FT_UINT8, BASE_DEC, VALS(harq_value_vals), 0x0, -+ "Indicates HARQ results", HFILL } -+ }, -+ { &hf_nfapi_harq_tb_1, -+ { "HARQ TB1", "nfapi.harq.tb.", -+ FT_UINT8, BASE_DEC, VALS(harq_value_vals), 0x0, -+ "HARQ feedback of 1st TB.", HFILL } -+ }, -+ { &hf_nfapi_harq_tb_2, -+ { "HARQ TB2", "nfapi.harq.tb.2", -+ FT_UINT8, BASE_DEC, VALS(harq_value_vals), 0x0, -+ "HARQ feedback of 2nd TB.", HFILL } -+ }, -+ { &hf_nfapi_harq_tb_n, -+ { "HARQ TB_N", "nfapi.harq.tb.n", -+ FT_UINT8, BASE_DEC, VALS(harq_value_vals), 0x0, -+ "HARQ feedback of Nth TB.", HFILL } -+ }, -+ { &hf_nfapi_ul_cqi, -+ { "UL_CQI", "nfapi.ul.cqi", -+ FT_UINT8, BASE_CUSTOM, CF_FUNC(ul_cqi_conversion_fn), 0x0, -+ "SNR", HFILL } -+ }, -+ { &hf_nfapi_channel, -+ { "Channel", "nfapi.channel", -+ FT_UINT8, BASE_DEC, VALS(channel_vals), 0x0, -+ "The channel to which this measurement refers", HFILL } -+ }, -+ { &hf_nfapi_data_offset, -+ { "Data Offset", "nfapi.data.offset", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Gives the PDU#i data address offset from the beginning of the 'Number of PDUs' field. An offset of 0 indicates a CRC or decoding error", HFILL } -+ }, -+ { &hf_nfapi_ri, -+ { "RI", "nfapi.ri", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The rank indication reported by the UE on PUSCH for aperiodic CSI.", HFILL } -+ }, -+ { &hf_nfapi_timing_advance, -+ { "Timing Advance", "nfapi.timing.advance", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The timing advance measured for this PDU and UE.", HFILL } -+ }, -+ { &hf_nfapi_timing_advance_r9, -+ { "Timing Advance R9", "nfapi.timing.advance.r9", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Timing advance used for positioning", HFILL } -+ }, -+ { &hf_nfapi_number_of_cc_reported, -+ { "Number of CC reported", "nfapi.number.of.cc.reported", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_preamble, -+ { "Preamble", "nfapi.preamble", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The detected preamble", HFILL } -+ }, -+ { &hf_nfapi_rach_resource_type, -+ { "RACH resource type", "nfapi.rach.resource.type", -+ FT_UINT8, BASE_DEC, VALS(rach_resource_type_vals), 0x0, -+ "Indicates if this indication is related to Cat-M UE and in which CE level", HFILL } -+ }, -+ { &hf_nfapi_doppler_estimation, -+ { "Doppler estimation", "nfapi.doppler.estimation", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "FFS", HFILL } -+ }, -+ { &hf_nfapi_rb_start, -+ { "RB Start", "nfapi.rb.start", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The starting point of the RBs to be reported", HFILL } -+ }, -+ { &hf_nfapi_snr, -+ { "SNR", "nfapi.snr", -+ FT_UINT8, BASE_CUSTOM, CF_FUNC(ul_cqi_conversion_fn), 0x0, -+ "Field size dependent on configured bandwidth SNR for RBs, each RBs report one SNR.", HFILL } -+ }, -+ { &hf_nfapi_up_pts_symbol, -+ { "UpPTS Symbol", "nfapi.uppts.symbol", -+ FT_UINT8, BASE_DEC, VALS(up_pts_symbol_vals), 0x0, -+ "Indicates symbol where SRS was received. Only valid if the SRS was received in subframe 1 or 6.", HFILL } -+ }, -+ { &hf_nfapi_number_prb_per_subband, -+ { "numPRBperSubband", "nfapi.num.prb.per.subband", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Number of PRBs that are treated as one subband", HFILL } -+ }, -+ { &hf_nfapi_number_antennas, -+ { "numAntennas", "nfapi.num.antennas", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Number of physical antennas", HFILL } -+ }, -+ { &hf_nfapi_subband_index, -+ { "subbandIndex", "nfapi.subband.index", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "Index of subband for which the following channel coefficient is applied", HFILL } -+ }, -+ { &hf_nfapi_channel_coefficient, -+ { "Channel", "nfapi.channel.coefficient", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Averaged channel coefficient in a subband for physical antenna #i, real 8 bits followed by imaginary 8 bits", HFILL } -+ }, -+ { &hf_nfapi_ul_rtoa, -+ { "UL_RTOA", "nfapi.ul.rtoa", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "UL relative time of arrival used for network based positioning", HFILL } -+ }, -+ { &hf_nfapi_frequency_band_indicator, -+ { "Frequency Band Indicator", "nfapi.frequency.band.indicator", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The E-UTRA band for which the carrierList applies.", HFILL } -+ }, -+ { &hf_nfapi_measurement_period, -+ { "Measurement Period", "nfapi.measurement.period", -+ FT_UINT16, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, -+ "The length of time to measure RSSI over, in units of 1ms.", HFILL } -+ }, -+ { &hf_nfapi_bandwidth, -+ { "Bandwidth", "nfapi.bandwidth", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The bandwidth (in resource blocks) over which the RSSI is measured.", HFILL } -+ }, -+ { &hf_nfapi_timeout, -+ { "Timeout", "nfapi.timeout", -+ FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, -+ "The timeout value after which the PNF should abort the procedure in units of 1ms. The value of 0 indicates that the PNF should attempt to complete the procedure without any VNF-imposed timeout.", HFILL } -+ }, -+ { &hf_nfapi_number_of_earfcns, -+ { "Number of EARFCNs", "nfapi.number.of.earfcns", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The number of EARFCNs which should be measured. In the case that no EARFCN (value 0) is specified, all valid EARFCNs for the specified bandwidth in the band shall be measured, in order of ascending EARCFN.", HFILL } -+ }, -+ { &hf_nfapi_uarfcn, -+ { "UARFCN", "nfapi.uarfcn", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "UARFCN to be measured.", HFILL } -+ }, -+ { &hf_nfapi_number_of_uarfcns, -+ { "Number of UARFCNs", "nfapi.number.of.uarfcn", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The number of UARFCNs which should be measured. In the case that no UARFCN (value 0) is specified, all UARFCNs in the band shall be measured, in order of ascending UARCFN.", HFILL } -+ }, -+ { &hf_nfapi_arfcn, -+ { "ARFCN", "nfapi.arfcn", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The ARFCN to be measured", HFILL } -+ }, -+ { &hf_nfapi_arfcn_direction, -+ { "Direction", "nfapi.arfcn.direction", -+ FT_UINT8, BASE_DEC, VALS(arfcn_direction_vals), 0x0, -+ "The link direction to be measured", HFILL } -+ }, -+ { &hf_nfapi_number_of_arfcns, -+ { "Number of ARFCNs", "nfapi.number.of.arfcn", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The number of ARFCNs which should be measured. In the case that no ARFCN (value 0) is specified, all ARFCNs in the band shall be measured, in order of ascending ARCFN.", HFILL } -+ }, -+ { &hf_nfapi_rssi, -+ { "RSSI", "nfapi.rssi", -+ FT_INT16, BASE_CUSTOM, CF_FUNC(rssi_conversion_fn), 0x0, -+ "The list of RSSI values of the carriers measured, in the order of the list of the original request.", HFILL } -+ }, -+ { &hf_nfapi_number_of_rssi, -+ { "Number of RSSI", "nfapi.number.of.rssi", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The number of RSSI results returned in the following array.", HFILL } -+ }, -+ { &hf_nfapi_pci, -+ { "PCI", "nfapi.pci", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The PCI for cell which should be searched", HFILL } -+ }, -+ { &hf_nfapi_measurement_bandwidth, -+ { "Measurement Bandwidth", "nfapi.measurement.bandwidth", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The number of resource blocks which should be used for measuring RSRP", HFILL } -+ }, -+ { &hf_nfapi_exhaustive_search, -+ { "Exhaustive Search", "nfapi.exhaustive.search", -+ FT_UINT8, BASE_DEC, VALS(exhustive_search_vals), 0x0, -+ "NMM should try to find all cells on the carrier", HFILL } -+ }, -+ { &hf_nfapi_number_of_pci, -+ { "Number of PCI", "nfapi.number.of.pci", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The number of cells in the PCI list. If 0 all cells on the carrier should be found. Otherwise, depending on exhaustiveSearch flag, only the given pciList is searched or the pciList is used for indicating a priority list. Range: 0 to MAX_PCI_LIST.", HFILL } -+ }, -+ { &hf_nfapi_psc, -+ { "PSC", "nfapi.psc", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The PSC for cells which should be searched.", HFILL } -+ }, -+ { &hf_nfapi_number_of_psc, -+ { "Number of PSC", "nfapi.number.of.psc", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The number of cells in the PSC list. If 0 all cells on the carrier should be found. Otherwise, depending on Exhaustive Search flag, only the given PSC list is searched or the PSC list is used for indicating a priority list. Range: 0 to MAX_PSC_LIST.", HFILL } -+ }, -+ { &hf_nfapi_rsrp, -+ { "RSRP", "nfapi.rsrp", -+ FT_UINT8, BASE_CUSTOM, CF_FUNC(neg_pow_conversion_fn), 0x0, -+ "The measured RSRP value in units of -1dB", HFILL } -+ }, -+ { &hf_nfapi_rsrq, -+ { "RSRQ", "nfapi.rsrq", -+ FT_UINT8, BASE_CUSTOM, CF_FUNC(neg_pow_conversion_fn), 0x0, -+ "The measured RSRQ value in units of -1dB", HFILL } -+ }, -+ { &hf_nfapi_number_of_lte_cells_found, -+ { "Number of LTE Cells Found", "nfapi.number.of.lte.cells.found", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The number of LTE cells indicated in this message.", HFILL } -+ }, -+ { &hf_nfapi_rscp, -+ { "RSCP", "nfapi.rscp", -+ FT_UINT8, BASE_CUSTOM, CF_FUNC(neg_pow_conversion_fn), 0x0, -+ "The measured RSCP value in units of -1dB", HFILL } -+ }, -+ { &hf_nfapi_enco, -+ { "EcNo", "nfapi.ecno", -+ FT_UINT8, BASE_CUSTOM, CF_FUNC(neg_pow_conversion_fn), 0x0, -+ "The measured RSCP value in units of -1dB", HFILL } -+ }, -+ { &hf_nfapi_number_of_utran_cells_found, -+ { "Number of UTRAN Cells Found", "nfapi.number.of.utran.cells.found", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The number of LTE cells indicated in this message", HFILL } -+ }, -+ { &hf_nfapi_bsic, -+ { "BSIC", "nfapi.bsic", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The BSIC of the cell which the NMM synchronized to", HFILL } -+ }, -+ { &hf_nfapi_rxlev, -+ { "RxLev", "nfapi.rxlev", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The measured RxLev value", HFILL } -+ }, -+ { &hf_nfapi_rxqual, -+ { "RxQual", "nfapi.rxqual", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The measured RxQual value", HFILL } -+ }, -+ { &hf_nfapi_sfn_offset, -+ { "SFN Offset", "nfapi.sfn.offset", -+ FT_UINT32, BASE_DEC, NULL, 0x0, -+ "The offset in us of the start of the current GSM Radio HyperFrame (i.e. FN=0) from the start of the preceding LTE Radio Frame of the PNF for SFN=0", HFILL } -+ }, -+ { &hf_nfapi_number_of_geran_cells_found, -+ { "Number of GSM Cells Found", "nfapi.number.of.geran.cells.found", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The number of GSM cells indicated in this message", HFILL } -+ }, -+ { &hf_nfapi_number_of_tx_antenna, -+ { "Number of Tx Antenna", "nfapi.number.of.tx.antenna", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The number of Tx Antenna detected for the cell", HFILL } -+ }, -+ { &hf_nfapi_mib_length, -+ { "MIB Length", "nfapi.mib.length", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Length in bytes of the following MIB array", HFILL } -+ }, -+ { &hf_nfapi_mib, -+ { "MIB", "nfapi.mib", -+ FT_BYTES, BASE_NONE, NULL, 0x0, -+ "The MIB read from the specified cell.", HFILL } -+ }, -+ { &hf_nfapi_phich_configuration, -+ { "PHICH Configuration", "nfapi.phich.configuration", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The PHICH-Config of the cell", HFILL } -+ }, -+ { &hf_nfapi_retry_count, -+ { "retryCount", "nfapi.retry.count", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The number of SIB1 repetition periods for which decoding of SIB1 should be retried.", HFILL } -+ }, -+ { &hf_nfapi_sib1, -+ { "SIB1", "nfapi.sib1", -+ FT_BYTES, BASE_NONE, NULL, 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_si_periodicity, -+ { "SI Periodicity", "nfapi.si.periodicity", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The SI Periodicity of the requested SIBs, with the first element being for SIB2, the next for SIB3, etc, encoded as follows", HFILL } -+ }, -+ { &hf_nfapi_si_index, -+ { "SI Index", "nfapi.si.index", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The index of this SIB in the SIB1 SchedulingInfoList:", HFILL } -+ }, -+ { &hf_nfapi_number_of_si_periodicity, -+ { "Number of SI Periodicity", "nfapi.number.of.si.periodicity", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The number of System Information periodicity values in the following array", HFILL } -+ }, -+ { &hf_nfapi_si_window_length, -+ { "SI Window Length", "nfapi.si.window.length", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The SI window in units of 1ms", HFILL } -+ }, -+ { &hf_nfapi_sib_type, -+ { "SIB Type", "nfapi.sib.type", -+ FT_UINT8, BASE_DEC, NULL, 0x0, -+ "The SIB type", HFILL } -+ }, -+ { &hf_nfapi_sib_len, -+ { "SIB Length", "nfapi.sib.length", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The length in bytes of the following SIB array", HFILL } -+ }, -+ { &hf_nfapi_sib, -+ { "SIB", "nfapi.sib", -+ FT_BYTES, BASE_NONE, NULL, 0x0, -+ "The SIB element read from the specified cell.", HFILL } -+ }, -+ { &hf_nfapi_si_len, -+ { "SI Length", "nfapi.si.length", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The length in bytes of the following SI array", HFILL } -+ }, -+ { &hf_nfapi_si, -+ { "SI", "nfapi.si", -+ FT_BYTES, BASE_NONE, NULL, 0x0, -+ "The SI element read from the specified cell.", HFILL } -+ }, -+ { &hf_nfapi_pnf_search_state, -+ { "State", "nfapi.state", -+ FT_BYTES, BASE_NONE, NULL, 0x0, -+ "A structure of opaque data optionally sent by the PNF to the VNF", HFILL } -+ }, -+ { &hf_nfapi_pnf_broadcast_state, -+ { "State", "nfapi.state", -+ FT_BYTES, BASE_NONE, NULL, 0x0, -+ "A structure of opaque data optionally sent by the PNF to the VNF", HFILL } -+ }, -+ { &hf_nfapi_dl_rs_tx_power, -+ { "DL RS Tx power", "nfapi.dl.rs.tx.power", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "The DL RS Tx power measurement", HFILL } -+ }, -+ { &hf_nfapi_received_interference_power, -+ { "Received interference power", "nfapi.received.interference.power", -+ FT_UINT16, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, -+ "The Received interference power measurement", HFILL } -+ }, -+ { &hf_nfapi_thermal_noise_power, -+ { "Thermal noise power", "nfapi.thermal.noise.power", -+ FT_UINT16, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, -+ "The Thermal noise power measurement", HFILL } -+ }, -+ { &hf_nfapi_dl_rs_tx_power_measurement, -+ { "DL RS TX Power measurement", "nfapi.dl.rs.tx.power.measurement", -+ FT_INT16, BASE_CUSTOM, CF_FUNC(dl_rs_tx_pow_measment_conversion_fn), 0x0, -+ "The DL RS Tx power measurement defined", HFILL } -+ }, -+ { &hf_nfapi_received_interference_power_measurement, -+ { "Received interference power measurement", "nfapi.received.interference.power.measurement", -+ FT_INT16, BASE_CUSTOM, CF_FUNC(dl_rs_tx_pow_measment_conversion_fn), 0x0, -+ NULL, HFILL } -+ }, -+ { &hf_nfapi_thermal_noise_power_measurement, -+ { "Thermal noise power measurement", "nfapi.thermal.noise.power.measurement", -+ FT_INT16, BASE_CUSTOM, CF_FUNC(dl_rs_tx_pow_measment_conversion_fn), 0x0, -+ "The Thermal noise power measurement", HFILL } -+ }, -+ { &hf_nfapi_initial_partial_sf, -+ { "Initial Partial SF", "nfapi.initial.partial.sf", -+ FT_BOOLEAN, 32, TFS(&initial_partial_sf_strname), 0x0, -+ "Indicates whether the initial SF in the LBT process is full or partial", HFILL } -+ }, -+ { &hf_nfapi_lbt_mode, -+ { "LBT Mode", "nfapi.lbt.mode", -+ FT_BOOLEAN, 32, TFS(&lbt_mode_strname), 0x0, -+ "Part of multi-carrier support. Indicates whether full LBT process is carried or partial LBT process is carried (multi carrier mode B according to [9] section 15.1.5.2)", HFILL } -+ }, -+ { &hf_nfapi_lte_txop_sf, -+ { "LTE TXOP SF", "nfapi.txop.sf", -+ FT_UINT32, BASE_DEC, NULL, 0x0, -+ "Indicates the LTE TXOP (TMCOT,P in [9] section 15.1.1) duration in subframes.", HFILL } -+ }, -+ { &hf_nfapi_mp_cca, -+ { "mp cca", "nfapi.mp.cca", -+ FT_UINT32, BASE_DEC, NULL, 0x0, -+ "Indicates the value of the defer factor", HFILL } -+ }, -+ { &hf_nfapi_n_cca, -+ { "n cca", "nfapi.n.cca", -+ FT_UINT32, BASE_DEC, NULL, 0x0, -+ "Indicates the value of LBT backoff counter", HFILL } -+ }, -+ { &hf_nfapi_offset, -+ { "offset", "nfapi.offset", -+ FT_UINT32, BASE_DEC, NULL, 0x0, -+ "Indicates the LBT start time in microseconds from the beginning of the subframe scheduled by this message.", HFILL } -+ }, -+ { &hf_nfapi_result, -+ { "result", "nfapi.result", -+ FT_BOOLEAN, 32, TFS(&tfs_fail_success), 0x0, -+ "Indicates the LBT procedure result of SFN/SF:", HFILL } -+ }, -+ { &hf_nfapi_sfn_sf_end, -+ { "SFN/SF End", "nfapi.sfn.sf.end", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates the SFN/SF by which the DRS window (Discovery signal occasion as described in [9] section 6.11A) must end. In worst case, this would be the last TXOP subframe.", HFILL } -+ }, -+ { &hf_nfapi_txop_sfn_sf_end, -+ { "TXOP SFN/SF End", "nfapi.txop.sfn.sf.end", -+ FT_UINT16, BASE_DEC, NULL, 0x0, -+ "Indicates the SFN/SF by which the TXOP must end. In worst case, this would be the last TXOP subframe.", HFILL } -+ }, -+ { &hf_nfapi_txop_symbols, -+ { "LTE TXOP symbols", "nfapi.lte.txop.symbols", -+ FT_UINT32, BASE_DEC, NULL, 0x0, -+ "Actual LTE TXOP in symbols", HFILL } -+ }, -+ }; -+ -+ /* Setup protocol subtree array */ -+ static gint *ett[] = -+ { -+ &ett_nfapi_message_tree, -+ &ett_nfapi_p4_p5_message_header, -+ &ett_nfapi_p7_message_header, -+ &ett_nfapi_tlv_tree, -+ &ett_nfapi_tl, -+ &ett_nfapi_pnf_phy_rf_config, -+ &ett_nfapi_pnf_phy, -+ &ett_nfapi_pnf_phy_rel10, -+ &ett_nfapi_pnf_phy_rel11, -+ &ett_nfapi_pnf_phy_rel12, -+ &ett_nfapi_pnf_phy_rel13, -+ &ett_nfapi_rf_bands, -+ &ett_nfapi_bf_vectors, -+ &ett_nfapi_csi_rs_bf_vector, -+ &ett_nfapi_csi_rs_resource_configs, -+ &ett_nfapi_tx_antenna_ports, -+ &ett_nfapi_harq_ack_nack_data, -+ &ett_nfapi_harq_data, -+ &ett_nfapi_cqi_pmi_size, -+ &ett_nfapi_cc, -+ &ett_nfapi_rbs, -+ &ett_nfapi_antennas, -+ &ett_nfapi_epdcch_prbs, -+ &ett_nfapi_dl_config_request_pdu_list, -+ &ett_nfapi_ul_config_request_pdu_list, -+ &ett_nfapi_hi_dci0_request_pdu_list, -+ &ett_nfapi_tx_request_pdu_list, -+ &ett_nfapi_rx_indication_pdu_list, -+ &ett_nfapi_harq_indication_pdu_list, -+ &ett_nfapi_crc_indication_pdu_list, -+ &ett_nfapi_sr_indication_pdu_list, -+ &ett_nfapi_cqi_indication_pdu_list, -+ &ett_nfapi_preamble_indication_pdu_list, -+ &ett_nfapi_srs_indication_pdu_list, -+ &ett_nfapi_lbt_dl_config_pdu_list, -+ &ett_nfapi_lbt_dl_indication_pdu_list, -+ &ett_nfapi_subbands, -+ &ett_nfapi_precoding, -+ &ett_nfapi_bf_vector_antennas, -+ &ett_nfapi_received_interference_power_mesurement_results, -+ &ett_nfapi_downlink_bandwidth_support, -+ &ett_nfapi_uplink_bandwidth_support, -+ &ett_nfapi_release_support, -+ &ett_nfapi_downlink_modulation_support, -+ &ett_nfapi_uplink_modulation_support, -+ -+ &ett_nfapi_earfcn_list, -+ &ett_nfapi_uarfcn_list, -+ &ett_nfapi_arfcn_list, -+ &ett_nfapi_rssi_list, -+ &ett_nfapi_pci_list, -+ &ett_nfapi_psc_list, -+ &ett_nfapi_lte_cells_found_list, -+ &ett_nfapi_utran_cells_found_list, -+ &ett_nfapi_geran_cells_found_list, -+ &ett_nfapi_si_periodicity_list, -+ -+ /* for fragmentation support*/ -+ &ett_msg_fragment, -+ &ett_msg_fragments -+ }; -+ -+ static ei_register_info ei[] = -+ { -+ { &ei_invalid_range, { "nfapi.invalid.range", PI_PROTOCOL, PI_WARN, NULL, EXPFILL } }, -+ { &ei_invalid_tlv_length, { "nfapi.invalid.tlv.length", PI_PROTOCOL, PI_ERROR, NULL, EXPFILL } }, -+ }; -+ -+ expert_module_t* expert_nfapi; -+ /* Register protocol */ -+ proto_nfapi = proto_register_protocol("Nfapi", "NFAPI", "nfapi"); -+ -+ expert_nfapi = expert_register_protocol(proto_nfapi); -+ expert_register_field_array(expert_nfapi, ei, array_length(ei)); -+ -+ -+ proto_register_field_array(proto_nfapi, hf, array_length(hf)); -+ proto_register_subtree_array(ett, array_length(ett)); -+ -+ reassembly_table_register(&ul_p7_reassemble_table, &addresses_ports_reassembly_table_functions); -+ reassembly_table_register(&dl_p7_reassemble_table, &addresses_ports_reassembly_table_functions); -+ -+ register_dissector("nfapi", dissect_nfapi, proto_nfapi); -+ -+} -+ -+// ----------------------------------------------------------------------------| -+ -+void proto_reg_handoff_nfapi(void) -+{ -+ static dissector_handle_t nfapi_handle; -+ -+ nfapi_handle = create_dissector_handle(dissect_nfapi, proto_nfapi); -+ -+ dissector_add_for_decode_as("sctp.port", nfapi_handle); -+ -+ dissector_add_uint("udp.port", 41700, nfapi_handle); -+ -+} -+ -+ -+/* -+* Editor modelines - http://www.wireshark.org/tools/modelines.html -+* -+* Local variables: -+* c-basic-offset: 8 -+* tab-width: 8 -+* indent-tabs-mode: t -+* End: -+* -+* vi: set shiftwidth=8 tabstop=8 noexpandtab: -+* :indentSize=8:tabSize=8:noTabs=false: -+*/ -diff --git a/xml/pnf_phy_1_A.xml b/xml/pnf_phy_1_A.xml -index da6cc26..45f8f46 100644 ---- a/xml/pnf_phy_1_A.xml -+++ b/xml/pnf_phy_1_A.xml -@@ -26,7 +26,7 @@ - - 88 - 2500 --
127.0.0.1
-+
192.168.1.74
- - 1 - -@@ -54,9 +54,9 @@ - - - -- 7722 -- 127.0.0.1 -- 7733 -+ 5201 -+ 192.168.1.28 -+ 5200 - - -
-diff --git a/xml/vnf_A.xml b/xml/vnf_A.xml -index e609c93..3791239 100644 ---- a/xml/vnf_A.xml -+++ b/xml/vnf_A.xml -@@ -2,8 +2,8 @@ - - - -- 5200 --
127.0.0.1
-+ 5201 -+
192.168.1.28
- 10 - 0 - 0 -@@ -12,7 +12,7 @@ - - - 8891 -- 127.0.0.1 -+ 192.168.1.28 - 8892 - - diff --git a/nfapi/tests/p5/nr_fapi_config_request_test.c b/nfapi/tests/p5/nr_fapi_config_request_test.c index f980b3e61e..3b6ae99e94 100644 --- a/nfapi/tests/p5/nr_fapi_config_request_test.c +++ b/nfapi/tests/p5/nr_fapi_config_request_test.c @@ -22,7 +22,7 @@ #include "nr_fapi_p5.h" #include "nr_fapi_p5_utils.h" -void fill_config_request_tlv(nfapi_nr_config_request_scf_t *nfapi_resp) +static void fill_config_request_tlv_tdd_rand(nfapi_nr_config_request_scf_t *nfapi_resp) { FILL_TLV(nfapi_resp->carrier_config.dl_bandwidth, NFAPI_NR_CONFIG_DL_BANDWIDTH_TAG, rand16()); nfapi_resp->num_tlv++; @@ -70,7 +70,8 @@ void fill_config_request_tlv(nfapi_nr_config_request_scf_t *nfapi_resp) FILL_TLV(nfapi_resp->cell_config.phy_cell_id, NFAPI_NR_CONFIG_PHY_CELL_ID_TAG, rand16()); nfapi_resp->num_tlv++; - FILL_TLV(nfapi_resp->cell_config.frame_duplex_type, NFAPI_NR_CONFIG_FRAME_DUPLEX_TYPE_TAG, rand8()); + // TDD because below we pack the TDD table + FILL_TLV(nfapi_resp->cell_config.frame_duplex_type, NFAPI_NR_CONFIG_FRAME_DUPLEX_TYPE_TAG, 1 /* TDD */); nfapi_resp->num_tlv++; FILL_TLV(nfapi_resp->ssb_config.ss_pbch_power, NFAPI_NR_CONFIG_SS_PBCH_POWER_TAG, (int32_t)rand32()); @@ -230,7 +231,7 @@ void fill_config_request_tlv(nfapi_nr_config_request_scf_t *nfapi_resp) nfapi_resp->num_tlv++; } -void test_pack_unpack(nfapi_nr_config_request_scf_t *req) +static void test_pack_unpack(nfapi_nr_config_request_scf_t *req) { uint8_t msg_buf[65535]; uint16_t msg_len = sizeof(*req); @@ -263,7 +264,7 @@ void test_pack_unpack(nfapi_nr_config_request_scf_t *req) free_config_request(&unpacked_req); } -void test_copy(const nfapi_nr_config_request_scf_t *msg) +static void test_copy(const nfapi_nr_config_request_scf_t *msg) { // Test copy function nfapi_nr_config_request_scf_t copy = {0}; @@ -272,16 +273,173 @@ void test_copy(const nfapi_nr_config_request_scf_t *msg) free_config_request(©); } -int main(int n, char *v[]) +static void test_config_req_rand(void) { - fapi_test_init(); nfapi_nr_config_request_scf_t req = {.header.message_id = NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST}; // Fill CONFIG.request TVLs - fill_config_request_tlv(&req); + fill_config_request_tlv_tdd_rand(&req); // Perform tests test_pack_unpack(&req); test_copy(&req); // All tests successful! free_config_request(&req); +} + +static void fill_config_request_tlv_fdd(nfapi_nr_config_request_scf_t *req) +{ + /* carrier config */ + FILL_TLV(req->carrier_config.dl_bandwidth, NFAPI_NR_CONFIG_DL_BANDWIDTH_TAG, 5); + req->num_tlv++; + FILL_TLV(req->carrier_config.dl_frequency, NFAPI_NR_CONFIG_DL_FREQUENCY_TAG, 2150430); + req->num_tlv++; + for (int i = 0; i < 5; ++i) + FILL_TLV(req->carrier_config.dl_k0[i], NFAPI_NR_CONFIG_DL_K0_TAG, 0); + // these 5 are 1 tlv + req->num_tlv++; + FILL_TLV(req->carrier_config.dl_grid_size[0], NFAPI_NR_CONFIG_DL_GRID_SIZE_TAG, 25); + for (int i = 1; i < 5; ++i) + FILL_TLV(req->carrier_config.dl_grid_size[i], NFAPI_NR_CONFIG_DL_GRID_SIZE_TAG, 0); + // these 5 are 1 tlv + req->num_tlv++; + FILL_TLV(req->carrier_config.num_tx_ant, NFAPI_NR_CONFIG_NUM_TX_ANT_TAG, 1); + req->num_tlv++; + FILL_TLV(req->carrier_config.uplink_bandwidth, NFAPI_NR_CONFIG_UPLINK_BANDWIDTH_TAG, 5); + req->num_tlv++; + FILL_TLV(req->carrier_config.uplink_frequency, NFAPI_NR_CONFIG_UPLINK_FREQUENCY_TAG, 1750430); + req->num_tlv++; + for (int i = 0; i < 5; ++i) + FILL_TLV(req->carrier_config.ul_k0[i], NFAPI_NR_CONFIG_UL_K0_TAG, 0); + // these 5 are 1 tlv + req->num_tlv++; + FILL_TLV(req->carrier_config.ul_grid_size[0], NFAPI_NR_CONFIG_UL_GRID_SIZE_TAG, 25); + for (int i = 0; i < 5; ++i) + FILL_TLV(req->carrier_config.ul_grid_size[i], NFAPI_NR_CONFIG_UL_GRID_SIZE_TAG, 0); + // these 5 are 1 tlv + req->num_tlv++; + FILL_TLV(req->carrier_config.num_rx_ant, NFAPI_NR_CONFIG_NUM_RX_ANT_TAG, 1); + req->num_tlv++; + FILL_TLV(req->carrier_config.frequency_shift_7p5khz, NFAPI_NR_CONFIG_FREQUENCY_SHIFT_7P5KHZ_TAG, 0); + req->num_tlv++; + + /* cell config */ + FILL_TLV(req->cell_config.phy_cell_id, NFAPI_NR_CONFIG_PHY_CELL_ID_TAG, 0); + req->num_tlv++; + FILL_TLV(req->cell_config.frame_duplex_type, NFAPI_NR_CONFIG_FRAME_DUPLEX_TYPE_TAG, 0 /* FDD */); + req->num_tlv++; + + /* SSB config */ + FILL_TLV(req->ssb_config.ss_pbch_power, NFAPI_NR_CONFIG_SS_PBCH_POWER_TAG, -25); + req->num_tlv++; + FILL_TLV(req->ssb_config.bch_payload, NFAPI_NR_CONFIG_BCH_PAYLOAD_TAG, 1 /* PHY generates timing bits */); + req->num_tlv++; + FILL_TLV(req->ssb_config.scs_common, NFAPI_NR_CONFIG_SCS_COMMON_TAG, 0 /* 15 kHz */); + req->num_tlv++; + + /* PRACH config */ + FILL_TLV(req->prach_config.prach_sequence_length, NFAPI_NR_CONFIG_PRACH_SEQUENCE_LENGTH_TAG, 1); + req->num_tlv++; + FILL_TLV(req->prach_config.prach_sub_c_spacing, NFAPI_NR_CONFIG_PRACH_SUB_C_SPACING_TAG, 0); + req->num_tlv++; + FILL_TLV(req->prach_config.restricted_set_config, NFAPI_NR_CONFIG_RESTRICTED_SET_CONFIG_TAG, 0); + req->num_tlv++; + FILL_TLV(req->prach_config.prach_ConfigurationIndex, NFAPI_NR_CONFIG_PRACH_CONFIG_INDEX_TAG, 98); + req->num_tlv++; + int num_prach = 1; + FILL_TLV(req->prach_config.num_prach_fd_occasions, NFAPI_NR_CONFIG_NUM_PRACH_FD_OCCASIONS_TAG, num_prach); + req->num_tlv++; + nfapi_nr_num_prach_fd_occasions_t *l = calloc(num_prach, sizeof(*l)); + req->prach_config.num_prach_fd_occasions_list = l; + FILL_TLV(l->prach_root_sequence_index, NFAPI_NR_CONFIG_PRACH_ROOT_SEQUENCE_INDEX_TAG, 1); + req->num_tlv++; + FILL_TLV(l->num_root_sequences, NFAPI_NR_CONFIG_NUM_ROOT_SEQUENCES_TAG, 16); + req->num_tlv++; + FILL_TLV(l->k1, NFAPI_NR_CONFIG_K1_TAG, 0); + req->num_tlv++; + FILL_TLV(l->prach_zero_corr_conf, NFAPI_NR_CONFIG_PRACH_ZERO_CORR_CONF_TAG, 13); + req->num_tlv++; + /* should be at least according to spec */ + FILL_TLV(l->num_unused_root_sequences, NFAPI_NR_CONFIG_NUM_UNUSED_ROOT_SEQUENCES_TAG, 0); + req->num_tlv++; + l->unused_root_sequences_list = NULL; + FILL_TLV(req->prach_config.ssb_per_rach, NFAPI_NR_CONFIG_SSB_PER_RACH_TAG, 3); + req->num_tlv++; + FILL_TLV(req->prach_config.prach_multiple_carriers_in_a_band, NFAPI_NR_CONFIG_PRACH_MULTIPLE_CARRIERS_IN_A_BAND_TAG, 0); + req->num_tlv++; + + /* SSB table */ + FILL_TLV(req->ssb_table.ssb_offset_point_a, NFAPI_NR_CONFIG_SSB_OFFSET_POINT_A_TAG, 4); + req->num_tlv++; + FILL_TLV(req->ssb_table.ssb_period, NFAPI_NR_CONFIG_SSB_PERIOD_TAG, 2); + req->num_tlv++; + FILL_TLV(req->ssb_table.ssb_subcarrier_offset, NFAPI_NR_CONFIG_SSB_SUBCARRIER_OFFSET_TAG, 0); + req->num_tlv++; + FILL_TLV(req->ssb_table.MIB, NFAPI_NR_CONFIG_MIB_TAG, 0); + req->num_tlv++; + + FILL_TLV(req->ssb_table.ssb_mask_list[0].ssb_mask, NFAPI_NR_CONFIG_SSB_MASK_TAG, 2147483648); + req->num_tlv++; + FILL_TLV(req->ssb_table.ssb_mask_list[1].ssb_mask, NFAPI_NR_CONFIG_SSB_MASK_TAG, 0); + req->num_tlv++; + for (int i = 0; i < 64; i++) { + FILL_TLV(req->ssb_table.ssb_beam_id_list[i].beam_id, NFAPI_NR_CONFIG_BEAM_ID_TAG, 0); + req->num_tlv++; + } + + /* NOTE: no TDD table! */ + + /* Measurement config rssi_measurement NULL -> not present */ + + /* nFAPI config */ + /* IPv4 address is 127.0.0.1 */ + req->nfapi_config.p7_vnf_address_ipv4.tl.tag = NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG; + req->nfapi_config.p7_vnf_address_ipv4.address[0] = 127; + req->nfapi_config.p7_vnf_address_ipv4.address[1] = 0; + req->nfapi_config.p7_vnf_address_ipv4.address[2] = 0; + req->nfapi_config.p7_vnf_address_ipv4.address[3] = 1; + req->num_tlv++; + /* no IPv6 address */ + FILL_TLV(req->nfapi_config.p7_vnf_port, NFAPI_NR_NFAPI_P7_VNF_PORT_TAG, 50011); + req->num_tlv++; + FILL_TLV(req->nfapi_config.timing_window, NFAPI_NR_NFAPI_TIMING_WINDOW_TAG, 30); + req->num_tlv++; + FILL_TLV(req->nfapi_config.timing_info_mode, NFAPI_NR_NFAPI_TIMING_INFO_MODE_TAG, 3); + req->num_tlv++; + FILL_TLV(req->nfapi_config.timing_info_period, NFAPI_NR_NFAPI_TIMING_INFO_PERIOD_TAG, 10); + req->num_tlv++; + FILL_TLV(req->nfapi_config.dl_tti_timing_offset, NFAPI_NR_NFAPI_DL_TTI_TIMING_OFFSET, 0); + req->num_tlv++; + FILL_TLV(req->nfapi_config.dl_tti_timing_offset, NFAPI_NR_NFAPI_UL_TTI_TIMING_OFFSET, 0); + req->num_tlv++; + FILL_TLV(req->nfapi_config.dl_tti_timing_offset, NFAPI_NR_NFAPI_UL_DCI_TIMING_OFFSET, 0); + req->num_tlv++; + FILL_TLV(req->nfapi_config.dl_tti_timing_offset, NFAPI_NR_NFAPI_TX_DATA_TIMING_OFFSET, 0); + req->num_tlv++; + + /* PMI list NULL */ + + /* Digital beamforming NULL */ + + /* Analog beamforming NULL */ + + //DevAssert(req->num_tlv == 103); +} + +static void test_config_req_fdd(void) +{ + nfapi_nr_config_request_scf_t req = {.header.phy_id = 1, .header.message_id = NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST}; + // Fill CONFIG.request TVLs + fill_config_request_tlv_fdd(&req); + // Perform tests + test_pack_unpack(&req); + test_copy(&req); + // All tests successful! + free_config_request(&req); +} + +int main(int n, char *v[]) +{ + fapi_test_init(); + test_config_req_rand(); + test_config_req_fdd(); return 0; } diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 1202774798..2484c0e800 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -93,7 +93,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, int frame, int slot) harq->unav_res = ptrsSymbPerSlot * n_ptrs; /// CRC, coding, interleaving and rate matching - AssertFatal(harq->pdu!=NULL,"harq->pdu is null\n"); + AssertFatal(harq->pdu != NULL, "%4d.%2d no HARQ PDU for PDSCH generation\n", msgTx->frame, msgTx->slot); /* output and its parts for each dlsch should be aligned on 64 bytes * => size_output is a sum of parts sizes rounded up to a multiple of 64 @@ -533,7 +533,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, int frame, int slot) int rb = 0; while(rb < rel15->rbSize) { //get pmi info - const int pmi = (pb->prg_size > 0) ? (pb->prgs_list[(int)rb / pb->prg_size].pm_idx) : 0; + const int pmi = (pb->num_prgs > 0 && pb->prg_size > 0) ? (pb->prgs_list[(int)rb / pb->prg_size].pm_idx) : 0; const int pmi2 = (rb < (rel15->rbSize - 1) && pb->prg_size > 0) ? (pb->prgs_list[(int)(rb+1)/pb->prg_size].pm_idx) : -1; // If pmi of next RB and pmi of current RB are the same, we do 2 RB in a row diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h index 53e0c17065..15f48825f5 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h @@ -35,9 +35,8 @@ #include "PHY/defs_gNB.h" -void nr_fill_dlsch(processingData_L1tx_t *msgTx, - nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu, - unsigned char *sdu); +void nr_fill_dlsch_dl_tti_req(processingData_L1tx_t *msgTx, nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu); +void nr_fill_dlsch_tx_req(processingData_L1tx_t *msgTx, int idx, uint8_t *sdu); void nr_generate_pdsch(processingData_L1tx_t *msgTx, int frame, @@ -57,8 +56,6 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB, time_stats_t *dlsch_interleaving_stats, time_stats_t *dlsch_segmentation_stats); -void nr_emulate_dlsch_payload(uint8_t* payload, uint16_t size); - void dump_pdsch_stats(FILE *fd,PHY_VARS_gNB *gNB); #endif diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index 33ecfb3737..76955fd259 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -66,7 +66,6 @@ void free_gNB_dlsch(NR_gNB_DLSCH_t *dlsch, uint16_t N_RB, const NR_DL_FRAME_PARM harq->c[r] = NULL; } free(harq->c); - free(harq->pdu); } NR_gNB_DLSCH_t new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms, uint16_t N_RB) @@ -87,10 +86,6 @@ NR_gNB_DLSCH_t new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms, uint16_t N_RB) bzero(harq, sizeof(NR_DL_gNB_HARQ_t)); harq->b = malloc16(dlsch_bytes); AssertFatal(harq->b, "cannot allocate memory for harq->b\n"); - harq->pdu = malloc16(dlsch_bytes); - AssertFatal(harq->pdu, "cannot allocate memory for harq->pdu\n"); - bzero(harq->pdu, dlsch_bytes); - nr_emulate_dlsch_payload(harq->pdu, (dlsch_bytes) >> 3); bzero(harq->b, dlsch_bytes); harq->c = (uint8_t **)malloc16(a_segments*sizeof(uint8_t *)); diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c index c868334a3c..0a3717ec70 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c @@ -36,21 +36,29 @@ extern void set_taus_seed(unsigned int seed_type); - -/// Payload emulation -void nr_emulate_dlsch_payload(uint8_t* pdu, uint16_t size) { - set_taus_seed(0); - for (int i=0; idlsch[msgTx->num_pdsch_slot][0]; NR_DL_gNB_HARQ_t *harq = &dlsch->harq_process; /// DLSCH struct memcpy((void*)&harq->pdsch_pdu, (void*)pdsch_pdu, sizeof(nfapi_nr_dl_tti_pdsch_pdu)); + AssertFatal(msgTx->num_pdsch_slot == pdsch_pdu->pdsch_pdu_rel15.pduIndex, + "PDSCH PDU index %d does not match msgTx index %d\n", + pdsch_pdu->pdsch_pdu_rel15.pduIndex, + msgTx->num_pdsch_slot); msgTx->num_pdsch_slot++; + harq->pdu = NULL; +} + +void nr_fill_dlsch_tx_req(processingData_L1tx_t *msgTx, int idx, uint8_t *sdu) +{ AssertFatal(sdu != NULL, "sdu is null\n"); + + /* not sure if FAPI could transmit DL_TTI_req and TX_req in different orders. + * for the moment, assume they are in the same order (and check!) */ + NR_gNB_DLSCH_t *dlsch = &msgTx->dlsch[idx][0]; + NR_DL_gNB_HARQ_t *harq = &dlsch->harq_process; + nfapi_nr_dl_tti_pdsch_pdu *pdsch = &harq->pdsch_pdu; + AssertFatal(pdsch->pdsch_pdu_rel15.pduIndex == idx, "PDSCH PDU index %d does not match %d\n", pdsch->pdsch_pdu_rel15.pduIndex, idx); harq->pdu = sdu; } diff --git a/openair1/PHY/NR_TRANSPORT/pucch_rx.c b/openair1/PHY/NR_TRANSPORT/pucch_rx.c index 435334a23e..2ec081d825 100644 --- a/openair1/PHY/NR_TRANSPORT/pucch_rx.c +++ b/openair1/PHY/NR_TRANSPORT/pucch_rx.c @@ -62,10 +62,6 @@ void nr_fill_pucch(PHY_VARS_gNB *gNB, int slot, nfapi_nr_pucch_pdu_t *pucch_pdu) { - - if (NFAPI_MODE == NFAPI_MODE_PNF) - gNB->pucch[0].active = false; // check if true in monolithic mode - bool found = false; for (int i = 0; i < gNB->max_nb_pucch; i++) { NR_gNB_PUCCH_t *pucch = &gNB->pucch[i]; diff --git a/openair1/PHY/impl_defs_top.h b/openair1/PHY/impl_defs_top.h index 27384532c5..178549e5cc 100644 --- a/openair1/PHY/impl_defs_top.h +++ b/openair1/PHY/impl_defs_top.h @@ -268,7 +268,6 @@ #if 1 #define NB_NUMEROLOGIES_NR (5) -#define TDD_CONFIG_NB_FRAMES (2) #define NR_MAX_SLOTS_PER_FRAME (160) /* number of slots per frame */ /* FFS_NR_TODO it defines ue capability which is the number of slots */ diff --git a/openair1/SCHED_NR/fapi_nr_l1.c b/openair1/SCHED_NR/fapi_nr_l1.c index 06747c9a2e..949011a6f5 100644 --- a/openair1/SCHED_NR/fapi_nr_l1.c +++ b/openair1/SCHED_NR/fapi_nr_l1.c @@ -66,44 +66,6 @@ void handle_nr_nfapi_ssb_pdu(processingData_L1tx_t *msgTx,int frame,int slot, } } -/*void handle_nr_nfapi_pdsch_pdu(PHY_VARS_gNB *gNB,int frame,int subframe,gNB_L1_rxtx_proc_t *proc, - uint8_t codeword_index, - uint8_t *sdu) -{ - - int UE_id = 0; //Hardcode UE_id for now - int harq_pid; - - NR_gNB_DLSCH_t *dlsch0=NULL, *dlsch1=NULL; - NR_DL_gNB_HARQ_t *dlsch0_harq=NULL,*dlsch1_harq=NULL; - - // Based on nr_fill_dci_and_dlsch only gNB->dlsch[0][0] gets filled now. So maybe we do not need dlsch1. - dlsch0 = gNB->dlsch[UE_id][0]; - dlsch1 = gNB->dlsch[UE_id][1]; - - harq_pid = dlsch0->harq_ids[subframe]; - dlsch0_harq = dlsch0->harq_processes[harq_pid]; - dlsch1_harq = dlsch1->harq_processes[harq_pid]; - - - //if (dlsch0_harq->round==0) { //get pointer to SDU if this a new SDU - if(sdu == NULL) { - LOG_E(PHY,"NFAPI: SFN/SF:%04d%d proc:TX:[frame %d subframe %d]: programming dlsch for round 0 \n", - frame,subframe, - proc->frame_tx,proc->slot_tx); - return; - } - //AssertFatal(sdu!=NULL,"NFAPI: SFN/SF:%04d%d proc:TX:[frame %d subframe %d]: programming dlsch for round 0, rnti %x, UE_id %d, harq_pid %d : sdu is null for pdu_index %d dlsch0_harq[round:%d SFN/SF:%d%d pdu:%p mcs:%d ndi:%d pdschstart:%d]\n", - // frame,subframe, - // proc->frame_tx,proc->subframe_tx,rel8->rnti,UE_id,harq_pid, - // dl_tti_pdu->pdsch_pdu.pdsch_pdu_rel8.pdu_index,dlsch0_harq->round,dlsch0_harq->frame,dlsch0_harq->subframe,dlsch0_harq->pdu,dlsch0_harq->mcs,dlsch0_harq->ndi,dlsch0_harq->pdsch_start); - if (codeword_index == 0) dlsch0_harq->pdu = sdu; - else dlsch1_harq->pdu = sdu; - LOG_I(PHY, "SFN/SF: %d/%d DLSCH PDU filled \n",frame, subframe); -// } - -}*/ - void handle_nfapi_nr_csirs_pdu(processingData_L1tx_t *msgTx, int frame, int slot, nfapi_nr_dl_tti_csi_rs_pdu *csirs_pdu) { int found = 0; @@ -122,165 +84,173 @@ void handle_nfapi_nr_csirs_pdu(processingData_L1tx_t *msgTx, int frame, int slot LOG_E(MAC,"CSI-RS list is full\n"); } -void handle_nr_nfapi_pdsch_pdu(processingData_L1tx_t *msgTx, - nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu, - uint8_t *sdu) +void nr_schedule_dl_tti_req(PHY_VARS_gNB *gNB, nfapi_nr_dl_tti_request_t *DL_req) { + DevAssert(gNB != NULL); + DevAssert(DL_req != NULL); + nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config; - nr_fill_dlsch(msgTx,pdsch_pdu,sdu); + int frame = DL_req->SFN; + int slot = DL_req->Slot; + int slot_type = nr_slot_select(cfg, frame, slot); + DevAssert(slot_type == NR_DOWNLINK_SLOT || slot_type == NR_MIXED_SLOT); + + processingData_L1tx_t *msgTx = gNB->msgDataTx; + msgTx->slot = slot; + msgTx->frame = frame; + + uint8_t number_dl_pdu = DL_req->dl_tti_request_body.nPDUs; + + for (int i = 0; i < number_dl_pdu; i++) { + nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdu = &DL_req->dl_tti_request_body.dl_tti_pdu_list[i]; + LOG_D(NR_PHY, "NFAPI: dl_pdu %d : type %d\n", i, dl_tti_pdu->PDUType); + switch (dl_tti_pdu->PDUType) { + case NFAPI_NR_DL_TTI_SSB_PDU_TYPE: + handle_nr_nfapi_ssb_pdu(msgTx, frame, slot, dl_tti_pdu); + break; + + case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE: + LOG_D(NR_PHY, "frame %d, slot %d, Got NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE for %d.%d\n", frame, slot, DL_req->SFN, DL_req->Slot); + msgTx->pdcch_pdu[msgTx->num_dl_pdcch] = dl_tti_pdu->pdcch_pdu; + msgTx->num_dl_pdcch++; + break; + + case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE: + LOG_D(NR_PHY, "frame %d, slot %d, Got NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE for %d.%d\n", frame, slot, DL_req->SFN, DL_req->Slot); + handle_nfapi_nr_csirs_pdu(msgTx, frame, slot, &dl_tti_pdu->csi_rs_pdu); + break; + + case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE: + LOG_D(NR_PHY, "frame %d, slot %d, Got NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE for %d.%d\n", frame, slot, DL_req->SFN, DL_req->Slot); + nr_fill_dlsch_dl_tti_req(msgTx, &dl_tti_pdu->pdsch_pdu); + } + } +} + +void nr_schedule_ul_tti_req(PHY_VARS_gNB *gNB, nfapi_nr_ul_tti_request_t *UL_tti_req) +{ + DevAssert(gNB != NULL); + DevAssert(UL_tti_req != NULL); + + int frame = UL_tti_req->SFN; + int slot = UL_tti_req->Slot; + + for (int i = 0; i < UL_tti_req->n_pdus; i++) { + switch (UL_tti_req->pdus_list[i].pdu_type) { + case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE: + LOG_D(NR_PHY, + "frame %d, slot %d, Got NFAPI_NR_UL_TTI_PUSCH_PDU_TYPE for %d.%d\n", + frame, + slot, + UL_tti_req->SFN, + UL_tti_req->Slot); + nr_fill_ulsch(gNB, UL_tti_req->SFN, UL_tti_req->Slot, &UL_tti_req->pdus_list[i].pusch_pdu); + break; + case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE: + LOG_D(NR_PHY, + "frame %d, slot %d, Got NFAPI_NR_UL_TTI_PUCCH_PDU_TYPE for %d.%d\n", + frame, + slot, + UL_tti_req->SFN, + UL_tti_req->Slot); + nr_fill_pucch(gNB, UL_tti_req->SFN, UL_tti_req->Slot, &UL_tti_req->pdus_list[i].pucch_pdu); + break; + case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE: + LOG_D(NR_PHY, + "frame %d, slot %d, Got NFAPI_NR_UL_TTI_PRACH_PDU_TYPE for %d.%d\n", + frame, + slot, + UL_tti_req->SFN, + UL_tti_req->Slot); + nfapi_nr_prach_pdu_t *prach_pdu = &UL_tti_req->pdus_list[i].prach_pdu; + nr_fill_prach(gNB, UL_tti_req->SFN, UL_tti_req->Slot, prach_pdu); + if (gNB->RU_list[0]->if_south == LOCAL_RF || gNB->RU_list[0]->if_south == REMOTE_IF5) + nr_fill_prach_ru(gNB->RU_list[0], UL_tti_req->SFN, UL_tti_req->Slot, prach_pdu); + break; + case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE: + LOG_D(NR_PHY, + "frame %d, slot %d, Got NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE for %d.%d\n", + frame, + slot, + UL_tti_req->SFN, + UL_tti_req->Slot); + nr_fill_srs(gNB, UL_tti_req->SFN, UL_tti_req->Slot, &UL_tti_req->pdus_list[i].srs_pdu); + break; + } + } +} + +void nr_schedule_tx_req(PHY_VARS_gNB *gNB, nfapi_nr_tx_data_request_t *TX_req) +{ + DevAssert(gNB != NULL); + DevAssert(TX_req != NULL); + processingData_L1tx_t *msgTx = gNB->msgDataTx; + + for (int idx = 0; idx < TX_req->Number_of_PDUs; ++idx) { + uint8_t *sdu = (uint8_t *)TX_req->pdu_list[idx].TLVs[0].value.direct; + nr_fill_dlsch_tx_req(msgTx, idx, sdu); + } +} + +void nr_schedule_ul_dci_req(PHY_VARS_gNB *gNB, nfapi_nr_ul_dci_request_t *UL_dci_req) +{ + DevAssert(gNB != NULL); + DevAssert(UL_dci_req != NULL); + processingData_L1tx_t *msgTx = gNB->msgDataTx; + + msgTx->num_ul_pdcch = UL_dci_req->numPdus; + for (int i = 0; i < UL_dci_req->numPdus; i++) + msgTx->ul_pdcch_pdu[i] = UL_dci_req->ul_dci_pdu_list[i]; } void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO) { // copy data from L2 interface into L1 structures - module_id_t Mod_id = Sched_INFO->module_id; - nfapi_nr_dl_tti_request_t *DL_req = &Sched_INFO->DL_req; - nfapi_nr_tx_data_request_t *TX_req = &Sched_INFO->TX_req; - nfapi_nr_ul_tti_request_t *UL_tti_req = &Sched_INFO->UL_tti_req; - nfapi_nr_ul_dci_request_t *UL_dci_req = &Sched_INFO->UL_dci_req; - frame_t frame = Sched_INFO->frame; - sub_frame_t slot = Sched_INFO->slot; + module_id_t Mod_id = Sched_INFO->module_id; + frame_t frame = Sched_INFO->frame; + sub_frame_t slot = Sched_INFO->slot; - AssertFatal(RC.gNB!=NULL,"RC.gNB is null\n"); - AssertFatal(RC.gNB[Mod_id]!=NULL,"RC.gNB[%d] is null\n",Mod_id); + AssertFatal(RC.gNB != NULL, "RC.gNB is null\n"); + AssertFatal(RC.gNB[Mod_id] != NULL, "RC.gNB[%d] is null\n", Mod_id); PHY_VARS_gNB *gNB = RC.gNB[Mod_id]; start_meas(&gNB->schedule_response_stats); nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config; - int slot_type = nr_slot_select(cfg,frame,slot); - - uint8_t number_dl_pdu = (DL_req==NULL) ? 0 : DL_req->dl_tti_request_body.nPDUs; - uint8_t number_ul_dci_pdu = (UL_dci_req==NULL) ? 0 : UL_dci_req->numPdus; - uint8_t number_ul_tti_pdu = (UL_tti_req==NULL) ? 0 : UL_tti_req->n_pdus; - uint8_t number_tx_data_pdu = (TX_req == NULL) ? 0 : TX_req->Number_of_PDUs; + int slot_type = nr_slot_select(cfg, frame, slot); clear_slot_beamid(gNB, slot); // reset beam_id information for the slot to be processed + DevAssert(NFAPI_MODE == NFAPI_MONOLITHIC); + bool is_dl = slot_type == NR_DOWNLINK_SLOT || slot_type == NR_MIXED_SLOT; - if (NFAPI_MODE == NFAPI_MONOLITHIC) { - if (slot_type == NR_DOWNLINK_SLOT || slot_type == NR_MIXED_SLOT) { - processingData_L1tx_t *msgTx = gNB->msgDataTx; - msgTx->num_pdsch_slot = 0; - msgTx->num_dl_pdcch = 0; - msgTx->num_ul_pdcch = number_ul_dci_pdu; - msgTx->slot = slot; - msgTx->frame = frame; - /* store the sched_response_id for the TX thread to release it when done */ - msgTx->sched_response_id = Sched_INFO->sched_response_id; + processingData_L1tx_t *msgTx = gNB->msgDataTx; + /* store the sched_response_id for the TX thread to release it when done */ + msgTx->sched_response_id = Sched_INFO->sched_response_id; - for (int i=0;idl_tti_request_body.dl_tti_pdu_list[i]; - LOG_D(NR_PHY,"NFAPI: dl_pdu %d : type %d\n",i,dl_tti_pdu->PDUType); - switch (dl_tti_pdu->PDUType) { - case NFAPI_NR_DL_TTI_SSB_PDU_TYPE: - handle_nr_nfapi_ssb_pdu(msgTx,frame,slot, - dl_tti_pdu); - break; + DevAssert(Sched_INFO->DL_req.SFN == frame); + DevAssert(Sched_INFO->DL_req.Slot == slot); - case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE: - LOG_D(NR_PHY,"frame %d, slot %d, Got NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE for %d.%d\n",frame,slot,DL_req->SFN,DL_req->Slot); - msgTx->pdcch_pdu[msgTx->num_dl_pdcch] = dl_tti_pdu->pdcch_pdu; - msgTx->num_dl_pdcch++; - break; - - case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE: - LOG_D(NR_PHY,"frame %d, slot %d, Got NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE for %d.%d\n",frame,slot,DL_req->SFN,DL_req->Slot); - handle_nfapi_nr_csirs_pdu(msgTx,frame,slot,&dl_tti_pdu->csi_rs_pdu); - break; - - case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE: - LOG_D(NR_PHY,"frame %d, slot %d, Got NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE for %d.%d\n",frame,slot,DL_req->SFN,DL_req->Slot); - nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdu->pdsch_pdu.pdsch_pdu_rel15; - uint16_t pduIndex = pdsch_pdu_rel15->pduIndex; - AssertFatal(TX_req->pdu_list[pduIndex].num_TLV == 1, "TX_req->pdu_list[%d].num_TLV %d != 1\n", - pduIndex,TX_req->pdu_list[pduIndex].num_TLV); - uint8_t *sdu = (uint8_t *)TX_req->pdu_list[pduIndex].TLVs[0].value.direct; - AssertFatal(msgTx->num_pdsch_slot < gNB->max_nb_pdsch, - "Number of PDSCH PDUs %d exceeded the limit %d\n", - msgTx->num_pdsch_slot, - gNB->max_nb_pdsch); - handle_nr_nfapi_pdsch_pdu(msgTx,&dl_tti_pdu->pdsch_pdu, sdu); - } - } - - for (int i=0; iul_pdcch_pdu[i] = UL_dci_req->ul_dci_pdu_list[i]; - - /* Both the current thread and the TX thread will access the sched_info - * at the same time, so increase its reference counter, so that it is - * released only when both threads are done with it. - */ - inc_ref_sched_response(Sched_INFO->sched_response_id); - } - - for (int i = 0; i < number_ul_tti_pdu; i++) { - switch (UL_tti_req->pdus_list[i].pdu_type) { - case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE: - LOG_D(NR_PHY,"frame %d, slot %d, Got NFAPI_NR_UL_TTI_PUSCH_PDU_TYPE for %d.%d\n", frame, slot, UL_tti_req->SFN, UL_tti_req->Slot); - nr_fill_ulsch(gNB,UL_tti_req->SFN, UL_tti_req->Slot, &UL_tti_req->pdus_list[i].pusch_pdu); - break; - case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE: - LOG_D(NR_PHY,"frame %d, slot %d, Got NFAPI_NR_UL_TTI_PUCCH_PDU_TYPE for %d.%d\n", frame, slot, UL_tti_req->SFN, UL_tti_req->Slot); - nr_fill_pucch(gNB,UL_tti_req->SFN, UL_tti_req->Slot, &UL_tti_req->pdus_list[i].pucch_pdu); - break; - case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE: - LOG_D(NR_PHY,"frame %d, slot %d, Got NFAPI_NR_UL_TTI_PRACH_PDU_TYPE for %d.%d\n", frame, slot, UL_tti_req->SFN, UL_tti_req->Slot); - nfapi_nr_prach_pdu_t *prach_pdu = &UL_tti_req->pdus_list[i].prach_pdu; - nr_fill_prach(gNB, UL_tti_req->SFN, UL_tti_req->Slot, prach_pdu); - if (gNB->RU_list[0]->if_south == LOCAL_RF || gNB->RU_list[0]->if_south == REMOTE_IF5) - nr_fill_prach_ru(gNB->RU_list[0], UL_tti_req->SFN, UL_tti_req->Slot, prach_pdu); - break; - case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE: - LOG_D(NR_PHY,"frame %d, slot %d, Got NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE for %d.%d\n", frame, slot, UL_tti_req->SFN, UL_tti_req->Slot); - nr_fill_srs(gNB,UL_tti_req->SFN, UL_tti_req->Slot, &UL_tti_req->pdus_list[i].srs_pdu); - break; - } - } + if (is_dl) { + nr_schedule_dl_tti_req(gNB, &Sched_INFO->DL_req); } - if (NFAPI_MODE == NFAPI_MODE_VNF) { // If VNF, oai_nfapi functions send respective p7 msgs to PNF for which nPDUs > 0 + nr_schedule_ul_tti_req(gNB, &Sched_INFO->UL_tti_req); - if (number_ul_tti_pdu > 0) - oai_nfapi_ul_tti_req(UL_tti_req); + if (is_dl) { + nr_schedule_tx_req(gNB, &Sched_INFO->TX_req); - if (number_ul_dci_pdu > 0) - oai_nfapi_ul_dci_req(UL_dci_req); - - if (number_dl_pdu > 0) - oai_nfapi_dl_tti_req(DL_req); - - if (number_tx_data_pdu > 0) - oai_nfapi_tx_data_req(TX_req); - - } else if (NFAPI_MODE == NFAPI_MODE_AERIAL) { -#ifdef ENABLE_AERIAL - bool send_slt_resp = false; - if (number_dl_pdu > 0) { - oai_fapi_dl_tti_req(DL_req); - send_slt_resp = true; - } - if (number_ul_tti_pdu > 0) { - oai_fapi_ul_tti_req(UL_tti_req); - send_slt_resp = true; - } - if (number_tx_data_pdu > 0) { - oai_fapi_tx_data_req(TX_req); - send_slt_resp = true; - } - if (number_ul_dci_pdu > 0) { - oai_fapi_ul_dci_req(UL_dci_req); - send_slt_resp = true; - } - if (send_slt_resp) { - oai_fapi_send_end_request(0,frame,slot); - } -#endif + nr_schedule_ul_dci_req(gNB, &Sched_INFO->UL_dci_req); + /* Both the current thread and the TX thread will access the sched_info + * at the same time, so increase its reference counter, so that it is + * released only when both threads are done with it. + */ + inc_ref_sched_response(Sched_INFO->sched_response_id); } /* this thread is done with the sched_info, decrease the reference counter */ - if (slot_type == NR_DOWNLINK_SLOT || slot_type == NR_MIXED_SLOT) { + if ((slot_type == NR_DOWNLINK_SLOT || slot_type == NR_MIXED_SLOT) && NFAPI_MODE == NFAPI_MONOLITHIC) { LOG_D(NR_PHY, "Calling dref_sched_response for id %d in %d.%d (sched_response)\n", Sched_INFO->sched_response_id, frame, slot); deref_sched_response(Sched_INFO->sched_response_id); } diff --git a/openair1/SCHED_NR/phy_frame_config_nr.c b/openair1/SCHED_NR/phy_frame_config_nr.c index da7cc26e1a..ad672bccb8 100644 --- a/openair1/SCHED_NR/phy_frame_config_nr.c +++ b/openair1/SCHED_NR/phy_frame_config_nr.c @@ -67,96 +67,84 @@ int set_tdd_config_nr(nfapi_nr_config_request_scf_t *cfg, int nrofUplinkSlots, int nrofUplinkSymbols) { - int slot_number = 0; int nb_periods_per_frame = get_nb_periods_per_frame(cfg->tdd_table.tdd_period.value); - int nb_slots_to_set = TDD_CONFIG_NB_FRAMES*(1<tdd_table.max_tdd_periodicity_list = (nfapi_nr_max_tdd_periodicity_t *) malloc(nb_slots_to_set*sizeof(nfapi_nr_max_tdd_periodicity_t)); + cfg->tdd_table.max_tdd_periodicity_list = calloc(nb_slots_to_set, sizeof(nfapi_nr_max_tdd_periodicity_t)); - for(int memory_alloc =0 ; memory_alloctdd_table.max_tdd_periodicity_list[memory_alloc].max_num_of_symbol_per_slot_list = (nfapi_nr_max_num_of_symbol_per_slot_t *) malloc(NR_NUMBER_OF_SYMBOLS_PER_SLOT*sizeof( - nfapi_nr_max_num_of_symbol_per_slot_t)); + for (int slot = 0; slot < nb_slots_to_set; slot++) { + nfapi_nr_max_tdd_periodicity_t *p_list = &cfg->tdd_table.max_tdd_periodicity_list[slot]; + p_list->max_num_of_symbol_per_slot_list = + calloc(NR_NUMBER_OF_SYMBOLS_PER_SLOT, sizeof(*p_list->max_num_of_symbol_per_slot_list)); + for (int sym = 0; sym < NR_NUMBER_OF_SYMBOLS_PER_SLOT; sym++) { + // for each symbol, assign the TLV tag for usage when packing + p_list->max_num_of_symbol_per_slot_list[sym].slot_config.tl.tag = NFAPI_NR_CONFIG_SLOT_CONFIG_TAG; + } + } - while(slot_number != nb_slots_to_set) { - if(nrofDownlinkSlots != 0) { - for (int number_of_symbol = 0; number_of_symbol < nrofDownlinkSlots*NR_NUMBER_OF_SYMBOLS_PER_SLOT; number_of_symbol++) { - cfg->tdd_table.max_tdd_periodicity_list[slot_number].max_num_of_symbol_per_slot_list[number_of_symbol%NR_NUMBER_OF_SYMBOLS_PER_SLOT].slot_config.value= 0; + while (slot_number != nb_slots_to_set) { + if (nrofDownlinkSlots != 0) { + for (int sym = 0; sym < nrofDownlinkSlots * NR_NUMBER_OF_SYMBOLS_PER_SLOT; sym++) { + cfg->tdd_table.max_tdd_periodicity_list[slot_number] + .max_num_of_symbol_per_slot_list[sym % NR_NUMBER_OF_SYMBOLS_PER_SLOT] + .slot_config.value = 0; - if((number_of_symbol+1)%NR_NUMBER_OF_SYMBOLS_PER_SLOT == 0) + if ((sym + 1) % NR_NUMBER_OF_SYMBOLS_PER_SLOT == 0) slot_number++; } } if (nrofDownlinkSymbols != 0 || nrofUplinkSymbols != 0) { - for(int number_of_symbol =0; number_of_symbol < nrofDownlinkSymbols; number_of_symbol++) { - cfg->tdd_table.max_tdd_periodicity_list[slot_number].max_num_of_symbol_per_slot_list[number_of_symbol].slot_config.value= 0; + for (int sym = 0; sym < nrofDownlinkSymbols; sym++) { + cfg->tdd_table.max_tdd_periodicity_list[slot_number].max_num_of_symbol_per_slot_list[sym].slot_config.value = 0; } - for(int number_of_symbol = nrofDownlinkSymbols; number_of_symbol < NR_NUMBER_OF_SYMBOLS_PER_SLOT-nrofUplinkSymbols; number_of_symbol++) { - cfg->tdd_table.max_tdd_periodicity_list[slot_number].max_num_of_symbol_per_slot_list[number_of_symbol].slot_config.value= 2; + for (int sym = nrofDownlinkSymbols; sym < NR_NUMBER_OF_SYMBOLS_PER_SLOT - nrofUplinkSymbols; sym++) { + cfg->tdd_table.max_tdd_periodicity_list[slot_number].max_num_of_symbol_per_slot_list[sym].slot_config.value = 2; } - for(int number_of_symbol = NR_NUMBER_OF_SYMBOLS_PER_SLOT-nrofUplinkSymbols; number_of_symbol < NR_NUMBER_OF_SYMBOLS_PER_SLOT; number_of_symbol++) { - cfg->tdd_table.max_tdd_periodicity_list[slot_number].max_num_of_symbol_per_slot_list[number_of_symbol].slot_config.value= 1; + for (int sym = NR_NUMBER_OF_SYMBOLS_PER_SLOT - nrofUplinkSymbols; sym < NR_NUMBER_OF_SYMBOLS_PER_SLOT; sym++) { + cfg->tdd_table.max_tdd_periodicity_list[slot_number].max_num_of_symbol_per_slot_list[sym].slot_config.value = 1; } slot_number++; } - if(nrofUplinkSlots != 0) { - for (int number_of_symbol = 0; number_of_symbol < nrofUplinkSlots*NR_NUMBER_OF_SYMBOLS_PER_SLOT; number_of_symbol++) { - cfg->tdd_table.max_tdd_periodicity_list[slot_number].max_num_of_symbol_per_slot_list[number_of_symbol%NR_NUMBER_OF_SYMBOLS_PER_SLOT].slot_config.value= 1; + if (nrofUplinkSlots != 0) { + for (int sym = 0; sym < nrofUplinkSlots * NR_NUMBER_OF_SYMBOLS_PER_SLOT; sym++) { + cfg->tdd_table.max_tdd_periodicity_list[slot_number] + .max_num_of_symbol_per_slot_list[sym % NR_NUMBER_OF_SYMBOLS_PER_SLOT] + .slot_config.value = 1; - if((number_of_symbol+1)%NR_NUMBER_OF_SYMBOLS_PER_SLOT == 0) + if ((sym + 1) % NR_NUMBER_OF_SYMBOLS_PER_SLOT == 0) slot_number++; } } } - /* - while(slot_number != nb_slots_to_set) { - for (int number_of_slot = 0; number_of_slot < nrofDownlinkSlots; number_of_slot++) { - frame_parms->tdd_uplink_nr[slot_number] = NR_TDD_DOWNLINK_SLOT; - printf("slot %d set as downlink\n",slot_number); - slot_number++; - } - - if (nrofDownlinkSymbols != 0 || nrofUplinkSymbols != 0) { - frame_parms->tdd_uplink_nr[slot_number] = (1<tdd_uplink_nr[slot_number] = NR_TDD_UPLINK_SLOT; - printf("slot %d set as uplink\n",slot_number); - slot_number++; - } - - if (p_tdd_ul_dl_configuration->nrofUplinkSymbols != 0) { - LOG_E(PHY,"set_tdd_configuration_nr: uplink symbol for slot is not supported for tdd configuration \n"); - return (-1); - } - } - - if (frame_parms->p_tdd_UL_DL_ConfigurationCommon2 != NULL) { - LOG_E(PHY,"set_tdd_configuration_nr: additionnal tdd configuration 2 is not supported for tdd configuration \n"); - return (-1); - }*/ return (nb_periods_per_frame); } @@ -230,7 +218,7 @@ int set_tdd_configuration_dedicated_nr(NR_DL_FRAME_PARMS *frame_parms) { while(p_current_TDD_UL_DL_SlotConfig != NULL) { int slot_index = p_current_TDD_UL_DL_SlotConfig->slotIndex; - if (slot_index < TDD_CONFIG_NB_FRAMES * frame_parms->slots_per_frame) { + if (slot_index < frame_parms->slots_per_frame) { if (p_current_TDD_UL_DL_SlotConfig->nrofDownlinkSymbols != 0) { if (p_current_TDD_UL_DL_SlotConfig->nrofDownlinkSymbols == NR_TDD_SET_ALL_SYMBOLS) { if (p_current_TDD_UL_DL_SlotConfig->nrofUplinkSymbols == 0) { @@ -301,62 +289,39 @@ int get_next_downlink_slot(PHY_VARS_gNB *gNB, nfapi_nr_config_request_scf_t *cfg } } -int nr_slot_select(nfapi_nr_config_request_scf_t *cfg, int nr_frame, int nr_slot) { +int nr_slot_select(nfapi_nr_config_request_scf_t *cfg, int nr_frame, int nr_slot) +{ + (void) nr_frame; + /* for FFD all slot can be considered as an uplink */ - int mu = cfg->ssb_config.scs_common.value,check_slot=0; + int check_slot = 0; if (cfg->cell_config.frame_duplex_type.value == FDD) { - return (NR_UPLINK_SLOT | NR_DOWNLINK_SLOT ); + return (NR_UPLINK_SLOT | NR_DOWNLINK_SLOT); } - if (nr_frame%2 == 0) { - for(int symbol_count=0; symbol_counttdd_table.max_tdd_periodicity_list[nr_slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value==1) { - check_slot++; - } + for (int symbol_count = 0; symbol_count < NR_NUMBER_OF_SYMBOLS_PER_SLOT; symbol_count++) { + if (cfg->tdd_table.max_tdd_periodicity_list[nr_slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value == 1) { + check_slot++; } + } - if(check_slot == NR_NUMBER_OF_SYMBOLS_PER_SLOT) { - return (NR_UPLINK_SLOT); + if (check_slot == NR_NUMBER_OF_SYMBOLS_PER_SLOT) { + return (NR_UPLINK_SLOT); + } + + check_slot = 0; + + for (int symbol_count = 0; symbol_count < NR_NUMBER_OF_SYMBOLS_PER_SLOT; symbol_count++) { + if (cfg->tdd_table.max_tdd_periodicity_list[nr_slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value == 0) { + check_slot++; } + } - check_slot = 0; - - for(int symbol_count=0; symbol_counttdd_table.max_tdd_periodicity_list[nr_slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value==0) { - check_slot++; - } - } - - if(check_slot == NR_NUMBER_OF_SYMBOLS_PER_SLOT) { - return (NR_DOWNLINK_SLOT); - } else { - return (NR_MIXED_SLOT); - } + if (check_slot == NR_NUMBER_OF_SYMBOLS_PER_SLOT) { + return (NR_DOWNLINK_SLOT); } else { - for(int symbol_count=0; symbol_counttdd_table.max_tdd_periodicity_list[((1<tdd_table.max_tdd_periodicity_list[((1<num_dl_pdcch = 0; + msgTx->num_ul_pdcch = 0; if (msgTx->num_pdsch_slot > 0) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GENERATE_DLSCH,1); @@ -249,6 +251,7 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx, nr_generate_pdsch(msgTx, frame, slot); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GENERATE_DLSCH,0); } + msgTx->num_pdsch_slot = 0; for (int i = 0; i < NR_SYMBOLS_PER_SLOT; i++){ NR_gNB_CSIRS_t *csirs = &msgTx->csirs_pdu[i]; @@ -730,8 +733,6 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, N for (int i = 0; i < gNB->max_nb_pucch; i++) { NR_gNB_PUCCH_t *pucch = &gNB->pucch[i]; if (pucch) { - if (NFAPI_MODE == NFAPI_MODE_PNF) - pucch->frame = frame_rx; if (pucch->active && (pucch->frame == frame_rx) && (pucch->slot == slot_rx)) { c16_t **rxdataF = gNB->common_vars.rxdataF[pucch->beam_nb]; pucch_decode_done = 1; diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c index c6a477a8ee..6dffd4ad8c 100644 --- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c +++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c @@ -178,10 +178,11 @@ int8_t nr_ue_scheduled_response_stub(nr_scheduled_response_t *scheduled_response crc_ind->crc_list[j].tb_crc_status = 0; crc_ind->crc_list[j].timing_advance = 31; crc_ind->crc_list[j].ul_cqi = 255; - AssertFatal(mac->nr_ue_emul_l1.harq[crc_ind->crc_list[j].harq_id].active_ul_harq_sfn_slot == -1, + emul_l1_harq_t *harq = &mac->nr_ue_emul_l1.harq[crc_ind->crc_list[j].harq_id]; + AssertFatal(harq->active_ul_harq_sfn == -1 && harq->active_ul_harq_slot == -1, "We did not send an active CRC when we should have!\n"); - mac->nr_ue_emul_l1.harq[crc_ind->crc_list[j].harq_id].active_ul_harq_sfn_slot = - NFAPI_SFNSLOT2HEX(crc_ind->sfn, crc_ind->slot); + harq->active_ul_harq_sfn = crc_ind->sfn; + harq->active_ul_harq_slot = crc_ind->slot; LOG_D(NR_MAC, "This is sched sfn/sl [%d %d] and crc sfn/sl [%d %d] with mcs_index in ul_cqi -> %d\n", frame, diff --git a/openair1/SIMULATION/NR_PHY/dlschsim.c b/openair1/SIMULATION/NR_PHY/dlschsim.c index 4062077ab7..4b3a128211 100644 --- a/openair1/SIMULATION/NR_PHY/dlschsim.c +++ b/openair1/SIMULATION/NR_PHY/dlschsim.c @@ -497,7 +497,8 @@ int main(int argc, char **argv) dlsch0_ue->dlsch_config.tbslbrm = Tbslbrm; printf("harq process ue mcs = %d Qm = %d, symb %d\n", dlsch0_ue->dlsch_config.mcs, dlsch0_ue->dlsch_config.qamModOrder, nb_symb_sch); - unsigned char *test_input=dlsch->harq_process.pdu; + uint8_t test_input[TBS / 8 + 4]; // + 3 for CRC + 1 additional byte, see nr_dlsch_encoding() + dlsch->harq_process.pdu = test_input; //unsigned char test_input[TBS / 8] __attribute__ ((aligned(16))); for (i = 0; i < TBS / 8; i++) test_input[i] = (unsigned char) rand(); @@ -656,7 +657,7 @@ int main(int argc, char **argv) reset_DLSCH_struct(gNB, &msgDataTx); - int nb_slots_to_set = TDD_CONFIG_NB_FRAMES * (1 << mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME; + int nb_slots_to_set = (1 << mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME; for (int i = 0; i < nb_slots_to_set; ++i) free(gNB->gNB_config.tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list); free(gNB->gNB_config.tdd_table.max_tdd_periodicity_list); diff --git a/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c b/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c index ba5c2bf025..d55322156b 100644 --- a/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c +++ b/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c @@ -15,6 +15,8 @@ int oai_nfapi_nr_uci_indication(nfapi_nr_uci_indication_t *ind) { return (0); } int oai_nfapi_nr_rach_indication(nfapi_nr_rach_indication_t *ind) { return (0); } int oai_nfapi_nr_rx_data_indication(nfapi_nr_rx_data_indication_t *ind) { return 0; } +void handle_nr_slot_ind(uint16_t sfn, uint16_t slot) { } + int pack_nr_srs_beamforming_report(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen) { return 0; } int unpack_nr_srs_beamforming_report(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen) { return 0; } int pack_nr_srs_normalized_channel_iq_matrix(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen) { return 0; } diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index b6d92b9b81..b77b4ad786 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -782,7 +782,7 @@ int main(int argc, char **argv) free_channel_desc_scm(gNB2UE); - int nb_slots_to_set = TDD_CONFIG_NB_FRAMES * (1 << mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME; + int nb_slots_to_set = (1 << mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME; for (int i = 0; i < nb_slots_to_set; ++i) free(gNB->gNB_config.tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list); free(gNB->gNB_config.tdd_table.max_tdd_periodicity_list); diff --git a/openair1/SIMULATION/NR_PHY/prachsim.c b/openair1/SIMULATION/NR_PHY/prachsim.c index b5318f3ea6..db3631276c 100644 --- a/openair1/SIMULATION/NR_PHY/prachsim.c +++ b/openair1/SIMULATION/NR_PHY/prachsim.c @@ -824,7 +824,7 @@ int main(int argc, char **argv){ phy_free_nr_gNB(gNB); // allocated in set_tdd_config_nr() - int nb_slots_to_set = TDD_CONFIG_NB_FRAMES*(1<gNB_config.prach_config.num_prach_fd_occasions_list); for (int i = 0; i < nb_slots_to_set; ++i) free(gNB->gNB_config.tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list); diff --git a/openair1/SIMULATION/NR_PHY/pucchsim.c b/openair1/SIMULATION/NR_PHY/pucchsim.c index ab73a13626..62aa21f5f7 100644 --- a/openair1/SIMULATION/NR_PHY/pucchsim.c +++ b/openair1/SIMULATION/NR_PHY/pucchsim.c @@ -762,7 +762,7 @@ int main(int argc, char **argv) free_channel_desc_scm(UE2gNB); term_freq_channel(); - int nb_slots_to_set = TDD_CONFIG_NB_FRAMES * (1 << mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME; + int nb_slots_to_set = (1 << mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME; for (int i = 0; i < nb_slots_to_set; ++i) free(gNB->gNB_config.tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list); free(gNB->gNB_config.tdd_table.max_tdd_periodicity_list); diff --git a/openair1/SIMULATION/NR_PHY/ulschsim.c b/openair1/SIMULATION/NR_PHY/ulschsim.c index 12c3551566..19f48c5d3c 100644 --- a/openair1/SIMULATION/NR_PHY/ulschsim.c +++ b/openair1/SIMULATION/NR_PHY/ulschsim.c @@ -598,7 +598,7 @@ int main(int argc, char **argv) free_nr_ue_ul_harq(UE->ul_harq_processes, NR_MAX_ULSCH_HARQ_PROCESSES, UE->frame_parms.N_RB_UL, UE->frame_parms.nb_antennas_tx); - int nb_slots_to_set = TDD_CONFIG_NB_FRAMES * (1 << mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME; + int nb_slots_to_set = (1 << mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME; for (int i = 0; i < nb_slots_to_set; ++i) free(gNB->gNB_config.tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list); free(gNB->gNB_config.tdd_table.max_tdd_periodicity_list); diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/frame_config_test.c b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/frame_config_test.c index 093bb2d000..6e0f78d3ab 100644 --- a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/frame_config_test.c +++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/frame_config_test.c @@ -54,9 +54,9 @@ void display_frame_configuration(NR_DL_FRAME_PARMS *frame_parms) { printf("\nTdd configuration tti %d downlink %d uplink %d period %d \n", frame_parms->slots_per_subframe, frame_parms->p_tdd_UL_DL_Configuration->nrofDownlinkSlots, frame_parms->p_tdd_UL_DL_Configuration->nrofUplinkSlots, frame_parms->p_tdd_UL_DL_Configuration->dl_UL_TransmissionPeriodicity); - int k = (TDD_CONFIG_NB_FRAMES * NR_NUMBER_OF_SUBFRAMES_PER_FRAME) - 1; //19; + int k = NR_NUMBER_OF_SUBFRAMES_PER_FRAME - 1; int tti = 0; - for (int j = 0; j < TDD_CONFIG_NB_FRAMES * frame_parms->slots_per_frame; j++) { + for (int j = 0; j < frame_parms->slots_per_frame; j++) { int frame = 0; if (j != 0) { frame = j / frame_parms->slots_per_frame; @@ -81,7 +81,7 @@ void display_frame_configuration(NR_DL_FRAME_PARMS *frame_parms) { } if (j == k) { printf("\n"); - k += (TDD_CONFIG_NB_FRAMES * NR_NUMBER_OF_SUBFRAMES_PER_FRAME); // 20 + k += NR_NUMBER_OF_SUBFRAMES_PER_FRAME; } } printf("\n"); diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index baeca1aa72..39c8014adc 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -2202,7 +2202,7 @@ void NRRCConfig(void) // Set num of gNBs instances RC.nb_nr_inst = GNBSParams[GNB_ACTIVE_GNBS_IDX].numelt; - AssertFatal(RC.nb_nr_inst == NUMBER_OF_gNB_MAX, + AssertFatal(RC.nb_nr_inst <= NUMBER_OF_gNB_MAX, "Configuration error: RC.nb_nr_inst (%d) must equal NUMBER_OF_gNB_MAX (%d).\n" "Currently, only one instance of each layer (L1, L2, L3) is supported.\n" "Ensure that nb_nr_inst matches the maximum allowed gNB instances in this configuration.", diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h index 6d78d6616a..143d4623d7 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h @@ -325,7 +325,8 @@ typedef struct { NRUE MAC layer already does in get_downlink_ack(). */ int active_dl_harq_sfn; int active_dl_harq_slot; - int active_ul_harq_sfn_slot; + int active_ul_harq_sfn; + int active_ul_harq_slot; bool active; } emul_l1_harq_t; diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue_sl.c b/openair2/LAYER2/NR_MAC_UE/config_ue_sl.c index babdd96f10..58db78ea83 100644 --- a/openair2/LAYER2/NR_MAC_UE/config_ue_sl.c +++ b/openair2/LAYER2/NR_MAC_UE/config_ue_sl.c @@ -43,7 +43,7 @@ void sl_ue_mac_free(NR_UE_MAC_INST_t *mac) // @todo: maybe this should be done by phy if (tdd_list) { int mu = sl_config->sl_bwp_config.sl_scs; - int nb_slots_to_set = TDD_CONFIG_NB_FRAMES*(1<nr_ue_emul_l1.active_uci_sfn_slot = NFAPI_SFNSLOT2HEX(frameP, slotP); + DevAssert(mac->current_DL_BWP != NULL); + int mu = mac->current_DL_BWP->scs; + mac->nr_ue_emul_l1.active_uci_sfn_slot = NFAPI_SFNSLOT2DEC(mu, frameP, slotP); int ret = nr_ue_configure_pucch(mac, slotP, frameP, diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c index 9c69c2660c..fb239c48e4 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c @@ -731,7 +731,8 @@ void schedule_nr_sib1(module_id_t module_idP, nfapi_nr_dl_tti_request_body_t *dl_req = &DL_req->dl_tti_request_body; int pdu_index = gNB_mac->pdu_index[0]++; - nr_fill_nfapi_dl_SIB_pdu(module_idP, + LOG_D(NR_MAC, "%s() %4d.%2d\n", __func__, frameP, slotP); + nr_fill_nfapi_dl_SIB_pdu(module_idP, NULL, gNB_mac->sched_ctrlCommon, dl_req, diff --git a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c index 1ef2365573..f23460c994 100644 --- a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c @@ -73,34 +73,26 @@ static void handle_nr_rach(NR_UL_IND_t *UL_info) return; } if (UL_info->rach_ind.number_of_pdus) { - int frame_diff = UL_info->frame - UL_info->rach_ind.sfn; - if (frame_diff < 0) { - frame_diff += 1024; - } - bool in_timewindow = frame_diff == 0 || (frame_diff == 1 && UL_info->slot < 7); - - if (in_timewindow) { - LOG_D(MAC, - "UL_info[Frame %d, Slot %d] Calling initiate_ra_proc RACH:SFN/SLOT:%d/%d\n", - UL_info->frame, - UL_info->slot, - UL_info->rach_ind.sfn, - UL_info->rach_ind.slot); - for (int i = 0; i < UL_info->rach_ind.number_of_pdus; i++) { - nfapi_nr_prach_indication_pdu_t *rach = UL_info->rach_ind.pdu_list + i; - if (rach->num_preamble > 1) { - LOG_E(MAC, "Not more than 1 preamble per RACH PDU supported, ignoring the rest\n"); - } - nr_initiate_ra_proc(UL_info->module_id, - UL_info->CC_id, - UL_info->rach_ind.sfn, - UL_info->rach_ind.slot, - rach->preamble_list[0].preamble_index, - rach->freq_index, - rach->symbol_index, - rach->preamble_list[0].timing_advance, - rach->preamble_list[0].preamble_pwr); + LOG_D(MAC, + "UL_info[Frame %d, Slot %d] Calling initiate_ra_proc RACH:SFN/SLOT:%d/%d\n", + UL_info->frame, + UL_info->slot, + UL_info->rach_ind.sfn, + UL_info->rach_ind.slot); + for (int i = 0; i < UL_info->rach_ind.number_of_pdus; i++) { + nfapi_nr_prach_indication_pdu_t *rach = UL_info->rach_ind.pdu_list + i; + if (rach->num_preamble > 1) { + LOG_E(MAC, "Not more than 1 preamble per RACH PDU supported, ignoring the rest\n"); } + nr_initiate_ra_proc(UL_info->module_id, + UL_info->CC_id, + UL_info->rach_ind.sfn, + UL_info->rach_ind.slot, + rach->preamble_list[0].preamble_index, + rach->freq_index, + rach->symbol_index, + rach->preamble_list[0].timing_advance, + rach->preamble_list[0].preamble_pwr); } } } @@ -149,15 +141,19 @@ static void handle_nr_uci(NR_UL_IND_t *UL_info) } +struct sfn_slot { + int sfn; + int slot; +}; static bool crc_sfn_slot_matcher(void *wanted, void *candidate) { nfapi_nr_p7_message_header_t *msg = candidate; - int sfn_sf = *(int *)wanted; + struct sfn_slot *sfn_sf = (struct sfn_slot *)wanted; switch (msg->message_id) { case NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION: { nfapi_nr_crc_indication_t *ind = candidate; - return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->slot; + return sfn_sf->sfn == ind->sfn && sfn_sf->slot == ind->slot; } default: @@ -396,7 +392,15 @@ static void match_crc_rx_pdu(nfapi_nr_rx_data_indication_t *rx_ind, nfapi_nr_crc } } -static void run_scheduler(module_id_t module_id, int CC_id, int frame, int slot) +extern void handle_nr_slot_ind(uint16_t sfn, uint16_t slot); +static void pnf_send_slot_ind(module_id_t module_id, int CC_id, int frame, int slot) +{ + (void)module_id; + (void)CC_id; + handle_nr_slot_ind(frame, slot); +} + +static void run_scheduler_monolithic(module_id_t module_id, int CC_id, int frame, int slot) { NR_IF_Module_t *ifi = nr_if_inst[module_id]; @@ -449,7 +453,7 @@ void NR_UL_indication(NR_UL_IND_t *UL_info) { nfapi_nr_uci_indication_t *uci_ind = NULL; nfapi_nr_rx_data_indication_t *rx_ind = NULL; nfapi_nr_crc_indication_t *crc_ind = NULL; - if (get_softmodem_params()->emulate_l1 || NFAPI_MODE == NFAPI_MODE_AERIAL) + if (NFAPI_MODE == NFAPI_MODE_VNF || NFAPI_MODE == NFAPI_MODE_AERIAL) { if (gnb_rach_ind_queue.num_items > 0) { LOG_D(NR_MAC, "gnb_rach_ind_queue size = %zu\n", gnb_rach_ind_queue.num_items); @@ -467,7 +471,7 @@ void NR_UL_indication(NR_UL_IND_t *UL_info) { LOG_D(NR_MAC, "gnb_rx_ind_queue size = %zu and gnb_crc_ind_queue size = %zu\n", gnb_rx_ind_queue.num_items, gnb_crc_ind_queue.num_items); rx_ind = get_queue(&gnb_rx_ind_queue); - int sfn_slot = NFAPI_SFNSLOT2HEX(rx_ind->sfn, rx_ind->slot); + struct sfn_slot sfn_slot = {.sfn = rx_ind->sfn, .slot = rx_ind->slot}; crc_ind = unqueue_matching(&gnb_crc_ind_queue, MAX_QUEUE_SIZE, crc_sfn_slot_matcher, @@ -487,12 +491,13 @@ void NR_UL_indication(NR_UL_IND_t *UL_info) { } } - handle_nr_rach(UL_info); + if (UL_info->rach_ind.number_of_pdus > 0) + handle_nr_rach(UL_info); handle_nr_uci(UL_info); handle_nr_ulsch(UL_info); handle_nr_srs(UL_info); - if (get_softmodem_params()->emulate_l1 || NFAPI_MODE == NFAPI_MODE_AERIAL) { + if (NFAPI_MODE == NFAPI_MODE_VNF || NFAPI_MODE == NFAPI_MODE_AERIAL) { free_unqueued_nfapi_indications(rach_ind, uci_ind, rx_ind, crc_ind); } } @@ -509,7 +514,12 @@ NR_IF_Module_t *NR_IF_Module_init(int Mod_id) { nr_if_inst[Mod_id]->CC_mask=0; nr_if_inst[Mod_id]->NR_UL_indication = NR_UL_indication; - nr_if_inst[Mod_id]->NR_slot_indication = run_scheduler; + if (NFAPI_MODE == NFAPI_MONOLITHIC) + nr_if_inst[Mod_id]->NR_slot_indication = run_scheduler_monolithic; + else if (NFAPI_MODE == NFAPI_MODE_PNF) + nr_if_inst[Mod_id]->NR_slot_indication = pnf_send_slot_ind; + else // NFAPI_MODE_VNF + NULL; AssertFatal(pthread_mutex_init(&nr_if_inst[Mod_id]->if_mutex,NULL)==0, "allocation of nr_if_inst[%d]->if_mutex fails\n",Mod_id); } diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c index 00f3b303e9..a8c06604d7 100644 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c @@ -275,59 +275,59 @@ void send_nsa_standalone_msg(NR_UL_IND_t *UL_INFO, uint16_t msg_id) } } -bool sfn_slot_matcher(void *wanted, void *candidate) +bool sfn_slot_matcher(void *sfn_slot_s, void *candidate) { nfapi_p7_message_header_t *msg = candidate; - int sfn_sf = *(int*)wanted; + const struct sfn_slot_s *sfn_sf = (const struct sfn_slot_s *)sfn_slot_s; switch (msg->message_id) { case NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION: { nfapi_nr_rach_indication_t *ind = candidate; - return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->slot; + return sfn_sf->sfn == ind->sfn && sfn_sf->slot == ind->slot; } case NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION: { nfapi_nr_rx_data_indication_t *ind = candidate; - return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->slot; + return sfn_sf->sfn == ind->sfn && sfn_sf->slot == ind->slot; } case NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION: { nfapi_nr_crc_indication_t *ind = candidate; - return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->slot; + return sfn_sf->sfn == ind->sfn && sfn_sf->slot == ind->slot; } case NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION: { nfapi_nr_uci_indication_t *ind = candidate; - return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->slot; + return sfn_sf->sfn == ind->sfn && sfn_sf->slot == ind->slot; } case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST: { nfapi_nr_dl_tti_request_t *ind = candidate; - return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->SFN && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->Slot; + return sfn_sf->sfn == ind->SFN && sfn_sf->slot == ind->Slot; } case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST: { nfapi_nr_tx_data_request_t *ind = candidate; - return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->SFN && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->Slot; + return sfn_sf->sfn == ind->SFN && sfn_sf->slot == ind->Slot; } case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST: { nfapi_nr_ul_dci_request_t *ind = candidate; - return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->SFN && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->Slot; + return sfn_sf->sfn == ind->SFN && sfn_sf->slot == ind->Slot; } case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST: { nfapi_nr_ul_tti_request_t *ind = candidate; - return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->SFN && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->Slot; + return sfn_sf->sfn == ind->SFN && sfn_sf->slot == ind->Slot; } default: @@ -630,10 +630,11 @@ static void copy_ul_dci_data_req_to_dl_info(nr_downlink_indication_t *dl_info, n dl_info->slot = ul_dci_req->Slot; } -static bool send_crc_ind_and_rx_ind(int sfn_slot) +static bool send_crc_ind_and_rx_ind(int sfn, int slot) { bool sent_crc_rx = true; + struct sfn_slot_s sfn_slot = {.sfn = sfn, .slot = slot}; nfapi_nr_rx_data_indication_t *rx_ind = unqueue_matching(&nr_rx_ind_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &sfn_slot); nfapi_nr_crc_indication_t *crc_ind = unqueue_matching(&nr_crc_ind_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &sfn_slot); @@ -642,8 +643,9 @@ static bool send_crc_ind_and_rx_ind(int sfn_slot) NR_UE_MAC_INST_t *mac = get_mac_inst(0); for (int i = 0; i < crc_ind->number_crcs; i++) { int harq_pid = crc_ind->crc_list[i].harq_id; - LOG_T(NR_MAC, "Resetting harq_pid %d active_ul_harq_sfn_slot\n", harq_pid); - mac->nr_ue_emul_l1.harq[harq_pid].active_ul_harq_sfn_slot = -1; + LOG_T(NR_MAC, "Resetting harq_pid %d active_ul_harq_sfn/slot\n", harq_pid); + mac->nr_ue_emul_l1.harq[harq_pid].active_ul_harq_sfn = -1; + mac->nr_ue_emul_l1.harq[harq_pid].active_ul_harq_slot = -1; } NR_UL_IND_t UL_INFO = { .crc_ind = *crc_ind, @@ -671,12 +673,11 @@ static bool send_crc_ind_and_rx_ind(int sfn_slot) static void copy_ul_tti_data_req_to_dl_info(nr_downlink_indication_t *dl_info, nfapi_nr_ul_tti_request_t *ul_tti_req) { int num_pdus = ul_tti_req->n_pdus; - int sfn_slot = NFAPI_SFNSLOT2HEX(ul_tti_req->SFN, ul_tti_req->Slot); AssertFatal(num_pdus >= 0, "Invalid ul_tti_request number of PDUS\n"); AssertFatal(num_pdus <= sizeof(ul_tti_req->pdus_list) / sizeof(ul_tti_req->pdus_list[0]), "Too many pdus %d in ul_tti_req\n", num_pdus); - if (!send_crc_ind_and_rx_ind(sfn_slot)) + if (!send_crc_ind_and_rx_ind(ul_tti_req->SFN, ul_tti_req->Slot)) { LOG_T(NR_MAC, "CRC_RX ind not sent\n"); if (!put_queue(&nr_ul_tti_req_queue, ul_tti_req)) @@ -1018,8 +1019,7 @@ void *nrue_standalone_pnf_task(void *context) uint16_t *sfn_slot = CALLOC(1, sizeof(*sfn_slot)); memcpy(sfn_slot, buffer, sizeof(*sfn_slot)); - LOG_D(NR_PHY, "Received from proxy sfn %d slot %d\n", - NFAPI_SFNSLOT2SFN(*sfn_slot), NFAPI_SFNSLOT2SLOT(*sfn_slot)); + LOG_D(NR_PHY, "Received from proxy sfn_slot %x\n", *sfn_slot); if (!put_queue(&nr_sfn_slot_queue, sfn_slot)) { @@ -1043,11 +1043,13 @@ void *nrue_standalone_pnf_task(void *context) // TODO: Update sinr field of slot_rnti_mcs to be array. for (int i = 0; i < ch_info->nb_of_csi; ++i) { - slot_rnti_mcs[NFAPI_SFNSLOT2SLOT(ch_info->sfn_slot)].sinr = ch_info->csi[i].sinr; - slot_rnti_mcs[NFAPI_SFNSLOT2SLOT(ch_info->sfn_slot)].area_code = ch_info->csi[i].area_code; + int mu = 1; // NR-UE emul-L1 is hardcoded to 30kHZ, see check_and_process_dci() + int frame = NFAPI_SFNSLOTDEC2SFN(mu, ch_info->sfn_slot); + int slot = NFAPI_SFNSLOTDEC2SLOT(mu, ch_info->sfn_slot); + slot_rnti_mcs[slot].sinr = ch_info->csi[i].sinr; + slot_rnti_mcs[slot].area_code = ch_info->csi[i].area_code; - LOG_D(NR_PHY, "Received_SINR[%d] = %f, sfn:slot %d:%d\n", - i, ch_info->csi[i].sinr, NFAPI_SFNSLOT2SFN(ch_info->sfn_slot), NFAPI_SFNSLOT2SLOT(ch_info->sfn_slot)); + LOG_D(NR_PHY, "Received_SINR[%d] = %f, sfn:slot %d:%d\n", i, ch_info->csi[i].sinr, frame, slot); } if (!put_queue(&nr_chan_param_queue, ch_info)) diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h index c43eef87a3..e6a4bfa80b 100644 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h @@ -312,7 +312,11 @@ void check_and_process_dci(nfapi_nr_dl_tti_request_t *dl_tti_request, nfapi_nr_ul_dci_request_t *ul_dci_request, nfapi_nr_ul_tti_request_t *ul_tti_request); -bool sfn_slot_matcher(void *wanted, void *candidate); +struct sfn_slot_s { + int sfn; + int slot; +}; +bool sfn_slot_matcher(void *sfn_slot_s, void *candidate); /**\brief interface between L1/L2, indicating the downlink related information, like dci_ind and rx_req \param dl_info including dci_ind and rx_request messages*/ diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpb210.conf deleted file mode 100644 index b83075840c..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpb210.conf +++ /dev/null @@ -1,52 +0,0 @@ -log_config = { - global_log_level ="debug"; - hw_log_level ="info"; - phy_log_level ="info"; - mac_log_level ="debug"; - rlc_log_level ="info"; - pdcp_log_level ="info"; - rrc_log_level ="debug"; -}; - - -#L1s = ( -# { -# num_cc = 1; -# tr_n_preference = "nfapi"; -# remote_n_address = "192.168.1.28"; -# local_n_address = "192.168.1.74"; -# local_n_portc = 50000; -# remote_n_portc = 50001; -# local_n_portd = 50010; -# remote_n_portd = 50011; -# } -#); - - -L1s = ( - { - num_cc = 1; - tr_n_preference = "nfapi"; - #remote_n_address = "10.0.0.2"; - #local_n_address = "10.0.0.1"; - remote_n_address = "127.0.0.2"; - local_n_address = "127.0.0.1"; - local_n_portc = 50000; - remote_n_portc = 50001; - local_n_portd = 50010; - remote_n_portd = 50011; - } -); - -RUs = ( - { - local_rf = "yes" - nb_tx = 1 - nb_rx = 1 - att_tx = 90 - att_rx = 0; - bands = [7,38,42,43]; - max_pdschReferenceSignalPower = -27; - max_rxgain = 125; - } -); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-pnf.band78.rfsim.2x2.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-pnf.band78.rfsim.2x2.conf new file mode 100644 index 0000000000..a25651e0db --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-pnf.band78.rfsim.2x2.conf @@ -0,0 +1,28 @@ +log_config = { + global_log_level ="info"; + hw_log_level ="info"; + phy_log_level ="info"; +}; + +L1s = ({ + num_cc = 1; + tr_n_preference = "nfapi"; + remote_n_address = "127.0.0.1"; // vnf addr + local_n_address = "127.0.0.1"; // pnf addr + local_n_portc = 50000; // pnf p5 port [!] + remote_n_portc = 50001; // vnf p5 port + local_n_portd = 50010; // pnf p7 port + remote_n_portd = 50011; // vnf p7 port +}); + +RUs = ({ + local_rf = "yes" + sl_ahead = 5; + nb_tx = 2 + nb_rx = 2 + att_tx = 0 + att_rx = 0; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 125; +}); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-pnf.band78.rfsim.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-pnf.band78.rfsim.conf new file mode 100644 index 0000000000..887ff6eced --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-pnf.band78.rfsim.conf @@ -0,0 +1,34 @@ +log_config = { + global_log_level = "info"; + hw_log_level = "info"; + phy_log_level = "info"; +}; + +L1s = ({ + num_cc = 1; + tr_n_preference = "nfapi"; + remote_n_address = "127.0.0.1"; // vnf addr + local_n_address = "127.0.0.1"; // pnf addr + local_n_portc = 50000; // pnf p5 port [!] + remote_n_portc = 50001; // vnf p5 port + local_n_portd = 50010; // pnf p7 port + remote_n_portd = 50011; // vnf p7 port +}); + +RUs = ({ + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 0 + att_rx = 0; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 125; +}); + +rfsimulator: { + serveraddr = "server"; + serverport = 4043; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; +}; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-vnf.sa.band78.106prb.nfapi.conf similarity index 75% rename from targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf rename to targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-vnf.sa.band78.106prb.nfapi.conf index 6e71635924..bb4aed3dfe 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-vnf.sa.band78.106prb.nfapi.conf @@ -7,21 +7,23 @@ gNBs = { ////////// Identification parameters: gNB_ID = 0xe00; - - cell_type = "CELL_MACRO_GNB"; - gNB_name = "gNB-Eurecom-5GNRBox"; // Tracking area code, 0x0000 and 0xfffe are reserved values tracking_area_code = 1; + plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1 }) }); - plmn_list = ({mcc = 208; mnc = 93; mnc_length = 2;}); - - tr_s_preference = "local_mac" + nr_cellid = 12345678L; ////////// Physical parameters: - + ssb_SubcarrierOffset = 0; + pdsch_AntennaPorts_N1 = 1; + pusch_AntennaPorts = 1; + min_rxtxtime = 6; + enable_sdap = 0; + #sib1_tda = 0; + servingCellConfigCommon = ( { #spCellConfigCommon @@ -31,10 +33,10 @@ gNBs = # downlinkConfigCommon #frequencyInfoDL # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP) - absoluteFrequencySSB = 641032; + absoluteFrequencySSB = 641280; dl_frequencyBand = 78; # this is 3600 MHz - dl_absoluteFrequencyPointA = 640000; + dl_absoluteFrequencyPointA = 640008; #scs-SpecificCarrierList dl_offstToCarrier = 0; # subcarrierSpacing @@ -43,8 +45,8 @@ gNBs = dl_carrierBandwidth = 106; #initialDownlinkBWP #genericParameters - # this is RBstart=41,L=24 (275*(L-1))+RBstart - initialDLBWPlocationAndBandwidth = 6366; + # this is RBstart=27,L=48 (275*(L-1))+RBstart + initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952 # subcarrierSpacing # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 initialDLBWPsubcarrierSpacing = 1; @@ -64,7 +66,7 @@ gNBs = pMax = 20; #initialUplinkBWP #genericParameters - initialULBWPlocationAndBandwidth = 6366; + initialULBWPlocationAndBandwidth = 28875; # subcarrierSpacing # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 initialULBWPsubcarrierSpacing = 1; @@ -76,7 +78,7 @@ gNBs = prach_msg1_FDM = 0; prach_msg1_FrequencyStart = 0; zeroCorrelationZoneConfig = 13; - preambleReceivedTargetPower = -118; + preambleReceivedTargetPower = -96; #preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) preambleTransMax = 6; #powerRampingStep @@ -84,12 +86,12 @@ gNBs = powerRampingStep = 1; #ra_ReponseWindow #1,2,4,8,10,20,40,80 - ra_ResponseWindow = 4; + ra_ResponseWindow = 5; #ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR #1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4; #one (0..15) 4,8,12,16,...60,64 - ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15; + ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14; #ra_ContentionResolutionTimer #(0..7) 8,16,24,32,40,48,56,64 ra_ContentionResolutionTimer = 7; @@ -143,35 +145,13 @@ gNBs = nrofUplinkSlots = 2; nrofUplinkSymbols = 4; - ssPBCH_BlockPower = 10; + ssPBCH_BlockPower = -25; } ); - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - # ------- SCTP definitions SCTP : { @@ -182,15 +162,15 @@ gNBs = ////////// MME parameters: - mme_ip_address = ({ ipv4 = "192.168.12.26"; }); + amf_ip_address = ({ ipv4 = "192.168.70.132"; }); NETWORK_INTERFACES : { - - GNB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24"; - GNB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129"; GNB_PORT_FOR_S1U = 2152; # Spec 2152 }; + } ); @@ -199,7 +179,7 @@ MACRLCs = ( { num_cc = 1; remote_s_address = "127.0.0.1"; // pnf addr [!] - local_s_address = "127.0.0.2"; // vnf addr + local_s_address = "127.0.0.1"; // vnf addr local_s_portc = 50001; // vnf p5 port remote_s_portc = 50000; // pnf p5 port [!] local_s_portd = 50011; // vnf p7 port [!] @@ -209,24 +189,28 @@ MACRLCs = ( } ) +security = { + # preferred ciphering algorithms + # the first one of the list that an UE supports in chosen + # valid values: nea0, nea1, nea2, nea3 + ciphering_algorithms = ( "nea0" ); -THREAD_STRUCT = ( - { - #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" - parallel_config = "PARALLEL_RU_L1_TRX_SPLIT"; - #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" - worker_config = "WORKER_ENABLE"; - } -); + # preferred integrity algorithms + # the first one of the list that an UE supports in chosen + # valid values: nia0, nia1, nia2, nia3 + integrity_algorithms = ( "nia2", "nia0" ); -log_config = - { - global_log_level ="info"; - hw_log_level ="info"; - phy_log_level ="info"; - mac_log_level ="info"; - rlc_log_level ="info"; - pdcp_log_level ="info"; - rrc_log_level ="info"; - }; - + # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter + # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' + drb_ciphering = "yes"; + drb_integrity = "no"; +}; + +log_config = { + global_log_level = "info"; + mac_log_level = "info"; + rlc_log_level = "info"; + pdcp_log_level = "info"; + rrc_log_level = "info"; + sdap_log_level = "info"; +} diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/vnf.sa.band78.106prb.rfsim.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-vnf.sa.band78.273prb.nfapi.conf similarity index 89% rename from targets/PROJECTS/GENERIC-NR-5GC/CONF/vnf.sa.band78.106prb.rfsim.conf rename to targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-vnf.sa.band78.273prb.nfapi.conf index 72f6192f4a..7cfc66748b 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/vnf.sa.band78.106prb.rfsim.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-vnf.sa.band78.273prb.nfapi.conf @@ -11,32 +11,17 @@ gNBs = // Tracking area code, 0x0000 and 0xfffe are reserved values tracking_area_code = 1; - plmn_list = ({ - mcc = 208; - mnc = 99; - mnc_length = 2; - snssaiList = ( - { - sst = 1; - sd = 0x1; // 0 false, else true - }, - { - sst = 1; - sd = 0x112233; // 0 false, else true - } - ); - - }); + plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1 }) }); nr_cellid = 12345678L; ////////// Physical parameters: - ssb_SubcarrierOffset = 0; - pdsch_AntennaPorts = 1; - pusch_AntennaPorts = 1; - min_rxtxtime = 6; - sib1_tda = 0; + pdsch_AntennaPorts_XP = 2; + pusch_AntennaPorts = 2; + do_CSIRS = 1; + do_SRS = 1; + min_rxtxtime = 5; servingCellConfigCommon = ( { @@ -47,20 +32,20 @@ gNBs = # downlinkConfigCommon #frequencyInfoDL # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP) - absoluteFrequencySSB = 641280; + absoluteFrequencySSB = 630048; dl_frequencyBand = 78; # this is 3600 MHz - dl_absoluteFrequencyPointA = 640008; + dl_absoluteFrequencyPointA = 626772; #scs-SpecificCarrierList dl_offstToCarrier = 0; # subcarrierSpacing # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 dl_subcarrierSpacing = 1; - dl_carrierBandwidth = 106; + dl_carrierBandwidth = 273; #initialDownlinkBWP #genericParameters # this is RBstart=27,L=48 (275*(L-1))+RBstart - initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952 + initialDLBWPlocationAndBandwidth = 1099; # 6366 12925 12956 28875 12952 # subcarrierSpacing # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 initialDLBWPsubcarrierSpacing = 1; @@ -76,11 +61,11 @@ gNBs = # subcarrierSpacing # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ul_subcarrierSpacing = 1; - ul_carrierBandwidth = 106; + ul_carrierBandwidth = 273; pMax = 20; #initialUplinkBWP #genericParameters - initialULBWPlocationAndBandwidth = 28875; + initialULBWPlocationAndBandwidth = 1099; # subcarrierSpacing # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 initialULBWPsubcarrierSpacing = 1; @@ -91,7 +76,7 @@ gNBs = #0 = one, 1=two, 2=four, 3=eight prach_msg1_FDM = 0; prach_msg1_FrequencyStart = 0; - zeroCorrelationZoneConfig = 13; + zeroCorrelationZoneConfig = 12; preambleReceivedTargetPower = -96; #preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) preambleTransMax = 6; @@ -100,12 +85,12 @@ gNBs = powerRampingStep = 1; #ra_ReponseWindow #1,2,4,8,10,20,40,80 - ra_ResponseWindow = 4; + ra_ResponseWindow = 5; #ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR #1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen - ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4; -#one (0..15) 4,8,12,16,...60,64 - ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14; + ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3; +#oneHalf (0..15) 4,8,12,16,...60,64 + ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15; #ra_ContentionResolutionTimer #(0..7) 8,16,24,32,40,48,56,64 ra_ContentionResolutionTimer = 7; @@ -129,7 +114,7 @@ gNBs = # 0 = neither, 1= group hopping, 2=sequence hopping pucchGroupHopping = 0; hoppingId = 40; - p0_nominal = -90; + p0_nominal = -70; ssb_PositionsInBurst_Bitmap = 1; @@ -153,10 +138,10 @@ gNBs = # pattern1 # dl_UL_TransmissionPeriodicity # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 - dl_UL_TransmissionPeriodicity = 6; - nrofDownlinkSlots = 7; + dl_UL_TransmissionPeriodicity = 5; + nrofDownlinkSlots = 3; nrofDownlinkSymbols = 6; - nrofUplinkSlots = 2; + nrofUplinkSlots = 1; nrofUplinkSymbols = 4; ssPBCH_BlockPower = -25; diff --git a/ci-scripts/conf_files/gnb.sa.band66.u0.25prb.rfsim.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band66.u0.25prb.rfsim.conf similarity index 100% rename from ci-scripts/conf_files/gnb.sa.band66.u0.25prb.rfsim.conf rename to targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band66.u0.25prb.rfsim.conf diff --git a/ci-scripts/conf_files/gnb.sa.band77.162prb.usrpn310.4x4.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.162prb.usrpn310.4x4.conf similarity index 100% rename from ci-scripts/conf_files/gnb.sa.band77.162prb.usrpn310.4x4.conf rename to targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.162prb.usrpn310.4x4.conf diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/pnf.sa.band78.rfsim.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/pnf.sa.band78.rfsim.conf deleted file mode 100644 index 6c3626ac81..0000000000 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/pnf.sa.band78.rfsim.conf +++ /dev/null @@ -1,53 +0,0 @@ - -L1s = ( -{ - num_cc = 1; - tr_n_preference = "nfapi"; - remote_n_address = "127.0.0.2"; // vnf addr - local_n_address = "127.0.0.1"; // pnf addr - local_n_portc = 50000; // pnf p5 port [!] - remote_n_portc = 50001; // vnf p5 port - local_n_portd = 50010; // pnf p7 port - remote_n_portd = 50011; // vnf p7 port - prach_dtx_threshold = 120; - pucch0_dtx_threshold = 150; - ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 -} -); - -RUs = ( -{ - local_rf = "yes" - nb_tx = 1 - nb_rx = 1 - att_tx = 0 - att_rx = 0; - bands = [78]; - max_pdschReferenceSignalPower = -27; - max_rxgain = 114; -} -); - - -rfsimulator : -{ - serveraddr = "server"; - serverport = 4043; - options = (); #("saviq"); or/and "chanmod" - modelname = "AWGN"; - IQfile = "/tmp/rfsimulator.iqs"; -}; - -log_config : -{ - global_log_level ="info"; - hw_log_level ="info"; - phy_log_level ="info"; - mac_log_level ="info"; - rlc_log_level ="info"; - pdcp_log_level ="info"; - rrc_log_level ="info"; - ngap_log_level ="debug"; - f1ap_log_level ="debug"; -}; -