mirror of
https://gitlab.eurecom.fr/oai/openairinterface5g.git
synced 2026-07-20 16:10:29 +00:00
Compare commits
3 Commits
power-refe
...
ho-1CU-2DU
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
51db31c13f | ||
|
|
c8526de5ab | ||
|
|
76b81f874f |
@@ -2,8 +2,8 @@
|
||||
#define OPENAIRINTERFACE5G_LIMITS_H_
|
||||
|
||||
# define MAX_MOBILES_PER_GNB 16
|
||||
# define NUMBER_OF_eNB_MAX 1
|
||||
# define NUMBER_OF_gNB_MAX 1
|
||||
# define NUMBER_OF_eNB_MAX 2
|
||||
# define NUMBER_OF_gNB_MAX 2
|
||||
# define NUMBER_OF_RU_MAX 2
|
||||
# define NUMBER_OF_NR_RU_MAX 2
|
||||
# define NUMBER_OF_UCI_MAX 16
|
||||
@@ -14,6 +14,8 @@
|
||||
|
||||
#define NUMBER_FRAMES_PHY_UE_INACTIVE 10
|
||||
|
||||
#define NUMBER_OF_DU_PER_CU_MAX 2
|
||||
|
||||
#define MAX_MANAGED_ENB_PER_MOBILE 2
|
||||
#define MAX_MANAGED_GNB_PER_MOBILE 2
|
||||
|
||||
|
||||
@@ -314,18 +314,19 @@ static int create_gNB_tasks(void) {
|
||||
|
||||
LOG_I(GNB_APP,"Allocating gNB_RRC_INST for %d instances\n",RC.nb_nr_inst);
|
||||
|
||||
RC.nrrrc = (gNB_RRC_INST **)malloc(RC.nb_nr_inst*sizeof(gNB_RRC_INST *));
|
||||
LOG_I(PHY, "%s() RC.nb_nr_inst:%d RC.nrrrc:%p\n", __FUNCTION__, RC.nb_nr_inst, RC.nrrrc);
|
||||
ngran_node_t node_type = get_node_type();
|
||||
for (int gnb_id = gnb_id_start; (gnb_id < gnb_id_end) ; gnb_id++) {
|
||||
RC.nrrrc[gnb_id] = (gNB_RRC_INST*)calloc(1,sizeof(gNB_RRC_INST));
|
||||
LOG_I(PHY, "%s() Creating RRC instance RC.nrrrc[%d]:%p (%d of %d)\n", __FUNCTION__, gnb_id, RC.nrrrc[gnb_id], gnb_id+1, gnb_id_end);
|
||||
configure_nr_rrc(gnb_id);
|
||||
}
|
||||
RC.nrrrc = (gNB_RRC_INST **)malloc(NUMBER_OF_DU_PER_CU_MAX * sizeof(gNB_RRC_INST *));
|
||||
LOG_I(PHY, "%s() RC.nb_nr_inst:%d RC.nrrrc: %p\n", __FUNCTION__, RC.nb_nr_inst, RC.nrrrc);
|
||||
|
||||
if (RC.nb_nr_inst > 0 &&
|
||||
!get_softmodem_params()->nsa &&
|
||||
!(node_type == ngran_gNB_DU)) {
|
||||
int gnb_id = gnb_id_start;
|
||||
do {
|
||||
RC.nrrrc[gnb_id] = (gNB_RRC_INST *)calloc(1, sizeof(gNB_RRC_INST));
|
||||
LOG_I(PHY, "%s() Creating RRC instance RC.nrrrc[%d]: %p\n", __FUNCTION__, gnb_id, RC.nrrrc[gnb_id]);
|
||||
configure_nr_rrc(gnb_id);
|
||||
gnb_id++;
|
||||
} while (gnb_id < NUMBER_OF_DU_PER_CU_MAX && NODE_IS_CU(RC.nrrrc[0]->node_type));
|
||||
|
||||
ngran_node_t node_type = get_node_type();
|
||||
if (RC.nb_nr_inst > 0 && !get_softmodem_params()->nsa && !(node_type == ngran_gNB_DU)) {
|
||||
// we start pdcp in both cuup (for drb) and cucp (for srb)
|
||||
init_pdcp();
|
||||
}
|
||||
|
||||
@@ -79,7 +79,6 @@ MessageDef *RCconfig_NR_CU_E1(bool separate_CUUP_process)
|
||||
char aprefix[MAX_OPTNAME_SIZE * 2 + 8];
|
||||
sprintf(aprefix, "%s.[%i]", GNB_CONFIG_STRING_GNB_LIST, 0);
|
||||
int num_gnbs = GNBSParams[GNB_ACTIVE_GNBS_IDX].numelt;
|
||||
AssertFatal(num_gnbs == 1, "Support only one gNB per process\n");
|
||||
|
||||
if (num_gnbs > 0) {
|
||||
config_getlist(&GNBParamList, GNBParams, sizeofArray(GNBParams), NULL);
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
#include "f1ap_common.h"
|
||||
|
||||
static f1ap_cudu_inst_t *f1_du_inst[NUMBER_OF_gNB_MAX]= {0};
|
||||
static f1ap_cudu_inst_t *f1_cu_inst[NUMBER_OF_gNB_MAX]= {0};
|
||||
static f1ap_cudu_inst_t *f1_cu_inst[NUMBER_OF_DU_PER_CU_MAX]= {0};
|
||||
|
||||
uint8_t F1AP_get_next_transaction_identifier(instance_t mod_idP, instance_t cu_mod_idP) {
|
||||
static uint8_t transaction_identifier[NUMBER_OF_gNB_MAX] = {0};
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
#include "f1ap_encoder.h"
|
||||
#include "f1ap_itti_messaging.h"
|
||||
#include "f1ap_cu_interface_management.h"
|
||||
#include "f1ap_cu_task.h"
|
||||
|
||||
int CU_send_RESET(instance_t instance, F1AP_Reset_t *Reset) {
|
||||
AssertFatal(1==0,"Not implemented yet\n");
|
||||
@@ -80,7 +81,7 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance,
|
||||
uint32_t assoc_id,
|
||||
uint32_t stream,
|
||||
F1AP_F1AP_PDU_t *pdu) {
|
||||
LOG_D(F1AP, "CU_handle_F1_SETUP_REQUEST\n");
|
||||
LOG_I(F1AP, "(instance %li) CU_handle_F1_SETUP_REQUEST\n", instance);
|
||||
MessageDef *message_p;
|
||||
F1AP_F1SetupRequest_t *container;
|
||||
F1AP_F1SetupRequestIEs_t *ie;
|
||||
@@ -145,6 +146,16 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance,
|
||||
// LTS: FIXME cell_type is not a attribute of a cell in the data structure !!!!!!!!!!
|
||||
f1ap_req(true, instance)->cell_type = CELL_MACRO_GNB;
|
||||
|
||||
eth_params_t *IPaddrs = NULL;
|
||||
for (int mod_id = 0; mod_id < RC.nb_nr_inst; mod_id++) {
|
||||
if (req->cell[i].nr_pci == RC.nrrrc[mod_id]->carrier.physCellId) {
|
||||
IPaddrs = &RC.nrrrc[mod_id]->eth_params_s;
|
||||
break;
|
||||
}
|
||||
}
|
||||
AssertFatal(IPaddrs != NULL, "IPaddrs is NULL!\n");
|
||||
create_gtpInst(instance, IPaddrs);
|
||||
|
||||
// FDD Cells
|
||||
if (servedCellInformation->nR_Mode_Info.present==F1AP_NR_Mode_Info_PR_fDD) {
|
||||
struct fdd_s *FDDs=&req->nr_mode_info[i].fdd;
|
||||
@@ -571,7 +582,7 @@ int CU_handle_gNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance,
|
||||
uint32_t assoc_id,
|
||||
uint32_t stream,
|
||||
F1AP_F1AP_PDU_t *pdu) {
|
||||
LOG_I(F1AP,"Cell Configuration ok (assoc_id %d)\n",assoc_id);
|
||||
LOG_I(F1AP,"Cell Configuration ok (instance %li, assoc_id %d)\n", instance, assoc_id);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
@@ -48,23 +48,16 @@ static instance_t cu_task_create_gtpu_instance(eth_params_t *IPaddrs) {
|
||||
return gtpv1Init(tmp);
|
||||
}
|
||||
|
||||
static void cu_task_handle_sctp_association_ind(instance_t instance, sctp_new_association_ind_t *sctp_new_association_ind,
|
||||
eth_params_t *IPaddrs) {
|
||||
static void cu_task_handle_sctp_association_ind(instance_t instance, sctp_new_association_ind_t *sctp_new_association_ind)
|
||||
{
|
||||
createF1inst(true, instance, NULL);
|
||||
|
||||
// save the assoc id
|
||||
f1ap_setup_req_t *f1ap_cu_data=f1ap_req(true, instance);
|
||||
f1ap_cu_data->assoc_id = sctp_new_association_ind->assoc_id;
|
||||
f1ap_cu_data->sctp_in_streams = sctp_new_association_ind->in_streams;
|
||||
f1ap_setup_req_t *f1ap_cu_data = f1ap_req(true, instance);
|
||||
f1ap_cu_data->assoc_id = sctp_new_association_ind->assoc_id;
|
||||
f1ap_cu_data->sctp_in_streams = sctp_new_association_ind->in_streams;
|
||||
f1ap_cu_data->sctp_out_streams = sctp_new_association_ind->out_streams;
|
||||
f1ap_cu_data->default_sctp_stream_id = 0;
|
||||
if (RC.nrrrc[instance]->node_type != ngran_gNB_CUCP) {
|
||||
getCxt(CUtype, instance)->gtpInst = cu_task_create_gtpu_instance(IPaddrs);
|
||||
AssertFatal(getCxt(CUtype, instance)->gtpInst > 0, "Failed to create CU F1-U UDP listener");
|
||||
} else
|
||||
LOG_I(F1AP, "In F1AP connection, don't start GTP-U, as we have also E1AP\n");
|
||||
// Fixme: fully inconsistent instances management
|
||||
// dirty global var is a bad fix
|
||||
CUuniqInstance=getCxt(CUtype, instance)->gtpInst;
|
||||
}
|
||||
|
||||
static void cu_task_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t *sctp_new_association_resp) {
|
||||
@@ -113,6 +106,13 @@ static void cu_task_send_sctp_init_req(instance_t instance, char *my_addr) {
|
||||
itti_send_msg_to_task(TASK_SCTP, instance, message_p);
|
||||
}
|
||||
|
||||
void create_gtpInst(instance_t instance, eth_params_t *IPaddrs)
|
||||
{
|
||||
getCxt(CUtype, instance)->gtpInst = cu_task_create_gtpu_instance(IPaddrs);
|
||||
AssertFatal(getCxt(CUtype, instance)->gtpInst > 0, "Failed to create CU F1-U UDP listener");
|
||||
CUuniqInstance = getCxt(CUtype, instance)->gtpInst;
|
||||
}
|
||||
|
||||
void *F1AP_CU_task(void *arg) {
|
||||
MessageDef *received_msg = NULL;
|
||||
int result;
|
||||
@@ -120,12 +120,12 @@ void *F1AP_CU_task(void *arg) {
|
||||
// no RLC in CU, initialize mem pool for PDCP
|
||||
pool_buffer_init();
|
||||
itti_mark_task_ready(TASK_CU_F1);
|
||||
eth_params_t *IPaddrs;
|
||||
|
||||
// Hardcoded instance id!
|
||||
IPaddrs = &RC.nrrrc[0]->eth_params_s;
|
||||
|
||||
cu_task_send_sctp_init_req(0, IPaddrs->my_addr);
|
||||
eth_params_t *IPaddrs[RC.nb_nr_inst];
|
||||
for (int mod_id = 0; mod_id < RC.nb_nr_inst; mod_id++) {
|
||||
IPaddrs[mod_id] = &RC.nrrrc[mod_id]->eth_params_s;
|
||||
cu_task_send_sctp_init_req(mod_id, IPaddrs[mod_id]->my_addr);
|
||||
}
|
||||
|
||||
while (1) {
|
||||
itti_receive_msg(TASK_CU_F1, &received_msg);
|
||||
@@ -134,8 +134,7 @@ void *F1AP_CU_task(void *arg) {
|
||||
switch (ITTI_MSG_ID(received_msg)) {
|
||||
case SCTP_NEW_ASSOCIATION_IND:
|
||||
cu_task_handle_sctp_association_ind(ITTI_MSG_ORIGIN_INSTANCE(received_msg),
|
||||
&received_msg->ittiMsg.sctp_new_association_ind,
|
||||
IPaddrs);
|
||||
&received_msg->ittiMsg.sctp_new_association_ind);
|
||||
break;
|
||||
|
||||
case SCTP_NEW_ASSOCIATION_RESP:
|
||||
|
||||
@@ -23,5 +23,6 @@
|
||||
#define F1AP_CU_TASK_H_
|
||||
|
||||
void *F1AP_CU_task(void *arg);
|
||||
void create_gtpInst(instance_t instance, eth_params_t *IPaddrs);
|
||||
|
||||
#endif /* F1AP_CU_TASK_H_ */
|
||||
|
||||
@@ -138,7 +138,7 @@ int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
||||
.rrc_container = ie->value.choice.RRCContainer.buf,
|
||||
.srb_id = srb_id
|
||||
};
|
||||
dl_rrc_message_transfer(&dl_rrc);
|
||||
dl_rrc_message_transfer(0, &dl_rrc);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -37,9 +37,9 @@ static pthread_mutex_t cu2du_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
void cu_init_f1_ue_data(void)
|
||||
{
|
||||
pthread_mutex_lock(&cu2du_mutex);
|
||||
DevAssert(cu2du_ue_mapping == NULL);
|
||||
//DevAssert(cu2du_ue_mapping == NULL);
|
||||
cu2du_ue_mapping = hashtable_create(1319, NULL, free); // 1319 is prime, default hash func (unit), free()
|
||||
DevAssert(cu2du_ue_mapping != NULL);
|
||||
//DevAssert(cu2du_ue_mapping != NULL);
|
||||
pthread_mutex_unlock(&cu2du_mutex);
|
||||
}
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ void f1ap_itti_send_sctp_data_req(bool isCu, instance_t instance, uint8_t *buffe
|
||||
sctp_data_req->buffer = buffer;
|
||||
sctp_data_req->buffer_length = buffer_length;
|
||||
sctp_data_req->stream = stream;
|
||||
LOG_D(F1AP, "Sending ITTI message to SCTP Task\n");
|
||||
LOG_D(F1AP, "(instance %li) Sending ITTI message to SCTP Task\n", instance);
|
||||
itti_send_msg_to_task(TASK_SCTP, instance, message_p);
|
||||
}
|
||||
|
||||
|
||||
@@ -67,7 +67,7 @@ void configure_nr_rrc(uint32_t gnb_id)
|
||||
msg_p = itti_alloc_new_message (TASK_GNB_APP, 0, NRRRC_CONFIGURATION_REQ);
|
||||
|
||||
if (RC.nrrrc[gnb_id]) {
|
||||
RCconfig_NRRRC(msg_p,gnb_id, RC.nrrrc[gnb_id]);
|
||||
RCconfig_NRRRC(msg_p, gnb_id, RC.nrrrc[gnb_id]);
|
||||
|
||||
LOG_I(GNB_APP, "RRC starting with node type %d\n", RC.nrrrc[gnb_id]->node_type);
|
||||
LOG_I(GNB_APP,"Sending configuration message to NR_RRC task\n");
|
||||
|
||||
@@ -1204,7 +1204,7 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc)
|
||||
if (num_gnbs > 0) {
|
||||
|
||||
// Output a list of all gNBs. ////////// Identification parameters
|
||||
config_getlist( &GNBParamList,GNBParams,sizeof(GNBParams)/sizeof(paramdef_t),NULL);
|
||||
config_getlist( &GNBParamList,GNBParams,sizeof(GNBParams)/sizeof(paramdef_t),NULL);
|
||||
if (GNBParamList.paramarray[i][GNB_GNB_ID_IDX].uptr == NULL) {
|
||||
// Calculate a default gNB ID
|
||||
if (get_softmodem_params()->sa) {
|
||||
@@ -1221,9 +1221,9 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc)
|
||||
sprintf(aprefix, "%s.[%i]", GNB_CONFIG_STRING_GNB_LIST, 0);
|
||||
|
||||
config_getlist(&SCCsParamList, NULL, 0, aprefix);
|
||||
if (SCCsParamList.numelt > 0) {
|
||||
sprintf(aprefix, "%s.[%i].%s.[%i]", GNB_CONFIG_STRING_GNB_LIST,0,GNB_CONFIG_STRING_SERVINGCELLCONFIGCOMMON, 0);
|
||||
config_get(SCCsParams,sizeof(SCCsParams) / sizeof(paramdef_t), aprefix);
|
||||
if (SCCsParamList.numelt > 0) {
|
||||
sprintf(aprefix, "%s.[%i].%s.[%i]", GNB_CONFIG_STRING_GNB_LIST, i, GNB_CONFIG_STRING_SERVINGCELLCONFIGCOMMON, 0);
|
||||
config_get(SCCsParams, sizeof(SCCsParams) / sizeof(paramdef_t), aprefix);
|
||||
LOG_I(RRC,"Read in ServingCellConfigCommon (PhysCellId %d, ABSFREQSSB %d, DLBand %d, ABSFREQPOINTA %d, DLBW %d,RACH_TargetReceivedPower %d\n",
|
||||
(int)*scc->physCellId,
|
||||
(int)*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB,
|
||||
@@ -1288,9 +1288,10 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc)
|
||||
rrc->sctp_out_streams = (uint16_t)*(SCTPParams[GNB_SCTP_OUTSTREAMS_IDX].uptr);
|
||||
}
|
||||
|
||||
|
||||
|
||||
rrc->nr_cellid = (uint64_t)*(GNBParamList.paramarray[i][GNB_NRCELLID_IDX].u64ptr);
|
||||
|
||||
rrc->f1_instance = -1;
|
||||
rrc->nr_cellid = (uint64_t) * (GNBParamList.paramarray[i][GNB_NRCELLID_IDX].u64ptr);
|
||||
rrc->carrier.physCellId = *scc->physCellId;
|
||||
|
||||
rrc->um_on_default_drb = *(GNBParamList.paramarray[i][GNB_UMONDEFAULTDRB_IDX].uptr);
|
||||
@@ -1550,6 +1551,7 @@ int RCconfig_NR_NG(MessageDef *msg_p, uint32_t i) {
|
||||
else
|
||||
NGAP_REGISTER_GNB_REQ(msg_p).broadcast_plmn_num[l] = 0;
|
||||
*/
|
||||
NGAP_REGISTER_GNB_REQ(msg_p).broadcast_plmn_num[l] = 0;
|
||||
|
||||
AssertFatal(NGAP_REGISTER_GNB_REQ(msg_p).broadcast_plmn_num[l] <= NGAP_REGISTER_GNB_REQ(msg_p).num_plmn,
|
||||
"List of broadcast PLMN to be sent to AMF can not be longer than actual "
|
||||
@@ -1947,8 +1949,8 @@ int RCconfig_NR_DU_F1(MessageDef *msg_p, uint32_t i) {
|
||||
f1Setup->DU_f1_ip_address.ipv4 = 1;
|
||||
//strcpy(f1Setup->DU_f1_ip_address.ipv6_address, "");
|
||||
strcpy(f1Setup->DU_f1_ip_address.ipv4_address, RC.nrmac[k]->eth_params_n.my_addr);
|
||||
f1Setup->DUport= RC.nrmac[k]->eth_params_n.my_portd;
|
||||
f1Setup->CUport= RC.nrmac[k]->eth_params_n.remote_portd;
|
||||
f1Setup->DUport= RC.nrmac[k]->eth_params_n.my_portd;
|
||||
f1Setup->CUport= RC.nrmac[k]->eth_params_n.remote_portd;
|
||||
//strcpy(f1Setup->CU_ip_address[l].ipv6_address,*(F1ParamList.paramarray[l][ENB_CU_IPV6_ADDRESS_IDX].strptr));
|
||||
sprintf(aprefix,"%s.[%i].%s",GNB_CONFIG_STRING_GNB_LIST,k,GNB_CONFIG_STRING_SCTP_CONFIG);
|
||||
config_get(SCTPParams,sizeof(SCTPParams)/sizeof(paramdef_t),aprefix);
|
||||
@@ -2299,10 +2301,10 @@ ngran_node_t get_node_type(void)
|
||||
|
||||
config_getlist( &GNBParamList,GNBParams,sizeof(GNBParams)/sizeof(paramdef_t),NULL);
|
||||
|
||||
if (GNBParamList.numelt == 0) // We have no valid configuration, let's return a default
|
||||
if (GNBParamList.numelt == 0) // We have no valid configuration, let's return a default
|
||||
return ngran_gNB;
|
||||
|
||||
config_getlist( &MacRLC_ParamList,MacRLC_Params,sizeof(MacRLC_Params)/sizeof(paramdef_t), NULL);
|
||||
|
||||
config_getlist( &MacRLC_ParamList,MacRLC_Params,sizeof(MacRLC_Params)/sizeof(paramdef_t), NULL);
|
||||
char aprefix[MAX_OPTNAME_SIZE*2 + 8];
|
||||
sprintf(aprefix, "%s.[%i]", GNB_CONFIG_STRING_GNB_LIST, 0);
|
||||
config_getlist( &GNBE1ParamList, GNBE1Params, sizeof(GNBE1Params)/sizeof(paramdef_t), aprefix);
|
||||
|
||||
@@ -328,7 +328,7 @@ void ue_context_release_command(const f1ap_ue_context_release_cmd_t *cmd)
|
||||
du_remove_f1_ue_data(cmd->gNB_DU_ue_id);
|
||||
}
|
||||
|
||||
void dl_rrc_message_transfer(const f1ap_dl_rrc_message_t *dl_rrc)
|
||||
void dl_rrc_message_transfer(int dest_itti, const f1ap_dl_rrc_message_t *dl_rrc)
|
||||
{
|
||||
LOG_D(NR_MAC,
|
||||
"DL RRC Message Transfer with %d bytes for RNTI %04x SRB %d\n",
|
||||
|
||||
@@ -31,6 +31,6 @@ void ue_context_modification_confirm(const f1ap_ue_context_modif_confirm_t *conf
|
||||
void ue_context_modification_refuse(const f1ap_ue_context_modif_refuse_t *refuse);
|
||||
void ue_context_release_command(const f1ap_ue_context_release_cmd_t *cmd);
|
||||
|
||||
void dl_rrc_message_transfer(const f1ap_dl_rrc_message_t *dl_rrc);
|
||||
void dl_rrc_message_transfer(int dest_itti, const f1ap_dl_rrc_message_t *dl_rrc);
|
||||
|
||||
#endif /* MAC_RRC_DL_HANDLER_H */
|
||||
|
||||
@@ -249,20 +249,12 @@ static void do_pdcp_data_ind(
|
||||
nr_pdcp_entity_t *rb;
|
||||
ue_id_t rntiMaybeUEid = ctxt_pP->rntiMaybeUEid;
|
||||
|
||||
if (ctxt_pP->module_id != 0 ||
|
||||
//ctxt_pP->enb_flag != 1 ||
|
||||
ctxt_pP->instance != 0 ||
|
||||
ctxt_pP->eNB_index != 0 ||
|
||||
ctxt_pP->brOption != 0) {
|
||||
LOG_E(PDCP, "%s:%d:%s: fatal\n", __FILE__, __LINE__, __FUNCTION__);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (ctxt_pP->enb_flag)
|
||||
T(T_ENB_PDCP_UL, T_INT(ctxt_pP->module_id), T_INT(rntiMaybeUEid), T_INT(rb_id), T_INT(sdu_buffer_size));
|
||||
|
||||
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
|
||||
ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, rntiMaybeUEid);
|
||||
ue->du_destination = ctxt_pP->instance;
|
||||
|
||||
if (srb_flagP == 1) {
|
||||
if (rb_id < 1 || rb_id > 2)
|
||||
@@ -733,7 +725,7 @@ srb_found:
|
||||
AssertFatal(ul_rrc->rrc_container != NULL, "OUT OF MEMORY\n");
|
||||
memcpy(ul_rrc->rrc_container, buf, size);
|
||||
ul_rrc->rrc_container_length = size;
|
||||
itti_send_msg_to_task(TASK_RRC_GNB, 0, message_p);
|
||||
itti_send_msg_to_task(TASK_RRC_GNB, ue->du_destination, message_p);
|
||||
} else {
|
||||
uint8_t *rrc_buffer_p = itti_malloc(TASK_PDCP_UE, TASK_RRC_NRUE, size);
|
||||
AssertFatal(rrc_buffer_p != NULL, "OUT OF MEMORY\n");
|
||||
@@ -1112,16 +1104,6 @@ bool nr_pdcp_data_req_drb(protocol_ctxt_t *ctxt_pP,
|
||||
nr_pdcp_entity_t *rb;
|
||||
ue_id_t ue_id = ctxt_pP->rntiMaybeUEid;
|
||||
|
||||
if (ctxt_pP->module_id != 0 ||
|
||||
//ctxt_pP->enb_flag != 1 ||
|
||||
ctxt_pP->instance != 0 ||
|
||||
ctxt_pP->eNB_index != 0 /*||
|
||||
ctxt_pP->configured != 1 ||
|
||||
ctxt_pP->brOption != 0*/) {
|
||||
LOG_E(PDCP, "%s:%d:%s: fatal\n", __FILE__, __LINE__, __FUNCTION__);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
|
||||
|
||||
ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, ue_id);
|
||||
|
||||
@@ -30,6 +30,7 @@ typedef void nr_pdcp_ue_manager_t;
|
||||
|
||||
typedef struct nr_pdcp_ue_t {
|
||||
ue_id_t rntiMaybeUEid;
|
||||
instance_t du_destination;
|
||||
nr_pdcp_entity_t *srb[3];
|
||||
nr_pdcp_entity_t *drb[MAX_DRBS_PER_UE];
|
||||
} nr_pdcp_ue_t;
|
||||
|
||||
@@ -162,10 +162,12 @@ static int drb_config_gtpu_create(const protocol_ctxt_t *const ctxt_p,
|
||||
|
||||
static void cucp_cuup_bearer_context_setup_direct(e1ap_bearer_setup_req_t *const req, instance_t instance)
|
||||
{
|
||||
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[instance], req->gNB_cu_cp_ue_id);
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[instance];
|
||||
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(rrc, req->gNB_cu_cp_ue_id);
|
||||
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
||||
|
||||
protocol_ctxt_t ctxt = {0};
|
||||
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, 0, GNB_FLAG_YES, UE->rrc_ue_id, 0, 0, 0);
|
||||
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, instance, GNB_FLAG_YES, UE->rrc_ue_id, 0, 0, 0);
|
||||
|
||||
e1ap_bearer_setup_resp_t resp = {0};
|
||||
resp.numPDUSessions = req->numPDUSessions;
|
||||
@@ -181,21 +183,20 @@ static void cucp_cuup_bearer_context_setup_direct(e1ap_bearer_setup_req_t *const
|
||||
}
|
||||
}
|
||||
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
|
||||
// GTP tunnel for UL
|
||||
NR_DRB_ToAddModList_t *DRB_configList = fill_DRB_configList(UE);
|
||||
int ret = drb_config_gtpu_create(&ctxt, ue_context_p, req, DRB_configList, rrc->e1_inst);
|
||||
if (ret < 0) AssertFatal(false, "Unable to configure DRB or to create GTP Tunnel\n");
|
||||
// the code is very badly organized, it is not possible here to call freeDRBlist()
|
||||
// the code is very badly organized, it is not possible here to call freeDRBlist()
|
||||
ASN_STRUCT_FREE(asn_DEF_NR_DRB_ToAddModList,DRB_configList );
|
||||
|
||||
// Used to store teids: if monolithic, will simply be NULL
|
||||
if(!NODE_IS_CU(RC.nrrrc[ctxt.module_id]->node_type)) {
|
||||
if(!NODE_IS_CU(rrc->node_type)) {
|
||||
// intentionally empty
|
||||
} else {
|
||||
int remote_port = RC.nrrrc[ctxt.module_id]->eth_params_s.remote_portd;
|
||||
in_addr_t my_addr = inet_addr(RC.nrrrc[ctxt.module_id]->eth_params_s.my_addr);
|
||||
instance_t gtpInst = getCxt(CUtype, instance)->gtpInst;
|
||||
int remote_port = rrc->eth_params_s.remote_portd;
|
||||
in_addr_t my_addr = inet_addr(rrc->eth_params_s.my_addr);
|
||||
instance_t gtpInst = getCxt(CUtype, rrc->f1_instance)->gtpInst;
|
||||
// GTP tunnel for DL
|
||||
fill_e1ap_bearer_setup_resp(&resp, req, gtpInst, UE->rrc_ue_id, remote_port, my_addr);
|
||||
}
|
||||
@@ -208,9 +209,9 @@ static void cucp_cuup_bearer_context_setup_direct(e1ap_bearer_setup_req_t *const
|
||||
static void cucp_cuup_bearer_context_mod_direct(e1ap_bearer_setup_req_t *const req, instance_t instance)
|
||||
{
|
||||
// only update GTP tunnels if it is really a CU
|
||||
if (!NODE_IS_CU(RC.nrrrc[0]->node_type))
|
||||
if (!NODE_IS_CU(RC.nrrrc[instance]->node_type))
|
||||
return;
|
||||
instance_t gtpInst = getCxt(CUtype, instance)->gtpInst;
|
||||
instance_t gtpInst = getCxt(CUtype, RC.nrrrc[instance]->f1_instance)->gtpInst;
|
||||
CU_update_UP_DL_tunnel(req, gtpInst, req->gNB_cu_cp_ue_id);
|
||||
}
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ typedef void (*ue_context_modification_confirm_func_t)(const f1ap_ue_context_mod
|
||||
typedef void (*ue_context_modification_refuse_func_t)(const f1ap_ue_context_modif_refuse_t *refuse);
|
||||
typedef void (*ue_context_release_command_func_t)(const f1ap_ue_context_release_cmd_t *cmd);
|
||||
|
||||
typedef void (*dl_rrc_message_transfer_func_t)(const f1ap_dl_rrc_message_t *dl_rrc);
|
||||
typedef void (*dl_rrc_message_transfer_func_t)(int dest_itti, const f1ap_dl_rrc_message_t *dl_rrc);
|
||||
|
||||
struct nr_mac_rrc_dl_if_s;
|
||||
void mac_rrc_dl_direct_init(struct nr_mac_rrc_dl_if_s *mac_rrc);
|
||||
|
||||
@@ -110,7 +110,7 @@ static void ue_context_release_command_f1ap(const f1ap_ue_context_release_cmd_t
|
||||
itti_send_msg_to_task (TASK_CU_F1, 0, message_p);
|
||||
}
|
||||
|
||||
static void dl_rrc_message_transfer_f1ap(const f1ap_dl_rrc_message_t *dl_rrc)
|
||||
static void dl_rrc_message_transfer_f1ap(int dest_itti, const f1ap_dl_rrc_message_t *dl_rrc)
|
||||
{
|
||||
/* TODO call F1AP function directly? no real-time constraint here */
|
||||
|
||||
@@ -128,7 +128,7 @@ static void dl_rrc_message_transfer_f1ap(const f1ap_dl_rrc_message_t *dl_rrc)
|
||||
msg->rrc_container_length = dl_rrc->rrc_container_length;
|
||||
memcpy(msg->rrc_container, dl_rrc->rrc_container, dl_rrc->rrc_container_length);
|
||||
}
|
||||
itti_send_msg_to_task (TASK_CU_F1, 0, message_p);
|
||||
itti_send_msg_to_task (TASK_CU_F1, dest_itti, message_p);
|
||||
}
|
||||
|
||||
void mac_rrc_dl_f1ap_init(nr_mac_rrc_dl_if_t *mac_rrc)
|
||||
|
||||
@@ -381,8 +381,9 @@ typedef struct gNB_RRC_INST_s {
|
||||
|
||||
ngran_node_t node_type;
|
||||
uint32_t node_id;
|
||||
char *node_name;
|
||||
char *node_name;
|
||||
int module_id;
|
||||
instance_t f1_instance;
|
||||
eth_params_t eth_params_s;
|
||||
rrc_gNB_carrier_data_t carrier;
|
||||
uid_allocator_t uid_allocator;
|
||||
|
||||
@@ -197,7 +197,7 @@ static void rrc_deliver_dl_rrc_message(void *deliver_pdu_data, ue_id_t ue_id, in
|
||||
data->dl_rrc->rrc_container = (uint8_t *)buf;
|
||||
data->dl_rrc->rrc_container_length = size;
|
||||
DevAssert(data->dl_rrc->srb_id == srb_id);
|
||||
data->rrc->mac_rrc.dl_rrc_message_transfer(data->dl_rrc);
|
||||
data->rrc->mac_rrc.dl_rrc_message_transfer(0, data->dl_rrc);
|
||||
}
|
||||
|
||||
|
||||
@@ -213,6 +213,26 @@ void nr_rrc_transfer_protected_rrc_message(const gNB_RRC_INST *rrc, const gNB_RR
|
||||
///---------------------------------------------------------------------------------------------------------------///
|
||||
///---------------------------------------------------------------------------------------------------------------///
|
||||
|
||||
static instance_t get_instance_by_NR_cellid(uint64_t nr_cellid)
|
||||
{
|
||||
for (int i = 0; i < RC.nb_nr_inst; i++) {
|
||||
if (RC.nrrrc[i] && RC.nrrrc[i]->nr_cellid == nr_cellid) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static instance_t get_instance_by_F1_instance(instance_t f1_instance)
|
||||
{
|
||||
for (int i = 0; i < RC.nb_nr_inst; i++) {
|
||||
if (RC.nrrrc[i] && RC.nrrrc[i]->f1_instance == f1_instance) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void init_NR_SI(gNB_RRC_INST *rrc, gNB_RrcConfigurationReq *configuration)
|
||||
{
|
||||
|
||||
@@ -435,13 +455,18 @@ static void rrc_gNB_generate_RRCSetup(instance_t instance,
|
||||
freeSRBlist(SRBs);
|
||||
f1_ue_data_t ue_data = cu_get_f1_ue_data(ue_p->rrc_ue_id);
|
||||
f1ap_dl_rrc_message_t dl_rrc = {
|
||||
.gNB_CU_ue_id = ue_p->rrc_ue_id,
|
||||
.gNB_DU_ue_id = ue_data.secondary_ue,
|
||||
.rrc_container = buf,
|
||||
.rrc_container_length = size,
|
||||
.srb_id = CCCH
|
||||
.gNB_CU_ue_id = ue_p->rrc_ue_id,
|
||||
.gNB_DU_ue_id = ue_data.secondary_ue,
|
||||
.rrc_container = buf,
|
||||
.rrc_container_length = size,
|
||||
.srb_id = CCCH
|
||||
};
|
||||
rrc->mac_rrc.dl_rrc_message_transfer(&dl_rrc);
|
||||
|
||||
int i = instance;
|
||||
if (NODE_IS_CU(RC.nrrrc[instance]->node_type)) {
|
||||
i = RC.nrrrc[instance]->f1_instance;
|
||||
}
|
||||
rrc->mac_rrc.dl_rrc_message_transfer(i, &dl_rrc);
|
||||
}
|
||||
|
||||
static void rrc_gNB_generate_RRCReject(module_id_t module_id, rrc_gNB_ue_context_t *const ue_context_pP)
|
||||
@@ -472,7 +497,7 @@ static void rrc_gNB_generate_RRCReject(module_id_t module_id, rrc_gNB_ue_context
|
||||
.execute_duplication = 1,
|
||||
.RAT_frequency_priority_information.en_dc = 0
|
||||
};
|
||||
rrc->mac_rrc.dl_rrc_message_transfer(&dl_rrc);
|
||||
rrc->mac_rrc.dl_rrc_message_transfer(0, &dl_rrc);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -1856,89 +1881,88 @@ int rrc_gNB_decode_dcch(const protocol_ctxt_t *const ctxt_pP,
|
||||
return 0;
|
||||
}
|
||||
|
||||
void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *f1_setup_req) {
|
||||
void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *f1_setup_req, instance_t instance) {
|
||||
|
||||
LOG_I(NR_RRC,"Received F1 Setup Request from gNB_DU %llu (%s)\n",(unsigned long long int)f1_setup_req->gNB_DU_id,f1_setup_req->gNB_DU_name);
|
||||
|
||||
int cu_cell_ind = 0;
|
||||
MessageDef *msg_p =itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_SETUP_RESP);
|
||||
F1AP_SETUP_RESP (msg_p).num_cells_to_activate = 0;
|
||||
MessageDef *msg_p2=itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_GNB_CU_CONFIGURATION_UPDATE);
|
||||
|
||||
for (int i = 0; i < f1_setup_req->num_cells_available; i++) {
|
||||
for (int j=0; j<RC.nb_nr_inst; j++) {
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[j];
|
||||
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[instance];
|
||||
|
||||
if (rrc->configuration.mcc[0] == f1_setup_req->cell[i].mcc &&
|
||||
rrc->configuration.mnc[0] == f1_setup_req->cell[i].mnc &&
|
||||
rrc->nr_cellid == f1_setup_req->cell[i].nr_cellid) {
|
||||
//fixme: multi instance is not consistent here
|
||||
F1AP_SETUP_RESP (msg_p).gNB_CU_name = rrc->node_name;
|
||||
// check that CU rrc instance corresponds to mcc/mnc/cgi (normally cgi should be enough, but just in case)
|
||||
LOG_W(NR_RRC, "instance %d sib1 length %d\n", i, f1_setup_req->sib1_length[i]);
|
||||
AssertFatal(rrc->carrier.mib == NULL, "CU MIB is already initialized: double F1 setup request?\n");
|
||||
asn_dec_rval_t dec_rval = uper_decode_complete(NULL,
|
||||
&asn_DEF_NR_BCCH_BCH_Message,
|
||||
(void **)&rrc->carrier.mib,
|
||||
f1_setup_req->mib[i],
|
||||
f1_setup_req->mib_length[i]);
|
||||
AssertFatal(dec_rval.code == RC_OK,
|
||||
"[gNB_CU %"PRIu8"] Failed to decode NR_BCCH_BCH_MESSAGE (%zu bits)\n",
|
||||
j,
|
||||
dec_rval.consumed );
|
||||
//fixme: multi instance is not consistent here
|
||||
F1AP_SETUP_RESP (msg_p).gNB_CU_name = rrc->node_name;
|
||||
// check that CU rrc instance corresponds to mcc/mnc/cgi (normally cgi should be enough, but just in case)
|
||||
LOG_W(NR_RRC, "instance %d sib1 length %d\n", i, f1_setup_req->sib1_length[i]);
|
||||
AssertFatal(rrc->carrier.mib == NULL, "CU MIB is already initialized: double F1 setup request?\n");
|
||||
asn_dec_rval_t dec_rval = uper_decode_complete(NULL,
|
||||
&asn_DEF_NR_BCCH_BCH_Message,
|
||||
(void **)&rrc->carrier.mib,
|
||||
f1_setup_req->mib[i],
|
||||
f1_setup_req->mib_length[i]);
|
||||
AssertFatal(dec_rval.code == RC_OK,
|
||||
"[gNB_CU %"PRIu8"] Failed to decode NR_BCCH_BCH_MESSAGE (%zu bits)\n",
|
||||
(uint8_t)instance,
|
||||
dec_rval.consumed );
|
||||
|
||||
dec_rval = uper_decode_complete(NULL,
|
||||
&asn_DEF_NR_SIB1, //&asn_DEF_NR_BCCH_DL_SCH_Message,
|
||||
(void **)&rrc->carrier.siblock1_DU,
|
||||
f1_setup_req->sib1[i],
|
||||
f1_setup_req->sib1_length[i]);
|
||||
AssertFatal(dec_rval.code == RC_OK,
|
||||
"[gNB_DU %"PRIu8"] Failed to decode NR_BCCH_DLSCH_MESSAGE (%zu bits)\n",
|
||||
j,
|
||||
dec_rval.consumed );
|
||||
dec_rval = uper_decode_complete(NULL,
|
||||
&asn_DEF_NR_SIB1,
|
||||
(void **)&rrc->carrier.siblock1_DU,
|
||||
f1_setup_req->sib1[i],
|
||||
f1_setup_req->sib1_length[i]);
|
||||
|
||||
// Parse message and extract SystemInformationBlockType1 field
|
||||
rrc->carrier.sib1 = rrc->carrier.siblock1_DU;
|
||||
if ( LOG_DEBUGFLAG(DEBUG_ASN1)){
|
||||
LOG_I(NR_RRC, "Printing received SIB1 container inside F1 setup request message:\n");
|
||||
xer_fprint(stdout, &asn_DEF_NR_SIB1,(void *)rrc->carrier.sib1);
|
||||
}
|
||||
AssertFatal(dec_rval.code == RC_OK,
|
||||
"[gNB_DU %"PRIu8"] Failed to decode NR_BCCH_DLSCH_MESSAGE (%zu bits)\n",
|
||||
(uint8_t)instance,
|
||||
dec_rval.consumed );
|
||||
|
||||
rrc->carrier.physCellId = f1_setup_req->cell[i].nr_pci;
|
||||
|
||||
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).gNB_CU_name = rrc->node_name;
|
||||
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).cells_to_activate[cu_cell_ind].mcc = rrc->configuration.mcc[0];
|
||||
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).cells_to_activate[cu_cell_ind].mnc = rrc->configuration.mnc[0];
|
||||
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).cells_to_activate[cu_cell_ind].mnc_digit_length = rrc->configuration.mnc_digit_length[0];
|
||||
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).cells_to_activate[cu_cell_ind].nr_cellid = rrc->nr_cellid;
|
||||
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).cells_to_activate[cu_cell_ind].nrpci = f1_setup_req->cell[i].nr_pci;
|
||||
int num_SI= 0;
|
||||
|
||||
if (rrc->carrier.SIB23) {
|
||||
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).cells_to_activate[cu_cell_ind].SI_container[2] = rrc->carrier.SIB23;
|
||||
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).cells_to_activate[cu_cell_ind].SI_container_length[2] = rrc->carrier.sizeof_SIB23;
|
||||
num_SI++;
|
||||
}
|
||||
|
||||
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).cells_to_activate[cu_cell_ind].num_SI = num_SI;
|
||||
cu_cell_ind++;
|
||||
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).num_cells_to_activate = cu_cell_ind;
|
||||
// send
|
||||
break;
|
||||
} else {// setup_req mcc/mnc match rrc internal list element
|
||||
LOG_W(NR_RRC,"[Inst %d] No matching MCC/MNC: rrc->mcc/f1_setup_req->mcc %d/%d rrc->mnc/f1_setup_req->mnc %d/%d rrc->nr_cellid/f1_setup_req->nr_cellid %ld/%ld \n",
|
||||
j, rrc->configuration.mcc[0], f1_setup_req->cell[i].mcc,
|
||||
rrc->configuration.mnc[0], f1_setup_req->cell[i].mnc,
|
||||
rrc->nr_cellid, f1_setup_req->cell[i].nr_cellid);
|
||||
// Parse message and extract SystemInformationBlockType1 field
|
||||
rrc->carrier.sib1 = rrc->carrier.siblock1_DU;
|
||||
if (LOG_DEBUGFLAG(DEBUG_ASN1)){
|
||||
LOG_I(NR_RRC, "Printing received SIB1 container inside F1 setup request message:\n");
|
||||
xer_fprint(stdout, &asn_DEF_NR_SIB1,(void *)rrc->carrier.sib1);
|
||||
}
|
||||
}// for (int j=0;j<RC.nb_inst;j++)
|
||||
|
||||
rrc->carrier.physCellId = f1_setup_req->cell[i].nr_pci;
|
||||
|
||||
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).gNB_CU_name = rrc->node_name;
|
||||
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).cells_to_activate[cu_cell_ind].mcc = rrc->configuration.mcc[0];
|
||||
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).cells_to_activate[cu_cell_ind].mnc = rrc->configuration.mnc[0];
|
||||
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).cells_to_activate[cu_cell_ind].mnc_digit_length = rrc->configuration.mnc_digit_length[0];
|
||||
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).cells_to_activate[cu_cell_ind].nr_cellid = rrc->nr_cellid;
|
||||
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).cells_to_activate[cu_cell_ind].nrpci = f1_setup_req->cell[i].nr_pci;
|
||||
|
||||
int num_SI= 0;
|
||||
if (rrc->carrier.SIB23) {
|
||||
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).cells_to_activate[cu_cell_ind].SI_container[2] = rrc->carrier.SIB23;
|
||||
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).cells_to_activate[cu_cell_ind].SI_container_length[2] = rrc->carrier.sizeof_SIB23;
|
||||
num_SI++;
|
||||
}
|
||||
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).cells_to_activate[cu_cell_ind].num_SI = num_SI;
|
||||
|
||||
cu_cell_ind++;
|
||||
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).num_cells_to_activate = cu_cell_ind;
|
||||
|
||||
} else { // setup_req mcc/mnc match rrc internal list element
|
||||
LOG_W(NR_RRC, "[Inst %d] No matching MCC/MNC: rrc->mcc/f1_setup_req->mcc %d/%d rrc->mnc/f1_setup_req->mnc %d/%d rrc->nr_cellid/f1_setup_req->nr_cellid %ld/%ld \n",
|
||||
(uint8_t)instance, rrc->configuration.mcc[0], f1_setup_req->cell[i].mcc,
|
||||
rrc->configuration.mnc[0], f1_setup_req->cell[i].mnc,
|
||||
rrc->nr_cellid, f1_setup_req->cell[i].nr_cellid);
|
||||
}
|
||||
|
||||
if (cu_cell_ind == 0) {
|
||||
AssertFatal(1 == 0, "No cell found\n");
|
||||
} else {
|
||||
} else {
|
||||
// send ITTI message to F1AP-CU task
|
||||
itti_send_msg_to_task (TASK_CU_F1, 0, msg_p);
|
||||
|
||||
itti_send_msg_to_task (TASK_CU_F1, 0, msg_p2);
|
||||
|
||||
itti_send_msg_to_task (TASK_CU_F1, rrc->f1_instance, msg_p);
|
||||
itti_send_msg_to_task (TASK_CU_F1, rrc->f1_instance, msg_p2);
|
||||
}
|
||||
|
||||
// handle other failure cases
|
||||
@@ -1948,21 +1972,17 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *f1_setup_req) {
|
||||
void rrc_gNB_process_initial_ul_rrc_message(const f1ap_initial_ul_rrc_message_t *ul_rrc)
|
||||
{
|
||||
// first get RRC instance (note, no the ITTI instance)
|
||||
module_id_t i = 0;
|
||||
for (i=0; i < RC.nb_nr_inst; i++) {
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[i];
|
||||
if (rrc->nr_cellid == ul_rrc->nr_cellid)
|
||||
break;
|
||||
}
|
||||
module_id_t module_id = get_instance_by_NR_cellid(ul_rrc->nr_cellid);
|
||||
|
||||
//AssertFatal(i != RC.nb_nr_inst, "Cell_id not found\n");
|
||||
// TODO REMOVE_DU_RRC in monolithic mode, the MAC does not have the
|
||||
// nr_cellid. Thus, the above check would fail. For the time being, just put
|
||||
// a warning, as we handle one DU only anyway
|
||||
if (i == RC.nb_nr_inst) {
|
||||
i = 0;
|
||||
if (module_id >= RC.nb_nr_inst) {
|
||||
module_id = 0;
|
||||
LOG_W(RRC, "initial UL RRC message nr_cellid %ld does not match RRC's %ld\n", ul_rrc->nr_cellid, RC.nrrrc[0]->nr_cellid);
|
||||
}
|
||||
nr_rrc_gNB_decode_ccch(i, ul_rrc);
|
||||
nr_rrc_gNB_decode_ccch(module_id, ul_rrc);
|
||||
|
||||
if (ul_rrc->rrc_container)
|
||||
free(ul_rrc->rrc_container);
|
||||
@@ -2055,7 +2075,7 @@ static void rrc_CU_process_ue_context_release_complete(MessageDef *msg_p)
|
||||
static void rrc_CU_process_ue_context_modification_response(MessageDef *msg_p, instance_t instance)
|
||||
{
|
||||
f1ap_ue_context_modif_resp_t *resp = &F1AP_UE_CONTEXT_MODIFICATION_RESP(msg_p);
|
||||
protocol_ctxt_t ctxt = {.rntiMaybeUEid = resp->gNB_CU_ue_id, .module_id = instance, .instance = instance, .enb_flag = 1, .eNB_index = instance};
|
||||
protocol_ctxt_t ctxt = {.rntiMaybeUEid = resp->gNB_CU_ue_id, .module_id = instance, .instance = RC.nrrrc[instance]->f1_instance, .enb_flag = 1, .eNB_index = instance};
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
|
||||
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(rrc, resp->gNB_CU_ue_id);
|
||||
if (!ue_context_p) {
|
||||
@@ -2582,19 +2602,24 @@ void *rrc_gnb_task(void *args_p) {
|
||||
|
||||
/* Messages from PDCP */
|
||||
case F1AP_UL_RRC_MESSAGE:
|
||||
if (NODE_IS_CU(RC.nrrrc[instance]->node_type)) {
|
||||
instance = get_instance_by_F1_instance(instance);
|
||||
}
|
||||
PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt,
|
||||
instance,
|
||||
GNB_FLAG_YES,
|
||||
F1AP_UL_RRC_MESSAGE(msg_p).gNB_CU_ue_id,
|
||||
0,
|
||||
0);
|
||||
LOG_D(NR_RRC,
|
||||
"Decoding DCCH %d: ue %04lx, inst %ld, ctxt %p, size %d\n",
|
||||
F1AP_UL_RRC_MESSAGE(msg_p).srb_id,
|
||||
ctxt.rntiMaybeUEid,
|
||||
instance,
|
||||
&ctxt,
|
||||
F1AP_UL_RRC_MESSAGE(msg_p).rrc_container_length);
|
||||
if (NODE_IS_CU(RC.nrrrc[ctxt.module_id]->node_type)) {
|
||||
ctxt.instance = RC.nrrrc[ctxt.module_id]->f1_instance;
|
||||
}
|
||||
LOG_D(NR_RRC,"Decoding DCCH %d: ue %04lx, inst %ld, ctxt %p, size %d\n",
|
||||
F1AP_UL_RRC_MESSAGE(msg_p).srb_id,
|
||||
ctxt.rntiMaybeUEid,
|
||||
instance,
|
||||
&ctxt,
|
||||
F1AP_UL_RRC_MESSAGE(msg_p).rrc_container_length);
|
||||
rrc_gNB_decode_dcch(&ctxt,
|
||||
F1AP_UL_RRC_MESSAGE(msg_p).srb_id,
|
||||
F1AP_UL_RRC_MESSAGE(msg_p).rrc_container,
|
||||
@@ -2603,10 +2628,16 @@ void *rrc_gnb_task(void *args_p) {
|
||||
break;
|
||||
|
||||
case NGAP_DOWNLINK_NAS:
|
||||
if (NODE_IS_CU(RC.nrrrc[instance]->node_type)) {
|
||||
instance = get_instance_by_F1_instance(instance);
|
||||
}
|
||||
rrc_gNB_process_NGAP_DOWNLINK_NAS(msg_p, instance, &rrc_gNB_mui);
|
||||
break;
|
||||
|
||||
case NGAP_PDUSESSION_SETUP_REQ:
|
||||
if (NODE_IS_CU(RC.nrrrc[instance]->node_type)) {
|
||||
instance = get_instance_by_F1_instance(instance);
|
||||
}
|
||||
rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(msg_p, instance);
|
||||
break;
|
||||
|
||||
@@ -2625,15 +2656,23 @@ void *rrc_gnb_task(void *args_p) {
|
||||
|
||||
/* Messages from F1AP task */
|
||||
case F1AP_SETUP_REQ:
|
||||
ctxt.module_id = get_instance_by_NR_cellid(F1AP_SETUP_REQ(msg_p).cell[0].nr_cellid);
|
||||
RC.nrrrc[ctxt.module_id]->f1_instance = instance;
|
||||
AssertFatal(NODE_IS_CU(RC.nrrrc[instance]->node_type), "should not receive F1AP_SETUP_REQUEST, need call by CU!\n");
|
||||
rrc_gNB_process_f1_setup_req(&F1AP_SETUP_REQ(msg_p));
|
||||
rrc_gNB_process_f1_setup_req(&F1AP_SETUP_REQ(msg_p), ctxt.module_id);
|
||||
break;
|
||||
|
||||
case F1AP_UE_CONTEXT_SETUP_RESP:
|
||||
if (NODE_IS_CU(RC.nrrrc[instance]->node_type)) {
|
||||
instance = get_instance_by_F1_instance(instance);
|
||||
}
|
||||
rrc_CU_process_ue_context_setup_response(msg_p, instance);
|
||||
break;
|
||||
|
||||
case F1AP_UE_CONTEXT_MODIFICATION_RESP:
|
||||
if (NODE_IS_CU(RC.nrrrc[instance]->node_type)) {
|
||||
instance = get_instance_by_F1_instance(instance);
|
||||
}
|
||||
rrc_CU_process_ue_context_modification_response(msg_p, instance);
|
||||
break;
|
||||
|
||||
@@ -2660,6 +2699,9 @@ void *rrc_gnb_task(void *args_p) {
|
||||
break;
|
||||
|
||||
case NGAP_INITIAL_CONTEXT_SETUP_REQ:
|
||||
if (NODE_IS_CU(RC.nrrrc[instance]->node_type)) {
|
||||
instance = get_instance_by_F1_instance(instance);
|
||||
}
|
||||
rrc_gNB_process_NGAP_INITIAL_CONTEXT_SETUP_REQ(msg_p, instance);
|
||||
break;
|
||||
|
||||
|
||||
@@ -89,7 +89,7 @@ int sctp_itti_send_association_ind(task_id_t task_id, instance_t instance,
|
||||
MessageDef *message_p;
|
||||
sctp_new_association_ind_t *sctp_new_association_ind_p;
|
||||
|
||||
message_p = itti_alloc_new_message(TASK_SCTP, 0, SCTP_NEW_ASSOCIATION_IND);
|
||||
message_p = itti_alloc_new_message(TASK_SCTP, instance, SCTP_NEW_ASSOCIATION_IND);
|
||||
|
||||
sctp_new_association_ind_p = &message_p->ittiMsg.sctp_new_association_ind;
|
||||
|
||||
|
||||
@@ -91,6 +91,7 @@ typedef struct sctp_cnx_list_elm_s {
|
||||
|
||||
static STAILQ_HEAD(sctp_cnx_list_head, sctp_cnx_list_elm_s) sctp_cnx_list;
|
||||
static uint16_t sctp_nb_cnx = 0;
|
||||
static uint16_t sctp_nb_accepted_associations = 0;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
struct sctp_cnx_list_elm_s *sctp_get_cnx(int32_t assoc_id, int sd)
|
||||
@@ -1051,32 +1052,27 @@ sctp_eNB_read_from_socket(
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
void
|
||||
static sctp_eNB_flush_sockets(
|
||||
struct epoll_event *events, int nb_events)
|
||||
static void sctp_eNB_flush_sockets(struct epoll_event *events, int nb_events)
|
||||
{
|
||||
int i;
|
||||
struct sctp_cnx_list_elm_s *sctp_cnx = NULL;
|
||||
for (int i = 0; i < nb_events; i++) {
|
||||
struct sctp_cnx_list_elm_s *sctp_cnx = sctp_get_cnx(-1, events[i].data.fd);
|
||||
|
||||
for (i = 0; i < nb_events; i++) {
|
||||
sctp_cnx = sctp_get_cnx(-1, events[i].data.fd);
|
||||
|
||||
if (sctp_cnx == NULL) {
|
||||
continue;
|
||||
}
|
||||
|
||||
SCTP_DEBUG("Found data for descriptor %d\n", events[i].data.fd);
|
||||
|
||||
if (sctp_cnx->connection_type == SCTP_TYPE_CLIENT) {
|
||||
sctp_eNB_read_from_socket(sctp_cnx);
|
||||
}
|
||||
else if (sctp_cnx->connection_type == SCTP_TYPE_MULTI_SERVER) {
|
||||
sctp_eNB_accept_associations_multi(sctp_cnx);
|
||||
}
|
||||
else {
|
||||
sctp_eNB_accept_associations(sctp_cnx);
|
||||
}
|
||||
if (sctp_cnx == NULL) {
|
||||
continue;
|
||||
}
|
||||
|
||||
SCTP_DEBUG("Found data for descriptor %d\n", events[i].data.fd);
|
||||
|
||||
if (sctp_cnx->connection_type == SCTP_TYPE_CLIENT) {
|
||||
sctp_eNB_read_from_socket(sctp_cnx);
|
||||
} else if (sctp_cnx->connection_type == SCTP_TYPE_MULTI_SERVER) {
|
||||
sctp_eNB_accept_associations_multi(sctp_cnx);
|
||||
} else {
|
||||
sctp_cnx->instance = sctp_nb_accepted_associations;
|
||||
sctp_eNB_accept_associations(sctp_cnx);
|
||||
sctp_nb_accepted_associations++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
389
targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb_2multDUs.conf
Normal file
389
targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb_2multDUs.conf
Normal file
@@ -0,0 +1,389 @@
|
||||
Active_gNBs = ("gNB-CU-DU0", "gNB-CU-DU1");
|
||||
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
Num_Threads_PUSCH = 8;
|
||||
|
||||
gNBs = (
|
||||
|
||||
########################### gNB-CU-DU0 ###########################
|
||||
{
|
||||
# Identification parameters:
|
||||
gNB_CU_ID = 0xe00;
|
||||
gNB_name = "gNB-CU-DU0";
|
||||
|
||||
# Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = 1;
|
||||
plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }) });
|
||||
|
||||
nr_cellid = 12345678L;
|
||||
|
||||
tr_s_preference = "f1";
|
||||
|
||||
local_s_if_name = "lo";
|
||||
local_s_address = "127.0.0.4";
|
||||
remote_s_address = "127.0.0.3";
|
||||
local_s_portc = 501;
|
||||
local_s_portd = 2152;
|
||||
remote_s_portc = 500;
|
||||
remote_s_portd = 2152;
|
||||
|
||||
min_rxtxtime = 6;
|
||||
do_CSIRS = 1;
|
||||
|
||||
servingCellConfigCommon = ({
|
||||
|
||||
# spCellConfigCommon
|
||||
physCellId = 0;
|
||||
|
||||
# downlinkConfigCommon
|
||||
# frequencyInfoDL
|
||||
# this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
|
||||
absoluteFrequencySSB = 641280;
|
||||
dl_frequencyBand = 78;
|
||||
# this is 3600 MHz
|
||||
dl_absoluteFrequencyPointA = 640008;
|
||||
# scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
dl_subcarrierSpacing = 1;
|
||||
dl_carrierBandwidth = 106;
|
||||
# initialDownlinkBWP
|
||||
# genericParameters
|
||||
# this is RBstart=27,L=48 (275*(L-1))+RBstart
|
||||
initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialDLBWPsubcarrierSpacing = 1;
|
||||
# pdcch-ConfigCommon
|
||||
initialDLBWPcontrolResourceSetZero = 12;
|
||||
initialDLBWPsearchSpaceZero = 0;
|
||||
|
||||
# uplinkConfigCommon
|
||||
# frequencyInfoUL
|
||||
ul_frequencyBand = 78;
|
||||
# scs-SpecificCarrierList
|
||||
ul_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
ul_subcarrierSpacing = 1;
|
||||
ul_carrierBandwidth = 106;
|
||||
pMax = 20;
|
||||
# initialUplinkBWP
|
||||
# genericParameters
|
||||
initialULBWPlocationAndBandwidth = 28875;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialULBWPsubcarrierSpacing = 1;
|
||||
|
||||
# rach-ConfigCommon
|
||||
# rach-ConfigGeneric
|
||||
prach_ConfigurationIndex = 98;
|
||||
# prach_msg1_FDM
|
||||
# 0 = one, 1=two, 2=four, 3=eight
|
||||
prach_msg1_FDM = 0;
|
||||
prach_msg1_FrequencyStart = 0;
|
||||
zeroCorrelationZoneConfig = 13;
|
||||
preambleReceivedTargetPower = -96;
|
||||
# preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||
preambleTransMax = 6;
|
||||
# powerRampingStep
|
||||
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||
powerRampingStep = 1;
|
||||
# ra_ReponseWindow
|
||||
# 1,2,4,8,10,20,40,80
|
||||
ra_ResponseWindow = 4;
|
||||
# ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||
# 1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
|
||||
# oneHalf (0..15) 4,8,12,16,...60,64
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14;
|
||||
# ra_ContentionResolutionTimer
|
||||
# (0..7) 8,16,24,32,40,48,56,64
|
||||
ra_ContentionResolutionTimer = 7;
|
||||
rsrp_ThresholdSSB = 19;
|
||||
# prach-RootSequenceIndex_PR
|
||||
# 1 = 839, 2 = 139
|
||||
prach_RootSequenceIndex_PR = 2;
|
||||
prach_RootSequenceIndex = 1;
|
||||
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||
msg1_SubcarrierSpacing = 1,
|
||||
# restrictedSetConfig
|
||||
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||
restrictedSetConfig = 0,
|
||||
msg3_DeltaPreamble = 1;
|
||||
p0_NominalWithGrant = -90;
|
||||
|
||||
# pucch-ConfigCommon setup :
|
||||
# pucchGroupHopping
|
||||
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||
pucchGroupHopping = 0;
|
||||
hoppingId = 40;
|
||||
p0_nominal = -90;
|
||||
|
||||
# ssb_PositionsInBurs_BitmapPR
|
||||
# 1=short, 2=medium, 3=long
|
||||
ssb_PositionsInBurst_PR = 2;
|
||||
ssb_PositionsInBurst_Bitmap = 2;
|
||||
|
||||
# ssb_periodicityServingCell
|
||||
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||
ssb_periodicityServingCell = 2;
|
||||
|
||||
# dmrs_TypeA_position
|
||||
# 0 = pos2, 1 = pos3
|
||||
dmrs_TypeA_Position = 0;
|
||||
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
subcarrierSpacing = 1;
|
||||
|
||||
# tdd-UL-DL-ConfigurationCommon
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
referenceSubcarrierSpacing = 1;
|
||||
|
||||
# pattern1
|
||||
# dl_UL_TransmissionPeriodicity
|
||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||
dl_UL_TransmissionPeriodicity = 6;
|
||||
nrofDownlinkSlots = 7;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 2;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
ssPBCH_BlockPower = -25;
|
||||
});
|
||||
|
||||
# SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
}
|
||||
|
||||
# AMF parameters:
|
||||
amf_ip_address = ({
|
||||
ipv4 = "192.168.70.132";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
});
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai";
|
||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24";
|
||||
GNB_INTERFACE_NAME_FOR_NGU = "demo-oai";
|
||||
GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24";
|
||||
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
}
|
||||
},
|
||||
|
||||
########################### gNB-CU-DU1 ###########################
|
||||
{
|
||||
# Identification parameters:
|
||||
gNB_CU_ID = 0xe00;
|
||||
gNB_name = "gNB-CU-DU1";
|
||||
|
||||
# Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = 1;
|
||||
plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }) });
|
||||
|
||||
nr_cellid = 11111111L;
|
||||
|
||||
tr_s_preference = "f1";
|
||||
|
||||
local_s_if_name = "lo";
|
||||
local_s_address = "127.0.0.6";
|
||||
remote_s_address = "127.0.0.5";
|
||||
local_s_portc = 501;
|
||||
local_s_portd = 2152;
|
||||
remote_s_portc = 500;
|
||||
remote_s_portd = 2152;
|
||||
|
||||
min_rxtxtime = 6;
|
||||
do_CSIRS = 1;
|
||||
|
||||
servingCellConfigCommon = ({
|
||||
|
||||
# spCellConfigCommon
|
||||
physCellId = 1;
|
||||
|
||||
# downlinkConfigCommon
|
||||
# frequencyInfoDL
|
||||
# this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
|
||||
absoluteFrequencySSB = 641280;
|
||||
dl_frequencyBand = 78;
|
||||
# this is 3600 MHz
|
||||
dl_absoluteFrequencyPointA = 640008;
|
||||
# scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
dl_subcarrierSpacing = 1;
|
||||
dl_carrierBandwidth = 106;
|
||||
# initialDownlinkBWP
|
||||
# genericParameters
|
||||
# this is RBstart=27,L=48 (275*(L-1))+RBstart
|
||||
initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialDLBWPsubcarrierSpacing = 1;
|
||||
# pdcch-ConfigCommon
|
||||
initialDLBWPcontrolResourceSetZero = 12;
|
||||
initialDLBWPsearchSpaceZero = 0;
|
||||
|
||||
# uplinkConfigCommon
|
||||
# frequencyInfoUL
|
||||
ul_frequencyBand = 78;
|
||||
# scs-SpecificCarrierList
|
||||
ul_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
ul_subcarrierSpacing = 1;
|
||||
ul_carrierBandwidth = 106;
|
||||
pMax = 20;
|
||||
# initialUplinkBWP
|
||||
# genericParameters
|
||||
initialULBWPlocationAndBandwidth = 28875;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialULBWPsubcarrierSpacing = 1;
|
||||
|
||||
# rach-ConfigCommon
|
||||
# rach-ConfigGeneric
|
||||
prach_ConfigurationIndex = 98;
|
||||
# prach_msg1_FDM
|
||||
# 0 = one, 1=two, 2=four, 3=eight
|
||||
prach_msg1_FDM = 0;
|
||||
prach_msg1_FrequencyStart = 0;
|
||||
zeroCorrelationZoneConfig = 13;
|
||||
preambleReceivedTargetPower = -96;
|
||||
# preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||
preambleTransMax = 6;
|
||||
# powerRampingStep
|
||||
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||
powerRampingStep = 1;
|
||||
# ra_ReponseWindow
|
||||
# 1,2,4,8,10,20,40,80
|
||||
ra_ResponseWindow = 4;
|
||||
# ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||
# 1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
|
||||
# oneHalf (0..15) 4,8,12,16,...60,64
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14;
|
||||
# ra_ContentionResolutionTimer
|
||||
# (0..7) 8,16,24,32,40,48,56,64
|
||||
ra_ContentionResolutionTimer = 7;
|
||||
rsrp_ThresholdSSB = 19;
|
||||
# prach-RootSequenceIndex_PR
|
||||
# 1 = 839, 2 = 139
|
||||
prach_RootSequenceIndex_PR = 2;
|
||||
prach_RootSequenceIndex = 1;
|
||||
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||
msg1_SubcarrierSpacing = 1,
|
||||
# restrictedSetConfig
|
||||
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||
restrictedSetConfig = 0,
|
||||
msg3_DeltaPreamble = 1;
|
||||
p0_NominalWithGrant = -90;
|
||||
|
||||
# pucch-ConfigCommon setup :
|
||||
# pucchGroupHopping
|
||||
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||
pucchGroupHopping = 0;
|
||||
hoppingId = 40;
|
||||
p0_nominal = -90;
|
||||
|
||||
# ssb_PositionsInBurs_BitmapPR
|
||||
# 1=short, 2=medium, 3=long
|
||||
ssb_PositionsInBurst_PR = 2;
|
||||
ssb_PositionsInBurst_Bitmap = 1;
|
||||
|
||||
# ssb_periodicityServingCell
|
||||
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||
ssb_periodicityServingCell = 2;
|
||||
|
||||
# dmrs_TypeA_position
|
||||
# 0 = pos2, 1 = pos3
|
||||
dmrs_TypeA_Position = 0;
|
||||
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
subcarrierSpacing = 1;
|
||||
|
||||
# tdd-UL-DL-ConfigurationCommon
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
referenceSubcarrierSpacing = 1;
|
||||
|
||||
# pattern1
|
||||
# dl_UL_TransmissionPeriodicity
|
||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||
dl_UL_TransmissionPeriodicity = 6;
|
||||
nrofDownlinkSlots = 7;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 2;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
ssPBCH_BlockPower = -25;
|
||||
});
|
||||
|
||||
# SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
}
|
||||
|
||||
# AMF parameters:
|
||||
amf_ip_address = ({
|
||||
ipv4 = "192.168.70.132";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
});
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai";
|
||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24";
|
||||
GNB_INTERFACE_NAME_FOR_NGU = "demo-oai";
|
||||
GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24";
|
||||
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
}
|
||||
});
|
||||
|
||||
security = {
|
||||
# preferred ciphering algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nea0, nea1, nea2, nea3
|
||||
ciphering_algorithms = ( "nea0" );
|
||||
|
||||
# preferred integrity algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nia0, nia1, nia2, nia3
|
||||
integrity_algorithms = ( "nia2", "nia0" );
|
||||
|
||||
# setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
|
||||
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
|
||||
drb_ciphering = "yes";
|
||||
drb_integrity = "no";
|
||||
}
|
||||
|
||||
log_config :
|
||||
{
|
||||
global_log_level ="info";
|
||||
hw_log_level ="info";
|
||||
phy_log_level ="info";
|
||||
mac_log_level ="info";
|
||||
rlc_log_level ="info";
|
||||
pdcp_log_level ="info";
|
||||
rrc_log_level ="info";
|
||||
f1ap_log_level ="debug";
|
||||
ngap_log_level ="debug";
|
||||
}
|
||||
219
targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb_pci0.conf
Normal file
219
targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb_pci0.conf
Normal file
@@ -0,0 +1,219 @@
|
||||
Active_gNBs = ("gNB-DU-PCI0");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
gNBs = ({
|
||||
|
||||
# Identification parameters:
|
||||
gNB_CU_ID = 0xe00;
|
||||
gNB_name = "gNB-DU-PCI0";
|
||||
|
||||
# Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = 1;
|
||||
plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }) });
|
||||
|
||||
nr_cellid = 12345678L;
|
||||
|
||||
# Physical parameters:
|
||||
|
||||
min_rxtxtime = 6;
|
||||
do_CSIRS = 1;
|
||||
|
||||
|
||||
servingCellConfigCommon = ({
|
||||
|
||||
# spCellConfigCommon
|
||||
physCellId = 0;
|
||||
|
||||
# downlinkConfigCommon
|
||||
# frequencyInfoDL
|
||||
# this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
|
||||
absoluteFrequencySSB = 641280;
|
||||
dl_frequencyBand = 78;
|
||||
# this is 3600 MHz
|
||||
dl_absoluteFrequencyPointA = 640008;
|
||||
# scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
dl_subcarrierSpacing = 1;
|
||||
dl_carrierBandwidth = 106;
|
||||
# initialDownlinkBWP
|
||||
# genericParameters
|
||||
# this is RBstart=27,L=48 (275*(L-1))+RBstart
|
||||
initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialDLBWPsubcarrierSpacing = 1;
|
||||
# pdcch-ConfigCommon
|
||||
initialDLBWPcontrolResourceSetZero = 12;
|
||||
initialDLBWPsearchSpaceZero = 0;
|
||||
|
||||
# uplinkConfigCommon
|
||||
# frequencyInfoUL
|
||||
ul_frequencyBand = 78;
|
||||
# scs-SpecificCarrierList
|
||||
ul_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
ul_subcarrierSpacing = 1;
|
||||
ul_carrierBandwidth = 106;
|
||||
pMax = 20;
|
||||
# initialUplinkBWP
|
||||
# genericParameters
|
||||
initialULBWPlocationAndBandwidth = 28875;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialULBWPsubcarrierSpacing = 1;
|
||||
|
||||
# rach-ConfigCommon
|
||||
# rach-ConfigGeneric
|
||||
prach_ConfigurationIndex = 98;
|
||||
# prach_msg1_FDM
|
||||
# 0 = one, 1=two, 2=four, 3=eight
|
||||
prach_msg1_FDM = 0;
|
||||
prach_msg1_FrequencyStart = 0;
|
||||
zeroCorrelationZoneConfig = 13;
|
||||
preambleReceivedTargetPower = -96;
|
||||
# preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||
preambleTransMax = 6;
|
||||
# powerRampingStep
|
||||
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||
powerRampingStep = 1;
|
||||
# ra_ReponseWindow
|
||||
# 1,2,4,8,10,20,40,80
|
||||
ra_ResponseWindow = 4;
|
||||
# ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||
# 1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
|
||||
# oneHalf (0..15) 4,8,12,16,...60,64
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14;
|
||||
# ra_ContentionResolutionTimer
|
||||
# (0..7) 8,16,24,32,40,48,56,64
|
||||
ra_ContentionResolutionTimer = 7;
|
||||
rsrp_ThresholdSSB = 19;
|
||||
# prach-RootSequenceIndex_PR
|
||||
# 1 = 839, 2 = 139
|
||||
prach_RootSequenceIndex_PR = 2;
|
||||
prach_RootSequenceIndex = 1;
|
||||
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||
msg1_SubcarrierSpacing = 1,
|
||||
# restrictedSetConfig
|
||||
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||
restrictedSetConfig = 0,
|
||||
msg3_DeltaPreamble = 1;
|
||||
p0_NominalWithGrant =-90;
|
||||
|
||||
# pucch-ConfigCommon setup :
|
||||
# pucchGroupHopping
|
||||
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||
pucchGroupHopping = 0;
|
||||
hoppingId = 40;
|
||||
p0_nominal = -90;
|
||||
|
||||
# ssb_PositionsInBurs_BitmapPR
|
||||
# 1=short, 2=medium, 3=long
|
||||
ssb_PositionsInBurst_PR = 2;
|
||||
ssb_PositionsInBurst_Bitmap = 2;
|
||||
|
||||
# ssb_periodicityServingCell
|
||||
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||
ssb_periodicityServingCell = 2;
|
||||
|
||||
# dmrs_TypeA_position
|
||||
# 0 = pos2, 1 = pos3
|
||||
dmrs_TypeA_Position = 0;
|
||||
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
subcarrierSpacing = 1;
|
||||
|
||||
# tdd-UL-DL-ConfigurationCommon
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
referenceSubcarrierSpacing = 1;
|
||||
|
||||
# pattern1
|
||||
# dl_UL_TransmissionPeriodicity
|
||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||
dl_UL_TransmissionPeriodicity = 6;
|
||||
nrofDownlinkSlots = 7;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 2;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
ssPBCH_BlockPower = -25;
|
||||
});
|
||||
|
||||
# SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
}
|
||||
});
|
||||
|
||||
MACRLCs = ({
|
||||
num_cc = 1;
|
||||
tr_s_preference = "local_L1";
|
||||
tr_n_preference = "f1";
|
||||
local_n_if_name = "lo";
|
||||
local_n_address = "127.0.0.3";
|
||||
remote_n_address = "127.0.0.4";
|
||||
local_n_portc = 500;
|
||||
local_n_portd = 2152;
|
||||
remote_n_portc = 501;
|
||||
remote_n_portd = 2152;
|
||||
});
|
||||
|
||||
L1s = ({
|
||||
num_cc = 1;
|
||||
tr_n_preference = "local_mac";
|
||||
prach_dtx_threshold = 160;
|
||||
pucch0_dtx_threshold = 150;
|
||||
ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
|
||||
});
|
||||
|
||||
RUs = ({
|
||||
local_rf = "yes"
|
||||
nb_tx = 1
|
||||
nb_rx = 1
|
||||
att_tx = 0
|
||||
att_rx = 0;
|
||||
bands = [78];
|
||||
max_pdschReferenceSignalPower = -27;
|
||||
max_rxgain = 114;
|
||||
eNB_instances = [0];
|
||||
#beamforming 1x4 matrix:
|
||||
bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
|
||||
clock_src = "internal";
|
||||
});
|
||||
|
||||
THREAD_STRUCT = ({
|
||||
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
||||
parallel_config = "PARALLEL_SINGLE_THREAD";
|
||||
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
|
||||
worker_config = "WORKER_ENABLE";
|
||||
});
|
||||
|
||||
rfsimulator: {
|
||||
serveraddr = "server";
|
||||
serverport = "4043";
|
||||
options = (); #("saviq"); or/and "chanmod"
|
||||
modelname = "AWGN";
|
||||
IQfile = "/tmp/rfsimulator.iqs";
|
||||
}
|
||||
|
||||
log_config :
|
||||
{
|
||||
global_log_level ="info";
|
||||
hw_log_level ="info";
|
||||
phy_log_level ="info";
|
||||
mac_log_level ="info";
|
||||
rlc_log_level ="info";
|
||||
pdcp_log_level ="info";
|
||||
rrc_log_level ="info";
|
||||
f1ap_log_level ="debug";
|
||||
ngap_log_level ="debug";
|
||||
}
|
||||
219
targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb_pci1.conf
Normal file
219
targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb_pci1.conf
Normal file
@@ -0,0 +1,219 @@
|
||||
Active_gNBs = ("gNB-DU-PCI1");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
gNBs = ({
|
||||
|
||||
# Identification parameters:
|
||||
gNB_CU_ID = 0xe00;
|
||||
gNB_name = "gNB-DU-PCI1";
|
||||
|
||||
# Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = 1;
|
||||
plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }) });
|
||||
|
||||
nr_cellid = 11111111L;
|
||||
|
||||
# Physical parameters:
|
||||
|
||||
min_rxtxtime = 6;
|
||||
do_CSIRS = 1;
|
||||
|
||||
|
||||
servingCellConfigCommon = ({
|
||||
|
||||
# spCellConfigCommon
|
||||
physCellId = 1;
|
||||
|
||||
# downlinkConfigCommon
|
||||
# frequencyInfoDL
|
||||
# this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
|
||||
absoluteFrequencySSB = 641280;
|
||||
dl_frequencyBand = 78;
|
||||
# this is 3600 MHz
|
||||
dl_absoluteFrequencyPointA = 640008;
|
||||
# scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
dl_subcarrierSpacing = 1;
|
||||
dl_carrierBandwidth = 106;
|
||||
# initialDownlinkBWP
|
||||
# genericParameters
|
||||
# this is RBstart=27,L=48 (275*(L-1))+RBstart
|
||||
initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialDLBWPsubcarrierSpacing = 1;
|
||||
# pdcch-ConfigCommon
|
||||
initialDLBWPcontrolResourceSetZero = 12;
|
||||
initialDLBWPsearchSpaceZero = 0;
|
||||
|
||||
# uplinkConfigCommon
|
||||
# frequencyInfoUL
|
||||
ul_frequencyBand = 78;
|
||||
# scs-SpecificCarrierList
|
||||
ul_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
ul_subcarrierSpacing = 1;
|
||||
ul_carrierBandwidth = 106;
|
||||
pMax = 20;
|
||||
# initialUplinkBWP
|
||||
# genericParameters
|
||||
initialULBWPlocationAndBandwidth = 28875;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialULBWPsubcarrierSpacing = 1;
|
||||
|
||||
# rach-ConfigCommon
|
||||
# rach-ConfigGeneric
|
||||
prach_ConfigurationIndex = 98;
|
||||
# prach_msg1_FDM
|
||||
# 0 = one, 1=two, 2=four, 3=eight
|
||||
prach_msg1_FDM = 0;
|
||||
prach_msg1_FrequencyStart = 0;
|
||||
zeroCorrelationZoneConfig = 13;
|
||||
preambleReceivedTargetPower = -96;
|
||||
# preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||
preambleTransMax = 6;
|
||||
# powerRampingStep
|
||||
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||
powerRampingStep = 1;
|
||||
# ra_ReponseWindow
|
||||
# 1,2,4,8,10,20,40,80
|
||||
ra_ResponseWindow = 4;
|
||||
# ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||
# 1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
|
||||
# oneHalf (0..15) 4,8,12,16,...60,64
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14;
|
||||
# ra_ContentionResolutionTimer
|
||||
# (0..7) 8,16,24,32,40,48,56,64
|
||||
ra_ContentionResolutionTimer = 7;
|
||||
rsrp_ThresholdSSB = 19;
|
||||
# prach-RootSequenceIndex_PR
|
||||
# 1 = 839, 2 = 139
|
||||
prach_RootSequenceIndex_PR = 2;
|
||||
prach_RootSequenceIndex = 1;
|
||||
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||
msg1_SubcarrierSpacing = 1,
|
||||
# restrictedSetConfig
|
||||
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||
restrictedSetConfig = 0,
|
||||
msg3_DeltaPreamble = 1;
|
||||
p0_NominalWithGrant =-90;
|
||||
|
||||
# pucch-ConfigCommon setup :
|
||||
# pucchGroupHopping
|
||||
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||
pucchGroupHopping = 0;
|
||||
hoppingId = 40;
|
||||
p0_nominal = -90;
|
||||
|
||||
# ssb_PositionsInBurs_BitmapPR
|
||||
# 1=short, 2=medium, 3=long
|
||||
ssb_PositionsInBurst_PR = 2;
|
||||
ssb_PositionsInBurst_Bitmap = 1;
|
||||
|
||||
# ssb_periodicityServingCell
|
||||
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||
ssb_periodicityServingCell = 2;
|
||||
|
||||
# dmrs_TypeA_position
|
||||
# 0 = pos2, 1 = pos3
|
||||
dmrs_TypeA_Position = 0;
|
||||
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
subcarrierSpacing = 1;
|
||||
|
||||
# tdd-UL-DL-ConfigurationCommon
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
referenceSubcarrierSpacing = 1;
|
||||
|
||||
# pattern1
|
||||
# dl_UL_TransmissionPeriodicity
|
||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||
dl_UL_TransmissionPeriodicity = 6;
|
||||
nrofDownlinkSlots = 7;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 2;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
ssPBCH_BlockPower = -25;
|
||||
});
|
||||
|
||||
# SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
}
|
||||
});
|
||||
|
||||
MACRLCs = ({
|
||||
num_cc = 1;
|
||||
tr_s_preference = "local_L1";
|
||||
tr_n_preference = "f1";
|
||||
local_n_if_name = "lo";
|
||||
local_n_address = "127.0.0.5";
|
||||
remote_n_address = "127.0.0.6";
|
||||
local_n_portc = 500;
|
||||
local_n_portd = 2152;
|
||||
remote_n_portc = 501;
|
||||
remote_n_portd = 2152;
|
||||
});
|
||||
|
||||
L1s = ({
|
||||
num_cc = 1;
|
||||
tr_n_preference = "local_mac";
|
||||
prach_dtx_threshold = 160;
|
||||
pucch0_dtx_threshold = 150;
|
||||
ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
|
||||
});
|
||||
|
||||
RUs = ({
|
||||
local_rf = "yes"
|
||||
nb_tx = 1
|
||||
nb_rx = 1
|
||||
att_tx = 0
|
||||
att_rx = 0;
|
||||
bands = [78];
|
||||
max_pdschReferenceSignalPower = -27;
|
||||
max_rxgain = 114;
|
||||
eNB_instances = [0];
|
||||
#beamforming 1x4 matrix:
|
||||
bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
|
||||
clock_src = "internal";
|
||||
});
|
||||
|
||||
THREAD_STRUCT = ({
|
||||
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
||||
parallel_config = "PARALLEL_SINGLE_THREAD";
|
||||
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
|
||||
worker_config = "WORKER_ENABLE";
|
||||
});
|
||||
|
||||
rfsimulator: {
|
||||
serveraddr = "server";
|
||||
serverport = "4043";
|
||||
options = (); #("saviq"); or/and "chanmod"
|
||||
modelname = "AWGN";
|
||||
IQfile = "/tmp/rfsimulator.iqs";
|
||||
}
|
||||
|
||||
log_config :
|
||||
{
|
||||
global_log_level ="info";
|
||||
hw_log_level ="info";
|
||||
phy_log_level ="info";
|
||||
mac_log_level ="info";
|
||||
rlc_log_level ="info";
|
||||
pdcp_log_level ="info";
|
||||
rrc_log_level ="info";
|
||||
f1ap_log_level ="debug";
|
||||
ngap_log_level ="debug";
|
||||
}
|
||||
Reference in New Issue
Block a user