MIB NR: pdcch_ConfigSIB1 selection and fill
This commit is contained in:
@@ -35,6 +35,21 @@
|
|||||||
#include "mac.h"
|
#include "mac.h"
|
||||||
#include "COMMON/mac_rrc_primitives.h"
|
#include "COMMON/mac_rrc_primitives.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define table_38213_13_1_num_indexes 15
|
||||||
|
#define table_38213_13_2_num_indexes 14
|
||||||
|
#define table_38213_13_3_num_indexes 9
|
||||||
|
#define table_38213_13_4_num_indexes 16
|
||||||
|
#define table_38213_13_5_num_indexes 9
|
||||||
|
#define table_38213_13_6_num_indexes 10
|
||||||
|
#define table_38213_13_7_num_indexes 12
|
||||||
|
#define table_38213_13_8_num_indexes 8
|
||||||
|
#define table_38213_13_9_num_indexes 4
|
||||||
|
#define table_38213_13_10_num_indexes 8
|
||||||
|
#define table_38213_13_11_num_indexes 16
|
||||||
|
#define table_38213_13_12_num_indexes 14
|
||||||
|
|
||||||
|
|
||||||
const uint32_t BSR_TABLE[BSR_TABLE_SIZE] = {
|
const uint32_t BSR_TABLE[BSR_TABLE_SIZE] = {
|
||||||
0, 10, 12, 14, 17, 19, 22, 26, 31, 36, 42, 49, 57, 67, 78, 91,
|
0, 10, 12, 14, 17, 19, 22, 26, 31, 36, 42, 49, 57, 67, 78, 91,
|
||||||
105, 125, 146, 171, 200, 234, 274, 321, 376, 440, 515, 603, 706, 826,
|
105, 125, 146, 171, 200, 234, 274, 321, 376, 440, 515, 603, 706, 826,
|
||||||
|
|||||||
@@ -30,11 +30,10 @@
|
|||||||
|
|
||||||
#include "platform_types.h"
|
#include "platform_types.h"
|
||||||
#include "nr_rrc_defs.h"
|
#include "nr_rrc_defs.h"
|
||||||
#include "nr_rrc_extern.h"
|
|
||||||
#include "common/utils/LOG/log.h"
|
#include "common/utils/LOG/log.h"
|
||||||
#include "pdcp.h"
|
#include "pdcp.h"
|
||||||
#include "msc.h"
|
|
||||||
#include "common/ran_context.h"
|
#include "common/ran_context.h"
|
||||||
|
#include "openair2/LAYER2/MAC/mac_vars.h"
|
||||||
|
|
||||||
#include "intertask_interface.h"
|
#include "intertask_interface.h"
|
||||||
|
|
||||||
@@ -44,74 +43,165 @@
|
|||||||
extern RAN_CONTEXT_t RC;
|
extern RAN_CONTEXT_t RC;
|
||||||
|
|
||||||
int8_t mac_rrc_nr_data_req(const module_id_t Mod_idP,
|
int8_t mac_rrc_nr_data_req(const module_id_t Mod_idP,
|
||||||
const int CC_id,
|
const int CC_id,
|
||||||
const frame_t frameP,
|
const frame_t frameP,
|
||||||
const rb_id_t Srb_id,
|
const rb_id_t Srb_id,
|
||||||
const uint8_t Nb_tb,
|
const uint8_t Nb_tb,
|
||||||
uint8_t *const buffer_pP ){
|
uint8_t *const buffer_pP) {
|
||||||
|
|
||||||
asn_enc_rval_t enc_rval;
|
asn_enc_rval_t enc_rval;
|
||||||
uint8_t Sdu_size = 0;
|
uint8_t Sdu_size = 0;
|
||||||
uint8_t sfn_msb = (uint8_t)((frameP>>4)&0x3f);
|
uint8_t sfn_msb = (uint8_t) ((frameP >> 4) & 0x3f);
|
||||||
|
|
||||||
#ifdef DEBUG_RRC
|
#ifdef DEBUG_RRC
|
||||||
LOG_D(RRC,"[eNB %d] mac_rrc_data_req to SRB ID=%ld\n",Mod_idP,Srb_id);
|
LOG_D(RRC, "[eNB %d] mac_rrc_data_req to SRB ID=%ld\n", Mod_idP, Srb_id);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
gNB_RRC_INST *rrc;
|
gNB_RRC_INST *rrc;
|
||||||
rrc_gNB_carrier_data_t *carrier;
|
rrc_gNB_carrier_data_t *carrier;
|
||||||
NR_BCCH_BCH_Message_t *mib;
|
NR_BCCH_BCH_Message_t *mib;
|
||||||
NR_SRB_INFO * srb_info;
|
NR_SRB_INFO *srb_info;
|
||||||
char payload_size, *payload_pP;
|
char payload_size, *payload_pP;
|
||||||
|
|
||||||
rrc = RC.nrrrc[Mod_idP];
|
rrc = RC.nrrrc[Mod_idP];
|
||||||
carrier = &rrc->carrier;
|
carrier = &rrc->carrier;
|
||||||
mib = &carrier->mib;
|
mib = &carrier->mib;
|
||||||
srb_info = &carrier->Srb0;
|
srb_info = &carrier->Srb0;
|
||||||
|
|
||||||
/* MIBCH */
|
/* MIBCH */
|
||||||
if( (Srb_id & RAB_OFFSET ) == MIBCH) {
|
if ((Srb_id & RAB_OFFSET) == MIBCH) {
|
||||||
mib->message.choice.mib->systemFrameNumber.buf[0] = sfn_msb << 2;
|
|
||||||
enc_rval = uper_encode_to_buffer(&asn_DEF_NR_BCCH_BCH_Message,
|
|
||||||
NULL,
|
|
||||||
(void *)mib,
|
|
||||||
carrier->MIB,
|
|
||||||
24);
|
|
||||||
LOG_D(NR_RRC,"Encoded MIB for frame %d sfn_msb %d (%p), bits %lu\n",frameP,sfn_msb,carrier->MIB,enc_rval.encoded);
|
|
||||||
buffer_pP[0]=carrier->MIB[0];
|
|
||||||
buffer_pP[1]=carrier->MIB[1];
|
|
||||||
buffer_pP[2]=carrier->MIB[2];
|
|
||||||
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]);
|
|
||||||
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
|
|
||||||
enc_rval.failed_type->name, enc_rval.encoded);
|
|
||||||
return(3);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TODO BCCH SIB1 SIBs */
|
|
||||||
|
|
||||||
/* CCCH */
|
/// controlResourceSetZero
|
||||||
if( (Srb_id & RAB_OFFSET ) == CCCH) {
|
|
||||||
//struct rrc_eNB_ue_context_s *ue_context_p = rrc_eNB_get_ue_context(RC.rrc[Mod_idP],rnti);
|
|
||||||
//if (ue_context_p == NULL) return(0);
|
|
||||||
//eNB_RRC_UE_t *ue_p = &ue_context_p->ue_context;
|
|
||||||
LOG_D(RRC,"[gNB %d] Frame %d CCCH request (Srb_id %ld)\n", Mod_idP, frameP, Srb_id);
|
|
||||||
|
|
||||||
// srb_info=&ue_p->Srb0;
|
switch (*carrier->servingcellconfigcommon->ssbSubcarrierSpacing) {
|
||||||
|
|
||||||
payload_size = srb_info->Tx_buffer.payload_size;
|
case NR_SubcarrierSpacing_kHz15:
|
||||||
|
if (mib->message.choice.mib->subCarrierSpacingCommon == NR_SubcarrierSpacing_kHz15) {
|
||||||
|
mib->message.choice.mib->pdcch_ConfigSIB1.controlResourceSetZero = rand() % table_38213_13_1_num_indexes;
|
||||||
|
} else if (mib->message.choice.mib->subCarrierSpacingCommon == NR_SubcarrierSpacing_kHz30) {
|
||||||
|
mib->message.choice.mib->pdcch_ConfigSIB1.controlResourceSetZero = rand() % table_38213_13_2_num_indexes;
|
||||||
|
} else {
|
||||||
|
AssertFatal(true,"Invalid subCarrierSpacingCommon\n");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
// check if data is there for MAC
|
case NR_SubcarrierSpacing_kHz30:
|
||||||
if (payload_size > 0) {
|
if (mib->message.choice.mib->subCarrierSpacingCommon == NR_SubcarrierSpacing_kHz15) {
|
||||||
payload_pP = srb_info->Tx_buffer.Payload;
|
|
||||||
LOG_D(RRC,"[gNB %d] CCCH (%p) has %d bytes (dest: %p, src %p)\n", Mod_idP, srb_info, payload_size, buffer_pP, payload_pP);
|
// TODO get min_bw 38.101-1 table 5.3.5-1
|
||||||
// Fill buffer
|
//if ( (min_bw == 5) || (min_bw == 10) {
|
||||||
memcpy((void *)buffer_pP, (void*)payload_pP, payload_size);
|
mib->message.choice.mib->pdcch_ConfigSIB1.controlResourceSetZero = rand() % table_38213_13_3_num_indexes;
|
||||||
Sdu_size = payload_size;
|
//} else if (min_bw == 40) {
|
||||||
srb_info->Tx_buffer.payload_size = 0;
|
// mib->message.choice.mib->pdcch_ConfigSIB1.controlResourceSetZero = rand() % table_38213_13_5_num_indexes;
|
||||||
|
//}
|
||||||
|
|
||||||
|
} else if (mib->message.choice.mib->subCarrierSpacingCommon == NR_SubcarrierSpacing_kHz30) {
|
||||||
|
|
||||||
|
// TODO get min_bw 38.101-1 table 5.3.5-1
|
||||||
|
//if ( (min_bw == 5) || (min_bw == 10) {
|
||||||
|
mib->message.choice.mib->pdcch_ConfigSIB1.controlResourceSetZero = rand() % table_38213_13_4_num_indexes;
|
||||||
|
//} else if (min_bw == 40) {
|
||||||
|
// mib->message.choice.mib->pdcch_ConfigSIB1.controlResourceSetZero = rand() % table_38213_13_6_num_indexes;
|
||||||
|
//}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
AssertFatal(true,"Invalid subCarrierSpacingCommon\n");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NR_SubcarrierSpacing_kHz120:
|
||||||
|
if (mib->message.choice.mib->subCarrierSpacingCommon == NR_SubcarrierSpacing_kHz60) {
|
||||||
|
mib->message.choice.mib->pdcch_ConfigSIB1.controlResourceSetZero = rand() % table_38213_13_7_num_indexes;
|
||||||
|
} else if (mib->message.choice.mib->subCarrierSpacingCommon == NR_SubcarrierSpacing_kHz120) {
|
||||||
|
mib->message.choice.mib->pdcch_ConfigSIB1.controlResourceSetZero = rand() % table_38213_13_8_num_indexes;
|
||||||
|
} else {
|
||||||
|
AssertFatal(true,"Invalid subCarrierSpacingCommon\n");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NR_SubcarrierSpacing_kHz240:
|
||||||
|
if (mib->message.choice.mib->subCarrierSpacingCommon == NR_SubcarrierSpacing_kHz60) {
|
||||||
|
mib->message.choice.mib->pdcch_ConfigSIB1.controlResourceSetZero = rand() % table_38213_13_9_num_indexes;
|
||||||
|
} else if (mib->message.choice.mib->subCarrierSpacingCommon == NR_SubcarrierSpacing_kHz120) {
|
||||||
|
mib->message.choice.mib->pdcch_ConfigSIB1.controlResourceSetZero = rand() % table_38213_13_10_num_indexes;
|
||||||
|
} else {
|
||||||
|
AssertFatal(true,"Invalid subCarrierSpacingCommon\n");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
AssertFatal(true,"Invalid ssbSubcarrierSpacing\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// TODO: searchSpaceZero
|
||||||
|
|
||||||
|
//if(mac->type0_pdcch_ss_mux_pattern == 1 && frequency_range == FR1){
|
||||||
|
mib->message.choice.mib->pdcch_ConfigSIB1.searchSpaceZero = rand() % table_38213_13_11_num_indexes;
|
||||||
|
/*}
|
||||||
|
if(mac->type0_pdcch_ss_mux_pattern == 1 && frequency_range == FR2){
|
||||||
|
mib->message.choice.mib->pdcch_ConfigSIB1.searchSpaceZero = rand() % table_38213_13_12_num_indexes;
|
||||||
|
}
|
||||||
|
if(mac->type0_pdcch_ss_mux_pattern == 2) {
|
||||||
|
if((scs_ssb == scs_120kHz) && (scs_pdcch == scs_60kHz)){
|
||||||
|
mib->message.choice.mib->pdcch_ConfigSIB1.searchSpaceZero = rand() % table_38213_13_13_num_indexes;
|
||||||
|
} else if((scs_ssb == scs_240kHz) && (scs_pdcch == scs_120kHz)){
|
||||||
|
mib->message.choice.mib->pdcch_ConfigSIB1.searchSpaceZero = rand() % table_38213_13_14_num_indexes;
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
|
|
||||||
|
//NR_UE_MAC_INST_t *mac = get_mac_inst(Mod_idP);
|
||||||
|
//gNB_mac = RC.nrmac[0];
|
||||||
|
//mac->type0_pdcch_ss_mux_pattern
|
||||||
|
|
||||||
|
|
||||||
|
mib->message.choice.mib->systemFrameNumber.buf[0] = sfn_msb << 2;
|
||||||
|
enc_rval = uper_encode_to_buffer(&asn_DEF_NR_BCCH_BCH_Message,
|
||||||
|
NULL,
|
||||||
|
(void *) mib,
|
||||||
|
carrier->MIB,
|
||||||
|
24);
|
||||||
|
LOG_D(NR_RRC, "Encoded MIB for frame %d sfn_msb %d (%p), bits %lu\n", frameP, sfn_msb, carrier->MIB,
|
||||||
|
enc_rval.encoded);
|
||||||
|
buffer_pP[0] = carrier->MIB[0];
|
||||||
|
buffer_pP[1] = carrier->MIB[1];
|
||||||
|
buffer_pP[2] = carrier->MIB[2];
|
||||||
|
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]);
|
||||||
|
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
|
||||||
|
enc_rval.failed_type->name, enc_rval.encoded);
|
||||||
|
return (3);
|
||||||
}
|
}
|
||||||
return Sdu_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
return(0);
|
/* TODO BCCH SIB1 SIBs */
|
||||||
|
|
||||||
|
/* CCCH */
|
||||||
|
if ((Srb_id & RAB_OFFSET) == CCCH) {
|
||||||
|
//struct rrc_eNB_ue_context_s *ue_context_p = rrc_eNB_get_ue_context(RC.rrc[Mod_idP],rnti);
|
||||||
|
//if (ue_context_p == NULL) return(0);
|
||||||
|
//eNB_RRC_UE_t *ue_p = &ue_context_p->ue_context;
|
||||||
|
LOG_D(RRC, "[gNB %d] Frame %d CCCH request (Srb_id %ld)\n", Mod_idP, frameP, Srb_id);
|
||||||
|
|
||||||
|
// srb_info=&ue_p->Srb0;
|
||||||
|
|
||||||
|
payload_size = srb_info->Tx_buffer.payload_size;
|
||||||
|
|
||||||
|
// check if data is there for MAC
|
||||||
|
if (payload_size > 0) {
|
||||||
|
payload_pP = srb_info->Tx_buffer.Payload;
|
||||||
|
LOG_D(RRC, "[gNB %d] CCCH (%p) has %d bytes (dest: %p, src %p)\n", Mod_idP, srb_info, payload_size,
|
||||||
|
buffer_pP, payload_pP);
|
||||||
|
// Fill buffer
|
||||||
|
memcpy((void *) buffer_pP, (void *) payload_pP, payload_size);
|
||||||
|
Sdu_size = payload_size;
|
||||||
|
srb_info->Tx_buffer.payload_size = 0;
|
||||||
|
}
|
||||||
|
return Sdu_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user