diff --git a/ci-scripts/xml_files/container_4g_l2sim_proxy.xml b/ci-scripts/xml_files/container_4g_l2sim_proxy.xml
index 4c8f9ae019..795bce6bef 100644
--- a/ci-scripts/xml_files/container_4g_l2sim_proxy.xml
+++ b/ci-scripts/xml_files/container_4g_l2sim_proxy.xml
@@ -36,7 +36,7 @@
1
1
True
- f390610304baf6b66e4ec8cc00bf91398a651172
+ b64d9bce986b38ca59e8582864ade3fcdd05c0dc
diff --git a/ci-scripts/xml_files/container_l2sim_proxy.xml b/ci-scripts/xml_files/container_l2sim_proxy.xml
index 8a8dbd05c2..81ee7c1bfa 100644
--- a/ci-scripts/xml_files/container_l2sim_proxy.xml
+++ b/ci-scripts/xml_files/container_l2sim_proxy.xml
@@ -36,7 +36,7 @@
1
1
True
- f390610304baf6b66e4ec8cc00bf91398a651172
+ b64d9bce986b38ca59e8582864ade3fcdd05c0dc
diff --git a/nfapi/oai_integration/nfapi_vnf.c b/nfapi/oai_integration/nfapi_vnf.c
index 97f73ef880..67f6c346c7 100644
--- a/nfapi/oai_integration/nfapi_vnf.c
+++ b/nfapi/oai_integration/nfapi_vnf.c
@@ -1070,6 +1070,7 @@ int phy_nr_rx_data_indication(nfapi_nr_rx_data_indication_t *ind) {
rx_ind->pdu_list[j].rnti = ind->pdu_list[j].rnti;
rx_ind->pdu_list[j].timing_advance = ind->pdu_list[j].timing_advance;
rx_ind->pdu_list[j].ul_cqi = ind->pdu_list[j].ul_cqi;
+ rx_ind->pdu_list[j].rssi = ind->pdu_list[j].rssi;
}
if (!put_queue(&gnb_rx_ind_queue, rx_ind))
{
diff --git a/nfapi/open-nFAPI/nfapi/inc/nfapi.h b/nfapi/open-nFAPI/nfapi/inc/nfapi.h
index e1a0ec4f4e..dc2d3d3ec0 100644
--- a/nfapi/open-nFAPI/nfapi/inc/nfapi.h
+++ b/nfapi/open-nFAPI/nfapi/inc/nfapi.h
@@ -77,6 +77,9 @@ uint8_t unpackarray(uint8_t **ppReadPackedMsg,
uint8_t *end,
unpack_array_elem_fn fn);
+uint32_t pack_dci_payload(uint8_t payload[], uint16_t payloadSizeBits, uint8_t **out, uint8_t *end);
+uint32_t unpack_dci_payload(uint8_t payload[], uint16_t payloadSizeBits, uint8_t **in, uint8_t *end);
+
uint8_t pack_tl(nfapi_tl_t *tl, uint8_t **ppWritePackedMsg, uint8_t *end);
uint8_t unpack_tl(uint8_t **ppReadPackedMsg, nfapi_tl_t *tl, uint8_t *end);
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 a9338cf3ca..21c9558653 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
@@ -932,6 +932,8 @@ typedef struct
typedef struct
{
+ uint16_t bwp_size; // Needed for SCF222 10.02
+ uint16_t bwp_start; // Needed for SCF222 10.02
uint8_t subcarrier_spacing; // subcarrierSpacing [3GPP TS 38.211, sec 4.2], Value:0->4
uint8_t cyclic_prefix; // Cyclic prefix type [3GPP TS 38.211, sec 4.2], 0: Normal; 1: Extended
uint16_t start_rb; // PRB where this CSI resource starts related to common resource block #0 (CRB#0). Only multiples of 4 are allowed. [3GPP TS 38.331, sec 6.3.2 parameter CSIFrequencyOccupation], Value: 0 ->274
diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi.c b/nfapi/open-nFAPI/nfapi/src/nfapi.c
index ef80c86849..62d79bb511 100644
--- a/nfapi/open-nFAPI/nfapi/src/nfapi.c
+++ b/nfapi/open-nFAPI/nfapi/src/nfapi.c
@@ -49,6 +49,7 @@
#include
#include
+#include
#include
#include
@@ -544,6 +545,43 @@ uint8_t unpackarray(uint8_t **ppReadPackedMsg, void *array, uint16_t array_eleme
return 1;
}
+uint32_t pack_dci_payload(uint8_t payload[], uint16_t payloadSizeBits, uint8_t **out, uint8_t *end)
+{
+ // Helper vars for DCI Payload
+ uint8_t dci_bytes_inverted[DCI_PAYLOAD_BYTE_LEN];
+ uint8_t dci_byte_len = (payloadSizeBits + 7) / 8;
+ // Align the dci payload bits to the left on the payload buffer
+ uint64_t *dci_pdu = (uint64_t *)payload;
+ if (payloadSizeBits % 8 != 0) {
+ uint8_t rotation_bits = 8 - (payloadSizeBits % 8);
+ *dci_pdu = (*dci_pdu << rotation_bits);
+ }
+ // Invert the byte order of the DCI Payload
+ for (int j = 0; j < dci_byte_len; j++) {
+ dci_bytes_inverted[j] = payload[(dci_byte_len - 1) - j];
+ }
+ return pusharray8(dci_bytes_inverted, DCI_PAYLOAD_BYTE_LEN, dci_byte_len, out, end);
+}
+
+uint32_t unpack_dci_payload(uint8_t payload[], uint16_t payloadSizeBits, uint8_t **in, uint8_t *end)
+{
+ // Pull the inverted DCI and invert it back
+ // Helper vars for DCI Payload
+ uint8_t dci_bytes_inverted[DCI_PAYLOAD_BYTE_LEN];
+ uint8_t dci_byte_len = (payloadSizeBits + 7) / 8;
+ // Get DCI array inverted
+ uint32_t pullresult = pullarray8(in, dci_bytes_inverted, DCI_PAYLOAD_BYTE_LEN, dci_byte_len, end);
+ uint64_t *dci_pdu = (uint64_t *)payload;
+ // Reversing the byte order of the inverted DCI payload
+ for (uint16_t j = 0; j < dci_byte_len; j++) {
+ payload[j] = dci_bytes_inverted[(dci_byte_len - 1) - j];
+ }
+ if (payloadSizeBits % 8 != 0) {
+ uint8_t rotation_bits = 8 - (payloadSizeBits % 8);
+ *dci_pdu = (*dci_pdu >> rotation_bits);
+ }
+ return pullresult;
+}
uint32_t pack_vendor_extension_tlv(nfapi_tl_t *ve, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
if(ve != 0 && config != 0) {
diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
index f5a05d0d71..8f7a7c2804 100644
--- a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
+++ b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
@@ -196,124 +196,176 @@ static uint8_t pack_tpm_value(nfapi_dl_config_dci_dl_tpm_t *value, uint8_t **ppW
return 1;
}
-
-static uint8_t pack_dl_tti_csi_rs_pdu_rel15_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+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(
- 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)
- );
+ 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) &&
+ // TODO Add Precoding and Beamforming, hardcoded for now
+ push16(0, ppWritePackedMsg, end) && push16(0, ppWritePackedMsg, end) && push8(0, 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;
-static uint8_t pack_dl_tti_pdcch_pdu_rel15_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+ if (!(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))) {
+ return 0;
+ }
- 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, value->dci_pdu[i].PayloadSizeBits, 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));
+ for (uint16_t i = 0; i < value->numDlDci; ++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))) {
+ return 0;
+ }
+ // Precoding and beamforming
+ // TODO get these values from elsewhere and delete the hardcoded ones
+ value->dci_pdu[i].precodingAndBeamforming.num_prgs = 0;
+ value->dci_pdu[i].precodingAndBeamforming.prg_size = 0; // 1 PRG of max size for analogue beamforming
+ value->dci_pdu[i].precodingAndBeamforming.dig_bf_interfaces = 0;
+ value->dci_pdu[i].precodingAndBeamforming.prgs_list[0].pm_idx = 0;
+ value->dci_pdu[i].precodingAndBeamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx = 0;
+ if (!(push16(value->dci_pdu[i].precodingAndBeamforming.num_prgs, ppWritePackedMsg, end)
+ && push16(value->dci_pdu[i].precodingAndBeamforming.prg_size, ppWritePackedMsg, end)
+ && push8(value->dci_pdu[i].precodingAndBeamforming.dig_bf_interfaces, ppWritePackedMsg, end))) {
+ return 0;
+ }
+ for (int prg = 0; prg < value->dci_pdu[i].precodingAndBeamforming.num_prgs; prg++) {
+ if (!push16(value->dci_pdu[i].precodingAndBeamforming.prgs_list[prg].pm_idx, ppWritePackedMsg, end)) {
+ return 0;
+ }
+ for (int digInt = 0; digInt < value->dci_pdu[i].precodingAndBeamforming.dig_bf_interfaces; digInt++) {
+ if (!push16(value->dci_pdu[i].precodingAndBeamforming.prgs_list[prg].dig_bf_interface_list[digInt].beam_idx,
+ ppWritePackedMsg,
+ end)) {
+ return 0;
+ }
+ }
+ }
+ // TX Power info
+ if (!(push8(value->dci_pdu[i].beta_PDCCH_1_0, ppWritePackedMsg, end)
+ && push8(value->dci_pdu[i].powerControlOffsetSS, ppWritePackedMsg, end) &&
+ // DCI Payload fields
+ push16(value->dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end) &&
+ // Pack DCI Payload
+ pack_dci_payload(value->dci_pdu[i].Payload, value->dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end))) {
+ return 0;
+ }
+ }
+ return 1;
}
-
-static uint8_t pack_dl_tti_pdsch_pdu_rel15_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *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)
- );
+
+ if (!(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))) {
+ return 0;
+ }
+ for (int i = 0; i < value->NrOfCodewords; ++i) {
+ if (!(push16(value->targetCodeRate[i], ppWritePackedMsg, end) && push8(value->qamModOrder[i], ppWritePackedMsg, end)
+ && push8(value->mcsIndex[i], ppWritePackedMsg, end) && push8(value->mcsTable[i], ppWritePackedMsg, end)
+ && push8(value->rvIndex[i], ppWritePackedMsg, end) && push32(value->TBSize[i], ppWritePackedMsg, end))) {
+ return 0;
+ }
+ }
+
+ if (!(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) && (int)pusharray8(value->rbBitmap, 36, 36, 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))) {
+ return 0;
+ }
+
+ // Check pduBitMap bit 1 to add or not PTRS parameters
+ if (value->pduBitmap & 0b1) {
+ if (!(push8(value->PTRSPortIndex, ppWritePackedMsg, end) && push8(value->PTRSTimeDensity, ppWritePackedMsg, end)
+ && push8(value->PTRSFreqDensity, ppWritePackedMsg, end) && push8(value->PTRSReOffset, ppWritePackedMsg, end)
+ && push8(value->nEpreRatioOfPDSCHToPTRS, ppWritePackedMsg, end))) {
+ return 0;
+ }
+ }
+
+ if (!(push16(value->precodingAndBeamforming.num_prgs, ppWritePackedMsg, end)
+ && push16(value->precodingAndBeamforming.prg_size, ppWritePackedMsg, end)
+ && push8(value->precodingAndBeamforming.dig_bf_interfaces, ppWritePackedMsg, end))) {
+ return 0;
+ }
+ for (int i = 0; i < value->precodingAndBeamforming.num_prgs; ++i) {
+ if (!push16(value->precodingAndBeamforming.prgs_list[i].pm_idx, ppWritePackedMsg, end)) {
+ return 0;
+ }
+ for (int k = 0; k < value->precodingAndBeamforming.dig_bf_interfaces; ++k) {
+ if (!push16(value->precodingAndBeamforming.prgs_list[i].dig_bf_interface_list[k].beam_idx, ppWritePackedMsg, end)) {
+ return 0;
+ }
+ }
+ }
+ // TODO Add TX power info
+ // Hardcoded values that represent 0db
+ if (!(push8(8, ppWritePackedMsg, end) && // powerControlOffset
+ push8(1, ppWritePackedMsg, end))) { // powerControlOffsetSS
+ return 0;
+ }
+ // TODO Add CBG Fields
+ return 1;
}
+static uint8_t pack_dl_tti_ssb_pdu_rel15_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ NFAPI_TRACE(NFAPI_TRACE_DEBUG, "Packing ssb. \n");
+ nfapi_nr_dl_tti_ssb_pdu_rel15_t *value = (nfapi_nr_dl_tti_ssb_pdu_rel15_t *)tlv;
-static uint8_t pack_dl_tti_ssb_pdu_rel15_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
- NFAPI_TRACE(NFAPI_TRACE_DEBUG, "Packing ssb. \n");
- 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) &&
- push8(value->ssbRsrp, ppWritePackedMsg, end)
- // TODO: pack precoding_and_beamforming too
- );
-
+ if (!(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)
+ && push8((value->bchPayload >> 16) & 0xff, ppWritePackedMsg, end)
+ && push8((value->bchPayload >> 8) & 0xff, ppWritePackedMsg, end) && push8(value->bchPayload & 0xff, ppWritePackedMsg, end)
+ && push8(0, ppWritePackedMsg, end) &&
+ // TODO add Tx Power Info
+ push8(0, ppWritePackedMsg, end) && push8(0, ppWritePackedMsg, end)
+ && push16(value->precoding_and_beamforming.num_prgs, ppWritePackedMsg, end)
+ && push16(value->precoding_and_beamforming.prg_size, ppWritePackedMsg, end)
+ && push8(value->precoding_and_beamforming.dig_bf_interfaces, ppWritePackedMsg, end))) {
+ return 0;
+ }
+ for (int i = 0; i < value->precoding_and_beamforming.num_prgs; ++i) {
+ if (!push16(value->precoding_and_beamforming.prgs_list[i].pm_idx, ppWritePackedMsg, end)) {
+ return 0;
+ }
+ for (int k = 0; k < value->precoding_and_beamforming.dig_bf_interfaces; ++k) {
+ if (!push16(value->precoding_and_beamforming.prgs_list[i].dig_bf_interface_list[k].beam_idx, ppWritePackedMsg, end)) {
+ return 0;
+ }
+ }
+ }
+ return 1;
}
-
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) &&
@@ -594,47 +646,47 @@ static uint8_t pack_dl_config_ndlsch_pdu_rel13_value(void *tlv, uint8_t **ppWrit
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) {
+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(!(push32(value->PDUSize, ppWritePackedMsg, end) &&
- push16(value->PDUType, ppWritePackedMsg, end) ))
+ uintptr_t msgHead = (uintptr_t)*ppWritePackedMsg;
+ if (!push16(value->PDUType, ppWritePackedMsg, end))
+ return 0;
+ uint8_t *pPackedLengthField = *ppWritePackedMsg;
+ if (!push16(value->PDUSize, ppWritePackedMsg, end))
return 0;
// first match the pdu type, then call the respective function
- switch(value->PDUType) {
+ 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)))
+ if (!(pack_dl_tti_csi_rs_pdu_rel15_value(&value->csi_rs_pdu.csi_rs_pdu_rel15, ppWritePackedMsg, end)))
return 0;
- }
- break;
+ } 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)))
+ if (!(pack_dl_tti_pdcch_pdu_rel15_value(&value->pdcch_pdu.pdcch_pdu_rel15, ppWritePackedMsg, end)))
return 0;
- }
- break;
+ } 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)))
+ if (!(pack_dl_tti_pdsch_pdu_rel15_value(&value->pdsch_pdu.pdsch_pdu_rel15, ppWritePackedMsg, end)))
return 0;
- }
- break;
+ } 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)))
+ if (!(pack_dl_tti_ssb_pdu_rel15_value(&value->ssb_pdu.ssb_pdu_rel15, ppWritePackedMsg, end)))
return 0;
- }
- break;
+ } break;
default: {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid DL_TTI pdu type %d \n", value->PDUType );
- }
- break;
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid DL_TTI pdu type %d \n", value->PDUType);
+ } break;
}
-
- return 1;
+ // pack proper size
+ uintptr_t msgEnd = (uintptr_t)*ppWritePackedMsg;
+ uint16_t packedMsgLen = msgEnd - msgHead;
+ value->PDUSize = packedMsgLen;
+ return push16(value->PDUSize, &pPackedLengthField, end);
}
static uint8_t pack_dl_config_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
@@ -777,42 +829,34 @@ static uint8_t pack_dl_config_request_body_value(void *tlv, uint8_t **ppWritePac
return 1;
}
-
-static uint8_t pack_dl_tti_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+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;
+ 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;
+ if (!(push16(pNfapiMsg->SFN, ppWritePackedMsg, end) && push16(pNfapiMsg->Slot, ppWritePackedMsg, end)
+ && push8(pNfapiMsg->dl_tti_request_body.nPDUs, ppWritePackedMsg, end)
+ && push8(pNfapiMsg->dl_tti_request_body.nGroup, ppWritePackedMsg, end))) {
+ return 0;
+ }
+ for (int i = 0; i < pNfapiMsg->dl_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;
+ }
- 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; i < pNfapiMsg->dl_tti_request_body.nGroup; i++) {
+ if (!push8(pNfapiMsg->dl_tti_request_body.nUe[i], ppWritePackedMsg, end))
+ return 0;
+ for (int j = 0; j < pNfapiMsg->dl_tti_request_body.nUe[i]; j++) {
+ if (!(push32(pNfapiMsg->dl_tti_request_body.PduIdx[i][j], ppWritePackedMsg, end))) {
+ return 0;
+ }
+ }
+ 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;
+ 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) &&
@@ -882,148 +926,178 @@ static uint8_t pack_ul_config_request_ulsch_rel13_value(void *tlv, uint8_t **ppW
//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) &&
- push8(pucch_pdu->pi_2bpsk, 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
- ))
+static uint8_t pack_ul_tti_request_prach_pdu(nfapi_nr_prach_pdu_t *prach_pdu, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ if (!(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))) {
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 );
- }
}
+ // TODO: put these hardoded values elsewhere
+ // Beamforming
+ prach_pdu->beamforming.num_prgs = 0;
+ prach_pdu->beamforming.prg_size = 0;
+ prach_pdu->beamforming.dig_bf_interface = 0;
+
+ if (prach_pdu->beamforming.prgs_list == NULL) {
+ prach_pdu->beamforming.prgs_list = calloc(prach_pdu->beamforming.num_prgs, sizeof(*prach_pdu->beamforming.prgs_list));
+ }
+ if (prach_pdu->beamforming.prgs_list[0].dig_bf_interface_list == NULL) {
+ prach_pdu->beamforming.prgs_list[0].dig_bf_interface_list =
+ calloc(prach_pdu->beamforming.dig_bf_interface, sizeof(*prach_pdu->beamforming.prgs_list[0].dig_bf_interface_list));
+ }
+ prach_pdu->beamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx = 0;
+
+ // Pack RX Beamforming PDU
+ if (!(push16(prach_pdu->beamforming.num_prgs, ppWritePackedMsg, end)
+ && push16(prach_pdu->beamforming.prg_size, ppWritePackedMsg, end)
+ && push8(prach_pdu->beamforming.dig_bf_interface, ppWritePackedMsg, end)))
+ return 0;
+
+ for (int prg = 0; prg < prach_pdu->beamforming.num_prgs; prg++) {
+ for (int digBFInterface = 0; digBFInterface < prach_pdu->beamforming.dig_bf_interface; digBFInterface++) {
+ if (!push16(prach_pdu->beamforming.prgs_list[prg].dig_bf_interface_list[digBFInterface].beam_idx, ppWritePackedMsg, end))
+ return 0;
+ }
+ }
+ return 1;
+}
+
+static uint8_t pack_ul_tti_request_pucch_pdu(nfapi_nr_pucch_pdu_t *pucch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ if (!(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)
+ && push8(pucch_pdu->pi_2bpsk, 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)
+ && push16(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)
+ // Pack RX Beamforming PDU
+ && push16(pucch_pdu->beamforming.num_prgs, ppWritePackedMsg, end)
+ && push16(pucch_pdu->beamforming.prg_size, ppWritePackedMsg, end)
+ && push8(pucch_pdu->beamforming.dig_bf_interface, ppWritePackedMsg, end))) {
+ return 0;
+ }
+
+ for (int prg = 0; prg < pucch_pdu->beamforming.num_prgs; prg++) {
+ for (int digBFInterface = 0; digBFInterface < pucch_pdu->beamforming.dig_bf_interface; digBFInterface++) {
+ if (!push16(pucch_pdu->beamforming.prgs_list[prg].dig_bf_interface_list[digBFInterface].beam_idx, ppWritePackedMsg, end))
+ return 0;
+ }
+ }
+ return 1;
+}
+
+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)
+ && push16(pusch_pdu->pusch_identity, 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)
+ && pusharray8(pusch_pdu->rb_bitmap, 36, 36, 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
+ if (!(push8(pusch_pdu->pusch_data.rv_index, ppWritePackedMsg, end)
+ && push8(pusch_pdu->pusch_data.harq_process_id, ppWritePackedMsg, end)
+ && push8(pusch_pdu->pusch_data.new_data_indicator, 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,
+ (pusch_pdu->pusch_data.num_cb + 7) / 8,
+ (pusch_pdu->pusch_data.num_cb + 7) / 8,
+ ppWritePackedMsg,
+ end))) {
+ return 0;
+ }
+ } break;
+
+ case PUSCH_PDU_BITMAP_PUSCH_UCI: {
+ if (!(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))) {
+ return 0;
+ }
+ } break;
+
+ case PUSCH_PDU_BITMAP_PUSCH_PTRS: {
+ if (!push8(pusch_pdu->pusch_ptrs.num_ptrs_ports, ppWritePackedMsg, end)) {
+ return 0;
+ }
+ for (int i = 0; i < pusch_pdu->pusch_ptrs.num_ptrs_ports; ++i) {
+ if (!(push16(pusch_pdu->pusch_ptrs.ptrs_ports_list[i].ptrs_port_index, ppWritePackedMsg, end)
+ && push8(pusch_pdu->pusch_ptrs.ptrs_ports_list[i].ptrs_dmrs_port, ppWritePackedMsg, end)
+ && push8(pusch_pdu->pusch_ptrs.ptrs_ports_list[i].ptrs_re_offset, ppWritePackedMsg, end))) {
+ return 0;
+ }
+ }
+
+ if (!(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))) {
+ return 0;
+ }
+ } break;
+
+ case PUSCH_PDU_BITMAP_DFTS_OFDM: {
+ if (!(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))) {
+ return 0;
+ }
+ } break;
+
+ default: {
+ NFAPI_TRACE(NFAPI_TRACE_INFO, "Invalid pdu bitmap %d \n", pusch_pdu->pdu_bit_map);
+ }
+ }
+ // Pack RX Beamforming PDU
+ if (!(push16(pusch_pdu->beamforming.num_prgs, ppWritePackedMsg, end)
+ && push16(pusch_pdu->beamforming.prg_size, ppWritePackedMsg, end)
+ && push8(pusch_pdu->beamforming.dig_bf_interface, ppWritePackedMsg, end))) {
+ return 0;
+ }
+ for (int prg = 0; prg < pusch_pdu->beamforming.num_prgs; prg++) {
+ for (int digBFInterface = 0; digBFInterface < pusch_pdu->beamforming.dig_bf_interface; digBFInterface++) {
+ if (!push16(pusch_pdu->beamforming.prgs_list[prg].dig_bf_interface_list[digBFInterface].beam_idx, ppWritePackedMsg, end)) {
+ return 0;
+ }
+ }
+ }
return 1;
}
@@ -1346,48 +1420,50 @@ static uint8_t pack_ul_config_request_nrach_pdu_rel13_value(void *tlv, uint8_t *
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) {
+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) ))
+ uintptr_t msgHead = (uintptr_t)*ppWritePackedMsg;
+ if (!push16(value->pdu_type, ppWritePackedMsg, end)) {
return 0;
+ }
+ uint8_t *pPackedLengthField = *ppWritePackedMsg;
- // first match the pdu type, then call the respective function
- switch(value->pdu_type) {
+ if (!push16(value->pdu_size, ppWritePackedMsg, end))
+ return 0;
+ // pack PDUs
+ // 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))
+ if (!pack_ul_tti_request_prach_pdu(&value->prach_pdu, ppWritePackedMsg, end))
return 0;
- }
- break;
+ } break;
case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE: {
- if(!pack_ul_tti_request_pucch_pdu(&value->pucch_pdu, ppWritePackedMsg, end))
+ if (!pack_ul_tti_request_pucch_pdu(&value->pucch_pdu, ppWritePackedMsg, end))
return 0;
- }
- break;
+ } break;
case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE: {
- if(!pack_ul_tti_request_pusch_pdu(&value->pusch_pdu, ppWritePackedMsg, end))
+ if (!pack_ul_tti_request_pusch_pdu(&value->pusch_pdu, ppWritePackedMsg, end))
return 0;
- }
- break;
+ } break;
case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE: {
- if(!pack_ul_tti_request_srs_pdu(&value->srs_pdu, ppWritePackedMsg, end))
+ if (!pack_ul_tti_request_srs_pdu(&value->srs_pdu, ppWritePackedMsg, end))
return 0;
- }
- break;
+ } break;
default: {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid UL_TTI pdu type %d \n", value->pdu_type );
- }
- break;
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid UL_TTI pdu type %d \n", value->pdu_type);
+ } break;
}
- return 1;
+ // pack proper size
+ uintptr_t msgEnd = (uintptr_t)*ppWritePackedMsg;
+ uint16_t packedMsgLen = msgEnd - msgHead;
+ value->pdu_size = packedMsgLen;
+ return push16(value->pdu_size, &pPackedLengthField, end);
}
static uint8_t pack_ul_tti_groups_list_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
@@ -1577,9 +1653,23 @@ static uint8_t pack_ul_config_request_body_value(void *tlv, uint8_t **ppWritePac
return 1;
}
-
-static uint8_t pack_ul_tti_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+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;
+ pNfapiMsg->n_ulcch = 0;
+ pNfapiMsg->n_ulsch = 0;
+ for (int i = 0; i < pNfapiMsg->n_pdus; i++) {
+ switch ((&pNfapiMsg->pdus_list[i])->pdu_type) {
+ case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE: {
+ pNfapiMsg->n_ulcch++;
+ } break;
+ case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE: {
+ pNfapiMsg->n_ulsch++;
+ } break;
+ default:
+ break;
+ }
+ }
if (!push16(pNfapiMsg->SFN, ppWritePackedMsg, end))
return 0;
@@ -1587,29 +1677,28 @@ static uint8_t pack_ul_tti_request(void *msg, uint8_t **ppWritePackedMsg, uint8_
return 0;
if (!push8(pNfapiMsg->n_pdus, ppWritePackedMsg, end))
return 0;
- if (!push8(pNfapiMsg->n_group, ppWritePackedMsg, end))
- return 0;
if (!push8(pNfapiMsg->rach_present, ppWritePackedMsg, end))
return 0;
if (!push8(pNfapiMsg->n_ulsch, ppWritePackedMsg, end))
return 0;
if (!push8(pNfapiMsg->n_ulcch, ppWritePackedMsg, end))
return 0;
+ if (!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))
+ for (int i = 0; i < pNfapiMsg->n_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))
+ for (int i = 0; i < pNfapiMsg->n_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) &&
@@ -1810,45 +1899,87 @@ static uint8_t pack_hi_dci0_request_body_value(void *tlv, uint8_t **ppWritePacke
return 1;
}
-static uint8_t pack_ul_dci_pdu_list_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+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) &&
+ nfapi_nr_ul_dci_request_pdus_t *value = (nfapi_nr_ul_dci_request_pdus_t *)tlv;
+ uintptr_t msgHead = (uintptr_t)*ppWritePackedMsg;
+ if (!push16(value->PDUType, ppWritePackedMsg, end)) {
+ return 0;
+ }
+ uint8_t *pPackedLengthField = *ppWritePackedMsg;
+ if (!(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)
+ && push8(value->pdcch_pdu.pdcch_pdu_rel15.precoderGranularity, ppWritePackedMsg, end)
+ && push16(value->pdcch_pdu.pdcch_pdu_rel15.numDlDci, ppWritePackedMsg, end))) {
+ return 0;
+ }
+ for (int i = 0; i < value->pdcch_pdu.pdcch_pdu_rel15.numDlDci; ++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))) {
+ return 0;
+ }
+ // Precoding and Beamforming
+ // TODO get these values from elsewhere and delete the hardcoded ones
+ value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].precodingAndBeamforming.num_prgs = 0;
+ value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].precodingAndBeamforming.prg_size = 0;
+ value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].precodingAndBeamforming.dig_bf_interfaces = 0;
+ value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].precodingAndBeamforming.prgs_list[0].pm_idx = 0;
+ value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].precodingAndBeamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx = 0;
- 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, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, 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) &&
- push8(value->pdcch_pdu.pdcch_pdu_rel15.precoderGranularity, ppWritePackedMsg, end) &&
- push16(value->pdcch_pdu.pdcch_pdu_rel15.numDlDci, ppWritePackedMsg, end));
+ if (!(push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].precodingAndBeamforming.num_prgs, ppWritePackedMsg, end)
+ && push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].precodingAndBeamforming.prg_size, ppWritePackedMsg, end)
+ && push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].precodingAndBeamforming.dig_bf_interfaces, ppWritePackedMsg, end))) {
+ return 0;
+ }
+ for (int prg = 0; prg < value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].precodingAndBeamforming.num_prgs; prg++) {
+ if (!push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].precodingAndBeamforming.prgs_list[prg].pm_idx,
+ ppWritePackedMsg,
+ end)) {
+ return 0;
+ }
+ for (int digInt = 0; digInt < value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].precodingAndBeamforming.dig_bf_interfaces;
+ digInt++) {
+ if (!push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i]
+ .precodingAndBeamforming.prgs_list[prg]
+ .dig_bf_interface_list[digInt]
+ .beam_idx,
+ ppWritePackedMsg,
+ end)) {
+ return 0;
+ }
+ }
+ }
+ if (!(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) &&
+ // DCI Payload fields
+ push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end) &&
+ // Pack DCI Payload
+ pack_dci_payload(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].Payload,
+ value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits,
+ ppWritePackedMsg,
+ end))) {
+ return 0;
+ }
+ }
+ // pack proper size
+ uintptr_t msgEnd = (uintptr_t)*ppWritePackedMsg;
+ uint16_t packedMsgLen = msgEnd - msgHead;
+ value->PDUSize = packedMsgLen;
+ return push16(value->PDUSize, &pPackedLengthField, end);
}
static uint8_t pack_ul_dci_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
@@ -1878,40 +2009,32 @@ static uint8_t pack_hi_dci0_request(void *msg, uint8_t **ppWritePackedMsg, uint8
}
//pack_tx_data_pdu_list_value
-static uint8_t pack_tx_data_pdu_list_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+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)
- ))
+ if (!(push16(value->PDU_length, ppWritePackedMsg, end) && push16(value->PDU_index, ppWritePackedMsg, end)
+ && push32(value->num_TLV, 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)))
+ for (; i < total_number_of_tlvs; ++i) {
+ if (!(push16(value->TLVs[i].tag, ppWritePackedMsg, end) && push16(value->TLVs[i].length, ppWritePackedMsg, end)))
return 0;
- switch(value->TLVs[i].tag) {
+ switch (value->TLVs[i].tag) {
case 0: {
- if (!pusharray32(value->TLVs[i].value.direct, sizeof(value->TLVs[i].value.direct) / sizeof(uint32_t),
- value->TLVs[i].length / sizeof(uint32_t), ppWritePackedMsg, end)) {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s():%d. value->TLVs[i].length %d \n",
- __FUNCTION__, __LINE__, value->TLVs[i].length);
+ if (!pusharray32(value->TLVs[i].value.direct, 16384, (value->TLVs[i].length + 3) / 4, ppWritePackedMsg, end)) {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s():%d. value->TLVs[i].length %d \n", __FUNCTION__, __LINE__, value->TLVs[i].length);
return 0;
}
-
break;
}
case 1: {
- if (!pusharray32(value->TLVs[i].value.ptr, value->TLVs[i].length / sizeof(uint32_t),
- value->TLVs[i].length / sizeof(uint32_t), ppWritePackedMsg, end)) {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s():%d. value->TLVs[i].length %d \n",
- __FUNCTION__, __LINE__, value->TLVs[i].length);
+ if (!pusharray32(value->TLVs[i].value.ptr, value->TLVs[i].length, value->TLVs[i].length, ppWritePackedMsg, end)) {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s():%d. value->TLVs[i].length %d \n", __FUNCTION__, __LINE__, value->TLVs[i].length);
return 0;
}
@@ -1919,7 +2042,7 @@ static uint8_t pack_tx_data_pdu_list_value(void *tlv, uint8_t **ppWritePackedMsg
}
default: {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid tag value %d \n", value->TLVs[i].tag );
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid tag value %d \n", value->TLVs[i].tag);
break;
}
}
@@ -1971,19 +2094,25 @@ static uint8_t pack_tx_request_body_value(void *tlv, uint8_t **ppWritePackedMsg,
return 1;
}
-static uint8_t pack_tx_data_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+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)
- ))
+ 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))
+ for (int i = 0; i < pNfapiMsg->Number_of_PDUs; i++) {
+ if (!pack_tx_data_pdu_list_value(&pNfapiMsg->pdu_list[i], ppWritePackedMsg, end)) {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR,
+ "%s():%d. Error packing TX_DATA.request PDU #%d, PDU length = %d PDU IDX = %d\n",
+ __FUNCTION__,
+ __LINE__,
+ i,
+ pNfapiMsg->pdu_list[i].PDU_length,
+ pNfapiMsg->pdu_list[i].PDU_index);
return 0;
+ }
}
return 1;
@@ -3034,79 +3163,84 @@ return 1;
static uint8_t pack_nr_rx_data_indication_body(nfapi_nr_rx_data_pdu_t *value, uint8_t **ppWritePackedMsg, uint8_t *end)
{
- if(!(push32(value->handle, ppWritePackedMsg, end) &&
- push16(value->rnti, ppWritePackedMsg, end) &&
- push8(value->harq_id, ppWritePackedMsg, end) &&
- push16(value->pdu_length, ppWritePackedMsg, end) &&
- push8(value->ul_cqi, ppWritePackedMsg, end) &&
- push16(value->timing_advance, ppWritePackedMsg, end) &&
- push16(value->rssi, ppWritePackedMsg, end)
- ))
- return 0;
+ if(!(push32(value->handle, ppWritePackedMsg, end) &&
+ push16(value->rnti, ppWritePackedMsg, end) &&
+ push8(value->harq_id, ppWritePackedMsg, end) &&
+ push16(value->pdu_length, ppWritePackedMsg, end) &&
+ push8(value->ul_cqi, ppWritePackedMsg, end) &&
+ push16(value->timing_advance, ppWritePackedMsg, end) &&
+ push16(value->rssi, ppWritePackedMsg, end)
+ ))
+ return 0;
- if(pusharray8(value->pdu, value->pdu_length, value->pdu_length, ppWritePackedMsg, end) == 0)
- return 0;
+ if(pusharray8(value->pdu, value->pdu_length, value->pdu_length, ppWritePackedMsg, end) == 0)
+ return 0;
- return 1;
+ return 1;
}
static uint8_t pack_nr_rx_data_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
{
- nfapi_nr_rx_data_indication_t *pNfapiMsg = (nfapi_nr_rx_data_indication_t*)msg;
+ nfapi_nr_rx_data_indication_t *pNfapiMsg = (nfapi_nr_rx_data_indication_t*)msg;
- if (!(push16(pNfapiMsg->sfn , ppWritePackedMsg, end) &&
- push16(pNfapiMsg->slot , ppWritePackedMsg, end) &&
- push16(pNfapiMsg->number_of_pdus, ppWritePackedMsg, end)
- ))
- return 0;
+ if (!(push16(pNfapiMsg->sfn , ppWritePackedMsg, end) &&
+ push16(pNfapiMsg->slot , ppWritePackedMsg, end) &&
+ push16(pNfapiMsg->number_of_pdus, ppWritePackedMsg, end)
+ ))
+ return 0;
- for (int i = 0; i < pNfapiMsg->number_of_pdus; i++)
- {
- if(!pack_nr_rx_data_indication_body(&(pNfapiMsg->pdu_list[i]), ppWritePackedMsg, end))
- return 0;
- }
+ for (int i = 0; i < pNfapiMsg->number_of_pdus; i++)
+ {
+ if(!pack_nr_rx_data_indication_body(&(pNfapiMsg->pdu_list[i]), ppWritePackedMsg, end))
+ return 0;
+ }
- return 1;
+ return 1;
}
//NR CRC INDICATION
-static uint8_t pack_nr_crc_indication_body(nfapi_nr_crc_t* value, uint8_t **ppWritePackedMsg, uint8_t *end)
+static uint8_t pack_nr_crc_indication_body(nfapi_nr_crc_t *value, uint8_t **ppWritePackedMsg, uint8_t *end)
{
-
- if(!(push32(value->handle, ppWritePackedMsg, end) &&
- push16(value->rnti, ppWritePackedMsg, end) &&
- push8(value->harq_id, ppWritePackedMsg, end) &&
- push8(value->tb_crc_status, ppWritePackedMsg, end) &&
- push16(value->num_cb, ppWritePackedMsg, end) &&
- //pusharray8(value->cb_crc_status, (int)(value->num_cb / 8) + 1, (int)(value->num_cb / 8) + 1, ppWritePackedMsg, end) && //length is ceil(NumCb/8)
- push8(value->ul_cqi, ppWritePackedMsg, end) &&
- push16(value->timing_advance, ppWritePackedMsg, end) &&
- push16(value->rssi, ppWritePackedMsg, end)
- ))
- return 0;
-
- return 1;
+ if (!(push32(value->handle, ppWritePackedMsg, end) && push16(value->rnti, ppWritePackedMsg, end)
+ && push8(value->harq_id, ppWritePackedMsg, end) && push8(value->tb_crc_status, ppWritePackedMsg, end)
+ && push16(value->num_cb, ppWritePackedMsg, end))) {
+ return 0;
+ }
+ if (value->num_cb != 0) {
+ if (!pusharray8(value->cb_crc_status,
+ (int)(value->num_cb / 8) + 1,
+ (int)(value->num_cb / 8) + 1,
+ ppWritePackedMsg,
+ end)) { // length is ceil(NumCb/8)
+ return 0;
+ }
+ }
+ if (!(push8(value->ul_cqi, ppWritePackedMsg, end) && push16(value->timing_advance, ppWritePackedMsg, end)
+ && push16(value->rssi, ppWritePackedMsg, end))) {
+ return 0;
+ }
+ return 1;
}
static uint8_t pack_nr_crc_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
{
- nfapi_nr_crc_indication_t *pNfapiMsg = (nfapi_nr_crc_indication_t*)msg;
+ nfapi_nr_crc_indication_t *pNfapiMsg = (nfapi_nr_crc_indication_t*)msg;
- if (!(push16(pNfapiMsg->sfn , ppWritePackedMsg, end) &&
- push16(pNfapiMsg->slot , ppWritePackedMsg, end) &&
- push16(pNfapiMsg->number_crcs, ppWritePackedMsg, end)
- ))
- return 0;
+ if (!(push16(pNfapiMsg->sfn , ppWritePackedMsg, end) &&
+ push16(pNfapiMsg->slot , ppWritePackedMsg, end) &&
+ push16(pNfapiMsg->number_crcs, ppWritePackedMsg, end)
+ ))
+ return 0;
- for (int i = 0; i < pNfapiMsg->number_crcs; i++)
- {
- if(!pack_nr_crc_indication_body(&pNfapiMsg->crc_list[i], ppWritePackedMsg, end))
- return 0;
- }
+ for (int i = 0; i < pNfapiMsg->number_crcs; i++)
+ {
+ if(!pack_nr_crc_indication_body(&pNfapiMsg->crc_list[i], ppWritePackedMsg, end))
+ return 0;
+ }
-return 1;
+ return 1;
}
//SRS INDICATION
@@ -3287,7 +3421,7 @@ return 1;
//UCI INDICATION
static uint8_t pack_nr_uci_pucch_0_1(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
- nfapi_nr_uci_pucch_pdu_format_0_1_t* value = (nfapi_nr_uci_pucch_pdu_format_0_1_t*)tlv;
+ nfapi_nr_uci_pucch_pdu_format_0_1_t* value = (nfapi_nr_uci_pucch_pdu_format_0_1_t*)tlv;
if (!push8(value->pduBitmap, ppWritePackedMsg, end))
return 0;
@@ -3322,123 +3456,192 @@ static uint8_t pack_nr_uci_pucch_0_1(void* tlv, uint8_t **ppWritePackedMsg, uint
}
}
- return 1;
+ return 1;
}
static uint8_t pack_nr_uci_pucch_2_3_4(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
- nfapi_nr_uci_pucch_pdu_format_2_3_4_t* value = (nfapi_nr_uci_pucch_pdu_format_2_3_4_t*) tlv;
+ nfapi_nr_uci_pucch_pdu_format_2_3_4_t* value = (nfapi_nr_uci_pucch_pdu_format_2_3_4_t*) tlv;
- if (!push8(value->pduBitmap, ppWritePackedMsg, end))
- return 0;
- if (!push32(value->handle, ppWritePackedMsg, end))
- return 0;
- if (!push16(value->rnti, ppWritePackedMsg, end))
- return 0;
- if (!push8(value->pucch_format, ppWritePackedMsg, end))
- return 0;
- if (!push8(value->ul_cqi, ppWritePackedMsg, end))
- return 0;
- if (!push16(value->timing_advance, ppWritePackedMsg, end))
- return 0;
- if (!push16(value->rssi, ppWritePackedMsg, end))
- return 0;
+ if (!push8(value->pduBitmap, ppWritePackedMsg, end))
+ return 0;
+ if (!push32(value->handle, ppWritePackedMsg, end))
+ return 0;
+ if (!push16(value->rnti, ppWritePackedMsg, end))
+ return 0;
+ if (!push8(value->pucch_format-2, ppWritePackedMsg, end))
+ return 0;
+ if (!push8(value->ul_cqi, ppWritePackedMsg, end))
+ return 0;
+ if (!push16(value->timing_advance, ppWritePackedMsg, end))
+ return 0;
+ if (!push16(value->rssi, ppWritePackedMsg, end))
+ return 0;
- if (value->pduBitmap & 0x01) { //SR
- if (!push16(value->sr.sr_bit_len, ppWritePackedMsg, end))
- return 0;
- if (!pusharray8(value->sr.sr_payload,
- (int)((value->sr.sr_bit_len / 8) + 1),
- (int)((value->sr.sr_bit_len / 8) + 1),
- ppWritePackedMsg,
- end))
- return 0;
- }
+ if (value->pduBitmap & 0x01) { //SR
+ if (!push16(value->sr.sr_bit_len, ppWritePackedMsg, end))
+ return 0;
+ if (!pusharray8(value->sr.sr_payload,
+ (int)((value->sr.sr_bit_len / 8) + 1),
+ (int)((value->sr.sr_bit_len / 8) + 1),
+ ppWritePackedMsg,
+ end))
+ return 0;
+ }
- if ((value->pduBitmap >> 1) & 0x01) { //HARQ
- if (!push8(value->harq.harq_crc, ppWritePackedMsg, end))
- return 0;
- if (!push16(value->harq.harq_bit_len, ppWritePackedMsg, end))
- return 0;
- if (!pusharray8(value->harq.harq_payload,
- (int)((value->harq.harq_bit_len / 8) + 1),
- (int)((value->harq.harq_bit_len / 8) + 1),
- ppWritePackedMsg,
- end))
- return 0;
- }
+ if ((value->pduBitmap >> 1) & 0x01) { //HARQ
+ if (!push8(value->harq.harq_crc, ppWritePackedMsg, end))
+ return 0;
+ if (!push16(value->harq.harq_bit_len, ppWritePackedMsg, end))
+ return 0;
+ if (!pusharray8(value->harq.harq_payload,
+ (int)((value->harq.harq_bit_len / 8) + 1),
+ (int)((value->harq.harq_bit_len / 8) + 1),
+ ppWritePackedMsg,
+ end))
+ return 0;
+ }
- if ((value->pduBitmap >> 2) & 0x01) { //CSI-1
- if (!push8(value->csi_part1.csi_part1_crc, ppWritePackedMsg, end))
- return 0;
- if (!push16(value->csi_part1.csi_part1_bit_len, ppWritePackedMsg, end))
- return 0;
- if (!pusharray8(value->csi_part1.csi_part1_payload,
- (int)((value->csi_part1.csi_part1_bit_len / 8) + 1),
- (int)((value->csi_part1.csi_part1_bit_len / 8) + 1),
- ppWritePackedMsg,
- end))
- return 0;
- }
+ if ((value->pduBitmap >> 2) & 0x01) { //CSI-1
+ if (!push8(value->csi_part1.csi_part1_crc, ppWritePackedMsg, end))
+ return 0;
+ if (!push16(value->csi_part1.csi_part1_bit_len, ppWritePackedMsg, end))
+ return 0;
+ if (!pusharray8(value->csi_part1.csi_part1_payload,
+ (int)((value->csi_part1.csi_part1_bit_len / 8) + 1),
+ (int)((value->csi_part1.csi_part1_bit_len / 8) + 1),
+ ppWritePackedMsg,
+ end))
+ return 0;
+ }
- if ((value->pduBitmap >> 3) & 0x01) { //CSI-2
- if (!push8(value->csi_part2.csi_part2_crc, ppWritePackedMsg, end))
- return 0;
- if (!push16(value->csi_part2.csi_part2_bit_len, ppWritePackedMsg, end))
- return 0;
- if (!pusharray8(value->csi_part2.csi_part2_payload,
- (int)((value->csi_part2.csi_part2_bit_len / 8) + 1),
- (int)((value->csi_part2.csi_part2_bit_len / 8) + 1),
- ppWritePackedMsg,
- end))
- return 0;
- }
+ if ((value->pduBitmap >> 3) & 0x01) { //CSI-2
+ if (!push8(value->csi_part2.csi_part2_crc, ppWritePackedMsg, end))
+ return 0;
+ if (!push16(value->csi_part2.csi_part2_bit_len, ppWritePackedMsg, end))
+ return 0;
+ if (!pusharray8(value->csi_part2.csi_part2_payload,
+ (int)((value->csi_part2.csi_part2_bit_len / 8) + 1),
+ (int)((value->csi_part2.csi_part2_bit_len / 8) + 1),
+ ppWritePackedMsg,
+ end))
+ return 0;
+ }
- return 1;
+ return 1;
+}
+
+static uint8_t pack_nr_uci_pusch(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+ nfapi_nr_uci_pusch_pdu_t *value = (nfapi_nr_uci_pusch_pdu_t *)tlv;
+
+ if (!push8(value->pduBitmap, ppWritePackedMsg, end))
+ return 0;
+ if (!push32(value->handle, ppWritePackedMsg, end))
+ return 0;
+ if (!push16(value->rnti, ppWritePackedMsg, end))
+ return 0;
+ if (!push8(value->ul_cqi, ppWritePackedMsg, end))
+ return 0;
+ if (!push16(value->timing_advance, ppWritePackedMsg, end))
+ return 0;
+ if (!push16(value->rssi, ppWritePackedMsg, end))
+ return 0;
+
+ // Bit 0 not used in PUSCH PDU
+ if ((value->pduBitmap >> 1) & 0x01) { // HARQ
+ if (!push8(value->harq.harq_crc, ppWritePackedMsg, end))
+ return 0;
+ if (!push16(value->harq.harq_bit_len, ppWritePackedMsg, end))
+ return 0;
+
+ if (!pusharray8(value->harq.harq_payload,
+ (int)((value->harq.harq_bit_len / 8) + 1),
+ (int)((value->harq.harq_bit_len / 8) + 1),
+ ppWritePackedMsg,
+ end))
+ return 0;
+ }
+
+ if ((value->pduBitmap >> 2) & 0x01) { // CSI-1
+ if (!push8(value->csi_part1.csi_part1_crc, ppWritePackedMsg, end))
+ return 0;
+ if (!push16(value->csi_part1.csi_part1_bit_len, ppWritePackedMsg, end))
+ return 0;
+
+ if (!pusharray8(value->csi_part1.csi_part1_payload,
+ (int)((value->csi_part1.csi_part1_bit_len / 8) + 1),
+ (int)((value->csi_part1.csi_part1_bit_len / 8) + 1),
+ ppWritePackedMsg,
+ end))
+ return 0;
+ }
+
+ if ((value->pduBitmap >> 3) & 0x01) { // CSI-2
+ if (!push8(value->csi_part2.csi_part2_crc, ppWritePackedMsg, end))
+ return 0;
+ if (!push16(value->csi_part2.csi_part2_bit_len, ppWritePackedMsg, end))
+ return 0;
+
+ if (!pusharray8(value->csi_part2.csi_part2_payload,
+ (int)((value->csi_part2.csi_part2_bit_len / 8) + 1),
+ (int)((value->csi_part2.csi_part2_bit_len / 8) + 1),
+ ppWritePackedMsg,
+ end))
+ return 0;
+ }
+
+ return 1;
}
static uint8_t pack_nr_uci_indication_body(nfapi_nr_uci_t* value, uint8_t **ppWritePackedMsg, uint8_t *end)
{
- if (!push16(value->pdu_type, ppWritePackedMsg, end))
- return 0;
- if (!push16(value->pdu_size, ppWritePackedMsg, end))
- return 0;
+ if (!push16(value->pdu_type, ppWritePackedMsg, end))
+ return 0;
+ if (!push16(value->pdu_size, ppWritePackedMsg, end))
+ return 0;
- switch (value->pdu_type) {
- case NFAPI_NR_UCI_PUSCH_PDU_TYPE:
- NFAPI_TRACE(NFAPI_TRACE_WARN, "Unhandled NFAPI_NR_UCI_PUSCH_PDU_TYPE \n");
- break;
+ switch (value->pdu_type) {
+ case NFAPI_NR_UCI_PUSCH_PDU_TYPE:
+ if(!pack_nr_uci_pusch(&value->pusch_pdu, ppWritePackedMsg, end)){
+ return 0;
+ }
+ break;
- case NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE:
- pack_nr_uci_pucch_0_1(&value->pucch_pdu_format_0_1, ppWritePackedMsg, end);
- break;
+ case NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE:
+ if(!pack_nr_uci_pucch_0_1(&value->pucch_pdu_format_0_1, ppWritePackedMsg, end)){
+ return 0;
+ }
+ break;
- case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE:
- pack_nr_uci_pucch_2_3_4(&value->pucch_pdu_format_2_3_4, ppWritePackedMsg, end);
- break;
- }
+ case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE:
+ if(!pack_nr_uci_pucch_2_3_4(&value->pucch_pdu_format_2_3_4, ppWritePackedMsg, end)){
+ return 0;
+ }
+ break;
+ }
- return 1;
+ return 1;
}
static uint8_t pack_nr_uci_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
{
- nfapi_nr_uci_indication_t *pNfapiMsg = (nfapi_nr_uci_indication_t*)msg;
+ nfapi_nr_uci_indication_t *pNfapiMsg = (nfapi_nr_uci_indication_t*)msg;
- if (!push16(pNfapiMsg->sfn , ppWritePackedMsg, end))
- return 0;
- if (!push16(pNfapiMsg->slot , ppWritePackedMsg, end))
- return 0;
- if (!push16(pNfapiMsg->num_ucis, ppWritePackedMsg, end))
- return 0;
+ if (!push16(pNfapiMsg->sfn , ppWritePackedMsg, end))
+ return 0;
+ if (!push16(pNfapiMsg->slot , ppWritePackedMsg, end))
+ return 0;
+ if (!push16(pNfapiMsg->num_ucis, ppWritePackedMsg, end))
+ return 0;
- for (int i = 0; i < pNfapiMsg->num_ucis; i++)
- {
- if (!pack_nr_uci_indication_body(&pNfapiMsg->uci_list[i], ppWritePackedMsg, end))
- return 0;
+ for (int i = 0; i < pNfapiMsg->num_ucis; i++)
+ {
+ if (!pack_nr_uci_indication_body(&pNfapiMsg->uci_list[i], ppWritePackedMsg, end))
+ return 0;
- }
+ }
-return 1;
+ return 1;
}
@@ -3446,95 +3649,95 @@ return 1;
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];
+ nfapi_p7_message_header_t *pMessageHeader = pMessageBuf;
+ uint8_t *pWritePackedMessage = pPackedBuf;
+ uint8_t *pPackedLengthField = &pWritePackedMessage[4];
-if (pMessageBuf == NULL || pPackedBuf == NULL) {
+ if (pMessageBuf == NULL || pPackedBuf == NULL) {
NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack supplied pointers are null\n");
return -1;
-}
+ }
-uint8_t *end = (uint8_t *)pPackedBuf + packedBufLen;
+ uint8_t *end = (uint8_t *)pPackedBuf + packedBufLen;
-// 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))) {
+ // 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) {
+ 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) {
+ }
+ // 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;
+ 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;
+ 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;
+ 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;
+ result = pack_ul_dci_request(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
case NFAPI_UE_RELEASE_REQUEST:
- result = pack_nr_ue_release_request(pMessageHeader, &pWritePackedMessage, end, config);
- break;
+ result = pack_nr_ue_release_request(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
case NFAPI_UE_RELEASE_RESPONSE:
- result = pack_ue_release_response(pMessageHeader, &pWritePackedMessage, end, config);
- break;
+ result = pack_ue_release_response(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
case NFAPI_NR_PHY_MSG_TYPE_SLOT_INDICATION:
- result = pack_nr_slot_indication(pMessageHeader, &pWritePackedMessage, end, config);
- break;
+ result = pack_nr_slot_indication(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
case NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION:
- result = pack_nr_rx_data_indication(pMessageHeader, &pWritePackedMessage, end, config);
- break;
+ result = pack_nr_rx_data_indication(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
case NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION:
- result = pack_nr_crc_indication(pMessageHeader, &pWritePackedMessage, end, config);
- break;
+ result = pack_nr_crc_indication(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
case NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION:
- result = pack_nr_uci_indication(pMessageHeader, &pWritePackedMessage, end, config);
- break;
+ result = pack_nr_uci_indication(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
case NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION:
- result = pack_nr_srs_indication(pMessageHeader, &pWritePackedMessage, end, config);
- break;
+ result = pack_nr_srs_indication(pMessageHeader, &pWritePackedMessage, end, config);
+ break;
case NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION:
- result = pack_nr_rach_indication(pMessageHeader, &pWritePackedMessage, end, config);
- break;
+ result = pack_nr_rach_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;
+ 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;
+ 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;
+ 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 (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 {
@@ -3543,47 +3746,47 @@ switch (pMessageHeader->message_id) {
__FUNCTION__,
pMessageHeader->message_id);
}
- } else {
+ } else {
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
- }
+ }
} break;
-}
+ }
-if (result == 0) {
+ 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) {
+ // 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 {
+ } else {
packedMsgLen16 = (uint16_t)packedMsgLen;
-}
+ }
-// Update the message length in the header
-pMessageHeader->message_length = packedMsgLen16;
+ // Update the message length in the header
+ pMessageHeader->message_length = packedMsgLen16;
-if (!push16(packedMsgLen16, &pPackedLengthField, end))
+ if (!push16(packedMsgLen16, &pPackedLengthField, end))
return -1;
-if (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);
+ NFAPI_TRACE(NFAPI_TRACE_ERROR,
+ "nfapi packedMsgLen(%d) != message_length(%d) id %d\n",
+ packedMsgLen,
+ pMessageHeader->message_length,
+ pMessageHeader->message_id);
}
-}
+ }
-return (packedMsgLen);
+ return (packedMsgLen);
}
int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen, nfapi_p7_codec_config_t *config) {
@@ -3751,122 +3954,179 @@ int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBu
// Unpack routines
// NR:
-static uint8_t unpack_dl_tti_csi_rs_pdu_rel15_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+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(
- 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)
- );
+ uint16_t num_prgs = 0, prg_size = 0;
+ uint8_t dig_bf_interfaces = 0;
+ 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) &&
+ // Precoding and Beamforming hardcoded to 0
+ pull16(ppReadPackedMsg, &num_prgs, end) && pull16(ppReadPackedMsg, &prg_size, end)
+ && pull8(ppReadPackedMsg, &dig_bf_interfaces, 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;
-static uint8_t unpack_dl_tti_pdcch_pdu_rel15_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+ if (!(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))) {
+ return 0;
+ }
- 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, value->dci_pdu[i].PayloadSizeBits, 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));
+ for (uint16_t i = 0; i < value->numDlDci; ++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)
+ && pull16(ppReadPackedMsg, &value->dci_pdu[i].precodingAndBeamforming.num_prgs, end)
+ && pull16(ppReadPackedMsg, &value->dci_pdu[i].precodingAndBeamforming.prg_size, end)
+ && pull8(ppReadPackedMsg, &value->dci_pdu[i].precodingAndBeamforming.dig_bf_interfaces, end))) {
+ return 0;
+ }
+ for (int prg = 0; prg < value->dci_pdu[i].precodingAndBeamforming.num_prgs; prg++) {
+ if (!pull16(ppReadPackedMsg, &value->dci_pdu[i].precodingAndBeamforming.prgs_list[prg].pm_idx, end)) {
+ return 0;
+ }
+ for (int digInt = 0; digInt < value->dci_pdu[i].precodingAndBeamforming.dig_bf_interfaces; digInt++) {
+ if (!pull16(ppReadPackedMsg,
+ &value->dci_pdu[i].precodingAndBeamforming.prgs_list[prg].dig_bf_interface_list[digInt].beam_idx,
+ end)) {
+ return 0;
+ }
+ }
+ }
+ if (!(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)
+ && unpack_dci_payload(value->dci_pdu[i].Payload, value->dci_pdu[i].PayloadSizeBits, ppReadPackedMsg, end))) {
+ return 0;
+ }
+ }
+ // TODO: resolve the packaging of array (currently sending a single element)
+ return 1;
}
-
-
-static uint8_t unpack_dl_tti_pdsch_pdu_rel15_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *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)
- );
+ uint8_t powerControlOffset = 0, powerControlOffsetSS = 0;
+
+ if (!(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))) {
+ return 0;
+ }
+ for (int i = 0; i < value->NrOfCodewords; ++i) {
+ if (!(pull16(ppReadPackedMsg, &value->targetCodeRate[i], end) && pull8(ppReadPackedMsg, &value->qamModOrder[i], end)
+ && pull8(ppReadPackedMsg, &value->mcsIndex[i], end) && pull8(ppReadPackedMsg, &value->mcsTable[i], end)
+ && pull8(ppReadPackedMsg, &value->rvIndex[i], end) && pull32(ppReadPackedMsg, &value->TBSize[i], end))) {
+ return 0;
+ }
+ }
+
+ if (!(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) && pullarray8(ppReadPackedMsg, &value->rbBitmap[0], 36, 36, 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))) {
+ return 0;
+ }
+ // Check pduBitMap bit 1 to pull PTRS parameters or not
+ if (value->pduBitmap & 0b1) {
+ if (!(pull8(ppReadPackedMsg, &value->PTRSPortIndex, end) && pull8(ppReadPackedMsg, &value->PTRSTimeDensity, end)
+ && pull8(ppReadPackedMsg, &value->PTRSFreqDensity, end) && pull8(ppReadPackedMsg, &value->PTRSReOffset, end)
+ && pull8(ppReadPackedMsg, &value->nEpreRatioOfPDSCHToPTRS, end))) {
+ return 0;
+ }
+ }
+
+ if (!(pull16(ppReadPackedMsg, &value->precodingAndBeamforming.num_prgs, end)
+ && pull16(ppReadPackedMsg, &value->precodingAndBeamforming.prg_size, end)
+ && pull8(ppReadPackedMsg, &value->precodingAndBeamforming.dig_bf_interfaces, end))) {
+ return 0;
+ }
+
+ for (int i = 0; i < value->precodingAndBeamforming.num_prgs; ++i) {
+ if (!pull16(ppReadPackedMsg, &value->precodingAndBeamforming.prgs_list[i].pm_idx, end)) {
+ return 0;
+ }
+ for (int k = 0; k < value->precodingAndBeamforming.dig_bf_interfaces; ++k) {
+ if (!pull16(ppReadPackedMsg, &value->precodingAndBeamforming.prgs_list[i].dig_bf_interface_list[k].beam_idx, end)) {
+ return 0;
+ }
+ }
+ }
+ // TODO Add TX power info
+ // Hardcoded values that represent 0db
+
+ if (!(pull8(ppReadPackedMsg, &powerControlOffset, end) && // powerControlOffset
+ pull8(ppReadPackedMsg, &powerControlOffsetSS, end))) { // powerControlOffsetSS
+ return 0;
+ }
+ // TODO Add CBG Fields
+ return 1;
}
-
-static uint8_t unpack_dl_tti_ssb_pdu_rel15_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+static uint8_t unpack_dl_tti_ssb_pdu_rel15_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+ NFAPI_TRACE(NFAPI_TRACE_DEBUG, "Unpacking ssb. \n");
+ uint8_t byte3, byte2, byte1, byte0;
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) &&
- pull8(ppReadPackedMsg, &value->ssbRsrp, end)
- // TODO: pack precoding_and_beamforming too
- );
-}
+ if (!(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)
+ && pull8(ppReadPackedMsg, &byte3, end) && pull8(ppReadPackedMsg, &byte2, end) && pull8(ppReadPackedMsg, &byte1, end)
+ && pull8(ppReadPackedMsg, &byte0, end))) { // this should be always 0, bchpayload is 24 bits
+ return 0;
+ }
+ // rebuild the bchpayload
+ value->bchPayload = byte3;
+ value->bchPayload = value->bchPayload << 8;
+ value->bchPayload |= byte2;
+ value->bchPayload = value->bchPayload << 8;
+ value->bchPayload |= byte1;
+ // TODO add Tx Power Info
+ if (!(pull8(ppReadPackedMsg, &byte1, end) && pull8(ppReadPackedMsg, &byte0, end)
+ && pull16(ppReadPackedMsg, &value->precoding_and_beamforming.num_prgs, end)
+ && pull16(ppReadPackedMsg, &value->precoding_and_beamforming.prg_size, end)
+ && pull8(ppReadPackedMsg, &value->precoding_and_beamforming.dig_bf_interfaces, end))) {
+ return 0;
+ }
+
+ for (int i = 0; i < value->precoding_and_beamforming.num_prgs; ++i) {
+ if (!pull16(ppReadPackedMsg, &value->precoding_and_beamforming.prgs_list[i].pm_idx, end)) {
+ return 0;
+ }
+ for (int k = 0; k < value->precoding_and_beamforming.dig_bf_interfaces; ++k) {
+ if (!pull16(ppReadPackedMsg, &value->precoding_and_beamforming.prgs_list[i].dig_bf_interface_list[k].beam_idx, end)) {
+ return 0;
+ }
+ }
+ }
+ return 1;
+}
// LTE:
static uint8_t unpack_dl_config_dci_dl_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
@@ -4260,8 +4520,8 @@ static uint8_t unpack_dl_config_ndlsch_pdu_rel13_value(void *tlv, uint8_t **ppRe
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) ))
+ if(!(pull16(ppReadPackedMsg, &value->PDUType, end) &&
+ pull16(ppReadPackedMsg, (uint16_t *) &value->PDUSize, end)))
return 0;
// first match the pdu type, then call the respective function
@@ -4470,189 +4730,180 @@ static uint8_t unpack_dl_config_request_body_value(void *tlv, uint8_t **ppReadPa
return 1;
}
-
-static uint8_t unpack_dl_tti_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+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)
- ))
+ if (!(pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end) && pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end)
+ && pull8(ppReadPackedMsg, &pNfapiMsg->dl_tti_request_body.nPDUs, end)
+ && pull8(ppReadPackedMsg, &pNfapiMsg->dl_tti_request_body.nGroup, end))) {
return 0;
+ }
+ for (int i = 0; i < pNfapiMsg->dl_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;
+ }
int arr[12];
-
- for(int i=0; idl_tti_request_body.nGroup; i++) {
- for(int j=0; jdl_tti_request_body.nUe[i]; j++) {
+ if (!pullarray8(ppReadPackedMsg, pNfapiMsg->dl_tti_request_body.nUe, 256, pNfapiMsg->dl_tti_request_body.nGroup, end)) {
+ return 0;
+ }
+ for (int i = 0; i < pNfapiMsg->dl_tti_request_body.nGroup; i++) {
+ for (int j = 0; j < pNfapiMsg->dl_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]))
+ if (!(pullarrays32(ppReadPackedMsg, arr, 12, pNfapiMsg->dl_tti_request_body.nUe[i], end)))
return 0;
}
return 1;
}
-
-static uint8_t unpack_ul_tti_request_prach_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+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
- );
+
+ if (!(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))) {
+ return 0;
+ }
+ // TODO: ignoring beamforming tlv for now
+ if (prach_pdu->beamforming.prgs_list == NULL) {
+ prach_pdu->beamforming.prgs_list = calloc(prach_pdu->beamforming.num_prgs, sizeof(*prach_pdu->beamforming.prgs_list));
+ }
+ if (prach_pdu->beamforming.prgs_list[0].dig_bf_interface_list == NULL) {
+ prach_pdu->beamforming.prgs_list[0].dig_bf_interface_list =
+ calloc(prach_pdu->beamforming.dig_bf_interface, sizeof(*prach_pdu->beamforming.prgs_list[0].dig_bf_interface_list));
+ }
+ // Pack RX Beamforming PDU
+ if (!(pull16(ppReadPackedMsg, &prach_pdu->beamforming.num_prgs, end)
+ && pull16(ppReadPackedMsg, &prach_pdu->beamforming.prg_size, end)
+ && pull8(ppReadPackedMsg, &prach_pdu->beamforming.dig_bf_interface, end))) {
+ return 0;
+ }
+ for (int prg = 0; prg < prach_pdu->beamforming.num_prgs; prg++) {
+ for (int digBFInterface = 0; digBFInterface < prach_pdu->beamforming.dig_bf_interface; digBFInterface++) {
+ if (!pull16(ppReadPackedMsg, &prach_pdu->beamforming.prgs_list[prg].dig_bf_interface_list[digBFInterface].beam_idx, end)) {
+ return 0;
+ }
+ }
+ }
+
+ return 1;
}
-
-static uint8_t unpack_ul_tti_request_pucch_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+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) &&
- pull8(ppReadPackedMsg, &pucch_pdu->pi_2bpsk, 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)
+ uint16_t dummy16 = 0;
+ uint8_t dummy8 = 0;
+ 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) && pull8(ppReadPackedMsg, &pucch_pdu->pi_2bpsk, 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
- );
+ pull16(ppReadPackedMsg, &dummy16, end) && pull16(ppReadPackedMsg, &dummy16, end) && pull8(ppReadPackedMsg, &dummy8, end));
}
-
-static uint8_t unpack_ul_tti_request_pusch_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+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)
+ 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) {
+ // 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;
+ if (!(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))) {
+ return 0;
+ }
+ } 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;
+ if (!(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))) {
+ return 0;
+ }
+ } 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;
+ if (!(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))) {
+ return 0;
+ }
+ } 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;
+ if (!(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))) {
+ return 0;
+ }
+ } break;
default: {
- NFAPI_TRACE(NFAPI_TRACE_INFO, "Invalid pdu bitmap %d \n", pusch_pdu->pdu_bit_map );
+ NFAPI_TRACE(NFAPI_TRACE_INFO, "Invalid pdu bitmap %d \n", pusch_pdu->pdu_bit_map);
}
}
+ uint16_t dummy16 = 0;
+ uint8_t dummy8 = 0;
+ if (!(pull16(ppReadPackedMsg, &dummy16, end) && pull16(ppReadPackedMsg, &dummy16, end) && pull8(ppReadPackedMsg, &dummy8, end))) {
+ return 0;
+ }
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(
@@ -4687,8 +4938,8 @@ static uint8_t unpack_ul_tti_request_srs_pdu(void *tlv, uint8_t **ppReadPackedMs
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) ))
+ if(!(pull16(ppReadPackedMsg, &pNfapiMsg->pdu_type, end) &&
+ pull16(ppReadPackedMsg, &pNfapiMsg->pdu_size, end) ))
return 0;
// first natch the pdu type, then call the respective function
@@ -4741,8 +4992,8 @@ static uint8_t unpack_ul_tti_groups_list_value(uint8_t **ppReadPackedMsg, uint8_
return 1;
}
-
-static uint8_t unpack_ul_tti_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+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))
@@ -4751,21 +5002,20 @@ static uint8_t unpack_ul_tti_request(uint8_t **ppReadPackedMsg, uint8_t *end, vo
return 0;
if (!pull8(ppReadPackedMsg, &pNfapiMsg->n_pdus, end))
return 0;
- if (!pull8(ppReadPackedMsg, &pNfapiMsg->n_group, end))
- return 0;
if (!pull8(ppReadPackedMsg, &pNfapiMsg->rach_present, end))
return 0;
if (!pull8(ppReadPackedMsg, &pNfapiMsg->n_ulcch, end))
return 0;
if (!pull8(ppReadPackedMsg, &pNfapiMsg->n_ulsch, end))
return 0;
-
- for(int i=0; i< pNfapiMsg->n_pdus; i++) {
+ if (!pull8(ppReadPackedMsg, &pNfapiMsg->n_group, 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++) {
+ for (int i = 0; i < pNfapiMsg->n_group; i++) {
if (!unpack_ul_tti_groups_list_value(ppReadPackedMsg, end, &pNfapiMsg->groups_list[i]))
return 0;
}
@@ -4773,8 +5023,6 @@ static uint8_t unpack_ul_tti_request(uint8_t **ppReadPackedMsg, uint8_t *end, vo
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[] = {
@@ -5557,43 +5805,66 @@ static uint8_t unpack_hi_dci0_request_body_value(void *tlv, uint8_t **ppReadPack
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) &&
+ nfapi_nr_ul_dci_request_pdus_t *value = (nfapi_nr_ul_dci_request_pdus_t *)msg;
- 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) &&
+ if (!(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))) {
+ return 0;
+ }
- 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, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, 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));
+ for (uint16_t i = 0; i < value->pdcch_pdu.pdcch_pdu_rel15.numDlDci; ++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)
+ && pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].precodingAndBeamforming.num_prgs, end)
+ && pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].precodingAndBeamforming.prg_size, end)
+ && pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].precodingAndBeamforming.dig_bf_interfaces, end))) {
+ return 0;
+ }
+ for (int prg = 0; prg < value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].precodingAndBeamforming.num_prgs; prg++) {
+ if (!pull16(ppReadPackedMsg,
+ &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].precodingAndBeamforming.prgs_list[prg].pm_idx,
+ end)) {
+ return 0;
+ }
+ for (int digInt = 0; digInt < value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].precodingAndBeamforming.dig_bf_interfaces;
+ digInt++) {
+ if (!pull16(ppReadPackedMsg,
+ &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i]
+ .precodingAndBeamforming.prgs_list[prg]
+ .dig_bf_interface_list[digInt]
+ .beam_idx,
+ end)) {
+ return 0;
+ }
+ }
+ }
+ if (!(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)
+ && unpack_dci_payload(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].Payload,
+ value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits,
+ ppReadPackedMsg,
+ end))) {
+ return 0;
+ }
+ }
+ return 1;
}
static uint8_t unpack_ul_dci_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
@@ -5624,25 +5895,25 @@ static uint8_t unpack_hi_dci0_request(uint8_t **ppReadPackedMsg, uint8_t *end, v
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) &&
+ if(!(pull16(ppReadPackedMsg, &pNfapiMsg->PDU_length, end) &&
pull16(ppReadPackedMsg, &pNfapiMsg->PDU_index, end) &&
- pull16(ppReadPackedMsg, &pNfapiMsg->PDU_length, end)
- ))
+ pull32(ppReadPackedMsg, &pNfapiMsg->num_TLV, 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)))
+ if (!(pull16(ppReadPackedMsg, &pNfapiMsg->TLVs[i].tag, end) &&
+ pull16(ppReadPackedMsg, &pNfapiMsg->TLVs[i].length, end)))
return 0;
switch(pNfapiMsg->TLVs[i].tag) {
case 0: {
if (!pullarray32(ppReadPackedMsg, pNfapiMsg->TLVs[i].value.direct,
- sizeof(pNfapiMsg->TLVs[i].value.direct) / sizeof(uint32_t),
- pNfapiMsg->TLVs[i].length / sizeof(uint32_t), end))
+ sizeof(pNfapiMsg->TLVs[i].value.direct) / sizeof(uint32_t),
+ (pNfapiMsg->TLVs[i].length+3)/4, end))
return 0;
break;
@@ -5650,8 +5921,8 @@ static uint8_t unpack_tx_data_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t
case 1: {
if (!pullarray32(ppReadPackedMsg,pNfapiMsg->TLVs[i].value.ptr,
- pNfapiMsg->TLVs[i].length / sizeof(uint32_t),
- pNfapiMsg->TLVs[i].length / sizeof(uint32_t), end))
+ pNfapiMsg->TLVs[i].length,
+ pNfapiMsg->TLVs[i].length, end))
return 0;
break;
@@ -5667,17 +5938,25 @@ static uint8_t unpack_tx_data_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t
return 1;
}
-static uint8_t unpack_tx_data_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+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)))
+ 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]))
+ for (int i = 0; i < pNfapiMsg->Number_of_PDUs; i++) {
+ if (!unpack_tx_data_pdu_list_value(ppReadPackedMsg, end, &pNfapiMsg->pdu_list[i])) {
+ printf("%s():%d. Error packing TX_DATA.request PDU #%d, PDU length = %d PDU IDX = %d\n",
+ __FUNCTION__,
+ __LINE__,
+ i,
+ pNfapiMsg->pdu_list[i].PDU_length,
+ pNfapiMsg->pdu_list[i].PDU_index);
+
return 0;
+ }
}
return 1;
@@ -5787,101 +6066,102 @@ static uint8_t unpack_nr_slot_indication(uint8_t **ppReadPackedMsg, uint8_t *end
return 1;
}
-//RX DATA INDICATION
+//RX DATA INDICATION
-static uint8_t unpack_nr_rx_data_indication_body(nfapi_nr_rx_data_pdu_t* value,
+static uint8_t unpack_nr_rx_data_indication_body(nfapi_nr_rx_data_pdu_t *value,
uint8_t **ppReadPackedMsg,
uint8_t *end,
- nfapi_p7_codec_config_t* config)
+ nfapi_p7_codec_config_t *config)
{
- if(!(pull32(ppReadPackedMsg, &value->handle, end) &&
- pull16(ppReadPackedMsg, &value->rnti, end) &&
- pull8(ppReadPackedMsg, &value->harq_id, end) &&
- pull16(ppReadPackedMsg, &value->pdu_length, end) &&
- pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
- pull16(ppReadPackedMsg, &value->timing_advance, end) &&
- pull16(ppReadPackedMsg, &value->rssi, end)
- ))
- return 0;
+if (!(pull32(ppReadPackedMsg, &value->handle, end) && pull16(ppReadPackedMsg, &value->rnti, end)
+ && pull8(ppReadPackedMsg, &value->harq_id, end) && pull16(ppReadPackedMsg, &value->pdu_length, end)
+ && pull8(ppReadPackedMsg, &value->ul_cqi, end) && pull16(ppReadPackedMsg, &value->timing_advance, end)
+ && pull16(ppReadPackedMsg, &value->rssi, end)))
+ return 0;
- uint16_t length = value->pdu_length;
- value->pdu = nfapi_p7_allocate(sizeof(*value->pdu) * length, config);
-
- if (pullarray8(ppReadPackedMsg, value->pdu, length, length, end) == 0)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s pullarray8 failure\n", __FUNCTION__);
- return 0;
- }
- return 1;
+uint32_t length = value->pdu_length;
+value->pdu = nfapi_p7_allocate(sizeof(*value->pdu) * length, config);
+if (pullarray8(ppReadPackedMsg, value->pdu, length, length, end) == 0) {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s pullarray8 failure\n", __FUNCTION__);
+ return 0;
+}
+return 1;
}
-
static uint8_t unpack_nr_rx_data_indication(uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_nr_rx_data_indication_t *msg, nfapi_p7_codec_config_t* config)
{
- nfapi_nr_rx_data_indication_t *pNfapiMsg = (nfapi_nr_rx_data_indication_t*)msg;
+ nfapi_nr_rx_data_indication_t *pNfapiMsg = (nfapi_nr_rx_data_indication_t*)msg;
- if (!(pull16(ppReadPackedMsg, &pNfapiMsg->sfn , end) &&
- pull16(ppReadPackedMsg, &pNfapiMsg->slot , end) &&
- pull16(ppReadPackedMsg, &pNfapiMsg->number_of_pdus, end)
- ))
- return 0;
- if (pNfapiMsg->number_of_pdus > 0)
- {
- pNfapiMsg->pdu_list = nfapi_p7_allocate(sizeof(*pNfapiMsg->pdu_list) * pNfapiMsg->number_of_pdus, config);
- }
+ 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_nr_rx_data_indication_body(&pNfapiMsg->pdu_list[i], ppReadPackedMsg, end, config))
- return 0;
- }
+ if (pNfapiMsg->number_of_pdus > 0)
+ {
+ pNfapiMsg->pdu_list = nfapi_p7_allocate(sizeof(*pNfapiMsg->pdu_list) * pNfapiMsg->number_of_pdus, config);
+ }
-return 1;
+ for (int i = 0; i < pNfapiMsg->number_of_pdus; i++)
+ {
+ if(!unpack_nr_rx_data_indication_body(&pNfapiMsg->pdu_list[i], ppReadPackedMsg, end, config))
+ return 0;
+ }
+
+ return 1;
}
//NR CRC INDICATION
-static uint8_t unpack_nr_crc_indication_body(nfapi_nr_crc_t* value, uint8_t **ppReadPackedMsg, uint8_t *end)
+static uint8_t unpack_nr_crc_indication_body(nfapi_nr_crc_t *value, uint8_t **ppReadPackedMsg, uint8_t *end)
{
- if(!(pull32(ppReadPackedMsg, &value->handle, end) &&
- pull16(ppReadPackedMsg, &value->rnti, end) &&
- pull8(ppReadPackedMsg, &value->harq_id, end) &&
- pull8(ppReadPackedMsg, &value->tb_crc_status, end) &&
- pull16(ppReadPackedMsg, &value->num_cb, end) &&
- //pullarray8(ppReadPackedMsg, value->cb_crc_status, (int)(value->num_cb / 8) + 1, (int)(value->num_cb / 8) + 1, end) && //length is ceil(NumCb/8)
- pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
- pull16(ppReadPackedMsg, &value->timing_advance, end) &&
- pull16(ppReadPackedMsg, &value->rssi, end)
- ))
- return 0;
+ if (!(pull32(ppReadPackedMsg, &value->handle, end) && pull16(ppReadPackedMsg, &value->rnti, end)
+ && pull8(ppReadPackedMsg, &value->harq_id, end) && pull8(ppReadPackedMsg, &value->tb_crc_status, end)
+ && pull16(ppReadPackedMsg, &value->num_cb, end))) {
+ return 0;
+ }
+ if (value->num_cb != 0) {
+ if (!pullarray8(ppReadPackedMsg,
+ value->cb_crc_status,
+ (int)(value->num_cb / 8) + 1,
+ (int)(value->num_cb / 8) + 1,
+ end)) { // length is ceil(NumCb/8)
+ return 0;
+ }
+ }
+ if (!(pull8(ppReadPackedMsg, &value->ul_cqi, end) && pull16(ppReadPackedMsg, &value->timing_advance, end)
+ && pull16(ppReadPackedMsg, &value->rssi, end))) {
+ return 0;
+ }
- //memcpy((nfapi_nr_crc_t *)tlv,value,sizeof(nfapi_nr_crc_t));
+ // memcpy((nfapi_nr_crc_t *)tlv,value,sizeof(nfapi_nr_crc_t));
- return 1;
+ return 1;
}
static uint8_t unpack_nr_crc_indication(uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_nr_crc_indication_t *msg, nfapi_p7_codec_config_t* config)
{
- nfapi_nr_crc_indication_t *pNfapiMsg = (nfapi_nr_crc_indication_t*)msg;
+ nfapi_nr_crc_indication_t *pNfapiMsg = (nfapi_nr_crc_indication_t*)msg;
- if (!(pull16(ppReadPackedMsg, &pNfapiMsg->sfn , end) &&
- pull16(ppReadPackedMsg, &pNfapiMsg->slot , end) &&
- pull16(ppReadPackedMsg, &pNfapiMsg->number_crcs, end)
- ))
- return 0;
+ if (!(pull16(ppReadPackedMsg, &pNfapiMsg->sfn , end) &&
+ pull16(ppReadPackedMsg, &pNfapiMsg->slot , end) &&
+ pull16(ppReadPackedMsg, &pNfapiMsg->number_crcs, end)
+ ))
+ return 0;
- if (pNfapiMsg->number_crcs > 0)
- {
- pNfapiMsg->crc_list = nfapi_p7_allocate(sizeof(*pNfapiMsg->crc_list) * pNfapiMsg->number_crcs, config);
- }
+ if (pNfapiMsg->number_crcs > 0)
+ {
+ pNfapiMsg->crc_list = nfapi_p7_allocate(sizeof(*pNfapiMsg->crc_list) * pNfapiMsg->number_crcs, config);
+ }
- for (int i = 0; i < pNfapiMsg->number_crcs; i++)
- {
- if(!unpack_nr_crc_indication_body(&pNfapiMsg->crc_list[i], ppReadPackedMsg, end))
- return 0;
- }
+ for (int i = 0; i < pNfapiMsg->number_crcs; i++)
+ {
+ if(!unpack_nr_crc_indication_body(&pNfapiMsg->crc_list[i], ppReadPackedMsg, end))
+ return 0;
+ }
-return 1;
+ return 1;
}
//SRS INDICATION
@@ -6009,100 +6289,86 @@ static uint8_t unpack_nr_srs_indication(uint8_t **ppReadPackedMsg, uint8_t *end,
//NR RACH
-static uint8_t unpack_nr_rach_indication_body(nfapi_nr_prach_indication_pdu_t* value,
+static uint8_t unpack_nr_rach_indication_body(nfapi_nr_prach_indication_pdu_t *value,
uint8_t **ppReadPackedMsg,
uint8_t *end,
- nfapi_p7_codec_config_t* config)
+ nfapi_p7_codec_config_t *config)
{
+ if (!(pull16(ppReadPackedMsg, &value->phy_cell_id, end) && pull8(ppReadPackedMsg, &value->symbol_index, end)
+ && pull8(ppReadPackedMsg, &value->slot_index, end) && pull8(ppReadPackedMsg, &value->freq_index, end)
+ && pull8(ppReadPackedMsg, &value->avg_rssi, end) && pull8(ppReadPackedMsg, &value->avg_snr, end)
+ && pull8(ppReadPackedMsg, &value->num_preamble, end))) {
+ return 0;
+ }
- if(!(pull16(ppReadPackedMsg, &value->phy_cell_id, end) &&
- pull8(ppReadPackedMsg, &value->symbol_index, end) &&
- pull8(ppReadPackedMsg, &value->slot_index, end) &&
- pull8(ppReadPackedMsg, &value->freq_index, end) &&
- pull8(ppReadPackedMsg, &value->avg_rssi, end) &&
- pull8(ppReadPackedMsg, &value->avg_snr, end) &&
- pull8(ppReadPackedMsg, &value->num_preamble, end)
- ))
- return 0;
-
- if (value->num_preamble > 0) {
- value->preamble_list = nfapi_p7_allocate(sizeof(*value->preamble_list) * value->num_preamble, config);
- for(int i = 0; i < value->num_preamble; i++)
- {
- if(!(pull8(ppReadPackedMsg, &value->preamble_list[i].preamble_index, end) &&
- pull16(ppReadPackedMsg, &value->preamble_list[i].timing_advance, end) &&
- pull32(ppReadPackedMsg, &value->preamble_list[i].preamble_pwr, end)
- ))
- return 0;
- }
- }
- return 1;
+ if (value->num_preamble > 0) {
+ value->preamble_list = nfapi_p7_allocate(sizeof(*value->preamble_list) * value->num_preamble, config);
+ for (int i = 0; i < value->num_preamble; i++) {
+ nfapi_nr_prach_indication_preamble_t *preamble = &(value->preamble_list[i]);
+ if (!(pull8(ppReadPackedMsg, &preamble->preamble_index, end) && pull16(ppReadPackedMsg, &preamble->timing_advance, end)
+ && pull32(ppReadPackedMsg, &preamble->preamble_pwr, end))) {
+ return 0;
+ }
+ }
+ }
+ return 1;
}
-static uint8_t unpack_nr_rach_indication(uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_nr_rach_indication_t* msg, nfapi_p7_codec_config_t* config) {
+static uint8_t unpack_nr_rach_indication(uint8_t **ppReadPackedMsg,
+ uint8_t *end,
+ nfapi_nr_rach_indication_t *msg,
+ nfapi_p7_codec_config_t *config)
+{
+ nfapi_nr_rach_indication_t *pNfapiMsg = (nfapi_nr_rach_indication_t *)msg;
- nfapi_nr_rach_indication_t *pNfapiMsg = (nfapi_nr_rach_indication_t*)msg;
- if (!(pull16(ppReadPackedMsg, &pNfapiMsg->sfn , end) &&
- pull16(ppReadPackedMsg, &pNfapiMsg->slot , end) &&
- pull8(ppReadPackedMsg, &pNfapiMsg->number_of_pdus, end)
- ))
- return 0;
+ if (!(pull16(ppReadPackedMsg, &pNfapiMsg->sfn, end) && pull16(ppReadPackedMsg, &pNfapiMsg->slot, end)
+ && pull8(ppReadPackedMsg, &pNfapiMsg->number_of_pdus, end))) {
+ return 0;
+ }
- if (pNfapiMsg->number_of_pdus > 0) {
- pNfapiMsg->pdu_list = nfapi_p7_allocate(sizeof(*pNfapiMsg->pdu_list) * pNfapiMsg->number_of_pdus, config);
- for(int i = 0; i < pNfapiMsg->number_of_pdus; i++)
- {
- if(!unpack_nr_rach_indication_body(&pNfapiMsg->pdu_list[i], ppReadPackedMsg, end, config))
- return 0;
- }
- }
- return 1;
+ if (pNfapiMsg->number_of_pdus > 0) {
+ pNfapiMsg->pdu_list = nfapi_p7_allocate(sizeof(*pNfapiMsg->pdu_list) * pNfapiMsg->number_of_pdus, config);
+ for (int i = 0; i < pNfapiMsg->number_of_pdus; i++) {
+ if (!unpack_nr_rach_indication_body(&(pNfapiMsg->pdu_list[i]), ppReadPackedMsg, end, config))
+ return 0;
+ }
+ }
+ return 1;
}
-//NR UCI
+//NR UCI
static uint8_t unpack_nr_uci_pucch_0_1(nfapi_nr_uci_pucch_pdu_format_0_1_t *value,
uint8_t **ppReadPackedMsg,
uint8_t *end,
- nfapi_p7_codec_config_t *config) {
+ nfapi_p7_codec_config_t *config)
+{
+ if (!(pull8(ppReadPackedMsg, &value->pduBitmap, end) && pull32(ppReadPackedMsg, &value->handle, end)
+ && pull16(ppReadPackedMsg, &value->rnti, end) && pull8(ppReadPackedMsg, &value->pucch_format, end)
+ && pull8(ppReadPackedMsg, &value->ul_cqi, end) && pull16(ppReadPackedMsg, &value->timing_advance, end)
+ && pull16(ppReadPackedMsg, &value->rssi, end)))
+ return 0;
+ if (value->pduBitmap & 0x01) { // SR
+ if (!(pull8(ppReadPackedMsg, &value->sr.sr_indication, end) && pull8(ppReadPackedMsg, &value->sr.sr_confidence_level, end)))
+ return 0;
+ }
- if (!(pull8(ppReadPackedMsg, &value->pduBitmap, end) &&
- pull32(ppReadPackedMsg, &value->handle, end) &&
- pull16(ppReadPackedMsg, &value->rnti, end) &&
- pull8(ppReadPackedMsg, &value->pucch_format, end) &&
- pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
- pull16(ppReadPackedMsg, &value->timing_advance, end) &&
- pull16(ppReadPackedMsg, &value->rssi, end)
- ))
- return 0;
- if (value->pduBitmap & 0x01) { //SR
- if(!(pull8(ppReadPackedMsg, &value->sr.sr_indication, end) &&
- pull8(ppReadPackedMsg, &value->sr.sr_confidence_level, end)
- ))
- return 0;
- }
+ if (((value->pduBitmap >> 1) & 0x01)) { // HARQ
- if (((value->pduBitmap >> 1) & 0x01)) { //HARQ
+ if (!(pull8(ppReadPackedMsg, &value->harq.num_harq, end) && pull8(ppReadPackedMsg, &value->harq.harq_confidence_level, end)))
+ return 0;
+ if (value->harq.num_harq > 0) {
+ for (int i = 0; i < value->harq.num_harq; i++) {
+ if (!pull8(ppReadPackedMsg, &value->harq.harq_list[i].harq_value, end)) {
+ return 0;
+ }
+ }
+ }
+ }
-
- if (!(pull8(ppReadPackedMsg, &value->harq.num_harq, end) &&
- pull8(ppReadPackedMsg, &value->harq.harq_confidence_level, end)
- ))
- return 0;
- if (value->harq.num_harq > 0) {
-
- for (int i = 0; i < value->harq.num_harq; i++) {
- if (!pull8(ppReadPackedMsg, &value->harq.harq_list[i].harq_value, end)) {
- return 0;
- }
- }
- }
- }
-
- return 1;
+ return 1;
}
-
static uint8_t unpack_nr_uci_pucch_2_3_4(nfapi_nr_uci_pucch_pdu_format_2_3_4_t* value,
uint8_t **ppReadPackedMsg,
uint8_t *end,
@@ -6123,6 +6389,7 @@ static uint8_t unpack_nr_uci_pucch_2_3_4(nfapi_nr_uci_pucch_pdu_format_2_3_4_t*
if (!pull16(ppReadPackedMsg, &value->rssi, end))
return 0;
+ value->pucch_format += 2;
if (value->pduBitmap & 0x01) { //SR
if (!pull16(ppReadPackedMsg, &value->sr.sr_bit_len, end))
return 0;
@@ -6214,60 +6481,148 @@ static uint8_t unpack_nr_uci_pucch_2_3_4(nfapi_nr_uci_pucch_pdu_format_2_3_4_t*
return 1;
}
+static uint8_t unpack_nr_uci_pusch(nfapi_nr_uci_pusch_pdu_t *value,
+ uint8_t **ppReadPackedMsg,
+ uint8_t *end,
+ nfapi_p7_codec_config_t *config)
+{
+ if (!pull8(ppReadPackedMsg, &value->pduBitmap, end))
+ return 0;
+ if (!pull32(ppReadPackedMsg, &value->handle, end))
+ return 0;
+ if (!pull16(ppReadPackedMsg, &value->rnti, end))
+ return 0;
+ if (!pull8(ppReadPackedMsg, &value->ul_cqi, end))
+ return 0;
+ if (!pull16(ppReadPackedMsg, &value->timing_advance, end))
+ return 0;
+ if (!pull16(ppReadPackedMsg, &value->rssi, end))
+ return 0;
+
+ // Bit 0 not used in PUSCH PDU
+ if ((value->pduBitmap >> 1) & 0x01) { // HARQ
+ if (!pull8(ppReadPackedMsg, &value->harq.harq_crc, end))
+ return 0;
+ if (!pull16(ppReadPackedMsg, &value->harq.harq_bit_len, end))
+ return 0;
+
+ value->harq.harq_payload =
+ nfapi_p7_allocate(sizeof(*value->harq.harq_payload) * (int)((value->harq.harq_bit_len / 8) + 1), config);
+ if (value->harq.harq_payload == NULL) {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate value->harq.harq_payload\n", __FUNCTION__);
+ return 0;
+ }
+
+ if (!pullarray8(ppReadPackedMsg,
+ value->harq.harq_payload,
+ (int)((value->harq.harq_bit_len / 8) + 1),
+ (int)((value->harq.harq_bit_len / 8) + 1),
+ end))
+ return 0;
+ }
+
+ if ((value->pduBitmap >> 2) & 0x01) { // CSI-1
+ if (!pull8(ppReadPackedMsg, &value->csi_part1.csi_part1_crc, end))
+ return 0;
+ if (!pull16(ppReadPackedMsg, &value->csi_part1.csi_part1_bit_len, end))
+ return 0;
+
+ value->csi_part1.csi_part1_payload =
+ nfapi_p7_allocate(sizeof(*value->csi_part1.csi_part1_payload) * (int)((value->csi_part1.csi_part1_bit_len / 8) + 1),
+ config);
+ if (value->csi_part1.csi_part1_payload == NULL) {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate value->csi_part1.csi_part1_payload\n", __FUNCTION__);
+ return 0;
+ }
+
+ if (!pullarray8(ppReadPackedMsg,
+ value->csi_part1.csi_part1_payload,
+ (int)((value->csi_part1.csi_part1_bit_len / 8) + 1),
+ (int)((value->csi_part1.csi_part1_bit_len / 8) + 1),
+ end))
+ return 0;
+ }
+
+ if ((value->pduBitmap >> 3) & 0x01) { // CSI-2
+ if (!pull8(ppReadPackedMsg, &value->csi_part2.csi_part2_crc, end))
+ return 0;
+ if (!pull16(ppReadPackedMsg, &value->csi_part2.csi_part2_bit_len, end))
+ return 0;
+
+ value->csi_part2.csi_part2_payload =
+ nfapi_p7_allocate(sizeof(*value->csi_part2.csi_part2_payload) * (int)((value->csi_part2.csi_part2_bit_len / 8) + 1),
+ config);
+ if (value->csi_part2.csi_part2_payload == NULL) {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate value->csi_part2.csi_part2_payload\n", __FUNCTION__);
+ return 0;
+ }
+
+ if (!pullarray8(ppReadPackedMsg,
+ value->csi_part2.csi_part2_payload,
+ (int)((value->csi_part2.csi_part2_bit_len / 8) + 1),
+ (int)((value->csi_part2.csi_part2_bit_len / 8) + 1),
+ end))
+ return 0;
+ }
+
+ return 1;
+}
+
static uint8_t unpack_nr_uci_indication_body(nfapi_nr_uci_t *value,
uint8_t **ppReadPackedMsg,
uint8_t *end,
nfapi_p7_codec_config_t *config)
{
- if (!pull16(ppReadPackedMsg, &value->pdu_type, end))
- return 0;
- if (!pull16(ppReadPackedMsg, &value->pdu_size, end))
- return 0;
+ if (!pull16(ppReadPackedMsg, &value->pdu_type, end))
+ return 0;
+ if (!pull16(ppReadPackedMsg, &value->pdu_size, end))
+ return 0;
- switch (value->pdu_type) {
- case NFAPI_NR_UCI_PUSCH_PDU_TYPE:
- NFAPI_TRACE(NFAPI_TRACE_WARN, "Unhandled NFAPI_NR_UCI_PUSCH_PDU_TYPE \n");
- break;
+ switch (value->pdu_type) {
+ case NFAPI_NR_UCI_PUSCH_PDU_TYPE: {
+ nfapi_nr_uci_pusch_pdu_t *uci_pdu = &value->pusch_pdu;
+ if (!unpack_nr_uci_pusch(uci_pdu, ppReadPackedMsg, end, config))
+ return 0;
+ break;
+ }
+ case NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE: {
+ nfapi_nr_uci_pucch_pdu_format_0_1_t *uci_pdu = &value->pucch_pdu_format_0_1;
+ if (!unpack_nr_uci_pucch_0_1(uci_pdu, ppReadPackedMsg, end, config))
+ return 0;
+ break;
+ }
+ case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE: {
+ nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_pdu = &value->pucch_pdu_format_2_3_4;
+ if (!unpack_nr_uci_pucch_2_3_4(uci_pdu, ppReadPackedMsg, end, config))
+ return 0;
+ break;
+ }
+ default:
+ NFAPI_TRACE(NFAPI_TRACE_WARN, "Unexpected pdu type %d\n", value->pdu_type);
+ break;
+ }
- case NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE: {
- nfapi_nr_uci_pucch_pdu_format_0_1_t *uci_pdu = &value->pucch_pdu_format_0_1;
- if (!unpack_nr_uci_pucch_0_1(uci_pdu, ppReadPackedMsg, end, config))
- return 0;
- break;
- }
- case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE: {
- nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_pdu = &value->pucch_pdu_format_2_3_4;
- if (!unpack_nr_uci_pucch_2_3_4(uci_pdu, ppReadPackedMsg, end, config))
- return 0;
- break;
- }
- default:
- NFAPI_TRACE(NFAPI_TRACE_WARN, "Unexpected pdu type %d\n", value->pdu_type);
- break;
- }
-
- return 1;
+ return 1;
}
-static uint8_t unpack_nr_uci_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+static uint8_t unpack_nr_uci_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config)
{
- nfapi_nr_uci_indication_t *pNfapiMsg = (nfapi_nr_uci_indication_t*)msg;
+ nfapi_nr_uci_indication_t *pNfapiMsg = (nfapi_nr_uci_indication_t *)msg;
- if (!pull16(ppReadPackedMsg, &pNfapiMsg->sfn , end))
- return 0;
- if (!pull16(ppReadPackedMsg, &pNfapiMsg->slot , end))
- return 0;
- if (!pull16(ppReadPackedMsg, &pNfapiMsg->num_ucis, end))
- return 0;
+ if (!pull16(ppReadPackedMsg, &pNfapiMsg->sfn, end))
+ return 0;
+ if (!pull16(ppReadPackedMsg, &pNfapiMsg->slot, end))
+ return 0;
+ if (!pull16(ppReadPackedMsg, &pNfapiMsg->num_ucis, end))
+ return 0;
- pNfapiMsg->uci_list = nfapi_p7_allocate(sizeof(*pNfapiMsg->uci_list) * pNfapiMsg->num_ucis, config);
- for (int i = 0; i < pNfapiMsg->num_ucis; i++)
- {
- if (!unpack_nr_uci_indication_body(&pNfapiMsg->uci_list[i], ppReadPackedMsg, end, config))
- return 0;
- }
+ pNfapiMsg->uci_list = nfapi_p7_allocate(sizeof(*pNfapiMsg->uci_list) * pNfapiMsg->num_ucis, config);
+ for (int i = 0; i < pNfapiMsg->num_ucis; i++) {
+ if (!unpack_nr_uci_indication_body(&pNfapiMsg->uci_list[i], ppReadPackedMsg, end, config))
+ return 0;
+ }
- return 1;
+ return 1;
}
static uint8_t unpack_ue_release_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
@@ -8093,41 +8448,29 @@ int nfapi_nr_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *
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_unpack_length(NFAPI_UE_RELEASE_REQUEST, unpackedBufLen))
result = unpack_ue_release_request(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
break;
case NFAPI_NR_PHY_MSG_TYPE_SLOT_INDICATION:
if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_SLOT_INDICATION, unpackedBufLen)){
nfapi_nr_slot_indication_scf_t* msg = (nfapi_nr_slot_indication_scf_t*) pMessageHeader;
result = unpack_nr_slot_indication(&pReadPackedMessage, end, msg, config);
}
- else
- return -1;
break;
case NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION:
@@ -8137,8 +8480,6 @@ int nfapi_nr_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *
msg->pdu_list->pdu = (uint8_t *) malloc(sizeof(uint8_t));
result = unpack_nr_rx_data_indication(&pReadPackedMessage, end, msg, config);
}
- else
- return -1;
break;
case NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION:
@@ -8148,8 +8489,6 @@ int nfapi_nr_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *
msg->crc_list = (nfapi_nr_crc_t*) malloc(sizeof(nfapi_nr_crc_t));
result = unpack_nr_crc_indication(&pReadPackedMessage,end , msg, config);
}
- else
- return -1;
break;
case NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION:
@@ -8158,8 +8497,6 @@ int nfapi_nr_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *
msg->uci_list = (nfapi_nr_uci_t*) malloc(sizeof(nfapi_nr_uci_t));
result = unpack_nr_uci_indication(&pReadPackedMessage, end, msg, config);
}
- else
- return -1;
break;
case NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION:
@@ -8168,8 +8505,6 @@ int nfapi_nr_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *
msg->pdu_list = (nfapi_nr_srs_indication_pdu_t*) malloc(sizeof(nfapi_nr_srs_indication_pdu_t));
result = unpack_nr_srs_indication(&pReadPackedMessage, end, msg, config);
}
- else
- return -1;
break;
case NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION:
@@ -8177,36 +8512,26 @@ int nfapi_nr_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *
nfapi_nr_rach_indication_t* msg = (nfapi_nr_rach_indication_t*) pMessageHeader;
result = unpack_nr_rach_indication(&pReadPackedMessage, end, msg, 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_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_unpack_length(NFAPI_UE_RELEASE_RESPONSE, unpackedBufLen))
result = unpack_ue_release_resp(&pReadPackedMessage, end, pMessageHeader, config);
- else
- return -1;
break;
default:
@@ -8230,8 +8555,9 @@ int nfapi_nr_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *
break;
}
- if(result == 0)
- return -1;
- else
- return 0;
+ if (result == 0) {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack failed to pack message\n");
+ return -1;
+ }
+ return 0;
}
diff --git a/nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c b/nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c
index a1be4d0edc..dd91d2fc71 100644
--- a/nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c
+++ b/nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c
@@ -249,18 +249,17 @@ int nfapi_pnf_ue_release_resp(nfapi_pnf_p7_config_t* config, nfapi_ue_release_re
return pnf_p7_pack_and_send_p7_message(_this, &(resp->header), sizeof(nfapi_ue_release_response_t));
}
-//NR UPLINK INDICATION
+//NR UPLINK INDICATION
int nfapi_pnf_p7_nr_slot_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_slot_indication_scf_t* ind)
{
- if(config == NULL || ind == NULL)
- {
- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__);
- return -1;
- }
+ if (config == NULL || ind == NULL) {
+ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__);
+ return -1;
+ }
- pnf_p7_t* _this = (pnf_p7_t*)(config);
- return pnf_nr_p7_pack_and_send_p7_message(_this, (nfapi_p7_message_header_t*)ind, sizeof(nfapi_nr_rx_data_indication_t));
+ pnf_p7_t* _this = (pnf_p7_t*)(config);
+ return pnf_nr_p7_pack_and_send_p7_message(_this, (nfapi_p7_message_header_t*)ind, sizeof(nfapi_nr_slot_indication_scf_t));
}
int nfapi_pnf_p7_nr_rx_data_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_rx_data_indication_t* ind)