improve handling of SRBs at RRC UE
This commit is contained in:
@@ -757,21 +757,27 @@ void deliver_pdu_srb_rlc(void *deliver_pdu_data, ue_id_t ue_id, int srb_id,
|
|||||||
enqueue_rlc_data_req(&ctxt, 1, MBMS_FLAG_NO, srb_id, sdu_id, 0, size, memblock);
|
enqueue_rlc_data_req(&ctxt, 1, MBMS_FLAG_NO, srb_id, sdu_id, 0, size, memblock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void add_srb(int is_gnb, ue_id_t rntiMaybeUEid, struct NR_SRB_ToAddMod *s, int ciphering_algorithm, int integrity_algorithm, unsigned char *ciphering_key, unsigned char *integrity_key)
|
void add_srb(int is_gnb,
|
||||||
|
ue_id_t rntiMaybeUEid,
|
||||||
|
struct NR_SRB_ToAddMod *s,
|
||||||
|
int ciphering_algorithm,
|
||||||
|
int integrity_algorithm,
|
||||||
|
unsigned char *ciphering_key,
|
||||||
|
unsigned char *integrity_key)
|
||||||
{
|
{
|
||||||
nr_pdcp_entity_t *pdcp_srb;
|
nr_pdcp_entity_t *pdcp_srb;
|
||||||
nr_pdcp_ue_t *ue;
|
nr_pdcp_ue_t *ue;
|
||||||
int t_Reordering=3000;
|
|
||||||
|
|
||||||
int srb_id = s->srb_Identity;
|
int srb_id = s->srb_Identity;
|
||||||
if (s->pdcp_Config == NULL ||
|
int t_Reordering = -1; // infinity as per default SRB configuration in 9.2.1 of 38.331
|
||||||
s->pdcp_Config->t_Reordering == NULL) t_Reordering = 3000;
|
if (s->pdcp_Config != NULL &&
|
||||||
else t_Reordering = decode_t_reordering(*s->pdcp_Config->t_Reordering);
|
s->pdcp_Config->t_Reordering != NULL)
|
||||||
|
t_Reordering = decode_t_reordering(*s->pdcp_Config->t_Reordering);
|
||||||
|
|
||||||
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
|
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
|
||||||
ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, rntiMaybeUEid);
|
ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, rntiMaybeUEid);
|
||||||
if (ue->srb[srb_id-1] != NULL) {
|
if (ue->srb[srb_id-1] != NULL) {
|
||||||
LOG_D(PDCP, "%s:%d:%s: warning SRB %d already exist for UE ID/RNTI %ld, do nothing\n", __FILE__, __LINE__, __FUNCTION__, srb_id, rntiMaybeUEid);
|
LOG_E(PDCP, "%s:%d:%s: warning SRB %d already exist for UE ID/RNTI %ld, do nothing\n", __FILE__, __LINE__, __FUNCTION__, srb_id, rntiMaybeUEid);
|
||||||
} else {
|
} else {
|
||||||
pdcp_srb = new_nr_pdcp_entity(NR_PDCP_SRB, is_gnb, srb_id,
|
pdcp_srb = new_nr_pdcp_entity(NR_PDCP_SRB, is_gnb, srb_id,
|
||||||
0, false, false, // sdap parameters
|
0, false, false, // sdap parameters
|
||||||
@@ -1061,6 +1067,18 @@ bool nr_pdcp_data_req_srb(ue_id_t ue_id,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void nr_pdcp_reconfigure_srb(ue_id_t ue_id,
|
||||||
|
int srb_id,
|
||||||
|
long t_Reordering)
|
||||||
|
{
|
||||||
|
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
|
||||||
|
nr_pdcp_ue_t *ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, ue_id);
|
||||||
|
nr_pdcp_entity_t *srb = ue->srb[srb_id - 1];
|
||||||
|
int decoded_t_reordering = decode_t_reordering(t_Reordering);
|
||||||
|
srb->t_reordering = decoded_t_reordering;
|
||||||
|
nr_pdcp_manager_unlock(nr_pdcp_ue_manager);
|
||||||
|
}
|
||||||
|
|
||||||
void nr_pdcp_reestablishment(ue_id_t ue_id)
|
void nr_pdcp_reestablishment(ue_id_t ue_id)
|
||||||
{
|
{
|
||||||
// TODO implement this on a per RB basis following TS 38.323 Sec 5.1.2
|
// TODO implement this on a per RB basis following TS 38.323 Sec 5.1.2
|
||||||
|
|||||||
@@ -59,6 +59,18 @@ void nr_DRB_preconfiguration(ue_id_t crntiMaybeUEid);
|
|||||||
bool nr_pdcp_remove_UE(ue_id_t ue_id);
|
bool nr_pdcp_remove_UE(ue_id_t ue_id);
|
||||||
void nr_pdcp_reestablishment(ue_id_t ue_id);
|
void nr_pdcp_reestablishment(ue_id_t ue_id);
|
||||||
|
|
||||||
|
void nr_pdcp_reconfigure_srb(ue_id_t ue_id,
|
||||||
|
int srb_id,
|
||||||
|
long t_Reordering);
|
||||||
|
|
||||||
|
void add_srb(int is_gnb,
|
||||||
|
ue_id_t rntiMaybeUEid,
|
||||||
|
struct NR_SRB_ToAddMod *s,
|
||||||
|
int ciphering_algorithm,
|
||||||
|
int integrity_algorithm,
|
||||||
|
unsigned char *ciphering_key,
|
||||||
|
unsigned char *integrity_key);
|
||||||
|
|
||||||
void nr_pdcp_config_set_security(ue_id_t ue_id,
|
void nr_pdcp_config_set_security(ue_id_t ue_id,
|
||||||
const rb_id_t rb_id,
|
const rb_id_t rb_id,
|
||||||
const uint8_t security_modeP,
|
const uint8_t security_modeP,
|
||||||
|
|||||||
@@ -28,11 +28,12 @@
|
|||||||
|
|
||||||
#define NR_RRC_HEADER_SIZE_MAX 64
|
#define NR_RRC_HEADER_SIZE_MAX 64
|
||||||
#define NR_RRC_BUFFER_SIZE_MAX 1024
|
#define NR_RRC_BUFFER_SIZE_MAX 1024
|
||||||
|
#define NR_NUM_SRB 4
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char Payload[NR_RRC_BUFFER_SIZE_MAX];
|
char Payload[NR_RRC_BUFFER_SIZE_MAX];
|
||||||
char Header[NR_RRC_HEADER_SIZE_MAX];
|
char Header[NR_RRC_HEADER_SIZE_MAX];
|
||||||
uint16_t payload_size;
|
uint16_t payload_size;
|
||||||
} NR_RRC_BUFFER;
|
} NR_RRC_BUFFER;
|
||||||
|
|
||||||
typedef enum UE_STATE_NR_e {
|
typedef enum UE_STATE_NR_e {
|
||||||
@@ -45,17 +46,17 @@ typedef enum UE_STATE_NR_e {
|
|||||||
} NR_UE_STATE_t;
|
} NR_UE_STATE_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
unsigned short transport_block_size; /*!< \brief Minimum PDU size in bytes provided by RLC to MAC layer interface */
|
unsigned short transport_block_size; /*!< \brief Minimum PDU size in bytes provided by RLC to MAC layer interface */
|
||||||
unsigned short max_transport_blocks; /*!< \brief Maximum PDU size in bytes provided by RLC to MAC layer interface */
|
unsigned short max_transport_blocks; /*!< \brief Maximum PDU size in bytes provided by RLC to MAC layer interface */
|
||||||
unsigned long Guaranteed_bit_rate; /*!< \brief Guaranteed Bit Rate (average) to be offered by MAC layer scheduling*/
|
unsigned long Guaranteed_bit_rate; /*!< \brief Guaranteed Bit Rate (average) to be offered by MAC layer scheduling*/
|
||||||
unsigned long Max_bit_rate; /*!< \brief Maximum Bit Rate that can be offered by MAC layer scheduling*/
|
unsigned long Max_bit_rate; /*!< \brief Maximum Bit Rate that can be offered by MAC layer scheduling*/
|
||||||
uint8_t Delay_class; /*!< \brief Delay class offered by MAC layer scheduling*/
|
uint8_t Delay_class; /*!< \brief Delay class offered by MAC layer scheduling*/
|
||||||
uint8_t Target_bler; /*!< \brief Target Average Transport Block Error rate*/
|
uint8_t Target_bler; /*!< \brief Target Average Transport Block Error rate*/
|
||||||
uint8_t Lchan_t; /*!< \brief Logical Channel Type (BCCH,CCCH,DCCH,DTCH_B,DTCH,MRBCH)*/
|
uint8_t Lchan_t; /*!< \brief Logical Channel Type (BCCH,CCCH,DCCH,DTCH_B,DTCH,MRBCH)*/
|
||||||
} __attribute__ ((__packed__)) NR_LCHAN_DESC;
|
} __attribute__ ((__packed__)) NR_LCHAN_DESC;
|
||||||
|
|
||||||
typedef struct RB_INFO_NR_s {
|
typedef struct RB_INFO_NR_s {
|
||||||
uint16_t Rb_id; //=Lchan_id
|
uint16_t Rb_id; //=Lchan_id
|
||||||
NR_LCHAN_DESC Lchan_desc[2];
|
NR_LCHAN_DESC Lchan_desc[2];
|
||||||
//MAC_MEAS_REQ_ENTRY *Meas_entry; //may not needed for NB-IoT
|
//MAC_MEAS_REQ_ENTRY *Meas_entry; //may not needed for NB-IoT
|
||||||
} NR_RB_INFO;
|
} NR_RB_INFO;
|
||||||
@@ -66,8 +67,8 @@ typedef struct NR_SRB_INFO_s {
|
|||||||
} NR_SRB_INFO;
|
} NR_SRB_INFO;
|
||||||
|
|
||||||
typedef struct SRB_INFO_TABLE_ENTRY_NR_s {
|
typedef struct SRB_INFO_TABLE_ENTRY_NR_s {
|
||||||
NR_SRB_INFO Srb_info;
|
NR_SRB_INFO Srb_info;
|
||||||
uint8_t Active;
|
uint8_t Active;
|
||||||
uint8_t status;
|
uint8_t status;
|
||||||
} NR_SRB_INFO_TABLE_ENTRY;
|
} NR_SRB_INFO_TABLE_ENTRY;
|
||||||
|
|
||||||
|
|||||||
@@ -133,14 +133,15 @@ int8_t nr_mac_rrc_data_req_ue(const module_id_t Mod_idP,
|
|||||||
switch(Srb_id) {
|
switch(Srb_id) {
|
||||||
|
|
||||||
case CCCH:
|
case CCCH:
|
||||||
|
LOG_D(NR_RRC, "nr_mac_rrc_data_req_ue: Payload size = %i\n",
|
||||||
LOG_D(NR_RRC, "nr_mac_rrc_data_req_ue: Payload size = %i\n", NR_UE_rrc_inst[Mod_idP].Srb0[gNB_id].Tx_buffer.payload_size);
|
NR_UE_rrc_inst[Mod_idP].Srb[gNB_id][0].srb_buffers.Tx_buffer.payload_size);
|
||||||
memcpy(buffer_pP, (uint8_t*)NR_UE_rrc_inst[Mod_idP].Srb0[gNB_id].Tx_buffer.Payload, NR_UE_rrc_inst[Mod_idP].Srb0[gNB_id].Tx_buffer.payload_size);
|
NR_UE_RRC_SRB_INFO_t *Srb0 = &NR_UE_rrc_inst[Mod_idP].Srb[gNB_id][0];
|
||||||
for(int i = 0; i<NR_UE_rrc_inst[Mod_idP].Srb0[gNB_id].Tx_buffer.payload_size; i++) {
|
memcpy(buffer_pP, (uint8_t*)Srb0->srb_buffers.Tx_buffer.Payload, Srb0->srb_buffers.Tx_buffer.payload_size);
|
||||||
|
for(int i = 0; i < Srb0->srb_buffers.Tx_buffer.payload_size; i++) {
|
||||||
LOG_D(NR_RRC,"(%i): %i\n", i, buffer_pP[i]);
|
LOG_D(NR_RRC,"(%i): %i\n", i, buffer_pP[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NR_UE_rrc_inst[Mod_idP].Srb0[gNB_id].Tx_buffer.payload_size;
|
return Srb0->srb_buffers.Tx_buffer.payload_size;
|
||||||
|
|
||||||
case DCCH:
|
case DCCH:
|
||||||
AssertFatal(1==0, "SRB1 not implemented yet!\n");
|
AssertFatal(1==0, "SRB1 not implemented yet!\n");
|
||||||
|
|||||||
+173
-261
@@ -120,26 +120,6 @@ nr_rrc_ue_generate_rrcReestablishmentComplete(
|
|||||||
|
|
||||||
mui_t nr_rrc_mui=0;
|
mui_t nr_rrc_mui=0;
|
||||||
|
|
||||||
static void nr_rrc_addmod_srbs(int rnti,
|
|
||||||
const NR_SRB_ToAddModList_t *srb_list,
|
|
||||||
const struct NR_CellGroupConfig__rlc_BearerToAddModList *bearer_list)
|
|
||||||
{
|
|
||||||
if (srb_list == NULL || bearer_list == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (int i = 0; i < srb_list->list.count; i++) {
|
|
||||||
const NR_SRB_ToAddMod_t *srb = srb_list->list.array[i];
|
|
||||||
for (int j = 0; j < bearer_list->list.count; j++) {
|
|
||||||
const NR_RLC_BearerConfig_t *bearer = bearer_list->list.array[j];
|
|
||||||
if (bearer->servedRadioBearer != NULL
|
|
||||||
&& bearer->servedRadioBearer->present == NR_RLC_BearerConfig__servedRadioBearer_PR_srb_Identity
|
|
||||||
&& srb->srb_Identity == bearer->servedRadioBearer->choice.srb_Identity) {
|
|
||||||
nr_rlc_add_srb(rnti, srb->srb_Identity, bearer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void nr_rrc_addmod_drbs(int rnti,
|
static void nr_rrc_addmod_drbs(int rnti,
|
||||||
const NR_DRB_ToAddModList_t *drb_list,
|
const NR_DRB_ToAddModList_t *drb_list,
|
||||||
const struct NR_CellGroupConfig__rlc_BearerToAddModList *bearer_list)
|
const struct NR_CellGroupConfig__rlc_BearerToAddModList *bearer_list)
|
||||||
@@ -163,8 +143,8 @@ static void nr_rrc_addmod_drbs(int rnti,
|
|||||||
// from LTE-RRC DL-DCCH RRCConnectionReconfiguration nr-secondary-cell-group-config (encoded)
|
// from LTE-RRC DL-DCCH RRCConnectionReconfiguration nr-secondary-cell-group-config (encoded)
|
||||||
int8_t nr_rrc_ue_decode_secondary_cellgroup_config(const module_id_t module_id,
|
int8_t nr_rrc_ue_decode_secondary_cellgroup_config(const module_id_t module_id,
|
||||||
const uint8_t *buffer,
|
const uint8_t *buffer,
|
||||||
const uint32_t size){
|
const uint32_t size)
|
||||||
|
{
|
||||||
NR_CellGroupConfig_t *cell_group_config = NULL;
|
NR_CellGroupConfig_t *cell_group_config = NULL;
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
|
|
||||||
@@ -322,7 +302,6 @@ void process_nsa_message(NR_UE_RRC_INST_t *rrc, nsa_message_t nsa_message_type,
|
|||||||
protocol_ctxt_t ctxt;
|
protocol_ctxt_t ctxt;
|
||||||
NR_UE_MAC_INST_t *mac = get_mac_inst(module_id);
|
NR_UE_MAC_INST_t *mac = get_mac_inst(module_id);
|
||||||
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_id, ENB_FLAG_YES, mac->crnti, 0, 0, 0);
|
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_id, ENB_FLAG_YES, mac->crnti, 0, 0, 0);
|
||||||
xer_fprint(stdout, &asn_DEF_NR_RadioBearerConfig, (const void*)RadioBearerConfig);
|
|
||||||
LOG_D(NR_RRC, "Calling nr_rrc_ue_process_RadioBearerConfig() at %d with: e_rab_id = %ld, drbID = %ld, cipher_algo = %ld, key = %ld \n",
|
LOG_D(NR_RRC, "Calling nr_rrc_ue_process_RadioBearerConfig() at %d with: e_rab_id = %ld, drbID = %ld, cipher_algo = %ld, key = %ld \n",
|
||||||
__LINE__, RadioBearerConfig->drb_ToAddModList->list.array[0]->cnAssociation->choice.eps_BearerIdentity,
|
__LINE__, RadioBearerConfig->drb_ToAddModList->list.array[0]->cnAssociation->choice.eps_BearerIdentity,
|
||||||
RadioBearerConfig->drb_ToAddModList->list.array[0]->drb_Identity,
|
RadioBearerConfig->drb_ToAddModList->list.array[0]->drb_Identity,
|
||||||
@@ -357,15 +336,19 @@ NR_UE_RRC_INST_t* openair_rrc_top_init_ue_nr(char* uecap_file, char* reconfig_fi
|
|||||||
rrc->ubwpd = NULL;
|
rrc->ubwpd = NULL;
|
||||||
rrc->as_security_activated = false;
|
rrc->as_security_activated = false;
|
||||||
|
|
||||||
for (int i = 0; i < NB_SIG_CNX_UE; i++)
|
for (int i = 0; i < NB_CNX_UE; i++) {
|
||||||
memset((void *)&rrc->SInfo[i], 0, sizeof(rrc->SInfo[i]));
|
memset((void *)&rrc->SInfo[i], 0, sizeof(rrc->SInfo[i]));
|
||||||
|
for (int j = 0; j < NR_NUM_SRB; j++)
|
||||||
|
memset((void *)&rrc->Srb[i][j], 0, sizeof(rrc->Srb[i][j]));
|
||||||
|
// SRB0 activated by default
|
||||||
|
rrc->Srb[i][0].status = RB_ESTABLISHED;
|
||||||
|
}
|
||||||
rrc->ra_trigger = RA_NOT_RUNNING;
|
rrc->ra_trigger = RA_NOT_RUNNING;
|
||||||
}
|
}
|
||||||
|
|
||||||
NR_UE_rrc_inst->uecap_file = uecap_file;
|
NR_UE_rrc_inst->uecap_file = uecap_file;
|
||||||
|
|
||||||
if (get_softmodem_params()->phy_test==1 || get_softmodem_params()->do_ra==1) {
|
if (get_softmodem_params()->phy_test == 1 || get_softmodem_params()->do_ra == 1) {
|
||||||
// read in files for RRCReconfiguration and RBconfig
|
// read in files for RRCReconfiguration and RBconfig
|
||||||
|
|
||||||
LOG_I(NR_RRC, "using %s for rrc init[1/2]\n", reconfig_file);
|
LOG_I(NR_RRC, "using %s for rrc init[1/2]\n", reconfig_file);
|
||||||
@@ -407,11 +390,6 @@ NR_UE_RRC_INST_t* openair_rrc_top_init_ue_nr(char* uecap_file, char* reconfig_fi
|
|||||||
return NR_UE_rrc_inst;
|
return NR_UE_rrc_inst;
|
||||||
}
|
}
|
||||||
|
|
||||||
int8_t nr_ue_process_rlc_bearer_list(NR_CellGroupConfig_t *cell_group_config){
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int8_t nr_ue_process_secondary_cell_list(NR_CellGroupConfig_t *cell_group_config){
|
int8_t nr_ue_process_secondary_cell_list(NR_CellGroupConfig_t *cell_group_config){
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -998,20 +976,22 @@ static void rrc_ue_generate_RRCSetupComplete(
|
|||||||
nr_pdcp_data_req_srb(ctxt_pP->rntiMaybeUEid, DCCH, nr_rrc_mui++, size, buffer, deliver_pdu_srb_rlc, NULL);
|
nr_pdcp_data_req_srb(ctxt_pP->rntiMaybeUEid, DCCH, nr_rrc_mui++, size, buffer, deliver_pdu_srb_rlc, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
int8_t nr_rrc_ue_decode_ccch( const protocol_ctxt_t *const ctxt_pP, const NR_SRB_INFO *const Srb_info, const uint8_t gNB_index )
|
int8_t nr_rrc_ue_decode_ccch( const protocol_ctxt_t *const ctxt_pP, const NR_UE_RRC_SRB_INFO_t *Srb_info, const uint8_t gNB_index )
|
||||||
{
|
{
|
||||||
NR_UE_RRC_INST_t *rrc = &NR_UE_rrc_inst[ctxt_pP->module_id];
|
NR_UE_RRC_INST_t *rrc = &NR_UE_rrc_inst[ctxt_pP->module_id];
|
||||||
NR_DL_CCCH_Message_t *dl_ccch_msg=NULL;
|
NR_DL_CCCH_Message_t *dl_ccch_msg=NULL;
|
||||||
asn_dec_rval_t dec_rval;
|
asn_dec_rval_t dec_rval;
|
||||||
int rval=0;
|
int rval=0;
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_CCCH, VCD_FUNCTION_IN);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_CCCH, VCD_FUNCTION_IN);
|
||||||
LOG_D(RRC,"[NR UE%d] Decoding DL-CCCH message (%d bytes), State %d\n",ctxt_pP->module_id,Srb_info->Rx_buffer.payload_size,
|
LOG_D(RRC,"[NR UE%d] Decoding DL-CCCH message (%d bytes), State %d\n",
|
||||||
|
ctxt_pP->module_id,
|
||||||
|
Srb_info->srb_buffers.Rx_buffer.payload_size,
|
||||||
rrc->nrRrcState);
|
rrc->nrRrcState);
|
||||||
dec_rval = uper_decode(NULL,
|
dec_rval = uper_decode(NULL,
|
||||||
&asn_DEF_NR_DL_CCCH_Message,
|
&asn_DEF_NR_DL_CCCH_Message,
|
||||||
(void **)&dl_ccch_msg,
|
(void **)&dl_ccch_msg,
|
||||||
(uint8_t *)Srb_info->Rx_buffer.Payload,
|
(uint8_t *)Srb_info->srb_buffers.Rx_buffer.Payload,
|
||||||
Srb_info->Rx_buffer.payload_size,0,0);
|
Srb_info->srb_buffers.Rx_buffer.payload_size,0,0);
|
||||||
|
|
||||||
// if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
|
// if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
|
||||||
xer_fprint(stdout,&asn_DEF_NR_DL_CCCH_Message,(void *)dl_ccch_msg);
|
xer_fprint(stdout,&asn_DEF_NR_DL_CCCH_Message,(void *)dl_ccch_msg);
|
||||||
@@ -1305,75 +1285,38 @@ void nr_rrc_ue_process_securityModeCommand(const protocol_ctxt_t *const ctxt_pP,
|
|||||||
securityModeCommand->criticalExtensions.present);
|
securityModeCommand->criticalExtensions.present);
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
void nr_rrc_ue_generate_RRCSetupRequest(module_id_t module_id, const uint8_t gNB_index)
|
||||||
void nr_rrc_ue_generate_RRCSetupRequest(module_id_t module_id, const uint8_t gNB_index) {
|
{
|
||||||
uint8_t i=0,rv[6];
|
uint8_t rv[6];
|
||||||
|
NR_UE_RRC_SRB_INFO_t *Srb0 = &NR_UE_rrc_inst[module_id].Srb[gNB_index][0];
|
||||||
if(NR_UE_rrc_inst[module_id].Srb0[gNB_index].Tx_buffer.payload_size ==0) {
|
if(Srb0->srb_buffers.Tx_buffer.payload_size == 0) {
|
||||||
// Get RRCConnectionRequest, fill random for now
|
// Get RRCConnectionRequest, fill random for now
|
||||||
// Generate random byte stream for contention resolution
|
// Generate random byte stream for contention resolution
|
||||||
for (i=0; i<6; i++) {
|
for (int i = 0; i < 6; i++) {
|
||||||
#ifdef SMBV
|
#ifdef SMBV
|
||||||
// if SMBV is configured the contention resolution needs to be fix for the connection procedure to succeed
|
// if SMBV is configured the contention resolution needs to be fix for the connection procedure to succeed
|
||||||
rv[i]=i;
|
rv[i]=i;
|
||||||
#else
|
#else
|
||||||
rv[i]=taus()&0xff;
|
rv[i]=taus()&0xff;
|
||||||
#endif
|
#endif
|
||||||
LOG_T(NR_RRC,"%x.",rv[i]);
|
LOG_T(NR_RRC,"%x.",rv[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_T(NR_RRC,"\n");
|
LOG_T(NR_RRC,"\n");
|
||||||
NR_UE_rrc_inst[module_id].Srb0[gNB_index].Tx_buffer.payload_size =
|
Srb0->srb_buffers.Tx_buffer.payload_size = do_RRCSetupRequest(module_id,
|
||||||
do_RRCSetupRequest(
|
(uint8_t *)Srb0->srb_buffers.Tx_buffer.Payload,
|
||||||
module_id,
|
sizeof(Srb0->srb_buffers.Tx_buffer.Payload),
|
||||||
(uint8_t *)NR_UE_rrc_inst[module_id].Srb0[gNB_index].Tx_buffer.Payload,
|
rv);
|
||||||
sizeof(NR_UE_rrc_inst[module_id].Srb0[gNB_index].Tx_buffer.Payload),
|
LOG_I(NR_RRC,"[UE %d] : Logical Channel UL-CCCH (SRB0), Generating RRCSetupRequest (bytes %d, gNB %d)\n",
|
||||||
rv);
|
module_id, Srb0->srb_buffers.Tx_buffer.payload_size, gNB_index);
|
||||||
LOG_I(NR_RRC,"[UE %d] : Logical Channel UL-CCCH (SRB0), Generating RRCSetupRequest (bytes %d, gNB %d)\n",
|
|
||||||
module_id, NR_UE_rrc_inst[module_id].Srb0[gNB_index].Tx_buffer.payload_size, gNB_index);
|
|
||||||
|
|
||||||
for (i=0; i<NR_UE_rrc_inst[module_id].Srb0[gNB_index].Tx_buffer.payload_size; i++) {
|
for (int i = 0; i < Srb0->srb_buffers.Tx_buffer.payload_size; i++)
|
||||||
LOG_T(NR_RRC,"%x.",NR_UE_rrc_inst[module_id].Srb0[gNB_index].Tx_buffer.Payload[i]);
|
LOG_T(NR_RRC,"%x.", Srb0->srb_buffers.Tx_buffer.Payload[i]);
|
||||||
//printf("%x.",NR_UE_rrc_inst[module_id].Srb0[gNB_index].Tx_buffer.Payload[i]);
|
|
||||||
|
|
||||||
}
|
LOG_T(NR_RRC,"\n");
|
||||||
|
|
||||||
LOG_T(NR_RRC,"\n");
|
|
||||||
//printf("\n");
|
|
||||||
/*UE_rrc_inst[ue_mod_idP].Srb0[Idx].Tx_buffer.Payload[i] = taus()&0xff;
|
|
||||||
UE_rrc_inst[ue_mod_idP].Srb0[Idx].Tx_buffer.payload_size =i; */
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
int32_t
|
|
||||||
nr_rrc_ue_establish_srb1(
|
|
||||||
module_id_t ue_mod_idP,
|
|
||||||
frame_t frameP,
|
|
||||||
uint8_t gNB_index,
|
|
||||||
NR_SRB_ToAddMod_t *SRB_config
|
|
||||||
)
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
{
|
|
||||||
// add descriptor from RRC PDU
|
|
||||||
NR_UE_rrc_inst[ue_mod_idP].Srb1[gNB_index].Active = 1;
|
|
||||||
NR_UE_rrc_inst[ue_mod_idP].Srb1[gNB_index].status = RADIO_CONFIG_OK; // RADIO CFG
|
|
||||||
LOG_I(NR_RRC, "[UE %d], CONFIG_SRB1 %d corresponding to gNB_index %d\n", ue_mod_idP, DCCH, gNB_index);
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t nr_rrc_ue_establish_srb2(module_id_t ue_mod_idP,
|
|
||||||
frame_t frameP,
|
|
||||||
uint8_t gNB_index,
|
|
||||||
NR_SRB_ToAddMod_t *SRB_config)
|
|
||||||
{
|
|
||||||
// add descriptor from RRC PDU
|
|
||||||
NR_UE_rrc_inst[ue_mod_idP].Srb2[gNB_index].Active = 1;
|
|
||||||
NR_UE_rrc_inst[ue_mod_idP].Srb2[gNB_index].status = RADIO_CONFIG_OK; // RADIO CFG
|
|
||||||
LOG_I(NR_RRC, "[UE %d], CONFIG_SRB2 %d corresponding to gNB_index %d\n", ue_mod_idP, DCCH1, gNB_index);
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t nr_rrc_ue_establish_drb(module_id_t ue_mod_idP,
|
int32_t nr_rrc_ue_establish_drb(module_id_t ue_mod_idP,
|
||||||
frame_t frameP,
|
frame_t frameP,
|
||||||
uint8_t gNB_index,
|
uint8_t gNB_index,
|
||||||
@@ -1540,175 +1483,145 @@ int32_t nr_rrc_ue_establish_drb(module_id_t ue_mod_idP,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
void
|
|
||||||
nr_rrc_ue_process_RadioBearerConfig(
|
|
||||||
const protocol_ctxt_t *const ctxt_pP,
|
|
||||||
const uint8_t gNB_index,
|
|
||||||
NR_RadioBearerConfig_t *const radioBearerConfig
|
|
||||||
)
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
{
|
|
||||||
long SRB_id, DRB_id;
|
|
||||||
int i, cnt;
|
|
||||||
|
|
||||||
if( radioBearerConfig->srb3_ToRelease != NULL){
|
void nr_rrc_ue_process_RadioBearerConfig(const protocol_ctxt_t *const ctxt_pP,
|
||||||
if( *radioBearerConfig->srb3_ToRelease == true){
|
const uint8_t gNB_index,
|
||||||
//TODO (release the PDCP entity and the srb-Identity of the SRB3.)
|
NR_RadioBearerConfig_t *const radioBearerConfig)
|
||||||
}
|
{
|
||||||
}
|
if (LOG_DEBUGFLAG(DEBUG_ASN1))
|
||||||
|
xer_fprint(stdout, &asn_DEF_NR_RadioBearerConfig, (const void*)radioBearerConfig);
|
||||||
|
|
||||||
NR_UE_RRC_INST_t *ue_rrc = &NR_UE_rrc_inst[ctxt_pP->module_id];
|
NR_UE_RRC_INST_t *ue_rrc = &NR_UE_rrc_inst[ctxt_pP->module_id];
|
||||||
if (radioBearerConfig->srb_ToAddModList != NULL) {
|
AssertFatal(radioBearerConfig->srb3_ToRelease == NULL, "Release of SRB3 not yet implemented\n");
|
||||||
if (radioBearerConfig->securityConfig != NULL) {
|
|
||||||
if (*radioBearerConfig->securityConfig->keyToUse == NR_SecurityConfig__keyToUse_master) {
|
|
||||||
ue_rrc->cipheringAlgorithm = radioBearerConfig->securityConfig->securityAlgorithmConfig->cipheringAlgorithm;
|
|
||||||
ue_rrc->integrityProtAlgorithm = *radioBearerConfig->securityConfig->securityAlgorithmConfig->integrityProtAlgorithm;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t kRRCenc[16] = {0};
|
uint8_t kRRCenc[16] = {0};
|
||||||
uint8_t kRRCint[16] = {0};
|
uint8_t kRRCint[16] = {0};
|
||||||
nr_derive_key(RRC_ENC_ALG,
|
if (ue_rrc->as_security_activated) {
|
||||||
NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm,
|
if (radioBearerConfig->securityConfig != NULL) {
|
||||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb,
|
// When the field is not included, continue to use the currently configured keyToUse
|
||||||
kRRCenc);
|
if (radioBearerConfig->securityConfig->keyToUse) {
|
||||||
nr_derive_key(RRC_INT_ALG,
|
AssertFatal(*radioBearerConfig->securityConfig->keyToUse == NR_SecurityConfig__keyToUse_master,
|
||||||
NR_UE_rrc_inst[ctxt_pP->module_id].integrityProtAlgorithm,
|
"Secondary key usage seems not to be implemented\n");
|
||||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb,
|
ue_rrc->keyToUse = *radioBearerConfig->securityConfig->keyToUse;
|
||||||
kRRCint);
|
}
|
||||||
|
// When the field is not included, continue to use the currently configured security algorithm
|
||||||
|
if (radioBearerConfig->securityConfig->securityAlgorithmConfig) {
|
||||||
|
ue_rrc->cipheringAlgorithm = radioBearerConfig->securityConfig->securityAlgorithmConfig->cipheringAlgorithm;
|
||||||
|
ue_rrc->integrityProtAlgorithm = *radioBearerConfig->securityConfig->securityAlgorithmConfig->integrityProtAlgorithm;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nr_derive_key(RRC_ENC_ALG,
|
||||||
|
NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm,
|
||||||
|
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb,
|
||||||
|
kRRCenc);
|
||||||
|
nr_derive_key(RRC_INT_ALG,
|
||||||
|
NR_UE_rrc_inst[ctxt_pP->module_id].integrityProtAlgorithm,
|
||||||
|
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb,
|
||||||
|
kRRCint);
|
||||||
|
}
|
||||||
|
|
||||||
// Refresh SRBs
|
if (radioBearerConfig->srb_ToAddModList != NULL) {
|
||||||
nr_pdcp_add_srbs(ctxt_pP->enb_flag,
|
for (int cnt = 0; cnt < radioBearerConfig->srb_ToAddModList->list.count; cnt++) {
|
||||||
ctxt_pP->rntiMaybeUEid,
|
struct NR_SRB_ToAddMod *srb = radioBearerConfig->srb_ToAddModList->list.array[cnt];
|
||||||
radioBearerConfig->srb_ToAddModList,
|
NR_UE_RRC_SRB_INFO_t *Srb_info = &ue_rrc->Srb[gNB_index][srb->srb_Identity];
|
||||||
ue_rrc->cipheringAlgorithm | (ue_rrc->integrityProtAlgorithm << 4),
|
if (Srb_info->status == RB_NOT_PRESENT)
|
||||||
kRRCenc,
|
add_srb(ctxt_pP->enb_flag,
|
||||||
kRRCint);
|
ctxt_pP->rntiMaybeUEid,
|
||||||
// Refresh SRBs
|
radioBearerConfig->srb_ToAddModList->list.array[cnt],
|
||||||
nr_rrc_addmod_srbs(ctxt_pP->rntiMaybeUEid,
|
ue_rrc->cipheringAlgorithm,
|
||||||
radioBearerConfig->srb_ToAddModList,
|
ue_rrc->integrityProtAlgorithm,
|
||||||
ue_rrc->cell_group_config->rlc_BearerToAddModList);
|
kRRCenc,
|
||||||
|
kRRCint);
|
||||||
|
else {
|
||||||
|
AssertFatal(srb->discardOnPDCP, "discardOnPDCP not yet implemented\n");
|
||||||
|
AssertFatal(srb->reestablishPDCP, "reestablishPDCP not yet implemented\n");
|
||||||
|
if(srb->pdcp_Config && srb->pdcp_Config->t_Reordering)
|
||||||
|
nr_pdcp_reconfigure_srb(ctxt_pP->rntiMaybeUEid,
|
||||||
|
srb->srb_Identity,
|
||||||
|
*srb->pdcp_Config->t_Reordering);
|
||||||
|
}
|
||||||
|
Srb_info->status = RB_ESTABLISHED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (cnt = 0; cnt < radioBearerConfig->srb_ToAddModList->list.count; cnt++) {
|
// Establish DRBs if present
|
||||||
SRB_id = radioBearerConfig->srb_ToAddModList->list.array[cnt]->srb_Identity;
|
if (radioBearerConfig->drb_ToAddModList != NULL) {
|
||||||
LOG_D(NR_RRC,"[UE %d]: Frame %d SRB config cnt %d (SRB%ld)\n", ctxt_pP->module_id, ctxt_pP->frame, cnt, SRB_id);
|
if ((NR_UE_rrc_inst[ctxt_pP->module_id].defaultDRB == NULL) &&
|
||||||
if (SRB_id == 1) {
|
(radioBearerConfig->drb_ToAddModList->list.count >= 1)) {
|
||||||
if (NR_UE_rrc_inst[ctxt_pP->module_id].SRB1_config[gNB_index]) {
|
NR_UE_rrc_inst[ctxt_pP->module_id].defaultDRB = malloc(sizeof(rb_id_t));
|
||||||
memcpy(NR_UE_rrc_inst[ctxt_pP->module_id].SRB1_config[gNB_index],
|
*NR_UE_rrc_inst[ctxt_pP->module_id].defaultDRB = radioBearerConfig->drb_ToAddModList->list.array[0]->drb_Identity;
|
||||||
radioBearerConfig->srb_ToAddModList->list.array[cnt],
|
}
|
||||||
sizeof(NR_SRB_ToAddMod_t));
|
|
||||||
} else {
|
|
||||||
NR_UE_rrc_inst[ctxt_pP->module_id].SRB1_config[gNB_index] = radioBearerConfig->srb_ToAddModList->list.array[cnt];
|
|
||||||
nr_rrc_ue_establish_srb1(ctxt_pP->module_id,
|
|
||||||
ctxt_pP->frame,
|
|
||||||
gNB_index,
|
|
||||||
radioBearerConfig->srb_ToAddModList->list.array[cnt]);
|
|
||||||
|
|
||||||
LOG_I(NR_RRC, "[FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (SRB1 gNB %d) --->][MAC_UE][MOD %02d][]\n",
|
for (int cnt = 0; cnt < radioBearerConfig->drb_ToAddModList->list.count; cnt++) {
|
||||||
ctxt_pP->frame, ctxt_pP->module_id, gNB_index, ctxt_pP->module_id);
|
int DRB_id = radioBearerConfig->drb_ToAddModList->list.array[cnt]->drb_Identity;
|
||||||
nr_rrc_mac_config_req_ue_logicalChannelBearer(ctxt_pP->module_id,0,gNB_index,1,true); //todo handle mac_LogicalChannelConfig
|
if (NR_UE_rrc_inst[ctxt_pP->module_id].DRB_config[gNB_index][DRB_id-1]) {
|
||||||
// rrc_mac_config_req_ue
|
memcpy(NR_UE_rrc_inst[ctxt_pP->module_id].DRB_config[gNB_index][DRB_id-1],
|
||||||
}
|
radioBearerConfig->drb_ToAddModList->list.array[cnt], sizeof(NR_DRB_ToAddMod_t));
|
||||||
} else {
|
} else {
|
||||||
if (NR_UE_rrc_inst[ctxt_pP->module_id].SRB2_config[gNB_index]) {
|
//LOG_D(NR_RRC, "Adding DRB %ld %p\n", DRB_id-1, radioBearerConfig->drb_ToAddModList->list.array[cnt]);
|
||||||
memcpy(NR_UE_rrc_inst[ctxt_pP->module_id].SRB2_config[gNB_index],
|
NR_UE_rrc_inst[ctxt_pP->module_id].DRB_config[gNB_index][DRB_id-1] = radioBearerConfig->drb_ToAddModList->list.array[cnt];
|
||||||
radioBearerConfig->srb_ToAddModList->list.array[cnt], sizeof(NR_SRB_ToAddMod_t));
|
struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list = NR_UE_rrc_inst[ctxt_pP->module_id].cell_group_config->rlc_BearerToAddModList;
|
||||||
} else {
|
if (rlc_bearer2add_list != NULL) {
|
||||||
NR_UE_rrc_inst[ctxt_pP->module_id].SRB2_config[gNB_index] = radioBearerConfig->srb_ToAddModList->list.array[cnt];
|
for(int j = 0; j < rlc_bearer2add_list->list.count; j++){
|
||||||
nr_rrc_ue_establish_srb2(ctxt_pP->module_id,
|
if(rlc_bearer2add_list->list.array[j]->servedRadioBearer != NULL){
|
||||||
ctxt_pP->frame,
|
if(rlc_bearer2add_list->list.array[j]->servedRadioBearer->present == NR_RLC_BearerConfig__servedRadioBearer_PR_drb_Identity){
|
||||||
gNB_index,
|
if(DRB_id == rlc_bearer2add_list->list.array[j]->servedRadioBearer->choice.drb_Identity){
|
||||||
radioBearerConfig->srb_ToAddModList->list.array[cnt]);
|
LOG_I(NR_RRC, "[FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (DRB lcid %ld gNB %d) --->][MAC_UE][MOD %02d][]\n",
|
||||||
|
ctxt_pP->frame, ctxt_pP->module_id, rlc_bearer2add_list->list.array[j]->logicalChannelIdentity, 0, ctxt_pP->module_id);
|
||||||
|
nr_rrc_mac_config_req_ue_logicalChannelBearer(ctxt_pP->module_id,0,0,rlc_bearer2add_list->list.array[j]->logicalChannelIdentity,true); //todo handle mac_LogicalChannelConfig
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
LOG_I(NR_RRC, "[FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (SRB2 gNB %d) --->][MAC_UE][MOD %02d][]\n",
|
uint8_t kUPenc[16] = {0};
|
||||||
ctxt_pP->frame, ctxt_pP->module_id, gNB_index, ctxt_pP->module_id);
|
uint8_t kUPint[16] = {0};
|
||||||
nr_rrc_mac_config_req_ue_logicalChannelBearer(ctxt_pP->module_id,0,gNB_index,2,true); //todo handle mac_LogicalChannelConfig
|
nr_derive_key(UP_ENC_ALG,
|
||||||
// rrc_mac_config_req_ue
|
NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm,
|
||||||
}
|
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb,
|
||||||
} // srb2
|
kUPenc);
|
||||||
}
|
nr_derive_key(UP_INT_ALG,
|
||||||
} // srb_ToAddModList
|
NR_UE_rrc_inst[ctxt_pP->module_id].integrityProtAlgorithm,
|
||||||
|
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb,
|
||||||
|
kUPint);
|
||||||
|
|
||||||
// Establish DRBs if present
|
// Refresh DRBs
|
||||||
if (radioBearerConfig->drb_ToAddModList != NULL) {
|
nr_pdcp_add_drbs(ctxt_pP->enb_flag,
|
||||||
if ((NR_UE_rrc_inst[ctxt_pP->module_id].defaultDRB == NULL) &&
|
ctxt_pP->rntiMaybeUEid,
|
||||||
(radioBearerConfig->drb_ToAddModList->list.count >= 1)) {
|
radioBearerConfig->drb_ToAddModList,
|
||||||
NR_UE_rrc_inst[ctxt_pP->module_id].defaultDRB = malloc(sizeof(rb_id_t));
|
ue_rrc->cipheringAlgorithm | (ue_rrc->integrityProtAlgorithm << 4),
|
||||||
*NR_UE_rrc_inst[ctxt_pP->module_id].defaultDRB = radioBearerConfig->drb_ToAddModList->list.array[0]->drb_Identity;
|
kUPenc,
|
||||||
}
|
kUPint,
|
||||||
|
ue_rrc->cell_group_config->rlc_BearerToAddModList);
|
||||||
|
// Refresh DRBs
|
||||||
|
nr_rrc_addmod_drbs(ctxt_pP->rntiMaybeUEid,
|
||||||
|
radioBearerConfig->drb_ToAddModList,
|
||||||
|
ue_rrc->cell_group_config->rlc_BearerToAddModList);
|
||||||
|
|
||||||
for (cnt = 0; cnt < radioBearerConfig->drb_ToAddModList->list.count; cnt++) {
|
} // drb_ToAddModList //
|
||||||
DRB_id = radioBearerConfig->drb_ToAddModList->list.array[cnt]->drb_Identity;
|
|
||||||
if (NR_UE_rrc_inst[ctxt_pP->module_id].DRB_config[gNB_index][DRB_id-1]) {
|
|
||||||
memcpy(NR_UE_rrc_inst[ctxt_pP->module_id].DRB_config[gNB_index][DRB_id-1],
|
|
||||||
radioBearerConfig->drb_ToAddModList->list.array[cnt], sizeof(NR_DRB_ToAddMod_t));
|
|
||||||
} else {
|
|
||||||
//LOG_D(NR_RRC, "Adding DRB %ld %p\n", DRB_id-1, radioBearerConfig->drb_ToAddModList->list.array[cnt]);
|
|
||||||
NR_UE_rrc_inst[ctxt_pP->module_id].DRB_config[gNB_index][DRB_id-1] = radioBearerConfig->drb_ToAddModList->list.array[cnt];
|
|
||||||
int j;
|
|
||||||
struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list = NR_UE_rrc_inst[ctxt_pP->module_id].cell_group_config->rlc_BearerToAddModList;
|
|
||||||
if (rlc_bearer2add_list != NULL) {
|
|
||||||
for(j = 0; j < rlc_bearer2add_list->list.count; j++){
|
|
||||||
if(rlc_bearer2add_list->list.array[j]->servedRadioBearer != NULL){
|
|
||||||
if(rlc_bearer2add_list->list.array[j]->servedRadioBearer->present == NR_RLC_BearerConfig__servedRadioBearer_PR_drb_Identity){
|
|
||||||
if(DRB_id == rlc_bearer2add_list->list.array[j]->servedRadioBearer->choice.drb_Identity){
|
|
||||||
LOG_I(NR_RRC, "[FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (DRB lcid %ld gNB %d) --->][MAC_UE][MOD %02d][]\n",
|
|
||||||
ctxt_pP->frame, ctxt_pP->module_id, rlc_bearer2add_list->list.array[j]->logicalChannelIdentity, 0, ctxt_pP->module_id);
|
|
||||||
nr_rrc_mac_config_req_ue_logicalChannelBearer(ctxt_pP->module_id,0,0,rlc_bearer2add_list->list.array[j]->logicalChannelIdentity,true); //todo handle mac_LogicalChannelConfig
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t kUPenc[16] = {0};
|
if (radioBearerConfig->drb_ToReleaseList != NULL) {
|
||||||
uint8_t kUPint[16] = {0};
|
for (int i = 0; i < radioBearerConfig->drb_ToReleaseList->list.count; i++) {
|
||||||
nr_derive_key(UP_ENC_ALG,
|
int DRB_id = *radioBearerConfig->drb_ToReleaseList->list.array[i];
|
||||||
NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm,
|
free(NR_UE_rrc_inst[ctxt_pP->module_id].DRB_config[gNB_index][DRB_id-1]);
|
||||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb,
|
}
|
||||||
kUPenc);
|
}
|
||||||
nr_derive_key(UP_INT_ALG,
|
|
||||||
NR_UE_rrc_inst[ctxt_pP->module_id].integrityProtAlgorithm,
|
|
||||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb,
|
|
||||||
kUPint);
|
|
||||||
|
|
||||||
// Refresh DRBs
|
if (NR_UE_rrc_inst[ctxt_pP->module_id].cell_group_config->rlc_BearerToReleaseList != NULL) {
|
||||||
nr_pdcp_add_drbs(ctxt_pP->enb_flag,
|
for (int i = 0; i < NR_UE_rrc_inst[ctxt_pP->module_id].cell_group_config->rlc_BearerToReleaseList->list.count; i++) {
|
||||||
ctxt_pP->rntiMaybeUEid,
|
NR_LogicalChannelIdentity_t lcid = *NR_UE_rrc_inst[ctxt_pP->module_id].cell_group_config->rlc_BearerToReleaseList->list.array[i];
|
||||||
radioBearerConfig->drb_ToAddModList,
|
LOG_I(NR_RRC, "[FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (RB lcid %ld gNB %d release) --->][MAC_UE][MOD %02d][]\n",
|
||||||
ue_rrc->cipheringAlgorithm | (ue_rrc->integrityProtAlgorithm << 4),
|
ctxt_pP->frame, ctxt_pP->module_id, lcid, 0, ctxt_pP->module_id);
|
||||||
kUPenc,
|
nr_rrc_mac_config_req_ue_logicalChannelBearer(ctxt_pP->module_id,0,0,lcid,false); //todo handle mac_LogicalChannelConfig
|
||||||
kUPint,
|
}
|
||||||
ue_rrc->cell_group_config->rlc_BearerToAddModList);
|
}
|
||||||
// Refresh DRBs
|
|
||||||
nr_rrc_addmod_drbs(ctxt_pP->rntiMaybeUEid,
|
|
||||||
radioBearerConfig->drb_ToAddModList,
|
|
||||||
ue_rrc->cell_group_config->rlc_BearerToAddModList);
|
|
||||||
|
|
||||||
} // drb_ToAddModList //
|
NR_UE_rrc_inst[ctxt_pP->module_id].nrRrcState = RRC_STATE_CONNECTED_NR;
|
||||||
|
LOG_I(NR_RRC,"[UE %d] State = NR_RRC_CONNECTED (gNB %d)\n", ctxt_pP->module_id, gNB_index);
|
||||||
if (radioBearerConfig->drb_ToReleaseList != NULL) {
|
}
|
||||||
for (i = 0; i < radioBearerConfig->drb_ToReleaseList->list.count; i++) {
|
|
||||||
DRB_id = *radioBearerConfig->drb_ToReleaseList->list.array[i];
|
|
||||||
free(NR_UE_rrc_inst[ctxt_pP->module_id].DRB_config[gNB_index][DRB_id-1]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (NR_UE_rrc_inst[ctxt_pP->module_id].cell_group_config->rlc_BearerToReleaseList != NULL) {
|
|
||||||
for (i = 0; i < NR_UE_rrc_inst[ctxt_pP->module_id].cell_group_config->rlc_BearerToReleaseList->list.count; i++) {
|
|
||||||
NR_LogicalChannelIdentity_t lcid = *NR_UE_rrc_inst[ctxt_pP->module_id].cell_group_config->rlc_BearerToReleaseList->list.array[i];
|
|
||||||
LOG_I(NR_RRC, "[FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (RB lcid %ld gNB %d release) --->][MAC_UE][MOD %02d][]\n",
|
|
||||||
ctxt_pP->frame, ctxt_pP->module_id, lcid, 0, ctxt_pP->module_id);
|
|
||||||
nr_rrc_mac_config_req_ue_logicalChannelBearer(ctxt_pP->module_id,0,0,lcid,false); //todo handle mac_LogicalChannelConfig
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
NR_UE_rrc_inst[ctxt_pP->module_id].nrRrcState = RRC_STATE_CONNECTED_NR;
|
|
||||||
LOG_I(NR_RRC,"[UE %d] State = NR_RRC_CONNECTED (gNB %d)\n", ctxt_pP->module_id, gNB_index);
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
static void rrc_ue_process_rrcReconfiguration(const protocol_ctxt_t *const ctxt_pP,
|
static void rrc_ue_process_rrcReconfiguration(const protocol_ctxt_t *const ctxt_pP,
|
||||||
@@ -1932,7 +1845,6 @@ void *rrc_nrue_task(void *args_p)
|
|||||||
instance_t instance;
|
instance_t instance;
|
||||||
unsigned int ue_mod_id;
|
unsigned int ue_mod_id;
|
||||||
int result;
|
int result;
|
||||||
NR_SRB_INFO *srb_info_p;
|
|
||||||
protocol_ctxt_t ctxt;
|
protocol_ctxt_t ctxt;
|
||||||
itti_mark_task_ready(TASK_RRC_NRUE);
|
itti_mark_task_ready(TASK_RRC_NRUE);
|
||||||
|
|
||||||
@@ -2008,15 +1920,15 @@ void *rrc_nrue_task(void *args_p)
|
|||||||
ITTI_MSG_NAME (msg_p),
|
ITTI_MSG_NAME (msg_p),
|
||||||
NR_RRC_MAC_CCCH_DATA_IND (msg_p).frame,
|
NR_RRC_MAC_CCCH_DATA_IND (msg_p).frame,
|
||||||
NR_RRC_MAC_CCCH_DATA_IND (msg_p).gnb_index);
|
NR_RRC_MAC_CCCH_DATA_IND (msg_p).gnb_index);
|
||||||
srb_info_p = &NR_UE_rrc_inst[ue_mod_id].Srb0[NR_RRC_MAC_CCCH_DATA_IND (msg_p).gnb_index];
|
NR_UE_RRC_SRB_INFO_t *srb0 = &NR_UE_rrc_inst[ue_mod_id].Srb[NR_RRC_MAC_CCCH_DATA_IND (msg_p).gnb_index][0];
|
||||||
memcpy (srb_info_p->Rx_buffer.Payload, NR_RRC_MAC_CCCH_DATA_IND (msg_p).sdu,
|
memcpy (srb0->srb_buffers.Rx_buffer.Payload, NR_RRC_MAC_CCCH_DATA_IND (msg_p).sdu,
|
||||||
NR_RRC_MAC_CCCH_DATA_IND (msg_p).sdu_size);
|
NR_RRC_MAC_CCCH_DATA_IND (msg_p).sdu_size);
|
||||||
srb_info_p->Rx_buffer.payload_size = NR_RRC_MAC_CCCH_DATA_IND (msg_p).sdu_size;
|
srb0->srb_buffers.Rx_buffer.payload_size = NR_RRC_MAC_CCCH_DATA_IND (msg_p).sdu_size;
|
||||||
PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, GNB_FLAG_NO, NR_RRC_MAC_CCCH_DATA_IND (msg_p).rnti, NR_RRC_MAC_CCCH_DATA_IND (msg_p).frame, 0);
|
PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, GNB_FLAG_NO, NR_RRC_MAC_CCCH_DATA_IND (msg_p).rnti, NR_RRC_MAC_CCCH_DATA_IND (msg_p).frame, 0);
|
||||||
// PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, ue_mod_id, GNB_FLAG_NO, NR_RRC_MAC_CCCH_DATA_IND (msg_p).rnti, NR_RRC_MAC_CCCH_DATA_IND (msg_p).frame, 0, NR_RRC_MAC_CCCH_DATA_IND (msg_p).gnb_index);
|
// PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, ue_mod_id, GNB_FLAG_NO, NR_RRC_MAC_CCCH_DATA_IND (msg_p).rnti, NR_RRC_MAC_CCCH_DATA_IND (msg_p).frame, 0, NR_RRC_MAC_CCCH_DATA_IND (msg_p).gnb_index);
|
||||||
nr_rrc_ue_decode_ccch (&ctxt,
|
nr_rrc_ue_decode_ccch(&ctxt,
|
||||||
srb_info_p,
|
srb0,
|
||||||
NR_RRC_MAC_CCCH_DATA_IND (msg_p).gnb_index);
|
NR_RRC_MAC_CCCH_DATA_IND (msg_p).gnb_index);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* PDCP messages */
|
/* PDCP messages */
|
||||||
@@ -2077,8 +1989,8 @@ void *rrc_nrue_task(void *args_p)
|
|||||||
length = do_NR_ULInformationTransfer(&buffer, NAS_UPLINK_DATA_REQ (msg_p).nasMsg.length, NAS_UPLINK_DATA_REQ (msg_p).nasMsg.data);
|
length = do_NR_ULInformationTransfer(&buffer, NAS_UPLINK_DATA_REQ (msg_p).nasMsg.length, NAS_UPLINK_DATA_REQ (msg_p).nasMsg.data);
|
||||||
/* Transfer data to PDCP */
|
/* Transfer data to PDCP */
|
||||||
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, ue_mod_id, GNB_FLAG_NO, NR_UE_rrc_inst[ue_mod_id].rnti, 0, 0,0);
|
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, ue_mod_id, GNB_FLAG_NO, NR_UE_rrc_inst[ue_mod_id].rnti, 0, 0,0);
|
||||||
// check if SRB2 is created, if yes request data_req on DCCH1 (SRB2)
|
// check if SRB2 is created, if yes request data_req on SRB2
|
||||||
rb_id_t srb_id = NR_UE_rrc_inst[ue_mod_id].SRB2_config[0] == NULL ? DCCH : DCCH1;
|
rb_id_t srb_id = NR_UE_rrc_inst[ue_mod_id].Srb[0][2].status == RB_ESTABLISHED ? 2 : 1;
|
||||||
nr_pdcp_data_req_srb(ctxt.rntiMaybeUEid, srb_id, nr_rrc_mui++, length, buffer, deliver_pdu_srb_rlc, NULL);
|
nr_pdcp_data_req_srb(ctxt.rntiMaybeUEid, srb_id, nr_rrc_mui++, length, buffer, deliver_pdu_srb_rlc, NULL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,8 +59,6 @@
|
|||||||
|
|
||||||
#define NB_NR_UE_INST 1
|
#define NB_NR_UE_INST 1
|
||||||
#define NB_CNX_UE 2//MAX_MANAGED_RG_PER_MOBILE
|
#define NB_CNX_UE 2//MAX_MANAGED_RG_PER_MOBILE
|
||||||
#define NB_SIG_CNX_UE 2 //MAX_MANAGED_RG_PER_MOBILE
|
|
||||||
|
|
||||||
#define MAX_MEAS_OBJ 7
|
#define MAX_MEAS_OBJ 7
|
||||||
#define MAX_MEAS_CONFIG 7
|
#define MAX_MEAS_CONFIG 7
|
||||||
#define MAX_MEAS_ID 7
|
#define MAX_MEAS_ID 7
|
||||||
@@ -178,6 +176,17 @@ typedef enum {
|
|||||||
IN_SYNC = 1
|
IN_SYNC = 1
|
||||||
} nr_sync_msg_t;
|
} nr_sync_msg_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
RB_NOT_PRESENT = 0,
|
||||||
|
RB_ESTABLISHED,
|
||||||
|
RB_SUSPENDED
|
||||||
|
} NR_RB_status_t;
|
||||||
|
|
||||||
|
typedef struct NR_UE_RRC_SRB_INFO_s {
|
||||||
|
NR_RB_status_t status;
|
||||||
|
NR_SRB_INFO srb_buffers;
|
||||||
|
} NR_UE_RRC_SRB_INFO_t;
|
||||||
|
|
||||||
typedef struct NR_UE_RRC_INST_s {
|
typedef struct NR_UE_RRC_INST_s {
|
||||||
NR_MeasConfig_t *meas_config;
|
NR_MeasConfig_t *meas_config;
|
||||||
NR_CellGroupConfig_t *cell_group_config;
|
NR_CellGroupConfig_t *cell_group_config;
|
||||||
@@ -191,17 +200,14 @@ typedef struct NR_UE_RRC_INST_s {
|
|||||||
NR_MeasIdToAddMod_t *MeasId[NB_CNX_UE][MAX_MEAS_ID];
|
NR_MeasIdToAddMod_t *MeasId[NB_CNX_UE][MAX_MEAS_ID];
|
||||||
NR_MeasGapConfig_t *measGapConfig[NB_CNX_UE];
|
NR_MeasGapConfig_t *measGapConfig[NB_CNX_UE];
|
||||||
NR_RSRP_Range_t s_measure;
|
NR_RSRP_Range_t s_measure;
|
||||||
NR_SRB_ToAddMod_t *SRB1_config[NB_CNX_UE];
|
|
||||||
NR_SRB_ToAddMod_t *SRB2_config[NB_CNX_UE];
|
|
||||||
NR_DRB_ToAddMod_t *DRB_config[NB_CNX_UE][8];
|
NR_DRB_ToAddMod_t *DRB_config[NB_CNX_UE][8];
|
||||||
rb_id_t *defaultDRB; // remember the ID of the default DRB
|
rb_id_t *defaultDRB; // remember the ID of the default DRB
|
||||||
|
|
||||||
char *uecap_file;
|
char *uecap_file;
|
||||||
rnti_t rnti;
|
rnti_t rnti;
|
||||||
|
|
||||||
NR_SRB_INFO Srb0[NB_SIG_CNX_UE];
|
NR_UE_RRC_SRB_INFO_t Srb[NB_CNX_UE][NR_NUM_SRB];
|
||||||
NR_SRB_INFO_TABLE_ENTRY Srb1[NB_CNX_UE];
|
|
||||||
NR_SRB_INFO_TABLE_ENTRY Srb2[NB_CNX_UE];
|
|
||||||
|
|
||||||
OAI_NR_UECapability_t *UECap;
|
OAI_NR_UECapability_t *UECap;
|
||||||
uint8_t *UECapability;
|
uint8_t *UECapability;
|
||||||
@@ -213,7 +219,7 @@ typedef struct NR_UE_RRC_INST_s {
|
|||||||
|
|
||||||
plmn_t plmnID;
|
plmn_t plmnID;
|
||||||
|
|
||||||
NR_UE_RRC_SI_INFO SInfo[NB_SIG_CNX_UE];
|
NR_UE_RRC_SI_INFO SInfo[NB_CNX_UE];
|
||||||
|
|
||||||
NR_MIB_t *mib;
|
NR_MIB_t *mib;
|
||||||
|
|
||||||
@@ -227,6 +233,7 @@ typedef struct NR_UE_RRC_INST_s {
|
|||||||
//RRC_LIST_TYPE(NR_SecurityAlgorithmConfig_t, NR_SecurityAlgorithmConfig) SecurityAlgorithmConfig_list;
|
//RRC_LIST_TYPE(NR_SecurityAlgorithmConfig_t, NR_SecurityAlgorithmConfig) SecurityAlgorithmConfig_list;
|
||||||
NR_CipheringAlgorithm_t cipheringAlgorithm;
|
NR_CipheringAlgorithm_t cipheringAlgorithm;
|
||||||
e_NR_IntegrityProtAlgorithm integrityProtAlgorithm;
|
e_NR_IntegrityProtAlgorithm integrityProtAlgorithm;
|
||||||
|
long keyToUse;
|
||||||
bool as_security_activated;
|
bool as_security_activated;
|
||||||
|
|
||||||
long selected_plmn_identity;
|
long selected_plmn_identity;
|
||||||
|
|||||||
Reference in New Issue
Block a user