diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index dfbe4c3672..a0db5ad338 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -1181,7 +1181,8 @@ static f1ap_setup_req_t *RC_read_F1Setup(uint64_t id, sys_info->mib = calloc(buf_len, sizeof(*sys_info->mib)); DevAssert(sys_info->mib != NULL); DevAssert(mib != NULL); - sys_info->mib_length = encode_MIB_NR(mib, 0, sys_info->mib, buf_len); + // encode only the mib message itself + sys_info->mib_length = encode_MIB_NR_setup(mib->message.choice.mib, 0, sys_info->mib, buf_len); DevAssert(sys_info->mib_length == buf_len); DevAssert(sib1 != NULL); diff --git a/openair2/RRC/NR/nr_rrc_config.c b/openair2/RRC/NR/nr_rrc_config.c index b6a5d45ff9..be1aaeec82 100644 --- a/openair2/RRC/NR/nr_rrc_config.c +++ b/openair2/RRC/NR/nr_rrc_config.c @@ -1875,6 +1875,18 @@ int encode_MIB_NR(NR_BCCH_BCH_Message_t *mib, int frame, uint8_t *buf, int buf_s return (enc_rval.encoded + 7) / 8; } +int encode_MIB_NR_setup(NR_MIB_t *mib, int frame, uint8_t *buf, int buf_size) +{ + DevAssert(mib != NULL); + uint8_t sfn_msb = (uint8_t)((frame >> 4) & 0x3f); + *mib->systemFrameNumber.buf = sfn_msb << 2; + + asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_MIB, NULL, mib, buf, buf_size); + AssertFatal(enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded); + LOG_D(NR_RRC, "Encoded MIB for frame %d sfn_msb %d, bits %lu\n", frame, sfn_msb, enc_rval.encoded); + return (enc_rval.encoded + 7) / 8; +} + NR_BCCH_DL_SCH_Message_t *get_SIB1_NR(const NR_ServingCellConfigCommon_t *scc, const f1ap_plmn_t *plmn, uint64_t cellID, int tac) { AssertFatal(cellID < (1l << 36), "cellID must fit within 36 bits, but is %lu\n", cellID); diff --git a/openair2/RRC/NR/nr_rrc_config.h b/openair2/RRC/NR/nr_rrc_config.h index 1db2d4a2f1..b18be2ff61 100644 --- a/openair2/RRC/NR/nr_rrc_config.h +++ b/openair2/RRC/NR/nr_rrc_config.h @@ -55,6 +55,7 @@ void prepare_sim_uecap(NR_UE_NR_Capability_t *cap, NR_BCCH_BCH_Message_t *get_new_MIB_NR(const NR_ServingCellConfigCommon_t *scc); void free_MIB_NR(NR_BCCH_BCH_Message_t *mib); int encode_MIB_NR(NR_BCCH_BCH_Message_t *mib, int frame, uint8_t *buf, int buf_size); +int encode_MIB_NR_setup(NR_MIB_t *mib, int frame, uint8_t *buf, int buf_size); #define NR_MAX_SIB_LENGTH 2976 // 3GPP TS 38.331 section 5.2.1 diff --git a/openair2/RRC/NR/rrc_gNB_du.c b/openair2/RRC/NR/rrc_gNB_du.c index fdbe1a4551..c67263a67e 100644 --- a/openair2/RRC/NR/rrc_gNB_du.c +++ b/openair2/RRC/NR/rrc_gNB_du.c @@ -49,35 +49,33 @@ static bool rrc_gNB_plmn_matches(const gNB_RRC_INST *rrc, const f1ap_served_cell && conf->mnc[0] == info->plmn.mnc; } -static bool extract_sys_info(const f1ap_gnb_du_system_info_t *sys_info, NR_BCCH_BCH_Message_t **mib, NR_SIB1_t **sib1) +static bool extract_sys_info(const f1ap_gnb_du_system_info_t *sys_info, NR_MIB_t **mib, NR_SIB1_t **sib1) { DevAssert(sys_info != NULL); DevAssert(mib != NULL); DevAssert(sib1 != NULL); - asn_dec_rval_t dec_rval = - uper_decode_complete(NULL, &asn_DEF_NR_BCCH_BCH_Message, (void **)mib, sys_info->mib, sys_info->mib_length); - if (dec_rval.code != RC_OK || (*mib)->message.present != NR_BCCH_BCH_MessageType_PR_mib - || (*mib)->message.choice.messageClassExtension == NULL) { - LOG_E(RRC, "Failed to decode NR_BCCH_BCH_MESSAGE (%zu bits) of DU\n", dec_rval.consumed); - ASN_STRUCT_FREE(asn_DEF_NR_BCCH_BCH_Message, *mib); + asn_dec_rval_t dec_rval = uper_decode_complete(NULL, &asn_DEF_NR_MIB, (void **)mib, sys_info->mib, sys_info->mib_length); + if (dec_rval.code != RC_OK) { + LOG_E(RRC, "Failed to decode NR_MIB (%zu bits) of DU\n", dec_rval.consumed); + ASN_STRUCT_FREE(asn_DEF_NR_MIB, *mib); return false; } if (sys_info->sib1) { dec_rval = uper_decode_complete(NULL, &asn_DEF_NR_SIB1, (void **)sib1, sys_info->sib1, sys_info->sib1_length); if (dec_rval.code != RC_OK) { - ASN_STRUCT_FREE(asn_DEF_NR_BCCH_BCH_Message, *mib); + ASN_STRUCT_FREE(asn_DEF_NR_MIB, *mib); ASN_STRUCT_FREE(asn_DEF_NR_SIB1, *sib1); LOG_E(RRC, "Failed to decode NR_SIB1 (%zu bits), rejecting DU\n", dec_rval.consumed); return false; } } - if (LOG_DEBUGFLAG(DEBUG_ASN1)) - xer_fprint(stdout, &asn_DEF_NR_BCCH_BCH_Message, *mib); - if (LOG_DEBUGFLAG(DEBUG_ASN1)) + if (LOG_DEBUGFLAG(DEBUG_ASN1)) { + xer_fprint(stdout, &asn_DEF_NR_MIB, *mib); xer_fprint(stdout, &asn_DEF_NR_SIB1, *sib1); + } return true; } @@ -145,7 +143,7 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *req, sctp_assoc_t assoc_id) } const f1ap_gnb_du_system_info_t *sys_info = req->cell[0].sys_info; - NR_BCCH_BCH_Message_t *mib = NULL; + NR_MIB_t *mib = NULL; NR_SIB1_t *sib1 = NULL; if (sys_info != NULL && sys_info->mib != NULL && !(sys_info->sib1 == NULL && get_softmodem_params()->sa)) { @@ -170,12 +168,9 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *req, sctp_assoc_t assoc_id) du->setup_req = calloc(1,sizeof(*du->setup_req)); AssertFatal(du->setup_req, "out of memory\n"); *du->setup_req = *req; - if (mib != NULL && sib1 != NULL) { - du->mib = mib->message.choice.mib; - mib->message.choice.mib = NULL; - ASN_STRUCT_FREE(asn_DEF_NR_BCCH_BCH_MessageType, mib); - du->sib1 = sib1; - } + // MIB can be null and configured later via DU Configuration Update + du->mib = mib; + du->sib1 = sib1; RB_INSERT(rrc_du_tree, &rrc->dus, du); rrc->num_dus++; @@ -184,7 +179,7 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *req, sctp_assoc_t assoc_id) .nr_cellid = cell_info->nr_cellid, .nrpci = cell_info->nr_pci, .num_SI = 0, - }; + }; f1ap_setup_resp_t resp = {.transaction_id = req->transaction_id, .num_cells_to_activate = 1, @@ -288,14 +283,12 @@ void rrc_gNB_process_f1_du_configuration_update(f1ap_gnb_du_configuration_update if (sys_info->sib1 != NULL) ASN_STRUCT_FREE(asn_DEF_NR_SIB1, du->sib1); - NR_BCCH_BCH_Message_t *mib = NULL; + NR_MIB_t *mib = NULL; if (!extract_sys_info(sys_info, &mib, &du->sib1)) { LOG_W(RRC, "cannot update sys_info for DU %ld\n", du->setup_req->gNB_DU_id); } else { DevAssert(mib != NULL); - du->mib = mib->message.choice.mib; - mib->message.choice.mib = NULL; - ASN_STRUCT_FREE(asn_DEF_NR_BCCH_BCH_MessageType, mib); + du->mib = mib; LOG_I(RRC, "update system information of DU %ld\n", du->setup_req->gNB_DU_id); } }