Merge remote-tracking branch 'origin/remove-redundant-stored-drb-list' into integration_2023_w27
This commit is contained in:
@@ -111,9 +111,10 @@ f1ap_cudu_inst_t *getCxt(F1_t isCU, instance_t instanceP)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void fill_DRB_configList(const protocol_ctxt_t *const ctxt_pP, rrc_gNB_ue_context_t *ue_context_pP, uint8_t xid)
|
NR_DRB_ToAddModList_t *fill_DRB_configList(gNB_RRC_UE_t *ue)
|
||||||
{
|
{
|
||||||
abort();
|
abort();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
|
|||||||
@@ -114,7 +114,8 @@ static int drb_config_N3gtpu_create(e1ap_bearer_setup_req_t * const req,
|
|||||||
// Create N3 tunnel
|
// Create N3 tunnel
|
||||||
int ret = gtpv1u_create_ngu_tunnel(instance, &create_tunnel_req, create_tunnel_resp, nr_pdcp_data_req_drb, sdap_data_req);
|
int ret = gtpv1u_create_ngu_tunnel(instance, &create_tunnel_req, create_tunnel_resp, nr_pdcp_data_req_drb, sdap_data_req);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
LOG_E(NR_RRC,"rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ : gtpv1u_create_ngu_tunnel failed,start to release UE id %ld\n",
|
LOG_E(NR_RRC,
|
||||||
|
"drb_config_N3gtpu_create=>gtpv1u_create_ngu_tunnel failed, cannot set up GTP tunnel for data transmissions of UE %ld\n",
|
||||||
create_tunnel_req.ue_id);
|
create_tunnel_req.ue_id);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,7 +125,8 @@ static int drb_config_gtpu_create(const protocol_ctxt_t *const ctxt_p,
|
|||||||
sdap_data_req);
|
sdap_data_req);
|
||||||
|
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
LOG_E(NR_RRC,"rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ : gtpv1u_create_ngu_tunnel failed,start to release UE rnti %ld\n",
|
LOG_E(NR_RRC,
|
||||||
|
"drb_config_gtpu_create=>gtpv1u_create_ngu_tunnel failed, cannot set up GTP tunnel for data transmissions of UE %ld\n",
|
||||||
create_tunnel_req.ue_id);
|
create_tunnel_req.ue_id);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -160,14 +161,13 @@ static int drb_config_gtpu_create(const protocol_ctxt_t *const ctxt_p,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cucp_cuup_bearer_context_setup_direct(e1ap_bearer_setup_req_t *const req, instance_t instance, uint8_t xid)
|
static void cucp_cuup_bearer_context_setup_direct(e1ap_bearer_setup_req_t *const req, instance_t instance)
|
||||||
{
|
{
|
||||||
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context_by_rnti(RC.nrrrc[instance], req->rnti);
|
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context_by_rnti(RC.nrrrc[instance], req->rnti);
|
||||||
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
||||||
protocol_ctxt_t ctxt = {0};
|
protocol_ctxt_t ctxt = {0};
|
||||||
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, 0, GNB_FLAG_YES, UE->rnti, 0, 0, 0);
|
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, 0, GNB_FLAG_YES, UE->rnti, 0, 0, 0);
|
||||||
|
|
||||||
fill_DRB_configList(&ctxt, ue_context_p, xid);
|
|
||||||
e1ap_bearer_setup_resp_t resp = {0};
|
e1ap_bearer_setup_resp_t resp = {0};
|
||||||
resp.numPDUSessions = req->numPDUSessions;
|
resp.numPDUSessions = req->numPDUSessions;
|
||||||
for (int i = 0; i < resp.numPDUSessions; ++i) {
|
for (int i = 0; i < resp.numPDUSessions; ++i) {
|
||||||
@@ -184,8 +184,11 @@ static void cucp_cuup_bearer_context_setup_direct(e1ap_bearer_setup_req_t *const
|
|||||||
|
|
||||||
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
|
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
|
||||||
// GTP tunnel for UL
|
// GTP tunnel for UL
|
||||||
int ret = drb_config_gtpu_create(&ctxt, ue_context_p, req, UE->DRB_configList, rrc->e1_inst);
|
NR_DRB_ToAddModList_t *DRB_configList = fill_DRB_configList(UE);
|
||||||
|
int ret = drb_config_gtpu_create(&ctxt, ue_context_p, req, DRB_configList, rrc->e1_inst);
|
||||||
if (ret < 0) AssertFatal(false, "Unable to configure DRB or to create GTP Tunnel\n");
|
if (ret < 0) AssertFatal(false, "Unable to configure DRB or to create GTP Tunnel\n");
|
||||||
|
// the code is very badly organized, it is not possible here to call freeDRBlist()
|
||||||
|
ASN_STRUCT_FREE(asn_DEF_NR_DRB_ToAddModList,DRB_configList );
|
||||||
|
|
||||||
// Used to store teids: if monolithic, will simply be NULL
|
// Used to store teids: if monolithic, will simply be NULL
|
||||||
if(!NODE_IS_CU(RC.nrrrc[ctxt.module_id]->node_type)) {
|
if(!NODE_IS_CU(RC.nrrrc[ctxt.module_id]->node_type)) {
|
||||||
@@ -203,7 +206,8 @@ static void cucp_cuup_bearer_context_setup_direct(e1ap_bearer_setup_req_t *const
|
|||||||
prepare_and_send_ue_context_modification_f1(ue_context_p, &resp);
|
prepare_and_send_ue_context_modification_f1(ue_context_p, &resp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cucp_cuup_bearer_context_mod_direct(e1ap_bearer_setup_req_t *const req, instance_t instance, uint8_t xid) {
|
static void cucp_cuup_bearer_context_mod_direct(e1ap_bearer_setup_req_t *const req, instance_t instance)
|
||||||
|
{
|
||||||
// only update GTP tunnels if it is really a CU
|
// only update GTP tunnels if it is really a CU
|
||||||
if (!NODE_IS_CU(RC.nrrrc[0]->node_type))
|
if (!NODE_IS_CU(RC.nrrrc[0]->node_type))
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -36,13 +36,8 @@
|
|||||||
|
|
||||||
extern RAN_CONTEXT_t RC;
|
extern RAN_CONTEXT_t RC;
|
||||||
|
|
||||||
static void cucp_cuup_bearer_context_setup_e1ap(e1ap_bearer_setup_req_t *const req, instance_t instance, uint8_t xid)
|
static void cucp_cuup_bearer_context_setup_e1ap(e1ap_bearer_setup_req_t *const req, instance_t instance)
|
||||||
{
|
{
|
||||||
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context_by_rnti(RC.nrrrc[instance], req->rnti);
|
|
||||||
protocol_ctxt_t ctxt = {0};
|
|
||||||
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, 0, GNB_FLAG_YES, ue_context_p->ue_context.rnti, 0, 0, 0);
|
|
||||||
|
|
||||||
fill_DRB_configList(&ctxt, ue_context_p, xid);
|
|
||||||
MessageDef *msg_p = itti_alloc_new_message(TASK_CUCP_E1, instance, E1AP_BEARER_CONTEXT_SETUP_REQ);
|
MessageDef *msg_p = itti_alloc_new_message(TASK_CUCP_E1, instance, E1AP_BEARER_CONTEXT_SETUP_REQ);
|
||||||
e1ap_bearer_setup_req_t *bearer_req = &E1AP_BEARER_CONTEXT_SETUP_REQ(msg_p);
|
e1ap_bearer_setup_req_t *bearer_req = &E1AP_BEARER_CONTEXT_SETUP_REQ(msg_p);
|
||||||
memcpy(bearer_req, req, sizeof(e1ap_bearer_setup_req_t));
|
memcpy(bearer_req, req, sizeof(e1ap_bearer_setup_req_t));
|
||||||
@@ -50,7 +45,7 @@ static void cucp_cuup_bearer_context_setup_e1ap(e1ap_bearer_setup_req_t *const r
|
|||||||
itti_send_msg_to_task (TASK_CUCP_E1, instance, msg_p);
|
itti_send_msg_to_task (TASK_CUCP_E1, instance, msg_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cucp_cuup_bearer_context_mod_e1ap(e1ap_bearer_setup_req_t *const req, instance_t instance, uint8_t xid)
|
static void cucp_cuup_bearer_context_mod_e1ap(e1ap_bearer_setup_req_t *const req, instance_t instance)
|
||||||
{
|
{
|
||||||
MessageDef *msg = itti_alloc_new_message(TASK_CUCP_E1, instance, E1AP_BEARER_CONTEXT_MODIFICATION_REQ);
|
MessageDef *msg = itti_alloc_new_message(TASK_CUCP_E1, instance, E1AP_BEARER_CONTEXT_MODIFICATION_REQ);
|
||||||
e1ap_bearer_setup_req_t *req_msg = &E1AP_BEARER_CONTEXT_SETUP_REQ(msg);
|
e1ap_bearer_setup_req_t *req_msg = &E1AP_BEARER_CONTEXT_SETUP_REQ(msg);
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
struct e1ap_bearer_setup_req_s;
|
struct e1ap_bearer_setup_req_s;
|
||||||
struct e1ap_bearer_setup_resp_s;
|
struct e1ap_bearer_setup_resp_s;
|
||||||
typedef void (*cucp_cuup_bearer_context_setup_func_t)(struct e1ap_bearer_setup_req_s *const req, instance_t instance, uint8_t xid);
|
typedef void (*cucp_cuup_bearer_context_setup_func_t)(struct e1ap_bearer_setup_req_s *const req, instance_t instance);
|
||||||
|
|
||||||
struct gNB_RRC_INST_s;
|
struct gNB_RRC_INST_s;
|
||||||
void cucp_cuup_message_transfer_direct_init(struct gNB_RRC_INST_s *rrc);
|
void cucp_cuup_message_transfer_direct_init(struct gNB_RRC_INST_s *rrc);
|
||||||
|
|||||||
@@ -237,9 +237,6 @@ typedef enum {
|
|||||||
|
|
||||||
typedef struct gNB_RRC_UE_s {
|
typedef struct gNB_RRC_UE_s {
|
||||||
uint8_t primaryCC_id;
|
uint8_t primaryCC_id;
|
||||||
NR_DRB_ToAddModList_t *DRB_configList;
|
|
||||||
NR_DRB_ToAddModList_t *DRB_configList2[NR_RRC_TRANSACTION_IDENTIFIER_NUMBER];
|
|
||||||
NR_DRB_ToReleaseList_t *DRB_Release_configList2[NR_RRC_TRANSACTION_IDENTIFIER_NUMBER];
|
|
||||||
drb_t established_drbs[NGAP_MAX_DRBS_PER_UE];
|
drb_t established_drbs[NGAP_MAX_DRBS_PER_UE];
|
||||||
uint8_t DRB_active[NGAP_MAX_DRBS_PER_UE];
|
uint8_t DRB_active[NGAP_MAX_DRBS_PER_UE];
|
||||||
|
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ void ue_cxt_mod_send_e1ap(MessageDef *msg,
|
|||||||
void ue_cxt_mod_direct(MessageDef *msg,
|
void ue_cxt_mod_direct(MessageDef *msg,
|
||||||
instance_t instance);
|
instance_t instance);
|
||||||
|
|
||||||
void fill_DRB_configList(const protocol_ctxt_t *const ctxt_pP, rrc_gNB_ue_context_t *ue_context_pP, uint8_t xid);
|
NR_DRB_ToAddModList_t *fill_DRB_configList(gNB_RRC_UE_t *ue);
|
||||||
|
|
||||||
void prepare_and_send_ue_context_modification_f1(rrc_gNB_ue_context_t *ue_context_p,
|
void prepare_and_send_ue_context_modification_f1(rrc_gNB_ue_context_t *ue_context_p,
|
||||||
e1ap_bearer_setup_resp_t *e1ap_resp);
|
e1ap_bearer_setup_resp_t *e1ap_resp);
|
||||||
|
|||||||
+147
-180
@@ -114,6 +114,78 @@ mui_t rrc_gNB_mui = 0;
|
|||||||
///---------------------------------------------------------------------------------------------------------------///
|
///---------------------------------------------------------------------------------------------------------------///
|
||||||
///---------------------------------------------------------------------------------------------------------------///
|
///---------------------------------------------------------------------------------------------------------------///
|
||||||
|
|
||||||
|
NR_DRB_ToAddModList_t *fill_DRB_configList(gNB_RRC_UE_t *ue)
|
||||||
|
{
|
||||||
|
gNB_RRC_INST *rrc = RC.nrrrc[0];
|
||||||
|
if (ue->nb_of_pdusessions == 0)
|
||||||
|
return NULL;
|
||||||
|
int nb_drb_to_setup = rrc->configuration.drbs;
|
||||||
|
long drb_priority[NGAP_MAX_DRBS_PER_UE] = {0};
|
||||||
|
uint8_t drb_id_to_setup_start = 0;
|
||||||
|
NR_DRB_ToAddModList_t *DRB_configList = CALLOC(sizeof(*DRB_configList), 1);
|
||||||
|
for (int i = 0; i < ue->nb_of_pdusessions; i++) {
|
||||||
|
if (ue->pduSession[i].status >= PDU_SESSION_STATUS_DONE) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
LOG_I(NR_RRC, "adding rnti %x pdusession %d, nb drb %d\n", ue->rnti, ue->pduSession[i].param.pdusession_id, nb_drb_to_setup);
|
||||||
|
for (long drb_id_add = 1; drb_id_add <= nb_drb_to_setup; drb_id_add++) {
|
||||||
|
uint8_t drb_id;
|
||||||
|
// Reference TS23501 Table 5.7.4-1: Standardized 5QI to QoS characteristics mapping
|
||||||
|
for (int qos_flow_index = 0; qos_flow_index < ue->pduSession[i].param.nb_qos; qos_flow_index++) {
|
||||||
|
switch (ue->pduSession[i].param.qos[qos_flow_index].fiveQI) {
|
||||||
|
case 1 ... 4: /* GBR */
|
||||||
|
drb_id = next_available_drb(ue, &ue->pduSession[i], GBR_FLOW);
|
||||||
|
break;
|
||||||
|
case 5 ... 9: /* Non-GBR */
|
||||||
|
if (rrc->configuration.drbs > 1) { /* Force the creation from gNB Conf file */
|
||||||
|
LOG_W(NR_RRC, "Adding %d DRBs, from gNB config file (not decided by 5GC\n", rrc->configuration.drbs);
|
||||||
|
drb_id = next_available_drb(ue, &ue->pduSession[i], GBR_FLOW);
|
||||||
|
} else {
|
||||||
|
drb_id = next_available_drb(ue, &ue->pduSession[i], NONGBR_FLOW);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
LOG_E(NR_RRC, "not supported 5qi %lu\n", ue->pduSession[i].param.qos[qos_flow_index].fiveQI);
|
||||||
|
ue->pduSession[i].status = PDU_SESSION_STATUS_FAILED;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
drb_priority[drb_id - 1] = ue->pduSession[i].param.qos[qos_flow_index].allocation_retention_priority.priority_level;
|
||||||
|
if (drb_priority[drb_id - 1] < 0 || drb_priority[drb_id - 1] > NGAP_PRIORITY_LEVEL_NO_PRIORITY) {
|
||||||
|
LOG_E(NR_RRC, "invalid allocation_retention_priority.priority_level %ld set to _NO_PRIORITY\n", drb_priority[drb_id - 1]);
|
||||||
|
drb_priority[drb_id - 1] = NGAP_PRIORITY_LEVEL_NO_PRIORITY;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (drb_is_active(ue, drb_id)) { /* Non-GBR flow using the same DRB or a GBR flow with no available DRBs*/
|
||||||
|
nb_drb_to_setup--;
|
||||||
|
} else {
|
||||||
|
generateDRB(ue,
|
||||||
|
drb_id,
|
||||||
|
&ue->pduSession[i],
|
||||||
|
rrc->configuration.enable_sdap,
|
||||||
|
rrc->security.do_drb_integrity,
|
||||||
|
rrc->security.do_drb_ciphering);
|
||||||
|
NR_DRB_ToAddMod_t *DRB_config = generateDRB_ASN1(&ue->established_drbs[drb_id - 1]);
|
||||||
|
if (drb_id_to_setup_start == 0)
|
||||||
|
drb_id_to_setup_start = DRB_config->drb_Identity;
|
||||||
|
asn1cSeqAdd(&DRB_configList->list, DRB_config);
|
||||||
|
}
|
||||||
|
LOG_D(RRC, "DRB Priority %ld\n", drb_priority[drb_id]); // To supress warning for now
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (DRB_configList->list.count == 0) {
|
||||||
|
free(DRB_configList);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return DRB_configList;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void freeDRBlist(NR_DRB_ToAddModList_t *list)
|
||||||
|
{
|
||||||
|
//ASN_STRUCT_FREE(asn_DEF_NR_DRB_ToAddModList, list);
|
||||||
|
return;
|
||||||
|
}
|
||||||
static void nr_rrc_addmod_srbs(int rnti,
|
static void nr_rrc_addmod_srbs(int rnti,
|
||||||
const NR_SRB_INFO_TABLE_ENTRY *srb_list,
|
const NR_SRB_INFO_TABLE_ENTRY *srb_list,
|
||||||
const int nb_srb,
|
const int nb_srb,
|
||||||
@@ -322,6 +394,24 @@ static NR_SRB_ToAddModList_t *createSRBlist(gNB_RRC_UE_t *ue, bool reestablish)
|
|||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static NR_DRB_ToAddModList_t *createDRBlist(gNB_RRC_UE_t *ue, bool reestablish)
|
||||||
|
{
|
||||||
|
NR_DRB_ToAddMod_t *DRB_config = NULL;
|
||||||
|
NR_DRB_ToAddModList_t *DRB_configList = CALLOC(sizeof(*DRB_configList), 1);
|
||||||
|
|
||||||
|
for (int i = 0; i < NGAP_MAX_DRBS_PER_UE; i++) {
|
||||||
|
if (ue->established_drbs[i].status != DRB_INACTIVE) {
|
||||||
|
DRB_config = generateDRB_ASN1(&ue->established_drbs[i]);
|
||||||
|
if (reestablish) {
|
||||||
|
ue->established_drbs[i].reestablishPDCP = NR_DRB_ToAddMod__reestablishPDCP_true;
|
||||||
|
asn1cCallocOne(DRB_config->reestablishPDCP, NR_DRB_ToAddMod__reestablishPDCP_true);
|
||||||
|
}
|
||||||
|
asn1cSeqAdd(&DRB_configList->list, DRB_config);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return DRB_configList;
|
||||||
|
}
|
||||||
|
|
||||||
static void freeSRBlist(NR_SRB_ToAddModList_t *l)
|
static void freeSRBlist(NR_SRB_ToAddModList_t *l)
|
||||||
{
|
{
|
||||||
if (l) {
|
if (l) {
|
||||||
@@ -338,7 +428,9 @@ static void apply_macrlc_config(gNB_RRC_INST *rrc, rrc_gNB_ue_context_t *const u
|
|||||||
gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
|
gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
|
||||||
nr_rrc_mac_update_cellgroup(ue_p->rnti, cgc);
|
nr_rrc_mac_update_cellgroup(ue_p->rnti, cgc);
|
||||||
nr_rrc_addmod_srbs(ctxt_pP->rntiMaybeUEid, ue_p->Srb, maxSRBs, cgc->rlc_BearerToAddModList);
|
nr_rrc_addmod_srbs(ctxt_pP->rntiMaybeUEid, ue_p->Srb, maxSRBs, cgc->rlc_BearerToAddModList);
|
||||||
nr_rrc_addmod_drbs(ctxt_pP->rntiMaybeUEid, ue_p->DRB_configList, cgc->rlc_BearerToAddModList);
|
NR_DRB_ToAddModList_t *DRBs = fill_DRB_configList(ue_p);
|
||||||
|
nr_rrc_addmod_drbs(ctxt_pP->rntiMaybeUEid, DRBs, cgc->rlc_BearerToAddModList);
|
||||||
|
freeDRBlist(DRBs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void apply_macrlc_config_reest(gNB_RRC_INST *rrc, rrc_gNB_ue_context_t *const ue_context_pP, const protocol_ctxt_t *const ctxt_pP, ue_id_t ue_id)
|
void apply_macrlc_config_reest(gNB_RRC_INST *rrc, rrc_gNB_ue_context_t *const ue_context_pP, const protocol_ctxt_t *const ctxt_pP, ue_id_t ue_id)
|
||||||
@@ -591,83 +683,18 @@ static void rrc_gNB_generate_defaultRRCReconfiguration(const protocol_ctxt_t *co
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void fill_DRB_configList(const protocol_ctxt_t *const ctxt_pP, rrc_gNB_ue_context_t *ue_context_pP, uint8_t xid)
|
|
||||||
{
|
|
||||||
gNB_RRC_INST *rrc = RC.nrrrc[ctxt_pP->module_id];
|
|
||||||
gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
|
|
||||||
int qos_flow_index = 0;
|
|
||||||
int i;
|
|
||||||
uint8_t drb_id_to_setup_start = 0;
|
|
||||||
uint8_t nb_drb_to_setup = rrc->configuration.drbs;
|
|
||||||
long drb_priority[NGAP_MAX_DRBS_PER_UE];
|
|
||||||
|
|
||||||
if (!ue_p->DRB_configList)
|
|
||||||
ue_p->DRB_configList = CALLOC(1, sizeof(*ue_p->DRB_configList));
|
|
||||||
if (!ue_p->DRB_configList2[xid])
|
|
||||||
ue_p->DRB_configList2[xid] = CALLOC(1, sizeof(**ue_p->DRB_configList2));
|
|
||||||
|
|
||||||
for (i = 0; i < ue_p->nb_of_pdusessions; i++) {
|
|
||||||
if (ue_p->pduSession[i].status >= PDU_SESSION_STATUS_DONE) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
LOG_I(NR_RRC, "adding rnti %x pdusession %d, nb drb %d, xid %d\n", ue_p->rnti, ue_p->pduSession[i].param.pdusession_id, nb_drb_to_setup, xid);
|
|
||||||
for(long drb_id_add = 1; drb_id_add <= nb_drb_to_setup; drb_id_add++){
|
|
||||||
uint8_t drb_id;
|
|
||||||
// Reference TS23501 Table 5.7.4-1: Standardized 5QI to QoS characteristics mapping
|
|
||||||
for (qos_flow_index = 0; qos_flow_index < ue_p->pduSession[i].param.nb_qos; qos_flow_index++) {
|
|
||||||
switch (ue_p->pduSession[i].param.qos[qos_flow_index].fiveQI) {
|
|
||||||
case 1 ... 4: /* GBR */
|
|
||||||
drb_id = next_available_drb(ue_p, &ue_p->pduSession[i], GBR_FLOW);
|
|
||||||
break;
|
|
||||||
case 5 ... 9: /* Non-GBR */
|
|
||||||
if(rrc->configuration.drbs > 1) /* Force the creation from gNB Conf file - Should be used only in noS1 mode and rfsim for testing purposes. */
|
|
||||||
drb_id = next_available_drb(ue_p, &ue_p->pduSession[i], GBR_FLOW);
|
|
||||||
else
|
|
||||||
drb_id = next_available_drb(ue_p, &ue_p->pduSession[i], NONGBR_FLOW);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
LOG_E(NR_RRC, "not supported 5qi %lu\n", ue_p->pduSession[i].param.qos[qos_flow_index].fiveQI);
|
|
||||||
ue_p->pduSession[i].status = PDU_SESSION_STATUS_FAILED;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
drb_priority[drb_id - 1] = ue_p->pduSession[i].param.qos[qos_flow_index].allocation_retention_priority.priority_level;
|
|
||||||
if (drb_priority[drb_id - 1] < 0 || drb_priority[drb_id - 1] > NGAP_PRIORITY_LEVEL_NO_PRIORITY) {
|
|
||||||
LOG_E(NR_RRC, "invalid allocation_retention_priority.priority_level %ld set to _NO_PRIORITY\n", drb_priority[drb_id - 1]);
|
|
||||||
drb_priority[drb_id - 1] = NGAP_PRIORITY_LEVEL_NO_PRIORITY;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(drb_is_active(ue_p, drb_id)){ /* Non-GBR flow using the same DRB or a GBR flow with no available DRBs*/
|
|
||||||
nb_drb_to_setup--;
|
|
||||||
} else {
|
|
||||||
generateDRB(ue_p, drb_id, &ue_p->pduSession[i], rrc->configuration.enable_sdap, rrc->security.do_drb_integrity, rrc->security.do_drb_ciphering);
|
|
||||||
NR_DRB_ToAddMod_t *DRB_config = generateDRB_ASN1(&ue_p->established_drbs[drb_id-1]);
|
|
||||||
if (drb_id_to_setup_start == 0)
|
|
||||||
drb_id_to_setup_start = DRB_config->drb_Identity;
|
|
||||||
asn1cSeqAdd(&ue_p->DRB_configList->list, DRB_config);
|
|
||||||
asn1cSeqAdd(&ue_p->DRB_configList2[xid]->list, DRB_config);
|
|
||||||
}
|
|
||||||
LOG_D(RRC, "DRB Priority %ld\n", drb_priority[drb_id]); // To supress warning for now
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ue_p->pduSession[i].status = PDU_SESSION_STATUS_DONE;
|
|
||||||
ue_p->pduSession[i].xid = xid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void rrc_gNB_generate_dedicatedRRCReconfiguration(const protocol_ctxt_t *const ctxt_pP, rrc_gNB_ue_context_t *ue_context_pP)
|
void rrc_gNB_generate_dedicatedRRCReconfiguration(const protocol_ctxt_t *const ctxt_pP, rrc_gNB_ue_context_t *ue_context_pP)
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
{
|
{
|
||||||
gNB_RRC_INST *rrc = RC.nrrrc[ctxt_pP->module_id];
|
gNB_RRC_INST *rrc = RC.nrrrc[ctxt_pP->module_id];
|
||||||
int xid = -1;
|
|
||||||
|
|
||||||
|
uint8_t xid = rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id);
|
||||||
int drb_id_to_setup_start = 1;
|
int drb_id_to_setup_start = 1;
|
||||||
gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
|
gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
|
||||||
NR_DRB_ToAddModList_t *DRB_configList = ue_p->DRB_configList;
|
NR_DRB_ToAddModList_t *DRB_configList = fill_DRB_configList(ue_p);
|
||||||
int nb_drb_to_setup = DRB_configList->list.count;
|
int nb_drb_to_setup = DRB_configList ? DRB_configList->list.count : 0;
|
||||||
|
ue_p->xids[xid] = RRC_PDUSESSION_ESTABLISH;
|
||||||
struct NR_RRCReconfiguration_v1530_IEs__dedicatedNAS_MessageList *dedicatedNAS_MessageList = NULL;
|
struct NR_RRCReconfiguration_v1530_IEs__dedicatedNAS_MessageList *dedicatedNAS_MessageList = NULL;
|
||||||
NR_DedicatedNAS_Message_t *dedicatedNAS_Message = NULL;
|
NR_DedicatedNAS_Message_t *dedicatedNAS_Message = NULL;
|
||||||
dedicatedNAS_MessageList = CALLOC(1, sizeof(struct NR_RRCReconfiguration_v1530_IEs__dedicatedNAS_MessageList));
|
dedicatedNAS_MessageList = CALLOC(1, sizeof(struct NR_RRCReconfiguration_v1530_IEs__dedicatedNAS_MessageList));
|
||||||
@@ -681,7 +708,10 @@ void rrc_gNB_generate_dedicatedRRCReconfiguration(const protocol_ctxt_t *const c
|
|||||||
if (ue_p->pduSession[j].param.nas_pdu.buffer != NULL) {
|
if (ue_p->pduSession[j].param.nas_pdu.buffer != NULL) {
|
||||||
dedicatedNAS_Message = CALLOC(1, sizeof(NR_DedicatedNAS_Message_t));
|
dedicatedNAS_Message = CALLOC(1, sizeof(NR_DedicatedNAS_Message_t));
|
||||||
memset(dedicatedNAS_Message, 0, sizeof(OCTET_STRING_t));
|
memset(dedicatedNAS_Message, 0, sizeof(OCTET_STRING_t));
|
||||||
OCTET_STRING_fromBuf(dedicatedNAS_Message, (char *)ue_p->pduSession[j].param.nas_pdu.buffer, ue_p->pduSession[j].param.nas_pdu.length);
|
OCTET_STRING_fromBuf(dedicatedNAS_Message,
|
||||||
|
(char *)ue_p->pduSession[j].param.nas_pdu.buffer,
|
||||||
|
ue_p->pduSession[j].param.nas_pdu.length);
|
||||||
|
ue_p->pduSession[j].status = PDU_SESSION_STATUS_DONE;
|
||||||
asn1cSeqAdd(&dedicatedNAS_MessageList->list, dedicatedNAS_Message);
|
asn1cSeqAdd(&dedicatedNAS_MessageList->list, dedicatedNAS_Message);
|
||||||
|
|
||||||
LOG_I(NR_RRC, "add NAS info with size %d (pdusession idx %d)\n", ue_p->pduSession[j].param.nas_pdu.length, j);
|
LOG_I(NR_RRC, "add NAS info with size %d (pdusession idx %d)\n", ue_p->pduSession[j].param.nas_pdu.length, j);
|
||||||
@@ -690,8 +720,9 @@ void rrc_gNB_generate_dedicatedRRCReconfiguration(const protocol_ctxt_t *const c
|
|||||||
LOG_E(NR_RRC, "no NAS info (pdusession idx %d)\n", j);
|
LOG_E(NR_RRC, "no NAS info (pdusession idx %d)\n", j);
|
||||||
}
|
}
|
||||||
|
|
||||||
xid = ue_p->pduSession[j].xid;
|
ue_p->pduSession[j].xid = xid;
|
||||||
}
|
}
|
||||||
|
freeDRBlist(DRB_configList);
|
||||||
|
|
||||||
/* If list is empty free the list and reset the address */
|
/* If list is empty free the list and reset the address */
|
||||||
if (dedicatedNAS_MessageList->list.count == 0) {
|
if (dedicatedNAS_MessageList->list.count == 0) {
|
||||||
@@ -699,17 +730,27 @@ void rrc_gNB_generate_dedicatedRRCReconfiguration(const protocol_ctxt_t *const c
|
|||||||
dedicatedNAS_MessageList = NULL;
|
dedicatedNAS_MessageList = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Free all NAS PDUs */
|
||||||
|
for (int i = 0; i < ue_p->nb_of_pdusessions; i++) {
|
||||||
|
if (ue_p->pduSession[i].param.nas_pdu.buffer != NULL) {
|
||||||
|
/* Free the NAS PDU buffer and invalidate it */
|
||||||
|
free(ue_p->pduSession[i].param.nas_pdu.buffer);
|
||||||
|
ue_p->pduSession[i].param.nas_pdu.buffer = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
NR_CellGroupConfig_t *cellGroupConfig = ue_p->masterCellGroup;
|
NR_CellGroupConfig_t *cellGroupConfig = ue_p->masterCellGroup;
|
||||||
|
|
||||||
AssertFatal(xid > -1, "Invalid xid %d. No PDU sessions setup to configure.\n", xid);
|
|
||||||
uint8_t buffer[RRC_BUF_SIZE] = {0};
|
uint8_t buffer[RRC_BUF_SIZE] = {0};
|
||||||
NR_SRB_ToAddModList_t *SRBs = createSRBlist(ue_p, false);
|
NR_SRB_ToAddModList_t *SRBs = createSRBlist(ue_p, false);
|
||||||
|
NR_DRB_ToAddModList_t *DRBs = createDRBlist(ue_p, false);
|
||||||
|
|
||||||
int size = do_RRCReconfiguration(ctxt_pP,
|
int size = do_RRCReconfiguration(ctxt_pP,
|
||||||
buffer,
|
buffer,
|
||||||
RRC_BUF_SIZE,
|
RRC_BUF_SIZE,
|
||||||
xid,
|
xid,
|
||||||
SRBs,
|
SRBs,
|
||||||
DRB_configList,
|
DRBs,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
@@ -722,15 +763,7 @@ void rrc_gNB_generate_dedicatedRRCReconfiguration(const protocol_ctxt_t *const c
|
|||||||
cellGroupConfig);
|
cellGroupConfig);
|
||||||
LOG_DUMPMSG(NR_RRC,DEBUG_RRC,(char *)buffer,size,"[MSG] RRC Reconfiguration\n");
|
LOG_DUMPMSG(NR_RRC,DEBUG_RRC,(char *)buffer,size,"[MSG] RRC Reconfiguration\n");
|
||||||
freeSRBlist(SRBs);
|
freeSRBlist(SRBs);
|
||||||
/* Free all NAS PDUs */
|
freeDRBlist(DRBs);
|
||||||
for (int i = 0; i < ue_p->nb_of_pdusessions; i++) {
|
|
||||||
if (ue_p->pduSession[i].param.nas_pdu.buffer != NULL) {
|
|
||||||
/* Free the NAS PDU buffer and invalidate it */
|
|
||||||
free(ue_p->pduSession[i].param.nas_pdu.buffer);
|
|
||||||
ue_p->pduSession[i].param.nas_pdu.buffer = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG_I(NR_RRC, "[gNB %d] Frame %d, Logical Channel DL-DCCH, Generate RRCReconfiguration (bytes %d, UE RNTI %x)\n", ctxt_pP->module_id, ctxt_pP->frame, size, ue_p->rnti);
|
LOG_I(NR_RRC, "[gNB %d] Frame %d, Logical Channel DL-DCCH, Generate RRCReconfiguration (bytes %d, UE RNTI %x)\n", ctxt_pP->module_id, ctxt_pP->frame, size, ue_p->rnti);
|
||||||
LOG_D(NR_RRC,
|
LOG_D(NR_RRC,
|
||||||
"[FRAME %05d][RRC_gNB][MOD %u][][--- PDCP_DATA_REQ/%d Bytes (rrcReconfiguration to UE %x MUI %d) --->][PDCP][MOD %u][RB %u]\n",
|
"[FRAME %05d][RRC_gNB][MOD %u][][--- PDCP_DATA_REQ/%d Bytes (rrcReconfiguration to UE %x MUI %d) --->][PDCP][MOD %u][RB %u]\n",
|
||||||
@@ -763,19 +796,15 @@ rrc_gNB_modify_dedicatedRRCReconfiguration(
|
|||||||
rrc_gNB_ue_context_t *ue_context_pP)
|
rrc_gNB_ue_context_t *ue_context_pP)
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
{
|
{
|
||||||
NR_DRB_ToAddMod_t *DRB_config = NULL;
|
gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
|
||||||
NR_DRB_ToAddModList_t *DRB_configList2 = NULL;
|
NR_DRB_ToAddModList_t *DRB_configList = fill_DRB_configList(ue_p);
|
||||||
struct NR_RRCReconfiguration_v1530_IEs__dedicatedNAS_MessageList
|
|
||||||
*dedicatedNAS_MessageList = NULL;
|
|
||||||
int qos_flow_index = 0;
|
int qos_flow_index = 0;
|
||||||
uint8_t xid = rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id);
|
uint8_t xid = rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id);
|
||||||
gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
|
ue_p->xids[xid] = RRC_PDUSESSION_MODIFY;
|
||||||
ue_p->xids[xid] = RRC_DEDICATED_RECONF;
|
|
||||||
|
|
||||||
DRB_configList2 = CALLOC(1, sizeof(NR_DRB_ToAddModList_t));
|
struct NR_RRCReconfiguration_v1530_IEs__dedicatedNAS_MessageList *dedicatedNAS_MessageList =
|
||||||
memset(DRB_configList2, 0, sizeof(NR_DRB_ToAddModList_t));
|
CALLOC(1, sizeof(*dedicatedNAS_MessageList));
|
||||||
|
NR_DRB_ToAddMod_t *DRB_config = NULL;
|
||||||
dedicatedNAS_MessageList = CALLOC(1, sizeof(struct NR_RRCReconfiguration_v1530_IEs__dedicatedNAS_MessageList));
|
|
||||||
|
|
||||||
for (int i = 0; i < ue_p->nb_of_pdusessions; i++) {
|
for (int i = 0; i < ue_p->nb_of_pdusessions; i++) {
|
||||||
// bypass the new and already configured pdu sessions
|
// bypass the new and already configured pdu sessions
|
||||||
@@ -830,7 +859,6 @@ rrc_gNB_modify_dedicatedRRCReconfiguration(
|
|||||||
ue_p->pduSession[i].cause_value = NGAP_CauseRadioNetwork_not_supported_5QI_value;
|
ue_p->pduSession[i].cause_value = NGAP_CauseRadioNetwork_not_supported_5QI_value;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_I(NR_RRC,
|
LOG_I(NR_RRC,
|
||||||
"PDU SESSION ID %ld, DRB ID %ld (index %d), QOS flow %d, 5QI %ld \n",
|
"PDU SESSION ID %ld, DRB ID %ld (index %d), QOS flow %d, 5QI %ld \n",
|
||||||
DRB_config->cnAssociation->choice.sdap_Config->pdu_Session,
|
DRB_config->cnAssociation->choice.sdap_Config->pdu_Session,
|
||||||
@@ -840,7 +868,7 @@ rrc_gNB_modify_dedicatedRRCReconfiguration(
|
|||||||
ue_p->pduSession[i].param.qos[qos_flow_index].fiveQI);
|
ue_p->pduSession[i].param.qos[qos_flow_index].fiveQI);
|
||||||
}
|
}
|
||||||
|
|
||||||
asn1cSeqAdd(&DRB_configList2->list, DRB_config);
|
asn1cSeqAdd(&DRB_configList->list, DRB_config);
|
||||||
|
|
||||||
ue_p->pduSession[i].status = PDU_SESSION_STATUS_DONE;
|
ue_p->pduSession[i].status = PDU_SESSION_STATUS_DONE;
|
||||||
ue_p->pduSession[i].xid = xid;
|
ue_p->pduSession[i].xid = xid;
|
||||||
@@ -866,7 +894,7 @@ rrc_gNB_modify_dedicatedRRCReconfiguration(
|
|||||||
RRC_BUF_SIZE,
|
RRC_BUF_SIZE,
|
||||||
xid,
|
xid,
|
||||||
NULL,
|
NULL,
|
||||||
DRB_configList2,
|
DRB_configList,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
@@ -922,37 +950,23 @@ rrc_gNB_generate_dedicatedRRCReconfiguration_release(
|
|||||||
uint8_t *nas_buffer)
|
uint8_t *nas_buffer)
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
NR_DRB_ToReleaseList_t **DRB_Release_configList2 = NULL;
|
|
||||||
NR_DRB_Identity_t *DRB_release;
|
|
||||||
struct NR_RRCReconfiguration_v1530_IEs__dedicatedNAS_MessageList
|
|
||||||
*dedicatedNAS_MessageList = NULL;
|
|
||||||
NR_DedicatedNAS_Message_t *dedicatedNAS_Message = NULL;
|
|
||||||
gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
|
gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
|
||||||
|
|
||||||
DRB_Release_configList2 = &ue_p->DRB_Release_configList2[xid];
|
NR_DRB_ToReleaseList_t *DRB_Release_configList2 = CALLOC(sizeof(*DRB_Release_configList2), 1);
|
||||||
if (*DRB_Release_configList2) {
|
|
||||||
free(*DRB_Release_configList2);
|
|
||||||
}
|
|
||||||
|
|
||||||
*DRB_Release_configList2 = CALLOC(1, sizeof(**DRB_Release_configList2));
|
for (int i = 0; i < NB_RB_MAX; i++) {
|
||||||
for(i = 0; i < NB_RB_MAX; i++) {
|
|
||||||
if ((ue_p->pduSession[i].status == PDU_SESSION_STATUS_TORELEASE) && ue_p->pduSession[i].xid == xid) {
|
if ((ue_p->pduSession[i].status == PDU_SESSION_STATUS_TORELEASE) && ue_p->pduSession[i].xid == xid) {
|
||||||
DRB_release = CALLOC(1, sizeof(NR_DRB_Identity_t));
|
asn1cSequenceAdd(DRB_Release_configList2->list, NR_DRB_Identity_t, DRB_release);
|
||||||
*DRB_release = i + 1;
|
*DRB_release = i + 1;
|
||||||
asn1cSeqAdd(&(*DRB_Release_configList2)->list, DRB_release);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If list is empty free the list and reset the address */
|
/* If list is empty free the list and reset the address */
|
||||||
|
struct NR_RRCReconfiguration_v1530_IEs__dedicatedNAS_MessageList *dedicatedNAS_MessageList = NULL;
|
||||||
if (nas_length > 0) {
|
if (nas_length > 0) {
|
||||||
dedicatedNAS_MessageList = CALLOC(1, sizeof(struct NR_RRCReconfiguration_v1530_IEs__dedicatedNAS_MessageList));
|
dedicatedNAS_MessageList = CALLOC(1, sizeof(*dedicatedNAS_MessageList));
|
||||||
dedicatedNAS_Message = CALLOC(1, sizeof(NR_DedicatedNAS_Message_t));
|
asn1cSequenceAdd(dedicatedNAS_MessageList->list, NR_DedicatedNAS_Message_t, dedicatedNAS_Message);
|
||||||
memset(dedicatedNAS_Message, 0, sizeof(OCTET_STRING_t));
|
OCTET_STRING_fromBuf(dedicatedNAS_Message, (char *)nas_buffer, nas_length);
|
||||||
OCTET_STRING_fromBuf(dedicatedNAS_Message,
|
|
||||||
(char *)nas_buffer,
|
|
||||||
nas_length);
|
|
||||||
asn1cSeqAdd(&dedicatedNAS_MessageList->list, dedicatedNAS_Message);
|
|
||||||
LOG_I(NR_RRC,"add NAS info with size %d\n", nas_length);
|
LOG_I(NR_RRC,"add NAS info with size %d\n", nas_length);
|
||||||
} else {
|
} else {
|
||||||
LOG_W(NR_RRC,"dedlicated NAS list is empty\n");
|
LOG_W(NR_RRC,"dedlicated NAS list is empty\n");
|
||||||
@@ -965,7 +979,7 @@ rrc_gNB_generate_dedicatedRRCReconfiguration_release(
|
|||||||
xid,
|
xid,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
*DRB_Release_configList2,
|
DRB_Release_configList2,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
@@ -1019,10 +1033,7 @@ static void rrc_gNB_process_RRCReconfigurationComplete(const protocol_ctxt_t *co
|
|||||||
uint8_t kUPenc[16] = {0};
|
uint8_t kUPenc[16] = {0};
|
||||||
uint8_t kUPint[16] = {0};
|
uint8_t kUPint[16] = {0};
|
||||||
gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
|
gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
|
||||||
NR_DRB_ToAddModList_t *DRB_configList = ue_p->DRB_configList2[xid];
|
NR_DRB_ToAddModList_t *DRB_configList = createDRBlist(ue_p, false);
|
||||||
NR_DRB_ToReleaseList_t *DRB_Release_configList2 = ue_p->DRB_Release_configList2[xid];
|
|
||||||
NR_DRB_Identity_t *drb_id_p = NULL;
|
|
||||||
// uint8_t nr_DRB2LCHAN[8];
|
|
||||||
|
|
||||||
/* Derive the keys from kgnb */
|
/* Derive the keys from kgnb */
|
||||||
if (DRB_configList != NULL) {
|
if (DRB_configList != NULL) {
|
||||||
@@ -1036,20 +1047,22 @@ static void rrc_gNB_process_RRCReconfigurationComplete(const protocol_ctxt_t *co
|
|||||||
/* Refresh SRBs/DRBs */
|
/* Refresh SRBs/DRBs */
|
||||||
LOG_D(NR_RRC, "Configuring PDCP DRBs/SRBs for UE %04x\n", ue_p->rnti);
|
LOG_D(NR_RRC, "Configuring PDCP DRBs/SRBs for UE %04x\n", ue_p->rnti);
|
||||||
ue_id_t reestablish_ue_id = 0;
|
ue_id_t reestablish_ue_id = 0;
|
||||||
if (DRB_configList && DRB_configList->list.array[0]->reestablishPDCP && *DRB_configList->list.array[0]->reestablishPDCP == NR_DRB_ToAddMod__reestablishPDCP_true) {
|
|
||||||
for (int i = 0; i < MAX_MOBILES_PER_GNB; i++) {
|
for (int i = 0; i < MAX_MOBILES_PER_GNB; i++) {
|
||||||
nr_reestablish_rnti_map_t *nr_reestablish_rnti_map = &(RC.nrrrc[ctxt_pP->module_id])->nr_reestablish_rnti_map[i];
|
nr_reestablish_rnti_map_t *nr_reestablish_rnti_map = &(RC.nrrrc[ctxt_pP->module_id])->nr_reestablish_rnti_map[i];
|
||||||
if (nr_reestablish_rnti_map->ue_id == ctxt_pP->rntiMaybeUEid) {
|
if (nr_reestablish_rnti_map->ue_id == ctxt_pP->rntiMaybeUEid) {
|
||||||
ue_context_pP->ue_context.ue_reconfiguration_after_reestablishment_counter++;
|
ue_context_pP->ue_context.ue_reconfiguration_after_reestablishment_counter++;
|
||||||
reestablish_ue_id = nr_reestablish_rnti_map[i].c_rnti;
|
reestablish_ue_id = nr_reestablish_rnti_map[i].c_rnti;
|
||||||
LOG_D(NR_RRC, "Removing reestablish_rnti_map[%d] UEid %lx, RNTI %04x\n", i, nr_reestablish_rnti_map->ue_id, nr_reestablish_rnti_map->c_rnti);
|
LOG_D(NR_RRC,
|
||||||
|
"Removing reestablish_rnti_map[%d] UEid %lx, RNTI %04x\n",
|
||||||
|
i,
|
||||||
|
nr_reestablish_rnti_map->ue_id,
|
||||||
|
nr_reestablish_rnti_map->c_rnti);
|
||||||
// clear current C-RNTI from map
|
// clear current C-RNTI from map
|
||||||
nr_reestablish_rnti_map->ue_id = 0;
|
nr_reestablish_rnti_map->ue_id = 0;
|
||||||
nr_reestablish_rnti_map->c_rnti = 0;
|
nr_reestablish_rnti_map->c_rnti = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
NR_SRB_ToAddModList_t *SRBs = createSRBlist(ue_p, false);
|
NR_SRB_ToAddModList_t *SRBs = createSRBlist(ue_p, false);
|
||||||
|
|
||||||
nr_pdcp_add_srbs(ctxt_pP->enb_flag,
|
nr_pdcp_add_srbs(ctxt_pP->enb_flag,
|
||||||
@@ -1127,25 +1140,8 @@ static void rrc_gNB_process_RRCReconfigurationComplete(const protocol_ctxt_t *co
|
|||||||
} // end if (DRB_configList->list.array[i])
|
} // end if (DRB_configList->list.array[i])
|
||||||
} // end for (int i = 0; i < DRB_configList->list.count; i++)
|
} // end for (int i = 0; i < DRB_configList->list.count; i++)
|
||||||
|
|
||||||
free(DRB_configList);
|
|
||||||
ue_p->DRB_configList2[xid] = NULL;
|
|
||||||
} // end if DRB_configList != NULL
|
} // end if DRB_configList != NULL
|
||||||
|
freeDRBlist(DRB_configList);
|
||||||
if(DRB_Release_configList2 != NULL) {
|
|
||||||
for (int i = 0; i < DRB_Release_configList2->list.count; i++) {
|
|
||||||
if (DRB_Release_configList2->list.array[i]) {
|
|
||||||
drb_id_p = DRB_Release_configList2->list.array[i];
|
|
||||||
drb_id = *drb_id_p;
|
|
||||||
|
|
||||||
if (ue_p->DRB_active[drb_id] == 1) {
|
|
||||||
ue_p->DRB_active[drb_id] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
free(DRB_Release_configList2);
|
|
||||||
ue_p->DRB_Release_configList2[xid] = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -1219,35 +1215,6 @@ void rrc_gNB_generate_RRCReestablishment(const protocol_ctxt_t *ctxt_pP,
|
|||||||
nr_pdcp_data_req_srb(ctxt_pP->rntiMaybeUEid, DCCH, rrc_gNB_mui++, size, buffer, deliver_pdu_srb_f1, rrc);
|
nr_pdcp_data_req_srb(ctxt_pP->rntiMaybeUEid, DCCH, rrc_gNB_mui++, size, buffer, deliver_pdu_srb_f1, rrc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @brief Function used in RRCReestablishmentComplete procedure to reestablish the DRBs
|
|
||||||
/// that the UE previously had, it gets the information from the established_drbs
|
|
||||||
/// struct.
|
|
||||||
/// @param new_xid The new RRC transaction id.
|
|
||||||
void RRCReestablishmentComplete_fill_DRB_configList(const protocol_ctxt_t *const ctxt_pP,
|
|
||||||
rrc_gNB_ue_context_t *ue_context_pP,
|
|
||||||
const uint8_t new_xid)
|
|
||||||
{
|
|
||||||
gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
|
|
||||||
NR_DRB_ToAddMod_t *DRB_config = NULL;
|
|
||||||
NR_DRB_ToAddModList_t **DRB_configList2 = &(ue_p->DRB_configList2[new_xid]);
|
|
||||||
|
|
||||||
if (*DRB_configList2) {
|
|
||||||
free(*DRB_configList2);
|
|
||||||
LOG_D(NR_RRC, "RRC Reestablishment - free(ue_p->DRB_configList2[%d])\n", new_xid);
|
|
||||||
}
|
|
||||||
|
|
||||||
*DRB_configList2 = CALLOC(1, sizeof(**DRB_configList2));
|
|
||||||
|
|
||||||
for (int i = 0; i < NGAP_MAX_DRBS_PER_UE; i++) {
|
|
||||||
if (ue_p->established_drbs[i].status != DRB_INACTIVE) {
|
|
||||||
ue_p->established_drbs[i].reestablishPDCP = NR_DRB_ToAddMod__reestablishPDCP_true;
|
|
||||||
DRB_config = generateDRB_ASN1(&ue_p->established_drbs[i]);
|
|
||||||
asn1cCallocOne(DRB_config->reestablishPDCP, NR_DRB_ToAddMod__reestablishPDCP_true);
|
|
||||||
asn1cSeqAdd(&(*DRB_configList2)->list, DRB_config);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @brief Function used in RRCReestablishmentComplete procedure to update the NGU Tunnels.
|
/// @brief Function used in RRCReestablishmentComplete procedure to update the NGU Tunnels.
|
||||||
/// @param reestablish_rnti is the old C-RNTI
|
/// @param reestablish_rnti is the old C-RNTI
|
||||||
void RRCReestablishmentComplete_update_ngu_tunnel(const protocol_ctxt_t *const ctxt_pP,
|
void RRCReestablishmentComplete_update_ngu_tunnel(const protocol_ctxt_t *const ctxt_pP,
|
||||||
@@ -1349,7 +1316,6 @@ void rrc_gNB_process_RRCReestablishmentComplete(const protocol_ctxt_t *const ctx
|
|||||||
nr_rrc_pdcp_config_security(ctxt_pP, ue_context_pP, send_security_mode_command);
|
nr_rrc_pdcp_config_security(ctxt_pP, ue_context_pP, send_security_mode_command);
|
||||||
LOG_D(NR_RRC, "RRC Reestablishment - set security successfully \n");
|
LOG_D(NR_RRC, "RRC Reestablishment - set security successfully \n");
|
||||||
}
|
}
|
||||||
RRCReestablishmentComplete_fill_DRB_configList(ctxt_pP, ue_context_pP, new_xid);
|
|
||||||
RRCReestablishmentComplete_update_ngu_tunnel(ctxt_pP, ue_context_pP, reestablish_rnti);
|
RRCReestablishmentComplete_update_ngu_tunnel(ctxt_pP, ue_context_pP, reestablish_rnti);
|
||||||
RRCReestablishmentComplete_nas_pdu_update(ue_context_pP, xid);
|
RRCReestablishmentComplete_nas_pdu_update(ue_context_pP, xid);
|
||||||
|
|
||||||
@@ -1377,19 +1343,20 @@ void rrc_gNB_process_RRCReestablishmentComplete(const protocol_ctxt_t *const ctx
|
|||||||
asn1cSeqAdd(&cellGroupConfig->rlc_BearerToAddModList->list, ue_p->masterCellGroup->rlc_BearerToAddModList->list.array[i]);
|
asn1cSeqAdd(&cellGroupConfig->rlc_BearerToAddModList->list, ue_p->masterCellGroup->rlc_BearerToAddModList->list.array[i]);
|
||||||
|
|
||||||
for (i = 0; i < cellGroupConfig->rlc_BearerToAddModList->list.count; i++) {
|
for (i = 0; i < cellGroupConfig->rlc_BearerToAddModList->list.count; i++) {
|
||||||
cellGroupConfig->rlc_BearerToAddModList->list.array[i]->reestablishRLC =
|
asn1cCallocOne(cellGroupConfig->rlc_BearerToAddModList->list.array[i]->reestablishRLC,
|
||||||
CALLOC(1, sizeof(*cellGroupConfig->rlc_BearerToAddModList->list.array[i]->reestablishRLC));
|
NR_RLC_BearerConfig__reestablishRLC_true);
|
||||||
*cellGroupConfig->rlc_BearerToAddModList->list.array[i]->reestablishRLC = NR_RLC_BearerConfig__reestablishRLC_true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t buffer[RRC_BUF_SIZE] = {0};
|
|
||||||
NR_SRB_ToAddModList_t *SRBs = createSRBlist(ue_p, true);
|
NR_SRB_ToAddModList_t *SRBs = createSRBlist(ue_p, true);
|
||||||
|
NR_DRB_ToAddModList_t *DRBs = createDRBlist(ue_p, true);
|
||||||
|
|
||||||
|
uint8_t buffer[RRC_BUF_SIZE] = {0};
|
||||||
int size = do_RRCReconfiguration(ctxt_pP,
|
int size = do_RRCReconfiguration(ctxt_pP,
|
||||||
buffer,
|
buffer,
|
||||||
RRC_BUF_SIZE,
|
RRC_BUF_SIZE,
|
||||||
new_xid,
|
new_xid,
|
||||||
SRBs,
|
SRBs,
|
||||||
ue_p->DRB_configList2[new_xid],
|
DRBs,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
@@ -1401,7 +1368,7 @@ void rrc_gNB_process_RRCReestablishmentComplete(const protocol_ctxt_t *const ctx
|
|||||||
NULL,
|
NULL,
|
||||||
cellGroupConfig);
|
cellGroupConfig);
|
||||||
freeSRBlist(SRBs);
|
freeSRBlist(SRBs);
|
||||||
|
freeDRBlist(DRBs);
|
||||||
LOG_DUMPMSG(NR_RRC, DEBUG_RRC, (char *)buffer, size, "[MSG] RRC Reconfiguration\n");
|
LOG_DUMPMSG(NR_RRC, DEBUG_RRC, (char *)buffer, size, "[MSG] RRC Reconfiguration\n");
|
||||||
|
|
||||||
RRCReestablishmentComplete_nas_pdu_free(ue_context_pP);
|
RRCReestablishmentComplete_nas_pdu_free(ue_context_pP);
|
||||||
@@ -2364,7 +2331,7 @@ static void rrc_CU_process_ue_context_modification_response(MessageDef *msg_p, i
|
|||||||
|
|
||||||
// send the F1 response message up to update F1-U tunnel info
|
// send the F1 response message up to update F1-U tunnel info
|
||||||
// it seems the rrc transaction id (xid) is not needed here
|
// it seems the rrc transaction id (xid) is not needed here
|
||||||
rrc->cucp_cuup.bearer_context_mod(&req, instance, 0);
|
rrc->cucp_cuup.bearer_context_mod(&req, instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (resp->du_to_cu_rrc_information != NULL && resp->du_to_cu_rrc_information->cellGroupConfig != NULL) {
|
if (resp->du_to_cu_rrc_information != NULL && resp->du_to_cu_rrc_information->cellGroupConfig != NULL) {
|
||||||
|
|||||||
@@ -278,9 +278,6 @@ static void fill_qos(NGAP_QosFlowSetupRequestList_t *qos, pdusession_t *session)
|
|||||||
static int decodePDUSessionResourceSetup(pdusession_t *session)
|
static int decodePDUSessionResourceSetup(pdusession_t *session)
|
||||||
{
|
{
|
||||||
NGAP_PDUSessionResourceSetupRequestTransfer_t *pdusessionTransfer = NULL;
|
NGAP_PDUSessionResourceSetupRequestTransfer_t *pdusessionTransfer = NULL;
|
||||||
for (int i=0; i<session->pdusessionTransfer.length; i++)
|
|
||||||
printf("%02x:",session->pdusessionTransfer.buffer[i]);
|
|
||||||
printf("\n");
|
|
||||||
asn_codec_ctx_t st = {.max_stack_size = 100 * 1000};
|
asn_codec_ctx_t st = {.max_stack_size = 100 * 1000};
|
||||||
asn_dec_rval_t dec_rval =
|
asn_dec_rval_t dec_rval =
|
||||||
aper_decode(&st, &asn_DEF_NGAP_PDUSessionResourceSetupRequestTransfer, (void **)&pdusessionTransfer, session->pdusessionTransfer.buffer, session->pdusessionTransfer.length, 0, 0);
|
aper_decode(&st, &asn_DEF_NGAP_PDUSessionResourceSetupRequestTransfer, (void **)&pdusessionTransfer, session->pdusessionTransfer.buffer, session->pdusessionTransfer.length, 0, 0);
|
||||||
@@ -819,7 +816,7 @@ void rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(MessageDef *msg_p, instance_t ins
|
|||||||
}
|
}
|
||||||
int xid = rrc_gNB_get_next_transaction_identifier(instance);
|
int xid = rrc_gNB_get_next_transaction_identifier(instance);
|
||||||
UE->xids[xid] = RRC_PDUSESSION_ESTABLISH;
|
UE->xids[xid] = RRC_PDUSESSION_ESTABLISH;
|
||||||
rrc->cucp_cuup.bearer_context_setup(&bearer_req, instance, xid);
|
rrc->cucp_cuup.bearer_context_setup(&bearer_req, instance);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -147,7 +147,7 @@ uint8_t next_available_drb(gNB_RRC_UE_t *ue, rrc_pdu_session_param_t *pdusession
|
|||||||
{
|
{
|
||||||
uint8_t drb_id;
|
uint8_t drb_id;
|
||||||
|
|
||||||
if(!is_gbr) { /* Find if Non-GBR DRB exists in the same PDU Session */
|
if (0 /*!is_gbr*/) { /* Find if Non-GBR DRB exists in the same PDU Session */
|
||||||
for (drb_id = 0; drb_id < NGAP_MAX_DRBS_PER_UE; drb_id++)
|
for (drb_id = 0; drb_id < NGAP_MAX_DRBS_PER_UE; drb_id++)
|
||||||
if (pdusession->param.used_drbs[drb_id] == DRB_ACTIVE_NONGBR)
|
if (pdusession->param.used_drbs[drb_id] == DRB_ACTIVE_NONGBR)
|
||||||
return drb_id + 1;
|
return drb_id + 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user