Move MIB to MAC
The MasterInformationBlock is handled at the DU and sent to the CU in the F1 Setup Response. Hence, move it down to the MAC. Furthermore: - Change type because MIB_PDU_t is 4G type - Simplify schedule_nr_mib()
This commit is contained in:
+1
-1
@@ -211,7 +211,7 @@ The scheduler also calls "run_pdcp()", as this is not a autonomous thread, it ne
|
|||||||
After calling run_pdcp, it updates "rlc" time data but it doesn't actually process rlc
|
After calling run_pdcp, it updates "rlc" time data but it doesn't actually process rlc
|
||||||
it sends a iiti message to activate the thread for RRC, the answer will be asynchronous in ????
|
it sends a iiti message to activate the thread for RRC, the answer will be asynchronous in ????
|
||||||
|
|
||||||
Calls schedule_nr_mib() that calls mac_rrc_nr_data_req() to fill MIB,
|
Calls schedule_nr_mib() that fills MIB,
|
||||||
|
|
||||||
Calls schedule_nr_prach() which schedules the (fixed) PRACH region one frame in
|
Calls schedule_nr_prach() which schedules the (fixed) PRACH region one frame in
|
||||||
advance.
|
advance.
|
||||||
|
|||||||
@@ -652,7 +652,6 @@ int main(int argc, char *argv[])
|
|||||||
gNB->if_inst->NR_PHY_config_req = nr_phy_config_request;
|
gNB->if_inst->NR_PHY_config_req = nr_phy_config_request;
|
||||||
// common configuration
|
// common configuration
|
||||||
nr_mac_config_scc(RC.nrmac[0], conf.pdsch_AntennaPorts, n_tx, 0, 6);
|
nr_mac_config_scc(RC.nrmac[0], conf.pdsch_AntennaPorts, n_tx, 0, 6);
|
||||||
nr_mac_config_mib(RC.nrmac[0], mib);
|
|
||||||
// UE dedicated configuration
|
// UE dedicated configuration
|
||||||
nr_mac_add_test_ue(RC.nrmac[0], secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity, secondaryCellGroup);
|
nr_mac_add_test_ue(RC.nrmac[0], secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity, secondaryCellGroup);
|
||||||
frame_parms->nb_antennas_tx = 1;
|
frame_parms->nb_antennas_tx = 1;
|
||||||
|
|||||||
@@ -1960,9 +1960,10 @@ int RC_config_trigger_F1Setup()
|
|||||||
req->cell[0].info.plmn.mnc_digit_length,
|
req->cell[0].info.plmn.mnc_digit_length,
|
||||||
req->cell[0].info.nr_cellid);
|
req->cell[0].info.nr_cellid);
|
||||||
|
|
||||||
gNB_RRC_INST *rrc = RC.nrrrc[0];
|
|
||||||
DevAssert(rrc);
|
gNB_MAC_INST *mac = RC.nrmac[0];
|
||||||
const NR_ServingCellConfigCommon_t *scc = RC.nrmac[0]->common_channels[0].ServingCellConfigCommon;
|
DevAssert(mac);
|
||||||
|
const NR_ServingCellConfigCommon_t *scc = mac->common_channels[0].ServingCellConfigCommon;
|
||||||
DevAssert(scc != NULL);
|
DevAssert(scc != NULL);
|
||||||
req->cell[0].info.nr_pci = *scc->physCellId;
|
req->cell[0].info.nr_pci = *scc->physCellId;
|
||||||
LOG_W(GNB_APP, "no slices transported via F1 Setup Request!\n");
|
LOG_W(GNB_APP, "no slices transported via F1 Setup Request!\n");
|
||||||
@@ -1992,16 +1993,18 @@ int RC_config_trigger_F1Setup()
|
|||||||
|
|
||||||
req->cell[0].info.measurement_timing_information = "0";
|
req->cell[0].info.measurement_timing_information = "0";
|
||||||
|
|
||||||
DevAssert(rrc->carrier.mib != NULL);
|
DevAssert(mac->common_channels[0].mib != NULL);
|
||||||
int buf_len = 3; // this is what we assume in monolithic
|
int buf_len = 3; // this is what we assume in monolithic
|
||||||
req->cell[0].sys_info = calloc(1, sizeof(*req->cell[0].sys_info));
|
req->cell[0].sys_info = calloc(1, sizeof(*req->cell[0].sys_info));
|
||||||
AssertFatal(req->cell[0].sys_info != NULL, "out of memory\n");
|
AssertFatal(req->cell[0].sys_info != NULL, "out of memory\n");
|
||||||
f1ap_gnb_du_system_info_t *sys_info = req->cell[0].sys_info;
|
f1ap_gnb_du_system_info_t *sys_info = req->cell[0].sys_info;
|
||||||
sys_info->mib = calloc(buf_len, sizeof(*sys_info->mib));
|
sys_info->mib = calloc(buf_len, sizeof(*sys_info->mib));
|
||||||
DevAssert(sys_info->mib != NULL);
|
DevAssert(sys_info->mib != NULL);
|
||||||
sys_info->mib_length = encode_MIB_NR(rrc->carrier.mib, 0, sys_info->mib, buf_len);
|
sys_info->mib_length = encode_MIB_NR(mac->common_channels[0].mib, 0, sys_info->mib, buf_len);
|
||||||
DevAssert(sys_info->mib_length == buf_len);
|
DevAssert(sys_info->mib_length == buf_len);
|
||||||
|
|
||||||
|
gNB_RRC_INST *rrc = RC.nrrrc[0];
|
||||||
|
DevAssert(rrc);
|
||||||
NR_BCCH_DL_SCH_Message_t *bcch_message = NULL;
|
NR_BCCH_DL_SCH_Message_t *bcch_message = NULL;
|
||||||
asn_codec_ctx_t st = {100 * 1000};
|
asn_codec_ctx_t st = {100 * 1000};
|
||||||
asn_dec_rval_t dec_rval = uper_decode_complete(&st,
|
asn_dec_rval_t dec_rval = uper_decode_complete(&st,
|
||||||
@@ -2026,7 +2029,6 @@ int RC_config_trigger_F1Setup()
|
|||||||
if (LOG_DEBUGFLAG(DEBUG_ASN1))
|
if (LOG_DEBUGFLAG(DEBUG_ASN1))
|
||||||
xer_fprint(stdout, &asn_DEF_NR_SIB1, (void *)bcch_message->message.choice.c1->choice.systemInformationBlockType1);
|
xer_fprint(stdout, &asn_DEF_NR_SIB1, (void *)bcch_message->message.choice.c1->choice.systemInformationBlockType1);
|
||||||
|
|
||||||
gNB_MAC_INST *mac = RC.nrmac[0];
|
|
||||||
mac->mac_rrc.f1_setup_request(req);
|
mac->mac_rrc.f1_setup_request(req);
|
||||||
mac->f1_config.setup_req = req;
|
mac->f1_config.setup_req = req;
|
||||||
|
|
||||||
|
|||||||
@@ -4105,7 +4105,7 @@ uint32_t get_Y(const NR_SearchSpace_t *ss, int slot, rnti_t rnti) {
|
|||||||
|
|
||||||
void get_type0_PDCCH_CSS_config_parameters(NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config,
|
void get_type0_PDCCH_CSS_config_parameters(NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config,
|
||||||
frame_t frameP,
|
frame_t frameP,
|
||||||
NR_MIB_t *mib,
|
const NR_MIB_t *mib,
|
||||||
uint8_t num_slot_per_frame,
|
uint8_t num_slot_per_frame,
|
||||||
uint8_t ssb_subcarrier_offset,
|
uint8_t ssb_subcarrier_offset,
|
||||||
uint16_t ssb_start_symbol,
|
uint16_t ssb_start_symbol,
|
||||||
|
|||||||
@@ -207,7 +207,7 @@ uint32_t nr_compute_tbslbrm(uint16_t table,
|
|||||||
|
|
||||||
void get_type0_PDCCH_CSS_config_parameters(NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config,
|
void get_type0_PDCCH_CSS_config_parameters(NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config,
|
||||||
frame_t frameP,
|
frame_t frameP,
|
||||||
NR_MIB_t *mib,
|
const NR_MIB_t *mib,
|
||||||
uint8_t num_slot_per_frame,
|
uint8_t num_slot_per_frame,
|
||||||
uint8_t ssb_subcarrier_offset,
|
uint8_t ssb_subcarrier_offset,
|
||||||
uint16_t ssb_start_symbol,
|
uint16_t ssb_start_symbol,
|
||||||
|
|||||||
@@ -560,18 +560,6 @@ void nr_mac_config_scc(gNB_MAC_INST *nrmac,
|
|||||||
NR_SCHED_UNLOCK(&nrmac->sched_lock);
|
NR_SCHED_UNLOCK(&nrmac->sched_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void nr_mac_config_mib(gNB_MAC_INST *nrmac, NR_BCCH_BCH_Message_t *mib)
|
|
||||||
{
|
|
||||||
DevAssert(nrmac != NULL);
|
|
||||||
DevAssert(mib != NULL);
|
|
||||||
NR_SCHED_LOCK(&nrmac->sched_lock);
|
|
||||||
NR_COMMON_channels_t *cc = &nrmac->common_channels[0];
|
|
||||||
|
|
||||||
AssertFatal(cc->mib == NULL, "logic bug: updated MIB multiple times\n");
|
|
||||||
cc->mib = mib;
|
|
||||||
NR_SCHED_UNLOCK(&nrmac->sched_lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
void nr_mac_config_sib1(gNB_MAC_INST *nrmac, NR_BCCH_DL_SCH_Message_t *sib1)
|
void nr_mac_config_sib1(gNB_MAC_INST *nrmac, NR_BCCH_DL_SCH_Message_t *sib1)
|
||||||
{
|
{
|
||||||
DevAssert(nrmac != NULL);
|
DevAssert(nrmac != NULL);
|
||||||
|
|||||||
@@ -105,19 +105,26 @@ static void fill_ssb_vrb_map(NR_COMMON_channels_t *cc, int rbStart, int ssb_subc
|
|||||||
vrb_map[rbStart + rb] = SL_to_bitmap(symStart % NR_SYMBOLS_PER_SLOT, 4);
|
vrb_map[rbStart + rb] = SL_to_bitmap(symStart % NR_SYMBOLS_PER_SLOT, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int encode_mib(NR_BCCH_BCH_Message_t *mib, frame_t frame, uint8_t *buffer, int buf_size)
|
||||||
|
{
|
||||||
|
int encode_size = 3;
|
||||||
|
AssertFatal(buf_size >= encode_size, "buffer of size %d too small, need 3 bytes\n", buf_size);
|
||||||
|
int encoded = encode_MIB_NR(mib, frame, buffer, encode_size);
|
||||||
|
DevAssert(encoded == encode_size);
|
||||||
|
return encode_size;
|
||||||
|
}
|
||||||
|
|
||||||
void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP, nfapi_nr_dl_tti_request_t *DL_req)
|
void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP, nfapi_nr_dl_tti_request_t *DL_req)
|
||||||
{
|
{
|
||||||
gNB_MAC_INST *gNB = RC.nrmac[module_idP];
|
gNB_MAC_INST *gNB = RC.nrmac[module_idP];
|
||||||
/* already mutex protected: held in gNB_dlsch_ulsch_scheduler() */
|
/* already mutex protected: held in gNB_dlsch_ulsch_scheduler() */
|
||||||
NR_COMMON_channels_t *cc;
|
|
||||||
nfapi_nr_dl_tti_request_body_t *dl_req;
|
nfapi_nr_dl_tti_request_body_t *dl_req;
|
||||||
NR_MIB_t *mib = RC.nrrrc[module_idP]->carrier.mib->message.choice.mib;
|
|
||||||
uint8_t num_tdd_period,num_ssb;
|
uint8_t num_tdd_period,num_ssb;
|
||||||
int mib_sdu_length;
|
|
||||||
int CC_id;
|
int CC_id;
|
||||||
|
|
||||||
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
|
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
|
||||||
cc = &gNB->common_channels[CC_id];
|
NR_COMMON_channels_t *cc= &gNB->common_channels[CC_id];
|
||||||
|
const NR_MIB_t *mib = cc->mib->message.choice.mib;
|
||||||
NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
|
NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
|
||||||
const int slots_per_frame = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
|
const int slots_per_frame = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
|
||||||
dl_req = &DL_req->dl_tti_request_body;
|
dl_req = &DL_req->dl_tti_request_body;
|
||||||
@@ -125,8 +132,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP,
|
|||||||
// get MIB every 8 frames
|
// get MIB every 8 frames
|
||||||
if(((slotP == 0) && (frameP & 7) == 0) ||
|
if(((slotP == 0) && (frameP & 7) == 0) ||
|
||||||
gNB->first_MIB) {
|
gNB->first_MIB) {
|
||||||
|
int mib_sdu_length = encode_mib(cc->mib, frameP, cc->MIB_pdu, sizeof(cc->MIB_pdu));
|
||||||
mib_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, MIBCH, 0, 1, &cc->MIB_pdu.payload[0]);
|
|
||||||
|
|
||||||
// flag to avoid sending an empty MIB in the first frames of execution since gNB doesn't get at the beginning in frame 0 slot 0
|
// flag to avoid sending an empty MIB in the first frames of execution since gNB doesn't get at the beginning in frame 0 slot 0
|
||||||
gNB->first_MIB = false;
|
gNB->first_MIB = false;
|
||||||
@@ -139,6 +145,8 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP,
|
|||||||
mib_sdu_length);
|
mib_sdu_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t mib_pdu = (*(uint32_t *)cc->MIB_pdu) & ((1 << 24) - 1);
|
||||||
|
|
||||||
int8_t ssb_period = *scc->ssb_periodicityServingCell;
|
int8_t ssb_period = *scc->ssb_periodicityServingCell;
|
||||||
uint8_t ssb_frame_periodicity = 1; // every how many frames SSB are generated
|
uint8_t ssb_frame_periodicity = 1; // every how many frames SSB are generated
|
||||||
|
|
||||||
@@ -175,7 +183,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP,
|
|||||||
// if start symbol is in current slot, schedule current SSB, fill VRB map and call get_type0_PDCCH_CSS_config_parameters
|
// if start symbol is in current slot, schedule current SSB, fill VRB map and call get_type0_PDCCH_CSS_config_parameters
|
||||||
if ((ssb_start_symbol/14) == rel_slot){
|
if ((ssb_start_symbol/14) == rel_slot){
|
||||||
const int prb_offset = offset_pointa >> scs;
|
const int prb_offset = offset_pointa >> scs;
|
||||||
schedule_ssb(frameP, slotP, scc, dl_req, i_ssb, ssbSubcarrierOffset, offset_pointa, (*(uint32_t*)cc->MIB_pdu.payload) & ((1<<24)-1));
|
schedule_ssb(frameP, slotP, scc, dl_req, i_ssb, ssbSubcarrierOffset, offset_pointa, mib_pdu);
|
||||||
fill_ssb_vrb_map(cc, prb_offset, ssbSubcarrierOffset, ssb_start_symbol, CC_id);
|
fill_ssb_vrb_map(cc, prb_offset, ssbSubcarrierOffset, ssb_start_symbol, CC_id);
|
||||||
if (get_softmodem_params()->sa == 1) {
|
if (get_softmodem_params()->sa == 1) {
|
||||||
get_type0_PDCCH_CSS_config_parameters(&gNB->type0_PDCCH_CSS_config[i_ssb],
|
get_type0_PDCCH_CSS_config_parameters(&gNB->type0_PDCCH_CSS_config[i_ssb],
|
||||||
@@ -204,7 +212,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP,
|
|||||||
// if start symbol is in current slot, schedule current SSB, fill VRB map and call get_type0_PDCCH_CSS_config_parameters
|
// if start symbol is in current slot, schedule current SSB, fill VRB map and call get_type0_PDCCH_CSS_config_parameters
|
||||||
if ((ssb_start_symbol/14) == rel_slot){
|
if ((ssb_start_symbol/14) == rel_slot){
|
||||||
const int prb_offset = offset_pointa >> scs;
|
const int prb_offset = offset_pointa >> scs;
|
||||||
schedule_ssb(frameP, slotP, scc, dl_req, i_ssb, ssbSubcarrierOffset, offset_pointa, (*(uint32_t*)cc->MIB_pdu.payload) & ((1<<24)-1));
|
schedule_ssb(frameP, slotP, scc, dl_req, i_ssb, ssbSubcarrierOffset, offset_pointa, mib_pdu);
|
||||||
fill_ssb_vrb_map(cc, prb_offset, ssbSubcarrierOffset, ssb_start_symbol, CC_id);
|
fill_ssb_vrb_map(cc, prb_offset, ssbSubcarrierOffset, ssb_start_symbol, CC_id);
|
||||||
if (get_softmodem_params()->sa == 1) {
|
if (get_softmodem_params()->sa == 1) {
|
||||||
get_type0_PDCCH_CSS_config_parameters(&gNB->type0_PDCCH_CSS_config[i_ssb],
|
get_type0_PDCCH_CSS_config_parameters(&gNB->type0_PDCCH_CSS_config[i_ssb],
|
||||||
@@ -234,7 +242,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP,
|
|||||||
// if start symbol is in current slot, schedule current SSB, fill VRB map and call get_type0_PDCCH_CSS_config_parameters
|
// if start symbol is in current slot, schedule current SSB, fill VRB map and call get_type0_PDCCH_CSS_config_parameters
|
||||||
if ((ssb_start_symbol/14) == rel_slot){
|
if ((ssb_start_symbol/14) == rel_slot){
|
||||||
const int prb_offset = offset_pointa >> (scs-2); // reference 60kHz
|
const int prb_offset = offset_pointa >> (scs-2); // reference 60kHz
|
||||||
schedule_ssb(frameP, slotP, scc, dl_req, i_ssb, ssbSubcarrierOffset, offset_pointa, (*(uint32_t*)cc->MIB_pdu.payload) & ((1<<24)-1));
|
schedule_ssb(frameP, slotP, scc, dl_req, i_ssb, ssbSubcarrierOffset, offset_pointa, mib_pdu);
|
||||||
fill_ssb_vrb_map(cc, prb_offset, ssbSubcarrierOffset >> (scs - 2), ssb_start_symbol, CC_id);
|
fill_ssb_vrb_map(cc, prb_offset, ssbSubcarrierOffset >> (scs - 2), ssb_start_symbol, CC_id);
|
||||||
const NR_TDD_UL_DL_Pattern_t *tdd = &scc->tdd_UL_DL_ConfigurationCommon->pattern1;
|
const NR_TDD_UL_DL_Pattern_t *tdd = &scc->tdd_UL_DL_ConfigurationCommon->pattern1;
|
||||||
const int n_slots_frame = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
|
const int n_slots_frame = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
|
||||||
|
|||||||
@@ -50,7 +50,6 @@ void nr_mac_config_scc(gNB_MAC_INST *nrmac,
|
|||||||
int pusch_AntennaPorts,
|
int pusch_AntennaPorts,
|
||||||
int sib1_tda,
|
int sib1_tda,
|
||||||
int minRXTXTIMEpdsch);
|
int minRXTXTIMEpdsch);
|
||||||
void nr_mac_config_mib(gNB_MAC_INST *nrmac, NR_BCCH_BCH_Message_t *mib);
|
|
||||||
void nr_mac_config_sib1(gNB_MAC_INST *nrmac, NR_BCCH_DL_SCH_Message_t *sib1);
|
void nr_mac_config_sib1(gNB_MAC_INST *nrmac, NR_BCCH_DL_SCH_Message_t *sib1);
|
||||||
bool nr_mac_add_test_ue(gNB_MAC_INST *nrmac, uint32_t rnti, NR_CellGroupConfig_t *CellGroup);
|
bool nr_mac_add_test_ue(gNB_MAC_INST *nrmac, uint32_t rnti, NR_CellGroupConfig_t *CellGroup);
|
||||||
bool nr_mac_prepare_ra_ue(gNB_MAC_INST *nrmac, uint32_t rnti, NR_CellGroupConfig_t *CellGroup);
|
bool nr_mac_prepare_ra_ue(gNB_MAC_INST *nrmac, uint32_t rnti, NR_CellGroupConfig_t *CellGroup);
|
||||||
|
|||||||
@@ -245,6 +245,7 @@ void mac_top_init_gNB(ngran_node_t node_type, NR_ServingCellConfigCommon_t *scc,
|
|||||||
RC.nrmac[i]->common_channels[0].pre_ServingCellConfig = scd;
|
RC.nrmac[i]->common_channels[0].pre_ServingCellConfig = scd;
|
||||||
|
|
||||||
RC.nrmac[i]->first_MIB = true;
|
RC.nrmac[i]->first_MIB = true;
|
||||||
|
RC.nrmac[i]->common_channels[0].mib = get_new_MIB_NR(scc);
|
||||||
|
|
||||||
RC.nrmac[i]->cset0_bwp_start = 0;
|
RC.nrmac[i]->cset0_bwp_start = 0;
|
||||||
RC.nrmac[i]->cset0_bwp_size = 0;
|
RC.nrmac[i]->cset0_bwp_size = 0;
|
||||||
|
|||||||
@@ -225,7 +225,7 @@ typedef struct {
|
|||||||
NR_ARFCN_ValueEUTRA_t ul_CarrierFreq;
|
NR_ARFCN_ValueEUTRA_t ul_CarrierFreq;
|
||||||
long ul_Bandwidth;
|
long ul_Bandwidth;
|
||||||
/// Outgoing MIB PDU for PHY
|
/// Outgoing MIB PDU for PHY
|
||||||
MIB_PDU MIB_pdu;
|
uint8_t MIB_pdu[3];
|
||||||
/// Outgoing BCCH pdu for PHY
|
/// Outgoing BCCH pdu for PHY
|
||||||
BCCH_PDU BCCH_pdu;
|
BCCH_PDU BCCH_pdu;
|
||||||
/// Outgoing BCCH DCI allocation
|
/// Outgoing BCCH DCI allocation
|
||||||
|
|||||||
@@ -74,13 +74,7 @@ uint16_t mac_rrc_nr_data_req(const module_id_t Mod_idP,
|
|||||||
// MIBCH
|
// MIBCH
|
||||||
if ((Srb_id & RAB_OFFSET) == MIBCH) {
|
if ((Srb_id & RAB_OFFSET) == MIBCH) {
|
||||||
|
|
||||||
int encode_size = 3;
|
DevAssert(false);
|
||||||
rrc_gNB_carrier_data_t *carrier = &RC.nrrrc[Mod_idP]->carrier;
|
|
||||||
int encoded = encode_MIB_NR(carrier->mib, frameP, buffer_pP, encode_size);
|
|
||||||
DevAssert(encoded == encode_size);
|
|
||||||
LOG_D(NR_RRC, "MIB PDU buffer_pP[0]=%x , buffer_pP[1]=%x, buffer_pP[2]=%x\n", buffer_pP[0], buffer_pP[1],
|
|
||||||
buffer_pP[2]);
|
|
||||||
return encode_size;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((Srb_id & RAB_OFFSET) == BCCH) {
|
if ((Srb_id & RAB_OFFSET) == BCCH) {
|
||||||
|
|||||||
@@ -331,7 +331,6 @@ typedef struct {
|
|||||||
uint8_t *SIB23;
|
uint8_t *SIB23;
|
||||||
uint8_t sizeof_SIB23;
|
uint8_t sizeof_SIB23;
|
||||||
|
|
||||||
NR_BCCH_BCH_Message_t *mib;
|
|
||||||
NR_SIB1_t *siblock1_DU;
|
NR_SIB1_t *siblock1_DU;
|
||||||
NR_SIB1_t *sib1;
|
NR_SIB1_t *sib1;
|
||||||
NR_SIB2_t *sib2;
|
NR_SIB2_t *sib2;
|
||||||
@@ -376,6 +375,7 @@ typedef struct cucp_cuup_if_s {
|
|||||||
|
|
||||||
typedef struct nr_rrc_du_container_t {
|
typedef struct nr_rrc_du_container_t {
|
||||||
f1ap_setup_req_t *setup_req;
|
f1ap_setup_req_t *setup_req;
|
||||||
|
NR_MIB_t *mib;
|
||||||
} nr_rrc_du_container_t;
|
} nr_rrc_du_container_t;
|
||||||
|
|
||||||
//---NR---(completely change)---------------------
|
//---NR---(completely change)---------------------
|
||||||
|
|||||||
+15
-14
@@ -237,11 +237,6 @@ static void init_NR_SI(gNB_RRC_INST *rrc, gNB_RrcConfigurationReq *configuration
|
|||||||
{
|
{
|
||||||
const NR_ServingCellConfigCommon_t *scc = RC.nrmac[0]->common_channels[0].ServingCellConfigCommon;
|
const NR_ServingCellConfigCommon_t *scc = RC.nrmac[0]->common_channels[0].ServingCellConfigCommon;
|
||||||
|
|
||||||
LOG_D(RRC,"%s()\n\n\n\n",__FUNCTION__);
|
|
||||||
if (NODE_IS_DU(rrc->node_type) || NODE_IS_MONOLITHIC(rrc->node_type)) {
|
|
||||||
rrc->carrier.mib = get_new_MIB_NR(scc);
|
|
||||||
}
|
|
||||||
|
|
||||||
if((get_softmodem_params()->sa) && ( (NODE_IS_DU(rrc->node_type) || NODE_IS_MONOLITHIC(rrc->node_type)))) {
|
if((get_softmodem_params()->sa) && ( (NODE_IS_DU(rrc->node_type) || NODE_IS_MONOLITHIC(rrc->node_type)))) {
|
||||||
NR_BCCH_DL_SCH_Message_t *sib1 = get_SIB1_NR(configuration, scc);
|
NR_BCCH_DL_SCH_Message_t *sib1 = get_SIB1_NR(configuration, scc);
|
||||||
//xer_fprint(stdout, &asn_DEF_NR_BCCH_DL_SCH_Message, sib1);
|
//xer_fprint(stdout, &asn_DEF_NR_BCCH_DL_SCH_Message, sib1);
|
||||||
@@ -270,7 +265,6 @@ static void init_NR_SI(gNB_RRC_INST *rrc, gNB_RrcConfigurationReq *configuration
|
|||||||
rrc->configuration.pusch_AntennaPorts,
|
rrc->configuration.pusch_AntennaPorts,
|
||||||
rrc->configuration.sib1_tda,
|
rrc->configuration.sib1_tda,
|
||||||
rrc->configuration.minRXTXTIME);
|
rrc->configuration.minRXTXTIME);
|
||||||
nr_mac_config_mib(RC.nrmac[rrc->module_id], rrc->carrier.mib);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (get_softmodem_params()->phy_test > 0 || get_softmodem_params()->do_ra > 0) {
|
if (get_softmodem_params()->phy_test > 0 || get_softmodem_params()->do_ra > 0) {
|
||||||
@@ -1931,6 +1925,18 @@ static void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *req)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* do we need the MIB? for the moment, just check it is valid, then drop it */
|
||||||
|
NR_BCCH_BCH_Message_t *mib = 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, rejecting DU\n", dec_rval.consumed);
|
||||||
|
rrc->mac_rrc.f1_setup_failure(&fail);
|
||||||
|
ASN_STRUCT_FREE(asn_DEF_NR_BCCH_BCH_Message, mib);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
LOG_I(RRC, "Accepting DU %ld (%s), sending F1 Setup Response\n", req->gNB_DU_id, req->gNB_DU_name);
|
LOG_I(RRC, "Accepting DU %ld (%s), sending F1 Setup Response\n", req->gNB_DU_id, req->gNB_DU_name);
|
||||||
|
|
||||||
// we accept the DU
|
// we accept the DU
|
||||||
@@ -1943,14 +1949,9 @@ static void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *req)
|
|||||||
rrc->du->setup_req = malloc(sizeof(*rrc->du->setup_req));
|
rrc->du->setup_req = malloc(sizeof(*rrc->du->setup_req));
|
||||||
AssertFatal(rrc->du->setup_req != NULL, "out of memory\n");
|
AssertFatal(rrc->du->setup_req != NULL, "out of memory\n");
|
||||||
*rrc->du->setup_req = *req;
|
*rrc->du->setup_req = *req;
|
||||||
|
rrc->du->mib = mib->message.choice.mib;
|
||||||
if (rrc->carrier.mib != NULL) {
|
mib->message.choice.mib = NULL;
|
||||||
LOG_E(NR_RRC, "CU MIB is already initialized: double F1 setup request?\n");
|
ASN_STRUCT_FREE(asn_DEF_NR_BCCH_BCH_MessageType, mib);
|
||||||
} else {
|
|
||||||
asn_dec_rval_t dec_rval =
|
|
||||||
uper_decode_complete(NULL, &asn_DEF_NR_BCCH_BCH_Message, (void **)&rrc->carrier.mib, sys_info->mib, sys_info->mib_length);
|
|
||||||
AssertFatal(dec_rval.code == RC_OK, "Failed to decode NR_BCCH_BCH_MESSAGE (%zu bits)\n", dec_rval.consumed);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rrc->carrier.sib1 != NULL) {
|
if (rrc->carrier.sib1 != NULL) {
|
||||||
LOG_E(NR_RRC, "CU SIB1 is already initiaized: double F1 setup request?\n");
|
LOG_E(NR_RRC, "CU SIB1 is already initiaized: double F1 setup request?\n");
|
||||||
|
|||||||
Reference in New Issue
Block a user