Commit b9b82998 authored by Stone WU's avatar Stone WU Committed by Jerome PERALDI

bug #114120: [NR SIMU]5G NRGC implementation of TTCN radioBearerList API

parent ee04e470
......@@ -58,6 +58,15 @@ typedef struct RBConfig_s {
bool DiscardULData;
}RBConfig;
typedef struct NRRBConfig_s {
bool isRBConfigValid;
NR_SDAP_Config_t * Sdap;
NR_PDCP_Config_t * Pdcp;
long *pdcpTransparentSN_Size;
NR_RLC_BearerConfig_t * RlcBearer;
bool *DiscardULData;
}NRRBConfig;
typedef struct {
/// RAN context config file name
char *config_file_name;
......@@ -126,6 +135,7 @@ typedef struct {
// Variable to store Transaction ID for SS in case of RRCReconfiguration
long rrc_Transaction_Identifier;
RBConfig RB_Config[MAX_NUM_CCs][MAX_RBS];
NRRBConfig NR_RB_Config[MAX_NUM_CCs][MAX_NR_RBS];
} RAN_CONTEXT_t;
extern RAN_CONTEXT_t RC;
......
......@@ -58,7 +58,10 @@ MESSAGE_DEF(RRC_RBLIST_CFG_REQ, MESSAGE_PRIORITY_MED, RrcRblistCfg
MESSAGE_DEF(RRC_UE_CAT_INFO, MESSAGE_PRIORITY_MED, rrcUECatInfo, rrc_ue_cat_info)
MESSAGE_DEF(RRC_AS_SECURITY_CONFIG_REQ, MESSAGE_PRIORITY_MED, RrcAsSecurityConfigReq, rrc_as_security_config_req)
MESSAGE_DEF(NBIOTRRC_CONFIGURATION_REQ, MESSAGE_PRIORITY_MED, NbIoTRrcConfigurationReq, nbiotrrc_configuration_req)
// gNB: gNB_APP -> RRC messages
MESSAGE_DEF(NRRRC_CONFIGURATION_REQ, MESSAGE_PRIORITY_MED, gNB_RrcConfigurationReq, nrrrc_configuration_req)
MESSAGE_DEF(NRRRC_RBLIST_CFG_REQ, MESSAGE_PRIORITY_MED, NRRrcRblistCfgReq, nrrrc_rblist_cfg_req)
// UE: NAS -> RRC messages
MESSAGE_DEF(NAS_KENB_REFRESH_REQ, MESSAGE_PRIORITY_MED, NasKenbRefreshReq, nas_kenb_refresh_req)
......
......@@ -53,8 +53,12 @@
#include "LTE_InterFreqNeighCellInfo.h"
#include "LTE_PhysCellIdRange.h"
#include "LTE_NeighCellConfig.h"
#include "NR_SDAP-Config.h"
#include "NR_PDCP-Config.h"
#include "NR_RLC-BearerConfig.h"
#define MAX_RBS (LTE_maxDRB + 3)
#define MAX_NR_RBS (NR_maxDRB+3)
//-------------------------------------------------------------------------------------------//
// Messages for RRC logging
......@@ -90,6 +94,8 @@
#define NRRRC_CONFIGURATION_REQ(mSGpTR) (mSGpTR)->ittiMsg.nrrrc_configuration_req
#define NRRRC_RBLIST_CFG_REQ(mSGpTR) (mSGpTR)->ittiMsg.nrrrc_rblist_cfg_req
#define NAS_KENB_REFRESH_REQ(mSGpTR) (mSGpTR)->ittiMsg.nas_kenb_refresh_req
#define NAS_CELL_SELECTION_REQ(mSGpTR) (mSGpTR)->ittiMsg.nas_cell_selection_req
#define NAS_CONN_ESTABLI_REQ(mSGpTR) (mSGpTR)->ittiMsg.nas_conn_establi_req
......@@ -647,6 +653,26 @@ typedef struct NRDuDlReq_s {
uint64_t srb_id;
} NRDuDlReq_t;
typedef struct NRRadioBearerConfig_s {
NR_SDAP_Config_t *Sdap;
NR_PDCP_Config_t *Pdcp;
long *pdcpTransparentSN_Size;
NR_RLC_BearerConfig_t * RlcBearer;
bool *DiscardULData;
}NRRadioBearerConfig;
typedef struct nr_rb_info_s {
uint8_t RbId;
NRRadioBearerConfig RbConfig;
} nr_rb_info;
typedef struct NRRrcRblistCfgReq_s {
int rb_count;
int cell_index;
nr_rb_info rb_list[MAX_NR_RBS];
}NRRrcRblistCfgReq;
// UE: NAS -> RRC messages
typedef kenb_refresh_req_t NasKenbRefreshReq;
typedef cell_info_req_t NasCellSelectionReq;
......
......@@ -321,7 +321,7 @@ int8_t nr_mac_rrc_data_ind(const module_id_t module_idP,
ue_context_p->ue_context.Srb0.Active = 1;
RB_INSERT(rrc_nr_ue_tree_s, &RC.nrrrc[module_idP]->rrc_ue_head, ue_context_p);
fill_initial_cellGroupConfig(ue_context_p->local_uid,&cellGroupConfig,scc,&RC.nrrrc[module_idP]->carrier);
fill_initial_cellGroupConfig(ue_context_p->local_uid,&cellGroupConfig,scc,&RC.nrrrc[module_idP]->carrier,CC_id);
MessageDef* tmp=itti_alloc_new_message_sized(TASK_RRC_GNB, 0, F1AP_INITIAL_UL_RRC_MESSAGE, sizeof(f1ap_initial_ul_rrc_message_t) + sdu_lenP);
f1ap_initial_ul_rrc_message_t *msg = &F1AP_INITIAL_UL_RRC_MESSAGE(tmp);
......
......@@ -1089,6 +1089,136 @@ long rrc_get_max_nr_csrs(uint8_t max_rbs, long b_SRS) {
return c_srs;
}
NR_RLC_Config_t * fill_rb_rlc_config(NR_RLC_Config_t * ss_rlc_config)
{
NR_RLC_Config_t *rlc_Config = NULL;
rlc_Config = calloc(1, sizeof(NR_RLC_Config_t));
if(ss_rlc_config){
rlc_Config->present = ss_rlc_config->present;
if(rlc_Config->present == NR_RLC_Config_PR_am){
rlc_Config->choice.am = calloc(1, sizeof(*rlc_Config->choice.am));
rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength = calloc(1, sizeof(NR_SN_FieldLengthAM_t));
if(ss_rlc_config->choice.am->dl_AM_RLC.sn_FieldLength){
*(rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength) =*(ss_rlc_config->choice.am->dl_AM_RLC.sn_FieldLength);
}else {
*(rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength) = NR_SN_FieldLengthAM_size12;
}
rlc_Config->choice.am->dl_AM_RLC.t_Reassembly = ss_rlc_config->choice.am->dl_AM_RLC.t_Reassembly;
rlc_Config->choice.am->dl_AM_RLC.t_StatusProhibit = ss_rlc_config->choice.am->dl_AM_RLC.t_StatusProhibit;
rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength = calloc(1, sizeof(NR_SN_FieldLengthAM_t));
if(ss_rlc_config->choice.am->ul_AM_RLC.sn_FieldLength){
*(rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength) =*(ss_rlc_config->choice.am->ul_AM_RLC.sn_FieldLength);
}else{
*(rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength) = NR_SN_FieldLengthAM_size12;
}
rlc_Config->choice.am->ul_AM_RLC.t_PollRetransmit = ss_rlc_config->choice.am->ul_AM_RLC.t_PollRetransmit;
rlc_Config->choice.am->ul_AM_RLC.pollPDU = ss_rlc_config->choice.am->ul_AM_RLC.pollPDU;
rlc_Config->choice.am->ul_AM_RLC.pollByte = ss_rlc_config->choice.am->ul_AM_RLC.pollByte;
rlc_Config->choice.am->ul_AM_RLC.maxRetxThreshold = ss_rlc_config->choice.am->ul_AM_RLC.maxRetxThreshold;
} else if(rlc_Config->present == NR_RLC_Config_PR_um_Bi_Directional){
rlc_Config->choice.um_Bi_Directional = calloc(1,sizeof(*rlc_Config->choice.um_Bi_Directional));
rlc_Config->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength = calloc(1,sizeof(NR_SN_FieldLengthUM_t));
if(ss_rlc_config->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength){
*(rlc_Config->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength) = *(ss_rlc_config->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength);
} else {
*(rlc_Config->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength) = NR_SN_FieldLengthUM_size12;
}
rlc_Config->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly = ss_rlc_config->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly;
rlc_Config->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength = calloc(1,sizeof(NR_SN_FieldLengthUM_t));
if(ss_rlc_config->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength){
*(rlc_Config->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength) = *(ss_rlc_config->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength);
} else {
*(rlc_Config->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength) = NR_SN_FieldLengthUM_size12;
}
} else if(rlc_Config->present == NR_RLC_Config_PR_um_Uni_Directional_DL){
rlc_Config->choice.um_Uni_Directional_DL = calloc(1,sizeof(*rlc_Config->choice.um_Uni_Directional_DL));
if(ss_rlc_config->choice.um_Uni_Directional_DL->dl_UM_RLC.sn_FieldLength){
*(rlc_Config->choice.um_Uni_Directional_DL->dl_UM_RLC.sn_FieldLength) = *(ss_rlc_config->choice.um_Uni_Directional_DL->dl_UM_RLC.sn_FieldLength);
} else {
*(rlc_Config->choice.um_Uni_Directional_DL->dl_UM_RLC.sn_FieldLength) = NR_SN_FieldLengthUM_size12;
}
rlc_Config->choice.um_Uni_Directional_DL->dl_UM_RLC.t_Reassembly = ss_rlc_config->choice.um_Uni_Directional_DL->dl_UM_RLC.t_Reassembly;
} else if(rlc_Config->present == NR_RLC_Config_PR_um_Uni_Directional_UL){
rlc_Config->choice.um_Uni_Directional_UL = calloc(1,sizeof(*rlc_Config->choice.um_Uni_Directional_UL));
rlc_Config->choice.um_Uni_Directional_UL->ul_UM_RLC.sn_FieldLength = calloc(1,sizeof(NR_SN_FieldLengthUM_t));
if(ss_rlc_config->choice.um_Uni_Directional_UL->ul_UM_RLC.sn_FieldLength){
*(rlc_Config->choice.um_Uni_Directional_UL->ul_UM_RLC.sn_FieldLength) = *(ss_rlc_config->choice.um_Uni_Directional_UL->ul_UM_RLC.sn_FieldLength);
} else {
*(rlc_Config->choice.um_Uni_Directional_UL->ul_UM_RLC.sn_FieldLength) = NR_SN_FieldLengthUM_size12;
}
}
}else {
rlc_Config->present = NR_RLC_Config_PR_am;
rlc_Config->choice.am = calloc(1, sizeof(*rlc_Config->choice.am));
rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength = calloc(1, sizeof(NR_SN_FieldLengthAM_t));
*(rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength) = NR_SN_FieldLengthAM_size12;
rlc_Config->choice.am->dl_AM_RLC.t_Reassembly = NR_T_Reassembly_ms35;
rlc_Config->choice.am->dl_AM_RLC.t_StatusProhibit = NR_T_StatusProhibit_ms0;
rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength = calloc(1, sizeof(NR_SN_FieldLengthAM_t));
*(rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength) = NR_SN_FieldLengthAM_size12;
rlc_Config->choice.am->ul_AM_RLC.t_PollRetransmit = NR_T_PollRetransmit_ms45;
rlc_Config->choice.am->ul_AM_RLC.pollPDU = NR_PollPDU_infinity;
rlc_Config->choice.am->ul_AM_RLC.pollByte = NR_PollByte_infinity;
rlc_Config->choice.am->ul_AM_RLC.maxRetxThreshold = NR_UL_AM_RLC__maxRetxThreshold_t8;
}
return rlc_Config;
}
void fill_rb_RLC_BearerConfig(int rbIndex,NR_RLC_BearerConfig_t *rlc_BearerConfig,NR_RLC_BearerConfig_t *ss_rlc_BearerConfig)
{
NR_RLC_Config_t *rlc_Config = NULL;
NR_LogicalChannelConfig_t *logicalChannelConfig = NULL;
long *logicalChannelGroup = NULL;
bool isSrb = rbIndex < 3? true:false;
if(!rlc_BearerConfig){
return;
}
if(ss_rlc_BearerConfig && ss_rlc_BearerConfig->logicalChannelIdentity){
rlc_BearerConfig->logicalChannelIdentity = ss_rlc_BearerConfig->logicalChannelIdentity;
} else {
rlc_BearerConfig->logicalChannelIdentity = isSrb?rbIndex:(rbIndex-2);
}
rlc_BearerConfig->servedRadioBearer = calloc(1, sizeof(*rlc_BearerConfig->servedRadioBearer));
rlc_BearerConfig->servedRadioBearer->present = isSrb?(NR_RLC_BearerConfig__servedRadioBearer_PR_srb_Identity):(NR_RLC_BearerConfig__servedRadioBearer_PR_drb_Identity);
if(isSrb){
rlc_BearerConfig->servedRadioBearer->choice.srb_Identity = rbIndex;
}else{
rlc_BearerConfig->servedRadioBearer->choice.drb_Identity = rbIndex-2;
}
rlc_BearerConfig->reestablishRLC = NULL;
rlc_Config = fill_rb_rlc_config(ss_rlc_BearerConfig->rlc_Config);
rlc_BearerConfig->rlc_Config = rlc_Config;
logicalChannelConfig = calloc(1, sizeof(NR_LogicalChannelConfig_t));
logicalChannelConfig->ul_SpecificParameters = calloc(1, sizeof(*logicalChannelConfig->ul_SpecificParameters));
if(ss_rlc_BearerConfig && ss_rlc_BearerConfig->mac_LogicalChannelConfig && ss_rlc_BearerConfig->mac_LogicalChannelConfig->ul_SpecificParameters){
logicalChannelConfig->ul_SpecificParameters->priority = ss_rlc_BearerConfig->mac_LogicalChannelConfig->ul_SpecificParameters->priority;
logicalChannelConfig->ul_SpecificParameters->prioritisedBitRate = ss_rlc_BearerConfig->mac_LogicalChannelConfig->ul_SpecificParameters->prioritisedBitRate;
} else {
logicalChannelConfig->ul_SpecificParameters->priority = (rbIndex == 1)? 1 :3;
logicalChannelConfig->ul_SpecificParameters->prioritisedBitRate = isSrb?(NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity):(NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_kBps8);
}
logicalChannelConfig->ul_SpecificParameters->bucketSizeDuration = isSrb?(NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms5):(NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms100);
logicalChannelGroup = CALLOC(1, sizeof(long));
*logicalChannelGroup = isSrb?0:1;
logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup = logicalChannelGroup;
logicalChannelConfig->ul_SpecificParameters->schedulingRequestID = CALLOC(1, sizeof(*logicalChannelConfig->ul_SpecificParameters->schedulingRequestID));
*logicalChannelConfig->ul_SpecificParameters->schedulingRequestID = 0;
logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_Mask = 0;
logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = 0;
rlc_BearerConfig->mac_LogicalChannelConfig = logicalChannelConfig;
}
void fill_initial_SpCellConfig(int uid,
NR_SpCellConfig_t *SpCellConfig,
NR_ServingCellConfigCommon_t *scc,
......@@ -1446,7 +1576,29 @@ void fill_initial_SpCellConfig(int uid,
}
void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGroupConfig_t *ue_context_mastercellGroup) {
void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGroupConfig_t *ue_context_mastercellGroup,const int CC_id) {
if (RC.ss.mode >= SS_SOFTMODEM) {
/* code not used here. Just keep it here for future checking*/
NR_RLC_BearerConfig_t *rlc_BearerConfig = NULL;
NR_RLC_BearerConfig_t * ss_rlc_BearerConfig = NULL;
cellGroupConfig->cellGroupId = 0;
cellGroupConfig->rlc_BearerToReleaseList = NULL;
cellGroupConfig->rlc_BearerToAddModList = calloc(1, sizeof(*cellGroupConfig->rlc_BearerToAddModList));
for(int rbIndex =2; rbIndex < MAX_NR_RBS; rbIndex++){
/*SRB2 DRB1 ... SS RLC_BearerConfig */
if(RC.NR_RB_Config[CC_id][rbIndex].isRBConfigValid){
rlc_BearerConfig = calloc(1, sizeof(NR_RLC_BearerConfig_t));
ss_rlc_BearerConfig = RC.NR_RB_Config[CC_id][rbIndex].RlcBearer;
fill_rb_RLC_BearerConfig(rbIndex, rlc_BearerConfig, ss_rlc_BearerConfig);
ASN_SEQUENCE_ADD(&cellGroupConfig->rlc_BearerToAddModList->list, rlc_BearerConfig);
ASN_SEQUENCE_ADD(&ue_context_mastercellGroup->rlc_BearerToAddModList->list, rlc_BearerConfig);
}
}
return;
}
cellGroupConfig->cellGroupId = 0;
cellGroupConfig->rlc_BearerToReleaseList = NULL;
......@@ -1563,7 +1715,8 @@ void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
void fill_initial_cellGroupConfig(int uid,
NR_CellGroupConfig_t *cellGroupConfig,
NR_ServingCellConfigCommon_t *scc,
rrc_gNB_carrier_data_t *carrier) {
rrc_gNB_carrier_data_t *carrier,
const int CC_id) {
NR_RLC_BearerConfig_t *rlc_BearerConfig = NULL;
NR_RLC_Config_t *rlc_Config = NULL;
......@@ -1571,46 +1724,58 @@ void fill_initial_cellGroupConfig(int uid,
NR_MAC_CellGroupConfig_t *mac_CellGroupConfig = NULL;
NR_PhysicalCellGroupConfig_t *physicalCellGroupConfig = NULL;
long *logicalChannelGroup = NULL;
cellGroupConfig->cellGroupId = 0;
/* Rlc Bearer Config */
/* TS38.331 9.2.1 Default SRB configurations */
cellGroupConfig->rlc_BearerToAddModList = calloc(1, sizeof(*cellGroupConfig->rlc_BearerToAddModList));
rlc_BearerConfig = calloc(1, sizeof(NR_RLC_BearerConfig_t));
rlc_BearerConfig->logicalChannelIdentity = 1;
rlc_BearerConfig->servedRadioBearer = calloc(1, sizeof(*rlc_BearerConfig->servedRadioBearer));
rlc_BearerConfig->servedRadioBearer->present = NR_RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
rlc_BearerConfig->servedRadioBearer->choice.srb_Identity = 1;
rlc_BearerConfig->reestablishRLC = NULL;
rlc_Config = calloc(1, sizeof(NR_RLC_Config_t));
rlc_Config->present = NR_RLC_Config_PR_am;
rlc_Config->choice.am = calloc(1, sizeof(*rlc_Config->choice.am));
rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength = calloc(1, sizeof(NR_SN_FieldLengthAM_t));
*(rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength) = NR_SN_FieldLengthAM_size12;
rlc_Config->choice.am->dl_AM_RLC.t_Reassembly = NR_T_Reassembly_ms35;
rlc_Config->choice.am->dl_AM_RLC.t_StatusProhibit = NR_T_StatusProhibit_ms0;
rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength = calloc(1, sizeof(NR_SN_FieldLengthAM_t));
*(rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength) = NR_SN_FieldLengthAM_size12;
rlc_Config->choice.am->ul_AM_RLC.t_PollRetransmit = NR_T_PollRetransmit_ms45;
rlc_Config->choice.am->ul_AM_RLC.pollPDU = NR_PollPDU_infinity;
rlc_Config->choice.am->ul_AM_RLC.pollByte = NR_PollByte_infinity;
rlc_Config->choice.am->ul_AM_RLC.maxRetxThreshold = NR_UL_AM_RLC__maxRetxThreshold_t8;
rlc_BearerConfig->rlc_Config = rlc_Config;
logicalChannelConfig = calloc(1, sizeof(NR_LogicalChannelConfig_t));
logicalChannelConfig->ul_SpecificParameters = calloc(1, sizeof(*logicalChannelConfig->ul_SpecificParameters));
logicalChannelConfig->ul_SpecificParameters->priority = 1;
logicalChannelConfig->ul_SpecificParameters->prioritisedBitRate = NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity;
logicalChannelGroup = CALLOC(1, sizeof(long));
*logicalChannelGroup = 0;
logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup = logicalChannelGroup;
logicalChannelConfig->ul_SpecificParameters->schedulingRequestID = CALLOC(1, sizeof(*logicalChannelConfig->ul_SpecificParameters->schedulingRequestID));
*logicalChannelConfig->ul_SpecificParameters->schedulingRequestID = 0;
logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_Mask = 0;
logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = 0;
rlc_BearerConfig->mac_LogicalChannelConfig = logicalChannelConfig;
ASN_SEQUENCE_ADD(&cellGroupConfig->rlc_BearerToAddModList->list, rlc_BearerConfig);
if (RC.ss.mode >= SS_SOFTMODEM) {
NR_RLC_BearerConfig_t * ss_rlc_BearerConfig = NULL;
/*SRB1 SS RLC_BearerConfig */
int rbIndex = 1;
if(RC.NR_RB_Config[CC_id][rbIndex].isRBConfigValid){
cellGroupConfig->rlc_BearerToAddModList = calloc(1, sizeof(*cellGroupConfig->rlc_BearerToAddModList));
rlc_BearerConfig = calloc(1, sizeof(NR_RLC_BearerConfig_t));
ss_rlc_BearerConfig = RC.NR_RB_Config[CC_id][rbIndex].RlcBearer;
fill_rb_RLC_BearerConfig(rbIndex, rlc_BearerConfig, ss_rlc_BearerConfig);
ASN_SEQUENCE_ADD(&cellGroupConfig->rlc_BearerToAddModList->list, rlc_BearerConfig);
}
}else {
/* Rlc Bearer Config */
/* TS38.331 9.2.1 Default SRB configurations */
cellGroupConfig->rlc_BearerToAddModList = calloc(1, sizeof(*cellGroupConfig->rlc_BearerToAddModList));
rlc_BearerConfig = calloc(1, sizeof(NR_RLC_BearerConfig_t));
rlc_BearerConfig->logicalChannelIdentity = 1;
rlc_BearerConfig->servedRadioBearer = calloc(1, sizeof(*rlc_BearerConfig->servedRadioBearer));
rlc_BearerConfig->servedRadioBearer->present = NR_RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
rlc_BearerConfig->servedRadioBearer->choice.srb_Identity = 1;
rlc_BearerConfig->reestablishRLC = NULL;
rlc_Config = calloc(1, sizeof(NR_RLC_Config_t));
rlc_Config->present = NR_RLC_Config_PR_am;
rlc_Config->choice.am = calloc(1, sizeof(*rlc_Config->choice.am));
rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength = calloc(1, sizeof(NR_SN_FieldLengthAM_t));
*(rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength) = NR_SN_FieldLengthAM_size12;
rlc_Config->choice.am->dl_AM_RLC.t_Reassembly = NR_T_Reassembly_ms35;
rlc_Config->choice.am->dl_AM_RLC.t_StatusProhibit = NR_T_StatusProhibit_ms0;
rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength = calloc(1, sizeof(NR_SN_FieldLengthAM_t));
*(rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength) = NR_SN_FieldLengthAM_size12;
rlc_Config->choice.am->ul_AM_RLC.t_PollRetransmit = NR_T_PollRetransmit_ms45;
rlc_Config->choice.am->ul_AM_RLC.pollPDU = NR_PollPDU_infinity;
rlc_Config->choice.am->ul_AM_RLC.pollByte = NR_PollByte_infinity;
rlc_Config->choice.am->ul_AM_RLC.maxRetxThreshold = NR_UL_AM_RLC__maxRetxThreshold_t8;
rlc_BearerConfig->rlc_Config = rlc_Config;
logicalChannelConfig = calloc(1, sizeof(NR_LogicalChannelConfig_t));
logicalChannelConfig->ul_SpecificParameters = calloc(1, sizeof(*logicalChannelConfig->ul_SpecificParameters));
logicalChannelConfig->ul_SpecificParameters->priority = 1;
logicalChannelConfig->ul_SpecificParameters->prioritisedBitRate = NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity;
logicalChannelGroup = CALLOC(1, sizeof(long));
*logicalChannelGroup = 0;
logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup = logicalChannelGroup;
logicalChannelConfig->ul_SpecificParameters->schedulingRequestID = CALLOC(1, sizeof(*logicalChannelConfig->ul_SpecificParameters->schedulingRequestID));
*logicalChannelConfig->ul_SpecificParameters->schedulingRequestID = 0;
logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_Mask = 0;
logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = 0;
rlc_BearerConfig->mac_LogicalChannelConfig = logicalChannelConfig;
ASN_SEQUENCE_ADD(&cellGroupConfig->rlc_BearerToAddModList->list, rlc_BearerConfig);
}
cellGroupConfig->rlc_BearerToReleaseList = NULL;
/* mac CellGroup Config */
......@@ -1660,13 +1825,41 @@ void fill_initial_cellGroupConfig(int uid,
cellGroupConfig->sCellToReleaseList = NULL;
}
bool update_rrcReconfig_cellGroupConfig(const protocol_ctxt_t *const ctxt_pP,
rrc_gNB_ue_context_t *ue_context_pP,
NR_CellGroupConfig_t *cellGroupConfig)
{
int CC_id = ue_context_pP->ue_context.primaryCC_id;
bool update_flag = false;
if(RC.ss.mode < SS_SOFTMODEM){
return update_flag;
}
if(cellGroupConfig && cellGroupConfig->rlc_BearerToAddModList){
for(int i = 0; i < cellGroupConfig->rlc_BearerToAddModList->list.count; i++){
NR_RLC_BearerConfig_t * rlc_BearerConfig = cellGroupConfig->rlc_BearerToAddModList->list.array[i];
/* only check rlc_config as it is missing from TTCN */
if(!rlc_BearerConfig->rlc_Config && rlc_BearerConfig->servedRadioBearer){
int rbIndex = (rlc_BearerConfig->servedRadioBearer->present == NR_RLC_BearerConfig__servedRadioBearer_PR_srb_Identity)? rlc_BearerConfig->servedRadioBearer->choice.srb_Identity : (rlc_BearerConfig->servedRadioBearer->choice.drb_Identity +2);
if(RC.NR_RB_Config[CC_id][rbIndex].isRBConfigValid && RC.NR_RB_Config[CC_id][rbIndex].RlcBearer){
rlc_BearerConfig->rlc_Config = fill_rb_rlc_config(RC.NR_RB_Config[CC_id][rbIndex].RlcBearer->rlc_Config);
update_flag = true;
}
}
}
}
return update_flag;
}
//------------------------------------------------------------------------------
uint8_t do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
uint8_t *const buffer,
const uint8_t transaction_id,
OCTET_STRING_t *masterCellGroup_from_DU,
NR_ServingCellConfigCommon_t *scc,
rrc_gNB_carrier_data_t *carrier)
rrc_gNB_carrier_data_t *carrier,
const int CC_id)
//------------------------------------------------------------------------------
{
asn_enc_rval_t enc_rval;
......@@ -1682,33 +1875,29 @@ uint8_t do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
NR_SRB_ToAddModList_t **SRB_configList = &ue_p->SRB_configList;
memset((void *)&dl_ccch_msg, 0, sizeof(NR_DL_CCCH_Message_t));
dl_ccch_msg.message.present = NR_DL_CCCH_MessageType_PR_c1;
dl_ccch_msg.message.choice.c1 = CALLOC(1, sizeof(struct NR_DL_CCCH_MessageType__c1));
dl_ccch_msg.message.choice.c1->present = NR_DL_CCCH_MessageType__c1_PR_rrcSetup;
dl_ccch_msg.message.choice.c1->choice.rrcSetup = calloc(1, sizeof(NR_RRCSetup_t));
dl_ccch_msg.message.choice.c1->choice.rrcSetup = CALLOC(1, sizeof(NR_RRCSetup_t));
rrcSetup = dl_ccch_msg.message.choice.c1->choice.rrcSetup;
rrcSetup->criticalExtensions.present = NR_RRCSetup__criticalExtensions_PR_rrcSetup;
rrcSetup->rrc_TransactionIdentifier = transaction_id;
rrcSetup->criticalExtensions.choice.rrcSetup = calloc(1, sizeof(NR_RRCSetup_IEs_t));
rrcSetup->criticalExtensions.choice.rrcSetup = CALLOC(1, sizeof(NR_RRCSetup_IEs_t));
ie = rrcSetup->criticalExtensions.choice.rrcSetup;
/****************************** radioBearerConfig ******************************/
/* Configure SRB1 */
if (*SRB_configList) {
free(*SRB_configList);
if (*SRB_configList){
ASN_STRUCT_FREE(asn_DEF_NR_SRB_ToAddModList,*SRB_configList);
*SRB_configList = NULL;
}
*SRB_configList = calloc(1, sizeof(NR_SRB_ToAddModList_t));
// SRB1
/* TODO */
SRB1_config = calloc(1, sizeof(NR_SRB_ToAddMod_t));
*SRB_configList = CALLOC(1, sizeof(NR_SRB_ToAddModList_t));
SRB1_config = CALLOC(1, sizeof(NR_SRB_ToAddMod_t));
SRB1_config->srb_Identity = 1;
// pdcp_Config->t_Reordering
SRB1_config->pdcp_Config = pdcp_Config;
ie->radioBearerConfig.srb_ToAddModList = *SRB_configList;
ASN_SEQUENCE_ADD(&(*SRB_configList)->list, SRB1_config);
......@@ -1732,9 +1921,12 @@ uint8_t do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)cellGroupConfig);
}
else {
cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t));
fill_initial_cellGroupConfig(ue_context_pP->local_uid,cellGroupConfig,scc,carrier);
cellGroupConfig = CALLOC(1, sizeof(NR_CellGroupConfig_t));
fill_initial_cellGroupConfig(ue_context_pP->local_uid,cellGroupConfig,scc,carrier,CC_id);
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)cellGroupConfig);
}
enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig,
NULL,
(void *)cellGroupConfig,
......@@ -1753,6 +1945,10 @@ uint8_t do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
}
}
if(ue_p->masterCellGroup) {
ASN_STRUCT_FREE(asn_DEF_NR_CellGroupConfig,ue_p->masterCellGroup);
ue_p->masterCellGroup = NULL;
}
ue_p->masterCellGroup = cellGroupConfig;
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
......@@ -1764,6 +1960,11 @@ uint8_t do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
buffer,
1000);
LOG_P(OAILOG_DEBUG, "DL_CCCH_Message", buffer, 1000);
//free content of dl_ccch_msg
ie->radioBearerConfig.srb_ToAddModList = NULL; //ue_p->SRB_configList still keep allocated
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NR_DL_CCCH_Message,&dl_ccch_msg);
if(enc_rval.encoded == -1) {
LOG_E(NR_RRC, "[gNB AssertFatal]ASN1 message encoding failed (%s, %lu)!\n",
enc_rval.failed_type->name, enc_rval.encoded);
......@@ -2045,7 +2246,9 @@ int16_t do_RRCReconfiguration(
enc_rval.failed_type->name, enc_rval.encoded);
return -1;
}
xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)cellGroupConfig);
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)cellGroupConfig);
}
ie->nonCriticalExtension->masterCellGroup = calloc(1,sizeof(OCTET_STRING_t));
ie->nonCriticalExtension->masterCellGroup->buf = masterCellGroup_buf;
......@@ -2054,9 +2257,9 @@ int16_t do_RRCReconfiguration(
dl_dcch_msg.message.choice.c1->choice.rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration = ie;
//if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
xer_fprint(stdout, &asn_DEF_NR_DL_DCCH_Message, (void *)&dl_dcch_msg);
//}
}
enc_rval = uper_encode_to_buffer(&asn_DEF_NR_DL_DCCH_Message,
NULL,
......@@ -2064,6 +2267,26 @@ int16_t do_RRCReconfiguration(
buffer,
buffer_size);
{
//Free content of dl_dcch_msg
if(ie->radioBearerConfig){
ie->radioBearerConfig->srb_ToAddModList = NULL;
ie->radioBearerConfig->drb_ToAddModList = NULL;
ie->radioBearerConfig->securityConfig = NULL;
ie->radioBearerConfig->srb3_ToRelease = NULL;
ie->radioBearerConfig->drb_ToReleaseList = NULL;
}
ie->measConfig = NULL;
if(ie->nonCriticalExtension){
ie->nonCriticalExtension->dedicatedNAS_MessageList = NULL;
if(ie->nonCriticalExtension->masterCellGroup){
ie->nonCriticalExtension->masterCellGroup->buf = NULL;
ie->nonCriticalExtension->masterCellGroup->size = 0;
}
}
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NR_DL_DCCH_Message,&dl_dcch_msg);
}
if(enc_rval.encoded == -1) {
LOG_I(NR_RRC, "[gNB AssertFatal]ASN1 message encoding failed (%s, %lu)!\n",
enc_rval.failed_type->name, enc_rval.encoded);
......
......@@ -108,20 +108,26 @@ void fill_initial_SpCellConfig(int uid,
void fill_initial_cellGroupConfig(int uid,
NR_CellGroupConfig_t *cellGroupConfig,
NR_ServingCellConfigCommon_t *scc,
rrc_gNB_carrier_data_t *carrier);
rrc_gNB_carrier_data_t *carrier,
const int CC_id);
void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
rrc_gNB_carrier_data_t *carrier,
NR_UE_NR_Capability_t *uecap);
void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGroupConfig_t *ue_context_mastercellGroup);
void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGroupConfig_t *ue_context_mastercellGroup,const int CC_id);
bool update_rrcReconfig_cellGroupConfig(const protocol_ctxt_t *const ctxt_pP,
rrc_gNB_ue_context_t *ue_context_pP,
NR_CellGroupConfig_t *cellGroupConfig);
uint8_t do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
uint8_t *const buffer,
const uint8_t transaction_id,
OCTET_STRING_t *masterCellGroup_from_DU,
NR_ServingCellConfigCommon_t *scc,
rrc_gNB_carrier_data_t *carrier);
rrc_gNB_carrier_data_t *carrier,
const int CC_id);
uint8_t do_NR_SecurityModeCommand(
const protocol_ctxt_t *const ctxt_pP,
......
......@@ -236,6 +236,55 @@ char openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_RrcConfigu
return 0;
}//END openair_rrc_gNB_configuration
char rrc_gNB_rblist_configuration(const module_id_t gnb_mod_idP,NRRrcRblistCfgReq *RblistConfig)
{
int CC_id = RblistConfig->cell_index;
LOG_A(NR_RRC,"Inside rrc_gNB_rblist_configuration, CC_id: %d \n",CC_id);
AssertFatal(RblistConfig!=NULL,"RB list configuration input is null\n");
AssertFatal(RblistConfig->rb_count <= MAX_NR_RBS ,"RB Count exceed the Max RBs Supported");
for(int i=0;i<RblistConfig->rb_count;i++)
{
LOG_A(NR_RRC,"%s config RB Id:%d \n",__FUNCTION__,RblistConfig->rb_list[i].RbId);
int rbIndex = RblistConfig->rb_list[i].RbId; /*RB ID is used as a unique index in RB Array inside RC*/
AssertFatal(rbIndex <= MAX_NR_RBS, "RB Index exceed the Max RBs Supported");
NRRBConfig * rb_config =&RC.NR_RB_Config[CC_id][rbIndex];
if(rb_config->isRBConfigValid){
//Free old RBConfig storage
if(rb_config->Sdap){
ASN_STRUCT_FREE(asn_DEF_NR_SDAP_Config,rb_config->Sdap);
rb_config->Sdap = NULL;
}
if(rb_config->Pdcp){
ASN_STRUCT_FREE(asn_DEF_NR_PDCP_Config,rb_config->Pdcp);
rb_config->Pdcp = NULL;
}
if(rb_config->pdcpTransparentSN_Size){
FREEMEM(rb_config->pdcpTransparentSN_Size);
rb_config->pdcpTransparentSN_Size = NULL;
}
if(rb_config->RlcBearer){
ASN_STRUCT_FREE(asn_DEF_NR_RLC_BearerConfig,rb_config->RlcBearer);
rb_config->RlcBearer = NULL;
}
if(rb_config->DiscardULData){
FREEMEM(rb_config->DiscardULData);
rb_config->DiscardULData = NULL;
}
rb_config->isRBConfigValid = false;
}
rb_config->Sdap = RblistConfig->rb_list[i].RbConfig.Sdap;
rb_config->Pdcp = RblistConfig->rb_list[i].RbConfig.Pdcp;
rb_config->pdcpTransparentSN_Size = RblistConfig->rb_list[i].RbConfig.pdcpTransparentSN_Size;
rb_config->RlcBearer = RblistConfig->rb_list[i].RbConfig.RlcBearer;
rb_config->DiscardULData = RblistConfig->rb_list[i].RbConfig.DiscardULData;
rb_config->isRBConfigValid = TRUE;
}
return 0;
}
void rrc_gNB_process_AdditionRequestInformation(const module_id_t gnb_mod_idP, x2ap_ENDC_sgnb_addition_req_t *m) {
struct NR_CG_ConfigInfo *cg_configinfo = NULL;
......@@ -345,7 +394,8 @@ rrc_gNB_generate_RRCSetup(
(uint8_t *) ue_p->Srb0.Tx_buffer.Payload,
0/*rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id)*/,
masterCellGroup_from_DU,
scc,&rrc->carrier);
scc,&rrc->carrier,
CC_id);
LOG_DUMPMSG(NR_RRC, DEBUG_RRC,
(char *)(ue_p->Srb0.Tx_buffer.Payload),
......@@ -455,7 +505,8 @@ rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(
(uint8_t *) ue_p->Srb0.Tx_buffer.Payload,
rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id),
NULL,
scc,&rrc_instance_p->carrier);
scc,&rrc_instance_p->carrier,
CC_id);
LOG_DUMPMSG(NR_RRC, DEBUG_RRC,
(char *)(ue_p->Srb0.Tx_buffer.Payload),
......@@ -716,7 +767,7 @@ rrc_gNB_generate_defaultRRCReconfiguration(
gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
memset(buffer, 0, sizeof(buffer));
cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t));
fill_mastercellGroupConfig(cellGroupConfig, ue_p->masterCellGroup);
fill_mastercellGroupConfig(cellGroupConfig, ue_p->masterCellGroup,0);
size = do_RRCReconfiguration(ctxt_pP, buffer, sizeof(buffer),
xid,
*SRB_configList2,
......@@ -808,6 +859,116 @@ rrc_gNB_generate_defaultRRCReconfiguration(
}
}
//-----------------------------------------------------------------------------
/*
* store rrcReconfiguration config in UE context
*/
void
rrc_gNB_store_RRCReconfiguration(
const protocol_ctxt_t *const ctxt_pP,
rrc_gNB_ue_context_t *ue_context_pP,
NR_RRCReconfiguration_t * rrcReconfiguration
)
//-----------------------------------------------------------------------------
{
NR_SRB_ToAddModList_t **srb2addList = NULL;
NR_DRB_ToAddModList_t **drb2addList = NULL;
NR_DRB_ToAddModList_t **drb2releaseList = NULL;
NR_CellGroupConfig_t *cellGroupConfig = NULL;
long xid;
AssertFatal (rrcReconfiguration!=NULL, "%s rrcReconfiguration is NULL\n",__FUNCTION__);
xid = rrcReconfiguration->rrc_TransactionIdentifier;
LOG_D(NR_RRC, "rrc_gNB_store_RRCReconfiguration for transaction %ld\n",xid);
srb2addList = &ue_context_pP->ue_context.SRB_configList2[xid];
drb2addList = &ue_context_pP->ue_context.DRB_configList2[xid];
drb2releaseList = &ue_context_pP->ue_context.DRB_Release_configList2[xid];
if(*srb2addList){
LOG_D(NR_RRC, "%s free old SRB_configList2 \n",__FUNCTION__);
ASN_STRUCT_FREE(asn_DEF_NR_SRB_ToAddModList,*srb2addList);
*srb2addList = NULL;
}
if(*drb2addList){
LOG_D(NR_RRC, "%s free old DRB_configList2 \n",__FUNCTION__);
ASN_STRUCT_FREE(asn_DEF_NR_DRB_ToAddModList,*drb2addList);
*drb2addList = NULL;
}
if(*drb2releaseList){
LOG_D(NR_RRC, "%s free old DRB_Release_configList2 \n",__FUNCTION__);
ASN_STRUCT_FREE(asn_DEF_NR_DRB_ToAddModList,*drb2releaseList);
*drb2releaseList = NULL;
}
if(rrcReconfiguration->criticalExtensions.present == NR_RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration && rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration){
NR_RRCReconfiguration_IEs_t * ie = rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration;
if(ie->radioBearerConfig){
if(ie->radioBearerConfig->srb_ToAddModList){
LOG_D(NR_RRC, "%s store srb_ToAddModList\n",__FUNCTION__);
*srb2addList = ie->radioBearerConfig->srb_ToAddModList;
ie->radioBearerConfig->srb_ToAddModList = NULL; /* to avoid the content be released externally */
}
if(ie->radioBearerConfig->drb_ToAddModList){
LOG_D(NR_RRC, "%s store drb_ToAddModList\n",__FUNCTION__);
*drb2addList = ie->radioBearerConfig->drb_ToAddModList;
ie->radioBearerConfig->drb_ToAddModList = NULL; /* to avoid the content be released externally*/
}
if(ie->radioBearerConfig->drb_ToReleaseList){
LOG_D(NR_RRC, "%s store drb_ToReleaseList\n",__FUNCTION__);
*drb2releaseList = ie->radioBearerConfig->drb_ToReleaseList;
ie->radioBearerConfig->drb_ToReleaseList = NULL; /* to avoid the content be released externally*/
}
}
if(ie->nonCriticalExtension){
if(ie->nonCriticalExtension->masterCellGroup){
uper_decode(NULL,
&asn_DEF_NR_CellGroupConfig,
(void **)&cellGroupConfig,
(uint8_t *)ie->nonCriticalExtension->masterCellGroup->buf,
ie->nonCriticalExtension->masterCellGroup->size, 0, 0);
if (LOG_DEBUGFLAG(DEBUG_ASN1) ) {
xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void *)cellGroupConfig);
}
if(cellGroupConfig){
#if 1
NR_CellGroupConfig_t *masterCellGroup = ue_context_pP->ue_context.masterCellGroup;
if(masterCellGroup && cellGroupConfig->rlc_BearerToAddModList){
/* we only care the added Bearer configuration here */
int count = cellGroupConfig->rlc_BearerToAddModList->list.count;
if(count && masterCellGroup->rlc_BearerToAddModList==NULL){
/* code would not get here */
masterCellGroup->rlc_BearerToAddModList = CALLOC(1,sizeof(struct NR_CellGroupConfig__rlc_BearerToAddModList));
}
LOG_D(NR_RRC, "%s add rlc_BearerConfig into UE masterCellGroup\n",__FUNCTION__);
for(int i=0; i < count; i++){
ASN_SEQUENCE_ADD(&masterCellGroup->rlc_BearerToAddModList->list, cellGroupConfig->rlc_BearerToAddModList->list.array[i]);
}
if (LOG_DEBUGFLAG(DEBUG_ASN1) ) {
xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void *)masterCellGroup);
}
cellGroupConfig->rlc_BearerToAddModList->list.free = NULL; /*not free item pointer as it already added to another list */
asn_sequence_empty(&cellGroupConfig->rlc_BearerToAddModList->list);
}
ASN_STRUCT_FREE(asn_DEF_NR_CellGroupConfig,cellGroupConfig);
#else
if(ue_context_pP->ue_context.masterCellGroup){
/* There is issue to free masterCellGroup content here. */
ASN_STRUCT_FREE(asn_DEF_NR_CellGroupConfig,ue_context_pP->ue_context.masterCellGroup);
}
LOG_D(NR_RRC, "%s store cellGroupConfig\n",__FUNCTION__);
ue_context_pP->ue_context.masterCellGroup = cellGroupConfig;
#endif
}
}
}
}
}
//-----------------------------------------------------------------------------
void
rrc_gNB_generate_dedicatedRRCReconfiguration(
......@@ -834,6 +995,7 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
int pdu_sessions_done = 0;
int i;
NR_CellGroupConfig_t *cellGroupConfig;
int CC_id = ue_context_pP->ue_context.primaryCC_id;
uint8_t xid = rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id);
......@@ -982,7 +1144,7 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
memset(buffer, 0, sizeof(buffer));
cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t));
fill_mastercellGroupConfig(cellGroupConfig, ue_context_pP->ue_context.masterCellGroup);
fill_mastercellGroupConfig(cellGroupConfig, ue_context_pP->ue_context.masterCellGroup,CC_id);
size = do_RRCReconfiguration(ctxt_pP, buffer, sizeof(buffer),
xid,
*SRB_configList2,
......@@ -2518,10 +2680,6 @@ rrc_gNB_decode_dcch(
DCCH,
sdu_sizeP);
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
xer_fprint(stdout, &asn_DEF_NR_UL_DCCH_Message, (void *)ul_dcch_msg);
}
/* configure ciphering */
nr_rrc_pdcp_config_security(ctxt_pP, ue_context_p, 1);
......@@ -2540,11 +2698,7 @@ rrc_gNB_decode_dcch(
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),
DCCH,
sdu_sizeP);
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
xer_fprint(stdout, &asn_DEF_NR_UL_DCCH_Message, (void *)ul_dcch_msg);
}
rrc_gNB_generate_UECapabilityEnquiry(ctxt_pP, ue_context_p);
break;
......@@ -2566,9 +2720,7 @@ rrc_gNB_decode_dcch(
PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),
DCCH,
sdu_sizeP);
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
xer_fprint(stdout, &asn_DEF_NR_UL_DCCH_Message, (void *)ul_dcch_msg);
}
LOG_I(NR_RRC, "got UE capabilities for UE %x\n", ctxt_pP->rnti);
int eutra_index = -1;
......@@ -3116,11 +3268,11 @@ static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, const cha
message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_SETUP_RESP);
f1ap_ue_context_setup_t * resp=&F1AP_UE_CONTEXT_SETUP_RESP(message_p);
uint32_t incoming_teid = 0;
int CC_id = ue_context_p->ue_context.primaryCC_id;
NR_CellGroupConfig_t *cellGroupConfig;
cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t));
fill_mastercellGroupConfig(cellGroupConfig, ue_context_p->ue_context.masterCellGroup);
fill_mastercellGroupConfig(cellGroupConfig, ue_context_p->ue_context.masterCellGroup,CC_id);
/* Configure SRB2 */
NR_SRB_ToAddMod_t *SRB2_config = NULL;
......@@ -3645,6 +3797,10 @@ void *rrc_gnb_task(void *args_p) {
LOG_I(NR_RRC, "[gNB %ld] Received %s : %p\n", instance, msg_name_p,&NRRRC_CONFIGURATION_REQ(msg_p));
openair_rrc_gNB_configuration(GNB_INSTANCE_TO_MODULE_ID(instance), &NRRRC_CONFIGURATION_REQ(msg_p));
break;
case NRRRC_RBLIST_CFG_REQ:
LOG_I(NR_RRC, "[eNB %ld] Received %s : %p, RB Count:%d\n", instance, msg_name_p, &NRRRC_RBLIST_CFG_REQ(msg_p),NRRRC_RBLIST_CFG_REQ(msg_p).rb_count);
rrc_gNB_rblist_configuration(GNB_INSTANCE_TO_MODULE_ID(instance), &NRRRC_RBLIST_CFG_REQ(msg_p));
break;
/* Messages from F1AP task */
case F1AP_SETUP_REQ:
......@@ -3717,46 +3873,96 @@ void *rrc_gnb_task(void *args_p) {
(uint8_t *)SS_NRRRC_PDU_REQ(msg_p).sdu,
SS_NRRRC_PDU_REQ(msg_p).sdu_size, 0, 0);
LOG_A(RRC, "DL DCCH size: %d \n", SS_NRRRC_PDU_REQ(msg_p).sdu_size);
LOG_A(NR_RRC, "DL DCCH size: %d \n", SS_NRRRC_PDU_REQ(msg_p).sdu_size);
if (LOG_DEBUGFLAG(DEBUG_ASN1))
{
xer_fprint(stdout, &asn_DEF_NR_DL_DCCH_Message, (void *)dl_dcch_msg);
}
nr_rrc_data_req(&ctxt,
DCCH,
rrc_gNB_mui++,
SDU_CONFIRM_NO,
SS_NRRRC_PDU_REQ (msg_p).sdu_size,
SS_NRRRC_PDU_REQ (msg_p).sdu,
PDCP_TRANSMISSION_MODE_CONTROL);
/* remove UE Context */
if (dl_dcch_msg->message.present == NR_DL_DCCH_MessageType_PR_c1)
{
if (dl_dcch_msg->message.choice.c1->present == NR_DL_DCCH_MessageType__c1_PR_rrcRelease)
if(dl_dcch_msg->message.choice.c1) {
if (dl_dcch_msg->message.choice.c1->present == NR_DL_DCCH_MessageType__c1_PR_rrcReconfiguration)
{
struct rrc_gNB_ue_context_s * ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt.module_id], ctxt.rnti);
LOG_A(NR_RRC, "[GNB %ld] SRB %d rnti %d rrcReconfiguration\n", instance, SS_NRRRC_PDU_REQ(msg_p).srb_id, SS_NRRRC_PDU_REQ(msg_p).rnti);
if(ue_context_p){
NR_RRCReconfiguration_t * rrcReconfiguration = dl_dcch_msg->message.choice.c1->choice.rrcReconfiguration;
/*---------------------------------------------------------------------------*/
/* The cellGroupConfig inside rrcReconfiguration from TTCN doesn't have rlc_config for some srb, upate it from bearList config */
if(rrcReconfiguration->criticalExtensions.present == NR_RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration && rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration){
NR_RRCReconfiguration_IEs_t * ie = rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration;
if(ie->nonCriticalExtension && ie->nonCriticalExtension->masterCellGroup){
NR_CellGroupConfig_t * cellGroupConfig = NULL;
uper_decode(NULL,
&asn_DEF_NR_CellGroupConfig,
(void **)&cellGroupConfig,
(uint8_t *)ie->nonCriticalExtension->masterCellGroup->buf,
ie->nonCriticalExtension->masterCellGroup->size, 0, 0);
if (LOG_DEBUGFLAG(DEBUG_ASN1) ) {
xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void *)cellGroupConfig);
}
if(update_rrcReconfig_cellGroupConfig(&ctxt,ue_context_p,cellGroupConfig)){
//we need to update the SDU as cellGroupConfig updated
LOG_A(NR_RRC, "[GNB] update rrcReconfiguration DL_DCCH_Message message\n");
uint8_t *buff = calloc(128,sizeof(uint8_t));
asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig,
NULL,
(void *)cellGroupConfig,
buff,
128);
ASN_STRUCT_FREE(asn_DEF_NR_CellGroupConfig,cellGroupConfig);
if(enc_rval.encoded == -1) {
LOG_E(NR_RRC, "ASN1 message CellGroupConfig encoding failed (%s)!\n",
enc_rval.failed_type->name);
}
AssertFatal(enc_rval.encoded != -1, "[gNB AssertFatal]ASN1 message encoding CellGroupConfig failed (%s)!\n",enc_rval.failed_type->name);
if (OCTET_STRING_fromBuf(ie->nonCriticalExtension->masterCellGroup, buff, (enc_rval.encoded+7)/8) == -1) {
LOG_E(NR_RRC, "fatal: OCTET_STRING_fromBuf failed\n");
AssertFatal(0, "OCTET_STRING_fromBuf failed\n");
}
free(buff);
if (LOG_DEBUGFLAG(DEBUG_ASN1))
{
xer_fprint(stdout, &asn_DEF_NR_DL_DCCH_Message, (void *)dl_dcch_msg);
}
enc_rval = uper_encode_to_buffer(&asn_DEF_NR_DL_DCCH_Message,
NULL,
(void *)dl_dcch_msg,
SS_NRRRC_PDU_REQ (msg_p).sdu,
SDU_SIZE);
if(enc_rval.encoded == -1) {
LOG_E(NR_RRC, "[gNB AssertFatal]ASN1 message DL_DCCH_Message encoding failed (%s)!\n",enc_rval.failed_type->name);
}
AssertFatal(enc_rval.encoded != -1, "[gNB AssertFatal]ASN1 message encoding DL_DCCH_Message failed (%s)!\n",enc_rval.failed_type->name);
SS_NRRRC_PDU_REQ (msg_p).sdu_size = ((enc_rval.encoded+7)/8);
LOG_A(NR_RRC, "DL DCCH updated size: %d \n", SS_NRRRC_PDU_REQ(msg_p).sdu_size);
}
}
}
/*---------------------------------------------------------------------------*/
rrc_gNB_store_RRCReconfiguration(&ctxt,ue_context_p,rrcReconfiguration);
}
}
else if(dl_dcch_msg->message.choice.c1->present == NR_DL_DCCH_MessageType__c1_PR_rrcRelease)
{
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt.module_id], ctxt.rnti);
if (ue_context_p) {
/* uint8_t cc_id = ue_context_p->ue_context.primaryCC_id; */
/* ue_context_p->ue_context.ue_reestablishment_timer = 0; */
/* ue_context_p->ue_context.ue_release_timer = 1; */
/* ue_context_p->ue_context.ue_release_timer_thres = 10; */
/* ue_context_p->ue_context.ue_rrc_inactivity_timer = 0; */
/* ue_context_p->ue_context.ue_release_timer_rrc = 0; */
/* ue_context_p->ue_context.ue_release_timer_thres_rrc = 0; */
/* ue_context_p->ue_context.ue_release_timer_ng = 1; */
/* security_mode_command_send = TRUE; */
/* as_security_conf_ciphering = FALSE; */
/* if (RC.ss.CBRA_flag) */
/* { */
/* RRCConnSetup_PDU_Present[cc_id] = FALSE; */
/* } */
LOG_I(NR_RRC, "rrcRelease UE rnti: %x \n", ctxt.rnti);
ue_context_p->ue_context.ue_reestablishment_timer = 0;
ue_context_p->ue_context.ue_release_timer = 0; /* TODO: ue_release_timer is not checked in nr_rrc_subframe_process */
ue_context_p->ue_context.ue_release_timer_thres = 0;
ue_context_p->ue_context.ue_rrc_inactivity_timer = 0;
ue_context_p->ue_context.ue_release_timer_rrc = 1; /* ue_release_timer_rrc is used to check UE context release */
ue_context_p->ue_context.ue_release_timer_thres_rrc = 10;
/*
LOG_W(NR_RRC, "todo, sleep before removing UE %x \n", ctxt.rnti);
sleep(1);
mac_remove_nr_ue(ctxt.module_id, ctxt.rnti);
......@@ -3764,73 +3970,26 @@ void *rrc_gnb_task(void *args_p) {
pdcp_remove_UE(&ctxt);
LOG_I(NR_RRC, "removed UE %x \n", ctxt.rnti);
*/
}
else
{
LOG_W(NR_RRC, "ue_context_p is already NULL\n");
}
}
else if (dl_dcch_msg->message.choice.c1->present == NR_DL_DCCH_MessageType__c1_PR_rrcReconfiguration)
{
int i;
uint8_t xid;
}
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt.module_id], ctxt.rnti);
AssertFatal(ue_context_p != NULL, "ue_context_p is NULL\n");
LOG_I(NR_RRC, "reconfigure bearers for UE %x \n", ctxt.rnti);
NR_RRCReconfiguration_t *rrcReconfiguration = dl_dcch_msg->message.choice.c1->choice.rrcReconfiguration;
AssertFatal(rrcReconfiguration!=NULL, "rrcReconfiguration is null\n");
NR_RRCReconfiguration_IEs_t *rrcReconfiguration_ies = rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration;
AssertFatal(rrcReconfiguration_ies!=NULL, "rrcReconfiguration_ies is null\n");
AssertFatal(rrcReconfiguration_ies->radioBearerConfig!=NULL, "rrcReconfiguration_ies->radioBearerConfig is null\n");
xid = rrcReconfiguration->rrc_TransactionIdentifier;
if (ue_context_p->ue_context.SRB_configList2[xid] == NULL) {
ue_context_p->ue_context.SRB_configList2[xid] = CALLOC(1, sizeof(*ue_context_p->ue_context.SRB_configList2[xid]));
memset(ue_context_p->ue_context.SRB_configList2[xid], 0, sizeof(*ue_context_p->ue_context.SRB_configList2[xid]));
}
if (ue_context_p->ue_context.DRB_configList2[xid] == NULL) {
ue_context_p->ue_context.DRB_configList2[xid] = CALLOC(1, sizeof(*ue_context_p->ue_context.DRB_configList2[xid]));
memset(ue_context_p->ue_context.DRB_configList2[xid], 0, sizeof(*ue_context_p->ue_context.DRB_configList2[xid]));
}
NR_SRB_ToAddModList_t *SRB_configList = ue_context_p->ue_context.SRB_configList2[xid];
NR_DRB_ToAddModList_t *DRB_configList = ue_context_p->ue_context.DRB_configList2[xid];
const NR_SRB_ToAddModList_t *srb2add_listP = rrcReconfiguration_ies->radioBearerConfig->srb_ToAddModList;
if (srb2add_listP != NULL) {
for (i = 0; i < srb2add_listP->list.count; i++) {
ASN_SEQUENCE_ADD(&SRB_configList->list, srb2add_listP->list.array[i]);
}
}
const NR_DRB_ToAddModList_t *drb2add_listP = rrcReconfiguration_ies->radioBearerConfig->drb_ToAddModList;
if (drb2add_listP != NULL) {
for (i = 0; i < drb2add_listP->list.count; i++) {
ASN_SEQUENCE_ADD(&DRB_configList->list, drb2add_listP->list.array[i]);
}
}
ASN_STRUCT_FREE(asn_DEF_NR_DL_DCCH_Message,dl_dcch_msg);
AssertFatal(rrcReconfiguration_ies->nonCriticalExtension!=NULL, "rrcReconfiguration_ies->nonCriticalExtension is null\n");
AssertFatal(rrcReconfiguration_ies->nonCriticalExtension->masterCellGroup!=NULL, "masterCellGroup is null\n");
AssertFatal(rrcReconfiguration_ies->nonCriticalExtension->masterCellGroup->buf!=NULL,"masterCellGroup is null\n");
asn_dec_rval_t dec_rval;
NR_CellGroupConfig_t *cellGroupConfig = NULL;
dec_rval = uper_decode(NULL,
&asn_DEF_NR_CellGroupConfig,
(void **)&cellGroupConfig,
rrcReconfiguration_ies->nonCriticalExtension->masterCellGroup->buf,
rrcReconfiguration_ies->nonCriticalExtension->masterCellGroup->size,0,0);
AssertFatal(dec_rval.code == RC_OK, "could not decode masterCellGroup\n");
if (cellGroupConfig->rlc_BearerToAddModList != NULL) {
for (i = 0; i < cellGroupConfig->rlc_BearerToAddModList->list.count; i++) {
ASN_SEQUENCE_ADD(&ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList->list, cellGroupConfig->rlc_BearerToAddModList->list.array[i]);
}
asn_sequence_empty(&cellGroupConfig->rlc_BearerToAddModList->list);
}
SEQUENCE_free( &asn_DEF_NR_CellGroupConfig, cellGroupConfig, 0 );
}
}
}
break;
nr_rrc_data_req(&ctxt,
DCCH,
rrc_gNB_mui++,
SDU_CONFIRM_NO,
SS_NRRRC_PDU_REQ (msg_p).sdu_size,
SS_NRRRC_PDU_REQ (msg_p).sdu,
PDCP_TRANSMISSION_MODE_CONTROL);
}
break;
case SS_DRB_PDU_REQ:
LOG_A(NR_RRC, "NR RRC received SS_DRB_PDU_REQ DRB_ID:%d SDU_SIZE:%d\n", SS_DRB_PDU_REQ(msg_p).drb_id, SS_DRB_PDU_REQ(msg_p).sdu_size);
......
......@@ -209,6 +209,8 @@ void rrc_gNB_remove_ue_context(
RB_REMOVE(rrc_nr_ue_tree_s, &rrc_instance_pP->rrc_ue_head, ue_context_pP);
rrc_gNB_free_mem_UE_context(ctxt_pP, ue_context_pP);
nr_uid_linear_allocator_free(rrc_instance_pP, ue_context_pP->local_uid);
/*TODO: should use ASN_STRUCT_FREE to release each pointer field of ue_context */
/* free fields of ue_context_pP->ue_context */
free(ue_context_pP);
rrc_instance_pP->Nb_ue --;
LOG_I(RRC,
......
......@@ -125,6 +125,12 @@ static void send_sys_cnf(enum ConfirmationResult_Type_Sel resType,
msgCnf->Confirm.v.Cell = true;
break;
}
case NR_SystemConfirm_Type_RadioBearerList:
{
LOG_A(GNB_APP, "[SYS-GNB] Send confirm for RadioBearerList\n");
msgCnf->Confirm.v.RadioBearerList = true;
break;
}
case NR_SystemConfirm_Type_PdcpCount:
{
if (msg)
......@@ -812,33 +818,298 @@ int cell_config_5G_done_indication()
bool ss_task_sys_nr_handle_cellConfigRadioBearer(struct NR_SYSTEM_CTRL_REQ *req)
{
LOG_A(GNB_APP, "[SYS-GNB] Entry in fxn:%s\n", __FUNCTION__);
struct NR_SYSTEM_CTRL_CNF *msgCnf = CALLOC(1, sizeof(struct NR_SYSTEM_CTRL_CNF));
MessageDef *message_p = itti_alloc_new_message(TASK_SYS_GNB, INSTANCE_DEFAULT, SS_NR_SYS_PORT_MSG_CNF);
struct NR_RadioBearer_Type_NR_RadioBearerList_Type_Dynamic *BearerList = &(req->Request.v.RadioBearerList);
LOG_A(GNB_APP, "[SYS-GNB] Entry in fxn:%s\n", __FUNCTION__);
MessageDef *msg_p = itti_alloc_new_message(TASK_SYS_GNB, 0, NRRRC_RBLIST_CFG_REQ);
if (msg_p)
{
LOG_A(GNB_APP, "[SYS-GNB] BearerList size:%lu\n", BearerList->d);
NRRRC_RBLIST_CFG_REQ(msg_p).rb_count = 0;
NRRRC_RBLIST_CFG_REQ(msg_p).cell_index = 0; //TODO: change to multicell index later
for (int i = 0; i < BearerList->d; i++)
{
LOG_A(GNB_APP,"[SYS-GNB] RB Index i:%d\n", i);
nr_rb_info * rb_info = &(NRRRC_RBLIST_CFG_REQ(msg_p).rb_list[i]);
memset(rb_info, 0, sizeof(nr_rb_info));
if (BearerList->v[i].Id.d == NR_RadioBearerId_Type_Srb)
{
rb_info->RbId = BearerList->v[i].Id.v.Srb;
}
else if (BearerList->v[i].Id.d == NR_RadioBearerId_Type_Drb)
{
rb_info->RbId = BearerList->v[i].Id.v.Drb + 2; // Added 2 for MAXSRB because DRB1 starts from index-3
}
if (message_p)
{
LOG_A(GNB_APP, "[SYS-GNB] Send SS_NR_SYS_PORT_MSG_CNF\n");
msgCnf->Common.CellId = SS_context.eutra_cellId;
msgCnf->Common.Result.d = ConfirmationResult_Type_Success;
msgCnf->Common.Result.v.Success = true;
msgCnf->Confirm.d = NR_SystemConfirm_Type_RadioBearerList;
msgCnf->Confirm.v.RadioBearerList = true;
SS_NR_SYS_PORT_MSG_CNF(message_p).cnf = msgCnf;
int send_res = itti_send_msg_to_task(TASK_SS_PORTMAN_GNB, INSTANCE_DEFAULT, message_p);
if (send_res < 0)
{
LOG_A(GNB_APP, "[SYS-GNB] Error sending to [SS-PORTMAN-GNB]");
return false;
}
else
{
LOG_A(GNB_APP, "[SYS-GNB] fxn:%s NR_SYSTEM_CTRL_CNF sent for cnfType:NR_SystemConfirm_Type_RadioBearerList to Port Manager", __FUNCTION__);
}
}
LOG_A(GNB_APP, "[SYS-GNB] Exit from fxn:%s\n", __FUNCTION__);
return true;
NRRadioBearerConfig * rbConfig = &rb_info->RbConfig;
if (BearerList->v[i].Config.d == NR_RadioBearerConfig_Type_AddOrReconfigure)
{
NRRRC_RBLIST_CFG_REQ(msg_p).rb_count++;
/* Populate the SDAP Configuration for the radio Bearer */
if(BearerList->v[i].Config.v.AddOrReconfigure.Sdap.d)
{
if(BearerList->v[i].Config.v.AddOrReconfigure.Sdap.v.d == SDAP_Configuration_Type_Config)
{
if(BearerList->v[i].Config.v.AddOrReconfigure.Sdap.v.v.Config.d == SdapConfigInfo_Type_SdapConfig)
{
NR_SDAP_Config_t * sdap = CALLOC(1,sizeof(NR_SDAP_Config_t));
sdap->pdu_Session = BearerList->v[i].Config.v.AddOrReconfigure.Sdap.v.v.Config.v.SdapConfig.Pdu_SessionId;
if(BearerList->v[i].Config.v.AddOrReconfigure.Sdap.v.v.Config.v.SdapConfig.Sdap_HeaderDL.d)
{
sdap->sdap_HeaderDL = BearerList->v[i].Config.v.AddOrReconfigure.Sdap.v.v.Config.v.SdapConfig.Sdap_HeaderDL.v;
}
if(BearerList->v[i].Config.v.AddOrReconfigure.Sdap.v.v.Config.v.SdapConfig.MappedQoS_Flows.d)
{
sdap->mappedQoS_FlowsToAdd = CALLOC(1,sizeof(*sdap->mappedQoS_FlowsToAdd));
for(int j=0; j < BearerList->v[i].Config.v.AddOrReconfigure.Sdap.v.v.Config.v.SdapConfig.MappedQoS_Flows.v.d; j++)
{
NR_QFI_t * qfi = CALLOC(1,sizeof(NR_QFI_t));
*qfi = BearerList->v[i].Config.v.AddOrReconfigure.Sdap.v.v.Config.v.SdapConfig.MappedQoS_Flows.v.v[j];
ASN_SEQUENCE_ADD(&sdap->mappedQoS_FlowsToAdd->list,qfi);
}
}
rbConfig->Sdap = sdap;
}else if(BearerList->v[i].Config.v.AddOrReconfigure.Sdap.v.v.Config.d == SdapConfigInfo_Type_TransparentMode){
}
}
}
/* Populate the PDCP Configuration for the radio Bearer */
if (BearerList->v[i].Config.v.AddOrReconfigure.Pdcp.d)
{
if (BearerList->v[i].Config.v.AddOrReconfigure.Pdcp.v.d == NR_PDCP_Configuration_Type_RBTerminating)
{
if (BearerList->v[i].Config.v.AddOrReconfigure.Pdcp.v.v.RBTerminating.RbConfig.d)
{
if (BearerList->v[i].Config.v.AddOrReconfigure.Pdcp.v.v.RBTerminating.RbConfig.v.d == NR_PDCP_RbConfig_Type_Params)
{
if(BearerList->v[i].Config.v.AddOrReconfigure.Pdcp.v.v.RBTerminating.RbConfig.v.v.Params.Rb.d == NR_PDCP_RB_Config_Parameters_Type_Srb)
{
LOG_A(GNB_APP,"[SYS-GNB] PDCP Config for Bearer Id: %d is Null\n", rb_info->RbId);
}
else if(BearerList->v[i].Config.v.AddOrReconfigure.Pdcp.v.v.RBTerminating.RbConfig.v.v.Params.Rb.d == NR_PDCP_RB_Config_Parameters_Type_Drb)
{
NR_PDCP_Config_t *pdcp = CALLOC(1,sizeof(NR_PDCP_Config_t));
pdcp->drb = CALLOC(1, sizeof(*pdcp->drb));
pdcp->drb->pdcp_SN_SizeUL=CALLOC(1,sizeof(long));
*(pdcp->drb->pdcp_SN_SizeUL) = BearerList->v[i].Config.v.AddOrReconfigure.Pdcp.v.v.RBTerminating.RbConfig.v.v.Params.Rb.v.Drb.SN_SizeUL;
pdcp->drb->pdcp_SN_SizeDL=CALLOC(1,sizeof(long));
*(pdcp->drb->pdcp_SN_SizeDL) = BearerList->v[i].Config.v.AddOrReconfigure.Pdcp.v.v.RBTerminating.RbConfig.v.v.Params.Rb.v.Drb.SN_SizeDL;
if(BearerList->v[i].Config.v.AddOrReconfigure.Pdcp.v.v.RBTerminating.RbConfig.v.v.Params.Rb.v.Drb.IntegrityProtectionEnabled)
{
pdcp->drb->integrityProtection = CALLOC(1,sizeof(long));
*(pdcp->drb->integrityProtection) = 1;
}
//No rohc config for DRB from TTCN
if(BearerList->v[i].Config.v.AddOrReconfigure.Pdcp.v.v.RBTerminating.RbConfig.v.v.Params.Rb.v.Drb.HeaderCompression.d == NR_PDCP_DRB_HeaderCompression_Type_None)
{
}
rbConfig->Pdcp = pdcp;
}
}
else if (BearerList->v[i].Config.v.AddOrReconfigure.Pdcp.v.v.RBTerminating.RbConfig.v.d == NR_PDCP_RbConfig_Type_TransparentMode)
{
rbConfig->pdcpTransparentSN_Size = CALLOC(1,sizeof(long));
*(rbConfig->pdcpTransparentSN_Size) = BearerList->v[i].Config.v.AddOrReconfigure.Pdcp.v.v.RBTerminating.RbConfig.v.v.TransparentMode.SN_Size;
}
}
if(BearerList->v[i].Config.v.AddOrReconfigure.Pdcp.v.v.RBTerminating.LinkToOtherCellGroup.d)
{
if(BearerList->v[i].Config.v.AddOrReconfigure.Pdcp.v.v.RBTerminating.LinkToOtherCellGroup.v.d == RlcBearerRouting_Type_EUTRA)
{
//BearerList->v[i].Config.v.AddOrReconfigure.Pdcp.v.v.RBTerminating.LinkToOtherCellGroup.v.v.EUTRA
}
else if(BearerList->v[i].Config.v.AddOrReconfigure.Pdcp.v.v.RBTerminating.LinkToOtherCellGroup.v.d == RlcBearerRouting_Type_NR)
{
//BearerList->v[i].Config.v.AddOrReconfigure.Pdcp.v.v.RBTerminating.LinkToOtherCellGroup.v.v.NR
}
}
}
else if(BearerList->v[i].Config.v.AddOrReconfigure.Pdcp.v.d == NR_PDCP_Configuration_Type_Proxy)
{
if(BearerList->v[i].Config.v.AddOrReconfigure.Pdcp.v.v.Proxy.LinkToOtherNode.d == RlcBearerRouting_Type_EUTRA)
{
//BearerList->v[i].Config.v.AddOrReconfigure.Pdcp.v.v.Proxy.LinkToOtherNode.v.EUTRA
}
else if(BearerList->v[i].Config.v.AddOrReconfigure.Pdcp.v.v.Proxy.LinkToOtherNode.d == RlcBearerRouting_Type_NR)
{
//BearerList->v[i].Config.v.AddOrReconfigure.Pdcp.v.v.Proxy.LinkToOtherNode.v.NR
}
}
}
/* Populate the RlcBearerConfig for the radio Bearer */
if (BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.d)
{
NR_RLC_BearerConfig_t * rlcBearer = CALLOC(1,sizeof(NR_RLC_BearerConfig_t));
if (BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.d == NR_RlcBearerConfig_Type_Config)
{
/* Populate the Rlc Config of RlcBearerConfig for the radio Bearer */
if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.d)
{
if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.d)
{
NR_RLC_Config_t *rlc = CALLOC(1,sizeof(NR_RLC_Config_t));
if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.d == NR_RLC_RbConfig_Type_AM)
{
rlc->present = NR_RLC_Config_PR_am;
rlc->choice.am = CALLOC(1,sizeof(*rlc->choice.am));
if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.v.AM.Tx.d)
{
if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.v.AM.Tx.v.d == NR_ASN1_UL_AM_RLC_Type_R15)
{
if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.v.AM.Tx.v.v.R15.sn_FieldLength.d)
{
rlc->choice.am->ul_AM_RLC.sn_FieldLength = CALLOC(1,sizeof(long));
*(rlc->choice.am->ul_AM_RLC.sn_FieldLength) = BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.v.AM.Tx.v.v.R15.sn_FieldLength.v;
}
rlc->choice.am->ul_AM_RLC.t_PollRetransmit = BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.v.AM.Tx.v.v.R15.t_PollRetransmit;
rlc->choice.am->ul_AM_RLC.pollPDU = BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.v.AM.Tx.v.v.R15.pollPDU;
rlc->choice.am->ul_AM_RLC.pollByte = BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.v.AM.Tx.v.v.R15.pollByte;
rlc->choice.am->ul_AM_RLC.maxRetxThreshold = BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.v.AM.Tx.v.v.R15.maxRetxThreshold;
}
}
if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.v.AM.Rx.d)
{
if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.v.AM.Rx.v.d == NR_ASN1_DL_AM_RLC_Type_R15)
{
if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.v.AM.Rx.v.v.R15.sn_FieldLength.d)
{
rlc->choice.am->dl_AM_RLC.sn_FieldLength = CALLOC(1,sizeof(long));
*(rlc->choice.am->dl_AM_RLC.sn_FieldLength) = BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.v.AM.Rx.v.v.R15.sn_FieldLength.v;
}
rlc->choice.am->dl_AM_RLC.t_Reassembly = BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.v.AM.Rx.v.v.R15.t_Reassembly;
rlc->choice.am->dl_AM_RLC.t_StatusProhibit = BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.v.AM.Rx.v.v.R15.t_StatusProhibit;
}
}
}
else if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.d == NR_RLC_RbConfig_Type_UM)
{
NR_UL_UM_RLC_t *ul_UM_RLC = NULL;
NR_DL_UM_RLC_t *dl_UM_RLC = NULL;
if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.v.UM.Tx.d && BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.v.UM.Rx.d)
{
rlc->present = NR_RLC_Config_PR_um_Bi_Directional;
rlc->choice.um_Bi_Directional = CALLOC(1,sizeof(*rlc->choice.um_Bi_Directional));
ul_UM_RLC = &rlc->choice.um_Bi_Directional->ul_UM_RLC;
dl_UM_RLC = &rlc->choice.um_Bi_Directional->dl_UM_RLC;
}
else if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.v.UM.Tx.d)
{
rlc->present = NR_RLC_Config_PR_um_Uni_Directional_UL;
rlc->choice.um_Uni_Directional_UL = CALLOC(1,sizeof(*rlc->choice.um_Uni_Directional_UL));
ul_UM_RLC = &rlc->choice.um_Uni_Directional_UL->ul_UM_RLC;
}
else if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.v.UM.Rx.d)
{
rlc->present = NR_RLC_Config_PR_um_Uni_Directional_DL;
rlc->choice.um_Uni_Directional_DL = CALLOC(1,sizeof(*rlc->choice.um_Uni_Directional_DL));
dl_UM_RLC = &rlc->choice.um_Uni_Directional_DL->dl_UM_RLC;
}
if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.v.UM.Tx.d)
{
if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.v.UM.Tx.v.d == NR_ASN1_UL_UM_RLC_Type_R15)
{
if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.v.UM.Tx.v.v.R15.sn_FieldLength.d)
{
ul_UM_RLC->sn_FieldLength = CALLOC(1,sizeof(long));
*(ul_UM_RLC->sn_FieldLength) = BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.v.UM.Tx.v.v.R15.sn_FieldLength.v;
}
}
}
if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.v.UM.Rx.d)
{
if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.v.UM.Rx.v.d == NR_ASN1_DL_UM_RLC_Type_R15)
{
if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.v.UM.Rx.v.v.R15.sn_FieldLength.d)
{
dl_UM_RLC->sn_FieldLength = CALLOC(1,sizeof(long));
*(dl_UM_RLC->sn_FieldLength) = BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.v.UM.Rx.v.v.R15.sn_FieldLength.v;
}
dl_UM_RLC->t_Reassembly = BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.v.UM.Rx.v.v.R15.t_Reassembly;
}
}
}
else if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.Rb.v.d == NR_RLC_RbConfig_Type_TM)
{
//TODO: TransparentMode
}
else
{
rlc->present = NR_RLC_Config_PR_NOTHING;
}
rlcBearer->rlc_Config = rlc;
}
if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.TestMode.d)
{
//TODO: RLC TestMode
if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.TestMode.v.d == NR_RLC_TestModeConfig_Type_Info)
{
if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.TestMode.v.v.Info.d == NR_RLC_TestModeInfo_Type_AckProhibit)
{
}
else if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.TestMode.v.v.Info.d == NR_RLC_TestModeInfo_Type_NotACK_NextRLC_PDU)
{
}
else if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.TestMode.v.v.Info.d == NR_RLC_TestModeInfo_Type_TransparentMode)
{
}
}
else if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Rlc.v.TestMode.v.d == NR_RLC_TestModeConfig_Type_None)
{
}
}
}
/* Populate the LogicalChannelId of RlcBearerConfig for the radio Bearer */
if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.LogicalChannelId.d)
{
rlcBearer->logicalChannelIdentity = BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.LogicalChannelId.v;
}
/* Populate the LogicalChannelConfig of RlcBearerConfig for the radio Bearer */
if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Mac.d)
{
if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Mac.v.LogicalChannel.d)
{
NR_LogicalChannelConfig_t * logicalChannelConfig = CALLOC(1,sizeof(NR_LogicalChannelConfig_t));
logicalChannelConfig->ul_SpecificParameters = CALLOC(1,sizeof(*logicalChannelConfig->ul_SpecificParameters));
logicalChannelConfig->ul_SpecificParameters->priority = BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Mac.v.LogicalChannel.v.Priority;
logicalChannelConfig->ul_SpecificParameters->prioritisedBitRate = BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Mac.v.LogicalChannel.v.PrioritizedBitRate;
rlcBearer->mac_LogicalChannelConfig = logicalChannelConfig;
}
if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.Mac.v.TestMode.d)
{
//TODO: MAC test mode
}
}
/* Populate the DiscardULData of RlcBearerConfig for the radio Bearer */
if(BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.DiscardULData.d)
{
//typically applicable for UM DRBs only: if true: SS shall discard any data in UL for this radio bearer
rbConfig->DiscardULData =CALLOC(1,sizeof(bool));
*(rbConfig->DiscardULData) = BearerList->v[i].Config.v.AddOrReconfigure.RlcBearer.v.v.Config.DiscardULData.v;
}
}
rbConfig->RlcBearer = rlcBearer;
}
}
}
LOG_A(GNB_APP, "[SYS-GNB] Send NRRRC_RBLIST_CFG_REQ to TASK_RRC_GNB, RB Count : %d, Message: %s \n", NRRRC_RBLIST_CFG_REQ(msg_p).rb_count, ITTI_MSG_NAME(msg_p));
int send_res = itti_send_msg_to_task(TASK_RRC_GNB, 0, msg_p);
if (send_res < 0)
{
LOG_A(GNB_APP, "[SYS-GNB] Error sending NRRRC_RBLIST_CFG_REQ to RRC_GNB \n");
}
}
send_sys_cnf(ConfirmationResult_Type_Success, true, NR_SystemConfirm_Type_RadioBearerList, NULL);
LOG_A(GNB_APP, "[SYS-GNB] Exit from fxn:%s\n", __FUNCTION__);
return true;
}
/*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment