From a394a40d5d7b2826367a093fb1b8f830bedaefaf Mon Sep 17 00:00:00 2001 From: Guido Casati Date: Fri, 8 Nov 2024 11:42:36 +0100 Subject: [PATCH] Add and use F1 encode function for Transmission Bandwidth and NR Frequency Info in F1 interface management lib --- openair2/F1AP/lib/f1ap_interface_management.c | 90 ++++++++++--------- 1 file changed, 47 insertions(+), 43 deletions(-) diff --git a/openair2/F1AP/lib/f1ap_interface_management.c b/openair2/F1AP/lib/f1ap_interface_management.c index fe079faa4c..3a0ef23c6c 100644 --- a/openair2/F1AP/lib/f1ap_interface_management.c +++ b/openair2/F1AP/lib/f1ap_interface_management.c @@ -83,72 +83,76 @@ static void free_f1ap_cell(const f1ap_served_cell_info_t *info, const f1ap_gnb_d free(info->tac); } +/** + * @brief Encode NR Frequency Info (9.3.1.17 of 3GPP TS 38.473) + */ +static F1AP_NRFreqInfo_t encode_frequency_info(const f1ap_nr_frequency_info_t *info) +{ + F1AP_NRFreqInfo_t nrFreqInfo = {0}; + // NR ARFCN + nrFreqInfo.nRARFCN = info->arfcn; + int num_bands = 1; + // Frequency Band List + for (int j = 0; j < num_bands; j++) { + asn1cSequenceAdd(nrFreqInfo.freqBandListNr.list, F1AP_FreqBandNrItem_t, nr_freqBandNrItem); + // NR Frequency Band + nr_freqBandNrItem->freqBandIndicatorNr = info->band; + } + return nrFreqInfo; +} + +/** + * @brief Encode Transmission Bandwidth (9.3.1.15 of 3GPP TS 38.473) + */ +static F1AP_Transmission_Bandwidth_t encode_tx_bandwidth(const f1ap_transmission_bandwidth_t *info) +{ + F1AP_Transmission_Bandwidth_t tb = {0}; + tb.nRSCS = info->scs; + tb.nRNRB = to_NRNRB(info->nrb); + return tb; +} + /** * @brief Encoding of Served Cell Information (9.3.1.10 of 3GPP TS 38.473) */ static F1AP_Served_Cell_Information_t encode_served_cell_info(const f1ap_served_cell_info_t *c) { F1AP_Served_Cell_Information_t scell_info = {0}; - // NR CGI + // NR CGI (M) MCC_MNC_TO_PLMNID(c->plmn.mcc, c->plmn.mnc, c->plmn.mnc_digit_length, &(scell_info.nRCGI.pLMN_Identity)); NR_CELL_ID_TO_BIT_STRING(c->nr_cellid, &(scell_info.nRCGI.nRCellIdentity)); - // NR PCI + // NR PCI (M) scell_info.nRPCI = c->nr_pci; // int 0..1007 - // 5GS TAC + // 5GS TAC (O) if (c->tac != NULL) { uint32_t tac = htonl(*c->tac); asn1cCalloc(scell_info.fiveGS_TAC, netOrder); OCTET_STRING_fromBuf(netOrder, ((char *)&tac) + 1, 3); } - // Served PLMNs + // Served PLMNs 1.. asn1cSequenceAdd(scell_info.servedPLMNs.list, F1AP_ServedPLMNs_Item_t, servedPLMN_item); + // PLMN Identity (M) MCC_MNC_TO_PLMNID(c->plmn.mcc, c->plmn.mnc, c->plmn.mnc_digit_length, &servedPLMN_item->pLMN_Identity); - // NR-Mode-Info + // NR-Mode-Info (M) F1AP_NR_Mode_Info_t *nR_Mode_Info = &scell_info.nR_Mode_Info; - if (c->mode == F1AP_MODE_FDD) { // FDD + if (c->mode == F1AP_MODE_FDD) { // FDD Info const f1ap_fdd_info_t *fdd = &c->fdd; nR_Mode_Info->present = F1AP_NR_Mode_Info_PR_fDD; asn1cCalloc(nR_Mode_Info->choice.fDD, fDD_Info); - /* FDD.1.1 UL NRFreqInfo ARFCN */ - fDD_Info->uL_NRFreqInfo.nRARFCN = fdd->ul_freqinfo.arfcn; - /* FDD.1.3 freqBandListNr */ - int ul_band = 1; - for (int j = 0; j < ul_band; j++) { - asn1cSequenceAdd(fDD_Info->uL_NRFreqInfo.freqBandListNr.list, F1AP_FreqBandNrItem_t, nr_freqBandNrItem); - /* FDD.1.3.1 freqBandIndicatorNr*/ - nr_freqBandNrItem->freqBandIndicatorNr = fdd->ul_freqinfo.band; - } - /* FDD.2.1 DL NRFreqInfo ARFCN */ - fDD_Info->dL_NRFreqInfo.nRARFCN = fdd->dl_freqinfo.arfcn; - /* FDD.2.3 freqBandListNr */ - int dl_bands = 1; - for (int j = 0; j < dl_bands; j++) { - asn1cSequenceAdd(fDD_Info->dL_NRFreqInfo.freqBandListNr.list, F1AP_FreqBandNrItem_t, nr_freqBandNrItem); - /* FDD.2.3.1 freqBandIndicatorNr*/ - nr_freqBandNrItem->freqBandIndicatorNr = fdd->dl_freqinfo.band; - } // for FDD : DL freq_Bands - /* FDD.3 UL Transmission Bandwidth */ - fDD_Info->uL_Transmission_Bandwidth.nRSCS = fdd->ul_tbw.scs; - fDD_Info->uL_Transmission_Bandwidth.nRNRB = to_NRNRB(fdd->ul_tbw.nrb); - /* FDD.4 DL Transmission Bandwidth */ - fDD_Info->dL_Transmission_Bandwidth.nRSCS = fdd->dl_tbw.scs; - fDD_Info->dL_Transmission_Bandwidth.nRNRB = to_NRNRB(fdd->dl_tbw.nrb); - } else if (c->mode == F1AP_MODE_TDD) { + // NR Frequency Info + fDD_Info->uL_NRFreqInfo = encode_frequency_info(&fdd->ul_freqinfo); + fDD_Info->dL_NRFreqInfo = encode_frequency_info(&fdd->dl_freqinfo); + // Transmission Bandwidth + fDD_Info->uL_Transmission_Bandwidth = encode_tx_bandwidth(&fdd->ul_tbw); + fDD_Info->dL_Transmission_Bandwidth = encode_tx_bandwidth(&fdd->dl_tbw); + } else if (c->mode == F1AP_MODE_TDD) { // TDD Info const f1ap_tdd_info_t *tdd = &c->tdd; nR_Mode_Info->present = F1AP_NR_Mode_Info_PR_tDD; asn1cCalloc(nR_Mode_Info->choice.tDD, tDD_Info); - /* TDD.1.1 nRFreqInfo ARFCN */ - tDD_Info->nRFreqInfo.nRARFCN = tdd->freqinfo.arfcn; - /* TDD.1.3 freqBandListNr */ - int bands = 1; - for (int j = 0; j < bands; j++) { - asn1cSequenceAdd(tDD_Info->nRFreqInfo.freqBandListNr.list, F1AP_FreqBandNrItem_t, nr_freqBandNrItem); - /* TDD.1.3.1 freqBandIndicatorNr*/ - nr_freqBandNrItem->freqBandIndicatorNr = tdd->freqinfo.band; - } - /* TDD.2 transmission_Bandwidth */ - tDD_Info->transmission_Bandwidth.nRSCS = tdd->tbw.scs; - tDD_Info->transmission_Bandwidth.nRNRB = to_NRNRB(tdd->tbw.nrb); + // NR Frequency Info + tDD_Info->nRFreqInfo = encode_frequency_info(&tdd->freqinfo); + // Transmission Bandwidth + tDD_Info->transmission_Bandwidth = encode_tx_bandwidth(&tdd->tbw); } else { AssertFatal(false, "unknown duplex mode %d\n", c->mode); }