[0-9\-]+) *bytes', mySSH.getBefore())
if result is not None:
@@ -264,39 +280,27 @@ class Containerize():
self.allImagesSize[image] = str(round(imageSize,1)) + ' Gbytes'
else:
logging.debug('ran-build size is unknown')
- if not status:
- mySSH.close()
- logging.error('\u001B[1m Building OAI Images Failed\u001B[0m')
- HTML.CreateHtmlTestRow(self.imageKind, 'KO', CONST.ALL_PROCESSES_OK)
- #HTML.CreateHtmlNextTabHeaderTestRow(self.collectInfo, self.allImagesSize)
- HTML.CreateHtmlTabFooter(False)
- sys.exit(1)
+ self.allImagesSize[image] = 'unknown'
+ # Now pruning dangling images in between target builds
+ mySSH.command(self.cli + ' image prune --force', '\$', 30)
- # Recover build logs, for the moment only possible when build is successful
- mySSH.command(self.cli + ' create --name test ' + sharedimage + ':' + imageTag, '\$', 5)
- mySSH.command('mkdir -p cmake_targets/log/ran-build', '\$', 5)
- mySSH.command(self.cli + ' cp test:/oai-ran/cmake_targets/log/. cmake_targets/log/ran-build', '\$', 5)
- mySSH.command(self.cli + ' rm -f test', '\$', 5)
- for image,shaone in danglingShaOnes:
- mySSH.command('mkdir -p cmake_targets/log/' + image, '\$', 5)
- mySSH.command(self.cli + ' create --name test ' + shaone, '\$', 5)
- mySSH.command(self.cli + ' cp test:/oai-ran/cmake_targets/log/. cmake_targets/log/' + image, '\$', 5)
- mySSH.command(self.cli + ' rm -f test', '\$', 5)
- mySSH.command(self.cli + ' image prune --force', '\$', 5)
- mySSH.command('cd cmake_targets', '\$', 5)
+ # Analyzing the logs
+ mySSH.command('cd ' + lSourcePath + '/cmake_targets', '\$', 5)
mySSH.command('mkdir -p build_log_' + self.testCase_id, '\$', 5)
mySSH.command('mv log/* ' + 'build_log_' + self.testCase_id, '\$', 5)
- #mySSH.close()
-
- mySSH.command('cd /tmp/CI-eNB/cmake_targets', '\$', 5)
+
+ mySSH.command('cd ' + lSourcePath + '/cmake_targets', '\$', 5)
+ mySSH.command('rm -f build_log_' + self.testCase_id + '.zip || true', '\$', 5)
if (os.path.isfile('./build_log_' + self.testCase_id + '.zip')):
os.remove('./build_log_' + self.testCase_id + '.zip')
+ if (os.path.isdir('./build_log_' + self.testCase_id)):
+ shutil.rmtree('./build_log_' + self.testCase_id)
mySSH.command('zip -r -qq build_log_' + self.testCase_id + '.zip build_log_' + self.testCase_id, '\$', 5)
mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/build_log_' + self.testCase_id + '.zip', '.')
- #mySSH.command('rm -f build_log_' + self.testCase_id + '.zip','\$', 5)
+ mySSH.command('rm -f build_log_' + self.testCase_id + '.zip','\$', 5)
mySSH.close()
ZipFile('build_log_' + self.testCase_id + '.zip').extractall('.')
-
+
#Trying to identify the errors and warnings for each built images
imageNames1 = imageNames
shared = ('ran-build','ran')
@@ -328,9 +332,16 @@ class Containerize():
files[fil] = errorandwarnings
self.collectInfo[image] = files
- logging.info('\u001B[1m Building OAI Image(s) Pass\u001B[0m')
- HTML.CreateHtmlTestRow(self.imageKind, 'OK', CONST.ALL_PROCESSES_OK)
- HTML.CreateHtmlNextTabHeaderTestRow(self.collectInfo, self.allImagesSize)
+ if status:
+ logging.info('\u001B[1m Building OAI Image(s) Pass\u001B[0m')
+ HTML.CreateHtmlTestRow(self.imageKind, 'OK', CONST.ALL_PROCESSES_OK)
+ HTML.CreateHtmlNextTabHeaderTestRow(self.collectInfo, self.allImagesSize)
+ else:
+ logging.error('\u001B[1m Building OAI Images Failed\u001B[0m')
+ HTML.CreateHtmlTestRow(self.imageKind, 'KO', CONST.ALL_PROCESSES_OK)
+ HTML.CreateHtmlNextTabHeaderTestRow(self.collectInfo, self.allImagesSize)
+ HTML.CreateHtmlTabFooter(False)
+ sys.exit(1)
def DeployObject(self, HTML, EPC):
if self.eNB_serverId[self.eNB_instance] == '0':
diff --git a/ci-scripts/conf_files/benetel-4g.conf b/ci-scripts/conf_files/benetel-4g.conf
new file mode 100644
index 0000000000..9423ebe56e
--- /dev/null
+++ b/ci-scripts/conf_files/benetel-4g.conf
@@ -0,0 +1,285 @@
+Active_eNBs = ( "eNB-Eurecom-LTEBox");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+eNBs =
+(
+ {
+ # real_time choice in {hard, rt-preempt, no}
+ real_time = "no";
+
+ ////////// Identification parameters:
+ eNB_ID = 0xe00;
+
+ cell_type = "CELL_MACRO_ENB";
+
+ eNB_name = "eNB-Eurecom-LTEBox";
+
+ // Tracking area code, 0x0000 and 0xfffe are reserved values
+ tracking_area_code = 1;
+ plmn_list = ( { mcc = 222; mnc = 01; mnc_length = 2; } );
+
+ tr_s_preference = "local_mac"
+
+ ////////// Physical parameters:
+
+ component_carriers = (
+ {
+ node_function = "NGFI_RCC_IF4p5";
+ node_timing = "synch_to_ext_device";
+ node_synch_ref = 0;
+ frame_type = "FDD";
+ tdd_config = 3;
+ tdd_config_s = 0;
+ prefix_type = "NORMAL";
+ eutra_band = 7;
+ downlink_frequency = 2655000000L;
+ uplink_frequency_offset = -120000000;
+ Nid_cell = 0;
+ N_RB_DL = 100;
+ Nid_cell_mbsfn = 0;
+ nb_antenna_ports = 1;
+ nb_antennas_tx = 1;
+ nb_antennas_rx = 1;
+ tx_gain = 90;
+ rx_gain = 125;
+ pbch_repetition = "FALSE";
+ prach_root = 0;
+ prach_config_index = 0;
+ prach_high_speed = "DISABLE";
+ prach_zero_correlation = 1;
+ prach_freq_offset = 90;
+ pucch_delta_shift = 1;
+ pucch_nRB_CQI = 0;
+ pucch_nCS_AN = 0;
+ pucch_n1_AN = 0;
+ pdsch_referenceSignalPower = -10;
+ pdsch_p_b = 0;
+ pusch_n_SB = 1;
+ pusch_enable64QAM = "DISABLE";
+ pusch_hoppingMode = "interSubFrame";
+ pusch_hoppingOffset = 0;
+ pusch_groupHoppingEnabled = "ENABLE";
+ pusch_groupAssignment = 0;
+ pusch_sequenceHoppingEnabled = "DISABLE";
+ pusch_nDMRS1 = 1;
+ phich_duration = "NORMAL";
+ phich_resource = "ONESIXTH";
+ srs_enable = "DISABLE";
+ /* srs_BandwidthConfig =;
+ srs_SubframeConfig =;
+ srs_ackNackST =;
+ srs_MaxUpPts =;*/
+
+ pusch_p0_Nominal = -96;
+ pusch_alpha = "AL1";
+ pucch_p0_Nominal = -104;
+ msg3_delta_Preamble = 6;
+ pucch_deltaF_Format1 = "deltaF2";
+ pucch_deltaF_Format1b = "deltaF3";
+ pucch_deltaF_Format2 = "deltaF0";
+ pucch_deltaF_Format2a = "deltaF0";
+ pucch_deltaF_Format2b = "deltaF0";
+
+ rach_numberOfRA_Preambles = 64;
+ rach_preamblesGroupAConfig = "DISABLE";
+ /*
+ rach_sizeOfRA_PreamblesGroupA = ;
+ rach_messageSizeGroupA = ;
+ rach_messagePowerOffsetGroupB = ;
+ */
+ rach_powerRampingStep = 4;
+ rach_preambleInitialReceivedTargetPower = -108;
+ rach_preambleTransMax = 10;
+ rach_raResponseWindowSize = 10;
+ rach_macContentionResolutionTimer = 48;
+ rach_maxHARQ_Msg3Tx = 4;
+
+ pcch_default_PagingCycle = 128;
+ pcch_nB = "oneT";
+ bcch_modificationPeriodCoeff = 2;
+ ue_TimersAndConstants_t300 = 1000;
+ ue_TimersAndConstants_t301 = 1000;
+ ue_TimersAndConstants_t310 = 1000;
+ ue_TimersAndConstants_t311 = 10000;
+ ue_TimersAndConstants_n310 = 20;
+ ue_TimersAndConstants_n311 = 1;
+ ue_TransmissionMode = 1;
+
+ //Parameters for SIB18
+ rxPool_sc_CP_Len = "normal";
+ rxPool_sc_Period = "sf40";
+ rxPool_data_CP_Len = "normal";
+ rxPool_ResourceConfig_prb_Num = 20;
+ rxPool_ResourceConfig_prb_Start = 5;
+ rxPool_ResourceConfig_prb_End = 44;
+ rxPool_ResourceConfig_offsetIndicator_present = "prSmall";
+ rxPool_ResourceConfig_offsetIndicator_choice = 0;
+ rxPool_ResourceConfig_subframeBitmap_present = "prBs40";
+ rxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "00000000000000000000";
+ rxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5;
+ rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
+/* rxPool_dataHoppingConfig_hoppingParameter = 0;
+ rxPool_dataHoppingConfig_numSubbands = "ns1";
+ rxPool_dataHoppingConfig_rbOffset = 0;
+ rxPool_commTxResourceUC-ReqAllowed = "TRUE";
+*/
+ // Parameters for SIB19
+ discRxPool_cp_Len = "normal"
+ discRxPool_discPeriod = "rf32"
+ discRxPool_numRetx = 1;
+ discRxPool_numRepetition = 2;
+ discRxPool_ResourceConfig_prb_Num = 5;
+ discRxPool_ResourceConfig_prb_Start = 3;
+ discRxPool_ResourceConfig_prb_End = 21;
+ discRxPool_ResourceConfig_offsetIndicator_present = "prSmall";
+ discRxPool_ResourceConfig_offsetIndicator_choice = 0;
+ discRxPool_ResourceConfig_subframeBitmap_present = "prBs40";
+ discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "f0ffffffff";
+ discRxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5;
+ discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
+
+ //SSB central frequency of NR secondary cell group (for ENDC NSA)
+ nr_scg_ssb_freq = 640000;
+ }
+ );
+
+
+ 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 :
+ {
+ # Number of streams to use in input/output
+ SCTP_INSTREAMS = 2;
+ SCTP_OUTSTREAMS = 2;
+ };
+
+
+ ////////// MME parameters:
+ mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
+ ipv6 = "192:168:30::17";
+ active = "yes";
+ preference = "ipv4";
+ }
+ );
+
+ enable_measurement_reports = "yes";
+
+ ///X2
+ enable_x2 = "yes";
+ t_reloc_prep = 1000; /* unit: millisecond */
+ tx2_reloc_overall = 2000; /* unit: millisecond */
+ t_dc_prep = 1000; /* unit: millisecond */
+ t_dc_overall = 2000; /* unit: millisecond */
+
+ NETWORK_INTERFACES :
+ {
+ ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
+ ENB_IPV4_ADDRESS_FOR_S1_MME = "CI_ENB_IP_ADDR";
+ ENB_INTERFACE_NAME_FOR_S1U = "eth0";
+ ENB_IPV4_ADDRESS_FOR_S1U = "CI_ENB_IP_ADDR";
+ ENB_PORT_FOR_S1U = 2152; # Spec 2152
+ ENB_IPV4_ADDRESS_FOR_X2C = "127.0.0.1";
+ ENB_PORT_FOR_X2C = 36422; # Spec 36422
+ };
+ }
+);
+
+MACRLCs = (
+ {
+ num_cc = 1;
+ tr_s_preference = "local_L1";
+ tr_n_preference = "local_RRC";
+ phy_test_mode = 0;
+ puSch10xSnr = 160;
+ puCch10xSnr = 160;
+ }
+);
+
+L1s = (
+ {
+ num_cc = 1;
+ tr_n_preference = "local_mac";
+ prach_dtx_threshold = 150;
+ }
+);
+
+RUs = (
+ {
+ //local_if_name = "enp129s0f0";
+ local_if_name = "dpdk";
+ sdr_addrs = "softmodem -m 2048 -l 35 -n 2 -b 0000:81:00.3 --proc-type auto --file-prefix ggg -- -p 0x1";
+ #sdr_addrs = "softmodem -l 8 -n 2 -- -p 0x2";
+ #remote_address = "127.0.0.2";
+ #local_address = "127.0.0.1";
+ #local_portc = 50000;
+ #remote_portc = 50000;
+ #local_portd = 50001;
+ #remote_portd = 50001;
+ local_rf = "no"
+ tr_preference = "raw_if4p5"
+ nb_tx = 1
+ nb_rx = 1
+ att_tx = 0
+ att_rx = 0;
+ eNB_instances = [0];
+ }
+);
+
+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";
+ parallel_config = "PARALLEL_SINGLE_THREAD";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+ }
+);
+
+NETWORK_CONTROLLER :
+{
+ FLEXRAN_ENABLED = "no";
+ FLEXRAN_INTERFACE_NAME = "lo";
+ FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
+ FLEXRAN_PORT = 2210;
+ FLEXRAN_CACHE = "/mnt/oai_agent_cache";
+ FLEXRAN_AWAIT_RECONF = "no";
+};
+
+ log_config :
+ {
+ global_log_level ="info";
+ global_log_verbosity ="medium";
+ hw_log_level ="info";
+ hw_log_verbosity ="medium";
+ phy_log_level ="info";
+ phy_log_verbosity ="medium";
+ mac_log_level ="info";
+ mac_log_verbosity ="high";
+ rlc_log_level ="info";
+ rlc_log_verbosity ="medium";
+ pdcp_log_level ="info";
+ pdcp_log_verbosity ="medium";
+ rrc_log_level ="info";
+ rrc_log_verbosity ="medium";
+ };
diff --git a/ci-scripts/conf_files/benetel-5g.conf b/ci-scripts/conf_files/benetel-5g.conf
new file mode 100644
index 0000000000..c9f0a579e1
--- /dev/null
+++ b/ci-scripts/conf_files/benetel-5g.conf
@@ -0,0 +1,303 @@
+Active_gNBs = ( "gNB-Eurecom-5GNRBox");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+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 = 222; mnc = 01; mnc_length = 2;});
+
+ tr_s_preference = "local_mac"
+
+ ////////// Physical parameters:
+
+ ssb_SubcarrierOffset = 31; //0;
+ pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
+ #pusch_TargetSNRx10 = 200;
+ #pucch_TargetSNRx10 = 200;
+ pusch_TargetSNRx10 = 200;
+ pucch_TargetSNRx10 = 200;
+
+ servingCellConfigCommon = (
+ {
+ #spCellConfigCommon
+
+ physCellId = 0;
+
+# downlinkConfigCommon
+ #frequencyInfoDL
+ # this is is the central frequency of SSB
+ absoluteFrequencySSB = 640000; //641272
+ dl_frequencyBand = 78;
+ # the carrier frequency is assumed to be in the middle of the carrier, i.e. dl_absoluteFrequencyPointA_kHz + dl_carrierBandwidth*12*SCS_kHz/2
+ dl_absoluteFrequencyPointA = 638728; //640000;
+ #scs-SpecificCarrierList
+ dl_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_subcarrierSpacing = 1;
+ dl_carrierBandwidth = 106;
+ #initialDownlinkBWP
+ #genericParameters
+ # this is RBstart=84,L=13 (275*(L-1))+RBstart
+ initialDLBWPlocationAndBandwidth = 6368;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialDLBWPsubcarrierSpacing = 1;
+ #pdcch-ConfigCommon
+ initialDLBWPcontrolResourceSetZero = 0;
+ initialDLBWPsearchSpaceZero = 0;
+ #pdsch-ConfigCommon
+ #pdschTimeDomainAllocationList (up to 16 entries)
+ initialDLBWPk0_0 = 0; #for DL slot
+ initialDLBWPmappingType_0 = 0; #0=typeA,1=typeB
+ initialDLBWPstartSymbolAndLength_0 = 40; #this is SS=1,L=13
+
+ initialDLBWPk0_1 = 0; #for mixed slot
+ initialDLBWPmappingType_1 = 0;
+ initialDLBWPstartSymbolAndLength_1 = 57; #this is SS=1,L=5
+
+ #uplinkConfigCommon
+ #frequencyInfoUL
+ ul_frequencyBand = 78;
+ #scs-SpecificCarrierList
+ ul_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_subcarrierSpacing = 1;
+ ul_carrierBandwidth = 106;
+ pMax = 20;
+ #initialUplinkBWP
+ #genericParameters
+ initialULBWPlocationAndBandwidth = 6368;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialULBWPsubcarrierSpacing = 1;
+ #rach-ConfigCommon
+ #rach-ConfigGeneric
+ prach_ConfigurationIndex = 4;
+#prach_msg1_FDM
+#0 = one, 1=two, 2=four, 3=eight
+ prach_msg1_FDM = 0;
+ prach_msg1_FrequencyStart = 74;
+ zeroCorrelationZoneConfig = 13;
+ preambleReceivedTargetPower = -118;
+ #preambleReceivedTargetPower = -104;
+ #preambleReceivedTargetPower = -108;
+#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 = 2;
+#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;
+#oneHalf (0..15) 4,8,12,16,...60,64
+ ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14; //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 = 1;
+ 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,
+ # pusch-ConfigCommon (up to 16 elements)
+ initialULBWPk2_0 = 6; # used for UL slot
+ initialULBWPmappingType_0 = 1
+ initialULBWPstartSymbolAndLength_0 = 55; # this is SS=0 L=12
+
+ initialULBWPk2_1 = 6; # used for mixed slot
+ initialULBWPmappingType_1 = 1;
+ initialULBWPstartSymbolAndLength_1 = 24; # this is SS=10 L=2
+
+ initialULBWPk2_2 = 7; # used for Msg.3 during RA
+ initialULBWPmappingType_2 = 1;
+ initialULBWPstartSymbolAndLength_2 = 52; # this is SS=10 L=4
+
+
+ msg3_DeltaPreamble = 1;
+ #p0_NominalWithGrant =-90;
+ p0_NominalWithGrant =-118;
+
+# pucch-ConfigCommon setup :
+# pucchGroupHopping
+# 0 = neither, 1= group hopping, 2=sequence hopping
+ pucchGroupHopping = 0;
+ hoppingId = 40;
+ #p0_nominal = -90;
+ p0_nominal = -118;
+# ssb_PositionsInBurs_BitmapPR
+# 1=short, 2=medium, 3=long
+ ssb_PositionsInBurst_PR = 2;
+ ssb_PositionsInBurst_Bitmap = 1; #0x80;
+
+# 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 = 6;
+ nrofDownlinkSlots = 7; //8; //7;
+ nrofDownlinkSymbols = 6; //0; //6;
+ nrofUplinkSlots = 2;
+ nrofUplinkSymbols = 4; //0; //4;
+
+ #ssPBCH_BlockPower = 10;
+ ssPBCH_BlockPower = -35;
+ }
+
+ );
+
+
+ # ------- SCTP definitions
+ SCTP :
+ {
+ # Number of streams to use in input/output
+ SCTP_INSTREAMS = 2;
+ SCTP_OUTSTREAMS = 2;
+ };
+
+
+ ////////// MME parameters:
+ mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
+ ipv6 = "192:168:30::17";
+ active = "yes";
+ preference = "ipv4";
+ }
+ );
+
+ ///X2
+ enable_x2 = "yes";
+ t_reloc_prep = 1000; /* unit: millisecond */
+ tx2_reloc_overall = 2000; /* unit: millisecond */
+ t_dc_prep = 1000; /* unit: millisecond */
+ t_dc_overall = 2000; /* unit: millisecond */
+ target_enb_x2_ip_address = (
+ { ipv4 = "127.0.0.1";
+ ipv6 = "192:168:30::17";
+ preference = "ipv4";
+ }
+ );
+
+ NETWORK_INTERFACES :
+ {
+
+ GNB_INTERFACE_NAME_FOR_S1_MME = "eth0";
+ GNB_IPV4_ADDRESS_FOR_S1_MME = "CI_GNB_IP_ADDR";
+ GNB_INTERFACE_NAME_FOR_S1U = "eth0";
+ GNB_IPV4_ADDRESS_FOR_S1U = "CI_GNB_IP_ADDR";
+ GNB_PORT_FOR_S1U = 2152; # Spec 2152
+ GNB_IPV4_ADDRESS_FOR_X2C = "127.0.0.2/24";
+ GNB_PORT_FOR_X2C = 36422; # Spec 36422
+ };
+ }
+);
+
+MACRLCs = (
+ {
+ num_cc = 1;
+ tr_s_preference = "local_L1";
+ tr_n_preference = "local_RRC";
+ }
+);
+
+L1s = (
+ {
+ num_cc = 1;
+ tr_n_preference = "local_mac";
+ pusch_proc_threads = 8;
+ }
+);
+
+RUs = (
+ {
+ local_rf = "no"
+ nb_tx = 1
+ nb_rx = 1
+ att_tx = 0
+ att_rx = 0;
+ bands = [7];
+ max_pdschReferenceSignalPower = -27;
+ max_rxgain = 114;
+ eNB_instances = [0];
+ //clock_src = "internal";
+ clock_src = "external";
+
+ local_if_name = "dpdk";
+ sdr_addrs = "softmodem -m 2048 -l 34 -n 3 -b 0000:81:00.2 --proc-type auto --file-prefix hhh -- -p 0x1";
+ remote_address = "127.0.0.2";
+ local_address = "127.0.0.1";
+ local_portc = 50000;
+ remote_portc = 50000;
+ local_portd = 50001;
+ remote_portd = 50001;
+ tr_preference = "raw_if4p5"
+
+ }
+);
+
+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";
+ parallel_config = "PARALLEL_SINGLE_THREAD";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_DISABLE";
+ }
+);
+
+ log_config :
+ {
+ global_log_level ="info";
+ global_log_verbosity ="medium";
+ hw_log_level ="info";
+ hw_log_verbosity ="medium";
+ phy_log_level ="info";
+ phy_log_verbosity ="medium";
+ mac_log_level ="info";
+ mac_log_verbosity ="high";
+ rlc_log_level ="info";
+ rlc_log_verbosity ="medium";
+ pdcp_log_level ="info";
+ pdcp_log_verbosity ="medium";
+ rrc_log_level ="info";
+ rrc_log_verbosity ="medium";
+ };
+
diff --git a/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf
new file mode 100644
index 0000000000..2bfd09509c
--- /dev/null
+++ b/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf
@@ -0,0 +1,300 @@
+Active_gNBs = ( "gNB-Eurecom-5GNRBox");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+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 = 311; mnc = 480; mnc_length = 3;});
+
+ tr_s_preference = "local_mac"
+
+ ////////// Physical parameters:
+
+ ssb_SubcarrierOffset = 0;
+ pdsch_AntennaPorts = 1;
+ pusch_TargetSNRx10 = 200;
+ pucch_TargetSNRx10 = 200;
+
+ servingCellConfigCommon = (
+ {
+ #spCellConfigCommon
+
+ physCellId = 0;
+
+# downlinkConfigCommon
+ #frequencyInfoDL
+ # this is pointA + 23 PRBs@120kHz SCS (same as initial BWP)
+ absoluteFrequencySSB = 2071241;
+ dl_frequencyBand = 261;
+ # this is 27.900 GHz
+ dl_absoluteFrequencyPointA = 2070833;
+ #scs-SpecificCarrierList
+ dl_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_subcarrierSpacing = 3;
+ dl_carrierBandwidth = 32;
+ #initialDownlinkBWP
+ #genericParameters
+ # this is RBstart=0,L=32 (275*(L-1))+RBstart
+ initialDLBWPlocationAndBandwidth = 8525;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialDLBWPsubcarrierSpacing = 3;
+ #pdcch-ConfigCommon
+ initialDLBWPcontrolResourceSetZero = 12;
+ initialDLBWPsearchSpaceZero = 0;
+ #pdsch-ConfigCommon
+ #pdschTimeDomainAllocationList (up to 16 entries)
+ initialDLBWPk0_0 = 0;
+ #initialULBWPmappingType
+ #0=typeA,1=typeB
+ initialDLBWPmappingType_0 = 0;
+ #this is SS=2,L=3
+ initialDLBWPstartSymbolAndLength_0 = 40;
+
+ initialDLBWPk0_1 = 0;
+ initialDLBWPmappingType_1 = 0;
+ #this is SS=2,L=12
+ initialDLBWPstartSymbolAndLength_1 = 53;
+
+ initialDLBWPk0_2 = 0;
+ initialDLBWPmappingType_2 = 0;
+ #this is SS=1,L=12
+ initialDLBWPstartSymbolAndLength_2 = 54;
+
+ initialDLBWPk0_3 = 0;
+ initialDLBWPmappingType_3 = 0;
+ #this is SS=1,L=4 //5 (4 is for 43, 5 is for 57)
+ initialDLBWPstartSymbolAndLength_3 = 57; //43; //57;
+ #uplinkConfigCommon
+ #frequencyInfoUL
+ ul_frequencyBand = 261;
+ #scs-SpecificCarrierList
+ ul_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_subcarrierSpacing = 3;
+ ul_carrierBandwidth = 32;
+ pMax = 20;
+ #initialUplinkBWP
+ #genericParameters
+ initialULBWPlocationAndBandwidth = 8525;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialULBWPsubcarrierSpacing = 3;
+ #rach-ConfigCommon
+ #rach-ConfigGeneric
+ prach_ConfigurationIndex = 52;
+#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 = 7;
+#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+#0=oneeighth,1=onefourth,2=half,3=one,4=two,5=four,6=eight,7=sixteen
+ ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
+#oneHalf (0..15) 4,8,12,16,...60,64
+ ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 7;
+#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 = 3,
+
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+ restrictedSetConfig = 0,
+ # pusch-ConfigCommon (up to 16 elements)
+ initialULBWPk2_0 = 6;
+ initialULBWPmappingType_0 = 1
+ # this is SS=0 L=11
+ initialULBWPstartSymbolAndLength_0 = 55;
+
+ initialULBWPk2_1 = 6;
+ initialULBWPmappingType_1 = 1;
+ # this is SS=0 L=12
+ initialULBWPstartSymbolAndLength_1 = 69;
+
+ initialULBWPk2_2 = 14;
+ initialULBWPmappingType_2 = 1;
+ # this is SS=10 L=4
+ initialULBWPstartSymbolAndLength_2 = 52;
+
+ 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_PositionsInBurs_BitmapPR
+# 1=short, 2=medium, 3=long
+ ssb_PositionsInBurst_PR = 3;
+ ssb_PositionsInBurst_Bitmap = 0x0001000100010001L;
+
+# 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 = 3;
+
+
+ #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ referenceSubcarrierSpacing = 3;
+ # pattern1
+ # dl_UL_TransmissionPeriodicity
+ # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+ dl_UL_TransmissionPeriodicity = 3;
+ nrofDownlinkSlots = 7;
+ nrofDownlinkSymbols = 6;
+ nrofUplinkSlots = 2;
+ nrofUplinkSymbols = 4;
+
+ ssPBCH_BlockPower = 10;
+ }
+
+ );
+
+
+ # ------- SCTP definitions
+ SCTP :
+ {
+ # Number of streams to use in input/output
+ SCTP_INSTREAMS = 2;
+ SCTP_OUTSTREAMS = 2;
+ };
+
+
+ ////////// MME parameters:
+ mme_ip_address = ( { ipv4 = "192.168.18.99";
+ ipv6 = "192:168:30::17";
+ active = "yes";
+ preference = "ipv4";
+ }
+ );
+
+ ///X2
+ enable_x2 = "no";
+ t_reloc_prep = 1000; /* unit: millisecond */
+ tx2_reloc_overall = 2000; /* unit: millisecond */
+ t_dc_prep = 1000; /* unit: millisecond */
+ t_dc_overall = 2000; /* unit: millisecond */
+ target_enb_x2_ip_address = (
+ { ipv4 = "192.168.18.199";
+ ipv6 = "192:168:30::17";
+ preference = "ipv4";
+ }
+ );
+
+ NETWORK_INTERFACES :
+ {
+
+ GNB_INTERFACE_NAME_FOR_S1_MME = "eth0";
+ GNB_IPV4_ADDRESS_FOR_S1_MME = "192.168.18.198/24";
+ GNB_INTERFACE_NAME_FOR_S1U = "eth0";
+ GNB_IPV4_ADDRESS_FOR_S1U = "192.168.18.198/24";
+ GNB_PORT_FOR_S1U = 2152; # Spec 2152
+ GNB_IPV4_ADDRESS_FOR_X2C = "192.168.18.198/24";
+ GNB_PORT_FOR_X2C = 36422; # Spec 36422
+ };
+ }
+);
+
+MACRLCs = (
+ {
+ num_cc = 1;
+ tr_s_preference = "local_L1";
+ tr_n_preference = "local_RRC";
+ }
+);
+
+L1s = (
+ {
+ num_cc = 1;
+ tr_n_preference = "local_mac";
+ pusch_proc_threads = 8;
+ }
+);
+
+RUs = (
+ {
+ local_rf = "yes"
+ nb_tx = 1;
+ nb_rx = 1;
+ att_tx = 0;
+ att_rx = 0;
+ bands = [7];
+ max_pdschReferenceSignalPower = -27;
+ max_rxgain = 75;
+ eNB_instances = [0];
+ sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2";
+ if_freq = 5124520000L;
+ clock_src = "external";
+ time_src = "external";
+ }
+);
+
+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";
+ }
+);
+
+ log_config :
+ {
+ global_log_level ="info";
+ global_log_verbosity ="medium";
+ hw_log_level ="info";
+ hw_log_verbosity ="medium";
+ phy_log_level ="info";
+ phy_log_verbosity ="medium";
+ mac_log_level ="info";
+ mac_log_verbosity ="high";
+ rlc_log_level ="info";
+ rlc_log_verbosity ="medium";
+ pdcp_log_level ="info";
+ pdcp_log_verbosity ="medium";
+ rrc_log_level ="info";
+ rrc_log_verbosity ="medium";
+ };
+
diff --git a/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf
index 32de0aa4f5..fc32d65a23 100644
--- a/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf
+++ b/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf
@@ -185,7 +185,7 @@ gNBs =
nrofUplinkSlots = 2;
nrofUplinkSymbols = 4;
- ssPBCH_BlockPower = 10;
+ ssPBCH_BlockPower = -25;
}
);
diff --git a/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf
index decaa392d7..b1d72c2269 100644
--- a/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf
+++ b/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
@@ -46,7 +47,7 @@ gNBs =
#initialDownlinkBWP
#genericParameters
# this is RBstart=41,L=24 (275*(L-1))+RBstart
- initialDLBWPlocationAndBandwidth = 6366;
+ initialDLBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
@@ -89,7 +90,7 @@ gNBs =
pMax = 20;
#initialUplinkBWP
#genericParameters
- initialULBWPlocationAndBandwidth = 6366;
+ initialULBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
@@ -186,7 +187,7 @@ gNBs =
nrofUplinkSlots = 2;
nrofUplinkSymbols = 4;
- ssPBCH_BlockPower = 10;
+ ssPBCH_BlockPower = -25;
}
);
@@ -240,7 +241,7 @@ L1s = (
RUs = (
{
- local_rf = "yes"
+ local_rf = "yes"
nb_tx = 1
nb_rx = 1
att_tx = 0
@@ -249,12 +250,12 @@ RUs = (
max_pdschReferenceSignalPower = -27;
max_rxgain = 75;
eNB_instances = [0];
- ##beamforming 1x2 matrix: 1 layer x 2 antennas
+ ## beamforming 1x2 matrix: 1 layer x 2 antennas
bf_weights = [0x00007fff, 0x0000];
- ##beamforming 1x4 matrix: 1 layer x 4 antennas
+ ## beamforming 1x4 matrix: 1 layer x 4 antennas
#bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
## beamforming 2x2 matrix:
- # bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
+ #bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
## beamforming 4x4 matrix:
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
diff --git a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf
index 258618e7f0..daee5486c1 100644
--- a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf
+++ b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf
@@ -48,7 +48,7 @@ gNBs =
#initialDownlinkBWP
#genericParameters
# this is RBstart=84,L=13 (275*(L-1))+RBstart
- initialDLBWPlocationAndBandwidth = 6366; //28875; //6366; #6407; #3384;
+ initialDLBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
@@ -90,7 +90,7 @@ gNBs =
pMax = 20;
#initialUplinkBWP
#genericParameters
- initialULBWPlocationAndBandwidth = 6366; //28875; //6366; #6407; #3384;
+ initialULBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
diff --git a/ci-scripts/docker_log_split.py b/ci-scripts/docker_log_split.py
new file mode 100644
index 0000000000..8c3c9e41dc
--- /dev/null
+++ b/ci-scripts/docker_log_split.py
@@ -0,0 +1,92 @@
+#/*
+# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+# * contributor license agreements. See the NOTICE file distributed with
+# * this work for additional information regarding copyright ownership.
+# * The OpenAirInterface Software Alliance licenses this file to You under
+# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
+# * except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# * http://www.openairinterface.org/?page_id=698
+# *
+# * 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.
+# *-------------------------------------------------------------------------------
+# * For more information about the OpenAirInterface (OAI) Software Alliance:
+# * contact@openairinterface.org
+# */
+#---------------------------------------------------------------------
+# Python for CI of OAI-eNB + COTS-UE
+#
+# Required Python Version
+# Python 3.x
+#
+# Required Python Package
+# pexpect
+#---------------------------------------------------------------------
+
+
+#-----------------------------------------------------------
+# Import Libs
+#-----------------------------------------------------------
+import sys # arg
+import re # reg
+import os
+import subprocess
+
+
+class SplitReport():
+ def __init__(self):
+ self.logfilename = ''
+ self.destinationFolder = ''
+
+ def split(self):
+ self.destinationFolder = self.logfilename.replace(".log","")
+ if os.path.isfile(self.logfilename):
+ newImageLog = open(self.logfilename + '.new', 'w')
+ copyFlag = True
+ with open(self.logfilename, 'r') as imageLog:
+ for line in imageLog:
+ header = False
+ ret = re.search('====== Start of log for ([0-9\.A-Za-z\-\_]+) ======', line)
+ if ret is not None:
+ copyFlag = False
+ header = True
+ detailedLogFile = open(self.destinationFolder + '/' + ret.group(1), 'w')
+ if copyFlag:
+ newImageLog.write(line)
+ ret = re.search('====== End of log for ([0-9\.A-Za-z\-\_]+) ======', line)
+ if ret is not None:
+ copyFlag = True
+ detailedLogFile.close()
+ elif not copyFlag and not header:
+ detailedLogFile.write(line)
+ imageLog.close()
+ newImageLog.close()
+ os.rename(self.logfilename + '.new', self.logfilename)
+ else:
+ print('Cannot split unfound file')
+
+#--------------------------------------------------------------------------------------------------------
+#
+# Start of main
+#
+#--------------------------------------------------------------------------------------------------------
+
+argvs = sys.argv
+argc = len(argvs)
+
+SP = SplitReport()
+
+while len(argvs) > 1:
+ myArgv = argvs.pop(1)
+ if re.match('^\-\-logfilename=(.+)$', myArgv, re.IGNORECASE):
+ matchReg = re.match('^\-\-logfilename=(.+)$', myArgv, re.IGNORECASE)
+ SP.logfilename = matchReg.group(1)
+
+SP.split()
+
+sys.exit(0)
diff --git a/ci-scripts/ran.py b/ci-scripts/ran.py
index 774d7f19c6..783adb98e6 100644
--- a/ci-scripts/ran.py
+++ b/ci-scripts/ran.py
@@ -239,6 +239,7 @@ class RANManagement():
while (count > 0) and buildOAIprocess:
mySSH.command('ps aux | grep --color=never build_ | grep -v grep', '\$', 6)
result = re.search('build_oai', mySSH.getBefore())
+ print(result)
if result is None:
buildOAIprocess = False
else:
@@ -464,7 +465,7 @@ class RANManagement():
self.prematureExit = True
return
else:
- mySSH.command('stdbuf -o0 cat enb_' + self.testCase_id + '.log | egrep --text --color=never -i "wait|sync|Starting"', '\$', 4)
+ mySSH.command('stdbuf -o0 cat enb_' + self.testCase_id + '.log | egrep --text --color=never -i "wait|sync|Starting|Started"', '\$', 4)
if rruCheck:
result = re.search('wait RUs', mySSH.getBefore())
else:
diff --git a/ci-scripts/reportTestLocally.sh b/ci-scripts/reportTestLocally.sh
index 415ded57a4..c4fa817b06 100755
--- a/ci-scripts/reportTestLocally.sh
+++ b/ci-scripts/reportTestLocally.sh
@@ -749,6 +749,77 @@ function report_test {
echo " " >> ./test_simulator_results.html
EPC_CONFIGS=("noS1")
+ TRANS_MODES=("tdd")
+ FR_MODE=("FR2")
+ BW_CASES=(32)
+ for CN_CONFIG in ${EPC_CONFIGS[@]}
+ do
+ for TMODE in ${TRANS_MODES[@]}
+ do
+ for BW in ${BW_CASES[@]}
+ do
+ echo " " >> ./test_simulator_results.html
+ if [[ $CN_CONFIG =~ .*wS1.* ]]
+ then
+ echo " | Test with EPC (aka withS1): ${TMODE} -- ${BW}PRB -- ${FR_MODE} | " >> ./test_simulator_results.html
+ else
+ echo " Test without EPC (aka noS1): ${TMODE} -- ${BW}PRB -- ${FR_MODE} | " >> ./test_simulator_results.html
+ fi
+ echo "
" >> ./test_simulator_results.html
+
+
+ #FR2 RA test (--do-ra option)
+
+ #build log files names tdd_${PRB}prb_${CN_CONFIG}_gnb_ra_fr2_test.log
+
+ RA_ENB_LOG=$ARCHIVES_LOC/${TMODE}_${BW}prb_${CN_CONFIG}_gnb_ra_fr2_test.log
+ RA_UE_LOG=$ARCHIVES_LOC/${TMODE}_${BW}prb_${CN_CONFIG}_ue_ra_fr2_test.log
+ if [ -f $RA_ENB_LOG ] && [ -f $RA_UE_LOG ]
+ then
+ #get rid of full path
+ NAME_ENB=`echo $RA_ENB_LOG | sed -e "s#$ARCHIVES_LOC/##"`
+ NAME_UE=`echo $RA_UE_LOG | sed -e "s#$ARCHIVES_LOC/##"`
+ echo " " >> ./test_simulator_results.html
+ echo " | $NAME_ENB --- $NAME_UE | " >> ./test_simulator_results.html
+ echo " Check if FR2 RA proc succeeded | " >> ./test_simulator_results.html
+
+ #gNB RA check
+ GNB_RECEIVED=`egrep -c "\[RAPROC\] PUSCH with TC_RNTI (.+) received correctly" $RA_ENB_LOG`
+ #UE RA check
+ UE_RA_PROC_OK=`egrep -c "\[RAPROC\] RA procedure succeeded" $RA_UE_LOG`
+
+
+ if [ $GNB_RECEIVED -gt 0 ] && [ $UE_RA_PROC_OK -gt 0 ]
+ then
+ echo " OK | " >> ./test_simulator_results.html
+ else
+ echo " KO | " >> ./test_simulator_results.html
+ fi
+
+ echo " " >> ./test_simulator_results.html
+ if [ $GNB_RECEIVED -gt 0 ]
+ then
+ echo "- gNB --> RA received" >> ./test_simulator_results.html
+ else
+ echo "- gNB RA NOT RECEIVED" >> ./test_simulator_results.html
+ fi
+ if [ $UE_RA_PROC_OK -gt 0 ]
+ then
+ echo "- NR UE --> RA procedure succeded" >> ./test_simulator_results.html
+ else
+ echo "- NR UE RA procedure failed" >> ./test_simulator_results.html
+ fi
+ echo " | " >> ./test_simulator_results.html
+ echo "
" >> ./test_simulator_results.html
+ fi
+
+ done
+ done
+ done
+
+
+ EPC_CONFIGS=("noS1")
+ FR_MODE=("FR1")
TRANS_MODES=("fdd" "tdd")
BW_CASES=(106)
for CN_CONFIG in ${EPC_CONFIGS[@]}
@@ -760,13 +831,14 @@ function report_test {
echo " " >> ./test_simulator_results.html
if [[ $CN_CONFIG =~ .*wS1.* ]]
then
- echo " | Test with EPC (aka withS1): ${TMODE} -- ${BW}PRB | " >> ./test_simulator_results.html
+ echo " Test with EPC (aka withS1): ${TMODE} -- ${BW}PRB -- ${FR_MODE} | " >> ./test_simulator_results.html
else
- echo " Test without EPC (aka noS1): ${TMODE} -- ${BW}PRB | " >> ./test_simulator_results.html
+ echo " Test without EPC (aka noS1): ${TMODE} -- ${BW}PRB -- ${FR_MODE} | " >> ./test_simulator_results.html
fi
echo "
" >> ./test_simulator_results.html
- #RA test (--do-ra option)
+
+ #FR1 RA test (--do-ra option)
#build log files names
RA_ENB_LOG=$ARCHIVES_LOC/${TMODE}_${BW}prb_${CN_CONFIG}_gnb_ra_test.log
@@ -778,7 +850,7 @@ function report_test {
NAME_UE=`echo $RA_UE_LOG | sed -e "s#$ARCHIVES_LOC/##"`
echo " " >> ./test_simulator_results.html
echo " | $NAME_ENB --- $NAME_UE | " >> ./test_simulator_results.html
- echo " Check if RA proc succeeded | " >> ./test_simulator_results.html
+ echo " Check if FR1 RA proc succeeded | " >> ./test_simulator_results.html
#gNB RA check
GNB_RECEIVED=`egrep -c "\[RAPROC\] PUSCH with TC_RNTI (.+) received correctly" $RA_ENB_LOG`
diff --git a/ci-scripts/runTestOnVM.sh b/ci-scripts/runTestOnVM.sh
index f818685049..6725d2f62b 100755
--- a/ci-scripts/runTestOnVM.sh
+++ b/ci-scripts/runTestOnVM.sh
@@ -2189,6 +2189,98 @@ function run_test_on_vm {
if [[ "$RUN_OPTIONS" == "complex" ]] && [[ $VM_NAME =~ .*-rf-sim.* ]]
then
+ echo "############################################################"
+ echo "RA TEST FR2"
+ echo "############################################################"
+ #RA FR2 test, attention : has a different config file from the rest of the test
+ CN_CONFIG="noS1"
+ CONF_FILE=gnb.band261.tm1.32PRB.usrpn300.conf
+ S1_NOS1_CFG=0
+ PRB=32
+ FREQUENCY=28000 #28GHz
+
+ if [ ! -d $ARCHIVES_LOC ]
+ then
+ mkdir --parents $ARCHIVES_LOC
+ fi
+
+ local try_cnt=0
+ NR_STATUS=0
+
+ ######### start of RA TEST loop
+ while [ $try_cnt -lt 5 ] #5 because it hardly succeed within CI
+ do
+
+ SYNC_STATUS=0
+ RA_FR2_STATUS=0
+ rm -f $ARCHIVES_LOC/tdd_${PRB}prb_${CN_CONFIG}*ra_fr2_test.log
+
+ echo "############################################################"
+ echo "${CN_CONFIG} : Starting the gNB"
+ echo "############################################################"
+ CURRENT_GNB_LOG_FILE=tdd_${PRB}prb_${CN_CONFIG}_gnb_ra_fr2_test.log
+ #last argument = 1 is to enable --do-ra for RA test
+ start_rf_sim_gnb $GNB_VM_CMDS "$GNB_VM_IP_ADDR" $CURRENT_GNB_LOG_FILE $PRB $CONF_FILE $S1_NOS1_CFG 1
+
+ echo "############################################################"
+ echo "${CN_CONFIG} : Starting the NR-UE"
+ echo "############################################################"
+ CURRENT_NR_UE_LOG_FILE=tdd_${PRB}prb_${CN_CONFIG}_ue_ra_fr2_test.log
+ #last argument = 1 is to enable --do-ra for RA test
+ start_rf_sim_nr_ue $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $GNB_VM_IP_ADDR $CURRENT_NR_UE_LOG_FILE $PRB $FREQUENCY $S1_NOS1_CFG 1
+ if [ $NR_UE_SYNC -eq 0 ]
+ then
+ echo "Problem w/ gNB and NR-UE not syncing"
+ terminate_enb_ue_basic_sim $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 2
+ terminate_enb_ue_basic_sim $GNB_VM_CMDS $GNB_VM_IP_ADDR 1
+ scp -o StrictHostKeyChecking=no ubuntu@$GNB_VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_GNB_LOG_FILE $ARCHIVES_LOC
+ scp -o StrictHostKeyChecking=no ubuntu@$NR_UE_VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_NR_UE_LOG_FILE $ARCHIVES_LOC
+ SYNC_STATUS=-1
+ try_cnt=$((try_cnt+1))
+ continue
+ fi
+
+ echo "############################################################"
+ echo "${CN_CONFIG} : Terminate gNB/NR-UE simulators"
+ echo "############################################################"
+ sleep 20
+ terminate_enb_ue_basic_sim $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 2
+ terminate_enb_ue_basic_sim $GNB_VM_CMDS $GNB_VM_IP_ADDR 1
+ scp -o StrictHostKeyChecking=no ubuntu@$GNB_VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_GNB_LOG_FILE $ARCHIVES_LOC
+ scp -o StrictHostKeyChecking=no ubuntu@$NR_UE_VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_NR_UE_LOG_FILE $ARCHIVES_LOC
+
+ #check RA markers in gNB and NR UE log files
+ echo "############################################################"
+ echo "${CN_CONFIG} : Checking FR2 RA on gNB / NR-UE"
+ echo "############################################################"
+
+ # Proper check to be done when RA test is working!
+ check_ra_result $ARCHIVES_LOC/$CURRENT_GNB_LOG_FILE $ARCHIVES_LOC/$CURRENT_NR_UE_LOG_FILE
+ if [ $RA_FR2_STATUS -ne 0 ]
+ then
+ echo "RA FR2 test NOT OK"
+ echo "try_cnt = " $try_cnt
+ try_cnt=$((try_cnt+1))
+ else
+ try_cnt=$((try_cnt+10))
+ fi
+ done
+ ########### end RA FR2 test
+
+ sleep 30
+
+
+ echo "############################################################"
+ echo "RA TEST FR1"
+ echo "############################################################"
+ ######### redefine config for the rest of the test
+
+ CN_CONFIG="noS1"
+ CONF_FILE=gnb.band78.tm1.106PRB.usrpn300.conf
+ S1_NOS1_CFG=0
+ PRB=106
+ FREQUENCY=3510
+
if [ ! -d $ARCHIVES_LOC ]
then
mkdir --parents $ARCHIVES_LOC
@@ -2258,14 +2350,14 @@ function run_test_on_vm {
#check RA markers in gNB and NR UE log files
echo "############################################################"
- echo "${CN_CONFIG} : Checking RA on gNB / NR-UE"
+ echo "${CN_CONFIG} : Checking FR1 RA on gNB / NR-UE"
echo "############################################################"
# Proper check to be done when RA test is working!
check_ra_result $ARCHIVES_LOC/$CURRENT_GNB_LOG_FILE $ARCHIVES_LOC/$CURRENT_NR_UE_LOG_FILE
if [ $RA_STATUS -ne 0 ]
then
- echo "RA test NOT OK"
+ echo "RA FR1 test NOT OK"
echo "try_cnt = " $try_cnt
try_cnt=$((try_cnt+1))
else
@@ -2401,6 +2493,7 @@ function run_test_on_vm {
echo "Checking run status"
echo "############################################################"
+ if [ $RA_FR2_STATUS -ne 0 ]; then NR_STATUS=-1; fi
if [ $RA_STATUS -ne 0 ]; then NR_STATUS=-1; fi
if [ $SYNC_STATUS -ne 0 ]; then NR_STATUS=-1; fi
if [ $PING_STATUS -ne 0 ]; then NR_STATUS=-1; fi
diff --git a/ci-scripts/xml_files/benetel_multi_node_build.xml b/ci-scripts/xml_files/benetel_multi_node_build.xml
new file mode 100644
index 0000000000..5ac28951b4
--- /dev/null
+++ b/ci-scripts/xml_files/benetel_multi_node_build.xml
@@ -0,0 +1,54 @@
+
+
+ build-tab
+ Build
+ wrench
+
+ 000001 000002
+
+
+
+
+ Build_eNB
+ Build eNB
+ --eNB -t benetel4g -w None
+ True
+ 0
+ 0
+
+
+
+
+ Build_eNB
+ Build gNB
+ --gNB -t benetel5g -w None
+ True
+ 1
+ 1
+
+
+
+
+
+
diff --git a/ci-scripts/xml_files/benetel_nsa_base.xml b/ci-scripts/xml_files/benetel_nsa_base.xml
new file mode 100644
index 0000000000..0aed28dffa
--- /dev/null
+++ b/ci-scripts/xml_files/benetel_nsa_base.xml
@@ -0,0 +1,162 @@
+
+
+ TEST-FR1-TM1
+ FR1
+ tasks
+
+ 010000
+ 030000
+ 040000
+ 010001
+ 000001
+ 050000
+ 050001
+ 000001
+ 060000
+ 060001
+ 000001
+ 070000
+ 070001
+ 010002
+ 000001
+ 080001
+ 080000
+ 010003
+
+
+
+
+ Initialize_UE
+ Initialize UE
+
+
+
+ Terminate_UE
+ Terminate UE
+
+
+
+ Attach_UE
+ Attach UE
+
+
+
+ Detach_UE
+ Detach UE
+
+
+
+
+ Initialize_eNB
+ Initialize eNB
+ -O ci-scripts/conf_files/benetel-4g.conf
+ 0
+ 0
+ lte
+
+
+
+
+ Initialize_eNB
+ Initialize gNB
+ -O ci-scripts/conf_files/benetel-5g.conf
+ 1
+ 1
+ nr
+
+
+
+ IdleSleep
+ Sleep
+ 20
+
+
+
+ Ping
+ Ping: 20pings in 20sec
+ -c 20
+ 50
+
+
+
+ Ping
+ Ping: 100pings in 20sec
+ -c 100 -i 0.2
+ 50
+
+
+
+
+ Iperf
+ iperf (DL/2.5Mbps/UDP)(60 sec)(single-ue profile)
+ -u -b 2.5M -t 60 -i 1
+ 50
+ single-ue
+
+
+
+ Iperf
+ iperf (UL/1.5Mbps/UDP)(60 sec)(single-ue profile)
+ -u -b 1.5M -t 60 -i 1 -R
+ 50
+ single-ue
+
+
+
+
+ Iperf
+ iperf (DL/20Mbps/UDP)(20 sec)(single-ue profile)
+ -u -b 20M -t 20 -i 1
+ 50
+ single-ue
+
+
+
+ Iperf
+ iperf (UL/3Mbps/UDP)(20 sec)(single-ue profile)
+ -u -b 3M -t 20 -i 1 -R
+ 50
+ single-ue
+
+
+
+
+
+ Terminate_eNB
+ Terminate eNB
+ 0
+ 0
+ lte
+
+
+
+ Terminate_eNB
+ Terminate gNB
+ 1
+ 1
+ nr
+
+
+
+
diff --git a/ci-scripts/xml_files/fr1_image_build.xml b/ci-scripts/xml_files/container_image_build.xml
similarity index 93%
rename from ci-scripts/xml_files/fr1_image_build.xml
rename to ci-scripts/xml_files/container_image_build.xml
index 9dd386b646..430729c49c 100644
--- a/ci-scripts/xml_files/fr1_image_build.xml
+++ b/ci-scripts/xml_files/container_image_build.xml
@@ -22,7 +22,7 @@
-->
build-tab
- Build
+ Build Container Images
wrench
000001
@@ -31,7 +31,7 @@
Build_Image
- Build eNB Image
+ Build all Images
all
0
0
diff --git a/ci-scripts/xml_files/fr1_multi_node_build.xml b/ci-scripts/xml_files/fr1_multi_node_build.xml
index 7b4eacef3a..57c4685341 100644
--- a/ci-scripts/xml_files/fr1_multi_node_build.xml
+++ b/ci-scripts/xml_files/fr1_multi_node_build.xml
@@ -37,6 +37,7 @@
0
0
True
+ True
@@ -53,6 +54,7 @@
1
1
True
+ True
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index c16170f932..ff1940aadd 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -832,7 +832,7 @@ add_library(F1AP
# Hardware dependant options
###################################
-add_list1_option(NB_ANTENNAS_RX "2" "Number of antennas in reception" "1" "2" "4")
+add_list1_option(NB_ANTENNAS_RX "4" "Number of antennas in reception" "1" "2" "4")
add_list1_option(NB_ANTENNAS_TX "4" "Number of antennas in transmission" "1" "2" "4")
add_list2_option(RF_BOARD "EXMIMO" "RF head type" "None" "OAI_USRP" "OAI_BLADERF" "OAI_LMSSDR" "OAI_SIMU")
@@ -926,6 +926,9 @@ set_target_properties(tcp_bridge_oai PROPERTIES COMPILE_FLAGS "-fvisibility=hidd
# Benetel 4G library
######################################################################
+
+include_directories ("/usr/include/dpdk")
+
set(HWLIB_BENETEL_4G_SOURCE
${OPENAIR_TARGETS}/ARCH/ETHERNET/benetel/4g/benetel.c
${OPENAIR_TARGETS}/ARCH/ETHERNET/benetel/4g/shared_buffers.c
@@ -1970,6 +1973,7 @@ set(NR_PDCP_SRC
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_sdu.c
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_timer_thread.c
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_security_nea2.c
+ ${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_integrity_nia2.c
${OPENAIR2_DIR}/LAYER2/nr_pdcp/asn1_utils.c
)
@@ -3320,7 +3324,7 @@ add_executable(nr_dlsim
)
target_link_libraries(nr_dlsim
-Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON RRC_LIB NR_RRC_LIB CONFIG_LIB L2_LTE_NR L2_NR HASHTABLE X2AP_ENB X2AP_LIB SECU_CN NGAP_GNB -Wl,--end-group
- m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl
+ m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} ${OPENSSL_LIBRARIES} dl
)
target_compile_definitions(nr_dlsim PUBLIC -DPHYSICAL_SIMULATOR)
@@ -3339,7 +3343,7 @@ add_executable(nr_prachsim
${SHLIB_LOADER_SOURCES})
target_link_libraries(nr_prachsim
-Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_RU PHY_NR_UE MAC_NR_COMMON SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON RRC_LIB NR_RRC_LIB CONFIG_LIB L2_LTE_NR L2_NR HASHTABLE X2AP_ENB X2AP_LIB SECU_CN NGAP_GNB -Wl,--end-group
- m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl)
+ m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} ${OPENSSL_LIBRARIES} dl)
add_executable(nr_ulschsim
${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulschsim.c
@@ -3372,7 +3376,7 @@ add_executable(nr_ulsim
)
target_link_libraries(nr_ulsim
-Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON RRC_LIB NR_RRC_LIB CONFIG_LIB L2_LTE_NR L2_NR HASHTABLE X2AP_ENB X2AP_LIB SECU_CN NGAP_GNB -Wl,--end-group
- m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl
+ m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} ${OPENSSL_LIBRARIES} dl
)
target_compile_definitions(nr_ulsim PUBLIC -DPHYSICAL_SIMULATOR)
diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai
index 960b241047..dba6d7da6d 100755
--- a/cmake_targets/build_oai
+++ b/cmake_targets/build_oai
@@ -48,8 +48,9 @@ DEADLINE_SCHEDULER_FLAG_USER=""
CPU_AFFINITY_FLAG_USER="False" #Only valid when low-latency flag is set to False
REL="Rel15"
HW="None"
-TP="None"
+TP="Ethernet"
EPC=0
+VERBOSE_CI=0
VERBOSE_COMPILE=0
CFLAGS_PROCESSOR_USER=""
RUN_GROUP=0
@@ -289,6 +290,9 @@ function main() {
esac
echo_info "Setting hardware to: $HW"
shift 2;;
+ -t | --transport)
+ TP=$2
+ shift 2;;
-P | --phy_simulators)
SIMUS_PHY=1
echo_info "Will compile dlsim, ulsim, ..."
@@ -324,6 +328,10 @@ function main() {
HWLAT_TEST=1
echo_info "Will compile hw latency test program"
shift;;
+ --verbose-ci)
+ VERBOSE_CI=1
+ echo_info "Will compile with verbose instructions in CI Docker env"
+ shift;;
--verbose-compile)
VERBOSE_COMPILE=1
echo_info "Will compile with verbose instructions"
@@ -936,12 +944,30 @@ function main() {
echo_info "Building transport protocol libraries"
rm -f liboai_transpro.so
rm -f $dbin/liboai_transpro.so
- compilations \
- $build_dir oai_eth_transpro \
- liboai_eth_transpro.so $dbin/liboai_eth_transpro.so.$REL
- ln -sf liboai_eth_transpro.so liboai_transpro.so
- ln -sf $dbin/liboai_eth_transpro.so.$REL $dbin/liboai_transpro.so
- echo_info "liboai_transpro.so is linked to ETHERNET transport"
+ if [ "$TP" == "Ethernet" ]; then
+ compilations \
+ $build_dir oai_eth_transpro \
+ liboai_eth_transpro.so $dbin/liboai_eth_transpro.so.$REL
+ ln -sf liboai_eth_transpro.so liboai_transpro.so
+ ln -sf $dbin/liboai_eth_transpro.so.$REL $dbin/liboai_transpro.so
+ echo_info "liboai_transpro.so is linked to ETHERNET transport"
+ fi
+ if [ "$TP" == "benetel4g" ]; then
+ compilations \
+ $build_dir benetel_4g \
+ libbenetel_4g.so $dbin/libbenetel_4g.$REL
+ ln -sf libbenetel_4g.so liboai_transpro.so
+ ln -sf $dbin/libbenetel_4g.so.$REL $dbin/liboai_transpro.so
+ echo_info "liboai_transpro.so is linked to BENETEL4G transport"
+ fi
+ if [ "$TP" == "benetel5g" ]; then
+ compilations \
+ $build_dir benetel_5g \
+ libbenetel_5g.so $dbin/libbenetel_5g.$REL
+ ln -sf libbenetel_5g.so liboai_transpro.so
+ ln -sf $dbin/libbenetel_5g.so.$REL $dbin/liboai_transpro.so
+ echo_info "liboai_transpro.so is linked to BENETEL4G transport"
+ fi
fi
fi
diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper
index 977827b0c9..9b8363fc2b 100755
--- a/cmake_targets/tools/build_helper
+++ b/cmake_targets/tools/build_helper
@@ -41,7 +41,7 @@ KERNEL_VERSION=$(uname -r | cut -d '.' -f1)
KERNEL_MAJOR=$(uname -r | cut -d '.' -f2)
#check if we run inside a container
-IS_CONTAINER=`egrep -c "docker|podman|kubepods" /proc/self/cgroup || true`
+IS_CONTAINER=`egrep -c "docker|podman|kubepods|libpod|buildah" /proc/self/cgroup || true`
#sudo is not needed when we are root
if [ "$UID" = 0 ]
then
@@ -221,6 +221,11 @@ compilations() {
ret=$?
} > $dlog/$2.$REL.txt 2>&1
set -e
+ if [ "$VERBOSE_CI" == "1" ]; then
+ echo_info "====== Start of log for $2.$REL.txt ======"
+ cat $dlog/$2.$REL.txt
+ echo_info "====== End of log for $2.$REL.txt ======"
+ fi
if [[ $ret -ne 0 ]]; then
check_warnings "$dlog/$2.$REL.txt"
check_errors "$dlog/$2.$REL.txt"
@@ -359,10 +364,10 @@ check_install_usrp_uhd_driver(){
elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then
if [ $IS_CONTAINER -eq 0 ]
then
- $SUDO $INSTALLER -y install python boost libusb-devel libusbx-devel boost-devel python-mako python-docutils cmake
+ $SUDO $INSTALLER -y install python boost libusb-devel libusbx-devel boost-devel python-mako python-docutils $CMAKE
$SUDO -H pip install requests
else
- $SUDO $INSTALLER -y install boost boost-devel cmake3
+ $SUDO $INSTALLER -y install boost boost-devel $CMAKE
$SUDO pip3 install mako requests
fi
if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]]; then
@@ -488,7 +493,7 @@ install_soapy_from_source(){
#git checkout tags/release_003_010_001_001
mkdir -p build
cd build
- cmake ../
+ $CMAKE ../
echo "Compiling SoapyRemote"
make -j`nproc`
$SUDO make install
@@ -507,7 +512,7 @@ install_soapy_iris_from_source(){
cd sklk-soapyiris
mkdir -p build
cd build
- cmake ../
+ $CMAKE ../
echo "Compiling SoapyIris"
make -j`nproc`
$SUDO make install
@@ -684,7 +689,7 @@ check_install_oai_software() {
automake \
bison \
build-essential \
- cmake \
+ $CMAKE \
cmake-curses-gui \
ninja-build \
doxygen \
diff --git a/common/utils/LOG/vcd_signal_dumper.c b/common/utils/LOG/vcd_signal_dumper.c
index bd598b48da..5bf9759933 100644
--- a/common/utils/LOG/vcd_signal_dumper.c
+++ b/common/utils/LOG/vcd_signal_dumper.c
@@ -302,6 +302,9 @@ const char* eurecomFunctionsNames[] = {
/* PHY signals */
"ue_synch",
"ue_slot_fep",
+ "ue_slot_fep_pdcch",
+ "ue_slot_fep_pbch",
+ "ue_slot_fep_pdsch",
"ue_slot_fep_mbsfn",
"ue_slot_fep_mbsfn_khz_1dot25",
"ue_rrc_measurements",
@@ -390,6 +393,8 @@ const char* eurecomFunctionsNames[] = {
"rx_pmch",
"rx_pmch_khz_1dot25",
"pdsch_procedures",
+ "pdsch_procedures_crnti",
+ //"dlsch_procedures_crnti",
"pdsch_procedures_si",
"pdsch_procedures_p",
"pdsch_procedures_ra",
diff --git a/common/utils/LOG/vcd_signal_dumper.h b/common/utils/LOG/vcd_signal_dumper.h
index f9f5868260..fb27c19973 100644
--- a/common/utils/LOG/vcd_signal_dumper.h
+++ b/common/utils/LOG/vcd_signal_dumper.h
@@ -283,6 +283,9 @@ typedef enum {
/* PHY signals */
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SYNCH,
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP,
+ VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PDCCH,
+ VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PBCH,
+ VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PDSCH,
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_MBSFN,
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_MBSFN_KHZ_1DOT25,
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_RRC_MEASUREMENTS,
@@ -371,9 +374,11 @@ typedef enum {
VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PMCH,
VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PMCH_KHZ_1DOT25,
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC,
+ VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_C,
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_SI,
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_P,
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_RA,
+ //VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_PROC_C,
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_UE_CONFIG_SIB2,
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_CONFIG_SIB1_ENB,
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_CONFIG_SIB2_ENB,
diff --git a/common/utils/T/T_defs.h b/common/utils/T/T_defs.h
index 11c816f002..8cd86546cb 100644
--- a/common/utils/T/T_defs.h
+++ b/common/utils/T/T_defs.h
@@ -73,7 +73,7 @@ typedef struct {
} T_cache_t;
/* number of VCD functions (to be kept up to date! see in T_messages.txt) */
-#define VCD_NUM_FUNCTIONS (269)
+#define VCD_NUM_FUNCTIONS (273)
/* number of VCD variables (to be kept up to date! see in T_messages.txt) */
#define VCD_NUM_VARIABLES (187)
diff --git a/common/utils/T/T_messages.txt b/common/utils/T/T_messages.txt
index fedc50cf5d..91da823c61 100644
--- a/common/utils/T/T_messages.txt
+++ b/common/utils/T/T_messages.txt
@@ -2407,6 +2407,21 @@ ID = VCD_FUNCTION_UE_SLOT_FEP
GROUP = ALL:VCD:UE:VCD_FUNCTION
FORMAT = int,value
VCD_NAME = ue_slot_fep
+ID = VCD_FUNCTION_UE_SLOT_FEP_PDCCH
+ DESC = VCD function UE_SLOT_FEP_PDCCH
+ GROUP = ALL:VCD:UE:VCD_FUNCTION
+ FORMAT = int,value
+ VCD_NAME = ue_slot_fep_pdcch
+ID = VCD_FUNCTION_UE_SLOT_FEP_PBCH
+ DESC = VCD function UE_SLOT_FEP_PBCH
+ GROUP = ALL:VCD:UE:VCD_FUNCTION
+ FORMAT = int,value
+ VCD_NAME = ue_slot_fep_pbch
+ID = VCD_FUNCTION_UE_SLOT_FEP_PDSCH
+ DESC = VCD function UE_SLOT_FEP_PDSCH
+ GROUP = ALL:VCD:UE:VCD_FUNCTION
+ FORMAT = int,value
+ VCD_NAME = ue_slot_fep_pdsch
ID = VCD_FUNCTION_UE_SLOT_FEP_MBSFN
DESC = VCD function UE_SLOT_FEP_MBSFN
GROUP = ALL:VCD:UE:VCD_FUNCTION
@@ -2847,6 +2862,11 @@ ID = VCD_FUNCTION_PDSCH_PROC
GROUP = ALL:VCD:UE:VCD_FUNCTION
FORMAT = int,value
VCD_NAME = pdsch_procedures
+ID = VCD_FUNCTION_PDSCH_PROC_C
+ DESC = VCD function PDSCH_PROC_C
+ GROUP = ALL:VCD:UE:VCD_FUNCTION
+ FORMAT = int,value
+ VCD_NAME = pdsch_procedures_crnti
ID = VCD_FUNCTION_PDSCH_PROC_SI
DESC = VCD function PDSCH_PROC_SI
GROUP = ALL:VCD:UE:VCD_FUNCTION
diff --git a/common/utils/ocp_itti/intertask_interface.cpp b/common/utils/ocp_itti/intertask_interface.cpp
index 2189be9fe8..c774da57e6 100644
--- a/common/utils/ocp_itti/intertask_interface.cpp
+++ b/common/utils/ocp_itti/intertask_interface.cpp
@@ -339,7 +339,9 @@ extern "C" {
int itti_create_queue(const task_info_t *taskInfo) {
pthread_mutex_lock (&lock_nb_queues);
int newQueue=nb_queues++;
- AssertFatal(tasks=(task_list_t **) realloc(tasks, nb_queues * sizeof(*tasks)),"");
+ task_list_t **new_tasks = (task_list_t **)realloc(tasks, nb_queues * sizeof(*tasks));
+ AssertFatal(new_tasks != NULL, "could not realloc() tasks list");
+ tasks = new_tasks;
tasks[newQueue]= new task_list_t;
pthread_mutex_unlock (&lock_nb_queues);
LOG_I(TMR,"Starting itti queue: %s as task %d\n", taskInfo->name, newQueue);
diff --git a/docker/Dockerfile.eNB.rhel8.2 b/docker/Dockerfile.eNB.rhel8.2
index 5fcd5a7b9f..aa8b9aa228 100644
--- a/docker/Dockerfile.eNB.rhel8.2
+++ b/docker/Dockerfile.eNB.rhel8.2
@@ -27,14 +27,15 @@
FROM localhost/ran-build:latest AS enb-build
+RUN rm -Rf /oai-ran
WORKDIR /oai-ran
+COPY . .
#run build_oai to build the target image
RUN /bin/sh oaienv && \
cd cmake_targets && \
- rm -Rf log && \
mkdir -p log && \
- ./build_oai --eNB --ninja -w USRP
+ ./build_oai --eNB --ninja -w USRP --verbose-ci
# debug
#RUN ldconfig -v && ldd /oai-ran/targets/bin/lte-softmodem.Rel15
diff --git a/docker/Dockerfile.eNB.ubuntu18 b/docker/Dockerfile.eNB.ubuntu18
index cdfb37ebfc..95d7194c31 100644
--- a/docker/Dockerfile.eNB.ubuntu18
+++ b/docker/Dockerfile.eNB.ubuntu18
@@ -27,14 +27,15 @@
FROM ran-build:latest AS enb-build
+RUN rm -Rf /oai-ran
WORKDIR /oai-ran
+COPY . .
#run build_oai to build the target image
RUN /bin/sh oaienv && \
cd cmake_targets && \
- rm -Rf log && \
mkdir -p log && \
- ./build_oai --eNB --ninja -w USRP
+ ./build_oai --eNB --ninja -w USRP --verbose-ci
RUN apt-get install -y python3-pip && \
pip3 install --ignore-installed pyyaml && \
diff --git a/docker/Dockerfile.gNB.rhel8.2 b/docker/Dockerfile.gNB.rhel8.2
index fb9ade927f..6969c691fd 100644
--- a/docker/Dockerfile.gNB.rhel8.2
+++ b/docker/Dockerfile.gNB.rhel8.2
@@ -27,14 +27,15 @@
FROM localhost/ran-build:latest AS gnb-build
+RUN rm -Rf /oai-ran
WORKDIR /oai-ran
+COPY . .
#run build_oai to build the target image
RUN /bin/sh oaienv && \
cd cmake_targets && \
- rm -Rf log && \
mkdir -p log && \
- ./build_oai --gNB --ninja -w USRP
+ ./build_oai --gNB --ninja -w USRP --verbose-ci
#debug
#RUN ldconfig -v
diff --git a/docker/Dockerfile.gNB.ubuntu18 b/docker/Dockerfile.gNB.ubuntu18
index d43ad4709d..276d6989c4 100644
--- a/docker/Dockerfile.gNB.ubuntu18
+++ b/docker/Dockerfile.gNB.ubuntu18
@@ -27,14 +27,15 @@
FROM ran-build:latest AS gnb-build
+RUN rm -Rf /oai-ran
WORKDIR /oai-ran
+COPY . .
#run build_oai to build the target image
RUN /bin/sh oaienv && \
cd cmake_targets && \
- rm -Rf log && \
mkdir -p log && \
- ./build_oai --gNB --ninja -w USRP
+ ./build_oai --gNB --ninja -w USRP --verbose-ci
#debug
RUN ldconfig -v
diff --git a/docker/Dockerfile.lteUE.rhel8.2 b/docker/Dockerfile.lteUE.rhel8.2
index 0a853dcd6b..e22343d63c 100644
--- a/docker/Dockerfile.lteUE.rhel8.2
+++ b/docker/Dockerfile.lteUE.rhel8.2
@@ -27,15 +27,15 @@
FROM localhost/ran-build:latest AS lte-ue-build
-
+RUN rm -Rf /oai-ran
WORKDIR /oai-ran
+COPY . .
#run build_oai to build the target image
RUN /bin/sh oaienv && \
cd cmake_targets && \
- rm -Rf log && \
mkdir -p log && \
- ./build_oai --UE --ninja -w USRP
+ ./build_oai --UE --ninja -w USRP --verbose-ci
# debug
#RUN ldconfig -v && ldd /oai-ran/targets/bin/lte-uesoftmodem.Rel15
diff --git a/docker/Dockerfile.lteUE.ubuntu18 b/docker/Dockerfile.lteUE.ubuntu18
index 8793cc54f7..6af2e61991 100644
--- a/docker/Dockerfile.lteUE.ubuntu18
+++ b/docker/Dockerfile.lteUE.ubuntu18
@@ -27,14 +27,15 @@
FROM ran-build:latest AS lte-ue-build
+RUN rm -Rf /oai-ran
WORKDIR /oai-ran
+COPY . .
#run build_oai to build the target image
RUN /bin/sh oaienv && \
cd cmake_targets && \
- rm -Rf log && \
mkdir -p log && \
- ./build_oai --UE --ninja -w USRP
+ ./build_oai --UE --ninja -w USRP --verbose-ci
# debug
#RUN ldconfig -v
diff --git a/docker/Dockerfile.nrUE.rhel8.2 b/docker/Dockerfile.nrUE.rhel8.2
index f9f3f8e4bf..01988fd6ff 100644
--- a/docker/Dockerfile.nrUE.rhel8.2
+++ b/docker/Dockerfile.nrUE.rhel8.2
@@ -27,14 +27,15 @@
FROM localhost/ran-build:latest AS nr-ue-build
+RUN rm -Rf /oai-ran
WORKDIR /oai-ran
+COPY . .
#run build_oai to build the target image
RUN /bin/sh oaienv && \
cd cmake_targets && \
- rm -Rf log && \
mkdir -p log && \
- ./build_oai --nrUE --ninja -w USRP
+ ./build_oai --nrUE --ninja -w USRP --verbose-ci
# debug
#RUN ldconfig -v
diff --git a/docker/Dockerfile.nrUE.ubuntu18 b/docker/Dockerfile.nrUE.ubuntu18
index 5450194f35..c96bcf80ef 100644
--- a/docker/Dockerfile.nrUE.ubuntu18
+++ b/docker/Dockerfile.nrUE.ubuntu18
@@ -27,14 +27,15 @@
FROM ran-build:latest AS nr-ue-build
+RUN rm -Rf /oai-ran
WORKDIR /oai-ran
+COPY . .
#run build_oai to build the target image
RUN /bin/sh oaienv && \
cd cmake_targets && \
- rm -Rf log && \
mkdir -p log && \
- ./build_oai --nrUE --ninja -w USRP
+ ./build_oai --nrUE --ninja -w USRP --verbose-ci
# debug
#RUN ldconfig -v
diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c
index fce01f04fd..184a3a0e07 100644
--- a/executables/nr-gnb.c
+++ b/executables/nr-gnb.c
@@ -250,13 +250,14 @@ void rx_func(void *param) {
L1_nr_prach_procedures(gNB,frame_rx,slot_rx);
//apply the rx signal rotation here
- apply_nr_rotation_ul(&gNB->frame_parms,
- gNB->common_vars.rxdataF[0],
- slot_rx,
- 0,
- gNB->frame_parms.Ncp==EXTENDED?12:14,
- gNB->frame_parms.ofdm_symbol_size);
-
+ for (int aa = 0; aa < gNB->frame_parms.nb_antennas_rx; aa++) {
+ apply_nr_rotation_ul(&gNB->frame_parms,
+ gNB->common_vars.rxdataF[aa],
+ slot_rx,
+ 0,
+ gNB->frame_parms.Ncp==EXTENDED?12:14,
+ gNB->frame_parms.ofdm_symbol_size);
+ }
phy_procedures_gNB_uespec_RX(gNB, frame_rx, slot_rx);
}
@@ -468,17 +469,16 @@ void init_gNB(int single_thread_flag,int wait_for_sync) {
if (RC.gNB == NULL) {
RC.gNB = (PHY_VARS_gNB **) malloc((1+RC.nb_nr_L1_inst)*sizeof(PHY_VARS_gNB *));
- for (inst=0; instabstraction_flag = 0;
gNB->single_thread_flag = single_thread_flag;
@@ -508,7 +508,7 @@ void init_gNB(int single_thread_flag,int wait_for_sync) {
}
- LOG_I(PHY,"[nr-softmodem.c] gNB structure allocated\n");
+ LOG_I(PHY,"[nr-gnb.c] gNB structure allocated\n");
}
diff --git a/executables/nr-ru.c b/executables/nr-ru.c
index 18aa36a78f..b059c6f4e8 100644
--- a/executables/nr-ru.c
+++ b/executables/nr-ru.c
@@ -755,17 +755,25 @@ void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) {
if (fp->freq_range==nr_FR2) {
// the beam index is written in bits 8-10 of the flags
// bit 11 enables the gpio programming
+ // currently we switch beams every 10 slots (should = 1 TDD period in FR2) and we take the beam index of the first symbol of the first slot of this period
int beam=0;
- //if (slot==0) beam = 11; //3 for boresight & 8 to enable
+ if (slot%10==0) {
+ if (ru->common.beam_id[0][slot*fp->symbols_per_slot] < 8) {
+ beam = ru->common.beam_id[0][slot*fp->symbols_per_slot] | 8;
+ }
+ }
/*
- if (slot==0 || slot==40) beam=0&8;
- if (slot==10 || slot==50) beam=1&8;
- if (slot==20 || slot==60) beam=2&8;
- if (slot==30 || slot==70) beam=3&8;
+ if (slot==0 || slot==40) beam=0|8;
+ if (slot==10 || slot==50) beam=1|8;
+ if (slot==20 || slot==60) beam=2|8;
+ if (slot==30 || slot==70) beam=3|8;
*/
flags |= beam<<8;
- }
+ LOG_D(HW,"slot %d, beam %d\n",slot,ru->common.beam_id[0][slot*fp->symbols_per_slot]);
+
+ }
+
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_WRITE_FLAGS, flags );
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_RU, frame );
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TTI_NUMBER_TX0_RU, slot );
@@ -1721,11 +1729,9 @@ void set_function_spec_param(RU_t *ru) {
ru->nr_start_if = NULL; // no if interface
ru->rfdevice.host_type = RAU_HOST;
- // FK this here looks messed up. The following lines should be part of the if (ru->function == gNodeB_3GPP), shouldn't they?
-
- ru->fh_south_in = rx_rf; // local synchronous RF RX
- ru->fh_south_out = tx_rf; // local synchronous RF TX
- ru->start_rf = start_rf; // need to start the local RF interface
+ ru->fh_south_in = rx_rf; // local synchronous RF RX
+ ru->fh_south_out = tx_rf; // local synchronous RF TX
+ ru->start_rf = start_rf; // need to start the local RF interface
ru->stop_rf = stop_rf;
ru->start_write_thread = start_write_thread; // starting RF TX in different thread
printf("configuring ru_id %u (start_rf %p)\n", ru->idx, start_rf);
diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c
index 69fc3c554d..63c06563d2 100644
--- a/executables/nr-softmodem.c
+++ b/executables/nr-softmodem.c
@@ -717,12 +717,11 @@ if(!IS_SOFTMODEM_NOS1)
if(IS_SOFTMODEM_NOS1)
init_pdcp();
+ if (RC.nb_nr_L1_inst > 0)
+ RCconfig_NR_L1();
if (RC.nb_nr_inst > 0) {
// don't create if node doesn't connect to RRC/S1/GTP
AssertFatal(create_gNB_tasks(1) == 0,"cannot create ITTI tasks\n");
- } else {
- printf("No ITTI, Initializing L1\n");
- RCconfig_NR_L1();
}
/* Start the agent. If it is turned off in the configuration, it won't start */
diff --git a/executables/nr-ue.c b/executables/nr-ue.c
index f175ab4980..47ddd7896e 100644
--- a/executables/nr-ue.c
+++ b/executables/nr-ue.c
@@ -85,12 +85,6 @@
*
*/
-#ifndef NO_RAT_NR
- #define DURATION_RX_TO_TX (NR_UE_CAPABILITY_SLOT_RX_TO_TX) /* for NR this will certainly depends to such UE capability which is not yet defined */
-#else
- #define DURATION_RX_TO_TX (6) /* For LTE, this duration is fixed to 4 and it is linked to LTE standard for both modes FDD/TDD */
-#endif
-
typedef enum {
pss = 0,
pbch = 1,
@@ -632,8 +626,8 @@ void *UE_thread(void *arg) {
}
curMsg->proc.timestamp_tx = timestamp+
- UE->frame_parms.get_samples_slot_timestamp(slot_nr,
- &UE->frame_parms,DURATION_RX_TO_TX) - firstSymSamp;
+ UE->frame_parms.get_samples_slot_timestamp(slot_nr,&UE->frame_parms,DURATION_RX_TO_TX)
+ - firstSymSamp;
notifiedFIFO_elt_t *res;
@@ -655,8 +649,10 @@ void *UE_thread(void *arg) {
decoded_frame_rx, curMsg->proc.frame_rx );
// use previous timing_advance value to compute writeTimestamp
- writeTimestamp = timestamp + UE->frame_parms.get_samples_slot_timestamp(slot_nr, &UE->frame_parms,DURATION_RX_TO_TX - RX_NB_TH) -
- firstSymSamp - openair0_cfg[0].tx_sample_advance - UE->N_TA_offset - timing_advance;
+ writeTimestamp = timestamp+
+ UE->frame_parms.get_samples_slot_timestamp(slot_nr,&UE->frame_parms,DURATION_RX_TO_TX
+ - RX_NB_TH) - firstSymSamp - openair0_cfg[0].tx_sample_advance -
+ UE->N_TA_offset - timing_advance;
// but use current UE->timing_advance value to compute writeBlockSize
if (UE->timing_advance != timing_advance) {
@@ -685,13 +681,13 @@ void *UE_thread(void *arg) {
}
if (flags || IS_SOFTMODEM_RFSIM)
- AssertFatal( writeBlockSize ==
- UE->rfdevice.trx_write_func(&UE->rfdevice,
- writeTimestamp,
- txp,
- writeBlockSize,
- UE->frame_parms.nb_antennas_tx,
- flags),"");
+ AssertFatal(writeBlockSize ==
+ UE->rfdevice.trx_write_func(&UE->rfdevice,
+ writeTimestamp,
+ txp,
+ writeBlockSize,
+ UE->frame_parms.nb_antennas_tx,
+ flags),"");
for (int i=0; iframe_parms.nb_antennas_tx; i++)
memset(txp[i], 0, writeBlockSize);
@@ -731,23 +727,6 @@ void init_NR_UE(int nb_inst, char* rrc_config_path) {
AssertFatal((rrc_inst = nr_l3_init_ue(rrc_config_path)) != NULL, "can not initialize RRC module\n");
AssertFatal((mac_inst = nr_l2_init_ue(rrc_inst)) != NULL, "can not initialize L2 module\n");
AssertFatal((mac_inst->if_module = nr_ue_if_module_init(inst)) != NULL, "can not initialize IF module\n");
-
- NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = NULL;
- if (mac_inst->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->pusch_TimeDomainAllocationList) {
- pusch_TimeDomainAllocationList = mac_inst->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->pusch_TimeDomainAllocationList->choice.setup;
- }
- else if (mac_inst->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList) {
- pusch_TimeDomainAllocationList = mac_inst->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
- }
-
- if (pusch_TimeDomainAllocationList) {
- for(int i = 0; i < pusch_TimeDomainAllocationList->list.count; i++) {
- AssertFatal(*pusch_TimeDomainAllocationList->list.array[i]->k2 >= DURATION_RX_TO_TX,
- "Slot offset K2 (%ld) cannot be less than DURATION_RX_TO_TX (%d)\n",
- *pusch_TimeDomainAllocationList->list.array[i]->k2,
- DURATION_RX_TO_TX);
- }
- }
}
}
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
index 9df9be4cbd..8c2118cd3d 100644
--- a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
+++ b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
@@ -972,7 +972,7 @@ typedef struct
typedef struct
{
- uint32_t ss_pbch_power;//SSB Block Power Value: TBD (-60..50 dBm)
+ int ss_pbch_power;//SSB Block Power Value: TBD (-60..50 dBm)
uint8_t bch_payload;//Defines option selected for generation of BCH payload, see Table 3-13 (v0.0.011 Value: 0: MAC generates the full PBCH payload 1: PHY generates the timing PBCH bits 2: PHY generates the full PBCH payload
uint8_t scs_common;//subcarrierSpacing for common, used for initial access and broadcast message. [38.211 sec 4.2] Value:0->3
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h
index bc5e7af45f..444140509c 100644
--- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h
+++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h
@@ -357,7 +357,7 @@ typedef struct
//table 3-23
typedef struct
{
- nfapi_uint32_tlv_t ss_pbch_power;//SSB Block Power Value: TBD (-60..50 dBm)
+ nfapi_int32_tlv_t ss_pbch_power;//SSB Block Power Value: TBD (-60..50 dBm)
nfapi_uint8_tlv_t bch_payload;//Defines option selected for generation of BCH payload, see Table 3-13 (v0.0.011 Value: 0: MAC generates the full PBCH payload 1: PHY generates the timing PBCH bits 2: PHY generates the full PBCH payload
nfapi_uint8_tlv_t scs_common;//subcarrierSpacing for common, used for initial access and broadcast message. [38.211 sec 4.2] Value:0->3
@@ -398,13 +398,13 @@ typedef struct
{
nfapi_uint32_tlv_t ssb_mask;//Bitmap for actually transmitted SSB. MSB->LSB of first 32 bit number corresponds to SSB 0 to SSB 31 MSB->LSB of second 32 bit number corresponds to SSB 32 to SSB 63 Value for each bit: 0: not transmitted 1: transmitted
-} nfapi_nr_ssb_mask_size_2_t;
+} nfapi_nr_ssb_mask_list_t;
typedef struct
{
- nfapi_uint8_tlv_t beam_id[64];//BeamID for each SSB in SsbMask. For example, if SSB mask bit 26 is set to 1, then BeamId[26] will be used to indicate beam ID of SSB 26. Value: from 0 to 63
+ nfapi_uint8_tlv_t beam_id;//BeamID for each SSB in SsbMask. For example, if SSB mask bit 26 is set to 1, then BeamId[26] will be used to indicate beam ID of SSB 26. Value: from 0 to 63
-} nfapi_nr_ssb_mask_size_64_t;
+} nfapi_nr_ssb_beam_id_list_t;
typedef struct
{
@@ -413,8 +413,8 @@ typedef struct
nfapi_uint8_tlv_t ssb_period;//SSB periodicity in msec Value: 0: ms5 1: ms10 2: ms20 3: ms40 4: ms80 5: ms160
nfapi_uint8_tlv_t ssb_subcarrier_offset;//ssbSubcarrierOffset or 𝑘𝑆𝑆𝐵 (38.211, section 7.4.3.1) Value: 0->31
nfapi_uint32_tlv_t MIB;//MIB payload, where the 24 MSB are used and represent the MIB in [38.331 MIB IE] and represent 0 1 2 3 1 , , , ,..., A− a a a a a [38.212, sec 7.1.1]
- nfapi_nr_ssb_mask_size_2_t ssb_mask_list[2];
- nfapi_nr_ssb_mask_size_64_t* ssb_beam_id_list;//64
+ nfapi_nr_ssb_mask_list_t ssb_mask_list[2];
+ nfapi_nr_ssb_beam_id_list_t ssb_beam_id_list[64];
nfapi_uint8_tlv_t ss_pbch_multiple_carriers_in_a_band;//0 = disabled 1 = enabled
nfapi_uint8_tlv_t multiple_cells_ss_pbch_in_a_carrier;//Indicates that multiple cells will be supported in a single carrier 0 = disabled 1 = enabled
@@ -678,7 +678,7 @@ typedef struct {
} nfapi_nr_slot_indication_scf_t;
-// 3.4.2
+// 3.4.2
//for pdcch_pdu:
@@ -691,11 +691,10 @@ typedef struct
typedef struct
{
uint16_t pm_idx;//Index to precoding matrix (PM) pre-stored at cell configuration. Note: If precoding is not used this parameter should be set to 0. Value: 0->65535.
- nfapi_nr_dig_bf_interface_t* dig_bf_interface_list;
+ nfapi_nr_dig_bf_interface_t dig_bf_interface_list[255];//max dig_bf_interfaces
}nfapi_nr_tx_precoding_and_beamforming_number_of_prgs_t;
-/*
//table 3-43
typedef struct
{
@@ -703,23 +702,10 @@ typedef struct
uint16_t prg_size;//Size in RBs of a precoding resource block group (PRG) – to which same precoding and digital beamforming gets applied. Value: 1->275
//watchout: dig_bf_interfaces here, in table 3-53 it's dig_bf_interface
uint8_t dig_bf_interfaces;//Number of STD ant ports (parallel streams) feeding into the digBF Value: 0->255
- nfapi_nr_tx_precoding_and_beamforming_number_of_prgs_t* prgs_list;//
+ nfapi_nr_tx_precoding_and_beamforming_number_of_prgs_t prgs_list[275];//max prg_size
}nfapi_nr_tx_precoding_and_beamforming_t;
-*/
-typedef struct {
- /// Number of PRGs spanning this allocation. Value : 1->275
- uint16_t numPRGs;
- /// Size in RBs of a precoding resource block group (PRG) – to which same precoding and digital beamforming gets applied. Value: 1->275
- uint16_t prgSize;
- /// Number of STD ant ports (parallel streams) feeding into the digBF Value: 0->255
- uint8_t digBFInterfaces;
- // Depends on numPRGs
- uint16_t PMIdx[275];
- // Depends on digBFInterfaces
- uint16_t beamIdx[256];
-} nfapi_nr_tx_precoding_and_beamforming_t;
//table 3-37
@@ -755,16 +741,6 @@ typedef struct {
} nfapi_nr_dl_dci_pdu_t;
-typedef struct {
- /// Number of PRGs spanning this allocation. Value : 1->275
- uint16_t numPRGs;
- /// Size in RBs of a precoding resource block group (PRG) – to which same precoding and digital beamforming gets applied. Value: 1->275
- uint16_t prgSize;
- /// Number of STD ant ports (parallel streams) feeding into the digBF Value: 0->255
- uint8_t digBFInterfaces;
- uint16_t PMIdx[275];
- uint16_t *beamIdx[275];
-} nr_beamforming_t;
typedef struct {
///Bandwidth part size [TS38.213 sec12]. Number of contiguous PRBs allocated to the BWP,Value: 1->275
@@ -1028,7 +1004,7 @@ typedef struct {
typedef struct {
uint16_t PDUType;
- uint16_t PDUSize;
+ uint32_t PDUSize;
union {
nfapi_nr_dl_tti_pdcch_pdu pdcch_pdu;
diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
index 837f33fe6f..ec59ba39b2 100755
--- a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
+++ b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
@@ -1,8269 +1,8269 @@
-/*
- * 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
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * 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
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include
-#include
-#include
-#include "nfapi_nr_interface_scf.h"
-
-extern int nfapi_unpack_p7_vendor_extension(nfapi_p7_message_header_t* header, uint8_t **ppReadPackedMsg, void* user_data);
-extern int nfapi_pack_p7_vendor_extension(nfapi_p7_message_header_t* header, uint8_t **ppWritePackedMsg, void* user_data);
-
-uint32_t nfapi_calculate_checksum(uint8_t* buffer, uint16_t len)
-{
- uint32_t chksum = 0;
- // calcaulte upto the checksum
- chksum = crc32(chksum, buffer, 8);
-
- // skip the checksum
- uint8_t zeros[4] = {0, 0, 0, 0};
- chksum = crc32(chksum, zeros, 4);
-
- // continu with the rest of the mesage
- chksum = crc32(chksum, &buffer[NFAPI_P7_HEADER_LENGTH], len - NFAPI_P7_HEADER_LENGTH);
-
- // return the inverse
- return ~(chksum);
-}
-
-int nfapi_p7_update_checksum(uint8_t* buffer, uint32_t len)
-{
- uint32_t checksum = nfapi_calculate_checksum(buffer, len);
-
- uint8_t* p_write = &buffer[8];
- return (push32(checksum, &p_write, buffer + len) > 0 ? 0 : -1);
-}
-
-int nfapi_p7_update_transmit_timestamp(uint8_t* buffer, uint32_t timestamp)
-{
- uint8_t* p_write = &buffer[12];
- return (push32(timestamp, &p_write, buffer + 16) > 0 ? 0 : -1);
-}
-
-uint32_t nfapi_p7_calculate_checksum(uint8_t* buffer, uint32_t len)
-{
- return nfapi_calculate_checksum(buffer, len);
-}
-
-void* nfapi_p7_allocate(size_t size, nfapi_p7_codec_config_t* config)
-{
- if(size == 0)
- return 0;
-
- void* buffer_p = NULL;
- if(config && config->allocate)
- {
- buffer_p = (config->allocate)(size);
- if(buffer_p != NULL){
- memset(buffer_p,0,size);
- }
- return buffer_p;
- }
- else
- {
- buffer_p = calloc(1, size);
- return buffer_p;
- }
-}
-
-void nfapi_p7_deallocate(void* ptr, nfapi_p7_codec_config_t* config)
-{
- if(ptr == NULL)
- return;
-
- if(config && config->deallocate)
- {
- return (config->deallocate)(ptr);
- }
- else
- {
- return free(ptr);
- }
-}
-// Pack routines
-
-
-static uint8_t pack_dl_config_dci_dl_pdu_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- 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) &&
- push16(value->rnti, ppWritePackedMsg, end) &&
- push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
- push8(value->virtual_resource_block_assignment_flag, ppWritePackedMsg, end) &&
- push32(value->resource_block_coding, ppWritePackedMsg, end) &&
- push8(value->mcs_1, ppWritePackedMsg, end) &&
- push8(value->redundancy_version_1, ppWritePackedMsg, end) &&
- push8(value->new_data_indicator_1, ppWritePackedMsg, end) &&
- push8(value->transport_block_to_codeword_swap_flag, ppWritePackedMsg, end) &&
- push8(value->mcs_2, ppWritePackedMsg, end) &&
- push8(value->redundancy_version_2, ppWritePackedMsg, end) &&
- push8(value->new_data_indicator_2, ppWritePackedMsg, end) &&
- push8(value->harq_process, ppWritePackedMsg, end) &&
- push8(value->tpmi, ppWritePackedMsg, end) &&
- push8(value->pmi, ppWritePackedMsg, end) &&
- push8(value->precoding_information, ppWritePackedMsg, end) &&
- push8(value->tpc, ppWritePackedMsg, end) &&
- push8(value->downlink_assignment_index, ppWritePackedMsg, end) &&
- push8(value->ngap, ppWritePackedMsg, end) &&
- push8(value->transport_block_size_index, ppWritePackedMsg, end) &&
- push8(value->downlink_power_offset, ppWritePackedMsg, end) &&
- push8(value->allocate_prach_flag, ppWritePackedMsg, end) &&
- push8(value->preamble_index, ppWritePackedMsg, end) &&
- push8(value->prach_mask_index, ppWritePackedMsg, end) &&
- push8(value->rnti_type, ppWritePackedMsg, end) &&
- push16(value->transmission_power, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_dl_config_dci_dl_pdu_rel9_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_dl_config_dci_dl_pdu_rel9_t* value = (nfapi_dl_config_dci_dl_pdu_rel9_t*)tlv;
-
- return( push8(value->mcch_flag, ppWritePackedMsg, end) &&
- push8(value->mcch_change_notification, ppWritePackedMsg, end) &&
- push8(value->scrambling_identity, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_dl_config_dci_dl_pdu_rel10_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_dl_config_dci_dl_pdu_rel10_t* value = (nfapi_dl_config_dci_dl_pdu_rel10_t*)tlv;
-
- return ( push8(value->cross_carrier_scheduling_flag, ppWritePackedMsg, end) &&
- push8(value->carrier_indicator, ppWritePackedMsg, end) &&
- push8(value->srs_flag, ppWritePackedMsg, end) &&
- push8(value->srs_request, ppWritePackedMsg, end) &&
- push8(value->antenna_ports_scrambling_and_layers, ppWritePackedMsg, end) &&
- push8(value->total_dci_length_including_padding, ppWritePackedMsg, end) &&
- push8(value->n_dl_rb, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_dl_config_dci_dl_pdu_rel11_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_dl_config_dci_dl_pdu_rel11_t* value = (nfapi_dl_config_dci_dl_pdu_rel11_t*)tlv;
-
- return ( push8(value->harq_ack_resource_offset, ppWritePackedMsg, end) &&
- push8(value->pdsch_re_mapping_quasi_co_location_indicator, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_dl_config_dci_dl_pdu_rel12_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_dl_config_dci_dl_pdu_rel12_t* value = (nfapi_dl_config_dci_dl_pdu_rel12_t*)tlv;
-
- return ( push8(value->primary_cell_type, ppWritePackedMsg, end) &&
- push8(value->ul_dl_configuration_flag, ppWritePackedMsg, end) &&
- push8(value->number_ul_dl_configurations, ppWritePackedMsg, end) &&
- pusharray8(value->ul_dl_configuration_indication, NFAPI_MAX_UL_DL_CONFIGURATIONS, value->number_ul_dl_configurations, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_tpm_value(nfapi_dl_config_dci_dl_tpm_t* value, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- if (!( push8(value->num_prb_per_subband, ppWritePackedMsg, end) &&
- push8(value->number_of_subbands, ppWritePackedMsg, end) &&
- push8(value->num_antennas, ppWritePackedMsg, end)))
- return 0;
-
- uint8_t idx = 0;
- for(idx = 0; idx < value->number_of_subbands; ++idx)
- {
- nfapi_dl_config_dci_dl_tpm_subband_info_t* subband_info = &(value->subband_info[idx]);
-
- if(!(push8(subband_info->subband_index, ppWritePackedMsg, end) &&
- push8(subband_info->scheduled_ues, ppWritePackedMsg, end)))
- return 0;
-
-
- uint8_t antenna_idx = 0;
- uint8_t scheduled_ue_idx = 0;
-
- for(antenna_idx = 0; antenna_idx < value->num_antennas; ++antenna_idx)
- {
- for(scheduled_ue_idx = 0; scheduled_ue_idx < subband_info->scheduled_ues; ++scheduled_ue_idx)
- {
- if(!push16(subband_info->precoding_value[antenna_idx][scheduled_ue_idx], ppWritePackedMsg, end))
- return 0;
- }
- }
-
- }
-
-
- return 1;
-
-}
-
-
-static uint8_t pack_dl_tti_csi_rs_pdu_rel15_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_nr_dl_tti_csi_rs_pdu_rel15_t* value = (nfapi_nr_dl_tti_csi_rs_pdu_rel15_t*)tlv;
-
- return(
- push16(value->bwp_size, ppWritePackedMsg, end) &&
- push16(value->bwp_start, ppWritePackedMsg, end) &&
-
- push8(value->subcarrier_spacing, ppWritePackedMsg, end) &&
- push8(value->cyclic_prefix, ppWritePackedMsg, end) &&
-
- push16(value->start_rb, ppWritePackedMsg, end) &&
- push16(value->nr_of_rbs, ppWritePackedMsg, end) &&
-
- push8(value->csi_type, ppWritePackedMsg, end) &&
- push8(value->row, ppWritePackedMsg, end) &&
-
- push16(value->freq_domain, ppWritePackedMsg, end) &&
- push8(value->symb_l0, ppWritePackedMsg, end) &&
-
- push8(value->symb_l1, ppWritePackedMsg, end) &&
- push8(value->cdm_type, ppWritePackedMsg, end) &&
-
- push8(value->freq_density, ppWritePackedMsg, end) &&
- push16(value->scramb_id, ppWritePackedMsg, end) &&
-
- push8(value->power_control_offset, ppWritePackedMsg, end) &&
- push8(value->power_control_offset_ss, ppWritePackedMsg, end)
- );
-
-}
-
-
-static uint8_t pack_dl_tti_pdcch_pdu_rel15_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_nr_dl_tti_pdcch_pdu_rel15_t* value = (nfapi_nr_dl_tti_pdcch_pdu_rel15_t*)tlv;
-
- for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i)
- {
- if(!push16(value->dci_pdu[i].RNTI, ppWritePackedMsg, end) &&
- push16(value->dci_pdu[i].ScramblingId, ppWritePackedMsg, end) &&
-
- push16(value->dci_pdu[i].ScramblingRNTI, ppWritePackedMsg, end) &&
- push8(value->dci_pdu[i].CceIndex, ppWritePackedMsg, end) &&
- push8(value->dci_pdu[i].AggregationLevel, ppWritePackedMsg, end) &&
- push8(value->dci_pdu[i].beta_PDCCH_1_0, ppWritePackedMsg, end) &&
-
- push8(value->dci_pdu[i].powerControlOffsetSS, ppWritePackedMsg, end) &&
- push16(value->dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end) &&
- pusharray8(value->dci_pdu[i].Payload, DCI_PAYLOAD_BYTE_LEN, value->dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end));
-
- return 0;
- }
-
- // TODO: resolve the packaging of array (currently sending a single element)
- return(
- push16(value->BWPSize, ppWritePackedMsg, end) &&
- push16(value->BWPStart, ppWritePackedMsg, end) &&
- push8(value->SubcarrierSpacing, ppWritePackedMsg, end) &&
- push8(value->CyclicPrefix, ppWritePackedMsg, end) &&
-
- push8(value->StartSymbolIndex, ppWritePackedMsg, end) &&
- push8(value->DurationSymbols, ppWritePackedMsg, end) &&
- pusharray8(value->FreqDomainResource, 6, 6, ppWritePackedMsg, end) &&
- push8(value->CceRegMappingType, ppWritePackedMsg, end) &&
-
- push8(value->RegBundleSize, ppWritePackedMsg, end) &&
- push8(value->InterleaverSize, ppWritePackedMsg, end) &&
- push8(value->CoreSetType, ppWritePackedMsg, end) &&
- push16(value->ShiftIndex, ppWritePackedMsg, end) &&
-
- push8(value->precoderGranularity, ppWritePackedMsg, end) &&
- push16(value->numDlDci, ppWritePackedMsg, end));
-
-}
-
-
-static uint8_t pack_dl_tti_pdsch_pdu_rel15_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_nr_dl_tti_pdsch_pdu_rel15_t* value = (nfapi_nr_dl_tti_pdsch_pdu_rel15_t*)tlv;
-
- // TODO: resolve the packaging of array (currently sending a single element)
- return(
- push16(value->pduBitmap, ppWritePackedMsg, end) &&
- push16(value->rnti, ppWritePackedMsg, end) &&
- push16(value->pduIndex, ppWritePackedMsg, end) &&
- push16(value->BWPSize, ppWritePackedMsg, end) &&
-
- push16(value->BWPStart, ppWritePackedMsg, end) &&
- push8(value->SubcarrierSpacing, ppWritePackedMsg, end) &&
- push8(value->CyclicPrefix, ppWritePackedMsg, end) &&
- push8(value->NrOfCodewords, ppWritePackedMsg, end) &&
-
- pusharray16(value->targetCodeRate, 2, 1, ppWritePackedMsg, end) &&
- pusharray8(value->qamModOrder, 2, 1, ppWritePackedMsg, end) &&
- pusharray8(value->mcsIndex, 2, 1, ppWritePackedMsg, end) &&
- pusharray8(value->mcsTable, 2, 1, ppWritePackedMsg, end) &&
-
- pusharray8(value->rvIndex, 2, 1, ppWritePackedMsg, end) &&
- pusharray32(value->TBSize, 2, 1, ppWritePackedMsg, end) &&
- push16(value->dataScramblingId, ppWritePackedMsg, end) &&
- push8(value->nrOfLayers, ppWritePackedMsg, end) &&
-
- push8(value->transmissionScheme, ppWritePackedMsg, end) &&
- push8(value->refPoint, ppWritePackedMsg, end) &&
- push16(value->dlDmrsSymbPos, ppWritePackedMsg, end) &&
- push8(value->dmrsConfigType, ppWritePackedMsg, end) &&
-
- push16(value->dlDmrsScramblingId, ppWritePackedMsg, end) &&
- push8(value->SCID, ppWritePackedMsg, end) &&
- push8(value->numDmrsCdmGrpsNoData, ppWritePackedMsg, end) &&
- push16(value->dmrsPorts, ppWritePackedMsg, end) &&
-
- push8(value->resourceAlloc, ppWritePackedMsg, end) &&
- push16(value->rbStart, ppWritePackedMsg, end) &&
- push16(value->rbSize, ppWritePackedMsg, end) &&
-
- push8(value->VRBtoPRBMapping, ppWritePackedMsg, end) &&
- push8(value->StartSymbolIndex, ppWritePackedMsg, end) &&
- push8(value->NrOfSymbols, ppWritePackedMsg, end) &&
- push8(value->PTRSPortIndex, ppWritePackedMsg, end) &&
-
- push8(value->PTRSTimeDensity, ppWritePackedMsg, end) &&
- push8(value->PTRSFreqDensity, ppWritePackedMsg, end) &&
- push8(value->PTRSReOffset, ppWritePackedMsg, end)
- );
-
-}
-
-
-static uint8_t pack_dl_tti_ssb_pdu_rel15_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_nr_dl_tti_ssb_pdu_rel15_t* value = (nfapi_nr_dl_tti_ssb_pdu_rel15_t*)tlv;
-
- return(
- push16(value->PhysCellId, ppWritePackedMsg, end) &&
- push8(value->BetaPss, ppWritePackedMsg, end) &&
- push8(value->SsbBlockIndex, ppWritePackedMsg, end) &&
- push8(value->SsbSubcarrierOffset, ppWritePackedMsg, end) &&
- push16(value->ssbOffsetPointA, ppWritePackedMsg, end) &&
- push8(value->bchPayloadFlag, ppWritePackedMsg, end) &&
- push32(value->bchPayload, ppWritePackedMsg, end)
- // TODO: pack precoding_and_beamforming too
- );
-
-}
-
-
-static uint8_t pack_dl_config_dci_dl_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_dl_config_dci_dl_pdu_rel13_t* value = (nfapi_dl_config_dci_dl_pdu_rel13_t*)tlv;
-
- return( push8(value->laa_end_partial_sf_flag, ppWritePackedMsg, end) &&
- push8(value->laa_end_partial_sf_configuration, ppWritePackedMsg, end) &&
- push8(value->initial_lbt_sf, ppWritePackedMsg, end) &&
- push8(value->codebook_size_determination, ppWritePackedMsg, end) &&
- push8(value->drms_table_flag, ppWritePackedMsg, end) &&
- push8(value->tpm_struct_flag, ppWritePackedMsg, end) &&
- (value->tpm_struct_flag == 1 ? pack_tpm_value(&(value->tpm), ppWritePackedMsg, end) : 1));
-}
-
-static uint8_t pack_dl_config_bch_pdu_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- 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));
-}
-static uint8_t pack_dl_config_mch_pdu_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_dl_config_mch_pdu_rel8_t* value = (nfapi_dl_config_mch_pdu_rel8_t*)tlv;
-
- return ( push16(value->length, ppWritePackedMsg, end) &&
- push16(value->pdu_index, ppWritePackedMsg, end) &&
- push16(value->rnti, ppWritePackedMsg, end) &&
- push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
- push32(value->resource_block_coding, ppWritePackedMsg, end) &&
- push8(value->modulation, ppWritePackedMsg, end) &&
- push16(value->transmission_power, ppWritePackedMsg, end) &&
- push16(value->mbsfn_area_id, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_bf_vector_info(void* elem, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_bf_vector_t* bf = (nfapi_bf_vector_t*)elem;
-
- return ( push8(bf->subband_index, ppWritePackedMsg, end) &&
- push8(bf->num_antennas, ppWritePackedMsg, end) &&
- pusharray16(bf->bf_value, NFAPI_MAX_NUM_ANTENNAS, bf->num_antennas, ppWritePackedMsg, end));
-
-
-}
-static uint8_t pack_dl_config_dlsch_pdu_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_dl_config_dlsch_pdu_rel8_t* value = (nfapi_dl_config_dlsch_pdu_rel8_t*)tlv;
-
- return ( push16(value->length, ppWritePackedMsg, end) &&
- push16(value->pdu_index, ppWritePackedMsg, end) &&
- push16(value->rnti, ppWritePackedMsg, end) &&
- push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
- push8(value->virtual_resource_block_assignment_flag, ppWritePackedMsg, end) &&
- push32(value->resource_block_coding, ppWritePackedMsg, end) &&
- push8(value->modulation, ppWritePackedMsg, end) &&
- push8(value->redundancy_version, ppWritePackedMsg, end) &&
- push8(value->transport_blocks, ppWritePackedMsg, end) &&
- push8(value->transport_block_to_codeword_swap_flag, ppWritePackedMsg, end) &&
- push8(value->transmission_scheme, ppWritePackedMsg, end) &&
- push8(value->number_of_layers, ppWritePackedMsg, end) &&
- push8(value->number_of_subbands, ppWritePackedMsg, end) &&
- pusharray8(value->codebook_index, NFAPI_MAX_NUM_SUBBANDS, value->number_of_subbands, ppWritePackedMsg, end) &&
- push8(value->ue_category_capacity, ppWritePackedMsg, end) &&
- push8(value->pa, ppWritePackedMsg, end) &&
- push8(value->delta_power_offset_index, ppWritePackedMsg, end) &&
- push8(value->ngap, ppWritePackedMsg, end) &&
- push8(value->nprb, ppWritePackedMsg, end) &&
- push8(value->transmission_mode, ppWritePackedMsg, end) &&
- push8(value->num_bf_prb_per_subband, ppWritePackedMsg, end) &&
- push8(value->num_bf_vector, ppWritePackedMsg, end) &&
- packarray(value->bf_vector, sizeof(nfapi_bf_vector_t), NFAPI_MAX_BF_VECTORS, value->num_bf_vector, ppWritePackedMsg, end, &pack_bf_vector_info));
-
-}
-static uint8_t pack_dl_config_dlsch_pdu_rel9_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_dl_config_dlsch_pdu_rel9_t* value = (nfapi_dl_config_dlsch_pdu_rel9_t*)tlv;
- return ( push8(value->nscid, ppWritePackedMsg, end) );
-}
-static uint8_t pack_dl_config_dlsch_pdu_rel10_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_dl_config_dlsch_pdu_rel10_t* value = (nfapi_dl_config_dlsch_pdu_rel10_t*)tlv;
-
- return ( push8(value->csi_rs_flag, ppWritePackedMsg, end) &&
- push8(value->csi_rs_resource_config_r10, ppWritePackedMsg, end) &&
- push16(value->csi_rs_zero_tx_power_resource_config_bitmap_r10, ppWritePackedMsg, end) &&
- push8(value->csi_rs_number_nzp_configuration, ppWritePackedMsg, end) &&
- pusharray8(value->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, value->csi_rs_number_nzp_configuration, ppWritePackedMsg, end) &&
- push8(value->pdsch_start, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_dlsch_pdu_rel11_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_dl_config_dlsch_pdu_rel11_t* value = (nfapi_dl_config_dlsch_pdu_rel11_t*)tlv;
-
- return( push8(value->drms_config_flag, ppWritePackedMsg, end) &&
- push16(value->drms_scrambling, ppWritePackedMsg, end) &&
- push8(value->csi_config_flag, ppWritePackedMsg, end) &&
- push16(value->csi_scrambling, ppWritePackedMsg, end) &&
- push8(value->pdsch_re_mapping_flag, ppWritePackedMsg, end) &&
- push8(value->pdsch_re_mapping_atenna_ports, ppWritePackedMsg, end) &&
- push8(value->pdsch_re_mapping_freq_shift, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_dlsch_pdu_rel12_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_dl_config_dlsch_pdu_rel12_t* value = (nfapi_dl_config_dlsch_pdu_rel12_t*)tlv;
-
- return( push8(value->altcqi_table_r12, ppWritePackedMsg, end) &&
- push8(value->maxlayers, ppWritePackedMsg, end) &&
- push8(value->n_dl_harq, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_dlsch_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_dl_config_dlsch_pdu_rel13_t* value = (nfapi_dl_config_dlsch_pdu_rel13_t*)tlv;
-
- return( push8(value->dwpts_symbols, ppWritePackedMsg, end) &&
- push8(value->initial_lbt_sf, ppWritePackedMsg, end) &&
- push8(value->ue_type, ppWritePackedMsg, end) &&
- push8(value->pdsch_payload_type, ppWritePackedMsg, end) &&
- push16(value->initial_transmission_sf_io, ppWritePackedMsg, end) &&
- push8(value->drms_table_flag, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_pch_pdu_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_dl_config_pch_pdu_rel8_t* value = (nfapi_dl_config_pch_pdu_rel8_t*)tlv;
-
- return( push16(value->length, ppWritePackedMsg, end) &&
- push16(value->pdu_index, ppWritePackedMsg, end) &&
- push16(value->p_rnti, ppWritePackedMsg, end) &&
- push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
- push8(value->virtual_resource_block_assignment_flag, ppWritePackedMsg, end) &&
- push32(value->resource_block_coding, ppWritePackedMsg, end) &&
- push8(value->mcs, ppWritePackedMsg, end) &&
- push8(value->redundancy_version, ppWritePackedMsg, end) &&
- push8(value->number_of_transport_blocks, ppWritePackedMsg, end) &&
- push8(value->transport_block_to_codeword_swap_flag, ppWritePackedMsg, end) &&
- push8(value->transmission_scheme, ppWritePackedMsg, end) &&
- push8(value->number_of_layers, ppWritePackedMsg, end) &&
- push8(value->codebook_index, ppWritePackedMsg, end) &&
- push8(value->ue_category_capacity, ppWritePackedMsg, end) &&
- push8(value->pa, ppWritePackedMsg, end) &&
- push16(value->transmission_power, ppWritePackedMsg, end) &&
- push8(value->nprb, ppWritePackedMsg, end) &&
- push8(value->ngap, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_pch_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_dl_config_pch_pdu_rel13_t* value = (nfapi_dl_config_pch_pdu_rel13_t*)tlv;
-
- return ( push8(value->ue_mode, ppWritePackedMsg, end) &&
- push16(value->initial_transmission_sf_io, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_prs_pdu_rel9_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_dl_config_prs_pdu_rel9_t* value = (nfapi_dl_config_prs_pdu_rel9_t*)tlv;
-
- return( push16(value->transmission_power, ppWritePackedMsg, end) &&
- push8(value->prs_bandwidth, ppWritePackedMsg, end) &&
- push8(value->prs_cyclic_prefix_type, ppWritePackedMsg, end) &&
- push8(value->prs_muting, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_csi_rs_pdu_rel10_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_dl_config_csi_rs_pdu_rel10_t* value = (nfapi_dl_config_csi_rs_pdu_rel10_t*)tlv;
-
- return( push8(value->csi_rs_antenna_port_count_r10, ppWritePackedMsg, end) &&
- push8(value->csi_rs_resource_config_r10, ppWritePackedMsg, end) &&
- push16(value->transmission_power, ppWritePackedMsg, end) &&
- push16(value->csi_rs_zero_tx_power_resource_config_bitmap_r10, ppWritePackedMsg, end) &&
- push8(value->csi_rs_number_of_nzp_configuration, ppWritePackedMsg, end) &&
- pusharray8(value->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, value->csi_rs_number_of_nzp_configuration, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_csi_rs_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_dl_config_csi_rs_pdu_rel13_t* value = (nfapi_dl_config_csi_rs_pdu_rel13_t*)tlv;
-
- if(!(push8(value->csi_rs_class, ppWritePackedMsg, end) &&
- push8(value->cdm_type, ppWritePackedMsg, end) &&
- push8(value->num_bf_vector, ppWritePackedMsg, end)))
- {
- return 0;
- }
-
- uint16_t i;
- for(i = 0; i < value->num_bf_vector; ++i)
- {
- if(!(push8(value->bf_vector[i].csi_rs_resource_index, ppWritePackedMsg, end) &&
- pusharray16(value->bf_vector[i].bf_value, NFAPI_MAX_ANTENNA_PORT_COUNT, NFAPI_MAX_ANTENNA_PORT_COUNT, ppWritePackedMsg, end)))
- return 0;
- }
-
- return 1;
-}
-static uint8_t pack_bf_vector(nfapi_bf_vector_t* vector, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- return ( push8(vector->subband_index, ppWritePackedMsg, end) &&
- push8(vector->num_antennas, ppWritePackedMsg, end) &&
- pusharray16(vector->bf_value, NFAPI_MAX_NUM_ANTENNAS, vector->num_antennas, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_dl_config_epdcch_parameters_rel11_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_dl_config_epdcch_parameters_rel11_t* value = (nfapi_dl_config_epdcch_parameters_rel11_t*)tlv;
-
- return ( push8(value->epdcch_resource_assignment_flag, ppWritePackedMsg, end) &&
- push16(value->epdcch_id, ppWritePackedMsg, end) &&
- push8(value->epdcch_start_symbol, ppWritePackedMsg, end) &&
- push8(value->epdcch_num_prb, ppWritePackedMsg, end) &&
- pusharray8(value->epdcch_prb_index, NFAPI_MAX_EPDCCH_PRB, value->epdcch_num_prb, ppWritePackedMsg, end) &&
- pack_bf_vector(&value->bf_vector, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_epdcch_parameters_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_dl_config_epdcch_parameters_rel13_t* value = (nfapi_dl_config_epdcch_parameters_rel13_t*)tlv;
-
- return (push8(value->dwpts_symbols, ppWritePackedMsg, end) &&
- push8(value->initial_lbt_sf, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_mpdcch_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_dl_config_mpdcch_pdu_rel13_t* value = (nfapi_dl_config_mpdcch_pdu_rel13_t*)tlv;
-
- return ( push8(value->mpdcch_narrow_band, ppWritePackedMsg, end) &&
- push8(value->number_of_prb_pairs, ppWritePackedMsg, end) &&
- push8(value->resource_block_assignment, ppWritePackedMsg, end) &&
- push8(value->mpdcch_tansmission_type, ppWritePackedMsg, end) &&
- push8(value->start_symbol, ppWritePackedMsg, end) &&
- push8(value->ecce_index, ppWritePackedMsg, end) &&
- push8(value->aggregation_level, ppWritePackedMsg, end) &&
- push8(value->rnti_type, ppWritePackedMsg, end) &&
- push16(value->rnti, ppWritePackedMsg, end) &&
- push8(value->ce_mode, ppWritePackedMsg, end) &&
- push16(value->drms_scrambling_init, ppWritePackedMsg, end) &&
- push16(value->initial_transmission_sf_io, ppWritePackedMsg, end) &&
- push16(value->transmission_power, ppWritePackedMsg, end) &&
- push8(value->dci_format, ppWritePackedMsg, end) &&
- push16(value->resource_block_coding, ppWritePackedMsg, end) &&
- push8(value->mcs, ppWritePackedMsg, end) &&
- push8(value->pdsch_reptition_levels, ppWritePackedMsg, end) &&
- push8(value->redundancy_version, ppWritePackedMsg, end) &&
- push8(value->new_data_indicator, ppWritePackedMsg, end) &&
- push8(value->harq_process, ppWritePackedMsg, end) &&
- push8(value->tpmi_length, ppWritePackedMsg, end) &&
- push8(value->tpmi, ppWritePackedMsg, end) &&
- push8(value->pmi_flag, ppWritePackedMsg, end) &&
- push8(value->pmi, ppWritePackedMsg, end) &&
- push8(value->harq_resource_offset, ppWritePackedMsg, end) &&
- push8(value->dci_subframe_repetition_number, ppWritePackedMsg, end) &&
- push8(value->tpc, ppWritePackedMsg, end) &&
- push8(value->downlink_assignment_index_length, ppWritePackedMsg, end) &&
- push8(value->downlink_assignment_index, ppWritePackedMsg, end) &&
- push8(value->allocate_prach_flag, ppWritePackedMsg, end) &&
- push8(value->preamble_index, ppWritePackedMsg, end) &&
- push8(value->prach_mask_index, ppWritePackedMsg, end) &&
- push8(value->starting_ce_level, ppWritePackedMsg, end) &&
- push8(value->srs_request, ppWritePackedMsg, end) &&
- push8(value->antenna_ports_and_scrambling_identity_flag, ppWritePackedMsg, end) &&
- push8(value->antenna_ports_and_scrambling_identity, ppWritePackedMsg, end) &&
- push8(value->frequency_hopping_enabled_flag, ppWritePackedMsg, end) &&
- push8(value->paging_direct_indication_differentiation_flag, ppWritePackedMsg, end) &&
- push8(value->direct_indication, ppWritePackedMsg, end) &&
- push8(value->total_dci_length_including_padding, ppWritePackedMsg, end) &&
- push8(value->number_of_tx_antenna_ports, ppWritePackedMsg, end) &&
- pusharray16(value->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, value->number_of_tx_antenna_ports, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_dl_config_nbch_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_dl_config_nbch_pdu_rel13_t* value = (nfapi_dl_config_nbch_pdu_rel13_t*)tlv;
-
- return (push16(value->length, ppWritePackedMsg, end) &&
- push16(value->pdu_index, ppWritePackedMsg, end) &&
- push16(value->transmission_power, ppWritePackedMsg, end) &&
- push16(value->hyper_sfn_2_lsbs, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_dl_config_npdcch_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_dl_config_npdcch_pdu_rel13_t* value = (nfapi_dl_config_npdcch_pdu_rel13_t*)tlv;
-
- return (push16(value->length, ppWritePackedMsg, end) &&
- push16(value->pdu_index, ppWritePackedMsg, end) &&
- push8(value->ncce_index, ppWritePackedMsg, end) &&
- push8(value->aggregation_level, ppWritePackedMsg, end) &&
- push8(value->start_symbol, ppWritePackedMsg, end) &&
- push8(value->rnti_type, ppWritePackedMsg, end) &&
- push16(value->rnti, ppWritePackedMsg, end) &&
- push8(value->scrambling_reinitialization_batch_index, ppWritePackedMsg, end) &&
- push8(value->nrs_antenna_ports_assumed_by_the_ue, ppWritePackedMsg, end) &&
- push8(value->dci_format, ppWritePackedMsg, end) &&
- push8(value->scheduling_delay, ppWritePackedMsg, end) &&
- push8(value->resource_assignment, ppWritePackedMsg, end) &&
- push8(value->repetition_number, ppWritePackedMsg, end) &&
- push8(value->mcs, ppWritePackedMsg, end) &&
- push8(value->new_data_indicator, ppWritePackedMsg, end) &&
- push8(value->harq_ack_resource, ppWritePackedMsg, end) &&
- push8(value->npdcch_order_indication, ppWritePackedMsg, end) &&
- push8(value->starting_number_of_nprach_repetitions, ppWritePackedMsg, end) &&
- push8(value->subcarrier_indication_of_nprach, ppWritePackedMsg, end) &&
- push8(value->paging_direct_indication_differentation_flag, ppWritePackedMsg, end) &&
- push8(value->direct_indication, ppWritePackedMsg, end) &&
- push8(value->dci_subframe_repetition_number, ppWritePackedMsg, end) &&
- push8(value->total_dci_length_including_padding, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_dl_config_ndlsch_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_dl_config_ndlsch_pdu_rel13_t* value = (nfapi_dl_config_ndlsch_pdu_rel13_t*)tlv;
-
- return (push16(value->length, ppWritePackedMsg, end) &&
- push16(value->pdu_index, ppWritePackedMsg, end) &&
- push8(value->start_symbol, ppWritePackedMsg, end) &&
- push8(value->rnti_type, ppWritePackedMsg, end) &&
- push16(value->rnti, ppWritePackedMsg, end) &&
- push16(value->resource_assignment, ppWritePackedMsg, end) &&
- push16(value->repetition_number, ppWritePackedMsg, end) &&
- push8(value->modulation, ppWritePackedMsg, end) &&
- push8(value->number_of_subframes_for_resource_assignment, ppWritePackedMsg, end) &&
- push8(value->scrambling_sequence_initialization_cinit, ppWritePackedMsg, end) &&
- push16(value->sf_idx, ppWritePackedMsg, end) &&
- push8(value->nrs_antenna_ports_assumed_by_the_ue, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_dl_tti_request_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_nr_dl_tti_request_pdu_t* value = (nfapi_nr_dl_tti_request_pdu_t*)tlv;
-
- if(!(push16(value->PDUSize, ppWritePackedMsg, end) &&
- push16(value->PDUType, ppWritePackedMsg, end) ))
- return 0;
-
-
- // first match the pdu type, then call the respective function
- switch(value->PDUType)
- {
- case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE:
- {
- if(!(pack_dl_tti_csi_rs_pdu_rel15_value(&value->csi_rs_pdu.csi_rs_pdu_rel15,ppWritePackedMsg,end)))
- return 0;
- }
- break;
-
- case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE:
- {
- if(!(pack_dl_tti_pdcch_pdu_rel15_value(&value->pdcch_pdu.pdcch_pdu_rel15,ppWritePackedMsg,end)))
- return 0;
- }
- break;
- case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE:
- {
- if(!(pack_dl_tti_pdsch_pdu_rel15_value(&value->pdsch_pdu.pdsch_pdu_rel15,ppWritePackedMsg,end)))
- return 0;
- }
- break;
- case NFAPI_NR_DL_TTI_SSB_PDU_TYPE:
- {
- if(!(pack_dl_tti_ssb_pdu_rel15_value(&value->ssb_pdu.ssb_pdu_rel15,ppWritePackedMsg,end)))
- return 0;
- }
- break;
-
- default:
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid DL_TTI pdu type %d \n", value->PDUType );
- }
- break;
- }
-
- return 1;
-}
-
-static uint8_t pack_dl_config_request_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- 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) &&
- push8(value->number_pdsch_rnti, ppWritePackedMsg, end) &&
- push16(value->transmission_power_pcfich, ppWritePackedMsg, end)))
- {
- return 0;
- }
-
- uint16_t i = 0;
- uint16_t total_number_of_pdus = value->number_pdu;
- for(; i < total_number_of_pdus; ++i)
- {
- nfapi_dl_config_request_pdu_t* pdu = &(value->dl_config_pdu_list[i]);
-
- if(push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
- return 0;
-
- // Put a 0 size in and then determine the size after the pdu
- // has been writen and write the calculated size
- uint8_t* pWritePackedMsgPduSize = *ppWritePackedMsg;
- pdu->pdu_size = 0;
- if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
- return 0;
-
- switch(pdu->pdu_type)
- {
- 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) &&
- pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL11_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel11, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel11_value) &&
- pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL12_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel12, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel12_value) &&
- pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL13_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel13_value)))
- {
- return 0;
- }
- }
- 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;
- }
- break;
- case NFAPI_DL_CONFIG_MCH_PDU_TYPE:
- {
- if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_MCH_PDU_REL8_TAG, &pdu->mch_pdu.mch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_mch_pdu_rel8_value)))
- return 0;
- }
- break;
- case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE:
- {
- if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel8_value) &&
- pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL9_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel9_value) &&
- pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL10_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel10_value) &&
- pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL11_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel11, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel11_value) &&
- pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL12_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel12, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel12_value) &&
- pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL13_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel13_value)))
- return 0;
- }
- break;
- case NFAPI_DL_CONFIG_PCH_PDU_TYPE:
- {
- if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL8_TAG, &pdu->pch_pdu.pch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_pch_pdu_rel8_value) &&
- pack_tlv(NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL13_TAG, &pdu->pch_pdu.pch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_pch_pdu_rel13_value)))
- return 0;
- }
- break;
- case NFAPI_DL_CONFIG_PRS_PDU_TYPE:
- {
- if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_PRS_PDU_REL9_TAG, &pdu->prs_pdu.prs_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_prs_pdu_rel9_value)))
- return 0;
- }
- break;
- case NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE:
- {
- if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL10_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_csi_rs_pdu_rel10_value) &&
- pack_tlv(NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL13_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_csi_rs_pdu_rel13_value)))
- return 0;
- }
- break;
- case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE:
- {
- if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL8_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel8_value) &&
- pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL9_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel9_value) &&
- pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL10_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel10_value) &&
- pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL11_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel11, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel11_value) &&
- pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL12_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel12, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel12_value) &&
- pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL13_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel13_value) &&
- pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL11_TAG, &pdu->epdcch_pdu.epdcch_params_rel11, ppWritePackedMsg, end, &pack_dl_config_epdcch_parameters_rel11_value) &
- pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL13_TAG, &pdu->epdcch_pdu.epdcch_params_rel13, ppWritePackedMsg, end, &pack_dl_config_epdcch_parameters_rel13_value)))
- return 0;
- }
- break;
- case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE:
- {
- if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_MPDCCH_PDU_REL13_TAG, &pdu->mpdcch_pdu.mpdcch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_mpdcch_pdu_rel13_value)))
- return 0;
- }
- break;
- case NFAPI_DL_CONFIG_NBCH_PDU_TYPE:
- {
- if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_NBCH_PDU_REL13_TAG, &pdu->nbch_pdu.nbch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_nbch_pdu_rel13_value)))
- return 0;
- }
- break;
- case NFAPI_DL_CONFIG_NPDCCH_PDU_TYPE:
- {
- if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_NPDCCH_PDU_REL13_TAG, &pdu->npdcch_pdu.npdcch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_npdcch_pdu_rel13_value)))
- return 0;
- }
- break;
- case NFAPI_DL_CONFIG_NDLSCH_PDU_TYPE:
- {
- if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_NDLSCH_PDU_REL13_TAG, &pdu->ndlsch_pdu.ndlsch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_ndlsch_pdu_rel13_value)))
- return 0;
- }
- break;
- default:
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
- }
- break;
- };
-
- // add 1 for the pdu_type. The delta will include the pdu_size
- pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
- push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
- }
-
- return 1;
-}
-
-
-static uint8_t pack_dl_tti_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_nr_dl_tti_request_t *pNfapiMsg = (nfapi_nr_dl_tti_request_t*)msg;
-
- if (!(push16(pNfapiMsg->SFN , ppWritePackedMsg, end) &&
- push16(pNfapiMsg->Slot , ppWritePackedMsg, end) &&
- push8(pNfapiMsg->dl_tti_request_body.nGroup , ppWritePackedMsg, end) &&
- push8(pNfapiMsg->dl_tti_request_body.nPDUs , ppWritePackedMsg, end) &&
- pusharray8(pNfapiMsg->dl_tti_request_body.nUe ,256,pNfapiMsg->dl_tti_request_body.nGroup, ppWritePackedMsg, end)
- //pusharray8(pNfapiMsg->PduIdx[0] ,256,256, ppWritePackedMsg, end)
- ))
- return 0;
-
- int arr[12];
- for(int i=0;idl_tti_request_body.nGroup;i++)
- {
- for(int j=0;jdl_tti_request_body.nUe[i];j++)
- {
- arr[j] = pNfapiMsg->dl_tti_request_body.PduIdx[i][j];
- }
- if(!(pusharrays32(arr,12,pNfapiMsg->dl_tti_request_body.nUe[i],ppWritePackedMsg, end)))
- return 0;
- }
-
- for(int i=0;idl_tti_request_body.nPDUs;i++)
- {
- if(!pack_dl_tti_request_body_value(&pNfapiMsg->dl_tti_request_body.dl_tti_pdu_list[i],ppWritePackedMsg,end))
- return 0;
- }
-
-return 1;
-}
-
-
-static uint8_t pack_dl_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- 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));
- {
- 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)
-{
- nfapi_ul_config_ulsch_pdu_rel8_t* ulsch_pdu_rel8 = (nfapi_ul_config_ulsch_pdu_rel8_t*)tlv;
-
- return( push32(ulsch_pdu_rel8->handle, ppWritePackedMsg, end) &&
- push16(ulsch_pdu_rel8->size, ppWritePackedMsg, end) &&
- push16(ulsch_pdu_rel8->rnti, ppWritePackedMsg, end) &&
- push8(ulsch_pdu_rel8->resource_block_start, ppWritePackedMsg, end) &&
- push8(ulsch_pdu_rel8->number_of_resource_blocks, ppWritePackedMsg, end) &&
- push8(ulsch_pdu_rel8->modulation_type, ppWritePackedMsg, end) &&
- push8(ulsch_pdu_rel8->cyclic_shift_2_for_drms, ppWritePackedMsg, end) &&
- push8(ulsch_pdu_rel8->frequency_hopping_enabled_flag, ppWritePackedMsg, end) &&
- push8(ulsch_pdu_rel8->frequency_hopping_bits, ppWritePackedMsg, end) &&
- push8(ulsch_pdu_rel8->new_data_indication, ppWritePackedMsg, end) &&
- push8(ulsch_pdu_rel8->redundancy_version, ppWritePackedMsg, end) &&
- push8(ulsch_pdu_rel8->harq_process_number, ppWritePackedMsg, end) &&
- push8(ulsch_pdu_rel8->ul_tx_mode, ppWritePackedMsg, end) &&
- push8(ulsch_pdu_rel8->current_tx_nb, ppWritePackedMsg, end) &&
- push8(ulsch_pdu_rel8->n_srs, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_ulsch_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_ulsch_pdu_rel10_t* ulsch_pdu_rel10 = (nfapi_ul_config_ulsch_pdu_rel10_t*)tlv;
-
- return (push8(ulsch_pdu_rel10->resource_allocation_type, ppWritePackedMsg, end) &&
- push32(ulsch_pdu_rel10->resource_block_coding, ppWritePackedMsg, end) &&
- push8(ulsch_pdu_rel10->transport_blocks, ppWritePackedMsg, end) &&
- push8(ulsch_pdu_rel10->transmission_scheme, ppWritePackedMsg, end) &&
- push8(ulsch_pdu_rel10->number_of_layers, ppWritePackedMsg, end) &&
- push8(ulsch_pdu_rel10->codebook_index, ppWritePackedMsg, end) &&
- push8(ulsch_pdu_rel10->disable_sequence_hopping_flag, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_ulsch_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_ulsch_pdu_rel11_t* ulsch_pdu_rel11 = (nfapi_ul_config_ulsch_pdu_rel11_t*)tlv;
-
- return (push8(ulsch_pdu_rel11->virtual_cell_id_enabled_flag, ppWritePackedMsg, end) &&
- push16(ulsch_pdu_rel11->npusch_identity, ppWritePackedMsg, end) &&
- push8(ulsch_pdu_rel11->dmrs_config_flag, ppWritePackedMsg, end) &&
- push16(ulsch_pdu_rel11->ndmrs_csh_identity, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_ulsch_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_ulsch_pdu_rel13_t* ulsch_pdu_rel13 = (nfapi_ul_config_ulsch_pdu_rel13_t*)tlv;
-
- return (push8(ulsch_pdu_rel13->ue_type, ppWritePackedMsg, end) &&
- push16(ulsch_pdu_rel13->total_number_of_repetitions, ppWritePackedMsg, end) &&
- push16(ulsch_pdu_rel13->repetition_number, ppWritePackedMsg, end) &&
- push16(ulsch_pdu_rel13->initial_transmission_sf_io, ppWritePackedMsg, end) &&
- push8(ulsch_pdu_rel13->empty_symbols_due_to_re_tunning, ppWritePackedMsg, end));
-}
-
-//Pack fns for ul_tti PDUS
-
-
-static uint8_t pack_ul_tti_request_prach_pdu(nfapi_nr_prach_pdu_t* prach_pdu, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- return(
- push16(prach_pdu->phys_cell_id, ppWritePackedMsg, end) &&
- push8(prach_pdu->num_prach_ocas, ppWritePackedMsg, end) &&
- push8(prach_pdu->prach_format, ppWritePackedMsg, end) &&
- push8(prach_pdu->num_ra, ppWritePackedMsg, end) &&
- push8(prach_pdu->prach_start_symbol, ppWritePackedMsg, end) &&
- push16(prach_pdu->num_cs, ppWritePackedMsg, end)
- // TODO: ignoring beamforming tlv for now
- );
-
-}
-
-static uint8_t pack_ul_tti_request_pucch_pdu(nfapi_nr_pucch_pdu_t* pucch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- return(
- push16(pucch_pdu->rnti, ppWritePackedMsg, end) &&
- push32(pucch_pdu->handle, ppWritePackedMsg, end) &&
- push16(pucch_pdu->bwp_size, ppWritePackedMsg, end) &&
- push16(pucch_pdu->bwp_start, ppWritePackedMsg, end) &&
- push8(pucch_pdu->subcarrier_spacing, ppWritePackedMsg, end) &&
- push8(pucch_pdu->cyclic_prefix, ppWritePackedMsg, end) &&
- push8(pucch_pdu->format_type, ppWritePackedMsg, end) &&
- push8(pucch_pdu->multi_slot_tx_indicator, ppWritePackedMsg, end) &&
- push16(pucch_pdu->prb_start, ppWritePackedMsg, end) &&
- push16(pucch_pdu->prb_size, ppWritePackedMsg, end) &&
- push8(pucch_pdu->start_symbol_index, ppWritePackedMsg, end) &&
- push8(pucch_pdu->nr_of_symbols, ppWritePackedMsg, end) &&
- push8(pucch_pdu->freq_hop_flag, ppWritePackedMsg, end) &&
- push16(pucch_pdu->second_hop_prb, ppWritePackedMsg, end) &&
- push8(pucch_pdu->group_hop_flag, ppWritePackedMsg, end) &&
- push8(pucch_pdu->sequence_hop_flag, ppWritePackedMsg, end) &&
- push16(pucch_pdu->hopping_id, ppWritePackedMsg, end) &&
- push16(pucch_pdu->initial_cyclic_shift, ppWritePackedMsg, end) &&
- push16(pucch_pdu->data_scrambling_id, ppWritePackedMsg, end) &&
- push8(pucch_pdu->time_domain_occ_idx, ppWritePackedMsg, end) &&
- push8(pucch_pdu->pre_dft_occ_idx, ppWritePackedMsg, end) &&
- push8(pucch_pdu->pre_dft_occ_len, ppWritePackedMsg, end) &&
- push8(pucch_pdu->add_dmrs_flag, ppWritePackedMsg, end) &&
- push16(pucch_pdu->dmrs_scrambling_id, ppWritePackedMsg, end) &&
- push8(pucch_pdu->dmrs_cyclic_shift, ppWritePackedMsg, end) &&
- push8(pucch_pdu->sr_flag, ppWritePackedMsg, end) &&
- push8(pucch_pdu->bit_len_harq, ppWritePackedMsg, end) &&
- push16(pucch_pdu->bit_len_csi_part1, ppWritePackedMsg, end) &&
- push16(pucch_pdu->bit_len_csi_part2, ppWritePackedMsg, end)
- // TODO: ignoring beamforming tlv for now
- );
-
-}
-
-
-static uint8_t pack_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t* pusch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-
- if (!(
- push16(pusch_pdu->pdu_bit_map, ppWritePackedMsg, end) &&
- push16(pusch_pdu->rnti, ppWritePackedMsg, end) &&
- push32(pusch_pdu->handle, ppWritePackedMsg, end) &&
- push16(pusch_pdu->bwp_size, ppWritePackedMsg, end) &&
- push16(pusch_pdu->bwp_start, ppWritePackedMsg, end) &&
- push8(pusch_pdu->subcarrier_spacing, ppWritePackedMsg, end) &&
- push8(pusch_pdu->cyclic_prefix, ppWritePackedMsg, end) &&
- push16(pusch_pdu->target_code_rate, ppWritePackedMsg, end) &&
- push8(pusch_pdu->qam_mod_order, ppWritePackedMsg, end) &&
- push8(pusch_pdu->mcs_index, ppWritePackedMsg, end) &&
- push8(pusch_pdu->mcs_table, ppWritePackedMsg, end) &&
- push8(pusch_pdu->transform_precoding, ppWritePackedMsg, end) &&
- push16(pusch_pdu->data_scrambling_id, ppWritePackedMsg, end) &&
- push8(pusch_pdu->nrOfLayers, ppWritePackedMsg, end) &&
- push16(pusch_pdu->ul_dmrs_symb_pos, ppWritePackedMsg, end) &&
- push8(pusch_pdu->dmrs_config_type, ppWritePackedMsg, end) &&
- push16(pusch_pdu->ul_dmrs_scrambling_id, ppWritePackedMsg, end) &&
- push8(pusch_pdu->scid, ppWritePackedMsg, end) &&
- push8(pusch_pdu->num_dmrs_cdm_grps_no_data, ppWritePackedMsg, end) &&
- push16(pusch_pdu->dmrs_ports, ppWritePackedMsg, end) &&
- push8(pusch_pdu->resource_alloc, ppWritePackedMsg, end) &&
- push8(pusch_pdu->resource_alloc,ppWritePackedMsg, end) &&
- push16(pusch_pdu->dmrs_ports, ppWritePackedMsg, end) &&
- push16(pusch_pdu->rb_start, ppWritePackedMsg, end) &&
- push16(pusch_pdu->rb_size, ppWritePackedMsg, end) &&
- push8(pusch_pdu->vrb_to_prb_mapping, ppWritePackedMsg, end) &&
- push8(pusch_pdu->frequency_hopping, ppWritePackedMsg, end) &&
- push16(pusch_pdu->tx_direct_current_location, ppWritePackedMsg, end) &&
- push8(pusch_pdu->uplink_frequency_shift_7p5khz, ppWritePackedMsg, end) &&
- push8(pusch_pdu->start_symbol_index, ppWritePackedMsg, end) &&
- push8(pusch_pdu->nr_of_symbols, ppWritePackedMsg, end)
- // TODO: ignoring beamforming tlv for now
- ))
- return 0;
-
-
- //Pack Optional Data only included if indicated in pduBitmap
- switch(pusch_pdu->pdu_bit_map){
- case PUSCH_PDU_BITMAP_PUSCH_DATA:
- {
- // pack optional TLVs
- return(
- push8(pusch_pdu->pusch_data.rv_index, ppWritePackedMsg, end) &&
- push8(pusch_pdu->pusch_data.harq_process_id, ppWritePackedMsg, end) &&
- push32(pusch_pdu->pusch_data.tb_size, ppWritePackedMsg, end) &&
- push16(pusch_pdu->pusch_data.num_cb, ppWritePackedMsg, end) &&
- pusharray8(pusch_pdu->pusch_data.cb_present_and_position,1,1,ppWritePackedMsg, end)
- );
- }
- break;
-
- case PUSCH_PDU_BITMAP_PUSCH_UCI:
- {
- return(
- push16(pusch_pdu->pusch_uci.harq_ack_bit_length, ppWritePackedMsg, end) &&
- push16(pusch_pdu->pusch_uci.csi_part1_bit_length, ppWritePackedMsg, end) &&
- push16(pusch_pdu->pusch_uci.csi_part2_bit_length, ppWritePackedMsg, end) &&
- push8(pusch_pdu->pusch_uci.alpha_scaling, ppWritePackedMsg, end) &&
- push8(pusch_pdu->pusch_uci.beta_offset_harq_ack, ppWritePackedMsg, end) &&
- push8(pusch_pdu->pusch_uci.beta_offset_csi1, ppWritePackedMsg, end) &&
- push8(pusch_pdu->pusch_uci.beta_offset_csi2, ppWritePackedMsg, end)
- );
- }
- break;
-
- case PUSCH_PDU_BITMAP_PUSCH_PTRS:
- {
- return(
- push8(pusch_pdu->pusch_ptrs.num_ptrs_ports, ppWritePackedMsg, end) &&
- push8(pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_dmrs_port, ppWritePackedMsg, end) &&
- push16(pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_port_index, ppWritePackedMsg, end) &&
- push8(pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_re_offset, ppWritePackedMsg, end) &&
- push8(pusch_pdu->pusch_ptrs.ptrs_time_density, ppWritePackedMsg, end) &&
- push8(pusch_pdu->pusch_ptrs.ptrs_freq_density, ppWritePackedMsg, end) &&
- push8(pusch_pdu->pusch_ptrs.ul_ptrs_power, ppWritePackedMsg, end)
- );
- }
- break;
-
- case PUSCH_PDU_BITMAP_DFTS_OFDM:
- {
- return(
- push8(pusch_pdu->dfts_ofdm.low_papr_group_number, ppWritePackedMsg, end) &&
- push16(pusch_pdu->dfts_ofdm.low_papr_sequence_number, ppWritePackedMsg, end) &&
- push8(pusch_pdu->dfts_ofdm.ul_ptrs_sample_density, ppWritePackedMsg, end) &&
- push8(pusch_pdu->dfts_ofdm.ul_ptrs_time_density_transform_precoding, ppWritePackedMsg, end)
- );
- }
- break;
-
- default:
- {
- NFAPI_TRACE(NFAPI_TRACE_INFO, "Invalid pdu bitmap %d \n", pusch_pdu->pdu_bit_map );
- }
- }
-
- return 1;
-}
-
-static uint8_t pack_ul_tti_request_srs_pdu(nfapi_nr_srs_pdu_t* srs_pdu, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- return(
- push16(srs_pdu->rnti, ppWritePackedMsg, end) &&
- push32(srs_pdu->handle, ppWritePackedMsg, end) &&
- push16(srs_pdu->bwp_size, ppWritePackedMsg, end) &&
- push16(srs_pdu->bwp_start, ppWritePackedMsg, end) &&
- push8(srs_pdu->subcarrier_spacing, ppWritePackedMsg, end) &&
- push8(srs_pdu->cyclic_prefix, ppWritePackedMsg, end) &&
- push8(srs_pdu->num_ant_ports, ppWritePackedMsg, end) &&
- push8(srs_pdu->num_symbols, ppWritePackedMsg, end) &&
- push8(srs_pdu->num_repetitions, ppWritePackedMsg, end) &&
- push8(srs_pdu->time_start_position, ppWritePackedMsg, end) &&
- push8(srs_pdu->config_index, ppWritePackedMsg, end) &&
- push16(srs_pdu->sequence_id, ppWritePackedMsg, end) &&
- push8(srs_pdu->bandwidth_index, ppWritePackedMsg, end) &&
- push8(srs_pdu->comb_size, ppWritePackedMsg, end) &&
- push8(srs_pdu->comb_offset, ppWritePackedMsg, end) &&
- push8(srs_pdu->cyclic_shift, ppWritePackedMsg, end) &&
- push8(srs_pdu->frequency_position, ppWritePackedMsg, end) &&
- push8(srs_pdu->frequency_shift, ppWritePackedMsg, end) &&
- push8(srs_pdu->frequency_hopping, ppWritePackedMsg, end) &&
- push8(srs_pdu->group_or_sequence_hopping, ppWritePackedMsg, end) &&
- push8(srs_pdu->resource_type, ppWritePackedMsg, end) &&
- push16(srs_pdu->t_srs, ppWritePackedMsg, end) &&
- push16(srs_pdu->t_offset, ppWritePackedMsg, end)
-
- // TODO: ignoring beamforming tlv for now
- );
-
-}
-
-static uint8_t pack_ul_config_request_ulsch_pdu(nfapi_ul_config_ulsch_pdu* ulsch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL8_TAG, &ulsch_pdu->ulsch_pdu_rel8, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel8_value) &&
- pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL10_TAG, &ulsch_pdu->ulsch_pdu_rel10, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel10_value) &&
- pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL11_TAG, &ulsch_pdu->ulsch_pdu_rel11, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel11_value) &&
- pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL13_TAG, &ulsch_pdu->ulsch_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel13_value));
-}
-
-static uint8_t pack_ul_config_request_cqi_ri_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_cqi_ri_information_rel8_t* cqi_ri_info_rel8 = (nfapi_ul_config_cqi_ri_information_rel8_t*)tlv;
-
- return ( push8(cqi_ri_info_rel8->dl_cqi_pmi_size_rank_1, ppWritePackedMsg, end) &&
- push8(cqi_ri_info_rel8->dl_cqi_pmi_size_rank_greater_1, ppWritePackedMsg, end) &&
- push8(cqi_ri_info_rel8->ri_size, ppWritePackedMsg, end) &&
- push8(cqi_ri_info_rel8->delta_offset_cqi, ppWritePackedMsg, end) &&
- push8(cqi_ri_info_rel8->delta_offset_ri, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_cqi_ri_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_cqi_ri_information_rel9_t* cqi_ri_info_rel9 = (nfapi_ul_config_cqi_ri_information_rel9_t*)tlv;
-
- if(!(push8(cqi_ri_info_rel9->report_type, ppWritePackedMsg, end) &&
- push8(cqi_ri_info_rel9->delta_offset_cqi, ppWritePackedMsg, end) &&
- push8(cqi_ri_info_rel9->delta_offset_ri, ppWritePackedMsg, end)))
- {
- return 0;
- }
-
- switch(cqi_ri_info_rel9->report_type)
- {
- case NFAPI_CSI_REPORT_TYPE_PERIODIC:
- {
- if(!(push8(cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size, ppWritePackedMsg, end) &&
- push8(cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.control_type, ppWritePackedMsg, end)))
- {
- return 0;
- }
- }
- break;
- case NFAPI_CSI_REPORT_TYPE_APERIODIC:
- {
- if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc, ppWritePackedMsg, end) == 0)
- return 0;
-
- uint8_t i;
- for(i = 0; i < cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc; ++i)
- {
- if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size, ppWritePackedMsg, end) == 0)
- return 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[j], ppWritePackedMsg, end) == 0)
- return 0;
- }
- }
- }
- break;
- default:
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid report type %d \n", cqi_ri_info_rel9->report_type );
- }
- break;
- };
-
- return 1;
-}
-
-static uint8_t pack_ul_config_request_cqi_ri_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_cqi_ri_information_rel13_t* cqi_ri_info_rel13 = (nfapi_ul_config_cqi_ri_information_rel13_t*)tlv;
-
- switch(cqi_ri_info_rel13->report_type)
- {
- case NFAPI_CSI_REPORT_TYPE_PERIODIC:
- {
- if(push16(cqi_ri_info_rel13->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size_2, ppWritePackedMsg, end) == 0)
- return 0;
- }
- break;
- case NFAPI_CSI_REPORT_TYPE_APERIODIC:
- {
- // No parameters
- }
- break;
- default:
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid report type %d \n", cqi_ri_info_rel13->report_type );
- }
- break;
- };
-
- return 1;
-}
-
-static uint8_t pack_ul_config_request_cqi_ri_information(nfapi_ul_config_cqi_ri_information* cqi_ri_info, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- return (pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL8_TAG, &cqi_ri_info->cqi_ri_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_cqi_ri_rel8_value) &&
- pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL9_TAG, &cqi_ri_info->cqi_ri_information_rel9, ppWritePackedMsg, end, &pack_ul_config_request_cqi_ri_rel9_value) &&
- pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL13_TAG, &cqi_ri_info->cqi_ri_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_cqi_ri_rel13_value));
-
-}
-
-static uint8_t pack_ul_config_request_init_tx_params_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_initial_transmission_parameters_rel8_t* init_tx_params_rel8 = (nfapi_ul_config_initial_transmission_parameters_rel8_t*)tlv;
-
- return (push8(init_tx_params_rel8->n_srs_initial, ppWritePackedMsg, end) &&
- push8(init_tx_params_rel8->initial_number_of_resource_blocks, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_initial_transmission_parameters(nfapi_ul_config_initial_transmission_parameters* init_tx_params, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- return pack_tlv(NFAPI_UL_CONFIG_REQUEST_INITIAL_TRANSMISSION_PARAMETERS_REL8_TAG, &init_tx_params->initial_transmission_parameters_rel8, ppWritePackedMsg, end, &pack_ul_config_request_init_tx_params_rel8_value);
-}
-
-static uint8_t pack_ul_config_request_ulsch_harq_info_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_ulsch_harq_information_rel10_t* harq_info_rel10 = (nfapi_ul_config_ulsch_harq_information_rel10_t*)tlv;
-
- return (push8(harq_info_rel10->harq_size, ppWritePackedMsg, end) &&
- push8(harq_info_rel10->delta_offset_harq, ppWritePackedMsg, end) &&
- push8(harq_info_rel10->ack_nack_mode, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_ulsch_harq_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_ulsch_harq_information_rel13_t* harq_info_rel13 = (nfapi_ul_config_ulsch_harq_information_rel13_t*)tlv;
-
- return (push16(harq_info_rel13->harq_size_2, ppWritePackedMsg, end) &&
- push8(harq_info_rel13->delta_offset_harq_2, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_ulsch_harq_information(nfapi_ul_config_ulsch_harq_information* harq_info, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL10_TAG, &harq_info->harq_information_rel10, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_harq_info_rel10_value) &&
- pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL13_TAG, &harq_info->harq_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_harq_info_rel13_value));
-}
-
-static uint8_t pack_ul_config_request_ue_info_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_ue_information_rel8_t* ue_info_rel8 = (nfapi_ul_config_ue_information_rel8_t*)tlv;
-
- return ( push32(ue_info_rel8->handle, ppWritePackedMsg, end) &&
- push16(ue_info_rel8->rnti, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_ue_info_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_ue_information_rel11_t* ue_info_rel11 = (nfapi_ul_config_ue_information_rel11_t*)tlv;
-
- return ( push8(ue_info_rel11->virtual_cell_id_enabled_flag, ppWritePackedMsg, end) &&
- push16(ue_info_rel11->npusch_identity, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_ue_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_ue_information_rel13_t* ue_info_rel13 = (nfapi_ul_config_ue_information_rel13_t*)tlv;
-
- return ( push8(ue_info_rel13->ue_type, ppWritePackedMsg, end) &&
- push8(ue_info_rel13->empty_symbols, ppWritePackedMsg, end) &&
- push16(ue_info_rel13->total_number_of_repetitions, ppWritePackedMsg, end) &&
- push16(ue_info_rel13->repetition_number, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_ue_information(nfapi_ul_config_ue_information* ue_info, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG, &ue_info->ue_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_ue_info_rel8_value) &&
- pack_tlv(NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG, &ue_info->ue_information_rel11, ppWritePackedMsg, end, &pack_ul_config_request_ue_info_rel11_value) &&
- pack_tlv(NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG, &ue_info->ue_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_ue_info_rel13_value));
-}
-
-static uint8_t pack_ul_config_request_harq_info_rel10_tdd_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_harq_information_rel10_tdd_t* harq_info_rel10_tdd = (nfapi_ul_config_harq_information_rel10_tdd_t*)tlv;
-
- return ( push8(harq_info_rel10_tdd->harq_size, ppWritePackedMsg, end) &&
- push8(harq_info_rel10_tdd->ack_nack_mode, ppWritePackedMsg, end) &&
- push8(harq_info_rel10_tdd->number_of_pucch_resources, ppWritePackedMsg, end) &&
- push16(harq_info_rel10_tdd->n_pucch_1_0, ppWritePackedMsg, end) &&
- push16(harq_info_rel10_tdd->n_pucch_1_1, ppWritePackedMsg, end) &&
- push16(harq_info_rel10_tdd->n_pucch_1_2, ppWritePackedMsg, end) &&
- push16(harq_info_rel10_tdd->n_pucch_1_3, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_harq_info_rel8_fdd_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_harq_information_rel8_fdd_t* harq_info_rel8_fdd = (nfapi_ul_config_harq_information_rel8_fdd_t*)tlv;
-
- return ( push16(harq_info_rel8_fdd->n_pucch_1_0, ppWritePackedMsg, end) &&
- push8(harq_info_rel8_fdd->harq_size, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_harq_info_rel9_fdd_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_harq_information_rel9_fdd_t* harq_info_rel9_fdd = (nfapi_ul_config_harq_information_rel9_fdd_t*)tlv;
-
- return ( push8(harq_info_rel9_fdd->harq_size, ppWritePackedMsg, end) &&
- push8(harq_info_rel9_fdd->ack_nack_mode, ppWritePackedMsg, end) &&
- push8(harq_info_rel9_fdd->number_of_pucch_resources, ppWritePackedMsg, end) &&
- push16(harq_info_rel9_fdd->n_pucch_1_0, ppWritePackedMsg, end) &&
- push16(harq_info_rel9_fdd->n_pucch_1_1, ppWritePackedMsg, end) &&
- push16(harq_info_rel9_fdd->n_pucch_1_2, ppWritePackedMsg, end) &&
- push16(harq_info_rel9_fdd->n_pucch_1_3, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_harq_info_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_harq_information_rel11_t* harq_info_rel11 = (nfapi_ul_config_harq_information_rel11_t*)tlv;
-
- return ( push8(harq_info_rel11->num_ant_ports, ppWritePackedMsg, end) &&
- push16(harq_info_rel11->n_pucch_2_0, ppWritePackedMsg, end) &&
- push16(harq_info_rel11->n_pucch_2_1, ppWritePackedMsg, end) &&
- push16(harq_info_rel11->n_pucch_2_2, ppWritePackedMsg, end) &&
- push16(harq_info_rel11->n_pucch_2_3, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_harq_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_harq_information_rel13_t* harq_info_rel13 = (nfapi_ul_config_harq_information_rel13_t*)tlv;
-
- return ( push16(harq_info_rel13->harq_size_2, ppWritePackedMsg, end) &&
- push8(harq_info_rel13->starting_prb, ppWritePackedMsg, end) &&
- push8(harq_info_rel13->n_prb, ppWritePackedMsg, end) &&
- push8(harq_info_rel13->cdm_index, ppWritePackedMsg, end) &&
- push8(harq_info_rel13->n_srs, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_harq_information(nfapi_ul_config_harq_information* harq_info, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL10_TDD_TAG, &harq_info->harq_information_rel10_tdd, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel10_tdd_value) &&
- pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL8_FDD_TAG, &harq_info->harq_information_rel8_fdd, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel8_fdd_value) &&
- pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL9_FDD_TAG, &harq_info->harq_information_rel9_fdd, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel9_fdd_value) &&
- pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL11_TAG, &harq_info->harq_information_rel11, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel11_value) &&
- pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL13_TAG, &harq_info->harq_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel13_value));
-
-}
-
-static uint8_t pack_ul_config_request_cqi_info_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_cqi_information_rel8_t* cqi_info_rel8 = (nfapi_ul_config_cqi_information_rel8_t*)tlv;
-
- return ( push16(cqi_info_rel8->pucch_index, ppWritePackedMsg, end) &&
- push8(cqi_info_rel8->dl_cqi_pmi_size, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_cqi_info_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_cqi_information_rel10_t* cqi_info_rel10 = (nfapi_ul_config_cqi_information_rel10_t*)tlv;
-
- return ( push8(cqi_info_rel10->number_of_pucch_resource, ppWritePackedMsg, end) &&
- push16(cqi_info_rel10->pucch_index_p1, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_cqi_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_cqi_information_rel13_t* cqi_info_rel13 = (nfapi_ul_config_cqi_information_rel13_t*)tlv;
-
- return ( push8(cqi_info_rel13->csi_mode, ppWritePackedMsg, end) &&
- push16(cqi_info_rel13->dl_cqi_pmi_size_2, ppWritePackedMsg, end) &&
- push8(cqi_info_rel13->starting_prb, ppWritePackedMsg, end) &&
- push8(cqi_info_rel13->n_prb, ppWritePackedMsg, end) &&
- push8(cqi_info_rel13->cdm_index, ppWritePackedMsg, end) &&
- push8(cqi_info_rel13->n_srs, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_cqi_information(nfapi_ul_config_cqi_information* cqi_info, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG, &cqi_info->cqi_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_cqi_info_rel8_value) &&
- pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL10_TAG, &cqi_info->cqi_information_rel10, ppWritePackedMsg, end, &pack_ul_config_request_cqi_info_rel10_value) &&
- pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL13_TAG, &cqi_info->cqi_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_cqi_info_rel13_value));
-
-}
-
-static uint8_t pack_ul_config_request_sr_info_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_sr_information_rel8_t* sr_info_rel8 = (nfapi_ul_config_sr_information_rel8_t*)tlv;
- return push16(sr_info_rel8->pucch_index, ppWritePackedMsg, end);
-}
-static uint8_t pack_ul_config_request_sr_info_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_sr_information_rel10_t* sr_info_rel10 = (nfapi_ul_config_sr_information_rel10_t*)tlv;
-
- return ( push8(sr_info_rel10->number_of_pucch_resources, ppWritePackedMsg, end) &&
- push16(sr_info_rel10->pucch_index_p1, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_sr_information(nfapi_ul_config_sr_information* sr_info, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL8_TAG, &sr_info->sr_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_sr_info_rel8_value) &&
- pack_tlv(NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL10_TAG, &sr_info->sr_information_rel10, ppWritePackedMsg, end, &pack_ul_config_request_sr_info_rel10_value));
-}
-
-static uint8_t pack_ul_config_request_srs_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_srs_pdu_rel8_t* srs_pdu_rel8 = (nfapi_ul_config_srs_pdu_rel8_t*)tlv;
-
- return (push32(srs_pdu_rel8->handle, ppWritePackedMsg, end) &&
- push16(srs_pdu_rel8->size, ppWritePackedMsg, end) &&
- push16(srs_pdu_rel8->rnti, ppWritePackedMsg, end) &&
- push8(srs_pdu_rel8->srs_bandwidth, ppWritePackedMsg, end) &&
- push8(srs_pdu_rel8->frequency_domain_position, ppWritePackedMsg, end) &&
- push8(srs_pdu_rel8->srs_hopping_bandwidth, ppWritePackedMsg, end) &&
- push8(srs_pdu_rel8->transmission_comb, ppWritePackedMsg, end) &&
- push16(srs_pdu_rel8->i_srs, ppWritePackedMsg, end) &&
- push8(srs_pdu_rel8->sounding_reference_cyclic_shift, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_srs_pdu_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_srs_pdu_rel10_t* srs_pdu_rel10 = (nfapi_ul_config_srs_pdu_rel10_t*)tlv;
- return push8(srs_pdu_rel10->antenna_port, ppWritePackedMsg, end);
-}
-
-static uint8_t pack_ul_config_request_srs_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_srs_pdu_rel13_t* srs_pdu_rel13 = (nfapi_ul_config_srs_pdu_rel13_t*)tlv;
-
- return ( push8(srs_pdu_rel13->number_of_combs, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_nb_harq_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_nb_harq_information_rel13_fdd_t* nb_harq_pdu_rel13 = (nfapi_ul_config_nb_harq_information_rel13_fdd_t*)tlv;
-
- return ( push8(nb_harq_pdu_rel13->harq_ack_resource, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_nulsch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_nulsch_pdu_rel13_t* nulsch_pdu_rel13 = (nfapi_ul_config_nulsch_pdu_rel13_t*)tlv;
-
- return (push8(nulsch_pdu_rel13->nulsch_format, ppWritePackedMsg, end) &&
- push32(nulsch_pdu_rel13->handle, ppWritePackedMsg, end) &&
- push16(nulsch_pdu_rel13->size, ppWritePackedMsg, end) &&
- push16(nulsch_pdu_rel13->rnti, ppWritePackedMsg, end) &&
- push8(nulsch_pdu_rel13->subcarrier_indication, ppWritePackedMsg, end) &&
- push8(nulsch_pdu_rel13->resource_assignment, ppWritePackedMsg, end) &&
- push8(nulsch_pdu_rel13->mcs, ppWritePackedMsg, end) &&
- push8(nulsch_pdu_rel13->redudancy_version, ppWritePackedMsg, end) &&
- push8(nulsch_pdu_rel13->repetition_number, ppWritePackedMsg, end) &&
- push8(nulsch_pdu_rel13->new_data_indication, ppWritePackedMsg, end) &&
- push8(nulsch_pdu_rel13->n_srs, ppWritePackedMsg, end) &&
- push16(nulsch_pdu_rel13->scrambling_sequence_initialization_cinit, ppWritePackedMsg, end) &&
- push16(nulsch_pdu_rel13->sf_idx, ppWritePackedMsg, end) &&
- pack_ul_config_request_ue_information(&(nulsch_pdu_rel13->ue_information), ppWritePackedMsg, end) &&
- pack_tlv(NFAPI_UL_CONFIG_REQUEST_NB_HARQ_INFORMATION_REL13_FDD_TAG, &nulsch_pdu_rel13->nb_harq_information.nb_harq_information_rel13_fdd, ppWritePackedMsg, end, &pack_ul_config_request_nb_harq_rel13_value));
-}
-static uint8_t pack_ul_config_request_nrach_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_nrach_pdu_rel13_t* nrach_pdu_rel13 = (nfapi_ul_config_nrach_pdu_rel13_t*)tlv;
-
- return ( push8(nrach_pdu_rel13->nprach_config_0, ppWritePackedMsg, end) &&
- push8(nrach_pdu_rel13->nprach_config_1, ppWritePackedMsg, end) &&
- push8(nrach_pdu_rel13->nprach_config_2, ppWritePackedMsg, end));
-
-}
-
-
-
-static uint8_t pack_ul_tti_pdu_list_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_nr_ul_tti_request_number_of_pdus_t* value = (nfapi_nr_ul_tti_request_number_of_pdus_t*)tlv;
-
- if(!(push16(value->pdu_size, ppWritePackedMsg, end) &&
- push16(value->pdu_type, ppWritePackedMsg, end) ))
- return 0;
-
-
- // first match the pdu type, then call the respective function
- switch(value->pdu_type)
- {
- case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE:
- {
- if(!pack_ul_tti_request_prach_pdu(&value->prach_pdu, ppWritePackedMsg, end))
- return 0;
- }
- break;
-
- case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE:
- {
- if(!pack_ul_tti_request_pucch_pdu(&value->pucch_pdu, ppWritePackedMsg, end))
- return 0;
- }
- break;
- case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE:
- {
- if(!pack_ul_tti_request_pusch_pdu(&value->pusch_pdu, ppWritePackedMsg, end))
- return 0;
- }
- break;
- case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE:
- {
- if(!pack_ul_tti_request_srs_pdu(&value->srs_pdu, ppWritePackedMsg, end))
- return 0;
- }
- break;
-
- default:
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid UL_TTI pdu type %d \n", value->pdu_type );
- }
- break;
- }
-
- return 1;
-}
-
-static uint8_t pack_ul_tti_groups_list_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_nr_ul_tti_request_number_of_groups_t* value = (nfapi_nr_ul_tti_request_number_of_groups_t*)tlv;
-
- if(!push8(value->n_ue, ppWritePackedMsg, end))
- return 0;
- for(int i=0; in_ue;i++)
- {
- if(!push8(value->ue_list[i].pdu_idx, ppWritePackedMsg, end))
- return 0;
- }
- return 1;
-}
-
-static uint8_t pack_ul_config_request_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_config_request_body_t* value = (nfapi_ul_config_request_body_t*)tlv;
-
- if(!(push8(value->number_of_pdus, ppWritePackedMsg, end) &&
- push8(value->rach_prach_frequency_resources, ppWritePackedMsg, end) &&
- push8(value->srs_present, ppWritePackedMsg, end)))
- return 0;
-
- uint16_t i = 0;
- for(i = 0; i < value->number_of_pdus; ++i)
- {
- nfapi_ul_config_request_pdu_t* pdu = &(value->ul_config_pdu_list[i]);
-
- if(push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
- return 0;
-
- // Put a 0 size in and then determine the size after the pdu
- // has been writen and write the calculated size
- uint8_t* pWritePackedMsgPduSize = *ppWritePackedMsg;
- pdu->pdu_size = 0;
- if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
- return 0;
-
- switch(pdu->pdu_type)
- {
- case NFAPI_UL_CONFIG_ULSCH_PDU_TYPE:
- {
- if(!pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_pdu), ppWritePackedMsg, end))
- return 0;
- }
- break;
- case NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE:
- {
- if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_cqi_ri_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
- pack_ul_config_request_cqi_ri_information(&(pdu->ulsch_cqi_ri_pdu.cqi_ri_information), ppWritePackedMsg, end) &&
- pack_ul_config_request_initial_transmission_parameters(&(pdu->ulsch_cqi_ri_pdu.initial_transmission_parameters), ppWritePackedMsg, end)))
- return 0;
- }
- break;
- case NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE:
- {
- if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_harq_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
- pack_ul_config_request_ulsch_harq_information(&(pdu->ulsch_harq_pdu.harq_information), ppWritePackedMsg, end) &&
- pack_ul_config_request_initial_transmission_parameters(&(pdu->ulsch_harq_pdu.initial_transmission_parameters), ppWritePackedMsg, end)))
- return 0;
- }
- break;
- case NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE:
- {
- if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
- pack_ul_config_request_cqi_ri_information(&(pdu->ulsch_cqi_harq_ri_pdu.cqi_ri_information), ppWritePackedMsg, end) &&
- pack_ul_config_request_ulsch_harq_information(&(pdu->ulsch_cqi_harq_ri_pdu.harq_information), ppWritePackedMsg, end) &&
- pack_ul_config_request_initial_transmission_parameters(&(pdu->ulsch_cqi_harq_ri_pdu.initial_transmission_parameters), ppWritePackedMsg, end)))
- return 0;
- }
- break;
- case NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE:
- {
- if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_pdu.ue_information), ppWritePackedMsg, end) &&
- pack_ul_config_request_cqi_information(&(pdu->uci_cqi_pdu.cqi_information), ppWritePackedMsg, end)))
- return 0;
- }
- break;
- case NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE:
- {
- if(!(pack_ul_config_request_ue_information(&(pdu->uci_sr_pdu.ue_information), ppWritePackedMsg, end) &&
- pack_ul_config_request_sr_information(&(pdu->uci_sr_pdu.sr_information), ppWritePackedMsg, end)))
- return 0;
- }
- break;
- case NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE:
- {
- if(!(pack_ul_config_request_ue_information(&(pdu->uci_harq_pdu.ue_information), ppWritePackedMsg, end) &&
- pack_ul_config_request_harq_information(&(pdu->uci_harq_pdu.harq_information), ppWritePackedMsg, end)))
- return 0;
- }
- break;
- case NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE:
- {
- if(!(pack_ul_config_request_ue_information(&(pdu->uci_sr_harq_pdu.ue_information), ppWritePackedMsg, end) &&
- pack_ul_config_request_sr_information(&(pdu->uci_sr_harq_pdu.sr_information), ppWritePackedMsg, end) &&
- pack_ul_config_request_harq_information(&(pdu->uci_sr_harq_pdu.harq_information), ppWritePackedMsg, end)))
- return 0;
- }
- break;
- case NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE:
- {
- if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_harq_pdu.ue_information), ppWritePackedMsg, end) &&
- pack_ul_config_request_cqi_information(&(pdu->uci_cqi_harq_pdu.cqi_information), ppWritePackedMsg, end) &&
- pack_ul_config_request_harq_information(&(pdu->uci_cqi_harq_pdu.harq_information), ppWritePackedMsg, end)))
- return 0;
- }
- break;
- case NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE:
- {
- if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_sr_pdu.ue_information), ppWritePackedMsg, end) &&
- pack_ul_config_request_cqi_information(&(pdu->uci_cqi_sr_pdu.cqi_information), ppWritePackedMsg, end) &&
- pack_ul_config_request_sr_information(&(pdu->uci_cqi_sr_pdu.sr_information), ppWritePackedMsg, end)))
- return 0;
- }
- break;
- case NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE:
- {
- if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_sr_harq_pdu.ue_information), ppWritePackedMsg, end) &&
- pack_ul_config_request_cqi_information(&(pdu->uci_cqi_sr_harq_pdu.cqi_information), ppWritePackedMsg, end) &&
- pack_ul_config_request_sr_information(&(pdu->uci_cqi_sr_harq_pdu.sr_information), ppWritePackedMsg, end) &&
- pack_ul_config_request_harq_information(&(pdu->uci_cqi_sr_harq_pdu.harq_information), ppWritePackedMsg, end)))
- return 0;
- }
- break;
- case NFAPI_UL_CONFIG_SRS_PDU_TYPE:
- {
- if(!(pack_tlv(NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL8_TAG, &pdu->srs_pdu.srs_pdu_rel8, ppWritePackedMsg, end, &pack_ul_config_request_srs_pdu_rel8_value) &&
- pack_tlv(NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL10_TAG, &pdu->srs_pdu.srs_pdu_rel10, ppWritePackedMsg, end, &pack_ul_config_request_srs_pdu_rel10_value) &&
- pack_tlv(NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL13_TAG, &pdu->srs_pdu.srs_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_srs_pdu_rel13_value)))
- return 0;
- }
- break;
- case NFAPI_UL_CONFIG_HARQ_BUFFER_PDU_TYPE:
- {
- if(!(pack_ul_config_request_ue_information(&(pdu->harq_buffer_pdu.ue_information), ppWritePackedMsg, end)))
- return 0;
- }
- break;
- case NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE:
- {
- if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_uci_csi_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
- pack_ul_config_request_cqi_information(&(pdu->ulsch_uci_csi_pdu.csi_information), ppWritePackedMsg, end)))
- return 0;
- }
- break;
- case NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE:
- {
- if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_uci_harq_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
- pack_ul_config_request_harq_information(&(pdu->ulsch_uci_harq_pdu.harq_information), ppWritePackedMsg, end)))
- return 0;
- }
- break;
- case NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE:
- {
- if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_csi_uci_harq_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
- pack_ul_config_request_cqi_information(&(pdu->ulsch_csi_uci_harq_pdu.csi_information), ppWritePackedMsg, end) &&
- pack_ul_config_request_harq_information(&(pdu->ulsch_csi_uci_harq_pdu.harq_information), ppWritePackedMsg, end)))
- return 0;
- }
- break;
- case NFAPI_UL_CONFIG_NULSCH_PDU_TYPE:
- {
- if(!(pack_tlv(NFAPI_UL_CONFIG_REQUEST_NULSCH_PDU_REL13_TAG, &pdu->nulsch_pdu.nulsch_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_nulsch_pdu_rel13_value)))
- return 0;
- }
- break;
- case NFAPI_UL_CONFIG_NRACH_PDU_TYPE:
- {
- if(!(pack_tlv(NFAPI_UL_CONFIG_REQUEST_NRACH_PDU_REL13_TAG, &pdu->nrach_pdu.nrach_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_nrach_pdu_rel13_value)))
- return 0;
- }
- break;
- default:
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
- }
- break;
- };
-
- // add 1 for the pdu_type. The delta will include the pdu_size
- pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
- push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
-
- }
- return 1;
-}
-
-
-static uint8_t pack_ul_tti_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_nr_ul_tti_request_t *pNfapiMsg = (nfapi_nr_ul_tti_request_t*)msg;
-
- if (!(push16(pNfapiMsg->SFN , ppWritePackedMsg, end) &&
- push16(pNfapiMsg->Slot , ppWritePackedMsg, end) &&
- push8(pNfapiMsg->n_pdus , ppWritePackedMsg, end) &&
- push8(pNfapiMsg->rach_present, ppWritePackedMsg, end) &&
- push8(pNfapiMsg->n_ulsch, ppWritePackedMsg, end) &&
- push8(pNfapiMsg->n_ulcch, ppWritePackedMsg, end) &&
- push8(pNfapiMsg->n_group, ppWritePackedMsg, end) ))
- return 0;
-
- for(int i=0; in_pdus; i++)
- {
- if(!pack_ul_tti_pdu_list_value(&pNfapiMsg->pdus_list[i], ppWritePackedMsg, end))
- return 0;
- }
-
- for(int i=0; in_group; i++)
- {
- if(!pack_ul_tti_groups_list_value(&pNfapiMsg->groups_list[i], ppWritePackedMsg, end))
- return 0;
-
- }
-
- return 1;
-}
-
-
-static uint8_t pack_ul_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_ul_config_request_t *pNfapiMsg = (nfapi_ul_config_request_t*)msg;
-
- return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
- pack_tlv(NFAPI_UL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->ul_config_request_body, ppWritePackedMsg, end, &pack_ul_config_request_body_value) &&
- pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)) ;
-}
-
-static uint8_t pack_hi_dci0_hi_rel8_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_hi_dci0_hi_pdu_rel8_t* hi_pdu_rel8 = (nfapi_hi_dci0_hi_pdu_rel8_t*)tlv;
-
- return ( push8(hi_pdu_rel8->resource_block_start, ppWritePackedMsg, end) &&
- push8(hi_pdu_rel8->cyclic_shift_2_for_drms, ppWritePackedMsg, end) &&
- push8(hi_pdu_rel8->hi_value, ppWritePackedMsg, end) &&
- push8(hi_pdu_rel8->i_phich, ppWritePackedMsg, end) &&
- push16(hi_pdu_rel8->transmission_power, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_hi_dci0_hi_rel10_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_hi_dci0_hi_pdu_rel10_t* hi_pdu_rel10 = (nfapi_hi_dci0_hi_pdu_rel10_t*)tlv;
-
- return ( push8(hi_pdu_rel10->flag_tb2, ppWritePackedMsg, end) &&
- push8(hi_pdu_rel10->hi_value_2, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_hi_dci0_dci_rel8_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_hi_dci0_dci_pdu_rel8_t* dci_pdu_rel8 = (nfapi_hi_dci0_dci_pdu_rel8_t*)tlv;
-
- return ( push8(dci_pdu_rel8->dci_format, ppWritePackedMsg, end) &&
- push8(dci_pdu_rel8->cce_index, ppWritePackedMsg, end) &&
- push8(dci_pdu_rel8->aggregation_level, ppWritePackedMsg, end) &&
- push16(dci_pdu_rel8->rnti, ppWritePackedMsg, end) &&
- push8(dci_pdu_rel8->resource_block_start, ppWritePackedMsg, end) &&
- push8(dci_pdu_rel8->number_of_resource_block, ppWritePackedMsg, end) &&
- push8(dci_pdu_rel8->mcs_1, ppWritePackedMsg, end) &&
- push8(dci_pdu_rel8->cyclic_shift_2_for_drms, ppWritePackedMsg, end) &&
- push8(dci_pdu_rel8->frequency_hopping_enabled_flag, ppWritePackedMsg, end) &&
- push8(dci_pdu_rel8->frequency_hopping_bits, ppWritePackedMsg, end) &&
- push8(dci_pdu_rel8->new_data_indication_1, ppWritePackedMsg, end) &&
- push8(dci_pdu_rel8->ue_tx_antenna_seleciton, ppWritePackedMsg, end) &&
- push8(dci_pdu_rel8->tpc, ppWritePackedMsg, end) &&
- push8(dci_pdu_rel8->cqi_csi_request, ppWritePackedMsg, end) &&
- push8(dci_pdu_rel8->ul_index, ppWritePackedMsg, end) &&
- push8(dci_pdu_rel8->dl_assignment_index, ppWritePackedMsg, end) &&
- push32(dci_pdu_rel8->tpc_bitmap, ppWritePackedMsg, end) &&
- push16(dci_pdu_rel8->transmission_power, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_hi_dci0_dci_rel10_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_hi_dci0_dci_pdu_rel10_t* dci_pdu_rel10 = (nfapi_hi_dci0_dci_pdu_rel10_t*)tlv;
-
- return ( push8(dci_pdu_rel10->cross_carrier_scheduling_flag, ppWritePackedMsg, end) &&
- push8(dci_pdu_rel10->carrier_indicator, ppWritePackedMsg, end) &&
- push8(dci_pdu_rel10->size_of_cqi_csi_feild, ppWritePackedMsg, end) &&
- push8(dci_pdu_rel10->srs_flag, ppWritePackedMsg, end) &&
- push8(dci_pdu_rel10->srs_request, ppWritePackedMsg, end) &&
- push8(dci_pdu_rel10->resource_allocation_flag, ppWritePackedMsg, end) &&
- push8(dci_pdu_rel10->resource_allocation_type, ppWritePackedMsg, end) &&
- push32(dci_pdu_rel10->resource_block_coding, ppWritePackedMsg, end) &&
- push8(dci_pdu_rel10->mcs_2, ppWritePackedMsg, end) &&
- push8(dci_pdu_rel10->new_data_indication_2, ppWritePackedMsg, end) &&
- push8(dci_pdu_rel10->number_of_antenna_ports, ppWritePackedMsg, end) &&
- push8(dci_pdu_rel10->tpmi, ppWritePackedMsg, end) &&
- push8(dci_pdu_rel10->total_dci_length_including_padding, ppWritePackedMsg, end) &&
- push8(dci_pdu_rel10->n_ul_rb, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_hi_dci0_dci_rel12_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_hi_dci0_dci_pdu_rel12_t* dci_pdu_rel12 = (nfapi_hi_dci0_dci_pdu_rel12_t*)tlv;
-
- return ( push8(dci_pdu_rel12->pscch_resource, ppWritePackedMsg, end) &&
- push8(dci_pdu_rel12->time_resource_pattern, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_hi_dci0_mpdcch_dci_rel13_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t* mpdcch_dci_pdu_rel13 = (nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t*)tlv;
-
- return ( push8(mpdcch_dci_pdu_rel13->mpdcch_narrowband, ppWritePackedMsg, end) &&
- push8(mpdcch_dci_pdu_rel13->number_of_prb_pairs, ppWritePackedMsg, end) &&
- push8(mpdcch_dci_pdu_rel13->resource_block_assignment, ppWritePackedMsg, end) &&
- push8(mpdcch_dci_pdu_rel13->mpdcch_transmission_type, ppWritePackedMsg, end) &&
- push8(mpdcch_dci_pdu_rel13->start_symbol, ppWritePackedMsg, end) &&
- push8(mpdcch_dci_pdu_rel13->ecce_index, ppWritePackedMsg, end) &&
- push8(mpdcch_dci_pdu_rel13->aggreagation_level, ppWritePackedMsg, end) &&
- push8(mpdcch_dci_pdu_rel13->rnti_type, ppWritePackedMsg, end) &&
- push16(mpdcch_dci_pdu_rel13->rnti, ppWritePackedMsg, end) &&
- push8(mpdcch_dci_pdu_rel13->ce_mode, ppWritePackedMsg, end) &&
- push16(mpdcch_dci_pdu_rel13->drms_scrambling_init, ppWritePackedMsg, end) &&
- push16(mpdcch_dci_pdu_rel13->initial_transmission_sf_io, ppWritePackedMsg, end) &&
- push16(mpdcch_dci_pdu_rel13->transmission_power, ppWritePackedMsg, end) &&
- push8(mpdcch_dci_pdu_rel13->dci_format, ppWritePackedMsg, end) &&
- push8(mpdcch_dci_pdu_rel13->resource_block_start, ppWritePackedMsg, end) &&
- push8(mpdcch_dci_pdu_rel13->number_of_resource_blocks, ppWritePackedMsg, end) &&
- push8(mpdcch_dci_pdu_rel13->mcs, ppWritePackedMsg, end) &&
- push8(mpdcch_dci_pdu_rel13->pusch_repetition_levels, ppWritePackedMsg, end) &&
- push8(mpdcch_dci_pdu_rel13->frequency_hopping_flag, ppWritePackedMsg, end) &&
- push8(mpdcch_dci_pdu_rel13->new_data_indication, ppWritePackedMsg, end) &&
- push8(mpdcch_dci_pdu_rel13->harq_process, ppWritePackedMsg, end) &&
- push8(mpdcch_dci_pdu_rel13->redudency_version, ppWritePackedMsg, end) &&
- push8(mpdcch_dci_pdu_rel13->tpc, ppWritePackedMsg, end) &&
- push8(mpdcch_dci_pdu_rel13->csi_request, ppWritePackedMsg, end) &&
- push8(mpdcch_dci_pdu_rel13->ul_inex, ppWritePackedMsg, end) &&
- push8(mpdcch_dci_pdu_rel13->dai_presence_flag, ppWritePackedMsg, end) &&
- push8(mpdcch_dci_pdu_rel13->dl_assignment_index, ppWritePackedMsg, end) &&
- push8(mpdcch_dci_pdu_rel13->srs_request, ppWritePackedMsg, end) &&
- push8(mpdcch_dci_pdu_rel13->dci_subframe_repetition_number, ppWritePackedMsg, end) &&
- push32(mpdcch_dci_pdu_rel13->tcp_bitmap, ppWritePackedMsg, end) &&
- push8(mpdcch_dci_pdu_rel13->total_dci_length_include_padding, ppWritePackedMsg, end) &&
- push8(mpdcch_dci_pdu_rel13->number_of_tx_antenna_ports, ppWritePackedMsg, end) &&
- pusharray16(mpdcch_dci_pdu_rel13->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, mpdcch_dci_pdu_rel13->number_of_tx_antenna_ports, ppWritePackedMsg, end));
-
-}
-
-static uint8_t pack_hi_dci0_npdcch_dci_rel13_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_hi_dci0_npdcch_dci_pdu_rel13_t* npdcch_dci_pdu_rel13 = (nfapi_hi_dci0_npdcch_dci_pdu_rel13_t*)tlv;
-
- return ( push8(npdcch_dci_pdu_rel13->ncce_index, ppWritePackedMsg, end) &&
- push8(npdcch_dci_pdu_rel13->aggregation_level, ppWritePackedMsg, end) &&
- push8(npdcch_dci_pdu_rel13->start_symbol, ppWritePackedMsg, end) &&
- push16(npdcch_dci_pdu_rel13->rnti, ppWritePackedMsg, end) &&
- push8(npdcch_dci_pdu_rel13->scrambling_reinitialization_batch_index, ppWritePackedMsg, end) &&
- push8(npdcch_dci_pdu_rel13->nrs_antenna_ports_assumed_by_the_ue, ppWritePackedMsg, end) &&
- push8(npdcch_dci_pdu_rel13->subcarrier_indication, ppWritePackedMsg, end) &&
- push8(npdcch_dci_pdu_rel13->resource_assignment, ppWritePackedMsg, end) &&
- push8(npdcch_dci_pdu_rel13->scheduling_delay, ppWritePackedMsg, end) &&
- push8(npdcch_dci_pdu_rel13->mcs, ppWritePackedMsg, end) &&
- push8(npdcch_dci_pdu_rel13->redudancy_version, ppWritePackedMsg, end) &&
- push8(npdcch_dci_pdu_rel13->repetition_number, ppWritePackedMsg, end) &&
- push8(npdcch_dci_pdu_rel13->new_data_indicator, ppWritePackedMsg, end) &&
- push8(npdcch_dci_pdu_rel13->dci_subframe_repetition_number, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_hi_dci0_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_hi_dci0_request_body_t* value = (nfapi_hi_dci0_request_body_t*)tlv;
-
- if(!(push16(value->sfnsf, ppWritePackedMsg, end) &&
- push8(value->number_of_dci, ppWritePackedMsg, end) &&
- push8(value->number_of_hi, ppWritePackedMsg, end)))
- return 0;
-
- uint16_t i = 0;
- uint16_t total_number_of_pdus = value->number_of_dci + value->number_of_hi;
- for(i = 0; i < total_number_of_pdus; ++i)
- {
- nfapi_hi_dci0_request_pdu_t* pdu = &(value->hi_dci0_pdu_list[i]);
-
- if(push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
- return 0;
-
- // Put a 0 size in and then determine the size after the pdu
- // has been writen and write the calculated size
- uint8_t* pWritePackedMsgPduSize = *ppWritePackedMsg;
- pdu->pdu_size = 0;
- if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
- return 0;
-
- switch(pdu->pdu_type)
- {
- case NFAPI_HI_DCI0_HI_PDU_TYPE:
- {
- if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_HI_PDU_REL8_TAG, &pdu->hi_pdu.hi_pdu_rel8, ppWritePackedMsg, end, pack_hi_dci0_hi_rel8_pdu_value) &&
- pack_tlv(NFAPI_HI_DCI0_REQUEST_HI_PDU_REL10_TAG, &pdu->hi_pdu.hi_pdu_rel10, ppWritePackedMsg, end, pack_hi_dci0_hi_rel10_pdu_value)))
- return 0;
- }
- break;
- case NFAPI_HI_DCI0_DCI_PDU_TYPE:
- {
- if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG, &pdu->dci_pdu.dci_pdu_rel8, ppWritePackedMsg, end, pack_hi_dci0_dci_rel8_pdu_value) &&
- pack_tlv(NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL10_TAG, &pdu->dci_pdu.dci_pdu_rel10, ppWritePackedMsg, end, pack_hi_dci0_dci_rel10_pdu_value) &&
- pack_tlv(NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL12_TAG, &pdu->dci_pdu.dci_pdu_rel12, ppWritePackedMsg, end, pack_hi_dci0_dci_rel12_pdu_value)))
- return 0;
- }
- break;
- case NFAPI_HI_DCI0_EPDCCH_DCI_PDU_TYPE:
- {
- if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL8_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel8, ppWritePackedMsg, end, pack_hi_dci0_dci_rel8_pdu_value) &&
- pack_tlv(NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL10_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel10, ppWritePackedMsg, end, pack_hi_dci0_dci_rel10_pdu_value) &&
- pack_tlv(NFAPI_HI_DCI0_REQUEST_EPDCCH_PARAMETERS_REL11_TAG, &pdu->epdcch_dci_pdu.epdcch_parameters_rel11, ppWritePackedMsg, end, pack_dl_config_epdcch_parameters_rel11_value)))
- return 0;
- }
- break;
- case NFAPI_HI_DCI0_MPDCCH_DCI_PDU_TYPE:
- {
- if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_MPDCCH_DCI_PDU_REL13_TAG, &pdu->mpdcch_dci_pdu.mpdcch_dci_pdu_rel13, ppWritePackedMsg, end, pack_hi_dci0_mpdcch_dci_rel13_pdu_value)))
- return 0;
- }
- break;
- case NFAPI_HI_DCI0_NPDCCH_DCI_PDU_TYPE:
- {
- if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_NPDCCH_DCI_PDU_REL13_TAG, &pdu->npdcch_dci_pdu.npdcch_dci_pdu_rel13, ppWritePackedMsg, end, pack_hi_dci0_npdcch_dci_rel13_pdu_value)))
- return 0;
- }
- break;
- default:
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
- }
- break;
- };
-
- // add 1 for the pdu_type. The delta will include the pdu_size
- pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
- push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
-
- }
-
- return 1;
-}
-
-static uint8_t pack_ul_dci_pdu_list_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_nr_ul_dci_request_pdus_t* value = (nfapi_nr_ul_dci_request_pdus_t*)tlv;
-
- for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i)
- {
- if(!push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].RNTI, ppWritePackedMsg, end) &&
- push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingId, ppWritePackedMsg, end) &&
-
- push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingRNTI, ppWritePackedMsg, end) &&
- push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].CceIndex, ppWritePackedMsg, end) &&
- push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].AggregationLevel, ppWritePackedMsg, end) &&
- push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].beta_PDCCH_1_0, ppWritePackedMsg, end) &&
-
- push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].powerControlOffsetSS, ppWritePackedMsg, end) &&
- push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end) &&
-
- pusharray8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].Payload, DCI_PAYLOAD_BYTE_LEN, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end));
-
- return 0;
- }
-
- return (push16(value->PDUType, ppWritePackedMsg, end) &&
- push16(value->PDUSize, ppWritePackedMsg, end) &&
- push16(value->pdcch_pdu.pdcch_pdu_rel15.BWPSize, ppWritePackedMsg, end) &&
- push16(value->pdcch_pdu.pdcch_pdu_rel15.BWPStart, ppWritePackedMsg, end) &&
- push8(value->pdcch_pdu.pdcch_pdu_rel15.SubcarrierSpacing, ppWritePackedMsg, end) &&
- push8(value->pdcch_pdu.pdcch_pdu_rel15.CyclicPrefix, ppWritePackedMsg, end) &&
-
- push8(value->pdcch_pdu.pdcch_pdu_rel15.StartSymbolIndex, ppWritePackedMsg, end) &&
- push8(value->pdcch_pdu.pdcch_pdu_rel15.DurationSymbols, ppWritePackedMsg, end) &&
- pusharray8(value->pdcch_pdu.pdcch_pdu_rel15.FreqDomainResource, 6, 6, ppWritePackedMsg, end) &&
- push8(value->pdcch_pdu.pdcch_pdu_rel15.CceRegMappingType, ppWritePackedMsg, end) &&
-
- push8(value->pdcch_pdu.pdcch_pdu_rel15.RegBundleSize, ppWritePackedMsg, end) &&
- push8(value->pdcch_pdu.pdcch_pdu_rel15.InterleaverSize, ppWritePackedMsg, end) &&
- push8(value->pdcch_pdu.pdcch_pdu_rel15.CoreSetType, ppWritePackedMsg, end) &&
- push16(value->pdcch_pdu.pdcch_pdu_rel15.ShiftIndex, ppWritePackedMsg, end));
-
-}
-
-static uint8_t pack_ul_dci_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_nr_ul_dci_request_t *pNfapiMsg = (nfapi_nr_ul_dci_request_t*)msg;
-
- if (!(push16(pNfapiMsg->SFN, ppWritePackedMsg, end) &&
- push16(pNfapiMsg->Slot, ppWritePackedMsg, end) &&
- push8(pNfapiMsg->numPdus, ppWritePackedMsg, end)
- ))
- return 0;
-
- for(int i=0; inumPdus; i++)
- {
- if(!pack_ul_dci_pdu_list_value(&pNfapiMsg->ul_dci_pdu_list[i], ppWritePackedMsg, end))
- return 0;
- }
- return 1;
-
-
-}
-
-
-
-static uint8_t pack_hi_dci0_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_hi_dci0_request_t *pNfapiMsg = (nfapi_hi_dci0_request_t*)msg;
-
- return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
- pack_tlv(NFAPI_HI_DCI0_REQUEST_BODY_TAG, &pNfapiMsg->hi_dci0_request_body, ppWritePackedMsg, end, &pack_hi_dci0_request_body_value) &&
- pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-//pack_tx_data_pdu_list_value
-static uint8_t pack_tx_data_pdu_list_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_nr_pdu_t* value = (nfapi_nr_pdu_t*)tlv;
-
- if(!(push32(value->num_TLV, ppWritePackedMsg, end) &&
- push16(value->PDU_index, ppWritePackedMsg, end) &&
- push16(value->PDU_length, ppWritePackedMsg, end)
- ))
- return 0;
-
- uint16_t i = 0;
- uint16_t total_number_of_tlvs = value->num_TLV;
- for(; i < total_number_of_tlvs; ++i)
- {
-
- if (!(push16(value->TLVs[i].length, ppWritePackedMsg, end) &&
- push16(value->TLVs[i].tag, ppWritePackedMsg, end)))
- return 0;
-
- switch(value->TLVs[i].tag)
- {
- case 0:
- {
- if(!pusharray32(value->TLVs[i].value.direct, 16384, value->TLVs[i].length, ppWritePackedMsg, end))
- return 0;
- break;
-
- }
-
- case 1:
- {
- if(!pusharray32(value->TLVs[i].value.ptr, value->TLVs[i].length , value->TLVs[i].length, ppWritePackedMsg, end))
- return 0;
- break;
-
- }
-
- default:
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid tag value %d \n", value->TLVs[i].tag );
- break;
- }
-
- }
- }
- return 1;
-}
-
-static uint8_t pack_tx_request_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_tx_request_body_t* value = (nfapi_tx_request_body_t*)tlv;
-
- if(push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
- return 0;
-
- uint16_t i = 0;
- uint16_t total_number_of_pdus = value->number_of_pdus;
- for(; i < total_number_of_pdus; ++i)
- {
- nfapi_tx_request_pdu_t* pdu = &(value->tx_pdu_list[i]);
-
- if(!(push16(pdu->pdu_length, ppWritePackedMsg, end) &&
- push16(pdu->pdu_index, ppWritePackedMsg, end)))
- return 0;
-
- uint8_t j;
- for(j = 0; j < pdu->num_segments; ++j)
- {
- // Use -1 as it is unbounded
- // 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 (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;
- }
- }
- }
-
- return 1;
-}
-
-static uint8_t pack_tx_data_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_nr_tx_data_request_t *pNfapiMsg = (nfapi_nr_tx_data_request_t*)msg;
-
- if (!(
- push16(pNfapiMsg->SFN, ppWritePackedMsg, end) &&
- push16(pNfapiMsg->Slot, ppWritePackedMsg, end) &&
- push16(pNfapiMsg->Number_of_PDUs, ppWritePackedMsg, end)
- ))
- return 0;
-
- for(int i=0; iNumber_of_PDUs; i++)
- {
- if(!pack_tx_data_pdu_list_value(&pNfapiMsg->pdu_list[i], ppWritePackedMsg, end))
- return 0;
- }
-
- return 1;
-}
-
-static uint8_t pack_tx_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_tx_request_t *pNfapiMsg = (nfapi_tx_request_t*)msg;
-
- 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_release_request_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ue_release_request_body_t* value = (nfapi_ue_release_request_body_t*)tlv;
- if(push16(value->number_of_TLVs, ppWritePackedMsg, end) == 0){
- return 0;
- }
-
- uint8_t j;
- uint16_t num = value->number_of_TLVs;
- for(j = 0; j < num; ++j){
- if(push16(value->ue_release_request_TLVs_list[j].rnti, ppWritePackedMsg, end) == 0){
- return 0;
- }
- }
- return 1;
-}
-
-static uint8_t pack_ue_release_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_ue_release_request_t *pNfapiMsg = (nfapi_ue_release_request_t*)msg;
- int x = push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end);
- int y = pack_tlv(NFAPI_UE_RELEASE_BODY_TAG, &pNfapiMsg->ue_release_request_body, ppWritePackedMsg, end, &pack_release_request_body_value);
- int z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
- return x && y && z;
-}
-
-static uint8_t pack_ue_release_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-
- nfapi_ue_release_response_t *pNfapiMsg = (nfapi_ue_release_response_t*)msg;
-
- int x = push32(pNfapiMsg->error_code, ppWritePackedMsg, end);
- int z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
- return x && z;
-}
-
-static uint8_t pack_rx_ue_information_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_rx_ue_information* value = (nfapi_rx_ue_information*)tlv;
-
- return ( push32(value->handle, ppWritePackedMsg, end) &&
- push16(value->rnti, ppWritePackedMsg, end) );
-}
-
-static uint8_t unpack_rx_ue_information_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_rx_ue_information* value = (nfapi_rx_ue_information*)tlv;
-
- return ( pull32(ppReadPackedMsg, &value->handle, end) &&
- pull16(ppReadPackedMsg, &value->rnti, end));
-}
-
-static uint8_t pack_harq_indication_tdd_harq_data_bundling(nfapi_harq_indication_tdd_harq_data_bundling_t* data, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- return ( push8(data->value_0, ppWritePackedMsg, end) &&
- push8(data->value_1, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_harq_indication_tdd_harq_data_multiplexing(nfapi_harq_indication_tdd_harq_data_multiplexing_t* data, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- return ( push8(data->value_0, ppWritePackedMsg, end) &&
- push8(data->value_1, ppWritePackedMsg, end) &&
- push8(data->value_2, ppWritePackedMsg, end) &&
- push8(data->value_3, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_harq_indication_tdd_harq_data_special_bundling(nfapi_harq_indication_tdd_harq_data_special_bundling_t* data, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- return ( push8(data->value_0, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_harq_indication_tdd_harq_data(nfapi_harq_indication_tdd_harq_data_t* data, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- return ( push8(data->value_0, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_harq_indication_tdd_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_harq_indication_tdd_rel8_t* harq_indication_tdd_rel8 = (nfapi_harq_indication_tdd_rel8_t*)tlv;
-
- if(!(push8(harq_indication_tdd_rel8->mode, ppWritePackedMsg, end) &&
- push8(harq_indication_tdd_rel8->number_of_ack_nack, ppWritePackedMsg, end)))
- return 0;
-
- uint8_t result = 0;
- switch(harq_indication_tdd_rel8->mode)
- {
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
- result = pack_harq_indication_tdd_harq_data_bundling(&harq_indication_tdd_rel8->harq_data.bundling, ppWritePackedMsg, end);
- break;
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
- result = pack_harq_indication_tdd_harq_data_multiplexing(&harq_indication_tdd_rel8->harq_data.multiplex, ppWritePackedMsg, end);
- break;
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
- result = pack_harq_indication_tdd_harq_data_special_bundling(&harq_indication_tdd_rel8->harq_data.special_bundling, ppWritePackedMsg, end);
- break;
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
- result = 1;
- break;
- default:
- // err....
- break;
- }
-
- return result;
-
-}
-
-static uint8_t pack_harq_indication_tdd_rel9_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_harq_indication_tdd_rel9_t* harq_indication_tdd_rel9 = (nfapi_harq_indication_tdd_rel9_t*)tlv;
-
- if(!(push8(harq_indication_tdd_rel9->mode, ppWritePackedMsg, end) &&
- push8(harq_indication_tdd_rel9->number_of_ack_nack, ppWritePackedMsg, end)))
- return 0;
-
- uint8_t idx;
- for(idx = 0; idx < harq_indication_tdd_rel9->number_of_ack_nack; ++idx)
- {
- uint8_t result = 0;
-
- switch(harq_indication_tdd_rel9->mode)
- {
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
- result = pack_harq_indication_tdd_harq_data(&(harq_indication_tdd_rel9->harq_data[idx].bundling), ppWritePackedMsg, end);
- break;
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
- result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel9->harq_data[idx].multiplex, ppWritePackedMsg, end);
- break;
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
- result = pack_harq_indication_tdd_harq_data_special_bundling(&harq_indication_tdd_rel9->harq_data[idx].special_bundling, ppWritePackedMsg, end);
- break;
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
- result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel9->harq_data[idx].channel_selection, ppWritePackedMsg, end);
- break;
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
- result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel9->harq_data[idx].format_3, ppWritePackedMsg, end);
- break;
- default:
- // err....
- break;
- }
-
- if(result == 0)
- return 0;
- }
-
- return 1;
-}
-
-static uint8_t pack_harq_indication_tdd_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_harq_indication_tdd_rel13_t* harq_indication_tdd_rel13 = (nfapi_harq_indication_tdd_rel13_t*)tlv;
-
- if(!(push8(harq_indication_tdd_rel13->mode, ppWritePackedMsg, end) &&
- push16(harq_indication_tdd_rel13->number_of_ack_nack, ppWritePackedMsg, end)))
- return 0;
-
- uint8_t idx;
- for(idx = 0; idx < harq_indication_tdd_rel13->number_of_ack_nack; ++idx)
- {
- uint8_t result = 0;
- switch(harq_indication_tdd_rel13->mode)
- {
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
- result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].bundling, ppWritePackedMsg, end);
- break;
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
- result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].multiplex, ppWritePackedMsg, end);
- break;
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
- result = pack_harq_indication_tdd_harq_data_special_bundling(&harq_indication_tdd_rel13->harq_data[idx].special_bundling, ppWritePackedMsg, end);
- break;
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
- result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].channel_selection, ppWritePackedMsg, end);
- break;
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
- result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].format_3, ppWritePackedMsg, end);
- break;
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_4:
- result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].format_4, ppWritePackedMsg, end);
- break;
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_5:
- result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].format_5, ppWritePackedMsg, end);
- break;
- default:
- // err....
- break;
- }
-
- if(result == 0)
- return 0;
- }
-
- return 1;
-}
-
-static uint8_t pack_harq_indication_fdd_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_harq_indication_fdd_rel8_t* harq_indication_fdd_rel8 = (nfapi_harq_indication_fdd_rel8_t*)tlv;
-
- return ( push8(harq_indication_fdd_rel8->harq_tb1, ppWritePackedMsg, end) &&
- push8(harq_indication_fdd_rel8->harq_tb2, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_harq_indication_fdd_rel9_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_harq_indication_fdd_rel9_t* harq_indication_fdd_rel9 = (nfapi_harq_indication_fdd_rel9_t*)tlv;
-
- return ( push8(harq_indication_fdd_rel9->mode, ppWritePackedMsg, end) &&
- push8(harq_indication_fdd_rel9->number_of_ack_nack, ppWritePackedMsg, end) &&
- pusharray8(harq_indication_fdd_rel9->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL9_MAX, harq_indication_fdd_rel9->number_of_ack_nack, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_harq_indication_fdd_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_harq_indication_fdd_rel13_t* harq_indication_fdd_rel13 = (nfapi_harq_indication_fdd_rel13_t*)tlv;
-
- return ( push8(harq_indication_fdd_rel13->mode, ppWritePackedMsg, end) &&
- push16(harq_indication_fdd_rel13->number_of_ack_nack, ppWritePackedMsg, end) &&
- pusharray8(harq_indication_fdd_rel13->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL13_MAX, harq_indication_fdd_rel13->number_of_ack_nack, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_cqi_information_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_ul_cqi_information_t* value = (nfapi_ul_cqi_information_t*)tlv;
-
- return ( push8(value->ul_cqi, ppWritePackedMsg, end) &&
- push8(value->channel, ppWritePackedMsg, end));
-
-}
-
-static uint8_t pack_harq_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_harq_indication_body_t* value = (nfapi_harq_indication_body_t*)tlv;
-
- if(push16(value->number_of_harqs, ppWritePackedMsg, end) == 0)
- return 0;
-
- uint16_t i = 0;
- uint16_t total_number_of_pdus = value->number_of_harqs;
- for(; i < total_number_of_pdus; ++i)
- {
- nfapi_harq_indication_pdu_t* pdu = &(value->harq_pdu_list[i]);
-
- uint8_t* instance_length_p = *ppWritePackedMsg;
- if(!push16(pdu->instance_length, ppWritePackedMsg, end))
- return 0;
-
- if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
- pack_tlv(NFAPI_HARQ_INDICATION_TDD_REL8_TAG, &pdu->harq_indication_tdd_rel8, ppWritePackedMsg, end, pack_harq_indication_tdd_rel8_value) &&
- pack_tlv(NFAPI_HARQ_INDICATION_TDD_REL9_TAG, &pdu->harq_indication_tdd_rel9, ppWritePackedMsg, end, pack_harq_indication_tdd_rel9_value) &&
- pack_tlv(NFAPI_HARQ_INDICATION_TDD_REL13_TAG, &pdu->harq_indication_tdd_rel13, ppWritePackedMsg, end, pack_harq_indication_tdd_rel13_value) &&
- pack_tlv(NFAPI_HARQ_INDICATION_FDD_REL8_TAG, &pdu->harq_indication_fdd_rel8, ppWritePackedMsg, end, pack_harq_indication_fdd_rel8_value) &&
- pack_tlv(NFAPI_HARQ_INDICATION_FDD_REL9_TAG, &pdu->harq_indication_fdd_rel9, ppWritePackedMsg, end, pack_harq_indication_fdd_rel9_value) &&
- pack_tlv(NFAPI_HARQ_INDICATION_FDD_REL13_TAG, &pdu->harq_indication_fdd_rel13, ppWritePackedMsg, end, pack_harq_indication_fdd_rel13_value) &&
- pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
- return 0;
-
- // calculate the instance length subtracting the size of the instance
- // length feild
- uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
- push16(instance_length, &instance_length_p, end);
- }
-
- return 1;
-}
-
-static uint8_t pack_harq_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_harq_indication_t *pNfapiMsg = (nfapi_harq_indication_t*)msg;
-
- return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
- pack_tlv(NFAPI_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->harq_indication_body, ppWritePackedMsg, end, pack_harq_indication_body_value) &&
- pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_crc_indication_rel8_body(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_crc_indication_rel8_t* crc_indication_rel8 = (nfapi_crc_indication_rel8_t*)tlv;
-
- return ( push8(crc_indication_rel8->crc_flag, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_crc_indication_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_crc_indication_body_t* value = (nfapi_crc_indication_body_t*)tlv;
-
- if(push16(value->number_of_crcs, ppWritePackedMsg, end) == 0)
- return 0;
-
- uint16_t i = 0;
- uint16_t total_number_of_pdus = value->number_of_crcs;
- for(; i < total_number_of_pdus; ++i)
- {
- nfapi_crc_indication_pdu_t* pdu = &(value->crc_pdu_list[i]);
-
- uint8_t* instance_length_p = *ppWritePackedMsg;
- if(!push16(pdu->instance_length, ppWritePackedMsg, end))
- return 0;
-
- if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
- pack_tlv(NFAPI_CRC_INDICATION_REL8_TAG, &pdu->crc_indication_rel8, ppWritePackedMsg, end, pack_crc_indication_rel8_body)))
- return 0;
-
- // calculate the instance length subtracting the size of the instance
- // length feild
- uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
- push16(instance_length, &instance_length_p, end);
- }
- return 1;
-}
-
-static uint8_t pack_crc_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_crc_indication_t *pNfapiMsg = (nfapi_crc_indication_t*)msg;
-
- return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
- pack_tlv(NFAPI_CRC_INDICATION_BODY_TAG, &pNfapiMsg->crc_indication_body, ppWritePackedMsg, end, &pack_crc_indication_body_value) &&
- pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-
-}
-static uint8_t pack_rx_indication_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_rx_indication_rel8_t* value = (nfapi_rx_indication_rel8_t*)tlv;
-
- return ( push16(value->length, ppWritePackedMsg, end) &&
- push16(value->offset, ppWritePackedMsg, end) &&
- push8(value->ul_cqi, ppWritePackedMsg, end) &&
- push16(value->timing_advance, ppWritePackedMsg, end));
-}
-static uint8_t pack_rx_indication_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_rx_indication_rel9_t* value = (nfapi_rx_indication_rel9_t*)tlv;
-
- return ( push16(value->timing_advance_r9, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_rx_ulsch_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- 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;
-
- // need to calculate the data offset's.
- 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;
- }
- }
-
- // Now update the structure to include the offset
- for(i =0; i < total_number_of_pdus; ++i)
- {
- nfapi_rx_indication_pdu_t* pdu = &(value->rx_pdu_list[i]);
-
- if(pdu->rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG)
- {
- if(pdu->rx_indication_rel8.offset == 1)
- {
- pdu->rx_indication_rel8.offset = offset;
- offset += pdu->rx_indication_rel8.length;
- }
- }
- }
-
- // Write out the pdu
- for(i = 0; i < total_number_of_pdus; ++i)
- {
- nfapi_rx_indication_pdu_t* pdu = &(value->rx_pdu_list[i]);
- if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
- pack_tlv(NFAPI_RX_INDICATION_REL8_TAG, &pdu->rx_indication_rel8, ppWritePackedMsg, end, pack_rx_indication_rel8_value) &&
- pack_tlv(NFAPI_RX_INDICATION_REL9_TAG, &pdu->rx_indication_rel9, ppWritePackedMsg, end, pack_rx_indication_rel9_value)))
- return 0;
- }
-
- // Write out the pdu data
- for(i = 0; i < total_number_of_pdus; ++i)
- {
- uint16_t length = 0;
- nfapi_rx_indication_pdu_t* pdu = &(value->rx_pdu_list[i]);
-
- if(pdu->rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG)
- {
- length = pdu->rx_indication_rel8.length;
- }
-
- if( pusharray8(value->rx_pdu_list[i].data, length, length, ppWritePackedMsg, end) == 0)
- return 0;
- }
- return 1;
-}
-
-
-static uint8_t pack_rx_ulsch_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_rx_indication_t *pNfapiMsg = (nfapi_rx_indication_t*)msg;
-
- return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
- pack_tlv(NFAPI_RX_INDICATION_BODY_TAG, &pNfapiMsg->rx_indication_body, ppWritePackedMsg, end, pack_rx_ulsch_indication_body_value) &&
- pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_preamble_pdu_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_preamble_pdu_rel8_t* preamble_rel8 = (nfapi_preamble_pdu_rel8_t*)tlv;
-
- return ( push16(preamble_rel8->rnti, ppWritePackedMsg, end) &&
- push8(preamble_rel8->preamble, ppWritePackedMsg, end) &&
- push16(preamble_rel8->timing_advance, ppWritePackedMsg, end));
-}
-static uint8_t pack_preamble_pdu_rel9_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_preamble_pdu_rel9_t* preamble_rel9 = (nfapi_preamble_pdu_rel9_t*)tlv;
-
- return ( push16(preamble_rel9->timing_advance_r9, ppWritePackedMsg, end) );
-}
-static uint8_t pack_preamble_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_preamble_pdu_rel13_t* preamble_rel13 = (nfapi_preamble_pdu_rel13_t*)tlv;
-
- return ( push8(preamble_rel13->rach_resource_type, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_rach_indication_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_rach_indication_body_t* value = (nfapi_rach_indication_body_t*)tlv;
-
- if( push16(value->number_of_preambles, ppWritePackedMsg, end) == 0)
- return 0;
-
- uint16_t i = 0;
- uint16_t total_number_of_pdus = value->number_of_preambles;
- for(; i < total_number_of_pdus; ++i)
- {
- nfapi_preamble_pdu_t* pdu = &(value->preamble_list[i]);
-
- uint8_t* instance_length_p = *ppWritePackedMsg;
- if(!push16(pdu->instance_length, ppWritePackedMsg, end))
- return 0;
-
- if(!(pack_tlv(NFAPI_PREAMBLE_REL8_TAG, &pdu->preamble_rel8, ppWritePackedMsg, end, pack_preamble_pdu_rel8_value) &&
- pack_tlv(NFAPI_PREAMBLE_REL9_TAG, &pdu->preamble_rel9, ppWritePackedMsg, end, pack_preamble_pdu_rel9_value) &&
- pack_tlv(NFAPI_PREAMBLE_REL13_TAG, &pdu->preamble_rel13, ppWritePackedMsg, end, pack_preamble_pdu_rel13_value)))
- return 0;
-
- // calculate the instance length subtracting the size of the instance
- // length feild
- uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
- push16(instance_length, &instance_length_p, end);
- }
-
- return 1;
-}
-
-static uint8_t pack_rach_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_rach_indication_t *pNfapiMsg = (nfapi_rach_indication_t*)msg;
-
- return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
- pack_tlv(NFAPI_RACH_INDICATION_BODY_TAG, &pNfapiMsg->rach_indication_body, ppWritePackedMsg, end, pack_rach_indication_body_value) &&
- pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_srs_indication_fdd_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_srs_indication_fdd_rel8_t* srs_pdu_rel8 = (nfapi_srs_indication_fdd_rel8_t*)tlv;
-
- return ( push16(srs_pdu_rel8->doppler_estimation, ppWritePackedMsg, end) &&
- push16(srs_pdu_rel8->timing_advance, ppWritePackedMsg, end) &&
- push8(srs_pdu_rel8->number_of_resource_blocks, ppWritePackedMsg, end) &&
- push8(srs_pdu_rel8->rb_start, ppWritePackedMsg, end) &&
- pusharray8(srs_pdu_rel8->snr, NFAPI_NUM_RB_MAX, srs_pdu_rel8->number_of_resource_blocks, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_srs_indication_fdd_rel9_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_srs_indication_fdd_rel9_t* srs_pdu_rel9 = (nfapi_srs_indication_fdd_rel9_t*)tlv;
-
- return ( push16(srs_pdu_rel9->timing_advance_r9, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_srs_indication_tdd_rel10_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_srs_indication_ttd_rel10_t* srs_pdu_rel10 = (nfapi_srs_indication_ttd_rel10_t*)tlv;
-
- return ( push8(srs_pdu_rel10->uppts_symbol, ppWritePackedMsg, end) );
-
-}
-
-static uint8_t pack_srs_indication_fdd_rel11_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_srs_indication_fdd_rel11_t* srs_pdu_rel11 = (nfapi_srs_indication_fdd_rel11_t*)tlv;
-
- return ( push16(srs_pdu_rel11->ul_rtoa, ppWritePackedMsg, end) ) ;
-}
-
-static uint8_t pack_tdd_channel_measurement_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_tdd_channel_measurement_t* value = (nfapi_tdd_channel_measurement_t*)tlv;
-
- if(!(push8(value->num_prb_per_subband, ppWritePackedMsg, end) &&
- push8(value->number_of_subbands, ppWritePackedMsg, end) &&
- push8(value->num_atennas, ppWritePackedMsg, end)))
- return 0;
-
- uint8_t idx = 0;
- for(idx = 0; idx < value->number_of_subbands; ++idx)
- {
- if(!(push8(value->subands[idx].subband_index, ppWritePackedMsg, end) &&
- pusharray16(value->subands[idx].channel, NFAPI_MAX_NUM_PHYSICAL_ANTENNAS, value->num_atennas, ppWritePackedMsg, end)))
- return 0;
- }
-
- return 1;
-}
-
-static uint8_t pack_srs_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_srs_indication_body_t *value = (nfapi_srs_indication_body_t*)tlv;
-
- if( push8(value->number_of_ues, ppWritePackedMsg, end) == 0)
- return 0;
-
- uint16_t i = 0;
- uint16_t total_number_of_pdus = value->number_of_ues;
- for(; i < total_number_of_pdus; ++i)
- {
- nfapi_srs_indication_pdu_t* pdu = &(value->srs_pdu_list[i]);
-
- uint8_t* instance_length_p = *ppWritePackedMsg;
- if(!push16(pdu->instance_length, ppWritePackedMsg, end))
- return 0;
-
- if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, &pack_rx_ue_information_value) &&
- pack_tlv(NFAPI_SRS_INDICATION_FDD_REL8_TAG, &pdu->srs_indication_fdd_rel8, ppWritePackedMsg, end, &pack_srs_indication_fdd_rel8_value) &&
- pack_tlv(NFAPI_SRS_INDICATION_FDD_REL9_TAG, &pdu->srs_indication_fdd_rel9, ppWritePackedMsg, end, &pack_srs_indication_fdd_rel9_value) &&
- pack_tlv(NFAPI_SRS_INDICATION_TDD_REL10_TAG, &pdu->srs_indication_tdd_rel10, ppWritePackedMsg, end, &pack_srs_indication_tdd_rel10_value) &&
- pack_tlv(NFAPI_SRS_INDICATION_FDD_REL11_TAG, &pdu->srs_indication_fdd_rel11, ppWritePackedMsg, end, &pack_srs_indication_fdd_rel11_value) &&
- pack_tlv(NFAPI_TDD_CHANNEL_MEASUREMENT_TAG, &pdu->tdd_channel_measurement, ppWritePackedMsg, end, &pack_tdd_channel_measurement_value)))
- return 0;
-
- // calculate the instance length subtracting the size of the instance
- // length feild
- uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
- push16(instance_length, &instance_length_p, end);
- }
-
- return 1;
-}
-
-static uint8_t pack_srs_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_srs_indication_t *pNfapiMsg = (nfapi_srs_indication_t*)msg;
-
- return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
- pack_tlv(NFAPI_SRS_INDICATION_BODY_TAG, &pNfapiMsg->srs_indication_body, ppWritePackedMsg, end, &pack_srs_indication_body_value) &&
- pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-
-}
-
-static uint8_t pack_sr_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_sr_indication_body_t* value = (nfapi_sr_indication_body_t*)tlv;
-
- if(push16(value->number_of_srs, ppWritePackedMsg, end) == 0)
- return 0;
-
- uint16_t i = 0;
- uint16_t total_number_of_pdus = value->number_of_srs;
- for(; i < total_number_of_pdus; ++i)
- {
- nfapi_sr_indication_pdu_t* pdu = &(value->sr_pdu_list[i]);
-
- uint8_t* instance_length_p = *ppWritePackedMsg;
- if(!push16(pdu->instance_length, ppWritePackedMsg, end))
- return 0;
-
- if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
- pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
- return 0;
-
- // calculate the instance length subtracting the size of the instance
- // length feild
- uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
- push16(instance_length, &instance_length_p, end);
- }
- return 1;
-}
-
-static uint8_t pack_sr_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_sr_indication_t *pNfapiMsg = (nfapi_sr_indication_t*)msg;
-
- return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
- pack_tlv(NFAPI_SR_INDICATION_BODY_TAG, &pNfapiMsg->sr_indication_body, ppWritePackedMsg, end, &pack_sr_indication_body_value) &&
- pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-
-}
-
-static uint8_t pack_cqi_indication_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_cqi_indication_rel8_t* cqi_pdu_rel8 = (nfapi_cqi_indication_rel8_t*)tlv;
-
- return ( push16(cqi_pdu_rel8->length, ppWritePackedMsg, end) &&
- push16(cqi_pdu_rel8->data_offset, ppWritePackedMsg, end) &&
- push8(cqi_pdu_rel8->ul_cqi, ppWritePackedMsg, end) &&
- push8(cqi_pdu_rel8->ri, ppWritePackedMsg, end) &&
- push16(cqi_pdu_rel8->timing_advance, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_cqi_indication_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_cqi_indication_rel9_t* cqi_pdu_rel9 = (nfapi_cqi_indication_rel9_t*)tlv;
-
- return ( push16(cqi_pdu_rel9->length, ppWritePackedMsg, end) &&
- push16(cqi_pdu_rel9->data_offset, ppWritePackedMsg, end) &&
- push8(cqi_pdu_rel9->ul_cqi, ppWritePackedMsg, end) &&
- push8(cqi_pdu_rel9->number_of_cc_reported, ppWritePackedMsg, end) &&
- pusharray8(cqi_pdu_rel9->ri, NFAPI_CC_MAX, cqi_pdu_rel9->number_of_cc_reported, ppWritePackedMsg, end) &&
- push16(cqi_pdu_rel9->timing_advance, ppWritePackedMsg, end) &&
- push16(cqi_pdu_rel9->timing_advance_r9, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_cqi_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_cqi_indication_body_t* value = (nfapi_cqi_indication_body_t*)tlv;
-
- if( push16(value->number_of_cqis, ppWritePackedMsg, end) == 0)
- return 0;
-
- // need to calculate the data offset's. This very bittle due the hardcoding
- // of the sizes. can not use the sizeof as we have an array for the Rel9
- // info
- uint16_t i = 0;
- uint16_t offset = 2; // taking into account the number_of_cqis
- uint16_t total_number_of_pdus = value->number_of_cqis;
- for(i = 0; i < total_number_of_pdus; ++i)
- {
- nfapi_cqi_indication_pdu_t* pdu = &(value->cqi_pdu_list[i]);
-
- offset += 2; // for the instance length
-
- if(pdu->rx_ue_information.tl.tag == NFAPI_RX_UE_INFORMATION_TAG)
- {
- offset += 4 + 6; // sizeof(nfapi_rx_ue_information) - sizeof(nfapi_tl_t)
- }
-
- if(pdu->cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG)
- {
- offset += 4 + 8;
- }
-
- if(pdu->cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG)
- {
- offset += 4 + 10 + pdu->cqi_indication_rel9.number_of_cc_reported;
- }
-
- if(pdu->ul_cqi_information.tl.tag == NFAPI_UL_CQI_INFORMATION_TAG)
- {
- offset += 4 + 2;
- }
- }
-
- // Now update the structure to include the offset
- for(i =0; i < total_number_of_pdus; ++i)
- {
- nfapi_cqi_indication_pdu_t* pdu = &(value->cqi_pdu_list[i]);
-
- if(pdu->cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG)
- {
- if(pdu->cqi_indication_rel8.data_offset == 1)
- {
- pdu->cqi_indication_rel8.data_offset = offset;
- offset += pdu->cqi_indication_rel8.length;
- }
- }
-
- if(pdu->cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG)
- {
- if(pdu->cqi_indication_rel9.data_offset == 1)
- {
- pdu->cqi_indication_rel9.data_offset = offset;
- offset += pdu->cqi_indication_rel9.length;
- }
- }
-
- }
-
- // Write out the cqi information
- for(i = 0; i < total_number_of_pdus; ++i)
- {
- nfapi_cqi_indication_pdu_t* pdu = &(value->cqi_pdu_list[i]);
-
- uint8_t* instance_length_p = *ppWritePackedMsg;
- if(!push16(pdu->instance_length, ppWritePackedMsg, end))
- return 0;
-
- if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end ,pack_rx_ue_information_value) &&
- pack_tlv(NFAPI_CQI_INDICATION_REL8_TAG, &pdu->cqi_indication_rel8, ppWritePackedMsg, end, pack_cqi_indication_rel8_value) &&
- pack_tlv(NFAPI_CQI_INDICATION_REL9_TAG, &pdu->cqi_indication_rel9, ppWritePackedMsg, end, pack_cqi_indication_rel9_value) &&
- pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
- return 0;
-
- // calculate the instance length subtracting the size of the instance
- // length feild
- uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
- push16(instance_length, &instance_length_p, end);
-
- }
-
- // Write out the cqi raw data
- for(i = 0; i < total_number_of_pdus; ++i)
- {
- uint16_t length = 0;
- nfapi_cqi_indication_pdu_t* pdu = &(value->cqi_pdu_list[i]);
-
- if(pdu->cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG)
- {
- length = pdu->cqi_indication_rel8.length;
- }
-
- if(pdu->cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG)
- {
- length = pdu->cqi_indication_rel9.length;
- }
-
- if( pusharray8(value->cqi_raw_pdu_list[i].pdu, NFAPI_CQI_RAW_MAX_LEN, length, ppWritePackedMsg, end) == 0)
- return 0;
- }
-
- return 1;
-}
-
-static uint8_t pack_cqi_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_cqi_indication_t *pNfapiMsg = (nfapi_cqi_indication_t*)msg;
-
- return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
- pack_tlv(NFAPI_CQI_INDICATION_BODY_TAG, &pNfapiMsg->cqi_indication_body, ppWritePackedMsg, end, pack_cqi_indication_body_value) &&
- pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-
-}
-
-static uint8_t pack_lbt_pdsch_req_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_lbt_pdsch_req_pdu_rel13_t* value = (nfapi_lbt_pdsch_req_pdu_rel13_t*)tlv;
-
- return ( push32(value->handle, ppWritePackedMsg, end) &&
- push32(value->mp_cca, ppWritePackedMsg, end) &&
- push32(value->n_cca, ppWritePackedMsg, end) &&
- push32(value->offset, ppWritePackedMsg, end) &&
- push32(value->lte_txop_sf, ppWritePackedMsg, end) &&
- push16(value->txop_sfn_sf_end, ppWritePackedMsg, end) &&
- push32(value->lbt_mode, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_lbt_drs_req_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_lbt_drs_req_pdu_rel13_t* value = (nfapi_lbt_drs_req_pdu_rel13_t*)tlv;
-
- return ( push32(value->handle, ppWritePackedMsg, end) &&
- push32(value->offset, ppWritePackedMsg, end) &&
- push16(value->sfn_sf_end, ppWritePackedMsg, end) &&
- push32(value->lbt_mode, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_lbt_dl_config_request_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_lbt_dl_config_request_body_t* value = (nfapi_lbt_dl_config_request_body_t*)tlv;
-
- if( push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
- return 0;
-
- uint16_t i = 0;
- uint16_t total_number_of_pdus = value->number_of_pdus;
- for(; i < total_number_of_pdus; ++i)
- {
- nfapi_lbt_dl_config_request_pdu_t* pdu = &(value->lbt_dl_config_req_pdu_list[i]);
-
- if( push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
- return 0;
-
- // Put a 0 size in and then determine the size after the pdu
- // has been writen and write the calculated size
- uint8_t* pWritePackedMsgPduSize = *ppWritePackedMsg;
- pdu->pdu_size = 0;
- if( push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
- return 0;
-
- switch(pdu->pdu_type)
- {
- case NFAPI_LBT_DL_CONFIG_REQUEST_PDSCH_PDU_TYPE:
- {
- if( pack_tlv(NFAPI_LBT_PDSCH_REQ_PDU_REL13_TAG, &pdu->lbt_pdsch_req_pdu.lbt_pdsch_req_pdu_rel13, ppWritePackedMsg, end, pack_lbt_pdsch_req_pdu_rel13_value) == 0)
- return 0;
- }
- break;
- case NFAPI_LBT_DL_CONFIG_REQUEST_DRS_PDU_TYPE:
- {
- if(pack_tlv(NFAPI_LBT_DRS_REQ_PDU_REL13_TAG, &pdu->lbt_drs_req_pdu.lbt_drs_req_pdu_rel13, ppWritePackedMsg, end, pack_lbt_drs_req_pdu_rel13_value) == 0)
- return 0;
- }
- break;
- default:
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL_CONFIG.request invalid pdu type %d \n", pdu->pdu_type );
- }
- break;
- };
-
- // add 1 for the pdu_type. The delta will include the pdu_size
- pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
- push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
- }
-
- return 1;
-}
-
-static uint8_t pack_lbt_pdsch_rsp_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_lbt_pdsch_rsp_pdu_rel13_t* value = (nfapi_lbt_pdsch_rsp_pdu_rel13_t*)tlv;
-
- return ( push32(value->handle, ppWritePackedMsg, end) &&
- push32(value->result, ppWritePackedMsg, end) &&
- push32(value->lte_txop_symbols, ppWritePackedMsg, end) &&
- push32(value->initial_partial_sf, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_lbt_drs_rsp_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_lbt_drs_rsp_pdu_rel13_t* value = (nfapi_lbt_drs_rsp_pdu_rel13_t*)tlv;
-
- return ( push32(value->handle, ppWritePackedMsg, end) &&
- push32(value->result, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_lbt_dl_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_lbt_dl_config_request_t *pNfapiMsg = (nfapi_lbt_dl_config_request_t*)msg;
-
- return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
- pack_tlv(NFAPI_LBT_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->lbt_dl_config_request_body, ppWritePackedMsg, end, &pack_lbt_dl_config_request_body_value) &&
- pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_lbt_dl_config_indication_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_lbt_dl_indication_body_t* value = (nfapi_lbt_dl_indication_body_t*)tlv;
-
- if( push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
- return 0;
-
- uint16_t i = 0;
- uint16_t total_number_of_pdus = value->number_of_pdus;
- for(; i < total_number_of_pdus; ++i)
- {
- nfapi_lbt_dl_indication_pdu_t* pdu = &(value->lbt_indication_pdu_list[i]);
-
- if( push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
- return 0;
-
- // Put a 0 size in and then determine the size after the pdu
- // has been writen and write the calculated size
- uint8_t* pWritePackedMsgPduSize = *ppWritePackedMsg;
- pdu->pdu_size = 0;
-
- if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
- return 0;
-
- switch(pdu->pdu_type)
- {
- case NFAPI_LBT_DL_RSP_PDSCH_PDU_TYPE:
- {
- if( pack_tlv(NFAPI_LBT_PDSCH_RSP_PDU_REL13_TAG, &pdu->lbt_pdsch_rsp_pdu.lbt_pdsch_rsp_pdu_rel13, ppWritePackedMsg, end, pack_lbt_pdsch_rsp_pdu_rel13_value) == 0)
- return 0;
- }
- break;
- case NFAPI_LBT_DL_RSP_DRS_PDU_TYPE:
- {
- if( pack_tlv(NFAPI_LBT_DRS_RSP_PDU_REL13_TAG, &pdu->lbt_drs_rsp_pdu.lbt_drs_rsp_pdu_rel13, ppWritePackedMsg, end, pack_lbt_drs_rsp_pdu_rel13_value) == 0)
- return 0;
- }
- break;
- default:
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL.indication body invalid pdu type %d \n", pdu->pdu_type );
- }
- break;
- };
-
- // add 1 for the pdu_type. The delta will include the pdu_size
- pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
- push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
- }
-
- return 1;
-}
-
-static uint8_t pack_lbt_dl_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_lbt_dl_indication_t *pNfapiMsg = (nfapi_lbt_dl_indication_t*)msg;
-
- return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
- pack_tlv(NFAPI_LBT_DL_INDICATION_BODY_TAG, &pNfapiMsg->lbt_dl_indication_body, ppWritePackedMsg, end, &pack_lbt_dl_config_indication_value) &&
- pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_nb_harq_indication_fdd_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_nb_harq_indication_fdd_rel13_t* nb_harq_indication_fdd_rel13 = (nfapi_nb_harq_indication_fdd_rel13_t*)tlv;
-
- return ( push8(nb_harq_indication_fdd_rel13->harq_tb1, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_nb_harq_indication_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_nb_harq_indication_body_t* value = (nfapi_nb_harq_indication_body_t*)tlv;
-
- if( push16(value->number_of_harqs, ppWritePackedMsg, end) == 0)
- return 0;
-
- uint16_t i = 0;
- uint16_t total_number_of_harqs = value->number_of_harqs;
- for(; i < total_number_of_harqs; ++i)
- {
- nfapi_nb_harq_indication_pdu_t* pdu = &(value->nb_harq_pdu_list[i]);
-
- uint8_t* instance_length_p = *ppWritePackedMsg;
- if(!push16(pdu->instance_length, ppWritePackedMsg, end))
- return 0;
-
- if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
- pack_tlv(NFAPI_NB_HARQ_INDICATION_FDD_REL13_TAG, &pdu->nb_harq_indication_fdd_rel13, ppWritePackedMsg, end, pack_nb_harq_indication_fdd_rel13_value) &&
- pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
- return 0;
-
- // calculate the instance length subtracting the size of the instance
- // length feild
- uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
- push16(instance_length, &instance_length_p, end);
- }
-
- return 1;
-}
-
-
-static uint8_t pack_nb_harq_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_nb_harq_indication_t *pNfapiMsg = (nfapi_nb_harq_indication_t*)msg;
-
- return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
- pack_tlv(NFAPI_NB_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->nb_harq_indication_body, ppWritePackedMsg, end, &pack_nb_harq_indication_body_value) &&
- pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_nrach_indication_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_nrach_indication_pdu_rel13_t* nrach_indication_fdd_rel13 = (nfapi_nrach_indication_pdu_rel13_t*)tlv;
-
- return ( push16(nrach_indication_fdd_rel13->rnti, ppWritePackedMsg, end) &&
- push8(nrach_indication_fdd_rel13->initial_sc, ppWritePackedMsg, end) &&
- push16(nrach_indication_fdd_rel13->timing_advance, ppWritePackedMsg, end) &&
- push8(nrach_indication_fdd_rel13->nrach_ce_level, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_nrach_indication_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
- nfapi_nrach_indication_body_t* value = (nfapi_nrach_indication_body_t*)tlv;
-
- if( push8(value->number_of_initial_scs_detected, ppWritePackedMsg, end) == 0)
- return 0;
-
- uint16_t i = 0;
- uint16_t total_number_of_initial_scs_detected = value->number_of_initial_scs_detected;
- for(; i < total_number_of_initial_scs_detected; ++i)
- {
- nfapi_nrach_indication_pdu_t* pdu = &(value->nrach_pdu_list[i]);
-
- //uint8_t* instance_length_p = *ppWritePackedMsg;
- //if(!push16(pdu->instance_length, ppWritePackedMsg, end))
- // return 0;
-
- if(!(pack_tlv(NFAPI_NRACH_INDICATION_REL13_TAG, &pdu->nrach_indication_rel13, ppWritePackedMsg, end, pack_nrach_indication_rel13_value)))
- return 0;
-
- // calculate the instance length subtracting the size of the instance
- // length feild
- //uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
- //push16(instance_length, &instance_length_p, end);
- }
-
- return 1;
-}
-
-static uint8_t pack_nrach_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_nrach_indication_t *pNfapiMsg = (nfapi_nrach_indication_t*)msg;
-
- return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
- pack_tlv(NFAPI_NRACH_INDICATION_BODY_TAG, &pNfapiMsg->nrach_indication_body, ppWritePackedMsg, end, &pack_nrach_indication_body_value) &&
- pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_nr_dl_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_nr_dl_node_sync_t *pNfapiMsg = (nfapi_nr_dl_node_sync_t*)msg;
-
- return ( push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
- pushs32(pNfapiMsg->delta_sfn_slot, ppWritePackedMsg, end) &&
- pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_dl_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_dl_node_sync_t *pNfapiMsg = (nfapi_dl_node_sync_t*)msg;
-
- return ( push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
- pushs32(pNfapiMsg->delta_sfn_sf, ppWritePackedMsg, end) &&
- pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_nr_ul_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_nr_ul_node_sync_t *pNfapiMsg = (nfapi_nr_ul_node_sync_t*)msg;
-
- return (push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
- push32(pNfapiMsg->t2, ppWritePackedMsg, end) &&
- push32(pNfapiMsg->t3, ppWritePackedMsg, end) &&
- pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_ul_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_ul_node_sync_t *pNfapiMsg = (nfapi_ul_node_sync_t*)msg;
-
- return (push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
- push32(pNfapiMsg->t2, ppWritePackedMsg, end) &&
- push32(pNfapiMsg->t3, ppWritePackedMsg, end) &&
- pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_timing_info(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_timing_info_t *pNfapiMsg = (nfapi_timing_info_t*)msg;
-
- return (push32(pNfapiMsg->last_sfn_sf, ppWritePackedMsg, end) &&
- push32(pNfapiMsg->time_since_last_timing_info, ppWritePackedMsg, end) &&
- push32(pNfapiMsg->dl_config_jitter, ppWritePackedMsg, end) &&
- push32(pNfapiMsg->tx_request_jitter, ppWritePackedMsg, end) &&
- push32(pNfapiMsg->ul_config_jitter, ppWritePackedMsg, end) &&
- push32(pNfapiMsg->hi_dci0_jitter, ppWritePackedMsg, end) &&
- pushs32(pNfapiMsg->dl_config_latest_delay, ppWritePackedMsg, end) &&
- pushs32(pNfapiMsg->tx_request_latest_delay, ppWritePackedMsg, end) &&
- pushs32(pNfapiMsg->ul_config_latest_delay, ppWritePackedMsg, end) &&
- pushs32(pNfapiMsg->hi_dci0_latest_delay, ppWritePackedMsg, end) &&
- pushs32(pNfapiMsg->dl_config_earliest_arrival, ppWritePackedMsg, end) &&
- pushs32(pNfapiMsg->tx_request_earliest_arrival, ppWritePackedMsg, end) &&
- pushs32(pNfapiMsg->ul_config_earliest_arrival, ppWritePackedMsg, end) &&
- pushs32(pNfapiMsg->hi_dci0_earliest_arrival, ppWritePackedMsg, end) &&
- pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_nr_timing_info(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_nr_timing_info_t *pNfapiMsg = (nfapi_nr_timing_info_t*)msg;
-
- return (push32(pNfapiMsg->last_sfn, ppWritePackedMsg, end) &&
- push32(pNfapiMsg->last_slot, ppWritePackedMsg, end) &&
- push32(pNfapiMsg->time_since_last_timing_info, ppWritePackedMsg, end) &&
- push32(pNfapiMsg->dl_tti_jitter, ppWritePackedMsg, end) &&
- push32(pNfapiMsg->tx_data_request_jitter, ppWritePackedMsg, end) &&
- push32(pNfapiMsg->ul_tti_jitter, ppWritePackedMsg, end) &&
- push32(pNfapiMsg->ul_dci_jitter, ppWritePackedMsg, end) &&
- pushs32(pNfapiMsg->dl_tti_latest_delay, ppWritePackedMsg, end) &&
- pushs32(pNfapiMsg->tx_data_request_latest_delay, ppWritePackedMsg, end) &&
- pushs32(pNfapiMsg->ul_tti_latest_delay, ppWritePackedMsg, end) &&
- pushs32(pNfapiMsg->ul_dci_latest_delay, ppWritePackedMsg, end) &&
- pushs32(pNfapiMsg->dl_tti_earliest_arrival, ppWritePackedMsg, end) &&
- pushs32(pNfapiMsg->tx_data_request_earliest_arrival, ppWritePackedMsg, end) &&
- pushs32(pNfapiMsg->ul_tti_earliest_arrival, ppWritePackedMsg, end) &&
- pushs32(pNfapiMsg->ul_dci_earliest_arrival, ppWritePackedMsg, end) &&
- pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-
-
-// Main pack function - public
-
-int nfapi_nr_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen, nfapi_p7_codec_config_t* config)
-{
- nfapi_p7_message_header_t *pMessageHeader = pMessageBuf;
- uint8_t *pWritePackedMessage = pPackedBuf;
- uint8_t *pPackedLengthField = &pWritePackedMessage[4];
- uint8_t *end = pPackedBuf + packedBufLen;
-
- if (pMessageBuf == NULL || pPackedBuf == NULL)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack supplied pointers are null\n");
- return -1;
- }
- /*
- printf("\n P7 MESSAGE SENT: \n");
- for(int i=0; i< packedBufLen; i++){
- printf("%d", *(uint8_t *)(pMessageBuf + i));
- }
- printf("\n");
- */
- // process the header
- if(!(push16(pMessageHeader->phy_id, &pWritePackedMessage, end) &&
- push16(pMessageHeader->message_id, &pWritePackedMessage, end) &&
- push16(0/*pMessageHeader->message_length*/, &pWritePackedMessage, end) &&
- push16(pMessageHeader->m_segment_sequence, &pWritePackedMessage, end) &&
- push32(0/*pMessageHeader->checksum*/, &pWritePackedMessage, end) &&
- push32(pMessageHeader->transmit_timestamp, &pWritePackedMessage, end)))
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack header failed\n");
- 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_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
- result = pack_dl_tti_request(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
- result = pack_ul_tti_request(pMessageHeader, &pWritePackedMessage, end, config);
- break;
- case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
- result = pack_tx_data_request(pMessageHeader, &pWritePackedMessage, end, config);
- break;
- case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
- result = pack_ul_dci_request(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_UE_RELEASE_REQUEST:
- result =pack_ue_release_request(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_UE_RELEASE_RESPONSE:
- result =pack_ue_release_response(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_HARQ_INDICATION:
- result = pack_harq_indication(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_CRC_INDICATION:
- result = pack_crc_indication(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_RX_ULSCH_INDICATION:
- //printf("RX ULSCH\n");
- result = pack_rx_ulsch_indication(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_RACH_INDICATION:
- result = pack_rach_indication(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_SRS_INDICATION:
- result = pack_srs_indication(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_RX_SR_INDICATION:
- result = pack_sr_indication(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_RX_CQI_INDICATION:
- result = pack_cqi_indication(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_LBT_DL_CONFIG_REQUEST:
- result = pack_lbt_dl_config_request(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_LBT_DL_INDICATION:
- result = pack_lbt_dl_indication(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_NB_HARQ_INDICATION:
- result = pack_nb_harq_indication(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_NRACH_INDICATION:
- result = pack_nrach_indication(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
- result = pack_nr_dl_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC:
- result = pack_nr_ul_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_TIMING_INFO:
- result = pack_nr_timing_info(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- default:
- {
- if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
- pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
- {
- if(config && config->pack_p7_vendor_extension)
- {
- result = (config->pack_p7_vendor_extension)(pMessageHeader, &pWritePackedMessage, end, config);
- }
- else
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, pMessageHeader->message_id);
- }
- }
- else
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
- }
- }
- break;
- }
-
- if(result == 0)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack failed to pack message\n");
- return -1;
- }
-
- // check for a valid message length
- uintptr_t msgHead = (uintptr_t)pPackedBuf;
- uintptr_t msgEnd = (uintptr_t)pWritePackedMessage;
- uint32_t packedMsgLen = msgEnd - msgHead;
- uint16_t packedMsgLen16;
- if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
- return -1;
- }
- else
- {
- packedMsgLen16 = (uint16_t)packedMsgLen;
- }
-
- // Update the message length in the header
- pMessageHeader->message_length = packedMsgLen16;
-
- if(!push16(packedMsgLen16, &pPackedLengthField, end))
- return -1;
-
- if(1)
- {
- //quick test
- if(pMessageHeader->message_length != packedMsgLen)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "nfapi packedMsgLen(%d) != message_length(%d) id %d\n", packedMsgLen, pMessageHeader->message_length, pMessageHeader->message_id);
- }
- }
-
- return (packedMsgLen);
-}
-
-int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen, nfapi_p7_codec_config_t* config)
-{
- nfapi_p7_message_header_t *pMessageHeader = pMessageBuf;
- uint8_t *pWritePackedMessage = pPackedBuf;
- uint8_t *pPackedLengthField = &pWritePackedMessage[4];
- uint8_t *end = pPackedBuf + packedBufLen;
-
- if (pMessageBuf == NULL || pPackedBuf == NULL)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack supplied pointers are null\n");
- return -1;
- }
- /*
- printf("\n P7 MESSAGE SENT: \n");
- for(int i=0; i< packedBufLen; i++){
- printf("%d", *(uint8_t *)(pMessageBuf + i));
- }
- printf("\n");
- */
- // process the header
- if(!(push16(pMessageHeader->phy_id, &pWritePackedMessage, end) &&
- push16(pMessageHeader->message_id, &pWritePackedMessage, end) &&
- push16(0/*pMessageHeader->message_length*/, &pWritePackedMessage, end) &&
- push16(pMessageHeader->m_segment_sequence, &pWritePackedMessage, end) &&
- push32(0/*pMessageHeader->checksum*/, &pWritePackedMessage, end) &&
- push32(pMessageHeader->transmit_timestamp, &pWritePackedMessage, end)))
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack header failed\n");
- 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;
-
- case NFAPI_UL_CONFIG_REQUEST:
- result = pack_ul_config_request(pMessageHeader, &pWritePackedMessage, end, config);
- 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;
- case NFAPI_HI_DCI0_REQUEST:
- result = pack_hi_dci0_request(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_UE_RELEASE_REQUEST:
- result =pack_ue_release_request(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_UE_RELEASE_RESPONSE:
- result =pack_ue_release_response(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_HARQ_INDICATION:
- result = pack_harq_indication(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_CRC_INDICATION:
- result = pack_crc_indication(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_RX_ULSCH_INDICATION:
- //printf("RX ULSCH\n");
- result = pack_rx_ulsch_indication(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_RACH_INDICATION:
- result = pack_rach_indication(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_SRS_INDICATION:
- result = pack_srs_indication(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_RX_SR_INDICATION:
- result = pack_sr_indication(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_RX_CQI_INDICATION:
- result = pack_cqi_indication(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_LBT_DL_CONFIG_REQUEST:
- result = pack_lbt_dl_config_request(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_LBT_DL_INDICATION:
- result = pack_lbt_dl_indication(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_NB_HARQ_INDICATION:
- result = pack_nb_harq_indication(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_NRACH_INDICATION:
- result = pack_nrach_indication(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_DL_NODE_SYNC:
- result = pack_dl_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_UL_NODE_SYNC:
- result = pack_ul_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- case NFAPI_TIMING_INFO:
- result = pack_timing_info(pMessageHeader, &pWritePackedMessage, end, config);
- break;
-
- default:
- {
- if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
- pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
- {
- if(config && config->pack_p7_vendor_extension)
- {
- result = (config->pack_p7_vendor_extension)(pMessageHeader, &pWritePackedMessage, end, config);
- }
- else
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, pMessageHeader->message_id);
- }
- }
- else
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
- }
- }
- break;
- }
-
- if(result == 0)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack failed to pack message\n");
- return -1;
- }
-
- // check for a valid message length
- uintptr_t msgHead = (uintptr_t)pPackedBuf;
- uintptr_t msgEnd = (uintptr_t)pWritePackedMessage;
- uint32_t packedMsgLen = msgEnd - msgHead;
- uint16_t packedMsgLen16;
- if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
- return -1;
- }
- else
- {
- packedMsgLen16 = (uint16_t)packedMsgLen;
- }
-
- // Update the message length in the header
- pMessageHeader->message_length = packedMsgLen16;
-
- if(!push16(packedMsgLen16, &pPackedLengthField, end))
- return -1;
-
- if(1)
- {
- //quick test
- if(pMessageHeader->message_length != packedMsgLen)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "nfapi packedMsgLen(%d) != message_length(%d) id %d\n", packedMsgLen, pMessageHeader->message_length, pMessageHeader->message_id);
- }
- }
-
- return (packedMsgLen);
-}
-
-// Unpack routines
-// NR:
-static uint8_t unpack_dl_tti_csi_rs_pdu_rel15_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_nr_dl_tti_csi_rs_pdu_rel15_t* value = (nfapi_nr_dl_tti_csi_rs_pdu_rel15_t*)tlv;
-
- return(
- pull16(ppReadPackedMsg, &value->bwp_size, end) &&
- pull16(ppReadPackedMsg, &value->bwp_start, end) &&
-
- pull8(ppReadPackedMsg, &value->subcarrier_spacing, end) &&
- pull8(ppReadPackedMsg, &value->cyclic_prefix, end) &&
-
- pull16(ppReadPackedMsg, &value->start_rb, end) &&
- pull16(ppReadPackedMsg, &value->nr_of_rbs, end) &&
-
- pull8(ppReadPackedMsg, &value->csi_type, end) &&
- pull8(ppReadPackedMsg, &value->row, end) &&
-
- pull16(ppReadPackedMsg, &value->freq_domain, end) &&
- pull8(ppReadPackedMsg, &value->symb_l0, end) &&
-
- pull8(ppReadPackedMsg, &value->symb_l1, end) &&
- pull8(ppReadPackedMsg, &value->cdm_type, end) &&
-
- pull8(ppReadPackedMsg, &value->freq_density, end) &&
- pull16(ppReadPackedMsg, &value->scramb_id, end) &&
-
- pull8(ppReadPackedMsg, &value->power_control_offset, end) &&
- pull8(ppReadPackedMsg, &value->power_control_offset_ss, end)
- );
-
-}
-
-
-static uint8_t unpack_dl_tti_pdcch_pdu_rel15_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_nr_dl_tti_pdcch_pdu_rel15_t* value = (nfapi_nr_dl_tti_pdcch_pdu_rel15_t*)tlv;
-
- for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i)
- {
- if(!pull16(ppReadPackedMsg, &value->dci_pdu[i].RNTI, end) &&
- pull16(ppReadPackedMsg, &value->dci_pdu[i].ScramblingId, end) &&
-
- pull16(ppReadPackedMsg, &value->dci_pdu[i].ScramblingRNTI, end) &&
- pull8(ppReadPackedMsg, &value->dci_pdu[i].CceIndex, end) &&
- pull8(ppReadPackedMsg, &value->dci_pdu[i].AggregationLevel, end) &&
- pull8(ppReadPackedMsg, &value->dci_pdu[i].beta_PDCCH_1_0, end) &&
-
- pull8(ppReadPackedMsg, &value->dci_pdu[i].powerControlOffsetSS, end) &&
- pull16(ppReadPackedMsg, &value->dci_pdu[i].PayloadSizeBits, end) &&
-
- pullarray8(ppReadPackedMsg, value->dci_pdu[i].Payload, DCI_PAYLOAD_BYTE_LEN, value->dci_pdu[i].PayloadSizeBits, end));
-
- return 0;
- }
-
- // TODO: resolve the packaging of array (currently sending a single element)
- return(
- pull16(ppReadPackedMsg, &value->BWPSize, end) &&
- pull16(ppReadPackedMsg, &value->BWPStart, end) &&
- pull8(ppReadPackedMsg, &value->SubcarrierSpacing, end) &&
- pull8(ppReadPackedMsg, &value->CyclicPrefix, end) &&
-
- pull8(ppReadPackedMsg, &value->StartSymbolIndex, end) &&
- pull8(ppReadPackedMsg, &value->DurationSymbols, end) &&
- pullarray8(ppReadPackedMsg, value->FreqDomainResource, 6, 6, end) &&
- pull8(ppReadPackedMsg, &value->CceRegMappingType, end) &&
-
- pull8(ppReadPackedMsg, &value->RegBundleSize, end) &&
- pull8(ppReadPackedMsg, &value->InterleaverSize, end) &&
- pull8(ppReadPackedMsg, &value->CoreSetType, end) &&
- pull16(ppReadPackedMsg, &value->ShiftIndex, end) &&
-
- pull8(ppReadPackedMsg, &value->precoderGranularity, end) &&
- pull16(ppReadPackedMsg, &value->numDlDci, end));
-
-}
-
-
-static uint8_t unpack_dl_tti_pdsch_pdu_rel15_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_nr_dl_tti_pdsch_pdu_rel15_t* value = (nfapi_nr_dl_tti_pdsch_pdu_rel15_t*)tlv;
-
- // TODO: resolve the packaging of array (currently sending a single element)
- return(
- pull16(ppReadPackedMsg, &value->pduBitmap, end) &&
- pull16(ppReadPackedMsg, &value->rnti, end) &&
- pull16(ppReadPackedMsg, &value->pduIndex, end) &&
- pull16(ppReadPackedMsg, &value->BWPSize, end) &&
-
- pull16(ppReadPackedMsg, &value->BWPStart, end) &&
- pull8(ppReadPackedMsg, &value->SubcarrierSpacing, end) &&
- pull8(ppReadPackedMsg, &value->CyclicPrefix, end) &&
- pull8(ppReadPackedMsg, &value->NrOfCodewords, end) &&
-
- pullarray16(ppReadPackedMsg, value->targetCodeRate, 2, 1, end) &&
- pullarray8(ppReadPackedMsg, value->qamModOrder, 2, 1, end) &&
- pullarray8(ppReadPackedMsg, value->mcsIndex, 2, 1, end) &&
- pullarray8(ppReadPackedMsg, value->mcsTable, 2, 1, end) &&
-
- pullarray8(ppReadPackedMsg, value->rvIndex, 2, 1, end) &&
- pullarray32(ppReadPackedMsg, value->TBSize, 2, 1, end) &&
- pull16(ppReadPackedMsg, &value->dataScramblingId, end) &&
- pull8(ppReadPackedMsg, &value->nrOfLayers, end) &&
-
- pull8(ppReadPackedMsg, &value->transmissionScheme, end) &&
- pull8(ppReadPackedMsg, &value->refPoint, end) &&
- pull16(ppReadPackedMsg, &value->dlDmrsSymbPos, end) &&
- pull8(ppReadPackedMsg, &value->dmrsConfigType, end) &&
-
- pull16(ppReadPackedMsg, &value->dlDmrsScramblingId, end) &&
- pull8(ppReadPackedMsg, &value->SCID, end) &&
- pull8(ppReadPackedMsg, &value->numDmrsCdmGrpsNoData, end) &&
- pull16(ppReadPackedMsg, &value->dmrsPorts, end) &&
-
- pull8(ppReadPackedMsg, &value->resourceAlloc, end) &&
- pull16(ppReadPackedMsg, &value->rbStart, end) &&
- pull16(ppReadPackedMsg, &value->rbSize, end) &&
-
- pull8(ppReadPackedMsg, &value->VRBtoPRBMapping, end) &&
- pull8(ppReadPackedMsg, &value->StartSymbolIndex, end) &&
- pull8(ppReadPackedMsg, &value->NrOfSymbols, end) &&
- pull8(ppReadPackedMsg, &value->PTRSPortIndex, end) &&
-
- pull8(ppReadPackedMsg, &value->PTRSTimeDensity, end) &&
- pull8(ppReadPackedMsg, &value->PTRSFreqDensity, end) &&
- pull8(ppReadPackedMsg, &value->PTRSReOffset, end)
- );
-
-}
-
-
-static uint8_t unpack_dl_tti_ssb_pdu_rel15_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_nr_dl_tti_ssb_pdu_rel15_t* value = (nfapi_nr_dl_tti_ssb_pdu_rel15_t*)tlv;
-
- return(
- pull16(ppReadPackedMsg, &value->PhysCellId, end) &&
- pull8(ppReadPackedMsg, &value->BetaPss, end) &&
- pull8(ppReadPackedMsg, &value->SsbBlockIndex, end) &&
- pull8(ppReadPackedMsg, &value->SsbSubcarrierOffset, end) &&
- pull16(ppReadPackedMsg, &value->ssbOffsetPointA, end) &&
- pull8(ppReadPackedMsg, &value->bchPayloadFlag, end) &&
- pull32(ppReadPackedMsg, &value->bchPayload, end)
- // TODO: pack precoding_and_beamforming too
- );
-
-}
-
-
-// LTE:
-static uint8_t unpack_dl_config_dci_dl_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_dl_config_dci_dl_pdu_rel8_t* dci_dl_pdu_rel8 = (nfapi_dl_config_dci_dl_pdu_rel8_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->dci_format, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->cce_idx, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->aggregation_level, end) &&
- pull16(ppReadPackedMsg, &dci_dl_pdu_rel8->rnti, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->resource_allocation_type, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->virtual_resource_block_assignment_flag, end) &&
- pull32(ppReadPackedMsg, &dci_dl_pdu_rel8->resource_block_coding, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->mcs_1, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->redundancy_version_1, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->new_data_indicator_1, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->transport_block_to_codeword_swap_flag, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->mcs_2, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->redundancy_version_2, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->new_data_indicator_2, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->harq_process, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->tpmi, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->pmi, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->precoding_information, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->tpc, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->downlink_assignment_index, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->ngap, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->transport_block_size_index, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->downlink_power_offset, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->allocate_prach_flag, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->preamble_index, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->prach_mask_index, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->rnti_type, end) &&
- pull16(ppReadPackedMsg, &dci_dl_pdu_rel8->transmission_power, end));
-
-}
-
-static uint8_t unpack_dl_config_dci_dl_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_dl_config_dci_dl_pdu_rel9_t* dci_dl_pdu_rel9 = (nfapi_dl_config_dci_dl_pdu_rel9_t*)tlv;
-
- return ( pull8(ppReadPackedMsg, &dci_dl_pdu_rel9->mcch_flag, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel9->mcch_change_notification, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel9->scrambling_identity, end));
-}
-
-static uint8_t unpack_dl_config_dci_dl_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_dl_config_dci_dl_pdu_rel10_t* dci_dl_pdu_rel10 = (nfapi_dl_config_dci_dl_pdu_rel10_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->cross_carrier_scheduling_flag, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->carrier_indicator, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->srs_flag, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->srs_request, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->antenna_ports_scrambling_and_layers, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->total_dci_length_including_padding, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->n_dl_rb, end));
-}
-
-static uint8_t unpack_dl_config_dci_dl_pdu_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_dl_config_dci_dl_pdu_rel11_t* dci_dl_pdu_rel11 = (nfapi_dl_config_dci_dl_pdu_rel11_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel11->harq_ack_resource_offset, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel11->pdsch_re_mapping_quasi_co_location_indicator, end));
-}
-
-static uint8_t unpack_dl_config_dci_dl_pdu_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_dl_config_dci_dl_pdu_rel12_t* dci_dl_pdu_rel12 = (nfapi_dl_config_dci_dl_pdu_rel12_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel12->primary_cell_type, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel12->ul_dl_configuration_flag, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel12->number_ul_dl_configurations, end) &&
- pullarray8(ppReadPackedMsg, dci_dl_pdu_rel12->ul_dl_configuration_indication, NFAPI_MAX_UL_DL_CONFIGURATIONS, dci_dl_pdu_rel12->number_ul_dl_configurations, end));
-}
-
-static uint8_t unpack_tpm_value(uint8_t **ppReadPackedMsg, nfapi_dl_config_dci_dl_tpm_t *value, uint8_t *end)
-{
- if(!(pull8(ppReadPackedMsg, &value->num_prb_per_subband, end) &&
- pull8(ppReadPackedMsg, &value->number_of_subbands, end) &&
- pull8(ppReadPackedMsg, &value->num_antennas, end)))
- return 0;
-
-
- uint8_t idx = 0;
- for(idx = 0; idx < value->number_of_subbands; ++idx)
- {
- nfapi_dl_config_dci_dl_tpm_subband_info_t* subband_info = &(value->subband_info[idx]);
-
- if(!(pull8(ppReadPackedMsg, &subband_info->subband_index, end) &&
- pull8(ppReadPackedMsg, &subband_info->scheduled_ues, end)))
- return 0;
-
- uint8_t antenna_idx = 0;
- uint8_t scheduled_ue_idx = 0;
-
- for(antenna_idx = 0; antenna_idx < value->num_antennas; ++antenna_idx)
- {
- for(scheduled_ue_idx = 0; scheduled_ue_idx < subband_info->scheduled_ues; ++scheduled_ue_idx)
- {
- if(!pull16(ppReadPackedMsg, &(subband_info->precoding_value[antenna_idx][scheduled_ue_idx]), end))
- return 0;
- }
- }
-
- }
-
-
- return 1;
-
-}
-
-
-static uint8_t unpack_dl_config_dci_dl_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_dl_config_dci_dl_pdu_rel13_t* dci_dl_pdu_rel13 = (nfapi_dl_config_dci_dl_pdu_rel13_t*)tlv;
-
- // If the length is greater than 5 then the TPM struct flag and possiably the TPM structure have been
- // added
- uint8_t tpm_struct_flag_present = dci_dl_pdu_rel13->tl.length > 5;
- dci_dl_pdu_rel13->tpm_struct_flag = 0;
-
- return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->laa_end_partial_sf_flag, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->laa_end_partial_sf_configuration, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->initial_lbt_sf, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->codebook_size_determination, end) &&
- pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->drms_table_flag, end) &&
- ( (tpm_struct_flag_present == 1) ? pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->tpm_struct_flag, end) : 1) &&
- ( (tpm_struct_flag_present == 1 && dci_dl_pdu_rel13->tpm_struct_flag == 1) ? unpack_tpm_value(ppReadPackedMsg, &dci_dl_pdu_rel13->tpm, end) : 1));
-
-}
-
-static uint8_t unpack_dl_config_bch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_dl_config_bch_pdu_rel8_t* bch_pdu_rel8 = (nfapi_dl_config_bch_pdu_rel8_t*)tlv;
-
- return ( pull16(ppReadPackedMsg, &bch_pdu_rel8->length, end) &&
- pull16(ppReadPackedMsg, (uint16_t *)&bch_pdu_rel8->pdu_index, end) &&
- pull16(ppReadPackedMsg, &bch_pdu_rel8->transmission_power, end));
-}
-
-static uint8_t unpack_dl_config_mch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_dl_config_mch_pdu_rel8_t* mch_pdu_rel8 = (nfapi_dl_config_mch_pdu_rel8_t*)tlv;
-
- return (pull16(ppReadPackedMsg, &mch_pdu_rel8->length, end) &&
- pull16(ppReadPackedMsg, (uint16_t *)&mch_pdu_rel8->pdu_index, end) &&
- pull16(ppReadPackedMsg, &mch_pdu_rel8->rnti, end) &&
- pull8(ppReadPackedMsg, &mch_pdu_rel8->resource_allocation_type, end) &&
- pull32(ppReadPackedMsg, &mch_pdu_rel8->resource_block_coding, end) &&
- pull8(ppReadPackedMsg, &mch_pdu_rel8->modulation, end) &&
- pull16(ppReadPackedMsg, &mch_pdu_rel8->transmission_power, end) &&
- pull16(ppReadPackedMsg, &mch_pdu_rel8->mbsfn_area_id, end));
-}
-
-static uint8_t unpack_dl_config_dlsch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_dl_config_dlsch_pdu_rel8_t* dlsch_pdu_rel8 = (nfapi_dl_config_dlsch_pdu_rel8_t*)tlv;
-
- if (!(pull16(ppReadPackedMsg, &dlsch_pdu_rel8->length, end) &&
- pull16(ppReadPackedMsg, (uint16_t *)&dlsch_pdu_rel8->pdu_index, end) &&
- pull16(ppReadPackedMsg, &dlsch_pdu_rel8->rnti, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel8->resource_allocation_type, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel8->virtual_resource_block_assignment_flag, end) &&
- pull32(ppReadPackedMsg, &dlsch_pdu_rel8->resource_block_coding, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel8->modulation, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel8->redundancy_version, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transport_blocks, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transport_block_to_codeword_swap_flag, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transmission_scheme, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel8->number_of_layers, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel8->number_of_subbands, end) &&
- pullarray8(ppReadPackedMsg, dlsch_pdu_rel8->codebook_index, NFAPI_MAX_NUM_SUBBANDS, dlsch_pdu_rel8->number_of_subbands, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel8->ue_category_capacity, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel8->pa, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel8->delta_power_offset_index, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel8->ngap, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel8->nprb, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transmission_mode, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel8->num_bf_prb_per_subband, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel8->num_bf_vector, end)))
- return 0;
-
- uint16_t j = 0;
- for(j = 0; j < dlsch_pdu_rel8->num_bf_vector; ++j)
- {
- if(!(pull8(ppReadPackedMsg, &dlsch_pdu_rel8->bf_vector[j].subband_index, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel8->bf_vector[j].num_antennas, end) &&
- pullarray16(ppReadPackedMsg, dlsch_pdu_rel8->bf_vector[j].bf_value, NFAPI_MAX_NUM_ANTENNAS, dlsch_pdu_rel8->bf_vector[j].num_antennas, end)))
- return 0;
- }
- return 1;
-}
-static uint8_t unpack_dl_config_dlsch_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_dl_config_dlsch_pdu_rel9_t* dlsch_pdu_rel9 = (nfapi_dl_config_dlsch_pdu_rel9_t*)tlv;
- return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel9->nscid, end) );
-}
-static uint8_t unpack_dl_config_dlsch_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_dl_config_dlsch_pdu_rel10_t* dlsch_pdu_rel10 = (nfapi_dl_config_dlsch_pdu_rel10_t*)tlv;
-
- return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_flag, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_resource_config_r10, end) &&
- pull16(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_zero_tx_power_resource_config_bitmap_r10, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_number_nzp_configuration, end) &&
- pullarray8(ppReadPackedMsg, dlsch_pdu_rel10->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, dlsch_pdu_rel10->csi_rs_number_nzp_configuration, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel10->pdsch_start, end)) ;
-}
-static uint8_t unpack_dl_config_dlsch_pdu_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_dl_config_dlsch_pdu_rel11_t* dlsch_pdu_rel11 = (nfapi_dl_config_dlsch_pdu_rel11_t*)tlv;
-
- return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel11->drms_config_flag, end) &&
- pull16(ppReadPackedMsg, &dlsch_pdu_rel11->drms_scrambling, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel11->csi_config_flag, end) &&
- pull16(ppReadPackedMsg, &dlsch_pdu_rel11->csi_scrambling, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel11->pdsch_re_mapping_flag, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel11->pdsch_re_mapping_atenna_ports, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel11->pdsch_re_mapping_freq_shift, end));
-}
-static uint8_t unpack_dl_config_dlsch_pdu_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_dl_config_dlsch_pdu_rel12_t* dlsch_pdu_rel12 = (nfapi_dl_config_dlsch_pdu_rel12_t*)tlv;
-
- return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel12->altcqi_table_r12, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel12->maxlayers, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel12->n_dl_harq, end));
-}
-static uint8_t unpack_dl_config_dlsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_dl_config_dlsch_pdu_rel13_t* dlsch_pdu_rel13 = (nfapi_dl_config_dlsch_pdu_rel13_t*)tlv;
-
- return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel13->dwpts_symbols, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel13->initial_lbt_sf, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel13->ue_type, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel13->pdsch_payload_type, end) &&
- pull16(ppReadPackedMsg, &dlsch_pdu_rel13->initial_transmission_sf_io, end) &&
- pull8(ppReadPackedMsg, &dlsch_pdu_rel13->drms_table_flag, end));
-}
-
-static uint8_t unpack_dl_config_pch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_dl_config_pch_pdu_rel8_t* pch_pdu_rel8 = (nfapi_dl_config_pch_pdu_rel8_t*)tlv;
-
- return ( pull16(ppReadPackedMsg, &pch_pdu_rel8->length, end) &&
- pull16(ppReadPackedMsg, (uint16_t *)&pch_pdu_rel8->pdu_index, end) &&
- pull16(ppReadPackedMsg, &pch_pdu_rel8->p_rnti, end) &&
- pull8(ppReadPackedMsg, &pch_pdu_rel8->resource_allocation_type, end) &&
- pull8(ppReadPackedMsg, &pch_pdu_rel8->virtual_resource_block_assignment_flag, end) &&
- pull32(ppReadPackedMsg, &pch_pdu_rel8->resource_block_coding, end) &&
- pull8(ppReadPackedMsg, &pch_pdu_rel8->mcs, end) &&
- pull8(ppReadPackedMsg, &pch_pdu_rel8->redundancy_version, end) &&
- pull8(ppReadPackedMsg, &pch_pdu_rel8->number_of_transport_blocks, end) &&
- pull8(ppReadPackedMsg, &pch_pdu_rel8->transport_block_to_codeword_swap_flag, end) &&
- pull8(ppReadPackedMsg, &pch_pdu_rel8->transmission_scheme, end) &&
- pull8(ppReadPackedMsg, &pch_pdu_rel8->number_of_layers, end) &&
- pull8(ppReadPackedMsg, &pch_pdu_rel8->codebook_index, end) &&
- pull8(ppReadPackedMsg, &pch_pdu_rel8->ue_category_capacity, end) &&
- pull8(ppReadPackedMsg, &pch_pdu_rel8->pa, end) &&
- pull16(ppReadPackedMsg, &pch_pdu_rel8->transmission_power, end) &&
- pull8(ppReadPackedMsg, &pch_pdu_rel8->nprb, end) &&
- pull8(ppReadPackedMsg, &pch_pdu_rel8->ngap, end));
-}
-static uint8_t unpack_dl_config_pch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_dl_config_pch_pdu_rel13_t* pch_pdu_rel13 = (nfapi_dl_config_pch_pdu_rel13_t*)tlv;
-
- return ( pull8(ppReadPackedMsg, &pch_pdu_rel13->ue_mode, end) &&
- pull16(ppReadPackedMsg, &pch_pdu_rel13->initial_transmission_sf_io, end));
-}
-
-static uint8_t unpack_dl_config_prs_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_dl_config_prs_pdu_rel9_t* prs_pdu_rel9 = (nfapi_dl_config_prs_pdu_rel9_t*)tlv;
-
- return ( pull16(ppReadPackedMsg, &prs_pdu_rel9->transmission_power, end) &&
- pull8(ppReadPackedMsg, &prs_pdu_rel9->prs_bandwidth, end) &&
- pull8(ppReadPackedMsg, &prs_pdu_rel9->prs_cyclic_prefix_type, end) &&
- pull8(ppReadPackedMsg, &prs_pdu_rel9->prs_muting, end));
-}
-
-static uint8_t unpack_dl_config_csi_rs_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_dl_config_csi_rs_pdu_rel10_t* csi_rs_pdu_rel10 = (nfapi_dl_config_csi_rs_pdu_rel10_t*)tlv;
-
- return ( pull8(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_antenna_port_count_r10, end) &&
- pull8(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_resource_config_r10, end) &&
- pull16(ppReadPackedMsg, &csi_rs_pdu_rel10->transmission_power, end) &&
- pull16(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_zero_tx_power_resource_config_bitmap_r10, end) &&
- pull8(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_number_of_nzp_configuration, end) &&
- pullarray8(ppReadPackedMsg, csi_rs_pdu_rel10->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, csi_rs_pdu_rel10->csi_rs_number_of_nzp_configuration, end));
-}
-
-static uint8_t unpack_dl_config_csi_rs_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_dl_config_csi_rs_pdu_rel13_t* csi_rs_pdu_rel13 = (nfapi_dl_config_csi_rs_pdu_rel13_t*)tlv;
-
- if (!(pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->csi_rs_class, end) &&
- pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->cdm_type, end) &&
- pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->num_bf_vector, end)))
- return 0;
-
-
- uint16_t idx =0;
- for(idx = 0; idx < csi_rs_pdu_rel13->num_bf_vector; ++idx)
- {
- if(!(pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->bf_vector[idx].csi_rs_resource_index, end)))
- return 0;
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : HOW TO DECODE BF VALUE \n");
- //pullarray16(ppReadPackedMsg, &csi_rs_pdu_rel13->bf_vector[idx].bf_vector, ??);
- }
- return 1;
-}
-
-static uint8_t unpack_dl_config_epdcch_params_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_dl_config_epdcch_parameters_rel11_t* epdcch_params_rel11 = (nfapi_dl_config_epdcch_parameters_rel11_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &epdcch_params_rel11->epdcch_resource_assignment_flag, end) &&
- pull16(ppReadPackedMsg, &epdcch_params_rel11->epdcch_id, end) &&
- pull8(ppReadPackedMsg, &epdcch_params_rel11->epdcch_start_symbol, end) &&
- pull8(ppReadPackedMsg, &epdcch_params_rel11->epdcch_num_prb, end) &&
- pullarray8(ppReadPackedMsg, epdcch_params_rel11->epdcch_prb_index, NFAPI_MAX_EPDCCH_PRB, epdcch_params_rel11->epdcch_num_prb, end) &&
- pull8(ppReadPackedMsg, &epdcch_params_rel11->bf_vector.subband_index, end) &&
- pull8(ppReadPackedMsg, &epdcch_params_rel11->bf_vector.num_antennas, end) &&
- pullarray16(ppReadPackedMsg, epdcch_params_rel11->bf_vector.bf_value, NFAPI_MAX_NUM_ANTENNAS, epdcch_params_rel11->bf_vector.num_antennas, end));
-}
-
-static uint8_t unpack_dl_config_epdcch_params_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_dl_config_epdcch_parameters_rel13_t* epdcch_params_rel13 = (nfapi_dl_config_epdcch_parameters_rel13_t*)tlv;
-
- return ( pull8(ppReadPackedMsg, &epdcch_params_rel13->dwpts_symbols, end) &&
- pull8(ppReadPackedMsg, &epdcch_params_rel13->initial_lbt_sf, end));
-}
-
-static uint8_t unpack_dl_config_mpdcch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_dl_config_mpdcch_pdu_rel13_t* mpdcch_params_rel13 = (nfapi_dl_config_mpdcch_pdu_rel13_t*)tlv;
-
-
- return ( pull8(ppReadPackedMsg, &mpdcch_params_rel13->mpdcch_narrow_band, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->number_of_prb_pairs, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->resource_block_assignment, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->mpdcch_tansmission_type, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->start_symbol, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->ecce_index, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->aggregation_level, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->rnti_type, end) &&
- pull16(ppReadPackedMsg, &mpdcch_params_rel13->rnti, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->ce_mode, end) &&
- pull16(ppReadPackedMsg, &mpdcch_params_rel13->drms_scrambling_init, end) &&
- pull16(ppReadPackedMsg, &mpdcch_params_rel13->initial_transmission_sf_io, end) &&
- pull16(ppReadPackedMsg, &mpdcch_params_rel13->transmission_power, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->dci_format, end) &&
- pull16(ppReadPackedMsg, &mpdcch_params_rel13->resource_block_coding, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->mcs, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->pdsch_reptition_levels, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->redundancy_version, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->new_data_indicator, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->harq_process, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->tpmi_length, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->tpmi, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->pmi_flag, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->pmi, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->harq_resource_offset, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->dci_subframe_repetition_number, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->tpc, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->downlink_assignment_index_length, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->downlink_assignment_index, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->allocate_prach_flag, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->preamble_index, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->prach_mask_index, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->starting_ce_level, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->srs_request, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->antenna_ports_and_scrambling_identity_flag, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->antenna_ports_and_scrambling_identity, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->frequency_hopping_enabled_flag, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->paging_direct_indication_differentiation_flag, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->direct_indication, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->total_dci_length_including_padding, end) &&
- pull8(ppReadPackedMsg, &mpdcch_params_rel13->number_of_tx_antenna_ports, end) &&
- pullarray16(ppReadPackedMsg, mpdcch_params_rel13->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, mpdcch_params_rel13->number_of_tx_antenna_ports, end));
-}
-
-
-static uint8_t unpack_dl_config_nbch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_dl_config_nbch_pdu_rel13_t* nbch_params_rel13 = (nfapi_dl_config_nbch_pdu_rel13_t*)tlv;
-
- return ( pull16(ppReadPackedMsg, &nbch_params_rel13->length, end) &&
- pull16(ppReadPackedMsg, (uint16_t *)&nbch_params_rel13->pdu_index, end) &&
- pull16(ppReadPackedMsg, &nbch_params_rel13->transmission_power, end) &&
- pull16(ppReadPackedMsg, &nbch_params_rel13->hyper_sfn_2_lsbs, end));
-}
-
-static uint8_t unpack_dl_config_npdcch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_dl_config_npdcch_pdu_rel13_t* npdcch_params_rel13 = (nfapi_dl_config_npdcch_pdu_rel13_t*)tlv;
-
- return ( pull16(ppReadPackedMsg, &npdcch_params_rel13->length, end) &&
- pull16(ppReadPackedMsg, (uint16_t *)&npdcch_params_rel13->pdu_index, end) &&
- pull8(ppReadPackedMsg, &npdcch_params_rel13->ncce_index, end) &&
- pull8(ppReadPackedMsg, &npdcch_params_rel13->aggregation_level, end) &&
- pull8(ppReadPackedMsg, &npdcch_params_rel13->start_symbol, end) &&
- pull8(ppReadPackedMsg, &npdcch_params_rel13->rnti_type, end) &&
- pull16(ppReadPackedMsg, &npdcch_params_rel13->rnti, end) &&
- pull8(ppReadPackedMsg, &npdcch_params_rel13->scrambling_reinitialization_batch_index, end) &&
- pull8(ppReadPackedMsg, &npdcch_params_rel13->nrs_antenna_ports_assumed_by_the_ue, end) &&
- pull8(ppReadPackedMsg, &npdcch_params_rel13->dci_format, end) &&
- pull8(ppReadPackedMsg, &npdcch_params_rel13->scheduling_delay, end) &&
- pull8(ppReadPackedMsg, &npdcch_params_rel13->resource_assignment, end) &&
- pull8(ppReadPackedMsg, &npdcch_params_rel13->repetition_number, end) &&
- pull8(ppReadPackedMsg, &npdcch_params_rel13->mcs, end) &&
- pull8(ppReadPackedMsg, &npdcch_params_rel13->new_data_indicator, end) &&
- pull8(ppReadPackedMsg, &npdcch_params_rel13->harq_ack_resource, end) &&
- pull8(ppReadPackedMsg, &npdcch_params_rel13->npdcch_order_indication, end) &&
- pull8(ppReadPackedMsg, &npdcch_params_rel13->starting_number_of_nprach_repetitions, end) &&
- pull8(ppReadPackedMsg, &npdcch_params_rel13->subcarrier_indication_of_nprach, end) &&
- pull8(ppReadPackedMsg, &npdcch_params_rel13->paging_direct_indication_differentation_flag, end) &&
- pull8(ppReadPackedMsg, &npdcch_params_rel13->direct_indication, end) &&
- pull8(ppReadPackedMsg, &npdcch_params_rel13->dci_subframe_repetition_number, end) &&
- pull8(ppReadPackedMsg, &npdcch_params_rel13->total_dci_length_including_padding, end));
-}
-
-static uint8_t unpack_dl_config_ndlsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_dl_config_ndlsch_pdu_rel13_t* ndlsch_params_rel13 = (nfapi_dl_config_ndlsch_pdu_rel13_t*)tlv;
-
- return ( pull16(ppReadPackedMsg, &ndlsch_params_rel13->length, end) &&
- pull16(ppReadPackedMsg, (uint16_t *)&ndlsch_params_rel13->pdu_index, end) &&
- pull8(ppReadPackedMsg, &ndlsch_params_rel13->start_symbol, end) &&
- pull8(ppReadPackedMsg, &ndlsch_params_rel13->rnti_type, end) &&
- pull16(ppReadPackedMsg, &ndlsch_params_rel13->rnti, end) &&
- pull16(ppReadPackedMsg, &ndlsch_params_rel13->resource_assignment, end) &&
- pull16(ppReadPackedMsg, &ndlsch_params_rel13->repetition_number, end) &&
- pull8(ppReadPackedMsg, &ndlsch_params_rel13->modulation, end) &&
- pull8(ppReadPackedMsg, &ndlsch_params_rel13->number_of_subframes_for_resource_assignment, end) &&
- pull8(ppReadPackedMsg, &ndlsch_params_rel13->scrambling_sequence_initialization_cinit, end) &&
- pull16(ppReadPackedMsg, &ndlsch_params_rel13->sf_idx, end) &&
- pull8(ppReadPackedMsg, &ndlsch_params_rel13->nrs_antenna_ports_assumed_by_the_ue, end));
-}
-
-
-static uint8_t unpack_dl_tti_request_body_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg)
-{
- nfapi_nr_dl_tti_request_pdu_t* value = (nfapi_nr_dl_tti_request_pdu_t*)msg;
-
- if(!(pull16(ppReadPackedMsg, &value->PDUSize, end) &&
- pull16(ppReadPackedMsg, &value->PDUType, end) ))
- return 0;
-
-
- // first match the pdu type, then call the respective function
- switch(value->PDUType)
- {
- case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE:
- {
- if(!(unpack_dl_tti_csi_rs_pdu_rel15_value(&value->csi_rs_pdu.csi_rs_pdu_rel15,ppReadPackedMsg,end)))
- return 0;
- }
- break;
-
- case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE:
- {
- if(!(unpack_dl_tti_pdcch_pdu_rel15_value(&value->pdcch_pdu.pdcch_pdu_rel15,ppReadPackedMsg,end)))
- return 0;
- }
- break;
- case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE:
- {
- if(!(unpack_dl_tti_pdsch_pdu_rel15_value(&value->pdsch_pdu.pdsch_pdu_rel15,ppReadPackedMsg,end)))
- return 0;
- }
- break;
- case NFAPI_NR_DL_TTI_SSB_PDU_TYPE:
- {
- if(!(unpack_dl_tti_ssb_pdu_rel15_value(&value->ssb_pdu.ssb_pdu_rel15,ppReadPackedMsg,end)))
- return 0;
- }
- break;
-
- default:
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid DL_TTI pdu type %d \n", value->PDUType );
- }
- break;
- }
-
- return 1;
-}
-
-
-
-
-static uint8_t unpack_dl_config_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_dl_config_request_body_t* value = (nfapi_dl_config_request_body_t*)tlv;
-
- if(!(pull8(ppReadPackedMsg, &value->number_pdcch_ofdm_symbols, end) &&
- pull8(ppReadPackedMsg, &value->number_dci, end) &&
- pull16(ppReadPackedMsg, &value->number_pdu, end) &&
- pull8(ppReadPackedMsg, &value->number_pdsch_rnti, end) &&
- pull16(ppReadPackedMsg, &value->transmission_power_pcfich, end)))
- return 0;
-
- if(value->number_pdu > NFAPI_DL_CONFIG_MAX_PDU)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of dl config pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_pdu, NFAPI_DL_CONFIG_MAX_PDU);
- return 0;
- }
-
- if(value->number_pdu)
- {
- value->dl_config_pdu_list = (nfapi_dl_config_request_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_dl_config_request_pdu_t) * value->number_pdu, config);
- if(value->dl_config_pdu_list == NULL)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate dl config pdu list (count:%d)\n", __FUNCTION__, value->number_pdu);
- return 0;
- }
- }
- else
- {
- value->dl_config_pdu_list = 0;
- }
-
- uint16_t i;
- uint16_t total_number_of_pdus = value->number_pdu;
- for(i = 0; i < total_number_of_pdus; ++i)
- {
- nfapi_dl_config_request_pdu_t* pdu = &(value->dl_config_pdu_list[i]);
-
- if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
- pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
- return 0;
-
- uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
-
- if(packedPduEnd > end)
- {
- // pdu end of beyond buffer end
- return 0;
- }
-
- switch(pdu->pdu_type)
- {
- case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel8, &unpack_dl_config_dci_dl_pdu_rel8_value},
- { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL9_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel9, &unpack_dl_config_dci_dl_pdu_rel9_value},
- { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL10_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel10, &unpack_dl_config_dci_dl_pdu_rel10_value},
- { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL11_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel11, &unpack_dl_config_dci_dl_pdu_rel11_value},
- { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL12_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel12, &unpack_dl_config_dci_dl_pdu_rel12_value},
- { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL13_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel13, &unpack_dl_config_dci_dl_pdu_rel13_value},
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_DL_CONFIG_BCH_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_DL_CONFIG_REQUEST_BCH_PDU_REL8_TAG, &pdu->bch_pdu.bch_pdu_rel8, &unpack_dl_config_bch_pdu_rel8_value},
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_DL_CONFIG_MCH_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_DL_CONFIG_REQUEST_MCH_PDU_REL8_TAG, &pdu->mch_pdu.mch_pdu_rel8, &unpack_dl_config_mch_pdu_rel8_value},
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel8, &unpack_dl_config_dlsch_pdu_rel8_value},
- { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL9_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel9, &unpack_dl_config_dlsch_pdu_rel9_value},
- { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL10_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel10, &unpack_dl_config_dlsch_pdu_rel10_value},
- { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL11_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel11, &unpack_dl_config_dlsch_pdu_rel11_value},
- { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL12_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel12, &unpack_dl_config_dlsch_pdu_rel12_value},
- { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL13_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel13, &unpack_dl_config_dlsch_pdu_rel13_value},
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_DL_CONFIG_PCH_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL8_TAG, &pdu->pch_pdu.pch_pdu_rel8, &unpack_dl_config_pch_pdu_rel8_value},
- { NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL13_TAG, &pdu->pch_pdu.pch_pdu_rel13, &unpack_dl_config_pch_pdu_rel13_value},
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_DL_CONFIG_PRS_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_DL_CONFIG_REQUEST_PRS_PDU_REL9_TAG, &pdu->prs_pdu.prs_pdu_rel9, &unpack_dl_config_prs_pdu_rel9_value},
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL10_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel10, &unpack_dl_config_csi_rs_pdu_rel10_value},
- { NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL13_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel13, &unpack_dl_config_csi_rs_pdu_rel13_value},
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL8_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel8, &unpack_dl_config_dci_dl_pdu_rel8_value},
- { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL9_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel9, &unpack_dl_config_dci_dl_pdu_rel9_value},
- { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL10_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel10, &unpack_dl_config_dci_dl_pdu_rel10_value},
- { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL11_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel11, &unpack_dl_config_dci_dl_pdu_rel11_value},
- { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL12_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel12, &unpack_dl_config_dci_dl_pdu_rel12_value},
- { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL13_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel13, &unpack_dl_config_dci_dl_pdu_rel13_value},
- { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL11_TAG, &pdu->epdcch_pdu.epdcch_params_rel11, &unpack_dl_config_epdcch_params_rel11_value},
- { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL13_TAG, &pdu->epdcch_pdu.epdcch_params_rel13, &unpack_dl_config_epdcch_params_rel13_value},
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_DL_CONFIG_REQUEST_MPDCCH_PDU_REL13_TAG, &pdu->mpdcch_pdu.mpdcch_pdu_rel13, &unpack_dl_config_mpdcch_pdu_rel13_value},
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_DL_CONFIG_NBCH_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_DL_CONFIG_REQUEST_NBCH_PDU_REL13_TAG, &pdu->nbch_pdu.nbch_pdu_rel13, &unpack_dl_config_nbch_pdu_rel13_value},
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_DL_CONFIG_NPDCCH_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_DL_CONFIG_REQUEST_NPDCCH_PDU_REL13_TAG, &pdu->npdcch_pdu.npdcch_pdu_rel13, &unpack_dl_config_npdcch_pdu_rel13_value},
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-
- }
- break;
- case NFAPI_DL_CONFIG_NDLSCH_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_DL_CONFIG_REQUEST_NDLSCH_PDU_REL13_TAG, &pdu->ndlsch_pdu.ndlsch_pdu_rel13, &unpack_dl_config_ndlsch_pdu_rel13_value},
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-
- }
- break;
- default:
- // Need to log an error
- break;
- }
- }
-
- return 1;
-}
-
-
-static uint8_t unpack_dl_tti_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
- nfapi_nr_dl_tti_request_t *pNfapiMsg = (nfapi_nr_dl_tti_request_t*)msg;
-
- if (!(pull16(ppReadPackedMsg,&pNfapiMsg->SFN, end) &&
- pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
- pull8(ppReadPackedMsg, &pNfapiMsg->dl_tti_request_body.nGroup, end) &&
- pull8(ppReadPackedMsg, &pNfapiMsg->dl_tti_request_body.nPDUs, end) &&
- pullarray8(ppReadPackedMsg,pNfapiMsg->dl_tti_request_body.nUe ,256,pNfapiMsg->dl_tti_request_body.nGroup, end)
- //pusharray8(pNfapiMsg->PduIdx[0] ,256,256, ppWritePackedMsg, end)
- ))
- return 0;
-
- int arr[12];
- for(int i=0;idl_tti_request_body.nGroup;i++)
- {
- for(int j=0;jdl_tti_request_body.nUe[i];j++)
- {
- arr[j] = pNfapiMsg->dl_tti_request_body.PduIdx[i][j];
- }
- if(!(pullarrays32(ppReadPackedMsg,arr,12,pNfapiMsg->dl_tti_request_body.nUe[i], end)))
- return 0;
- }
-
- for(int i=0;idl_tti_request_body.nPDUs;i++)
- {
- if(!unpack_dl_tti_request_body_value(ppReadPackedMsg, end, &pNfapiMsg->dl_tti_request_body.dl_tti_pdu_list[i]))
- return 0;
- }
-
-return 1;
-}
-
-
-static uint8_t unpack_ul_tti_request_prach_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_nr_prach_pdu_t* prach_pdu = (nfapi_nr_prach_pdu_t*)tlv;
-
- return(
- pull16(ppReadPackedMsg, &prach_pdu->phys_cell_id, end) &&
- pull8(ppReadPackedMsg, &prach_pdu->num_prach_ocas, end) &&
- pull8(ppReadPackedMsg, &prach_pdu->prach_format, end) &&
- pull8(ppReadPackedMsg, &prach_pdu->num_ra, end) &&
- pull8(ppReadPackedMsg, &prach_pdu->prach_start_symbol, end) &&
- pull16(ppReadPackedMsg, &prach_pdu->num_cs, end)
- // TODO: ignoring beamforming tlv for now
- );
-}
-
-
-static uint8_t unpack_ul_tti_request_pucch_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_nr_pucch_pdu_t* pucch_pdu = (nfapi_nr_pucch_pdu_t*)tlv;
-
- return(
- pull16(ppReadPackedMsg, &pucch_pdu->rnti, end) &&
- pull32(ppReadPackedMsg, &pucch_pdu->handle, end) &&
- pull16(ppReadPackedMsg, &pucch_pdu->bwp_size, end) &&
- pull16(ppReadPackedMsg, &pucch_pdu->bwp_start, end) &&
- pull8(ppReadPackedMsg, &pucch_pdu->subcarrier_spacing, end) &&
- pull8(ppReadPackedMsg, &pucch_pdu->cyclic_prefix, end) &&
- pull8(ppReadPackedMsg, &pucch_pdu->format_type, end) &&
- pull8(ppReadPackedMsg, &pucch_pdu->multi_slot_tx_indicator, end) &&
- pull16(ppReadPackedMsg, &pucch_pdu->prb_start, end) &&
- pull16(ppReadPackedMsg, &pucch_pdu->prb_size, end) &&
- pull8(ppReadPackedMsg, &pucch_pdu->start_symbol_index, end) &&
- pull8(ppReadPackedMsg, &pucch_pdu->nr_of_symbols, end) &&
- pull8(ppReadPackedMsg, &pucch_pdu->freq_hop_flag, end) &&
- pull16(ppReadPackedMsg, &pucch_pdu->second_hop_prb, end) &&
- pull8(ppReadPackedMsg, &pucch_pdu->group_hop_flag, end) &&
- pull8(ppReadPackedMsg, &pucch_pdu->sequence_hop_flag, end) &&
- pull16(ppReadPackedMsg, &pucch_pdu->hopping_id, end) &&
- pull16(ppReadPackedMsg, &pucch_pdu->initial_cyclic_shift, end) &&
- pull16(ppReadPackedMsg, &pucch_pdu->data_scrambling_id, end) &&
- pull8(ppReadPackedMsg, &pucch_pdu->time_domain_occ_idx, end) &&
- pull8(ppReadPackedMsg, &pucch_pdu->pre_dft_occ_idx, end) &&
- pull8(ppReadPackedMsg, &pucch_pdu->pre_dft_occ_len, end) &&
- pull8(ppReadPackedMsg, &pucch_pdu->add_dmrs_flag, end) &&
- pull16(ppReadPackedMsg, &pucch_pdu->dmrs_scrambling_id, end) &&
- pull8(ppReadPackedMsg, &pucch_pdu->dmrs_cyclic_shift, end) &&
- pull8(ppReadPackedMsg, &pucch_pdu->sr_flag, end) &&
- pull8(ppReadPackedMsg, &pucch_pdu->bit_len_harq, end) &&
- pull16(ppReadPackedMsg, &pucch_pdu->bit_len_csi_part1, end) &&
- pull16(ppReadPackedMsg, &pucch_pdu->bit_len_csi_part2, end)
- // TODO: ignoring beamforming tlv for now
- );
-}
-
-
-static uint8_t unpack_ul_tti_request_pusch_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_nr_pusch_pdu_t* pusch_pdu = (nfapi_nr_pusch_pdu_t*)tlv;
-
- if (!(
- pull16(ppReadPackedMsg, &pusch_pdu->pdu_bit_map, end) &&
- pull16(ppReadPackedMsg, &pusch_pdu->rnti, end) &&
- pull32(ppReadPackedMsg, &pusch_pdu->handle, end) &&
- pull16(ppReadPackedMsg, &pusch_pdu->bwp_size, end) &&
- pull16(ppReadPackedMsg, &pusch_pdu->bwp_start, end) &&
- pull8(ppReadPackedMsg, &pusch_pdu->subcarrier_spacing, end) &&
- pull8(ppReadPackedMsg, &pusch_pdu->cyclic_prefix, end) &&
- pull16(ppReadPackedMsg, &pusch_pdu->target_code_rate, end) &&
- pull8(ppReadPackedMsg, &pusch_pdu->qam_mod_order, end) &&
- pull8(ppReadPackedMsg, &pusch_pdu->mcs_index, end) &&
- pull8(ppReadPackedMsg, &pusch_pdu->mcs_table, end) &&
- pull8(ppReadPackedMsg, &pusch_pdu->transform_precoding, end) &&
- pull16(ppReadPackedMsg, &pusch_pdu->data_scrambling_id, end) &&
- pull8(ppReadPackedMsg, &pusch_pdu->nrOfLayers, end) &&
- pull16(ppReadPackedMsg, &pusch_pdu->ul_dmrs_symb_pos, end) &&
- pull8(ppReadPackedMsg, &pusch_pdu->dmrs_config_type, end) &&
- pull16(ppReadPackedMsg, &pusch_pdu->ul_dmrs_scrambling_id, end) &&
- pull8(ppReadPackedMsg, &pusch_pdu->scid, end) &&
- pull8(ppReadPackedMsg, &pusch_pdu->num_dmrs_cdm_grps_no_data, end) &&
- pull16(ppReadPackedMsg, &pusch_pdu->dmrs_ports, end) &&
- pull8(ppReadPackedMsg, &pusch_pdu->resource_alloc, end) &&
- pull8(ppReadPackedMsg, &pusch_pdu->resource_alloc,end) &&
- pull16(ppReadPackedMsg, &pusch_pdu->dmrs_ports, end) &&
- pull16(ppReadPackedMsg, &pusch_pdu->rb_start, end) &&
- pull16(ppReadPackedMsg, &pusch_pdu->rb_size, end) &&
- pull8(ppReadPackedMsg, &pusch_pdu->vrb_to_prb_mapping, end) &&
- pull8(ppReadPackedMsg, &pusch_pdu->frequency_hopping, end) &&
- pull16(ppReadPackedMsg, &pusch_pdu->tx_direct_current_location, end) &&
- pull8(ppReadPackedMsg, &pusch_pdu->uplink_frequency_shift_7p5khz, end) &&
- pull8(ppReadPackedMsg, &pusch_pdu->start_symbol_index, end) &&
- pull8(ppReadPackedMsg, &pusch_pdu->nr_of_symbols, end)
- // TODO: ignoring beamforming tlv for now
- ))
- return 0;
-
-
- //Pack Optional Data only included if indicated in pduBitmap
- switch(pusch_pdu->pdu_bit_map){
- case PUSCH_PDU_BITMAP_PUSCH_DATA:
- {
- // pack optional TLVs
- return(
- pull8(ppReadPackedMsg, &pusch_pdu->pusch_data.rv_index, end) &&
- pull8(ppReadPackedMsg, &pusch_pdu->pusch_data.harq_process_id, end) &&
- pull32(ppReadPackedMsg, &pusch_pdu->pusch_data.tb_size, end) &&
- pull16(ppReadPackedMsg, &pusch_pdu->pusch_data.num_cb, end) &&
- pullarray8(ppReadPackedMsg, pusch_pdu->pusch_data.cb_present_and_position,1,1,end)
- );
- }
- break;
-
- case PUSCH_PDU_BITMAP_PUSCH_UCI:
- {
- return(
- pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.harq_ack_bit_length, end) &&
- pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.csi_part1_bit_length, end) &&
- pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.csi_part2_bit_length, end) &&
- pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.alpha_scaling, end) &&
- pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_harq_ack, end) &&
- pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_csi1, end) &&
- pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_csi2, end)
- );
- }
- break;
-
- case PUSCH_PDU_BITMAP_PUSCH_PTRS:
- {
- return(
- pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.num_ptrs_ports, end) &&
- pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_dmrs_port, end) &&
-+ pull16(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_port_index, end) &&
-+ pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_re_offset, end) &&
- pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_time_density, end) &&
- pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_freq_density, end) &&
- pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ul_ptrs_power, end)
- );
- }
- break;
-
- case PUSCH_PDU_BITMAP_DFTS_OFDM:
- {
- return(
- pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.low_papr_group_number, end) &&
- pull16(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.low_papr_sequence_number, end) &&
- pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.ul_ptrs_sample_density, end) &&
- pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.ul_ptrs_time_density_transform_precoding, end)
- );
- }
- break;
-
- default:
- {
- NFAPI_TRACE(NFAPI_TRACE_INFO, "Invalid pdu bitmap %d \n", pusch_pdu->pdu_bit_map );
- }
- }
-
- return 1;
-}
-
-
-static uint8_t unpack_ul_tti_request_srs_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_nr_srs_pdu_t* srs_pdu = (nfapi_nr_srs_pdu_t*)tlv;
-
- return(
- pull16(ppReadPackedMsg, &srs_pdu->rnti, end) &&
- pull32(ppReadPackedMsg, &srs_pdu->handle, end) &&
- pull16(ppReadPackedMsg, &srs_pdu->bwp_size, end) &&
- pull16(ppReadPackedMsg, &srs_pdu->bwp_start, end) &&
- pull8(ppReadPackedMsg, &srs_pdu->subcarrier_spacing, end) &&
- pull8(ppReadPackedMsg, &srs_pdu->cyclic_prefix, end) &&
- pull8(ppReadPackedMsg, &srs_pdu->num_ant_ports, end) &&
- pull8(ppReadPackedMsg, &srs_pdu->num_symbols, end) &&
- pull8(ppReadPackedMsg, &srs_pdu->num_repetitions, end) &&
- pull8(ppReadPackedMsg, &srs_pdu->time_start_position, end) &&
- pull8(ppReadPackedMsg, &srs_pdu->config_index, end) &&
- pull16(ppReadPackedMsg, &srs_pdu->sequence_id, end) &&
- pull8(ppReadPackedMsg, &srs_pdu->bandwidth_index, end) &&
- pull8(ppReadPackedMsg, &srs_pdu->comb_size, end) &&
- pull8(ppReadPackedMsg, &srs_pdu->comb_offset, end) &&
- pull8(ppReadPackedMsg, &srs_pdu->cyclic_shift, end) &&
- pull8(ppReadPackedMsg, &srs_pdu->frequency_position, end) &&
- pull8(ppReadPackedMsg, &srs_pdu->frequency_shift, end) &&
- pull8(ppReadPackedMsg, &srs_pdu->frequency_hopping, end) &&
- pull8(ppReadPackedMsg, &srs_pdu->group_or_sequence_hopping, end) &&
- pull8(ppReadPackedMsg, &srs_pdu->resource_type, end) &&
- pull16(ppReadPackedMsg, &srs_pdu->t_srs, end) &&
- pull16(ppReadPackedMsg, &srs_pdu->t_offset, end)
- // TODO: ignoring beamforming tlv for now
- );
-}
-
-
-static uint8_t unpack_ul_tti_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg)
-{
- nfapi_nr_ul_tti_request_number_of_pdus_t* pNfapiMsg = (nfapi_nr_ul_tti_request_number_of_pdus_t*)msg;
-
- if(!(pull16(ppReadPackedMsg, &pNfapiMsg->pdu_size, end) &&
- pull16(ppReadPackedMsg, &pNfapiMsg->pdu_type, end) ))
- return 0;
-
-
- // first natch the pdu type, then call the respective function
- switch(pNfapiMsg->pdu_type)
- {
-
- case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE:
- {
- if(!unpack_ul_tti_request_prach_pdu(&pNfapiMsg->prach_pdu, ppReadPackedMsg, end))
- return 0;
- }
- break;
-
- case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE:
- {
- if(!unpack_ul_tti_request_pucch_pdu(&pNfapiMsg->pucch_pdu, ppReadPackedMsg, end))
- return 0;
- }
- break;
-
- case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE:
- {
- if(!unpack_ul_tti_request_pusch_pdu(&pNfapiMsg->pusch_pdu, ppReadPackedMsg, end))
- return 0;
- }
- break;
-
- case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE:
- {
- if(!unpack_ul_tti_request_srs_pdu(&pNfapiMsg->srs_pdu, ppReadPackedMsg, end))
- return 0;
- }
- break;
-
- default:
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid UL_TTI pdu type %d \n", pNfapiMsg->pdu_type );
- }
- break;
-
-
- }
-
- return 1;
-}
-
-
-static uint8_t unpack_ul_tti_groups_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg)
-{
- nfapi_nr_ul_tti_request_number_of_groups_t* pNfapiMsg = (nfapi_nr_ul_tti_request_number_of_groups_t*)msg;
-
- if(!pull8(ppReadPackedMsg, &pNfapiMsg->n_ue, end))
- return 0;
- for (int i = 0; i < pNfapiMsg->n_ue; i++)
- {
- if(!pull8(ppReadPackedMsg, &pNfapiMsg->ue_list[i].pdu_idx ,end) )
- return 0;
- }
- return 1;
-}
-
-
-static uint8_t unpack_ul_tti_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
- nfapi_nr_ul_tti_request_t *pNfapiMsg = (nfapi_nr_ul_tti_request_t*)msg;
-
- if (!(
- pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end) &&
- pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
- pull8(ppReadPackedMsg, &pNfapiMsg->n_pdus, end) &&
- pull8(ppReadPackedMsg, &pNfapiMsg->n_group, end) &&
- pull8(ppReadPackedMsg, &pNfapiMsg->rach_present, end) &&
- pull8(ppReadPackedMsg, &pNfapiMsg->n_ulcch, end) &&
- pull8(ppReadPackedMsg, &pNfapiMsg->n_ulsch, end) ))
- return 0;
-
- for(int i=0; i< pNfapiMsg->n_pdus; i++)
- {
- if (!unpack_ul_tti_pdu_list_value(ppReadPackedMsg, end, &pNfapiMsg->pdus_list[i]))
- return 0;
- }
-
- for(int i=0; i< pNfapiMsg->n_group; i++)
- {
- if (!unpack_ul_tti_groups_list_value(ppReadPackedMsg, end, &pNfapiMsg->groups_list[i]))
- return 0;
- }
-
- return 1;
-}
-
-
-
-static uint8_t unpack_dl_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
- nfapi_dl_config_request_t *pNfapiMsg = (nfapi_dl_config_request_t*)msg;
-
- unpack_p7_tlv_t unpack_fns[] =
- {
- { NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, &unpack_dl_config_request_body_value},
- };
-
- return ( pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
- unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_ul_config_ulsch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-
-
-
- nfapi_ul_config_ulsch_pdu_rel8_t* ulsch_pdu_rel8 = (nfapi_ul_config_ulsch_pdu_rel8_t*)tlv;
-
- return (pull32(ppReadPackedMsg, &ulsch_pdu_rel8->handle, end) &&
- pull16(ppReadPackedMsg, &ulsch_pdu_rel8->size, end) &&
- pull16(ppReadPackedMsg, &ulsch_pdu_rel8->rnti, end) &&
- pull8(ppReadPackedMsg, &ulsch_pdu_rel8->resource_block_start, end) &&
- pull8(ppReadPackedMsg, &ulsch_pdu_rel8->number_of_resource_blocks, end) &&
- pull8(ppReadPackedMsg, &ulsch_pdu_rel8->modulation_type, end) &&
- pull8(ppReadPackedMsg, &ulsch_pdu_rel8->cyclic_shift_2_for_drms, end) &&
- pull8(ppReadPackedMsg, &ulsch_pdu_rel8->frequency_hopping_enabled_flag, end) &&
- pull8(ppReadPackedMsg, &ulsch_pdu_rel8->frequency_hopping_bits, end) &&
- pull8(ppReadPackedMsg, &ulsch_pdu_rel8->new_data_indication, end) &&
- pull8(ppReadPackedMsg, &ulsch_pdu_rel8->redundancy_version, end) &&
- pull8(ppReadPackedMsg, &ulsch_pdu_rel8->harq_process_number, end) &&
- pull8(ppReadPackedMsg, &ulsch_pdu_rel8->ul_tx_mode, end) &&
- pull8(ppReadPackedMsg, &ulsch_pdu_rel8->current_tx_nb, end) &&
- pull8(ppReadPackedMsg, &ulsch_pdu_rel8->n_srs, end ));
-}
-
-static uint8_t unpack_ul_config_ulsch_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_config_ulsch_pdu_rel10_t* ulsch_pdu_rel10 = (nfapi_ul_config_ulsch_pdu_rel10_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &ulsch_pdu_rel10->resource_allocation_type, end) &&
- pull32(ppReadPackedMsg, &ulsch_pdu_rel10->resource_block_coding, end) &&
- pull8(ppReadPackedMsg, &ulsch_pdu_rel10->transport_blocks, end) &&
- pull8(ppReadPackedMsg, &ulsch_pdu_rel10->transmission_scheme, end) &&
- pull8(ppReadPackedMsg, &ulsch_pdu_rel10->number_of_layers, end) &
- pull8(ppReadPackedMsg, &ulsch_pdu_rel10->codebook_index, end) &&
- pull8(ppReadPackedMsg, &ulsch_pdu_rel10->disable_sequence_hopping_flag, end));
-}
-static uint8_t unpack_ul_config_ulsch_pdu_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_config_ulsch_pdu_rel11_t* ulsch_pdu_rel11 = (nfapi_ul_config_ulsch_pdu_rel11_t*)tlv;
-
- return ( pull8(ppReadPackedMsg, &ulsch_pdu_rel11->virtual_cell_id_enabled_flag, end) &&
- pull16(ppReadPackedMsg, &ulsch_pdu_rel11->npusch_identity, end) &&
- pull8(ppReadPackedMsg, &ulsch_pdu_rel11->dmrs_config_flag, end) &&
- pull16(ppReadPackedMsg, &ulsch_pdu_rel11->ndmrs_csh_identity, end));
-}
-static uint8_t unpack_ul_config_ulsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_config_ulsch_pdu_rel13_t* ulsch_pdu_rel13 = (nfapi_ul_config_ulsch_pdu_rel13_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &ulsch_pdu_rel13->ue_type, end) &&
- pull16(ppReadPackedMsg, &ulsch_pdu_rel13->total_number_of_repetitions, end) &&
- pull16(ppReadPackedMsg, &ulsch_pdu_rel13->repetition_number, end) &&
- pull16(ppReadPackedMsg, &ulsch_pdu_rel13->initial_transmission_sf_io, end) &&
- pull8(ppReadPackedMsg, &ulsch_pdu_rel13->empty_symbols_due_to_re_tunning, end));
-}
-static uint8_t unpack_ul_config_cqi_ri_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_config_cqi_ri_information_rel8_t* cqi_ri_info_rel8 = (nfapi_ul_config_cqi_ri_information_rel8_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &cqi_ri_info_rel8->dl_cqi_pmi_size_rank_1, end) &&
- pull8(ppReadPackedMsg, &cqi_ri_info_rel8->dl_cqi_pmi_size_rank_greater_1, end) &&
- pull8(ppReadPackedMsg, &cqi_ri_info_rel8->ri_size, end) &&
- pull8(ppReadPackedMsg, &cqi_ri_info_rel8->delta_offset_cqi, end) &&
- pull8(ppReadPackedMsg, &cqi_ri_info_rel8->delta_offset_ri, end));
-}
-
-static uint8_t unpack_ul_config_cqi_ri_info_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_config_cqi_ri_information_rel9_t* cqi_ri_info_rel9 = (nfapi_ul_config_cqi_ri_information_rel9_t*)tlv;
-
- if(!(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->report_type, end) &&
- pull8(ppReadPackedMsg, &cqi_ri_info_rel9->delta_offset_cqi, end) &&
- pull8(ppReadPackedMsg, &cqi_ri_info_rel9->delta_offset_ri, end)))
- return 0;
-
- switch(cqi_ri_info_rel9->report_type)
- {
- case NFAPI_CSI_REPORT_TYPE_PERIODIC:
- {
- if(!(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size, end) &&
- pull8(ppReadPackedMsg, &cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.control_type, end)))
- return 0;
- }
- break;
- case NFAPI_CSI_REPORT_TYPE_APERIODIC:
- {
- if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc, end) ==0)
- return 0;
-
- uint8_t i;
- for(i = 0; i < cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc; ++i)
- {
- if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size, end) == 0)
- return 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[j], end) == 0)
- return 0;
- }
- }
- }
- break;
- default:
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid report type %d \n", cqi_ri_info_rel9->report_type );
- return 0;
- }
- break;
- };
- return 1;
-}
-
-// NOTE : This function is a little unconventional as we uese the side to
-// determine the report type
-static uint8_t unpack_ul_config_cqi_ri_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_config_cqi_ri_information_rel13_t* cqi_ri_info_rel13 = (nfapi_ul_config_cqi_ri_information_rel13_t*)tlv;
- if(cqi_ri_info_rel13->tl.length == 0)
- {
- cqi_ri_info_rel13->report_type = NFAPI_CSI_REPORT_TYPE_APERIODIC;
- }
- else
- {
- cqi_ri_info_rel13->report_type = NFAPI_CSI_REPORT_TYPE_PERIODIC;
- if(pull16(ppReadPackedMsg, &cqi_ri_info_rel13->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size_2, end) == 0)
- return 0;
- }
- return 1;
-}
-static uint8_t unpack_ul_config_cqi_init_tx_params_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_config_initial_transmission_parameters_rel8_t* init_tx_params_rel8 = (nfapi_ul_config_initial_transmission_parameters_rel8_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &init_tx_params_rel8->n_srs_initial, end) &&
- pull8(ppReadPackedMsg, &init_tx_params_rel8->initial_number_of_resource_blocks, end));
-}
-static uint8_t unpack_ul_config_ulsch_harq_info_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_config_ulsch_harq_information_rel10_t* harq_info_rel10 = (nfapi_ul_config_ulsch_harq_information_rel10_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &harq_info_rel10->harq_size, end) &&
- pull8(ppReadPackedMsg, &harq_info_rel10->delta_offset_harq, end) &&
- pull8(ppReadPackedMsg, &harq_info_rel10->ack_nack_mode, end));
-}
-
-static uint8_t unpack_ul_config_ulsch_harq_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_config_ulsch_harq_information_rel13_t* harq_info_rel13 = (nfapi_ul_config_ulsch_harq_information_rel13_t*)tlv;
-
- return (pull16(ppReadPackedMsg, &harq_info_rel13->harq_size_2, end) &&
- pull8(ppReadPackedMsg, &harq_info_rel13->delta_offset_harq_2, end));
-}
-
-static uint8_t unpack_ul_config_ue_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_config_ue_information_rel8_t* ue_info_rel8 = (nfapi_ul_config_ue_information_rel8_t*)tlv;
-
- return (pull32(ppReadPackedMsg, &ue_info_rel8->handle, end) &&
- pull16(ppReadPackedMsg, (uint16_t *)&ue_info_rel8->rnti, end));
-}
-static uint8_t unpack_ul_config_ue_info_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_config_ue_information_rel11_t* ue_info_rel11 = (nfapi_ul_config_ue_information_rel11_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &ue_info_rel11->virtual_cell_id_enabled_flag, end) &&
- pull16(ppReadPackedMsg, &ue_info_rel11->npusch_identity, end));
-}
-static uint8_t unpack_ul_config_ue_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_config_ue_information_rel13_t* ue_info_rel13 = (nfapi_ul_config_ue_information_rel13_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &ue_info_rel13->ue_type, end) &&
- pull8(ppReadPackedMsg, &ue_info_rel13->empty_symbols, end) &&
- pull16(ppReadPackedMsg, &ue_info_rel13->total_number_of_repetitions, end) &&
- pull16(ppReadPackedMsg, &ue_info_rel13->repetition_number, end));
-}
-
-static uint8_t unpack_ul_config_cqi_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_config_cqi_information_rel8_t* cqi_info_rel8 = (nfapi_ul_config_cqi_information_rel8_t*)tlv;
-
- return ( pull16(ppReadPackedMsg, &cqi_info_rel8->pucch_index, end) &&
- pull8(ppReadPackedMsg, &cqi_info_rel8->dl_cqi_pmi_size, end));
-}
-static uint8_t unpack_ul_config_cqi_info_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_config_cqi_information_rel10_t* cqi_info_rel10 = (nfapi_ul_config_cqi_information_rel10_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &cqi_info_rel10->number_of_pucch_resource, end) &&
- pull16(ppReadPackedMsg, &cqi_info_rel10->pucch_index_p1, end));
-}
-static uint8_t unpack_ul_config_cqi_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_config_cqi_information_rel13_t* cqi_info_rel13 = (nfapi_ul_config_cqi_information_rel13_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &cqi_info_rel13->csi_mode, end) &&
- pull16(ppReadPackedMsg, &cqi_info_rel13->dl_cqi_pmi_size_2, end) &&
- pull8(ppReadPackedMsg, &cqi_info_rel13->starting_prb, end) &&
- pull8(ppReadPackedMsg, &cqi_info_rel13->n_prb, end) &&
- pull8(ppReadPackedMsg, &cqi_info_rel13->cdm_index, end) &&
- pull8(ppReadPackedMsg, &cqi_info_rel13->n_srs, end));
-}
-
-static uint8_t unpack_ul_config_sr_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_config_sr_information_rel8_t* sr_info_rel8 = (nfapi_ul_config_sr_information_rel8_t*)tlv;
-
- return ( pull16(ppReadPackedMsg, &sr_info_rel8->pucch_index, end));
-}
-
-static uint8_t unpack_ul_config_sr_info_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_config_sr_information_rel10_t* sr_info_rel10 = (nfapi_ul_config_sr_information_rel10_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &sr_info_rel10->number_of_pucch_resources, end) &&
- pull16(ppReadPackedMsg, &sr_info_rel10->pucch_index_p1, end));
-}
-
-static uint8_t unpack_ul_config_harq_info_rel10_tdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_config_harq_information_rel10_tdd_t* harq_info_tdd_rel10 = (nfapi_ul_config_harq_information_rel10_tdd_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &harq_info_tdd_rel10->harq_size, end) &&
- pull8(ppReadPackedMsg, &harq_info_tdd_rel10->ack_nack_mode, end) &&
- pull8(ppReadPackedMsg, &harq_info_tdd_rel10->number_of_pucch_resources, end) &&
- pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_0, end) &&
- pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_1, end) &&
- pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_2, end) &&
- pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_3, end));
-}
-
-static uint8_t unpack_ul_config_harq_info_rel8_fdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_config_harq_information_rel8_fdd_t* harq_info_fdd_rel8 = (nfapi_ul_config_harq_information_rel8_fdd_t*)tlv;
-
- return (pull16(ppReadPackedMsg, &harq_info_fdd_rel8->n_pucch_1_0, end) &&
- pull8(ppReadPackedMsg, &harq_info_fdd_rel8->harq_size, end));
-}
-
-static uint8_t unpack_ul_config_harq_info_rel9_fdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_config_harq_information_rel9_fdd_t* harq_info_fdd_rel9 = (nfapi_ul_config_harq_information_rel9_fdd_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &harq_info_fdd_rel9->harq_size, end) &&
- pull8(ppReadPackedMsg, &harq_info_fdd_rel9->ack_nack_mode, end) &&
- pull8(ppReadPackedMsg, &harq_info_fdd_rel9->number_of_pucch_resources, end) &&
- pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_0, end) &&
- pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_1, end) &&
- pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_2, end) &&
- pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_3, end));
-}
-
-static uint8_t unpack_ul_config_harq_info_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_config_harq_information_rel11_t* harq_info_rel11 = (nfapi_ul_config_harq_information_rel11_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &harq_info_rel11->num_ant_ports, end) &&
- pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_0, end) &&
- pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_1, end) &&
- pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_2, end) &&
- pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_3, end));
-}
-
-static uint8_t unpack_ul_config_harq_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_config_harq_information_rel13_t* harq_info_rel13 = (nfapi_ul_config_harq_information_rel13_t*)tlv;
-
- return (pull16(ppReadPackedMsg, &harq_info_rel13->harq_size_2, end) &&
- pull8(ppReadPackedMsg, &harq_info_rel13->starting_prb, end) &&
- pull8(ppReadPackedMsg, &harq_info_rel13->n_prb, end) &&
- pull8(ppReadPackedMsg, &harq_info_rel13->cdm_index, end) &&
- pull8(ppReadPackedMsg, &harq_info_rel13->n_srs, end));
-}
-
-
-static uint8_t unpack_ul_config_srs_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_config_srs_pdu_rel8_t* srs_pdu_rel8 = (nfapi_ul_config_srs_pdu_rel8_t*)tlv;
-
- return (pull32(ppReadPackedMsg, &srs_pdu_rel8->handle, end) &&
- pull16(ppReadPackedMsg, &srs_pdu_rel8->size, end) &&
- pull16(ppReadPackedMsg, &srs_pdu_rel8->rnti, end) &&
- pull8(ppReadPackedMsg, &srs_pdu_rel8->srs_bandwidth, end) &&
- pull8(ppReadPackedMsg, &srs_pdu_rel8->frequency_domain_position, end) &&
- pull8(ppReadPackedMsg, &srs_pdu_rel8->srs_hopping_bandwidth, end) &&
- pull8(ppReadPackedMsg, &srs_pdu_rel8->transmission_comb, end) &&
- pull16(ppReadPackedMsg, &srs_pdu_rel8->i_srs, end) &&
- pull8(ppReadPackedMsg, &srs_pdu_rel8->sounding_reference_cyclic_shift, end));
-}
-
-static uint8_t unpack_ul_config_srs_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_config_srs_pdu_rel10_t* srs_pdu_rel10 = (nfapi_ul_config_srs_pdu_rel10_t*)tlv;
- return pull8(ppReadPackedMsg, &srs_pdu_rel10->antenna_port, end);
-}
-
-static uint8_t unpack_ul_config_srs_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_config_srs_pdu_rel13_t* srs_pdu_rel13 = (nfapi_ul_config_srs_pdu_rel13_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &srs_pdu_rel13->number_of_combs, end));
-}
-
-static uint8_t unpack_ul_nb_harq_info_rel13_fdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_config_nb_harq_information_rel13_fdd_t* nb_harq_info_fdd_rel13 = (nfapi_ul_config_nb_harq_information_rel13_fdd_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &nb_harq_info_fdd_rel13->harq_ack_resource, end));
-}
-
-static uint8_t unpack_ul_config_nulsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_config_nulsch_pdu_rel13_t* nulsch_pdu_rel13 = (nfapi_ul_config_nulsch_pdu_rel13_t*)tlv;
-
- if(!(pull8(ppReadPackedMsg, &nulsch_pdu_rel13->nulsch_format, end) &&
- pull32(ppReadPackedMsg, &nulsch_pdu_rel13->handle, end) &&
- pull16(ppReadPackedMsg, &nulsch_pdu_rel13->size, end) &&
- pull16(ppReadPackedMsg, &nulsch_pdu_rel13->rnti, end) &&
- pull8(ppReadPackedMsg, &nulsch_pdu_rel13->subcarrier_indication, end) &&
- pull8(ppReadPackedMsg, &nulsch_pdu_rel13->resource_assignment, end) &&
- pull8(ppReadPackedMsg, &nulsch_pdu_rel13->mcs, end) &&
- pull8(ppReadPackedMsg, &nulsch_pdu_rel13->redudancy_version, end) &&
- pull8(ppReadPackedMsg, &nulsch_pdu_rel13->repetition_number, end) &&
- pull8(ppReadPackedMsg, &nulsch_pdu_rel13->new_data_indication, end) &&
- pull8(ppReadPackedMsg, &nulsch_pdu_rel13->n_srs, end) &&
- pull16(ppReadPackedMsg, &nulsch_pdu_rel13->scrambling_sequence_initialization_cinit, end) &&
- pull16(ppReadPackedMsg, &nulsch_pdu_rel13->sf_idx, end)))
- return 0;
-
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG, &nulsch_pdu_rel13->ue_information.ue_information_rel8, &unpack_ul_config_ue_info_rel8_value},
- { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG, &nulsch_pdu_rel13->ue_information.ue_information_rel11, &unpack_ul_config_ue_info_rel11_value},
- { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG, &nulsch_pdu_rel13->ue_information.ue_information_rel13, &unpack_ul_config_ue_info_rel13_value},
- { NFAPI_UL_CONFIG_REQUEST_NB_HARQ_INFORMATION_REL13_FDD_TAG, &nulsch_pdu_rel13->nb_harq_information.nb_harq_information_rel13_fdd, &unpack_ul_nb_harq_info_rel13_fdd_value},
- };
-
- return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, 0, 0);
-}
-
-static uint8_t unpack_ul_config_nrach_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_config_nrach_pdu_rel13_t* nrach_pdu_rel13 = (nfapi_ul_config_nrach_pdu_rel13_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &nrach_pdu_rel13->nprach_config_0, end) &&
- pull8(ppReadPackedMsg, &nrach_pdu_rel13->nprach_config_1, end) &&
- pull8(ppReadPackedMsg, &nrach_pdu_rel13->nprach_config_2, end));
-}
-
-
-static uint8_t unpack_ul_config_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- #define UL_CONFIG_ULSCH_PDU_UNPACK_FNS(_pdu) \
- { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL8_TAG, &_pdu.ulsch_pdu_rel8, &unpack_ul_config_ulsch_pdu_rel8_value}, \
- { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL10_TAG, &_pdu.ulsch_pdu_rel10, &unpack_ul_config_ulsch_pdu_rel10_value}, \
- { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL11_TAG, &_pdu.ulsch_pdu_rel11, &unpack_ul_config_ulsch_pdu_rel11_value}, \
- { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL13_TAG, &_pdu.ulsch_pdu_rel13, &unpack_ul_config_ulsch_pdu_rel13_value},
-
- #define UL_CONFIG_CQI_RI_INFO_UNPACK_FNS(_pdu) \
- { NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL8_TAG, &_pdu.cqi_ri_information_rel8, &unpack_ul_config_cqi_ri_info_rel8_value}, \
- { NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL9_TAG, &_pdu.cqi_ri_information_rel9, &unpack_ul_config_cqi_ri_info_rel9_value}, \
- { NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL13_TAG, &_pdu.cqi_ri_information_rel13, &unpack_ul_config_cqi_ri_info_rel13_value},
-
- #define UL_CONFIG_ULSCH_HARQ_INFO_UNPACK_FNS(_pdu) \
- { NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL10_TAG, &_pdu.harq_information_rel10, &unpack_ul_config_ulsch_harq_info_rel10_value},\
- { NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL13_TAG, &_pdu.harq_information_rel13, &unpack_ul_config_ulsch_harq_info_rel13_value},
-
- #define UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(_pdu) \
- { NFAPI_UL_CONFIG_REQUEST_INITIAL_TRANSMISSION_PARAMETERS_REL8_TAG, &_pdu.initial_transmission_parameters_rel8, &unpack_ul_config_cqi_init_tx_params_rel8_value},
-
- #define UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(_pdu) \
- { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG, &_pdu.ue_information_rel8, &unpack_ul_config_ue_info_rel8_value}, \
- { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG, &_pdu.ue_information_rel11, &unpack_ul_config_ue_info_rel11_value}, \
- { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG, &_pdu.ue_information_rel13, &unpack_ul_config_ue_info_rel13_value},
-
- #define UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(_pdu) \
- { NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG, &_pdu.cqi_information_rel8, &unpack_ul_config_cqi_info_rel8_value}, \
- { NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL10_TAG, &_pdu.cqi_information_rel10, &unpack_ul_config_cqi_info_rel10_value}, \
- { NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL13_TAG, &_pdu.cqi_information_rel13, &unpack_ul_config_cqi_info_rel13_value},
-
- #define UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(_pdu) \
- { NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL8_TAG, &_pdu.sr_information_rel8, &unpack_ul_config_sr_info_rel8_value}, \
- { NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL10_TAG, &_pdu.sr_information_rel10, &unpack_ul_config_sr_info_rel10_value},
-
- #define UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(_pdu) \
- { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL10_TDD_TAG, &_pdu.harq_information_rel10_tdd, &unpack_ul_config_harq_info_rel10_tdd_value}, \
- { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL8_FDD_TAG, &_pdu.harq_information_rel8_fdd, &unpack_ul_config_harq_info_rel8_fdd_value}, \
- { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL9_FDD_TAG, &_pdu.harq_information_rel9_fdd, &unpack_ul_config_harq_info_rel9_fdd_value}, \
- { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL11_TAG, &_pdu.harq_information_rel11, &unpack_ul_config_harq_info_rel11_value}, \
- { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL13_TAG, &_pdu.harq_information_rel13, &unpack_ul_config_harq_info_rel13_value},
-
- #define UL_CONFIG_SRS_PDU_UNPACK_FNS(_pdu) \
- { NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL8_TAG, &_pdu.srs_pdu_rel8, &unpack_ul_config_srs_pdu_rel8_value}, \
- { NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL10_TAG, &_pdu.srs_pdu_rel10, &unpack_ul_config_srs_pdu_rel10_value}, \
- { NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL13_TAG, &_pdu.srs_pdu_rel13, &unpack_ul_config_srs_pdu_rel13_value},
-
- #define UL_CONFIG_NULSCH_PDU_UNPACK_FNS(_pdu) \
- { NFAPI_UL_CONFIG_REQUEST_NULSCH_PDU_REL13_TAG, &_pdu.nulsch_pdu_rel13, &unpack_ul_config_nulsch_pdu_rel13_value},
-
- #define UL_CONFIG_NRACH_PDU_UNPACK_FNS(_pdu) \
- { NFAPI_UL_CONFIG_REQUEST_NRACH_PDU_REL13_TAG, &_pdu.nrach_pdu_rel13, &unpack_ul_config_nrach_pdu_rel13_value},
-
-
- nfapi_ul_config_request_body_t* value = (nfapi_ul_config_request_body_t*)tlv;
-
- if(!(pull8(ppReadPackedMsg, &value->number_of_pdus, end) &&
- pull8(ppReadPackedMsg, &value->rach_prach_frequency_resources, end) &&
- pull8(ppReadPackedMsg, &value->srs_present, end)))
- return 0;
-
- if(value->number_of_pdus > NFAPI_UL_CONFIG_MAX_PDU)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of ul config pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_UL_CONFIG_MAX_PDU);
- return 0;
- }
-
- if(value->number_of_pdus > 0)
- {
- value->ul_config_pdu_list = (nfapi_ul_config_request_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_ul_config_request_pdu_t) * value->number_of_pdus, config);
-
- if(value->ul_config_pdu_list == NULL)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate ul config pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
- return 0;
- }
- }
- else
- {
- value->ul_config_pdu_list = 0;
- }
-
-
- uint16_t i;
- uint16_t total_number_of_pdus = value->number_of_pdus;
- for(i = 0; i < total_number_of_pdus; ++i)
- {
- nfapi_ul_config_request_pdu_t* pdu = &(value->ul_config_pdu_list[i]);
-
- if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
- pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
- return 0;
-
- uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
-
- if(packedPduEnd > end)
- {
- // pdu end is past buffer end
- return 0;
- }
-
- switch(pdu->pdu_type)
- {
- case NFAPI_UL_CONFIG_ULSCH_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_pdu)
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
-
- case NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_cqi_ri_pdu.ulsch_pdu)
- UL_CONFIG_CQI_RI_INFO_UNPACK_FNS(pdu->ulsch_cqi_ri_pdu.cqi_ri_information)
- UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(pdu->ulsch_cqi_ri_pdu.initial_transmission_parameters)
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_harq_pdu.ulsch_pdu)
- UL_CONFIG_ULSCH_HARQ_INFO_UNPACK_FNS(pdu->ulsch_harq_pdu.harq_information)
- UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(pdu->ulsch_harq_pdu.initial_transmission_parameters)
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu)
- UL_CONFIG_CQI_RI_INFO_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.cqi_ri_information)
- UL_CONFIG_ULSCH_HARQ_INFO_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.harq_information)
- UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.initial_transmission_parameters)
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_pdu.ue_information)
- UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_pdu.cqi_information)
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_sr_pdu.ue_information)
- UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_sr_pdu.sr_information)
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_harq_pdu.ue_information)
- UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_harq_pdu.harq_information)
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_sr_harq_pdu.ue_information)
- UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_sr_harq_pdu.sr_information)
- UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_sr_harq_pdu.harq_information)
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_harq_pdu.ue_information)
- UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_harq_pdu.cqi_information)
- UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_cqi_harq_pdu.harq_information)
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_sr_pdu.ue_information)
- UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_sr_pdu.cqi_information)
- UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_cqi_sr_pdu.sr_information)
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.ue_information)
- UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.cqi_information)
- UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.sr_information)
- UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.harq_information)
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_UL_CONFIG_SRS_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- UL_CONFIG_SRS_PDU_UNPACK_FNS(pdu->srs_pdu)
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_UL_CONFIG_HARQ_BUFFER_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->harq_buffer_pdu.ue_information)
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_uci_csi_pdu.ulsch_pdu)
- UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->ulsch_uci_csi_pdu.csi_information)
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_uci_harq_pdu.ulsch_pdu)
- UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->ulsch_uci_harq_pdu.harq_information)
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_csi_uci_harq_pdu.ulsch_pdu)
- UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->ulsch_csi_uci_harq_pdu.csi_information)
- UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->ulsch_csi_uci_harq_pdu.harq_information)
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_UL_CONFIG_NULSCH_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- UL_CONFIG_NULSCH_PDU_UNPACK_FNS(pdu->nulsch_pdu)
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_UL_CONFIG_NRACH_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- UL_CONFIG_NRACH_PDU_UNPACK_FNS(pdu->nrach_pdu)
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- }
- }
- return 1;
-}
-
-
-static uint8_t unpack_ul_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
- nfapi_ul_config_request_t *pNfapiMsg = (nfapi_ul_config_request_t*)msg;
-
- unpack_p7_tlv_t unpack_fns[] =
- {
- { NFAPI_UL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->ul_config_request_body, &unpack_ul_config_request_body_value},
- };
-
- return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
- unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_hi_dci0_hi_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_hi_dci0_hi_pdu_rel8_t* hi_pdu_rel8 = (nfapi_hi_dci0_hi_pdu_rel8_t*)tlv;
-
- return( pull8(ppReadPackedMsg, &hi_pdu_rel8->resource_block_start, end) &&
- pull8(ppReadPackedMsg, &hi_pdu_rel8->cyclic_shift_2_for_drms, end) &&
- pull8(ppReadPackedMsg, &hi_pdu_rel8->hi_value, end) &&
- pull8(ppReadPackedMsg, &hi_pdu_rel8->i_phich, end) &&
- pull16(ppReadPackedMsg, &hi_pdu_rel8->transmission_power, end));
-}
-
-static uint8_t unpack_hi_dci0_hi_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_hi_dci0_hi_pdu_rel10_t* hi_pdu_rel10 = (nfapi_hi_dci0_hi_pdu_rel10_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &hi_pdu_rel10->flag_tb2, end) &&
- pull8(ppReadPackedMsg, &hi_pdu_rel10->hi_value_2, end));
-}
-
-static uint8_t unpack_hi_dci0_dci_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_hi_dci0_dci_pdu_rel8_t* dci_pdu_rel8 = (nfapi_hi_dci0_dci_pdu_rel8_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &dci_pdu_rel8->dci_format, end) &&
- pull8(ppReadPackedMsg, &dci_pdu_rel8->cce_index, end) &&
- pull8(ppReadPackedMsg, &dci_pdu_rel8->aggregation_level, end) &&
- pull16(ppReadPackedMsg, &dci_pdu_rel8->rnti, end) &&
- pull8(ppReadPackedMsg, &dci_pdu_rel8->resource_block_start, end) &&
- pull8(ppReadPackedMsg, &dci_pdu_rel8->number_of_resource_block, end) &&
- pull8(ppReadPackedMsg, &dci_pdu_rel8->mcs_1, end) &&
- pull8(ppReadPackedMsg, &dci_pdu_rel8->cyclic_shift_2_for_drms, end) &&
- pull8(ppReadPackedMsg, &dci_pdu_rel8->frequency_hopping_enabled_flag, end) &&
- pull8(ppReadPackedMsg, &dci_pdu_rel8->frequency_hopping_bits, end) &&
- pull8(ppReadPackedMsg, &dci_pdu_rel8->new_data_indication_1, end) &&
- pull8(ppReadPackedMsg, &dci_pdu_rel8->ue_tx_antenna_seleciton, end) &&
- pull8(ppReadPackedMsg, &dci_pdu_rel8->tpc, end) &&
- pull8(ppReadPackedMsg, &dci_pdu_rel8->cqi_csi_request, end) &&
- pull8(ppReadPackedMsg, &dci_pdu_rel8->ul_index, end) &&
- pull8(ppReadPackedMsg, &dci_pdu_rel8->dl_assignment_index, end) &&
- pull32(ppReadPackedMsg, &dci_pdu_rel8->tpc_bitmap, end) &&
- pull16(ppReadPackedMsg, &dci_pdu_rel8->transmission_power, end));
-}
-
-static uint8_t unpack_hi_dci0_dci_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_hi_dci0_dci_pdu_rel10_t* dci_pdu_rel10 = (nfapi_hi_dci0_dci_pdu_rel10_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &dci_pdu_rel10->cross_carrier_scheduling_flag, end) &&
- pull8(ppReadPackedMsg, &dci_pdu_rel10->carrier_indicator, end) &&
- pull8(ppReadPackedMsg, &dci_pdu_rel10->size_of_cqi_csi_feild, end) &&
- pull8(ppReadPackedMsg, &dci_pdu_rel10->srs_flag, end) &&
- pull8(ppReadPackedMsg, &dci_pdu_rel10->srs_request, end) &&
- pull8(ppReadPackedMsg, &dci_pdu_rel10->resource_allocation_flag, end) &&
- pull8(ppReadPackedMsg, &dci_pdu_rel10->resource_allocation_type, end) &&
- pull32(ppReadPackedMsg, &dci_pdu_rel10->resource_block_coding, end) &&
- pull8(ppReadPackedMsg, &dci_pdu_rel10->mcs_2, end) &&
- pull8(ppReadPackedMsg, &dci_pdu_rel10->new_data_indication_2, end) &&
- pull8(ppReadPackedMsg, &dci_pdu_rel10->number_of_antenna_ports, end) &&
- pull8(ppReadPackedMsg, &dci_pdu_rel10->tpmi, end) &&
- pull8(ppReadPackedMsg, &dci_pdu_rel10->total_dci_length_including_padding, end) &&
- pull8(ppReadPackedMsg, &dci_pdu_rel10->n_ul_rb, end));
-}
-
-static uint8_t unpack_hi_dci0_dci_pdu_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_hi_dci0_dci_pdu_rel12_t* dci_pdu_rel12 = (nfapi_hi_dci0_dci_pdu_rel12_t*)tlv;
-
- return ( pull8(ppReadPackedMsg, &dci_pdu_rel12->pscch_resource, end) &&
- pull8(ppReadPackedMsg, &dci_pdu_rel12->time_resource_pattern, end));
-}
-
-static uint8_t unpack_hi_dci0_mpdcch_dci_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t* value = (nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &value->mpdcch_narrowband, end) &&
- pull8(ppReadPackedMsg, &value->number_of_prb_pairs, end) &&
- pull8(ppReadPackedMsg, &value->resource_block_assignment, end) &&
- pull8(ppReadPackedMsg, &value->mpdcch_transmission_type, end) &&
- pull8(ppReadPackedMsg, &value->start_symbol, end) &&
- pull8(ppReadPackedMsg, &value->ecce_index, end) &&
- pull8(ppReadPackedMsg, &value->aggreagation_level, end) &&
- pull8(ppReadPackedMsg, &value->rnti_type, end) &&
- pull16(ppReadPackedMsg, &value->rnti, end) &&
- pull8(ppReadPackedMsg, &value->ce_mode, end) &&
- pull16(ppReadPackedMsg, &value->drms_scrambling_init, end) &&
- pull16(ppReadPackedMsg, &value->initial_transmission_sf_io, end) &&
- pull16(ppReadPackedMsg, &value->transmission_power, end) &&
- pull8(ppReadPackedMsg, &value->dci_format, end) &&
- pull8(ppReadPackedMsg, &value->resource_block_start, end) &&
- pull8(ppReadPackedMsg, &value->number_of_resource_blocks, end) &&
- pull8(ppReadPackedMsg, &value->mcs, end) &&
- pull8(ppReadPackedMsg, &value->pusch_repetition_levels, end) &&
- pull8(ppReadPackedMsg, &value->frequency_hopping_flag, end) &&
- pull8(ppReadPackedMsg, &value->new_data_indication, end) &&
- pull8(ppReadPackedMsg, &value->harq_process, end) &&
- pull8(ppReadPackedMsg, &value->redudency_version, end) &&
- pull8(ppReadPackedMsg, &value->tpc, end) &&
- pull8(ppReadPackedMsg, &value->csi_request, end) &&
- pull8(ppReadPackedMsg, &value->ul_inex, end) &&
- pull8(ppReadPackedMsg, &value->dai_presence_flag, end) &&
- pull8(ppReadPackedMsg, &value->dl_assignment_index, end) &&
- pull8(ppReadPackedMsg, &value->srs_request, end) &&
- pull8(ppReadPackedMsg, &value->dci_subframe_repetition_number, end) &&
- pull32(ppReadPackedMsg, &value->tcp_bitmap, end) &&
- pull8(ppReadPackedMsg, &value->total_dci_length_include_padding, end) &&
- pull8(ppReadPackedMsg, &value->number_of_tx_antenna_ports, end) &&
- pullarray16(ppReadPackedMsg, value->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, value->number_of_tx_antenna_ports, end));
-}
-
-static uint8_t unpack_hi_dci0_npdcch_dci_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_hi_dci0_npdcch_dci_pdu_rel13_t* value = (nfapi_hi_dci0_npdcch_dci_pdu_rel13_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &value->ncce_index, end) &&
- pull8(ppReadPackedMsg, &value->aggregation_level, end) &&
- pull8(ppReadPackedMsg, &value->start_symbol, end) &&
- pull16(ppReadPackedMsg, &value->rnti, end) &&
- pull8(ppReadPackedMsg, &value->scrambling_reinitialization_batch_index, end) &&
- pull8(ppReadPackedMsg, &value->nrs_antenna_ports_assumed_by_the_ue, end) &&
- pull8(ppReadPackedMsg, &value->subcarrier_indication, end) &&
- pull8(ppReadPackedMsg, &value->resource_assignment, end) &&
- pull8(ppReadPackedMsg, &value->scheduling_delay, end) &&
- pull8(ppReadPackedMsg, &value->mcs, end) &&
- pull8(ppReadPackedMsg, &value->redudancy_version, end) &&
- pull8(ppReadPackedMsg, &value->repetition_number, end) &&
- pull8(ppReadPackedMsg, &value->new_data_indicator, end) &&
- pull8(ppReadPackedMsg, &value->dci_subframe_repetition_number, end));
-}
-
-static uint8_t unpack_hi_dci0_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_hi_dci0_request_body_t* value = (nfapi_hi_dci0_request_body_t*)tlv;
-
- if(!(pull16(ppReadPackedMsg, &value->sfnsf, end) &&
- pull8(ppReadPackedMsg, &value->number_of_dci, end) &&
- pull8(ppReadPackedMsg, &value->number_of_hi, end)))
- return 0;
-
- uint8_t totalNumPdus = value->number_of_hi + value->number_of_dci;
-
- if(totalNumPdus > NFAPI_HI_DCI0_MAX_PDU)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of dci0 pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, totalNumPdus, NFAPI_HI_DCI0_MAX_PDU);
- return 0;
- }
-
- if(totalNumPdus > 0)
- {
- value->hi_dci0_pdu_list = (nfapi_hi_dci0_request_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_hi_dci0_request_pdu_t) * totalNumPdus, config);
- if(value->hi_dci0_pdu_list == NULL)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate hi dci0 pdu list (count:%d)\n", __FUNCTION__, totalNumPdus);
- return 0;
- }
- }
- else
- {
- value->hi_dci0_pdu_list = 0;
- }
-
- uint8_t i;
- for(i = 0; i < totalNumPdus; ++i)
- {
- nfapi_hi_dci0_request_pdu_t* pdu = &(value->hi_dci0_pdu_list[i]);
-
- if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
- pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
- return 0;
-
- uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
-
- if(packedPduEnd > end)
- {
- // pdu end if past buffer end
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s pdu size to big %d %d\n", __FUNCTION__, packedPduEnd, end);
- return 0;
- }
-
- switch(pdu->pdu_type)
- {
- case NFAPI_HI_DCI0_HI_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_HI_DCI0_REQUEST_HI_PDU_REL8_TAG, &pdu->hi_pdu.hi_pdu_rel8, &unpack_hi_dci0_hi_pdu_rel8_value},
- { NFAPI_HI_DCI0_REQUEST_HI_PDU_REL10_TAG, &pdu->hi_pdu.hi_pdu_rel10, &unpack_hi_dci0_hi_pdu_rel10_value},
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_HI_DCI0_DCI_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG, &pdu->dci_pdu.dci_pdu_rel8, &unpack_hi_dci0_dci_pdu_rel8_value},
- { NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL10_TAG, &pdu->dci_pdu.dci_pdu_rel10, &unpack_hi_dci0_dci_pdu_rel10_value},
- { NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL12_TAG, &pdu->dci_pdu.dci_pdu_rel12, &unpack_hi_dci0_dci_pdu_rel12_value},
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_HI_DCI0_EPDCCH_DCI_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL8_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel8, &unpack_hi_dci0_dci_pdu_rel8_value},
- { NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL10_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel10, &unpack_hi_dci0_dci_pdu_rel10_value},
- { NFAPI_HI_DCI0_REQUEST_EPDCCH_PARAMETERS_REL11_TAG, &pdu->epdcch_dci_pdu.epdcch_parameters_rel11, &unpack_dl_config_epdcch_params_rel11_value},
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_HI_DCI0_MPDCCH_DCI_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_HI_DCI0_REQUEST_MPDCCH_DCI_PDU_REL13_TAG, &pdu->mpdcch_dci_pdu.mpdcch_dci_pdu_rel13, &unpack_hi_dci0_mpdcch_dci_pdu_rel13_value},
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_HI_DCI0_NPDCCH_DCI_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_HI_DCI0_REQUEST_NPDCCH_DCI_PDU_REL13_TAG, &pdu->npdcch_dci_pdu.npdcch_dci_pdu_rel13, &unpack_hi_dci0_npdcch_dci_pdu_rel13_value},
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- default:
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
- }
- break;
- };
- }
-
- return 1;
-}
-//unpack_ul_dci_pdu_list_value
-
-static uint8_t unpack_ul_dci_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg)
-{
- nfapi_nr_ul_dci_request_pdus_t* value = (nfapi_nr_ul_dci_request_pdus_t*)msg;
-
- for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i)
- {
- if(!pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].RNTI, end) &&
- pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingId, end) &&
-
- pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingRNTI, end) &&
- pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].CceIndex, end) &&
- pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].AggregationLevel, end) &&
- pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].beta_PDCCH_1_0, end) &&
-
- pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].powerControlOffsetSS, end) &&
- pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, end) &&
-
- pullarray8(ppReadPackedMsg, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].Payload, DCI_PAYLOAD_BYTE_LEN, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, end));
-
- return 0;
- }
-
- return (pull16(ppReadPackedMsg, &value->PDUType, end) &&
- pull16(ppReadPackedMsg, &value->PDUSize, end) &&
- pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.BWPSize, end) &&
- pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.BWPStart, end) &&
- pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.SubcarrierSpacing, end) &&
- pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.CyclicPrefix, end) &&
-
- pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.StartSymbolIndex, end) &&
- pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.DurationSymbols, end) &&
- pullarray8(ppReadPackedMsg, value->pdcch_pdu.pdcch_pdu_rel15.FreqDomainResource, 6, 6, end) &&
- pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.CceRegMappingType, end) &&
-
- pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.RegBundleSize, end) &&
- pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.InterleaverSize, end) &&
- pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.CoreSetType, end) &&
- pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.ShiftIndex, end) &&
-
- pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.precoderGranularity, end) &&
- pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.numDlDci, end));
-
-}
-
-static uint8_t unpack_ul_dci_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-nfapi_nr_ul_dci_request_t *pNfapiMsg = (nfapi_nr_ul_dci_request_t*)msg;
-
- if (!(pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end) &&
- pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
- pull8(ppReadPackedMsg, &pNfapiMsg->numPdus, end)
- ))
- return 0;
- for(int i=0; i< pNfapiMsg->numPdus; i++)
- {
- if (!unpack_ul_dci_pdu_list_value(ppReadPackedMsg, end, &pNfapiMsg->ul_dci_pdu_list[i]))
- return 0;
- }
-
- return 1;
-
-}
-
-static uint8_t unpack_hi_dci0_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
- nfapi_hi_dci0_request_t *pNfapiMsg = (nfapi_hi_dci0_request_t*)msg;
-
- unpack_p7_tlv_t unpack_fns[] =
- {
- { NFAPI_HI_DCI0_REQUEST_BODY_TAG, &pNfapiMsg->hi_dci0_request_body, &unpack_hi_dci0_request_body_value},
- };
-
- return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
- unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-
-}
-static uint8_t unpack_tx_data_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg)
-{
- nfapi_nr_pdu_t* pNfapiMsg = (nfapi_nr_pdu_t*)msg;
-
- if(!(pull32(ppReadPackedMsg, &pNfapiMsg->num_TLV, end) &&
- pull16(ppReadPackedMsg, &pNfapiMsg->PDU_index, end) &&
- pull16(ppReadPackedMsg, &pNfapiMsg->PDU_length, end)
- ))
- return 0;
-
- uint16_t i = 0;
- uint16_t total_number_of_tlvs = pNfapiMsg->num_TLV;
- for(; i < total_number_of_tlvs; ++i)
- {
-
- if (!(pull16(ppReadPackedMsg, &pNfapiMsg->TLVs[i].length, end) &&
- pull16(ppReadPackedMsg, &pNfapiMsg->TLVs[i].tag, end)))
- return 0;
-
- switch(pNfapiMsg->TLVs[i].tag){
- case 0:
- {
- if(!pullarray32(ppReadPackedMsg, pNfapiMsg->TLVs[i].value.direct, 16384, pNfapiMsg->TLVs[i].length, end))
- return 0;
- break;
-
- }
-
- case 1:
- {
- if(!pullarray32(ppReadPackedMsg, pNfapiMsg->TLVs[i].value.ptr, pNfapiMsg->TLVs[i].length , pNfapiMsg->TLVs[i].length, end))
- return 0;
- break;
-
- }
-
- default:
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid tag value %d \n", pNfapiMsg->TLVs[i].tag );
- break;
- }
-
- }
- }
-
-
- return 1;
-}
-
-static uint8_t unpack_tx_data_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
- nfapi_nr_tx_data_request_t *pNfapiMsg = (nfapi_nr_tx_data_request_t*)msg;
-
- if(!(pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end) &&
- pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
- pull16(ppReadPackedMsg, &pNfapiMsg->Number_of_PDUs, end)))
- return 0;
-
- for(int i=0; i< pNfapiMsg->Number_of_PDUs; i++)
- {
- if (!unpack_tx_data_pdu_list_value(ppReadPackedMsg, end, &pNfapiMsg->pdu_list[i]))
- return 0;
- }
-
- return 1;
-}
-
-static uint8_t unpack_tx_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
- uint8_t proceed = 1;
- nfapi_tx_request_t *pNfapiMsg = (nfapi_tx_request_t*)msg;
-
- if(pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) == 0)
- return 0;
-
- while (((uint8_t*)(*ppReadPackedMsg) < end) && proceed)
- {
- nfapi_tl_t generic_tl;
- if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
- return 0;
-
- switch(generic_tl.tag)
- {
- case NFAPI_TX_REQUEST_BODY_TAG:
- {
- pNfapiMsg->tx_request_body.tl = generic_tl;
-
- if( pull16(ppReadPackedMsg, &pNfapiMsg->tx_request_body.number_of_pdus, end) == 0)
- return 0;
-
- if(pNfapiMsg->tx_request_body.number_of_pdus > NFAPI_TX_MAX_PDU)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of tx pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, pNfapiMsg->tx_request_body.number_of_pdus, NFAPI_TX_MAX_PDU);
- return 0;
- }
-
- if(pNfapiMsg->tx_request_body.number_of_pdus > 0)
- {
- pNfapiMsg->tx_request_body.tx_pdu_list = (nfapi_tx_request_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_tx_request_pdu_t) * pNfapiMsg->tx_request_body.number_of_pdus, config);
- if(pNfapiMsg->tx_request_body.tx_pdu_list == NULL)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate tx pdu list (count:%d)\n", __FUNCTION__, pNfapiMsg->tx_request_body.number_of_pdus);
- return 0;
- }
- }
- else
- {
- pNfapiMsg->tx_request_body.tx_pdu_list = 0;
- }
-
-
- uint16_t i;
- uint16_t totalNumPdus = pNfapiMsg->tx_request_body.number_of_pdus;
- for(i = 0; i < totalNumPdus; ++i)
- {
- nfapi_tx_request_pdu_t* pdu = &(pNfapiMsg->tx_request_body.tx_pdu_list[i]);
- if (pdu) {
- uint16_t length = 0;
- uint16_t index = 0;
-
- if(!(pull16(ppReadPackedMsg, &length, end) &&
- pull16(ppReadPackedMsg, &index, end)))
- return 0;
-
- pdu->pdu_length = length;
- pdu->pdu_index = index;
-
-
- // TODO : May need to rethink this bit
- pdu->num_segments = 1;
- pdu->segments[0].segment_length = pdu->pdu_length;
- pdu->segments[0].segment_data = nfapi_p7_allocate(pdu->pdu_length, config);
-
- if(pdu->segments[0].segment_data)
- {
- if(!pullarray8(ppReadPackedMsg, pdu->segments[0].segment_data, pdu->segments[0].segment_length, pdu->segments[0].segment_length, end))
- return 0;
- if (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
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "unpack_tx_request: Failed to allocate pdu (len:%d) %d/%d %d\n", pdu->pdu_length, totalNumPdus, i, pdu->pdu_index);
- }
- } else {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "NULL pdu\n");
- }
- }
- }
- break;
- default:
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "unpack_tx_request FIXME : Invalid pdu type %d \n", generic_tl.tag );
- }
- break;
- };
- }
-
- return 1;
-}
-
-static uint8_t unpack_ue_release_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
- uint8_t proceed = 1;
- nfapi_ue_release_request_t *pNfapiMsg = (nfapi_ue_release_request_t*)msg;
-
- if(pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) == 0)
- return 0;
-
- while (((uint8_t*)(*ppReadPackedMsg) < end) && proceed)
- {
- nfapi_tl_t generic_tl;
- if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
- return 0;
-
- switch(generic_tl.tag)
- {
- case NFAPI_UE_RELEASE_BODY_TAG:
- {
- pNfapiMsg->ue_release_request_body.tl = generic_tl;
- if( pull16(ppReadPackedMsg, &pNfapiMsg->ue_release_request_body.number_of_TLVs, end) == 0)
- return 0;
-
- if(pNfapiMsg->ue_release_request_body.number_of_TLVs > NFAPI_RELEASE_MAX_RNTI)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of relese rnti's exceed maxium (count:%d max:%d)\n", __FUNCTION__, pNfapiMsg->ue_release_request_body.number_of_TLVs, NFAPI_RELEASE_MAX_RNTI);
- return 0;
- } else {
- uint8_t j;
- uint16_t num = pNfapiMsg->ue_release_request_body.number_of_TLVs;
- for(j = 0; j < num; ++j){
- if(pull16(ppReadPackedMsg, &pNfapiMsg->ue_release_request_body.ue_release_request_TLVs_list[j].rnti, end) == 0){
- return 0;
- }
- }
- }
- }
- break;
- default:
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "unpack_ue_release_request FIXME : Invalid type %d \n", generic_tl.tag );
- }
- break;
- };
- }
-
- return 1;
-}
-
-static uint8_t unpack_harq_indication_tdd_harq_data_bundling(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_harq_indication_tdd_harq_data_bundling_t* value = (nfapi_harq_indication_tdd_harq_data_bundling_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &value->value_0, end) &&
- pull8(ppReadPackedMsg, &value->value_1, end));
-}
-
-static uint8_t unpack_harq_indication_tdd_harq_data_multiplexing(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_harq_indication_tdd_harq_data_multiplexing_t* value = (nfapi_harq_indication_tdd_harq_data_multiplexing_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &value->value_0, end) &&
- pull8(ppReadPackedMsg, &value->value_1, end) &&
- pull8(ppReadPackedMsg, &value->value_2, end) &&
- pull8(ppReadPackedMsg, &value->value_3, end));
-}
-static uint8_t unpack_harq_indication_tdd_harq_data_special_bundling(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_harq_indication_tdd_harq_data_special_bundling_t* value = (nfapi_harq_indication_tdd_harq_data_special_bundling_t*)tlv;
- return ( pull8(ppReadPackedMsg, &value->value_0, end));
-}
-static uint8_t unpack_harq_indication_tdd_harq_data(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_harq_indication_tdd_harq_data_t* value = (nfapi_harq_indication_tdd_harq_data_t*)tlv;
- return (pull8(ppReadPackedMsg, &value->value_0, end));
-}
-
-static uint8_t unpack_harq_indication_tdd_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_harq_indication_tdd_rel8_t* value = (nfapi_harq_indication_tdd_rel8_t*)tlv;
-
- if(!(pull8(ppReadPackedMsg, &value->mode, end) &&
- pull8(ppReadPackedMsg, &value->number_of_ack_nack, end)))
- return 0;
-
- uint8_t result = 0;
- switch(value->mode)
- {
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
- result = unpack_harq_indication_tdd_harq_data_bundling(&value->harq_data.bundling, ppReadPackedMsg, end);
- break;
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
- result = unpack_harq_indication_tdd_harq_data_multiplexing(&value->harq_data.multiplex, ppReadPackedMsg, end);
- break;
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
- result = unpack_harq_indication_tdd_harq_data_special_bundling(&value->harq_data.special_bundling, ppReadPackedMsg, end);
- break;
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
- result = 1;
- break;
- default:
- // TODO add error message
- return 0;
- break;
- }
- return result;
-}
-
-static uint8_t unpack_harq_indication_tdd_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_harq_indication_tdd_rel9_t* value = (nfapi_harq_indication_tdd_rel9_t*)tlv;
-
- if(!(pull8(ppReadPackedMsg, &value->mode, end) &&
- pull8(ppReadPackedMsg, &value->number_of_ack_nack, end)))
- return 0;
-
- if(value->number_of_ack_nack > NFAPI_MAX_NUMBER_ACK_NACK_TDD)
- {
- // TODO : add error message
- return 0;
- }
-
- uint16_t idx = 0;
- for(idx = 0; idx < value->number_of_ack_nack; ++idx)
- {
- uint8_t result = 0;
- switch(value->mode)
- {
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
- result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].bundling, ppReadPackedMsg, end);
- break;
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
- result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].multiplex, ppReadPackedMsg, end);
- break;
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
- result = unpack_harq_indication_tdd_harq_data_special_bundling(&value->harq_data[idx].special_bundling, ppReadPackedMsg, end);
- break;
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
- result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].channel_selection, ppReadPackedMsg, end);
- break;
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
- result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_3, ppReadPackedMsg, end);
- break;
- default:
- // TODO add error message
- return 0;
- break;
- }
-
- if(result == 0)
- return 0;
- }
- return 1;
-}
-
-static uint8_t unpack_harq_indication_tdd_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_harq_indication_tdd_rel13_t* value = (nfapi_harq_indication_tdd_rel13_t*)tlv;
-
- if(!(pull8(ppReadPackedMsg, &value->mode, end) &&
- pull16(ppReadPackedMsg, &value->number_of_ack_nack, end)))
- return 0;
-
- if(value->number_of_ack_nack > NFAPI_MAX_NUMBER_ACK_NACK_TDD)
- {
- // TODO : add error message
- return 0;
- }
-
- uint16_t idx = 0;
- for(idx = 0; idx < value->number_of_ack_nack; ++idx)
- {
- uint8_t result = 0;
- switch(value->mode)
- {
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
- result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].bundling, ppReadPackedMsg, end);
- break;
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
- result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].multiplex, ppReadPackedMsg, end);
- break;
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
- result = unpack_harq_indication_tdd_harq_data_special_bundling(&value->harq_data[idx].special_bundling, ppReadPackedMsg, end);
- break;
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
- result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].channel_selection, ppReadPackedMsg, end);
- break;
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
- result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_3, ppReadPackedMsg, end);
- break;
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_4:
- result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_4, ppReadPackedMsg, end);
- break;
- case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_5:
- result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_5, ppReadPackedMsg, end);
- break;
- default:
- // TODO add error message
- return 0;
- break;
- }
-
- if(result == 0)
- return 0;
- }
- return 1;
-}
-
-static uint8_t unpack_harq_indication_fdd_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_harq_indication_fdd_rel8_t* value = (nfapi_harq_indication_fdd_rel8_t*)tlv;
- return (pull8(ppReadPackedMsg, &value->harq_tb1, end) &&
- pull8(ppReadPackedMsg, &value->harq_tb2, end));
-}
-
-static uint8_t unpack_harq_indication_fdd_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_harq_indication_fdd_rel9_t* value = (nfapi_harq_indication_fdd_rel9_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &value->mode, end) &&
- pull8(ppReadPackedMsg, &value->number_of_ack_nack, end) &&
- pullarray8(ppReadPackedMsg, value->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL9_MAX, value->number_of_ack_nack, end));
-}
-
-static uint8_t unpack_harq_indication_fdd_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_harq_indication_fdd_rel13_t* value = (nfapi_harq_indication_fdd_rel13_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &value->mode, end) &&
- pull16(ppReadPackedMsg, &value->number_of_ack_nack, end) &&
- pullarray8(ppReadPackedMsg, value->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL13_MAX, value->number_of_ack_nack, end));
-}
-
-static uint8_t unpack_ul_cqi_information_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_ul_cqi_information_t* value = (nfapi_ul_cqi_information_t*)tlv;
-
- return (pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
- pull8(ppReadPackedMsg, &value->channel, end));
-}
-
-
-
-static uint8_t unpack_harq_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_harq_indication_body_t* value = (nfapi_harq_indication_body_t*)tlv;
- uint8_t* harqBodyEnd = *ppReadPackedMsg + value->tl.length;
-
- if(harqBodyEnd > end)
- return 0;
-
- if(pull16(ppReadPackedMsg, &value->number_of_harqs, end) == 0)
- return 0;
-
- if(value->number_of_harqs > NFAPI_HARQ_IND_MAX_PDU)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of harq ind pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_harqs, NFAPI_HARQ_IND_MAX_PDU);
- return 0;
- }
-
- value->harq_pdu_list = (nfapi_harq_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_harq_indication_pdu_t) * value->number_of_harqs, config);
- if(value->harq_pdu_list == NULL)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate harq ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_harqs);
- return 0;
- }
-
- uint8_t i = 0;
- for(i = 0; i < value->number_of_harqs; ++i)
- {
- nfapi_harq_indication_pdu_t* pdu = &(value->harq_pdu_list[i]);
- if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
- return 0;
-
- uint8_t* harqPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
-
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
- { NFAPI_HARQ_INDICATION_TDD_REL8_TAG, &pdu->harq_indication_tdd_rel8, &unpack_harq_indication_tdd_rel8_value},
- { NFAPI_HARQ_INDICATION_TDD_REL9_TAG, &pdu->harq_indication_tdd_rel9, &unpack_harq_indication_tdd_rel9_value},
- { NFAPI_HARQ_INDICATION_TDD_REL13_TAG, &pdu->harq_indication_tdd_rel13, &unpack_harq_indication_tdd_rel13_value},
- { NFAPI_HARQ_INDICATION_FDD_REL8_TAG, &pdu->harq_indication_fdd_rel8, &unpack_harq_indication_fdd_rel8_value},
- { NFAPI_HARQ_INDICATION_FDD_REL9_TAG, &pdu->harq_indication_fdd_rel9, &unpack_harq_indication_fdd_rel9_value},
- { NFAPI_HARQ_INDICATION_FDD_REL13_TAG, &pdu->harq_indication_fdd_rel13, &unpack_harq_indication_fdd_rel13_value},
- { NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, &unpack_ul_cqi_information_value}
- };
-
- if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, harqPduInstanceEnd, 0, 0) == 0)
- return 0;
-
- }
-
- return 1;
-}
-
-static uint8_t unpack_harq_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
- nfapi_harq_indication_t *pNfapiMsg = (nfapi_harq_indication_t*)msg;
-
- unpack_p7_tlv_t unpack_fns[] =
- {
- { NFAPI_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->harq_indication_body, &unpack_harq_indication_body_value},
- };
-
- return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
- unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_crc_indication_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_crc_indication_rel8_t* crc_pdu_rel8 = (nfapi_crc_indication_rel8_t*)tlv;
- return ( pull8(ppReadPackedMsg, &crc_pdu_rel8->crc_flag, end) );
-}
-
-static uint8_t unpack_crc_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_crc_indication_body_t* value = (nfapi_crc_indication_body_t*)tlv;
- uint8_t* crcBodyEnd = *ppReadPackedMsg + value->tl.length;
-
- if(crcBodyEnd > end)
- return 0;
-
- if(pull16(ppReadPackedMsg, &value->number_of_crcs, end) == 0)
- return 0;
-
- if(value->number_of_crcs > NFAPI_CRC_IND_MAX_PDU)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of crc ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_crcs, NFAPI_CRC_IND_MAX_PDU);
- return 0;
- }
-
- if(value->number_of_crcs > 0)
- {
- value->crc_pdu_list = (nfapi_crc_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_crc_indication_pdu_t) * value->number_of_crcs, config);
- if(value->crc_pdu_list == NULL)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate crc ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_crcs);
- return 0;
- }
- }
- else
- {
- value->crc_pdu_list = 0;
- }
-
-
- uint8_t i = 0;
- for(i = 0; i < value->number_of_crcs; ++i)
- {
- nfapi_crc_indication_pdu_t* pdu = &(value->crc_pdu_list[i]);
-
- if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
- return 0;
-
- uint8_t* crcPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
-
-
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
- { NFAPI_CRC_INDICATION_REL8_TAG, &pdu->crc_indication_rel8, unpack_crc_indication_rel8_value },
- };
-
- if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, crcPduInstanceEnd, 0, 0) == 0)
- return 0;
- }
-
- return 1;
-}
-
-static uint8_t unpack_crc_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
- nfapi_crc_indication_t *pNfapiMsg = (nfapi_crc_indication_t*)msg;
-
- unpack_p7_tlv_t unpack_fns[] =
- {
- { NFAPI_CRC_INDICATION_BODY_TAG, &pNfapiMsg->crc_indication_body, &unpack_crc_indication_body_value},
- };
-
- return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
- unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_rx_indication_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_rx_indication_rel8_t* value = (nfapi_rx_indication_rel8_t*)tlv;
-
- return (pull16(ppReadPackedMsg, &value->length, end) &&
- pull16(ppReadPackedMsg, &value->offset, end) &&
- pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
- pull16(ppReadPackedMsg, &value->timing_advance, end));
-}
-static uint8_t unpack_rx_indication_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_rx_indication_rel9_t* value = (nfapi_rx_indication_rel9_t*)tlv;
- return (pull16(ppReadPackedMsg, &value->timing_advance_r9, end));
-}
-
-static uint8_t unpack_rx_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_rx_indication_body_t* value = (nfapi_rx_indication_body_t*)tlv;
-
- // the rxBodyEnd points to the end of the cqi PDU's
- uint8_t* rxBodyEnd = *ppReadPackedMsg + value->tl.length;
- uint8_t* rxPduEnd = rxBodyEnd;
-
- uint8_t* numberOfPdusAddress = *ppReadPackedMsg;
-
- if(rxBodyEnd > end)
- {
- // pdu end is past buffer end
- return 0;
- }
-
- if(pull16(ppReadPackedMsg, &value->number_of_pdus, end) == 0)
- return 0;
-
- if(value->number_of_pdus > NFAPI_RX_IND_MAX_PDU)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of rx ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_RX_IND_MAX_PDU);
- return 0;
- }
-
- if(value->number_of_pdus > 0)
- {
- value->rx_pdu_list = (nfapi_rx_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_rx_indication_pdu_t) * value->number_of_pdus, config);
- if(value->rx_pdu_list == NULL)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate rx ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
- return 0;
- }
- }
- else
- {
- value->rx_pdu_list = 0;
- }
-
- uint8_t i = 0;
- nfapi_rx_indication_pdu_t* pdu = 0;
- while((uint8_t*)(*ppReadPackedMsg) < rxBodyEnd && (uint8_t*)(*ppReadPackedMsg) < rxPduEnd)
- {
- nfapi_tl_t generic_tl;
- if( unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
- return 0;
-
- switch(generic_tl.tag)
- {
- case NFAPI_RX_UE_INFORMATION_TAG:
- {
- pdu = &(value->rx_pdu_list[i++]);
- pdu->rx_ue_information.tl = generic_tl;
- if(unpack_rx_ue_information_value(&pdu->rx_ue_information, ppReadPackedMsg, end) == 0)
- return 0;
- }
- break;
- case NFAPI_RX_INDICATION_REL8_TAG:
- {
- if(pdu != 0)
- {
- pdu->rx_indication_rel8.tl = generic_tl;
- if(unpack_rx_indication_rel8_value(&pdu->rx_indication_rel8, ppReadPackedMsg, end) == 0)
- return 0;
-
- if(pdu->rx_indication_rel8.offset > 0)
- {
- // Need to check that the data is within the tlv
- if(numberOfPdusAddress + pdu->rx_indication_rel8.offset + pdu->rx_indication_rel8.length <= rxBodyEnd)
- {
- // If this the first pdu set the rxPduEnd
- if(numberOfPdusAddress + pdu->rx_indication_rel8.offset < rxPduEnd)
- {
- rxPduEnd = numberOfPdusAddress + pdu->rx_indication_rel8.offset;
-
- if(rxPduEnd > end)
- {
- // pdu end is past buffer end
- return 0;
- }
- }
- }
- else
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME: the rx data is outside of the tlv\n");
- }
- }
- }
- }
- break;
- case NFAPI_RX_INDICATION_REL9_TAG:
- {
- if(pdu != 0)
- {
- pdu->rx_indication_rel9.tl = generic_tl;
- if(unpack_rx_indication_rel9_value(&pdu->rx_indication_rel9, ppReadPackedMsg, end) == 0)
- return 0;
- }
- }
- break;
- default:
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "RX_ULSCH.indication Invalid pdu type %d \n", generic_tl.tag );
- }
- break;
- }
- }
-
- uint8_t idx = 0;
- for(idx = 0; idx < value->number_of_pdus; ++idx)
- {
- if(value->rx_pdu_list[idx].rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG)
- {
- uint32_t length = value->rx_pdu_list[idx].rx_indication_rel8.length;
- value->rx_pdu_list[idx].data = nfapi_p7_allocate(length, config);
- if(pullarray8(ppReadPackedMsg, value->rx_pdu_list[idx].data, length, length, end) == 0)
- {
- return 0;
- }
- }
- }
-
- return 1;
-}
-
-static uint8_t unpack_rx_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
- nfapi_rx_indication_t *pNfapiMsg = (nfapi_rx_indication_t*)msg;
-
- unpack_p7_tlv_t unpack_fns[] =
- {
- { NFAPI_RX_INDICATION_BODY_TAG, &pNfapiMsg->rx_indication_body, &unpack_rx_indication_body_value},
- };
-
- return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
- unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_preamble_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_preamble_pdu_rel8_t* preamble_pdu_rel8 = (nfapi_preamble_pdu_rel8_t*)tlv;
-
- return (pull16(ppReadPackedMsg, &preamble_pdu_rel8->rnti, end) &&
- pull8(ppReadPackedMsg, &preamble_pdu_rel8->preamble, end) &&
- pull16(ppReadPackedMsg, &preamble_pdu_rel8->timing_advance, end));
-}
-
-static uint8_t unpack_preamble_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_preamble_pdu_rel9_t* preamble_pdu_rel9 = (nfapi_preamble_pdu_rel9_t*)tlv;
- return pull16(ppReadPackedMsg, &preamble_pdu_rel9->timing_advance_r9, end);
-}
-
-static uint8_t unpack_preamble_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_preamble_pdu_rel13_t* preamble_pdu_rel13 = (nfapi_preamble_pdu_rel13_t*)tlv;
- return pull8(ppReadPackedMsg, &preamble_pdu_rel13->rach_resource_type, end);
-}
-
-static uint8_t unpack_rach_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_rach_indication_body_t* value = (nfapi_rach_indication_body_t*)tlv;
- uint8_t* rachBodyEnd = *ppReadPackedMsg + value->tl.length;
-
- if(rachBodyEnd > end)
- return 0;
-
- if(pull16(ppReadPackedMsg, &value->number_of_preambles, end) == 0)
- return 0;
-
- if(value->number_of_preambles > NFAPI_PREAMBLE_MAX_PDU)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of preamble du's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_preambles, NFAPI_PREAMBLE_MAX_PDU);
- return 0;
- }
-
- if(value->number_of_preambles > 0)
- {
- value->preamble_list = (nfapi_preamble_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_preamble_pdu_t) * value->number_of_preambles, config);
- if(value->preamble_list == NULL)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate preamble pdu list (count:%d)\n", __FUNCTION__, value->number_of_preambles);
- return 0;
- }
- }
- else
- {
- value->preamble_list = 0;
- }
-
-
- uint8_t i = 0;
- for(i = 0; i < value->number_of_preambles; ++i)
- {
- nfapi_preamble_pdu_t* pdu = &(value->preamble_list[i]);
-
- if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
- return 0;
-
- uint8_t* preamblePduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
-
-
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_PREAMBLE_REL8_TAG, &pdu->preamble_rel8, unpack_preamble_pdu_rel8_value },
- { NFAPI_PREAMBLE_REL9_TAG, &pdu->preamble_rel9, unpack_preamble_pdu_rel9_value },
- { NFAPI_PREAMBLE_REL13_TAG, &pdu->preamble_rel13, unpack_preamble_pdu_rel13_value },
- };
-
- if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, preamblePduInstanceEnd, 0, 0) == 0)
- return 0;
- }
- return 1;
-}
-
-static uint8_t unpack_rach_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
- nfapi_rach_indication_t *pNfapiMsg = (nfapi_rach_indication_t*)msg;
-
- unpack_p7_tlv_t unpack_fns[] =
- {
- { NFAPI_RACH_INDICATION_BODY_TAG, &pNfapiMsg->rach_indication_body, &unpack_rach_indication_body_value},
- };
-
- return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
- unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_srs_indication_fdd_rel8_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_srs_indication_fdd_rel8_t* srs_pdu_fdd_rel8 = (nfapi_srs_indication_fdd_rel8_t*)tlv;
-
- if(!(pull16(ppReadPackedMsg, &srs_pdu_fdd_rel8->doppler_estimation, end) &&
- pull16(ppReadPackedMsg, &srs_pdu_fdd_rel8->timing_advance, end) &&
- pull8(ppReadPackedMsg, &srs_pdu_fdd_rel8->number_of_resource_blocks, end) &&
- pull8(ppReadPackedMsg, &srs_pdu_fdd_rel8->rb_start, end) &&
- pullarray8(ppReadPackedMsg, srs_pdu_fdd_rel8->snr, NFAPI_NUM_RB_MAX, srs_pdu_fdd_rel8->number_of_resource_blocks, end)))
- return 0;
- return 1;
-}
-
-static uint8_t unpack_srs_indication_fdd_rel9_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_srs_indication_fdd_rel9_t* srs_pdu_fdd_rel9 = (nfapi_srs_indication_fdd_rel9_t*)tlv;
- return (pull16(ppReadPackedMsg, &srs_pdu_fdd_rel9->timing_advance_r9, end));
-}
-
-static uint8_t unpack_srs_indication_tdd_rel10_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_srs_indication_ttd_rel10_t* srs_pdu_tdd_rel10 = (nfapi_srs_indication_ttd_rel10_t*)tlv;
- return (pull8(ppReadPackedMsg, &srs_pdu_tdd_rel10->uppts_symbol, end));
-}
-
-static uint8_t unpack_srs_indication_fdd_rel11_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_srs_indication_fdd_rel11_t* srs_pdu_fdd_rel11 = (nfapi_srs_indication_fdd_rel11_t*)tlv;
- return ( pull16(ppReadPackedMsg, &srs_pdu_fdd_rel11->ul_rtoa, end));
-}
-
-static uint8_t unpack_tdd_channel_measurement_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_tdd_channel_measurement_t* value = (nfapi_tdd_channel_measurement_t*)tlv;
-
- if(!(pull8(ppReadPackedMsg, &value->num_prb_per_subband, end) &&
- pull8(ppReadPackedMsg, &value->number_of_subbands, end) &&
- pull8(ppReadPackedMsg, &value->num_atennas, end)))
- return 0;
-
- if(value->number_of_subbands > NFAPI_MAX_NUM_SUBBANDS)
- {
- // todo : add error
- return 0;
- }
-
- if(value->num_atennas > NFAPI_MAX_NUM_PHYSICAL_ANTENNAS)
- {
- // todo : add error
- return 0;
- }
-
- uint8_t idx = 0;
- for(idx = 0; idx < value->number_of_subbands; ++idx)
- {
- if(!(pull8(ppReadPackedMsg, &value->subands[idx].subband_index, end) &&
- pullarray16(ppReadPackedMsg, value->subands[idx].channel, NFAPI_MAX_NUM_PHYSICAL_ANTENNAS, value->num_atennas, end)))
- return 0;
- }
-
- return 1;
-}
-
-
-static uint8_t unpack_srs_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_srs_indication_body_t* value = (nfapi_srs_indication_body_t*)tlv;
- uint8_t* srsBodyEnd = *ppReadPackedMsg + value->tl.length;
-
- if(srsBodyEnd > end)
- return 0;
-
- if(pull8(ppReadPackedMsg, &value->number_of_ues, end) == 0)
- return 0;
-
- if(value->number_of_ues > NFAPI_SRS_IND_MAX_PDU)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of srs ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_ues, NFAPI_SRS_IND_MAX_PDU);
- return 0;
- }
-
- if(value->number_of_ues > 0)
- {
- value->srs_pdu_list = (nfapi_srs_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_srs_indication_pdu_t) * value->number_of_ues, config);
- if(value->srs_pdu_list == NULL)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate srs ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_ues);
- return 0;
- }
- }
- else
- {
- value->srs_pdu_list = 0;
- }
-
-
-
- uint8_t i = 0;
- for(i = 0; i < value->number_of_ues; ++i)
- {
- nfapi_srs_indication_pdu_t* pdu = &(value->srs_pdu_list[i]);
-
-
- if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
- return 0;
-
- uint8_t* srsPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
-
-
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
- { NFAPI_SRS_INDICATION_FDD_REL8_TAG, &pdu->srs_indication_fdd_rel8, unpack_srs_indication_fdd_rel8_value},
- { NFAPI_SRS_INDICATION_FDD_REL9_TAG, &pdu->srs_indication_fdd_rel9, unpack_srs_indication_fdd_rel9_value},
- { NFAPI_SRS_INDICATION_TDD_REL10_TAG, &pdu->srs_indication_tdd_rel10, unpack_srs_indication_tdd_rel10_value},
- { NFAPI_SRS_INDICATION_FDD_REL11_TAG, &pdu->srs_indication_fdd_rel11, unpack_srs_indication_fdd_rel11_value},
- { NFAPI_TDD_CHANNEL_MEASUREMENT_TAG, &pdu->tdd_channel_measurement, unpack_tdd_channel_measurement_value},
- };
-
- if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, srsPduInstanceEnd, 0, 0) == 0)
- return 0;
- }
- return 1;
-}
-
-static uint8_t unpack_srs_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
- nfapi_srs_indication_t *pNfapiMsg = (nfapi_srs_indication_t*)msg;
-
- unpack_p7_tlv_t unpack_fns[] =
- {
- { NFAPI_SRS_INDICATION_BODY_TAG, &pNfapiMsg->srs_indication_body, &unpack_srs_indication_body_value},
- };
-
- return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
- unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-
-static uint8_t unpack_sr_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_sr_indication_body_t* value = (nfapi_sr_indication_body_t*)tlv;
- uint8_t* srBodyEnd = *ppReadPackedMsg + value->tl.length;
-
- if(srBodyEnd > end)
- return 0;
-
- if(pull16(ppReadPackedMsg, &value->number_of_srs, end) == 0)
- return 0;
-
- if(value->number_of_srs > NFAPI_SR_IND_MAX_PDU)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of sr ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_srs, NFAPI_SR_IND_MAX_PDU);
- return 0;
- }
-
- if(value->number_of_srs > 0)
- {
- value->sr_pdu_list = (nfapi_sr_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_sr_indication_pdu_t) * value->number_of_srs, config);
- if(value->sr_pdu_list == NULL)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate sr ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_srs);
- return 0;
- }
- }
- else
- {
- value->sr_pdu_list = 0;
- }
-
- uint8_t i = 0;
- for(i = 0; i < value->number_of_srs; ++i)
- {
- nfapi_sr_indication_pdu_t* pdu = &(value->sr_pdu_list[i]);
-
- if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
- return 0;
-
- uint8_t* srPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
-
-
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
- { NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, unpack_ul_cqi_information_value },
- };
-
- if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, srPduInstanceEnd, 0, 0) == 0)
- return 0;
- }
-
- return 1;
-
-}
-
-static int unpack_sr_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
- nfapi_sr_indication_t *pNfapiMsg = (nfapi_sr_indication_t*)msg;
-
- unpack_p7_tlv_t unpack_fns[] =
- {
- { NFAPI_SR_INDICATION_BODY_TAG, &pNfapiMsg->sr_indication_body, &unpack_sr_indication_body_value},
- };
-
- return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
- unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-static uint8_t unpack_cqi_indication_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_cqi_indication_rel8_t* cqi_pdu_rel8 = (nfapi_cqi_indication_rel8_t*)tlv;
-
- return (pull16(ppReadPackedMsg, &cqi_pdu_rel8->length, end) &&
- pull16(ppReadPackedMsg, &cqi_pdu_rel8->data_offset, end) &&
- pull8(ppReadPackedMsg, &cqi_pdu_rel8->ul_cqi, end) &&
- pull8(ppReadPackedMsg, &cqi_pdu_rel8->ri, end) &&
- pull16(ppReadPackedMsg, &cqi_pdu_rel8->timing_advance, end));
-
-}
-
-static uint8_t unpack_cqi_indication_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_cqi_indication_rel9_t* cqi_pdu_rel9 = (nfapi_cqi_indication_rel9_t*)tlv;
-
- if(!(pull16(ppReadPackedMsg, &cqi_pdu_rel9->length, end) &&
- pull16(ppReadPackedMsg, &cqi_pdu_rel9->data_offset, end) &&
- pull8(ppReadPackedMsg, &cqi_pdu_rel9->ul_cqi, end) &&
- pull8(ppReadPackedMsg, &cqi_pdu_rel9->number_of_cc_reported, end)))
- return 0;
-
- if(cqi_pdu_rel9->number_of_cc_reported > NFAPI_CC_MAX)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : out of bound array\n");
- return 0;
- }
-
- if(!(pullarray8(ppReadPackedMsg, cqi_pdu_rel9->ri, NFAPI_CC_MAX, cqi_pdu_rel9->number_of_cc_reported, end) &&
- pull16(ppReadPackedMsg, &cqi_pdu_rel9->timing_advance, end) &&
- pull16(ppReadPackedMsg, &cqi_pdu_rel9->timing_advance_r9, end)))
- return 0;
-
- return 1;
-}
-
-static uint8_t unpack_cqi_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_cqi_indication_body_t* value = (nfapi_cqi_indication_body_t*)tlv;
-
- // the cqiBodyEnd points to the end of the cqi PDU's
- uint8_t* cqiBodyEnd = *ppReadPackedMsg + value->tl.length;
-
- //uint8_t* cqiPduEnd = cqiBodyEnd;
- //uint8_t* numberOfPdusAddress = *ppReadPackedMsg;
-
- if(cqiBodyEnd > end)
- return 0;
-
- if(pull16(ppReadPackedMsg, &value->number_of_cqis, end) == 0)
- return 0;
-
- if(value->number_of_cqis > NFAPI_CQI_IND_MAX_PDU)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of cqi ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_cqis, NFAPI_CQI_IND_MAX_PDU);
- return -1;
- }
-
- if(value->number_of_cqis > 0)
- {
- value->cqi_pdu_list = (nfapi_cqi_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_cqi_indication_pdu_t) * value->number_of_cqis, config);
- if(value->cqi_pdu_list == NULL)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate cqi ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_cqis);
- return 0;
- }
- }
- else
- {
- value->cqi_pdu_list = 0;
- }
-
- if(value->number_of_cqis > 0)
- {
- value->cqi_raw_pdu_list = (nfapi_cqi_indication_raw_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_cqi_indication_raw_pdu_t) * value->number_of_cqis, config);
- if(value->cqi_raw_pdu_list == NULL)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate raw cqi ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_cqis);
- return 0;
- }
- }
- else
- {
- value->cqi_raw_pdu_list = 0;
- }
-
- uint8_t i = 0;
- for(i = 0; i < value->number_of_cqis; ++i)
- {
- nfapi_cqi_indication_pdu_t* pdu = &(value->cqi_pdu_list[i]);
- memset(pdu, 0, sizeof(nfapi_cqi_indication_pdu_t));
-
- if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
- return 0;
-
- uint8_t* cqiPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
-
-
- while((uint8_t*)(*ppReadPackedMsg) < cqiPduInstanceEnd)
- {
- nfapi_tl_t generic_tl;
- if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
- return 0;
-
- switch(generic_tl.tag)
- {
- case NFAPI_RX_UE_INFORMATION_TAG:
- pdu->rx_ue_information.tl = generic_tl;
- if(unpack_rx_ue_information_value(&pdu->rx_ue_information, ppReadPackedMsg, end) == 0)
- return 0;
- break;
- case NFAPI_CQI_INDICATION_REL8_TAG:
- pdu->cqi_indication_rel8.tl = generic_tl;
- if(unpack_cqi_indication_rel8_value(&pdu->cqi_indication_rel8, ppReadPackedMsg, end) == 0)
- return 0;
-
- break;
- case NFAPI_CQI_INDICATION_REL9_TAG:
- pdu->cqi_indication_rel9.tl = generic_tl;
- if(unpack_cqi_indication_rel9_value(&pdu->cqi_indication_rel9, ppReadPackedMsg, end) == 0)
- return 0;
-
- break;
- case NFAPI_UL_CQI_INFORMATION_TAG:
- pdu->ul_cqi_information.tl = generic_tl;
- if(unpack_ul_cqi_information_value(&pdu->ul_cqi_information, ppReadPackedMsg, end) == 0)
- return 0;
- break;
- default:
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "RX_CQI.indication Invalid pdu type %d \n", generic_tl.tag );
- }
- break;
-
- };
- }
- }
-
- uint8_t idx = 0;
- for(idx = 0; idx < value->number_of_cqis; ++idx)
- {
- if(value->cqi_pdu_list[idx].cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG)
- {
- if(pullarray8(ppReadPackedMsg, &(value->cqi_raw_pdu_list[idx].pdu[0]), NFAPI_CQI_RAW_MAX_LEN, value->cqi_pdu_list[idx].cqi_indication_rel8.length, end) == 0)
- return 0;
- }
- else if(value->cqi_pdu_list[idx].cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG)
- {
- if(pullarray8(ppReadPackedMsg, &(value->cqi_raw_pdu_list[idx].pdu[0]), NFAPI_CQI_RAW_MAX_LEN, value->cqi_pdu_list[idx].cqi_indication_rel9.length, end) == 0)
- return 0;
- }
- }
-
-
- return 1;
-
-}
-
-static uint8_t unpack_cqi_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
- nfapi_cqi_indication_t *pNfapiMsg = (nfapi_cqi_indication_t*)msg;
-
- unpack_p7_tlv_t unpack_fns[] =
- {
- { NFAPI_CQI_INDICATION_BODY_TAG, &pNfapiMsg->cqi_indication_body, &unpack_cqi_indication_body_value},
- };
-
- return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
- unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-static uint8_t unpack_lbt_pdsch_req_pdu_rel13_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_lbt_pdsch_req_pdu_rel13_t* value = (nfapi_lbt_pdsch_req_pdu_rel13_t*)tlv;
-
- return (pull32(ppReadPackedMsg, &value->handle, end) &&
- pull32(ppReadPackedMsg, &value->mp_cca, end) &&
- pull32(ppReadPackedMsg, &value->n_cca, end) &&
- pull32(ppReadPackedMsg, &value->offset, end) &&
- pull32(ppReadPackedMsg, &value->lte_txop_sf, end) &&
- pull16(ppReadPackedMsg, &value->txop_sfn_sf_end, end) &&
- pull32(ppReadPackedMsg, &value->lbt_mode, end));
-}
-
-static uint8_t unpack_lbt_drs_req_pdu_rel13_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_lbt_drs_req_pdu_rel13_t* value = (nfapi_lbt_drs_req_pdu_rel13_t*)tlv;
-
- return (pull32(ppReadPackedMsg, &value->handle, end) &&
- pull32(ppReadPackedMsg, &value->offset, end) &&
- pull16(ppReadPackedMsg, &value->sfn_sf_end, end) &&
- pull32(ppReadPackedMsg, &value->lbt_mode, end));
-}
-
-
-static uint8_t unpack_lbt_config_request_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_lbt_dl_config_request_body_t* value = (nfapi_lbt_dl_config_request_body_t*)tlv;
-
- if(pull16(ppReadPackedMsg, &value->number_of_pdus, end) == 0)
- return 0;
-
- if(value->number_of_pdus > NFAPI_LBT_DL_CONFIG_REQ_MAX_PDU)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of lbt dl config pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_LBT_DL_CONFIG_REQ_MAX_PDU);
- return 0;
- }
-
- if(value->number_of_pdus)
- {
- value->lbt_dl_config_req_pdu_list = (nfapi_lbt_dl_config_request_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_lbt_dl_config_request_pdu_t) * value->number_of_pdus, config);
- if(value->lbt_dl_config_req_pdu_list == NULL)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate lbt dl config pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
- return 0;
- }
- }
- else
- {
- value->lbt_dl_config_req_pdu_list = 0;
- }
-
-
- uint16_t i;
- uint16_t total_number_of_pdus = value->number_of_pdus;
- for(i = 0; i < total_number_of_pdus; ++i)
- {
- nfapi_lbt_dl_config_request_pdu_t* pdu = &(value->lbt_dl_config_req_pdu_list[i]);
-
- if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
- pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
- return 0;
-
- uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
-
- if(packedPduEnd > end)
- return 0;
-
- switch(pdu->pdu_type)
- {
- case NFAPI_LBT_DL_CONFIG_REQUEST_PDSCH_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_LBT_PDSCH_REQ_PDU_REL13_TAG, &pdu->lbt_pdsch_req_pdu.lbt_pdsch_req_pdu_rel13, &unpack_lbt_pdsch_req_pdu_rel13_value},
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_LBT_DL_CONFIG_REQUEST_DRS_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_LBT_DRS_REQ_PDU_REL13_TAG, &pdu->lbt_drs_req_pdu.lbt_drs_req_pdu_rel13, &unpack_lbt_drs_req_pdu_rel13_value},
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- default:
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL_CONFIG.request body invalid pdu type %d\n", pdu->pdu_type);
- return 0;
- }
- }
-
- return 1;
-}
-static uint8_t unpack_lbt_dl_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
- nfapi_lbt_dl_config_request_t *pNfapiMsg = (nfapi_lbt_dl_config_request_t*)msg;
-
- unpack_p7_tlv_t unpack_fns[] =
- {
- { NFAPI_LBT_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->lbt_dl_config_request_body, &unpack_lbt_config_request_body_value},
- };
-
- return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
- unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_lbt_pdsch_rsp_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_lbt_pdsch_rsp_pdu_rel13_t* value = (nfapi_lbt_pdsch_rsp_pdu_rel13_t*)tlv;
-
- return (pull32(ppReadPackedMsg, &value->handle, end) &&
- pull32(ppReadPackedMsg, &value->result, end) &&
- pull32(ppReadPackedMsg, &value->lte_txop_symbols, end) &&
- pull32(ppReadPackedMsg, &value->initial_partial_sf, end));
-
-}
-static uint8_t unpack_lbt_drs_rsp_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_lbt_drs_rsp_pdu_rel13_t* value = (nfapi_lbt_drs_rsp_pdu_rel13_t*)tlv;
-
- return (pull32(ppReadPackedMsg, &value->handle, end) &&
- pull32(ppReadPackedMsg, &value->result, end));
-}
-
-static uint8_t unpack_lbt_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_lbt_dl_indication_body_t* value = (nfapi_lbt_dl_indication_body_t*)tlv;
-
- if(pull16(ppReadPackedMsg, &value->number_of_pdus, end) == 0)
- return 0;
-
- if(value->number_of_pdus > NFAPI_LBT_IND_MAX_PDU)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of lbt dl ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_LBT_IND_MAX_PDU);
- return 0;
- }
-
- if(value->number_of_pdus > 0)
- {
- value->lbt_indication_pdu_list = (nfapi_lbt_dl_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_lbt_dl_indication_pdu_t) * value->number_of_pdus, config);
- if(value->lbt_indication_pdu_list == NULL)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate lbt dl ind config pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
- return 0;
- }
- }
- else
- {
- value->lbt_indication_pdu_list = 0;
- }
-
- uint16_t i;
- uint16_t total_number_of_pdus = value->number_of_pdus;
- for(i = 0; i < total_number_of_pdus; ++i)
- {
- nfapi_lbt_dl_indication_pdu_t* pdu = &(value->lbt_indication_pdu_list[i]);
-
- if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
- pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
- return 0;
-
- uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
-
- if(packedPduEnd > end)
- return 0;
-
- switch(pdu->pdu_type)
- {
- case NFAPI_LBT_DL_RSP_PDSCH_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_LBT_PDSCH_RSP_PDU_REL13_TAG, &pdu->lbt_pdsch_rsp_pdu.lbt_pdsch_rsp_pdu_rel13, &unpack_lbt_pdsch_rsp_pdu_rel13_value},
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- case NFAPI_LBT_DL_RSP_DRS_PDU_TYPE:
- {
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_LBT_DRS_RSP_PDU_REL13_TAG, &pdu->lbt_drs_rsp_pdu.lbt_drs_rsp_pdu_rel13, &unpack_lbt_drs_rsp_pdu_rel13_value},
- };
-
- unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
- }
- break;
- default:
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL.indication body invalid pdu type %d\n", pdu->pdu_type);
- return 0;
- }
- }
-
- return 1;
-}
-static uint8_t unpack_lbt_dl_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
- nfapi_lbt_dl_indication_t *pNfapiMsg = (nfapi_lbt_dl_indication_t*)msg;
-
- unpack_p7_tlv_t unpack_fns[] =
- {
- { NFAPI_LBT_DL_INDICATION_BODY_TAG, &pNfapiMsg->lbt_dl_indication_body, &unpack_lbt_indication_body_value},
- };
-
- return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
- unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_nb_harq_indication_fdd_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_nb_harq_indication_fdd_rel13_t* value = (nfapi_nb_harq_indication_fdd_rel13_t*)tlv;
- return (pull8(ppReadPackedMsg, &value->harq_tb1, end));
-}
-
-
-static uint8_t unpack_nb_harq_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_nb_harq_indication_body_t* value = (nfapi_nb_harq_indication_body_t*)tlv;
- uint8_t* nbharqBodyEnd = *ppReadPackedMsg + value->tl.length;
-
- if(nbharqBodyEnd > end)
- return 0;
-
- if(pull16(ppReadPackedMsg, &value->number_of_harqs, end) == 0)
- return 0;
-
- if(value->number_of_harqs > NFAPI_HARQ_IND_MAX_PDU)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of harq ind pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_harqs, NFAPI_HARQ_IND_MAX_PDU);
- return 0;
- }
-
- value->nb_harq_pdu_list = (nfapi_nb_harq_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_nb_harq_indication_pdu_t) * value->number_of_harqs, config);
- if(value->nb_harq_pdu_list == NULL)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate harq ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_harqs);
- return 0;
- }
-
- uint8_t i = 0;
- for(i = 0; i < value->number_of_harqs; ++i)
- {
- nfapi_nb_harq_indication_pdu_t* pdu = &(value->nb_harq_pdu_list[i]);
- if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
- return 0;
-
- uint8_t* harqPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
-
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
- { NFAPI_NB_HARQ_INDICATION_FDD_REL13_TAG, &pdu->nb_harq_indication_fdd_rel13, &unpack_nb_harq_indication_fdd_rel13_value},
- { NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, &unpack_ul_cqi_information_value}
- };
-
- if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, harqPduInstanceEnd, 0, 0) == 0)
- return 0;
-
- }
-
- return 1;
-}
-
-static uint8_t unpack_nb_harq_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
- nfapi_nb_harq_indication_t *pNfapiMsg = (nfapi_nb_harq_indication_t*)msg;
-
- unpack_p7_tlv_t unpack_fns[] =
- {
- { NFAPI_NB_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->nb_harq_indication_body, &unpack_nb_harq_indication_body_value},
- };
-
- return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
- unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_nrach_indication_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
- nfapi_nrach_indication_pdu_rel13_t* value = (nfapi_nrach_indication_pdu_rel13_t*)tlv;
-
- return (pull16(ppReadPackedMsg, &value->rnti, end) &&
- pull8(ppReadPackedMsg, &value->initial_sc, end) &&
- pull16(ppReadPackedMsg, &value->timing_advance, end) &&
- pull8(ppReadPackedMsg, &value->nrach_ce_level, end));
-}
-
-static uint8_t unpack_ue_release_resp(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
- nfapi_ue_release_response_t *pNfapiMsg = (nfapi_ue_release_response_t*)msg;
- if(pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) == 0){
- return 0;
- }
- else{
- NFAPI_TRACE(NFAPI_TRACE_INFO, "ue_release_response:error_code = %d\n", pNfapiMsg->error_code);
- }
- return 1;
-}
-
-static uint8_t unpack_nrach_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
- nfapi_nrach_indication_body_t* value = (nfapi_nrach_indication_body_t*)tlv;
- uint8_t* nrachBodyEnd = *ppReadPackedMsg + value->tl.length;
-
- if(nrachBodyEnd > end)
- return 0;
-
- if(pull8(ppReadPackedMsg, &value->number_of_initial_scs_detected, end) == 0)
- return 0;
-
- if(value->number_of_initial_scs_detected > NFAPI_PREAMBLE_MAX_PDU)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of detected scs ind pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_initial_scs_detected, NFAPI_PREAMBLE_MAX_PDU);
- return 0;
- }
-
- value->nrach_pdu_list = (nfapi_nrach_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_nrach_indication_pdu_t) * value->number_of_initial_scs_detected, config);
- if(value->nrach_pdu_list == NULL)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate nrach ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_initial_scs_detected);
- return 0;
- }
-
- uint8_t i = 0;
- for(i = 0; i < value->number_of_initial_scs_detected; ++i)
- {
- nfapi_nrach_indication_pdu_t* pdu = &(value->nrach_pdu_list[i]);
-
- uint8_t* nrachPduInstanceEnd = *ppReadPackedMsg + 4 + 6;
-
- unpack_tlv_t unpack_fns[] =
- {
- { NFAPI_NRACH_INDICATION_REL13_TAG, &pdu->nrach_indication_rel13, &unpack_nrach_indication_rel13_value},
- };
-
- if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, nrachPduInstanceEnd, 0, 0) == 0)
- return 0;
-
- }
-
- return 1;
-}
-
-static uint8_t unpack_nrach_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
- nfapi_nrach_indication_t *pNfapiMsg = (nfapi_nrach_indication_t*)msg;
-
- unpack_p7_tlv_t unpack_fns[] =
- {
- { NFAPI_NRACH_INDICATION_BODY_TAG, &pNfapiMsg->nrach_indication_body, &unpack_nrach_indication_body_value},
- };
-
- return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
- unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_nr_dl_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
- nfapi_nr_dl_node_sync_t *pNfapiMsg = (nfapi_nr_dl_node_sync_t*)msg;
-
- unpack_p7_tlv_t unpack_fns[] =
- {
- };
-
- return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
- pulls32(ppReadPackedMsg, &pNfapiMsg->delta_sfn_slot, end) &&
- unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_dl_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
- nfapi_dl_node_sync_t *pNfapiMsg = (nfapi_dl_node_sync_t*)msg;
-
- unpack_p7_tlv_t unpack_fns[] =
- {
- };
-
- return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
- pulls32(ppReadPackedMsg, &pNfapiMsg->delta_sfn_sf, end) &&
- unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-
-static uint8_t unpack_nr_ul_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
- nfapi_nr_ul_node_sync_t *pNfapiMsg = (nfapi_nr_ul_node_sync_t*)msg;
-
- unpack_p7_tlv_t unpack_fns[] =
- {
- };
-
- return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
- pull32(ppReadPackedMsg, &pNfapiMsg->t2, end) &&
- pull32(ppReadPackedMsg, &pNfapiMsg->t3, end) &&
- unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-
-static uint8_t unpack_ul_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
- nfapi_ul_node_sync_t *pNfapiMsg = (nfapi_ul_node_sync_t*)msg;
-
- unpack_p7_tlv_t unpack_fns[] =
- {
- };
-
- return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
- pull32(ppReadPackedMsg, &pNfapiMsg->t2, end) &&
- pull32(ppReadPackedMsg, &pNfapiMsg->t3, end) &&
- unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_timing_info(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
- nfapi_timing_info_t *pNfapiMsg = (nfapi_timing_info_t*)msg;
-
- unpack_p7_tlv_t unpack_fns[] =
- {
- };
-
- return (pull32(ppReadPackedMsg, &pNfapiMsg->last_sfn_sf, end) &&
- pull32(ppReadPackedMsg, &pNfapiMsg->time_since_last_timing_info, end) &&
- pull32(ppReadPackedMsg, &pNfapiMsg->dl_config_jitter, end) &&
- pull32(ppReadPackedMsg, &pNfapiMsg->tx_request_jitter, end) &&
- pull32(ppReadPackedMsg, &pNfapiMsg->ul_config_jitter, end) &&
- pull32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_jitter, end) &&
- pulls32(ppReadPackedMsg, &pNfapiMsg->dl_config_latest_delay, end) &&
- pulls32(ppReadPackedMsg, &pNfapiMsg->tx_request_latest_delay, end) &&
- pulls32(ppReadPackedMsg, &pNfapiMsg->ul_config_latest_delay, end) &&
- pulls32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_latest_delay, end) &&
- pulls32(ppReadPackedMsg, &pNfapiMsg->dl_config_earliest_arrival, end) &&
- pulls32(ppReadPackedMsg, &pNfapiMsg->tx_request_earliest_arrival, end) &&
- pulls32(ppReadPackedMsg, &pNfapiMsg->ul_config_earliest_arrival, end) &&
- pulls32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_earliest_arrival, end) &&
- unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-
-static uint8_t unpack_nr_timing_info(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
- nfapi_nr_timing_info_t *pNfapiMsg = (nfapi_nr_timing_info_t*)msg;
-
- unpack_p7_tlv_t unpack_fns[] =
- {
- };
-
- return (pull32(ppReadPackedMsg, &pNfapiMsg->last_sfn, end) &&
- pull32(ppReadPackedMsg, &pNfapiMsg->last_slot, end) &&
- pull32(ppReadPackedMsg, &pNfapiMsg->time_since_last_timing_info, end) &&
- pull32(ppReadPackedMsg, &pNfapiMsg->dl_tti_jitter, end) &&
- pull32(ppReadPackedMsg, &pNfapiMsg->tx_data_request_jitter, end) &&
- pull32(ppReadPackedMsg, &pNfapiMsg->ul_tti_jitter, end) &&
- pull32(ppReadPackedMsg, &pNfapiMsg->ul_dci_jitter, end) &&
- pulls32(ppReadPackedMsg, &pNfapiMsg->dl_tti_latest_delay, end) &&
- pulls32(ppReadPackedMsg, &pNfapiMsg->tx_data_request_latest_delay, end) &&
- pulls32(ppReadPackedMsg, &pNfapiMsg->ul_tti_latest_delay, end) &&
- pulls32(ppReadPackedMsg, &pNfapiMsg->ul_dci_latest_delay, end) &&
- pulls32(ppReadPackedMsg, &pNfapiMsg->dl_tti_earliest_arrival, end) &&
- pulls32(ppReadPackedMsg, &pNfapiMsg->tx_data_request_earliest_arrival, end) &&
- pulls32(ppReadPackedMsg, &pNfapiMsg->ul_tti_earliest_arrival, end) &&
- pulls32(ppReadPackedMsg, &pNfapiMsg->ul_dci_earliest_arrival, end) &&
- unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-
-
-// unpack length check
-
-static int check_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen)
-{
- int retLen = 0;
-
- switch (msgId)
- {
- case NFAPI_DL_CONFIG_REQUEST:
- if (unpackedBufLen >= sizeof(nfapi_dl_config_request_t))
- retLen = sizeof(nfapi_dl_config_request_t);
- break;
-
- case NFAPI_UL_CONFIG_REQUEST:
- if (unpackedBufLen >= sizeof(nfapi_ul_config_request_t))
- retLen = sizeof(nfapi_ul_config_request_t);
- break;
-
- case NFAPI_SUBFRAME_INDICATION:
- if (unpackedBufLen >= sizeof(nfapi_subframe_indication_t))
- retLen = sizeof(nfapi_subframe_indication_t);
- break;
-
- case NFAPI_HI_DCI0_REQUEST:
- if (unpackedBufLen >= sizeof(nfapi_hi_dci0_request_t))
- retLen = sizeof(nfapi_hi_dci0_request_t);
- break;
-
- case NFAPI_TX_REQUEST:
- if (unpackedBufLen >= sizeof(nfapi_tx_request_t))
- retLen = sizeof(nfapi_tx_request_t);
- break;
-
- case NFAPI_HARQ_INDICATION:
- if (unpackedBufLen >= sizeof(nfapi_harq_indication_t))
- retLen = sizeof(nfapi_harq_indication_t);
- break;
-
- case NFAPI_CRC_INDICATION:
- if (unpackedBufLen >= sizeof(nfapi_crc_indication_t))
- retLen = sizeof(nfapi_crc_indication_t);
- break;
-
- case NFAPI_RX_ULSCH_INDICATION:
- if (unpackedBufLen >= sizeof(nfapi_rx_indication_t))
- retLen = sizeof(nfapi_rx_indication_t);
- break;
-
- case NFAPI_RACH_INDICATION:
- if (unpackedBufLen >= sizeof(nfapi_rach_indication_t))
- retLen = sizeof(nfapi_rach_indication_t);
- break;
-
- case NFAPI_SRS_INDICATION:
- if (unpackedBufLen >= sizeof(nfapi_srs_indication_t))
- retLen = sizeof(nfapi_srs_indication_t);
- break;
-
- case NFAPI_RX_SR_INDICATION:
- if (unpackedBufLen >= sizeof(nfapi_sr_indication_t))
- retLen = sizeof(nfapi_sr_indication_t);
- break;
-
- case NFAPI_RX_CQI_INDICATION:
- if (unpackedBufLen >= sizeof(nfapi_cqi_indication_t))
- retLen = sizeof(nfapi_cqi_indication_t);
- break;
-
- case NFAPI_LBT_DL_CONFIG_REQUEST:
- if (unpackedBufLen >= sizeof(nfapi_lbt_dl_config_request_t))
- retLen = sizeof(nfapi_lbt_dl_config_request_t);
- break;
-
- case NFAPI_LBT_DL_INDICATION:
- if (unpackedBufLen >= sizeof(nfapi_lbt_dl_indication_t))
- retLen = sizeof(nfapi_lbt_dl_indication_t);
- break;
-
- case NFAPI_NB_HARQ_INDICATION:
- if (unpackedBufLen >= sizeof(nfapi_nb_harq_indication_t))
- retLen = sizeof(nfapi_nb_harq_indication_t);
- break;
-
- case NFAPI_NRACH_INDICATION:
- if (unpackedBufLen >= sizeof(nfapi_nrach_indication_t))
- retLen = sizeof(nfapi_nrach_indication_t);
- break;
-
- case NFAPI_DL_NODE_SYNC:
- if (unpackedBufLen >= sizeof(nfapi_dl_node_sync_t))
- retLen = sizeof(nfapi_dl_node_sync_t);
- break;
-
- case NFAPI_UL_NODE_SYNC:
- if (unpackedBufLen >= sizeof(nfapi_ul_node_sync_t))
- retLen = sizeof(nfapi_ul_node_sync_t);
- break;
-
- case NFAPI_TIMING_INFO:
- if (unpackedBufLen >= sizeof(nfapi_timing_info_t))
- retLen = sizeof(nfapi_timing_info_t);
- break;
-
- case NFAPI_UE_RELEASE_REQUEST:
- if (unpackedBufLen >= sizeof(nfapi_ue_release_request_t))
- retLen = sizeof(nfapi_ue_release_request_t);
- break;
-
- case NFAPI_UE_RELEASE_RESPONSE:
- if (unpackedBufLen >= sizeof(nfapi_ue_release_response_t))
- retLen = sizeof(nfapi_ue_release_response_t);
- break;
-
- default:
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown message ID %d\n", msgId);
- break;
- }
-
- return retLen;
-}
-
-static int check_nr_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen)
-{
- int retLen = 0;
-
- switch (msgId)
- {
- case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
- if (unpackedBufLen >= sizeof(nfapi_nr_dl_tti_request_t))
- retLen = sizeof(nfapi_nr_dl_tti_request_t);
- break;
-
- case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
- if (unpackedBufLen >= sizeof(nfapi_nr_ul_tti_request_t))
- retLen = sizeof(nfapi_nr_ul_tti_request_t);
- break;
-
- case NFAPI_SUBFRAME_INDICATION:
- if (unpackedBufLen >= sizeof(nfapi_subframe_indication_t))
- retLen = sizeof(nfapi_subframe_indication_t);
- break;
-
- case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
- if (unpackedBufLen >= sizeof(nfapi_nr_ul_dci_request_t))
- retLen = sizeof(nfapi_nr_ul_dci_request_t);
- break;
-
- case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
- if (unpackedBufLen >= sizeof(nfapi_nr_tx_data_request_t))
- retLen = sizeof(nfapi_nr_tx_data_request_t);
- break;
-
- case NFAPI_HARQ_INDICATION:
- if (unpackedBufLen >= sizeof(nfapi_harq_indication_t))
- retLen = sizeof(nfapi_harq_indication_t);
- break;
-
- case NFAPI_CRC_INDICATION:
- if (unpackedBufLen >= sizeof(nfapi_crc_indication_t))
- retLen = sizeof(nfapi_crc_indication_t);
- break;
-
- case NFAPI_RX_ULSCH_INDICATION:
- if (unpackedBufLen >= sizeof(nfapi_rx_indication_t))
- retLen = sizeof(nfapi_rx_indication_t);
- break;
-
- case NFAPI_RACH_INDICATION:
- if (unpackedBufLen >= sizeof(nfapi_rach_indication_t))
- retLen = sizeof(nfapi_rach_indication_t);
- break;
-
- case NFAPI_SRS_INDICATION:
- if (unpackedBufLen >= sizeof(nfapi_srs_indication_t))
- retLen = sizeof(nfapi_srs_indication_t);
- break;
-
- case NFAPI_RX_SR_INDICATION:
- if (unpackedBufLen >= sizeof(nfapi_sr_indication_t))
- retLen = sizeof(nfapi_sr_indication_t);
- break;
-
- case NFAPI_RX_CQI_INDICATION:
- if (unpackedBufLen >= sizeof(nfapi_cqi_indication_t))
- retLen = sizeof(nfapi_cqi_indication_t);
- break;
-
- case NFAPI_LBT_DL_CONFIG_REQUEST:
- if (unpackedBufLen >= sizeof(nfapi_lbt_dl_config_request_t))
- retLen = sizeof(nfapi_lbt_dl_config_request_t);
- break;
-
- case NFAPI_LBT_DL_INDICATION:
- if (unpackedBufLen >= sizeof(nfapi_lbt_dl_indication_t))
- retLen = sizeof(nfapi_lbt_dl_indication_t);
- break;
-
- case NFAPI_NB_HARQ_INDICATION:
- if (unpackedBufLen >= sizeof(nfapi_nb_harq_indication_t))
- retLen = sizeof(nfapi_nb_harq_indication_t);
- break;
-
- case NFAPI_NRACH_INDICATION:
- if (unpackedBufLen >= sizeof(nfapi_nrach_indication_t))
- retLen = sizeof(nfapi_nrach_indication_t);
- break;
-
- case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
- if (unpackedBufLen >= sizeof(nfapi_nr_dl_node_sync_t))
- retLen = sizeof(nfapi_nr_dl_node_sync_t);
- break;
-
- case NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC:
- if (unpackedBufLen >= sizeof(nfapi_nr_ul_node_sync_t))
- retLen = sizeof(nfapi_nr_ul_node_sync_t);
- break;
-
- case NFAPI_TIMING_INFO:
- if (unpackedBufLen >= sizeof(nfapi_timing_info_t))
- retLen = sizeof(nfapi_timing_info_t);
- break;
-
- case NFAPI_UE_RELEASE_REQUEST:
- if (unpackedBufLen >= sizeof(nfapi_ue_release_request_t))
- retLen = sizeof(nfapi_ue_release_request_t);
- break;
-
- case NFAPI_UE_RELEASE_RESPONSE:
- if (unpackedBufLen >= sizeof(nfapi_ue_release_response_t))
- retLen = sizeof(nfapi_ue_release_response_t);
- break;
-
- default:
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown message ID %d\n", msgId);
- break;
- }
-
- return retLen;
-}
-
-
-
-// Main unpack functions - public
-
-int nfapi_p7_message_header_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t* config)
-{
- nfapi_p7_message_header_t *pMessageHeader = pUnpackedBuf;
- uint8_t *pReadPackedMessage = pMessageBuf;
- uint8_t *end = pMessageBuf + messageBufLen;
-
- if (pMessageBuf == NULL || pUnpackedBuf == NULL)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 header unpack supplied pointers are null\n");
- return -1;
- }
-
- if (messageBufLen < NFAPI_P7_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p7_message_header_t))
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 header unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
- return -1;
- }
-
- // process the header
- if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
- pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
- pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
- pull16(&pReadPackedMessage, &pMessageHeader->m_segment_sequence, end) &&
- pull32(&pReadPackedMessage, &pMessageHeader->checksum, end) &&
- pull32(&pReadPackedMessage, &pMessageHeader->transmit_timestamp, end)))
- return -1;
-
- return 0;
-}
-
-int nfapi_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t* config)
-{
- int result = 0;
- nfapi_p7_message_header_t *pMessageHeader = (nfapi_p7_message_header_t*)pUnpackedBuf;
- uint8_t *pReadPackedMessage = pMessageBuf;
- uint8_t *end = pMessageBuf + messageBufLen;
-
- if (pMessageBuf == NULL || pUnpackedBuf == NULL)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied pointers are null\n");
- return -1;
- }
-
- if (messageBufLen < NFAPI_P7_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p7_message_header_t))
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
- return -1;
- }
- /*
- uint8_t *ptr = pMessageBuf;
- printf("\n Read P7 message unpack: ");
- while(ptr < end){
- printf(" %d ", *ptr);
- ptr++;
- }
- printf("\n");
-*/
- // clean the supplied buffer for - tag value blanking
- (void)memset(pUnpackedBuf, 0, unpackedBufLen);
-
- // process the header
- if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
- pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
- pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
- pull16(&pReadPackedMessage, &pMessageHeader->m_segment_sequence, end) &&
- pull32(&pReadPackedMessage, &pMessageHeader->checksum, end) &&
- pull32(&pReadPackedMessage, &pMessageHeader->transmit_timestamp, end)))
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack header failed\n");
- return -1;
- }
-
- if((uint8_t*)(pMessageBuf + pMessageHeader->message_length) > end)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack message length is greater than the message buffer \n");
- return -1;
- }
-
- /*
- if(check_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack unpack buffer is not large enough \n");
- return -1;
- }
- */
-
- // look for the specific message
- switch (pMessageHeader->message_id)
- {
- case NFAPI_DL_CONFIG_REQUEST:
- if (check_unpack_length(NFAPI_DL_CONFIG_REQUEST, unpackedBufLen))
- result = unpack_dl_config_request(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_UL_CONFIG_REQUEST:
- if (check_unpack_length(NFAPI_UL_CONFIG_REQUEST, unpackedBufLen))
- result = unpack_ul_config_request(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
- case NFAPI_TX_REQUEST:
- if (check_unpack_length(NFAPI_TX_REQUEST, unpackedBufLen))
- result = unpack_tx_request(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
- case NFAPI_HI_DCI0_REQUEST:
- if (check_unpack_length(NFAPI_HI_DCI0_REQUEST, unpackedBufLen))
- result = unpack_hi_dci0_request(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_UE_RELEASE_REQUEST:
- if (check_unpack_length(NFAPI_UE_RELEASE_REQUEST, unpackedBufLen))
- result = unpack_ue_release_request(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_HARQ_INDICATION:
- if (check_unpack_length(NFAPI_HARQ_INDICATION, unpackedBufLen))
- result = unpack_harq_indication(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_CRC_INDICATION:
- if (check_unpack_length(NFAPI_CRC_INDICATION, unpackedBufLen))
- result = unpack_crc_indication(&pReadPackedMessage,end , pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_RX_ULSCH_INDICATION:
- if (check_unpack_length(NFAPI_RX_ULSCH_INDICATION, unpackedBufLen))
- result = unpack_rx_indication(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_RACH_INDICATION:
- if (check_unpack_length(NFAPI_RACH_INDICATION, unpackedBufLen))
- result = unpack_rach_indication(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_SRS_INDICATION:
- if (check_unpack_length(NFAPI_SRS_INDICATION, unpackedBufLen))
- result = unpack_srs_indication(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_RX_SR_INDICATION:
- if (check_unpack_length(NFAPI_RX_SR_INDICATION, unpackedBufLen))
- result = unpack_sr_indication(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_RX_CQI_INDICATION:
- if (check_unpack_length(NFAPI_RX_CQI_INDICATION, unpackedBufLen))
- result = unpack_cqi_indication(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_LBT_DL_CONFIG_REQUEST:
- if (check_unpack_length(NFAPI_LBT_DL_CONFIG_REQUEST, unpackedBufLen))
- result = unpack_lbt_dl_config_request(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_LBT_DL_INDICATION:
- if (check_unpack_length(NFAPI_LBT_DL_INDICATION, unpackedBufLen))
- result = unpack_lbt_dl_indication(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_NB_HARQ_INDICATION:
- if (check_unpack_length(NFAPI_NB_HARQ_INDICATION, unpackedBufLen))
- result = unpack_nb_harq_indication(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_NRACH_INDICATION:
- if (check_unpack_length(NFAPI_NRACH_INDICATION, unpackedBufLen))
- result = unpack_nrach_indication(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_DL_NODE_SYNC:
- if (check_unpack_length(NFAPI_DL_NODE_SYNC, unpackedBufLen))
- result = unpack_dl_node_sync(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_UL_NODE_SYNC:
- if (check_unpack_length(NFAPI_UL_NODE_SYNC, unpackedBufLen))
- result = unpack_ul_node_sync(&pReadPackedMessage, end , pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_TIMING_INFO:
- if (check_unpack_length(NFAPI_TIMING_INFO, unpackedBufLen))
- result = unpack_timing_info(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_UE_RELEASE_RESPONSE:
- if (check_unpack_length(NFAPI_UE_RELEASE_RESPONSE, unpackedBufLen))
- result = unpack_ue_release_resp(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- default:
-
- if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
- pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
- {
- if(config && config->unpack_p7_vendor_extension)
- {
- result = (config->unpack_p7_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
- }
- else
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
- }
- }
- else
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
- }
- break;
- }
-
- if(result == 0)
- return -1;
- else
- return 0;
-}
-
-int nfapi_nr_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t* config)
-{
- int result = 0;
- nfapi_p7_message_header_t *pMessageHeader = (nfapi_p7_message_header_t*)pUnpackedBuf;
- uint8_t *pReadPackedMessage = pMessageBuf;
- uint8_t *end = pMessageBuf + messageBufLen;
-
- if (pMessageBuf == NULL || pUnpackedBuf == NULL)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied pointers are null\n");
- return -1;
- }
-
- if (messageBufLen < NFAPI_P7_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p7_message_header_t))
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
- return -1;
- }
- /*
- uint8_t *ptr = pMessageBuf;
- printf("\n Read P7 message unpack: ");
- while(ptr < end){
- printf(" %d ", *ptr);
- ptr++;
- }
- printf("\n");
-*/
- // clean the supplied buffer for - tag value blanking
- (void)memset(pUnpackedBuf, 0, unpackedBufLen);
-
- // process the header
- if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
- pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
- pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
- pull16(&pReadPackedMessage, &pMessageHeader->m_segment_sequence, end) &&
- pull32(&pReadPackedMessage, &pMessageHeader->checksum, end) &&
- pull32(&pReadPackedMessage, &pMessageHeader->transmit_timestamp, end)))
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack header failed\n");
- return -1;
- }
-
- if((uint8_t*)(pMessageBuf + pMessageHeader->message_length) > end)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack message length is greater than the message buffer \n");
- return -1;
- }
-
- /*
- if(check_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack unpack buffer is not large enough \n");
- return -1;
- }
- */
-
- // look for the specific message
- switch (pMessageHeader->message_id)
- {
- case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
- if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST, unpackedBufLen))
- result = unpack_dl_tti_request(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
- if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST, unpackedBufLen))
- result = unpack_ul_tti_request(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
- case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
- if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST, unpackedBufLen))
- result = unpack_tx_data_request(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
- case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
- if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST, unpackedBufLen))
- result = unpack_ul_dci_request(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_UE_RELEASE_REQUEST:
- if (check_nr_unpack_length(NFAPI_UE_RELEASE_REQUEST, unpackedBufLen))
- result = unpack_ue_release_request(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_HARQ_INDICATION:
- if (check_nr_unpack_length(NFAPI_HARQ_INDICATION, unpackedBufLen))
- result = unpack_harq_indication(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_CRC_INDICATION:
- if (check_nr_unpack_length(NFAPI_CRC_INDICATION, unpackedBufLen))
- result = unpack_crc_indication(&pReadPackedMessage,end , pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_RX_ULSCH_INDICATION:
- if (check_nr_unpack_length(NFAPI_RX_ULSCH_INDICATION, unpackedBufLen))
- result = unpack_rx_indication(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_RACH_INDICATION:
- if (check_nr_unpack_length(NFAPI_RACH_INDICATION, unpackedBufLen))
- result = unpack_rach_indication(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_SRS_INDICATION:
- if (check_nr_unpack_length(NFAPI_SRS_INDICATION, unpackedBufLen))
- result = unpack_srs_indication(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_RX_SR_INDICATION:
- if (check_nr_unpack_length(NFAPI_RX_SR_INDICATION, unpackedBufLen))
- result = unpack_sr_indication(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_RX_CQI_INDICATION:
- if (check_nr_unpack_length(NFAPI_RX_CQI_INDICATION, unpackedBufLen))
- result = unpack_cqi_indication(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_LBT_DL_CONFIG_REQUEST:
- if (check_nr_unpack_length(NFAPI_LBT_DL_CONFIG_REQUEST, unpackedBufLen))
- result = unpack_lbt_dl_config_request(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_LBT_DL_INDICATION:
- if (check_nr_unpack_length(NFAPI_LBT_DL_INDICATION, unpackedBufLen))
- result = unpack_lbt_dl_indication(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_NB_HARQ_INDICATION:
- if (check_nr_unpack_length(NFAPI_NB_HARQ_INDICATION, unpackedBufLen))
- result = unpack_nb_harq_indication(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_NRACH_INDICATION:
- if (check_nr_unpack_length(NFAPI_NRACH_INDICATION, unpackedBufLen))
- result = unpack_nrach_indication(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
- if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC, unpackedBufLen))
- result = unpack_nr_dl_node_sync(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC:
- if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC, unpackedBufLen))
- result = unpack_nr_ul_node_sync(&pReadPackedMessage, end , pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_TIMING_INFO:
- if (check_nr_unpack_length(NFAPI_TIMING_INFO, unpackedBufLen))
- result = unpack_nr_timing_info(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- case NFAPI_UE_RELEASE_RESPONSE:
- if (check_nr_unpack_length(NFAPI_UE_RELEASE_RESPONSE, unpackedBufLen))
- result = unpack_ue_release_resp(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
- break;
-
- default:
-
- if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
- pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
- {
- if(config && config->unpack_p7_vendor_extension)
- {
- result = (config->unpack_p7_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
- }
- else
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
- }
- }
- else
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
- }
- break;
- }
-
- if(result == 0)
- return -1;
- else
- return 0;
-}
-
-
+/*
+ * 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
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include "nfapi_nr_interface_scf.h"
+
+extern int nfapi_unpack_p7_vendor_extension(nfapi_p7_message_header_t* header, uint8_t **ppReadPackedMsg, void* user_data);
+extern int nfapi_pack_p7_vendor_extension(nfapi_p7_message_header_t* header, uint8_t **ppWritePackedMsg, void* user_data);
+
+uint32_t nfapi_calculate_checksum(uint8_t* buffer, uint16_t len)
+{
+ uint32_t chksum = 0;
+ // calcaulte upto the checksum
+ chksum = crc32(chksum, buffer, 8);
+
+ // skip the checksum
+ uint8_t zeros[4] = {0, 0, 0, 0};
+ chksum = crc32(chksum, zeros, 4);
+
+ // continu with the rest of the mesage
+ chksum = crc32(chksum, &buffer[NFAPI_P7_HEADER_LENGTH], len - NFAPI_P7_HEADER_LENGTH);
+
+ // return the inverse
+ return ~(chksum);
+}
+
+int nfapi_p7_update_checksum(uint8_t* buffer, uint32_t len)
+{
+ uint32_t checksum = nfapi_calculate_checksum(buffer, len);
+
+ uint8_t* p_write = &buffer[8];
+ return (push32(checksum, &p_write, buffer + len) > 0 ? 0 : -1);
+}
+
+int nfapi_p7_update_transmit_timestamp(uint8_t* buffer, uint32_t timestamp)
+{
+ uint8_t* p_write = &buffer[12];
+ return (push32(timestamp, &p_write, buffer + 16) > 0 ? 0 : -1);
+}
+
+uint32_t nfapi_p7_calculate_checksum(uint8_t* buffer, uint32_t len)
+{
+ return nfapi_calculate_checksum(buffer, len);
+}
+
+void* nfapi_p7_allocate(size_t size, nfapi_p7_codec_config_t* config)
+{
+ if(size == 0)
+ return 0;
+
+ void* buffer_p = NULL;
+ if(config && config->allocate)
+ {
+ buffer_p = (config->allocate)(size);
+ if(buffer_p != NULL){
+ memset(buffer_p,0,size);
+ }
+ return buffer_p;
+ }
+ else
+ {
+ buffer_p = calloc(1, size);
+ return buffer_p;
+ }
+}
+
+void nfapi_p7_deallocate(void* ptr, nfapi_p7_codec_config_t* config)
+{
+ if(ptr == NULL)
+ return;
+
+ if(config && config->deallocate)
+ {
+ return (config->deallocate)(ptr);
+ }
+ else
+ {
+ return free(ptr);
+ }
+}
+// Pack routines
+
+
+static uint8_t pack_dl_config_dci_dl_pdu_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ 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) &&
+ push16(value->rnti, ppWritePackedMsg, end) &&
+ push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
+ push8(value->virtual_resource_block_assignment_flag, ppWritePackedMsg, end) &&
+ push32(value->resource_block_coding, ppWritePackedMsg, end) &&
+ push8(value->mcs_1, ppWritePackedMsg, end) &&
+ push8(value->redundancy_version_1, ppWritePackedMsg, end) &&
+ push8(value->new_data_indicator_1, ppWritePackedMsg, end) &&
+ push8(value->transport_block_to_codeword_swap_flag, ppWritePackedMsg, end) &&
+ push8(value->mcs_2, ppWritePackedMsg, end) &&
+ push8(value->redundancy_version_2, ppWritePackedMsg, end) &&
+ push8(value->new_data_indicator_2, ppWritePackedMsg, end) &&
+ push8(value->harq_process, ppWritePackedMsg, end) &&
+ push8(value->tpmi, ppWritePackedMsg, end) &&
+ push8(value->pmi, ppWritePackedMsg, end) &&
+ push8(value->precoding_information, ppWritePackedMsg, end) &&
+ push8(value->tpc, ppWritePackedMsg, end) &&
+ push8(value->downlink_assignment_index, ppWritePackedMsg, end) &&
+ push8(value->ngap, ppWritePackedMsg, end) &&
+ push8(value->transport_block_size_index, ppWritePackedMsg, end) &&
+ push8(value->downlink_power_offset, ppWritePackedMsg, end) &&
+ push8(value->allocate_prach_flag, ppWritePackedMsg, end) &&
+ push8(value->preamble_index, ppWritePackedMsg, end) &&
+ push8(value->prach_mask_index, ppWritePackedMsg, end) &&
+ push8(value->rnti_type, ppWritePackedMsg, end) &&
+ push16(value->transmission_power, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_dl_config_dci_dl_pdu_rel9_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_dci_dl_pdu_rel9_t* value = (nfapi_dl_config_dci_dl_pdu_rel9_t*)tlv;
+
+ return( push8(value->mcch_flag, ppWritePackedMsg, end) &&
+ push8(value->mcch_change_notification, ppWritePackedMsg, end) &&
+ push8(value->scrambling_identity, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_dl_config_dci_dl_pdu_rel10_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_dci_dl_pdu_rel10_t* value = (nfapi_dl_config_dci_dl_pdu_rel10_t*)tlv;
+
+ return ( push8(value->cross_carrier_scheduling_flag, ppWritePackedMsg, end) &&
+ push8(value->carrier_indicator, ppWritePackedMsg, end) &&
+ push8(value->srs_flag, ppWritePackedMsg, end) &&
+ push8(value->srs_request, ppWritePackedMsg, end) &&
+ push8(value->antenna_ports_scrambling_and_layers, ppWritePackedMsg, end) &&
+ push8(value->total_dci_length_including_padding, ppWritePackedMsg, end) &&
+ push8(value->n_dl_rb, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_dl_config_dci_dl_pdu_rel11_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_dci_dl_pdu_rel11_t* value = (nfapi_dl_config_dci_dl_pdu_rel11_t*)tlv;
+
+ return ( push8(value->harq_ack_resource_offset, ppWritePackedMsg, end) &&
+ push8(value->pdsch_re_mapping_quasi_co_location_indicator, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_dl_config_dci_dl_pdu_rel12_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_dci_dl_pdu_rel12_t* value = (nfapi_dl_config_dci_dl_pdu_rel12_t*)tlv;
+
+ return ( push8(value->primary_cell_type, ppWritePackedMsg, end) &&
+ push8(value->ul_dl_configuration_flag, ppWritePackedMsg, end) &&
+ push8(value->number_ul_dl_configurations, ppWritePackedMsg, end) &&
+ pusharray8(value->ul_dl_configuration_indication, NFAPI_MAX_UL_DL_CONFIGURATIONS, value->number_ul_dl_configurations, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_tpm_value(nfapi_dl_config_dci_dl_tpm_t* value, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ if (!( push8(value->num_prb_per_subband, ppWritePackedMsg, end) &&
+ push8(value->number_of_subbands, ppWritePackedMsg, end) &&
+ push8(value->num_antennas, ppWritePackedMsg, end)))
+ return 0;
+
+ uint8_t idx = 0;
+ for(idx = 0; idx < value->number_of_subbands; ++idx)
+ {
+ nfapi_dl_config_dci_dl_tpm_subband_info_t* subband_info = &(value->subband_info[idx]);
+
+ if(!(push8(subband_info->subband_index, ppWritePackedMsg, end) &&
+ push8(subband_info->scheduled_ues, ppWritePackedMsg, end)))
+ return 0;
+
+
+ uint8_t antenna_idx = 0;
+ uint8_t scheduled_ue_idx = 0;
+
+ for(antenna_idx = 0; antenna_idx < value->num_antennas; ++antenna_idx)
+ {
+ for(scheduled_ue_idx = 0; scheduled_ue_idx < subband_info->scheduled_ues; ++scheduled_ue_idx)
+ {
+ if(!push16(subband_info->precoding_value[antenna_idx][scheduled_ue_idx], ppWritePackedMsg, end))
+ return 0;
+ }
+ }
+
+ }
+
+
+ return 1;
+
+}
+
+
+static uint8_t pack_dl_tti_csi_rs_pdu_rel15_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_nr_dl_tti_csi_rs_pdu_rel15_t* value = (nfapi_nr_dl_tti_csi_rs_pdu_rel15_t*)tlv;
+
+ return(
+ push16(value->bwp_size, ppWritePackedMsg, end) &&
+ push16(value->bwp_start, ppWritePackedMsg, end) &&
+
+ push8(value->subcarrier_spacing, ppWritePackedMsg, end) &&
+ push8(value->cyclic_prefix, ppWritePackedMsg, end) &&
+
+ push16(value->start_rb, ppWritePackedMsg, end) &&
+ push16(value->nr_of_rbs, ppWritePackedMsg, end) &&
+
+ push8(value->csi_type, ppWritePackedMsg, end) &&
+ push8(value->row, ppWritePackedMsg, end) &&
+
+ push16(value->freq_domain, ppWritePackedMsg, end) &&
+ push8(value->symb_l0, ppWritePackedMsg, end) &&
+
+ push8(value->symb_l1, ppWritePackedMsg, end) &&
+ push8(value->cdm_type, ppWritePackedMsg, end) &&
+
+ push8(value->freq_density, ppWritePackedMsg, end) &&
+ push16(value->scramb_id, ppWritePackedMsg, end) &&
+
+ push8(value->power_control_offset, ppWritePackedMsg, end) &&
+ push8(value->power_control_offset_ss, ppWritePackedMsg, end)
+ );
+
+}
+
+
+static uint8_t pack_dl_tti_pdcch_pdu_rel15_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_nr_dl_tti_pdcch_pdu_rel15_t* value = (nfapi_nr_dl_tti_pdcch_pdu_rel15_t*)tlv;
+
+ for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i)
+ {
+ if(!push16(value->dci_pdu[i].RNTI, ppWritePackedMsg, end) &&
+ push16(value->dci_pdu[i].ScramblingId, ppWritePackedMsg, end) &&
+
+ push16(value->dci_pdu[i].ScramblingRNTI, ppWritePackedMsg, end) &&
+ push8(value->dci_pdu[i].CceIndex, ppWritePackedMsg, end) &&
+ push8(value->dci_pdu[i].AggregationLevel, ppWritePackedMsg, end) &&
+ push8(value->dci_pdu[i].beta_PDCCH_1_0, ppWritePackedMsg, end) &&
+
+ push8(value->dci_pdu[i].powerControlOffsetSS, ppWritePackedMsg, end) &&
+ push16(value->dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end) &&
+ pusharray8(value->dci_pdu[i].Payload, DCI_PAYLOAD_BYTE_LEN, value->dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end));
+
+ return 0;
+ }
+
+ // TODO: resolve the packaging of array (currently sending a single element)
+ return(
+ push16(value->BWPSize, ppWritePackedMsg, end) &&
+ push16(value->BWPStart, ppWritePackedMsg, end) &&
+ push8(value->SubcarrierSpacing, ppWritePackedMsg, end) &&
+ push8(value->CyclicPrefix, ppWritePackedMsg, end) &&
+
+ push8(value->StartSymbolIndex, ppWritePackedMsg, end) &&
+ push8(value->DurationSymbols, ppWritePackedMsg, end) &&
+ pusharray8(value->FreqDomainResource, 6, 6, ppWritePackedMsg, end) &&
+ push8(value->CceRegMappingType, ppWritePackedMsg, end) &&
+
+ push8(value->RegBundleSize, ppWritePackedMsg, end) &&
+ push8(value->InterleaverSize, ppWritePackedMsg, end) &&
+ push8(value->CoreSetType, ppWritePackedMsg, end) &&
+ push16(value->ShiftIndex, ppWritePackedMsg, end) &&
+
+ push8(value->precoderGranularity, ppWritePackedMsg, end) &&
+ push16(value->numDlDci, ppWritePackedMsg, end));
+
+}
+
+
+static uint8_t pack_dl_tti_pdsch_pdu_rel15_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_nr_dl_tti_pdsch_pdu_rel15_t* value = (nfapi_nr_dl_tti_pdsch_pdu_rel15_t*)tlv;
+
+ // TODO: resolve the packaging of array (currently sending a single element)
+ return(
+ push16(value->pduBitmap, ppWritePackedMsg, end) &&
+ push16(value->rnti, ppWritePackedMsg, end) &&
+ push16(value->pduIndex, ppWritePackedMsg, end) &&
+ push16(value->BWPSize, ppWritePackedMsg, end) &&
+
+ push16(value->BWPStart, ppWritePackedMsg, end) &&
+ push8(value->SubcarrierSpacing, ppWritePackedMsg, end) &&
+ push8(value->CyclicPrefix, ppWritePackedMsg, end) &&
+ push8(value->NrOfCodewords, ppWritePackedMsg, end) &&
+
+ pusharray16(value->targetCodeRate, 2, 1, ppWritePackedMsg, end) &&
+ pusharray8(value->qamModOrder, 2, 1, ppWritePackedMsg, end) &&
+ pusharray8(value->mcsIndex, 2, 1, ppWritePackedMsg, end) &&
+ pusharray8(value->mcsTable, 2, 1, ppWritePackedMsg, end) &&
+
+ pusharray8(value->rvIndex, 2, 1, ppWritePackedMsg, end) &&
+ pusharray32(value->TBSize, 2, 1, ppWritePackedMsg, end) &&
+ push16(value->dataScramblingId, ppWritePackedMsg, end) &&
+ push8(value->nrOfLayers, ppWritePackedMsg, end) &&
+
+ push8(value->transmissionScheme, ppWritePackedMsg, end) &&
+ push8(value->refPoint, ppWritePackedMsg, end) &&
+ push16(value->dlDmrsSymbPos, ppWritePackedMsg, end) &&
+ push8(value->dmrsConfigType, ppWritePackedMsg, end) &&
+
+ push16(value->dlDmrsScramblingId, ppWritePackedMsg, end) &&
+ push8(value->SCID, ppWritePackedMsg, end) &&
+ push8(value->numDmrsCdmGrpsNoData, ppWritePackedMsg, end) &&
+ push16(value->dmrsPorts, ppWritePackedMsg, end) &&
+
+ push8(value->resourceAlloc, ppWritePackedMsg, end) &&
+ push16(value->rbStart, ppWritePackedMsg, end) &&
+ push16(value->rbSize, ppWritePackedMsg, end) &&
+
+ push8(value->VRBtoPRBMapping, ppWritePackedMsg, end) &&
+ push8(value->StartSymbolIndex, ppWritePackedMsg, end) &&
+ push8(value->NrOfSymbols, ppWritePackedMsg, end) &&
+ push8(value->PTRSPortIndex, ppWritePackedMsg, end) &&
+
+ push8(value->PTRSTimeDensity, ppWritePackedMsg, end) &&
+ push8(value->PTRSFreqDensity, ppWritePackedMsg, end) &&
+ push8(value->PTRSReOffset, ppWritePackedMsg, end)
+ );
+
+}
+
+
+static uint8_t pack_dl_tti_ssb_pdu_rel15_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_nr_dl_tti_ssb_pdu_rel15_t* value = (nfapi_nr_dl_tti_ssb_pdu_rel15_t*)tlv;
+
+ return(
+ push16(value->PhysCellId, ppWritePackedMsg, end) &&
+ push8(value->BetaPss, ppWritePackedMsg, end) &&
+ push8(value->SsbBlockIndex, ppWritePackedMsg, end) &&
+ push8(value->SsbSubcarrierOffset, ppWritePackedMsg, end) &&
+ push16(value->ssbOffsetPointA, ppWritePackedMsg, end) &&
+ push8(value->bchPayloadFlag, ppWritePackedMsg, end) &&
+ push32(value->bchPayload, ppWritePackedMsg, end)
+ // TODO: pack precoding_and_beamforming too
+ );
+
+}
+
+
+static uint8_t pack_dl_config_dci_dl_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_dci_dl_pdu_rel13_t* value = (nfapi_dl_config_dci_dl_pdu_rel13_t*)tlv;
+
+ return( push8(value->laa_end_partial_sf_flag, ppWritePackedMsg, end) &&
+ push8(value->laa_end_partial_sf_configuration, ppWritePackedMsg, end) &&
+ push8(value->initial_lbt_sf, ppWritePackedMsg, end) &&
+ push8(value->codebook_size_determination, ppWritePackedMsg, end) &&
+ push8(value->drms_table_flag, ppWritePackedMsg, end) &&
+ push8(value->tpm_struct_flag, ppWritePackedMsg, end) &&
+ (value->tpm_struct_flag == 1 ? pack_tpm_value(&(value->tpm), ppWritePackedMsg, end) : 1));
+}
+
+static uint8_t pack_dl_config_bch_pdu_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ 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));
+}
+static uint8_t pack_dl_config_mch_pdu_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_mch_pdu_rel8_t* value = (nfapi_dl_config_mch_pdu_rel8_t*)tlv;
+
+ return ( push16(value->length, ppWritePackedMsg, end) &&
+ push16(value->pdu_index, ppWritePackedMsg, end) &&
+ push16(value->rnti, ppWritePackedMsg, end) &&
+ push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
+ push32(value->resource_block_coding, ppWritePackedMsg, end) &&
+ push8(value->modulation, ppWritePackedMsg, end) &&
+ push16(value->transmission_power, ppWritePackedMsg, end) &&
+ push16(value->mbsfn_area_id, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_bf_vector_info(void* elem, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_bf_vector_t* bf = (nfapi_bf_vector_t*)elem;
+
+ return ( push8(bf->subband_index, ppWritePackedMsg, end) &&
+ push8(bf->num_antennas, ppWritePackedMsg, end) &&
+ pusharray16(bf->bf_value, NFAPI_MAX_NUM_ANTENNAS, bf->num_antennas, ppWritePackedMsg, end));
+
+
+}
+static uint8_t pack_dl_config_dlsch_pdu_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_dlsch_pdu_rel8_t* value = (nfapi_dl_config_dlsch_pdu_rel8_t*)tlv;
+
+ return ( push16(value->length, ppWritePackedMsg, end) &&
+ push16(value->pdu_index, ppWritePackedMsg, end) &&
+ push16(value->rnti, ppWritePackedMsg, end) &&
+ push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
+ push8(value->virtual_resource_block_assignment_flag, ppWritePackedMsg, end) &&
+ push32(value->resource_block_coding, ppWritePackedMsg, end) &&
+ push8(value->modulation, ppWritePackedMsg, end) &&
+ push8(value->redundancy_version, ppWritePackedMsg, end) &&
+ push8(value->transport_blocks, ppWritePackedMsg, end) &&
+ push8(value->transport_block_to_codeword_swap_flag, ppWritePackedMsg, end) &&
+ push8(value->transmission_scheme, ppWritePackedMsg, end) &&
+ push8(value->number_of_layers, ppWritePackedMsg, end) &&
+ push8(value->number_of_subbands, ppWritePackedMsg, end) &&
+ pusharray8(value->codebook_index, NFAPI_MAX_NUM_SUBBANDS, value->number_of_subbands, ppWritePackedMsg, end) &&
+ push8(value->ue_category_capacity, ppWritePackedMsg, end) &&
+ push8(value->pa, ppWritePackedMsg, end) &&
+ push8(value->delta_power_offset_index, ppWritePackedMsg, end) &&
+ push8(value->ngap, ppWritePackedMsg, end) &&
+ push8(value->nprb, ppWritePackedMsg, end) &&
+ push8(value->transmission_mode, ppWritePackedMsg, end) &&
+ push8(value->num_bf_prb_per_subband, ppWritePackedMsg, end) &&
+ push8(value->num_bf_vector, ppWritePackedMsg, end) &&
+ packarray(value->bf_vector, sizeof(nfapi_bf_vector_t), NFAPI_MAX_BF_VECTORS, value->num_bf_vector, ppWritePackedMsg, end, &pack_bf_vector_info));
+
+}
+static uint8_t pack_dl_config_dlsch_pdu_rel9_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_dlsch_pdu_rel9_t* value = (nfapi_dl_config_dlsch_pdu_rel9_t*)tlv;
+ return ( push8(value->nscid, ppWritePackedMsg, end) );
+}
+static uint8_t pack_dl_config_dlsch_pdu_rel10_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_dlsch_pdu_rel10_t* value = (nfapi_dl_config_dlsch_pdu_rel10_t*)tlv;
+
+ return ( push8(value->csi_rs_flag, ppWritePackedMsg, end) &&
+ push8(value->csi_rs_resource_config_r10, ppWritePackedMsg, end) &&
+ push16(value->csi_rs_zero_tx_power_resource_config_bitmap_r10, ppWritePackedMsg, end) &&
+ push8(value->csi_rs_number_nzp_configuration, ppWritePackedMsg, end) &&
+ pusharray8(value->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, value->csi_rs_number_nzp_configuration, ppWritePackedMsg, end) &&
+ push8(value->pdsch_start, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_dlsch_pdu_rel11_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_dlsch_pdu_rel11_t* value = (nfapi_dl_config_dlsch_pdu_rel11_t*)tlv;
+
+ return( push8(value->drms_config_flag, ppWritePackedMsg, end) &&
+ push16(value->drms_scrambling, ppWritePackedMsg, end) &&
+ push8(value->csi_config_flag, ppWritePackedMsg, end) &&
+ push16(value->csi_scrambling, ppWritePackedMsg, end) &&
+ push8(value->pdsch_re_mapping_flag, ppWritePackedMsg, end) &&
+ push8(value->pdsch_re_mapping_atenna_ports, ppWritePackedMsg, end) &&
+ push8(value->pdsch_re_mapping_freq_shift, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_dlsch_pdu_rel12_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_dlsch_pdu_rel12_t* value = (nfapi_dl_config_dlsch_pdu_rel12_t*)tlv;
+
+ return( push8(value->altcqi_table_r12, ppWritePackedMsg, end) &&
+ push8(value->maxlayers, ppWritePackedMsg, end) &&
+ push8(value->n_dl_harq, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_dlsch_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_dlsch_pdu_rel13_t* value = (nfapi_dl_config_dlsch_pdu_rel13_t*)tlv;
+
+ return( push8(value->dwpts_symbols, ppWritePackedMsg, end) &&
+ push8(value->initial_lbt_sf, ppWritePackedMsg, end) &&
+ push8(value->ue_type, ppWritePackedMsg, end) &&
+ push8(value->pdsch_payload_type, ppWritePackedMsg, end) &&
+ push16(value->initial_transmission_sf_io, ppWritePackedMsg, end) &&
+ push8(value->drms_table_flag, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_pch_pdu_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_pch_pdu_rel8_t* value = (nfapi_dl_config_pch_pdu_rel8_t*)tlv;
+
+ return( push16(value->length, ppWritePackedMsg, end) &&
+ push16(value->pdu_index, ppWritePackedMsg, end) &&
+ push16(value->p_rnti, ppWritePackedMsg, end) &&
+ push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
+ push8(value->virtual_resource_block_assignment_flag, ppWritePackedMsg, end) &&
+ push32(value->resource_block_coding, ppWritePackedMsg, end) &&
+ push8(value->mcs, ppWritePackedMsg, end) &&
+ push8(value->redundancy_version, ppWritePackedMsg, end) &&
+ push8(value->number_of_transport_blocks, ppWritePackedMsg, end) &&
+ push8(value->transport_block_to_codeword_swap_flag, ppWritePackedMsg, end) &&
+ push8(value->transmission_scheme, ppWritePackedMsg, end) &&
+ push8(value->number_of_layers, ppWritePackedMsg, end) &&
+ push8(value->codebook_index, ppWritePackedMsg, end) &&
+ push8(value->ue_category_capacity, ppWritePackedMsg, end) &&
+ push8(value->pa, ppWritePackedMsg, end) &&
+ push16(value->transmission_power, ppWritePackedMsg, end) &&
+ push8(value->nprb, ppWritePackedMsg, end) &&
+ push8(value->ngap, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_pch_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_pch_pdu_rel13_t* value = (nfapi_dl_config_pch_pdu_rel13_t*)tlv;
+
+ return ( push8(value->ue_mode, ppWritePackedMsg, end) &&
+ push16(value->initial_transmission_sf_io, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_prs_pdu_rel9_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_prs_pdu_rel9_t* value = (nfapi_dl_config_prs_pdu_rel9_t*)tlv;
+
+ return( push16(value->transmission_power, ppWritePackedMsg, end) &&
+ push8(value->prs_bandwidth, ppWritePackedMsg, end) &&
+ push8(value->prs_cyclic_prefix_type, ppWritePackedMsg, end) &&
+ push8(value->prs_muting, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_csi_rs_pdu_rel10_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_csi_rs_pdu_rel10_t* value = (nfapi_dl_config_csi_rs_pdu_rel10_t*)tlv;
+
+ return( push8(value->csi_rs_antenna_port_count_r10, ppWritePackedMsg, end) &&
+ push8(value->csi_rs_resource_config_r10, ppWritePackedMsg, end) &&
+ push16(value->transmission_power, ppWritePackedMsg, end) &&
+ push16(value->csi_rs_zero_tx_power_resource_config_bitmap_r10, ppWritePackedMsg, end) &&
+ push8(value->csi_rs_number_of_nzp_configuration, ppWritePackedMsg, end) &&
+ pusharray8(value->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, value->csi_rs_number_of_nzp_configuration, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_csi_rs_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_csi_rs_pdu_rel13_t* value = (nfapi_dl_config_csi_rs_pdu_rel13_t*)tlv;
+
+ if(!(push8(value->csi_rs_class, ppWritePackedMsg, end) &&
+ push8(value->cdm_type, ppWritePackedMsg, end) &&
+ push8(value->num_bf_vector, ppWritePackedMsg, end)))
+ {
+ return 0;
+ }
+
+ uint16_t i;
+ for(i = 0; i < value->num_bf_vector; ++i)
+ {
+ if(!(push8(value->bf_vector[i].csi_rs_resource_index, ppWritePackedMsg, end) &&
+ pusharray16(value->bf_vector[i].bf_value, NFAPI_MAX_ANTENNA_PORT_COUNT, NFAPI_MAX_ANTENNA_PORT_COUNT, ppWritePackedMsg, end)))
+ return 0;
+ }
+
+ return 1;
+}
+static uint8_t pack_bf_vector(nfapi_bf_vector_t* vector, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ return ( push8(vector->subband_index, ppWritePackedMsg, end) &&
+ push8(vector->num_antennas, ppWritePackedMsg, end) &&
+ pusharray16(vector->bf_value, NFAPI_MAX_NUM_ANTENNAS, vector->num_antennas, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_dl_config_epdcch_parameters_rel11_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_epdcch_parameters_rel11_t* value = (nfapi_dl_config_epdcch_parameters_rel11_t*)tlv;
+
+ return ( push8(value->epdcch_resource_assignment_flag, ppWritePackedMsg, end) &&
+ push16(value->epdcch_id, ppWritePackedMsg, end) &&
+ push8(value->epdcch_start_symbol, ppWritePackedMsg, end) &&
+ push8(value->epdcch_num_prb, ppWritePackedMsg, end) &&
+ pusharray8(value->epdcch_prb_index, NFAPI_MAX_EPDCCH_PRB, value->epdcch_num_prb, ppWritePackedMsg, end) &&
+ pack_bf_vector(&value->bf_vector, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_epdcch_parameters_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_epdcch_parameters_rel13_t* value = (nfapi_dl_config_epdcch_parameters_rel13_t*)tlv;
+
+ return (push8(value->dwpts_symbols, ppWritePackedMsg, end) &&
+ push8(value->initial_lbt_sf, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_mpdcch_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_mpdcch_pdu_rel13_t* value = (nfapi_dl_config_mpdcch_pdu_rel13_t*)tlv;
+
+ return ( push8(value->mpdcch_narrow_band, ppWritePackedMsg, end) &&
+ push8(value->number_of_prb_pairs, ppWritePackedMsg, end) &&
+ push8(value->resource_block_assignment, ppWritePackedMsg, end) &&
+ push8(value->mpdcch_tansmission_type, ppWritePackedMsg, end) &&
+ push8(value->start_symbol, ppWritePackedMsg, end) &&
+ push8(value->ecce_index, ppWritePackedMsg, end) &&
+ push8(value->aggregation_level, ppWritePackedMsg, end) &&
+ push8(value->rnti_type, ppWritePackedMsg, end) &&
+ push16(value->rnti, ppWritePackedMsg, end) &&
+ push8(value->ce_mode, ppWritePackedMsg, end) &&
+ push16(value->drms_scrambling_init, ppWritePackedMsg, end) &&
+ push16(value->initial_transmission_sf_io, ppWritePackedMsg, end) &&
+ push16(value->transmission_power, ppWritePackedMsg, end) &&
+ push8(value->dci_format, ppWritePackedMsg, end) &&
+ push16(value->resource_block_coding, ppWritePackedMsg, end) &&
+ push8(value->mcs, ppWritePackedMsg, end) &&
+ push8(value->pdsch_reptition_levels, ppWritePackedMsg, end) &&
+ push8(value->redundancy_version, ppWritePackedMsg, end) &&
+ push8(value->new_data_indicator, ppWritePackedMsg, end) &&
+ push8(value->harq_process, ppWritePackedMsg, end) &&
+ push8(value->tpmi_length, ppWritePackedMsg, end) &&
+ push8(value->tpmi, ppWritePackedMsg, end) &&
+ push8(value->pmi_flag, ppWritePackedMsg, end) &&
+ push8(value->pmi, ppWritePackedMsg, end) &&
+ push8(value->harq_resource_offset, ppWritePackedMsg, end) &&
+ push8(value->dci_subframe_repetition_number, ppWritePackedMsg, end) &&
+ push8(value->tpc, ppWritePackedMsg, end) &&
+ push8(value->downlink_assignment_index_length, ppWritePackedMsg, end) &&
+ push8(value->downlink_assignment_index, ppWritePackedMsg, end) &&
+ push8(value->allocate_prach_flag, ppWritePackedMsg, end) &&
+ push8(value->preamble_index, ppWritePackedMsg, end) &&
+ push8(value->prach_mask_index, ppWritePackedMsg, end) &&
+ push8(value->starting_ce_level, ppWritePackedMsg, end) &&
+ push8(value->srs_request, ppWritePackedMsg, end) &&
+ push8(value->antenna_ports_and_scrambling_identity_flag, ppWritePackedMsg, end) &&
+ push8(value->antenna_ports_and_scrambling_identity, ppWritePackedMsg, end) &&
+ push8(value->frequency_hopping_enabled_flag, ppWritePackedMsg, end) &&
+ push8(value->paging_direct_indication_differentiation_flag, ppWritePackedMsg, end) &&
+ push8(value->direct_indication, ppWritePackedMsg, end) &&
+ push8(value->total_dci_length_including_padding, ppWritePackedMsg, end) &&
+ push8(value->number_of_tx_antenna_ports, ppWritePackedMsg, end) &&
+ pusharray16(value->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, value->number_of_tx_antenna_ports, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_dl_config_nbch_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_nbch_pdu_rel13_t* value = (nfapi_dl_config_nbch_pdu_rel13_t*)tlv;
+
+ return (push16(value->length, ppWritePackedMsg, end) &&
+ push16(value->pdu_index, ppWritePackedMsg, end) &&
+ push16(value->transmission_power, ppWritePackedMsg, end) &&
+ push16(value->hyper_sfn_2_lsbs, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_dl_config_npdcch_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_npdcch_pdu_rel13_t* value = (nfapi_dl_config_npdcch_pdu_rel13_t*)tlv;
+
+ return (push16(value->length, ppWritePackedMsg, end) &&
+ push16(value->pdu_index, ppWritePackedMsg, end) &&
+ push8(value->ncce_index, ppWritePackedMsg, end) &&
+ push8(value->aggregation_level, ppWritePackedMsg, end) &&
+ push8(value->start_symbol, ppWritePackedMsg, end) &&
+ push8(value->rnti_type, ppWritePackedMsg, end) &&
+ push16(value->rnti, ppWritePackedMsg, end) &&
+ push8(value->scrambling_reinitialization_batch_index, ppWritePackedMsg, end) &&
+ push8(value->nrs_antenna_ports_assumed_by_the_ue, ppWritePackedMsg, end) &&
+ push8(value->dci_format, ppWritePackedMsg, end) &&
+ push8(value->scheduling_delay, ppWritePackedMsg, end) &&
+ push8(value->resource_assignment, ppWritePackedMsg, end) &&
+ push8(value->repetition_number, ppWritePackedMsg, end) &&
+ push8(value->mcs, ppWritePackedMsg, end) &&
+ push8(value->new_data_indicator, ppWritePackedMsg, end) &&
+ push8(value->harq_ack_resource, ppWritePackedMsg, end) &&
+ push8(value->npdcch_order_indication, ppWritePackedMsg, end) &&
+ push8(value->starting_number_of_nprach_repetitions, ppWritePackedMsg, end) &&
+ push8(value->subcarrier_indication_of_nprach, ppWritePackedMsg, end) &&
+ push8(value->paging_direct_indication_differentation_flag, ppWritePackedMsg, end) &&
+ push8(value->direct_indication, ppWritePackedMsg, end) &&
+ push8(value->dci_subframe_repetition_number, ppWritePackedMsg, end) &&
+ push8(value->total_dci_length_including_padding, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_dl_config_ndlsch_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_ndlsch_pdu_rel13_t* value = (nfapi_dl_config_ndlsch_pdu_rel13_t*)tlv;
+
+ return (push16(value->length, ppWritePackedMsg, end) &&
+ push16(value->pdu_index, ppWritePackedMsg, end) &&
+ push8(value->start_symbol, ppWritePackedMsg, end) &&
+ push8(value->rnti_type, ppWritePackedMsg, end) &&
+ push16(value->rnti, ppWritePackedMsg, end) &&
+ push16(value->resource_assignment, ppWritePackedMsg, end) &&
+ push16(value->repetition_number, ppWritePackedMsg, end) &&
+ push8(value->modulation, ppWritePackedMsg, end) &&
+ push8(value->number_of_subframes_for_resource_assignment, ppWritePackedMsg, end) &&
+ push8(value->scrambling_sequence_initialization_cinit, ppWritePackedMsg, end) &&
+ push16(value->sf_idx, ppWritePackedMsg, end) &&
+ push8(value->nrs_antenna_ports_assumed_by_the_ue, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_dl_tti_request_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_nr_dl_tti_request_pdu_t* value = (nfapi_nr_dl_tti_request_pdu_t*)tlv;
+
+ if(!(push16(value->PDUSize, ppWritePackedMsg, end) &&
+ push16(value->PDUType, ppWritePackedMsg, end) ))
+ return 0;
+
+
+ // first match the pdu type, then call the respective function
+ switch(value->PDUType)
+ {
+ case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE:
+ {
+ if(!(pack_dl_tti_csi_rs_pdu_rel15_value(&value->csi_rs_pdu.csi_rs_pdu_rel15,ppWritePackedMsg,end)))
+ return 0;
+ }
+ break;
+
+ case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE:
+ {
+ if(!(pack_dl_tti_pdcch_pdu_rel15_value(&value->pdcch_pdu.pdcch_pdu_rel15,ppWritePackedMsg,end)))
+ return 0;
+ }
+ break;
+ case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE:
+ {
+ if(!(pack_dl_tti_pdsch_pdu_rel15_value(&value->pdsch_pdu.pdsch_pdu_rel15,ppWritePackedMsg,end)))
+ return 0;
+ }
+ break;
+ case NFAPI_NR_DL_TTI_SSB_PDU_TYPE:
+ {
+ if(!(pack_dl_tti_ssb_pdu_rel15_value(&value->ssb_pdu.ssb_pdu_rel15,ppWritePackedMsg,end)))
+ return 0;
+ }
+ break;
+
+ default:
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid DL_TTI pdu type %d \n", value->PDUType );
+ }
+ break;
+ }
+
+ return 1;
+}
+
+static uint8_t pack_dl_config_request_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ 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) &&
+ push8(value->number_pdsch_rnti, ppWritePackedMsg, end) &&
+ push16(value->transmission_power_pcfich, ppWritePackedMsg, end)))
+ {
+ return 0;
+ }
+
+ uint16_t i = 0;
+ uint16_t total_number_of_pdus = value->number_pdu;
+ for(; i < total_number_of_pdus; ++i)
+ {
+ nfapi_dl_config_request_pdu_t* pdu = &(value->dl_config_pdu_list[i]);
+
+ if(push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
+ return 0;
+
+ // Put a 0 size in and then determine the size after the pdu
+ // has been writen and write the calculated size
+ uint8_t* pWritePackedMsgPduSize = *ppWritePackedMsg;
+ pdu->pdu_size = 0;
+ if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
+ return 0;
+
+ switch(pdu->pdu_type)
+ {
+ 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) &&
+ pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL11_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel11, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel11_value) &&
+ pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL12_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel12, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel12_value) &&
+ pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL13_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel13_value)))
+ {
+ return 0;
+ }
+ }
+ 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;
+ }
+ break;
+ case NFAPI_DL_CONFIG_MCH_PDU_TYPE:
+ {
+ if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_MCH_PDU_REL8_TAG, &pdu->mch_pdu.mch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_mch_pdu_rel8_value)))
+ return 0;
+ }
+ break;
+ case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE:
+ {
+ if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel8_value) &&
+ pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL9_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel9_value) &&
+ pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL10_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel10_value) &&
+ pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL11_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel11, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel11_value) &&
+ pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL12_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel12, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel12_value) &&
+ pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL13_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel13_value)))
+ return 0;
+ }
+ break;
+ case NFAPI_DL_CONFIG_PCH_PDU_TYPE:
+ {
+ if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL8_TAG, &pdu->pch_pdu.pch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_pch_pdu_rel8_value) &&
+ pack_tlv(NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL13_TAG, &pdu->pch_pdu.pch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_pch_pdu_rel13_value)))
+ return 0;
+ }
+ break;
+ case NFAPI_DL_CONFIG_PRS_PDU_TYPE:
+ {
+ if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_PRS_PDU_REL9_TAG, &pdu->prs_pdu.prs_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_prs_pdu_rel9_value)))
+ return 0;
+ }
+ break;
+ case NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE:
+ {
+ if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL10_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_csi_rs_pdu_rel10_value) &&
+ pack_tlv(NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL13_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_csi_rs_pdu_rel13_value)))
+ return 0;
+ }
+ break;
+ case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE:
+ {
+ if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL8_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel8_value) &&
+ pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL9_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel9_value) &&
+ pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL10_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel10_value) &&
+ pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL11_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel11, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel11_value) &&
+ pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL12_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel12, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel12_value) &&
+ pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL13_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel13_value) &&
+ pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL11_TAG, &pdu->epdcch_pdu.epdcch_params_rel11, ppWritePackedMsg, end, &pack_dl_config_epdcch_parameters_rel11_value) &
+ pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL13_TAG, &pdu->epdcch_pdu.epdcch_params_rel13, ppWritePackedMsg, end, &pack_dl_config_epdcch_parameters_rel13_value)))
+ return 0;
+ }
+ break;
+ case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE:
+ {
+ if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_MPDCCH_PDU_REL13_TAG, &pdu->mpdcch_pdu.mpdcch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_mpdcch_pdu_rel13_value)))
+ return 0;
+ }
+ break;
+ case NFAPI_DL_CONFIG_NBCH_PDU_TYPE:
+ {
+ if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_NBCH_PDU_REL13_TAG, &pdu->nbch_pdu.nbch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_nbch_pdu_rel13_value)))
+ return 0;
+ }
+ break;
+ case NFAPI_DL_CONFIG_NPDCCH_PDU_TYPE:
+ {
+ if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_NPDCCH_PDU_REL13_TAG, &pdu->npdcch_pdu.npdcch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_npdcch_pdu_rel13_value)))
+ return 0;
+ }
+ break;
+ case NFAPI_DL_CONFIG_NDLSCH_PDU_TYPE:
+ {
+ if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_NDLSCH_PDU_REL13_TAG, &pdu->ndlsch_pdu.ndlsch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_ndlsch_pdu_rel13_value)))
+ return 0;
+ }
+ break;
+ default:
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
+ }
+ break;
+ };
+
+ // add 1 for the pdu_type. The delta will include the pdu_size
+ pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
+ push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
+ }
+
+ return 1;
+}
+
+
+static uint8_t pack_dl_tti_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_nr_dl_tti_request_t *pNfapiMsg = (nfapi_nr_dl_tti_request_t*)msg;
+
+ if (!(push16(pNfapiMsg->SFN , ppWritePackedMsg, end) &&
+ push16(pNfapiMsg->Slot , ppWritePackedMsg, end) &&
+ push8(pNfapiMsg->dl_tti_request_body.nGroup , ppWritePackedMsg, end) &&
+ push8(pNfapiMsg->dl_tti_request_body.nPDUs , ppWritePackedMsg, end) &&
+ pusharray8(pNfapiMsg->dl_tti_request_body.nUe ,256,pNfapiMsg->dl_tti_request_body.nGroup, ppWritePackedMsg, end)
+ //pusharray8(pNfapiMsg->PduIdx[0] ,256,256, ppWritePackedMsg, end)
+ ))
+ return 0;
+
+ int arr[12];
+ for(int i=0;idl_tti_request_body.nGroup;i++)
+ {
+ for(int j=0;jdl_tti_request_body.nUe[i];j++)
+ {
+ arr[j] = pNfapiMsg->dl_tti_request_body.PduIdx[i][j];
+ }
+ if(!(pusharrays32(arr,12,pNfapiMsg->dl_tti_request_body.nUe[i],ppWritePackedMsg, end)))
+ return 0;
+ }
+
+ for(int i=0;idl_tti_request_body.nPDUs;i++)
+ {
+ if(!pack_dl_tti_request_body_value(&pNfapiMsg->dl_tti_request_body.dl_tti_pdu_list[i],ppWritePackedMsg,end))
+ return 0;
+ }
+
+return 1;
+}
+
+
+static uint8_t pack_dl_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ 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));
+ {
+ 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)
+{
+ nfapi_ul_config_ulsch_pdu_rel8_t* ulsch_pdu_rel8 = (nfapi_ul_config_ulsch_pdu_rel8_t*)tlv;
+
+ return( push32(ulsch_pdu_rel8->handle, ppWritePackedMsg, end) &&
+ push16(ulsch_pdu_rel8->size, ppWritePackedMsg, end) &&
+ push16(ulsch_pdu_rel8->rnti, ppWritePackedMsg, end) &&
+ push8(ulsch_pdu_rel8->resource_block_start, ppWritePackedMsg, end) &&
+ push8(ulsch_pdu_rel8->number_of_resource_blocks, ppWritePackedMsg, end) &&
+ push8(ulsch_pdu_rel8->modulation_type, ppWritePackedMsg, end) &&
+ push8(ulsch_pdu_rel8->cyclic_shift_2_for_drms, ppWritePackedMsg, end) &&
+ push8(ulsch_pdu_rel8->frequency_hopping_enabled_flag, ppWritePackedMsg, end) &&
+ push8(ulsch_pdu_rel8->frequency_hopping_bits, ppWritePackedMsg, end) &&
+ push8(ulsch_pdu_rel8->new_data_indication, ppWritePackedMsg, end) &&
+ push8(ulsch_pdu_rel8->redundancy_version, ppWritePackedMsg, end) &&
+ push8(ulsch_pdu_rel8->harq_process_number, ppWritePackedMsg, end) &&
+ push8(ulsch_pdu_rel8->ul_tx_mode, ppWritePackedMsg, end) &&
+ push8(ulsch_pdu_rel8->current_tx_nb, ppWritePackedMsg, end) &&
+ push8(ulsch_pdu_rel8->n_srs, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_ulsch_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_ulsch_pdu_rel10_t* ulsch_pdu_rel10 = (nfapi_ul_config_ulsch_pdu_rel10_t*)tlv;
+
+ return (push8(ulsch_pdu_rel10->resource_allocation_type, ppWritePackedMsg, end) &&
+ push32(ulsch_pdu_rel10->resource_block_coding, ppWritePackedMsg, end) &&
+ push8(ulsch_pdu_rel10->transport_blocks, ppWritePackedMsg, end) &&
+ push8(ulsch_pdu_rel10->transmission_scheme, ppWritePackedMsg, end) &&
+ push8(ulsch_pdu_rel10->number_of_layers, ppWritePackedMsg, end) &&
+ push8(ulsch_pdu_rel10->codebook_index, ppWritePackedMsg, end) &&
+ push8(ulsch_pdu_rel10->disable_sequence_hopping_flag, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_ulsch_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_ulsch_pdu_rel11_t* ulsch_pdu_rel11 = (nfapi_ul_config_ulsch_pdu_rel11_t*)tlv;
+
+ return (push8(ulsch_pdu_rel11->virtual_cell_id_enabled_flag, ppWritePackedMsg, end) &&
+ push16(ulsch_pdu_rel11->npusch_identity, ppWritePackedMsg, end) &&
+ push8(ulsch_pdu_rel11->dmrs_config_flag, ppWritePackedMsg, end) &&
+ push16(ulsch_pdu_rel11->ndmrs_csh_identity, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_ulsch_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_ulsch_pdu_rel13_t* ulsch_pdu_rel13 = (nfapi_ul_config_ulsch_pdu_rel13_t*)tlv;
+
+ return (push8(ulsch_pdu_rel13->ue_type, ppWritePackedMsg, end) &&
+ push16(ulsch_pdu_rel13->total_number_of_repetitions, ppWritePackedMsg, end) &&
+ push16(ulsch_pdu_rel13->repetition_number, ppWritePackedMsg, end) &&
+ push16(ulsch_pdu_rel13->initial_transmission_sf_io, ppWritePackedMsg, end) &&
+ push8(ulsch_pdu_rel13->empty_symbols_due_to_re_tunning, ppWritePackedMsg, end));
+}
+
+//Pack fns for ul_tti PDUS
+
+
+static uint8_t pack_ul_tti_request_prach_pdu(nfapi_nr_prach_pdu_t* prach_pdu, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ return(
+ push16(prach_pdu->phys_cell_id, ppWritePackedMsg, end) &&
+ push8(prach_pdu->num_prach_ocas, ppWritePackedMsg, end) &&
+ push8(prach_pdu->prach_format, ppWritePackedMsg, end) &&
+ push8(prach_pdu->num_ra, ppWritePackedMsg, end) &&
+ push8(prach_pdu->prach_start_symbol, ppWritePackedMsg, end) &&
+ push16(prach_pdu->num_cs, ppWritePackedMsg, end)
+ // TODO: ignoring beamforming tlv for now
+ );
+
+}
+
+static uint8_t pack_ul_tti_request_pucch_pdu(nfapi_nr_pucch_pdu_t* pucch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ return(
+ push16(pucch_pdu->rnti, ppWritePackedMsg, end) &&
+ push32(pucch_pdu->handle, ppWritePackedMsg, end) &&
+ push16(pucch_pdu->bwp_size, ppWritePackedMsg, end) &&
+ push16(pucch_pdu->bwp_start, ppWritePackedMsg, end) &&
+ push8(pucch_pdu->subcarrier_spacing, ppWritePackedMsg, end) &&
+ push8(pucch_pdu->cyclic_prefix, ppWritePackedMsg, end) &&
+ push8(pucch_pdu->format_type, ppWritePackedMsg, end) &&
+ push8(pucch_pdu->multi_slot_tx_indicator, ppWritePackedMsg, end) &&
+ push16(pucch_pdu->prb_start, ppWritePackedMsg, end) &&
+ push16(pucch_pdu->prb_size, ppWritePackedMsg, end) &&
+ push8(pucch_pdu->start_symbol_index, ppWritePackedMsg, end) &&
+ push8(pucch_pdu->nr_of_symbols, ppWritePackedMsg, end) &&
+ push8(pucch_pdu->freq_hop_flag, ppWritePackedMsg, end) &&
+ push16(pucch_pdu->second_hop_prb, ppWritePackedMsg, end) &&
+ push8(pucch_pdu->group_hop_flag, ppWritePackedMsg, end) &&
+ push8(pucch_pdu->sequence_hop_flag, ppWritePackedMsg, end) &&
+ push16(pucch_pdu->hopping_id, ppWritePackedMsg, end) &&
+ push16(pucch_pdu->initial_cyclic_shift, ppWritePackedMsg, end) &&
+ push16(pucch_pdu->data_scrambling_id, ppWritePackedMsg, end) &&
+ push8(pucch_pdu->time_domain_occ_idx, ppWritePackedMsg, end) &&
+ push8(pucch_pdu->pre_dft_occ_idx, ppWritePackedMsg, end) &&
+ push8(pucch_pdu->pre_dft_occ_len, ppWritePackedMsg, end) &&
+ push8(pucch_pdu->add_dmrs_flag, ppWritePackedMsg, end) &&
+ push16(pucch_pdu->dmrs_scrambling_id, ppWritePackedMsg, end) &&
+ push8(pucch_pdu->dmrs_cyclic_shift, ppWritePackedMsg, end) &&
+ push8(pucch_pdu->sr_flag, ppWritePackedMsg, end) &&
+ push8(pucch_pdu->bit_len_harq, ppWritePackedMsg, end) &&
+ push16(pucch_pdu->bit_len_csi_part1, ppWritePackedMsg, end) &&
+ push16(pucch_pdu->bit_len_csi_part2, ppWritePackedMsg, end)
+ // TODO: ignoring beamforming tlv for now
+ );
+
+}
+
+
+static uint8_t pack_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t* pusch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+
+ if (!(
+ push16(pusch_pdu->pdu_bit_map, ppWritePackedMsg, end) &&
+ push16(pusch_pdu->rnti, ppWritePackedMsg, end) &&
+ push32(pusch_pdu->handle, ppWritePackedMsg, end) &&
+ push16(pusch_pdu->bwp_size, ppWritePackedMsg, end) &&
+ push16(pusch_pdu->bwp_start, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->subcarrier_spacing, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->cyclic_prefix, ppWritePackedMsg, end) &&
+ push16(pusch_pdu->target_code_rate, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->qam_mod_order, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->mcs_index, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->mcs_table, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->transform_precoding, ppWritePackedMsg, end) &&
+ push16(pusch_pdu->data_scrambling_id, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->nrOfLayers, ppWritePackedMsg, end) &&
+ push16(pusch_pdu->ul_dmrs_symb_pos, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->dmrs_config_type, ppWritePackedMsg, end) &&
+ push16(pusch_pdu->ul_dmrs_scrambling_id, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->scid, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->num_dmrs_cdm_grps_no_data, ppWritePackedMsg, end) &&
+ push16(pusch_pdu->dmrs_ports, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->resource_alloc, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->resource_alloc,ppWritePackedMsg, end) &&
+ push16(pusch_pdu->dmrs_ports, ppWritePackedMsg, end) &&
+ push16(pusch_pdu->rb_start, ppWritePackedMsg, end) &&
+ push16(pusch_pdu->rb_size, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->vrb_to_prb_mapping, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->frequency_hopping, ppWritePackedMsg, end) &&
+ push16(pusch_pdu->tx_direct_current_location, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->uplink_frequency_shift_7p5khz, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->start_symbol_index, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->nr_of_symbols, ppWritePackedMsg, end)
+ // TODO: ignoring beamforming tlv for now
+ ))
+ return 0;
+
+
+ //Pack Optional Data only included if indicated in pduBitmap
+ switch(pusch_pdu->pdu_bit_map){
+ case PUSCH_PDU_BITMAP_PUSCH_DATA:
+ {
+ // pack optional TLVs
+ return(
+ push8(pusch_pdu->pusch_data.rv_index, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->pusch_data.harq_process_id, ppWritePackedMsg, end) &&
+ push32(pusch_pdu->pusch_data.tb_size, ppWritePackedMsg, end) &&
+ push16(pusch_pdu->pusch_data.num_cb, ppWritePackedMsg, end) &&
+ pusharray8(pusch_pdu->pusch_data.cb_present_and_position,1,1,ppWritePackedMsg, end)
+ );
+ }
+ break;
+
+ case PUSCH_PDU_BITMAP_PUSCH_UCI:
+ {
+ return(
+ push16(pusch_pdu->pusch_uci.harq_ack_bit_length, ppWritePackedMsg, end) &&
+ push16(pusch_pdu->pusch_uci.csi_part1_bit_length, ppWritePackedMsg, end) &&
+ push16(pusch_pdu->pusch_uci.csi_part2_bit_length, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->pusch_uci.alpha_scaling, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->pusch_uci.beta_offset_harq_ack, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->pusch_uci.beta_offset_csi1, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->pusch_uci.beta_offset_csi2, ppWritePackedMsg, end)
+ );
+ }
+ break;
+
+ case PUSCH_PDU_BITMAP_PUSCH_PTRS:
+ {
+ return(
+ push8(pusch_pdu->pusch_ptrs.num_ptrs_ports, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_dmrs_port, ppWritePackedMsg, end) &&
+ push16(pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_port_index, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_re_offset, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->pusch_ptrs.ptrs_time_density, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->pusch_ptrs.ptrs_freq_density, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->pusch_ptrs.ul_ptrs_power, ppWritePackedMsg, end)
+ );
+ }
+ break;
+
+ case PUSCH_PDU_BITMAP_DFTS_OFDM:
+ {
+ return(
+ push8(pusch_pdu->dfts_ofdm.low_papr_group_number, ppWritePackedMsg, end) &&
+ push16(pusch_pdu->dfts_ofdm.low_papr_sequence_number, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->dfts_ofdm.ul_ptrs_sample_density, ppWritePackedMsg, end) &&
+ push8(pusch_pdu->dfts_ofdm.ul_ptrs_time_density_transform_precoding, ppWritePackedMsg, end)
+ );
+ }
+ break;
+
+ default:
+ {
+ NFAPI_TRACE(NFAPI_TRACE_INFO, "Invalid pdu bitmap %d \n", pusch_pdu->pdu_bit_map );
+ }
+ }
+
+ return 1;
+}
+
+static uint8_t pack_ul_tti_request_srs_pdu(nfapi_nr_srs_pdu_t* srs_pdu, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ return(
+ push16(srs_pdu->rnti, ppWritePackedMsg, end) &&
+ push32(srs_pdu->handle, ppWritePackedMsg, end) &&
+ push16(srs_pdu->bwp_size, ppWritePackedMsg, end) &&
+ push16(srs_pdu->bwp_start, ppWritePackedMsg, end) &&
+ push8(srs_pdu->subcarrier_spacing, ppWritePackedMsg, end) &&
+ push8(srs_pdu->cyclic_prefix, ppWritePackedMsg, end) &&
+ push8(srs_pdu->num_ant_ports, ppWritePackedMsg, end) &&
+ push8(srs_pdu->num_symbols, ppWritePackedMsg, end) &&
+ push8(srs_pdu->num_repetitions, ppWritePackedMsg, end) &&
+ push8(srs_pdu->time_start_position, ppWritePackedMsg, end) &&
+ push8(srs_pdu->config_index, ppWritePackedMsg, end) &&
+ push16(srs_pdu->sequence_id, ppWritePackedMsg, end) &&
+ push8(srs_pdu->bandwidth_index, ppWritePackedMsg, end) &&
+ push8(srs_pdu->comb_size, ppWritePackedMsg, end) &&
+ push8(srs_pdu->comb_offset, ppWritePackedMsg, end) &&
+ push8(srs_pdu->cyclic_shift, ppWritePackedMsg, end) &&
+ push8(srs_pdu->frequency_position, ppWritePackedMsg, end) &&
+ push8(srs_pdu->frequency_shift, ppWritePackedMsg, end) &&
+ push8(srs_pdu->frequency_hopping, ppWritePackedMsg, end) &&
+ push8(srs_pdu->group_or_sequence_hopping, ppWritePackedMsg, end) &&
+ push8(srs_pdu->resource_type, ppWritePackedMsg, end) &&
+ push16(srs_pdu->t_srs, ppWritePackedMsg, end) &&
+ push16(srs_pdu->t_offset, ppWritePackedMsg, end)
+
+ // TODO: ignoring beamforming tlv for now
+ );
+
+}
+
+static uint8_t pack_ul_config_request_ulsch_pdu(nfapi_ul_config_ulsch_pdu* ulsch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL8_TAG, &ulsch_pdu->ulsch_pdu_rel8, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel8_value) &&
+ pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL10_TAG, &ulsch_pdu->ulsch_pdu_rel10, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel10_value) &&
+ pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL11_TAG, &ulsch_pdu->ulsch_pdu_rel11, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel11_value) &&
+ pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL13_TAG, &ulsch_pdu->ulsch_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel13_value));
+}
+
+static uint8_t pack_ul_config_request_cqi_ri_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_cqi_ri_information_rel8_t* cqi_ri_info_rel8 = (nfapi_ul_config_cqi_ri_information_rel8_t*)tlv;
+
+ return ( push8(cqi_ri_info_rel8->dl_cqi_pmi_size_rank_1, ppWritePackedMsg, end) &&
+ push8(cqi_ri_info_rel8->dl_cqi_pmi_size_rank_greater_1, ppWritePackedMsg, end) &&
+ push8(cqi_ri_info_rel8->ri_size, ppWritePackedMsg, end) &&
+ push8(cqi_ri_info_rel8->delta_offset_cqi, ppWritePackedMsg, end) &&
+ push8(cqi_ri_info_rel8->delta_offset_ri, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_cqi_ri_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_cqi_ri_information_rel9_t* cqi_ri_info_rel9 = (nfapi_ul_config_cqi_ri_information_rel9_t*)tlv;
+
+ if(!(push8(cqi_ri_info_rel9->report_type, ppWritePackedMsg, end) &&
+ push8(cqi_ri_info_rel9->delta_offset_cqi, ppWritePackedMsg, end) &&
+ push8(cqi_ri_info_rel9->delta_offset_ri, ppWritePackedMsg, end)))
+ {
+ return 0;
+ }
+
+ switch(cqi_ri_info_rel9->report_type)
+ {
+ case NFAPI_CSI_REPORT_TYPE_PERIODIC:
+ {
+ if(!(push8(cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size, ppWritePackedMsg, end) &&
+ push8(cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.control_type, ppWritePackedMsg, end)))
+ {
+ return 0;
+ }
+ }
+ break;
+ case NFAPI_CSI_REPORT_TYPE_APERIODIC:
+ {
+ if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc, ppWritePackedMsg, end) == 0)
+ return 0;
+
+ uint8_t i;
+ for(i = 0; i < cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc; ++i)
+ {
+ if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size, ppWritePackedMsg, end) == 0)
+ return 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[j], ppWritePackedMsg, end) == 0)
+ return 0;
+ }
+ }
+ }
+ break;
+ default:
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid report type %d \n", cqi_ri_info_rel9->report_type );
+ }
+ break;
+ };
+
+ return 1;
+}
+
+static uint8_t pack_ul_config_request_cqi_ri_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_cqi_ri_information_rel13_t* cqi_ri_info_rel13 = (nfapi_ul_config_cqi_ri_information_rel13_t*)tlv;
+
+ switch(cqi_ri_info_rel13->report_type)
+ {
+ case NFAPI_CSI_REPORT_TYPE_PERIODIC:
+ {
+ if(push16(cqi_ri_info_rel13->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size_2, ppWritePackedMsg, end) == 0)
+ return 0;
+ }
+ break;
+ case NFAPI_CSI_REPORT_TYPE_APERIODIC:
+ {
+ // No parameters
+ }
+ break;
+ default:
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid report type %d \n", cqi_ri_info_rel13->report_type );
+ }
+ break;
+ };
+
+ return 1;
+}
+
+static uint8_t pack_ul_config_request_cqi_ri_information(nfapi_ul_config_cqi_ri_information* cqi_ri_info, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ return (pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL8_TAG, &cqi_ri_info->cqi_ri_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_cqi_ri_rel8_value) &&
+ pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL9_TAG, &cqi_ri_info->cqi_ri_information_rel9, ppWritePackedMsg, end, &pack_ul_config_request_cqi_ri_rel9_value) &&
+ pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL13_TAG, &cqi_ri_info->cqi_ri_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_cqi_ri_rel13_value));
+
+}
+
+static uint8_t pack_ul_config_request_init_tx_params_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_initial_transmission_parameters_rel8_t* init_tx_params_rel8 = (nfapi_ul_config_initial_transmission_parameters_rel8_t*)tlv;
+
+ return (push8(init_tx_params_rel8->n_srs_initial, ppWritePackedMsg, end) &&
+ push8(init_tx_params_rel8->initial_number_of_resource_blocks, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_initial_transmission_parameters(nfapi_ul_config_initial_transmission_parameters* init_tx_params, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ return pack_tlv(NFAPI_UL_CONFIG_REQUEST_INITIAL_TRANSMISSION_PARAMETERS_REL8_TAG, &init_tx_params->initial_transmission_parameters_rel8, ppWritePackedMsg, end, &pack_ul_config_request_init_tx_params_rel8_value);
+}
+
+static uint8_t pack_ul_config_request_ulsch_harq_info_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_ulsch_harq_information_rel10_t* harq_info_rel10 = (nfapi_ul_config_ulsch_harq_information_rel10_t*)tlv;
+
+ return (push8(harq_info_rel10->harq_size, ppWritePackedMsg, end) &&
+ push8(harq_info_rel10->delta_offset_harq, ppWritePackedMsg, end) &&
+ push8(harq_info_rel10->ack_nack_mode, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_ulsch_harq_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_ulsch_harq_information_rel13_t* harq_info_rel13 = (nfapi_ul_config_ulsch_harq_information_rel13_t*)tlv;
+
+ return (push16(harq_info_rel13->harq_size_2, ppWritePackedMsg, end) &&
+ push8(harq_info_rel13->delta_offset_harq_2, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_ulsch_harq_information(nfapi_ul_config_ulsch_harq_information* harq_info, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL10_TAG, &harq_info->harq_information_rel10, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_harq_info_rel10_value) &&
+ pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL13_TAG, &harq_info->harq_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_harq_info_rel13_value));
+}
+
+static uint8_t pack_ul_config_request_ue_info_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_ue_information_rel8_t* ue_info_rel8 = (nfapi_ul_config_ue_information_rel8_t*)tlv;
+
+ return ( push32(ue_info_rel8->handle, ppWritePackedMsg, end) &&
+ push16(ue_info_rel8->rnti, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_ue_info_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_ue_information_rel11_t* ue_info_rel11 = (nfapi_ul_config_ue_information_rel11_t*)tlv;
+
+ return ( push8(ue_info_rel11->virtual_cell_id_enabled_flag, ppWritePackedMsg, end) &&
+ push16(ue_info_rel11->npusch_identity, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_ue_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_ue_information_rel13_t* ue_info_rel13 = (nfapi_ul_config_ue_information_rel13_t*)tlv;
+
+ return ( push8(ue_info_rel13->ue_type, ppWritePackedMsg, end) &&
+ push8(ue_info_rel13->empty_symbols, ppWritePackedMsg, end) &&
+ push16(ue_info_rel13->total_number_of_repetitions, ppWritePackedMsg, end) &&
+ push16(ue_info_rel13->repetition_number, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_ue_information(nfapi_ul_config_ue_information* ue_info, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG, &ue_info->ue_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_ue_info_rel8_value) &&
+ pack_tlv(NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG, &ue_info->ue_information_rel11, ppWritePackedMsg, end, &pack_ul_config_request_ue_info_rel11_value) &&
+ pack_tlv(NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG, &ue_info->ue_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_ue_info_rel13_value));
+}
+
+static uint8_t pack_ul_config_request_harq_info_rel10_tdd_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_harq_information_rel10_tdd_t* harq_info_rel10_tdd = (nfapi_ul_config_harq_information_rel10_tdd_t*)tlv;
+
+ return ( push8(harq_info_rel10_tdd->harq_size, ppWritePackedMsg, end) &&
+ push8(harq_info_rel10_tdd->ack_nack_mode, ppWritePackedMsg, end) &&
+ push8(harq_info_rel10_tdd->number_of_pucch_resources, ppWritePackedMsg, end) &&
+ push16(harq_info_rel10_tdd->n_pucch_1_0, ppWritePackedMsg, end) &&
+ push16(harq_info_rel10_tdd->n_pucch_1_1, ppWritePackedMsg, end) &&
+ push16(harq_info_rel10_tdd->n_pucch_1_2, ppWritePackedMsg, end) &&
+ push16(harq_info_rel10_tdd->n_pucch_1_3, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_harq_info_rel8_fdd_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_harq_information_rel8_fdd_t* harq_info_rel8_fdd = (nfapi_ul_config_harq_information_rel8_fdd_t*)tlv;
+
+ return ( push16(harq_info_rel8_fdd->n_pucch_1_0, ppWritePackedMsg, end) &&
+ push8(harq_info_rel8_fdd->harq_size, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_harq_info_rel9_fdd_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_harq_information_rel9_fdd_t* harq_info_rel9_fdd = (nfapi_ul_config_harq_information_rel9_fdd_t*)tlv;
+
+ return ( push8(harq_info_rel9_fdd->harq_size, ppWritePackedMsg, end) &&
+ push8(harq_info_rel9_fdd->ack_nack_mode, ppWritePackedMsg, end) &&
+ push8(harq_info_rel9_fdd->number_of_pucch_resources, ppWritePackedMsg, end) &&
+ push16(harq_info_rel9_fdd->n_pucch_1_0, ppWritePackedMsg, end) &&
+ push16(harq_info_rel9_fdd->n_pucch_1_1, ppWritePackedMsg, end) &&
+ push16(harq_info_rel9_fdd->n_pucch_1_2, ppWritePackedMsg, end) &&
+ push16(harq_info_rel9_fdd->n_pucch_1_3, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_harq_info_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_harq_information_rel11_t* harq_info_rel11 = (nfapi_ul_config_harq_information_rel11_t*)tlv;
+
+ return ( push8(harq_info_rel11->num_ant_ports, ppWritePackedMsg, end) &&
+ push16(harq_info_rel11->n_pucch_2_0, ppWritePackedMsg, end) &&
+ push16(harq_info_rel11->n_pucch_2_1, ppWritePackedMsg, end) &&
+ push16(harq_info_rel11->n_pucch_2_2, ppWritePackedMsg, end) &&
+ push16(harq_info_rel11->n_pucch_2_3, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_harq_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_harq_information_rel13_t* harq_info_rel13 = (nfapi_ul_config_harq_information_rel13_t*)tlv;
+
+ return ( push16(harq_info_rel13->harq_size_2, ppWritePackedMsg, end) &&
+ push8(harq_info_rel13->starting_prb, ppWritePackedMsg, end) &&
+ push8(harq_info_rel13->n_prb, ppWritePackedMsg, end) &&
+ push8(harq_info_rel13->cdm_index, ppWritePackedMsg, end) &&
+ push8(harq_info_rel13->n_srs, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_harq_information(nfapi_ul_config_harq_information* harq_info, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL10_TDD_TAG, &harq_info->harq_information_rel10_tdd, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel10_tdd_value) &&
+ pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL8_FDD_TAG, &harq_info->harq_information_rel8_fdd, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel8_fdd_value) &&
+ pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL9_FDD_TAG, &harq_info->harq_information_rel9_fdd, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel9_fdd_value) &&
+ pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL11_TAG, &harq_info->harq_information_rel11, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel11_value) &&
+ pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL13_TAG, &harq_info->harq_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel13_value));
+
+}
+
+static uint8_t pack_ul_config_request_cqi_info_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_cqi_information_rel8_t* cqi_info_rel8 = (nfapi_ul_config_cqi_information_rel8_t*)tlv;
+
+ return ( push16(cqi_info_rel8->pucch_index, ppWritePackedMsg, end) &&
+ push8(cqi_info_rel8->dl_cqi_pmi_size, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_cqi_info_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_cqi_information_rel10_t* cqi_info_rel10 = (nfapi_ul_config_cqi_information_rel10_t*)tlv;
+
+ return ( push8(cqi_info_rel10->number_of_pucch_resource, ppWritePackedMsg, end) &&
+ push16(cqi_info_rel10->pucch_index_p1, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_cqi_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_cqi_information_rel13_t* cqi_info_rel13 = (nfapi_ul_config_cqi_information_rel13_t*)tlv;
+
+ return ( push8(cqi_info_rel13->csi_mode, ppWritePackedMsg, end) &&
+ push16(cqi_info_rel13->dl_cqi_pmi_size_2, ppWritePackedMsg, end) &&
+ push8(cqi_info_rel13->starting_prb, ppWritePackedMsg, end) &&
+ push8(cqi_info_rel13->n_prb, ppWritePackedMsg, end) &&
+ push8(cqi_info_rel13->cdm_index, ppWritePackedMsg, end) &&
+ push8(cqi_info_rel13->n_srs, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_cqi_information(nfapi_ul_config_cqi_information* cqi_info, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG, &cqi_info->cqi_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_cqi_info_rel8_value) &&
+ pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL10_TAG, &cqi_info->cqi_information_rel10, ppWritePackedMsg, end, &pack_ul_config_request_cqi_info_rel10_value) &&
+ pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL13_TAG, &cqi_info->cqi_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_cqi_info_rel13_value));
+
+}
+
+static uint8_t pack_ul_config_request_sr_info_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_sr_information_rel8_t* sr_info_rel8 = (nfapi_ul_config_sr_information_rel8_t*)tlv;
+ return push16(sr_info_rel8->pucch_index, ppWritePackedMsg, end);
+}
+static uint8_t pack_ul_config_request_sr_info_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_sr_information_rel10_t* sr_info_rel10 = (nfapi_ul_config_sr_information_rel10_t*)tlv;
+
+ return ( push8(sr_info_rel10->number_of_pucch_resources, ppWritePackedMsg, end) &&
+ push16(sr_info_rel10->pucch_index_p1, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_sr_information(nfapi_ul_config_sr_information* sr_info, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL8_TAG, &sr_info->sr_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_sr_info_rel8_value) &&
+ pack_tlv(NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL10_TAG, &sr_info->sr_information_rel10, ppWritePackedMsg, end, &pack_ul_config_request_sr_info_rel10_value));
+}
+
+static uint8_t pack_ul_config_request_srs_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_srs_pdu_rel8_t* srs_pdu_rel8 = (nfapi_ul_config_srs_pdu_rel8_t*)tlv;
+
+ return (push32(srs_pdu_rel8->handle, ppWritePackedMsg, end) &&
+ push16(srs_pdu_rel8->size, ppWritePackedMsg, end) &&
+ push16(srs_pdu_rel8->rnti, ppWritePackedMsg, end) &&
+ push8(srs_pdu_rel8->srs_bandwidth, ppWritePackedMsg, end) &&
+ push8(srs_pdu_rel8->frequency_domain_position, ppWritePackedMsg, end) &&
+ push8(srs_pdu_rel8->srs_hopping_bandwidth, ppWritePackedMsg, end) &&
+ push8(srs_pdu_rel8->transmission_comb, ppWritePackedMsg, end) &&
+ push16(srs_pdu_rel8->i_srs, ppWritePackedMsg, end) &&
+ push8(srs_pdu_rel8->sounding_reference_cyclic_shift, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_srs_pdu_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_srs_pdu_rel10_t* srs_pdu_rel10 = (nfapi_ul_config_srs_pdu_rel10_t*)tlv;
+ return push8(srs_pdu_rel10->antenna_port, ppWritePackedMsg, end);
+}
+
+static uint8_t pack_ul_config_request_srs_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_srs_pdu_rel13_t* srs_pdu_rel13 = (nfapi_ul_config_srs_pdu_rel13_t*)tlv;
+
+ return ( push8(srs_pdu_rel13->number_of_combs, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_nb_harq_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_nb_harq_information_rel13_fdd_t* nb_harq_pdu_rel13 = (nfapi_ul_config_nb_harq_information_rel13_fdd_t*)tlv;
+
+ return ( push8(nb_harq_pdu_rel13->harq_ack_resource, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_nulsch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_nulsch_pdu_rel13_t* nulsch_pdu_rel13 = (nfapi_ul_config_nulsch_pdu_rel13_t*)tlv;
+
+ return (push8(nulsch_pdu_rel13->nulsch_format, ppWritePackedMsg, end) &&
+ push32(nulsch_pdu_rel13->handle, ppWritePackedMsg, end) &&
+ push16(nulsch_pdu_rel13->size, ppWritePackedMsg, end) &&
+ push16(nulsch_pdu_rel13->rnti, ppWritePackedMsg, end) &&
+ push8(nulsch_pdu_rel13->subcarrier_indication, ppWritePackedMsg, end) &&
+ push8(nulsch_pdu_rel13->resource_assignment, ppWritePackedMsg, end) &&
+ push8(nulsch_pdu_rel13->mcs, ppWritePackedMsg, end) &&
+ push8(nulsch_pdu_rel13->redudancy_version, ppWritePackedMsg, end) &&
+ push8(nulsch_pdu_rel13->repetition_number, ppWritePackedMsg, end) &&
+ push8(nulsch_pdu_rel13->new_data_indication, ppWritePackedMsg, end) &&
+ push8(nulsch_pdu_rel13->n_srs, ppWritePackedMsg, end) &&
+ push16(nulsch_pdu_rel13->scrambling_sequence_initialization_cinit, ppWritePackedMsg, end) &&
+ push16(nulsch_pdu_rel13->sf_idx, ppWritePackedMsg, end) &&
+ pack_ul_config_request_ue_information(&(nulsch_pdu_rel13->ue_information), ppWritePackedMsg, end) &&
+ pack_tlv(NFAPI_UL_CONFIG_REQUEST_NB_HARQ_INFORMATION_REL13_FDD_TAG, &nulsch_pdu_rel13->nb_harq_information.nb_harq_information_rel13_fdd, ppWritePackedMsg, end, &pack_ul_config_request_nb_harq_rel13_value));
+}
+static uint8_t pack_ul_config_request_nrach_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_nrach_pdu_rel13_t* nrach_pdu_rel13 = (nfapi_ul_config_nrach_pdu_rel13_t*)tlv;
+
+ return ( push8(nrach_pdu_rel13->nprach_config_0, ppWritePackedMsg, end) &&
+ push8(nrach_pdu_rel13->nprach_config_1, ppWritePackedMsg, end) &&
+ push8(nrach_pdu_rel13->nprach_config_2, ppWritePackedMsg, end));
+
+}
+
+
+
+static uint8_t pack_ul_tti_pdu_list_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_nr_ul_tti_request_number_of_pdus_t* value = (nfapi_nr_ul_tti_request_number_of_pdus_t*)tlv;
+
+ if(!(push16(value->pdu_size, ppWritePackedMsg, end) &&
+ push16(value->pdu_type, ppWritePackedMsg, end) ))
+ return 0;
+
+
+ // first match the pdu type, then call the respective function
+ switch(value->pdu_type)
+ {
+ case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE:
+ {
+ if(!pack_ul_tti_request_prach_pdu(&value->prach_pdu, ppWritePackedMsg, end))
+ return 0;
+ }
+ break;
+
+ case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE:
+ {
+ if(!pack_ul_tti_request_pucch_pdu(&value->pucch_pdu, ppWritePackedMsg, end))
+ return 0;
+ }
+ break;
+ case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE:
+ {
+ if(!pack_ul_tti_request_pusch_pdu(&value->pusch_pdu, ppWritePackedMsg, end))
+ return 0;
+ }
+ break;
+ case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE:
+ {
+ if(!pack_ul_tti_request_srs_pdu(&value->srs_pdu, ppWritePackedMsg, end))
+ return 0;
+ }
+ break;
+
+ default:
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid UL_TTI pdu type %d \n", value->pdu_type );
+ }
+ break;
+ }
+
+ return 1;
+}
+
+static uint8_t pack_ul_tti_groups_list_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_nr_ul_tti_request_number_of_groups_t* value = (nfapi_nr_ul_tti_request_number_of_groups_t*)tlv;
+
+ if(!push8(value->n_ue, ppWritePackedMsg, end))
+ return 0;
+ for(int i=0; in_ue;i++)
+ {
+ if(!push8(value->ue_list[i].pdu_idx, ppWritePackedMsg, end))
+ return 0;
+ }
+ return 1;
+}
+
+static uint8_t pack_ul_config_request_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_request_body_t* value = (nfapi_ul_config_request_body_t*)tlv;
+
+ if(!(push8(value->number_of_pdus, ppWritePackedMsg, end) &&
+ push8(value->rach_prach_frequency_resources, ppWritePackedMsg, end) &&
+ push8(value->srs_present, ppWritePackedMsg, end)))
+ return 0;
+
+ uint16_t i = 0;
+ for(i = 0; i < value->number_of_pdus; ++i)
+ {
+ nfapi_ul_config_request_pdu_t* pdu = &(value->ul_config_pdu_list[i]);
+
+ if(push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
+ return 0;
+
+ // Put a 0 size in and then determine the size after the pdu
+ // has been writen and write the calculated size
+ uint8_t* pWritePackedMsgPduSize = *ppWritePackedMsg;
+ pdu->pdu_size = 0;
+ if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
+ return 0;
+
+ switch(pdu->pdu_type)
+ {
+ case NFAPI_UL_CONFIG_ULSCH_PDU_TYPE:
+ {
+ if(!pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_pdu), ppWritePackedMsg, end))
+ return 0;
+ }
+ break;
+ case NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE:
+ {
+ if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_cqi_ri_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
+ pack_ul_config_request_cqi_ri_information(&(pdu->ulsch_cqi_ri_pdu.cqi_ri_information), ppWritePackedMsg, end) &&
+ pack_ul_config_request_initial_transmission_parameters(&(pdu->ulsch_cqi_ri_pdu.initial_transmission_parameters), ppWritePackedMsg, end)))
+ return 0;
+ }
+ break;
+ case NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE:
+ {
+ if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_harq_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
+ pack_ul_config_request_ulsch_harq_information(&(pdu->ulsch_harq_pdu.harq_information), ppWritePackedMsg, end) &&
+ pack_ul_config_request_initial_transmission_parameters(&(pdu->ulsch_harq_pdu.initial_transmission_parameters), ppWritePackedMsg, end)))
+ return 0;
+ }
+ break;
+ case NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE:
+ {
+ if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
+ pack_ul_config_request_cqi_ri_information(&(pdu->ulsch_cqi_harq_ri_pdu.cqi_ri_information), ppWritePackedMsg, end) &&
+ pack_ul_config_request_ulsch_harq_information(&(pdu->ulsch_cqi_harq_ri_pdu.harq_information), ppWritePackedMsg, end) &&
+ pack_ul_config_request_initial_transmission_parameters(&(pdu->ulsch_cqi_harq_ri_pdu.initial_transmission_parameters), ppWritePackedMsg, end)))
+ return 0;
+ }
+ break;
+ case NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE:
+ {
+ if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_pdu.ue_information), ppWritePackedMsg, end) &&
+ pack_ul_config_request_cqi_information(&(pdu->uci_cqi_pdu.cqi_information), ppWritePackedMsg, end)))
+ return 0;
+ }
+ break;
+ case NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE:
+ {
+ if(!(pack_ul_config_request_ue_information(&(pdu->uci_sr_pdu.ue_information), ppWritePackedMsg, end) &&
+ pack_ul_config_request_sr_information(&(pdu->uci_sr_pdu.sr_information), ppWritePackedMsg, end)))
+ return 0;
+ }
+ break;
+ case NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE:
+ {
+ if(!(pack_ul_config_request_ue_information(&(pdu->uci_harq_pdu.ue_information), ppWritePackedMsg, end) &&
+ pack_ul_config_request_harq_information(&(pdu->uci_harq_pdu.harq_information), ppWritePackedMsg, end)))
+ return 0;
+ }
+ break;
+ case NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE:
+ {
+ if(!(pack_ul_config_request_ue_information(&(pdu->uci_sr_harq_pdu.ue_information), ppWritePackedMsg, end) &&
+ pack_ul_config_request_sr_information(&(pdu->uci_sr_harq_pdu.sr_information), ppWritePackedMsg, end) &&
+ pack_ul_config_request_harq_information(&(pdu->uci_sr_harq_pdu.harq_information), ppWritePackedMsg, end)))
+ return 0;
+ }
+ break;
+ case NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE:
+ {
+ if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_harq_pdu.ue_information), ppWritePackedMsg, end) &&
+ pack_ul_config_request_cqi_information(&(pdu->uci_cqi_harq_pdu.cqi_information), ppWritePackedMsg, end) &&
+ pack_ul_config_request_harq_information(&(pdu->uci_cqi_harq_pdu.harq_information), ppWritePackedMsg, end)))
+ return 0;
+ }
+ break;
+ case NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE:
+ {
+ if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_sr_pdu.ue_information), ppWritePackedMsg, end) &&
+ pack_ul_config_request_cqi_information(&(pdu->uci_cqi_sr_pdu.cqi_information), ppWritePackedMsg, end) &&
+ pack_ul_config_request_sr_information(&(pdu->uci_cqi_sr_pdu.sr_information), ppWritePackedMsg, end)))
+ return 0;
+ }
+ break;
+ case NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE:
+ {
+ if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_sr_harq_pdu.ue_information), ppWritePackedMsg, end) &&
+ pack_ul_config_request_cqi_information(&(pdu->uci_cqi_sr_harq_pdu.cqi_information), ppWritePackedMsg, end) &&
+ pack_ul_config_request_sr_information(&(pdu->uci_cqi_sr_harq_pdu.sr_information), ppWritePackedMsg, end) &&
+ pack_ul_config_request_harq_information(&(pdu->uci_cqi_sr_harq_pdu.harq_information), ppWritePackedMsg, end)))
+ return 0;
+ }
+ break;
+ case NFAPI_UL_CONFIG_SRS_PDU_TYPE:
+ {
+ if(!(pack_tlv(NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL8_TAG, &pdu->srs_pdu.srs_pdu_rel8, ppWritePackedMsg, end, &pack_ul_config_request_srs_pdu_rel8_value) &&
+ pack_tlv(NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL10_TAG, &pdu->srs_pdu.srs_pdu_rel10, ppWritePackedMsg, end, &pack_ul_config_request_srs_pdu_rel10_value) &&
+ pack_tlv(NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL13_TAG, &pdu->srs_pdu.srs_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_srs_pdu_rel13_value)))
+ return 0;
+ }
+ break;
+ case NFAPI_UL_CONFIG_HARQ_BUFFER_PDU_TYPE:
+ {
+ if(!(pack_ul_config_request_ue_information(&(pdu->harq_buffer_pdu.ue_information), ppWritePackedMsg, end)))
+ return 0;
+ }
+ break;
+ case NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE:
+ {
+ if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_uci_csi_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
+ pack_ul_config_request_cqi_information(&(pdu->ulsch_uci_csi_pdu.csi_information), ppWritePackedMsg, end)))
+ return 0;
+ }
+ break;
+ case NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE:
+ {
+ if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_uci_harq_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
+ pack_ul_config_request_harq_information(&(pdu->ulsch_uci_harq_pdu.harq_information), ppWritePackedMsg, end)))
+ return 0;
+ }
+ break;
+ case NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE:
+ {
+ if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_csi_uci_harq_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
+ pack_ul_config_request_cqi_information(&(pdu->ulsch_csi_uci_harq_pdu.csi_information), ppWritePackedMsg, end) &&
+ pack_ul_config_request_harq_information(&(pdu->ulsch_csi_uci_harq_pdu.harq_information), ppWritePackedMsg, end)))
+ return 0;
+ }
+ break;
+ case NFAPI_UL_CONFIG_NULSCH_PDU_TYPE:
+ {
+ if(!(pack_tlv(NFAPI_UL_CONFIG_REQUEST_NULSCH_PDU_REL13_TAG, &pdu->nulsch_pdu.nulsch_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_nulsch_pdu_rel13_value)))
+ return 0;
+ }
+ break;
+ case NFAPI_UL_CONFIG_NRACH_PDU_TYPE:
+ {
+ if(!(pack_tlv(NFAPI_UL_CONFIG_REQUEST_NRACH_PDU_REL13_TAG, &pdu->nrach_pdu.nrach_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_nrach_pdu_rel13_value)))
+ return 0;
+ }
+ break;
+ default:
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
+ }
+ break;
+ };
+
+ // add 1 for the pdu_type. The delta will include the pdu_size
+ pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
+ push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
+
+ }
+ return 1;
+}
+
+
+static uint8_t pack_ul_tti_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_nr_ul_tti_request_t *pNfapiMsg = (nfapi_nr_ul_tti_request_t*)msg;
+
+ if (!(push16(pNfapiMsg->SFN , ppWritePackedMsg, end) &&
+ push16(pNfapiMsg->Slot , ppWritePackedMsg, end) &&
+ push8(pNfapiMsg->n_pdus , ppWritePackedMsg, end) &&
+ push8(pNfapiMsg->rach_present, ppWritePackedMsg, end) &&
+ push8(pNfapiMsg->n_ulsch, ppWritePackedMsg, end) &&
+ push8(pNfapiMsg->n_ulcch, ppWritePackedMsg, end) &&
+ push8(pNfapiMsg->n_group, ppWritePackedMsg, end) ))
+ return 0;
+
+ for(int i=0; in_pdus; i++)
+ {
+ if(!pack_ul_tti_pdu_list_value(&pNfapiMsg->pdus_list[i], ppWritePackedMsg, end))
+ return 0;
+ }
+
+ for(int i=0; in_group; i++)
+ {
+ if(!pack_ul_tti_groups_list_value(&pNfapiMsg->groups_list[i], ppWritePackedMsg, end))
+ return 0;
+
+ }
+
+ return 1;
+}
+
+
+static uint8_t pack_ul_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_ul_config_request_t *pNfapiMsg = (nfapi_ul_config_request_t*)msg;
+
+ return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+ pack_tlv(NFAPI_UL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->ul_config_request_body, ppWritePackedMsg, end, &pack_ul_config_request_body_value) &&
+ pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)) ;
+}
+
+static uint8_t pack_hi_dci0_hi_rel8_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_hi_dci0_hi_pdu_rel8_t* hi_pdu_rel8 = (nfapi_hi_dci0_hi_pdu_rel8_t*)tlv;
+
+ return ( push8(hi_pdu_rel8->resource_block_start, ppWritePackedMsg, end) &&
+ push8(hi_pdu_rel8->cyclic_shift_2_for_drms, ppWritePackedMsg, end) &&
+ push8(hi_pdu_rel8->hi_value, ppWritePackedMsg, end) &&
+ push8(hi_pdu_rel8->i_phich, ppWritePackedMsg, end) &&
+ push16(hi_pdu_rel8->transmission_power, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_hi_dci0_hi_rel10_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_hi_dci0_hi_pdu_rel10_t* hi_pdu_rel10 = (nfapi_hi_dci0_hi_pdu_rel10_t*)tlv;
+
+ return ( push8(hi_pdu_rel10->flag_tb2, ppWritePackedMsg, end) &&
+ push8(hi_pdu_rel10->hi_value_2, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_hi_dci0_dci_rel8_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_hi_dci0_dci_pdu_rel8_t* dci_pdu_rel8 = (nfapi_hi_dci0_dci_pdu_rel8_t*)tlv;
+
+ return ( push8(dci_pdu_rel8->dci_format, ppWritePackedMsg, end) &&
+ push8(dci_pdu_rel8->cce_index, ppWritePackedMsg, end) &&
+ push8(dci_pdu_rel8->aggregation_level, ppWritePackedMsg, end) &&
+ push16(dci_pdu_rel8->rnti, ppWritePackedMsg, end) &&
+ push8(dci_pdu_rel8->resource_block_start, ppWritePackedMsg, end) &&
+ push8(dci_pdu_rel8->number_of_resource_block, ppWritePackedMsg, end) &&
+ push8(dci_pdu_rel8->mcs_1, ppWritePackedMsg, end) &&
+ push8(dci_pdu_rel8->cyclic_shift_2_for_drms, ppWritePackedMsg, end) &&
+ push8(dci_pdu_rel8->frequency_hopping_enabled_flag, ppWritePackedMsg, end) &&
+ push8(dci_pdu_rel8->frequency_hopping_bits, ppWritePackedMsg, end) &&
+ push8(dci_pdu_rel8->new_data_indication_1, ppWritePackedMsg, end) &&
+ push8(dci_pdu_rel8->ue_tx_antenna_seleciton, ppWritePackedMsg, end) &&
+ push8(dci_pdu_rel8->tpc, ppWritePackedMsg, end) &&
+ push8(dci_pdu_rel8->cqi_csi_request, ppWritePackedMsg, end) &&
+ push8(dci_pdu_rel8->ul_index, ppWritePackedMsg, end) &&
+ push8(dci_pdu_rel8->dl_assignment_index, ppWritePackedMsg, end) &&
+ push32(dci_pdu_rel8->tpc_bitmap, ppWritePackedMsg, end) &&
+ push16(dci_pdu_rel8->transmission_power, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_hi_dci0_dci_rel10_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_hi_dci0_dci_pdu_rel10_t* dci_pdu_rel10 = (nfapi_hi_dci0_dci_pdu_rel10_t*)tlv;
+
+ return ( push8(dci_pdu_rel10->cross_carrier_scheduling_flag, ppWritePackedMsg, end) &&
+ push8(dci_pdu_rel10->carrier_indicator, ppWritePackedMsg, end) &&
+ push8(dci_pdu_rel10->size_of_cqi_csi_feild, ppWritePackedMsg, end) &&
+ push8(dci_pdu_rel10->srs_flag, ppWritePackedMsg, end) &&
+ push8(dci_pdu_rel10->srs_request, ppWritePackedMsg, end) &&
+ push8(dci_pdu_rel10->resource_allocation_flag, ppWritePackedMsg, end) &&
+ push8(dci_pdu_rel10->resource_allocation_type, ppWritePackedMsg, end) &&
+ push32(dci_pdu_rel10->resource_block_coding, ppWritePackedMsg, end) &&
+ push8(dci_pdu_rel10->mcs_2, ppWritePackedMsg, end) &&
+ push8(dci_pdu_rel10->new_data_indication_2, ppWritePackedMsg, end) &&
+ push8(dci_pdu_rel10->number_of_antenna_ports, ppWritePackedMsg, end) &&
+ push8(dci_pdu_rel10->tpmi, ppWritePackedMsg, end) &&
+ push8(dci_pdu_rel10->total_dci_length_including_padding, ppWritePackedMsg, end) &&
+ push8(dci_pdu_rel10->n_ul_rb, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_hi_dci0_dci_rel12_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_hi_dci0_dci_pdu_rel12_t* dci_pdu_rel12 = (nfapi_hi_dci0_dci_pdu_rel12_t*)tlv;
+
+ return ( push8(dci_pdu_rel12->pscch_resource, ppWritePackedMsg, end) &&
+ push8(dci_pdu_rel12->time_resource_pattern, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_hi_dci0_mpdcch_dci_rel13_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t* mpdcch_dci_pdu_rel13 = (nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t*)tlv;
+
+ return ( push8(mpdcch_dci_pdu_rel13->mpdcch_narrowband, ppWritePackedMsg, end) &&
+ push8(mpdcch_dci_pdu_rel13->number_of_prb_pairs, ppWritePackedMsg, end) &&
+ push8(mpdcch_dci_pdu_rel13->resource_block_assignment, ppWritePackedMsg, end) &&
+ push8(mpdcch_dci_pdu_rel13->mpdcch_transmission_type, ppWritePackedMsg, end) &&
+ push8(mpdcch_dci_pdu_rel13->start_symbol, ppWritePackedMsg, end) &&
+ push8(mpdcch_dci_pdu_rel13->ecce_index, ppWritePackedMsg, end) &&
+ push8(mpdcch_dci_pdu_rel13->aggreagation_level, ppWritePackedMsg, end) &&
+ push8(mpdcch_dci_pdu_rel13->rnti_type, ppWritePackedMsg, end) &&
+ push16(mpdcch_dci_pdu_rel13->rnti, ppWritePackedMsg, end) &&
+ push8(mpdcch_dci_pdu_rel13->ce_mode, ppWritePackedMsg, end) &&
+ push16(mpdcch_dci_pdu_rel13->drms_scrambling_init, ppWritePackedMsg, end) &&
+ push16(mpdcch_dci_pdu_rel13->initial_transmission_sf_io, ppWritePackedMsg, end) &&
+ push16(mpdcch_dci_pdu_rel13->transmission_power, ppWritePackedMsg, end) &&
+ push8(mpdcch_dci_pdu_rel13->dci_format, ppWritePackedMsg, end) &&
+ push8(mpdcch_dci_pdu_rel13->resource_block_start, ppWritePackedMsg, end) &&
+ push8(mpdcch_dci_pdu_rel13->number_of_resource_blocks, ppWritePackedMsg, end) &&
+ push8(mpdcch_dci_pdu_rel13->mcs, ppWritePackedMsg, end) &&
+ push8(mpdcch_dci_pdu_rel13->pusch_repetition_levels, ppWritePackedMsg, end) &&
+ push8(mpdcch_dci_pdu_rel13->frequency_hopping_flag, ppWritePackedMsg, end) &&
+ push8(mpdcch_dci_pdu_rel13->new_data_indication, ppWritePackedMsg, end) &&
+ push8(mpdcch_dci_pdu_rel13->harq_process, ppWritePackedMsg, end) &&
+ push8(mpdcch_dci_pdu_rel13->redudency_version, ppWritePackedMsg, end) &&
+ push8(mpdcch_dci_pdu_rel13->tpc, ppWritePackedMsg, end) &&
+ push8(mpdcch_dci_pdu_rel13->csi_request, ppWritePackedMsg, end) &&
+ push8(mpdcch_dci_pdu_rel13->ul_inex, ppWritePackedMsg, end) &&
+ push8(mpdcch_dci_pdu_rel13->dai_presence_flag, ppWritePackedMsg, end) &&
+ push8(mpdcch_dci_pdu_rel13->dl_assignment_index, ppWritePackedMsg, end) &&
+ push8(mpdcch_dci_pdu_rel13->srs_request, ppWritePackedMsg, end) &&
+ push8(mpdcch_dci_pdu_rel13->dci_subframe_repetition_number, ppWritePackedMsg, end) &&
+ push32(mpdcch_dci_pdu_rel13->tcp_bitmap, ppWritePackedMsg, end) &&
+ push8(mpdcch_dci_pdu_rel13->total_dci_length_include_padding, ppWritePackedMsg, end) &&
+ push8(mpdcch_dci_pdu_rel13->number_of_tx_antenna_ports, ppWritePackedMsg, end) &&
+ pusharray16(mpdcch_dci_pdu_rel13->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, mpdcch_dci_pdu_rel13->number_of_tx_antenna_ports, ppWritePackedMsg, end));
+
+}
+
+static uint8_t pack_hi_dci0_npdcch_dci_rel13_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_hi_dci0_npdcch_dci_pdu_rel13_t* npdcch_dci_pdu_rel13 = (nfapi_hi_dci0_npdcch_dci_pdu_rel13_t*)tlv;
+
+ return ( push8(npdcch_dci_pdu_rel13->ncce_index, ppWritePackedMsg, end) &&
+ push8(npdcch_dci_pdu_rel13->aggregation_level, ppWritePackedMsg, end) &&
+ push8(npdcch_dci_pdu_rel13->start_symbol, ppWritePackedMsg, end) &&
+ push16(npdcch_dci_pdu_rel13->rnti, ppWritePackedMsg, end) &&
+ push8(npdcch_dci_pdu_rel13->scrambling_reinitialization_batch_index, ppWritePackedMsg, end) &&
+ push8(npdcch_dci_pdu_rel13->nrs_antenna_ports_assumed_by_the_ue, ppWritePackedMsg, end) &&
+ push8(npdcch_dci_pdu_rel13->subcarrier_indication, ppWritePackedMsg, end) &&
+ push8(npdcch_dci_pdu_rel13->resource_assignment, ppWritePackedMsg, end) &&
+ push8(npdcch_dci_pdu_rel13->scheduling_delay, ppWritePackedMsg, end) &&
+ push8(npdcch_dci_pdu_rel13->mcs, ppWritePackedMsg, end) &&
+ push8(npdcch_dci_pdu_rel13->redudancy_version, ppWritePackedMsg, end) &&
+ push8(npdcch_dci_pdu_rel13->repetition_number, ppWritePackedMsg, end) &&
+ push8(npdcch_dci_pdu_rel13->new_data_indicator, ppWritePackedMsg, end) &&
+ push8(npdcch_dci_pdu_rel13->dci_subframe_repetition_number, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_hi_dci0_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_hi_dci0_request_body_t* value = (nfapi_hi_dci0_request_body_t*)tlv;
+
+ if(!(push16(value->sfnsf, ppWritePackedMsg, end) &&
+ push8(value->number_of_dci, ppWritePackedMsg, end) &&
+ push8(value->number_of_hi, ppWritePackedMsg, end)))
+ return 0;
+
+ uint16_t i = 0;
+ uint16_t total_number_of_pdus = value->number_of_dci + value->number_of_hi;
+ for(i = 0; i < total_number_of_pdus; ++i)
+ {
+ nfapi_hi_dci0_request_pdu_t* pdu = &(value->hi_dci0_pdu_list[i]);
+
+ if(push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
+ return 0;
+
+ // Put a 0 size in and then determine the size after the pdu
+ // has been writen and write the calculated size
+ uint8_t* pWritePackedMsgPduSize = *ppWritePackedMsg;
+ pdu->pdu_size = 0;
+ if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
+ return 0;
+
+ switch(pdu->pdu_type)
+ {
+ case NFAPI_HI_DCI0_HI_PDU_TYPE:
+ {
+ if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_HI_PDU_REL8_TAG, &pdu->hi_pdu.hi_pdu_rel8, ppWritePackedMsg, end, pack_hi_dci0_hi_rel8_pdu_value) &&
+ pack_tlv(NFAPI_HI_DCI0_REQUEST_HI_PDU_REL10_TAG, &pdu->hi_pdu.hi_pdu_rel10, ppWritePackedMsg, end, pack_hi_dci0_hi_rel10_pdu_value)))
+ return 0;
+ }
+ break;
+ case NFAPI_HI_DCI0_DCI_PDU_TYPE:
+ {
+ if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG, &pdu->dci_pdu.dci_pdu_rel8, ppWritePackedMsg, end, pack_hi_dci0_dci_rel8_pdu_value) &&
+ pack_tlv(NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL10_TAG, &pdu->dci_pdu.dci_pdu_rel10, ppWritePackedMsg, end, pack_hi_dci0_dci_rel10_pdu_value) &&
+ pack_tlv(NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL12_TAG, &pdu->dci_pdu.dci_pdu_rel12, ppWritePackedMsg, end, pack_hi_dci0_dci_rel12_pdu_value)))
+ return 0;
+ }
+ break;
+ case NFAPI_HI_DCI0_EPDCCH_DCI_PDU_TYPE:
+ {
+ if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL8_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel8, ppWritePackedMsg, end, pack_hi_dci0_dci_rel8_pdu_value) &&
+ pack_tlv(NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL10_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel10, ppWritePackedMsg, end, pack_hi_dci0_dci_rel10_pdu_value) &&
+ pack_tlv(NFAPI_HI_DCI0_REQUEST_EPDCCH_PARAMETERS_REL11_TAG, &pdu->epdcch_dci_pdu.epdcch_parameters_rel11, ppWritePackedMsg, end, pack_dl_config_epdcch_parameters_rel11_value)))
+ return 0;
+ }
+ break;
+ case NFAPI_HI_DCI0_MPDCCH_DCI_PDU_TYPE:
+ {
+ if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_MPDCCH_DCI_PDU_REL13_TAG, &pdu->mpdcch_dci_pdu.mpdcch_dci_pdu_rel13, ppWritePackedMsg, end, pack_hi_dci0_mpdcch_dci_rel13_pdu_value)))
+ return 0;
+ }
+ break;
+ case NFAPI_HI_DCI0_NPDCCH_DCI_PDU_TYPE:
+ {
+ if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_NPDCCH_DCI_PDU_REL13_TAG, &pdu->npdcch_dci_pdu.npdcch_dci_pdu_rel13, ppWritePackedMsg, end, pack_hi_dci0_npdcch_dci_rel13_pdu_value)))
+ return 0;
+ }
+ break;
+ default:
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
+ }
+ break;
+ };
+
+ // add 1 for the pdu_type. The delta will include the pdu_size
+ pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
+ push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
+
+ }
+
+ return 1;
+}
+
+static uint8_t pack_ul_dci_pdu_list_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_nr_ul_dci_request_pdus_t* value = (nfapi_nr_ul_dci_request_pdus_t*)tlv;
+
+ for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i)
+ {
+ if(!push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].RNTI, ppWritePackedMsg, end) &&
+ push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingId, ppWritePackedMsg, end) &&
+
+ push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingRNTI, ppWritePackedMsg, end) &&
+ push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].CceIndex, ppWritePackedMsg, end) &&
+ push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].AggregationLevel, ppWritePackedMsg, end) &&
+ push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].beta_PDCCH_1_0, ppWritePackedMsg, end) &&
+
+ push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].powerControlOffsetSS, ppWritePackedMsg, end) &&
+ push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end) &&
+
+ pusharray8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].Payload, DCI_PAYLOAD_BYTE_LEN, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end));
+
+ return 0;
+ }
+
+ return (push16(value->PDUType, ppWritePackedMsg, end) &&
+ push16(value->PDUSize, ppWritePackedMsg, end) &&
+ push16(value->pdcch_pdu.pdcch_pdu_rel15.BWPSize, ppWritePackedMsg, end) &&
+ push16(value->pdcch_pdu.pdcch_pdu_rel15.BWPStart, ppWritePackedMsg, end) &&
+ push8(value->pdcch_pdu.pdcch_pdu_rel15.SubcarrierSpacing, ppWritePackedMsg, end) &&
+ push8(value->pdcch_pdu.pdcch_pdu_rel15.CyclicPrefix, ppWritePackedMsg, end) &&
+
+ push8(value->pdcch_pdu.pdcch_pdu_rel15.StartSymbolIndex, ppWritePackedMsg, end) &&
+ push8(value->pdcch_pdu.pdcch_pdu_rel15.DurationSymbols, ppWritePackedMsg, end) &&
+ pusharray8(value->pdcch_pdu.pdcch_pdu_rel15.FreqDomainResource, 6, 6, ppWritePackedMsg, end) &&
+ push8(value->pdcch_pdu.pdcch_pdu_rel15.CceRegMappingType, ppWritePackedMsg, end) &&
+
+ push8(value->pdcch_pdu.pdcch_pdu_rel15.RegBundleSize, ppWritePackedMsg, end) &&
+ push8(value->pdcch_pdu.pdcch_pdu_rel15.InterleaverSize, ppWritePackedMsg, end) &&
+ push8(value->pdcch_pdu.pdcch_pdu_rel15.CoreSetType, ppWritePackedMsg, end) &&
+ push16(value->pdcch_pdu.pdcch_pdu_rel15.ShiftIndex, ppWritePackedMsg, end));
+
+}
+
+static uint8_t pack_ul_dci_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_nr_ul_dci_request_t *pNfapiMsg = (nfapi_nr_ul_dci_request_t*)msg;
+
+ if (!(push16(pNfapiMsg->SFN, ppWritePackedMsg, end) &&
+ push16(pNfapiMsg->Slot, ppWritePackedMsg, end) &&
+ push8(pNfapiMsg->numPdus, ppWritePackedMsg, end)
+ ))
+ return 0;
+
+ for(int i=0; inumPdus; i++)
+ {
+ if(!pack_ul_dci_pdu_list_value(&pNfapiMsg->ul_dci_pdu_list[i], ppWritePackedMsg, end))
+ return 0;
+ }
+ return 1;
+
+
+}
+
+
+
+static uint8_t pack_hi_dci0_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_hi_dci0_request_t *pNfapiMsg = (nfapi_hi_dci0_request_t*)msg;
+
+ return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+ pack_tlv(NFAPI_HI_DCI0_REQUEST_BODY_TAG, &pNfapiMsg->hi_dci0_request_body, ppWritePackedMsg, end, &pack_hi_dci0_request_body_value) &&
+ pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+//pack_tx_data_pdu_list_value
+static uint8_t pack_tx_data_pdu_list_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_nr_pdu_t* value = (nfapi_nr_pdu_t*)tlv;
+
+ if(!(push32(value->num_TLV, ppWritePackedMsg, end) &&
+ push16(value->PDU_index, ppWritePackedMsg, end) &&
+ push16(value->PDU_length, ppWritePackedMsg, end)
+ ))
+ return 0;
+
+ uint16_t i = 0;
+ uint16_t total_number_of_tlvs = value->num_TLV;
+ for(; i < total_number_of_tlvs; ++i)
+ {
+
+ if (!(push16(value->TLVs[i].length, ppWritePackedMsg, end) &&
+ push16(value->TLVs[i].tag, ppWritePackedMsg, end)))
+ return 0;
+
+ switch(value->TLVs[i].tag)
+ {
+ case 0:
+ {
+ if(!pusharray32(value->TLVs[i].value.direct, 16384, value->TLVs[i].length, ppWritePackedMsg, end))
+ return 0;
+ break;
+
+ }
+
+ case 1:
+ {
+ if(!pusharray32(value->TLVs[i].value.ptr, value->TLVs[i].length , value->TLVs[i].length, ppWritePackedMsg, end))
+ return 0;
+ break;
+
+ }
+
+ default:
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid tag value %d \n", value->TLVs[i].tag );
+ break;
+ }
+
+ }
+ }
+ return 1;
+}
+
+static uint8_t pack_tx_request_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_tx_request_body_t* value = (nfapi_tx_request_body_t*)tlv;
+
+ if(push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
+ return 0;
+
+ uint16_t i = 0;
+ uint16_t total_number_of_pdus = value->number_of_pdus;
+ for(; i < total_number_of_pdus; ++i)
+ {
+ nfapi_tx_request_pdu_t* pdu = &(value->tx_pdu_list[i]);
+
+ if(!(push16(pdu->pdu_length, ppWritePackedMsg, end) &&
+ push16(pdu->pdu_index, ppWritePackedMsg, end)))
+ return 0;
+
+ uint8_t j;
+ for(j = 0; j < pdu->num_segments; ++j)
+ {
+ // Use -1 as it is unbounded
+ // 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 (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;
+ }
+ }
+ }
+
+ return 1;
+}
+
+static uint8_t pack_tx_data_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_nr_tx_data_request_t *pNfapiMsg = (nfapi_nr_tx_data_request_t*)msg;
+
+ if (!(
+ push16(pNfapiMsg->SFN, ppWritePackedMsg, end) &&
+ push16(pNfapiMsg->Slot, ppWritePackedMsg, end) &&
+ push16(pNfapiMsg->Number_of_PDUs, ppWritePackedMsg, end)
+ ))
+ return 0;
+
+ for(int i=0; iNumber_of_PDUs; i++)
+ {
+ if(!pack_tx_data_pdu_list_value(&pNfapiMsg->pdu_list[i], ppWritePackedMsg, end))
+ return 0;
+ }
+
+ return 1;
+}
+
+static uint8_t pack_tx_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_tx_request_t *pNfapiMsg = (nfapi_tx_request_t*)msg;
+
+ 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_release_request_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ue_release_request_body_t* value = (nfapi_ue_release_request_body_t*)tlv;
+ if(push16(value->number_of_TLVs, ppWritePackedMsg, end) == 0){
+ return 0;
+ }
+
+ uint8_t j;
+ uint16_t num = value->number_of_TLVs;
+ for(j = 0; j < num; ++j){
+ if(push16(value->ue_release_request_TLVs_list[j].rnti, ppWritePackedMsg, end) == 0){
+ return 0;
+ }
+ }
+ return 1;
+}
+
+static uint8_t pack_ue_release_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_ue_release_request_t *pNfapiMsg = (nfapi_ue_release_request_t*)msg;
+ int x = push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end);
+ int y = pack_tlv(NFAPI_UE_RELEASE_BODY_TAG, &pNfapiMsg->ue_release_request_body, ppWritePackedMsg, end, &pack_release_request_body_value);
+ int z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
+ return x && y && z;
+}
+
+static uint8_t pack_ue_release_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+
+ nfapi_ue_release_response_t *pNfapiMsg = (nfapi_ue_release_response_t*)msg;
+
+ int x = push32(pNfapiMsg->error_code, ppWritePackedMsg, end);
+ int z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
+ return x && z;
+}
+
+static uint8_t pack_rx_ue_information_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_rx_ue_information* value = (nfapi_rx_ue_information*)tlv;
+
+ return ( push32(value->handle, ppWritePackedMsg, end) &&
+ push16(value->rnti, ppWritePackedMsg, end) );
+}
+
+static uint8_t unpack_rx_ue_information_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_rx_ue_information* value = (nfapi_rx_ue_information*)tlv;
+
+ return ( pull32(ppReadPackedMsg, &value->handle, end) &&
+ pull16(ppReadPackedMsg, &value->rnti, end));
+}
+
+static uint8_t pack_harq_indication_tdd_harq_data_bundling(nfapi_harq_indication_tdd_harq_data_bundling_t* data, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ return ( push8(data->value_0, ppWritePackedMsg, end) &&
+ push8(data->value_1, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_harq_indication_tdd_harq_data_multiplexing(nfapi_harq_indication_tdd_harq_data_multiplexing_t* data, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ return ( push8(data->value_0, ppWritePackedMsg, end) &&
+ push8(data->value_1, ppWritePackedMsg, end) &&
+ push8(data->value_2, ppWritePackedMsg, end) &&
+ push8(data->value_3, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_harq_indication_tdd_harq_data_special_bundling(nfapi_harq_indication_tdd_harq_data_special_bundling_t* data, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ return ( push8(data->value_0, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_harq_indication_tdd_harq_data(nfapi_harq_indication_tdd_harq_data_t* data, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ return ( push8(data->value_0, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_harq_indication_tdd_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_harq_indication_tdd_rel8_t* harq_indication_tdd_rel8 = (nfapi_harq_indication_tdd_rel8_t*)tlv;
+
+ if(!(push8(harq_indication_tdd_rel8->mode, ppWritePackedMsg, end) &&
+ push8(harq_indication_tdd_rel8->number_of_ack_nack, ppWritePackedMsg, end)))
+ return 0;
+
+ uint8_t result = 0;
+ switch(harq_indication_tdd_rel8->mode)
+ {
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
+ result = pack_harq_indication_tdd_harq_data_bundling(&harq_indication_tdd_rel8->harq_data.bundling, ppWritePackedMsg, end);
+ break;
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
+ result = pack_harq_indication_tdd_harq_data_multiplexing(&harq_indication_tdd_rel8->harq_data.multiplex, ppWritePackedMsg, end);
+ break;
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
+ result = pack_harq_indication_tdd_harq_data_special_bundling(&harq_indication_tdd_rel8->harq_data.special_bundling, ppWritePackedMsg, end);
+ break;
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
+ result = 1;
+ break;
+ default:
+ // err....
+ break;
+ }
+
+ return result;
+
+}
+
+static uint8_t pack_harq_indication_tdd_rel9_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_harq_indication_tdd_rel9_t* harq_indication_tdd_rel9 = (nfapi_harq_indication_tdd_rel9_t*)tlv;
+
+ if(!(push8(harq_indication_tdd_rel9->mode, ppWritePackedMsg, end) &&
+ push8(harq_indication_tdd_rel9->number_of_ack_nack, ppWritePackedMsg, end)))
+ return 0;
+
+ uint8_t idx;
+ for(idx = 0; idx < harq_indication_tdd_rel9->number_of_ack_nack; ++idx)
+ {
+ uint8_t result = 0;
+
+ switch(harq_indication_tdd_rel9->mode)
+ {
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
+ result = pack_harq_indication_tdd_harq_data(&(harq_indication_tdd_rel9->harq_data[idx].bundling), ppWritePackedMsg, end);
+ break;
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
+ result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel9->harq_data[idx].multiplex, ppWritePackedMsg, end);
+ break;
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
+ result = pack_harq_indication_tdd_harq_data_special_bundling(&harq_indication_tdd_rel9->harq_data[idx].special_bundling, ppWritePackedMsg, end);
+ break;
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
+ result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel9->harq_data[idx].channel_selection, ppWritePackedMsg, end);
+ break;
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
+ result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel9->harq_data[idx].format_3, ppWritePackedMsg, end);
+ break;
+ default:
+ // err....
+ break;
+ }
+
+ if(result == 0)
+ return 0;
+ }
+
+ return 1;
+}
+
+static uint8_t pack_harq_indication_tdd_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_harq_indication_tdd_rel13_t* harq_indication_tdd_rel13 = (nfapi_harq_indication_tdd_rel13_t*)tlv;
+
+ if(!(push8(harq_indication_tdd_rel13->mode, ppWritePackedMsg, end) &&
+ push16(harq_indication_tdd_rel13->number_of_ack_nack, ppWritePackedMsg, end)))
+ return 0;
+
+ uint8_t idx;
+ for(idx = 0; idx < harq_indication_tdd_rel13->number_of_ack_nack; ++idx)
+ {
+ uint8_t result = 0;
+ switch(harq_indication_tdd_rel13->mode)
+ {
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
+ result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].bundling, ppWritePackedMsg, end);
+ break;
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
+ result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].multiplex, ppWritePackedMsg, end);
+ break;
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
+ result = pack_harq_indication_tdd_harq_data_special_bundling(&harq_indication_tdd_rel13->harq_data[idx].special_bundling, ppWritePackedMsg, end);
+ break;
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
+ result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].channel_selection, ppWritePackedMsg, end);
+ break;
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
+ result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].format_3, ppWritePackedMsg, end);
+ break;
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_4:
+ result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].format_4, ppWritePackedMsg, end);
+ break;
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_5:
+ result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].format_5, ppWritePackedMsg, end);
+ break;
+ default:
+ // err....
+ break;
+ }
+
+ if(result == 0)
+ return 0;
+ }
+
+ return 1;
+}
+
+static uint8_t pack_harq_indication_fdd_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_harq_indication_fdd_rel8_t* harq_indication_fdd_rel8 = (nfapi_harq_indication_fdd_rel8_t*)tlv;
+
+ return ( push8(harq_indication_fdd_rel8->harq_tb1, ppWritePackedMsg, end) &&
+ push8(harq_indication_fdd_rel8->harq_tb2, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_harq_indication_fdd_rel9_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_harq_indication_fdd_rel9_t* harq_indication_fdd_rel9 = (nfapi_harq_indication_fdd_rel9_t*)tlv;
+
+ return ( push8(harq_indication_fdd_rel9->mode, ppWritePackedMsg, end) &&
+ push8(harq_indication_fdd_rel9->number_of_ack_nack, ppWritePackedMsg, end) &&
+ pusharray8(harq_indication_fdd_rel9->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL9_MAX, harq_indication_fdd_rel9->number_of_ack_nack, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_harq_indication_fdd_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_harq_indication_fdd_rel13_t* harq_indication_fdd_rel13 = (nfapi_harq_indication_fdd_rel13_t*)tlv;
+
+ return ( push8(harq_indication_fdd_rel13->mode, ppWritePackedMsg, end) &&
+ push16(harq_indication_fdd_rel13->number_of_ack_nack, ppWritePackedMsg, end) &&
+ pusharray8(harq_indication_fdd_rel13->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL13_MAX, harq_indication_fdd_rel13->number_of_ack_nack, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_cqi_information_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_ul_cqi_information_t* value = (nfapi_ul_cqi_information_t*)tlv;
+
+ return ( push8(value->ul_cqi, ppWritePackedMsg, end) &&
+ push8(value->channel, ppWritePackedMsg, end));
+
+}
+
+static uint8_t pack_harq_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_harq_indication_body_t* value = (nfapi_harq_indication_body_t*)tlv;
+
+ if(push16(value->number_of_harqs, ppWritePackedMsg, end) == 0)
+ return 0;
+
+ uint16_t i = 0;
+ uint16_t total_number_of_pdus = value->number_of_harqs;
+ for(; i < total_number_of_pdus; ++i)
+ {
+ nfapi_harq_indication_pdu_t* pdu = &(value->harq_pdu_list[i]);
+
+ uint8_t* instance_length_p = *ppWritePackedMsg;
+ if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+ return 0;
+
+ if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
+ pack_tlv(NFAPI_HARQ_INDICATION_TDD_REL8_TAG, &pdu->harq_indication_tdd_rel8, ppWritePackedMsg, end, pack_harq_indication_tdd_rel8_value) &&
+ pack_tlv(NFAPI_HARQ_INDICATION_TDD_REL9_TAG, &pdu->harq_indication_tdd_rel9, ppWritePackedMsg, end, pack_harq_indication_tdd_rel9_value) &&
+ pack_tlv(NFAPI_HARQ_INDICATION_TDD_REL13_TAG, &pdu->harq_indication_tdd_rel13, ppWritePackedMsg, end, pack_harq_indication_tdd_rel13_value) &&
+ pack_tlv(NFAPI_HARQ_INDICATION_FDD_REL8_TAG, &pdu->harq_indication_fdd_rel8, ppWritePackedMsg, end, pack_harq_indication_fdd_rel8_value) &&
+ pack_tlv(NFAPI_HARQ_INDICATION_FDD_REL9_TAG, &pdu->harq_indication_fdd_rel9, ppWritePackedMsg, end, pack_harq_indication_fdd_rel9_value) &&
+ pack_tlv(NFAPI_HARQ_INDICATION_FDD_REL13_TAG, &pdu->harq_indication_fdd_rel13, ppWritePackedMsg, end, pack_harq_indication_fdd_rel13_value) &&
+ pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
+ return 0;
+
+ // calculate the instance length subtracting the size of the instance
+ // length feild
+ uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+ push16(instance_length, &instance_length_p, end);
+ }
+
+ return 1;
+}
+
+static uint8_t pack_harq_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_harq_indication_t *pNfapiMsg = (nfapi_harq_indication_t*)msg;
+
+ return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+ pack_tlv(NFAPI_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->harq_indication_body, ppWritePackedMsg, end, pack_harq_indication_body_value) &&
+ pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_crc_indication_rel8_body(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_crc_indication_rel8_t* crc_indication_rel8 = (nfapi_crc_indication_rel8_t*)tlv;
+
+ return ( push8(crc_indication_rel8->crc_flag, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_crc_indication_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_crc_indication_body_t* value = (nfapi_crc_indication_body_t*)tlv;
+
+ if(push16(value->number_of_crcs, ppWritePackedMsg, end) == 0)
+ return 0;
+
+ uint16_t i = 0;
+ uint16_t total_number_of_pdus = value->number_of_crcs;
+ for(; i < total_number_of_pdus; ++i)
+ {
+ nfapi_crc_indication_pdu_t* pdu = &(value->crc_pdu_list[i]);
+
+ uint8_t* instance_length_p = *ppWritePackedMsg;
+ if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+ return 0;
+
+ if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
+ pack_tlv(NFAPI_CRC_INDICATION_REL8_TAG, &pdu->crc_indication_rel8, ppWritePackedMsg, end, pack_crc_indication_rel8_body)))
+ return 0;
+
+ // calculate the instance length subtracting the size of the instance
+ // length feild
+ uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+ push16(instance_length, &instance_length_p, end);
+ }
+ return 1;
+}
+
+static uint8_t pack_crc_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_crc_indication_t *pNfapiMsg = (nfapi_crc_indication_t*)msg;
+
+ return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+ pack_tlv(NFAPI_CRC_INDICATION_BODY_TAG, &pNfapiMsg->crc_indication_body, ppWritePackedMsg, end, &pack_crc_indication_body_value) &&
+ pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+
+}
+static uint8_t pack_rx_indication_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_rx_indication_rel8_t* value = (nfapi_rx_indication_rel8_t*)tlv;
+
+ return ( push16(value->length, ppWritePackedMsg, end) &&
+ push16(value->offset, ppWritePackedMsg, end) &&
+ push8(value->ul_cqi, ppWritePackedMsg, end) &&
+ push16(value->timing_advance, ppWritePackedMsg, end));
+}
+static uint8_t pack_rx_indication_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_rx_indication_rel9_t* value = (nfapi_rx_indication_rel9_t*)tlv;
+
+ return ( push16(value->timing_advance_r9, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_rx_ulsch_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ 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;
+
+ // need to calculate the data offset's.
+ 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;
+ }
+ }
+
+ // Now update the structure to include the offset
+ for(i =0; i < total_number_of_pdus; ++i)
+ {
+ nfapi_rx_indication_pdu_t* pdu = &(value->rx_pdu_list[i]);
+
+ if(pdu->rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG)
+ {
+ if(pdu->rx_indication_rel8.offset == 1)
+ {
+ pdu->rx_indication_rel8.offset = offset;
+ offset += pdu->rx_indication_rel8.length;
+ }
+ }
+ }
+
+ // Write out the pdu
+ for(i = 0; i < total_number_of_pdus; ++i)
+ {
+ nfapi_rx_indication_pdu_t* pdu = &(value->rx_pdu_list[i]);
+ if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
+ pack_tlv(NFAPI_RX_INDICATION_REL8_TAG, &pdu->rx_indication_rel8, ppWritePackedMsg, end, pack_rx_indication_rel8_value) &&
+ pack_tlv(NFAPI_RX_INDICATION_REL9_TAG, &pdu->rx_indication_rel9, ppWritePackedMsg, end, pack_rx_indication_rel9_value)))
+ return 0;
+ }
+
+ // Write out the pdu data
+ for(i = 0; i < total_number_of_pdus; ++i)
+ {
+ uint16_t length = 0;
+ nfapi_rx_indication_pdu_t* pdu = &(value->rx_pdu_list[i]);
+
+ if(pdu->rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG)
+ {
+ length = pdu->rx_indication_rel8.length;
+ }
+
+ if( pusharray8(value->rx_pdu_list[i].data, length, length, ppWritePackedMsg, end) == 0)
+ return 0;
+ }
+ return 1;
+}
+
+
+static uint8_t pack_rx_ulsch_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_rx_indication_t *pNfapiMsg = (nfapi_rx_indication_t*)msg;
+
+ return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+ pack_tlv(NFAPI_RX_INDICATION_BODY_TAG, &pNfapiMsg->rx_indication_body, ppWritePackedMsg, end, pack_rx_ulsch_indication_body_value) &&
+ pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_preamble_pdu_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_preamble_pdu_rel8_t* preamble_rel8 = (nfapi_preamble_pdu_rel8_t*)tlv;
+
+ return ( push16(preamble_rel8->rnti, ppWritePackedMsg, end) &&
+ push8(preamble_rel8->preamble, ppWritePackedMsg, end) &&
+ push16(preamble_rel8->timing_advance, ppWritePackedMsg, end));
+}
+static uint8_t pack_preamble_pdu_rel9_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_preamble_pdu_rel9_t* preamble_rel9 = (nfapi_preamble_pdu_rel9_t*)tlv;
+
+ return ( push16(preamble_rel9->timing_advance_r9, ppWritePackedMsg, end) );
+}
+static uint8_t pack_preamble_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_preamble_pdu_rel13_t* preamble_rel13 = (nfapi_preamble_pdu_rel13_t*)tlv;
+
+ return ( push8(preamble_rel13->rach_resource_type, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_rach_indication_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_rach_indication_body_t* value = (nfapi_rach_indication_body_t*)tlv;
+
+ if( push16(value->number_of_preambles, ppWritePackedMsg, end) == 0)
+ return 0;
+
+ uint16_t i = 0;
+ uint16_t total_number_of_pdus = value->number_of_preambles;
+ for(; i < total_number_of_pdus; ++i)
+ {
+ nfapi_preamble_pdu_t* pdu = &(value->preamble_list[i]);
+
+ uint8_t* instance_length_p = *ppWritePackedMsg;
+ if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+ return 0;
+
+ if(!(pack_tlv(NFAPI_PREAMBLE_REL8_TAG, &pdu->preamble_rel8, ppWritePackedMsg, end, pack_preamble_pdu_rel8_value) &&
+ pack_tlv(NFAPI_PREAMBLE_REL9_TAG, &pdu->preamble_rel9, ppWritePackedMsg, end, pack_preamble_pdu_rel9_value) &&
+ pack_tlv(NFAPI_PREAMBLE_REL13_TAG, &pdu->preamble_rel13, ppWritePackedMsg, end, pack_preamble_pdu_rel13_value)))
+ return 0;
+
+ // calculate the instance length subtracting the size of the instance
+ // length feild
+ uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+ push16(instance_length, &instance_length_p, end);
+ }
+
+ return 1;
+}
+
+static uint8_t pack_rach_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_rach_indication_t *pNfapiMsg = (nfapi_rach_indication_t*)msg;
+
+ return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+ pack_tlv(NFAPI_RACH_INDICATION_BODY_TAG, &pNfapiMsg->rach_indication_body, ppWritePackedMsg, end, pack_rach_indication_body_value) &&
+ pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_srs_indication_fdd_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_srs_indication_fdd_rel8_t* srs_pdu_rel8 = (nfapi_srs_indication_fdd_rel8_t*)tlv;
+
+ return ( push16(srs_pdu_rel8->doppler_estimation, ppWritePackedMsg, end) &&
+ push16(srs_pdu_rel8->timing_advance, ppWritePackedMsg, end) &&
+ push8(srs_pdu_rel8->number_of_resource_blocks, ppWritePackedMsg, end) &&
+ push8(srs_pdu_rel8->rb_start, ppWritePackedMsg, end) &&
+ pusharray8(srs_pdu_rel8->snr, NFAPI_NUM_RB_MAX, srs_pdu_rel8->number_of_resource_blocks, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_srs_indication_fdd_rel9_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_srs_indication_fdd_rel9_t* srs_pdu_rel9 = (nfapi_srs_indication_fdd_rel9_t*)tlv;
+
+ return ( push16(srs_pdu_rel9->timing_advance_r9, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_srs_indication_tdd_rel10_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_srs_indication_ttd_rel10_t* srs_pdu_rel10 = (nfapi_srs_indication_ttd_rel10_t*)tlv;
+
+ return ( push8(srs_pdu_rel10->uppts_symbol, ppWritePackedMsg, end) );
+
+}
+
+static uint8_t pack_srs_indication_fdd_rel11_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_srs_indication_fdd_rel11_t* srs_pdu_rel11 = (nfapi_srs_indication_fdd_rel11_t*)tlv;
+
+ return ( push16(srs_pdu_rel11->ul_rtoa, ppWritePackedMsg, end) ) ;
+}
+
+static uint8_t pack_tdd_channel_measurement_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_tdd_channel_measurement_t* value = (nfapi_tdd_channel_measurement_t*)tlv;
+
+ if(!(push8(value->num_prb_per_subband, ppWritePackedMsg, end) &&
+ push8(value->number_of_subbands, ppWritePackedMsg, end) &&
+ push8(value->num_atennas, ppWritePackedMsg, end)))
+ return 0;
+
+ uint8_t idx = 0;
+ for(idx = 0; idx < value->number_of_subbands; ++idx)
+ {
+ if(!(push8(value->subands[idx].subband_index, ppWritePackedMsg, end) &&
+ pusharray16(value->subands[idx].channel, NFAPI_MAX_NUM_PHYSICAL_ANTENNAS, value->num_atennas, ppWritePackedMsg, end)))
+ return 0;
+ }
+
+ return 1;
+}
+
+static uint8_t pack_srs_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_srs_indication_body_t *value = (nfapi_srs_indication_body_t*)tlv;
+
+ if( push8(value->number_of_ues, ppWritePackedMsg, end) == 0)
+ return 0;
+
+ uint16_t i = 0;
+ uint16_t total_number_of_pdus = value->number_of_ues;
+ for(; i < total_number_of_pdus; ++i)
+ {
+ nfapi_srs_indication_pdu_t* pdu = &(value->srs_pdu_list[i]);
+
+ uint8_t* instance_length_p = *ppWritePackedMsg;
+ if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+ return 0;
+
+ if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, &pack_rx_ue_information_value) &&
+ pack_tlv(NFAPI_SRS_INDICATION_FDD_REL8_TAG, &pdu->srs_indication_fdd_rel8, ppWritePackedMsg, end, &pack_srs_indication_fdd_rel8_value) &&
+ pack_tlv(NFAPI_SRS_INDICATION_FDD_REL9_TAG, &pdu->srs_indication_fdd_rel9, ppWritePackedMsg, end, &pack_srs_indication_fdd_rel9_value) &&
+ pack_tlv(NFAPI_SRS_INDICATION_TDD_REL10_TAG, &pdu->srs_indication_tdd_rel10, ppWritePackedMsg, end, &pack_srs_indication_tdd_rel10_value) &&
+ pack_tlv(NFAPI_SRS_INDICATION_FDD_REL11_TAG, &pdu->srs_indication_fdd_rel11, ppWritePackedMsg, end, &pack_srs_indication_fdd_rel11_value) &&
+ pack_tlv(NFAPI_TDD_CHANNEL_MEASUREMENT_TAG, &pdu->tdd_channel_measurement, ppWritePackedMsg, end, &pack_tdd_channel_measurement_value)))
+ return 0;
+
+ // calculate the instance length subtracting the size of the instance
+ // length feild
+ uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+ push16(instance_length, &instance_length_p, end);
+ }
+
+ return 1;
+}
+
+static uint8_t pack_srs_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_srs_indication_t *pNfapiMsg = (nfapi_srs_indication_t*)msg;
+
+ return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+ pack_tlv(NFAPI_SRS_INDICATION_BODY_TAG, &pNfapiMsg->srs_indication_body, ppWritePackedMsg, end, &pack_srs_indication_body_value) &&
+ pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+
+}
+
+static uint8_t pack_sr_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_sr_indication_body_t* value = (nfapi_sr_indication_body_t*)tlv;
+
+ if(push16(value->number_of_srs, ppWritePackedMsg, end) == 0)
+ return 0;
+
+ uint16_t i = 0;
+ uint16_t total_number_of_pdus = value->number_of_srs;
+ for(; i < total_number_of_pdus; ++i)
+ {
+ nfapi_sr_indication_pdu_t* pdu = &(value->sr_pdu_list[i]);
+
+ uint8_t* instance_length_p = *ppWritePackedMsg;
+ if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+ return 0;
+
+ if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
+ pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
+ return 0;
+
+ // calculate the instance length subtracting the size of the instance
+ // length feild
+ uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+ push16(instance_length, &instance_length_p, end);
+ }
+ return 1;
+}
+
+static uint8_t pack_sr_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_sr_indication_t *pNfapiMsg = (nfapi_sr_indication_t*)msg;
+
+ return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+ pack_tlv(NFAPI_SR_INDICATION_BODY_TAG, &pNfapiMsg->sr_indication_body, ppWritePackedMsg, end, &pack_sr_indication_body_value) &&
+ pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+
+}
+
+static uint8_t pack_cqi_indication_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_cqi_indication_rel8_t* cqi_pdu_rel8 = (nfapi_cqi_indication_rel8_t*)tlv;
+
+ return ( push16(cqi_pdu_rel8->length, ppWritePackedMsg, end) &&
+ push16(cqi_pdu_rel8->data_offset, ppWritePackedMsg, end) &&
+ push8(cqi_pdu_rel8->ul_cqi, ppWritePackedMsg, end) &&
+ push8(cqi_pdu_rel8->ri, ppWritePackedMsg, end) &&
+ push16(cqi_pdu_rel8->timing_advance, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_cqi_indication_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_cqi_indication_rel9_t* cqi_pdu_rel9 = (nfapi_cqi_indication_rel9_t*)tlv;
+
+ return ( push16(cqi_pdu_rel9->length, ppWritePackedMsg, end) &&
+ push16(cqi_pdu_rel9->data_offset, ppWritePackedMsg, end) &&
+ push8(cqi_pdu_rel9->ul_cqi, ppWritePackedMsg, end) &&
+ push8(cqi_pdu_rel9->number_of_cc_reported, ppWritePackedMsg, end) &&
+ pusharray8(cqi_pdu_rel9->ri, NFAPI_CC_MAX, cqi_pdu_rel9->number_of_cc_reported, ppWritePackedMsg, end) &&
+ push16(cqi_pdu_rel9->timing_advance, ppWritePackedMsg, end) &&
+ push16(cqi_pdu_rel9->timing_advance_r9, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_cqi_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_cqi_indication_body_t* value = (nfapi_cqi_indication_body_t*)tlv;
+
+ if( push16(value->number_of_cqis, ppWritePackedMsg, end) == 0)
+ return 0;
+
+ // need to calculate the data offset's. This very bittle due the hardcoding
+ // of the sizes. can not use the sizeof as we have an array for the Rel9
+ // info
+ uint16_t i = 0;
+ uint16_t offset = 2; // taking into account the number_of_cqis
+ uint16_t total_number_of_pdus = value->number_of_cqis;
+ for(i = 0; i < total_number_of_pdus; ++i)
+ {
+ nfapi_cqi_indication_pdu_t* pdu = &(value->cqi_pdu_list[i]);
+
+ offset += 2; // for the instance length
+
+ if(pdu->rx_ue_information.tl.tag == NFAPI_RX_UE_INFORMATION_TAG)
+ {
+ offset += 4 + 6; // sizeof(nfapi_rx_ue_information) - sizeof(nfapi_tl_t)
+ }
+
+ if(pdu->cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG)
+ {
+ offset += 4 + 8;
+ }
+
+ if(pdu->cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG)
+ {
+ offset += 4 + 10 + pdu->cqi_indication_rel9.number_of_cc_reported;
+ }
+
+ if(pdu->ul_cqi_information.tl.tag == NFAPI_UL_CQI_INFORMATION_TAG)
+ {
+ offset += 4 + 2;
+ }
+ }
+
+ // Now update the structure to include the offset
+ for(i =0; i < total_number_of_pdus; ++i)
+ {
+ nfapi_cqi_indication_pdu_t* pdu = &(value->cqi_pdu_list[i]);
+
+ if(pdu->cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG)
+ {
+ if(pdu->cqi_indication_rel8.data_offset == 1)
+ {
+ pdu->cqi_indication_rel8.data_offset = offset;
+ offset += pdu->cqi_indication_rel8.length;
+ }
+ }
+
+ if(pdu->cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG)
+ {
+ if(pdu->cqi_indication_rel9.data_offset == 1)
+ {
+ pdu->cqi_indication_rel9.data_offset = offset;
+ offset += pdu->cqi_indication_rel9.length;
+ }
+ }
+
+ }
+
+ // Write out the cqi information
+ for(i = 0; i < total_number_of_pdus; ++i)
+ {
+ nfapi_cqi_indication_pdu_t* pdu = &(value->cqi_pdu_list[i]);
+
+ uint8_t* instance_length_p = *ppWritePackedMsg;
+ if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+ return 0;
+
+ if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end ,pack_rx_ue_information_value) &&
+ pack_tlv(NFAPI_CQI_INDICATION_REL8_TAG, &pdu->cqi_indication_rel8, ppWritePackedMsg, end, pack_cqi_indication_rel8_value) &&
+ pack_tlv(NFAPI_CQI_INDICATION_REL9_TAG, &pdu->cqi_indication_rel9, ppWritePackedMsg, end, pack_cqi_indication_rel9_value) &&
+ pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
+ return 0;
+
+ // calculate the instance length subtracting the size of the instance
+ // length feild
+ uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+ push16(instance_length, &instance_length_p, end);
+
+ }
+
+ // Write out the cqi raw data
+ for(i = 0; i < total_number_of_pdus; ++i)
+ {
+ uint16_t length = 0;
+ nfapi_cqi_indication_pdu_t* pdu = &(value->cqi_pdu_list[i]);
+
+ if(pdu->cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG)
+ {
+ length = pdu->cqi_indication_rel8.length;
+ }
+
+ if(pdu->cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG)
+ {
+ length = pdu->cqi_indication_rel9.length;
+ }
+
+ if( pusharray8(value->cqi_raw_pdu_list[i].pdu, NFAPI_CQI_RAW_MAX_LEN, length, ppWritePackedMsg, end) == 0)
+ return 0;
+ }
+
+ return 1;
+}
+
+static uint8_t pack_cqi_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_cqi_indication_t *pNfapiMsg = (nfapi_cqi_indication_t*)msg;
+
+ return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+ pack_tlv(NFAPI_CQI_INDICATION_BODY_TAG, &pNfapiMsg->cqi_indication_body, ppWritePackedMsg, end, pack_cqi_indication_body_value) &&
+ pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+
+}
+
+static uint8_t pack_lbt_pdsch_req_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_lbt_pdsch_req_pdu_rel13_t* value = (nfapi_lbt_pdsch_req_pdu_rel13_t*)tlv;
+
+ return ( push32(value->handle, ppWritePackedMsg, end) &&
+ push32(value->mp_cca, ppWritePackedMsg, end) &&
+ push32(value->n_cca, ppWritePackedMsg, end) &&
+ push32(value->offset, ppWritePackedMsg, end) &&
+ push32(value->lte_txop_sf, ppWritePackedMsg, end) &&
+ push16(value->txop_sfn_sf_end, ppWritePackedMsg, end) &&
+ push32(value->lbt_mode, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_lbt_drs_req_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_lbt_drs_req_pdu_rel13_t* value = (nfapi_lbt_drs_req_pdu_rel13_t*)tlv;
+
+ return ( push32(value->handle, ppWritePackedMsg, end) &&
+ push32(value->offset, ppWritePackedMsg, end) &&
+ push16(value->sfn_sf_end, ppWritePackedMsg, end) &&
+ push32(value->lbt_mode, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_lbt_dl_config_request_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_lbt_dl_config_request_body_t* value = (nfapi_lbt_dl_config_request_body_t*)tlv;
+
+ if( push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
+ return 0;
+
+ uint16_t i = 0;
+ uint16_t total_number_of_pdus = value->number_of_pdus;
+ for(; i < total_number_of_pdus; ++i)
+ {
+ nfapi_lbt_dl_config_request_pdu_t* pdu = &(value->lbt_dl_config_req_pdu_list[i]);
+
+ if( push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
+ return 0;
+
+ // Put a 0 size in and then determine the size after the pdu
+ // has been writen and write the calculated size
+ uint8_t* pWritePackedMsgPduSize = *ppWritePackedMsg;
+ pdu->pdu_size = 0;
+ if( push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
+ return 0;
+
+ switch(pdu->pdu_type)
+ {
+ case NFAPI_LBT_DL_CONFIG_REQUEST_PDSCH_PDU_TYPE:
+ {
+ if( pack_tlv(NFAPI_LBT_PDSCH_REQ_PDU_REL13_TAG, &pdu->lbt_pdsch_req_pdu.lbt_pdsch_req_pdu_rel13, ppWritePackedMsg, end, pack_lbt_pdsch_req_pdu_rel13_value) == 0)
+ return 0;
+ }
+ break;
+ case NFAPI_LBT_DL_CONFIG_REQUEST_DRS_PDU_TYPE:
+ {
+ if(pack_tlv(NFAPI_LBT_DRS_REQ_PDU_REL13_TAG, &pdu->lbt_drs_req_pdu.lbt_drs_req_pdu_rel13, ppWritePackedMsg, end, pack_lbt_drs_req_pdu_rel13_value) == 0)
+ return 0;
+ }
+ break;
+ default:
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL_CONFIG.request invalid pdu type %d \n", pdu->pdu_type );
+ }
+ break;
+ };
+
+ // add 1 for the pdu_type. The delta will include the pdu_size
+ pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
+ push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
+ }
+
+ return 1;
+}
+
+static uint8_t pack_lbt_pdsch_rsp_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_lbt_pdsch_rsp_pdu_rel13_t* value = (nfapi_lbt_pdsch_rsp_pdu_rel13_t*)tlv;
+
+ return ( push32(value->handle, ppWritePackedMsg, end) &&
+ push32(value->result, ppWritePackedMsg, end) &&
+ push32(value->lte_txop_symbols, ppWritePackedMsg, end) &&
+ push32(value->initial_partial_sf, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_lbt_drs_rsp_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_lbt_drs_rsp_pdu_rel13_t* value = (nfapi_lbt_drs_rsp_pdu_rel13_t*)tlv;
+
+ return ( push32(value->handle, ppWritePackedMsg, end) &&
+ push32(value->result, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_lbt_dl_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_lbt_dl_config_request_t *pNfapiMsg = (nfapi_lbt_dl_config_request_t*)msg;
+
+ return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+ pack_tlv(NFAPI_LBT_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->lbt_dl_config_request_body, ppWritePackedMsg, end, &pack_lbt_dl_config_request_body_value) &&
+ pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_lbt_dl_config_indication_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_lbt_dl_indication_body_t* value = (nfapi_lbt_dl_indication_body_t*)tlv;
+
+ if( push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
+ return 0;
+
+ uint16_t i = 0;
+ uint16_t total_number_of_pdus = value->number_of_pdus;
+ for(; i < total_number_of_pdus; ++i)
+ {
+ nfapi_lbt_dl_indication_pdu_t* pdu = &(value->lbt_indication_pdu_list[i]);
+
+ if( push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
+ return 0;
+
+ // Put a 0 size in and then determine the size after the pdu
+ // has been writen and write the calculated size
+ uint8_t* pWritePackedMsgPduSize = *ppWritePackedMsg;
+ pdu->pdu_size = 0;
+
+ if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
+ return 0;
+
+ switch(pdu->pdu_type)
+ {
+ case NFAPI_LBT_DL_RSP_PDSCH_PDU_TYPE:
+ {
+ if( pack_tlv(NFAPI_LBT_PDSCH_RSP_PDU_REL13_TAG, &pdu->lbt_pdsch_rsp_pdu.lbt_pdsch_rsp_pdu_rel13, ppWritePackedMsg, end, pack_lbt_pdsch_rsp_pdu_rel13_value) == 0)
+ return 0;
+ }
+ break;
+ case NFAPI_LBT_DL_RSP_DRS_PDU_TYPE:
+ {
+ if( pack_tlv(NFAPI_LBT_DRS_RSP_PDU_REL13_TAG, &pdu->lbt_drs_rsp_pdu.lbt_drs_rsp_pdu_rel13, ppWritePackedMsg, end, pack_lbt_drs_rsp_pdu_rel13_value) == 0)
+ return 0;
+ }
+ break;
+ default:
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL.indication body invalid pdu type %d \n", pdu->pdu_type );
+ }
+ break;
+ };
+
+ // add 1 for the pdu_type. The delta will include the pdu_size
+ pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
+ push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
+ }
+
+ return 1;
+}
+
+static uint8_t pack_lbt_dl_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_lbt_dl_indication_t *pNfapiMsg = (nfapi_lbt_dl_indication_t*)msg;
+
+ return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+ pack_tlv(NFAPI_LBT_DL_INDICATION_BODY_TAG, &pNfapiMsg->lbt_dl_indication_body, ppWritePackedMsg, end, &pack_lbt_dl_config_indication_value) &&
+ pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_nb_harq_indication_fdd_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_nb_harq_indication_fdd_rel13_t* nb_harq_indication_fdd_rel13 = (nfapi_nb_harq_indication_fdd_rel13_t*)tlv;
+
+ return ( push8(nb_harq_indication_fdd_rel13->harq_tb1, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_nb_harq_indication_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_nb_harq_indication_body_t* value = (nfapi_nb_harq_indication_body_t*)tlv;
+
+ if( push16(value->number_of_harqs, ppWritePackedMsg, end) == 0)
+ return 0;
+
+ uint16_t i = 0;
+ uint16_t total_number_of_harqs = value->number_of_harqs;
+ for(; i < total_number_of_harqs; ++i)
+ {
+ nfapi_nb_harq_indication_pdu_t* pdu = &(value->nb_harq_pdu_list[i]);
+
+ uint8_t* instance_length_p = *ppWritePackedMsg;
+ if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+ return 0;
+
+ if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
+ pack_tlv(NFAPI_NB_HARQ_INDICATION_FDD_REL13_TAG, &pdu->nb_harq_indication_fdd_rel13, ppWritePackedMsg, end, pack_nb_harq_indication_fdd_rel13_value) &&
+ pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
+ return 0;
+
+ // calculate the instance length subtracting the size of the instance
+ // length feild
+ uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+ push16(instance_length, &instance_length_p, end);
+ }
+
+ return 1;
+}
+
+
+static uint8_t pack_nb_harq_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_nb_harq_indication_t *pNfapiMsg = (nfapi_nb_harq_indication_t*)msg;
+
+ return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+ pack_tlv(NFAPI_NB_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->nb_harq_indication_body, ppWritePackedMsg, end, &pack_nb_harq_indication_body_value) &&
+ pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_nrach_indication_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_nrach_indication_pdu_rel13_t* nrach_indication_fdd_rel13 = (nfapi_nrach_indication_pdu_rel13_t*)tlv;
+
+ return ( push16(nrach_indication_fdd_rel13->rnti, ppWritePackedMsg, end) &&
+ push8(nrach_indication_fdd_rel13->initial_sc, ppWritePackedMsg, end) &&
+ push16(nrach_indication_fdd_rel13->timing_advance, ppWritePackedMsg, end) &&
+ push8(nrach_indication_fdd_rel13->nrach_ce_level, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_nrach_indication_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_nrach_indication_body_t* value = (nfapi_nrach_indication_body_t*)tlv;
+
+ if( push8(value->number_of_initial_scs_detected, ppWritePackedMsg, end) == 0)
+ return 0;
+
+ uint16_t i = 0;
+ uint16_t total_number_of_initial_scs_detected = value->number_of_initial_scs_detected;
+ for(; i < total_number_of_initial_scs_detected; ++i)
+ {
+ nfapi_nrach_indication_pdu_t* pdu = &(value->nrach_pdu_list[i]);
+
+ //uint8_t* instance_length_p = *ppWritePackedMsg;
+ //if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+ // return 0;
+
+ if(!(pack_tlv(NFAPI_NRACH_INDICATION_REL13_TAG, &pdu->nrach_indication_rel13, ppWritePackedMsg, end, pack_nrach_indication_rel13_value)))
+ return 0;
+
+ // calculate the instance length subtracting the size of the instance
+ // length feild
+ //uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+ //push16(instance_length, &instance_length_p, end);
+ }
+
+ return 1;
+}
+
+static uint8_t pack_nrach_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_nrach_indication_t *pNfapiMsg = (nfapi_nrach_indication_t*)msg;
+
+ return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+ pack_tlv(NFAPI_NRACH_INDICATION_BODY_TAG, &pNfapiMsg->nrach_indication_body, ppWritePackedMsg, end, &pack_nrach_indication_body_value) &&
+ pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_nr_dl_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_nr_dl_node_sync_t *pNfapiMsg = (nfapi_nr_dl_node_sync_t*)msg;
+
+ return ( push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
+ pushs32(pNfapiMsg->delta_sfn_slot, ppWritePackedMsg, end) &&
+ pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_dl_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_dl_node_sync_t *pNfapiMsg = (nfapi_dl_node_sync_t*)msg;
+
+ return ( push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
+ pushs32(pNfapiMsg->delta_sfn_sf, ppWritePackedMsg, end) &&
+ pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_nr_ul_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_nr_ul_node_sync_t *pNfapiMsg = (nfapi_nr_ul_node_sync_t*)msg;
+
+ return (push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
+ push32(pNfapiMsg->t2, ppWritePackedMsg, end) &&
+ push32(pNfapiMsg->t3, ppWritePackedMsg, end) &&
+ pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_ul_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_ul_node_sync_t *pNfapiMsg = (nfapi_ul_node_sync_t*)msg;
+
+ return (push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
+ push32(pNfapiMsg->t2, ppWritePackedMsg, end) &&
+ push32(pNfapiMsg->t3, ppWritePackedMsg, end) &&
+ pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_timing_info(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_timing_info_t *pNfapiMsg = (nfapi_timing_info_t*)msg;
+
+ return (push32(pNfapiMsg->last_sfn_sf, ppWritePackedMsg, end) &&
+ push32(pNfapiMsg->time_since_last_timing_info, ppWritePackedMsg, end) &&
+ push32(pNfapiMsg->dl_config_jitter, ppWritePackedMsg, end) &&
+ push32(pNfapiMsg->tx_request_jitter, ppWritePackedMsg, end) &&
+ push32(pNfapiMsg->ul_config_jitter, ppWritePackedMsg, end) &&
+ push32(pNfapiMsg->hi_dci0_jitter, ppWritePackedMsg, end) &&
+ pushs32(pNfapiMsg->dl_config_latest_delay, ppWritePackedMsg, end) &&
+ pushs32(pNfapiMsg->tx_request_latest_delay, ppWritePackedMsg, end) &&
+ pushs32(pNfapiMsg->ul_config_latest_delay, ppWritePackedMsg, end) &&
+ pushs32(pNfapiMsg->hi_dci0_latest_delay, ppWritePackedMsg, end) &&
+ pushs32(pNfapiMsg->dl_config_earliest_arrival, ppWritePackedMsg, end) &&
+ pushs32(pNfapiMsg->tx_request_earliest_arrival, ppWritePackedMsg, end) &&
+ pushs32(pNfapiMsg->ul_config_earliest_arrival, ppWritePackedMsg, end) &&
+ pushs32(pNfapiMsg->hi_dci0_earliest_arrival, ppWritePackedMsg, end) &&
+ pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_nr_timing_info(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_nr_timing_info_t *pNfapiMsg = (nfapi_nr_timing_info_t*)msg;
+
+ return (push32(pNfapiMsg->last_sfn, ppWritePackedMsg, end) &&
+ push32(pNfapiMsg->last_slot, ppWritePackedMsg, end) &&
+ push32(pNfapiMsg->time_since_last_timing_info, ppWritePackedMsg, end) &&
+ push32(pNfapiMsg->dl_tti_jitter, ppWritePackedMsg, end) &&
+ push32(pNfapiMsg->tx_data_request_jitter, ppWritePackedMsg, end) &&
+ push32(pNfapiMsg->ul_tti_jitter, ppWritePackedMsg, end) &&
+ push32(pNfapiMsg->ul_dci_jitter, ppWritePackedMsg, end) &&
+ pushs32(pNfapiMsg->dl_tti_latest_delay, ppWritePackedMsg, end) &&
+ pushs32(pNfapiMsg->tx_data_request_latest_delay, ppWritePackedMsg, end) &&
+ pushs32(pNfapiMsg->ul_tti_latest_delay, ppWritePackedMsg, end) &&
+ pushs32(pNfapiMsg->ul_dci_latest_delay, ppWritePackedMsg, end) &&
+ pushs32(pNfapiMsg->dl_tti_earliest_arrival, ppWritePackedMsg, end) &&
+ pushs32(pNfapiMsg->tx_data_request_earliest_arrival, ppWritePackedMsg, end) &&
+ pushs32(pNfapiMsg->ul_tti_earliest_arrival, ppWritePackedMsg, end) &&
+ pushs32(pNfapiMsg->ul_dci_earliest_arrival, ppWritePackedMsg, end) &&
+ pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+
+
+// Main pack function - public
+
+int nfapi_nr_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen, nfapi_p7_codec_config_t* config)
+{
+ nfapi_p7_message_header_t *pMessageHeader = pMessageBuf;
+ uint8_t *pWritePackedMessage = pPackedBuf;
+ uint8_t *pPackedLengthField = &pWritePackedMessage[4];
+ uint8_t *end = pPackedBuf + packedBufLen;
+
+ if (pMessageBuf == NULL || pPackedBuf == NULL)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack supplied pointers are null\n");
+ return -1;
+ }
+ /*
+ printf("\n P7 MESSAGE SENT: \n");
+ for(int i=0; i< packedBufLen; i++){
+ printf("%d", *(uint8_t *)(pMessageBuf + i));
+ }
+ printf("\n");
+ */
+ // process the header
+ if(!(push16(pMessageHeader->phy_id, &pWritePackedMessage, end) &&
+ push16(pMessageHeader->message_id, &pWritePackedMessage, end) &&
+ push16(0/*pMessageHeader->message_length*/, &pWritePackedMessage, end) &&
+ push16(pMessageHeader->m_segment_sequence, &pWritePackedMessage, end) &&
+ push32(0/*pMessageHeader->checksum*/, &pWritePackedMessage, end) &&
+ push32(pMessageHeader->transmit_timestamp, &pWritePackedMessage, end)))
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack header failed\n");
+ 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_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
+ result = pack_dl_tti_request(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
+ result = pack_ul_tti_request(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+ case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
+ result = pack_tx_data_request(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+ case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
+ result = pack_ul_dci_request(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_UE_RELEASE_REQUEST:
+ result =pack_ue_release_request(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_UE_RELEASE_RESPONSE:
+ result =pack_ue_release_response(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_HARQ_INDICATION:
+ result = pack_harq_indication(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_CRC_INDICATION:
+ result = pack_crc_indication(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_RX_ULSCH_INDICATION:
+ //printf("RX ULSCH\n");
+ result = pack_rx_ulsch_indication(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_RACH_INDICATION:
+ result = pack_rach_indication(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_SRS_INDICATION:
+ result = pack_srs_indication(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_RX_SR_INDICATION:
+ result = pack_sr_indication(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_RX_CQI_INDICATION:
+ result = pack_cqi_indication(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_LBT_DL_CONFIG_REQUEST:
+ result = pack_lbt_dl_config_request(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_LBT_DL_INDICATION:
+ result = pack_lbt_dl_indication(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_NB_HARQ_INDICATION:
+ result = pack_nb_harq_indication(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_NRACH_INDICATION:
+ result = pack_nrach_indication(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
+ result = pack_nr_dl_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC:
+ result = pack_nr_ul_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_TIMING_INFO:
+ result = pack_nr_timing_info(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ default:
+ {
+ if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
+ pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
+ {
+ if(config && config->pack_p7_vendor_extension)
+ {
+ result = (config->pack_p7_vendor_extension)(pMessageHeader, &pWritePackedMessage, end, config);
+ }
+ else
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, pMessageHeader->message_id);
+ }
+ }
+ else
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
+ }
+ }
+ break;
+ }
+
+ if(result == 0)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack failed to pack message\n");
+ return -1;
+ }
+
+ // check for a valid message length
+ uintptr_t msgHead = (uintptr_t)pPackedBuf;
+ uintptr_t msgEnd = (uintptr_t)pWritePackedMessage;
+ uint32_t packedMsgLen = msgEnd - msgHead;
+ uint16_t packedMsgLen16;
+ if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
+ return -1;
+ }
+ else
+ {
+ packedMsgLen16 = (uint16_t)packedMsgLen;
+ }
+
+ // Update the message length in the header
+ pMessageHeader->message_length = packedMsgLen16;
+
+ if(!push16(packedMsgLen16, &pPackedLengthField, end))
+ return -1;
+
+ if(1)
+ {
+ //quick test
+ if(pMessageHeader->message_length != packedMsgLen)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "nfapi packedMsgLen(%d) != message_length(%d) id %d\n", packedMsgLen, pMessageHeader->message_length, pMessageHeader->message_id);
+ }
+ }
+
+ return (packedMsgLen);
+}
+
+int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen, nfapi_p7_codec_config_t* config)
+{
+ nfapi_p7_message_header_t *pMessageHeader = pMessageBuf;
+ uint8_t *pWritePackedMessage = pPackedBuf;
+ uint8_t *pPackedLengthField = &pWritePackedMessage[4];
+ uint8_t *end = pPackedBuf + packedBufLen;
+
+ if (pMessageBuf == NULL || pPackedBuf == NULL)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack supplied pointers are null\n");
+ return -1;
+ }
+ /*
+ printf("\n P7 MESSAGE SENT: \n");
+ for(int i=0; i< packedBufLen; i++){
+ printf("%d", *(uint8_t *)(pMessageBuf + i));
+ }
+ printf("\n");
+ */
+ // process the header
+ if(!(push16(pMessageHeader->phy_id, &pWritePackedMessage, end) &&
+ push16(pMessageHeader->message_id, &pWritePackedMessage, end) &&
+ push16(0/*pMessageHeader->message_length*/, &pWritePackedMessage, end) &&
+ push16(pMessageHeader->m_segment_sequence, &pWritePackedMessage, end) &&
+ push32(0/*pMessageHeader->checksum*/, &pWritePackedMessage, end) &&
+ push32(pMessageHeader->transmit_timestamp, &pWritePackedMessage, end)))
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack header failed\n");
+ 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;
+
+ case NFAPI_UL_CONFIG_REQUEST:
+ result = pack_ul_config_request(pMessageHeader, &pWritePackedMessage, end, config);
+ 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;
+ case NFAPI_HI_DCI0_REQUEST:
+ result = pack_hi_dci0_request(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_UE_RELEASE_REQUEST:
+ result =pack_ue_release_request(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_UE_RELEASE_RESPONSE:
+ result =pack_ue_release_response(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_HARQ_INDICATION:
+ result = pack_harq_indication(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_CRC_INDICATION:
+ result = pack_crc_indication(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_RX_ULSCH_INDICATION:
+ //printf("RX ULSCH\n");
+ result = pack_rx_ulsch_indication(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_RACH_INDICATION:
+ result = pack_rach_indication(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_SRS_INDICATION:
+ result = pack_srs_indication(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_RX_SR_INDICATION:
+ result = pack_sr_indication(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_RX_CQI_INDICATION:
+ result = pack_cqi_indication(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_LBT_DL_CONFIG_REQUEST:
+ result = pack_lbt_dl_config_request(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_LBT_DL_INDICATION:
+ result = pack_lbt_dl_indication(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_NB_HARQ_INDICATION:
+ result = pack_nb_harq_indication(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_NRACH_INDICATION:
+ result = pack_nrach_indication(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_DL_NODE_SYNC:
+ result = pack_dl_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_UL_NODE_SYNC:
+ result = pack_ul_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ case NFAPI_TIMING_INFO:
+ result = pack_timing_info(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
+
+ default:
+ {
+ if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
+ pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
+ {
+ if(config && config->pack_p7_vendor_extension)
+ {
+ result = (config->pack_p7_vendor_extension)(pMessageHeader, &pWritePackedMessage, end, config);
+ }
+ else
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, pMessageHeader->message_id);
+ }
+ }
+ else
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
+ }
+ }
+ break;
+ }
+
+ if(result == 0)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack failed to pack message\n");
+ return -1;
+ }
+
+ // check for a valid message length
+ uintptr_t msgHead = (uintptr_t)pPackedBuf;
+ uintptr_t msgEnd = (uintptr_t)pWritePackedMessage;
+ uint32_t packedMsgLen = msgEnd - msgHead;
+ uint16_t packedMsgLen16;
+ if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
+ return -1;
+ }
+ else
+ {
+ packedMsgLen16 = (uint16_t)packedMsgLen;
+ }
+
+ // Update the message length in the header
+ pMessageHeader->message_length = packedMsgLen16;
+
+ if(!push16(packedMsgLen16, &pPackedLengthField, end))
+ return -1;
+
+ if(1)
+ {
+ //quick test
+ if(pMessageHeader->message_length != packedMsgLen)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "nfapi packedMsgLen(%d) != message_length(%d) id %d\n", packedMsgLen, pMessageHeader->message_length, pMessageHeader->message_id);
+ }
+ }
+
+ return (packedMsgLen);
+}
+
+// Unpack routines
+// NR:
+static uint8_t unpack_dl_tti_csi_rs_pdu_rel15_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_nr_dl_tti_csi_rs_pdu_rel15_t* value = (nfapi_nr_dl_tti_csi_rs_pdu_rel15_t*)tlv;
+
+ return(
+ pull16(ppReadPackedMsg, &value->bwp_size, end) &&
+ pull16(ppReadPackedMsg, &value->bwp_start, end) &&
+
+ pull8(ppReadPackedMsg, &value->subcarrier_spacing, end) &&
+ pull8(ppReadPackedMsg, &value->cyclic_prefix, end) &&
+
+ pull16(ppReadPackedMsg, &value->start_rb, end) &&
+ pull16(ppReadPackedMsg, &value->nr_of_rbs, end) &&
+
+ pull8(ppReadPackedMsg, &value->csi_type, end) &&
+ pull8(ppReadPackedMsg, &value->row, end) &&
+
+ pull16(ppReadPackedMsg, &value->freq_domain, end) &&
+ pull8(ppReadPackedMsg, &value->symb_l0, end) &&
+
+ pull8(ppReadPackedMsg, &value->symb_l1, end) &&
+ pull8(ppReadPackedMsg, &value->cdm_type, end) &&
+
+ pull8(ppReadPackedMsg, &value->freq_density, end) &&
+ pull16(ppReadPackedMsg, &value->scramb_id, end) &&
+
+ pull8(ppReadPackedMsg, &value->power_control_offset, end) &&
+ pull8(ppReadPackedMsg, &value->power_control_offset_ss, end)
+ );
+
+}
+
+
+static uint8_t unpack_dl_tti_pdcch_pdu_rel15_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_nr_dl_tti_pdcch_pdu_rel15_t* value = (nfapi_nr_dl_tti_pdcch_pdu_rel15_t*)tlv;
+
+ for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i)
+ {
+ if(!pull16(ppReadPackedMsg, &value->dci_pdu[i].RNTI, end) &&
+ pull16(ppReadPackedMsg, &value->dci_pdu[i].ScramblingId, end) &&
+
+ pull16(ppReadPackedMsg, &value->dci_pdu[i].ScramblingRNTI, end) &&
+ pull8(ppReadPackedMsg, &value->dci_pdu[i].CceIndex, end) &&
+ pull8(ppReadPackedMsg, &value->dci_pdu[i].AggregationLevel, end) &&
+ pull8(ppReadPackedMsg, &value->dci_pdu[i].beta_PDCCH_1_0, end) &&
+
+ pull8(ppReadPackedMsg, &value->dci_pdu[i].powerControlOffsetSS, end) &&
+ pull16(ppReadPackedMsg, &value->dci_pdu[i].PayloadSizeBits, end) &&
+
+ pullarray8(ppReadPackedMsg, value->dci_pdu[i].Payload, DCI_PAYLOAD_BYTE_LEN, value->dci_pdu[i].PayloadSizeBits, end));
+
+ return 0;
+ }
+
+ // TODO: resolve the packaging of array (currently sending a single element)
+ return(
+ pull16(ppReadPackedMsg, &value->BWPSize, end) &&
+ pull16(ppReadPackedMsg, &value->BWPStart, end) &&
+ pull8(ppReadPackedMsg, &value->SubcarrierSpacing, end) &&
+ pull8(ppReadPackedMsg, &value->CyclicPrefix, end) &&
+
+ pull8(ppReadPackedMsg, &value->StartSymbolIndex, end) &&
+ pull8(ppReadPackedMsg, &value->DurationSymbols, end) &&
+ pullarray8(ppReadPackedMsg, value->FreqDomainResource, 6, 6, end) &&
+ pull8(ppReadPackedMsg, &value->CceRegMappingType, end) &&
+
+ pull8(ppReadPackedMsg, &value->RegBundleSize, end) &&
+ pull8(ppReadPackedMsg, &value->InterleaverSize, end) &&
+ pull8(ppReadPackedMsg, &value->CoreSetType, end) &&
+ pull16(ppReadPackedMsg, &value->ShiftIndex, end) &&
+
+ pull8(ppReadPackedMsg, &value->precoderGranularity, end) &&
+ pull16(ppReadPackedMsg, &value->numDlDci, end));
+
+}
+
+
+static uint8_t unpack_dl_tti_pdsch_pdu_rel15_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_nr_dl_tti_pdsch_pdu_rel15_t* value = (nfapi_nr_dl_tti_pdsch_pdu_rel15_t*)tlv;
+
+ // TODO: resolve the packaging of array (currently sending a single element)
+ return(
+ pull16(ppReadPackedMsg, &value->pduBitmap, end) &&
+ pull16(ppReadPackedMsg, &value->rnti, end) &&
+ pull16(ppReadPackedMsg, &value->pduIndex, end) &&
+ pull16(ppReadPackedMsg, &value->BWPSize, end) &&
+
+ pull16(ppReadPackedMsg, &value->BWPStart, end) &&
+ pull8(ppReadPackedMsg, &value->SubcarrierSpacing, end) &&
+ pull8(ppReadPackedMsg, &value->CyclicPrefix, end) &&
+ pull8(ppReadPackedMsg, &value->NrOfCodewords, end) &&
+
+ pullarray16(ppReadPackedMsg, value->targetCodeRate, 2, 1, end) &&
+ pullarray8(ppReadPackedMsg, value->qamModOrder, 2, 1, end) &&
+ pullarray8(ppReadPackedMsg, value->mcsIndex, 2, 1, end) &&
+ pullarray8(ppReadPackedMsg, value->mcsTable, 2, 1, end) &&
+
+ pullarray8(ppReadPackedMsg, value->rvIndex, 2, 1, end) &&
+ pullarray32(ppReadPackedMsg, value->TBSize, 2, 1, end) &&
+ pull16(ppReadPackedMsg, &value->dataScramblingId, end) &&
+ pull8(ppReadPackedMsg, &value->nrOfLayers, end) &&
+
+ pull8(ppReadPackedMsg, &value->transmissionScheme, end) &&
+ pull8(ppReadPackedMsg, &value->refPoint, end) &&
+ pull16(ppReadPackedMsg, &value->dlDmrsSymbPos, end) &&
+ pull8(ppReadPackedMsg, &value->dmrsConfigType, end) &&
+
+ pull16(ppReadPackedMsg, &value->dlDmrsScramblingId, end) &&
+ pull8(ppReadPackedMsg, &value->SCID, end) &&
+ pull8(ppReadPackedMsg, &value->numDmrsCdmGrpsNoData, end) &&
+ pull16(ppReadPackedMsg, &value->dmrsPorts, end) &&
+
+ pull8(ppReadPackedMsg, &value->resourceAlloc, end) &&
+ pull16(ppReadPackedMsg, &value->rbStart, end) &&
+ pull16(ppReadPackedMsg, &value->rbSize, end) &&
+
+ pull8(ppReadPackedMsg, &value->VRBtoPRBMapping, end) &&
+ pull8(ppReadPackedMsg, &value->StartSymbolIndex, end) &&
+ pull8(ppReadPackedMsg, &value->NrOfSymbols, end) &&
+ pull8(ppReadPackedMsg, &value->PTRSPortIndex, end) &&
+
+ pull8(ppReadPackedMsg, &value->PTRSTimeDensity, end) &&
+ pull8(ppReadPackedMsg, &value->PTRSFreqDensity, end) &&
+ pull8(ppReadPackedMsg, &value->PTRSReOffset, end)
+ );
+
+}
+
+
+static uint8_t unpack_dl_tti_ssb_pdu_rel15_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_nr_dl_tti_ssb_pdu_rel15_t* value = (nfapi_nr_dl_tti_ssb_pdu_rel15_t*)tlv;
+
+ return(
+ pull16(ppReadPackedMsg, &value->PhysCellId, end) &&
+ pull8(ppReadPackedMsg, &value->BetaPss, end) &&
+ pull8(ppReadPackedMsg, &value->SsbBlockIndex, end) &&
+ pull8(ppReadPackedMsg, &value->SsbSubcarrierOffset, end) &&
+ pull16(ppReadPackedMsg, &value->ssbOffsetPointA, end) &&
+ pull8(ppReadPackedMsg, &value->bchPayloadFlag, end) &&
+ pull32(ppReadPackedMsg, &value->bchPayload, end)
+ // TODO: pack precoding_and_beamforming too
+ );
+
+}
+
+
+// LTE:
+static uint8_t unpack_dl_config_dci_dl_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_dci_dl_pdu_rel8_t* dci_dl_pdu_rel8 = (nfapi_dl_config_dci_dl_pdu_rel8_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->dci_format, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->cce_idx, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->aggregation_level, end) &&
+ pull16(ppReadPackedMsg, &dci_dl_pdu_rel8->rnti, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->resource_allocation_type, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->virtual_resource_block_assignment_flag, end) &&
+ pull32(ppReadPackedMsg, &dci_dl_pdu_rel8->resource_block_coding, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->mcs_1, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->redundancy_version_1, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->new_data_indicator_1, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->transport_block_to_codeword_swap_flag, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->mcs_2, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->redundancy_version_2, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->new_data_indicator_2, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->harq_process, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->tpmi, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->pmi, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->precoding_information, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->tpc, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->downlink_assignment_index, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->ngap, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->transport_block_size_index, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->downlink_power_offset, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->allocate_prach_flag, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->preamble_index, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->prach_mask_index, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->rnti_type, end) &&
+ pull16(ppReadPackedMsg, &dci_dl_pdu_rel8->transmission_power, end));
+
+}
+
+static uint8_t unpack_dl_config_dci_dl_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_dci_dl_pdu_rel9_t* dci_dl_pdu_rel9 = (nfapi_dl_config_dci_dl_pdu_rel9_t*)tlv;
+
+ return ( pull8(ppReadPackedMsg, &dci_dl_pdu_rel9->mcch_flag, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel9->mcch_change_notification, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel9->scrambling_identity, end));
+}
+
+static uint8_t unpack_dl_config_dci_dl_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_dci_dl_pdu_rel10_t* dci_dl_pdu_rel10 = (nfapi_dl_config_dci_dl_pdu_rel10_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->cross_carrier_scheduling_flag, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->carrier_indicator, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->srs_flag, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->srs_request, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->antenna_ports_scrambling_and_layers, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->total_dci_length_including_padding, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->n_dl_rb, end));
+}
+
+static uint8_t unpack_dl_config_dci_dl_pdu_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_dci_dl_pdu_rel11_t* dci_dl_pdu_rel11 = (nfapi_dl_config_dci_dl_pdu_rel11_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel11->harq_ack_resource_offset, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel11->pdsch_re_mapping_quasi_co_location_indicator, end));
+}
+
+static uint8_t unpack_dl_config_dci_dl_pdu_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_dci_dl_pdu_rel12_t* dci_dl_pdu_rel12 = (nfapi_dl_config_dci_dl_pdu_rel12_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel12->primary_cell_type, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel12->ul_dl_configuration_flag, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel12->number_ul_dl_configurations, end) &&
+ pullarray8(ppReadPackedMsg, dci_dl_pdu_rel12->ul_dl_configuration_indication, NFAPI_MAX_UL_DL_CONFIGURATIONS, dci_dl_pdu_rel12->number_ul_dl_configurations, end));
+}
+
+static uint8_t unpack_tpm_value(uint8_t **ppReadPackedMsg, nfapi_dl_config_dci_dl_tpm_t *value, uint8_t *end)
+{
+ if(!(pull8(ppReadPackedMsg, &value->num_prb_per_subband, end) &&
+ pull8(ppReadPackedMsg, &value->number_of_subbands, end) &&
+ pull8(ppReadPackedMsg, &value->num_antennas, end)))
+ return 0;
+
+
+ uint8_t idx = 0;
+ for(idx = 0; idx < value->number_of_subbands; ++idx)
+ {
+ nfapi_dl_config_dci_dl_tpm_subband_info_t* subband_info = &(value->subband_info[idx]);
+
+ if(!(pull8(ppReadPackedMsg, &subband_info->subband_index, end) &&
+ pull8(ppReadPackedMsg, &subband_info->scheduled_ues, end)))
+ return 0;
+
+ uint8_t antenna_idx = 0;
+ uint8_t scheduled_ue_idx = 0;
+
+ for(antenna_idx = 0; antenna_idx < value->num_antennas; ++antenna_idx)
+ {
+ for(scheduled_ue_idx = 0; scheduled_ue_idx < subband_info->scheduled_ues; ++scheduled_ue_idx)
+ {
+ if(!pull16(ppReadPackedMsg, &(subband_info->precoding_value[antenna_idx][scheduled_ue_idx]), end))
+ return 0;
+ }
+ }
+
+ }
+
+
+ return 1;
+
+}
+
+
+static uint8_t unpack_dl_config_dci_dl_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_dci_dl_pdu_rel13_t* dci_dl_pdu_rel13 = (nfapi_dl_config_dci_dl_pdu_rel13_t*)tlv;
+
+ // If the length is greater than 5 then the TPM struct flag and possiably the TPM structure have been
+ // added
+ uint8_t tpm_struct_flag_present = dci_dl_pdu_rel13->tl.length > 5;
+ dci_dl_pdu_rel13->tpm_struct_flag = 0;
+
+ return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->laa_end_partial_sf_flag, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->laa_end_partial_sf_configuration, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->initial_lbt_sf, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->codebook_size_determination, end) &&
+ pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->drms_table_flag, end) &&
+ ( (tpm_struct_flag_present == 1) ? pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->tpm_struct_flag, end) : 1) &&
+ ( (tpm_struct_flag_present == 1 && dci_dl_pdu_rel13->tpm_struct_flag == 1) ? unpack_tpm_value(ppReadPackedMsg, &dci_dl_pdu_rel13->tpm, end) : 1));
+
+}
+
+static uint8_t unpack_dl_config_bch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_bch_pdu_rel8_t* bch_pdu_rel8 = (nfapi_dl_config_bch_pdu_rel8_t*)tlv;
+
+ return ( pull16(ppReadPackedMsg, &bch_pdu_rel8->length, end) &&
+ pull16(ppReadPackedMsg, (uint16_t *)&bch_pdu_rel8->pdu_index, end) &&
+ pull16(ppReadPackedMsg, &bch_pdu_rel8->transmission_power, end));
+}
+
+static uint8_t unpack_dl_config_mch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_mch_pdu_rel8_t* mch_pdu_rel8 = (nfapi_dl_config_mch_pdu_rel8_t*)tlv;
+
+ return (pull16(ppReadPackedMsg, &mch_pdu_rel8->length, end) &&
+ pull16(ppReadPackedMsg, (uint16_t *)&mch_pdu_rel8->pdu_index, end) &&
+ pull16(ppReadPackedMsg, &mch_pdu_rel8->rnti, end) &&
+ pull8(ppReadPackedMsg, &mch_pdu_rel8->resource_allocation_type, end) &&
+ pull32(ppReadPackedMsg, &mch_pdu_rel8->resource_block_coding, end) &&
+ pull8(ppReadPackedMsg, &mch_pdu_rel8->modulation, end) &&
+ pull16(ppReadPackedMsg, &mch_pdu_rel8->transmission_power, end) &&
+ pull16(ppReadPackedMsg, &mch_pdu_rel8->mbsfn_area_id, end));
+}
+
+static uint8_t unpack_dl_config_dlsch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_dlsch_pdu_rel8_t* dlsch_pdu_rel8 = (nfapi_dl_config_dlsch_pdu_rel8_t*)tlv;
+
+ if (!(pull16(ppReadPackedMsg, &dlsch_pdu_rel8->length, end) &&
+ pull16(ppReadPackedMsg, (uint16_t *)&dlsch_pdu_rel8->pdu_index, end) &&
+ pull16(ppReadPackedMsg, &dlsch_pdu_rel8->rnti, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel8->resource_allocation_type, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel8->virtual_resource_block_assignment_flag, end) &&
+ pull32(ppReadPackedMsg, &dlsch_pdu_rel8->resource_block_coding, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel8->modulation, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel8->redundancy_version, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transport_blocks, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transport_block_to_codeword_swap_flag, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transmission_scheme, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel8->number_of_layers, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel8->number_of_subbands, end) &&
+ pullarray8(ppReadPackedMsg, dlsch_pdu_rel8->codebook_index, NFAPI_MAX_NUM_SUBBANDS, dlsch_pdu_rel8->number_of_subbands, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel8->ue_category_capacity, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel8->pa, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel8->delta_power_offset_index, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel8->ngap, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel8->nprb, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transmission_mode, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel8->num_bf_prb_per_subband, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel8->num_bf_vector, end)))
+ return 0;
+
+ uint16_t j = 0;
+ for(j = 0; j < dlsch_pdu_rel8->num_bf_vector; ++j)
+ {
+ if(!(pull8(ppReadPackedMsg, &dlsch_pdu_rel8->bf_vector[j].subband_index, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel8->bf_vector[j].num_antennas, end) &&
+ pullarray16(ppReadPackedMsg, dlsch_pdu_rel8->bf_vector[j].bf_value, NFAPI_MAX_NUM_ANTENNAS, dlsch_pdu_rel8->bf_vector[j].num_antennas, end)))
+ return 0;
+ }
+ return 1;
+}
+static uint8_t unpack_dl_config_dlsch_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_dlsch_pdu_rel9_t* dlsch_pdu_rel9 = (nfapi_dl_config_dlsch_pdu_rel9_t*)tlv;
+ return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel9->nscid, end) );
+}
+static uint8_t unpack_dl_config_dlsch_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_dlsch_pdu_rel10_t* dlsch_pdu_rel10 = (nfapi_dl_config_dlsch_pdu_rel10_t*)tlv;
+
+ return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_flag, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_resource_config_r10, end) &&
+ pull16(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_zero_tx_power_resource_config_bitmap_r10, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_number_nzp_configuration, end) &&
+ pullarray8(ppReadPackedMsg, dlsch_pdu_rel10->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, dlsch_pdu_rel10->csi_rs_number_nzp_configuration, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel10->pdsch_start, end)) ;
+}
+static uint8_t unpack_dl_config_dlsch_pdu_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_dlsch_pdu_rel11_t* dlsch_pdu_rel11 = (nfapi_dl_config_dlsch_pdu_rel11_t*)tlv;
+
+ return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel11->drms_config_flag, end) &&
+ pull16(ppReadPackedMsg, &dlsch_pdu_rel11->drms_scrambling, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel11->csi_config_flag, end) &&
+ pull16(ppReadPackedMsg, &dlsch_pdu_rel11->csi_scrambling, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel11->pdsch_re_mapping_flag, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel11->pdsch_re_mapping_atenna_ports, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel11->pdsch_re_mapping_freq_shift, end));
+}
+static uint8_t unpack_dl_config_dlsch_pdu_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_dlsch_pdu_rel12_t* dlsch_pdu_rel12 = (nfapi_dl_config_dlsch_pdu_rel12_t*)tlv;
+
+ return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel12->altcqi_table_r12, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel12->maxlayers, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel12->n_dl_harq, end));
+}
+static uint8_t unpack_dl_config_dlsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_dlsch_pdu_rel13_t* dlsch_pdu_rel13 = (nfapi_dl_config_dlsch_pdu_rel13_t*)tlv;
+
+ return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel13->dwpts_symbols, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel13->initial_lbt_sf, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel13->ue_type, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel13->pdsch_payload_type, end) &&
+ pull16(ppReadPackedMsg, &dlsch_pdu_rel13->initial_transmission_sf_io, end) &&
+ pull8(ppReadPackedMsg, &dlsch_pdu_rel13->drms_table_flag, end));
+}
+
+static uint8_t unpack_dl_config_pch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_pch_pdu_rel8_t* pch_pdu_rel8 = (nfapi_dl_config_pch_pdu_rel8_t*)tlv;
+
+ return ( pull16(ppReadPackedMsg, &pch_pdu_rel8->length, end) &&
+ pull16(ppReadPackedMsg, (uint16_t *)&pch_pdu_rel8->pdu_index, end) &&
+ pull16(ppReadPackedMsg, &pch_pdu_rel8->p_rnti, end) &&
+ pull8(ppReadPackedMsg, &pch_pdu_rel8->resource_allocation_type, end) &&
+ pull8(ppReadPackedMsg, &pch_pdu_rel8->virtual_resource_block_assignment_flag, end) &&
+ pull32(ppReadPackedMsg, &pch_pdu_rel8->resource_block_coding, end) &&
+ pull8(ppReadPackedMsg, &pch_pdu_rel8->mcs, end) &&
+ pull8(ppReadPackedMsg, &pch_pdu_rel8->redundancy_version, end) &&
+ pull8(ppReadPackedMsg, &pch_pdu_rel8->number_of_transport_blocks, end) &&
+ pull8(ppReadPackedMsg, &pch_pdu_rel8->transport_block_to_codeword_swap_flag, end) &&
+ pull8(ppReadPackedMsg, &pch_pdu_rel8->transmission_scheme, end) &&
+ pull8(ppReadPackedMsg, &pch_pdu_rel8->number_of_layers, end) &&
+ pull8(ppReadPackedMsg, &pch_pdu_rel8->codebook_index, end) &&
+ pull8(ppReadPackedMsg, &pch_pdu_rel8->ue_category_capacity, end) &&
+ pull8(ppReadPackedMsg, &pch_pdu_rel8->pa, end) &&
+ pull16(ppReadPackedMsg, &pch_pdu_rel8->transmission_power, end) &&
+ pull8(ppReadPackedMsg, &pch_pdu_rel8->nprb, end) &&
+ pull8(ppReadPackedMsg, &pch_pdu_rel8->ngap, end));
+}
+static uint8_t unpack_dl_config_pch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_pch_pdu_rel13_t* pch_pdu_rel13 = (nfapi_dl_config_pch_pdu_rel13_t*)tlv;
+
+ return ( pull8(ppReadPackedMsg, &pch_pdu_rel13->ue_mode, end) &&
+ pull16(ppReadPackedMsg, &pch_pdu_rel13->initial_transmission_sf_io, end));
+}
+
+static uint8_t unpack_dl_config_prs_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_prs_pdu_rel9_t* prs_pdu_rel9 = (nfapi_dl_config_prs_pdu_rel9_t*)tlv;
+
+ return ( pull16(ppReadPackedMsg, &prs_pdu_rel9->transmission_power, end) &&
+ pull8(ppReadPackedMsg, &prs_pdu_rel9->prs_bandwidth, end) &&
+ pull8(ppReadPackedMsg, &prs_pdu_rel9->prs_cyclic_prefix_type, end) &&
+ pull8(ppReadPackedMsg, &prs_pdu_rel9->prs_muting, end));
+}
+
+static uint8_t unpack_dl_config_csi_rs_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_csi_rs_pdu_rel10_t* csi_rs_pdu_rel10 = (nfapi_dl_config_csi_rs_pdu_rel10_t*)tlv;
+
+ return ( pull8(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_antenna_port_count_r10, end) &&
+ pull8(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_resource_config_r10, end) &&
+ pull16(ppReadPackedMsg, &csi_rs_pdu_rel10->transmission_power, end) &&
+ pull16(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_zero_tx_power_resource_config_bitmap_r10, end) &&
+ pull8(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_number_of_nzp_configuration, end) &&
+ pullarray8(ppReadPackedMsg, csi_rs_pdu_rel10->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, csi_rs_pdu_rel10->csi_rs_number_of_nzp_configuration, end));
+}
+
+static uint8_t unpack_dl_config_csi_rs_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_csi_rs_pdu_rel13_t* csi_rs_pdu_rel13 = (nfapi_dl_config_csi_rs_pdu_rel13_t*)tlv;
+
+ if (!(pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->csi_rs_class, end) &&
+ pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->cdm_type, end) &&
+ pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->num_bf_vector, end)))
+ return 0;
+
+
+ uint16_t idx =0;
+ for(idx = 0; idx < csi_rs_pdu_rel13->num_bf_vector; ++idx)
+ {
+ if(!(pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->bf_vector[idx].csi_rs_resource_index, end)))
+ return 0;
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : HOW TO DECODE BF VALUE \n");
+ //pullarray16(ppReadPackedMsg, &csi_rs_pdu_rel13->bf_vector[idx].bf_vector, ??);
+ }
+ return 1;
+}
+
+static uint8_t unpack_dl_config_epdcch_params_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_epdcch_parameters_rel11_t* epdcch_params_rel11 = (nfapi_dl_config_epdcch_parameters_rel11_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &epdcch_params_rel11->epdcch_resource_assignment_flag, end) &&
+ pull16(ppReadPackedMsg, &epdcch_params_rel11->epdcch_id, end) &&
+ pull8(ppReadPackedMsg, &epdcch_params_rel11->epdcch_start_symbol, end) &&
+ pull8(ppReadPackedMsg, &epdcch_params_rel11->epdcch_num_prb, end) &&
+ pullarray8(ppReadPackedMsg, epdcch_params_rel11->epdcch_prb_index, NFAPI_MAX_EPDCCH_PRB, epdcch_params_rel11->epdcch_num_prb, end) &&
+ pull8(ppReadPackedMsg, &epdcch_params_rel11->bf_vector.subband_index, end) &&
+ pull8(ppReadPackedMsg, &epdcch_params_rel11->bf_vector.num_antennas, end) &&
+ pullarray16(ppReadPackedMsg, epdcch_params_rel11->bf_vector.bf_value, NFAPI_MAX_NUM_ANTENNAS, epdcch_params_rel11->bf_vector.num_antennas, end));
+}
+
+static uint8_t unpack_dl_config_epdcch_params_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_epdcch_parameters_rel13_t* epdcch_params_rel13 = (nfapi_dl_config_epdcch_parameters_rel13_t*)tlv;
+
+ return ( pull8(ppReadPackedMsg, &epdcch_params_rel13->dwpts_symbols, end) &&
+ pull8(ppReadPackedMsg, &epdcch_params_rel13->initial_lbt_sf, end));
+}
+
+static uint8_t unpack_dl_config_mpdcch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_mpdcch_pdu_rel13_t* mpdcch_params_rel13 = (nfapi_dl_config_mpdcch_pdu_rel13_t*)tlv;
+
+
+ return ( pull8(ppReadPackedMsg, &mpdcch_params_rel13->mpdcch_narrow_band, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->number_of_prb_pairs, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->resource_block_assignment, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->mpdcch_tansmission_type, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->start_symbol, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->ecce_index, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->aggregation_level, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->rnti_type, end) &&
+ pull16(ppReadPackedMsg, &mpdcch_params_rel13->rnti, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->ce_mode, end) &&
+ pull16(ppReadPackedMsg, &mpdcch_params_rel13->drms_scrambling_init, end) &&
+ pull16(ppReadPackedMsg, &mpdcch_params_rel13->initial_transmission_sf_io, end) &&
+ pull16(ppReadPackedMsg, &mpdcch_params_rel13->transmission_power, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->dci_format, end) &&
+ pull16(ppReadPackedMsg, &mpdcch_params_rel13->resource_block_coding, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->mcs, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->pdsch_reptition_levels, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->redundancy_version, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->new_data_indicator, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->harq_process, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->tpmi_length, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->tpmi, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->pmi_flag, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->pmi, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->harq_resource_offset, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->dci_subframe_repetition_number, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->tpc, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->downlink_assignment_index_length, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->downlink_assignment_index, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->allocate_prach_flag, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->preamble_index, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->prach_mask_index, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->starting_ce_level, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->srs_request, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->antenna_ports_and_scrambling_identity_flag, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->antenna_ports_and_scrambling_identity, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->frequency_hopping_enabled_flag, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->paging_direct_indication_differentiation_flag, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->direct_indication, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->total_dci_length_including_padding, end) &&
+ pull8(ppReadPackedMsg, &mpdcch_params_rel13->number_of_tx_antenna_ports, end) &&
+ pullarray16(ppReadPackedMsg, mpdcch_params_rel13->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, mpdcch_params_rel13->number_of_tx_antenna_ports, end));
+}
+
+
+static uint8_t unpack_dl_config_nbch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_nbch_pdu_rel13_t* nbch_params_rel13 = (nfapi_dl_config_nbch_pdu_rel13_t*)tlv;
+
+ return ( pull16(ppReadPackedMsg, &nbch_params_rel13->length, end) &&
+ pull16(ppReadPackedMsg, (uint16_t *)&nbch_params_rel13->pdu_index, end) &&
+ pull16(ppReadPackedMsg, &nbch_params_rel13->transmission_power, end) &&
+ pull16(ppReadPackedMsg, &nbch_params_rel13->hyper_sfn_2_lsbs, end));
+}
+
+static uint8_t unpack_dl_config_npdcch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_npdcch_pdu_rel13_t* npdcch_params_rel13 = (nfapi_dl_config_npdcch_pdu_rel13_t*)tlv;
+
+ return ( pull16(ppReadPackedMsg, &npdcch_params_rel13->length, end) &&
+ pull16(ppReadPackedMsg, (uint16_t *)&npdcch_params_rel13->pdu_index, end) &&
+ pull8(ppReadPackedMsg, &npdcch_params_rel13->ncce_index, end) &&
+ pull8(ppReadPackedMsg, &npdcch_params_rel13->aggregation_level, end) &&
+ pull8(ppReadPackedMsg, &npdcch_params_rel13->start_symbol, end) &&
+ pull8(ppReadPackedMsg, &npdcch_params_rel13->rnti_type, end) &&
+ pull16(ppReadPackedMsg, &npdcch_params_rel13->rnti, end) &&
+ pull8(ppReadPackedMsg, &npdcch_params_rel13->scrambling_reinitialization_batch_index, end) &&
+ pull8(ppReadPackedMsg, &npdcch_params_rel13->nrs_antenna_ports_assumed_by_the_ue, end) &&
+ pull8(ppReadPackedMsg, &npdcch_params_rel13->dci_format, end) &&
+ pull8(ppReadPackedMsg, &npdcch_params_rel13->scheduling_delay, end) &&
+ pull8(ppReadPackedMsg, &npdcch_params_rel13->resource_assignment, end) &&
+ pull8(ppReadPackedMsg, &npdcch_params_rel13->repetition_number, end) &&
+ pull8(ppReadPackedMsg, &npdcch_params_rel13->mcs, end) &&
+ pull8(ppReadPackedMsg, &npdcch_params_rel13->new_data_indicator, end) &&
+ pull8(ppReadPackedMsg, &npdcch_params_rel13->harq_ack_resource, end) &&
+ pull8(ppReadPackedMsg, &npdcch_params_rel13->npdcch_order_indication, end) &&
+ pull8(ppReadPackedMsg, &npdcch_params_rel13->starting_number_of_nprach_repetitions, end) &&
+ pull8(ppReadPackedMsg, &npdcch_params_rel13->subcarrier_indication_of_nprach, end) &&
+ pull8(ppReadPackedMsg, &npdcch_params_rel13->paging_direct_indication_differentation_flag, end) &&
+ pull8(ppReadPackedMsg, &npdcch_params_rel13->direct_indication, end) &&
+ pull8(ppReadPackedMsg, &npdcch_params_rel13->dci_subframe_repetition_number, end) &&
+ pull8(ppReadPackedMsg, &npdcch_params_rel13->total_dci_length_including_padding, end));
+}
+
+static uint8_t unpack_dl_config_ndlsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_dl_config_ndlsch_pdu_rel13_t* ndlsch_params_rel13 = (nfapi_dl_config_ndlsch_pdu_rel13_t*)tlv;
+
+ return ( pull16(ppReadPackedMsg, &ndlsch_params_rel13->length, end) &&
+ pull16(ppReadPackedMsg, (uint16_t *)&ndlsch_params_rel13->pdu_index, end) &&
+ pull8(ppReadPackedMsg, &ndlsch_params_rel13->start_symbol, end) &&
+ pull8(ppReadPackedMsg, &ndlsch_params_rel13->rnti_type, end) &&
+ pull16(ppReadPackedMsg, &ndlsch_params_rel13->rnti, end) &&
+ pull16(ppReadPackedMsg, &ndlsch_params_rel13->resource_assignment, end) &&
+ pull16(ppReadPackedMsg, &ndlsch_params_rel13->repetition_number, end) &&
+ pull8(ppReadPackedMsg, &ndlsch_params_rel13->modulation, end) &&
+ pull8(ppReadPackedMsg, &ndlsch_params_rel13->number_of_subframes_for_resource_assignment, end) &&
+ pull8(ppReadPackedMsg, &ndlsch_params_rel13->scrambling_sequence_initialization_cinit, end) &&
+ pull16(ppReadPackedMsg, &ndlsch_params_rel13->sf_idx, end) &&
+ pull8(ppReadPackedMsg, &ndlsch_params_rel13->nrs_antenna_ports_assumed_by_the_ue, end));
+}
+
+
+static uint8_t unpack_dl_tti_request_body_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg)
+{
+ nfapi_nr_dl_tti_request_pdu_t* value = (nfapi_nr_dl_tti_request_pdu_t*)msg;
+
+ if(!(pull32(ppReadPackedMsg, &value->PDUSize, end) &&
+ pull16(ppReadPackedMsg, &value->PDUType, end) ))
+ return 0;
+
+
+ // first match the pdu type, then call the respective function
+ switch(value->PDUType)
+ {
+ case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE:
+ {
+ if(!(unpack_dl_tti_csi_rs_pdu_rel15_value(&value->csi_rs_pdu.csi_rs_pdu_rel15,ppReadPackedMsg,end)))
+ return 0;
+ }
+ break;
+
+ case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE:
+ {
+ if(!(unpack_dl_tti_pdcch_pdu_rel15_value(&value->pdcch_pdu.pdcch_pdu_rel15,ppReadPackedMsg,end)))
+ return 0;
+ }
+ break;
+ case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE:
+ {
+ if(!(unpack_dl_tti_pdsch_pdu_rel15_value(&value->pdsch_pdu.pdsch_pdu_rel15,ppReadPackedMsg,end)))
+ return 0;
+ }
+ break;
+ case NFAPI_NR_DL_TTI_SSB_PDU_TYPE:
+ {
+ if(!(unpack_dl_tti_ssb_pdu_rel15_value(&value->ssb_pdu.ssb_pdu_rel15,ppReadPackedMsg,end)))
+ return 0;
+ }
+ break;
+
+ default:
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid DL_TTI pdu type %d \n", value->PDUType );
+ }
+ break;
+ }
+
+ return 1;
+}
+
+
+
+
+static uint8_t unpack_dl_config_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_dl_config_request_body_t* value = (nfapi_dl_config_request_body_t*)tlv;
+
+ if(!(pull8(ppReadPackedMsg, &value->number_pdcch_ofdm_symbols, end) &&
+ pull8(ppReadPackedMsg, &value->number_dci, end) &&
+ pull16(ppReadPackedMsg, &value->number_pdu, end) &&
+ pull8(ppReadPackedMsg, &value->number_pdsch_rnti, end) &&
+ pull16(ppReadPackedMsg, &value->transmission_power_pcfich, end)))
+ return 0;
+
+ if(value->number_pdu > NFAPI_DL_CONFIG_MAX_PDU)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of dl config pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_pdu, NFAPI_DL_CONFIG_MAX_PDU);
+ return 0;
+ }
+
+ if(value->number_pdu)
+ {
+ value->dl_config_pdu_list = (nfapi_dl_config_request_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_dl_config_request_pdu_t) * value->number_pdu, config);
+ if(value->dl_config_pdu_list == NULL)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate dl config pdu list (count:%d)\n", __FUNCTION__, value->number_pdu);
+ return 0;
+ }
+ }
+ else
+ {
+ value->dl_config_pdu_list = 0;
+ }
+
+ uint16_t i;
+ uint16_t total_number_of_pdus = value->number_pdu;
+ for(i = 0; i < total_number_of_pdus; ++i)
+ {
+ nfapi_dl_config_request_pdu_t* pdu = &(value->dl_config_pdu_list[i]);
+
+ if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
+ pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
+ return 0;
+
+ uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
+
+ if(packedPduEnd > end)
+ {
+ // pdu end of beyond buffer end
+ return 0;
+ }
+
+ switch(pdu->pdu_type)
+ {
+ case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel8, &unpack_dl_config_dci_dl_pdu_rel8_value},
+ { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL9_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel9, &unpack_dl_config_dci_dl_pdu_rel9_value},
+ { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL10_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel10, &unpack_dl_config_dci_dl_pdu_rel10_value},
+ { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL11_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel11, &unpack_dl_config_dci_dl_pdu_rel11_value},
+ { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL12_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel12, &unpack_dl_config_dci_dl_pdu_rel12_value},
+ { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL13_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel13, &unpack_dl_config_dci_dl_pdu_rel13_value},
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_DL_CONFIG_BCH_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_DL_CONFIG_REQUEST_BCH_PDU_REL8_TAG, &pdu->bch_pdu.bch_pdu_rel8, &unpack_dl_config_bch_pdu_rel8_value},
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_DL_CONFIG_MCH_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_DL_CONFIG_REQUEST_MCH_PDU_REL8_TAG, &pdu->mch_pdu.mch_pdu_rel8, &unpack_dl_config_mch_pdu_rel8_value},
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel8, &unpack_dl_config_dlsch_pdu_rel8_value},
+ { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL9_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel9, &unpack_dl_config_dlsch_pdu_rel9_value},
+ { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL10_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel10, &unpack_dl_config_dlsch_pdu_rel10_value},
+ { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL11_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel11, &unpack_dl_config_dlsch_pdu_rel11_value},
+ { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL12_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel12, &unpack_dl_config_dlsch_pdu_rel12_value},
+ { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL13_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel13, &unpack_dl_config_dlsch_pdu_rel13_value},
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_DL_CONFIG_PCH_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL8_TAG, &pdu->pch_pdu.pch_pdu_rel8, &unpack_dl_config_pch_pdu_rel8_value},
+ { NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL13_TAG, &pdu->pch_pdu.pch_pdu_rel13, &unpack_dl_config_pch_pdu_rel13_value},
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_DL_CONFIG_PRS_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_DL_CONFIG_REQUEST_PRS_PDU_REL9_TAG, &pdu->prs_pdu.prs_pdu_rel9, &unpack_dl_config_prs_pdu_rel9_value},
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL10_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel10, &unpack_dl_config_csi_rs_pdu_rel10_value},
+ { NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL13_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel13, &unpack_dl_config_csi_rs_pdu_rel13_value},
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL8_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel8, &unpack_dl_config_dci_dl_pdu_rel8_value},
+ { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL9_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel9, &unpack_dl_config_dci_dl_pdu_rel9_value},
+ { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL10_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel10, &unpack_dl_config_dci_dl_pdu_rel10_value},
+ { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL11_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel11, &unpack_dl_config_dci_dl_pdu_rel11_value},
+ { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL12_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel12, &unpack_dl_config_dci_dl_pdu_rel12_value},
+ { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL13_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel13, &unpack_dl_config_dci_dl_pdu_rel13_value},
+ { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL11_TAG, &pdu->epdcch_pdu.epdcch_params_rel11, &unpack_dl_config_epdcch_params_rel11_value},
+ { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL13_TAG, &pdu->epdcch_pdu.epdcch_params_rel13, &unpack_dl_config_epdcch_params_rel13_value},
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_DL_CONFIG_REQUEST_MPDCCH_PDU_REL13_TAG, &pdu->mpdcch_pdu.mpdcch_pdu_rel13, &unpack_dl_config_mpdcch_pdu_rel13_value},
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_DL_CONFIG_NBCH_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_DL_CONFIG_REQUEST_NBCH_PDU_REL13_TAG, &pdu->nbch_pdu.nbch_pdu_rel13, &unpack_dl_config_nbch_pdu_rel13_value},
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_DL_CONFIG_NPDCCH_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_DL_CONFIG_REQUEST_NPDCCH_PDU_REL13_TAG, &pdu->npdcch_pdu.npdcch_pdu_rel13, &unpack_dl_config_npdcch_pdu_rel13_value},
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+
+ }
+ break;
+ case NFAPI_DL_CONFIG_NDLSCH_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_DL_CONFIG_REQUEST_NDLSCH_PDU_REL13_TAG, &pdu->ndlsch_pdu.ndlsch_pdu_rel13, &unpack_dl_config_ndlsch_pdu_rel13_value},
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+
+ }
+ break;
+ default:
+ // Need to log an error
+ break;
+ }
+ }
+
+ return 1;
+}
+
+
+static uint8_t unpack_dl_tti_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+ nfapi_nr_dl_tti_request_t *pNfapiMsg = (nfapi_nr_dl_tti_request_t*)msg;
+
+ if (!(pull16(ppReadPackedMsg,&pNfapiMsg->SFN, end) &&
+ pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
+ pull8(ppReadPackedMsg, &pNfapiMsg->dl_tti_request_body.nGroup, end) &&
+ pull8(ppReadPackedMsg, &pNfapiMsg->dl_tti_request_body.nPDUs, end) &&
+ pullarray8(ppReadPackedMsg,pNfapiMsg->dl_tti_request_body.nUe ,256,pNfapiMsg->dl_tti_request_body.nGroup, end)
+ //pusharray8(pNfapiMsg->PduIdx[0] ,256,256, ppWritePackedMsg, end)
+ ))
+ return 0;
+
+ int arr[12];
+ for(int i=0;idl_tti_request_body.nGroup;i++)
+ {
+ for(int j=0;jdl_tti_request_body.nUe[i];j++)
+ {
+ arr[j] = pNfapiMsg->dl_tti_request_body.PduIdx[i][j];
+ }
+ if(!(pullarrays32(ppReadPackedMsg,arr,12,pNfapiMsg->dl_tti_request_body.nUe[i], end)))
+ return 0;
+ }
+
+ for(int i=0;idl_tti_request_body.nPDUs;i++)
+ {
+ if(!unpack_dl_tti_request_body_value(ppReadPackedMsg, end, &pNfapiMsg->dl_tti_request_body.dl_tti_pdu_list[i]))
+ return 0;
+ }
+
+return 1;
+}
+
+
+static uint8_t unpack_ul_tti_request_prach_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_nr_prach_pdu_t* prach_pdu = (nfapi_nr_prach_pdu_t*)tlv;
+
+ return(
+ pull16(ppReadPackedMsg, &prach_pdu->phys_cell_id, end) &&
+ pull8(ppReadPackedMsg, &prach_pdu->num_prach_ocas, end) &&
+ pull8(ppReadPackedMsg, &prach_pdu->prach_format, end) &&
+ pull8(ppReadPackedMsg, &prach_pdu->num_ra, end) &&
+ pull8(ppReadPackedMsg, &prach_pdu->prach_start_symbol, end) &&
+ pull16(ppReadPackedMsg, &prach_pdu->num_cs, end)
+ // TODO: ignoring beamforming tlv for now
+ );
+}
+
+
+static uint8_t unpack_ul_tti_request_pucch_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_nr_pucch_pdu_t* pucch_pdu = (nfapi_nr_pucch_pdu_t*)tlv;
+
+ return(
+ pull16(ppReadPackedMsg, &pucch_pdu->rnti, end) &&
+ pull32(ppReadPackedMsg, &pucch_pdu->handle, end) &&
+ pull16(ppReadPackedMsg, &pucch_pdu->bwp_size, end) &&
+ pull16(ppReadPackedMsg, &pucch_pdu->bwp_start, end) &&
+ pull8(ppReadPackedMsg, &pucch_pdu->subcarrier_spacing, end) &&
+ pull8(ppReadPackedMsg, &pucch_pdu->cyclic_prefix, end) &&
+ pull8(ppReadPackedMsg, &pucch_pdu->format_type, end) &&
+ pull8(ppReadPackedMsg, &pucch_pdu->multi_slot_tx_indicator, end) &&
+ pull16(ppReadPackedMsg, &pucch_pdu->prb_start, end) &&
+ pull16(ppReadPackedMsg, &pucch_pdu->prb_size, end) &&
+ pull8(ppReadPackedMsg, &pucch_pdu->start_symbol_index, end) &&
+ pull8(ppReadPackedMsg, &pucch_pdu->nr_of_symbols, end) &&
+ pull8(ppReadPackedMsg, &pucch_pdu->freq_hop_flag, end) &&
+ pull16(ppReadPackedMsg, &pucch_pdu->second_hop_prb, end) &&
+ pull8(ppReadPackedMsg, &pucch_pdu->group_hop_flag, end) &&
+ pull8(ppReadPackedMsg, &pucch_pdu->sequence_hop_flag, end) &&
+ pull16(ppReadPackedMsg, &pucch_pdu->hopping_id, end) &&
+ pull16(ppReadPackedMsg, &pucch_pdu->initial_cyclic_shift, end) &&
+ pull16(ppReadPackedMsg, &pucch_pdu->data_scrambling_id, end) &&
+ pull8(ppReadPackedMsg, &pucch_pdu->time_domain_occ_idx, end) &&
+ pull8(ppReadPackedMsg, &pucch_pdu->pre_dft_occ_idx, end) &&
+ pull8(ppReadPackedMsg, &pucch_pdu->pre_dft_occ_len, end) &&
+ pull8(ppReadPackedMsg, &pucch_pdu->add_dmrs_flag, end) &&
+ pull16(ppReadPackedMsg, &pucch_pdu->dmrs_scrambling_id, end) &&
+ pull8(ppReadPackedMsg, &pucch_pdu->dmrs_cyclic_shift, end) &&
+ pull8(ppReadPackedMsg, &pucch_pdu->sr_flag, end) &&
+ pull8(ppReadPackedMsg, &pucch_pdu->bit_len_harq, end) &&
+ pull16(ppReadPackedMsg, &pucch_pdu->bit_len_csi_part1, end) &&
+ pull16(ppReadPackedMsg, &pucch_pdu->bit_len_csi_part2, end)
+ // TODO: ignoring beamforming tlv for now
+ );
+}
+
+
+static uint8_t unpack_ul_tti_request_pusch_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_nr_pusch_pdu_t* pusch_pdu = (nfapi_nr_pusch_pdu_t*)tlv;
+
+ if (!(
+ pull16(ppReadPackedMsg, &pusch_pdu->pdu_bit_map, end) &&
+ pull16(ppReadPackedMsg, &pusch_pdu->rnti, end) &&
+ pull32(ppReadPackedMsg, &pusch_pdu->handle, end) &&
+ pull16(ppReadPackedMsg, &pusch_pdu->bwp_size, end) &&
+ pull16(ppReadPackedMsg, &pusch_pdu->bwp_start, end) &&
+ pull8(ppReadPackedMsg, &pusch_pdu->subcarrier_spacing, end) &&
+ pull8(ppReadPackedMsg, &pusch_pdu->cyclic_prefix, end) &&
+ pull16(ppReadPackedMsg, &pusch_pdu->target_code_rate, end) &&
+ pull8(ppReadPackedMsg, &pusch_pdu->qam_mod_order, end) &&
+ pull8(ppReadPackedMsg, &pusch_pdu->mcs_index, end) &&
+ pull8(ppReadPackedMsg, &pusch_pdu->mcs_table, end) &&
+ pull8(ppReadPackedMsg, &pusch_pdu->transform_precoding, end) &&
+ pull16(ppReadPackedMsg, &pusch_pdu->data_scrambling_id, end) &&
+ pull8(ppReadPackedMsg, &pusch_pdu->nrOfLayers, end) &&
+ pull16(ppReadPackedMsg, &pusch_pdu->ul_dmrs_symb_pos, end) &&
+ pull8(ppReadPackedMsg, &pusch_pdu->dmrs_config_type, end) &&
+ pull16(ppReadPackedMsg, &pusch_pdu->ul_dmrs_scrambling_id, end) &&
+ pull8(ppReadPackedMsg, &pusch_pdu->scid, end) &&
+ pull8(ppReadPackedMsg, &pusch_pdu->num_dmrs_cdm_grps_no_data, end) &&
+ pull16(ppReadPackedMsg, &pusch_pdu->dmrs_ports, end) &&
+ pull8(ppReadPackedMsg, &pusch_pdu->resource_alloc, end) &&
+ pull8(ppReadPackedMsg, &pusch_pdu->resource_alloc,end) &&
+ pull16(ppReadPackedMsg, &pusch_pdu->dmrs_ports, end) &&
+ pull16(ppReadPackedMsg, &pusch_pdu->rb_start, end) &&
+ pull16(ppReadPackedMsg, &pusch_pdu->rb_size, end) &&
+ pull8(ppReadPackedMsg, &pusch_pdu->vrb_to_prb_mapping, end) &&
+ pull8(ppReadPackedMsg, &pusch_pdu->frequency_hopping, end) &&
+ pull16(ppReadPackedMsg, &pusch_pdu->tx_direct_current_location, end) &&
+ pull8(ppReadPackedMsg, &pusch_pdu->uplink_frequency_shift_7p5khz, end) &&
+ pull8(ppReadPackedMsg, &pusch_pdu->start_symbol_index, end) &&
+ pull8(ppReadPackedMsg, &pusch_pdu->nr_of_symbols, end)
+ // TODO: ignoring beamforming tlv for now
+ ))
+ return 0;
+
+
+ //Pack Optional Data only included if indicated in pduBitmap
+ switch(pusch_pdu->pdu_bit_map){
+ case PUSCH_PDU_BITMAP_PUSCH_DATA:
+ {
+ // pack optional TLVs
+ return(
+ pull8(ppReadPackedMsg, &pusch_pdu->pusch_data.rv_index, end) &&
+ pull8(ppReadPackedMsg, &pusch_pdu->pusch_data.harq_process_id, end) &&
+ pull32(ppReadPackedMsg, &pusch_pdu->pusch_data.tb_size, end) &&
+ pull16(ppReadPackedMsg, &pusch_pdu->pusch_data.num_cb, end) &&
+ pullarray8(ppReadPackedMsg, pusch_pdu->pusch_data.cb_present_and_position,1,1,end)
+ );
+ }
+ break;
+
+ case PUSCH_PDU_BITMAP_PUSCH_UCI:
+ {
+ return(
+ pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.harq_ack_bit_length, end) &&
+ pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.csi_part1_bit_length, end) &&
+ pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.csi_part2_bit_length, end) &&
+ pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.alpha_scaling, end) &&
+ pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_harq_ack, end) &&
+ pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_csi1, end) &&
+ pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_csi2, end)
+ );
+ }
+ break;
+
+ case PUSCH_PDU_BITMAP_PUSCH_PTRS:
+ {
+ return(
+ pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.num_ptrs_ports, end) &&
+ pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_dmrs_port, end) &&
++ pull16(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_port_index, end) &&
++ pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_re_offset, end) &&
+ pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_time_density, end) &&
+ pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_freq_density, end) &&
+ pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ul_ptrs_power, end)
+ );
+ }
+ break;
+
+ case PUSCH_PDU_BITMAP_DFTS_OFDM:
+ {
+ return(
+ pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.low_papr_group_number, end) &&
+ pull16(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.low_papr_sequence_number, end) &&
+ pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.ul_ptrs_sample_density, end) &&
+ pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.ul_ptrs_time_density_transform_precoding, end)
+ );
+ }
+ break;
+
+ default:
+ {
+ NFAPI_TRACE(NFAPI_TRACE_INFO, "Invalid pdu bitmap %d \n", pusch_pdu->pdu_bit_map );
+ }
+ }
+
+ return 1;
+}
+
+
+static uint8_t unpack_ul_tti_request_srs_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_nr_srs_pdu_t* srs_pdu = (nfapi_nr_srs_pdu_t*)tlv;
+
+ return(
+ pull16(ppReadPackedMsg, &srs_pdu->rnti, end) &&
+ pull32(ppReadPackedMsg, &srs_pdu->handle, end) &&
+ pull16(ppReadPackedMsg, &srs_pdu->bwp_size, end) &&
+ pull16(ppReadPackedMsg, &srs_pdu->bwp_start, end) &&
+ pull8(ppReadPackedMsg, &srs_pdu->subcarrier_spacing, end) &&
+ pull8(ppReadPackedMsg, &srs_pdu->cyclic_prefix, end) &&
+ pull8(ppReadPackedMsg, &srs_pdu->num_ant_ports, end) &&
+ pull8(ppReadPackedMsg, &srs_pdu->num_symbols, end) &&
+ pull8(ppReadPackedMsg, &srs_pdu->num_repetitions, end) &&
+ pull8(ppReadPackedMsg, &srs_pdu->time_start_position, end) &&
+ pull8(ppReadPackedMsg, &srs_pdu->config_index, end) &&
+ pull16(ppReadPackedMsg, &srs_pdu->sequence_id, end) &&
+ pull8(ppReadPackedMsg, &srs_pdu->bandwidth_index, end) &&
+ pull8(ppReadPackedMsg, &srs_pdu->comb_size, end) &&
+ pull8(ppReadPackedMsg, &srs_pdu->comb_offset, end) &&
+ pull8(ppReadPackedMsg, &srs_pdu->cyclic_shift, end) &&
+ pull8(ppReadPackedMsg, &srs_pdu->frequency_position, end) &&
+ pull8(ppReadPackedMsg, &srs_pdu->frequency_shift, end) &&
+ pull8(ppReadPackedMsg, &srs_pdu->frequency_hopping, end) &&
+ pull8(ppReadPackedMsg, &srs_pdu->group_or_sequence_hopping, end) &&
+ pull8(ppReadPackedMsg, &srs_pdu->resource_type, end) &&
+ pull16(ppReadPackedMsg, &srs_pdu->t_srs, end) &&
+ pull16(ppReadPackedMsg, &srs_pdu->t_offset, end)
+ // TODO: ignoring beamforming tlv for now
+ );
+}
+
+
+static uint8_t unpack_ul_tti_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg)
+{
+ nfapi_nr_ul_tti_request_number_of_pdus_t* pNfapiMsg = (nfapi_nr_ul_tti_request_number_of_pdus_t*)msg;
+
+ if(!(pull16(ppReadPackedMsg, &pNfapiMsg->pdu_size, end) &&
+ pull16(ppReadPackedMsg, &pNfapiMsg->pdu_type, end) ))
+ return 0;
+
+
+ // first natch the pdu type, then call the respective function
+ switch(pNfapiMsg->pdu_type)
+ {
+
+ case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE:
+ {
+ if(!unpack_ul_tti_request_prach_pdu(&pNfapiMsg->prach_pdu, ppReadPackedMsg, end))
+ return 0;
+ }
+ break;
+
+ case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE:
+ {
+ if(!unpack_ul_tti_request_pucch_pdu(&pNfapiMsg->pucch_pdu, ppReadPackedMsg, end))
+ return 0;
+ }
+ break;
+
+ case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE:
+ {
+ if(!unpack_ul_tti_request_pusch_pdu(&pNfapiMsg->pusch_pdu, ppReadPackedMsg, end))
+ return 0;
+ }
+ break;
+
+ case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE:
+ {
+ if(!unpack_ul_tti_request_srs_pdu(&pNfapiMsg->srs_pdu, ppReadPackedMsg, end))
+ return 0;
+ }
+ break;
+
+ default:
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid UL_TTI pdu type %d \n", pNfapiMsg->pdu_type );
+ }
+ break;
+
+
+ }
+
+ return 1;
+}
+
+
+static uint8_t unpack_ul_tti_groups_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg)
+{
+ nfapi_nr_ul_tti_request_number_of_groups_t* pNfapiMsg = (nfapi_nr_ul_tti_request_number_of_groups_t*)msg;
+
+ if(!pull8(ppReadPackedMsg, &pNfapiMsg->n_ue, end))
+ return 0;
+ for (int i = 0; i < pNfapiMsg->n_ue; i++)
+ {
+ if(!pull8(ppReadPackedMsg, &pNfapiMsg->ue_list[i].pdu_idx ,end) )
+ return 0;
+ }
+ return 1;
+}
+
+
+static uint8_t unpack_ul_tti_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+ nfapi_nr_ul_tti_request_t *pNfapiMsg = (nfapi_nr_ul_tti_request_t*)msg;
+
+ if (!(
+ pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end) &&
+ pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
+ pull8(ppReadPackedMsg, &pNfapiMsg->n_pdus, end) &&
+ pull8(ppReadPackedMsg, &pNfapiMsg->n_group, end) &&
+ pull8(ppReadPackedMsg, &pNfapiMsg->rach_present, end) &&
+ pull8(ppReadPackedMsg, &pNfapiMsg->n_ulcch, end) &&
+ pull8(ppReadPackedMsg, &pNfapiMsg->n_ulsch, end) ))
+ return 0;
+
+ for(int i=0; i< pNfapiMsg->n_pdus; i++)
+ {
+ if (!unpack_ul_tti_pdu_list_value(ppReadPackedMsg, end, &pNfapiMsg->pdus_list[i]))
+ return 0;
+ }
+
+ for(int i=0; i< pNfapiMsg->n_group; i++)
+ {
+ if (!unpack_ul_tti_groups_list_value(ppReadPackedMsg, end, &pNfapiMsg->groups_list[i]))
+ return 0;
+ }
+
+ return 1;
+}
+
+
+
+static uint8_t unpack_dl_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+ nfapi_dl_config_request_t *pNfapiMsg = (nfapi_dl_config_request_t*)msg;
+
+ unpack_p7_tlv_t unpack_fns[] =
+ {
+ { NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, &unpack_dl_config_request_body_value},
+ };
+
+ return ( pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+ unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_ul_config_ulsch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+
+
+
+ nfapi_ul_config_ulsch_pdu_rel8_t* ulsch_pdu_rel8 = (nfapi_ul_config_ulsch_pdu_rel8_t*)tlv;
+
+ return (pull32(ppReadPackedMsg, &ulsch_pdu_rel8->handle, end) &&
+ pull16(ppReadPackedMsg, &ulsch_pdu_rel8->size, end) &&
+ pull16(ppReadPackedMsg, &ulsch_pdu_rel8->rnti, end) &&
+ pull8(ppReadPackedMsg, &ulsch_pdu_rel8->resource_block_start, end) &&
+ pull8(ppReadPackedMsg, &ulsch_pdu_rel8->number_of_resource_blocks, end) &&
+ pull8(ppReadPackedMsg, &ulsch_pdu_rel8->modulation_type, end) &&
+ pull8(ppReadPackedMsg, &ulsch_pdu_rel8->cyclic_shift_2_for_drms, end) &&
+ pull8(ppReadPackedMsg, &ulsch_pdu_rel8->frequency_hopping_enabled_flag, end) &&
+ pull8(ppReadPackedMsg, &ulsch_pdu_rel8->frequency_hopping_bits, end) &&
+ pull8(ppReadPackedMsg, &ulsch_pdu_rel8->new_data_indication, end) &&
+ pull8(ppReadPackedMsg, &ulsch_pdu_rel8->redundancy_version, end) &&
+ pull8(ppReadPackedMsg, &ulsch_pdu_rel8->harq_process_number, end) &&
+ pull8(ppReadPackedMsg, &ulsch_pdu_rel8->ul_tx_mode, end) &&
+ pull8(ppReadPackedMsg, &ulsch_pdu_rel8->current_tx_nb, end) &&
+ pull8(ppReadPackedMsg, &ulsch_pdu_rel8->n_srs, end ));
+}
+
+static uint8_t unpack_ul_config_ulsch_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_ulsch_pdu_rel10_t* ulsch_pdu_rel10 = (nfapi_ul_config_ulsch_pdu_rel10_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &ulsch_pdu_rel10->resource_allocation_type, end) &&
+ pull32(ppReadPackedMsg, &ulsch_pdu_rel10->resource_block_coding, end) &&
+ pull8(ppReadPackedMsg, &ulsch_pdu_rel10->transport_blocks, end) &&
+ pull8(ppReadPackedMsg, &ulsch_pdu_rel10->transmission_scheme, end) &&
+ pull8(ppReadPackedMsg, &ulsch_pdu_rel10->number_of_layers, end) &
+ pull8(ppReadPackedMsg, &ulsch_pdu_rel10->codebook_index, end) &&
+ pull8(ppReadPackedMsg, &ulsch_pdu_rel10->disable_sequence_hopping_flag, end));
+}
+static uint8_t unpack_ul_config_ulsch_pdu_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_ulsch_pdu_rel11_t* ulsch_pdu_rel11 = (nfapi_ul_config_ulsch_pdu_rel11_t*)tlv;
+
+ return ( pull8(ppReadPackedMsg, &ulsch_pdu_rel11->virtual_cell_id_enabled_flag, end) &&
+ pull16(ppReadPackedMsg, &ulsch_pdu_rel11->npusch_identity, end) &&
+ pull8(ppReadPackedMsg, &ulsch_pdu_rel11->dmrs_config_flag, end) &&
+ pull16(ppReadPackedMsg, &ulsch_pdu_rel11->ndmrs_csh_identity, end));
+}
+static uint8_t unpack_ul_config_ulsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_ulsch_pdu_rel13_t* ulsch_pdu_rel13 = (nfapi_ul_config_ulsch_pdu_rel13_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &ulsch_pdu_rel13->ue_type, end) &&
+ pull16(ppReadPackedMsg, &ulsch_pdu_rel13->total_number_of_repetitions, end) &&
+ pull16(ppReadPackedMsg, &ulsch_pdu_rel13->repetition_number, end) &&
+ pull16(ppReadPackedMsg, &ulsch_pdu_rel13->initial_transmission_sf_io, end) &&
+ pull8(ppReadPackedMsg, &ulsch_pdu_rel13->empty_symbols_due_to_re_tunning, end));
+}
+static uint8_t unpack_ul_config_cqi_ri_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_cqi_ri_information_rel8_t* cqi_ri_info_rel8 = (nfapi_ul_config_cqi_ri_information_rel8_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &cqi_ri_info_rel8->dl_cqi_pmi_size_rank_1, end) &&
+ pull8(ppReadPackedMsg, &cqi_ri_info_rel8->dl_cqi_pmi_size_rank_greater_1, end) &&
+ pull8(ppReadPackedMsg, &cqi_ri_info_rel8->ri_size, end) &&
+ pull8(ppReadPackedMsg, &cqi_ri_info_rel8->delta_offset_cqi, end) &&
+ pull8(ppReadPackedMsg, &cqi_ri_info_rel8->delta_offset_ri, end));
+}
+
+static uint8_t unpack_ul_config_cqi_ri_info_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_cqi_ri_information_rel9_t* cqi_ri_info_rel9 = (nfapi_ul_config_cqi_ri_information_rel9_t*)tlv;
+
+ if(!(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->report_type, end) &&
+ pull8(ppReadPackedMsg, &cqi_ri_info_rel9->delta_offset_cqi, end) &&
+ pull8(ppReadPackedMsg, &cqi_ri_info_rel9->delta_offset_ri, end)))
+ return 0;
+
+ switch(cqi_ri_info_rel9->report_type)
+ {
+ case NFAPI_CSI_REPORT_TYPE_PERIODIC:
+ {
+ if(!(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size, end) &&
+ pull8(ppReadPackedMsg, &cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.control_type, end)))
+ return 0;
+ }
+ break;
+ case NFAPI_CSI_REPORT_TYPE_APERIODIC:
+ {
+ if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc, end) ==0)
+ return 0;
+
+ uint8_t i;
+ for(i = 0; i < cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc; ++i)
+ {
+ if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size, end) == 0)
+ return 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[j], end) == 0)
+ return 0;
+ }
+ }
+ }
+ break;
+ default:
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid report type %d \n", cqi_ri_info_rel9->report_type );
+ return 0;
+ }
+ break;
+ };
+ return 1;
+}
+
+// NOTE : This function is a little unconventional as we uese the side to
+// determine the report type
+static uint8_t unpack_ul_config_cqi_ri_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_cqi_ri_information_rel13_t* cqi_ri_info_rel13 = (nfapi_ul_config_cqi_ri_information_rel13_t*)tlv;
+ if(cqi_ri_info_rel13->tl.length == 0)
+ {
+ cqi_ri_info_rel13->report_type = NFAPI_CSI_REPORT_TYPE_APERIODIC;
+ }
+ else
+ {
+ cqi_ri_info_rel13->report_type = NFAPI_CSI_REPORT_TYPE_PERIODIC;
+ if(pull16(ppReadPackedMsg, &cqi_ri_info_rel13->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size_2, end) == 0)
+ return 0;
+ }
+ return 1;
+}
+static uint8_t unpack_ul_config_cqi_init_tx_params_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_initial_transmission_parameters_rel8_t* init_tx_params_rel8 = (nfapi_ul_config_initial_transmission_parameters_rel8_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &init_tx_params_rel8->n_srs_initial, end) &&
+ pull8(ppReadPackedMsg, &init_tx_params_rel8->initial_number_of_resource_blocks, end));
+}
+static uint8_t unpack_ul_config_ulsch_harq_info_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_ulsch_harq_information_rel10_t* harq_info_rel10 = (nfapi_ul_config_ulsch_harq_information_rel10_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &harq_info_rel10->harq_size, end) &&
+ pull8(ppReadPackedMsg, &harq_info_rel10->delta_offset_harq, end) &&
+ pull8(ppReadPackedMsg, &harq_info_rel10->ack_nack_mode, end));
+}
+
+static uint8_t unpack_ul_config_ulsch_harq_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_ulsch_harq_information_rel13_t* harq_info_rel13 = (nfapi_ul_config_ulsch_harq_information_rel13_t*)tlv;
+
+ return (pull16(ppReadPackedMsg, &harq_info_rel13->harq_size_2, end) &&
+ pull8(ppReadPackedMsg, &harq_info_rel13->delta_offset_harq_2, end));
+}
+
+static uint8_t unpack_ul_config_ue_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_ue_information_rel8_t* ue_info_rel8 = (nfapi_ul_config_ue_information_rel8_t*)tlv;
+
+ return (pull32(ppReadPackedMsg, &ue_info_rel8->handle, end) &&
+ pull16(ppReadPackedMsg, (uint16_t *)&ue_info_rel8->rnti, end));
+}
+static uint8_t unpack_ul_config_ue_info_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_ue_information_rel11_t* ue_info_rel11 = (nfapi_ul_config_ue_information_rel11_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &ue_info_rel11->virtual_cell_id_enabled_flag, end) &&
+ pull16(ppReadPackedMsg, &ue_info_rel11->npusch_identity, end));
+}
+static uint8_t unpack_ul_config_ue_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_ue_information_rel13_t* ue_info_rel13 = (nfapi_ul_config_ue_information_rel13_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &ue_info_rel13->ue_type, end) &&
+ pull8(ppReadPackedMsg, &ue_info_rel13->empty_symbols, end) &&
+ pull16(ppReadPackedMsg, &ue_info_rel13->total_number_of_repetitions, end) &&
+ pull16(ppReadPackedMsg, &ue_info_rel13->repetition_number, end));
+}
+
+static uint8_t unpack_ul_config_cqi_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_cqi_information_rel8_t* cqi_info_rel8 = (nfapi_ul_config_cqi_information_rel8_t*)tlv;
+
+ return ( pull16(ppReadPackedMsg, &cqi_info_rel8->pucch_index, end) &&
+ pull8(ppReadPackedMsg, &cqi_info_rel8->dl_cqi_pmi_size, end));
+}
+static uint8_t unpack_ul_config_cqi_info_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_cqi_information_rel10_t* cqi_info_rel10 = (nfapi_ul_config_cqi_information_rel10_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &cqi_info_rel10->number_of_pucch_resource, end) &&
+ pull16(ppReadPackedMsg, &cqi_info_rel10->pucch_index_p1, end));
+}
+static uint8_t unpack_ul_config_cqi_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_cqi_information_rel13_t* cqi_info_rel13 = (nfapi_ul_config_cqi_information_rel13_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &cqi_info_rel13->csi_mode, end) &&
+ pull16(ppReadPackedMsg, &cqi_info_rel13->dl_cqi_pmi_size_2, end) &&
+ pull8(ppReadPackedMsg, &cqi_info_rel13->starting_prb, end) &&
+ pull8(ppReadPackedMsg, &cqi_info_rel13->n_prb, end) &&
+ pull8(ppReadPackedMsg, &cqi_info_rel13->cdm_index, end) &&
+ pull8(ppReadPackedMsg, &cqi_info_rel13->n_srs, end));
+}
+
+static uint8_t unpack_ul_config_sr_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_sr_information_rel8_t* sr_info_rel8 = (nfapi_ul_config_sr_information_rel8_t*)tlv;
+
+ return ( pull16(ppReadPackedMsg, &sr_info_rel8->pucch_index, end));
+}
+
+static uint8_t unpack_ul_config_sr_info_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_sr_information_rel10_t* sr_info_rel10 = (nfapi_ul_config_sr_information_rel10_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &sr_info_rel10->number_of_pucch_resources, end) &&
+ pull16(ppReadPackedMsg, &sr_info_rel10->pucch_index_p1, end));
+}
+
+static uint8_t unpack_ul_config_harq_info_rel10_tdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_harq_information_rel10_tdd_t* harq_info_tdd_rel10 = (nfapi_ul_config_harq_information_rel10_tdd_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &harq_info_tdd_rel10->harq_size, end) &&
+ pull8(ppReadPackedMsg, &harq_info_tdd_rel10->ack_nack_mode, end) &&
+ pull8(ppReadPackedMsg, &harq_info_tdd_rel10->number_of_pucch_resources, end) &&
+ pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_0, end) &&
+ pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_1, end) &&
+ pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_2, end) &&
+ pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_3, end));
+}
+
+static uint8_t unpack_ul_config_harq_info_rel8_fdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_harq_information_rel8_fdd_t* harq_info_fdd_rel8 = (nfapi_ul_config_harq_information_rel8_fdd_t*)tlv;
+
+ return (pull16(ppReadPackedMsg, &harq_info_fdd_rel8->n_pucch_1_0, end) &&
+ pull8(ppReadPackedMsg, &harq_info_fdd_rel8->harq_size, end));
+}
+
+static uint8_t unpack_ul_config_harq_info_rel9_fdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_harq_information_rel9_fdd_t* harq_info_fdd_rel9 = (nfapi_ul_config_harq_information_rel9_fdd_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &harq_info_fdd_rel9->harq_size, end) &&
+ pull8(ppReadPackedMsg, &harq_info_fdd_rel9->ack_nack_mode, end) &&
+ pull8(ppReadPackedMsg, &harq_info_fdd_rel9->number_of_pucch_resources, end) &&
+ pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_0, end) &&
+ pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_1, end) &&
+ pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_2, end) &&
+ pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_3, end));
+}
+
+static uint8_t unpack_ul_config_harq_info_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_harq_information_rel11_t* harq_info_rel11 = (nfapi_ul_config_harq_information_rel11_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &harq_info_rel11->num_ant_ports, end) &&
+ pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_0, end) &&
+ pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_1, end) &&
+ pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_2, end) &&
+ pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_3, end));
+}
+
+static uint8_t unpack_ul_config_harq_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_harq_information_rel13_t* harq_info_rel13 = (nfapi_ul_config_harq_information_rel13_t*)tlv;
+
+ return (pull16(ppReadPackedMsg, &harq_info_rel13->harq_size_2, end) &&
+ pull8(ppReadPackedMsg, &harq_info_rel13->starting_prb, end) &&
+ pull8(ppReadPackedMsg, &harq_info_rel13->n_prb, end) &&
+ pull8(ppReadPackedMsg, &harq_info_rel13->cdm_index, end) &&
+ pull8(ppReadPackedMsg, &harq_info_rel13->n_srs, end));
+}
+
+
+static uint8_t unpack_ul_config_srs_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_srs_pdu_rel8_t* srs_pdu_rel8 = (nfapi_ul_config_srs_pdu_rel8_t*)tlv;
+
+ return (pull32(ppReadPackedMsg, &srs_pdu_rel8->handle, end) &&
+ pull16(ppReadPackedMsg, &srs_pdu_rel8->size, end) &&
+ pull16(ppReadPackedMsg, &srs_pdu_rel8->rnti, end) &&
+ pull8(ppReadPackedMsg, &srs_pdu_rel8->srs_bandwidth, end) &&
+ pull8(ppReadPackedMsg, &srs_pdu_rel8->frequency_domain_position, end) &&
+ pull8(ppReadPackedMsg, &srs_pdu_rel8->srs_hopping_bandwidth, end) &&
+ pull8(ppReadPackedMsg, &srs_pdu_rel8->transmission_comb, end) &&
+ pull16(ppReadPackedMsg, &srs_pdu_rel8->i_srs, end) &&
+ pull8(ppReadPackedMsg, &srs_pdu_rel8->sounding_reference_cyclic_shift, end));
+}
+
+static uint8_t unpack_ul_config_srs_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_srs_pdu_rel10_t* srs_pdu_rel10 = (nfapi_ul_config_srs_pdu_rel10_t*)tlv;
+ return pull8(ppReadPackedMsg, &srs_pdu_rel10->antenna_port, end);
+}
+
+static uint8_t unpack_ul_config_srs_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_srs_pdu_rel13_t* srs_pdu_rel13 = (nfapi_ul_config_srs_pdu_rel13_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &srs_pdu_rel13->number_of_combs, end));
+}
+
+static uint8_t unpack_ul_nb_harq_info_rel13_fdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_nb_harq_information_rel13_fdd_t* nb_harq_info_fdd_rel13 = (nfapi_ul_config_nb_harq_information_rel13_fdd_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &nb_harq_info_fdd_rel13->harq_ack_resource, end));
+}
+
+static uint8_t unpack_ul_config_nulsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_nulsch_pdu_rel13_t* nulsch_pdu_rel13 = (nfapi_ul_config_nulsch_pdu_rel13_t*)tlv;
+
+ if(!(pull8(ppReadPackedMsg, &nulsch_pdu_rel13->nulsch_format, end) &&
+ pull32(ppReadPackedMsg, &nulsch_pdu_rel13->handle, end) &&
+ pull16(ppReadPackedMsg, &nulsch_pdu_rel13->size, end) &&
+ pull16(ppReadPackedMsg, &nulsch_pdu_rel13->rnti, end) &&
+ pull8(ppReadPackedMsg, &nulsch_pdu_rel13->subcarrier_indication, end) &&
+ pull8(ppReadPackedMsg, &nulsch_pdu_rel13->resource_assignment, end) &&
+ pull8(ppReadPackedMsg, &nulsch_pdu_rel13->mcs, end) &&
+ pull8(ppReadPackedMsg, &nulsch_pdu_rel13->redudancy_version, end) &&
+ pull8(ppReadPackedMsg, &nulsch_pdu_rel13->repetition_number, end) &&
+ pull8(ppReadPackedMsg, &nulsch_pdu_rel13->new_data_indication, end) &&
+ pull8(ppReadPackedMsg, &nulsch_pdu_rel13->n_srs, end) &&
+ pull16(ppReadPackedMsg, &nulsch_pdu_rel13->scrambling_sequence_initialization_cinit, end) &&
+ pull16(ppReadPackedMsg, &nulsch_pdu_rel13->sf_idx, end)))
+ return 0;
+
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG, &nulsch_pdu_rel13->ue_information.ue_information_rel8, &unpack_ul_config_ue_info_rel8_value},
+ { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG, &nulsch_pdu_rel13->ue_information.ue_information_rel11, &unpack_ul_config_ue_info_rel11_value},
+ { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG, &nulsch_pdu_rel13->ue_information.ue_information_rel13, &unpack_ul_config_ue_info_rel13_value},
+ { NFAPI_UL_CONFIG_REQUEST_NB_HARQ_INFORMATION_REL13_FDD_TAG, &nulsch_pdu_rel13->nb_harq_information.nb_harq_information_rel13_fdd, &unpack_ul_nb_harq_info_rel13_fdd_value},
+ };
+
+ return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, 0, 0);
+}
+
+static uint8_t unpack_ul_config_nrach_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_config_nrach_pdu_rel13_t* nrach_pdu_rel13 = (nfapi_ul_config_nrach_pdu_rel13_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &nrach_pdu_rel13->nprach_config_0, end) &&
+ pull8(ppReadPackedMsg, &nrach_pdu_rel13->nprach_config_1, end) &&
+ pull8(ppReadPackedMsg, &nrach_pdu_rel13->nprach_config_2, end));
+}
+
+
+static uint8_t unpack_ul_config_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ #define UL_CONFIG_ULSCH_PDU_UNPACK_FNS(_pdu) \
+ { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL8_TAG, &_pdu.ulsch_pdu_rel8, &unpack_ul_config_ulsch_pdu_rel8_value}, \
+ { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL10_TAG, &_pdu.ulsch_pdu_rel10, &unpack_ul_config_ulsch_pdu_rel10_value}, \
+ { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL11_TAG, &_pdu.ulsch_pdu_rel11, &unpack_ul_config_ulsch_pdu_rel11_value}, \
+ { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL13_TAG, &_pdu.ulsch_pdu_rel13, &unpack_ul_config_ulsch_pdu_rel13_value},
+
+ #define UL_CONFIG_CQI_RI_INFO_UNPACK_FNS(_pdu) \
+ { NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL8_TAG, &_pdu.cqi_ri_information_rel8, &unpack_ul_config_cqi_ri_info_rel8_value}, \
+ { NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL9_TAG, &_pdu.cqi_ri_information_rel9, &unpack_ul_config_cqi_ri_info_rel9_value}, \
+ { NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL13_TAG, &_pdu.cqi_ri_information_rel13, &unpack_ul_config_cqi_ri_info_rel13_value},
+
+ #define UL_CONFIG_ULSCH_HARQ_INFO_UNPACK_FNS(_pdu) \
+ { NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL10_TAG, &_pdu.harq_information_rel10, &unpack_ul_config_ulsch_harq_info_rel10_value},\
+ { NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL13_TAG, &_pdu.harq_information_rel13, &unpack_ul_config_ulsch_harq_info_rel13_value},
+
+ #define UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(_pdu) \
+ { NFAPI_UL_CONFIG_REQUEST_INITIAL_TRANSMISSION_PARAMETERS_REL8_TAG, &_pdu.initial_transmission_parameters_rel8, &unpack_ul_config_cqi_init_tx_params_rel8_value},
+
+ #define UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(_pdu) \
+ { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG, &_pdu.ue_information_rel8, &unpack_ul_config_ue_info_rel8_value}, \
+ { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG, &_pdu.ue_information_rel11, &unpack_ul_config_ue_info_rel11_value}, \
+ { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG, &_pdu.ue_information_rel13, &unpack_ul_config_ue_info_rel13_value},
+
+ #define UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(_pdu) \
+ { NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG, &_pdu.cqi_information_rel8, &unpack_ul_config_cqi_info_rel8_value}, \
+ { NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL10_TAG, &_pdu.cqi_information_rel10, &unpack_ul_config_cqi_info_rel10_value}, \
+ { NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL13_TAG, &_pdu.cqi_information_rel13, &unpack_ul_config_cqi_info_rel13_value},
+
+ #define UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(_pdu) \
+ { NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL8_TAG, &_pdu.sr_information_rel8, &unpack_ul_config_sr_info_rel8_value}, \
+ { NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL10_TAG, &_pdu.sr_information_rel10, &unpack_ul_config_sr_info_rel10_value},
+
+ #define UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(_pdu) \
+ { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL10_TDD_TAG, &_pdu.harq_information_rel10_tdd, &unpack_ul_config_harq_info_rel10_tdd_value}, \
+ { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL8_FDD_TAG, &_pdu.harq_information_rel8_fdd, &unpack_ul_config_harq_info_rel8_fdd_value}, \
+ { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL9_FDD_TAG, &_pdu.harq_information_rel9_fdd, &unpack_ul_config_harq_info_rel9_fdd_value}, \
+ { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL11_TAG, &_pdu.harq_information_rel11, &unpack_ul_config_harq_info_rel11_value}, \
+ { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL13_TAG, &_pdu.harq_information_rel13, &unpack_ul_config_harq_info_rel13_value},
+
+ #define UL_CONFIG_SRS_PDU_UNPACK_FNS(_pdu) \
+ { NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL8_TAG, &_pdu.srs_pdu_rel8, &unpack_ul_config_srs_pdu_rel8_value}, \
+ { NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL10_TAG, &_pdu.srs_pdu_rel10, &unpack_ul_config_srs_pdu_rel10_value}, \
+ { NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL13_TAG, &_pdu.srs_pdu_rel13, &unpack_ul_config_srs_pdu_rel13_value},
+
+ #define UL_CONFIG_NULSCH_PDU_UNPACK_FNS(_pdu) \
+ { NFAPI_UL_CONFIG_REQUEST_NULSCH_PDU_REL13_TAG, &_pdu.nulsch_pdu_rel13, &unpack_ul_config_nulsch_pdu_rel13_value},
+
+ #define UL_CONFIG_NRACH_PDU_UNPACK_FNS(_pdu) \
+ { NFAPI_UL_CONFIG_REQUEST_NRACH_PDU_REL13_TAG, &_pdu.nrach_pdu_rel13, &unpack_ul_config_nrach_pdu_rel13_value},
+
+
+ nfapi_ul_config_request_body_t* value = (nfapi_ul_config_request_body_t*)tlv;
+
+ if(!(pull8(ppReadPackedMsg, &value->number_of_pdus, end) &&
+ pull8(ppReadPackedMsg, &value->rach_prach_frequency_resources, end) &&
+ pull8(ppReadPackedMsg, &value->srs_present, end)))
+ return 0;
+
+ if(value->number_of_pdus > NFAPI_UL_CONFIG_MAX_PDU)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of ul config pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_UL_CONFIG_MAX_PDU);
+ return 0;
+ }
+
+ if(value->number_of_pdus > 0)
+ {
+ value->ul_config_pdu_list = (nfapi_ul_config_request_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_ul_config_request_pdu_t) * value->number_of_pdus, config);
+
+ if(value->ul_config_pdu_list == NULL)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate ul config pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
+ return 0;
+ }
+ }
+ else
+ {
+ value->ul_config_pdu_list = 0;
+ }
+
+
+ uint16_t i;
+ uint16_t total_number_of_pdus = value->number_of_pdus;
+ for(i = 0; i < total_number_of_pdus; ++i)
+ {
+ nfapi_ul_config_request_pdu_t* pdu = &(value->ul_config_pdu_list[i]);
+
+ if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
+ pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
+ return 0;
+
+ uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
+
+ if(packedPduEnd > end)
+ {
+ // pdu end is past buffer end
+ return 0;
+ }
+
+ switch(pdu->pdu_type)
+ {
+ case NFAPI_UL_CONFIG_ULSCH_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_pdu)
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+
+ case NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_cqi_ri_pdu.ulsch_pdu)
+ UL_CONFIG_CQI_RI_INFO_UNPACK_FNS(pdu->ulsch_cqi_ri_pdu.cqi_ri_information)
+ UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(pdu->ulsch_cqi_ri_pdu.initial_transmission_parameters)
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_harq_pdu.ulsch_pdu)
+ UL_CONFIG_ULSCH_HARQ_INFO_UNPACK_FNS(pdu->ulsch_harq_pdu.harq_information)
+ UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(pdu->ulsch_harq_pdu.initial_transmission_parameters)
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu)
+ UL_CONFIG_CQI_RI_INFO_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.cqi_ri_information)
+ UL_CONFIG_ULSCH_HARQ_INFO_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.harq_information)
+ UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.initial_transmission_parameters)
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_pdu.ue_information)
+ UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_pdu.cqi_information)
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_sr_pdu.ue_information)
+ UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_sr_pdu.sr_information)
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_harq_pdu.ue_information)
+ UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_harq_pdu.harq_information)
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_sr_harq_pdu.ue_information)
+ UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_sr_harq_pdu.sr_information)
+ UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_sr_harq_pdu.harq_information)
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_harq_pdu.ue_information)
+ UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_harq_pdu.cqi_information)
+ UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_cqi_harq_pdu.harq_information)
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_sr_pdu.ue_information)
+ UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_sr_pdu.cqi_information)
+ UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_cqi_sr_pdu.sr_information)
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.ue_information)
+ UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.cqi_information)
+ UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.sr_information)
+ UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.harq_information)
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_UL_CONFIG_SRS_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ UL_CONFIG_SRS_PDU_UNPACK_FNS(pdu->srs_pdu)
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_UL_CONFIG_HARQ_BUFFER_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->harq_buffer_pdu.ue_information)
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_uci_csi_pdu.ulsch_pdu)
+ UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->ulsch_uci_csi_pdu.csi_information)
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_uci_harq_pdu.ulsch_pdu)
+ UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->ulsch_uci_harq_pdu.harq_information)
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_csi_uci_harq_pdu.ulsch_pdu)
+ UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->ulsch_csi_uci_harq_pdu.csi_information)
+ UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->ulsch_csi_uci_harq_pdu.harq_information)
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_UL_CONFIG_NULSCH_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ UL_CONFIG_NULSCH_PDU_UNPACK_FNS(pdu->nulsch_pdu)
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_UL_CONFIG_NRACH_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ UL_CONFIG_NRACH_PDU_UNPACK_FNS(pdu->nrach_pdu)
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ }
+ }
+ return 1;
+}
+
+
+static uint8_t unpack_ul_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+ nfapi_ul_config_request_t *pNfapiMsg = (nfapi_ul_config_request_t*)msg;
+
+ unpack_p7_tlv_t unpack_fns[] =
+ {
+ { NFAPI_UL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->ul_config_request_body, &unpack_ul_config_request_body_value},
+ };
+
+ return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+ unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_hi_dci0_hi_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_hi_dci0_hi_pdu_rel8_t* hi_pdu_rel8 = (nfapi_hi_dci0_hi_pdu_rel8_t*)tlv;
+
+ return( pull8(ppReadPackedMsg, &hi_pdu_rel8->resource_block_start, end) &&
+ pull8(ppReadPackedMsg, &hi_pdu_rel8->cyclic_shift_2_for_drms, end) &&
+ pull8(ppReadPackedMsg, &hi_pdu_rel8->hi_value, end) &&
+ pull8(ppReadPackedMsg, &hi_pdu_rel8->i_phich, end) &&
+ pull16(ppReadPackedMsg, &hi_pdu_rel8->transmission_power, end));
+}
+
+static uint8_t unpack_hi_dci0_hi_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_hi_dci0_hi_pdu_rel10_t* hi_pdu_rel10 = (nfapi_hi_dci0_hi_pdu_rel10_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &hi_pdu_rel10->flag_tb2, end) &&
+ pull8(ppReadPackedMsg, &hi_pdu_rel10->hi_value_2, end));
+}
+
+static uint8_t unpack_hi_dci0_dci_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_hi_dci0_dci_pdu_rel8_t* dci_pdu_rel8 = (nfapi_hi_dci0_dci_pdu_rel8_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &dci_pdu_rel8->dci_format, end) &&
+ pull8(ppReadPackedMsg, &dci_pdu_rel8->cce_index, end) &&
+ pull8(ppReadPackedMsg, &dci_pdu_rel8->aggregation_level, end) &&
+ pull16(ppReadPackedMsg, &dci_pdu_rel8->rnti, end) &&
+ pull8(ppReadPackedMsg, &dci_pdu_rel8->resource_block_start, end) &&
+ pull8(ppReadPackedMsg, &dci_pdu_rel8->number_of_resource_block, end) &&
+ pull8(ppReadPackedMsg, &dci_pdu_rel8->mcs_1, end) &&
+ pull8(ppReadPackedMsg, &dci_pdu_rel8->cyclic_shift_2_for_drms, end) &&
+ pull8(ppReadPackedMsg, &dci_pdu_rel8->frequency_hopping_enabled_flag, end) &&
+ pull8(ppReadPackedMsg, &dci_pdu_rel8->frequency_hopping_bits, end) &&
+ pull8(ppReadPackedMsg, &dci_pdu_rel8->new_data_indication_1, end) &&
+ pull8(ppReadPackedMsg, &dci_pdu_rel8->ue_tx_antenna_seleciton, end) &&
+ pull8(ppReadPackedMsg, &dci_pdu_rel8->tpc, end) &&
+ pull8(ppReadPackedMsg, &dci_pdu_rel8->cqi_csi_request, end) &&
+ pull8(ppReadPackedMsg, &dci_pdu_rel8->ul_index, end) &&
+ pull8(ppReadPackedMsg, &dci_pdu_rel8->dl_assignment_index, end) &&
+ pull32(ppReadPackedMsg, &dci_pdu_rel8->tpc_bitmap, end) &&
+ pull16(ppReadPackedMsg, &dci_pdu_rel8->transmission_power, end));
+}
+
+static uint8_t unpack_hi_dci0_dci_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_hi_dci0_dci_pdu_rel10_t* dci_pdu_rel10 = (nfapi_hi_dci0_dci_pdu_rel10_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &dci_pdu_rel10->cross_carrier_scheduling_flag, end) &&
+ pull8(ppReadPackedMsg, &dci_pdu_rel10->carrier_indicator, end) &&
+ pull8(ppReadPackedMsg, &dci_pdu_rel10->size_of_cqi_csi_feild, end) &&
+ pull8(ppReadPackedMsg, &dci_pdu_rel10->srs_flag, end) &&
+ pull8(ppReadPackedMsg, &dci_pdu_rel10->srs_request, end) &&
+ pull8(ppReadPackedMsg, &dci_pdu_rel10->resource_allocation_flag, end) &&
+ pull8(ppReadPackedMsg, &dci_pdu_rel10->resource_allocation_type, end) &&
+ pull32(ppReadPackedMsg, &dci_pdu_rel10->resource_block_coding, end) &&
+ pull8(ppReadPackedMsg, &dci_pdu_rel10->mcs_2, end) &&
+ pull8(ppReadPackedMsg, &dci_pdu_rel10->new_data_indication_2, end) &&
+ pull8(ppReadPackedMsg, &dci_pdu_rel10->number_of_antenna_ports, end) &&
+ pull8(ppReadPackedMsg, &dci_pdu_rel10->tpmi, end) &&
+ pull8(ppReadPackedMsg, &dci_pdu_rel10->total_dci_length_including_padding, end) &&
+ pull8(ppReadPackedMsg, &dci_pdu_rel10->n_ul_rb, end));
+}
+
+static uint8_t unpack_hi_dci0_dci_pdu_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_hi_dci0_dci_pdu_rel12_t* dci_pdu_rel12 = (nfapi_hi_dci0_dci_pdu_rel12_t*)tlv;
+
+ return ( pull8(ppReadPackedMsg, &dci_pdu_rel12->pscch_resource, end) &&
+ pull8(ppReadPackedMsg, &dci_pdu_rel12->time_resource_pattern, end));
+}
+
+static uint8_t unpack_hi_dci0_mpdcch_dci_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t* value = (nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &value->mpdcch_narrowband, end) &&
+ pull8(ppReadPackedMsg, &value->number_of_prb_pairs, end) &&
+ pull8(ppReadPackedMsg, &value->resource_block_assignment, end) &&
+ pull8(ppReadPackedMsg, &value->mpdcch_transmission_type, end) &&
+ pull8(ppReadPackedMsg, &value->start_symbol, end) &&
+ pull8(ppReadPackedMsg, &value->ecce_index, end) &&
+ pull8(ppReadPackedMsg, &value->aggreagation_level, end) &&
+ pull8(ppReadPackedMsg, &value->rnti_type, end) &&
+ pull16(ppReadPackedMsg, &value->rnti, end) &&
+ pull8(ppReadPackedMsg, &value->ce_mode, end) &&
+ pull16(ppReadPackedMsg, &value->drms_scrambling_init, end) &&
+ pull16(ppReadPackedMsg, &value->initial_transmission_sf_io, end) &&
+ pull16(ppReadPackedMsg, &value->transmission_power, end) &&
+ pull8(ppReadPackedMsg, &value->dci_format, end) &&
+ pull8(ppReadPackedMsg, &value->resource_block_start, end) &&
+ pull8(ppReadPackedMsg, &value->number_of_resource_blocks, end) &&
+ pull8(ppReadPackedMsg, &value->mcs, end) &&
+ pull8(ppReadPackedMsg, &value->pusch_repetition_levels, end) &&
+ pull8(ppReadPackedMsg, &value->frequency_hopping_flag, end) &&
+ pull8(ppReadPackedMsg, &value->new_data_indication, end) &&
+ pull8(ppReadPackedMsg, &value->harq_process, end) &&
+ pull8(ppReadPackedMsg, &value->redudency_version, end) &&
+ pull8(ppReadPackedMsg, &value->tpc, end) &&
+ pull8(ppReadPackedMsg, &value->csi_request, end) &&
+ pull8(ppReadPackedMsg, &value->ul_inex, end) &&
+ pull8(ppReadPackedMsg, &value->dai_presence_flag, end) &&
+ pull8(ppReadPackedMsg, &value->dl_assignment_index, end) &&
+ pull8(ppReadPackedMsg, &value->srs_request, end) &&
+ pull8(ppReadPackedMsg, &value->dci_subframe_repetition_number, end) &&
+ pull32(ppReadPackedMsg, &value->tcp_bitmap, end) &&
+ pull8(ppReadPackedMsg, &value->total_dci_length_include_padding, end) &&
+ pull8(ppReadPackedMsg, &value->number_of_tx_antenna_ports, end) &&
+ pullarray16(ppReadPackedMsg, value->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, value->number_of_tx_antenna_ports, end));
+}
+
+static uint8_t unpack_hi_dci0_npdcch_dci_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_hi_dci0_npdcch_dci_pdu_rel13_t* value = (nfapi_hi_dci0_npdcch_dci_pdu_rel13_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &value->ncce_index, end) &&
+ pull8(ppReadPackedMsg, &value->aggregation_level, end) &&
+ pull8(ppReadPackedMsg, &value->start_symbol, end) &&
+ pull16(ppReadPackedMsg, &value->rnti, end) &&
+ pull8(ppReadPackedMsg, &value->scrambling_reinitialization_batch_index, end) &&
+ pull8(ppReadPackedMsg, &value->nrs_antenna_ports_assumed_by_the_ue, end) &&
+ pull8(ppReadPackedMsg, &value->subcarrier_indication, end) &&
+ pull8(ppReadPackedMsg, &value->resource_assignment, end) &&
+ pull8(ppReadPackedMsg, &value->scheduling_delay, end) &&
+ pull8(ppReadPackedMsg, &value->mcs, end) &&
+ pull8(ppReadPackedMsg, &value->redudancy_version, end) &&
+ pull8(ppReadPackedMsg, &value->repetition_number, end) &&
+ pull8(ppReadPackedMsg, &value->new_data_indicator, end) &&
+ pull8(ppReadPackedMsg, &value->dci_subframe_repetition_number, end));
+}
+
+static uint8_t unpack_hi_dci0_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_hi_dci0_request_body_t* value = (nfapi_hi_dci0_request_body_t*)tlv;
+
+ if(!(pull16(ppReadPackedMsg, &value->sfnsf, end) &&
+ pull8(ppReadPackedMsg, &value->number_of_dci, end) &&
+ pull8(ppReadPackedMsg, &value->number_of_hi, end)))
+ return 0;
+
+ uint8_t totalNumPdus = value->number_of_hi + value->number_of_dci;
+
+ if(totalNumPdus > NFAPI_HI_DCI0_MAX_PDU)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of dci0 pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, totalNumPdus, NFAPI_HI_DCI0_MAX_PDU);
+ return 0;
+ }
+
+ if(totalNumPdus > 0)
+ {
+ value->hi_dci0_pdu_list = (nfapi_hi_dci0_request_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_hi_dci0_request_pdu_t) * totalNumPdus, config);
+ if(value->hi_dci0_pdu_list == NULL)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate hi dci0 pdu list (count:%d)\n", __FUNCTION__, totalNumPdus);
+ return 0;
+ }
+ }
+ else
+ {
+ value->hi_dci0_pdu_list = 0;
+ }
+
+ uint8_t i;
+ for(i = 0; i < totalNumPdus; ++i)
+ {
+ nfapi_hi_dci0_request_pdu_t* pdu = &(value->hi_dci0_pdu_list[i]);
+
+ if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
+ pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
+ return 0;
+
+ uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
+
+ if(packedPduEnd > end)
+ {
+ // pdu end if past buffer end
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s pdu size to big %d %d\n", __FUNCTION__, packedPduEnd, end);
+ return 0;
+ }
+
+ switch(pdu->pdu_type)
+ {
+ case NFAPI_HI_DCI0_HI_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_HI_DCI0_REQUEST_HI_PDU_REL8_TAG, &pdu->hi_pdu.hi_pdu_rel8, &unpack_hi_dci0_hi_pdu_rel8_value},
+ { NFAPI_HI_DCI0_REQUEST_HI_PDU_REL10_TAG, &pdu->hi_pdu.hi_pdu_rel10, &unpack_hi_dci0_hi_pdu_rel10_value},
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_HI_DCI0_DCI_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG, &pdu->dci_pdu.dci_pdu_rel8, &unpack_hi_dci0_dci_pdu_rel8_value},
+ { NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL10_TAG, &pdu->dci_pdu.dci_pdu_rel10, &unpack_hi_dci0_dci_pdu_rel10_value},
+ { NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL12_TAG, &pdu->dci_pdu.dci_pdu_rel12, &unpack_hi_dci0_dci_pdu_rel12_value},
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_HI_DCI0_EPDCCH_DCI_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL8_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel8, &unpack_hi_dci0_dci_pdu_rel8_value},
+ { NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL10_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel10, &unpack_hi_dci0_dci_pdu_rel10_value},
+ { NFAPI_HI_DCI0_REQUEST_EPDCCH_PARAMETERS_REL11_TAG, &pdu->epdcch_dci_pdu.epdcch_parameters_rel11, &unpack_dl_config_epdcch_params_rel11_value},
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_HI_DCI0_MPDCCH_DCI_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_HI_DCI0_REQUEST_MPDCCH_DCI_PDU_REL13_TAG, &pdu->mpdcch_dci_pdu.mpdcch_dci_pdu_rel13, &unpack_hi_dci0_mpdcch_dci_pdu_rel13_value},
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_HI_DCI0_NPDCCH_DCI_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_HI_DCI0_REQUEST_NPDCCH_DCI_PDU_REL13_TAG, &pdu->npdcch_dci_pdu.npdcch_dci_pdu_rel13, &unpack_hi_dci0_npdcch_dci_pdu_rel13_value},
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ default:
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
+ }
+ break;
+ };
+ }
+
+ return 1;
+}
+//unpack_ul_dci_pdu_list_value
+
+static uint8_t unpack_ul_dci_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg)
+{
+ nfapi_nr_ul_dci_request_pdus_t* value = (nfapi_nr_ul_dci_request_pdus_t*)msg;
+
+ for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i)
+ {
+ if(!pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].RNTI, end) &&
+ pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingId, end) &&
+
+ pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingRNTI, end) &&
+ pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].CceIndex, end) &&
+ pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].AggregationLevel, end) &&
+ pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].beta_PDCCH_1_0, end) &&
+
+ pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].powerControlOffsetSS, end) &&
+ pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, end) &&
+
+ pullarray8(ppReadPackedMsg, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].Payload, DCI_PAYLOAD_BYTE_LEN, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, end));
+
+ return 0;
+ }
+
+ return (pull16(ppReadPackedMsg, &value->PDUType, end) &&
+ pull16(ppReadPackedMsg, &value->PDUSize, end) &&
+ pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.BWPSize, end) &&
+ pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.BWPStart, end) &&
+ pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.SubcarrierSpacing, end) &&
+ pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.CyclicPrefix, end) &&
+
+ pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.StartSymbolIndex, end) &&
+ pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.DurationSymbols, end) &&
+ pullarray8(ppReadPackedMsg, value->pdcch_pdu.pdcch_pdu_rel15.FreqDomainResource, 6, 6, end) &&
+ pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.CceRegMappingType, end) &&
+
+ pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.RegBundleSize, end) &&
+ pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.InterleaverSize, end) &&
+ pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.CoreSetType, end) &&
+ pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.ShiftIndex, end) &&
+
+ pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.precoderGranularity, end) &&
+ pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.numDlDci, end));
+
+}
+
+static uint8_t unpack_ul_dci_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+nfapi_nr_ul_dci_request_t *pNfapiMsg = (nfapi_nr_ul_dci_request_t*)msg;
+
+ if (!(pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end) &&
+ pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
+ pull8(ppReadPackedMsg, &pNfapiMsg->numPdus, end)
+ ))
+ return 0;
+ for(int i=0; i< pNfapiMsg->numPdus; i++)
+ {
+ if (!unpack_ul_dci_pdu_list_value(ppReadPackedMsg, end, &pNfapiMsg->ul_dci_pdu_list[i]))
+ return 0;
+ }
+
+ return 1;
+
+}
+
+static uint8_t unpack_hi_dci0_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+ nfapi_hi_dci0_request_t *pNfapiMsg = (nfapi_hi_dci0_request_t*)msg;
+
+ unpack_p7_tlv_t unpack_fns[] =
+ {
+ { NFAPI_HI_DCI0_REQUEST_BODY_TAG, &pNfapiMsg->hi_dci0_request_body, &unpack_hi_dci0_request_body_value},
+ };
+
+ return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+ unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+
+}
+static uint8_t unpack_tx_data_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg)
+{
+ nfapi_nr_pdu_t* pNfapiMsg = (nfapi_nr_pdu_t*)msg;
+
+ if(!(pull32(ppReadPackedMsg, &pNfapiMsg->num_TLV, end) &&
+ pull16(ppReadPackedMsg, &pNfapiMsg->PDU_index, end) &&
+ pull16(ppReadPackedMsg, &pNfapiMsg->PDU_length, end)
+ ))
+ return 0;
+
+ uint16_t i = 0;
+ uint16_t total_number_of_tlvs = pNfapiMsg->num_TLV;
+ for(; i < total_number_of_tlvs; ++i)
+ {
+
+ if (!(pull16(ppReadPackedMsg, &pNfapiMsg->TLVs[i].length, end) &&
+ pull16(ppReadPackedMsg, &pNfapiMsg->TLVs[i].tag, end)))
+ return 0;
+
+ switch(pNfapiMsg->TLVs[i].tag){
+ case 0:
+ {
+ if(!pullarray32(ppReadPackedMsg, pNfapiMsg->TLVs[i].value.direct, 16384, pNfapiMsg->TLVs[i].length, end))
+ return 0;
+ break;
+
+ }
+
+ case 1:
+ {
+ if(!pullarray32(ppReadPackedMsg, pNfapiMsg->TLVs[i].value.ptr, pNfapiMsg->TLVs[i].length , pNfapiMsg->TLVs[i].length, end))
+ return 0;
+ break;
+
+ }
+
+ default:
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid tag value %d \n", pNfapiMsg->TLVs[i].tag );
+ break;
+ }
+
+ }
+ }
+
+
+ return 1;
+}
+
+static uint8_t unpack_tx_data_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+ nfapi_nr_tx_data_request_t *pNfapiMsg = (nfapi_nr_tx_data_request_t*)msg;
+
+ if(!(pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end) &&
+ pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
+ pull16(ppReadPackedMsg, &pNfapiMsg->Number_of_PDUs, end)))
+ return 0;
+
+ for(int i=0; i< pNfapiMsg->Number_of_PDUs; i++)
+ {
+ if (!unpack_tx_data_pdu_list_value(ppReadPackedMsg, end, &pNfapiMsg->pdu_list[i]))
+ return 0;
+ }
+
+ return 1;
+}
+
+static uint8_t unpack_tx_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+ uint8_t proceed = 1;
+ nfapi_tx_request_t *pNfapiMsg = (nfapi_tx_request_t*)msg;
+
+ if(pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) == 0)
+ return 0;
+
+ while (((uint8_t*)(*ppReadPackedMsg) < end) && proceed)
+ {
+ nfapi_tl_t generic_tl;
+ if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
+ return 0;
+
+ switch(generic_tl.tag)
+ {
+ case NFAPI_TX_REQUEST_BODY_TAG:
+ {
+ pNfapiMsg->tx_request_body.tl = generic_tl;
+
+ if( pull16(ppReadPackedMsg, &pNfapiMsg->tx_request_body.number_of_pdus, end) == 0)
+ return 0;
+
+ if(pNfapiMsg->tx_request_body.number_of_pdus > NFAPI_TX_MAX_PDU)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of tx pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, pNfapiMsg->tx_request_body.number_of_pdus, NFAPI_TX_MAX_PDU);
+ return 0;
+ }
+
+ if(pNfapiMsg->tx_request_body.number_of_pdus > 0)
+ {
+ pNfapiMsg->tx_request_body.tx_pdu_list = (nfapi_tx_request_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_tx_request_pdu_t) * pNfapiMsg->tx_request_body.number_of_pdus, config);
+ if(pNfapiMsg->tx_request_body.tx_pdu_list == NULL)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate tx pdu list (count:%d)\n", __FUNCTION__, pNfapiMsg->tx_request_body.number_of_pdus);
+ return 0;
+ }
+ }
+ else
+ {
+ pNfapiMsg->tx_request_body.tx_pdu_list = 0;
+ }
+
+
+ uint16_t i;
+ uint16_t totalNumPdus = pNfapiMsg->tx_request_body.number_of_pdus;
+ for(i = 0; i < totalNumPdus; ++i)
+ {
+ nfapi_tx_request_pdu_t* pdu = &(pNfapiMsg->tx_request_body.tx_pdu_list[i]);
+ if (pdu) {
+ uint16_t length = 0;
+ uint16_t index = 0;
+
+ if(!(pull16(ppReadPackedMsg, &length, end) &&
+ pull16(ppReadPackedMsg, &index, end)))
+ return 0;
+
+ pdu->pdu_length = length;
+ pdu->pdu_index = index;
+
+
+ // TODO : May need to rethink this bit
+ pdu->num_segments = 1;
+ pdu->segments[0].segment_length = pdu->pdu_length;
+ pdu->segments[0].segment_data = nfapi_p7_allocate(pdu->pdu_length, config);
+
+ if(pdu->segments[0].segment_data)
+ {
+ if(!pullarray8(ppReadPackedMsg, pdu->segments[0].segment_data, pdu->segments[0].segment_length, pdu->segments[0].segment_length, end))
+ return 0;
+ if (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
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "unpack_tx_request: Failed to allocate pdu (len:%d) %d/%d %d\n", pdu->pdu_length, totalNumPdus, i, pdu->pdu_index);
+ }
+ } else {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "NULL pdu\n");
+ }
+ }
+ }
+ break;
+ default:
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "unpack_tx_request FIXME : Invalid pdu type %d \n", generic_tl.tag );
+ }
+ break;
+ };
+ }
+
+ return 1;
+}
+
+static uint8_t unpack_ue_release_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+ uint8_t proceed = 1;
+ nfapi_ue_release_request_t *pNfapiMsg = (nfapi_ue_release_request_t*)msg;
+
+ if(pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) == 0)
+ return 0;
+
+ while (((uint8_t*)(*ppReadPackedMsg) < end) && proceed)
+ {
+ nfapi_tl_t generic_tl;
+ if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
+ return 0;
+
+ switch(generic_tl.tag)
+ {
+ case NFAPI_UE_RELEASE_BODY_TAG:
+ {
+ pNfapiMsg->ue_release_request_body.tl = generic_tl;
+ if( pull16(ppReadPackedMsg, &pNfapiMsg->ue_release_request_body.number_of_TLVs, end) == 0)
+ return 0;
+
+ if(pNfapiMsg->ue_release_request_body.number_of_TLVs > NFAPI_RELEASE_MAX_RNTI)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of relese rnti's exceed maxium (count:%d max:%d)\n", __FUNCTION__, pNfapiMsg->ue_release_request_body.number_of_TLVs, NFAPI_RELEASE_MAX_RNTI);
+ return 0;
+ } else {
+ uint8_t j;
+ uint16_t num = pNfapiMsg->ue_release_request_body.number_of_TLVs;
+ for(j = 0; j < num; ++j){
+ if(pull16(ppReadPackedMsg, &pNfapiMsg->ue_release_request_body.ue_release_request_TLVs_list[j].rnti, end) == 0){
+ return 0;
+ }
+ }
+ }
+ }
+ break;
+ default:
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "unpack_ue_release_request FIXME : Invalid type %d \n", generic_tl.tag );
+ }
+ break;
+ };
+ }
+
+ return 1;
+}
+
+static uint8_t unpack_harq_indication_tdd_harq_data_bundling(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_harq_indication_tdd_harq_data_bundling_t* value = (nfapi_harq_indication_tdd_harq_data_bundling_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &value->value_0, end) &&
+ pull8(ppReadPackedMsg, &value->value_1, end));
+}
+
+static uint8_t unpack_harq_indication_tdd_harq_data_multiplexing(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_harq_indication_tdd_harq_data_multiplexing_t* value = (nfapi_harq_indication_tdd_harq_data_multiplexing_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &value->value_0, end) &&
+ pull8(ppReadPackedMsg, &value->value_1, end) &&
+ pull8(ppReadPackedMsg, &value->value_2, end) &&
+ pull8(ppReadPackedMsg, &value->value_3, end));
+}
+static uint8_t unpack_harq_indication_tdd_harq_data_special_bundling(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_harq_indication_tdd_harq_data_special_bundling_t* value = (nfapi_harq_indication_tdd_harq_data_special_bundling_t*)tlv;
+ return ( pull8(ppReadPackedMsg, &value->value_0, end));
+}
+static uint8_t unpack_harq_indication_tdd_harq_data(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_harq_indication_tdd_harq_data_t* value = (nfapi_harq_indication_tdd_harq_data_t*)tlv;
+ return (pull8(ppReadPackedMsg, &value->value_0, end));
+}
+
+static uint8_t unpack_harq_indication_tdd_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_harq_indication_tdd_rel8_t* value = (nfapi_harq_indication_tdd_rel8_t*)tlv;
+
+ if(!(pull8(ppReadPackedMsg, &value->mode, end) &&
+ pull8(ppReadPackedMsg, &value->number_of_ack_nack, end)))
+ return 0;
+
+ uint8_t result = 0;
+ switch(value->mode)
+ {
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
+ result = unpack_harq_indication_tdd_harq_data_bundling(&value->harq_data.bundling, ppReadPackedMsg, end);
+ break;
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
+ result = unpack_harq_indication_tdd_harq_data_multiplexing(&value->harq_data.multiplex, ppReadPackedMsg, end);
+ break;
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
+ result = unpack_harq_indication_tdd_harq_data_special_bundling(&value->harq_data.special_bundling, ppReadPackedMsg, end);
+ break;
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
+ result = 1;
+ break;
+ default:
+ // TODO add error message
+ return 0;
+ break;
+ }
+ return result;
+}
+
+static uint8_t unpack_harq_indication_tdd_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_harq_indication_tdd_rel9_t* value = (nfapi_harq_indication_tdd_rel9_t*)tlv;
+
+ if(!(pull8(ppReadPackedMsg, &value->mode, end) &&
+ pull8(ppReadPackedMsg, &value->number_of_ack_nack, end)))
+ return 0;
+
+ if(value->number_of_ack_nack > NFAPI_MAX_NUMBER_ACK_NACK_TDD)
+ {
+ // TODO : add error message
+ return 0;
+ }
+
+ uint16_t idx = 0;
+ for(idx = 0; idx < value->number_of_ack_nack; ++idx)
+ {
+ uint8_t result = 0;
+ switch(value->mode)
+ {
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
+ result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].bundling, ppReadPackedMsg, end);
+ break;
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
+ result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].multiplex, ppReadPackedMsg, end);
+ break;
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
+ result = unpack_harq_indication_tdd_harq_data_special_bundling(&value->harq_data[idx].special_bundling, ppReadPackedMsg, end);
+ break;
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
+ result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].channel_selection, ppReadPackedMsg, end);
+ break;
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
+ result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_3, ppReadPackedMsg, end);
+ break;
+ default:
+ // TODO add error message
+ return 0;
+ break;
+ }
+
+ if(result == 0)
+ return 0;
+ }
+ return 1;
+}
+
+static uint8_t unpack_harq_indication_tdd_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_harq_indication_tdd_rel13_t* value = (nfapi_harq_indication_tdd_rel13_t*)tlv;
+
+ if(!(pull8(ppReadPackedMsg, &value->mode, end) &&
+ pull16(ppReadPackedMsg, &value->number_of_ack_nack, end)))
+ return 0;
+
+ if(value->number_of_ack_nack > NFAPI_MAX_NUMBER_ACK_NACK_TDD)
+ {
+ // TODO : add error message
+ return 0;
+ }
+
+ uint16_t idx = 0;
+ for(idx = 0; idx < value->number_of_ack_nack; ++idx)
+ {
+ uint8_t result = 0;
+ switch(value->mode)
+ {
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
+ result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].bundling, ppReadPackedMsg, end);
+ break;
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
+ result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].multiplex, ppReadPackedMsg, end);
+ break;
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
+ result = unpack_harq_indication_tdd_harq_data_special_bundling(&value->harq_data[idx].special_bundling, ppReadPackedMsg, end);
+ break;
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
+ result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].channel_selection, ppReadPackedMsg, end);
+ break;
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
+ result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_3, ppReadPackedMsg, end);
+ break;
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_4:
+ result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_4, ppReadPackedMsg, end);
+ break;
+ case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_5:
+ result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_5, ppReadPackedMsg, end);
+ break;
+ default:
+ // TODO add error message
+ return 0;
+ break;
+ }
+
+ if(result == 0)
+ return 0;
+ }
+ return 1;
+}
+
+static uint8_t unpack_harq_indication_fdd_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_harq_indication_fdd_rel8_t* value = (nfapi_harq_indication_fdd_rel8_t*)tlv;
+ return (pull8(ppReadPackedMsg, &value->harq_tb1, end) &&
+ pull8(ppReadPackedMsg, &value->harq_tb2, end));
+}
+
+static uint8_t unpack_harq_indication_fdd_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_harq_indication_fdd_rel9_t* value = (nfapi_harq_indication_fdd_rel9_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &value->mode, end) &&
+ pull8(ppReadPackedMsg, &value->number_of_ack_nack, end) &&
+ pullarray8(ppReadPackedMsg, value->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL9_MAX, value->number_of_ack_nack, end));
+}
+
+static uint8_t unpack_harq_indication_fdd_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_harq_indication_fdd_rel13_t* value = (nfapi_harq_indication_fdd_rel13_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &value->mode, end) &&
+ pull16(ppReadPackedMsg, &value->number_of_ack_nack, end) &&
+ pullarray8(ppReadPackedMsg, value->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL13_MAX, value->number_of_ack_nack, end));
+}
+
+static uint8_t unpack_ul_cqi_information_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_ul_cqi_information_t* value = (nfapi_ul_cqi_information_t*)tlv;
+
+ return (pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
+ pull8(ppReadPackedMsg, &value->channel, end));
+}
+
+
+
+static uint8_t unpack_harq_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_harq_indication_body_t* value = (nfapi_harq_indication_body_t*)tlv;
+ uint8_t* harqBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+ if(harqBodyEnd > end)
+ return 0;
+
+ if(pull16(ppReadPackedMsg, &value->number_of_harqs, end) == 0)
+ return 0;
+
+ if(value->number_of_harqs > NFAPI_HARQ_IND_MAX_PDU)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of harq ind pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_harqs, NFAPI_HARQ_IND_MAX_PDU);
+ return 0;
+ }
+
+ value->harq_pdu_list = (nfapi_harq_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_harq_indication_pdu_t) * value->number_of_harqs, config);
+ if(value->harq_pdu_list == NULL)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate harq ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_harqs);
+ return 0;
+ }
+
+ uint8_t i = 0;
+ for(i = 0; i < value->number_of_harqs; ++i)
+ {
+ nfapi_harq_indication_pdu_t* pdu = &(value->harq_pdu_list[i]);
+ if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
+ return 0;
+
+ uint8_t* harqPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
+
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
+ { NFAPI_HARQ_INDICATION_TDD_REL8_TAG, &pdu->harq_indication_tdd_rel8, &unpack_harq_indication_tdd_rel8_value},
+ { NFAPI_HARQ_INDICATION_TDD_REL9_TAG, &pdu->harq_indication_tdd_rel9, &unpack_harq_indication_tdd_rel9_value},
+ { NFAPI_HARQ_INDICATION_TDD_REL13_TAG, &pdu->harq_indication_tdd_rel13, &unpack_harq_indication_tdd_rel13_value},
+ { NFAPI_HARQ_INDICATION_FDD_REL8_TAG, &pdu->harq_indication_fdd_rel8, &unpack_harq_indication_fdd_rel8_value},
+ { NFAPI_HARQ_INDICATION_FDD_REL9_TAG, &pdu->harq_indication_fdd_rel9, &unpack_harq_indication_fdd_rel9_value},
+ { NFAPI_HARQ_INDICATION_FDD_REL13_TAG, &pdu->harq_indication_fdd_rel13, &unpack_harq_indication_fdd_rel13_value},
+ { NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, &unpack_ul_cqi_information_value}
+ };
+
+ if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, harqPduInstanceEnd, 0, 0) == 0)
+ return 0;
+
+ }
+
+ return 1;
+}
+
+static uint8_t unpack_harq_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+ nfapi_harq_indication_t *pNfapiMsg = (nfapi_harq_indication_t*)msg;
+
+ unpack_p7_tlv_t unpack_fns[] =
+ {
+ { NFAPI_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->harq_indication_body, &unpack_harq_indication_body_value},
+ };
+
+ return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+ unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_crc_indication_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_crc_indication_rel8_t* crc_pdu_rel8 = (nfapi_crc_indication_rel8_t*)tlv;
+ return ( pull8(ppReadPackedMsg, &crc_pdu_rel8->crc_flag, end) );
+}
+
+static uint8_t unpack_crc_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_crc_indication_body_t* value = (nfapi_crc_indication_body_t*)tlv;
+ uint8_t* crcBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+ if(crcBodyEnd > end)
+ return 0;
+
+ if(pull16(ppReadPackedMsg, &value->number_of_crcs, end) == 0)
+ return 0;
+
+ if(value->number_of_crcs > NFAPI_CRC_IND_MAX_PDU)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of crc ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_crcs, NFAPI_CRC_IND_MAX_PDU);
+ return 0;
+ }
+
+ if(value->number_of_crcs > 0)
+ {
+ value->crc_pdu_list = (nfapi_crc_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_crc_indication_pdu_t) * value->number_of_crcs, config);
+ if(value->crc_pdu_list == NULL)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate crc ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_crcs);
+ return 0;
+ }
+ }
+ else
+ {
+ value->crc_pdu_list = 0;
+ }
+
+
+ uint8_t i = 0;
+ for(i = 0; i < value->number_of_crcs; ++i)
+ {
+ nfapi_crc_indication_pdu_t* pdu = &(value->crc_pdu_list[i]);
+
+ if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
+ return 0;
+
+ uint8_t* crcPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
+
+
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
+ { NFAPI_CRC_INDICATION_REL8_TAG, &pdu->crc_indication_rel8, unpack_crc_indication_rel8_value },
+ };
+
+ if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, crcPduInstanceEnd, 0, 0) == 0)
+ return 0;
+ }
+
+ return 1;
+}
+
+static uint8_t unpack_crc_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+ nfapi_crc_indication_t *pNfapiMsg = (nfapi_crc_indication_t*)msg;
+
+ unpack_p7_tlv_t unpack_fns[] =
+ {
+ { NFAPI_CRC_INDICATION_BODY_TAG, &pNfapiMsg->crc_indication_body, &unpack_crc_indication_body_value},
+ };
+
+ return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+ unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_rx_indication_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_rx_indication_rel8_t* value = (nfapi_rx_indication_rel8_t*)tlv;
+
+ return (pull16(ppReadPackedMsg, &value->length, end) &&
+ pull16(ppReadPackedMsg, &value->offset, end) &&
+ pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
+ pull16(ppReadPackedMsg, &value->timing_advance, end));
+}
+static uint8_t unpack_rx_indication_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_rx_indication_rel9_t* value = (nfapi_rx_indication_rel9_t*)tlv;
+ return (pull16(ppReadPackedMsg, &value->timing_advance_r9, end));
+}
+
+static uint8_t unpack_rx_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_rx_indication_body_t* value = (nfapi_rx_indication_body_t*)tlv;
+
+ // the rxBodyEnd points to the end of the cqi PDU's
+ uint8_t* rxBodyEnd = *ppReadPackedMsg + value->tl.length;
+ uint8_t* rxPduEnd = rxBodyEnd;
+
+ uint8_t* numberOfPdusAddress = *ppReadPackedMsg;
+
+ if(rxBodyEnd > end)
+ {
+ // pdu end is past buffer end
+ return 0;
+ }
+
+ if(pull16(ppReadPackedMsg, &value->number_of_pdus, end) == 0)
+ return 0;
+
+ if(value->number_of_pdus > NFAPI_RX_IND_MAX_PDU)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of rx ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_RX_IND_MAX_PDU);
+ return 0;
+ }
+
+ if(value->number_of_pdus > 0)
+ {
+ value->rx_pdu_list = (nfapi_rx_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_rx_indication_pdu_t) * value->number_of_pdus, config);
+ if(value->rx_pdu_list == NULL)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate rx ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
+ return 0;
+ }
+ }
+ else
+ {
+ value->rx_pdu_list = 0;
+ }
+
+ uint8_t i = 0;
+ nfapi_rx_indication_pdu_t* pdu = 0;
+ while((uint8_t*)(*ppReadPackedMsg) < rxBodyEnd && (uint8_t*)(*ppReadPackedMsg) < rxPduEnd)
+ {
+ nfapi_tl_t generic_tl;
+ if( unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
+ return 0;
+
+ switch(generic_tl.tag)
+ {
+ case NFAPI_RX_UE_INFORMATION_TAG:
+ {
+ pdu = &(value->rx_pdu_list[i++]);
+ pdu->rx_ue_information.tl = generic_tl;
+ if(unpack_rx_ue_information_value(&pdu->rx_ue_information, ppReadPackedMsg, end) == 0)
+ return 0;
+ }
+ break;
+ case NFAPI_RX_INDICATION_REL8_TAG:
+ {
+ if(pdu != 0)
+ {
+ pdu->rx_indication_rel8.tl = generic_tl;
+ if(unpack_rx_indication_rel8_value(&pdu->rx_indication_rel8, ppReadPackedMsg, end) == 0)
+ return 0;
+
+ if(pdu->rx_indication_rel8.offset > 0)
+ {
+ // Need to check that the data is within the tlv
+ if(numberOfPdusAddress + pdu->rx_indication_rel8.offset + pdu->rx_indication_rel8.length <= rxBodyEnd)
+ {
+ // If this the first pdu set the rxPduEnd
+ if(numberOfPdusAddress + pdu->rx_indication_rel8.offset < rxPduEnd)
+ {
+ rxPduEnd = numberOfPdusAddress + pdu->rx_indication_rel8.offset;
+
+ if(rxPduEnd > end)
+ {
+ // pdu end is past buffer end
+ return 0;
+ }
+ }
+ }
+ else
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME: the rx data is outside of the tlv\n");
+ }
+ }
+ }
+ }
+ break;
+ case NFAPI_RX_INDICATION_REL9_TAG:
+ {
+ if(pdu != 0)
+ {
+ pdu->rx_indication_rel9.tl = generic_tl;
+ if(unpack_rx_indication_rel9_value(&pdu->rx_indication_rel9, ppReadPackedMsg, end) == 0)
+ return 0;
+ }
+ }
+ break;
+ default:
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "RX_ULSCH.indication Invalid pdu type %d \n", generic_tl.tag );
+ }
+ break;
+ }
+ }
+
+ uint8_t idx = 0;
+ for(idx = 0; idx < value->number_of_pdus; ++idx)
+ {
+ if(value->rx_pdu_list[idx].rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG)
+ {
+ uint32_t length = value->rx_pdu_list[idx].rx_indication_rel8.length;
+ value->rx_pdu_list[idx].data = nfapi_p7_allocate(length, config);
+ if(pullarray8(ppReadPackedMsg, value->rx_pdu_list[idx].data, length, length, end) == 0)
+ {
+ return 0;
+ }
+ }
+ }
+
+ return 1;
+}
+
+static uint8_t unpack_rx_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+ nfapi_rx_indication_t *pNfapiMsg = (nfapi_rx_indication_t*)msg;
+
+ unpack_p7_tlv_t unpack_fns[] =
+ {
+ { NFAPI_RX_INDICATION_BODY_TAG, &pNfapiMsg->rx_indication_body, &unpack_rx_indication_body_value},
+ };
+
+ return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+ unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_preamble_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_preamble_pdu_rel8_t* preamble_pdu_rel8 = (nfapi_preamble_pdu_rel8_t*)tlv;
+
+ return (pull16(ppReadPackedMsg, &preamble_pdu_rel8->rnti, end) &&
+ pull8(ppReadPackedMsg, &preamble_pdu_rel8->preamble, end) &&
+ pull16(ppReadPackedMsg, &preamble_pdu_rel8->timing_advance, end));
+}
+
+static uint8_t unpack_preamble_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_preamble_pdu_rel9_t* preamble_pdu_rel9 = (nfapi_preamble_pdu_rel9_t*)tlv;
+ return pull16(ppReadPackedMsg, &preamble_pdu_rel9->timing_advance_r9, end);
+}
+
+static uint8_t unpack_preamble_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_preamble_pdu_rel13_t* preamble_pdu_rel13 = (nfapi_preamble_pdu_rel13_t*)tlv;
+ return pull8(ppReadPackedMsg, &preamble_pdu_rel13->rach_resource_type, end);
+}
+
+static uint8_t unpack_rach_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_rach_indication_body_t* value = (nfapi_rach_indication_body_t*)tlv;
+ uint8_t* rachBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+ if(rachBodyEnd > end)
+ return 0;
+
+ if(pull16(ppReadPackedMsg, &value->number_of_preambles, end) == 0)
+ return 0;
+
+ if(value->number_of_preambles > NFAPI_PREAMBLE_MAX_PDU)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of preamble du's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_preambles, NFAPI_PREAMBLE_MAX_PDU);
+ return 0;
+ }
+
+ if(value->number_of_preambles > 0)
+ {
+ value->preamble_list = (nfapi_preamble_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_preamble_pdu_t) * value->number_of_preambles, config);
+ if(value->preamble_list == NULL)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate preamble pdu list (count:%d)\n", __FUNCTION__, value->number_of_preambles);
+ return 0;
+ }
+ }
+ else
+ {
+ value->preamble_list = 0;
+ }
+
+
+ uint8_t i = 0;
+ for(i = 0; i < value->number_of_preambles; ++i)
+ {
+ nfapi_preamble_pdu_t* pdu = &(value->preamble_list[i]);
+
+ if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
+ return 0;
+
+ uint8_t* preamblePduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
+
+
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_PREAMBLE_REL8_TAG, &pdu->preamble_rel8, unpack_preamble_pdu_rel8_value },
+ { NFAPI_PREAMBLE_REL9_TAG, &pdu->preamble_rel9, unpack_preamble_pdu_rel9_value },
+ { NFAPI_PREAMBLE_REL13_TAG, &pdu->preamble_rel13, unpack_preamble_pdu_rel13_value },
+ };
+
+ if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, preamblePduInstanceEnd, 0, 0) == 0)
+ return 0;
+ }
+ return 1;
+}
+
+static uint8_t unpack_rach_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+ nfapi_rach_indication_t *pNfapiMsg = (nfapi_rach_indication_t*)msg;
+
+ unpack_p7_tlv_t unpack_fns[] =
+ {
+ { NFAPI_RACH_INDICATION_BODY_TAG, &pNfapiMsg->rach_indication_body, &unpack_rach_indication_body_value},
+ };
+
+ return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+ unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_srs_indication_fdd_rel8_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_srs_indication_fdd_rel8_t* srs_pdu_fdd_rel8 = (nfapi_srs_indication_fdd_rel8_t*)tlv;
+
+ if(!(pull16(ppReadPackedMsg, &srs_pdu_fdd_rel8->doppler_estimation, end) &&
+ pull16(ppReadPackedMsg, &srs_pdu_fdd_rel8->timing_advance, end) &&
+ pull8(ppReadPackedMsg, &srs_pdu_fdd_rel8->number_of_resource_blocks, end) &&
+ pull8(ppReadPackedMsg, &srs_pdu_fdd_rel8->rb_start, end) &&
+ pullarray8(ppReadPackedMsg, srs_pdu_fdd_rel8->snr, NFAPI_NUM_RB_MAX, srs_pdu_fdd_rel8->number_of_resource_blocks, end)))
+ return 0;
+ return 1;
+}
+
+static uint8_t unpack_srs_indication_fdd_rel9_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_srs_indication_fdd_rel9_t* srs_pdu_fdd_rel9 = (nfapi_srs_indication_fdd_rel9_t*)tlv;
+ return (pull16(ppReadPackedMsg, &srs_pdu_fdd_rel9->timing_advance_r9, end));
+}
+
+static uint8_t unpack_srs_indication_tdd_rel10_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_srs_indication_ttd_rel10_t* srs_pdu_tdd_rel10 = (nfapi_srs_indication_ttd_rel10_t*)tlv;
+ return (pull8(ppReadPackedMsg, &srs_pdu_tdd_rel10->uppts_symbol, end));
+}
+
+static uint8_t unpack_srs_indication_fdd_rel11_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_srs_indication_fdd_rel11_t* srs_pdu_fdd_rel11 = (nfapi_srs_indication_fdd_rel11_t*)tlv;
+ return ( pull16(ppReadPackedMsg, &srs_pdu_fdd_rel11->ul_rtoa, end));
+}
+
+static uint8_t unpack_tdd_channel_measurement_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_tdd_channel_measurement_t* value = (nfapi_tdd_channel_measurement_t*)tlv;
+
+ if(!(pull8(ppReadPackedMsg, &value->num_prb_per_subband, end) &&
+ pull8(ppReadPackedMsg, &value->number_of_subbands, end) &&
+ pull8(ppReadPackedMsg, &value->num_atennas, end)))
+ return 0;
+
+ if(value->number_of_subbands > NFAPI_MAX_NUM_SUBBANDS)
+ {
+ // todo : add error
+ return 0;
+ }
+
+ if(value->num_atennas > NFAPI_MAX_NUM_PHYSICAL_ANTENNAS)
+ {
+ // todo : add error
+ return 0;
+ }
+
+ uint8_t idx = 0;
+ for(idx = 0; idx < value->number_of_subbands; ++idx)
+ {
+ if(!(pull8(ppReadPackedMsg, &value->subands[idx].subband_index, end) &&
+ pullarray16(ppReadPackedMsg, value->subands[idx].channel, NFAPI_MAX_NUM_PHYSICAL_ANTENNAS, value->num_atennas, end)))
+ return 0;
+ }
+
+ return 1;
+}
+
+
+static uint8_t unpack_srs_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_srs_indication_body_t* value = (nfapi_srs_indication_body_t*)tlv;
+ uint8_t* srsBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+ if(srsBodyEnd > end)
+ return 0;
+
+ if(pull8(ppReadPackedMsg, &value->number_of_ues, end) == 0)
+ return 0;
+
+ if(value->number_of_ues > NFAPI_SRS_IND_MAX_PDU)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of srs ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_ues, NFAPI_SRS_IND_MAX_PDU);
+ return 0;
+ }
+
+ if(value->number_of_ues > 0)
+ {
+ value->srs_pdu_list = (nfapi_srs_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_srs_indication_pdu_t) * value->number_of_ues, config);
+ if(value->srs_pdu_list == NULL)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate srs ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_ues);
+ return 0;
+ }
+ }
+ else
+ {
+ value->srs_pdu_list = 0;
+ }
+
+
+
+ uint8_t i = 0;
+ for(i = 0; i < value->number_of_ues; ++i)
+ {
+ nfapi_srs_indication_pdu_t* pdu = &(value->srs_pdu_list[i]);
+
+
+ if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
+ return 0;
+
+ uint8_t* srsPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
+
+
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
+ { NFAPI_SRS_INDICATION_FDD_REL8_TAG, &pdu->srs_indication_fdd_rel8, unpack_srs_indication_fdd_rel8_value},
+ { NFAPI_SRS_INDICATION_FDD_REL9_TAG, &pdu->srs_indication_fdd_rel9, unpack_srs_indication_fdd_rel9_value},
+ { NFAPI_SRS_INDICATION_TDD_REL10_TAG, &pdu->srs_indication_tdd_rel10, unpack_srs_indication_tdd_rel10_value},
+ { NFAPI_SRS_INDICATION_FDD_REL11_TAG, &pdu->srs_indication_fdd_rel11, unpack_srs_indication_fdd_rel11_value},
+ { NFAPI_TDD_CHANNEL_MEASUREMENT_TAG, &pdu->tdd_channel_measurement, unpack_tdd_channel_measurement_value},
+ };
+
+ if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, srsPduInstanceEnd, 0, 0) == 0)
+ return 0;
+ }
+ return 1;
+}
+
+static uint8_t unpack_srs_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+ nfapi_srs_indication_t *pNfapiMsg = (nfapi_srs_indication_t*)msg;
+
+ unpack_p7_tlv_t unpack_fns[] =
+ {
+ { NFAPI_SRS_INDICATION_BODY_TAG, &pNfapiMsg->srs_indication_body, &unpack_srs_indication_body_value},
+ };
+
+ return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+ unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+
+static uint8_t unpack_sr_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_sr_indication_body_t* value = (nfapi_sr_indication_body_t*)tlv;
+ uint8_t* srBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+ if(srBodyEnd > end)
+ return 0;
+
+ if(pull16(ppReadPackedMsg, &value->number_of_srs, end) == 0)
+ return 0;
+
+ if(value->number_of_srs > NFAPI_SR_IND_MAX_PDU)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of sr ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_srs, NFAPI_SR_IND_MAX_PDU);
+ return 0;
+ }
+
+ if(value->number_of_srs > 0)
+ {
+ value->sr_pdu_list = (nfapi_sr_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_sr_indication_pdu_t) * value->number_of_srs, config);
+ if(value->sr_pdu_list == NULL)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate sr ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_srs);
+ return 0;
+ }
+ }
+ else
+ {
+ value->sr_pdu_list = 0;
+ }
+
+ uint8_t i = 0;
+ for(i = 0; i < value->number_of_srs; ++i)
+ {
+ nfapi_sr_indication_pdu_t* pdu = &(value->sr_pdu_list[i]);
+
+ if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
+ return 0;
+
+ uint8_t* srPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
+
+
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
+ { NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, unpack_ul_cqi_information_value },
+ };
+
+ if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, srPduInstanceEnd, 0, 0) == 0)
+ return 0;
+ }
+
+ return 1;
+
+}
+
+static int unpack_sr_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+ nfapi_sr_indication_t *pNfapiMsg = (nfapi_sr_indication_t*)msg;
+
+ unpack_p7_tlv_t unpack_fns[] =
+ {
+ { NFAPI_SR_INDICATION_BODY_TAG, &pNfapiMsg->sr_indication_body, &unpack_sr_indication_body_value},
+ };
+
+ return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+ unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+static uint8_t unpack_cqi_indication_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_cqi_indication_rel8_t* cqi_pdu_rel8 = (nfapi_cqi_indication_rel8_t*)tlv;
+
+ return (pull16(ppReadPackedMsg, &cqi_pdu_rel8->length, end) &&
+ pull16(ppReadPackedMsg, &cqi_pdu_rel8->data_offset, end) &&
+ pull8(ppReadPackedMsg, &cqi_pdu_rel8->ul_cqi, end) &&
+ pull8(ppReadPackedMsg, &cqi_pdu_rel8->ri, end) &&
+ pull16(ppReadPackedMsg, &cqi_pdu_rel8->timing_advance, end));
+
+}
+
+static uint8_t unpack_cqi_indication_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_cqi_indication_rel9_t* cqi_pdu_rel9 = (nfapi_cqi_indication_rel9_t*)tlv;
+
+ if(!(pull16(ppReadPackedMsg, &cqi_pdu_rel9->length, end) &&
+ pull16(ppReadPackedMsg, &cqi_pdu_rel9->data_offset, end) &&
+ pull8(ppReadPackedMsg, &cqi_pdu_rel9->ul_cqi, end) &&
+ pull8(ppReadPackedMsg, &cqi_pdu_rel9->number_of_cc_reported, end)))
+ return 0;
+
+ if(cqi_pdu_rel9->number_of_cc_reported > NFAPI_CC_MAX)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : out of bound array\n");
+ return 0;
+ }
+
+ if(!(pullarray8(ppReadPackedMsg, cqi_pdu_rel9->ri, NFAPI_CC_MAX, cqi_pdu_rel9->number_of_cc_reported, end) &&
+ pull16(ppReadPackedMsg, &cqi_pdu_rel9->timing_advance, end) &&
+ pull16(ppReadPackedMsg, &cqi_pdu_rel9->timing_advance_r9, end)))
+ return 0;
+
+ return 1;
+}
+
+static uint8_t unpack_cqi_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_cqi_indication_body_t* value = (nfapi_cqi_indication_body_t*)tlv;
+
+ // the cqiBodyEnd points to the end of the cqi PDU's
+ uint8_t* cqiBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+ //uint8_t* cqiPduEnd = cqiBodyEnd;
+ //uint8_t* numberOfPdusAddress = *ppReadPackedMsg;
+
+ if(cqiBodyEnd > end)
+ return 0;
+
+ if(pull16(ppReadPackedMsg, &value->number_of_cqis, end) == 0)
+ return 0;
+
+ if(value->number_of_cqis > NFAPI_CQI_IND_MAX_PDU)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of cqi ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_cqis, NFAPI_CQI_IND_MAX_PDU);
+ return -1;
+ }
+
+ if(value->number_of_cqis > 0)
+ {
+ value->cqi_pdu_list = (nfapi_cqi_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_cqi_indication_pdu_t) * value->number_of_cqis, config);
+ if(value->cqi_pdu_list == NULL)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate cqi ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_cqis);
+ return 0;
+ }
+ }
+ else
+ {
+ value->cqi_pdu_list = 0;
+ }
+
+ if(value->number_of_cqis > 0)
+ {
+ value->cqi_raw_pdu_list = (nfapi_cqi_indication_raw_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_cqi_indication_raw_pdu_t) * value->number_of_cqis, config);
+ if(value->cqi_raw_pdu_list == NULL)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate raw cqi ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_cqis);
+ return 0;
+ }
+ }
+ else
+ {
+ value->cqi_raw_pdu_list = 0;
+ }
+
+ uint8_t i = 0;
+ for(i = 0; i < value->number_of_cqis; ++i)
+ {
+ nfapi_cqi_indication_pdu_t* pdu = &(value->cqi_pdu_list[i]);
+ memset(pdu, 0, sizeof(nfapi_cqi_indication_pdu_t));
+
+ if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
+ return 0;
+
+ uint8_t* cqiPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
+
+
+ while((uint8_t*)(*ppReadPackedMsg) < cqiPduInstanceEnd)
+ {
+ nfapi_tl_t generic_tl;
+ if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
+ return 0;
+
+ switch(generic_tl.tag)
+ {
+ case NFAPI_RX_UE_INFORMATION_TAG:
+ pdu->rx_ue_information.tl = generic_tl;
+ if(unpack_rx_ue_information_value(&pdu->rx_ue_information, ppReadPackedMsg, end) == 0)
+ return 0;
+ break;
+ case NFAPI_CQI_INDICATION_REL8_TAG:
+ pdu->cqi_indication_rel8.tl = generic_tl;
+ if(unpack_cqi_indication_rel8_value(&pdu->cqi_indication_rel8, ppReadPackedMsg, end) == 0)
+ return 0;
+
+ break;
+ case NFAPI_CQI_INDICATION_REL9_TAG:
+ pdu->cqi_indication_rel9.tl = generic_tl;
+ if(unpack_cqi_indication_rel9_value(&pdu->cqi_indication_rel9, ppReadPackedMsg, end) == 0)
+ return 0;
+
+ break;
+ case NFAPI_UL_CQI_INFORMATION_TAG:
+ pdu->ul_cqi_information.tl = generic_tl;
+ if(unpack_ul_cqi_information_value(&pdu->ul_cqi_information, ppReadPackedMsg, end) == 0)
+ return 0;
+ break;
+ default:
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "RX_CQI.indication Invalid pdu type %d \n", generic_tl.tag );
+ }
+ break;
+
+ };
+ }
+ }
+
+ uint8_t idx = 0;
+ for(idx = 0; idx < value->number_of_cqis; ++idx)
+ {
+ if(value->cqi_pdu_list[idx].cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG)
+ {
+ if(pullarray8(ppReadPackedMsg, &(value->cqi_raw_pdu_list[idx].pdu[0]), NFAPI_CQI_RAW_MAX_LEN, value->cqi_pdu_list[idx].cqi_indication_rel8.length, end) == 0)
+ return 0;
+ }
+ else if(value->cqi_pdu_list[idx].cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG)
+ {
+ if(pullarray8(ppReadPackedMsg, &(value->cqi_raw_pdu_list[idx].pdu[0]), NFAPI_CQI_RAW_MAX_LEN, value->cqi_pdu_list[idx].cqi_indication_rel9.length, end) == 0)
+ return 0;
+ }
+ }
+
+
+ return 1;
+
+}
+
+static uint8_t unpack_cqi_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+ nfapi_cqi_indication_t *pNfapiMsg = (nfapi_cqi_indication_t*)msg;
+
+ unpack_p7_tlv_t unpack_fns[] =
+ {
+ { NFAPI_CQI_INDICATION_BODY_TAG, &pNfapiMsg->cqi_indication_body, &unpack_cqi_indication_body_value},
+ };
+
+ return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+ unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+static uint8_t unpack_lbt_pdsch_req_pdu_rel13_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_lbt_pdsch_req_pdu_rel13_t* value = (nfapi_lbt_pdsch_req_pdu_rel13_t*)tlv;
+
+ return (pull32(ppReadPackedMsg, &value->handle, end) &&
+ pull32(ppReadPackedMsg, &value->mp_cca, end) &&
+ pull32(ppReadPackedMsg, &value->n_cca, end) &&
+ pull32(ppReadPackedMsg, &value->offset, end) &&
+ pull32(ppReadPackedMsg, &value->lte_txop_sf, end) &&
+ pull16(ppReadPackedMsg, &value->txop_sfn_sf_end, end) &&
+ pull32(ppReadPackedMsg, &value->lbt_mode, end));
+}
+
+static uint8_t unpack_lbt_drs_req_pdu_rel13_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_lbt_drs_req_pdu_rel13_t* value = (nfapi_lbt_drs_req_pdu_rel13_t*)tlv;
+
+ return (pull32(ppReadPackedMsg, &value->handle, end) &&
+ pull32(ppReadPackedMsg, &value->offset, end) &&
+ pull16(ppReadPackedMsg, &value->sfn_sf_end, end) &&
+ pull32(ppReadPackedMsg, &value->lbt_mode, end));
+}
+
+
+static uint8_t unpack_lbt_config_request_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_lbt_dl_config_request_body_t* value = (nfapi_lbt_dl_config_request_body_t*)tlv;
+
+ if(pull16(ppReadPackedMsg, &value->number_of_pdus, end) == 0)
+ return 0;
+
+ if(value->number_of_pdus > NFAPI_LBT_DL_CONFIG_REQ_MAX_PDU)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of lbt dl config pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_LBT_DL_CONFIG_REQ_MAX_PDU);
+ return 0;
+ }
+
+ if(value->number_of_pdus)
+ {
+ value->lbt_dl_config_req_pdu_list = (nfapi_lbt_dl_config_request_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_lbt_dl_config_request_pdu_t) * value->number_of_pdus, config);
+ if(value->lbt_dl_config_req_pdu_list == NULL)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate lbt dl config pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
+ return 0;
+ }
+ }
+ else
+ {
+ value->lbt_dl_config_req_pdu_list = 0;
+ }
+
+
+ uint16_t i;
+ uint16_t total_number_of_pdus = value->number_of_pdus;
+ for(i = 0; i < total_number_of_pdus; ++i)
+ {
+ nfapi_lbt_dl_config_request_pdu_t* pdu = &(value->lbt_dl_config_req_pdu_list[i]);
+
+ if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
+ pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
+ return 0;
+
+ uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
+
+ if(packedPduEnd > end)
+ return 0;
+
+ switch(pdu->pdu_type)
+ {
+ case NFAPI_LBT_DL_CONFIG_REQUEST_PDSCH_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_LBT_PDSCH_REQ_PDU_REL13_TAG, &pdu->lbt_pdsch_req_pdu.lbt_pdsch_req_pdu_rel13, &unpack_lbt_pdsch_req_pdu_rel13_value},
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_LBT_DL_CONFIG_REQUEST_DRS_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_LBT_DRS_REQ_PDU_REL13_TAG, &pdu->lbt_drs_req_pdu.lbt_drs_req_pdu_rel13, &unpack_lbt_drs_req_pdu_rel13_value},
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ default:
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL_CONFIG.request body invalid pdu type %d\n", pdu->pdu_type);
+ return 0;
+ }
+ }
+
+ return 1;
+}
+static uint8_t unpack_lbt_dl_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+ nfapi_lbt_dl_config_request_t *pNfapiMsg = (nfapi_lbt_dl_config_request_t*)msg;
+
+ unpack_p7_tlv_t unpack_fns[] =
+ {
+ { NFAPI_LBT_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->lbt_dl_config_request_body, &unpack_lbt_config_request_body_value},
+ };
+
+ return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+ unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_lbt_pdsch_rsp_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_lbt_pdsch_rsp_pdu_rel13_t* value = (nfapi_lbt_pdsch_rsp_pdu_rel13_t*)tlv;
+
+ return (pull32(ppReadPackedMsg, &value->handle, end) &&
+ pull32(ppReadPackedMsg, &value->result, end) &&
+ pull32(ppReadPackedMsg, &value->lte_txop_symbols, end) &&
+ pull32(ppReadPackedMsg, &value->initial_partial_sf, end));
+
+}
+static uint8_t unpack_lbt_drs_rsp_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_lbt_drs_rsp_pdu_rel13_t* value = (nfapi_lbt_drs_rsp_pdu_rel13_t*)tlv;
+
+ return (pull32(ppReadPackedMsg, &value->handle, end) &&
+ pull32(ppReadPackedMsg, &value->result, end));
+}
+
+static uint8_t unpack_lbt_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_lbt_dl_indication_body_t* value = (nfapi_lbt_dl_indication_body_t*)tlv;
+
+ if(pull16(ppReadPackedMsg, &value->number_of_pdus, end) == 0)
+ return 0;
+
+ if(value->number_of_pdus > NFAPI_LBT_IND_MAX_PDU)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of lbt dl ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_LBT_IND_MAX_PDU);
+ return 0;
+ }
+
+ if(value->number_of_pdus > 0)
+ {
+ value->lbt_indication_pdu_list = (nfapi_lbt_dl_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_lbt_dl_indication_pdu_t) * value->number_of_pdus, config);
+ if(value->lbt_indication_pdu_list == NULL)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate lbt dl ind config pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
+ return 0;
+ }
+ }
+ else
+ {
+ value->lbt_indication_pdu_list = 0;
+ }
+
+ uint16_t i;
+ uint16_t total_number_of_pdus = value->number_of_pdus;
+ for(i = 0; i < total_number_of_pdus; ++i)
+ {
+ nfapi_lbt_dl_indication_pdu_t* pdu = &(value->lbt_indication_pdu_list[i]);
+
+ if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
+ pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
+ return 0;
+
+ uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
+
+ if(packedPduEnd > end)
+ return 0;
+
+ switch(pdu->pdu_type)
+ {
+ case NFAPI_LBT_DL_RSP_PDSCH_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_LBT_PDSCH_RSP_PDU_REL13_TAG, &pdu->lbt_pdsch_rsp_pdu.lbt_pdsch_rsp_pdu_rel13, &unpack_lbt_pdsch_rsp_pdu_rel13_value},
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ case NFAPI_LBT_DL_RSP_DRS_PDU_TYPE:
+ {
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_LBT_DRS_RSP_PDU_REL13_TAG, &pdu->lbt_drs_rsp_pdu.lbt_drs_rsp_pdu_rel13, &unpack_lbt_drs_rsp_pdu_rel13_value},
+ };
+
+ unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+ }
+ break;
+ default:
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL.indication body invalid pdu type %d\n", pdu->pdu_type);
+ return 0;
+ }
+ }
+
+ return 1;
+}
+static uint8_t unpack_lbt_dl_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+ nfapi_lbt_dl_indication_t *pNfapiMsg = (nfapi_lbt_dl_indication_t*)msg;
+
+ unpack_p7_tlv_t unpack_fns[] =
+ {
+ { NFAPI_LBT_DL_INDICATION_BODY_TAG, &pNfapiMsg->lbt_dl_indication_body, &unpack_lbt_indication_body_value},
+ };
+
+ return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+ unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_nb_harq_indication_fdd_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_nb_harq_indication_fdd_rel13_t* value = (nfapi_nb_harq_indication_fdd_rel13_t*)tlv;
+ return (pull8(ppReadPackedMsg, &value->harq_tb1, end));
+}
+
+
+static uint8_t unpack_nb_harq_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_nb_harq_indication_body_t* value = (nfapi_nb_harq_indication_body_t*)tlv;
+ uint8_t* nbharqBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+ if(nbharqBodyEnd > end)
+ return 0;
+
+ if(pull16(ppReadPackedMsg, &value->number_of_harqs, end) == 0)
+ return 0;
+
+ if(value->number_of_harqs > NFAPI_HARQ_IND_MAX_PDU)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of harq ind pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_harqs, NFAPI_HARQ_IND_MAX_PDU);
+ return 0;
+ }
+
+ value->nb_harq_pdu_list = (nfapi_nb_harq_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_nb_harq_indication_pdu_t) * value->number_of_harqs, config);
+ if(value->nb_harq_pdu_list == NULL)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate harq ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_harqs);
+ return 0;
+ }
+
+ uint8_t i = 0;
+ for(i = 0; i < value->number_of_harqs; ++i)
+ {
+ nfapi_nb_harq_indication_pdu_t* pdu = &(value->nb_harq_pdu_list[i]);
+ if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
+ return 0;
+
+ uint8_t* harqPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
+
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
+ { NFAPI_NB_HARQ_INDICATION_FDD_REL13_TAG, &pdu->nb_harq_indication_fdd_rel13, &unpack_nb_harq_indication_fdd_rel13_value},
+ { NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, &unpack_ul_cqi_information_value}
+ };
+
+ if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, harqPduInstanceEnd, 0, 0) == 0)
+ return 0;
+
+ }
+
+ return 1;
+}
+
+static uint8_t unpack_nb_harq_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+ nfapi_nb_harq_indication_t *pNfapiMsg = (nfapi_nb_harq_indication_t*)msg;
+
+ unpack_p7_tlv_t unpack_fns[] =
+ {
+ { NFAPI_NB_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->nb_harq_indication_body, &unpack_nb_harq_indication_body_value},
+ };
+
+ return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+ unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_nrach_indication_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ nfapi_nrach_indication_pdu_rel13_t* value = (nfapi_nrach_indication_pdu_rel13_t*)tlv;
+
+ return (pull16(ppReadPackedMsg, &value->rnti, end) &&
+ pull8(ppReadPackedMsg, &value->initial_sc, end) &&
+ pull16(ppReadPackedMsg, &value->timing_advance, end) &&
+ pull8(ppReadPackedMsg, &value->nrach_ce_level, end));
+}
+
+static uint8_t unpack_ue_release_resp(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+ nfapi_ue_release_response_t *pNfapiMsg = (nfapi_ue_release_response_t*)msg;
+ if(pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) == 0){
+ return 0;
+ }
+ else{
+ NFAPI_TRACE(NFAPI_TRACE_INFO, "ue_release_response:error_code = %d\n", pNfapiMsg->error_code);
+ }
+ return 1;
+}
+
+static uint8_t unpack_nrach_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+ nfapi_nrach_indication_body_t* value = (nfapi_nrach_indication_body_t*)tlv;
+ uint8_t* nrachBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+ if(nrachBodyEnd > end)
+ return 0;
+
+ if(pull8(ppReadPackedMsg, &value->number_of_initial_scs_detected, end) == 0)
+ return 0;
+
+ if(value->number_of_initial_scs_detected > NFAPI_PREAMBLE_MAX_PDU)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of detected scs ind pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_initial_scs_detected, NFAPI_PREAMBLE_MAX_PDU);
+ return 0;
+ }
+
+ value->nrach_pdu_list = (nfapi_nrach_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_nrach_indication_pdu_t) * value->number_of_initial_scs_detected, config);
+ if(value->nrach_pdu_list == NULL)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate nrach ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_initial_scs_detected);
+ return 0;
+ }
+
+ uint8_t i = 0;
+ for(i = 0; i < value->number_of_initial_scs_detected; ++i)
+ {
+ nfapi_nrach_indication_pdu_t* pdu = &(value->nrach_pdu_list[i]);
+
+ uint8_t* nrachPduInstanceEnd = *ppReadPackedMsg + 4 + 6;
+
+ unpack_tlv_t unpack_fns[] =
+ {
+ { NFAPI_NRACH_INDICATION_REL13_TAG, &pdu->nrach_indication_rel13, &unpack_nrach_indication_rel13_value},
+ };
+
+ if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, nrachPduInstanceEnd, 0, 0) == 0)
+ return 0;
+
+ }
+
+ return 1;
+}
+
+static uint8_t unpack_nrach_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+ nfapi_nrach_indication_t *pNfapiMsg = (nfapi_nrach_indication_t*)msg;
+
+ unpack_p7_tlv_t unpack_fns[] =
+ {
+ { NFAPI_NRACH_INDICATION_BODY_TAG, &pNfapiMsg->nrach_indication_body, &unpack_nrach_indication_body_value},
+ };
+
+ return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+ unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_nr_dl_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+ nfapi_nr_dl_node_sync_t *pNfapiMsg = (nfapi_nr_dl_node_sync_t*)msg;
+
+ unpack_p7_tlv_t unpack_fns[] =
+ {
+ };
+
+ return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
+ pulls32(ppReadPackedMsg, &pNfapiMsg->delta_sfn_slot, end) &&
+ unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_dl_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+ nfapi_dl_node_sync_t *pNfapiMsg = (nfapi_dl_node_sync_t*)msg;
+
+ unpack_p7_tlv_t unpack_fns[] =
+ {
+ };
+
+ return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
+ pulls32(ppReadPackedMsg, &pNfapiMsg->delta_sfn_sf, end) &&
+ unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+
+static uint8_t unpack_nr_ul_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+ nfapi_nr_ul_node_sync_t *pNfapiMsg = (nfapi_nr_ul_node_sync_t*)msg;
+
+ unpack_p7_tlv_t unpack_fns[] =
+ {
+ };
+
+ return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
+ pull32(ppReadPackedMsg, &pNfapiMsg->t2, end) &&
+ pull32(ppReadPackedMsg, &pNfapiMsg->t3, end) &&
+ unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+
+static uint8_t unpack_ul_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+ nfapi_ul_node_sync_t *pNfapiMsg = (nfapi_ul_node_sync_t*)msg;
+
+ unpack_p7_tlv_t unpack_fns[] =
+ {
+ };
+
+ return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
+ pull32(ppReadPackedMsg, &pNfapiMsg->t2, end) &&
+ pull32(ppReadPackedMsg, &pNfapiMsg->t3, end) &&
+ unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_timing_info(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+ nfapi_timing_info_t *pNfapiMsg = (nfapi_timing_info_t*)msg;
+
+ unpack_p7_tlv_t unpack_fns[] =
+ {
+ };
+
+ return (pull32(ppReadPackedMsg, &pNfapiMsg->last_sfn_sf, end) &&
+ pull32(ppReadPackedMsg, &pNfapiMsg->time_since_last_timing_info, end) &&
+ pull32(ppReadPackedMsg, &pNfapiMsg->dl_config_jitter, end) &&
+ pull32(ppReadPackedMsg, &pNfapiMsg->tx_request_jitter, end) &&
+ pull32(ppReadPackedMsg, &pNfapiMsg->ul_config_jitter, end) &&
+ pull32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_jitter, end) &&
+ pulls32(ppReadPackedMsg, &pNfapiMsg->dl_config_latest_delay, end) &&
+ pulls32(ppReadPackedMsg, &pNfapiMsg->tx_request_latest_delay, end) &&
+ pulls32(ppReadPackedMsg, &pNfapiMsg->ul_config_latest_delay, end) &&
+ pulls32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_latest_delay, end) &&
+ pulls32(ppReadPackedMsg, &pNfapiMsg->dl_config_earliest_arrival, end) &&
+ pulls32(ppReadPackedMsg, &pNfapiMsg->tx_request_earliest_arrival, end) &&
+ pulls32(ppReadPackedMsg, &pNfapiMsg->ul_config_earliest_arrival, end) &&
+ pulls32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_earliest_arrival, end) &&
+ unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+
+static uint8_t unpack_nr_timing_info(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+ nfapi_nr_timing_info_t *pNfapiMsg = (nfapi_nr_timing_info_t*)msg;
+
+ unpack_p7_tlv_t unpack_fns[] =
+ {
+ };
+
+ return (pull32(ppReadPackedMsg, &pNfapiMsg->last_sfn, end) &&
+ pull32(ppReadPackedMsg, &pNfapiMsg->last_slot, end) &&
+ pull32(ppReadPackedMsg, &pNfapiMsg->time_since_last_timing_info, end) &&
+ pull32(ppReadPackedMsg, &pNfapiMsg->dl_tti_jitter, end) &&
+ pull32(ppReadPackedMsg, &pNfapiMsg->tx_data_request_jitter, end) &&
+ pull32(ppReadPackedMsg, &pNfapiMsg->ul_tti_jitter, end) &&
+ pull32(ppReadPackedMsg, &pNfapiMsg->ul_dci_jitter, end) &&
+ pulls32(ppReadPackedMsg, &pNfapiMsg->dl_tti_latest_delay, end) &&
+ pulls32(ppReadPackedMsg, &pNfapiMsg->tx_data_request_latest_delay, end) &&
+ pulls32(ppReadPackedMsg, &pNfapiMsg->ul_tti_latest_delay, end) &&
+ pulls32(ppReadPackedMsg, &pNfapiMsg->ul_dci_latest_delay, end) &&
+ pulls32(ppReadPackedMsg, &pNfapiMsg->dl_tti_earliest_arrival, end) &&
+ pulls32(ppReadPackedMsg, &pNfapiMsg->tx_data_request_earliest_arrival, end) &&
+ pulls32(ppReadPackedMsg, &pNfapiMsg->ul_tti_earliest_arrival, end) &&
+ pulls32(ppReadPackedMsg, &pNfapiMsg->ul_dci_earliest_arrival, end) &&
+ unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+
+
+// unpack length check
+
+static int check_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen)
+{
+ int retLen = 0;
+
+ switch (msgId)
+ {
+ case NFAPI_DL_CONFIG_REQUEST:
+ if (unpackedBufLen >= sizeof(nfapi_dl_config_request_t))
+ retLen = sizeof(nfapi_dl_config_request_t);
+ break;
+
+ case NFAPI_UL_CONFIG_REQUEST:
+ if (unpackedBufLen >= sizeof(nfapi_ul_config_request_t))
+ retLen = sizeof(nfapi_ul_config_request_t);
+ break;
+
+ case NFAPI_SUBFRAME_INDICATION:
+ if (unpackedBufLen >= sizeof(nfapi_subframe_indication_t))
+ retLen = sizeof(nfapi_subframe_indication_t);
+ break;
+
+ case NFAPI_HI_DCI0_REQUEST:
+ if (unpackedBufLen >= sizeof(nfapi_hi_dci0_request_t))
+ retLen = sizeof(nfapi_hi_dci0_request_t);
+ break;
+
+ case NFAPI_TX_REQUEST:
+ if (unpackedBufLen >= sizeof(nfapi_tx_request_t))
+ retLen = sizeof(nfapi_tx_request_t);
+ break;
+
+ case NFAPI_HARQ_INDICATION:
+ if (unpackedBufLen >= sizeof(nfapi_harq_indication_t))
+ retLen = sizeof(nfapi_harq_indication_t);
+ break;
+
+ case NFAPI_CRC_INDICATION:
+ if (unpackedBufLen >= sizeof(nfapi_crc_indication_t))
+ retLen = sizeof(nfapi_crc_indication_t);
+ break;
+
+ case NFAPI_RX_ULSCH_INDICATION:
+ if (unpackedBufLen >= sizeof(nfapi_rx_indication_t))
+ retLen = sizeof(nfapi_rx_indication_t);
+ break;
+
+ case NFAPI_RACH_INDICATION:
+ if (unpackedBufLen >= sizeof(nfapi_rach_indication_t))
+ retLen = sizeof(nfapi_rach_indication_t);
+ break;
+
+ case NFAPI_SRS_INDICATION:
+ if (unpackedBufLen >= sizeof(nfapi_srs_indication_t))
+ retLen = sizeof(nfapi_srs_indication_t);
+ break;
+
+ case NFAPI_RX_SR_INDICATION:
+ if (unpackedBufLen >= sizeof(nfapi_sr_indication_t))
+ retLen = sizeof(nfapi_sr_indication_t);
+ break;
+
+ case NFAPI_RX_CQI_INDICATION:
+ if (unpackedBufLen >= sizeof(nfapi_cqi_indication_t))
+ retLen = sizeof(nfapi_cqi_indication_t);
+ break;
+
+ case NFAPI_LBT_DL_CONFIG_REQUEST:
+ if (unpackedBufLen >= sizeof(nfapi_lbt_dl_config_request_t))
+ retLen = sizeof(nfapi_lbt_dl_config_request_t);
+ break;
+
+ case NFAPI_LBT_DL_INDICATION:
+ if (unpackedBufLen >= sizeof(nfapi_lbt_dl_indication_t))
+ retLen = sizeof(nfapi_lbt_dl_indication_t);
+ break;
+
+ case NFAPI_NB_HARQ_INDICATION:
+ if (unpackedBufLen >= sizeof(nfapi_nb_harq_indication_t))
+ retLen = sizeof(nfapi_nb_harq_indication_t);
+ break;
+
+ case NFAPI_NRACH_INDICATION:
+ if (unpackedBufLen >= sizeof(nfapi_nrach_indication_t))
+ retLen = sizeof(nfapi_nrach_indication_t);
+ break;
+
+ case NFAPI_DL_NODE_SYNC:
+ if (unpackedBufLen >= sizeof(nfapi_dl_node_sync_t))
+ retLen = sizeof(nfapi_dl_node_sync_t);
+ break;
+
+ case NFAPI_UL_NODE_SYNC:
+ if (unpackedBufLen >= sizeof(nfapi_ul_node_sync_t))
+ retLen = sizeof(nfapi_ul_node_sync_t);
+ break;
+
+ case NFAPI_TIMING_INFO:
+ if (unpackedBufLen >= sizeof(nfapi_timing_info_t))
+ retLen = sizeof(nfapi_timing_info_t);
+ break;
+
+ case NFAPI_UE_RELEASE_REQUEST:
+ if (unpackedBufLen >= sizeof(nfapi_ue_release_request_t))
+ retLen = sizeof(nfapi_ue_release_request_t);
+ break;
+
+ case NFAPI_UE_RELEASE_RESPONSE:
+ if (unpackedBufLen >= sizeof(nfapi_ue_release_response_t))
+ retLen = sizeof(nfapi_ue_release_response_t);
+ break;
+
+ default:
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown message ID %d\n", msgId);
+ break;
+ }
+
+ return retLen;
+}
+
+static int check_nr_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen)
+{
+ int retLen = 0;
+
+ switch (msgId)
+ {
+ case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
+ if (unpackedBufLen >= sizeof(nfapi_nr_dl_tti_request_t))
+ retLen = sizeof(nfapi_nr_dl_tti_request_t);
+ break;
+
+ case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
+ if (unpackedBufLen >= sizeof(nfapi_nr_ul_tti_request_t))
+ retLen = sizeof(nfapi_nr_ul_tti_request_t);
+ break;
+
+ case NFAPI_SUBFRAME_INDICATION:
+ if (unpackedBufLen >= sizeof(nfapi_subframe_indication_t))
+ retLen = sizeof(nfapi_subframe_indication_t);
+ break;
+
+ case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
+ if (unpackedBufLen >= sizeof(nfapi_nr_ul_dci_request_t))
+ retLen = sizeof(nfapi_nr_ul_dci_request_t);
+ break;
+
+ case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
+ if (unpackedBufLen >= sizeof(nfapi_nr_tx_data_request_t))
+ retLen = sizeof(nfapi_nr_tx_data_request_t);
+ break;
+
+ case NFAPI_HARQ_INDICATION:
+ if (unpackedBufLen >= sizeof(nfapi_harq_indication_t))
+ retLen = sizeof(nfapi_harq_indication_t);
+ break;
+
+ case NFAPI_CRC_INDICATION:
+ if (unpackedBufLen >= sizeof(nfapi_crc_indication_t))
+ retLen = sizeof(nfapi_crc_indication_t);
+ break;
+
+ case NFAPI_RX_ULSCH_INDICATION:
+ if (unpackedBufLen >= sizeof(nfapi_rx_indication_t))
+ retLen = sizeof(nfapi_rx_indication_t);
+ break;
+
+ case NFAPI_RACH_INDICATION:
+ if (unpackedBufLen >= sizeof(nfapi_rach_indication_t))
+ retLen = sizeof(nfapi_rach_indication_t);
+ break;
+
+ case NFAPI_SRS_INDICATION:
+ if (unpackedBufLen >= sizeof(nfapi_srs_indication_t))
+ retLen = sizeof(nfapi_srs_indication_t);
+ break;
+
+ case NFAPI_RX_SR_INDICATION:
+ if (unpackedBufLen >= sizeof(nfapi_sr_indication_t))
+ retLen = sizeof(nfapi_sr_indication_t);
+ break;
+
+ case NFAPI_RX_CQI_INDICATION:
+ if (unpackedBufLen >= sizeof(nfapi_cqi_indication_t))
+ retLen = sizeof(nfapi_cqi_indication_t);
+ break;
+
+ case NFAPI_LBT_DL_CONFIG_REQUEST:
+ if (unpackedBufLen >= sizeof(nfapi_lbt_dl_config_request_t))
+ retLen = sizeof(nfapi_lbt_dl_config_request_t);
+ break;
+
+ case NFAPI_LBT_DL_INDICATION:
+ if (unpackedBufLen >= sizeof(nfapi_lbt_dl_indication_t))
+ retLen = sizeof(nfapi_lbt_dl_indication_t);
+ break;
+
+ case NFAPI_NB_HARQ_INDICATION:
+ if (unpackedBufLen >= sizeof(nfapi_nb_harq_indication_t))
+ retLen = sizeof(nfapi_nb_harq_indication_t);
+ break;
+
+ case NFAPI_NRACH_INDICATION:
+ if (unpackedBufLen >= sizeof(nfapi_nrach_indication_t))
+ retLen = sizeof(nfapi_nrach_indication_t);
+ break;
+
+ case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
+ if (unpackedBufLen >= sizeof(nfapi_nr_dl_node_sync_t))
+ retLen = sizeof(nfapi_nr_dl_node_sync_t);
+ break;
+
+ case NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC:
+ if (unpackedBufLen >= sizeof(nfapi_nr_ul_node_sync_t))
+ retLen = sizeof(nfapi_nr_ul_node_sync_t);
+ break;
+
+ case NFAPI_TIMING_INFO:
+ if (unpackedBufLen >= sizeof(nfapi_timing_info_t))
+ retLen = sizeof(nfapi_timing_info_t);
+ break;
+
+ case NFAPI_UE_RELEASE_REQUEST:
+ if (unpackedBufLen >= sizeof(nfapi_ue_release_request_t))
+ retLen = sizeof(nfapi_ue_release_request_t);
+ break;
+
+ case NFAPI_UE_RELEASE_RESPONSE:
+ if (unpackedBufLen >= sizeof(nfapi_ue_release_response_t))
+ retLen = sizeof(nfapi_ue_release_response_t);
+ break;
+
+ default:
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown message ID %d\n", msgId);
+ break;
+ }
+
+ return retLen;
+}
+
+
+
+// Main unpack functions - public
+
+int nfapi_p7_message_header_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t* config)
+{
+ nfapi_p7_message_header_t *pMessageHeader = pUnpackedBuf;
+ uint8_t *pReadPackedMessage = pMessageBuf;
+ uint8_t *end = pMessageBuf + messageBufLen;
+
+ if (pMessageBuf == NULL || pUnpackedBuf == NULL)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 header unpack supplied pointers are null\n");
+ return -1;
+ }
+
+ if (messageBufLen < NFAPI_P7_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p7_message_header_t))
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 header unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
+ return -1;
+ }
+
+ // process the header
+ if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
+ pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
+ pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
+ pull16(&pReadPackedMessage, &pMessageHeader->m_segment_sequence, end) &&
+ pull32(&pReadPackedMessage, &pMessageHeader->checksum, end) &&
+ pull32(&pReadPackedMessage, &pMessageHeader->transmit_timestamp, end)))
+ return -1;
+
+ return 0;
+}
+
+int nfapi_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t* config)
+{
+ int result = 0;
+ nfapi_p7_message_header_t *pMessageHeader = (nfapi_p7_message_header_t*)pUnpackedBuf;
+ uint8_t *pReadPackedMessage = pMessageBuf;
+ uint8_t *end = pMessageBuf + messageBufLen;
+
+ if (pMessageBuf == NULL || pUnpackedBuf == NULL)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied pointers are null\n");
+ return -1;
+ }
+
+ if (messageBufLen < NFAPI_P7_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p7_message_header_t))
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
+ return -1;
+ }
+ /*
+ uint8_t *ptr = pMessageBuf;
+ printf("\n Read P7 message unpack: ");
+ while(ptr < end){
+ printf(" %d ", *ptr);
+ ptr++;
+ }
+ printf("\n");
+*/
+ // clean the supplied buffer for - tag value blanking
+ (void)memset(pUnpackedBuf, 0, unpackedBufLen);
+
+ // process the header
+ if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
+ pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
+ pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
+ pull16(&pReadPackedMessage, &pMessageHeader->m_segment_sequence, end) &&
+ pull32(&pReadPackedMessage, &pMessageHeader->checksum, end) &&
+ pull32(&pReadPackedMessage, &pMessageHeader->transmit_timestamp, end)))
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack header failed\n");
+ return -1;
+ }
+
+ if((uint8_t*)(pMessageBuf + pMessageHeader->message_length) > end)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack message length is greater than the message buffer \n");
+ return -1;
+ }
+
+ /*
+ if(check_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack unpack buffer is not large enough \n");
+ return -1;
+ }
+ */
+
+ // look for the specific message
+ switch (pMessageHeader->message_id)
+ {
+ case NFAPI_DL_CONFIG_REQUEST:
+ if (check_unpack_length(NFAPI_DL_CONFIG_REQUEST, unpackedBufLen))
+ result = unpack_dl_config_request(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_UL_CONFIG_REQUEST:
+ if (check_unpack_length(NFAPI_UL_CONFIG_REQUEST, unpackedBufLen))
+ result = unpack_ul_config_request(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+ case NFAPI_TX_REQUEST:
+ if (check_unpack_length(NFAPI_TX_REQUEST, unpackedBufLen))
+ result = unpack_tx_request(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+ case NFAPI_HI_DCI0_REQUEST:
+ if (check_unpack_length(NFAPI_HI_DCI0_REQUEST, unpackedBufLen))
+ result = unpack_hi_dci0_request(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_UE_RELEASE_REQUEST:
+ if (check_unpack_length(NFAPI_UE_RELEASE_REQUEST, unpackedBufLen))
+ result = unpack_ue_release_request(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_HARQ_INDICATION:
+ if (check_unpack_length(NFAPI_HARQ_INDICATION, unpackedBufLen))
+ result = unpack_harq_indication(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_CRC_INDICATION:
+ if (check_unpack_length(NFAPI_CRC_INDICATION, unpackedBufLen))
+ result = unpack_crc_indication(&pReadPackedMessage,end , pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_RX_ULSCH_INDICATION:
+ if (check_unpack_length(NFAPI_RX_ULSCH_INDICATION, unpackedBufLen))
+ result = unpack_rx_indication(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_RACH_INDICATION:
+ if (check_unpack_length(NFAPI_RACH_INDICATION, unpackedBufLen))
+ result = unpack_rach_indication(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_SRS_INDICATION:
+ if (check_unpack_length(NFAPI_SRS_INDICATION, unpackedBufLen))
+ result = unpack_srs_indication(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_RX_SR_INDICATION:
+ if (check_unpack_length(NFAPI_RX_SR_INDICATION, unpackedBufLen))
+ result = unpack_sr_indication(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_RX_CQI_INDICATION:
+ if (check_unpack_length(NFAPI_RX_CQI_INDICATION, unpackedBufLen))
+ result = unpack_cqi_indication(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_LBT_DL_CONFIG_REQUEST:
+ if (check_unpack_length(NFAPI_LBT_DL_CONFIG_REQUEST, unpackedBufLen))
+ result = unpack_lbt_dl_config_request(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_LBT_DL_INDICATION:
+ if (check_unpack_length(NFAPI_LBT_DL_INDICATION, unpackedBufLen))
+ result = unpack_lbt_dl_indication(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_NB_HARQ_INDICATION:
+ if (check_unpack_length(NFAPI_NB_HARQ_INDICATION, unpackedBufLen))
+ result = unpack_nb_harq_indication(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_NRACH_INDICATION:
+ if (check_unpack_length(NFAPI_NRACH_INDICATION, unpackedBufLen))
+ result = unpack_nrach_indication(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_DL_NODE_SYNC:
+ if (check_unpack_length(NFAPI_DL_NODE_SYNC, unpackedBufLen))
+ result = unpack_dl_node_sync(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_UL_NODE_SYNC:
+ if (check_unpack_length(NFAPI_UL_NODE_SYNC, unpackedBufLen))
+ result = unpack_ul_node_sync(&pReadPackedMessage, end , pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_TIMING_INFO:
+ if (check_unpack_length(NFAPI_TIMING_INFO, unpackedBufLen))
+ result = unpack_timing_info(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_UE_RELEASE_RESPONSE:
+ if (check_unpack_length(NFAPI_UE_RELEASE_RESPONSE, unpackedBufLen))
+ result = unpack_ue_release_resp(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ default:
+
+ if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
+ pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
+ {
+ if(config && config->unpack_p7_vendor_extension)
+ {
+ result = (config->unpack_p7_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
+ }
+ else
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
+ }
+ }
+ else
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
+ }
+ break;
+ }
+
+ if(result == 0)
+ return -1;
+ else
+ return 0;
+}
+
+int nfapi_nr_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t* config)
+{
+ int result = 0;
+ nfapi_p7_message_header_t *pMessageHeader = (nfapi_p7_message_header_t*)pUnpackedBuf;
+ uint8_t *pReadPackedMessage = pMessageBuf;
+ uint8_t *end = pMessageBuf + messageBufLen;
+
+ if (pMessageBuf == NULL || pUnpackedBuf == NULL)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied pointers are null\n");
+ return -1;
+ }
+
+ if (messageBufLen < NFAPI_P7_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p7_message_header_t))
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
+ return -1;
+ }
+ /*
+ uint8_t *ptr = pMessageBuf;
+ printf("\n Read P7 message unpack: ");
+ while(ptr < end){
+ printf(" %d ", *ptr);
+ ptr++;
+ }
+ printf("\n");
+*/
+ // clean the supplied buffer for - tag value blanking
+ (void)memset(pUnpackedBuf, 0, unpackedBufLen);
+
+ // process the header
+ if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
+ pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
+ pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
+ pull16(&pReadPackedMessage, &pMessageHeader->m_segment_sequence, end) &&
+ pull32(&pReadPackedMessage, &pMessageHeader->checksum, end) &&
+ pull32(&pReadPackedMessage, &pMessageHeader->transmit_timestamp, end)))
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack header failed\n");
+ return -1;
+ }
+
+ if((uint8_t*)(pMessageBuf + pMessageHeader->message_length) > end)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack message length is greater than the message buffer \n");
+ return -1;
+ }
+
+ /*
+ if(check_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0)
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack unpack buffer is not large enough \n");
+ return -1;
+ }
+ */
+
+ // look for the specific message
+ switch (pMessageHeader->message_id)
+ {
+ case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
+ if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST, unpackedBufLen))
+ result = unpack_dl_tti_request(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
+ if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST, unpackedBufLen))
+ result = unpack_ul_tti_request(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+ case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
+ if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST, unpackedBufLen))
+ result = unpack_tx_data_request(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+ case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
+ if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST, unpackedBufLen))
+ result = unpack_ul_dci_request(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_UE_RELEASE_REQUEST:
+ if (check_nr_unpack_length(NFAPI_UE_RELEASE_REQUEST, unpackedBufLen))
+ result = unpack_ue_release_request(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_HARQ_INDICATION:
+ if (check_nr_unpack_length(NFAPI_HARQ_INDICATION, unpackedBufLen))
+ result = unpack_harq_indication(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_CRC_INDICATION:
+ if (check_nr_unpack_length(NFAPI_CRC_INDICATION, unpackedBufLen))
+ result = unpack_crc_indication(&pReadPackedMessage,end , pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_RX_ULSCH_INDICATION:
+ if (check_nr_unpack_length(NFAPI_RX_ULSCH_INDICATION, unpackedBufLen))
+ result = unpack_rx_indication(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_RACH_INDICATION:
+ if (check_nr_unpack_length(NFAPI_RACH_INDICATION, unpackedBufLen))
+ result = unpack_rach_indication(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_SRS_INDICATION:
+ if (check_nr_unpack_length(NFAPI_SRS_INDICATION, unpackedBufLen))
+ result = unpack_srs_indication(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_RX_SR_INDICATION:
+ if (check_nr_unpack_length(NFAPI_RX_SR_INDICATION, unpackedBufLen))
+ result = unpack_sr_indication(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_RX_CQI_INDICATION:
+ if (check_nr_unpack_length(NFAPI_RX_CQI_INDICATION, unpackedBufLen))
+ result = unpack_cqi_indication(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_LBT_DL_CONFIG_REQUEST:
+ if (check_nr_unpack_length(NFAPI_LBT_DL_CONFIG_REQUEST, unpackedBufLen))
+ result = unpack_lbt_dl_config_request(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_LBT_DL_INDICATION:
+ if (check_nr_unpack_length(NFAPI_LBT_DL_INDICATION, unpackedBufLen))
+ result = unpack_lbt_dl_indication(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_NB_HARQ_INDICATION:
+ if (check_nr_unpack_length(NFAPI_NB_HARQ_INDICATION, unpackedBufLen))
+ result = unpack_nb_harq_indication(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_NRACH_INDICATION:
+ if (check_nr_unpack_length(NFAPI_NRACH_INDICATION, unpackedBufLen))
+ result = unpack_nrach_indication(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
+ if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC, unpackedBufLen))
+ result = unpack_nr_dl_node_sync(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC:
+ if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC, unpackedBufLen))
+ result = unpack_nr_ul_node_sync(&pReadPackedMessage, end , pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_TIMING_INFO:
+ if (check_nr_unpack_length(NFAPI_TIMING_INFO, unpackedBufLen))
+ result = unpack_nr_timing_info(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ case NFAPI_UE_RELEASE_RESPONSE:
+ if (check_nr_unpack_length(NFAPI_UE_RELEASE_RESPONSE, unpackedBufLen))
+ result = unpack_ue_release_resp(&pReadPackedMessage, end, pMessageHeader, config);
+ else
+ return -1;
+ break;
+
+ default:
+
+ if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
+ pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
+ {
+ if(config && config->unpack_p7_vendor_extension)
+ {
+ result = (config->unpack_p7_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
+ }
+ else
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
+ }
+ }
+ else
+ {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
+ }
+ break;
+ }
+
+ if(result == 0)
+ return -1;
+ else
+ return 0;
+}
+
+
diff --git a/openair1/PHY/CODING/TESTBENCH/ldpctest.c b/openair1/PHY/CODING/TESTBENCH/ldpctest.c
index b42ac6e4c8..e16c909835 100644
--- a/openair1/PHY/CODING/TESTBENCH/ldpctest.c
+++ b/openair1/PHY/CODING/TESTBENCH/ldpctest.c
@@ -144,7 +144,7 @@ int test_ldpc(short No_iteration,
t_nrLDPC_procBuf nrLDPC_procBuf;
t_nrLDPC_procBuf* p_nrLDPC_procBuf = &nrLDPC_procBuf;
- t_nrLDPC_time_stats decoder_profiler;
+ t_nrLDPC_time_stats decoder_profiler = {0};
t_nrLDPC_time_stats* p_decoder_profiler =&decoder_profiler ;
int32_t n_iter = 0;
diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c
index 948bc637d5..bd95d9d79a 100644
--- a/openair1/PHY/INIT/nr_init.c
+++ b/openair1/PHY/INIT/nr_init.c
@@ -142,6 +142,8 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
uint32_t ***pdcch_dmrs = gNB->nr_gold_pdcch_dmrs;
AssertFatal(pdcch_dmrs!=NULL, "NR init: pdcch_dmrs malloc failed\n");
+ gNB->bad_pucch = 0;
+
for (int slot=0; slotslots_per_frame; slot++) {
pdcch_dmrs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *));
AssertFatal(pdcch_dmrs[slot]!=NULL, "NR init: pdcch_dmrs for slot %d - malloc failed\n", slot);
@@ -229,13 +231,15 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
common_vars->rxdata = (int32_t **)malloc16(Prx*sizeof(int32_t*));
common_vars->txdataF = (int32_t **)malloc16(Ptx*sizeof(int32_t*));
common_vars->rxdataF = (int32_t **)malloc16(Prx*sizeof(int32_t*));
+ common_vars->beam_id = (uint8_t **)malloc16(Ptx*sizeof(uint8_t*));
for (i=0;itxdataF[i] = (int32_t*)malloc16_clear(fp->samples_per_frame_wCP*sizeof(int32_t)); // [hna] samples_per_frame without CP
LOG_D(PHY,"[INIT] common_vars->txdataF[%d] = %p (%lu bytes)\n",
i,common_vars->txdataF[i],
fp->samples_per_frame_wCP*sizeof(int32_t));
-
+ common_vars->beam_id[i] = (uint8_t*)malloc16_clear(fp->symbols_per_slot*fp->slots_per_frame*sizeof(uint8_t));
+ memset(common_vars->beam_id[i],255,fp->symbols_per_slot*fp->slots_per_frame);
}
for (i=0;irxdataF[i] = (int32_t*)malloc16_clear(fp->samples_per_frame_wCP*sizeof(int32_t));
@@ -472,7 +476,8 @@ void nr_phy_config_request_sim(PHY_VARS_gNB *gNB,
fp->nr_band = 261;
// fp->threequarter_fs= 0;
}
-
+
+ fp->threequarter_fs = 0;
gNB_config->carrier_config.dl_bandwidth.value = config_bandwidth(mu, N_RB_DL, fp->nr_band);
nr_init_frame_parms(gNB_config, fp);
diff --git a/openair1/PHY/INIT/nr_init_ru.c b/openair1/PHY/INIT/nr_init_ru.c
index 648b820f07..2bd7d90620 100644
--- a/openair1/PHY/INIT/nr_init_ru.c
+++ b/openair1/PHY/INIT/nr_init_ru.c
@@ -125,7 +125,7 @@ int nr_phy_init_RU(RU_t *ru) {
int beam_count = 0;
if (ru->nb_tx>1) {//Enable beamforming when nb_tx > 1
for (p=0;pnb_log_antennas;p++) {
- if ((fp->L_ssb >> (63-p)) & 0x01)//64 bit-map with the MSB @2⁶³ corresponds to SSB ssb_index 0
+ //if ((fp->L_ssb >> (63-p)) & 0x01)//64 bit-map with the MSB @2⁶³ corresponds to SSB ssb_index 0
beam_count++;
}
AssertFatal(ru->nb_bfw==(beam_count*ru->nb_tx),"Number of beam weights from config file is %d while the expected number is %d",ru->nb_bfw,(beam_count*ru->nb_tx));
@@ -133,19 +133,25 @@ int nr_phy_init_RU(RU_t *ru) {
int l_ind = 0;
for (i=0; inb_log_antennas;p++) {
- if ((fp->L_ssb >> (63-p)) & 0x01) {
+ //if ((fp->L_ssb >> (63-p)) & 0x01) {
ru->beam_weights[i][p] = (int32_t **)malloc16_clear(ru->nb_tx*sizeof(int32_t*));
for (j=0; jnb_tx; j++) {
ru->beam_weights[i][p][j] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*sizeof(int32_t));
for (re=0; reofdm_symbol_size; re++)
- ru->beam_weights[i][p][j][re] = ru->bw_list[i][l_ind];
+ ru->beam_weights[i][p][j][re] = ru->bw_list[j][l_ind];
//printf("Beam Weight %08x for beam %d and tx %d\n",ru->bw_list[i][l_ind],p,j);
l_ind++;
} // for j
- } // for p
- }
+ //}
+ } // for p
} //for i
}
+
+ ru->common.beam_id = (uint8_t**)malloc16_clear(ru->nb_tx*sizeof(uint8_t*));
+ for(i=0; i< ru->nb_tx; ++i) {
+ ru->common.beam_id[i] = (uint8_t*)malloc16_clear(fp->symbols_per_slot*fp->slots_per_frame*sizeof(uint8_t));
+ memset(ru->common.beam_id[i],255,fp->symbols_per_slot*fp->slots_per_frame);
+ }
} // !=IF5
ru->common.sync_corr = (uint32_t*)malloc16_clear( LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(uint32_t)*fp->samples_per_subframe_wCP );
diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c
index 3132fb9960..855acc01ff 100644
--- a/openair1/PHY/INIT/nr_init_ue.c
+++ b/openair1/PHY/INIT/nr_init_ue.c
@@ -71,33 +71,39 @@ void phy_init_nr_ue__PDSCH(NR_UE_PDSCH *const pdsch,
pdsch->llr128 = (int16_t **)malloc16_clear( sizeof(int16_t *) );
// FIXME! no further allocation for (int16_t*)pdsch->llr128 !!! expect SIGSEGV
// FK, 11-3-2015: this is only as a temporary pointer, no memory is stored there
- pdsch->rxdataF_ext = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
- pdsch->rxdataF_uespec_pilots = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
- pdsch->rxdataF_comp0 = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
- pdsch->rho = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) );
- pdsch->dl_ch_estimates = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
- pdsch->dl_ch_estimates_ext = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
- pdsch->dl_bf_ch_estimates = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
- pdsch->dl_bf_ch_estimates_ext = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
+ pdsch->rxdataF_ext = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) );
+ pdsch->rxdataF_uespec_pilots = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) );
+ pdsch->rxdataF_comp0 = (int32_t **)malloc16_clear( NR_MAX_NB_LAYERS*fp->nb_antennas_rx*sizeof(int32_t *) );
+ pdsch->rho = (int32_t ***)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t **) );
+ pdsch->dl_ch_estimates = (int32_t **)malloc16_clear( NR_MAX_NB_LAYERS*fp->nb_antennas_rx*sizeof(int32_t *) );
+ pdsch->dl_ch_estimates_ext = (int32_t **)malloc16_clear( NR_MAX_NB_LAYERS*fp->nb_antennas_rx*sizeof(int32_t *) );
+ pdsch->dl_bf_ch_estimates = (int32_t **)malloc16_clear( NR_MAX_NB_LAYERS*fp->nb_antennas_rx*sizeof(int32_t *) );
+ pdsch->dl_bf_ch_estimates_ext = (int32_t **)malloc16_clear( NR_MAX_NB_LAYERS*fp->nb_antennas_rx*sizeof(int32_t *) );
//pdsch->dl_ch_rho_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
//pdsch->dl_ch_rho2_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
- pdsch->dl_ch_mag0 = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
- pdsch->dl_ch_magb0 = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
- pdsch->dl_ch_magr0 = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
- pdsch->ptrs_phase_per_slot = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
- pdsch->ptrs_re_per_slot = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
- pdsch->dl_ch_ptrs_estimates_ext = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
+ pdsch->dl_ch_mag0 = (int32_t **)malloc16_clear( NR_MAX_NB_LAYERS*fp->nb_antennas_rx*sizeof(int32_t *) );
+ pdsch->dl_ch_magb0 = (int32_t **)malloc16_clear( NR_MAX_NB_LAYERS*fp->nb_antennas_rx*sizeof(int32_t *) );
+ pdsch->dl_ch_magr0 = (int32_t **)malloc16_clear( NR_MAX_NB_LAYERS*fp->nb_antennas_rx*sizeof(int32_t *) );
+ pdsch->ptrs_phase_per_slot = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) );
+ pdsch->ptrs_re_per_slot = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) );
+ pdsch->dl_ch_ptrs_estimates_ext = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) );
// the allocated memory size is fixed:
- AssertFatal( fp->nb_antennas_rx <= 2, "nb_antennas_rx > 2" );
+ AssertFatal( fp->nb_antennas_rx <= 4, "nb_antennas_rx > 4" );//Extend the max number of UE Rx antennas to 4
+ const size_t num = 7*2*fp->N_RB_DL*12;
for (int i=0; inb_antennas_rx; i++) {
- pdsch->rho[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*(fp->N_RB_DL*12*7*2) );
+ pdsch->rxdataF_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
+ pdsch->rxdataF_uespec_pilots[i] = (int32_t *)malloc16_clear( sizeof(int32_t) * fp->N_RB_DL*12);
+ pdsch->ptrs_phase_per_slot[i] = (int32_t *)malloc16_clear( sizeof(int32_t) * 14 );
+ pdsch->ptrs_re_per_slot[i] = (int32_t *)malloc16_clear( sizeof(int32_t) * 14);
+ pdsch->dl_ch_ptrs_estimates_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t) * num);
+ pdsch->rho[i] = (int32_t **)malloc16_clear( NR_MAX_NB_LAYERS*NR_MAX_NB_LAYERS*sizeof(int32_t *) );
- for (int j=0; j<4; j++) { //fp->nb_antennas_tx; j++)
- const int idx = (j<<1)+i;
- const size_t num = 7*2*fp->N_RB_DL*12;
- pdsch->rxdataF_ext[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
- pdsch->rxdataF_uespec_pilots[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * fp->N_RB_DL*12);
+ for (int j=0; jnb_antennas_rx)+i;
+ for (int k=0; krho[i][j*NR_MAX_NB_LAYERS+k] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
+ }
pdsch->rxdataF_comp0[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
pdsch->dl_ch_estimates[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * fp->ofdm_symbol_size*7*2);
pdsch->dl_ch_estimates_ext[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
@@ -108,9 +114,6 @@ void phy_init_nr_ue__PDSCH(NR_UE_PDSCH *const pdsch,
pdsch->dl_ch_mag0[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
pdsch->dl_ch_magb0[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
pdsch->dl_ch_magr0[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
- pdsch->ptrs_re_per_slot[idx] = (int32_t *)malloc16_clear(sizeof(int32_t) * 14);
- pdsch->ptrs_phase_per_slot[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * 14 );
- pdsch->dl_ch_ptrs_estimates_ext[idx]= (int32_t *)malloc16_clear( sizeof(int32_t) * num);
}
}
}
@@ -139,16 +142,14 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
uint16_t N_n_scid[2] = {0,1}; // [HOTFIX] This is a temporary implementation of scramblingID0 and scramblingID1 which are given by DMRS-UplinkConfig
int n_scid;
abstraction_flag = 0;
- fp->nb_antennas_tx = 1;
- fp->nb_antennas_rx=1;
// dmrs_UplinkConfig_t *dmrs_Uplink_Config = &ue->pusch_config.dmrs_UplinkConfig;
// ptrs_UplinkConfig_t *ptrs_Uplink_Config = &ue->pusch_config.dmrs_UplinkConfig.ptrs_UplinkConfig;
LOG_I(PHY, "Initializing UE vars (abstraction %u) for gNB TXant %u, UE RXant %u\n", abstraction_flag, fp->nb_antennas_tx, fp->nb_antennas_rx);
- //LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_UE][MOD %02u][]\n", ue->Mod_id+NB_eNB_INST);
+ //LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_UE][MOD %02u][]\n", ue->Mod_id+NB_gNB_INST);
phy_init_nr_top(ue);
// many memory allocation sizes are hard coded
- AssertFatal( fp->nb_antennas_rx <= 2, "hard coded allocation for ue_common_vars->dl_ch_estimates[gNB_id]" );
- AssertFatal(nb_connected_gNB <= NUMBER_OF_CONNECTED_gNB_MAX, "n_connected_gNB is too large" );
+ AssertFatal( fp->nb_antennas_rx <= 4, "hard coded allocation for ue_common_vars->dl_ch_estimates[gNB_id]" );
+ AssertFatal( nb_connected_gNB <= NUMBER_OF_CONNECTED_gNB_MAX, "n_connected_gNB is too large" );
// init phy_vars_ue
for (i=0; i<4; i++) {
@@ -276,7 +277,7 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
}
}
- //PDCCH DMRS init (eNB offset = 0)
+ //PDCCH DMRS init (gNB offset = 0)
ue->nr_gold_pdcch[0] = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **));
uint32_t ***pdcch_dmrs = ue->nr_gold_pdcch[0];
AssertFatal(pdcch_dmrs!=NULL, "NR init: pdcch_dmrs malloc failed\n");
@@ -291,6 +292,9 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
}
}
+ ue->scramblingID_pdcch = fp->Nid_cell;
+ nr_gold_pdcch(ue,fp->Nid_cell);
+
//PDSCH DMRS init (eNB offset = 0)
ue->nr_gold_pdsch[0] = (uint32_t ****)malloc16(fp->slots_per_frame*sizeof(uint32_t ***));
uint32_t ****pdsch_dmrs = ue->nr_gold_pdsch[0];
@@ -310,6 +314,12 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
}
}
+ // initializing the scrambling IDs for PDSCH DMRS
+ for (int i=0; i<2; i++)
+ ue->scramblingID[i]=fp->Nid_cell;
+
+ nr_gold_pdsch(ue,ue->scramblingID);
+
// DLSCH
for (gNB_id = 0; gNB_id < ue->n_connected_gNB; gNB_id++) {
for (th_id=0; th_idpdsch_vars[th_id][gNB_id]->llr_shifts = (uint8_t *)malloc16_clear(7*2*fp->N_RB_DL*12);
- ue->pdsch_vars[th_id][gNB_id]->llr_shifts_p = ue->pdsch_vars[0][gNB_id]->llr_shifts;
- ue->pdsch_vars[th_id][gNB_id]->llr[1] = (int16_t *)malloc16_clear((8*(3*8*8448))*sizeof(int16_t));
- ue->pdsch_vars[th_id][gNB_id]->layer_llr[1] = (int16_t *)malloc16_clear((8*(3*8*8448))*sizeof(int16_t));
- ue->pdsch_vars[th_id][gNB_id]->llr128_2ndstream = (int16_t **)malloc16_clear(sizeof(int16_t *));
- ue->pdsch_vars[th_id][gNB_id]->rho = (int32_t **)malloc16_clear(fp->nb_antennas_rx*sizeof(int32_t *));
+ ue->pdsch_vars[th_id][gNB_id]->llr_shifts = (uint8_t *)malloc16_clear(7*2*fp->N_RB_DL*12);
+ ue->pdsch_vars[th_id][gNB_id]->llr_shifts_p = ue->pdsch_vars[0][gNB_id]->llr_shifts;
+ ue->pdsch_vars[th_id][gNB_id]->llr[1] = (int16_t *)malloc16_clear( (8*(3*8*8448))*sizeof(int16_t) );
+ ue->pdsch_vars[th_id][gNB_id]->layer_llr[1] = (int16_t *)malloc16_clear( (8*(3*8*8448))*sizeof(int16_t) );
+ ue->pdsch_vars[th_id][gNB_id]->llr128_2ndstream = (int16_t **)malloc16_clear( sizeof(int16_t *) );
}
- for (int i=0; inb_antennas_rx; i++) {
- for (th_id=0; th_idpdsch_vars[th_id][gNB_id]->rho[i] = (int32_t *)malloc16_clear(7*2*sizeof(int32_t)*(fp->N_RB_DL*12));
- }
- }
for (th_id=0; th_idpdsch_vars[th_id][gNB_id]->dl_ch_rho2_ext = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
+ ue->pdsch_vars[th_id][gNB_id]->dl_ch_rho2_ext = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
}
for (i=0; inb_antennas_rx; i++)
for (j=0; j<4; j++) {
- const int idx = (j<<1)+i;
+ const int idx = (j*fp->nb_antennas_rx)+i;
const size_t num = 7*2*fp->N_RB_DL*12+4;
for (th_id=0; th_idpdsch_vars[th_id][gNB_id]->dl_ch_rho2_ext[idx] = (int32_t *)malloc16_clear(sizeof(int32_t) * num);
+ ue->pdsch_vars[th_id][gNB_id]->dl_ch_rho2_ext[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
}
}
@@ -361,15 +365,15 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
for (k=0; k<8; k++) { //harq_pid
for (l=0; l<8; l++) { //round
for (th_id=0; th_idpdsch_vars[th_id][gNB_id]->rxdataF_comp1[k][l] = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
- ue->pdsch_vars[th_id][gNB_id]->dl_ch_rho_ext[k][l] = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
- ue->pdsch_vars[th_id][gNB_id]->dl_ch_mag1[k][l] = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
- ue->pdsch_vars[th_id][gNB_id]->dl_ch_magb1[k][l] = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
+ ue->pdsch_vars[th_id][gNB_id]->rxdataF_comp1[k][l] = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
+ ue->pdsch_vars[th_id][gNB_id]->dl_ch_rho_ext[k][l] = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
+ ue->pdsch_vars[th_id][gNB_id]->dl_ch_mag1[k][l] = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
+ ue->pdsch_vars[th_id][gNB_id]->dl_ch_magb1[k][l] = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
}
for (int i=0; inb_antennas_rx; i++)
for (int j=0; j<4; j++) { //frame_parms->nb_antennas_tx; j++)
- const int idx = (j<<1)+i;
+ const int idx = (j*fp->nb_antennas_rx)+i;
for (th_id=0; th_idpdsch_vars[th_id][gNB_id]->dl_ch_rho_ext[k][l][idx] = (int32_t *)malloc16_clear(7*2*sizeof(int32_t)*(fp->N_RB_DL*12));
@@ -383,26 +387,26 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
// 100 PRBs * 12 REs/PRB * 4 PDCCH SYMBOLS * 2 LLRs/RE
for (th_id=0; th_idpdcch_vars[th_id][gNB_id]->llr = (int16_t *)malloc16_clear(2*4*100*12*sizeof(uint16_t));
- ue->pdcch_vars[th_id][gNB_id]->llr16 = (int16_t *)malloc16_clear(2*4*100*12*sizeof(uint16_t));
- ue->pdcch_vars[th_id][gNB_id]->wbar = (int16_t *)malloc16_clear(2*4*100*12*sizeof(uint16_t));
- ue->pdcch_vars[th_id][gNB_id]->e_rx = (int16_t *)malloc16_clear(4*2*100*12 );
- ue->pdcch_vars[th_id][gNB_id]->rxdataF_comp = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
- ue->pdcch_vars[th_id][gNB_id]->dl_ch_rho_ext = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
- ue->pdcch_vars[th_id][gNB_id]->rho = (int32_t **)malloc16(fp->nb_antennas_rx*sizeof(int32_t *));
- ue->pdcch_vars[th_id][gNB_id]->rxdataF_ext = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
- ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates_ext = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
+ ue->pdcch_vars[th_id][gNB_id]->llr = (int16_t *)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
+ ue->pdcch_vars[th_id][gNB_id]->llr16 = (int16_t *)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
+ ue->pdcch_vars[th_id][gNB_id]->wbar = (int16_t *)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
+ ue->pdcch_vars[th_id][gNB_id]->e_rx = (int16_t *)malloc16_clear( 4*2*100*12 );
+ ue->pdcch_vars[th_id][gNB_id]->rxdataF_comp = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
+ ue->pdcch_vars[th_id][gNB_id]->dl_ch_rho_ext = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
+ ue->pdcch_vars[th_id][gNB_id]->rho = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) );
+ ue->pdcch_vars[th_id][gNB_id]->rxdataF_ext = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
+ ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates_ext = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
// Channel estimates
- ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
- ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates_time = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
+ ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates = (int32_t **)malloc16_clear(4*fp->nb_antennas_rx*sizeof(int32_t *));
+ ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates_time = (int32_t **)malloc16_clear(4*fp->nb_antennas_rx*sizeof(int32_t *));
for (i=0; inb_antennas_rx; i++) {
ue->pdcch_vars[th_id][gNB_id]->rho[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*(100*12*4));
for (j=0; j<4; j++) {
- int idx = (j<<1) + i;
- ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates[idx] = (int32_t *)malloc16_clear(sizeof(int32_t)*fp->symbols_per_slot*(fp->ofdm_symbol_size+LTE_CE_FILTER_LENGTH));
- ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates_time[idx] = (int32_t *)malloc16_clear(sizeof(int32_t)*fp->ofdm_symbol_size*2);
+ int idx = (j*fp->nb_antennas_rx)+i;
+ ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates[idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->symbols_per_slot*(fp->ofdm_symbol_size+LTE_CE_FILTER_LENGTH) );
+ ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates_time[idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2 );
// size_t num = 7*2*fp->N_RB_DL*12;
size_t num = 4*273*12; // 4 symbols, 100 PRBs, 12 REs per PRB
ue->pdcch_vars[th_id][gNB_id]->rxdataF_comp[idx] = (int32_t *)malloc16_clear(sizeof(int32_t) * num);
@@ -414,24 +418,24 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
}
// PBCH
- pbch_vars[gNB_id]->rxdataF_ext = (int32_t **)malloc16(fp->nb_antennas_rx*sizeof(int32_t *));
- pbch_vars[gNB_id]->rxdataF_comp = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
- pbch_vars[gNB_id]->dl_ch_estimates = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
- pbch_vars[gNB_id]->dl_ch_estimates_ext = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
- pbch_vars[gNB_id]->dl_ch_estimates_time = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
- pbch_vars[gNB_id]->llr = (int16_t *)malloc16_clear(1920); //
- prach_vars[gNB_id]->prachF = (int16_t *)malloc16_clear(sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)));
- prach_vars[gNB_id]->prach = (int16_t *)malloc16_clear(sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)));
+ pbch_vars[gNB_id]->rxdataF_ext = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) );
+ pbch_vars[gNB_id]->rxdataF_comp = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
+ pbch_vars[gNB_id]->dl_ch_estimates = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
+ pbch_vars[gNB_id]->dl_ch_estimates_ext = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
+ pbch_vars[gNB_id]->dl_ch_estimates_time = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
+ pbch_vars[gNB_id]->llr = (int16_t *)malloc16_clear( 1920 ); //
+ prach_vars[gNB_id]->prachF = (int16_t *)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) );
+ prach_vars[gNB_id]->prach = (int16_t *)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) );
for (i=0; inb_antennas_rx; i++) {
pbch_vars[gNB_id]->rxdataF_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*20*12*4 );
for (j=0; j<4; j++) {//fp->nb_antennas_tx;j++) {
- int idx = (j<<1)+i;
- pbch_vars[gNB_id]->rxdataF_comp[idx] = (int32_t *)malloc16_clear(sizeof(int32_t)*20*12*4);
- pbch_vars[gNB_id]->dl_ch_estimates[idx] = (int32_t *)malloc16_clear(sizeof(int32_t)*7*2*sizeof(int)*(fp->ofdm_symbol_size));
- pbch_vars[gNB_id]->dl_ch_estimates_time[idx] = (int32_t *)malloc16_clear(sizeof(int32_t)*7*2*sizeof(int)*(fp->ofdm_symbol_size));
- pbch_vars[gNB_id]->dl_ch_estimates_ext[idx] = (int32_t *)malloc16_clear(sizeof(int32_t)*20*12*4);
+ int idx = (j*fp->nb_antennas_rx)+i;
+ pbch_vars[gNB_id]->rxdataF_comp[idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*20*12*4 );
+ pbch_vars[gNB_id]->dl_ch_estimates[idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*7*2*sizeof(int)*(fp->ofdm_symbol_size) );
+ pbch_vars[gNB_id]->dl_ch_estimates_time[idx]= (int32_t *)malloc16_clear( sizeof(int32_t)*7*2*sizeof(int)*(fp->ofdm_symbol_size) );
+ pbch_vars[gNB_id]->dl_ch_estimates_ext[idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*20*12*4 );
}
}
}
diff --git a/openair1/PHY/INIT/nr_parms.c b/openair1/PHY/INIT/nr_parms.c
index bacc671adc..b11e342ab1 100644
--- a/openair1/PHY/INIT/nr_parms.c
+++ b/openair1/PHY/INIT/nr_parms.c
@@ -204,9 +204,9 @@ int nr_init_frame_parms(nfapi_nr_config_request_scf_t* cfg,
fp->slots_per_frame = 10* fp->slots_per_subframe;
- fp->nb_antenna_ports_gNB = cfg->carrier_config.num_tx_ant.value;// It corresponds to pdsch_AntennaPorts
+ fp->nb_antenna_ports_gNB = 1; // It corresponds to the number of common antenna ports
fp->nb_antennas_rx = cfg->carrier_config.num_rx_ant.value; // It denotes the number of rx antennas at gNB
- fp->nb_antennas_tx = 1; // It corresponds to the number of UE Tx antennas
+ fp->nb_antennas_tx = cfg->carrier_config.num_tx_ant.value; // It corresponds to pdsch_AntennaPorts
fp->symbols_per_slot = ((Ncp == NORMAL)? 14 : 12); // to redefine for different slot formats
fp->samples_per_subframe_wCP = fp->ofdm_symbol_size * fp->symbols_per_slot * fp->slots_per_subframe;
@@ -254,6 +254,11 @@ int nr_init_frame_parms_ue(NR_DL_FRAME_PARMS *fp,
uint8_t Nid_cell = 0;
int Ncp = NORMAL;
+ if(fp->nb_antennas_rx == 0)
+ fp->nb_antennas_rx = 1;
+ if(fp->nb_antennas_tx == 0)
+ fp->nb_antennas_tx = 1;
+
// default values until overwritten by RRCConnectionReconfiguration
fp->nb_antenna_ports_gNB = nb_ant_ports_gNB;
fp->tdd_config = tdd_cfg;
diff --git a/openair1/PHY/MODULATION/beamforming.c b/openair1/PHY/MODULATION/beamforming.c
index b1f419b172..4405c46abf 100644
--- a/openair1/PHY/MODULATION/beamforming.c
+++ b/openair1/PHY/MODULATION/beamforming.c
@@ -145,7 +145,8 @@ int nr_beam_precoding(int32_t **txdataF,
int slot,
int symbol,
int aa,
- int nb_antenna_ports)
+ int nb_antenna_ports,
+ int offset)
{
@@ -155,14 +156,14 @@ int nr_beam_precoding(int32_t **txdataF,
memset(&txdataF_BF[aa][symbol*frame_parms->ofdm_symbol_size],0,sizeof(int32_t)*(frame_parms->ofdm_symbol_size));
for (p=0; pL_ssb >> (63-p)) & 0x01) {
- multadd_cpx_vector((int16_t*)&txdataF[p][symbol*frame_parms->ofdm_symbol_size],
+ //if ((frame_parms->L_ssb >> (63-p)) & 0x01) {
+ multadd_cpx_vector((int16_t*)&txdataF[p][(symbol*frame_parms->ofdm_symbol_size)+offset],
(int16_t*)beam_weights[p][aa],
(int16_t*)&txdataF_BF[aa][symbol*frame_parms->ofdm_symbol_size],
0,
frame_parms->ofdm_symbol_size,
15);
- }
+ //}
}
return 0;
}
diff --git a/openair1/PHY/MODULATION/nr_modulation.c b/openair1/PHY/MODULATION/nr_modulation.c
index f12dcfc01b..e32f6bf575 100644
--- a/openair1/PHY/MODULATION/nr_modulation.c
+++ b/openair1/PHY/MODULATION/nr_modulation.c
@@ -22,6 +22,101 @@
#include "nr_modulation.h"
#include "PHY/NR_REFSIG/nr_mod_table.h"
+//Table 6.3.1.5-1 Precoding Matrix W 1 layer 2 antenna ports 'n' = -1 and 'o' = -j
+char nr_W_1l_2p[6][2][1] = {
+ {{'1'}, {'0'}},//pmi 0
+ {{'0'}, {'1'}},
+ {{'1'}, {'1'}},
+ {{'1'}, {'n'}},
+ {{'1'}, {'j'}},
+ {{'1'}, {'o'}}//pmi 5
+};
+
+//Table 6.3.1.5-3 Precoding Matrix W 1 layer 4 antenna ports 'n' = -1 and 'o' = -j
+char nr_W_1l_4p[28][4][1] = {
+ {{'1'}, {'0'}, {'0'}, {'0'}},//pmi 0
+ {{'0'}, {'1'}, {'0'}, {'0'}},
+ {{'0'}, {'0'}, {'1'}, {'0'}},
+ {{'0'}, {'0'}, {'0'}, {'1'}},
+ {{'1'}, {'0'}, {'1'}, {'0'}},
+ {{'1'}, {'0'}, {'n'}, {'0'}},
+ {{'1'}, {'0'}, {'j'}, {'0'}},
+ {{'1'}, {'0'}, {'o'}, {'0'}},//pmi 7
+ {{'0'}, {'1'}, {'0'}, {'1'}},//pmi 8
+ {{'0'}, {'1'}, {'0'}, {'n'}},
+ {{'0'}, {'1'}, {'0'}, {'j'}},
+ {{'0'}, {'1'}, {'0'}, {'o'}},
+ {{'1'}, {'1'}, {'1'}, {'1'}},
+ {{'1'}, {'1'}, {'j'}, {'j'}},
+ {{'1'}, {'1'}, {'n'}, {'n'}},
+ {{'1'}, {'1'}, {'o'}, {'o'}},
+ {{'1'}, {'j'}, {'1'}, {'j'}},//pmi 16
+ {{'1'}, {'j'}, {'j'}, {'n'}},
+ {{'1'}, {'j'}, {'n'}, {'o'}},
+ {{'1'}, {'j'}, {'o'}, {'1'}},
+ {{'1'}, {'n'}, {'1'}, {'n'}},
+ {{'1'}, {'n'}, {'j'}, {'o'}},
+ {{'1'}, {'n'}, {'n'}, {'1'}},
+ {{'1'}, {'n'}, {'o'}, {'j'}},//pmi 23
+ {{'1'}, {'o'}, {'1'}, {'o'}},//pmi 24
+ {{'1'}, {'o'}, {'j'}, {'1'}},
+ {{'1'}, {'o'}, {'n'}, {'j'}},
+ {{'1'}, {'o'}, {'o'}, {'n'}}//pmi 27
+};
+
+//Table 6.3.1.5-4 Precoding Matrix W 2 antenna ports layers 2 'n' = -1 and 'o' = -j
+char nr_W_2l_2p[3][2][2] = {
+ {{'1', '0'}, {'0', '1'}},//pmi 0
+ {{'1', '1'}, {'1', 'n'}},
+ {{'1', '1'}, {'j', 'o'}} //pmi 2
+};
+
+//Table 6.3.1.5-5 Precoding Matrix W 2 layers 4 antenna ports 'n' = -1 and 'o' = -j
+char nr_W_2l_4p[22][4][2] = {
+ {{'1', '0'}, {'0', '1'}, {'0', '0'}, {'0', '0'}},//pmi 0
+ {{'1', '0'}, {'0', '0'}, {'0', '1'}, {'0', '0'}},
+ {{'1', '0'}, {'0', '0'}, {'0', '0'}, {'0', '1'}},
+ {{'0', '0'}, {'1', '0'}, {'0', '1'}, {'0', '0'}},//pmi 3
+ {{'0', '0'}, {'1', '0'}, {'0', '0'}, {'0', '1'}},//pmi 4
+ {{'0', '0'}, {'0', '0'}, {'1', '0'}, {'0', '1'}},
+ {{'1', '0'}, {'0', '1'}, {'1', '0'}, {'0', 'o'}},
+ {{'1', '0'}, {'0', '1'}, {'1', '0'}, {'0', 'j'}},
+ {{'1', '0'}, {'0', '1'}, {'o', '0'}, {'0', '1'}},//pmi 8
+ {{'1', '0'}, {'0', '1'}, {'o', '0'}, {'0', 'n'}},
+ {{'1', '0'}, {'0', '1'}, {'n', '0'}, {'0', 'o'}},
+ {{'1', '0'}, {'0', '1'}, {'n', '0'}, {'0', 'j'}},//pmi 11
+ {{'1', '0'}, {'0', '1'}, {'j', '0'}, {'0', '1'}},//pmi 12
+ {{'1', '0'}, {'0', '1'}, {'j', '0'}, {'0', 'n'}},
+ {{'1', '1'}, {'1', '1'}, {'1', 'n'}, {'1', 'n'}},
+ {{'1', '1'}, {'1', '1'}, {'j', 'o'}, {'j', 'o'}},//pmi 15
+ {{'1', '1'}, {'j', 'j'}, {'1', 'n'}, {'j', 'o'}},//pmi 16
+ {{'1', '1'}, {'j', 'j'}, {'j', 'o'}, {'n', '1'}},
+ {{'1', '1'}, {'n', 'n'}, {'1', 'n'}, {'n', '1'}},
+ {{'1', '1'}, {'n', 'n'}, {'j', 'o'}, {'o', 'j'}},//pmi 19
+ {{'1', '1'}, {'o', 'o'}, {'1', 'n'}, {'o', 'j'}},
+ {{'1', '1'}, {'o', 'o'}, {'j', 'o'}, {'1', 'n'}}//pmi 21
+};
+
+//Table 6.3.1.5-6 Precoding Matrix W 3 layers 4 antenna ports 'n' = -1 and 'o' = -j
+char nr_W_3l_4p[7][4][3] = {
+ {{'1', '0', '0'}, {'0', '1', '0'}, {'0', '0', '1'},{'0', '0', '0'}},//pmi 0
+ {{'1', '0', '0'}, {'0', '1', '0'}, {'1', '0', '0'},{'0', '0', '1'}},
+ {{'1', '0', '0'}, {'0', '1', '0'}, {'n', '0', '0'},{'0', '0', '1'}},
+ {{'1', '1', '1'}, {'1', 'n', '1'}, {'1', '1', 'n'},{'1', 'n', 'n'}},//pmi 3
+ {{'1', '1', '1'}, {'1', 'n', '1'}, {'j', 'j', 'o'},{'j', 'o', 'o'}},//pmi 4
+ {{'1', '1', '1'}, {'n', '1', 'n'}, {'1', '1', 'n'},{'n', '1', '1'}},
+ {{'1', '1', '1'}, {'n', '1', 'n'}, {'j', 'j', 'o'},{'o', 'j', 'j'}}
+};
+
+//Table 6.3.1.5-7 Precoding Matrix W 4 layers 4 antenna ports 'n' = -1 and 'o' = -j
+char nr_W_4l_4p[5][4][4] = {
+ {{'1', '0', '0', '0'}, {'0', '1', '0', '0'}, {'0', '0', '1', '0'}, {'0', '0', '0', '1'}},//pmi 0
+ {{'1', '1', '0', '0'}, {'0', '0', '1', '1'}, {'1', 'n', '0', '0'}, {'0', '0', '1', 'n'}},
+ {{'1', '1', '0', '0'}, {'0', '0', '1', '1'}, {'j', 'o', '0', '0'}, {'0', '0', 'j', 'o'}},
+ {{'1', '1', '1', '1'}, {'1', 'n', '1', 'n'}, {'1', '1', 'n', 'n'}, {'1', 'n', 'n', '1'}},//pmi 3
+ {{'1', '1', '1', '1'}, {'1', 'n', '1', 'n'}, {'j', 'j', 'o', 'o'}, {'j', 'o', 'o', 'j'}}//pmi 4
+};
+
void nr_modulation(uint32_t *in,
uint32_t length,
uint16_t mod_order,
@@ -37,7 +132,7 @@ void nr_modulation(uint32_t *in,
uint32_t i,j;
uint32_t bit_cnt;
uint64_t x,x1,x2;
-
+
#if defined(__SSE2__)
__m128i *nr_mod_table128;
__m128i *out128;
@@ -56,7 +151,7 @@ void nr_modulation(uint32_t *in,
// the bits that are left out
i = i*8/2;
nr_mod_table32 = (int32_t*) nr_qpsk_mod_table;
- while (i>((i*2)&0x7)) & mask);
out32[i] = nr_mod_table32[idx];
i++;
@@ -78,7 +173,7 @@ void nr_modulation(uint32_t *in,
out64[i] = nr_16qam_byte_mod_table[in_bytes[i]];
// the bits that are left out
i = i*8/4;
- while (i>((i*4)&0x7)) & mask);
out32[i] = nr_16qam_mod_table[idx];
i++;
@@ -88,7 +183,7 @@ void nr_modulation(uint32_t *in,
case 6:
j = 0;
for (i=0; i>12)&4095;
@@ -140,7 +235,7 @@ void nr_modulation(uint32_t *in,
bit_cnt += 24;
}
return;
-
+
case 8:
nr_mod_table32 = (int32_t*) nr_256qam_mod_table;
for (i=0; i>1; i++)
@@ -186,8 +281,8 @@ void nr_layer_mapping(int16_t **mod_symbs,
for (int l=2; l<5; l++) {
tx_layers[l][i<<1] = mod_symbs[1][(3*i+l)<<1];
tx_layers[l][(i<<1)+1] = mod_symbs[1][((3*i+l)<<1)+1];
- }
- break;
+ }
+ break;
case 6:
for (int q=0; q<2; q++)
@@ -196,7 +291,7 @@ void nr_layer_mapping(int16_t **mod_symbs,
tx_layers[l][i<<1] = mod_symbs[q][(3*i+l)<<1];
tx_layers[l][(i<<1)+1] = mod_symbs[q][((3*i+l)<<1)+1];
}
- break;
+ break;
case 7:
for (int i=0; id_mod;
- for (int i=0; i>15;
tx_layers[0][(i<<1)+1] = (mod_symbs[(i<<1)+1]*AMP)>>15;
}
- break;
+ break;
case 2:
case 3:
case 4:
mod_symbs = (int16_t *)ulsch_ue[0]->d_mod;
- for (int i=0; i>15;
tx_layers[l][(i<<1)+1] = (mod_symbs[((n_layers*i+l)<<1)+1]*AMP)>>15;
}
}
- break;
+ break;
case 5:
mod_symbs = (int16_t *)ulsch_ue[0]->d_mod;
@@ -271,11 +366,10 @@ void nr_ue_layer_mapping(NR_UE_ULSCH_t **ulsch_ue,
tx_layers[l][i<<1] = (mod_symbs[(3*i+l)<<1]*AMP)>>15;
tx_layers[l][(i<<1)+1] = (mod_symbs[((3*i+l)<<1)+1]*AMP)>>15;
}
- break;
+ break;
case 6:
- for (int q=0; q<2; q++){
-
+ for (int q=0; q<2; q++) {
mod_symbs = (int16_t *)ulsch_ue[q]->d_mod;
for (int i=0; i>15;
}
}
- break;
+ break;
case 7:
mod_symbs = (int16_t *)ulsch_ue[1]->d_mod;
@@ -302,11 +396,10 @@ void nr_ue_layer_mapping(NR_UE_ULSCH_t **ulsch_ue,
tx_layers[l][i<<1] = (mod_symbs[((i<<2)+l)<<1]*AMP)>>15;
tx_layers[l][(i<<1)+1] = (mod_symbs[(((i<<2)+l)<<1)+1]*AMP)>>15;
}
- break;
+ break;
case 8:
- for (int q=0; q<2; q++){
-
+ for (int q=0; q<2; q++) {
mod_symbs = (int16_t *)ulsch_ue[q]->d_mod;
for (int i=0; i>2; i++)
@@ -315,10 +408,10 @@ void nr_ue_layer_mapping(NR_UE_ULSCH_t **ulsch_ue,
tx_layers[l][(i<<1)+1] = (mod_symbs[(((i<<2)+l)<<1)+1]*AMP)>>15;
}
}
- break;
+ break;
- default:
- AssertFatal(0, "Invalid number of layers %d\n", n_layers);
+ default:
+ AssertFatal(0, "Invalid number of layers %d\n", n_layers);
}
}
@@ -651,3 +744,43 @@ void init_symbol_rotation(NR_DL_FRAME_PARMS *fp) {
}
}
}
+
+int nr_layer_precoder(int16_t **datatx_F_precoding, char *prec_matrix, uint8_t n_layers, int32_t re_offset)
+{
+ int32_t precodatatx_F = 0;
+
+ for (int al = 0; al>15);
+ ((int16_t *)precodatatx_F)[1] = (int16_t)((((int16_t *)precodatatx_F)[1]*ONE_OVER_SQRT2_Q15)>>15);*/
+}
diff --git a/openair1/PHY/MODULATION/nr_modulation.h b/openair1/PHY/MODULATION/nr_modulation.h
index 841073a1af..547d20952f 100644
--- a/openair1/PHY/MODULATION/nr_modulation.h
+++ b/openair1/PHY/MODULATION/nr_modulation.h
@@ -28,7 +28,13 @@
#include "PHY/NR_UE_TRANSPORT/nr_transport_ue.h"
#define DMRS_MOD_ORDER 2
-
+/*Precoding matices: W[pmi][antenna_port][layer]*/
+extern char nr_W_1l_2p[6][2][1];
+extern char nr_W_2l_2p[3][2][2];
+extern char nr_W_1l_4p[28][4][1];
+extern char nr_W_2l_4p[22][4][2];
+extern char nr_W_3l_4p[7][4][3];
+extern char nr_W_4l_4p[5][4][4];
/*! \brief Perform NR modulation. TS 38.211 V15.4.0 subclause 5.1
@param[in] in, Pointer to input bits
@param[in] length, size of input bits
@@ -98,7 +104,8 @@ int nr_beam_precoding(int32_t **txdataF,
int slot,
int symbol,
int aa,
- int nb_antenna_ports
+ int nb_antenna_ports,
+ int offset
);
void apply_nr_rotation(NR_DL_FRAME_PARMS *fp,
@@ -116,4 +123,14 @@ void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms,
int first_symbol,
int nsymb,
int length);
+
+/*! \brief Perform NR precoding. TS 38.211 V15.4.0 subclause 6.3.1.5
+ @param[in] datatx_F_precoding, Pointer to n_layers*re data array
+ @param[in] prec_matrix, Pointer to precoding matrix
+ @param[in] n_layers, number of DLSCH layers
+*/
+int nr_layer_precoder(int16_t **datatx_F_precoding,
+ char *prec_matrix,
+ uint8_t n_layers,
+ int32_t re_offset);
#endif
diff --git a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
index a54aec7bc2..d3e33a91a8 100644
--- a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
+++ b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
@@ -20,12 +20,12 @@
*/
/*! \file PHY/NR_ESTIMATION/nr_measurements_gNB.c
-* \brief TA estimation for TA updates
-* \author Ahmed Hussein
+* \brief gNB measurement routines
+* \author Ahmed Hussein, G. Casati, K. Saaifan
* \date 2019
* \version 0.1
* \company Fraunhofer IIS
-* \email: ahmed.hussein@iis.fraunhofer.de
+* \email: ahmed.hussein@iis.fraunhofer.de, guido.casati@iis.fraunhofer.de, khodr.saaifan@iis.fraunhofer.de
* \note
* \warning
*/
@@ -35,6 +35,8 @@
#include "PHY/phy_extern.h"
#include "nr_ul_estimation.h"
+extern openair0_config_t openair0_cfg[MAX_CARDS];
+
int nr_est_timing_advance_pusch(PHY_VARS_gNB* gNB, int UE_id)
{
int i, aa, max_pos = 0, max_val = 0;
@@ -73,14 +75,17 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB) {
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
NR_gNB_COMMON *common_vars = &gNB->common_vars;
PHY_MEASUREMENTS_gNB *measurements = &gNB->measurements;
+ NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
+ double rx_gain = openair0_cfg[0].rx_gain[0];
+ double rx_gain_offset = openair0_cfg[0].rx_gain_offset[0];
uint32_t *rb_mask = gNB->rb_mask_ul;
int symbol = gNB->ulmask_symb;
int rb, offset, nb_rb;
- uint32_t n0_power_tot, n0_subband_power_temp=0;
+ uint32_t n0_subband_power_temp = 0;
int32_t *ul_ch;
if (symbol>-1) {
- n0_power_tot = 0;
+ measurements->n0_power_tot = 0;
for (int aarx=0; aarxnb_antennas_rx; aarx++) {
nb_rb = 0;
for (rb=0; rbN_RB_UL; rb++) {
@@ -93,11 +98,76 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB) {
n0_subband_power_temp += signal_energy_nodc(ul_ch,12);
}
}
- measurements->n0_power[aarx] = n0_subband_power_temp/nb_rb;
- measurements->n0_power_dB[aarx] = dB_fixed(measurements->n0_power[aarx]);
- n0_power_tot += measurements->n0_power[aarx];
+
+ if (nb_rb != 0) {
+ measurements->n0_power[aarx] = n0_subband_power_temp/nb_rb;
+ measurements->n0_power_dB[aarx] = dB_fixed(measurements->n0_power[aarx]);
+ measurements->n0_power_tot += measurements->n0_power[aarx];
+ }
+
}
- measurements->n0_power_tot_dB = dB_fixed(n0_power_tot);
+
+ measurements->n0_power_tot_dB = dB_fixed(measurements->n0_power_tot);
+ measurements->n0_power_tot_dBm = measurements->n0_power_tot_dB + 30 - 10 * log10(pow(2, 30)) - (rx_gain - rx_gain_offset) - dB_fixed(fp->ofdm_symbol_size);
+
+ LOG_D(PHY, "In %s: tot n0 power %d dBm for %d RBs (tot N0 power = %d)\n", __FUNCTION__, measurements->n0_power_tot_dBm, nb_rb, measurements->n0_power_tot);
+
}
}
+// Scope: This function computes the UL SNR from the UL channel estimates
+//
+// Todo:
+// - averaging IIR filter for RX power and noise
+void nr_gnb_measurements(PHY_VARS_gNB *gNB, uint8_t ulsch_id, unsigned char harq_pid, unsigned char symbol){
+
+ int rx_power_tot[NUMBER_OF_NR_ULSCH_MAX];
+ int rx_power[NUMBER_OF_NR_ULSCH_MAX][NB_ANTENNAS_RX];
+ unsigned short rx_power_avg_dB[NUMBER_OF_NR_ULSCH_MAX];
+ unsigned short rx_power_tot_dB[NUMBER_OF_NR_ULSCH_MAX];
+
+ double rx_gain = openair0_cfg[0].rx_gain[0];
+ double rx_gain_offset = openair0_cfg[0].rx_gain_offset[0];
+ PHY_MEASUREMENTS_gNB *meas = &gNB->measurements;
+ NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
+ int ch_offset = fp->ofdm_symbol_size * symbol;
+ int N_RB_UL = gNB->ulsch[ulsch_id][0]->harq_processes[harq_pid]->ulsch_pdu.rb_size;
+
+ rx_power_tot[ulsch_id] = 0;
+
+ for (int aarx = 0; aarx < fp->nb_antennas_rx; aarx++){
+
+ rx_power[ulsch_id][aarx] = 0;
+
+ for (int aatx = 0; aatx < fp->nb_antennas_tx; aatx++){
+
+ meas->rx_spatial_power[ulsch_id][aatx][aarx] = (signal_energy_nodc(&gNB->pusch_vars[ulsch_id]->ul_ch_estimates[aarx][ch_offset], N_RB_UL * NR_NB_SC_PER_RB));
+
+ if (meas->rx_spatial_power[ulsch_id][aatx][aarx] < 0) {
+ meas->rx_spatial_power[ulsch_id][aatx][aarx] = 0;
+ }
+
+ meas->rx_spatial_power_dB[ulsch_id][aatx][aarx] = (unsigned short) dB_fixed(meas->rx_spatial_power[ulsch_id][aatx][aarx]);
+ rx_power[ulsch_id][aarx] += meas->rx_spatial_power[ulsch_id][aatx][aarx];
+
+ }
+
+ rx_power_tot[ulsch_id] += rx_power[ulsch_id][aarx];
+
+ }
+
+ rx_power_tot_dB[ulsch_id] = (unsigned short) dB_fixed(rx_power_tot[ulsch_id]);
+ rx_power_avg_dB[ulsch_id] = rx_power_tot_dB[ulsch_id];
+
+ meas->wideband_cqi_tot[ulsch_id] = dB_fixed2(rx_power_tot[ulsch_id], meas->n0_power_tot);
+ meas->rx_rssi_dBm[ulsch_id] = rx_power_avg_dB[ulsch_id] + 30 - 10 * log10(pow(2, 30)) - (rx_gain - rx_gain_offset) - dB_fixed(fp->ofdm_symbol_size);
+
+ LOG_D(PHY, "[ULSCH %d] RSSI %d dBm/RE, RSSI (digital) %d dB (N_RB_UL %d), WBand CQI tot %d dB, N0 Power tot %d\n",
+ ulsch_id,
+ meas->rx_rssi_dBm[ulsch_id],
+ rx_power_avg_dB[ulsch_id],
+ N_RB_UL,
+ meas->wideband_cqi_tot[ulsch_id],
+ meas->n0_power_tot);
+
+}
diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
index 10ac23bef0..967868f803 100644
--- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
+++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
@@ -73,7 +73,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
symbol_offset = gNB->frame_parms.ofdm_symbol_size*symbol;
k = bwp_start_subcarrier;
- int re_offset = k;
+ int re_offset;
uint16_t nb_rb_pusch = pusch_pdu->rb_size;
@@ -170,6 +170,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
pil = (int16_t *)&pilot[0];
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+nushift)];
ul_ch = (int16_t *)&ul_ch_estimates[aarx][ch_offset];
+ re_offset = k;
memset(ul_ch,0,4*(gNB->frame_parms.ofdm_symbol_size));
diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h
index a463e21839..7bd004a4d4 100644
--- a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h
+++ b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h
@@ -49,8 +49,9 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
void gNB_I0_measurements(PHY_VARS_gNB *gNB);
-int nr_est_timing_advance_pusch(PHY_VARS_gNB* phy_vars_gNB, int UE_id);
+void nr_gnb_measurements(PHY_VARS_gNB *gNB, uint8_t ulsch_id, unsigned char harq_pid, unsigned char symbol);
+int nr_est_timing_advance_pusch(PHY_VARS_gNB* phy_vars_gNB, int UE_id);
void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
NR_DL_FRAME_PARMS *frame_parms,
diff --git a/openair1/PHY/NR_REFSIG/nr_gold_ue.c b/openair1/PHY/NR_REFSIG/nr_gold_ue.c
index eefa6270ab..623b86edfb 100644
--- a/openair1/PHY/NR_REFSIG/nr_gold_ue.c
+++ b/openair1/PHY/NR_REFSIG/nr_gold_ue.c
@@ -52,22 +52,15 @@ void nr_gold_pbch(PHY_VARS_NR_UE* ue)
}
void nr_gold_pdcch(PHY_VARS_NR_UE* ue,
- unsigned short n_idDMRS,
- unsigned short length_dmrs)
+ unsigned short nid)
{
unsigned char ns,l;
unsigned int n,x1,x2,x2tmp0;
- unsigned int nid;
uint8_t reset;
- if (n_idDMRS)
- nid = n_idDMRS;
- else
- nid = ue->frame_parms.Nid_cell;
-
for (ns=0; nsframe_parms.slots_per_frame; ns++) {
- for (l=0; lframe_parms.symbols_per_slot; l++) {
reset = 1;
x2tmp0 = ((ue->frame_parms.symbols_per_slot*ns+l+1)*((nid<<1)+1))<<17;
@@ -82,11 +75,10 @@ void nr_gold_pdcch(PHY_VARS_NR_UE* ue,
}
void nr_gold_pdsch(PHY_VARS_NR_UE* ue,
- unsigned char ns,
unsigned short *n_idDMRS)
{
unsigned char l;
- unsigned int n,x1,x2,x2tmp0;
+ unsigned int n,x1,x2,x2tmp0,ns;
int nscid;
unsigned int nid;
uint8_t reset;
@@ -95,23 +87,21 @@ void nr_gold_pdsch(PHY_VARS_NR_UE* ue,
//unsigned short lbar = 0;
for (nscid=0; nscid<2; nscid++) {
- if (n_idDMRS)
+ for (ns=0; nsframe_parms.slots_per_frame; ns++) {
+
nid = n_idDMRS[nscid];
- else
- nid = ue->frame_parms.Nid_cell;
- //printf("gold pdsch nid %d lbar %d\n",nid,lbar);
+ for (l=0; lframe_parms.symbols_per_slot; l++) {
- for (l=0; lframe_parms.symbols_per_slot; l++) {
+ reset = 1;
+ x2tmp0 = ((ue->frame_parms.symbols_per_slot*ns+l+1)*((nid<<1)+1))<<17;
+ x2 = (x2tmp0+(nid<<1)+nscid)%(1<<31); //cinit
+ LOG_D(PHY,"UE DMRS slot %d, symb %d, x2 %x, nscid %d\n",ns,l,x2,nscid);
- reset = 1;
- x2tmp0 = ((ue->frame_parms.symbols_per_slot*ns+l+1)*((nid<<1)+1))<<17;
- x2 = (x2tmp0+(nid<<1)+nscid)%(1<<31); //cinit
- LOG_D(PHY,"UE DMRS slot %d, symb %d, x2 %x, nscid %d\n",ns,l,x2,nscid);
-
- for (n=0; nnr_gold_pdsch[0][ns][l][nscid][n] = lte_gold_generic(&x1, &x2, reset);
- reset = 0;
+ for (n=0; nnr_gold_pdsch[0][ns][l][nscid][n] = lte_gold_generic(&x1, &x2, reset);
+ reset = 0;
+ }
}
}
}
diff --git a/openair1/PHY/NR_REFSIG/refsig_defs_ue.h b/openair1/PHY/NR_REFSIG/refsig_defs_ue.h
index 83b43c54a0..54279a8ad5 100644
--- a/openair1/PHY/NR_REFSIG/refsig_defs_ue.h
+++ b/openair1/PHY/NR_REFSIG/refsig_defs_ue.h
@@ -57,11 +57,9 @@ int nr_pdsch_dmrs_rx(PHY_VARS_NR_UE *ue,
void nr_gold_pbch(PHY_VARS_NR_UE* ue);
void nr_gold_pdcch(PHY_VARS_NR_UE* ue,
- unsigned short n_idDMRS,
- unsigned short length_dmrs);
+ unsigned short n_idDMRS);
void nr_gold_pdsch(PHY_VARS_NR_UE* ue,
- unsigned char ns,
unsigned short *n_idDMRS);
void nr_init_pusch_dmrs(PHY_VARS_NR_UE* ue,
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci.c b/openair1/PHY/NR_TRANSPORT/nr_dci.c
index 469415908f..7b0a0150d3 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dci.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dci.c
@@ -228,6 +228,7 @@ void nr_generate_dci(PHY_VARS_gNB *gNB,
printf("PDCCH: l %d position %d => (%d,%d)\n",l,k,((int16_t *)txdataF)[(l*frame_parms.ofdm_symbol_size + k)<<1],
((int16_t *)txdataF)[((l*frame_parms.ofdm_symbol_size + k)<<1)+1]);
#endif
+
dci_idx++;
}
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
index 66fc987f6d..35c4698761 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
@@ -141,6 +141,7 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
uint32_t scrambled_output[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>5];
int16_t **mod_symbs = (int16_t**)dlsch->mod_symbs;
int16_t **tx_layers = (int16_t**)dlsch->txdataF;
+ int16_t **txdataF_precoding = (int16_t**)dlsch->txdataF_precoding;
int8_t Wf[2], Wt[2], l0, l_prime, l_overline, delta;
uint8_t dmrs_Type = rel15->dmrsConfigType;
int nb_re_dmrs;
@@ -264,9 +265,6 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
}
#endif
- /// Antenna port mapping
- //to be moved to init phase potentially, for now tx_layers 1-8 are mapped on antenna ports 1000-1007
-
/// DMRS QPSK modulation
for (int l=rel15->StartSymbolIndex; lStartSymbolIndex+rel15->NrOfSymbols; l++) {
if (rel15->dlDmrsSymbPos & (1 << l)) {
@@ -290,7 +288,9 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
uint16_t start_sc = frame_parms->first_carrier_offset + (rel15->rbStart+rel15->BWPStart)*NR_NB_SC_PER_RB;
if (start_sc >= frame_parms->ofdm_symbol_size)
start_sc -= frame_parms->ofdm_symbol_size;
-
+
+ int txdataF_offset = (slot%2)*frame_parms->samples_per_slot_wCP;
+
#ifdef DEBUG_DLSCH_MAPPING
printf("PDSCH resource mapping started (start SC %d\tstart symbol %d\tN_PRB %d\tnb_re %d,nb_layers %d)\n",
start_sc, rel15->StartSymbolIndex, rel15->rbSize, nb_re,rel15->nrOfLayers);
@@ -311,9 +311,7 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
1+dmrs_Type,ap, Wt[0], Wt[1], Wf[0], Wf[1], delta, l_prime, l0, dmrs_symbol);
#endif
- uint16_t m=0, dmrs_idx=0, k=0;
-
- int txdataF_offset = (slot%2)*frame_parms->samples_per_slot_wCP;
+ uint16_t m=0, dmrs_idx=0;
// Loop Over OFDM symbols:
for (int l=rel15->StartSymbolIndex; lStartSymbolIndex+rel15->NrOfSymbols; l++) {
@@ -347,7 +345,7 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
nr_modulation(pdsch_dmrs[l][0], (n_ptrs<<1), DMRS_MOD_ORDER, mod_ptrs);
}
}
- k = start_sc;
+ uint16_t k = start_sc;
// Loop Over SCs:
for (int i=0; irbSize*NR_NB_SC_PER_RB; i++) {
/* check if cuurent RE is PTRS RE*/
@@ -367,12 +365,12 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
/* Map DMRS Symbol */
if ( ( dmrs_symbol_map & (1 << l) ) && (k == ((start_sc+get_dmrs_freq_idx(n, k_prime, delta, dmrs_Type))%(frame_parms->ofdm_symbol_size)))) {
- ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (Wt[l_prime]*Wf[k_prime]*amp*mod_dmrs[l][dmrs_idx<<1]) >> 15;
- ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (Wt[l_prime]*Wf[k_prime]*amp*mod_dmrs[l][(dmrs_idx<<1) + 1]) >> 15;
+ txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (Wt[l_prime]*Wf[k_prime]*amp*mod_dmrs[l][dmrs_idx<<1]) >> 15;
+ txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (Wt[l_prime]*Wf[k_prime]*amp*mod_dmrs[l][(dmrs_idx<<1) + 1]) >> 15;
#ifdef DEBUG_DLSCH_MAPPING
printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t txdataF: %d %d\n",
- dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
- ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)]);
+ dmrs_idx, l, k, k_prime, n, txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
+ txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)]);
#endif
dmrs_idx++;
k_prime++;
@@ -381,8 +379,8 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
}
/* Map PTRS Symbol */
else if(is_ptrs_re){
- ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (beta_ptrs*amp*mod_ptrs[ptrs_idx<<1]) >> 15;
- ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (beta_ptrs*amp*mod_ptrs[(ptrs_idx<<1) + 1])>> 15;
+ txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (beta_ptrs*amp*mod_ptrs[ptrs_idx<<1]) >> 15;
+ txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (beta_ptrs*amp*mod_ptrs[(ptrs_idx<<1) + 1])>> 15;
#ifdef DEBUG_DLSCH_MAPPING
printf("ptrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t txdataF: %d %d\n",
ptrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
@@ -391,17 +389,20 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
ptrs_idx++;
}
/* Map DATA Symbol */
- else {
- if( (!(dmrs_symbol_map & (1 << l))) || allowed_xlsch_re_in_dmrs_symbol(k,start_sc,frame_parms->ofdm_symbol_size,rel15->numDmrsCdmGrpsNoData,dmrs_Type)) {
- ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (amp * tx_layers[ap][m<<1]) >> 15;
- ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (amp * tx_layers[ap][(m<<1) + 1]) >> 15;
+ else if( (!(dmrs_symbol_map & (1 << l))) || allowed_xlsch_re_in_dmrs_symbol(k,start_sc,frame_parms->ofdm_symbol_size,rel15->numDmrsCdmGrpsNoData,dmrs_Type)) {
+ txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (amp * tx_layers[ap][m<<1]) >> 15;
+ txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (amp * tx_layers[ap][(m<<1) + 1]) >> 15;
#ifdef DEBUG_DLSCH_MAPPING
- printf("m %d\t l %d \t k %d \t txdataF: %d %d\n",
- m, l, k, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
- ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)]);
+ printf("m %d\t l %d \t k %d \t txdataF: %d %d\n",
+ m, l, k, txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
+ txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)]);
#endif
- m++;
- }
+ m++;
+ }
+ /* mute RE */
+ else {
+ txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = 0;
+ txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = 0;
}
if (++k >= frame_parms->ofdm_symbol_size)
k -= frame_parms->ofdm_symbol_size;
@@ -409,9 +410,108 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
} // symbol loop
}// layer loop
+ ///Layer Precoding and Antenna port mapping
+ // tx_layers 1-8 are mapped on antenna ports 1000-1007
+ // The precoding info is supported by nfapi such as num_prgs, prg_size, prgs_list and pm_idx
+ // The same precoding matrix is applied on prg_size RBs, Thus
+ // pmi = prgs_list[rbidx/prg_size].pm_idx, rbidx =0,...,rbSize-1
+ // The Precoding matrix:
+ // The Codebook Type I and Type II are not supported yet.
+ // We adopt the precoding matrices of PUSCH for 4 layers.
+ for (int ap=0; apnb_antennas_tx; ap++) {
+
+ for (int l=rel15->StartSymbolIndex; lStartSymbolIndex+rel15->NrOfSymbols; l++) {
+ uint16_t k = start_sc;
+
+ for (int rb=0; rbrbSize; rb++) {
+ //get pmi info
+ uint8_t pmi;
+ if (rel15->precodingAndBeamforming.prg_size > 0)
+ pmi = rel15->precodingAndBeamforming.prgs_list[(int)rb/rel15->precodingAndBeamforming.prg_size].pm_idx;
+ else
+ pmi = 0;//no precoding
+
+ if (pmi == 0) {//unitary Precoding
+ if(apnrOfLayers)
+ memcpy((void*)&txdataF[ap][l*frame_parms->ofdm_symbol_size + txdataF_offset + k],
+ (void*)&txdataF_precoding[ap][2*(l*frame_parms->ofdm_symbol_size + txdataF_offset+ k)],
+ NR_NB_SC_PER_RB*sizeof(int32_t));
+ else
+ memset((void*)&txdataF[ap][rel15->StartSymbolIndex*frame_parms->ofdm_symbol_size + txdataF_offset +k],
+ 0,
+ NR_NB_SC_PER_RB*sizeof(int32_t));
+ k += NR_NB_SC_PER_RB;
+ if (k >= frame_parms->ofdm_symbol_size) {
+ k -= frame_parms->ofdm_symbol_size;
+ }
+ }
+ else {
+ //get the precoding matrix weights:
+ char *W_prec;
+ switch (frame_parms->nb_antennas_tx) {
+ case 1://1 antenna port
+ W_prec = nr_W_1l_2p[pmi][ap];
+ break;
+ case 2://2 antenna ports
+ if (rel15->nrOfLayers == 1)//1 layer
+ W_prec = nr_W_1l_2p[pmi][ap];
+ else//2 layers
+ W_prec = nr_W_2l_2p[pmi][ap];
+ break;
+ case 4://4 antenna ports
+ if (rel15->nrOfLayers == 1)//1 layer
+ W_prec = nr_W_1l_4p[pmi][ap];
+ else if (rel15->nrOfLayers == 2)//2 layers
+ W_prec = nr_W_2l_4p[pmi][ap];
+ else if (rel15->nrOfLayers == 3)//3 layers
+ W_prec = nr_W_3l_4p[pmi][ap];
+ else//4 layers
+ W_prec = nr_W_4l_4p[pmi][ap];
+ break;
+ default:
+ LOG_D(PHY,"Precoding 1,2, or 4 antenna ports are currently supported\n");
+ W_prec = nr_W_1l_2p[pmi][ap];
+ break;
+ }
+ for (int i=0; iofdm_symbol_size + k;
+ int32_t precodatatx_F = nr_layer_precoder(txdataF_precoding, W_prec, rel15->nrOfLayers, re_offset+txdataF_offset);
+ ((int16_t*)txdataF[ap])[(re_offset<<1) + (2*txdataF_offset)] = ((int16_t *) &precodatatx_F)[0];
+ ((int16_t*)txdataF[ap])[(re_offset<<1) + 1 + (2*txdataF_offset)] = ((int16_t *) &precodatatx_F)[1];
+#ifdef DEBUG_DLSCH_MAPPING
+ printf("antenna %d\t l %d \t k %d \t txdataF: %d %d\n",
+ ap, l, k, ((int16_t*)txdataF[ap])[(re_offset<<1) + (2*txdataF_offset)],
+ ((int16_t*)txdataF[ap])[(re_offset<<1) + 1 + (2*txdataF_offset)]);
+#endif
+ if (++k >= frame_parms->ofdm_symbol_size) {
+ k -= frame_parms->ofdm_symbol_size;
+ }
+ }
+ }
+ } //RB loop
+ } // symbol loop
+ }// port loop
dlsch->slot_tx[slot]=0;
+
+ // TODO: handle precoding
+ // this maps the layers onto antenna ports
+
+ // handle beamforming ID
+ // each antenna port is assigned a beam_index
+ // since PHY can only handle BF on slot basis we set the whole slot
+
+ // first check if this slot has not already been allocated to another beam
+ if (gNB->common_vars.beam_id[0][slot*frame_parms->symbols_per_slot]==255) {
+ for (int j=0;jsymbols_per_slot;j++)
+ gNB->common_vars.beam_id[0][slot*frame_parms->symbols_per_slot+j] = rel15->precodingAndBeamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx;
+ }
+ else {
+ LOG_W(PHY,"beam index for PDSCH allocation already taken\n");
+ }
}// dlsch loop
+
+
return 0;
}
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
index e6544bbe0c..b441635246 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
@@ -61,10 +61,8 @@ void free_gNB_dlsch(NR_gNB_DLSCH_t **dlschptr, uint16_t N_RB)
if (N_RB != 273) {
a_segments = a_segments*N_RB;
a_segments = a_segments/273 +1;
- }
-
-
-
+ }
+
#ifdef DEBUG_DLSCH_FREE
LOG_D(PHY,"Freeing dlsch %p\n",dlsch);
#endif
@@ -110,8 +108,6 @@ void free_gNB_dlsch(NR_gNB_DLSCH_t **dlschptr, uint16_t N_RB)
harq->d[r] = NULL;
}
}
- free16(harq, sizeof(NR_DL_gNB_HARQ_t));
- harq = NULL;
}
}
@@ -133,7 +129,7 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms,
if (N_RB != 273) {
a_segments = a_segments*N_RB;
a_segments = a_segments/273 +1;
- }
+ }
uint16_t dlsch_bytes = a_segments*1056; // allocated bytes per segment
@@ -145,31 +141,30 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms,
dlsch->Mdlharq = Mdlharq;
dlsch->Mlimit = 4;
dlsch->Nsoft = Nsoft;
-
- for (layer=0; layerue_spec_bf_weights[layer] = (int32_t **)malloc16(64 * sizeof(int32_t *));
- for (aa = 0; aa < 64; aa++) {
- dlsch->ue_spec_bf_weights[layer][aa] = (int32_t *)malloc16(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES * sizeof(int32_t));
- for (re = 0; re < OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; re++) {
+ for (layer=0; layerue_spec_bf_weights[layer] = (int32_t**)malloc16(64*sizeof(int32_t*));
+
+ for (aa=0; aa<64; aa++) {
+ dlsch->ue_spec_bf_weights[layer][aa] = (int32_t *)malloc16(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*sizeof(int32_t));
+ for (re=0;reue_spec_bf_weights[layer][aa][re] = 0x00007fff;
}
}
- dlsch->txdataF[layer] =
- (int32_t *)malloc16((NR_MAX_PDSCH_ENCODED_LENGTH / NR_MAX_NB_LAYERS)
- * sizeof(int32_t)); // NR_MAX_NB_LAYERS is already included in NR_MAX_PDSCH_ENCODED_LENGTH
+ dlsch->txdataF[layer] = (int32_t *)malloc16((NR_MAX_PDSCH_ENCODED_LENGTH/NR_MAX_NB_LAYERS)*sizeof(int32_t)); // NR_MAX_NB_LAYERS is already included in NR_MAX_PDSCH_ENCODED_LENGTH
+ dlsch->txdataF_precoding[layer] = (int32_t *)malloc16(2*14*frame_parms->ofdm_symbol_size*sizeof(int32_t));
}
- for (int q = 0; q < NR_MAX_NB_CODEWORDS; q++)
- dlsch->mod_symbs[q] = (int32_t *)malloc16(NR_MAX_PDSCH_ENCODED_LENGTH * sizeof(int32_t));
+ for (int q=0; qmod_symbs[q] = (int32_t *)malloc16(NR_MAX_PDSCH_ENCODED_LENGTH*sizeof(int32_t));
- dlsch->calib_dl_ch_estimates = (int32_t **)malloc16(64 * sizeof(int32_t *));
- for (aa = 0; aa < 64; aa++) {
- dlsch->calib_dl_ch_estimates[aa] = (int32_t *)malloc16(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES * sizeof(int32_t));
+ dlsch->calib_dl_ch_estimates = (int32_t**)malloc16(64*sizeof(int32_t*));
+ for (aa=0; aa<64; aa++) {
+ dlsch->calib_dl_ch_estimates[aa] = (int32_t *)malloc16(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*sizeof(int32_t));
}
- for (i = 0; i < 20; i++) {
+ for (i=0; i<20; i++) {
dlsch->harq_ids[0][i] = 0;
dlsch->harq_ids[1][i] = 0;
}
@@ -268,7 +263,6 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
float Coderate = 0.0;
uint8_t Nl = 4;
-
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_DLSCH_ENCODING, VCD_FUNCTION_IN);
A = rel15->TBSize[0]<<3;
@@ -304,7 +298,7 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
a[2+(A>>3)] = ((uint8_t*)&crc)[0];
//printf("CRC %x (A %d)\n",crc,A);
//printf("a0 %d a1 %d a2 %d\n", a[A>>3], a[1+(A>>3)], a[2+(A>>3)]);
-
+
harq->B = A+24;
// harq->b = a;
@@ -323,7 +317,7 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
a[1+(A>>3)] = ((uint8_t*)&crc)[0];
//printf("CRC %x (A %d)\n",crc,A);
//printf("a0 %d a1 %d \n", a[A>>3], a[1+(A>>3)]);
-
+
harq->B = A+16;
// harq->b = a;
@@ -339,17 +333,17 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
Coderate = (float) R /(float) 1024;
else // to scale for mcs 20 and 26 in table 5.1.3.1-2 which are decimal and input 2* in nr_tbs_tools
Coderate = (float) R /(float) 2048;
-
+
if ((A <=292) || ((A<=3824) && (Coderate <= 0.6667)) || Coderate <= 0.25)
harq->BG = 2;
else
harq->BG = 1;
-
+
start_meas(dlsch_segmentation_stats);
Kb = nr_segmentation(harq->b, harq->c, harq->B, &harq->C, &harq->K, Zc, &harq->F, harq->BG);
stop_meas(dlsch_segmentation_stats);
F = harq->F;
-
+
Kr = harq->K;
#ifdef DEBUG_DLSCH_CODING
uint16_t Kr_bytes;
@@ -357,7 +351,7 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
#endif
//printf("segment Z %d k %d Kr %d BG %d C %d\n", *Zc,harq->K,Kr,BG,harq->C);
-
+
for (r=0; rC; r++) {
//d_tmp[r] = &harq->d[r][0];
//channel_input[r] = &harq->d[r][0];
@@ -369,7 +363,7 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
LOG_D(PHY,"%d ", harq->c[r][cnt]);
}
LOG_D(PHY,"\n");
-
+
#endif
//ldpc_encoder_orig((unsigned char*)harq->c[r],harq->d[r],*Zc,Kb,Kr,BG,0);
//ldpc_encoder_optim((unsigned char*)harq->c[r],(unsigned char*)&harq->d[r][0],*Zc,Kb,Kr,BG,NULL,NULL,NULL,NULL);
@@ -380,23 +374,22 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
impp.tinput = tinput;
impp.tparity = tparity;
impp.toutput = toutput;
-
+
for(int j=0;j<(harq->C/8+1);j++) {
impp.macro_num=j;
nrLDPC_encoder(harq->c,harq->d,*Zc,Kb,Kr,harq->BG,&impp);
}
-
#ifdef DEBUG_DLSCH_CODING
write_output("enc_input0.m","enc_in0",&harq->c[0][0],Kr_bytes,1,4);
write_output("enc_output0.m","enc0",&harq->d[0][0],(3*8*Kr_bytes)+12,1,4);
#endif
-
+
F = harq->F;
-
+
Kr = harq->K;
for (r=0; rC; r++) {
-
+
if (F>0) {
for (int k=(Kr-F-2*(*Zc)); kd[r][k]);
}
}
-
-
-
+
#ifdef DEBUG_DLSCH_CODING
LOG_D(PHY,"rvidx in encoding = %d\n", rel15->rvIndex[0]);
#endif
-
+
E = nr_get_E(G, harq->C, mod_order, rel15->nrOfLayers, r);
-
+
//#ifdef DEBUG_DLSCH_CODING
LOG_D(PHY,"Rate Matching, Code segment %d/%d (coded bits (G) %u, E %d, Filler bits %d, Filler offset %d mod_order %d, nb_rb %d)...\n",
r,
@@ -423,13 +414,13 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
F,
Kr-F-2*(*Zc),
mod_order,nb_rb);
-
+
// for tbslbrm calculation according to 5.4.2.1 of 38.212
if (rel15->nrOfLayers < Nl)
Nl = rel15->nrOfLayers;
-
+
Tbslbrm = nr_compute_tbslbrm(rel15->mcsTable[0],nb_rb,Nl);
-
+
start_meas(dlsch_rate_matching_stats);
nr_rate_matching_ldpc(Ilbrm,
Tbslbrm,
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
index d990176d79..b572a6e5bb 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
@@ -320,7 +320,7 @@ void nr_processULSegment(void* arg) {
Kr_bytes = Kr>>3;
K_bits_F = Kr-ulsch_harq->F;
- t_nrLDPC_time_stats procTime;
+ t_nrLDPC_time_stats procTime = {0};
t_nrLDPC_time_stats* p_procTime = &procTime ;
//start_meas(&phy_vars_gNB->ulsch_deinterleaving_stats);
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
index dd8627f0e0..edca81d501 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
@@ -345,7 +345,9 @@ void nr_ulsch_extract_rbs_single(int32_t **rxdataF,
n = 0;
k_prime = 0;
- rxF_ext_index = ul_ch0_ext_index = ul_ch0_index = 0; /* In RX Antenna(aarx) loop, Reset the index */
+ rxF_ext_index = 0;
+ ul_ch0_ext_index = 0;
+ ul_ch0_index = 0;
if (is_dmrs_symbol == 0) {
//
@@ -407,7 +409,7 @@ void nr_ulsch_scale_channel(int **ul_ch_estimates_ext,
#if defined(__x86_64__)||defined(__i386__)
short rb, ch_amp;
- unsigned char aatx,aarx;
+ unsigned char aarx;
__m128i *ul_ch128, ch_amp128;
// Determine scaling amplitude based the symbol
@@ -425,8 +427,7 @@ void nr_ulsch_scale_channel(int **ul_ch_estimates_ext,
int off = 0;
#endif
- for (aatx=0; aatx < frame_parms->nb_antenna_ports_gNB; aatx++) {
- for (aarx=0; aarx < frame_parms->nb_antennas_rx; aarx++) {
+ for (aarx=0; aarx < frame_parms->nb_antennas_rx; aarx++) {
ul_ch128 = (__m128i *)&ul_ch_estimates_ext[aarx][symbol*(off+(nb_rb*NR_NB_SC_PER_RB))];
@@ -455,7 +456,6 @@ void nr_ulsch_scale_channel(int **ul_ch_estimates_ext,
}
}
}
- }
#endif
}
@@ -472,6 +472,7 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
short rb;
unsigned char aatx, aarx;
+ char nb_antennas_ue_tx = 1;
__m128i *ul_ch128, avg128U;
int16_t x = factor2(len);
@@ -483,7 +484,7 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
int off = 0;
#endif
- for (aatx = 0; aatx < frame_parms->nb_antennas_tx; aatx++)
+ for (aatx = 0; aatx < nb_antennas_ue_tx; aatx++)
for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
//clear average level
avg128U = _mm_setzero_si128();
@@ -624,11 +625,12 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
unsigned short rb;
unsigned char aatx,aarx;
+ char nb_antennas_ue_tx = 1;
__m128i *ul_ch128,*ul_ch128_2,*ul_ch_mag128,*ul_ch_mag128b,*rxdataF128,*rxdataF_comp128,*rho128;
__m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b;
QAM_amp128b = _mm_setzero_si128();
- for (aatx=0; aatxnb_antennas_tx; aatx++) {
+ for (aatx=0; aatxframe_parms;
nfapi_nr_pusch_pdu_t *rel15_ul = &gNB->ulsch[ulsch_id][0]->harq_processes[harq_pid]->ulsch_pdu;
@@ -1214,6 +1217,8 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
bwp_start_subcarrier,
rel15_ul);
+ nr_gnb_measurements(gNB, ulsch_id, harq_pid, symbol);
+
for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
gNB->pusch_vars[ulsch_id]->ulsch_power[aarx] = signal_energy_nodc(&gNB->pusch_vars[ulsch_id]->ul_ch_estimates[aarx][symbol*frame_parms->ofdm_symbol_size],
rel15_ul->rb_size*12);
@@ -1263,7 +1268,7 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
avgs = 0;
- for (aatx=0;aatxnb_antennas_tx;aatx++)
+ for (aatx=0;aatxnb_antennas_rx;aarx++)
avgs = cmax(avgs,avg[(aatx<<1)+aarx]);
@@ -1281,7 +1286,7 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
gNB->pusch_vars[ulsch_id]->ul_ch_mag0,
gNB->pusch_vars[ulsch_id]->ul_ch_magb0,
gNB->pusch_vars[ulsch_id]->rxdataF_comp,
- (frame_parms->nb_antennas_tx>1) ? gNB->pusch_vars[ulsch_id]->rho : NULL,
+ (nb_antennas_ue_tx>1) ? gNB->pusch_vars[ulsch_id]->rho : NULL,
frame_parms,
symbol,
dmrs_symbol_flag,
diff --git a/openair1/PHY/NR_TRANSPORT/pucch_rx.c b/openair1/PHY/NR_TRANSPORT/pucch_rx.c
index f3ecb37986..1b31927d20 100644
--- a/openair1/PHY/NR_TRANSPORT/pucch_rx.c
+++ b/openair1/PHY/NR_TRANSPORT/pucch_rx.c
@@ -391,6 +391,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
if ((xrtmag_dB<(11+dB_fixed(no_corr))) || (dB_fixed(av_corr)<(13+gNB->measurements.n0_power_tot_dB))) //TODO these are temporary threshold based on measurments with the phone
no_conf=true;
}
+ gNB->bad_pucch += no_conf;
// first bit of bitmap for sr presence and second bit for acknack presence
uci_pdu->pduBitmap = pucch_pdu->sr_flag | ((pucch_pdu->bit_len_harq>0)<<1);
uci_pdu->pucch_format = 0; // format 0
diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
index 6cb0a612e9..76a48f38ae 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
@@ -77,9 +77,9 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
// generate pilot
nr_pbch_dmrs_rx(dmrss,ue->nr_gold_pbch[n_hf][ssb_index], &pilot[0]);
- int re_offset = ssb_offset;
for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) {
+ int re_offset = ssb_offset;
pil = (int16_t *)&pilot[0];
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
@@ -277,9 +277,9 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
// generate pilot
nr_pbch_dmrs_rx(dmrss,ue->nr_gold_pbch[n_hf][ssb_index], &pilot[0]);
- int re_offset = ssb_offset;
for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) {
+ int re_offset = ssb_offset;
pil = (int16_t *)&pilot[0];
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
dl_ch = (int16_t *)&dl_ch_estimates[aarx][ch_offset];
@@ -456,12 +456,12 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
// do ifft of channel estimate
for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++)
for (p=0; pframe_parms.nb_antenna_ports_gNB; p++) {
- if (ue->pbch_vars[eNB_offset]->dl_ch_estimates[(p<<1)+aarx])
+ if (ue->pbch_vars[eNB_offset]->dl_ch_estimates[(p*ue->frame_parms.nb_antennas_rx)+aarx])
{
LOG_D(PHY,"Channel Impulse Computation Slot %d ThreadId %d Symbol %d ch_offset %d\n", Ns, proc->thread_id, symbol, ch_offset);
idft(idftsizeidx,
- (int16_t*) &ue->pbch_vars[eNB_offset]->dl_ch_estimates[(p<<1)+aarx][ch_offset],
- (int16_t*) ue->pbch_vars[eNB_offset]->dl_ch_estimates_time[(p<<1)+aarx],1);
+ (int16_t*) &ue->pbch_vars[eNB_offset]->dl_ch_estimates[(p*ue->frame_parms.nb_antennas_rx)+aarx][ch_offset],
+ (int16_t*) ue->pbch_vars[eNB_offset]->dl_ch_estimates_time[(p*ue->frame_parms.nb_antennas_rx)+aarx],1);
}
}
}
@@ -512,6 +512,13 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
fr = filt16a_r1;
+ // checking if re-initialization of scrambling IDs is needed (should be done here but scrambling ID for PDCCH is not taken from RRC)
+/* if (( != ue->scramblingID_pdcch){
+ ue->scramblingID_pdcch=;
+ nr_gold_pdsch(ue,ue->scramblingID_pdcch);
+ }*/
+
+
// generate pilot
int pilot[nb_rb_coreset * 3] __attribute__((aligned(16)));
nr_pdcch_dmrs_rx(ue,eNB_offset,Ns,ue->nr_gold_pdcch[eNB_offset][Ns][symbol], &pilot[0],2000,nb_rb_coreset);
@@ -672,7 +679,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF;
if (ue->high_speed_flag == 0)
- ch_offset = ue->frame_parms.ofdm_symbol_size ;
+ ch_offset = ue->frame_parms.ofdm_symbol_size;
else
ch_offset = ue->frame_parms.ofdm_symbol_size*symbol;
@@ -690,11 +697,19 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
uint16_t rb_offset = (bwp_start_subcarrier - ue->frame_parms.first_carrier_offset) / 12 - BWPStart;
uint8_t config_type = ue->dmrs_DownlinkConfig.pdsch_dmrs_type;
int8_t delta = get_delta(p, config_type);
- nr_pdsch_dmrs_rx(ue,Ns,ue->nr_gold_pdsch[eNB_offset][Ns][symbol][0], &pilot[0],1000,0,nb_rb_pdsch+rb_offset);
+
+ // checking if re-initialization of scrambling IDs is needed
+ if ((ue->dmrs_DownlinkConfig.scramblingID0 != ue->scramblingID[0]) || (ue->dmrs_DownlinkConfig.scramblingID1 != ue->scramblingID[1])){
+ ue->scramblingID[0]=ue->dmrs_DownlinkConfig.scramblingID0;
+ ue->scramblingID[1]=ue->dmrs_DownlinkConfig.scramblingID1;
+ nr_gold_pdsch(ue,ue->scramblingID);
+ }
+
+ nr_pdsch_dmrs_rx(ue,Ns,ue->nr_gold_pdsch[eNB_offset][Ns][symbol][0], &pilot[0],1000+p,0,nb_rb_pdsch+rb_offset);
if (config_type == pdsch_dmrs_type1){
nushift = (p>>1)&1;
- ue->frame_parms.nushift = nushift;
+ if (p<4) ue->frame_parms.nushift = nushift;
switch (delta) {
case 0://port 0,1
@@ -734,7 +749,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
}
} else {//pdsch_dmrs_type2
nushift = delta;
- ue->frame_parms.nushift = nushift;
+ if (p<6) ue->frame_parms.nushift = nushift;
switch (delta) {
case 0://port 0,1
fl = filt8_l2;//left interpolation Filter should be fml
diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c b/openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c
index 61fc40ad3f..3f52b29281 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c
@@ -21,16 +21,17 @@
/*! \file nr_ue_measurements.c
* \brief UE measurements routines
- * \author R. Knopp, G. Casati
+ * \author R. Knopp, G. Casati, K. Saaifan
* \date 2020
* \version 0.1
* \company Eurecom, Fraunhofer IIS
- * \email: knopp@eurecom.fr, guido.casati@iis.fraunhofer.de
+ * \email: knopp@eurecom.fr, guido.casati@iis.fraunhofer.de, khodr.saaifan@iis.fraunhofer.de
* \note
* \warning
*/
#include "executables/softmodem-common.h"
+#include "executables/nr-softmodem-common.h"
#include "PHY/defs_nr_UE.h"
#include "PHY/phy_extern_nr_ue.h"
#include "common/utils/LOG/log.h"
@@ -45,7 +46,7 @@
//#define DEBUG_MEAS_UE
//#define DEBUG_RANK_EST
-// Returns the pathloss in dBm for the active UL BWP on the selected carrier based on the DL RS associated with the PRACH transmission
+// Returns the pathloss in dB for the active UL BWP on the selected carrier based on the DL RS associated with the PRACH transmission
// computation according to clause 7.4 (Physical random access channel) of 3GPP TS 38.213 version 16.3.0 Release 16
// Assumptions:
// - PRACH transmission from a UE is not in response to a detection of a PDCCH order by the UE
@@ -59,18 +60,17 @@ int16_t get_nr_PL(uint8_t Mod_id, uint8_t CC_id, uint8_t gNB_index){
if (get_softmodem_params()->do_ra){
long referenceSignalPower = ue->nrUE_config.ssb_config.ss_pbch_power;
- double rsrp_dBm = 10*log10(ue->measurements.rsrp[gNB_index]) + 30 - ue->rx_total_gain_dB;
- pathloss = (int16_t)(10*log10(pow(10, (double)(referenceSignalPower)/10) - pow(10, (double)(rsrp_dBm)/10)));
+ pathloss = (int16_t)(referenceSignalPower - ue->measurements.rsrp_dBm[gNB_index]);
- LOG_D(MAC, "In %s: pathloss %d dBm, UE RX total gain %d dB, referenceSignalPower %ld dBm (%f mW), RSRP %f dBm (%f mW)\n",
+ LOG_D(MAC, "In %s: pathloss %d dB, UE RX total gain %d dB, referenceSignalPower %ld dBm/RE (%f mW), RSRP %d dBm (%f mW)\n",
__FUNCTION__,
pathloss,
ue->rx_total_gain_dB,
referenceSignalPower,
pow(10, referenceSignalPower/10),
- rsrp_dBm,
- pow(10, rsrp_dBm/10));
+ ue->measurements.rsrp_dBm[gNB_index],
+ pow(10, ue->measurements.rsrp_dBm[gNB_index]/10));
} else {
@@ -178,9 +178,9 @@ void nr_ue_measurements(PHY_VARS_NR_UE *ue,
ue->measurements.rx_power_avg_dB[gNB_id] = dB_fixed( ue->measurements.rx_power_avg[gNB_id]);
ue->measurements.wideband_cqi_tot[gNB_id] = dB_fixed2(ue->measurements.rx_power_tot[gNB_id], ue->measurements.n0_power_tot);
ue->measurements.wideband_cqi_avg[gNB_id] = dB_fixed2(ue->measurements.rx_power_avg[gNB_id], ue->measurements.n0_power_avg);
- ue->measurements.rx_rssi_dBm[gNB_id] = ue->measurements.rx_power_avg_dB[gNB_id] - ue->rx_total_gain_dB;
+ ue->measurements.rx_rssi_dBm[gNB_id] = ue->measurements.rx_power_avg_dB[gNB_id] + 30 - 10*log10(pow(2, 30)) - ((int)openair0_cfg[0].rx_gain[0] - (int)openair0_cfg[0].rx_gain_offset[0]) - dB_fixed(ue->frame_parms.ofdm_symbol_size);
- LOG_D(PHY, "[gNB %d] Slot %d, RSSI %d dBm, RSSI (digital) %d dB, WBandCQI %d dB, rxPwrAvg %d, n0PwrAvg %d\n",
+ LOG_I(PHY, "[gNB %d] Slot %d, RSSI %d dBm/RE, RSSI (digital) %d dB, WBandCQI %d dB, rxPwrAvg %d, n0PwrAvg %d \n",
gNB_id,
slot,
ue->measurements.rx_rssi_dBm[gNB_id],
@@ -258,15 +258,20 @@ void nr_ue_rsrp_measurements(PHY_VARS_NR_UE *ue,
ue->measurements.rsrp_filtered[gNB_id] = ue->measurements.rsrp[gNB_id];
- LOG_D(PHY, "In %s: [UE %d] slot %d SS-RSRP: %3.1f dBm/RE (%d W)\n",
+ ue->measurements.rsrp_dBm[gNB_id] = 10*log10(ue->measurements.rsrp[gNB_id]) + 30 - 10*log10(pow(2,30)) - ((int)openair0_cfg[0].rx_gain[0] - (int)openair0_cfg[0].rx_gain_offset[0]) - dB_fixed(ue->frame_parms.ofdm_symbol_size);
+
+ LOG_D(PHY, "In %s: [UE %d] slot %d SS-RSRP: %d dBm/RE (%d)\n",
__FUNCTION__,
ue->Mod_id,
slot,
- 10*log10(ue->measurements.rsrp[gNB_id]) + 30 - ue->rx_total_gain_dB,
+ ue->measurements.rsrp_dBm[gNB_id],
ue->measurements.rsrp[gNB_id]);
}
+// This function computes the received noise power
+// Measurement units:
+// - psd_awgn (AWGN power spectral density): dBm/Hz
void nr_ue_rrc_measurements(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc,
uint8_t slot){
@@ -279,6 +284,9 @@ void nr_ue_rrc_measurements(PHY_VARS_NR_UE *ue,
uint8_t k_length = 8;
uint8_t l_sss = ue->symbol_offset + 2;
unsigned int ssb_offset = ue->frame_parms.first_carrier_offset + ue->frame_parms.ssb_start_subcarrier;
+ double rx_gain = openair0_cfg[0].rx_gain[0];
+ double rx_gain_offset = openair0_cfg[0].rx_gain_offset[0];
+
ue->measurements.n0_power_tot = 0;
LOG_D(PHY, "In %s doing measurements for ssb_offset %d l_sss %d \n", __FUNCTION__, ssb_offset, l_sss);
@@ -322,10 +330,17 @@ void nr_ue_rrc_measurements(PHY_VARS_NR_UE *ue,
ue->measurements.n0_power_tot_dB = (unsigned short) dB_fixed(ue->measurements.n0_power_tot/aarx);
#ifdef DEBUG_MEAS_RRC
- int nf_usrp = ue->measurements.n0_power_tot_dB + 30 - ((int)openair0_cfg[0].rx_gain[0] - (int)openair0_cfg[0].rx_gain_offset[0]) - 90 - (-174 + dB_fixed(30000/*scs*/) + dB_fixed(ue->frame_parms.ofdm_symbol_size));
- LOG_D(PHY, "In %s slot %d NF USRP %d dBm\n", __FUNCTION__, nf_usrp);
+ const int psd_awgn = -174;
+ const int scs = 15000 * (1 << ue->frame_parms.numerology_index);
+ const int nf_usrp = ue->measurements.n0_power_tot_dB + 3 + 30 - ((int)rx_gain - (int)rx_gain_offset) - 10 * log10(pow(2, 30)) - (psd_awgn + dB_fixed(scs) + dB_fixed(ue->frame_parms.ofdm_symbol_size));
+ LOG_D(PHY, "In [%s][slot:%d] NF USRP %d dB\n", __FUNCTION__, slot, nf_usrp);
#endif
- LOG_D(PHY, "In %s slot %d Noise Level %d ue->measurements.n0_power_tot_dB %d \n", __FUNCTION__, slot, ue->measurements.n0_power_tot, ue->measurements.n0_power_tot_dB);
+ LOG_D(PHY, "In [%s][slot:%d] Noise Level %d (digital level %d dB, noise power spectral density %f dBm/RE)\n",
+ __FUNCTION__,
+ slot,
+ ue->measurements.n0_power_tot,
+ ue->measurements.n0_power_tot_dB,
+ ue->measurements.n0_power_tot_dB + 30 - 10*log10(pow(2, 30)) - dB_fixed(ue->frame_parms.ofdm_symbol_size) - ((int)rx_gain - (int)rx_gain_offset));
}
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
index 429bd9a836..d5c0245fdc 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
@@ -261,7 +261,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
int8_t llrProcBuf[NR_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32)));
t_nrLDPC_dec_params decParams;
t_nrLDPC_dec_params* p_decParams = &decParams;
- t_nrLDPC_time_stats procTime;
+ t_nrLDPC_time_stats procTime = {0};
t_nrLDPC_time_stats* p_procTime =&procTime ;
if (!harq_process) {
@@ -678,7 +678,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
memcpy(harq_process->b+offset,
harq_process->c[r],
- Kr_bytes- - (harq_process->F>>3) -((harq_process->C>1)?3:0));
+ Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0));
offset += (Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0));
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
index 9a31257244..35c4a6e8cb 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
@@ -84,8 +84,8 @@ unsigned char offset_mumimo_llr_drange[29][3]={{8,8,8},{7,7,7},{7,7,7},{7,7,7},{
*/
//unsigned char offset_mumimo_llr_drange[29][3]= {{0, 6, 5},{0, 4, 5},{0, 4, 5},{0, 5, 4},{0, 5, 6},{0, 5, 3},{0, 4, 4},{0, 4, 4},{0, 3, 3},{0, 1, 2},{1, 1, 0},{1, 3, 2},{3, 4, 1},{2, 0, 0},{2, 2, 2},{1, 1, 1},{2, 1, 0},{2, 1, 1},{1, 0, 1},{1, 0, 1},{0, 0, 0},{1, 0, 0},{0, 0, 0},{0, 1, 0},{1, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0}};
-
-extern void print_shorts(char *s,int16_t *x);
+#define print_ints(s,x) printf("%s %d %d %d %d\n",s,(x)[0],(x)[1],(x)[2],(x)[3])
+#define print_shorts(s,x) printf("%s %d,%d,%d,%d,%d,%d,%d,%d\n",s,(x)[0],(x)[1],(x)[2],(x)[3],(x)[4],(x)[5],(x)[6],(x)[7])
static void nr_dlsch_dual_stream_correlation_core(int **dl_ch_estimates_ext,
int **dl_ch_estimates_ext_i,
@@ -96,6 +96,16 @@ static void nr_dlsch_dual_stream_correlation_core(int **dl_ch_estimates_ext,
int length,
int start_point);
+uint8_t nr_zero_forcing_rx_2layers(int **rxdataF_comp,
+ int **dl_ch_mag,
+ int **dl_ch_magb,
+ int **dl_ch_estimates_ext,
+ unsigned short nb_rb,
+ unsigned char n_rx,
+ unsigned char mod_order,
+ int shift,
+ unsigned char symbol);
+
static void nr_dlsch_layer_demapping(int16_t **llr_cw,
uint8_t Nl,
uint8_t mod_order,
@@ -113,7 +123,7 @@ static int nr_dlsch_llr(NR_UE_PDSCH **pdsch_vars,
RX_type_t rx_type,
unsigned char harq_pid,
unsigned char gNB_id,
- unsigned char eNB_id_i,
+ unsigned char gNB_id_i,
unsigned char first_symbol_flag,
unsigned char symbol,
unsigned short nb_rb,
@@ -129,7 +139,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc,
PDSCH_t type,
unsigned char gNB_id,
- unsigned char eNB_id_i, //if this == ue->n_connected_gNB, we assume MU interference
+ unsigned char gNB_id_i,
uint32_t frame,
uint8_t nr_slot_rx,
unsigned char symbol,
@@ -145,7 +155,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
PHY_NR_MEASUREMENTS *measurements = &ue->measurements;
NR_UE_DLSCH_t **dlsch;
- int avg[4];
+ int avg[16];
// int avg_0[2];
// int avg_1[2];
@@ -173,7 +183,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
//int16_t *pllr_symbol_cw1_deint;
//uint16_t bundle_L = 2;
uint8_t pilots=0;
- uint8_t config_type = ue->dmrs_DownlinkConfig.pdsch_dmrs_type;
+ uint8_t config_type;// We should not use ue->dmrs_DownlinkConfig.pdsch_dmrs_type;
uint16_t n_tx=1, n_rx=1;
int32_t median[16];
uint32_t len;
@@ -331,90 +341,44 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
#endif
pilots = ((1<dlDmrsSymbPos)>0 ? 1 : 0;
+ config_type = dlsch0_harq->dmrsConfigType;
- if (frame_parms->nb_antenna_ports_gNB>1 && beamforming_mode==0) {
-#ifdef DEBUG_DLSCH_MOD
- LOG_I(PHY,"dlsch: using pmi %x (%p)\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc),dlsch[0]);
-#endif
-
+ if (beamforming_mode==0) {//No beamforming
#if UE_TIMING_TRACE
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
#endif
- nb_rb = nr_dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
- pdsch_vars[gNB_id]->dl_ch_estimates,
- pdsch_vars[gNB_id]->rxdataF_ext,
- pdsch_vars[gNB_id]->dl_ch_estimates_ext,
- dlsch0_harq->pmi_alloc,
- pdsch_vars[gNB_id]->pmi_ext,
- symbol,
- pilots,
- start_rb,
- nb_rb_pdsch,
- nr_slot_rx,
- ue->high_speed_flag,
- frame_parms,
- dlsch0_harq->mimo_mode);
-#ifdef DEBUG_DLSCH_MOD
- printf("dlsch: using pmi %lx, pmi_ext ",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc));
- for (rb=0;rbpmi_ext[rb]);
- printf("\n");
-#endif
-
- if (rx_type >= rx_IC_single_stream) {
- if (eNB_id_i < ue->n_connected_gNB) // we are in TM5
- nb_rb = nr_dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
- pdsch_vars[gNB_id]->dl_ch_estimates,
- pdsch_vars[eNB_id_i]->rxdataF_ext,
- pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
- dlsch0_harq->pmi_alloc,
- pdsch_vars[eNB_id_i]->pmi_ext,
- symbol,
- pilots,
- start_rb,
- nb_rb_pdsch,
- nr_slot_rx,
- ue->high_speed_flag,
- frame_parms,
- dlsch0_harq->mimo_mode);
- else
- nb_rb = nr_dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
- pdsch_vars[gNB_id]->dl_ch_estimates,
- pdsch_vars[eNB_id_i]->rxdataF_ext,
- pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
- dlsch0_harq->pmi_alloc,
- pdsch_vars[eNB_id_i]->pmi_ext,
- symbol,
- pilots,
- start_rb,
- nb_rb_pdsch,
- nr_slot_rx,
- ue->high_speed_flag,
- frame_parms,
- dlsch0_harq->mimo_mode);
- }
- } else if (beamforming_mode==0) { //else if nb_antennas_ports_gNB==1 && beamforming_mode == 0
- //printf("start nr dlsch extract nr_slot_rx %d thread id %d \n", nr_slot_rx, proc->thread_id);
- nb_rb = nr_dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
- pdsch_vars[gNB_id]->dl_ch_estimates,
- pdsch_vars[gNB_id]->rxdataF_ext,
- pdsch_vars[gNB_id]->dl_ch_estimates_ext,
- dlsch0_harq->pmi_alloc,
- pdsch_vars[gNB_id]->pmi_ext,
- symbol,
- pilots,
- config_type,
- start_rb + dlsch0_harq->BWPStart,
- nb_rb_pdsch,
- nr_slot_rx,
- ue->high_speed_flag,
- frame_parms,
- dlsch0_harq->dlDmrsSymbPos);
-
- } /*else if(beamforming_mode>7) {
+ if (dlsch0_harq->Nl > 1)//More than or equal 2 layers
+ nb_rb = nr_dlsch_extract_rbs_multiple(common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
+ pdsch_vars[gNB_id]->dl_ch_estimates,
+ pdsch_vars[gNB_id]->rxdataF_ext,
+ pdsch_vars[gNB_id]->dl_ch_estimates_ext,
+ symbol,
+ pilots,
+ config_type,
+ start_rb + dlsch0_harq->BWPStart,
+ nb_rb_pdsch,
+ dlsch0_harq->n_dmrs_cdm_groups,
+ dlsch0_harq->Nl,
+ frame_parms,
+ dlsch0_harq->dlDmrsSymbPos);
+ else// one layer
+ nb_rb = nr_dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
+ pdsch_vars[gNB_id]->dl_ch_estimates,
+ pdsch_vars[gNB_id]->rxdataF_ext,
+ pdsch_vars[gNB_id]->dl_ch_estimates_ext,
+ symbol,
+ pilots,
+ config_type,
+ start_rb + dlsch0_harq->BWPStart,
+ nb_rb_pdsch,
+ dlsch0_harq->n_dmrs_cdm_groups,
+ frame_parms,
+ dlsch0_harq->dlDmrsSymbPos);
+ }
+ else if(beamforming_mode>7) {
LOG_W(PHY,"dlsch_demodulation: beamforming mode not supported yet.\n");
- }*/
-
+ }
+
//printf("nb_rb = %d, gNB_id %d\n",nb_rb,gNB_id);
if (nb_rb==0) {
LOG_D(PHY,"dlsch_demodulation.c: nb_rb=0\n");
@@ -437,16 +401,18 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
#if UE_TIMING_TRACE
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
#endif
- n_tx = frame_parms->nb_antenna_ports_gNB;
+ n_tx = dlsch0_harq->Nl;
n_rx = frame_parms->nb_antennas_rx;
nr_dlsch_scale_channel(pdsch_vars[gNB_id]->dl_ch_estimates_ext,
- frame_parms,
- dlsch,
- symbol,
- pilots,
- len,
- nb_rb);
+ frame_parms,
+ n_tx,
+ n_rx,
+ dlsch,
+ symbol,
+ pilots,
+ len,
+ nb_rb);
#if UE_TIMING_TRACE
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
@@ -462,42 +428,40 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
#endif
if (first_symbol_flag==1) {
if (beamforming_mode==0){
- if (dlsch0_harq->mimo_modedl_ch_estimates_ext,
- frame_parms,
- avg,
- symbol,
- len,
- nb_rb);
- avgs = 0;
- for (aatx=0;aatxnb_antenna_ports_gNB;aatx++)
- for (aarx=0;aarxnb_antennas_rx;aarx++)
- avgs = cmax(avgs,avg[(aatx<<1)+aarx]);
+ nr_dlsch_channel_level(pdsch_vars[gNB_id]->dl_ch_estimates_ext,
+ frame_parms,
+ n_tx,
+ avg,
+ symbol,
+ len,
+ nb_rb);
+ avgs = 0;
+ for (aatx=0;aatxnb_antennas_rx+aarx]);
+ avgs = cmax(avgs,avg[(aatx*frame_parms->nb_antennas_rx)+aarx]);
+ //LOG_I(PHY, "avgs Power per SC is %d\n", avgs);
+ median[(aatx*frame_parms->nb_antennas_rx)+aarx] = avg[(aatx*frame_parms->nb_antennas_rx)+aarx];
+ }
+ pdsch_vars[gNB_id]->log2_maxh = (log2_approx(avgs)/2)+3;
+ //LOG_I(PHY, "avgs Power per SC is %d lg2_maxh %d\n", avgs, pdsch_vars[gNB_id]->log2_maxh);
- pdsch_vars[gNB_id]->log2_maxh = (log2_approx(avgs)/2)+3;
- }
- else if (dlsch0_harq->mimo_mode == NR_DUALSTREAM)
- {
- nr_dlsch_channel_level_median(pdsch_vars[gNB_id]->dl_ch_estimates_ext,
- median,
- n_tx,
- n_rx,
- 2*len,// subcarriers Re Im
- 0);
+ if (dlsch0_harq->mimo_mode == NR_DUALSTREAM) {
+ nr_dlsch_channel_level_median(pdsch_vars[gNB_id]->dl_ch_estimates_ext,
+ median,
+ n_tx,
+ n_rx,
+ len,
+ symbol*nb_rb*12);
- for (aatx = 0; aatx < n_tx; ++aatx)
- {
- for (aarx = 0; aarx < n_rx; ++aarx)
- {
- avgs = cmax(avgs, median[aatx*n_rx + aarx]);
- }
- }
-
- pdsch_vars[gNB_id]->log2_maxh = (log2_approx(avgs)/2) + 1; // this might need to be tuned
-
- }
+ for (aatx = 0; aatx < n_tx; aatx++) {
+ for (aarx = 0; aarx < n_rx; aarx++) {
+ avgs = cmax(avgs, median[aatx*n_rx + aarx]);
+ }
+ }
+ pdsch_vars[gNB_id]->log2_maxh = (log2_approx(avgs)/2) + 1;
+ }
}
- //#ifdef UE_DEBUG_TRACE
LOG_D(PHY,"[DLSCH] AbsSubframe %d.%d log2_maxh = %d [log2_maxh0 %d log2_maxh1 %d] (%d,%d)\n",
frame%1024,
nr_slot_rx,
@@ -506,22 +470,8 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
pdsch_vars[gNB_id]->log2_maxh1,
avg[0],
avgs);
- //LOG_D(PHY,"[DLSCH] mimo_mode = %d\n", dlsch0_harq->mimo_mode);
- //#endif
-
- //wait until pdcch is decoded
- //proc->channel_level = 1;
}
- /*
- uint32_t wait = 0;
- while(proc->channel_level == 0)
- {
- usleep(1);
- wait++;
- }
- */
-
#if T_TRACER
if (type == PDSCH)
{
@@ -546,58 +496,25 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
// Now channel compensation
if (dlsch0_harq->mimo_moderxdataF_ext,
- pdsch_vars[gNB_id]->dl_ch_estimates_ext,
- pdsch_vars[gNB_id]->dl_ch_mag0,
- pdsch_vars[gNB_id]->dl_ch_magb0,
- pdsch_vars[gNB_id]->dl_ch_magr0,
- pdsch_vars[gNB_id]->rxdataF_comp0,
- (aatx>1) ? pdsch_vars[gNB_id]->rho : NULL,
- frame_parms,
- symbol,
- pilots,
- first_symbol_flag,
- dlsch0_harq->Qm,
- nb_rb,
- pdsch_vars[gNB_id]->log2_maxh,
- measurements); // log2_maxh+I0_shift
- /*if (symbol == 5) {
- write_output("rxF_comp_d.m","rxF_c_d",&pdsch_vars[gNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
- } */
+ pdsch_vars[gNB_id]->dl_ch_estimates_ext,
+ pdsch_vars[gNB_id]->dl_ch_mag0,
+ pdsch_vars[gNB_id]->dl_ch_magb0,
+ pdsch_vars[gNB_id]->dl_ch_magr0,
+ pdsch_vars[gNB_id]->rxdataF_comp0,
+ (n_tx>1) ? pdsch_vars[gNB_id]->rho : NULL,
+ frame_parms,
+ n_tx,
+ symbol,
+ pilots,
+ first_symbol_flag,
+ dlsch0_harq->Qm,
+ nb_rb,
+ pdsch_vars[gNB_id]->log2_maxh,
+ measurements); // log2_maxh+I0_shift
+ }
- /*if ((rx_type==rx_IC_single_stream) &&
- (eNB_id_in_connected_gNB)) {
- nr_dlsch_channel_compensation(pdsch_vars[eNB_id_i]->rxdataF_ext,
- pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
- pdsch_vars[eNB_id_i]->dl_ch_mag0,
- pdsch_vars[eNB_id_i]->dl_ch_magb0,
- pdsch_vars[eNB_id_i]->rxdataF_comp0,
- (aatx>1) ? pdsch_vars[eNB_id_i]->rho : NULL,
- frame_parms,
- symbol,
- first_symbol_flag,
- i_mod,
- nb_rb,
- pdsch_vars[gNB_id]->log2_maxh,
- measurements); // log2_maxh+I0_shift
-#ifdef DEBUG_PHY
- if (symbol == 5) {
- write_output("rxF_comp_d.m","rxF_c_d",&pdsch_vars[gNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
- write_output("rxF_comp_i.m","rxF_c_i",&pdsch_vars[eNB_id_i]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
- }
-#endif
-
- dlsch_dual_stream_correlation(frame_parms,
- symbol,
- nb_rb,
- pdsch_vars[gNB_id]->dl_ch_estimates_ext,
- pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
- pdsch_vars[gNB_id]->dl_ch_rho_ext[harq_pid][round],
- pdsch_vars[gNB_id]->log2_maxh);
- }*/
- }
-
- else if (dlsch0_harq->mimo_mode == NR_DUALSTREAM){
- nr_dlsch_channel_compensation_core(pdsch_vars[gNB_id]->rxdataF_ext,
+ else if (dlsch0_harq->mimo_mode == NR_DUALSTREAM) {
+ nr_dlsch_channel_compensation_core(pdsch_vars[gNB_id]->rxdataF_ext,
pdsch_vars[gNB_id]->dl_ch_estimates_ext,
pdsch_vars[gNB_id]->dl_ch_mag0,
pdsch_vars[gNB_id]->dl_ch_magb0,
@@ -609,40 +526,16 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
pdsch_vars[gNB_id]->log2_maxh,
2*len, // subcarriers Re Im
0); // we start from the beginning of the vector
- /* if (symbol == 5) {
- write_output("rxF_comp_d00.m","rxF_c_d00",&pdsch_vars[gNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);// should be QAM
- write_output("rxF_comp_d01.m","rxF_c_d01",&pdsch_vars[gNB_id]->rxdataF_comp0[1][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0
- write_output("rxF_comp_d10.m","rxF_c_d10",&pdsch_vars[gNB_id]->rxdataF_comp1[harq_pid][round][0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0
- write_output("rxF_comp_d11.m","rxF_c_d11",&pdsch_vars[gNB_id]->rxdataF_comp1[harq_pid][round][1][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be QAM
- } */
- // compute correlation between signal and interference channels (rho12 and rho21)
- nr_dlsch_dual_stream_correlation_core(pdsch_vars[gNB_id]->dl_ch_estimates_ext,
- &(pdsch_vars[gNB_id]->dl_ch_estimates_ext[2]),
- pdsch_vars[gNB_id]->dl_ch_rho_ext[harq_pid][round],
- n_tx,
- n_rx,
- pdsch_vars[gNB_id]->log2_maxh,
- 2*len,
- 0);
- //printf("rho stream1 =%d\n", &pdsch_vars[gNB_id]->dl_ch_rho_ext[harq_pid][round] );
- nr_dlsch_dual_stream_correlation_core(&(pdsch_vars[gNB_id]->dl_ch_estimates_ext[2]),
- pdsch_vars[gNB_id]->dl_ch_estimates_ext,
- pdsch_vars[gNB_id]->dl_ch_rho2_ext,
- n_tx,
- n_rx,
- pdsch_vars[gNB_id]->log2_maxh,
- 2*len,
- 0);
- // printf("rho stream2 =%d\n",&pdsch_vars[gNB_id]->dl_ch_rho2_ext );
- //printf("TM3 log2_maxh : %d\n",pdsch_vars[gNB_id]->log2_maxh);
- /* if (symbol == 5) {
- write_output("rho0_0.m","rho0_0",&pdsch_vars[gNB_id]->dl_ch_rho_ext[harq_pid][round][0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);// should be QAM
- write_output("rho2_0.m","rho2_0",&pdsch_vars[gNB_id]->dl_ch_rho2_ext[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0
- write_output("rho0_1.m.m","rho0_1",&pdsch_vars[gNB_id]->dl_ch_rho_ext[harq_pid][round][1][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0
- write_output("rho2_1.m","rho2_1",&pdsch_vars[gNB_id]->dl_ch_rho2_ext[1][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be QAM
- } */
-
- }
+ // compute correlation between signal and interference channels (rho12 and rho21)
+ nr_dlsch_dual_stream_correlation_core(pdsch_vars[gNB_id]->dl_ch_estimates_ext,
+ &(pdsch_vars[gNB_id]->dl_ch_estimates_ext[2]),
+ pdsch_vars[gNB_id]->dl_ch_rho_ext[harq_pid][round],
+ n_tx,
+ n_rx,
+ pdsch_vars[gNB_id]->log2_maxh,
+ 2*len,
+ 0);
+ }
#if UE_TIMING_TRACE
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
@@ -657,35 +550,50 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
#endif
- if (frame_parms->nb_antennas_rx > 1) {
- if (dlsch0_harq->mimo_mode == NR_DUALSTREAM){
- nr_dlsch_detection_mrc_core(pdsch_vars[gNB_id]->rxdataF_comp0,
- NULL,
- pdsch_vars[gNB_id]->dl_ch_rho_ext[harq_pid][round],
- pdsch_vars[gNB_id]->dl_ch_rho2_ext,
- pdsch_vars[gNB_id]->dl_ch_mag0,
- pdsch_vars[gNB_id]->dl_ch_magb0,
- NULL,
- NULL,
- n_tx,
- n_rx,
- 2*len,
- 0);
- /* if (symbol == 5) {
- write_output("rho0_mrc.m","rho0_0",&pdsch_vars[gNB_id]->dl_ch_rho_ext[harq_pid][round][0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);// should be QAM
- write_output("rho2_mrc.m","rho2_0",&pdsch_vars[gNB_id]->dl_ch_rho2_ext[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0
- } */
+ if (frame_parms->nb_antennas_rx > 1) {
+ if (dlsch0_harq->mimo_moderxdataF_comp0,
+ (n_tx>1)? pdsch_vars[gNB_id]->rho : NULL,
+ pdsch_vars[gNB_id]->dl_ch_mag0,
+ pdsch_vars[gNB_id]->dl_ch_magb0,
+ n_tx,
+ n_rx,
+ symbol,
+ nb_rb);
+ if (n_tx == 2)//Apply zero forcing for 2 Tx layers
+ nr_zero_forcing_rx_2layers(pdsch_vars[gNB_id]->rxdataF_comp0,
+ pdsch_vars[gNB_id]->dl_ch_mag0,
+ pdsch_vars[gNB_id]->dl_ch_magb0,
+ pdsch_vars[gNB_id]->dl_ch_estimates_ext,
+ nb_rb,
+ n_rx,
+ dlsch0_harq->Qm,
+ pdsch_vars[gNB_id]->log2_maxh,
+ symbol);
}
+ else if (dlsch0_harq->mimo_mode == NR_DUALSTREAM) {
+ nr_dlsch_detection_mrc_core(pdsch_vars[gNB_id]->rxdataF_comp0,
+ NULL,
+ pdsch_vars[gNB_id]->dl_ch_rho_ext[harq_pid][round],
+ pdsch_vars[gNB_id]->dl_ch_rho2_ext,
+ pdsch_vars[gNB_id]->dl_ch_mag0,
+ pdsch_vars[gNB_id]->dl_ch_magb0,
+ NULL,
+ NULL,
+ n_tx,
+ n_rx,
+ 2*len,
+ 0);
}
-
- //printf("start compute LLR\n");
+ }
+ //printf("start compute LLR\n");
if (dlsch0_harq->mimo_mode == NR_DUALSTREAM) {
rxdataF_comp_ptr = pdsch_vars[gNB_id]->rxdataF_comp1[harq_pid][round];
dl_ch_mag_ptr = pdsch_vars[gNB_id]->dl_ch_mag1[harq_pid][round];
}
else {
- rxdataF_comp_ptr = pdsch_vars[eNB_id_i]->rxdataF_comp0;
- dl_ch_mag_ptr = pdsch_vars[eNB_id_i]->dl_ch_mag0;
+ rxdataF_comp_ptr = pdsch_vars[gNB_id_i]->rxdataF_comp0;
+ dl_ch_mag_ptr = pdsch_vars[gNB_id_i]->dl_ch_mag0;
//i_mod should have been passed as a parameter
}
@@ -747,7 +655,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
rxdataF_comp_ptr, dl_ch_mag_ptr,
dlsch0_harq, dlsch1_harq,
rx_type, harq_pid,
- gNB_id, eNB_id_i,
+ gNB_id, gNB_id_i,
first_symbol_flag,
i, nb_rb, round,
codeword_TB0, codeword_TB1,
@@ -868,10 +776,11 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext,
int **dl_ch_magb,
int **dl_ch_magr,
int **rxdataF_comp,
- int **rho,
+ int ***rho,
NR_DL_FRAME_PARMS *frame_parms,
+ uint8_t nb_aatx,
unsigned char symbol,
- uint8_t pilots,
+ uint8_t pilots,
uint8_t first_symbol_flag,
unsigned char mod_order,
unsigned short nb_rb,
@@ -882,12 +791,12 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext,
#if defined(__i386) || defined(__x86_64)
unsigned short rb;
- unsigned char aatx,aarx;
+ unsigned char aatx,aarx,atx;
__m128i *dl_ch128,*dl_ch128_2,*dl_ch_mag128,*dl_ch_mag128b,*dl_ch_mag128r,*rxdataF128,*rxdataF_comp128,*rho128;
__m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b,QAM_amp128r;
QAM_amp128b = _mm_setzero_si128();
- for (aatx=0; aatxnb_antenna_ports_gNB; aatx++) {
+ for (aatx=0; aatxnb_antennas_rx; aarx++) {
- dl_ch128 = (__m128i *)&dl_ch_estimates_ext[(aatx<<1)+aarx][symbol*nb_rb*12];
- dl_ch_mag128 = (__m128i *)&dl_ch_mag[(aatx<<1)+aarx][symbol*nb_rb*12];
- dl_ch_mag128b = (__m128i *)&dl_ch_magb[(aatx<<1)+aarx][symbol*nb_rb*12];
- dl_ch_mag128r = (__m128i *)&dl_ch_magr[(aatx<<1)+aarx][symbol*nb_rb*12];
+ dl_ch128 = (__m128i *)&dl_ch_estimates_ext[(aatx*frame_parms->nb_antennas_rx)+aarx][symbol*nb_rb*12];
+ dl_ch_mag128 = (__m128i *)&dl_ch_mag[(aatx*frame_parms->nb_antennas_rx)+aarx][symbol*nb_rb*12];
+ dl_ch_mag128b = (__m128i *)&dl_ch_magb[(aatx*frame_parms->nb_antennas_rx)+aarx][symbol*nb_rb*12];
+ dl_ch_mag128r = (__m128i *)&dl_ch_magr[(aatx*frame_parms->nb_antennas_rx)+aarx][symbol*nb_rb*12];
rxdataF128 = (__m128i *)&rxdataF_ext[aarx][symbol*nb_rb*12];
- rxdataF_comp128 = (__m128i *)&rxdataF_comp[(aatx<<1)+aarx][symbol*nb_rb*12];
-
+ rxdataF_comp128 = (__m128i *)&rxdataF_comp[(aatx*frame_parms->nb_antennas_rx)+aarx][symbol*nb_rb*12];
for (rb=0; rb2) {
@@ -997,10 +905,15 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext,
// print_ints("c0",&mmtmpD2);
// print_ints("c1",&mmtmpD3);
rxdataF_comp128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
+ //printf("arx%d atx%d rb_index %d symbol%d\n",aarx,aatx,rb,symbol);
// print_shorts("rx:",rxdataF128);
// print_shorts("ch:",dl_ch128);
// print_shorts("pack:",rxdataF_comp128);
+ //printf("arx%d atx%d rb_index %d symbol%d\n",aarx,aatx,rb,symbol);
+ //print_shorts("rx:",(int16_t*)&rxdataF128[0]);
+ //print_shorts("ch:",(int16_t*)&dl_ch128[0]);
+ //print_shorts("pack:",(int16_t*)&rxdataF_comp128[0]);
// multiply by conjugated channel
mmtmpD0 = _mm_madd_epi16(dl_ch128[1],rxdataF128[1]);
// mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
@@ -1015,9 +928,9 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext,
mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
rxdataF_comp128[1] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
- // print_shorts("rx:",rxdataF128+1);
- // print_shorts("ch:",dl_ch128+1);
- // print_shorts("pack:",rxdataF_comp128+1);
+ //print_shorts("rx:",(int16_t*)&rxdataF128[1]);
+ //print_shorts("ch:",(int16_t*)&dl_ch128[1]);
+ //print_shorts("pack:",(int16_t*)&rxdataF_comp128[1]);
if (pilots==0) {
// multiply by conjugated channel
@@ -1034,9 +947,9 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext,
mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
rxdataF_comp128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
- // print_shorts("rx:",rxdataF128+2);
- // print_shorts("ch:",dl_ch128+2);
- // print_shorts("pack:",rxdataF_comp128+2);
+ //print_shorts("rx:",(int16_t*)&rxdataF128[2]);
+ //print_shorts("ch:",(int16_t*)&dl_ch128[2]);
+ //print_shorts("pack:",(int16_t*)&rxdataF_comp128[2]);
dl_ch128+=3;
dl_ch_mag128+=3;
@@ -1044,107 +957,145 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext,
dl_ch_mag128r+=3;
rxdataF128+=3;
rxdataF_comp128+=3;
- } else { // we have a smaller PDSCH in symbols with pilots so skip last group of 4 REs and increment less
- dl_ch128+=2;
- dl_ch_mag128+=2;
- dl_ch_mag128b+=2;
- dl_ch_mag128r+=2;
- rxdataF128+=2;
- rxdataF_comp128+=2;
}
-
+ else { // we have a smaller PDSCH in symbols with pilots so skip last group of 4 REs and increment less
+ dl_ch128+=2;
+ dl_ch_mag128+=2;
+ dl_ch_mag128b+=2;
+ dl_ch_mag128r+=2;
+ rxdataF128+=2;
+ rxdataF_comp128+=2;
+ }
}
}
}
-
if (rho) {
+ //we compute the Tx correlation matrix for each Rx antenna
+ //As an example the 2x2 MIMO case requires
+ //rho[aarx][nb_aatx*nb_aatx] = [cov(H_aarx_0,H_aarx_0) cov(H_aarx_0,H_aarx_1)
+ // cov(H_aarx_1,H_aarx_0) cov(H_aarx_1,H_aarx_1)], aarx=0,...,nb_antennas_rx-1
+ int avg_rho_re[frame_parms->nb_antennas_rx][nb_aatx*nb_aatx];
+ int avg_rho_im[frame_parms->nb_antennas_rx][nb_aatx*nb_aatx];
for (aarx=0; aarxnb_antennas_rx; aarx++) {
- rho128 = (__m128i *)&rho[aarx][symbol*frame_parms->N_RB_DL*12];
- dl_ch128 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12];
- dl_ch128_2 = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12];
- for (rb=0; rbnb_antennas_rx+aarx][symbol*nb_rb*12];
- // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
- mmtmpD1 = _mm_shufflelo_epi16(dl_ch128[0],_MM_SHUFFLE(2,3,0,1));
- mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
- mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]);
- // print_ints("im",&mmtmpD1);
- mmtmpD1 = _mm_madd_epi16(mmtmpD1,dl_ch128_2[0]);
- // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
- mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
- // print_ints("re(shift)",&mmtmpD0);
- mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
- // print_ints("im(shift)",&mmtmpD1);
- mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
- mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
- // print_ints("c0",&mmtmpD2);
- // print_ints("c1",&mmtmpD3);
- rho128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
+ for (atx=0; atxnb_antennas_rx+aarx][symbol*nb_rb*12];
- //print_shorts("rx:",dl_ch128_2);
- //print_shorts("ch:",dl_ch128);
- //print_shorts("pack:",rho128);
+ for (rb=0; rbrx_correlation[0][aarx] = signal_energy(&rho[aarx][symbol*nb_rb*12],rb*12);
+ rho128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
+ //print_shorts("rx:",dl_ch128_2+2);
+ //print_shorts("ch:",dl_ch128+2);
+ //print_shorts("pack:",rho128+2);
+ avg_rho_re[aarx][aatx*nb_aatx+atx] +=(((int16_t*)&rho128[2])[0]+
+ ((int16_t*)&rho128[2])[2] +
+ ((int16_t*)&rho128[2])[4] +
+ ((int16_t*)&rho128[2])[6])/16;
+
+ avg_rho_im[aarx][aatx*nb_aatx+atx] +=(((int16_t*)&rho128[2])[1]+
+ ((int16_t*)&rho128[2])[3] +
+ ((int16_t*)&rho128[2])[5] +
+ ((int16_t*)&rho128[2])[7])/16;
+
+ dl_ch128+=3;
+ dl_ch128_2+=3;
+ rho128+=3;
+ }
+ if (first_symbol_flag==1) {
+ //measurements->rx_correlation[0][0][aarx] = signal_energy(&rho[aarx][aatx*nb_aatx+atx][symbol*nb_rb*12],rb*12);
+ avg_rho_re[aarx][aatx*nb_aatx+atx] = 16*avg_rho_re[aarx][aatx*nb_aatx+atx]/(nb_rb*12);
+ avg_rho_im[aarx][aatx*nb_aatx+atx] = 16*avg_rho_im[aarx][aatx*nb_aatx+atx]/(nb_rb*12);
+ printf("rho[rx]%d tx%d tx%d = Re: %d Im: %d\n",aarx, aatx,atx, avg_rho_re[aarx][aatx*nb_aatx+atx], avg_rho_im[aarx][aatx*nb_aatx+atx]);
+ }
+ }
}
}
}
-
_mm_empty();
_m_empty();
#elif defined(__arm__)
-
unsigned short rb;
unsigned char aatx,aarx,symbol_mod,pilots=0;
@@ -1349,7 +1300,7 @@ void nr_dlsch_channel_compensation_core(int **rxdataF_ext,
int **dl_ch_mag,
int **dl_ch_magb,
int **rxdataF_comp,
- int **rho,
+ int ***rho,
unsigned char n_tx,
unsigned char n_rx,
unsigned char mod_order,
@@ -1486,7 +1437,7 @@ void nr_dlsch_channel_compensation_core(int **rxdataF_ext,
for (aarx=0; aarxnb_antenna_ports_gNB; aatx++) {
- for (aarx=0; aarxnb_antennas_rx; aarx++) {
+ for (aatx=0; aatxnb_antenna_ports_gNB; aatx++)
+ for (aatx=0; aatxnb_antennas_rx; aarx++) {
//clear average level
avg128D = _mm_setzero_si128();
- // 5 is always a symbol with no pilots for both normal and extended prefix
- dl_ch128=(__m128i *)&dl_ch_estimates_ext[(aatx<<1)+aarx][symbol*nb_rb*12];
+ dl_ch128=(__m128i *)&dl_ch_estimates_ext[(aatx*frame_parms->nb_antennas_rx)+aarx][symbol*nb_rb*12];
for (rb=0;rbnb_antennas_rx)+aarx] =(((int32_t*)&avg128D)[0] +
((int32_t*)&avg128D)[1] +
((int32_t*)&avg128D)[2] +
((int32_t*)&avg128D)[3])/y;
@@ -1729,38 +1682,36 @@ void nr_dlsch_channel_level_median(int **dl_ch_estimates_ext,
int norm_pack;
__m128i *dl_ch128, norm128D;
- for (aatx=0; aatx>2;
+ length2 = length>>2;//length = number of REs, hence length2=nb_REs*(32/128) in SIMD loop
for (ii=0;ii max)
- max = norm_pack;
+ max = norm_pack;//store values more than max
if (norm_pack < min)
- min = norm_pack;
-
+ min = norm_pack;//store values less than min
dl_ch128+=1;
}
- median[aatx*n_rx + aarx] = (max+min)>>1;
-
- // printf("Channel level median [%d]: %d\n",aatx*n_rx + aarx, median[aatx*n_rx + aarx]);
+ median[aatx*n_rx + aarx] = (max+min)>>1;
+ //printf("Channel level median [%d]: %d max = %d min = %d\n",aatx*n_rx + aarx, median[aatx*n_rx + aarx],max,min);
}
- }
+ }
_mm_empty();
_m_empty();
@@ -2100,37 +2051,37 @@ void nr_dlsch_detection_mrc_core(int **rxdataF_comp,
//==============================================================================================
unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
- int **dl_ch_estimates,
- int **rxdataF_ext,
- int **dl_ch_estimates_ext,
- unsigned short pmi,
- unsigned char *pmi_ext,
- unsigned char symbol,
- uint8_t pilots,
- uint8_t config_type,
- unsigned short start_rb,
- unsigned short nb_rb_pdsch,
- unsigned char nr_slot_rx,
- uint32_t high_speed_flag,
+ int **dl_ch_estimates,
+ int **rxdataF_ext,
+ int **dl_ch_estimates_ext,
+ unsigned char symbol,
+ uint8_t pilots,
+ uint8_t config_type,
+ unsigned short start_rb,
+ unsigned short nb_rb_pdsch,
+ uint8_t n_dmrs_cdm_groups,
NR_DL_FRAME_PARMS *frame_parms,
- uint16_t dlDmrsSymbPos) {
-
-
+ uint16_t dlDmrsSymbPos)
+{
unsigned short k,rb;
- unsigned char i,aarx; //,nsymb,sss_symb,pss_symb=0,l;
+ unsigned char nushift,i,aarx;
int *dl_ch0,*dl_ch0_ext,*rxF,*rxF_ext;
int8_t validDmrsEst = 0; //store last DMRS Symbol index
unsigned char j=0;
- if (config_type==pdsch_dmrs_type1)
- AssertFatal(frame_parms->nushift ==0 || frame_parms->nushift == 1,
- "nushift %d is illegal\n",frame_parms->nushift);
- else
- AssertFatal(frame_parms->nushift ==0 || frame_parms->nushift == 2 || frame_parms->nushift == 4,
- "nushift %d is illegal\n",frame_parms->nushift);
+ if (config_type==pdsch_dmrs_type1) {
+ AssertFatal(n_dmrs_cdm_groups == 1 || n_dmrs_cdm_groups == 2,
+ "n_dmrs_cdm_groups %d is illegal\n",n_dmrs_cdm_groups);
+ nushift = n_dmrs_cdm_groups -1;//delta in Table 7.4.1.1.2-1
+
+ } else {
+ AssertFatal(n_dmrs_cdm_groups == 1 || n_dmrs_cdm_groups == 2 || n_dmrs_cdm_groups == 3,
+ "n_dmrs_cdm_groups %d is illegal\n",n_dmrs_cdm_groups);
+ nushift = (n_dmrs_cdm_groups -1)<<1;//delta in Table 7.4.1.1.2-2
+ }
for (aarx=0; aarxnb_antennas_rx; aarx++) {
@@ -2151,33 +2102,35 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
rxF = &rxdataF[aarx][(k+(symbol*(frame_parms->ofdm_symbol_size)))];
}
if (pilots==0) {
- memcpy((void*)rxF_ext,(void*)rxF,12*sizeof(*rxF_ext));
- memcpy((void*)dl_ch0_ext,(void*)dl_ch0,12*sizeof(*dl_ch0_ext));
- dl_ch0_ext+=12;
- rxF_ext+=12;
+ memcpy((void*)rxF_ext,(void*)rxF,12*sizeof(*rxF_ext));
+ memcpy((void*)dl_ch0_ext,(void*)dl_ch0,12*sizeof(*dl_ch0_ext));
+ dl_ch0_ext+=12;
+ rxF_ext+=12;
} else {//the symbol contains DMRS
j=0;
if (config_type==pdsch_dmrs_type1){
- for (i = (1-frame_parms->nushift); i<12; i+=2) {
+ if (nushift == 0) {//data is multiplexed
+ for (i = (1-nushift); i<12; i+=2) {
+ rxF_ext[j]=rxF[i];
+ dl_ch0_ext[j]=dl_ch0[i];
+ j++;
+ }
+ dl_ch0_ext+=6;
+ rxF_ext+=6;
+ }
+ } else {//pdsch_dmrs_type2
+ for (i = (2+nushift); i<6; i++) {
rxF_ext[j]=rxF[i];
dl_ch0_ext[j]=dl_ch0[i];
j++;
}
- dl_ch0_ext+=6;
- rxF_ext+=6;
- } else {
- for (i = (2+frame_parms->nushift); i<6; i++) {
+ for (i = (8+nushift); i<12; i++) {
rxF_ext[j]=rxF[i];
dl_ch0_ext[j]=dl_ch0[i];
j++;
}
- for (i = (8+frame_parms->nushift); i<12; i++) {
- rxF_ext[j]=rxF[i];
- dl_ch0_ext[j]=dl_ch0[i];
- j++;
- }
- dl_ch0_ext+= 8;
- rxF_ext+= 8;
+ dl_ch0_ext+= j;
+ rxF_ext+= j;
}
}
@@ -2190,104 +2143,782 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
}
}
}
-
-
- return(nb_rb_pdsch/frame_parms->nb_antennas_rx);
+ return(nb_rb_pdsch);
}
-unsigned short nr_dlsch_extract_rbs_dual(int **rxdataF,
- int **dl_ch_estimates,
- int **rxdataF_ext,
- int **dl_ch_estimates_ext,
- unsigned short pmi,
- unsigned char *pmi_ext,
- unsigned char symbol,
- uint8_t pilots,
- unsigned short start_rb,
- unsigned short nb_rb_pdsch,
- unsigned char nr_slot_rx,
- uint32_t high_speed_flag,
- NR_DL_FRAME_PARMS *frame_parms,
- MIMO_mode_t mimo_mode) {
+unsigned short nr_dlsch_extract_rbs_multiple(int **rxdataF,
+ int **dl_ch_estimates,
+ int **rxdataF_ext,
+ int **dl_ch_estimates_ext,
+ unsigned char symbol,
+ uint8_t pilots,
+ uint8_t config_type,
+ unsigned short start_rb,
+ unsigned short nb_rb_pdsch,
+ uint8_t n_dmrs_cdm_groups,
+ uint8_t Nl,
+ NR_DL_FRAME_PARMS *frame_parms,
+ uint16_t dlDmrsSymbPos)
+{
- int prb,nb_rb=0;
- unsigned short k;
- int i,j,aarx;
- int32_t *dl_ch0=NULL,*dl_ch0_ext=NULL,*dl_ch1=NULL,*dl_ch1_ext=NULL,*rxF=NULL,*rxF_ext=NULL;
+ unsigned short k,rb;
+ unsigned char nushift,j,i,aarx,aatx;
+ int *dl_ch0,*dl_ch0_ext,*rxF,*rxF_ext;
+ int8_t validDmrsEst = 0; //store last DMRS Symbol index
- k = frame_parms->first_carrier_offset + 516; //0
+ if (config_type==pdsch_dmrs_type1) {
+ AssertFatal(n_dmrs_cdm_groups == 1 || n_dmrs_cdm_groups == 2,
+ "n_dmrs_cdm_groups %d is illegal\n",n_dmrs_cdm_groups);
+ nushift = n_dmrs_cdm_groups -1;//delta in Table 7.4.1.1.2-1
+ } else {
+ AssertFatal(n_dmrs_cdm_groups == 1 || n_dmrs_cdm_groups == 2 || n_dmrs_cdm_groups == 3,
+ "n_dmrs_cdm_groups %d is illegal\n",n_dmrs_cdm_groups);
+ nushift = (n_dmrs_cdm_groups -1)<<1;//delta in Table 7.4.1.1.2-2
+ }
+
+ validDmrsEst = get_valid_dmrs_idx_for_channel_est(dlDmrsSymbPos,symbol);
for (aarx=0; aarxnb_antennas_rx; aarx++) {
- if (high_speed_flag==1) {
- dl_ch0 = &dl_ch_estimates[aarx][symbol*(frame_parms->ofdm_symbol_size)];
- dl_ch1 = &dl_ch_estimates[2+aarx][symbol*(frame_parms->ofdm_symbol_size)];
- } else {
- dl_ch0 = &dl_ch_estimates[aarx][0];
- dl_ch1 = &dl_ch_estimates[2+aarx][0];
- }
+ k = frame_parms->first_carrier_offset + NR_NB_SC_PER_RB*start_rb;
+ if (k>frame_parms->ofdm_symbol_size)
+ k = k-frame_parms->ofdm_symbol_size;
- //pmi_loc = pmi_ext;
+ rxF_ext = &rxdataF_ext[aarx][symbol*(nb_rb_pdsch*12)];
+ rxF = &rxdataF[aarx][(k+(symbol*(frame_parms->ofdm_symbol_size)))];
- // pointers to extracted RX signals and channel estimates
- rxF_ext = &rxdataF_ext[aarx][symbol*(nb_rb_pdsch*12)];
- dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol*(nb_rb_pdsch*12)];
- dl_ch1_ext = &dl_ch_estimates_ext[2+aarx][symbol*(nb_rb_pdsch*12)];
+ for (aatx=0; aatxN_RB_DL; prb++) {
- //skip_half=0;
+ dl_ch0 = &dl_ch_estimates[(aatx*frame_parms->nb_antennas_rx)+aarx][(validDmrsEst*(frame_parms->ofdm_symbol_size))];
+ dl_ch0_ext = &dl_ch_estimates_ext[(aatx*frame_parms->nb_antennas_rx)+aarx][symbol*(nb_rb_pdsch*NR_NB_SC_PER_RB)];
- if ((frame_parms->N_RB_DL&1) == 0) { // even number of RBs
-
- // For second half of RBs skip DC carrier
- if (k>=frame_parms->ofdm_symbol_size) {
- rxF = &rxdataF[aarx][(symbol*(frame_parms->ofdm_symbol_size))];
- k=k-(frame_parms->ofdm_symbol_size);
+ for (rb = 0; rb < nb_rb_pdsch; rb++)
+ {
+ if (pilots==0) {//data symbol only
+ if (aatx==0) {//Extract Rx signal only
+ memcpy((void*)rxF_ext,(void*)rxF,12*sizeof(*rxF_ext));
+ rxF_ext+=12;
+ }
+ memcpy((void*)dl_ch0_ext,(void*)dl_ch0,12*sizeof(*dl_ch0_ext));//Extract Channel Estimate
+ dl_ch0_ext+=12;
+ }
+ else {//the symbol contains DMRS
+ j=0;
+ if (config_type==pdsch_dmrs_type1) {
+ if (nushift == 0) {//data is multiplexed
+ for (i = (1-nushift); i<12; i+=2) {
+ if (aatx==0) rxF_ext[j]=rxF[i];
+ dl_ch0_ext[j]=dl_ch0[i];
+ j++;
+ }
+ dl_ch0_ext+=6;
+ if (aatx==0) rxF_ext+=6;
+ }
+ }
+ else {//pdsch_dmrs_type2
+ for (i = (2+nushift); i<6; i++) {
+ if (aatx==0) rxF_ext[j]=rxF[i];
+ dl_ch0_ext[j]=dl_ch0[i];
+ j++;
+ }
+ for (i = (8+nushift); i<12; i++) {
+ if (aatx==0) rxF_ext[j]=rxF[i];
+ dl_ch0_ext[j]=dl_ch0[i];
+ j++;
+ }
+ dl_ch0_ext+= j;
+ if (aatx==0) rxF_ext+= j;
+ }
}
- /*
- if (mimo_mode <= PUSCH_PRECODING1)
- *pmi_loc = (pmi>>((prb>>2)<<1))&3;
- else
- *pmi_loc=(pmi>>prb)&1;*/
-
- // *pmi_loc = get_pmi(frame_parms->N_RB_DL,mimo_mode,pmi,prb);
- // pmi_loc++;
-
-
- if (pilots == 0) {
-
- memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int));
- memcpy(dl_ch1_ext,dl_ch1,12*sizeof(int));
- memcpy(rxF_ext,rxF,12*sizeof(int));
- dl_ch0_ext +=12;
- dl_ch1_ext +=12;
- rxF_ext +=12;
- } else { // pilots==1
- j=0;
- for (i=0; i<12; i++) {
- if ((i&1)!=frame_parms->nushift) {
- rxF_ext[j]=rxF[i];
- // printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
- dl_ch0_ext[j]=dl_ch0[i];
- dl_ch1_ext[j++]=dl_ch1[i];
- }
- }
- dl_ch0_ext+=6;
- dl_ch1_ext+=6;
- rxF_ext+=6;
- } // pilots==1
-
- dl_ch0+=12;
- dl_ch1+=12;
+ dl_ch0+=12;
+ if (aatx==0) {
rxF+=12;
k+=12;
- }
- } // for prb
- } // for aarx
- return(nb_rb/frame_parms->nb_antennas_rx);
+ if (k>=frame_parms->ofdm_symbol_size) {
+ k=k-(frame_parms->ofdm_symbol_size);
+ rxF = &rxdataF[aarx][k+(symbol*(frame_parms->ofdm_symbol_size))];
+ }
+ }
+ }//rb
+ }//aatx
+ }//aarx
+ return(nb_rb_pdsch);
}
+void nr_dlsch_detection_mrc(int **rxdataF_comp,
+ int ***rho,
+ int **dl_ch_mag,
+ int **dl_ch_magb,
+ short n_tx,
+ short n_rx,
+ unsigned char symbol,
+ unsigned short nb_rb) {
+#if defined(__x86_64__)||defined(__i386__)
+ unsigned char aatx, aarx;
+ int i;
+ __m128i *rxdataF_comp128_0,*rxdataF_comp128_1,*dl_ch_mag128_0,*dl_ch_mag128_1,*dl_ch_mag128_0b,*dl_ch_mag128_1b;
+
+ if (n_rx>1) {
+ for (aatx=0; aatxN_RB_DL*12];
+ rho128_1 = (__m128i *) &rho[1][symbol*frame_parms->N_RB_DL*12];
+ for (i=0; i=2){
+ // (1/2^log2_maxh)*conj_H_00xH_00: (1/(64*2))conjH_00*H_00*2^15
+ nr_conjch0_mult_ch1(ch00,
+ ch00,
+ conjch00_ch00,
+ nb_rb,
+ shift);
+ // (1/2^log2_maxh)*conj_H_10xH_10: (1/(64*2))conjH_10*H_10*2^15
+ nr_conjch0_mult_ch1(ch10,
+ ch10,
+ conjch10_ch10,
+ nb_rb,
+ shift);
+ // conj_H_00xH_01
+ nr_conjch0_mult_ch1(ch00,
+ ch01,
+ conjch00_ch01,
+ nb_rb,
+ shift); // this shift is equal to the channel level log2_maxh
+ // conj_H_10xH_11
+ nr_conjch0_mult_ch1(ch10,
+ ch11,
+ conjch10_ch11,
+ nb_rb,
+ shift);
+ // conj_H_01xH_01
+ nr_conjch0_mult_ch1(ch01,
+ ch01,
+ conjch01_ch01,
+ nb_rb,
+ shift);
+ // conj_H_11xH_11
+ nr_conjch0_mult_ch1(ch11,
+ ch11,
+ conjch11_ch11,
+ nb_rb,
+ shift);
+ // conj_H_01xH_00
+ nr_conjch0_mult_ch1(ch01,
+ ch00,
+ conjch01_ch00,
+ nb_rb,
+ shift);
+ // conj_H_11xH_10
+ nr_conjch0_mult_ch1(ch11,
+ ch10,
+ conjch11_ch10,
+ nb_rb,
+ shift);
+ }
+ if (n_rx==4){
+ // (1/2^log2_maxh)*conj_H_20xH_20: (1/(64*2*16))conjH_20*H_20*2^15
+ nr_conjch0_mult_ch1(ch20,
+ ch20,
+ conjch20_ch20,
+ nb_rb,
+ shift);
+
+ // (1/2^log2_maxh)*conj_H_30xH_30: (1/(64*2*4))conjH_30*H_30*2^15
+ nr_conjch0_mult_ch1(ch30,
+ ch30,
+ conjch30_ch30,
+ nb_rb,
+ shift);
+
+ // (1/2^log2_maxh)*conj_H_20xH_20: (1/(64*2))conjH_20*H_20*2^15
+ nr_conjch0_mult_ch1(ch20,
+ ch21,
+ conjch20_ch21,
+ nb_rb,
+ shift);
+
+ nr_conjch0_mult_ch1(ch30,
+ ch31,
+ conjch30_ch31,
+ nb_rb,
+ shift);
+
+ nr_conjch0_mult_ch1(ch21,
+ ch21,
+ conjch21_ch21,
+ nb_rb,
+ shift);
+
+ nr_conjch0_mult_ch1(ch31,
+ ch31,
+ conjch31_ch31,
+ nb_rb,
+ shift);
+
+ // (1/2^log2_maxh)*conj_H_20xH_20: (1/(64*2))conjH_20*H_20*2^15
+ nr_conjch0_mult_ch1(ch21,
+ ch20,
+ conjch21_ch20,
+ nb_rb,
+ shift);
+
+ nr_conjch0_mult_ch1(ch31,
+ ch30,
+ conjch31_ch30,
+ nb_rb,
+ shift);
+
+ nr_construct_HhH_elements(conjch00_ch00,
+ conjch01_ch01,
+ conjch11_ch11,
+ conjch10_ch10,//
+ conjch20_ch20,
+ conjch21_ch21,
+ conjch30_ch30,
+ conjch31_ch31,
+ conjch00_ch01,
+ conjch01_ch00,
+ conjch10_ch11,
+ conjch11_ch10,//
+ conjch20_ch21,
+ conjch21_ch20,
+ conjch30_ch31,
+ conjch31_ch30,
+ af_mf_00,
+ af_mf_01,
+ af_mf_10,
+ af_mf_11,
+ nb_rb,
+ symbol);
+ }
+ if (n_rx==2){
+ nr_construct_HhH_elements(conjch00_ch00,
+ conjch01_ch01,
+ conjch11_ch11,
+ conjch10_ch10,//
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ conjch00_ch01,
+ conjch01_ch00,
+ conjch10_ch11,
+ conjch11_ch10,//
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ af_mf_00,
+ af_mf_01,
+ af_mf_10,
+ af_mf_11,
+ nb_rb,
+ symbol);
+ }
+ //det_HhH = ad -bc
+ nr_det_HhH(af_mf_00,//a
+ af_mf_01,//b
+ af_mf_10,//c
+ af_mf_11,//d
+ determ_fin,
+ nb_rb,
+ symbol);
+ /* 2- Compute the channel matrix inversion **********************************
+ *
+ * |(conj_H_00xH_00+conj_H_10xH_10) (conj_H_00xH_01+conj_H_10xH_11)|
+ * A= | |
+ * |(conj_H_01xH_00+conj_H_11xH_10) (conj_H_01xH_01+conj_H_11xH_11)|
+ *
+ *
+ *
+ *inv(A) =(1/det)*[d -b
+ * -c a]
+ *
+ *
+ **************************************************************************/
+ __m128i *rxdataF_comp128_0,*rxdataF_comp128_1,*dl_ch_mag128_0,*dl_ch_mag128b_0,*dl_ch_mag128_1,*dl_ch_mag128b_1,*determ_fin_128;
+ __m128i mmtmpD2,mmtmpD3,mmtmpD0,mmtmpD1,QAM_amp128,QAM_amp128b;
+ __m128i *after_mf_a_128,*after_mf_b_128, *after_mf_c_128, *after_mf_d_128;
+
+ determ_fin_128 = (__m128i *)&determ_fin[0];
+
+ rxdataF_comp128_0 = (__m128i *)&rxdataF_comp[0][symbol*nb_rb*12];//aatx=0 @ aarx =0
+ rxdataF_comp128_1 = (__m128i *)&rxdataF_comp[n_rx][symbol*nb_rb*12];//aatx=1 @ aarx =0
+
+ dl_ch_mag128_0 = (__m128i *)&dl_ch_mag[0][symbol*nb_rb*12];
+ dl_ch_mag128_1 = (__m128i *)&dl_ch_mag[n_rx][symbol*nb_rb*12];
+ dl_ch_mag128b_0 = (__m128i *)&dl_ch_magb[0][symbol*nb_rb*12];
+ dl_ch_mag128b_1 = (__m128i *)&dl_ch_magb[n_rx][symbol*nb_rb*12];
+
+ after_mf_a_128 = (__m128i *)af_mf_00;
+ after_mf_b_128 = (__m128i *)af_mf_01;
+ after_mf_c_128 = (__m128i *)af_mf_10;
+ after_mf_d_128 = (__m128i *)af_mf_11;
+
+ QAM_amp128b = _mm_setzero_si128();
+
+ if (mod_order == 4) {
+ QAM_amp128 = _mm_set1_epi16(QAM16_n1); // 2/sqrt(10)
+ QAM_amp128b = _mm_setzero_si128();
+ } else if (mod_order == 6) {
+ QAM_amp128 = _mm_set1_epi16(QAM64_n1); //
+ QAM_amp128b = _mm_set1_epi16(QAM64_n2);
+ }
+
+ for (int rb=0; rb<3*nb_rb; rb++) {
+ if (mod_order>2) {
+ // get channel determ (da -bc) if not QPSK
+ mmtmpD0 = _mm_packs_epi32(determ_fin_128[0],determ_fin_128[0]);//convert 32 bits to 16 bits
+
+ dl_ch_mag128_0[0] = _mm_unpacklo_epi16(mmtmpD0,mmtmpD0);
+ dl_ch_mag128b_0[0] = dl_ch_mag128_0[0];
+
+ dl_ch_mag128_0[0] = _mm_mulhi_epi16(dl_ch_mag128_0[0],QAM_amp128);
+ dl_ch_mag128_0[0] = _mm_slli_epi16(dl_ch_mag128_0[0],1);//aatx=0 @ aarx =0
+ dl_ch_mag128_1[0] = dl_ch_mag128_0[0];//aatx=1 @ aarx =0
+
+ dl_ch_mag128b_0[0] = _mm_mulhi_epi16(dl_ch_mag128b_0[0],QAM_amp128b);
+ dl_ch_mag128b_0[0] = _mm_slli_epi16(dl_ch_mag128b_0[0],1);//aatx=0 @ aarx =
+ dl_ch_mag128b_1[0] = dl_ch_mag128b_0[0];//aatx=1 @ aarx =0
+
+ if ((rb==0)&&(symbol==1)) {
+ printf("\n Signal mag after ZF \n");
+ print_shorts("mag layer 1:",(int16_t*)&dl_ch_mag128_0[0]);
+ print_shorts("mag layer 2:",(int16_t*)&dl_ch_mag128_1[0]);
+ print_shorts("magb layer 1:",(int16_t*)&dl_ch_mag128b_0[0]);
+ print_shorts("magb layer 2:",(int16_t*)&dl_ch_mag128b_1[0]);
+ }
+ }
+ // multiply by channel Inv
+ //rxdataF_zf128_0 = rxdataF_comp128_0*d - b*rxdataF_comp128_1
+ //rxdataF_zf128_1 = rxdataF_comp128_1*a - c*rxdataF_comp128_0
+ mmtmpD2 = nr_inv_comp_muli(rxdataF_comp128_0[0],//x
+ after_mf_d_128[0]);//y
+ mmtmpD3 = nr_inv_comp_muli(rxdataF_comp128_1[0],//x
+ after_mf_b_128[0]);//y
+ //mmtmpD2[0] - mmtmpD3[0]
+ //rxdataF_zf128_0
+ mmtmpD0 = _mm_sub_epi16(mmtmpD2, mmtmpD3);
+
+ mmtmpD2 = nr_inv_comp_muli(rxdataF_comp128_1[0],//x
+ after_mf_a_128[0]);//y
+ mmtmpD3 = nr_inv_comp_muli(rxdataF_comp128_0[0],//x
+ after_mf_c_128[0]);//y
+ //mmtmpD2[0] - mmtmpD3[0]
+ //rxdataF_zf128_1
+ mmtmpD1 = _mm_sub_epi16(mmtmpD2, mmtmpD3);
+
+ rxdataF_comp128_0[0] = mmtmpD0;
+ rxdataF_comp128_1[0] = mmtmpD1;
+
+ /*if ((rb==0)&&(symbol==1)) {
+ printf("\n Rx signal after ZF \n");
+ print_shorts("Rx layer 1:",(int16_t*)&rxdataF_comp128_0[0]);
+ print_shorts("Rx layer 2:",(int16_t*)&rxdataF_comp128_1[0]);
+ }*/
+
+ determ_fin_128 += 1;
+ dl_ch_mag128_0 += 1;
+ dl_ch_mag128b_0 += 1;
+ dl_ch_mag128_1 += 1;
+ dl_ch_mag128b_1 += 1;
+ rxdataF_comp128_0 += 1;
+ rxdataF_comp128_1 += 1;
+ after_mf_a_128 += 1;
+ after_mf_b_128 += 1;
+ after_mf_c_128 += 1;
+ after_mf_d_128 += 1;
+ }
+ _mm_empty();
+ _m_empty();
+ return(0);
+}
static void nr_dlsch_layer_demapping(int16_t **llr_cw,
uint8_t Nl,
@@ -2327,7 +2958,7 @@ static int nr_dlsch_llr(NR_UE_PDSCH **pdsch_vars,
RX_type_t rx_type,
unsigned char harq_pid,
unsigned char gNB_id,
- unsigned char eNB_id_i,
+ unsigned char gNB_id_i,
unsigned char first_symbol_flag,
unsigned char symbol,
unsigned short nb_rb,
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
index 189ad53efa..bfef89ea85 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
@@ -316,7 +316,6 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, int n_frames)
ue->init_sync_frame = is;
}
- nr_gold_pdcch(ue,0, 2);
/*
int nb_prefix_samples0 = fp->nb_prefix_samples0;
fp->nb_prefix_samples0 = fp->nb_prefix_samples;
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
index e33693ce0e..fbd718f0dc 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
@@ -60,16 +60,15 @@ uint16_t nr_pbch_extract(int **rxdataF,
uint8_t i,j,aarx;
int32_t *dl_ch0,*dl_ch0_ext,*rxF,*rxF_ext;
int nushiftmod4 = frame_parms->nushift;
- unsigned int rx_offset = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier; //and
-
- // if (rx_offset>= frame_parms->ofdm_symbol_size) rx_offset-=frame_parms->ofdm_symbol_size;
- rx_offset=(rx_offset)%(frame_parms->ofdm_symbol_size);
AssertFatal(symbol>=1 && symbol<5,
"symbol %d illegal for PBCH extraction\n",
symbol);
for (aarx=0; aarxnb_antennas_rx; aarx++) {
+ unsigned int rx_offset = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier;
+ rx_offset = (rx_offset)%(frame_parms->ofdm_symbol_size);
+
rxF = &rxdataF[aarx][(symbol+s_offset)*frame_parms->ofdm_symbol_size];
rxF_ext = &rxdataF_ext[aarx][symbol*20*12];
#ifdef DEBUG_PBCH
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
index 91274b908a..1e7e10def7 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
@@ -686,11 +686,8 @@ void dlsch_detection_mrc_TM34(NR_DL_FRAME_PARMS *frame_parms,
int32_t **dl_ch_estimates,
int32_t **rxdataF_ext,
int32_t **dl_ch_estimates_ext,
- uint16_t pmi,
- uint8_t *pmi_ext,
uint32_t *rb_alloc,
uint8_t symbol,
- uint8_t nr_slot_rx,
NR_DL_FRAME_PARMS *frame_parms)
\brief This function extracts the received resource blocks, both channel estimates and data symbols,
for the current allocation and for single antenna eNB transmission.
@@ -698,67 +695,61 @@ void dlsch_detection_mrc_TM34(NR_DL_FRAME_PARMS *frame_parms,
@param dl_ch_estimates Channel estimates of current slot
@param rxdataF_ext FFT output for RBs in this allocation
@param dl_ch_estimates_ext Channel estimates for RBs in this allocation
- @param pmi subband Precoding matrix indicator
- @param pmi_ext Extracted PMI for chosen RBs
@param rb_alloc RB allocation vector
@param symbol Symbol to extract
- @param nr_slot_rx Slot number
- @param high_speed_flag
+ @param n_dmrs_cdm_groups
@param frame_parms Pointer to frame descriptor
*/
unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
int **dl_ch_estimates,
int **rxdataF_ext,
int **dl_ch_estimates_ext,
- unsigned short pmi,
- unsigned char *pmi_ext,
unsigned char symbol,
uint8_t pilots,
uint8_t config_type,
unsigned short start_rb,
- unsigned short nb_pdsch_rb,
- unsigned char nr_slot_rx,
- uint32_t high_speed_flag,
+ unsigned short nb_rb_pdsch,
+ uint8_t n_dmrs_cdm_groups,
NR_DL_FRAME_PARMS *frame_parms,
uint16_t dlDmrsSymbPos);
-/** \fn dlsch_extract_rbs_dual(int32_t **rxdataF,
+/** \fn dlsch_extract_rbs_multiple(int32_t **rxdataF,
int32_t **dl_ch_estimates,
int32_t **rxdataF_ext,
int32_t **dl_ch_estimates_ext,
- uint16_t pmi,
- uint8_t *pmi_ext,
- uint32_t *rb_alloc,
- uint8_t symbol,
- NR_DL_FRAME_PARMS *frame_parms)
+ unsigned char symbol
+ uint8_t pilots,
+ uint8_t config_type,
+ unsigned short start_rb,
+ unsigned short nb_rb_pdsch,
+ uint8_t n_dmrs_cdm_groups,
+ uint8_t Nl,
+ NR_DL_FRAME_PARMS *frame_parms,
+ uint16_t dlDmrsSymbPos)
\brief This function extracts the received resource blocks, both channel estimates and data symbols,
- for the current allocation and for dual antenna eNB transmission.
+ for the current allocation and for multiple layer antenna gNB transmission.
@param rxdataF Raw FFT output of received signal
@param dl_ch_estimates Channel estimates of current slot
@param rxdataF_ext FFT output for RBs in this allocation
@param dl_ch_estimates_ext Channel estimates for RBs in this allocation
- @param pmi subband Precoding matrix indicator
- @param pmi_ext Extracted PMI for chosen RBs
- @param rb_alloc RB allocation vector
+ @param Nl nb of antenna layers
@param symbol Symbol to extract
- @param nr_slot_rx Slot index
- @param high_speed_flag
+ @param n_dmrs_cdm_groups
@param frame_parms Pointer to frame descriptor
*/
-unsigned short nr_dlsch_extract_rbs_dual(int **rxdataF,
- int **dl_ch_estimates,
- int **rxdataF_ext,
- int **dl_ch_estimates_ext,
- unsigned short pmi,
- unsigned char *pmi_ext,
- unsigned char symbol,
- uint8_t pilots,
- unsigned short start_rb,
- unsigned short nb_rb_pdsch,
- unsigned char nr_slot_rx,
- uint32_t high_speed_flag,
- NR_DL_FRAME_PARMS *frame_parms,
- MIMO_mode_t mimo_mode);
+unsigned short nr_dlsch_extract_rbs_multiple(int **rxdataF,
+ int **dl_ch_estimates,
+ int **rxdataF_ext,
+ int **dl_ch_estimates_ext,
+ unsigned char symbol,
+ uint8_t pilots,
+ uint8_t config_type,
+ unsigned short start_rb,
+ unsigned short nb_rb_pdsch,
+ uint8_t n_dmrs_cdm_groups,
+ uint8_t Nl,
+ NR_DL_FRAME_PARMS *frame_parms,
+ uint16_t dlDmrsSymbPos);
/** \fn dlsch_extract_rbs_TM7(int32_t **rxdataF,
int32_t **dl_bf_ch_estimates,
@@ -812,8 +803,9 @@ void nr_dlsch_channel_compensation(int32_t **rxdataF_ext,
int32_t **dl_ch_magb,
int32_t **dl_ch_magr,
int32_t **rxdataF_comp,
- int32_t **rho,
+ int32_t ***rho,
NR_DL_FRAME_PARMS *frame_parms,
+ uint8_t nb_aatx,
uint8_t symbol,
uint8_t start_symbol,
uint8_t first_symbol_flag,
@@ -827,7 +819,7 @@ void nr_dlsch_channel_compensation_core(int **rxdataF_ext,
int **dl_ch_mag,
int **dl_ch_magb,
int **rxdataF_comp,
- int **rho,
+ int ***rho,
unsigned char n_tx,
unsigned char n_rx,
unsigned char mod_order,
@@ -898,6 +890,15 @@ void nr_dlsch_channel_level_median(int **dl_ch_estimates_ext,
int length,
int start_point);
+void nr_dlsch_detection_mrc(int **rxdataF_comp,
+ int ***rho,
+ int **dl_ch_mag,
+ int **dl_ch_magb,
+ short n_tx,
+ short n_rx,
+ unsigned char symbol,
+ unsigned short nb_rb);
+
void nr_dlsch_detection_mrc_core(int **rxdataF_comp,
int **rxdataF_comp_i,
int **rho,
@@ -971,6 +972,7 @@ void dlsch_channel_compensation_TM34(NR_DL_FRAME_PARMS *frame_parms,
*/
void nr_dlsch_channel_level(int **dl_ch_estimates_ext,
NR_DL_FRAME_PARMS *frame_parms,
+ uint8_t n_tx,
int32_t *avg,
uint8_t symbol,
uint32_t len,
@@ -1002,6 +1004,8 @@ void dlsch_channel_level_TM7(int32_t **dl_bf_ch_estimates_ext,
void nr_dlsch_scale_channel(int32_t **dl_ch_estimates_ext,
NR_DL_FRAME_PARMS *frame_parms,
+ uint8_t n_tx,
+ uint8_t n_rx,
NR_UE_DLSCH_t **dlsch_ue,
uint8_t symbol,
uint8_t start_symbol,
diff --git a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c
index 4ac1c47b02..28b6677b2c 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c
@@ -213,7 +213,7 @@ void generate_pss_nr(NR_DL_FRAME_PARMS *fp,int N_ID_2)
}
for (int n=0; n < LENGTH_PSS_NR; n++) {
- int m = (n + 43*N_ID_2)%(LENGTH_PSS_NR);
+ int m = (n + 43*N_ID_2)%(LENGTH_PSS_NR);
d_pss[n] = 1 - 2*x[m];
}
diff --git a/openair1/PHY/TOOLS/oai_dfts.c b/openair1/PHY/TOOLS/oai_dfts.c
index 6569f7eab5..6e85bca384 100644
--- a/openair1/PHY/TOOLS/oai_dfts.c
+++ b/openair1/PHY/TOOLS/oai_dfts.c
@@ -18,7 +18,7 @@
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
-
+
#include
#include
#include
@@ -3103,10 +3103,12 @@ void dft128(int16_t *x,int16_t *y,unsigned char scale)
dft64((int16_t*)(xtmp),(int16_t*)ytmp,1);
dft64((int16_t*)(xtmp+32),(int16_t*)(ytmp+16),1);
+#ifndef MR_MAIN
if (LOG_DUMPFLAG(DEBUG_DFT)) {
LOG_M("dft128a.m","dfta",ytmp,64,1,1);
LOG_M("dft128b.m","dftb",ytmp+16,64,1,1);
}
+#endif
for (i=0; i<16; i++) {
bfly2_16(ytmpp,ytmpp+16,
y128p,y128p+16,
@@ -3155,10 +3157,12 @@ void dft128(int16_t *x,int16_t *y,unsigned char scale)
}
+#ifndef MR_MAIN
if (LOG_DUMPFLAG(DEBUG_DFT)) {
LOG_M("dft128out.m","dft128",y,128,1,1);
exit(-1);
}
+#endif
_mm_empty();
_m_empty();
@@ -3183,18 +3187,20 @@ void dft128(int16_t *x,int16_t *y,unsigned char scale)
transpose4_ooff_simd256(x256+10,xtmp+5,8);
transpose4_ooff_simd256(x256+12,xtmp+6,8);
transpose4_ooff_simd256(x256+14,xtmp+7,8);
+#ifndef MR_MAIN
if (LOG_DUMPFLAG(DEBUG_DFT)) {
LOG_M("dft128ina_256.m","dftina",xtmp,64,1,1);
LOG_M("dft128inb_256.m","dftinb",xtmp+8,64,1,1);
}
-
+#endif
dft64((int16_t*)(xtmp),(int16_t*)ytmp,1);
dft64((int16_t*)(xtmp+8),(int16_t*)(ytmp+8),1);
+#ifndef MR_MAIN
if (LOG_DUMPFLAG(DEBUG_DFT)) {
LOG_M("dft128outa_256.m","dftouta",ytmp,64,1,1);
LOG_M("dft128outb_256.m","dftoutb",ytmp+8,64,1,1);
}
-
+#endif
for (i=0; i<8; i++) {
bfly2_16_256(ytmpp,ytmpp+8,
y256p,y256p+8,
@@ -3226,10 +3232,12 @@ void dft128(int16_t *x,int16_t *y,unsigned char scale)
y256[15] = mulhi_int16_simd256(y256[15],ONE_OVER_SQRT2_Q15_256);
}
+#ifndef MR_MAIN
if (LOG_DUMPFLAG(DEBUG_DFT)) {
LOG_M("dft128.m","dft",y256,128,1,1);
exit(-1);
}
+#endif
}
#endif
@@ -6031,11 +6039,13 @@ void dft1536(int16_t *input, int16_t *output, unsigned char scale)
tmpo[1][i] = tmpo[1][i<<1];
tmpo[2][i] = tmpo[2][i<<1];
}*/
+#ifndef MR_MAIN
if (LOG_DUMPFLAG(DEBUG_DFT)) {
LOG_M("dft1536out0.m","o0",tmpo[0],2048,1,1);
LOG_M("dft1536out1.m","o1",tmpo[1],2048,1,1);
LOG_M("dft1536out2.m","o2",tmpo[2],2048,1,1);
}
+#endif
for (i=0,i2=0; i<1024; i+=8,i2+=4) {
bfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),(simd_q15_t*)(&tmpo[2][i2]),
(simd_q15_t*)(output+i),(simd_q15_t*)(output+1024+i),(simd_q15_t*)(output+2048+i),
@@ -6193,14 +6203,14 @@ void idft6144(int16_t *input, int16_t *output,unsigned char scale)
idft2048((int16_t*)(tmp[0]),(int16_t*)(tmpo[0]),1);
idft2048((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),1);
idft2048((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),1);
-
+#ifndef MR_MAIN
if (LOG_DUMPFLAG(DEBUG_DFT)) {
LOG_M("idft6144in.m","in",input,6144,1,1);
LOG_M("idft6144out0.m","o0",tmpo[0],2048,1,1);
LOG_M("idft6144out1.m","o1",tmpo[1],2048,1,1);
LOG_M("idft6144out2.m","o2",tmpo[2],2048,1,1);
}
-
+#endif
for (i=0,i2=0; i<4096; i+=8,i2+=4) {
ibfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),((simd_q15_t*)&tmpo[2][i2]),
(simd_q15_t*)(output+i),(simd_q15_t*)(output+4096+i),(simd_q15_t*)(output+8192+i),
@@ -6260,11 +6270,13 @@ void dft6144(int16_t *input, int16_t *output,unsigned char scale)
tmpo[1][i] = tmpo[1][i<<1];
tmpo[2][i] = tmpo[2][i<<1];
}*/
+#ifndef MR_MAIN
if (LOG_DUMPFLAG(DEBUG_DFT)) {
LOG_M("ft6144out0.m","o0",tmpo[0],2048,1,1);
LOG_M("ft6144out1.m","o1",tmpo[1],2048,1,1);
LOG_M("ft6144out2.m","o2",tmpo[2],2048,1,1);
}
+#endif
for (i=0,i2=0; i<4096; i+=8,i2+=4) {
bfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),(simd_q15_t*)(&tmpo[2][i2]),
(simd_q15_t*)(output+i),(simd_q15_t*)(output+4096+i),(simd_q15_t*)(output+8192+i),
@@ -6336,11 +6348,13 @@ void dft12288(int16_t *input, int16_t *output,unsigned char scale)
tmpo[1][i] = tmpo[1][i<<1];
tmpo[2][i] = tmpo[2][i<<1];
}*/
+#ifndef MR_MAIN
if (LOG_DUMPFLAG(DEBUG_DFT)) {
LOG_M("dft12288out0.m","o0",tmpo[0],4096,1,1);
LOG_M("dft12288out1.m","o1",tmpo[1],4096,1,1);
LOG_M("dft12288out2.m","o2",tmpo[2],4096,1,1);
}
+#endif
for (i=0,i2=0; i<8192; i+=8,i2+=4) {
bfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),(simd_q15_t*)(&tmpo[2][i2]),
(simd_q15_t*)(output+i),(simd_q15_t*)(output+8192+i),(simd_q15_t*)(output+16384+i),
@@ -6392,14 +6406,14 @@ void idft12288(int16_t *input, int16_t *output,unsigned char scale)
idft4096((int16_t*)(tmp[0]),(int16_t*)(tmpo[0]),scale);
idft4096((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),scale);
idft4096((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),scale);
-
+#ifndef MR_MAIN
if (LOG_DUMPFLAG(DEBUG_DFT)) {
LOG_M("idft12288in.m","in",input,12288,1,1);
LOG_M("idft12288out0.m","o0",tmpo[0],4096,1,1);
LOG_M("idft12288out1.m","o1",tmpo[1],4096,1,1);
LOG_M("idft12288out2.m","o2",tmpo[2],4096,1,1);
}
-
+#endif
for (i=0,i2=0; i<8192; i+=8,i2+=4) {
ibfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),((simd_q15_t*)&tmpo[2][i2]),
(simd_q15_t*)(output+i),(simd_q15_t*)(output+8192+i),(simd_q15_t*)(output+16384+i),
@@ -6429,9 +6443,11 @@ void idft12288(int16_t *input, int16_t *output,unsigned char scale)
}
_mm_empty();
_m_empty();
+#ifndef MR_MAIN
if (LOG_DUMPFLAG(DEBUG_DFT)) {
LOG_M("idft12288out.m","out",output,6144,1,1);
}
+#endif
}
int16_t twa18432[12288] __attribute__((aligned(32)));
@@ -6560,11 +6576,13 @@ void dft24576(int16_t *input, int16_t *output,unsigned char scale)
tmpo[1][i] = tmpo[1][i<<1];
tmpo[2][i] = tmpo[2][i<<1];
}*/
+#ifndef MR_MAIN
if (LOG_DUMPFLAG(DEBUG_DFT)) {
LOG_M("dft24576out0.m","o0",tmpo[0],8192,1,1);
LOG_M("dft24576out1.m","o1",tmpo[1],8192,1,1);
LOG_M("dft24576out2.m","o2",tmpo[2],8192,1,1);
}
+#endif
for (i=0,i2=0; i<16384; i+=8,i2+=4) {
bfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),(simd_q15_t*)(&tmpo[2][i2]),
(simd_q15_t*)(output+i),(simd_q15_t*)(output+16384+i),(simd_q15_t*)(output+32768+i),
@@ -6595,9 +6613,11 @@ void dft24576(int16_t *input, int16_t *output,unsigned char scale)
}
_mm_empty();
_m_empty();
+#ifndef MR_MAIN
if (LOG_DUMPFLAG(DEBUG_DFT)) {
LOG_M("out.m","out",output,24576,1,1);
}
+#endif
}
void idft24576(int16_t *input, int16_t *output,unsigned char scale)
@@ -6617,14 +6637,14 @@ void idft24576(int16_t *input, int16_t *output,unsigned char scale)
idft8192((int16_t*)(tmp[0]),(int16_t*)(tmpo[0]),1);
idft8192((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),1);
idft8192((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),1);
-
+ #ifndef MR_MAIN
if (LOG_DUMPFLAG(DEBUG_DFT)) {
LOG_M("idft24576in.m","in",input,24576,1,1);
LOG_M("idft24576out0.m","o0",tmpo[0],8192,1,1);
LOG_M("idft24576out1.m","o1",tmpo[1],8192,1,1);
LOG_M("idft24576out2.m","o2",tmpo[2],8192,1,1);
}
-
+#endif
for (i=0,i2=0; i<16384; i+=8,i2+=4) {
ibfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),((simd_q15_t*)&tmpo[2][i2]),
(simd_q15_t*)(output+i),(simd_q15_t*)(output+16384+i),(simd_q15_t*)(output+32768+i),
@@ -6653,10 +6673,11 @@ void idft24576(int16_t *input, int16_t *output,unsigned char scale)
}
_mm_empty();
_m_empty();
-
+#ifndef MR_MAIN
if (LOG_DUMPFLAG(DEBUG_DFT)) {
LOG_M("idft24576out.m","out",output,24576,1,1);
}
+#endif
}
int16_t twa36864[24576] __attribute__((aligned(32)));
@@ -6680,13 +6701,13 @@ void dft36864(int16_t *input, int16_t *output,uint8_t scale) {
dft12288((int16_t*)(tmp[0]),(int16_t*)(tmpo[0]),1);
dft12288((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),1);
dft12288((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),1);
-
+#ifndef MR_MAIN
if (LOG_DUMPFLAG(DEBUG_DFT)) {
LOG_M("dft36864out0.m","o0",tmpo[0],12288,1,1);
LOG_M("dft36864out1.m","o1",tmpo[1],12288,1,1);
LOG_M("dft36864out2.m","o2",tmpo[2],12288,1,1);
}
-
+#endif
for (i=0,i2=0; i<24576; i+=8,i2+=4) {
bfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),(simd_q15_t*)(&tmpo[2][i2]),
(simd_q15_t*)(output+i),(simd_q15_t*)(output+24576+i),(simd_q15_t*)(output+49152+i),
@@ -6716,9 +6737,11 @@ void dft36864(int16_t *input, int16_t *output,uint8_t scale) {
}
_mm_empty();
_m_empty();
+#ifndef MR_MAIN
if (LOG_DUMPFLAG(DEBUG_DFT)) {
LOG_M("out.m","out",output,36864,1,1);
}
+#endif
}
void idft36864(int16_t *input, int16_t *output,uint8_t scale) {
diff --git a/openair1/PHY/defs_RU.h b/openair1/PHY/defs_RU.h
index 885f955a2a..86c94421f2 100644
--- a/openair1/PHY/defs_RU.h
+++ b/openair1/PHY/defs_RU.h
@@ -92,17 +92,17 @@ typedef enum {
typedef struct {
- /// \brief Holds the transmit data in the frequency domain.
+ /// \brief Holds the transmit data in the frequency domain (1 frame).
/// - first index: rx antenna [0..nb_antennas_rx[
- /// - second index: ? [0..2*ofdm_symbol_size*frame_parms->symbols_per_tti[
+ /// - second index: ? [0..samples_per_frame[
int32_t **txdata;
- /// \brief holds the transmit data after beamforming in the frequency domain.
+ /// \brief holds the transmit data after beamforming in the frequency domain (1 slot).
/// - first index: tx antenna [0..nb_antennas_tx[
- /// - second index: sample [0..]
+ /// - second index: sample [0..samples_per_slot_woCP]
int32_t **txdataF_BF;
- /// \brief holds the transmit data before beamforming in the frequency domain.
- /// - first index: tx antenna [0..nb_antennas_tx[
- /// - second index: sample [0..]
+ /// \brief holds the transmit data before beamforming in the frequency domain (1 frame).
+ /// - first index: tx antenna [0..nb_antenna_ports[
+ /// - second index: sample [0..samples_per_frame_woCP]
int32_t **txdataF;
/// \brief holds the transmit data before beamforming for epdcch/mpdcch
/// - first index : tx antenna [0..nb_epdcch_antenna_ports[
@@ -128,6 +128,10 @@ typedef struct {
/// - second index: tx antenna [0..nb_antennas_tx[
/// - third index: frequency [0..]
int32_t **tdd_calib_coeffs;
+ /// \brief Anaglogue beam ID for each OFDM symbol (used when beamforming not done in RU)
+ /// - first index: antenna port
+ /// - second index: beam_id [0.. symbols_per_frame[
+ uint8_t **beam_id;
} RU_COMMON;
diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h
index 7e7dc849e3..cfc05f23e7 100644
--- a/openair1/PHY/defs_gNB.h
+++ b/openair1/PHY/defs_gNB.h
@@ -145,8 +145,10 @@ typedef struct {
typedef struct {
/// Pointers to variables related to DLSCH harq process
NR_DL_gNB_HARQ_t harq_process;
- /// TX buffers for UE-spec transmission (antenna ports 5 or 7..14, prior to precoding)
+ /// TX buffers for UE-spec transmission (antenna layers 1,...,4 after to precoding)
int32_t *txdataF[NR_MAX_NB_LAYERS];
+ /// TX buffers for UE-spec transmission (antenna ports 1000 or 1001,...,1007, before precoding)
+ int32_t *txdataF_precoding[NR_MAX_NB_LAYERS];
/// Modulated symbols buffer
int32_t *mod_symbs[NR_MAX_NB_CODEWORDS];
/// beamforming weights for UE-spec transmission (antenna ports 5 or 7..14), for each codeword, maximum 4 layers?
@@ -392,8 +394,12 @@ typedef struct {
/// For IFFT_FPGA this points to the same memory as PHY_vars->rx_vars[a].RX_DMA_BUFFER. //?
/// - first index: eNB id [0..2] (hard coded)
/// - second index: tx antenna [0..14[ where 14 is the total supported antenna ports.
- /// - third index: sample [0..]
+ /// - third index: sample [0..samples_per_frame_woCP]
int32_t **txdataF;
+ /// \brief Anaglogue beam ID for each OFDM symbol (used when beamforming not done in RU)
+ /// - first index: antenna port
+ /// - second index: beam_id [0.. symbols_per_frame[
+ uint8_t **beam_id;
int32_t *debugBuff;
int32_t debugBuff_sample_offset;
} NR_gNB_COMMON;
@@ -799,6 +805,7 @@ typedef struct PHY_VARS_gNB_s {
int prach_energy_counter;
int pucch0_thres;
+ uint64_t bad_pucch;
/*
time_stats_t phy_proc;
*/
diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h
index 390574a66b..bf0a7bc9e5 100644
--- a/openair1/PHY/defs_nr_UE.h
+++ b/openair1/PHY/defs_nr_UE.h
@@ -142,6 +142,7 @@ typedef struct {
uint32_t rsrp[7];
float rsrp_filtered[7]; // after layer 3 filtering
float rsrq_filtered[7];
+ short rsrp_dBm[7];
// common measurements
//! estimated noise power (linear)
unsigned int n0_power[NB_ANTENNAS_RX];
@@ -187,7 +188,7 @@ typedef struct {
//! estimated rssi (dBm)
short rx_rssi_dBm[NUMBER_OF_CONNECTED_gNB_MAX];
//! estimated correlation (wideband linear) between spatial channels (computed in dlsch_demodulation)
- int rx_correlation[NUMBER_OF_CONNECTED_gNB_MAX][2];
+ int rx_correlation[NUMBER_OF_CONNECTED_gNB_MAX][4][4];
//! estimated correlation (wideband dB) between spatial channels (computed in dlsch_demodulation)
int rx_correlation_dB[NUMBER_OF_CONNECTED_gNB_MAX][2];
@@ -332,12 +333,10 @@ typedef struct {
int32_t **dl_ch_magb1[8][8];
/// \brief Magnitude of Downlink Channel, first layer (256QAM level).
int32_t **dl_ch_magr0;
- /// \brief Cross-correlation of two gNB signals.
- /// - first index: rx antenna [0..nb_antennas_rx[
+ /// \brief Cross-correlation Matrix of the gNB Tx channel signals.
+ /// - first index: aatx*n_rx+aarx for all aatx=[0..n_tx[ and aarx=[0..nb_rx[
/// - second index: symbol [0..]
- int32_t **rho;
- /// never used... always send dl_ch_rho_ext instead...
- int32_t **rho_i;
+ int32_t ***rho;
/// \brief Pointers to llr vectors (2 TBs).
/// - first index: ? [0..1] (hard coded)
/// - second index: ? [0..1179743] (hard coded)
@@ -842,9 +841,15 @@ typedef struct {
/// PDSCH DMRS
uint32_t ****nr_gold_pdsch[NUMBER_OF_CONNECTED_eNB_MAX];
+ // Scrambling IDs used in PDSCH DMRS
+ uint16_t scramblingID[2];
+
/// PDCCH DMRS
uint32_t ***nr_gold_pdcch[NUMBER_OF_CONNECTED_eNB_MAX];
+ // Scrambling IDs used in PDCCH DMRS
+ uint16_t scramblingID_pdcch;
+
/// PUSCH DMRS sequence
uint32_t ****nr_gold_pusch_dmrs;
diff --git a/openair1/PHY/impl_defs_top.h b/openair1/PHY/impl_defs_top.h
index a8548af8dc..fa021ffe81 100644
--- a/openair1/PHY/impl_defs_top.h
+++ b/openair1/PHY/impl_defs_top.h
@@ -275,6 +275,12 @@
#define NR_UE_CAPABILITY_SLOT_RX_TO_TX (6) /* FFS_NR_TODO it defines ue capability which is the number of slots */
/* - between reception of pdsch and tarnsmission of its acknowlegment */
/* - between reception of un uplink grant and its related transmission */
+#ifndef NO_RAT_NR
+ #define DURATION_RX_TO_TX (NR_UE_CAPABILITY_SLOT_RX_TO_TX) /* for NR this will certainly depends to such UE capability which is not yet defined */
+#else
+ #define DURATION_RX_TO_TX (6) /* For LTE, this duration is fixed to 4 and it is linked to LTE standard for both modes FDD/TDD */
+#endif
+
#define NR_MAX_HARQ_PROCESSES (16)
#define NR_MAX_ULSCH_HARQ_PROCESSES (NR_MAX_HARQ_PROCESSES) /* cf 38.214 6.1 UE procedure for receiving the physical uplink shared channel */
diff --git a/openair1/SCHED_NR/nr_ru_procedures.c b/openair1/SCHED_NR/nr_ru_procedures.c
index 9a71f96815..1b2baf03f5 100644
--- a/openair1/SCHED_NR/nr_ru_procedures.c
+++ b/openair1/SCHED_NR/nr_ru_procedures.c
@@ -208,6 +208,7 @@ void nr_feptx_ofdm_2thread(RU_t *ru,int frame_tx,int tti_tx) {
memcpy((void*)&ru->common.txdataF[i][j*fp->ofdm_symbol_size],
(void*)&gNB->common_vars.txdataF[i][j*fp->ofdm_symbol_size + txdataF_offset],
fp->ofdm_symbol_size*sizeof(int32_t));
+
}
}//num_gNB == 1
@@ -279,13 +280,12 @@ static void *nr_feptx_thread(void *param) {
RU_feptx_t *feptx = (RU_feptx_t *)param;
RU_t *ru;
- int aa, slot, start, l, nb_antenna_ports, ret;
+ int aa, slot, start, l, ret;
int i;
int32_t ***bw;
NR_DL_FRAME_PARMS *fp;
int ofdm_mask_full;
int txdataF_offset;
- int32_t *txdataF;
while (!oai_exit) {
ret = 0;
if (wait_on_condition(&feptx->mutex_feptx,&feptx->cond_feptx,&feptx->instance_cnt_feptx,"NR feptx thread")<0) break;
@@ -299,31 +299,39 @@ static void *nr_feptx_thread(void *param) {
l = feptx->symbol;
fp = ru->nr_frame_parms;
start = feptx->symbol;
- nb_antenna_ports = feptx->nb_antenna_ports;
ofdm_mask_full = (1<<(ru->nb_tx*2))-1;
if(ru->num_gNB != 0){
txdataF_offset = ((slot%2)*fp->samples_per_slot_wCP);
////////////precoding////////////
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_PREC+feptx->index+1 , 1);
+
start_meas(&ru->precoding_stats);
+
+ for(i=0; inb_log_antennas; ++i) {
+ memcpy((void*) &ru->common.beam_id[i][slot*fp->symbols_per_slot+l],
+ (void*) &ru->gNB_list[0]->common_vars.beam_id[i][slot*fp->symbols_per_slot+l],
+ (fp->symbols_per_slot>>1)*sizeof(uint8_t));
+ }
+
+
if (ru->nb_tx == 1 && ru->nb_log_antennas == 1) {
- memcpy((void*)&ru->common.txdataF_BF[0][l*fp->ofdm_symbol_size],
- (void*)&ru->gNB_list[0]->common_vars.txdataF[0][txdataF_offset + l*fp->ofdm_symbol_size],
- (fp->samples_per_slot_wCP>>1)*sizeof(int32_t));
+ memcpy((void*)&ru->common.txdataF_BF[0][l*fp->ofdm_symbol_size],
+ (void*)&ru->gNB_list[0]->common_vars.txdataF[0][txdataF_offset + l*fp->ofdm_symbol_size],
+ (fp->samples_per_slot_wCP>>1)*sizeof(int32_t));
}
else {
bw = ru->beam_weights[0];
- txdataF = &ru->gNB_list[0]->common_vars.txdataF[0][txdataF_offset];
for(i=0; isymbols_per_slot>>1; ++i){
- nr_beam_precoding(&txdataF,
+ nr_beam_precoding(ru->gNB_list[0]->common_vars.txdataF,
ru->common.txdataF_BF,
fp,
bw,
slot,
l+i,
aa,
- nb_antenna_ports);
+ ru->nb_log_antennas,
+ txdataF_offset);//here
}
}
stop_meas(&ru->precoding_stats);
@@ -362,7 +370,8 @@ static void *nr_feptx_thread(void *param) {
slot,
l,
aa,
- nb_antenna_ports);
+ ru->nb_log_antennas,
+ 0);
}
stop_meas(&ru->precoding_stats);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_PREC+feptx->index+1 , 0);
@@ -459,10 +468,14 @@ void nr_feptx_prec(RU_t *ru,int frame_tx,int tti_tx) {
if (nr_slot_select(cfg,frame_tx,slot_tx) == NR_UPLINK_SLOT) return;
- for(i=0; inb_log_antennas; ++i)
+ for(i=0; inb_log_antennas; ++i) {
memcpy((void*)ru->common.txdataF[i],
(void*)&gNB->common_vars.txdataF[i][txdataF_offset],
fp->samples_per_slot_wCP*sizeof(int32_t));
+ memcpy((void*)&ru->common.beam_id[i][slot_tx*fp->symbols_per_slot],
+ (void*)&gNB->common_vars.beam_id[i][slot_tx*fp->symbols_per_slot],
+ fp->symbols_per_slot*sizeof(uint8_t));
+ }
if (ru->nb_tx == 1 && ru->nb_log_antennas == 1) {
@@ -485,7 +498,8 @@ void nr_feptx_prec(RU_t *ru,int frame_tx,int tti_tx) {
tti_tx,
l,
aa,
- ru->nb_log_antennas);
+ ru->nb_log_antennas,
+ 0);
}// for (aa=0;aanb_tx;aa++)
}// for (l=0;lsymbols_per_slot;l++)
}// if (ru->nb_tx == 1)
diff --git a/openair1/SCHED_NR/phy_frame_config_nr.c b/openair1/SCHED_NR/phy_frame_config_nr.c
index 3864b2fcb2..9be6780597 100644
--- a/openair1/SCHED_NR/phy_frame_config_nr.c
+++ b/openair1/SCHED_NR/phy_frame_config_nr.c
@@ -41,7 +41,7 @@
*
* OUTPUT: table of uplink symbol for each slot for 2 frames
*
-* RETURN : 0 if tdd has been properly configurated
+* RETURN : nb_periods_per_frame if tdd has been properly configurated
* -1 tdd configuration can not be done
*
* DESCRIPTION : generate bit map for uplink symbol for each slot for several frames
@@ -179,7 +179,7 @@ int set_tdd_config_nr( nfapi_nr_config_request_scf_t *cfg,
LOG_E(PHY,"set_tdd_configuration_nr: additionnal tdd configuration 2 is not supported for tdd configuration \n");
return (-1);
}*/
- return (0);
+ return (nb_periods_per_frame);
}
/*******************************************************************
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index bfaa732a8c..5d48671e90 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -72,7 +72,7 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame, int slot) {
NR_DL_FRAME_PARMS *fp=&gNB->frame_parms;
nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config;
int **txdataF = gNB->common_vars.txdataF;
- uint8_t ssb_index, n_hf;
+ uint8_t ssb_index, ssb_per_slot=0, n_hf;
uint16_t ssb_start_symbol, rel_slot;
int txdataF_offset = (slot%2)*fp->samples_per_slot_wCP;
uint16_t slots_per_hf = (fp->slots_per_frame)>>1;
@@ -94,11 +94,12 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame, int slot) {
if(rel_slot<38 && rel_slot>=0) { // there is no SSB beyond slot 37
- for (int i=0; i<2; i++) { // max two SSB per frame
+ for (int i=0; i<2; i++) { // max two SSB per slot
ssb_index = i + SSB_Table[rel_slot]; // computing the ssb_index
if ((ssb_index<64) && ((fp->L_ssb >> (63-ssb_index)) & 0x01)) { // generating the ssb only if the bit of L_ssb at current ssb index is 1
+ ssb_per_slot++;
fp->ssb_index = ssb_index;
int ssb_start_symbol_abs = nr_get_ssb_start_symbol(fp); // computing the starting symbol for current ssb
ssb_start_symbol = ssb_start_symbol_abs % fp->symbols_per_slot; // start symbol wrt slot
@@ -130,6 +131,16 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame, int slot) {
ssb_start_symbol,
n_hf, frame, cfg, fp);
+ // SSB beamforming is handled at PHY
+ // currently our PHY does not support switching more than once a slot.
+ if (ssb_per_slot>1) {
+ LOG_W(PHY,"beamforming currently not supported for more than one SSB per slot\n");
+ }
+ else if (ssb_per_slot==1) {
+ LOG_D(PHY,"slot %d, ssb_index %d, beam %d\n",slot,ssb_index,cfg->ssb_table.ssb_beam_id_list[ssb_index].beam_id.value);
+ for (int j=0;jsymbols_per_slot;j++)
+ gNB->common_vars.beam_id[0][slot*fp->symbols_per_slot+j] = cfg->ssb_table.ssb_beam_id_list[ssb_index].beam_id.value;
+ }
}
}
}
@@ -155,9 +166,10 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
if (do_meas==1) start_meas(&gNB->phy_proc_tx);
- // clear the transmit data array for the current subframe
+ // clear the transmit data array and beam index for the current slot
for (aa=0; aacarrier_config.num_tx_ant.value; aa++) {
memset(&gNB->common_vars.txdataF[aa][txdataF_offset],0,fp->samples_per_slot_wCP*sizeof(int32_t));
+ memset(&gNB->common_vars.beam_id[aa][slot*fp->symbols_per_slot],255,fp->symbols_per_slot*sizeof(uint8_t));
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_COMMON_TX,1);
@@ -219,7 +231,9 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
if ((frame&127) == 0) dump_pdsch_stats(gNB);
//apply the OFDM symbol rotation here
- apply_nr_rotation(fp,(int16_t*) &gNB->common_vars.txdataF[0][txdataF_offset],slot,0,fp->Ncp==EXTENDED?12:14,fp->ofdm_symbol_size);
+ for (aa=0; aacarrier_config.num_tx_ant.value; aa++) {
+ apply_nr_rotation(fp,(int16_t*) &gNB->common_vars.txdataF[aa][txdataF_offset],slot,0,fp->Ncp==EXTENDED?12:14,fp->ofdm_symbol_size);
+ }
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_TX+offset,0);
}
@@ -683,7 +697,10 @@ void phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
}
}
// figure out a better way to choose slot_rx, 19 is ok for a particular TDD configuration with 30kHz SCS
- if ((frame_rx&127) == 0 && slot_rx==19) dump_pusch_stats(gNB);
+ if ((frame_rx&127) == 0 && slot_rx==19) {
+ dump_pusch_stats(gNB);
+ LOG_I(PHY, "Number of bad PUCCH received: %lu\n", gNB->bad_pucch);
+ }
if (pucch_decode_done || pusch_decode_done) {
T(T_GNB_PHY_PUCCH_PUSCH_IQ, T_INT(frame_rx), T_INT(slot_rx), T_BUFFER(&gNB->common_vars.rxdataF[0][0], gNB->frame_parms.symbols_per_slot * gNB->frame_parms.ofdm_symbol_size * 4));
diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
index 14c174c2c0..df66217e49 100644
--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
@@ -776,7 +776,7 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_
for (m = s0; m < (s0 +s1); m++) {
if (((1<harq_processes[harq_pid]->dlDmrsSymbPos) > 0) {
- for (uint8_t aatx=0; aatx<1; aatx++) {//for MIMO Config: it shall loop over no_layers
+ for (uint8_t aatx=0; aatxharq_processes[harq_pid]->Nl; aatx++) {//for MIMO Config: it shall loop over no_layers
nr_pdsch_channel_estimation(ue,
proc,
0 /*eNB_id*/,
@@ -831,43 +831,24 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_
slot = 1;
start_meas(&ue->dlsch_llr_stats_parallelization[proc->thread_id][slot]);
#endif
- // process DLSCH received in first slot
- // skip DMRS symbols (will have to check later if PDSCH/DMRS are multiplexed
- if (((1<harq_processes[harq_pid]->dlDmrsSymbPos) == 0) {
+ // process DLSCH received symbols in the slot
+ // symbol by symbol processing (if data/DMRS are multiplexed is checked inside the function)
+ if (pdsch == PDSCH || pdsch == SI_PDSCH || pdsch == RA_PDSCH) {
if (nr_rx_pdsch(ue,
- proc,
- pdsch,
- eNB_id,
- eNB_id_i,
- frame_rx,
- nr_slot_rx,
- m,
- first_symbol_flag,
- dual_stream_UE,
- i_mod,
- dlsch0->current_harq_pid) < 0)
- return -1;
- }
- else { // This is to adjust the llr offset in the case of skipping over a dmrs symbol (i.e. in case of no PDSCH REs in DMRS)
- if (pdsch == RA_PDSCH) ue->pdsch_vars[proc->thread_id][eNB_id]->llr_offset[m]=ue->pdsch_vars[proc->thread_id][eNB_id]->llr_offset[m-1];
- else if (pdsch == PDSCH || pdsch == SI_PDSCH) {
- if (nr_rx_pdsch(ue,
- proc,
- pdsch,
- eNB_id,
- eNB_id_i,
- frame_rx,
- nr_slot_rx,
- m,
- first_symbol_flag,
- dual_stream_UE,
- i_mod,
- dlsch0->current_harq_pid) < 0)
- return -1;
- }
- else AssertFatal(1==0,"Not RA_PDSCH, SI_PDSCH or PDSCH\n");
- }
- if (pdsch == PDSCH) LOG_D(PHY,"Done processing symbol %d : llr_offset %d\n",m,ue->pdsch_vars[proc->thread_id][eNB_id]->llr_offset[m]);
+ proc,
+ pdsch,
+ eNB_id,
+ eNB_id_i,
+ frame_rx,
+ nr_slot_rx,
+ m,
+ first_symbol_flag,
+ dual_stream_UE,
+ i_mod,
+ dlsch0->current_harq_pid) < 0)
+ return -1;
+ } else AssertFatal(1==0,"Not RA_PDSCH, SI_PDSCH or PDSCH\n");
+
#if UE_TIMING_TRACE
stop_meas(&ue->dlsch_llr_stats_parallelization[proc->thread_id][slot]);
#if DISABLE_LOG_X
@@ -877,10 +858,9 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_
#endif
#endif
- if(first_symbol_flag)
- {
- proc->first_symbol_available = 1;
- }
+ if(first_symbol_flag) {
+ proc->first_symbol_available = 1;
+ }
} // CRNTI active
}
return 0;
@@ -901,7 +881,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
int harq_pid = dlsch0->current_harq_pid;
int frame_rx = proc->frame_rx;
int nr_slot_rx = proc->nr_slot_rx;
- int ret=0, ret1=0;
+ uint32_t ret = UINT32_MAX, ret1 = UINT32_MAX;
NR_UE_PDSCH *pdsch_vars;
uint16_t dmrs_len = get_num_dmrs(dlsch0->harq_processes[dlsch0->current_harq_pid]->dlDmrsSymbPos);
nr_downlink_indication_t dl_indication;
@@ -1667,6 +1647,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
// looking for pbch only in slot where it is supposed to be
if (slot_ssb) {
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PBCH, VCD_FUNCTION_IN);
LOG_D(PHY," ------ PBCH ChannelComp/LLR: frame.slot %d.%d ------ \n", frame_rx%1024, nr_slot_rx);
for (int i=1; i<4; i++) {
@@ -1704,6 +1685,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
LOG_D(PHY, "Doing N0 measurements in %s\n", __FUNCTION__);
nr_ue_rrc_measurements(ue, proc, nr_slot_rx);
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PBCH, VCD_FUNCTION_OUT);
}
}
@@ -1714,15 +1696,14 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
}
#ifdef NR_PDCCH_SCHED
- nr_gold_pdcch(ue, 0, 2);
LOG_D(PHY," ------ --> PDCCH ChannelComp/LLR Frame.slot %d.%d ------ \n", frame_rx%1024, nr_slot_rx);
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PDCCH, VCD_FUNCTION_IN);
for (uint16_t l=0; lofdm_demod_stats);
#endif
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_IN);
nr_slot_fep(ue,
proc,
l,
@@ -1744,7 +1725,6 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
fp->first_carrier_offset+(pdcch_vars->pdcch_config[n_ss].BWPStart + coreset_start_rb)*12,
coreset_nb_rb);
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_OUT);
#if UE_TIMING_TRACE
stop_meas(&ue->ofdm_demod_stats);
#endif
@@ -1752,6 +1732,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
dci_cnt = dci_cnt + nr_ue_pdcch_procedures(gNB_id, ue, proc);
}
}
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PDCCH, VCD_FUNCTION_OUT);
if (dci_cnt > 0) {
@@ -1767,26 +1748,22 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
}
if (dlsch) {
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PDSCH, VCD_FUNCTION_IN);
uint8_t harq_pid = dlsch->current_harq_pid;
NR_DL_UE_HARQ_t *dlsch0_harq = dlsch->harq_processes[harq_pid];
uint16_t nb_symb_sch = dlsch0_harq->nb_symbols;
uint16_t start_symb_sch = dlsch0_harq->start_symbol;
- int symb_dmrs = -1;
LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR Frame.slot %d.%d ------ \n", frame_rx%1024, nr_slot_rx);
//to update from pdsch config
- for (int i=0;i<4;i++) if (((1<dlDmrsSymbPos) > 0) {symb_dmrs=i;break;}
- AssertFatal(symb_dmrs>=0,"no dmrs in 0..3\n");
- LOG_D(PHY,"Initializing dmrs for slot %d DMRS mask %x\n", nr_slot_rx, dlsch0_harq->dlDmrsSymbPos);
- nr_gold_pdsch(ue, nr_slot_rx, 0);
-
for (uint16_t m=start_symb_sch;m<(nb_symb_sch+start_symb_sch) ; m++){
nr_slot_fep(ue,
proc,
m, //to be updated from higher layer
nr_slot_rx);
}
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PDSCH, VCD_FUNCTION_OUT);
}
} else {
LOG_D(PHY,"[UE %d] Frame %d, nr_slot_rx %d: No DCIs found\n", ue->Mod_id, frame_rx, nr_slot_rx);
@@ -1800,7 +1777,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
// do procedures for C-RNTI
int ret_pdsch = 0;
if (ue->dlsch[proc->thread_id][gNB_id][0]->active == 1) {
- //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_IN);
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_C, VCD_FUNCTION_IN);
ret_pdsch = nr_ue_pdsch_procedures(ue,
proc,
gNB_id,
@@ -1809,6 +1786,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
NULL);
nr_ue_measurement_procedures(2, ue, proc, gNB_id, nr_slot_rx);
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_C, VCD_FUNCTION_OUT);
}
// do procedures for SI-RNTI
@@ -1857,7 +1835,6 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
// deactivate dlsch once dlsch proc is done
ue->dlsch_p[gNB_id]->active = 0;
-
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_P, VCD_FUNCTION_OUT);
}
@@ -2095,10 +2072,10 @@ void nr_ue_prach_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t
if (ue->mac_enabled == 1) {
int16_t pathloss = get_nr_PL(mod_id, ue->CC_id, gNB_id);
- int16_t ra_preamble_rx_power = (int16_t)(10*log10(pow(10, (double)(prach_resources->ra_PREAMBLE_RECEIVED_TARGET_POWER)/10) + pow(10, (double)(pathloss)/10)));
+ int16_t ra_preamble_rx_power = (int16_t)(prach_resources->ra_PREAMBLE_RECEIVED_TARGET_POWER - pathloss + 30);
ue->tx_power_dBm[nr_slot_tx] = min(nr_get_Pcmax(mod_id), ra_preamble_rx_power);
- LOG_I(PHY,"[UE %d][RAPROC][%d.%d]: Generating PRACH Msg1 (preamble %d, PL %d, P0_PRACH %d, TARGET_RECEIVED_POWER %d dBm, RA-RNTI %x)\n",
+ LOG_I(PHY,"DEBUG [UE %d][RAPROC][%d.%d]: Generating PRACH Msg1 (preamble %d, PL %d dB, P0_PRACH %d, TARGET_RECEIVED_POWER %d dBm, RA-RNTI %x)\n",
mod_id,
frame_tx,
nr_slot_tx,
diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c
index 4c6a02b69f..9614b4b649 100644
--- a/openair1/SIMULATION/NR_PHY/dlsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlsim.c
@@ -173,7 +173,8 @@ int nr_derive_key(int alg_type, uint8_t alg_id,
}
void config_common(int Mod_idP,
- int pdsch_AntennaPorts,
+ int pdsch_AntennaPorts,
+ int pusch_AntennaPorts,
NR_ServingCellConfigCommon_t *scc
);
@@ -297,7 +298,7 @@ int main(int argc, char **argv)
//uint8_t frame_mod4,num_pdcch_symbols = 0;
- SCM_t channel_model=AWGN;//Rayleigh1_anticorr;
+ SCM_t channel_model = AWGN; // AWGN Rayleigh1 Rayleigh1_anticorr;
NB_UE_INST = 1;
//double pbch_sinr;
@@ -456,7 +457,7 @@ int main(int argc, char **argv)
case 'y':
n_tx=atoi(optarg);
- if ((n_tx==0) || (n_tx>2)) {
+ if ((n_tx==0) || (n_tx>4)) {//extend gNB to support n_tx = 4
printf("Unsupported number of tx antennas %d\n",n_tx);
exit(-1);
}
@@ -466,7 +467,7 @@ int main(int argc, char **argv)
case 'z':
n_rx=atoi(optarg);
- if ((n_rx==0) || (n_rx>2)) {
+ if ((n_rx==0) || (n_rx>4)) {//extend UE to support n_tx = 4
printf("Unsupported number of rx antennas %d\n",n_rx);
exit(-1);
}
@@ -601,7 +602,8 @@ int main(int argc, char **argv)
InitSinLUT();
get_softmodem_params()->phy_test = 1;
-
+ get_softmodem_params()->do_ra = 0;
+
if (snr1set==0)
snr1 = snr0+10;
init_dlsch_tpool(dlsch_threads);
@@ -679,7 +681,7 @@ int main(int argc, char **argv)
prepare_scc(rrc.carrier.servingcellconfigcommon);
uint64_t ssb_bitmap;
fill_scc(rrc.carrier.servingcellconfigcommon,&ssb_bitmap,N_RB_DL,N_RB_DL,mu,mu);
-
+ ssb_bitmap = 1;// Enable only first SSB with index ssb_indx=0
fix_scc(scc,ssb_bitmap);
prepare_scd(scd);
@@ -709,9 +711,9 @@ int main(int argc, char **argv)
AssertFatal((gNB->if_inst = NR_IF_Module_init(0))!=NULL,"Cannot register interface");
gNB->if_inst->NR_PHY_config_req = nr_phy_config_request;
// common configuration
- rrc_mac_config_req_gNB(0,0,1,pusch_tgt_snrx10,pucch_tgt_snrx10,scc,0,0,NULL);
+ rrc_mac_config_req_gNB(0,0,n_tx,1,pusch_tgt_snrx10,pucch_tgt_snrx10,scc,0,0,NULL);
// UE dedicated configuration
- rrc_mac_config_req_gNB(0,0,1,pusch_tgt_snrx10,pucch_tgt_snrx10,NULL,1,secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
+ rrc_mac_config_req_gNB(0,0,n_tx,1,pusch_tgt_snrx10,pucch_tgt_snrx10,NULL,1,secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
phy_init_nr_gNB(gNB,0,0);
N_RB_DL = gNB->frame_parms.N_RB_DL;
NR_UE_info_t *UE_info = &RC.nrmac[0]->UE_info;
@@ -759,7 +761,7 @@ int main(int argc, char **argv)
gNB2UE = new_channel_desc_scm(n_tx,
n_rx,
channel_model,
- fs,
+ fs/1e6,//sampling frequency in MHz
bw,
30e-9,
0,
@@ -774,28 +776,28 @@ int main(int argc, char **argv)
frame_length_complex_samples = frame_parms->samples_per_subframe*NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
//frame_length_complex_samples_no_prefix = frame_parms->samples_per_subframe_wCP*NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
- s_re = malloc(2*sizeof(double*));
- s_im = malloc(2*sizeof(double*));
- r_re = malloc(2*sizeof(double*));
- r_im = malloc(2*sizeof(double*));
- txdata = malloc(2*sizeof(int*));
-
- for (i=0; i<2; i++) {
+ s_re = malloc(n_tx*sizeof(double*));
+ s_im = malloc(n_tx*sizeof(double*));
+ r_re = malloc(n_rx*sizeof(double*));
+ r_im = malloc(n_rx*sizeof(double*));
+ txdata = malloc(n_tx*sizeof(int*));
+ for (i=0; iframe_parms,frame_parms,sizeof(NR_DL_FRAME_PARMS));
+ UE->frame_parms.nb_antennas_rx = n_rx;
if (run_initial_sync==1) UE->is_synchronized = 0;
else {UE->is_synchronized = 1; UE->UE_mode[0]=PUSCH;}
@@ -828,7 +831,7 @@ int main(int argc, char **argv)
init_nr_ue_transport(UE,0);
nr_gold_pbch(UE);
- nr_gold_pdcch(UE,0,2);
+ nr_gold_pdcch(UE,0);
nr_l2_init_ue(NULL);
UE_mac = get_mac_inst(0);
@@ -879,7 +882,7 @@ int main(int argc, char **argv)
scheduled_response.CC_id = 0;
scheduled_response.frame = frame;
scheduled_response.slot = slot;
- scheduled_response.thread_id = UE_proc.thread_id;
+ scheduled_response.thread_id = 0;
nr_ue_phy_config_request(&UE_mac->phy_config);
//NR_COMMON_channels_t *cc = RC.nrmac[0]->common_channels;
@@ -988,9 +991,9 @@ int main(int argc, char **argv)
int txdataF_offset = (slot%2) * frame_parms->samples_per_slot_wCP;
if (n_trials==1) {
- LOG_M("txsigF0.m","txsF0", &gNB->common_vars.txdataF[0][txdataF_offset],frame_parms->samples_per_slot_wCP,1,1);
+ LOG_M("txsigF0.m","txsF0=", &gNB->common_vars.txdataF[0][txdataF_offset+2*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1);
if (gNB->frame_parms.nb_antennas_tx>1)
- LOG_M("txsigF1.m","txsF1", &gNB->common_vars.txdataF[1][txdataF_offset],frame_parms->samples_per_slot_wCP,1,1);
+ LOG_M("txsigF1.m","txsF1=", &gNB->common_vars.txdataF[1][txdataF_offset+2*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1);
}
int tx_offset = frame_parms->get_samples_slot_timestamp(slot,frame_parms,0);
if (n_trials==1) printf("tx_offset %d, txdataF_offset %d \n", tx_offset,txdataF_offset);
@@ -1014,45 +1017,79 @@ int main(int argc, char **argv)
}
if (n_trials==1) {
- LOG_M("txsig0.m","txs0", &txdata[0][tx_offset],frame_parms->get_samples_slot_timestamp(slot,frame_parms,0),1,1);
- if (gNB->frame_parms.nb_antennas_tx>1)
- LOG_M("txsig1.m","txs1", &txdata[1][tx_offset],frame_parms->get_samples_slot_timestamp(slot,frame_parms,0),1,1);
+ char filename[100];//LOG_M
+ for (aa=0;aaofdm_symbol_size+frame_parms->nb_prefix_samples0],6*(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples),1,1);
+ }
}
if (output_fd) {
printf("writing txdata to binary file\n");
fwrite(txdata[0],sizeof(int32_t),frame_length_complex_samples,output_fd);
}
- int txlev = signal_energy(&txdata[0][frame_parms->get_samples_slot_timestamp(slot,frame_parms,0)+5*frame_parms->ofdm_symbol_size + 4*frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0], frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples);
-
- // if (n_trials==1) printf("txlev %d (%f)\n",txlev,10*log10((double)txlev));
+ int txlev[n_tx];
+ int txlev_sum = 0;
+ int l_ofdm = 6;
+ for (aa=0; aaofdm_symbol_size + (l_ofdm-1)*frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0],
+ frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples);
+ txlev_sum += txlev[aa];
+ if (n_trials==1) printf("txlev[%d] = %d (%f dB) txlev_sum %d\n",aa,txlev[aa],10*log10((double)txlev[aa]),txlev_sum);
+ }
for (i=(frame_parms->get_samples_slot_timestamp(slot,frame_parms,0));
i<(frame_parms->get_samples_slot_timestamp(slot+1,frame_parms,0));
i++) {
for (aa=0; aanb_antennas_tx; aa++) {
- r_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]);
- r_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]);
+ s_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]);
+ s_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]);
}
}
+
double ts = 1.0/(frame_parms->subcarrier_spacing * frame_parms->ofdm_symbol_size);
- //AWGN
- sigma2_dB = 10 * log10((double)txlev * ((double)UE->frame_parms.ofdm_symbol_size/(12*rel15->rbSize))) - SNR;
+ //Compute AWGN variance
+ sigma2_dB = 10 * log10((double)txlev_sum * ((double)UE->frame_parms.ofdm_symbol_size/(12*rel15->rbSize))) - SNR;
sigma2 = pow(10, sigma2_dB/10);
- if (n_trials==1) printf("sigma2 %f (%f dB), txlev %f (factor %f)\n",sigma2,sigma2_dB,10*log10((double)txlev),(double)(double)UE->frame_parms.ofdm_symbol_size/(12*rel15->rbSize));
+ if (n_trials==1) printf("sigma2 %f (%f dB), txlev_sum %f (factor %f)\n",sigma2,sigma2_dB,10*log10((double)txlev_sum),(double)(double)UE->frame_parms.ofdm_symbol_size/(12*rel15->rbSize));
+
+ for (aa=0; aaget_samples_slot_timestamp(slot,frame_parms,0);
iget_samples_slot_timestamp(slot+1,frame_parms,0);
i++) {
- for (aa=0; aanb_antennas_rx; aa++) {
- ((short*) UE->common_vars.rxdata[aa])[2*i] = (short) ((r_re[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
- ((short*) UE->common_vars.rxdata[aa])[2*i+1] = (short) ((r_im[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
+ for (int aa_rx=0; aa_rxcommon_vars.rxdata[aa_rx])[2*i] = (short) ((r_re[aa_rx][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
+ ((short*) UE->common_vars.rxdata[aa_rx])[2*i+1] = (short) ((r_im[aa_rx][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
/* Add phase noise if enabled */
if (pdu_bit_map & 0x1) {
- phase_noise(ts, &((short*) UE->common_vars.rxdata[aa])[2*i],
- &((short*) UE->common_vars.rxdata[aa])[2*i+1]);
+ phase_noise(ts, &((short*) UE->common_vars.rxdata[aa_rx])[2*i],
+ &((short*) UE->common_vars.rxdata[aa_rx])[2*i+1]);
}
}
}
@@ -1092,10 +1129,10 @@ int main(int argc, char **argv)
available_bits-= (ptrsSymbPerSlot * ptrsRePerSymb *rel15->nrOfLayers* 2);
printf("[DLSIM][PTRS] Available bits are: %5u, removed PTRS bits are: %5u \n",available_bits, (ptrsSymbPerSlot * ptrsRePerSymb *rel15->nrOfLayers* 2) );
}
-
+
for (i = 0; i < available_bits; i++) {
-
- if(((gNB_dlsch->harq_process.f[i] == 0) && (UE_llr[i] <= 0)) ||
+
+ if(((gNB_dlsch->harq_process.f[i] == 0) && (UE_llr[i] <= 0)) ||
((gNB_dlsch->harq_process.f[i] == 1) && (UE_llr[i] >= 0)))
{
if(errors_scrambling == 0) {
@@ -1104,7 +1141,7 @@ int main(int argc, char **argv)
}
errors_scrambling++;
}
-
+
}
for (i = 0; i < TBS; i++) {
@@ -1232,12 +1269,16 @@ int main(int argc, char **argv)
}
}*/
- for (i = 0; i < 2; i++) {
+ free_channel_desc_scm(gNB2UE);
+
+ for (i = 0; i < n_tx; i++) {
free(s_re[i]);
free(s_im[i]);
+ free(txdata[i]);
+ }
+ for (i = 0; i < n_rx; i++) {
free(r_re[i]);
free(r_im[i]);
- free(txdata[i]);
}
free(s_re);
diff --git a/openair1/SIMULATION/NR_PHY/nr_unitary_defs.h b/openair1/SIMULATION/NR_PHY/nr_unitary_defs.h
index b78b42db91..8d4acd1af1 100644
--- a/openair1/SIMULATION/NR_PHY/nr_unitary_defs.h
+++ b/openair1/SIMULATION/NR_PHY/nr_unitary_defs.h
@@ -149,13 +149,13 @@ void fill_scc(NR_ServingCellConfigCommon_t *scc,uint64_t *ssb_bitmap,int N_RB_DL
scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.present=NR_RACH_ConfigCommon__prach_RootSequenceIndex_PR_l139;
scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.choice.l139=0;
scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->restrictedSetConfig=NR_RACH_ConfigCommon__restrictedSetConfig_unrestrictedSet;
- *scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[0]->k2=2;
+ *scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[0]->k2=6;
scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[0]->mappingType=NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeB;
scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[0]->startSymbolAndLength=55;
- *scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[1]->k2=2;
+ *scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[1]->k2=6;
scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[1]->mappingType=NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeB;
scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[1]->startSymbolAndLength=69;
- *scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[2]->k2=2;
+ *scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[2]->k2=6;
scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[2]->mappingType=NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeB;
scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[2]->startSymbolAndLength=55;
*scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[3]->k2=33;
diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c
index d8fef539ba..fce690ebd2 100644
--- a/openair1/SIMULATION/NR_PHY/ulsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulsim.c
@@ -666,9 +666,9 @@ int main(int argc, char **argv)
gNB->if_inst->NR_PHY_config_req = nr_phy_config_request;
// common configuration
- rrc_mac_config_req_gNB(0,0,n_rx,pusch_tgt_snrx10,pucch_tgt_snrx10,scc,0,0,NULL);
+ rrc_mac_config_req_gNB(0,0,n_tx,n_rx,pusch_tgt_snrx10,pucch_tgt_snrx10,scc,0,0,NULL);
// UE dedicated configuration
- rrc_mac_config_req_gNB(0,0,1,pusch_tgt_snrx10,pucch_tgt_snrx10,NULL,1,secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
+ rrc_mac_config_req_gNB(0,0,1,1,pusch_tgt_snrx10,pucch_tgt_snrx10,NULL,1,secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
phy_init_nr_gNB(gNB,0,0);
N_RB_DL = gNB->frame_parms.N_RB_DL;
diff --git a/openair1/SIMULATION/TOOLS/multipath_tv_channel.c b/openair1/SIMULATION/TOOLS/multipath_tv_channel.c
index d344992586..c68ce73758 100644
--- a/openair1/SIMULATION/TOOLS/multipath_tv_channel.c
+++ b/openair1/SIMULATION/TOOLS/multipath_tv_channel.c
@@ -48,9 +48,9 @@ void multipath_tv_channel(channel_desc_t *desc,
printf("[TV CHANNEL] keep = %d : path_loss = %g (%f), nb_rx %d, nb_tx %d, dd %d, len %d max_doppler %g\n",keep_channel,path_loss,desc->path_loss_dB,desc->nb_rx,desc->nb_tx,dd,desc->channel_length,
desc->max_Doppler);
#endif
- tx = (double complex **)malloc(desc->nb_tx*sizeof(double complex));
- rx = (double complex **)malloc(desc->nb_rx*sizeof(double complex));
- H_t= (double complex ** *) malloc(desc->nb_tx*desc->nb_rx*sizeof(double complex **));
+ tx = (double complex **)malloc(desc->nb_tx*sizeof(double complex *));
+ rx = (double complex **)malloc(desc->nb_rx*sizeof(double complex *));
+ H_t= (double complex ***) malloc(desc->nb_tx*desc->nb_rx*sizeof(double complex **));
// tv_H_t = (double complex *) malloc(length*sizeof(double complex));
rx_temp= (double complex *) calloc(length,sizeof(double complex));
@@ -63,10 +63,10 @@ void multipath_tv_channel(channel_desc_t *desc,
}
for(i=0; inb_tx*desc->nb_rx; i++) {
- H_t[i] = (double complex **) malloc(length*sizeof(double complex *));
+ H_t[i] = (double complex **)malloc(desc->nb_taps*sizeof(double complex *));
- for(j=0; jnb_taps,sizeof(double complex));
+ for(j=0; jnb_taps; j++) {
+ H_t[i][j] = (double complex *)calloc(length,sizeof(double complex));
}
}
@@ -116,7 +116,7 @@ void multipath_tv_channel(channel_desc_t *desc,
free(rx);
for(i=0; inb_rx*desc->nb_tx; i++) {
- for(j=0; jnb_taps; j++) {
free(H_t[i][j]);
}
@@ -131,14 +131,29 @@ void multipath_tv_channel(channel_desc_t *desc,
void tv_channel(channel_desc_t *desc,double complex ***H,uint32_t length){
int i,j,p,l,k;
- double *alpha,*phi_rad,pi=acos(-1),*w_Hz;
+ double *alpha,***phi_rad,pi=acos(-1),***w_Hz;
alpha = (double *)calloc(desc->nb_paths,sizeof(double));
- phi_rad = (double *)calloc(desc->nb_paths,sizeof(double));
- w_Hz = (double *)calloc(desc->nb_paths,sizeof(double));
+ phi_rad = (double ***)malloc(desc->nb_rx*desc->nb_tx*sizeof(double **));
+ w_Hz = (double ***)malloc(desc->nb_rx*desc->nb_tx*sizeof(double **));
- for(i=0; inb_paths; i++) {
- w_Hz[i]=desc->max_Doppler*cos(frand_a_b(0,2*pi));
- phi_rad[i]=frand_a_b(0,2*pi);
+ for(i=0; inb_tx*desc->nb_rx; i++) {
+ phi_rad[i] = (double **) malloc(desc->nb_taps*sizeof(double *));
+ w_Hz[i] = (double **) malloc(desc->nb_taps*sizeof(double *));
+ for(j=0; jnb_taps; j++) {
+ phi_rad[i][j] = (double *) malloc(desc->nb_paths*sizeof(double));
+ w_Hz[i][j] = (double *) malloc(desc->nb_paths*sizeof(double));
+ }
+ }
+
+ for(i=0; inb_tx*desc->nb_rx; i++) {
+ for (j = 0; jnb_taps; j++) {
+ for(k=0; knb_paths; k++) {
+ w_Hz[i][j][k] = desc->max_Doppler*cos(frand_a_b(0,2*M_PI));
+ phi_rad[i][j][k] = frand_a_b(0,2*M_PI);
+ //printf("w_hz[%d][%d][%d]=f_d*cos(theta) = %f\n",i,j,k,w_Hz[i][j][k]);
+ //printf("phi_rad[%d][%d][%d] = %f\n",i,j,k,phi_rad[i][j][k]);
+ }
+ }
}
if(desc->ricean_factor == 1) {
@@ -153,44 +168,34 @@ void tv_channel(channel_desc_t *desc,double complex ***H,uint32_t length){
}
}
- /*
- // This is the code when we only consider a SISO case
- for(i=0;inb_taps;j++)
- {
- for(p=0;pnb_paths;p++)
- {
- H[i][j] += sqrt(desc->amps[j]/2)*alpha[p]*cexp(-I*(2*pi*w_Hz[p]*i*(1/(desc->sampling_rate*1e6))+phi_rad[p]));
- }
- }
- }
- for(j=0;jnb_paths;j++)
- {
- phi_rad[j] = fmod(2*pi*w_Hz[j]*(length-1)*(1/desc->sampling_rate)+phi_rad[j],2*pi);
- }
- */
-
- // if MIMO
+ // SISO or MIMO
for (i=0; inb_rx; i++) {
for(j=0; jnb_tx; j++) {
- for(k=0; knb_taps; l++) {
- H[i+(j*desc->nb_rx)][k][l] = 0;
-
+ for(k=0; knb_taps; k++) {
+ for(l=0; lnb_paths; p++) {
- H[i+(j*desc->nb_rx)][k][l] += sqrt(desc->amps[l]/2)*alpha[p]*cexp(I*(2*pi*w_Hz[p]*k*(1/(desc->sampling_rate*1e6))+phi_rad[p]));
+ H[i+(j*desc->nb_rx)][k][l] += sqrt(desc->amps[k])*alpha[p]*cexp(I*(2*pi*w_Hz[i+(j*desc->nb_rx)][k][p]*l*(1/(desc->sampling_rate*1e6))+phi_rad[i+(j*desc->nb_rx)][k][p]));
}
}
- }
-
- for(j=0; jnb_paths; j++) {
- phi_rad[j] = fmod(2*pi*w_Hz[j]*(length-1)*(1/desc->sampling_rate)+phi_rad[j],2*pi);
+ //printf("H[tx%d][rx%d][k%d] = %f+j%f \n",j,i,k,creal(H[i+(j*desc->nb_rx)][k][0]),cimag(H[i+(j*desc->nb_rx)][k][0]));
}
}
}
-
+ //accumlate the phase
+ /*for(k=0; knb_taps; k++) {
+ * for(j=0; jnb_paths; j++) {
+ * desc->random_phase[k][j] = fmod(2*pi*w_Hz[k][j]*(length-1)*(1/(desc->sampling_rate*1e6))+phi_rad[k][j],2*pi);
+ * }
+ * }*/
free(alpha);
+ for(i=0; inb_rx*desc->nb_tx; i++) {
+ for (j=0; jnb_taps; j++) {
+ free(w_Hz[i][j]);
+ free(phi_rad[i][j]);
+ }
+ free(w_Hz[i]);
+ free(phi_rad[i]);
+ }
free(w_Hz);
free(phi_rad);
}
@@ -203,7 +208,7 @@ void tv_conv(double complex **h, double complex *x, double complex *y, uint32_t
for(i=0; i<((int)nb_samples-dd); i++) {
for(j=0; jj)
- y[i+dd] += creal(h[i][j])*creal(x[i-j])-cimag(h[i][j])*cimag(x[i-j]) + I*(creal(h[i][j])*cimag(x[i-j])+cimag(h[i][j])*creal(x[i-j]));
+ y[i+dd] += creal(h[j][i])*creal(x[i-j])-cimag(h[j][i])*cimag(x[i-j]) + I*(creal(h[j][i])*cimag(x[i-j])+cimag(h[j][i])*creal(x[i-j]));
}
}
}
diff --git a/openair1/SIMULATION/TOOLS/random_channel.c b/openair1/SIMULATION/TOOLS/random_channel.c
index 8c063fadc0..47597f4d6e 100644
--- a/openair1/SIMULATION/TOOLS/random_channel.c
+++ b/openair1/SIMULATION/TOOLS/random_channel.c
@@ -61,7 +61,7 @@ static telnetshell_vardef_t channelmod_vardef[] = {
static double snr_dB=25;
static double sinr_dB=0;
static unsigned int max_chan;
-static channel_desc_t** defined_channels;
+static channel_desc_t **defined_channels;
void fill_channel_desc(channel_desc_t *chan_desc,
uint8_t nb_tx,
uint8_t nb_rx,
@@ -1185,11 +1185,11 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
1);
break;
- case Rayleigh1:
+ case Rayleigh1://MIMO Test uses Rayleigh1
nb_taps = 1;
Td = 0;
channel_length = 1;
- ricean_factor = 1;
+ ricean_factor = 0.0;
aoa = .03;
maxDoppler = 0;
fill_channel_desc(chan_desc,nb_tx,
@@ -1632,7 +1632,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
void free_channel_desc_scm(channel_desc_t *ch) {
// Must be made cleanly, a lot of leaks...
- defined_channels[ch->chan_idx]=NULL;
+ if (max_chan != 0) defined_channels[ch->chan_idx]=NULL;
if(ch->free_flags&CHANMODEL_FREE_AMPS)
free(ch->amps);
for (int i = 0; inb_tx*ch->nb_rx; i++) {
diff --git a/openair2/COMMON/rrc_messages_types.h b/openair2/COMMON/rrc_messages_types.h
index 87f926b206..64c42eaf0e 100644
--- a/openair2/COMMON/rrc_messages_types.h
+++ b/openair2/COMMON/rrc_messages_types.h
@@ -409,6 +409,7 @@ typedef struct NRRrcConfigurationReq_s {
NR_ServingCellConfig_t *scd;
int ssb_SubcarrierOffset;
int pdsch_AntennaPorts;
+ int pusch_AntennaPorts;
int pusch_TargetSNRx10;
int pucch_TargetSNRx10;
} gNB_RrcConfigurationReq;
diff --git a/openair2/GNB_APP/gnb_app.c b/openair2/GNB_APP/gnb_app.c
index 77e4564632..b525e7edb7 100644
--- a/openair2/GNB_APP/gnb_app.c
+++ b/openair2/GNB_APP/gnb_app.c
@@ -147,8 +147,6 @@ void *gNB_app_task(void *args_p)
LOG_I(PHY, "%s() Task ready initialize structures\n", __FUNCTION__);
- RCconfig_NR_L1();
-
RCconfig_nr_macrlc();
LOG_I(PHY, "%s() RC.nb_nr_L1_inst:%d\n", __FUNCTION__, RC.nb_nr_L1_inst);
diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c
index 608827cc7a..b40ff5d9e2 100644
--- a/openair2/GNB_APP/gnb_config.c
+++ b/openair2/GNB_APP/gnb_config.c
@@ -297,7 +297,7 @@ void fix_scc(NR_ServingCellConfigCommon_t *scc,uint64_t ssbmap) {
void prepare_scd(NR_ServingCellConfig_t *scd) {
// Allocate downlink structures
- scd->downlinkBWP_ToAddModList = CALLOC(1, sizeof(scd->downlinkBWP_ToAddModList));
+ scd->downlinkBWP_ToAddModList = CALLOC(1, sizeof(*scd->downlinkBWP_ToAddModList));
// Downlink bandwidth part
NR_BWP_Downlink_t *bwp = calloc(1, sizeof(*bwp));
@@ -318,29 +318,25 @@ void prepare_scd(NR_ServingCellConfig_t *scd) {
NR_DMRS_DownlinkCfg->phaseTrackingRS->present = NR_SetupRelease_PTRS_DownlinkConfig_PR_setup;
NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup = CALLOC(1, sizeof(*NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup));
NR_PTRS_DownlinkConfig_t *NR_PTRS_DownlinkCfg = NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup;
- NR_PTRS_DownlinkCfg->frequencyDensity = CALLOC(1, sizeof(NR_PTRS_DownlinkCfg->frequencyDensity));
- int *dl_rbs[2];
+ NR_PTRS_DownlinkCfg->frequencyDensity = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->frequencyDensity));
+ long *dl_rbs = CALLOC(2, sizeof(long));
for (int i=0;i<2;i++) {
- dl_rbs[i] = CALLOC(1, sizeof(*dl_rbs[i]));
- *dl_rbs[i] = 0;
- ASN_SEQUENCE_ADD(&NR_PTRS_DownlinkCfg->frequencyDensity->list, dl_rbs[i]);
+ ASN_SEQUENCE_ADD(&NR_PTRS_DownlinkCfg->frequencyDensity->list, &dl_rbs[i]);
}
- NR_PTRS_DownlinkCfg->timeDensity = CALLOC(1, sizeof(NR_PTRS_DownlinkCfg->timeDensity));
- int *dl_mcs[3];
+ NR_PTRS_DownlinkCfg->timeDensity = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->timeDensity));
+ long *dl_mcs = CALLOC(3, sizeof(long));
for (int i=0;i<3;i++) {
- dl_mcs[i] = CALLOC(1, sizeof(*dl_mcs[i]));
- *dl_mcs[i] = 0;
- ASN_SEQUENCE_ADD(&NR_PTRS_DownlinkCfg->timeDensity->list, dl_mcs[i]);
+ ASN_SEQUENCE_ADD(&NR_PTRS_DownlinkCfg->timeDensity->list, &dl_mcs[i]);
}
- NR_PTRS_DownlinkCfg->epre_Ratio = CALLOC(1, sizeof(NR_PTRS_DownlinkCfg->epre_Ratio));
- NR_PTRS_DownlinkCfg->resourceElementOffset = CALLOC(1, sizeof(NR_PTRS_DownlinkCfg->resourceElementOffset));
+ NR_PTRS_DownlinkCfg->epre_Ratio = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->epre_Ratio));
+ NR_PTRS_DownlinkCfg->resourceElementOffset = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->resourceElementOffset));
*NR_PTRS_DownlinkCfg->resourceElementOffset = 0;
ASN_SEQUENCE_ADD(&scd->downlinkBWP_ToAddModList->list,bwp);
// Allocate uplink structures
- scd->uplinkConfig = CALLOC(1, sizeof(NR_UplinkConfig_t));
- scd->uplinkConfig->uplinkBWP_ToAddModList = CALLOC(1, sizeof(scd->uplinkConfig->uplinkBWP_ToAddModList));
+ scd->uplinkConfig = CALLOC(1, sizeof(*scd->uplinkConfig));
+ scd->uplinkConfig->uplinkBWP_ToAddModList = CALLOC(1, sizeof(*scd->uplinkConfig->uplinkBWP_ToAddModList));
NR_PUSCH_Config_t *pusch_Config = CALLOC(1, sizeof(*pusch_Config));
@@ -355,20 +351,16 @@ void prepare_scd(NR_ServingCellConfig_t *scd) {
NR_PTRS_UplinkConfig_t *NR_PTRS_UplinkConfig = NR_DMRS_UplinkConfig->phaseTrackingRS->choice.setup;
NR_PTRS_UplinkConfig->transformPrecoderDisabled = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled));
NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity));
- int *n_rbs[2];
+ long *n_rbs = CALLOC(2, sizeof(long));
for (int i=0;i<2;i++) {
- n_rbs[i] = CALLOC(1, sizeof(*n_rbs[i]));
- *n_rbs[i] = 0;
- ASN_SEQUENCE_ADD(&NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity->list, n_rbs[i]);
+ ASN_SEQUENCE_ADD(&NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity->list, &n_rbs[i]);
}
NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity));
- int *ptrs_mcs[3];
+ long *ptrs_mcs = CALLOC(3, sizeof(long));
for (int i = 0; i < 3; i++) {
- ptrs_mcs[i] = CALLOC(1, sizeof(*ptrs_mcs[i]));
- *ptrs_mcs[i] = 0;
- ASN_SEQUENCE_ADD(&NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity->list, ptrs_mcs[i]);
+ ASN_SEQUENCE_ADD(&NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity->list, &ptrs_mcs[i]);
}
- NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset = CALLOC(1, sizeof(NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset));
+ NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset));
*NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset = 0;
// UL bandwidth part
@@ -589,15 +581,17 @@ void RCconfig_NR_L1(void) {
RC.nb_nr_CC = (int *)malloc((1+RC.nb_nr_inst)*sizeof(int));
RC.nb_nr_CC[0]=1;
- RC.nb_nr_inst =1; // DJP - feptx_prec uses num_gNB but phy_init_RU uses nb_nr_inst
-
LOG_I(PHY,"%s() NFAPI PNF mode - RC.nb_nr_inst=1 this is because phy_init_RU() uses that to index and not RC.num_gNB - why the 2 similar variables?\n", __FUNCTION__);
LOG_I(PHY,"%s() NFAPI PNF mode - RC.nb_nr_CC[0]=%d for init_gNB_afterRU()\n", __FUNCTION__, RC.nb_nr_CC[0]);
LOG_I(PHY,"%s() NFAPI PNF mode - RC.nb_nr_macrlc_inst:%d because used by mac_top_init_gNB()\n", __FUNCTION__, RC.nb_nr_macrlc_inst);
mac_top_init_gNB();
- configure_nr_nfapi_pnf(RC.gNB[j]->eth_params_n.remote_addr, RC.gNB[j]->eth_params_n.remote_portc, RC.gNB[j]->eth_params_n.my_addr, RC.gNB[j]->eth_params_n.my_portd, RC.gNB[j]->eth_params_n .remote_portd);
+ configure_nr_nfapi_pnf(RC.gNB[j]->eth_params_n.remote_addr,
+ RC.gNB[j]->eth_params_n.remote_portc,
+ RC.gNB[j]->eth_params_n.my_addr,
+ RC.gNB[j]->eth_params_n.my_portd,
+ RC.gNB[j]->eth_params_n.remote_portd);
}else { // other midhaul
}
}// for (j = 0; j < RC.nb_nr_L1_inst; j++)
@@ -954,6 +948,8 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) {
NRRRC_CONFIGURATION_REQ (msg_p).ssb_SubcarrierOffset = *GNBParamList.paramarray[i][GNB_SSB_SUBCARRIEROFFSET_IDX].iptr;
printf("pdsch_AntennaPorts %d\n",*GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_IDX].iptr);
NRRRC_CONFIGURATION_REQ (msg_p).pdsch_AntennaPorts = *GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_IDX].iptr;
+ printf("pusch_AntennaPorts %d\n",*GNBParamList.paramarray[i][GNB_PUSCH_ANTENNAPORTS_IDX].iptr);
+ NRRRC_CONFIGURATION_REQ (msg_p).pusch_AntennaPorts = *GNBParamList.paramarray[i][GNB_PUSCH_ANTENNAPORTS_IDX].iptr;
printf("pusch_TargetSNRx10 %d\n",*GNBParamList.paramarray[i][GNB_PUSCH_TARGETPOW_X10_IDX].iptr);
NRRRC_CONFIGURATION_REQ (msg_p).pusch_TargetSNRx10 = *GNBParamList.paramarray[i][GNB_PUSCH_TARGETPOW_X10_IDX].iptr;
printf("pucch_TargetSNRx10 %d\n",*GNBParamList.paramarray[i][GNB_PUCCH_TARGETPOW_X10_IDX].iptr);
diff --git a/openair2/GNB_APP/gnb_paramdef.h b/openair2/GNB_APP/gnb_paramdef.h
index 403602c109..8b326d58c9 100644
--- a/openair2/GNB_APP/gnb_paramdef.h
+++ b/openair2/GNB_APP/gnb_paramdef.h
@@ -115,6 +115,7 @@ typedef enum {
#define GNB_CONFIG_STRING_REMOTE_S_PORTD "remote_s_portd"
#define GNB_CONFIG_STRING_SSBSUBCARRIEROFFSET "ssb_SubcarrierOffset"
#define GNB_CONFIG_STRING_PDSCHANTENNAPORTS "pdsch_AntennaPorts"
+#define GNB_CONFIG_STRING_PUSCHANTENNAPORTS "pusch_AntennaPorts"
#define GNB_CONFIG_STRING_PUSCHTARGETPOWX10 "pusch_TargetSNRx10"
#define GNB_CONFIG_STRING_PUCCHTARGETPOWX10 "pucch_TargetSNRx10"
@@ -139,6 +140,7 @@ typedef enum {
{GNB_CONFIG_STRING_REMOTE_S_PORTD, NULL, 0, uptr:NULL, defuintval:50001, TYPE_UINT, 0}, \
{GNB_CONFIG_STRING_SSBSUBCARRIEROFFSET, NULL, 0, iptr:NULL, defintval:31, TYPE_INT, 0}, \
{GNB_CONFIG_STRING_PDSCHANTENNAPORTS, NULL, 0, iptr:NULL, defintval:1, TYPE_INT, 0}, \
+{GNB_CONFIG_STRING_PUSCHANTENNAPORTS, NULL, 0, iptr:NULL, defintval:1, TYPE_INT, 0}, \
{GNB_CONFIG_STRING_PUSCHTARGETPOWX10, NULL, 0, iptr:NULL, defintval:200, TYPE_INT, 0}, \
{GNB_CONFIG_STRING_PUCCHTARGETPOWX10, NULL, 0, iptr:NULL, defintval:200, TYPE_INT, 0}, \
}
@@ -159,8 +161,9 @@ typedef enum {
#define GNB_REMOTE_S_PORTD_IDX 13
#define GNB_SSB_SUBCARRIEROFFSET_IDX 14
#define GNB_PDSCH_ANTENNAPORTS_IDX 15
-#define GNB_PUSCH_TARGETPOW_X10_IDX 16
-#define GNB_PUCCH_TARGETPOW_X10_IDX 17
+#define GNB_PUSCH_ANTENNAPORTS_IDX 16
+#define GNB_PUSCH_TARGETPOW_X10_IDX 17
+#define GNB_PUCCH_TARGETPOW_X10_IDX 18
#define TRACKING_AREA_CODE_OKRANGE {0x0001,0xFFFD}
#define GNBPARAMS_CHECK { \
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
index cdeb23c099..514d7eacdb 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
@@ -2273,7 +2273,7 @@ uint8_t get_L_ptrs(uint8_t mcs1, uint8_t mcs2, uint8_t mcs3, uint8_t I_mcs, uint
mcs4 = 28;
if (I_mcs < mcs1) {
- LOG_I(PHY, "PUSH PT-RS is not present.\n");
+ LOG_D(PHY, "PUSH PT-RS is not present.\n");
return -1;
} else if (I_mcs >= mcs1 && I_mcs < mcs2)
return 2;
@@ -2303,7 +2303,7 @@ uint8_t get_L_ptrs(uint8_t mcs1, uint8_t mcs2, uint8_t mcs3, uint8_t I_mcs, uint
uint8_t get_K_ptrs(uint16_t nrb0, uint16_t nrb1, uint16_t N_RB) {
if (N_RB < nrb0) {
- LOG_I(PHY,"PUSH PT-RS is not present.\n");
+ LOG_D(PHY,"PUSH PT-RS is not present.\n");
return -1;
} else if (N_RB >= nrb0 && N_RB < nrb1)
return 2;
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
index cb104092f1..cfcaac6c4b 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
@@ -101,7 +101,7 @@ int8_t nr_ue_decode_mib(module_id_t module_id,
void *pduP,
uint16_t cell_id)
{
- LOG_I(MAC,"[L2][MAC] decode mib\n");
+ LOG_D(MAC,"[L2][MAC] decode mib\n");
NR_UE_MAC_INST_t *mac = get_mac_inst(module_id);
@@ -449,8 +449,9 @@ int nr_ue_process_dci_indication_pdu(module_id_t module_id,int cc_id, int gNB_in
LOG_D(MAC,"Received dci indication (rnti %x,dci format %d,n_CCE %d,payloadSize %d,payload %llx)\n",
dci->rnti,dci->dci_format,dci->n_CCE,dci->payloadSize,*(unsigned long long*)dci->payloadBits);
- uint32_t dci_format = nr_extract_dci_info(mac, dci->dci_format, dci->payloadSize, dci->rnti, (uint64_t *)dci->payloadBits, def_dci_pdu_rel15);
- return (nr_ue_process_dci(module_id, cc_id, gNB_index, frame, slot, def_dci_pdu_rel15, dci->rnti, dci_format));
+ if (nr_extract_dci_info(mac, dci->dci_format, dci->payloadSize, dci->rnti, (uint64_t *)dci->payloadBits, def_dci_pdu_rel15))
+ return -1;
+ return (nr_ue_process_dci(module_id, cc_id, gNB_index, frame, slot, def_dci_pdu_rel15, dci->rnti, dci->dci_format));
}
int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, frame_t frame, int slot, dci_pdu_rel15_t *dci, uint16_t rnti, uint8_t dci_format){
@@ -1129,11 +1130,11 @@ int get_n_rb(NR_UE_MAC_INST_t *mac, int rnti_type){
}
uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
- uint8_t dci_format,
- uint8_t dci_size,
- uint16_t rnti,
- uint64_t *dci_pdu,
- dci_pdu_rel15_t *dci_pdu_rel15) {
+ uint8_t dci_format,
+ uint8_t dci_size,
+ uint16_t rnti,
+ uint64_t *dci_pdu,
+ dci_pdu_rel15_t *dci_pdu_rel15) {
int rnti_type = get_rnti_type(mac, rnti);
@@ -1147,32 +1148,6 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
int pos=0;
int fsize=0;
- if (rnti_type == NR_RNTI_C) {
- // First find out the DCI format from the first bit (UE performed blind decoding)
- pos++;
- dci_pdu_rel15->format_indicator = (*dci_pdu>>(dci_size-pos))&1;
-#ifdef DEBUG_EXTRACT_DCI
- LOG_D(MAC,"Format indicator %d (%d bits) N_RB_BWP %d => %d (0x%lx)\n",dci_pdu_rel15->format_indicator,1,N_RB,dci_size-pos,*dci_pdu);
-#endif
-
- if (dci_format == NR_UL_DCI_FORMAT_0_0 || dci_format == NR_DL_DCI_FORMAT_1_0) {
- if (dci_pdu_rel15->format_indicator == 0)
- dci_format = NR_UL_DCI_FORMAT_0_0;
- else
- dci_format = NR_DL_DCI_FORMAT_1_0;
- }
- else if (dci_format == NR_UL_DCI_FORMAT_0_1 || dci_format == NR_DL_DCI_FORMAT_1_1) {
- // In case the sizes of formats 0_1 and 1_1 happen to be the same
- if (dci_pdu_rel15->format_indicator == 0)
- dci_format = NR_UL_DCI_FORMAT_0_1;
- else
- dci_format = NR_DL_DCI_FORMAT_1_1;
- }
- }
-#ifdef DEBUG_EXTRACT_DCI
- LOG_D(MAC, "DCI format is %d\n", dci_format);
-#endif
-
switch(dci_format) {
case NR_DL_DCI_FORMAT_1_0:
@@ -1213,7 +1188,15 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
break;
case NR_RNTI_C:
-
+
+ //Identifier for DCI formats
+ pos++;
+ dci_pdu_rel15->format_indicator = (*dci_pdu>>(dci_size-pos))&1;
+ if (dci_pdu_rel15->format_indicator == 0)
+ return 1; // discard dci, format indicator not corresponding to dci_format
+#ifdef DEBUG_EXTRACT_DCI
+ LOG_D(MAC,"Format indicator %d (%d bits) N_RB_BWP %d => %d (0x%lx)\n",dci_pdu_rel15->format_indicator,1,N_RB,dci_size-pos,*dci_pdu);
+#endif
// Freq domain assignment (275rb >> fsize = 16)
fsize = (int)ceil( log2( (N_RB*(N_RB+1))>>1 ) );
pos+=fsize;
@@ -1395,6 +1378,8 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
// indicating a DL DCI format 1bit
pos++;
dci_pdu_rel15->format_indicator = (*dci_pdu>>(dci_size-pos))&1;
+ if (dci_pdu_rel15->format_indicator == 0)
+ return 1; // discard dci, format indicator not corresponding to dci_format
// Freq domain assignment 0-16 bit
fsize = (int)ceil( log2( (N_RB*(N_RB+1))>>1 ) );
pos+=fsize;
@@ -1433,6 +1418,11 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
switch(rnti_type)
{
case NR_RNTI_C:
+ //Identifier for DCI formats
+ pos++;
+ dci_pdu_rel15->format_indicator = (*dci_pdu>>(dci_size-pos))&1;
+ if (dci_pdu_rel15->format_indicator == 1)
+ return 1; // discard dci, format indicator not corresponding to dci_format
fsize = (int)ceil( log2( (N_RB_UL*(N_RB_UL+1))>>1 ) );
pos+=fsize;
dci_pdu_rel15->frequency_domain_assignment.val = (*dci_pdu>>(dci_size-pos))&((1<format_indicator = (*dci_pdu>>(dci_size-pos))&1;
+ if (dci_pdu_rel15->format_indicator == 0)
+ return 1; // discard dci, format indicator not corresponding to dci_format
// Carrier indicator
pos+=dci_pdu_rel15->carrier_indicator.nbits;
dci_pdu_rel15->carrier_indicator.val = (*dci_pdu>>(dci_size-pos))&((1<carrier_indicator.nbits)-1);
@@ -1593,6 +1588,11 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
switch(rnti_type)
{
case NR_RNTI_C:
+ //Identifier for DCI formats
+ pos++;
+ dci_pdu_rel15->format_indicator = (*dci_pdu>>(dci_size-pos))&1;
+ if (dci_pdu_rel15->format_indicator == 1)
+ return 1; // discard dci, format indicator not corresponding to dci_format
// Carrier indicator
pos+=dci_pdu_rel15->carrier_indicator.nbits;
dci_pdu_rel15->carrier_indicator.val = (*dci_pdu>>(dci_size-pos))&((1<carrier_indicator.nbits)-1);
@@ -1701,7 +1701,7 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
break;
}
- return dci_format;
+ return 0;
}
///////////////////////////////////
@@ -1746,7 +1746,7 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info,
frame_t frameP = dl_info->frame;
int slot = dl_info->slot;
uint8_t *pduP = (dl_info->rx_ind->rx_indication_body + pdu_id)->pdsch_pdu.pdu;
- uint16_t pdu_len = (dl_info->rx_ind->rx_indication_body + pdu_id)->pdsch_pdu.pdu_length;
+ int32_t pdu_len = (dl_info->rx_ind->rx_indication_body + pdu_id)->pdsch_pdu.pdu_length;
uint8_t gNB_index = dl_info->gNB_index;
uint8_t CC_id = dl_info->cc_id;
uint8_t done = 0;
@@ -1757,7 +1757,7 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info,
return;
}
- LOG_D(MAC, "In %s [%d.%d]: processing PDU %d of %d total number of PDUs...\n", __FUNCTION__, frameP, slot, pdu_id, dl_info->rx_ind->number_pdus);
+ LOG_D(MAC, "In %s [%d.%d]: processing PDU %d (with length %d) of %d total number of PDUs...\n", __FUNCTION__, frameP, slot, pdu_id, pdu_len, dl_info->rx_ind->number_pdus);
while (!done && pdu_len > 0){
mac_ce_len = 0x0000;
@@ -1961,7 +1961,7 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info,
pduP += ( mac_subheader_len + mac_ce_len + mac_sdu_len );
pdu_len -= ( mac_subheader_len + mac_ce_len + mac_sdu_len );
if (pdu_len < 0)
- LOG_E(MAC, "[MAC] nr_ue_process_mac_pdu, residual mac pdu length %d < 0!\n", pdu_len);
+ LOG_E(MAC, "[UE %d][%d.%d] nr_ue_process_mac_pdu, residual mac pdu length %d < 0!\n", module_idP, frameP, slot, pdu_len);
}
}
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
index ad1958ef33..844ee95d32 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
@@ -109,7 +109,11 @@ long get_k2(NR_UE_MAC_INST_t *mac, uint8_t time_domain_ind) {
}
k2 = *pusch_TimeDomainAllocationList->list.array[time_domain_ind]->k2;
}
-
+
+ AssertFatal(k2 >= DURATION_RX_TO_TX,
+ "Slot offset K2 (%ld) cannot be less than DURATION_RX_TO_TX (%d)\n",
+ k2,DURATION_RX_TO_TX);
+
LOG_D(MAC, "get_k2(): k2 is %ld\n", k2);
return k2;
}
@@ -997,6 +1001,10 @@ int nr_ue_pusch_scheduler(NR_UE_MAC_INST_t *mac,
break;
}
+ AssertFatal((k2+delta) >= DURATION_RX_TO_TX,
+ "Slot offset (%d) for Msg3 cannot be less than DURATION_RX_TO_TX (%d)\n",
+ k2+delta,DURATION_RX_TO_TX);
+
*slot_tx = (current_slot + k2 + delta) % nr_slots_per_frame[mu];
if (current_slot + k2 + delta > nr_slots_per_frame[mu]){
*frame_tx = (current_frame + 1) % 1024;
diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c
index 39bad35af7..caa56bdff9 100644
--- a/openair2/LAYER2/NR_MAC_gNB/config.c
+++ b/openair2/LAYER2/NR_MAC_gNB/config.c
@@ -54,7 +54,7 @@ extern RAN_CONTEXT_t RC;
extern void mac_top_init_gNB(void);
extern uint8_t nfapi_mode;
-void config_common(int Mod_idP, int pdsch_AntennaPorts, NR_ServingCellConfigCommon_t *scc) {
+void config_common(int Mod_idP, int pdsch_AntennaPorts, int pusch_AntennaPorts, NR_ServingCellConfigCommon_t *scc) {
nfapi_nr_config_request_scf_t *cfg = &RC.nrmac[Mod_idP]->config[0];
RC.nrmac[Mod_idP]->common_channels[0].ServingCellConfigCommon = scc;
@@ -264,18 +264,32 @@ void config_common(int Mod_idP, int pdsch_AntennaPorts, NR_ServingCellConfigComm
cfg->ssb_table.ssb_mask_list[0].ssb_mask.tl.tag = NFAPI_NR_CONFIG_SSB_MASK_TAG;
cfg->ssb_table.ssb_mask_list[1].ssb_mask.tl.tag = NFAPI_NR_CONFIG_SSB_MASK_TAG;
- cfg->num_tlv++;
+ cfg->num_tlv+=2;
cfg->carrier_config.num_tx_ant.value = pdsch_AntennaPorts;
AssertFatal(pdsch_AntennaPorts > 0 && pdsch_AntennaPorts < 13, "pdsch_AntennaPorts in 1...12\n");
cfg->carrier_config.num_tx_ant.tl.tag = NFAPI_NR_CONFIG_NUM_TX_ANT_TAG;
+
int num_ssb=0;
for (int i=0;i<32;i++) {
- num_ssb += (cfg->ssb_table.ssb_mask_list[0].ssb_mask.value>>i)&1;
- num_ssb += (cfg->ssb_table.ssb_mask_list[1].ssb_mask.value>>i)&1;
+ cfg->ssb_table.ssb_beam_id_list[i].beam_id.tl.tag = NFAPI_NR_CONFIG_BEAM_ID_TAG;
+ if ((cfg->ssb_table.ssb_mask_list[0].ssb_mask.value>>(31-i))&1) {
+ cfg->ssb_table.ssb_beam_id_list[i].beam_id.value = num_ssb;
+ num_ssb++;
+ }
+ cfg->num_tlv++;
+ }
+ for (int i=0;i<32;i++) {
+ cfg->ssb_table.ssb_beam_id_list[32+i].beam_id.tl.tag = NFAPI_NR_CONFIG_BEAM_ID_TAG;
+ if ((cfg->ssb_table.ssb_mask_list[1].ssb_mask.value>>(31-i))&1) {
+ cfg->ssb_table.ssb_beam_id_list[32+i].beam_id.value = num_ssb;
+ num_ssb++;
+ }
+ cfg->num_tlv++;
}
- cfg->carrier_config.num_rx_ant.value = cfg->carrier_config.num_tx_ant.value;
+ cfg->carrier_config.num_rx_ant.value = pusch_AntennaPorts;
+ AssertFatal(pusch_AntennaPorts > 0 && pusch_AntennaPorts < 13, "pusch_AntennaPorts in 1...12\n");
cfg->carrier_config.num_rx_ant.tl.tag = NFAPI_NR_CONFIG_NUM_RX_ANT_TAG;
LOG_I(MAC,"Set TX/RX antenna number to %d (num ssb %d: %x,%x)\n",cfg->carrier_config.num_tx_ant.value,num_ssb,cfg->ssb_table.ssb_mask_list[0].ssb_mask.value,cfg->ssb_table.ssb_mask_list[1].ssb_mask.value);
AssertFatal(cfg->carrier_config.num_tx_ant.value > 0,"carrier_config.num_tx_ant.value %d !\n",cfg->carrier_config.num_tx_ant.value );
@@ -295,25 +309,28 @@ void config_common(int Mod_idP, int pdsch_AntennaPorts, NR_ServingCellConfigComm
}
if(cfg->cell_config.frame_duplex_type.value == TDD){
LOG_I(MAC,"Setting TDD configuration period to %d\n",cfg->tdd_table.tdd_period.value);
- int return_tdd = set_tdd_config_nr(cfg,
- scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing,
- scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSlots,
- scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSymbols,
- scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSlots,
- scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols);
+ int periods_per_frame = set_tdd_config_nr(cfg,
+ scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing,
+ scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSlots,
+ scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSymbols,
+ scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSlots,
+ scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols);
- if (return_tdd != 0)
+ if (periods_per_frame < 0)
LOG_E(MAC,"TDD configuration can not be done\n");
- else
- LOG_I(MAC,"TDD has been properly configurated\n");
+ else {
+ LOG_I(MAC,"TDD has been properly configurated\n");
+ RC.nrmac[Mod_idP]->tdd_beam_association = (int16_t *)malloc16(periods_per_frame*sizeof(int16_t));
+ }
}
}
extern uint16_t sl_ahead;
-int rrc_mac_config_req_gNB(module_id_t Mod_idP,
- int ssb_SubcarrierOffset,
+int rrc_mac_config_req_gNB(module_id_t Mod_idP,
+ int ssb_SubcarrierOffset,
int pdsch_AntennaPorts,
+ int pusch_AntennaPorts,
int pusch_tgt_snrx10,
int pucch_tgt_snrx10,
NR_ServingCellConfigCommon_t *scc,
@@ -359,7 +376,8 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
LOG_I(MAC,"Configuring common parameters from NR ServingCellConfig\n");
config_common(Mod_idP,
- pdsch_AntennaPorts,
+ pdsch_AntennaPorts,
+ pusch_AntennaPorts,
scc);
LOG_E(MAC, "%s() %s:%d RC.nrmac[Mod_idP]->if_inst->NR_PHY_config_req:%p\n", __FUNCTION__, __FILE__, __LINE__, RC.nrmac[Mod_idP]->if_inst->NR_PHY_config_req);
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
index 8f93f14659..41f3af743c 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
@@ -301,6 +301,7 @@ void schedule_nr_SRS(module_id_t module_idP, frame_t frameP, sub_frame_t subfram
bool is_xlsch_in_slot(uint64_t bitmap, sub_frame_t slot) {
+ if (slot>64) return false; //quickfix for FR2 where there are more than 64 slots (bitmap to be removed)
return (bitmap >> slot) & 0x01;
}
@@ -357,6 +358,12 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
AssertFatal(1==0,"Undefined tdd period %ld\n", scc->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity);
}
+ if (slot==0 && (*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]>=257)) {
+ // re-initialization of tdd_beam_association at beginning of frame (only for FR2)
+ for (int i=0; itdd_beam_association[i] = -1;
+ }
+
int num_slots_per_tdd = (nr_slots_per_frame[*scc->ssbSubcarrierSpacing])/nb_periods_per_frame;
const int nr_ulmix_slots = tdd_pattern->nrofUplinkSlots + (tdd_pattern->nrofUplinkSymbols!=0);
@@ -410,7 +417,7 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
// This schedules MIB
- schedule_nr_mib(module_idP, frame, slot, nr_slots_per_frame[*scc->ssbSubcarrierSpacing]);
+ schedule_nr_mib(module_idP, frame, slot, nr_slots_per_frame[*scc->ssbSubcarrierSpacing],nb_periods_per_frame);
// This schedules SIB1
if ( get_softmodem_params()->sa == 1 )
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
index 64867c5be5..bc297225af 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
@@ -385,7 +385,9 @@ void nr_schedule_msg2(uint16_t rach_frame, uint16_t rach_slot,
uint16_t *msg2_frame, uint16_t *msg2_slot,
NR_ServingCellConfigCommon_t *scc,
uint16_t monitoring_slot_period,
- uint16_t monitoring_offset,uint8_t index,uint8_t num_active_ssb){
+ uint16_t monitoring_offset,uint8_t beam_index,
+ uint8_t num_active_ssb,
+ int16_t *tdd_beam_association){
// preferentially we schedule the msg2 in the mixed slot or in the last dl slot
// if they are allowed by search space configuration
@@ -402,18 +404,6 @@ void nr_schedule_msg2(uint16_t rach_frame, uint16_t rach_slot,
if ((scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSymbols > 0) || (scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols > 0))
tdd_period_slot++;
- // computing start of next period
- uint8_t start_next_period = (rach_slot-(rach_slot%tdd_period_slot)+tdd_period_slot)%nr_slots_per_frame[mu];
- *msg2_slot = start_next_period + last_dl_slot_period; // initializing scheduling of slot to next mixed (or last dl) slot
- *msg2_frame = (*msg2_slot>(rach_slot))? rach_frame : (rach_frame +1);
-
- // we can't schedule msg2 before sl_ahead since prach
- int eff_slot = *msg2_slot+(*msg2_frame-rach_frame)*nr_slots_per_frame[mu];
- if ((eff_slot-rach_slot)<=sl_ahead) {
- *msg2_slot = (*msg2_slot+tdd_period_slot)%nr_slots_per_frame[mu];
- *msg2_frame = (*msg2_slot>(rach_slot))? rach_frame : (rach_frame +1);
- }
-
switch(response_window){
case NR_RACH_ConfigGeneric__ra_ResponseWindow_sl1:
slot_window = 1;
@@ -448,6 +438,31 @@ void nr_schedule_msg2(uint16_t rach_frame, uint16_t rach_slot,
uint8_t slot_limit = (rach_slot + slot_window)%nr_slots_per_frame[mu];
uint8_t frame_limit = (slot_limit>(rach_slot))? rach_frame : (rach_frame +1);
+ // computing start of next period
+
+ int FR = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0] >= 257 ? nr_FR2 : nr_FR1;
+
+ uint8_t start_next_period = (rach_slot-(rach_slot%tdd_period_slot)+tdd_period_slot)%nr_slots_per_frame[mu];
+ *msg2_slot = start_next_period + last_dl_slot_period; // initializing scheduling of slot to next mixed (or last dl) slot
+ *msg2_frame = (*msg2_slot>(rach_slot))? rach_frame : (rach_frame +1);
+
+ // we can't schedule msg2 before sl_ahead since prach
+ int eff_slot = *msg2_slot+(*msg2_frame-rach_frame)*nr_slots_per_frame[mu];
+ if ((eff_slot-rach_slot)<=sl_ahead) {
+ *msg2_slot = (*msg2_slot+tdd_period_slot)%nr_slots_per_frame[mu];
+ *msg2_frame = (*msg2_slot>(rach_slot))? rach_frame : (rach_frame +1);
+ }
+ if (FR==nr_FR2) {
+ int num_tdd_period = *msg2_slot/tdd_period_slot;
+ while((tdd_beam_association[num_tdd_period]!=-1)&&(tdd_beam_association[num_tdd_period]!=beam_index)) {
+ *msg2_slot = (*msg2_slot+tdd_period_slot)%nr_slots_per_frame[mu];
+ *msg2_frame = (*msg2_slot>(rach_slot))? rach_frame : (rach_frame +1);
+ num_tdd_period = *msg2_slot/tdd_period_slot;
+ }
+ if(tdd_beam_association[num_tdd_period] == -1)
+ tdd_beam_association[num_tdd_period] = beam_index;
+ }
+
// go to previous slot if the current scheduled slot is beyond the response window
// and if the slot is not among the PDCCH monitored ones (38.213 10.1)
while (((*msg2_slot>slot_limit)&&(*msg2_frame>frame_limit)) || ((*msg2_frame*nr_slots_per_frame[mu]+*msg2_slot-monitoring_offset)%monitoring_slot_period !=0)) {
@@ -499,7 +514,6 @@ void nr_initiate_ra_proc(module_id_t module_idP,
break;
}
}
-
if (pr_found == 0) {
continue;
}
@@ -570,7 +584,8 @@ void nr_initiate_ra_proc(module_id_t module_idP,
monitoring_slot_period,
monitoring_offset,
beam_index,
- cc->num_active_ssb);
+ cc->num_active_ssb,
+ nr_mac->tdd_beam_association);
ra->Msg2_frame = msg2_frame;
ra->Msg2_slot = msg2_slot;
@@ -645,7 +660,8 @@ void nr_get_Msg3alloc(module_id_t module_id,
NR_BWP_Uplink_t *ubwp,
sub_frame_t current_slot,
frame_t current_frame,
- NR_RA_t *ra) {
+ NR_RA_t *ra,
+ int16_t *tdd_beam_association) {
// msg3 is schedulend in mixed slot in the following TDD period
@@ -675,6 +691,18 @@ void nr_get_Msg3alloc(module_id_t module_id,
else
ra->Msg3_frame = current_frame + (temp_slot/nr_slots_per_frame[mu]);
+ // beam association for FR2
+ if (*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0] >= 257) {
+ uint8_t tdd_period_slot = scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSlots + scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSlots;
+ if ((scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSymbols > 0) || (scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols > 0))
+ tdd_period_slot++;
+ int num_tdd_period = ra->Msg3_slot/tdd_period_slot;
+ if((tdd_beam_association[num_tdd_period]!=-1)&&(tdd_beam_association[num_tdd_period]!=ra->beam_id))
+ AssertFatal(1==0,"Cannot schedule MSG3\n");
+ else
+ tdd_beam_association[num_tdd_period] = ra->beam_id;
+ }
+
LOG_I(MAC, "[RAPROC] Msg3 slot %d: current slot %u Msg3 frame %u k2 %u Msg3_tda_id %u start symbol index %u\n", ra->Msg3_slot, current_slot, ra->Msg3_frame, k2,ra->Msg3_tda_id, StartSymbolIndex);
uint16_t *vrb_map_UL =
&RC.nrmac[module_id]->common_channels[CC_id].vrb_map_UL[ra->Msg3_slot * MAX_BWP_SIZE];
@@ -961,7 +989,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
pdsch_pdu_rel15->nrOfLayers = 1;
pdsch_pdu_rel15->transmissionScheme = 0;
pdsch_pdu_rel15->refPoint = 0;
- pdsch_pdu_rel15->dmrsConfigType = 0;
+ pdsch_pdu_rel15->dmrsConfigType = 0;//Reconfigure Msg2 to use pdsch_dmrs_type1
pdsch_pdu_rel15->dlDmrsScramblingId = *scc->physCellId;
pdsch_pdu_rel15->SCID = 0;
pdsch_pdu_rel15->numDmrsCdmGrpsNoData = 2;
@@ -987,6 +1015,12 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
pdsch_pdu_rel15->NrOfSymbols = NrOfSymbols;
pdsch_pdu_rel15->dlDmrsSymbPos = fill_dmrs_mask(NULL, scc->dmrs_TypeA_Position, NrOfSymbols);
+ pdsch_pdu_rel15->precodingAndBeamforming.num_prgs=1;
+ pdsch_pdu_rel15->precodingAndBeamforming.prg_size=275;
+ pdsch_pdu_rel15->precodingAndBeamforming.dig_bf_interfaces=1;
+ pdsch_pdu_rel15->precodingAndBeamforming.prgs_list[0].pm_idx = 0;
+ pdsch_pdu_rel15->precodingAndBeamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx = ra->beam_id;
+
/* Fill PDCCH DL DCI PDU */
nfapi_nr_dl_dci_pdu_t *dci_pdu = &pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci];
pdcch_pdu_rel15->numDlDci++;
@@ -1003,7 +1037,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
dci_pdu_rel15_t dci_payload;
dci_payload.frequency_domain_assignment.val = PRBalloc_to_locationandbandwidth0(pdsch_pdu_rel15->rbSize,
- pdsch_pdu_rel15->rbStart,dci10_bw);
+ pdsch_pdu_rel15->rbStart,dci10_bw);
dci_payload.time_domain_assignment.val = time_domain_assignment;
dci_payload.vrb_to_prb_mapping.val = 0;
dci_payload.mcs = pdsch_pdu_rel15->mcsIndex[0];
@@ -1054,11 +1088,11 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
nr_mac->TX_req[CC_id].Slot = slotP;
// Program UL processing for Msg3
- nr_get_Msg3alloc(module_idP, CC_id, scc, ubwp, slotP, frameP, ra);
- LOG_I(MAC, "Frame %d, Subframe %d: Setting Msg3 reception for Frame %d Subframe %d\n", frameP, slotP, ra->Msg3_frame, ra->Msg3_slot);
+ nr_get_Msg3alloc(module_idP, CC_id, scc, ubwp, slotP, frameP, ra, nr_mac->tdd_beam_association);
+ LOG_I(MAC, "Frame %d, Slot %d: Setting Msg3 reception for Frame %d Slot %d\n", frameP, slotP, ra->Msg3_frame, ra->Msg3_slot);
nr_add_msg3(module_idP, CC_id, frameP, slotP, ra, (uint8_t *) &tx_req->TLVs[0].value.direct[0]);
ra->state = WAIT_Msg3;
- LOG_I(MAC,"[gNB %d][RAPROC] Frame %d, Subframe %d: RA state %d\n", module_idP, frameP, slotP, ra->state);
+ LOG_I(MAC,"[gNB %d][RAPROC] Frame %d, Slot %d: RA state %d\n", module_idP, frameP, slotP, ra->state);
x_Overhead = 0;
nr_get_tbs_dl(&dl_tti_pdsch_pdu->pdsch_pdu, x_Overhead, pdsch_pdu_rel15->numDmrsCdmGrpsNoData, dci_payload.tb_scaling);
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
index 3f69cfbe74..0ceff015e7 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
@@ -53,9 +53,16 @@
#include "executables/softmodem-common.h"
extern RAN_CONTEXT_t RC;
-extern uint8_t SSB_Table[38];
+uint8_t SSB_Slot[64]={0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,
+ 10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,
+ 20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,
+ 30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37};
-void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP, uint8_t slots_per_frame){
+void schedule_nr_mib(module_id_t module_idP,
+ frame_t frameP,
+ sub_frame_t slotP,
+ uint8_t slots_per_frame,
+ int nb_periods_per_frame){
gNB_MAC_INST *gNB = RC.nrmac[module_idP];
NR_COMMON_channels_t *cc;
@@ -66,13 +73,15 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP,
int mib_sdu_length;
int CC_id;
-
+ uint8_t beam_index = 0;
+
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
cc = &gNB->common_channels[CC_id];
- const long band = *cc->ServingCellConfigCommon->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0];
- const uint32_t ssb_offset0 = *cc->ServingCellConfigCommon->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - cc->ServingCellConfigCommon->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA;
+ NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
+ const long band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0];
+ const uint32_t ssb_offset0 = *scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA;
int ratio;
- switch (*cc->ServingCellConfigCommon->ssbSubcarrierSpacing) {
+ switch (*scc->ssbSubcarrierSpacing) {
case NR_SubcarrierSpacing_kHz15:
AssertFatal(band <= 79,
"Band %ld is not possible for SSB with 15 kHz SCS\n",
@@ -105,7 +114,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP,
break;
default:
AssertFatal(1 == 0, "SCS %ld not allowed for SSB \n",
- *cc->ServingCellConfigCommon->ssbSubcarrierSpacing);
+ *scc->ssbSubcarrierSpacing);
}
// scheduling MIB every 8 frames, PHY repeats it in between
@@ -139,22 +148,28 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP,
dl_config_pdu->PDUType = NFAPI_NR_DL_TTI_SSB_PDU_TYPE;
dl_config_pdu->PDUSize =2 + sizeof(nfapi_nr_dl_tti_ssb_pdu_rel15_t);
- AssertFatal(cc->ServingCellConfigCommon->physCellId!=NULL,"cc->ServingCellConfigCommon->physCellId is null\n");
- dl_config_pdu->ssb_pdu.ssb_pdu_rel15.PhysCellId = *cc->ServingCellConfigCommon->physCellId;
+ AssertFatal(scc->physCellId!=NULL,"scc->physCellId is null\n");
+ dl_config_pdu->ssb_pdu.ssb_pdu_rel15.PhysCellId = *scc->physCellId;
dl_config_pdu->ssb_pdu.ssb_pdu_rel15.BetaPss = 0;
dl_config_pdu->ssb_pdu.ssb_pdu_rel15.SsbBlockIndex = 0;
- AssertFatal(cc->ServingCellConfigCommon->downlinkConfigCommon!=NULL,"scc->downlinkConfigCommonL is null\n");
- AssertFatal(cc->ServingCellConfigCommon->downlinkConfigCommon->frequencyInfoDL!=NULL,"scc->downlinkConfigCommon->frequencyInfoDL is null\n");
- AssertFatal(cc->ServingCellConfigCommon->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB!=NULL,"scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB is null\n");
- AssertFatal(cc->ServingCellConfigCommon->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.count==1,"Frequency Band list does not have 1 element (%d)\n",cc->ServingCellConfigCommon->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.count);
- AssertFatal(cc->ServingCellConfigCommon->ssbSubcarrierSpacing,"ssbSubcarrierSpacing is null\n");
- AssertFatal(cc->ServingCellConfigCommon->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0],"band is null\n");
+ AssertFatal(scc->downlinkConfigCommon!=NULL,"scc->downlinkConfigCommonL is null\n");
+ AssertFatal(scc->downlinkConfigCommon->frequencyInfoDL!=NULL,"scc->downlinkConfigCommon->frequencyInfoDL is null\n");
+ AssertFatal(scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB!=NULL,"scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB is null\n");
+ AssertFatal(scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.count==1,"Frequency Band list does not have 1 element (%d)\n",
+ scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.count);
+ AssertFatal(scc->ssbSubcarrierSpacing,"ssbSubcarrierSpacing is null\n");
+ AssertFatal(scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0],"band is null\n");
const nfapi_nr_config_request_scf_t *cfg = &RC.nrmac[module_idP]->config[0];
dl_config_pdu->ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset = cfg->ssb_table.ssb_subcarrier_offset.value; //kSSB
dl_config_pdu->ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA = ssb_offset0/(ratio*12) - 10; // absoluteFrequencySSB is the center of SSB
dl_config_pdu->ssb_pdu.ssb_pdu_rel15.bchPayloadFlag = 1;
dl_config_pdu->ssb_pdu.ssb_pdu_rel15.bchPayload = (*(uint32_t*)cc->MIB_pdu.payload) & ((1<<24)-1);
+ dl_config_pdu->ssb_pdu.ssb_pdu_rel15.precoding_and_beamforming.num_prgs=1;
+ dl_config_pdu->ssb_pdu.ssb_pdu_rel15.precoding_and_beamforming.prg_size=275; //1 PRG of max size for analogue beamforming
+ dl_config_pdu->ssb_pdu.ssb_pdu_rel15.precoding_and_beamforming.dig_bf_interfaces=1;
+ dl_config_pdu->ssb_pdu.ssb_pdu_rel15.precoding_and_beamforming.prgs_list[0].pm_idx = 0;
+ dl_config_pdu->ssb_pdu.ssb_pdu_rel15.precoding_and_beamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx = beam_index;
dl_req->nPDUs++;
}
@@ -172,13 +187,13 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP,
// checking if there is any SSB in slot
const int abs_slot = (slots_per_frame * frameP) + slotP;
- const int slot_per_period = (slots_per_frame>>1)<<(*cc->ServingCellConfigCommon->ssb_periodicityServingCell);
+ const int slot_per_period = (slots_per_frame>>1)<<(*scc->ssb_periodicityServingCell);
int eff_120_slot;
- const BIT_STRING_t *shortBitmap = &cc->ServingCellConfigCommon->ssb_PositionsInBurst->choice.shortBitmap;
- const BIT_STRING_t *mediumBitmap = &cc->ServingCellConfigCommon->ssb_PositionsInBurst->choice.mediumBitmap;
- const BIT_STRING_t *longBitmap = &cc->ServingCellConfigCommon->ssb_PositionsInBurst->choice.longBitmap;
+ const BIT_STRING_t *shortBitmap = &scc->ssb_PositionsInBurst->choice.shortBitmap;
+ const BIT_STRING_t *mediumBitmap = &scc->ssb_PositionsInBurst->choice.mediumBitmap;
+ const BIT_STRING_t *longBitmap = &scc->ssb_PositionsInBurst->choice.longBitmap;
uint8_t buf = 0;
- switch (cc->ServingCellConfigCommon->ssb_PositionsInBurst->present) {
+ switch (scc->ssb_PositionsInBurst->present) {
case 1:
// presence of ssbs possible in the first 2 slots of ssb period
if ((abs_slot % slot_per_period) < 2 &&
@@ -192,29 +207,55 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP,
fill_ssb_vrb_map(cc, (ssb_offset0 / (ratio * 12) - 10), CC_id);
break;
case 3:
- AssertFatal(*cc->ServingCellConfigCommon->ssbSubcarrierSpacing ==
- NR_SubcarrierSpacing_kHz120,
+ AssertFatal(*scc->ssbSubcarrierSpacing ==
+ NR_SubcarrierSpacing_kHz120,
"240kHZ subcarrier spacing currently not supported for SSBs\n");
if ((abs_slot % slot_per_period) < 8) {
eff_120_slot = slotP;
- buf = longBitmap->buf[0];
- } else if ((abs_slot % slot_per_period) < 17) {
- eff_120_slot = slotP - 9;
- buf = longBitmap->buf[1];
- } else if ((abs_slot % slot_per_period) < 26) {
- eff_120_slot = slotP - 18;
- buf = longBitmap->buf[2];
- } else if ((abs_slot % slot_per_period) < 35) {
- eff_120_slot = slotP - 27;
- buf = longBitmap->buf[3];
+ if((abs_slot % slot_per_period) < 3)
+ buf = longBitmap->buf[0];
+ else
+ buf = longBitmap->buf[1];
+ } else if ((abs_slot % slot_per_period) < 18) {
+ eff_120_slot = slotP - 10;
+ if((abs_slot % slot_per_period) < 13)
+ buf = longBitmap->buf[2];
+ else
+ buf = longBitmap->buf[3];
+ } else if ((abs_slot % slot_per_period) < 28) {
+ eff_120_slot = slotP - 20;
+ if((abs_slot % slot_per_period) < 23)
+ buf = longBitmap->buf[4];
+ else
+ buf = longBitmap->buf[5];
+ } else if ((abs_slot % slot_per_period) < 38) {
+ eff_120_slot = slotP - 30;
+ if((abs_slot % slot_per_period) < 33)
+ buf = longBitmap->buf[6];
+ else
+ buf = longBitmap->buf[7];
}
- if (((buf >> (6 - (eff_120_slot << 1))) & 3) != 0)
+ if ((eff_120_slot>=0) && (((buf >> (6 - (eff_120_slot << 1))) & 3) != 0)) {
+ AssertFatal(((buf >> (6 - (eff_120_slot << 1))) & 3)<3,"We only support 1 ssb per slot max in FR2 for the moment\n");
fill_ssb_vrb_map(cc, ssb_offset0 / (ratio * 12) - 10, CC_id);
+ }
break;
default:
- AssertFatal(0,
- "SSB bitmap size value %d undefined (allowed values 1,2,3)\n",
- cc->ServingCellConfigCommon->ssb_PositionsInBurst->present);
+ AssertFatal(0,"SSB bitmap size value %d undefined (allowed values 1,2,3)\n",
+ scc->ssb_PositionsInBurst->present);
+ }
+ // For FR2 beam ssb association at the beginning of every SSB period
+ if((scc->ssb_PositionsInBurst->present==3) && (abs_slot%slot_per_period == 0)){
+ uint8_t i_ssb,num_tdd_period;
+ uint8_t num_ssb = 0;
+ for (int i=0; i<64; i++){
+ i_ssb=((longBitmap->buf[i/8])>>(7-(i%8)))&1;
+ if(i_ssb==1){
+ num_tdd_period = SSB_Slot[i]/(slots_per_frame/nb_periods_per_frame);
+ gNB->tdd_beam_association[num_tdd_period]=num_ssb;
+ num_ssb++;
+ }
+ }
}
}
}
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
index d828c94b2d..9784b6b79e 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
@@ -137,10 +137,10 @@ void nr_process_mac_pdu(
case UL_SCH_LCID_S_BSR:
case UL_SCH_LCID_S_TRUNCATED_BSR:
- //38.321 section 6.1.3.1
- //fixed length
- mac_ce_len =1;
- /* Extract short BSR value */
+ //38.321 section 6.1.3.1
+ //fixed length
+ mac_ce_len =1;
+ /* Extract short BSR value */
ce_ptr = &pdu_ptr[mac_subheader_len];
NR_BSR_SHORT *bsr_s = (NR_BSR_SHORT *) ce_ptr;
sched_ctrl->estimated_ul_buffer = 0;
@@ -182,7 +182,7 @@ void nr_process_mac_pdu(
NR_LONG_BSR_TABLE[pdu_ptr[mac_subheader_len + 1 + n]];
}
- break;
+ break;
case UL_SCH_LCID_C_RNTI:
//38.321 section 6.1.3.2
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
index ddaa3022a1..421ff68641 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
@@ -42,12 +42,14 @@ void mac_top_init_gNB(void);
void config_common(int Mod_idP,
int pdsch_AntennaPorts,
+ int pusch_AntennaPorts,
NR_ServingCellConfigCommon_t *scc
);
-int rrc_mac_config_req_gNB(module_id_t Mod_idP,
- int ssb_SubcarrierOffset,
+int rrc_mac_config_req_gNB(module_id_t Mod_idP,
+ int ssb_SubcarrierOffset,
int pdsch_AntennaPorts,
+ int pusch_AntennaPorts,
int pusch_tgt_snrx10,
int pucch_tgt_snrx10,
NR_ServingCellConfigCommon_t *scc,
@@ -83,7 +85,11 @@ void nr_simple_dlsch_preprocessor(module_id_t module_id,
frame_t frame,
sub_frame_t slot);
-void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP, uint8_t slots_per_frame);
+void schedule_nr_mib(module_id_t module_idP,
+ frame_t frameP,
+ sub_frame_t subframeP,
+ uint8_t slots_per_frame,
+ int nb_periods_per_frame);
/// uplink scheduler
void nr_schedule_ulsch(module_id_t module_id,
@@ -124,7 +130,8 @@ void nr_get_Msg3alloc(module_id_t module_id,
NR_BWP_Uplink_t *ubwp,
sub_frame_t current_subframe,
frame_t current_frame,
- NR_RA_t *ra);
+ NR_RA_t *ra,
+ int16_t *tdd_beam_association);
/* \brief Function in gNB to fill RAR pdu when requested by PHY.
@param ra Instance of RA resources of gNB
@@ -268,7 +275,6 @@ NR_SearchSpace_t *get_searchspace(
NR_BWP_Downlink_t *bwp,
NR_SearchSpace__searchSpaceType_PR target_ss);
-
long get_K2(NR_BWP_Uplink_t *ubwp, int time_domain_assignment, int mu);
void nr_save_pusch_fields(const NR_ServingCellConfigCommon_t *scc,
diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
index ac583b5270..8452ca3c4c 100644
--- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
@@ -664,11 +664,12 @@ typedef struct gNB_MAC_INST_s {
time_stats_t schedule_pch;
/// CCE lists
int cce_list[MAX_NUM_BWP][MAX_NUM_CORESET][MAX_NUM_CCE];
+ /// list of allocated beams per period
+ int16_t *tdd_beam_association;
/// PUCCH: keep track of the resources has already been used by saving the
/// highest index not yet been used in a given slot. Dynamically allocated
/// so we can have it for every slot as a function of the numerology
int *pucch_index_used[MAX_NUM_BWP];
-
/// DL preprocessor for differentiated scheduling
nr_pp_impl_dl pre_processor_dl;
/// UL preprocessor for differentiated scheduling
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.c
index eda6888ecd..1822239171 100644
--- a/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.c
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.c
@@ -26,6 +26,7 @@
#include
#include "nr_pdcp_security_nea2.h"
+#include "nr_pdcp_integrity_nia2.h"
#include "nr_pdcp_sdu.h"
#include "LOG/log.h"
@@ -54,17 +55,21 @@ static void nr_pdcp_entity_recv_pdu(nr_pdcp_entity_t *entity,
}
if (entity->sn_size == 12) {
- rcvd_sn = (((unsigned char)buffer[0] & 0xf) << 8) |
- (unsigned char)buffer[1];
+ rcvd_sn = ((buffer[0] & 0xf) << 8) |
+ buffer[1];
header_size = 2;
} else {
- rcvd_sn = (((unsigned char)buffer[0] & 0x3) << 16) |
- ((unsigned char)buffer[1] << 8) |
- (unsigned char)buffer[2];
+ rcvd_sn = ((buffer[0] & 0x3) << 16) |
+ (buffer[1] << 8) |
+ buffer[2];
header_size = 3;
}
- integrity_size = 0;
+ if (entity->has_integrity) {
+ integrity_size = 4;
+ } else {
+ integrity_size = 0;
+ }
if (size < header_size + integrity_size + 1) {
LOG_E(PDCP, "bad PDU received (size = %d)\n", size);
@@ -86,9 +91,20 @@ static void nr_pdcp_entity_recv_pdu(nr_pdcp_entity_t *entity,
if (entity->has_ciphering)
entity->cipher(entity->security_context,
- (unsigned char *)buffer+header_size, size-header_size,
+ buffer+header_size, size-header_size,
entity->rb_id, rcvd_count, entity->is_gnb ? 0 : 1);
+ if (entity->has_integrity) {
+ unsigned char integrity[4];
+ entity->integrity(entity->integrity_context, integrity,
+ buffer, size - integrity_size,
+ entity->rb_id, rcvd_count, entity->is_gnb ? 0 : 1);
+ if (memcmp(integrity, buffer, 4) != 0) {
+ LOG_E(PDCP, "discard NR PDU, integrity failed\n");
+ return;
+ }
+ }
+
if (rcvd_count < entity->rx_deliv
|| nr_pdcp_sdu_in_list(entity->rx_list, rcvd_count)) {
LOG_D(PDCP, "discard NR PDU rcvd_count=%d\n", rcvd_count);
@@ -139,39 +155,62 @@ static void nr_pdcp_entity_recv_sdu(nr_pdcp_entity_t *entity,
uint32_t count;
int sn;
int header_size;
- char buf[size+3+4];
+ int integrity_size;
+ char buf[size + 3 + 4];
+ int dc_bit;
count = entity->tx_next;
sn = entity->tx_next & entity->sn_max;
+ /* D/C bit is only to be set for DRBs */
+ if (entity->type == NR_PDCP_DRB_AM || entity->type == NR_PDCP_DRB_UM) {
+ dc_bit = 0x80;
+ } else {
+ dc_bit = 0;
+ }
+
if (entity->sn_size == 12) {
- buf[0] = 0x80 | ((sn >> 8) & 0xf);
+ buf[0] = dc_bit | ((sn >> 8) & 0xf);
buf[1] = sn & 0xff;
header_size = 2;
} else {
- buf[0] = 0x80 | ((sn >> 16) & 0x3);
+ buf[0] = dc_bit | ((sn >> 16) & 0x3);
buf[1] = (sn >> 8) & 0xff;
buf[2] = sn & 0xff;
header_size = 3;
}
- memcpy(buf+header_size, buffer, size);
+ if (entity->has_integrity) {
+ integrity_size = 4;
+ } else {
+ integrity_size = 0;
+ }
+
+ memcpy(buf + header_size, buffer, size);
+
+ if (entity->has_integrity)
+ entity->integrity(entity->integrity_context,
+ (unsigned char *)buf + header_size + size,
+ (unsigned char *)buf, header_size + size,
+ entity->rb_id, count, entity->is_gnb ? 1 : 0);
if (entity->has_ciphering)
entity->cipher(entity->security_context,
- (unsigned char *)buf+header_size, size,
+ (unsigned char *)buf + header_size, size + integrity_size,
entity->rb_id, count, entity->is_gnb ? 1 : 0);
entity->tx_next++;
entity->deliver_pdu(entity->deliver_pdu_data, entity, buf,
- size+header_size, sdu_id);
+ header_size + size + integrity_size, sdu_id);
}
static void nr_pdcp_entity_set_integrity_key(nr_pdcp_entity_t *entity,
char *key)
{
- memcpy(entity->integrity_key, key, 16);
+ LOG_E(PDCP, "%s: %d: %s: TODO? to remove?\n", __FILE__, __LINE__, __FUNCTION__);
+ exit(1);
+ //memcpy(entity->integrity_key, key, 16);
}
static void check_t_reordering(nr_pdcp_entity_t *entity)
@@ -232,6 +271,8 @@ void nr_pdcp_entity_delete(nr_pdcp_entity_t *entity)
}
if (entity->free_security != NULL)
entity->free_security(entity->security_context);
+ if (entity->free_integrity != NULL)
+ entity->free_integrity(entity->integrity_context);
free(entity);
}
@@ -298,9 +339,18 @@ nr_pdcp_entity_t *new_nr_pdcp_entity(
}
ret->is_gnb = is_gnb;
- if (integrity_key != NULL) {
- printf("%s:%d:%s: TODO\n", __FILE__, __LINE__, __FUNCTION__);
- exit(1);
+ if (integrity_key != NULL && integrity_algorithm != 0) {
+ if (integrity_algorithm != 2) {
+ LOG_E(PDCP, "FATAL: only nia2 supported for the moment\n");
+ exit(1);
+ }
+ ret->has_integrity = 1;
+ ret->integrity_algorithm = integrity_algorithm;
+ memcpy(ret->integrity_key, integrity_key, 16);
+
+ ret->integrity_context = nr_pdcp_integrity_nia2_init(integrity_key);
+ ret->integrity = nr_pdcp_integrity_nia2_integrity;
+ ret->free_integrity = nr_pdcp_integrity_nia2_free_integrity;
}
return ret;
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h b/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h
index 36e7a540c4..4ae7a45abb 100644
--- a/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h
@@ -85,7 +85,12 @@ typedef struct nr_pdcp_entity_t {
unsigned char *buffer, int length,
int bearer, int count, int direction);
void (*free_security)(void *security_context);
- /* security algorithms need to know uplink/downlink information
+ void *integrity_context;
+ void (*integrity)(void *integrity_context, unsigned char *out,
+ unsigned char *buffer, int length,
+ int bearer, int count, int direction);
+ void (*free_integrity)(void *integrity_context);
+ /* security/integrity algorithms need to know uplink/downlink information
* which is reverse for gnb and ue, so we need to know if this
* pdcp entity is for a gnb or an ue
*/
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia2.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia2.c
new file mode 100644
index 0000000000..5553662ac5
--- /dev/null
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia2.c
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1 (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.openairinterface.org/?page_id=698
+ *
+ * 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.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ * contact@openairinterface.org
+ */
+
+#include "nr_pdcp_integrity_nia2.h"
+
+#include
+#include
+#include
+#include
+
+void *nr_pdcp_integrity_nia2_init(unsigned char *integrity_key)
+{
+ CMAC_CTX *ctx;
+
+ ctx = CMAC_CTX_new();
+ if (ctx == NULL) abort();
+
+ CMAC_Init(ctx, integrity_key, 16, EVP_aes_128_cbc(), NULL);
+
+ return ctx;
+}
+
+static void compute_t(unsigned char *t, uint32_t count, int bearer,
+ int direction)
+{
+ t[0] = (count >> 24) & 255;
+ t[1] = (count >> 16) & 255;
+ t[2] = (count >> 8) & 255;
+ t[3] = (count ) & 255;
+ t[4] = (bearer << 3) | (direction << 2);
+ memset(&t[5], 0, 8-5);
+}
+
+void nr_pdcp_integrity_nia2_integrity(void *integrity_context,
+ unsigned char *out,
+ unsigned char *buffer, int length,
+ int bearer, int count, int direction)
+{
+ CMAC_CTX *ctx = integrity_context;
+ unsigned char t[8];
+ unsigned char mac[16];
+ size_t maclen;
+
+ /* see 33.401 B.2.3 for the input to 128-EIA2
+ * (which is identical to 128-NIA2, see 33.501 D.3.1.3) */
+ compute_t(t, count, bearer, direction);
+
+ CMAC_Update(ctx, t, 8);
+ CMAC_Update(ctx, buffer, length);
+ CMAC_Final(ctx, mac, &maclen);
+
+ /* AES CMAC (RFC 4493) outputs 128 bits but NR PDCP PDUs have a MAC-I of
+ * 32 bits (see 38.323 6.2). RFC 4493 2.1 says to truncate most significant
+ * bit first (so seems to say 33.401 B.2.3)
+ */
+ memcpy(out, mac, 4);
+}
+
+void nr_pdcp_integrity_nia2_free_integrity(void *integrity_context)
+{
+ CMAC_CTX *ctx = integrity_context;
+ CMAC_CTX_free(ctx);
+}
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia2.h b/openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia2.h
new file mode 100644
index 0000000000..9593a2825c
--- /dev/null
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia2.h
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1 (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.openairinterface.org/?page_id=698
+ *
+ * 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.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ * contact@openairinterface.org
+ */
+
+#ifndef _NR_PDCP_INTEGRITY_NIA2_H_
+#define _NR_PDCP_INTEGRITY_NIA2_H_
+
+void *nr_pdcp_integrity_nia2_init(unsigned char *integrity_key);
+
+void nr_pdcp_integrity_nia2_integrity(void *integrity_context,
+ unsigned char *out,
+ unsigned char *buffer, int length,
+ int bearer, int count, int direction);
+
+void nr_pdcp_integrity_nia2_free_integrity(void *integrity_context);
+
+#endif /* _NR_PDCP_INTEGRITY_NIA2_H_ */
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
index 9c139624eb..2eb2bae968 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
@@ -250,7 +250,8 @@ mac_rlc_status_resp_t mac_rlc_status_ind(
+ buf_stat.retx_size
+ buf_stat.tx_size;
} else {
- LOG_W(RLC, "[%s] Radio Bearer (channel ID %d) is NULL for UE with rntiP %x\n", __FUNCTION__, channel_idP, rntiP);
+ if (!(frameP%128)) //to supress this warning message
+ LOG_W(RLC, "[%s] Radio Bearer (channel ID %d) is NULL for UE with rntiP %x\n", __FUNCTION__, channel_idP, rntiP);
ret.bytes_in_buffer = 0;
}
diff --git a/openair2/RRC/LTE/defs_NB_IoT.h b/openair2/RRC/LTE/defs_NB_IoT.h
index 91dc7aafd4..2a34971c23 100644
--- a/openair2/RRC/LTE/defs_NB_IoT.h
+++ b/openair2/RRC/LTE/defs_NB_IoT.h
@@ -148,7 +148,7 @@ typedef struct UE_RRC_INFO_NB_IoT_s {
//Measurement Report not supported in NB-IoT
#define PAYLOAD_SIZE_MAX 1024
-#define RRC_BUF_SIZE 255
+#define RRC_BUF_SIZE 8192
#define UNDEF_SECURITY_MODE 0xff
#define NO_SECURITY_MODE 0x20
diff --git a/openair2/RRC/LTE/rrc_defs.h b/openair2/RRC/LTE/rrc_defs.h
index 4f55f94121..c19335910b 100644
--- a/openair2/RRC/LTE/rrc_defs.h
+++ b/openair2/RRC/LTE/rrc_defs.h
@@ -327,7 +327,7 @@ typedef enum SL_TRIGGER_e {
#define MAX_MEAS_ID 6
#define PAYLOAD_SIZE_MAX 1024
-#define RRC_BUF_SIZE 255
+#define RRC_BUF_SIZE 8192
#define UNDEF_SECURITY_MODE 0xff
#define NO_SECURITY_MODE 0x20
diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c
index 82855365c8..6c28beec34 100644
--- a/openair2/RRC/NR/MESSAGES/asn1_msg.c
+++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c
@@ -561,14 +561,14 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier,
case NR_ServingCellConfigCommon__ssb_PositionsInBurst_PR_mediumBitmap:
sib1->servingCellConfigCommon->ssb_PositionsInBurst.inOneGroup = configuration->scc->ssb_PositionsInBurst->choice.mediumBitmap;
break;
- /*
- groupPresence: This field is present when maximum number of SS/PBCH blocks per half frame equals to 64 as defined in TS 38.213 [13], clause 4.1.
- The first/leftmost bit corresponds to the SS/PBCH index 0-7, the second bit corresponds to SS/PBCH block 8-15, and so on.
- Value 0 in the bitmap indicates that the SSBs according to inOneGroup are absent. Value 1 indicates that the SS/PBCH blocks are transmitted in accordance with inOneGroup.
- inOneGroup: When maximum number of SS/PBCH blocks per half frame equals to 64 as defined in TS 38.213 [13], clause 4.1, all 8 bit are valid;
- The first/ leftmost bit corresponds to the first SS/PBCH block index in the group (i.e., to SSB index 0, 8, and so on); the second bit corresponds to the second SS/PBCH block index in the group
- (i.e., to SSB index 1, 9, and so on), and so on. Value 0 in the bitmap indicates that the corresponding SS/PBCH block is not transmitted while value 1 indicates that the corresponding SS/PBCH block is transmitted.
- */
+ /*
+ groupPresence: This field is present when maximum number of SS/PBCH blocks per half frame equals to 64 as defined in TS 38.213 [13], clause 4.1.
+ The first/leftmost bit corresponds to the SS/PBCH index 0-7, the second bit corresponds to SS/PBCH block 8-15, and so on.
+ Value 0 in the bitmap indicates that the SSBs according to inOneGroup are absent. Value 1 indicates that the SS/PBCH blocks are transmitted in accordance with inOneGroup.
+ inOneGroup: When maximum number of SS/PBCH blocks per half frame equals to 64 as defined in TS 38.213 [13], clause 4.1, all 8 bit are valid;
+ The first/ leftmost bit corresponds to the first SS/PBCH block index in the group (i.e., to SSB index 0, 8, and so on); the second bit corresponds to the second SS/PBCH block index in the group
+ (i.e., to SSB index 1, 9, and so on), and so on. Value 0 in the bitmap indicates that the corresponding SS/PBCH block is not transmitted while value 1 indicates that the corresponding SS/PBCH block is transmitted.
+ */
case NR_ServingCellConfigCommon__ssb_PositionsInBurst_PR_longBitmap:
sib1->servingCellConfigCommon->ssb_PositionsInBurst.inOneGroup.size = 1;
sib1->servingCellConfigCommon->ssb_PositionsInBurst.inOneGroup.bits_unused = 0;
diff --git a/openair2/RRC/NR/nr_rrc_defs.h b/openair2/RRC/NR/nr_rrc_defs.h
index 36d9bdee60..e0b04a6976 100644
--- a/openair2/RRC/NR/nr_rrc_defs.h
+++ b/openair2/RRC/NR/nr_rrc_defs.h
@@ -127,7 +127,7 @@ typedef enum UE_STATE_NR_e {
#define MAX_MEAS_ID 6
#define PAYLOAD_SIZE_MAX 1024
-#define RRC_BUF_SIZE 255
+#define RRC_BUF_SIZE 8192
#define UNDEF_SECURITY_MODE 0xff
#define NO_SECURITY_MODE 0x20
@@ -431,6 +431,7 @@ typedef struct {
NR_BCCH_BCH_Message_t mib;
int ssb_SubcarrierOffset;
int pdsch_AntennaPorts;
+ int pusch_AntennaPorts;
int pusch_TargetSNRx10;
int pucch_TargetSNRx10;
NR_BCCH_DL_SCH_Message_t *siblock1;
diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c
index 802337257b..9bea266ffd 100755
--- a/openair2/RRC/NR/rrc_gNB.c
+++ b/openair2/RRC/NR/rrc_gNB.c
@@ -224,6 +224,7 @@ static void init_NR_SI(gNB_RRC_INST *rrc, gNB_RrcConfigurationReq *configuration
rrc_mac_config_req_gNB(rrc->module_id,
rrc->carrier.ssb_SubcarrierOffset,
rrc->carrier.pdsch_AntennaPorts,
+ rrc->carrier.pusch_AntennaPorts,
rrc->carrier.pusch_TargetSNRx10,
rrc->carrier.pucch_TargetSNRx10,
(NR_ServingCellConfigCommon_t *)rrc->carrier.servingcellconfigcommon,
@@ -309,6 +310,7 @@ char openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_RrcConfigu
rrc->carrier.servingcellconfigcommon = configuration->scc;
rrc->carrier.ssb_SubcarrierOffset = configuration->ssb_SubcarrierOffset;
rrc->carrier.pdsch_AntennaPorts = configuration->pdsch_AntennaPorts;
+ rrc->carrier.pusch_AntennaPorts = configuration->pusch_AntennaPorts;
rrc->carrier.pusch_TargetSNRx10 = configuration->pusch_TargetSNRx10;
rrc->carrier.pucch_TargetSNRx10 = configuration->pucch_TargetSNRx10;
/// System Information INIT
@@ -462,6 +464,7 @@ rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(
rrc_mac_config_req_gNB(rrc_instance_p->module_id,
rrc_instance_p->carrier.ssb_SubcarrierOffset,
rrc_instance_p->carrier.pdsch_AntennaPorts,
+ rrc_instance_p->carrier.pusch_AntennaPorts,
rrc_instance_p->carrier.pusch_TargetSNRx10,
rrc_instance_p->carrier.pucch_TargetSNRx10,
(NR_ServingCellConfigCommon_t *)rrc_instance_p->carrier.servingcellconfigcommon,
diff --git a/openair2/RRC/NR/rrc_gNB_nsa.c b/openair2/RRC/NR/rrc_gNB_nsa.c
index e9741aaf78..c1efc9550c 100644
--- a/openair2/RRC/NR/rrc_gNB_nsa.c
+++ b/openair2/RRC/NR/rrc_gNB_nsa.c
@@ -346,6 +346,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
rrc_mac_config_req_gNB(rrc->module_id,
rrc->carrier.ssb_SubcarrierOffset,
rrc->carrier.pdsch_AntennaPorts,
+ rrc->carrier.pusch_AntennaPorts,
rrc->carrier.pusch_TargetSNRx10,
rrc->carrier.pucch_TargetSNRx10,
NULL,
diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c
index c9f0c3cabd..9323ec8c67 100644
--- a/openair2/RRC/NR/rrc_gNB_reconfig.c
+++ b/openair2/RRC/NR/rrc_gNB_reconfig.c
@@ -242,41 +242,18 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.present = NR_CFRA__resources_PR_ssb;
secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb = calloc(1,sizeof(struct NR_CFRA__resources__ssb));
secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ra_ssb_OccasionMaskIndex = 0;
- struct NR_CFRA_SSB_Resource *ssbElem[8];
- ssbElem[0] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource));
- ssbElem[0]->ssb = 0;
- ssbElem[0]->ra_PreambleIndex = 63;
- ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[0]);
-#if 0
- ssbElem[1] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource));
- ssbElem[1]->ssb = 1;
- ssbElem[1]->ra_PreambleIndex = 62;
- ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[1]);
- ssbElem[2] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource));
- ssbElem[2]->ssb = 2;
- ssbElem[2]->ra_PreambleIndex = 63;
- ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[2]);
- ssbElem[3] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource));
- ssbElem[3]->ssb = 3;
- ssbElem[3]->ra_PreambleIndex = 63;
- ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[3]);
- ssbElem[4] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource));
- ssbElem[4]->ssb = 4;
- ssbElem[4]->ra_PreambleIndex = 63;
- ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[4]);
- ssbElem[5] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource));
- ssbElem[5]->ssb = 5;
- ssbElem[5]->ra_PreambleIndex = 63;
- ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[5]);
- ssbElem[6] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource));
- ssbElem[6]->ssb = 6;
- ssbElem[6]->ra_PreambleIndex = 63;
- ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[6]);
- ssbElem[7] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource));
- ssbElem[7]->ssb = 7;
- ssbElem[7]->ra_PreambleIndex = 63;
- ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[7]);
-#endif
+
+ int n_ssb = 0;
+ struct NR_CFRA_SSB_Resource *ssbElem[64];
+ for (int i=0;i<64;i++) {
+ if ((bitmap>>(63-i))&0x01){
+ ssbElem[n_ssb] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource));
+ ssbElem[n_ssb]->ssb = i;
+ ssbElem[n_ssb]->ra_PreambleIndex = 63;
+ ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[n_ssb]);
+ n_ssb++;
+ }
+ }
secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->ext1 = NULL;
secondaryCellGroup->spCellConfig->rlf_TimersAndConstants = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->rlf_TimersAndConstants));
secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->present = NR_SetupRelease_RLF_TimersAndConstants_PR_setup;
@@ -317,7 +294,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList));
- int n_ssb = 0;
+ n_ssb = 0;
NR_TCI_State_t *tcic[64];
for (int i=0;i<64;i++) {
if ((bitmap>>(63-i))&0x01){
@@ -651,7 +628,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
}
bwp->bwp_Dedicated->pdsch_Config->choice.setup->dataScramblingIdentityPDSCH = NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type=NULL;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type=NULL;//calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type));
bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->maxLength=NULL;
bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->scramblingID0=NULL;
bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->scramblingID1=NULL;
diff --git a/openair2/UTIL/OSA/osa_defs.h b/openair2/UTIL/OSA/osa_defs.h
index 6334658683..e845315922 100644
--- a/openair2/UTIL/OSA/osa_defs.h
+++ b/openair2/UTIL/OSA/osa_defs.h
@@ -48,7 +48,8 @@ typedef enum {
NAS_INT_ALG = 0x02,
RRC_ENC_ALG = 0x03,
RRC_INT_ALG = 0x04,
- UP_ENC_ALG = 0x05
+ UP_ENC_ALG = 0x05,
+ UP_INT_ALG = 0x06
} algorithm_type_dist_t;
//int derive_keNB(const uint8_t kasme[32], const uint32_t nas_count, uint8_t **keNB);
diff --git a/targets/ARCH/ETHERNET/benetel/5g/dpdk_driver.c b/targets/ARCH/ETHERNET/benetel/5g/dpdk_driver.c
index 88f4ecb4cd..9b398e9bd9 100644
--- a/targets/ARCH/ETHERNET/benetel/5g/dpdk_driver.c
+++ b/targets/ARCH/ETHERNET/benetel/5g/dpdk_driver.c
@@ -312,14 +312,13 @@ l2fwd_simple_forward(struct rte_mbuf *m, unsigned portid, benetel_t *bs)
oai_slot = tx_subframe * 2 + tx_slot;
lock_dl_buffer(bs->buffers, oai_slot);
if (!(bs->buffers->dl_busy[a][oai_slot] & (1 << tx_symbol))) {
- printf("%s: warning, DL underflow (antenna %d sl.symbol %d.%d)\n", __FUNCTION__,
- a, oai_slot, tx_symbol);
+ //printf("%s: warning, DL underflow (antenna %d sl.symbol %d.%d)\n", __FUNCTION__,a, oai_slot, tx_symbol);
memset(IQ_ptr, 0, 1272 * 4);
} else {
memcpy(IQ_ptr, bs->buffers->dl[a][oai_slot] + tx_symbol * 1272*4,
1272*4);
}
-//printf("DL buffer f sf slot symbol %d %d %d %d (sf %d)\n", tx_frame, tx_subframe, tx_slot, tx_symbol, (int)sf);
+ //printf("DL buffer f sf slot symbol %d %d %d %d (sf %d)\n", tx_frame, tx_subframe, tx_slot, tx_symbol, (int)sf);
bs->buffers->dl_busy[a][oai_slot] &= ~(1 << tx_symbol);
unlock_dl_buffer(bs->buffers, oai_slot);
}
diff --git a/targets/ARCH/iqplayer/iqplayer_lib.c b/targets/ARCH/iqplayer/iqplayer_lib.c
index c4133d1b11..66308d4b1c 100644
--- a/targets/ARCH/iqplayer/iqplayer_lib.c
+++ b/targets/ARCH/iqplayer/iqplayer_lib.c
@@ -25,7 +25,6 @@
*/
#define _LARGEFILE_SOURCE
#define _FILE_OFFSET_BITS 64
-#define NB_ANTENNAS_RX 2
#include
#include
#include
diff --git a/targets/ARCH/rfsimulator/simulator.c b/targets/ARCH/rfsimulator/simulator.c
index cd35c46a15..96d9541db9 100644
--- a/targets/ARCH/rfsimulator/simulator.c
+++ b/targets/ARCH/rfsimulator/simulator.c
@@ -54,7 +54,7 @@
#include
#define PORT 4043 //default TCP port for this simulator
-#define CirSize 307200 // 100ms is enough
+#define CirSize 6144000 // 100ms is enough
#define sampleToByte(a,b) ((a)*(b)*sizeof(sample_t))
#define byteToSample(a,b) ((a)/(sizeof(sample_t)*(b)))
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/benetel-5g.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/benetel-5g.conf
index 504d5e7b34..a426c39a7a 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/benetel-5g.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/benetel-5g.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 31; //0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
#pusch_TargetSNRx10 = 200;
#pucch_TargetSNRx10 = 200;
pusch_TargetSNRx10 = 200;
@@ -50,7 +51,7 @@ gNBs =
#initialDownlinkBWP
#genericParameters
# this is RBstart=84,L=13 (275*(L-1))+RBstart
- initialDLBWPlocationAndBandwidth = 6366; //28875; //6366; #6407; #3384;
+ initialDLBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
@@ -59,27 +60,14 @@ gNBs =
initialDLBWPsearchSpaceZero = 0;
#pdsch-ConfigCommon
#pdschTimeDomainAllocationList (up to 16 entries)
- initialDLBWPk0_0 = 0;
- #initialULBWPmappingType
- #0=typeA,1=typeB
- initialDLBWPmappingType_0 = 0;
- #this is SS=1,L=13
- initialDLBWPstartSymbolAndLength_0 = 40;
+ initialDLBWPk0_0 = 0; #for DL slot
+ initialDLBWPmappingType_0 = 0; #0=typeA,1=typeB
+ initialDLBWPstartSymbolAndLength_0 = 40; #this is SS=1,L=13
- initialDLBWPk0_1 = 0;
- initialDLBWPmappingType_1 = 0;
- #this is SS=2,L=12
- initialDLBWPstartSymbolAndLength_1 = 53;
+ initialDLBWPk0_1 = 0; #for mixed slot
+ initialDLBWPmappingType_1 = 0;
+ initialDLBWPstartSymbolAndLength_1 = 57; #this is SS=1,L=5
- initialDLBWPk0_2 = 0;
- initialDLBWPmappingType_2 = 0;
- #this is SS=1,L=12
- initialDLBWPstartSymbolAndLength_2 = 54;
-
- initialDLBWPk0_3 = 0;
- initialDLBWPmappingType_3 = 0;
- #this is SS=1,L=4 //5 (4 is for 43, 5 is for 57)
- initialDLBWPstartSymbolAndLength_3 = 57; //43; //57;
#uplinkConfigCommon
#frequencyInfoUL
ul_frequencyBand = 78;
@@ -92,7 +80,7 @@ gNBs =
pMax = 20;
#initialUplinkBWP
#genericParameters
- initialULBWPlocationAndBandwidth = 6366; //28875; //6366; #6407; #3384;
+ initialULBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
@@ -136,20 +124,18 @@ gNBs =
# 0=unrestricted, 1=restricted type A, 2=restricted type B
restrictedSetConfig = 0,
# pusch-ConfigCommon (up to 16 elements)
- initialULBWPk2_0 = 2;
+ initialULBWPk2_0 = 6; # used for UL slot
initialULBWPmappingType_0 = 1
- # this is SS=0 L=11
- initialULBWPstartSymbolAndLength_0 = 55;
-
- initialULBWPk2_1 = 2;
- initialULBWPmappingType_1 = 1;
- # this is SS=0 L=12
- initialULBWPstartSymbolAndLength_1 = 69;
+ initialULBWPstartSymbolAndLength_0 = 55; # this is SS=0 L=12
- initialULBWPk2_2 = 7;
+ initialULBWPk2_1 = 6; # used for mixed slot
+ initialULBWPmappingType_1 = 1;
+ initialULBWPstartSymbolAndLength_1 = 24; # this is SS=10 L=2
+
+ initialULBWPk2_2 = 7; # used for Msg.3 during RA
initialULBWPmappingType_2 = 1;
- # this is SS=10 L=4
- initialULBWPstartSymbolAndLength_2 = 52;
+ initialULBWPstartSymbolAndLength_2 = 52; # this is SS=10 L=4
+
msg3_DeltaPreamble = 1;
#p0_NominalWithGrant =-90;
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf
new file mode 100644
index 0000000000..39ee3c4a61
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf
@@ -0,0 +1,299 @@
+Active_gNBs = ( "gNB-Eurecom-5GNRBox");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+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 = 208; mnc = 92; mnc_length = 2;});
+
+ tr_s_preference = "local_mac"
+
+ ////////// Physical parameters:
+
+ ssb_SubcarrierOffset = 0;
+ pdsch_AntennaPorts = 1;
+ pusch_TargetSNRx10 = 200;
+ pucch_TargetSNRx10 = 200;
+
+ servingCellConfigCommon = (
+ {
+ #spCellConfigCommon
+
+ physCellId = 0;
+
+# downlinkConfigCommon
+ #frequencyInfoDL
+ # this is pointA + 23 PRBs@120kHz SCS (same as initial BWP)
+ absoluteFrequencySSB = 2071241;
+ dl_frequencyBand = 257;
+ # this is 27.900 GHz
+ dl_absoluteFrequencyPointA = 2070833;
+ #scs-SpecificCarrierList
+ dl_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_subcarrierSpacing = 3;
+ dl_carrierBandwidth = 32;
+ #initialDownlinkBWP
+ #genericParameters
+ # this is RBstart=0,L=32 (275*(L-1))+RBstart
+ initialDLBWPlocationAndBandwidth = 8525;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialDLBWPsubcarrierSpacing = 3;
+ #pdcch-ConfigCommon
+ initialDLBWPcontrolResourceSetZero = 12;
+ initialDLBWPsearchSpaceZero = 0;
+ #pdsch-ConfigCommon
+ #pdschTimeDomainAllocationList (up to 16 entries)
+ initialDLBWPk0_0 = 0;
+ #initialULBWPmappingType
+ #0=typeA,1=typeB
+ initialDLBWPmappingType_0 = 0;
+ #this is SS=2,L=3
+ initialDLBWPstartSymbolAndLength_0 = 40;
+
+ initialDLBWPk0_1 = 0;
+ initialDLBWPmappingType_1 = 0;
+ #this is SS=2,L=12
+ initialDLBWPstartSymbolAndLength_1 = 53;
+
+ initialDLBWPk0_2 = 0;
+ initialDLBWPmappingType_2 = 0;
+ #this is SS=1,L=12
+ initialDLBWPstartSymbolAndLength_2 = 54;
+
+ initialDLBWPk0_3 = 0;
+ initialDLBWPmappingType_3 = 0;
+ #this is SS=1,L=4 //5 (4 is for 43, 5 is for 57)
+ initialDLBWPstartSymbolAndLength_3 = 57; //43; //57;
+ #uplinkConfigCommon
+ #frequencyInfoUL
+ ul_frequencyBand = 261;
+ #scs-SpecificCarrierList
+ ul_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_subcarrierSpacing = 3;
+ ul_carrierBandwidth = 32;
+ pMax = 20;
+ #initialUplinkBWP
+ #genericParameters
+ initialULBWPlocationAndBandwidth = 8525;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialULBWPsubcarrierSpacing = 3;
+ #rach-ConfigCommon
+ #rach-ConfigGeneric
+ prach_ConfigurationIndex = 52;
+#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 = 7;
+#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 = 3;
+#oneHalf (0..15) 4,8,12,16,...60,64
+ ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 7;
+#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 = 3,
+
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+ restrictedSetConfig = 0,
+ # pusch-ConfigCommon (up to 16 elements)
+ initialULBWPk2_0 = 6;
+ initialULBWPmappingType_0 = 1
+ # this is SS=0 L=11
+ initialULBWPstartSymbolAndLength_0 = 55;
+
+ initialULBWPk2_1 = 6;
+ initialULBWPmappingType_1 = 1;
+ # this is SS=0 L=12
+ initialULBWPstartSymbolAndLength_1 = 69;
+
+ initialULBWPk2_2 = 4;
+ initialULBWPmappingType_2 = 1;
+ # this is SS=10 L=4
+ initialULBWPstartSymbolAndLength_2 = 52;
+
+ 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_PositionsInBurs_BitmapPR
+# 1=short, 2=medium, 3=long
+ ssb_PositionsInBurst_PR = 3;
+ ssb_PositionsInBurst_Bitmap = 0x0001000100010001L;
+
+# 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 = 3;
+
+
+ #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ referenceSubcarrierSpacing = 3;
+ # pattern1
+ # dl_UL_TransmissionPeriodicity
+ # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+ dl_UL_TransmissionPeriodicity = 3;
+ nrofDownlinkSlots = 7;
+ nrofDownlinkSymbols = 6;
+ nrofUplinkSlots = 2;
+ nrofUplinkSymbols = 4;
+
+ ssPBCH_BlockPower = 10;
+ }
+
+ );
+
+
+ # ------- SCTP definitions
+ SCTP :
+ {
+ # Number of streams to use in input/output
+ SCTP_INSTREAMS = 2;
+ SCTP_OUTSTREAMS = 2;
+ };
+
+
+ ////////// MME parameters:
+ mme_ip_address = ( { ipv4 = "192.168.18.99";
+ ipv6 = "192:168:30::17";
+ active = "yes";
+ preference = "ipv4";
+ }
+ );
+
+ ///X2
+ enable_x2 = "yes";
+ t_reloc_prep = 1000; /* unit: millisecond */
+ tx2_reloc_overall = 2000; /* unit: millisecond */
+ t_dc_prep = 1000; /* unit: millisecond */
+ t_dc_overall = 2000; /* unit: millisecond */
+ target_enb_x2_ip_address = (
+ { ipv4 = "192.168.18.199";
+ ipv6 = "192:168:30::17";
+ preference = "ipv4";
+ }
+ );
+
+ NETWORK_INTERFACES :
+ {
+
+ GNB_INTERFACE_NAME_FOR_S1_MME = "eth0";
+ GNB_IPV4_ADDRESS_FOR_S1_MME = "192.168.18.198/24";
+ GNB_INTERFACE_NAME_FOR_S1U = "eth0";
+ GNB_IPV4_ADDRESS_FOR_S1U = "192.168.18.198/24";
+ GNB_PORT_FOR_S1U = 2152; # Spec 2152
+ GNB_IPV4_ADDRESS_FOR_X2C = "192.168.18.198/24";
+ GNB_PORT_FOR_X2C = 36422; # Spec 36422
+ };
+ }
+);
+
+MACRLCs = (
+ {
+ num_cc = 1;
+ tr_s_preference = "local_L1";
+ tr_n_preference = "local_RRC";
+ }
+);
+
+L1s = (
+ {
+ num_cc = 1;
+ tr_n_preference = "local_mac";
+ }
+);
+
+RUs = (
+ {
+ local_rf = "yes"
+ nb_tx = 1;
+ nb_rx = 1;
+ att_tx = 0;
+ att_rx = 0;
+ bands = [7];
+ max_pdschReferenceSignalPower = -27;
+ max_rxgain = 75;
+ eNB_instances = [0];
+ sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2";
+ if_freq = 5124520000L;
+ clock_src = "external";
+ time_src = "external";
+ }
+);
+
+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";
+ }
+);
+
+ log_config :
+ {
+ global_log_level ="info";
+ global_log_verbosity ="medium";
+ hw_log_level ="info";
+ hw_log_verbosity ="medium";
+ phy_log_level ="info";
+ phy_log_verbosity ="medium";
+ mac_log_level ="info";
+ mac_log_verbosity ="high";
+ rlc_log_level ="info";
+ rlc_log_verbosity ="medium";
+ pdcp_log_level ="info";
+ pdcp_log_verbosity ="medium";
+ rrc_log_level ="info";
+ rrc_log_verbosity ="medium";
+ };
+
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf
index f2e468c71b..8b1079350b 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf
@@ -23,6 +23,9 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
+ pusch_TargetSNRx10 = 200;
+ pucch_TargetSNRx10 = 200;
servingCellConfigCommon = (
{
@@ -33,10 +36,10 @@ gNBs =
# downlinkConfigCommon
#frequencyInfoDL
# this is pointA + 23 PRBs@120kHz SCS (same as initial BWP)
- absoluteFrequencySSB = 2077907;
+ absoluteFrequencySSB = 2071241;
dl_frequencyBand = 257;
# this is 27.900 GHz
- dl_absoluteFrequencyPointA = 2077499;
+ dl_absoluteFrequencyPointA = 2070833;
#scs-SpecificCarrierList
dl_offstToCarrier = 0;
# subcarrierSpacing
@@ -110,8 +113,8 @@ gNBs =
#1,2,4,8,10,20,40,80
ra_ResponseWindow = 7;
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
-#0=oneeighth,1=onefourth,2=half,3=one,4=two,5=four,6=eight,7=sixteen
- ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+ ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3;
#oneHalf (0..15) 4,8,12,16,...60,64
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 7;
#ra_ContentionResolutionTimer
@@ -140,7 +143,7 @@ gNBs =
# this is SS=0 L=12
initialULBWPstartSymbolAndLength_1 = 69;
- initialULBWPk2_2 = 14;
+ initialULBWPk2_2 = 4;
initialULBWPmappingType_2 = 1;
# this is SS=10 L=4
initialULBWPstartSymbolAndLength_2 = 52;
@@ -157,7 +160,7 @@ gNBs =
# ssb_PositionsInBurs_BitmapPR
# 1=short, 2=medium, 3=long
ssb_PositionsInBurst_PR = 3;
- ssb_PositionsInBurst_Bitmap = 0x100000001L;
+ ssb_PositionsInBurst_Bitmap = 0x0001000100010001L;
# ssb_periodicityServingCell
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
@@ -185,7 +188,7 @@ gNBs =
nrofUplinkSlots = 2;
nrofUplinkSymbols = 4;
- ssPBCH_BlockPower = 10;
+ ssPBCH_BlockPower = -25;
}
);
@@ -216,6 +219,7 @@ gNBs =
GNB_INTERFACE_NAME_FOR_S1U = "eth0";
GNB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24";
GNB_PORT_FOR_S1U = 2152; # Spec 2152
+
};
}
);
@@ -247,9 +251,9 @@ RUs = (
max_rxgain = 75;
eNB_instances = [0];
sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2";
- if_freq = 5300000000L;
- #time_source = "external";
- clock_source = "external";
+ if_freq = 5124520000L;
+ clock_src = "external";
+ time_src = "external";
}
);
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf
index 2737357851..3bfcc01703 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
@@ -176,7 +177,7 @@ gNBs =
nrofUplinkSlots = 10;
nrofUplinkSymbols = 0;
- ssPBCH_BlockPower = 10;
+ ssPBCH_BlockPower = -25;
}
);
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf
index f810dd546c..e1bf1b9818 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
pusch_TargetSNRx10 = 200;
pucch_TargetSNRx10 = 200;
@@ -112,8 +113,8 @@ gNBs =
#1,2,4,8,10,20,40,80
ra_ResponseWindow = 7;
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
-#0=oneeighth,1=onefourth,2=half,3=one,4=two,5=four,6=eight,7=sixteen
- ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+ ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3;
#oneHalf (0..15) 4,8,12,16,...60,64
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 7;
#ra_ContentionResolutionTimer
@@ -142,7 +143,7 @@ gNBs =
# this is SS=0 L=12
initialULBWPstartSymbolAndLength_1 = 69;
- initialULBWPk2_2 = 14;
+ initialULBWPk2_2 = 4;
initialULBWPmappingType_2 = 1;
# this is SS=10 L=4
initialULBWPstartSymbolAndLength_2 = 52;
@@ -187,7 +188,7 @@ gNBs =
nrofUplinkSlots = 2;
nrofUplinkSymbols = 4;
- ssPBCH_BlockPower = 10;
+ ssPBCH_BlockPower = -25;
}
);
@@ -249,6 +250,7 @@ L1s = (
{
num_cc = 1;
tr_n_preference = "local_mac";
+ pusch_proc_threads = 8;
}
);
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf
index 32de0aa4f5..ceba30dacf 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
@@ -185,7 +186,7 @@ gNBs =
nrofUplinkSlots = 2;
nrofUplinkSymbols = 4;
- ssPBCH_BlockPower = 10;
+ ssPBCH_BlockPower = -25;
}
);
@@ -238,7 +239,7 @@ L1s = (
RUs = (
{
- local_rf = "yes"
+ local_rf = "yes"
nb_tx = 1;
nb_rx = 1;
att_tx = 0;
@@ -247,15 +248,14 @@ RUs = (
max_pdschReferenceSignalPower = -27;
max_rxgain = 75;
eNB_instances = [0];
- ##beamforming 1x2 matrix: 1 layer x 2 antennas
+ ## beamforming 1x2 matrix: 1 layer x 2 antennas
bf_weights = [0x00007fff, 0x0000];
- ##beamforming 1x4 matrix: 1 layer x 4 antennas
+ ## beamforming 1x4 matrix: 1 layer x 4 antennas
#bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
## beamforming 2x2 matrix:
- # bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
+ #bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
## beamforming 4x4 matrix:
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
-
sdr_addrs = "addr=192.168.10.2,mgmt_addr=192.168.10.2,second_addr=192.168.20.2";
clock_src = "external";
# if_freq = 3700000000L;
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf
index 307cf52cb3..115ed6f6f0 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
@@ -185,7 +186,7 @@ gNBs =
nrofUplinkSlots = 2;
nrofUplinkSymbols = 4;
- ssPBCH_BlockPower = 10;
+ ssPBCH_BlockPower = -25;
}
);
@@ -238,7 +239,7 @@ L1s = (
RUs = (
{
- local_rf = "yes"
+ local_rf = "yes"
nb_tx = 1;
nb_rx = 1;
att_tx = 0;
@@ -247,15 +248,14 @@ RUs = (
max_pdschReferenceSignalPower = -27;
max_rxgain = 114;
eNB_instances = [0];
- ##beamforming 1x2 matrix: 1 layer x 2 antennas
+ ## beamforming 1x2 matrix: 1 layer x 2 antennas
bf_weights = [0x00007fff, 0x0000];
- ##beamforming 1x4 matrix: 1 layer x 4 antennas
+ ## beamforming 1x4 matrix: 1 layer x 4 antennas
#bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
## beamforming 2x2 matrix:
- # bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
+ #bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
## beamforming 4x4 matrix:
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
-
sdr_addrs = "type=x300";
clock_src = "external";
# if_freq = 3700000000L;
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.30kHz,usrpb2x0.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.30kHz,usrpb2x0.conf
index 1cd16d0831..b83999f25e 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.30kHz,usrpb2x0.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.30kHz,usrpb2x0.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 31;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
@@ -46,7 +47,7 @@ gNBs =
#initialDownlinkBWP
#genericParameters
# this is RBstart=84,L=13 (275*(L-1))+RBstart
- initialDLBWPlocationAndBandwidth = 6366;
+ initialDLBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
@@ -83,7 +84,7 @@ gNBs =
pMax = 20;
#initialUplinkBWP
#genericParameters
- initialULBWPlocationAndBandwidth = 6366;
+ initialULBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
@@ -176,7 +177,7 @@ gNBs =
nrofUplinkSlots = 2;
nrofUplinkSymbols = 4;
- ssPBCH_BlockPower = 10;
+ ssPBCH_BlockPower = -25;
}
);
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf
index dfae41f0a6..27ade965dc 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
@@ -46,7 +47,7 @@ gNBs =
#initialDownlinkBWP
#genericParameters
# this is RBstart=0,L=50 (275*(L-1))+RBstart
- initialDLBWPlocationAndBandwidth = 6366;
+ initialDLBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
@@ -89,7 +90,7 @@ gNBs =
pMax = 20;
#initialUplinkBWP
#genericParameters
- initialULBWPlocationAndBandwidth = 6366;
+ initialULBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.slave.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.slave.conf
index dcdfa003a2..9bb9132917 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.slave.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.slave.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf
index deed91c93c..ffced2055a 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
@@ -185,7 +186,7 @@ gNBs =
nrofUplinkSlots = 2;
nrofUplinkSymbols = 4;
- ssPBCH_BlockPower = 10;
+ ssPBCH_BlockPower = -25;
}
);
@@ -282,6 +283,7 @@ L1s = (
{
num_cc = 1;
tr_n_preference = "local_mac";
+ pusch_proc_threads = 8;
}
);
@@ -296,8 +298,14 @@ RUs = (
max_pdschReferenceSignalPower = -27;
max_rxgain = 114;
eNB_instances = [0];
- #beamforming 1x4 matrix:
- bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
+ ## beamforming 1x2 matrix: 1 layer x 2 antennas
+ bf_weights = [0x00007fff, 0x0000];
+ ## beamforming 1x4 matrix: 1 layer x 4 antennas
+ #bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
+ ## beamforming 2x2 matrix:
+ #bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
+ ## beamforming 4x4 matrix:
+ #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
sdr_addrs = "type=x300";
clock_src = "external";
}
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf
index 862f0e6303..b517bea8ee 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
@@ -176,7 +177,7 @@ gNBs =
nrofUplinkSlots = 2;
nrofUplinkSymbols = 4;
- ssPBCH_BlockPower = 10;
+ ssPBCH_BlockPower = -25;
}
);
@@ -228,7 +229,7 @@ L1s = (
RUs = (
{
- local_rf = "yes"
+ local_rf = "yes"
nb_tx = 1
nb_rx = 1
att_tx = 0
@@ -237,7 +238,15 @@ RUs = (
max_pdschReferenceSignalPower = -27;
max_rxgain = 114;
eNB_instances = [0];
- sdr_addrs = "type=b200";
+ ## beamforming 1x2 matrix: 1 layer x 2 antennas
+ #bf_weights = [0x00007fff, 0x00007fff];
+ ## beamforming 1x4 matrix: 1 layer x 4 antennas
+ #bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
+ ## beamforming 2x2 matrix:
+ #bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
+ ## beamforming 4x4 matrix:
+ #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
+ sdr_addrs = "type=b200";
#clock_src = "external";
}
);
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
index c77497dedd..7080aff8ea 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
@@ -46,7 +47,7 @@ gNBs =
#initialDownlinkBWP
#genericParameters
# this is RBstart=41,L=24 (275*(L-1))+RBstart
- initialDLBWPlocationAndBandwidth = 6366;
+ initialDLBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
@@ -89,7 +90,7 @@ gNBs =
pMax = 20;
#initialUplinkBWP
#genericParameters
- initialULBWPlocationAndBandwidth = 6366;
+ initialULBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
@@ -158,7 +159,7 @@ gNBs =
# ssb_PositionsInBurs_BitmapPR
# 1=short, 2=medium, 3=long
ssb_PositionsInBurst_PR = 2;
- ssb_PositionsInBurst_Bitmap = 1;
+ ssb_PositionsInBurst_Bitmap = 0x1;
# ssb_periodicityServingCell
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
@@ -186,7 +187,7 @@ gNBs =
nrofUplinkSlots = 2;
nrofUplinkSymbols = 4;
- ssPBCH_BlockPower = 10;
+ ssPBCH_BlockPower = -25;
}
);
@@ -239,7 +240,7 @@ L1s = (
RUs = (
{
- local_rf = "yes"
+ local_rf = "yes"
nb_tx = 1
nb_rx = 1
att_tx = 0
@@ -248,15 +249,14 @@ RUs = (
max_pdschReferenceSignalPower = -27;
max_rxgain = 50;
eNB_instances = [0];
- ##beamforming 1x2 matrix: 1 layer x 2 antennas
- bf_weights = [0x00007fff, 0x0000];
- ##beamforming 1x4 matrix: 1 layer x 4 antennas
+ ## beamforming 1x2 matrix: 1 layer x 2 antennas
+ #bf_weights = [0x00007fff, 0x00007fff];
+ ## beamforming 1x4 matrix: 1 layer x 4 antennas
#bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
## beamforming 2x2 matrix:
- # bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
+ #bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
## beamforming 4x4 matrix:
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
-
sdr_addrs = "addr=192.168.10.2,mgmt_addr=192.168.10.2,second_addr=192.168.20.2";
clock_src = "external";
}
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf
index b3fdd79475..4039012fe1 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
@@ -46,7 +47,7 @@ gNBs =
#initialDownlinkBWP
#genericParameters
# this is RBstart=0,L=50 (275*(L-1))+RBstart
- initialDLBWPlocationAndBandwidth = 6366;
+ initialDLBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
@@ -89,7 +90,7 @@ gNBs =
pMax = 20;
#initialUplinkBWP
#genericParameters
- initialULBWPlocationAndBandwidth = 6366;
+ initialULBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
@@ -186,7 +187,7 @@ gNBs =
nrofUplinkSlots = 2;
nrofUplinkSymbols = 4;
- ssPBCH_BlockPower = 10;
+ ssPBCH_BlockPower = -25; // -25 dBm/RE is the maximum measured power from USRP corresponding to att_tx = 0 dB
}
);
@@ -256,7 +257,6 @@ RUs = (
# bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
## beamforming 4x4 matrix:
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
-
sdr_addrs = "type=x300";
clock_src = "external";
}
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf
index 40361aaf4e..20e8aabf98 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
@@ -186,7 +187,7 @@ gNBs =
nrofUplinkSlots = 2;
nrofUplinkSymbols = 4;
- ssPBCH_BlockPower = 10;
+ ssPBCH_BlockPower = -25;
}
);
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf
index c907dcfe8d..fc8bda5d53 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
@@ -181,7 +182,7 @@ gNBs =
nrofUplinkSlots = 2;
nrofUplinkSymbols = 4;
- ssPBCH_BlockPower = 10;
+ ssPBCH_BlockPower = -25;
}
);
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf
index 9f69849ace..89dda14e20 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
@@ -186,7 +187,7 @@ gNBs =
nrofUplinkSlots = 2;
nrofUplinkSymbols = 4;
- ssPBCH_BlockPower = 10;
+ ssPBCH_BlockPower = -25;
}
);
@@ -257,8 +258,8 @@ RUs = (
## beamforming 4x4 matrix:
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
sdr_addrs = "type=b200";
- #"addr=192.168.18.207";
- #"addr=192.168.10.2,mgmt_addr=192.168.10.2,second_addr=192.168.20.2";
+ #"addr=192.168.18.207";
+ #"addr=192.168.10.2,mgmt_addr=192.168.10.2,second_addr=192.168.20.2";
clock_src = "external";
}
);
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf
index 56f07668d7..7954b3c201 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
@@ -186,7 +187,7 @@ gNBs =
nrofUplinkSlots = 2;
nrofUplinkSymbols = 4;
- ssPBCH_BlockPower = 10;
+ ssPBCH_BlockPower = -25;
}
);
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf
index 687a188456..bd88ed88c7 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
@@ -186,7 +187,7 @@ gNBs =
nrofUplinkSlots = 2;
nrofUplinkSymbols = 4;
- ssPBCH_BlockPower = 10;
+ ssPBCH_BlockPower = -25;
}
);
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf
index a899845cb8..694b78e08d 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
@@ -186,7 +187,7 @@ gNBs =
nrofUplinkSlots = 2;
nrofUplinkSymbols = 4;
- ssPBCH_BlockPower = 10;
+ ssPBCH_BlockPower = -25;
}
);
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf
index 5f65a2c801..e541607559 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf
index 8bf788566a..f28f4729bd 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 31; //0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
pusch_TargetSNRx10 = 200;
pucch_TargetSNRx10 = 200;
@@ -48,7 +49,7 @@ gNBs =
#initialDownlinkBWP
#genericParameters
# this is RBstart=84,L=13 (275*(L-1))+RBstart
- initialDLBWPlocationAndBandwidth = 6366; //28875; //6366; #6407; #3384;
+ initialDLBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
@@ -90,7 +91,7 @@ gNBs =
pMax = 20;
#initialUplinkBWP
#genericParameters
- initialULBWPlocationAndBandwidth = 6366; //28875; //6366; #6407; #3384;
+ initialULBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
@@ -249,7 +250,7 @@ L1s = (
{
num_cc = 1;
tr_n_preference = "local_mac";
- pusch_proc_threads = 8;
+ pusch_proc_threads = 8;
}
);
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf
index 12e4525454..185edc5666 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 31; //0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
pusch_TargetSNRx10 = 200;
pucch_TargetSNRx10 = 200;
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_n310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_n310.conf
index 6a3f008ec1..e8fcced386 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_n310.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_n310.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 31; //0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
@@ -46,7 +47,7 @@ gNBs =
#initialDownlinkBWP
#genericParameters
# this is RBstart=84,L=13 (275*(L-1))+RBstart
- initialDLBWPlocationAndBandwidth = 6366; //28875; //6366; #6407; #3384;
+ initialDLBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
@@ -88,7 +89,7 @@ gNBs =
pMax = 20;
#initialUplinkBWP
#genericParameters
- initialULBWPlocationAndBandwidth = 6366; //28875; //6366; #6407; #3384;
+ initialULBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf
index 108cf06033..42b87d5672 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf
@@ -51,7 +51,7 @@ gNBs =
#initialDownlinkBWP
#genericParameters
# this is RBstart=41,L=24 (275*(L-1))+RBstart
- initialDLBWPlocationAndBandwidth = 6366; # 6366 12925 12956 28875
+ initialDLBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
@@ -99,7 +99,7 @@ gNBs =
pMax = 20;
#initialUplinkBWP
#genericParameters
- initialULBWPlocationAndBandwidth = 6366;
+ initialULBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf
index d28427dbf3..96df4a971f 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf
@@ -51,7 +51,7 @@ gNBs =
#initialDownlinkBWP
#genericParameters
# this is RBstart=41,L=24 (275*(L-1))+RBstart
- initialDLBWPlocationAndBandwidth = 6366; # 6366 12925 12956 28875
+ initialDLBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
@@ -94,7 +94,7 @@ gNBs =
pMax = 20;
#initialUplinkBWP
#genericParameters
- initialULBWPlocationAndBandwidth = 6366;
+ initialULBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;