verified rfsim with splits, and quectel 2 sessions (no split)
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
Active_gNBs = ( "gNB-Eurecom-CU");
|
Active_gNBs = ( "gNB-OAI");
|
||||||
# Asn1_verbosity, choice in: none, info, annoying
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
Asn1_verbosity = "none";
|
Asn1_verbosity = "none";
|
||||||
Num_Threads_PUSCH = 8;
|
Num_Threads_PUSCH = 8;
|
||||||
@@ -8,15 +8,11 @@ gNBs =
|
|||||||
{
|
{
|
||||||
////////// Identification parameters:
|
////////// Identification parameters:
|
||||||
gNB_ID = 0xe00;
|
gNB_ID = 0xe00;
|
||||||
|
gNB_name = "gNB-OAI";
|
||||||
# cell_type = "CELL_MACRO_GNB";
|
|
||||||
|
|
||||||
gNB_name = "gNB-Eurecom-CU";
|
|
||||||
|
|
||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
tracking_area_code = 1;
|
tracking_area_code = 1;
|
||||||
plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1, sd = 0xffffff }) });
|
plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }) });
|
||||||
|
|
||||||
|
|
||||||
nr_cellid = 12345678L;
|
nr_cellid = 12345678L;
|
||||||
force_256qam_off = 1;
|
force_256qam_off = 1;
|
||||||
@@ -169,7 +165,7 @@ gNBs =
|
|||||||
|
|
||||||
|
|
||||||
////////// AMF parameters:
|
////////// AMF parameters:
|
||||||
amf_ip_address = ( { ipv4 = "192.168.5.233";
|
amf_ip_address = ( { ipv4 = "192.168.70.132";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
@@ -178,11 +174,10 @@ gNBs =
|
|||||||
|
|
||||||
NETWORK_INTERFACES :
|
NETWORK_INTERFACES :
|
||||||
{
|
{
|
||||||
|
GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai";
|
||||||
GNB_INTERFACE_NAME_FOR_NG_AMF = "eth0";
|
GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24";
|
||||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "CI_GNB_IP_ADDR";
|
GNB_INTERFACE_NAME_FOR_NGU = "demo-oai";
|
||||||
GNB_INTERFACE_NAME_FOR_NGU = "eth0";
|
GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24";
|
||||||
GNB_IPV4_ADDRESS_FOR_NGU = "CI_GNB_IP_ADDR";
|
|
||||||
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
Active_gNBs = ( "gNB-Eurecom-DU");
|
Active_gNBs = ( "gNB-OAI");
|
||||||
# Asn1_verbosity, choice in: none, info, annoying
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
Asn1_verbosity = "none";
|
Asn1_verbosity = "none";
|
||||||
|
|
||||||
@@ -7,15 +7,11 @@ gNBs =
|
|||||||
{
|
{
|
||||||
////////// Identification parameters:
|
////////// Identification parameters:
|
||||||
gNB_ID = 0xe00;
|
gNB_ID = 0xe00;
|
||||||
|
gNB_name = "gNB-OAI";
|
||||||
# cell_type = "CELL_MACRO_GNB";
|
|
||||||
|
|
||||||
gNB_name = "gNB-Eurecom-DU";
|
|
||||||
|
|
||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
tracking_area_code = 1;
|
tracking_area_code = 1;
|
||||||
plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1, sd = 0xffffff }) });
|
plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }) });
|
||||||
|
|
||||||
|
|
||||||
nr_cellid = 12345678L;
|
nr_cellid = 12345678L;
|
||||||
|
|
||||||
|
|||||||
@@ -8,16 +8,12 @@ gNBs =
|
|||||||
(
|
(
|
||||||
{
|
{
|
||||||
////////// Identification parameters:
|
////////// Identification parameters:
|
||||||
gNB_CU_ID = 0xe00;
|
gNB_ID = 0xe00;
|
||||||
|
|
||||||
# cell_type = "CELL_MACRO_GNB";
|
|
||||||
|
|
||||||
gNB_name = "gNB-OAI";
|
gNB_name = "gNB-OAI";
|
||||||
|
|
||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
tracking_area_code = 1;
|
tracking_area_code = 1;
|
||||||
plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1, sd = 0xffffff }) });
|
plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }) });
|
||||||
|
|
||||||
|
|
||||||
nr_cellid = 12345678L;
|
nr_cellid = 12345678L;
|
||||||
force_256qam_off = 1;
|
force_256qam_off = 1;
|
||||||
@@ -25,8 +21,8 @@ gNBs =
|
|||||||
tr_s_preference = "f1";
|
tr_s_preference = "f1";
|
||||||
|
|
||||||
local_s_if_name = "lo";
|
local_s_if_name = "lo";
|
||||||
local_s_address = "192.168.72.140";
|
local_s_address = "127.0.0.4";
|
||||||
remote_s_address = "192.168.72.143";
|
remote_s_address = "127.0.0.3";
|
||||||
local_s_portc = 501;
|
local_s_portc = 501;
|
||||||
local_s_portd = 2152;
|
local_s_portd = 2152;
|
||||||
remote_s_portc = 500;
|
remote_s_portc = 500;
|
||||||
@@ -171,7 +167,7 @@ gNBs =
|
|||||||
|
|
||||||
|
|
||||||
////////// AMF parameters:
|
////////// AMF parameters:
|
||||||
amf_ip_address = ( { ipv4 = "192.168.71.132";
|
amf_ip_address = ( { ipv4 = "192.168.70.132";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
@@ -182,9 +178,9 @@ gNBs =
|
|||||||
(
|
(
|
||||||
{
|
{
|
||||||
type = "cp";
|
type = "cp";
|
||||||
ipv4_cucp = "192.168.72.140";
|
ipv4_cucp = "127.0.0.2";
|
||||||
port_cucp = 38462;
|
port_cucp = 38462;
|
||||||
ipv4_cuup = "192.168.72.141";
|
ipv4_cuup = "127.0.0.3";
|
||||||
port_cuup = 38462;
|
port_cuup = 38462;
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -192,7 +188,10 @@ gNBs =
|
|||||||
NETWORK_INTERFACES :
|
NETWORK_INTERFACES :
|
||||||
{
|
{
|
||||||
GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai";
|
GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai";
|
||||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.71.140/24";
|
GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24";
|
||||||
|
GNB_INTERFACE_NAME_FOR_NGU = "demo-oai";
|
||||||
|
GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24";
|
||||||
|
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -15,14 +15,14 @@ gNBs =
|
|||||||
|
|
||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
tracking_area_code = 1;
|
tracking_area_code = 1;
|
||||||
plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1, sd = 0xffffff }) });
|
plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }) });
|
||||||
|
|
||||||
|
|
||||||
tr_s_preference = "f1";
|
tr_s_preference = "f1";
|
||||||
|
|
||||||
local_s_if_name = "lo";
|
local_s_if_name = "lo";
|
||||||
local_s_address = "192.168.72.141";
|
local_s_address = "127.0.0.4";
|
||||||
remote_s_address = "192.168.72.142";
|
remote_s_address = "127.0.0.3";
|
||||||
local_s_portc = 501;
|
local_s_portc = 501;
|
||||||
local_s_portd = 2152;
|
local_s_portd = 2152;
|
||||||
remote_s_portc = 500;
|
remote_s_portc = 500;
|
||||||
@@ -39,18 +39,20 @@ gNBs =
|
|||||||
E1_INTERFACE =
|
E1_INTERFACE =
|
||||||
(
|
(
|
||||||
{
|
{
|
||||||
type = "up";
|
type = "cp";
|
||||||
ipv4_cucp = "192.168.72.140";
|
ipv4_cucp = "127.0.0.2";
|
||||||
ipv4_cuup = "192.168.72.141";
|
port_cucp = 38462;
|
||||||
|
ipv4_cuup = "127.0.0.3";
|
||||||
|
port_cuup = 38462;
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
NETWORK_INTERFACES :
|
NETWORK_INTERFACES :
|
||||||
{
|
{
|
||||||
GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai";
|
GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai";
|
||||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.71.141/24";
|
GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24";
|
||||||
GNB_INTERFACE_NAME_FOR_NGU = "demo-oai";
|
GNB_INTERFACE_NAME_FOR_NGU = "demo-oai";
|
||||||
GNB_IPV4_ADDRESS_FOR_NGU = "192.168.71.141/24";
|
GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24";
|
||||||
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1611,7 +1611,7 @@ int CU_handle_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance,
|
|||||||
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
|
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
|
||||||
f1ap_ue_context_modification_resp->gNB_DU_ue_id = ie->value.choice.GNB_DU_UE_F1AP_ID;
|
f1ap_ue_context_modification_resp->gNB_DU_ue_id = ie->value.choice.GNB_DU_UE_F1AP_ID;
|
||||||
|
|
||||||
LOG_D(F1AP, "f1ap_ue_context_setup_resp->gNB_DU_ue_id is: %d \n", f1ap_ue_context_modification_resp->gNB_DU_ue_id);
|
LOG_D(F1AP, "f1ap_ue_context_modification_resp->gNB_DU_ue_id is: %d \n", f1ap_ue_context_modification_resp->gNB_DU_ue_id);
|
||||||
|
|
||||||
f1ap_ue_context_modification_resp->rnti =
|
f1ap_ue_context_modification_resp->rnti =
|
||||||
f1ap_get_rnti_by_du_id(CUtype, instance, f1ap_ue_context_modification_resp->gNB_DU_ue_id);
|
f1ap_get_rnti_by_du_id(CUtype, instance, f1ap_ue_context_modification_resp->gNB_DU_ue_id);
|
||||||
|
|||||||
@@ -36,7 +36,7 @@
|
|||||||
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) {
|
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(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);
|
||||||
protocol_ctxt_t ctxt = {0};
|
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);
|
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, 0, GNB_FLAG_YES, ue_context_p->ue_context.rnti, 0, 0, 0);
|
||||||
|
|
||||||
|
|||||||
@@ -480,8 +480,7 @@ typedef struct gNB_RRC_INST_s {
|
|||||||
eth_params_t eth_params_s;
|
eth_params_t eth_params_s;
|
||||||
rrc_gNB_carrier_data_t carrier;
|
rrc_gNB_carrier_data_t carrier;
|
||||||
uid_allocator_t uid_allocator;
|
uid_allocator_t uid_allocator;
|
||||||
RB_HEAD(rrc_nr_ue_tree_s, rrc_gNB_ue_context_s) rrc_ue_head; // ue_context tree key search by rnti
|
RB_HEAD(rrc_nr_ue_tree_s, rrc_gNB_ue_context_s) rrc_ue_head; // ue_context tree key search by rnti
|
||||||
int Nb_ue;
|
|
||||||
/// NR cell id
|
/// NR cell id
|
||||||
uint64_t nr_cellid;
|
uint64_t nr_cellid;
|
||||||
|
|
||||||
|
|||||||
+40
-39
@@ -245,7 +245,6 @@ static void openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_Rrc
|
|||||||
AssertFatal(NUMBER_OF_UE_MAX < (module_id_t)0xFFFFFFFFFFFFFFFF, " variable overflow");
|
AssertFatal(NUMBER_OF_UE_MAX < (module_id_t)0xFFFFFFFFFFFFFFFF, " variable overflow");
|
||||||
AssertFatal(configuration!=NULL,"configuration input is null\n");
|
AssertFatal(configuration!=NULL,"configuration input is null\n");
|
||||||
rrc->module_id = gnb_mod_idP;
|
rrc->module_id = gnb_mod_idP;
|
||||||
rrc->Nb_ue = 0;
|
|
||||||
rrc_gNB_CU_DU_init(rrc);
|
rrc_gNB_CU_DU_init(rrc);
|
||||||
uid_linear_allocator_init(&rrc->uid_allocator);
|
uid_linear_allocator_init(&rrc->uid_allocator);
|
||||||
RB_INIT(&rrc->rrc_ue_head);
|
RB_INIT(&rrc->rrc_ue_head);
|
||||||
@@ -556,7 +555,7 @@ static void rrc_gNB_generate_defaultRRCReconfiguration(const protocol_ctxt_t *co
|
|||||||
NULL,
|
NULL,
|
||||||
ue_p->masterCellGroup);
|
ue_p->masterCellGroup);
|
||||||
AssertFatal(size > 0, "cannot encode RRCReconfiguration in %s()\n", __func__);
|
AssertFatal(size > 0, "cannot encode RRCReconfiguration in %s()\n", __func__);
|
||||||
LOG_W(RRC, "do_RRCReconfiguration(): size %d\n", size);
|
LOG_W(NR_RRC, "do_RRCReconfiguration(): size %d\n", size);
|
||||||
|
|
||||||
if (LOG_DEBUGFLAG(DEBUG_ASN1)) {
|
if (LOG_DEBUGFLAG(DEBUG_ASN1)) {
|
||||||
xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, ue_p->masterCellGroup);
|
xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, ue_p->masterCellGroup);
|
||||||
@@ -1467,7 +1466,7 @@ void rrc_gNB_process_RRCReestablishmentComplete(const protocol_ctxt_t *const ctx
|
|||||||
|
|
||||||
/* Update RNTI in ue_context */
|
/* Update RNTI in ue_context */
|
||||||
LOG_I(NR_RRC, "Updating UEid from %04x to %lx\n", ue_p->rnti, ctxt_pP->rntiMaybeUEid);
|
LOG_I(NR_RRC, "Updating UEid from %04x to %lx\n", ue_p->rnti, ctxt_pP->rntiMaybeUEid);
|
||||||
ue_p->rnti = ctxt_pP->rntiMaybeUEid;
|
rrc_gNB_update_ue_context_rnti(ctxt_pP->rntiMaybeUEid, RC.nrrrc[ctxt_pP->module_id], ue_p->gNB_ue_ngap_id);
|
||||||
|
|
||||||
if (get_softmodem_params()->sa) {
|
if (get_softmodem_params()->sa) {
|
||||||
uint8_t send_security_mode_command = false;
|
uint8_t send_security_mode_command = false;
|
||||||
@@ -1710,8 +1709,10 @@ static int nr_rrc_gNB_decode_ccch(module_id_t module_id, rnti_t rnti, const uint
|
|||||||
LOG_I(NR_RRC, " 5G-S-TMSI-Part1 exists, old rnti %04x => %04x\n", UE->rnti, rnti);
|
LOG_I(NR_RRC, " 5G-S-TMSI-Part1 exists, old rnti %04x => %04x\n", UE->rnti, rnti);
|
||||||
|
|
||||||
// TODO: MAC structures should not be accessed directly from the RRC! An implementation using the F1 interface should be developed.
|
// TODO: MAC structures should not be accessed directly from the RRC! An implementation using the F1 interface should be developed.
|
||||||
gNB_MAC_INST *nrmac = RC.nrmac[module_id]; // why MAC instances match RRC instances ?
|
if (!NODE_IS_CU(RC.nrrrc[0]->node_type)) {
|
||||||
mac_remove_nr_ue(nrmac, UE->rnti);
|
gNB_MAC_INST *nrmac = RC.nrmac[module_id]; // why MAC instances match RRC instances ?
|
||||||
|
mac_remove_nr_ue(nrmac, UE->rnti);
|
||||||
|
}
|
||||||
|
|
||||||
/* replace rnti in the context */
|
/* replace rnti in the context */
|
||||||
UE->rnti = rnti;
|
UE->rnti = rnti;
|
||||||
@@ -1794,7 +1795,7 @@ static int nr_rrc_gNB_decode_ccch(module_id_t module_id, rnti_t rnti, const uint
|
|||||||
|
|
||||||
rnti_t c_rnti = rrcReestablishmentRequest.ue_Identity.c_RNTI;
|
rnti_t c_rnti = rrcReestablishmentRequest.ue_Identity.c_RNTI;
|
||||||
LOG_I(NR_RRC, "c_RNTI: %04x\n", c_rnti);
|
LOG_I(NR_RRC, "c_RNTI: %04x\n", c_rnti);
|
||||||
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(gnb_rrc_inst, c_rnti);
|
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context_by_rnti(gnb_rrc_inst, c_rnti);
|
||||||
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
||||||
if (ue_context_p == NULL) {
|
if (ue_context_p == NULL) {
|
||||||
LOG_E(NR_RRC, "NR_RRCReestablishmentRequest without UE context, fallback to RRC establishment\n");
|
LOG_E(NR_RRC, "NR_RRCReestablishmentRequest without UE context, fallback to RRC establishment\n");
|
||||||
@@ -2417,7 +2418,7 @@ rrc_gNB_decode_dcch(
|
|||||||
if (nr_reestablish_rnti_map->ue_id == ctxt_pP->rntiMaybeUEid) {
|
if (nr_reestablish_rnti_map->ue_id == ctxt_pP->rntiMaybeUEid) {
|
||||||
LOG_I(NR_RRC, "Removing nr_reestablish_rnti_map[%d] UEid %lx, RNTI %04x\n", i, nr_reestablish_rnti_map->ue_id, nr_reestablish_rnti_map->c_rnti);
|
LOG_I(NR_RRC, "Removing nr_reestablish_rnti_map[%d] UEid %lx, RNTI %04x\n", i, nr_reestablish_rnti_map->ue_id, nr_reestablish_rnti_map->c_rnti);
|
||||||
reestablish_rnti = nr_reestablish_rnti_map->c_rnti;
|
reestablish_rnti = nr_reestablish_rnti_map->c_rnti;
|
||||||
ue_context_p = rrc_gNB_get_ue_context(gnb_rrc_inst, reestablish_rnti);
|
ue_context_p = rrc_gNB_get_ue_context_by_rnti(gnb_rrc_inst, reestablish_rnti);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2443,8 +2444,10 @@ rrc_gNB_decode_dcch(
|
|||||||
if (ul_dcch_msg->message.choice.c1->choice.rrcReestablishmentComplete->criticalExtensions.present == NR_RRCReestablishmentComplete__criticalExtensions_PR_rrcReestablishmentComplete) {
|
if (ul_dcch_msg->message.choice.c1->choice.rrcReestablishmentComplete->criticalExtensions.present == NR_RRCReestablishmentComplete__criticalExtensions_PR_rrcReestablishmentComplete) {
|
||||||
rrc_gNB_process_RRCReestablishmentComplete(ctxt_pP, reestablish_rnti, ue_context_p, ul_dcch_msg->message.choice.c1->choice.rrcReestablishmentComplete->rrc_TransactionIdentifier);
|
rrc_gNB_process_RRCReestablishmentComplete(ctxt_pP, reestablish_rnti, ue_context_p, ul_dcch_msg->message.choice.c1->choice.rrcReestablishmentComplete->rrc_TransactionIdentifier);
|
||||||
|
|
||||||
gNB_MAC_INST *nrmac = RC.nrmac[ctxt_pP->module_id]; // WHAT A BEAUTIFULL RACE CONDITION !!!
|
if (!NODE_IS_CU(RC.nrrrc[0]->node_type)) {
|
||||||
mac_remove_nr_ue(nrmac, reestablish_rnti);
|
gNB_MAC_INST *nrmac = RC.nrmac[ctxt_pP->module_id]; // WHAT A BEAUTIFULL RACE CONDITION !!!
|
||||||
|
mac_remove_nr_ue(nrmac, reestablish_rnti);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// UE->ue_release_timer = 0;
|
// UE->ue_release_timer = 0;
|
||||||
@@ -2599,8 +2602,8 @@ static int rrc_process_DU_DL(MessageDef *msg_p, instance_t instance)
|
|||||||
{
|
{
|
||||||
NRDuDlReq_t * req=&NRDuDlReq(msg_p);
|
NRDuDlReq_t * req=&NRDuDlReq(msg_p);
|
||||||
protocol_ctxt_t ctxt = {.rntiMaybeUEid = req->rnti, .module_id = instance, .instance = instance, .enb_flag = 1, .eNB_index = instance};
|
protocol_ctxt_t ctxt = {.rntiMaybeUEid = req->rnti, .module_id = instance, .instance = instance, .enb_flag = 1, .eNB_index = instance};
|
||||||
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
|
gNB_RRC_INST *rrc = RC.nrrrc[instance];
|
||||||
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(rrc, ctxt.rntiMaybeUEid);
|
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context_by_rnti(rrc, req->rnti);
|
||||||
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
||||||
|
|
||||||
if (req->srb_id == 0) {
|
if (req->srb_id == 0) {
|
||||||
@@ -2788,10 +2791,9 @@ return 0;
|
|||||||
static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, instance_t instance)
|
static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, instance_t instance)
|
||||||
{
|
{
|
||||||
f1ap_ue_context_setup_t * req=&F1AP_UE_CONTEXT_SETUP_REQ(msg_p);
|
f1ap_ue_context_setup_t * req=&F1AP_UE_CONTEXT_SETUP_REQ(msg_p);
|
||||||
protocol_ctxt_t ctxt = {.rntiMaybeUEid = req->rnti, .module_id = instance, .instance = instance, .enb_flag = 1, .eNB_index = instance};
|
gNB_RRC_INST *rrc = RC.nrrrc[instance];
|
||||||
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
|
gNB_MAC_INST *mac = RC.nrmac[instance];
|
||||||
gNB_MAC_INST *mac = RC.nrmac[ctxt.module_id];
|
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context_by_rnti(rrc, req->rnti);
|
||||||
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(rrc, ctxt.rntiMaybeUEid);
|
|
||||||
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
||||||
MessageDef *message_p;
|
MessageDef *message_p;
|
||||||
message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_SETUP_RESP);
|
message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_SETUP_RESP);
|
||||||
@@ -2837,8 +2839,7 @@ static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, instance_
|
|||||||
}
|
}
|
||||||
|
|
||||||
if((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)){
|
if((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)){
|
||||||
LOG_E(NR_RRC, PROTOCOL_NR_RRC_CTXT_UE_FMT" Failed to decode nr UE capabilities (%zu bytes)\n",
|
LOG_E(NR_RRC, "UE %04x Failed to decode nr UE capabilities (%zu bytes)\n", req->rnti, dec_rval.consumed);
|
||||||
PROTOCOL_NR_RRC_CTXT_UE_ARGS(&ctxt),dec_rval.consumed);
|
|
||||||
ASN_STRUCT_FREE(asn_DEF_NR_UE_NR_Capability, UE->UE_Capability_nr);
|
ASN_STRUCT_FREE(asn_DEF_NR_UE_NR_Capability, UE->UE_Capability_nr);
|
||||||
UE->UE_Capability_nr = 0;
|
UE->UE_Capability_nr = 0;
|
||||||
}
|
}
|
||||||
@@ -2870,8 +2871,7 @@ static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, instance_
|
|||||||
}
|
}
|
||||||
|
|
||||||
if((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)){
|
if((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)){
|
||||||
LOG_E(NR_RRC,PROTOCOL_NR_RRC_CTXT_FMT" Failed to decode nr UE capabilities (%zu bytes)\n",
|
LOG_E(NR_RRC, "UE %04x Failed to decode nr UE capabilities (%zu bytes)\n", req->rnti, dec_rval.consumed);
|
||||||
PROTOCOL_NR_RRC_CTXT_UE_ARGS(&ctxt),dec_rval.consumed);
|
|
||||||
ASN_STRUCT_FREE(asn_DEF_NR_UE_MRDC_Capability, UE->UE_Capability_MRDC);
|
ASN_STRUCT_FREE(asn_DEF_NR_UE_MRDC_Capability, UE->UE_Capability_MRDC);
|
||||||
UE->UE_Capability_MRDC = 0;
|
UE->UE_Capability_MRDC = 0;
|
||||||
}
|
}
|
||||||
@@ -2948,7 +2948,7 @@ static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, instance_
|
|||||||
// FIXME: fill_mastercellGroupConfig() won't fill the right priorities or
|
// FIXME: fill_mastercellGroupConfig() won't fill the right priorities or
|
||||||
// bearer IDs for the DRBs
|
// bearer IDs for the DRBs
|
||||||
fill_mastercellGroupConfig(cellGroupConfig, UE->masterCellGroup, rrc->um_on_default_drb, SRB2_config ? 1 : 0, drb_id_to_setup_start, nb_drb_to_setup, drb_priority);
|
fill_mastercellGroupConfig(cellGroupConfig, UE->masterCellGroup, rrc->um_on_default_drb, SRB2_config ? 1 : 0, drb_id_to_setup_start, nb_drb_to_setup, drb_priority);
|
||||||
|
protocol_ctxt_t ctxt = {.rntiMaybeUEid = req->rnti, .module_id = instance, .instance = instance, .enb_flag = 1, .eNB_index = instance};
|
||||||
apply_macrlc_config(rrc, ue_context_p, &ctxt);
|
apply_macrlc_config(rrc, ue_context_p, &ctxt);
|
||||||
|
|
||||||
if(req->rrc_container_length > 0){
|
if(req->rrc_container_length > 0){
|
||||||
@@ -2964,7 +2964,7 @@ static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, instance_
|
|||||||
|
|
||||||
/* Fill the UE context setup response ITTI message to send to F1AP */
|
/* Fill the UE context setup response ITTI message to send to F1AP */
|
||||||
resp->gNB_CU_ue_id = req->gNB_CU_ue_id;
|
resp->gNB_CU_ue_id = req->gNB_CU_ue_id;
|
||||||
resp->rnti = ctxt.rntiMaybeUEid;
|
resp->rnti = req->rnti;
|
||||||
if(DRB_configList){
|
if(DRB_configList){
|
||||||
if(DRB_configList->list.count > 0){
|
if(DRB_configList->list.count > 0){
|
||||||
resp->drbs_to_be_setup = calloc(1,DRB_configList->list.count*sizeof(f1ap_drb_to_be_setup_t));
|
resp->drbs_to_be_setup = calloc(1,DRB_configList->list.count*sizeof(f1ap_drb_to_be_setup_t));
|
||||||
@@ -3012,7 +3012,7 @@ static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, instance_
|
|||||||
}
|
}
|
||||||
resp->du_to_cu_rrc_information->cellGroupConfig_length = (enc_rval.encoded+7)>>3;
|
resp->du_to_cu_rrc_information->cellGroupConfig_length = (enc_rval.encoded+7)>>3;
|
||||||
free(cellGroupConfig);
|
free(cellGroupConfig);
|
||||||
itti_send_msg_to_task (TASK_DU_F1, ctxt.module_id, message_p);
|
itti_send_msg_to_task(TASK_DU_F1, instance, message_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rrc_DU_process_ue_context_modification_request(MessageDef *msg_p, instance_t instance)
|
static void rrc_DU_process_ue_context_modification_request(MessageDef *msg_p, instance_t instance)
|
||||||
@@ -3021,7 +3021,7 @@ static void rrc_DU_process_ue_context_modification_request(MessageDef *msg_p, in
|
|||||||
protocol_ctxt_t ctxt = {.rntiMaybeUEid = req->rnti, .module_id = instance, .instance = instance, .enb_flag = 1, .eNB_index = instance};
|
protocol_ctxt_t ctxt = {.rntiMaybeUEid = req->rnti, .module_id = instance, .instance = instance, .enb_flag = 1, .eNB_index = instance};
|
||||||
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
|
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
|
||||||
gNB_MAC_INST *mac = RC.nrmac[ctxt.module_id];
|
gNB_MAC_INST *mac = RC.nrmac[ctxt.module_id];
|
||||||
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(rrc, ctxt.rntiMaybeUEid);
|
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context_by_rnti(rrc, req->rnti);
|
||||||
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
||||||
MessageDef *message_p;
|
MessageDef *message_p;
|
||||||
message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_MODIFICATION_RESP);
|
message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_MODIFICATION_RESP);
|
||||||
@@ -3164,7 +3164,7 @@ static void rrc_CU_process_ue_context_setup_response(MessageDef *msg_p, instance
|
|||||||
f1ap_ue_context_setup_t * resp=&F1AP_UE_CONTEXT_SETUP_RESP(msg_p);
|
f1ap_ue_context_setup_t * resp=&F1AP_UE_CONTEXT_SETUP_RESP(msg_p);
|
||||||
protocol_ctxt_t ctxt = {.rntiMaybeUEid = resp->rnti, .module_id = instance, .instance = instance, .enb_flag = 1, .eNB_index = instance};
|
protocol_ctxt_t ctxt = {.rntiMaybeUEid = resp->rnti, .module_id = instance, .instance = instance, .enb_flag = 1, .eNB_index = instance};
|
||||||
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
|
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
|
||||||
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(rrc, ctxt.rntiMaybeUEid);
|
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context_by_rnti(rrc, resp->rnti);
|
||||||
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
||||||
NR_CellGroupConfig_t *cellGroupConfig = NULL;
|
NR_CellGroupConfig_t *cellGroupConfig = NULL;
|
||||||
|
|
||||||
@@ -3217,7 +3217,7 @@ static void rrc_CU_process_ue_context_modification_response(MessageDef *msg_p, i
|
|||||||
f1ap_ue_context_setup_t *resp=&F1AP_UE_CONTEXT_SETUP_RESP(msg_p);
|
f1ap_ue_context_setup_t *resp=&F1AP_UE_CONTEXT_SETUP_RESP(msg_p);
|
||||||
protocol_ctxt_t ctxt = {.rntiMaybeUEid = resp->rnti, .module_id = instance, .instance = instance, .enb_flag = 1, .eNB_index = instance};
|
protocol_ctxt_t ctxt = {.rntiMaybeUEid = resp->rnti, .module_id = instance, .instance = instance, .enb_flag = 1, .eNB_index = instance};
|
||||||
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
|
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
|
||||||
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(rrc, ctxt.rntiMaybeUEid);
|
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context_by_rnti(rrc, resp->rnti);
|
||||||
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
||||||
|
|
||||||
e1ap_bearer_setup_req_t req = {0};
|
e1ap_bearer_setup_req_t req = {0};
|
||||||
@@ -3450,7 +3450,6 @@ void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) {
|
|||||||
{
|
{
|
||||||
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
||||||
ctxt_pP->rntiMaybeUEid = UE->rnti;
|
ctxt_pP->rntiMaybeUEid = UE->rnti;
|
||||||
gNB_MAC_INST *nrmac=RC.nrmac[ctxt_pP->module_id]; //WHAT A BEAUTIFULL RACE CONDITION !!!
|
|
||||||
|
|
||||||
if (UE->ul_failure_timer > 0) {
|
if (UE->ul_failure_timer > 0) {
|
||||||
UE->ul_failure_timer++;
|
UE->ul_failure_timer++;
|
||||||
@@ -3466,18 +3465,20 @@ void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) {
|
|||||||
NGAP_CAUSE_RADIO_NETWORK_RADIO_CONNECTION_WITH_UE_LOST);
|
NGAP_CAUSE_RADIO_NETWORK_RADIO_CONNECTION_WITH_UE_LOST);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove here the MAC and RRC context when RRC is not connected or gNB is not connected to CN5G
|
// Remove here the MAC and RRC context when RRC is not connected
|
||||||
if (UE->StatusRrc < NR_RRC_CONNECTED || UE->gNB_ue_ngap_id == 0) {
|
if (UE->StatusRrc < NR_RRC_CONNECTED) {
|
||||||
if (!NODE_IS_CU(rrc->node_type)) {
|
if (!NODE_IS_CU(rrc->node_type)) {
|
||||||
mac_remove_nr_ue(nrmac, ctxt_pP->rntiMaybeUEid);
|
gNB_MAC_INST *nrmac = RC.nrmac[ctxt_pP->module_id]; // WHAT A BEAUTIFULL RACE CONDITION !!!
|
||||||
|
mac_remove_nr_ue(nrmac, UE->rnti);
|
||||||
rrc_rlc_remove_ue(ctxt_pP);
|
rrc_rlc_remove_ue(ctxt_pP);
|
||||||
pdcp_remove_UE(ctxt_pP);
|
pdcp_remove_UE(ctxt_pP);
|
||||||
|
|
||||||
/* remove RRC UE Context */
|
/* remove RRC UE Context */
|
||||||
ue_context_p = rrc_gNB_get_ue_context(rrc, ctxt_pP->rntiMaybeUEid);
|
ue_context_p = rrc_gNB_get_ue_context_by_rnti(rrc, UE->rnti);
|
||||||
if (ue_context_p) {
|
if (ue_context_p) {
|
||||||
|
LOG_I(NR_RRC, "remove UE %04x \n", UE->rnti);
|
||||||
rrc_gNB_remove_ue_context(rrc, ue_context_p);
|
rrc_gNB_remove_ue_context(rrc, ue_context_p);
|
||||||
LOG_I(NR_RRC, "remove UE %lx \n", ctxt_pP->rntiMaybeUEid);
|
break; // We must not access this UE context
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// In case of CU trigger UE context release command towards the DU
|
// In case of CU trigger UE context release command towards the DU
|
||||||
@@ -3485,7 +3486,7 @@ void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) {
|
|||||||
MessageDef *message_p;
|
MessageDef *message_p;
|
||||||
message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_RELEASE_CMD);
|
message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_RELEASE_CMD);
|
||||||
f1ap_ue_context_release_cmd_t *rel_cmd=&F1AP_UE_CONTEXT_RELEASE_CMD (message_p);
|
f1ap_ue_context_release_cmd_t *rel_cmd=&F1AP_UE_CONTEXT_RELEASE_CMD (message_p);
|
||||||
rel_cmd->rnti = ctxt_pP->rntiMaybeUEid;
|
rel_cmd->rnti = UE->rnti;
|
||||||
rel_cmd->cause = F1AP_CAUSE_RADIO_NETWORK;
|
rel_cmd->cause = F1AP_CAUSE_RADIO_NETWORK;
|
||||||
rel_cmd->cause_value = 10; // 10 = F1AP_CauseRadioNetwork_normal_release
|
rel_cmd->cause_value = 10; // 10 = F1AP_CauseRadioNetwork_normal_release
|
||||||
itti_send_msg_to_task(TASK_CU_F1, ctxt_pP->module_id, message_p);
|
itti_send_msg_to_task(TASK_CU_F1, ctxt_pP->module_id, message_p);
|
||||||
@@ -3502,18 +3503,18 @@ void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) {
|
|||||||
if (UE->ue_release_timer_rrc >= UE->ue_release_timer_thres_rrc) {
|
if (UE->ue_release_timer_rrc >= UE->ue_release_timer_thres_rrc) {
|
||||||
LOG_I(NR_RRC, "Removing UE %x instance after UE_CONTEXT_RELEASE_Complete (ue_release_timer_rrc timeout)\n", UE->rnti);
|
LOG_I(NR_RRC, "Removing UE %x instance after UE_CONTEXT_RELEASE_Complete (ue_release_timer_rrc timeout)\n", UE->rnti);
|
||||||
UE->ue_release_timer_rrc = 0;
|
UE->ue_release_timer_rrc = 0;
|
||||||
mac_remove_nr_ue(nrmac, ctxt_pP->rntiMaybeUEid);
|
if (!NODE_IS_CU(RC.nrrrc[0]->node_type)) {
|
||||||
|
gNB_MAC_INST *nrmac = RC.nrmac[ctxt_pP->module_id]; // WHAT A BEAUTIFULL RACE CONDITION !!!
|
||||||
|
mac_remove_nr_ue(nrmac, UE->rnti);
|
||||||
|
}
|
||||||
rrc_rlc_remove_ue(ctxt_pP);
|
rrc_rlc_remove_ue(ctxt_pP);
|
||||||
pdcp_remove_UE(ctxt_pP);
|
pdcp_remove_UE(ctxt_pP);
|
||||||
newGtpuDeleteAllTunnels(ctxt_pP->instance, ctxt_pP->rntiMaybeUEid);
|
newGtpuDeleteAllTunnels(ctxt_pP->instance, UE->rnti);
|
||||||
|
|
||||||
/* remove RRC UE Context */
|
/* remove RRC UE Context */
|
||||||
ue_context_p = rrc_gNB_get_ue_context(rrc, ctxt_pP->rntiMaybeUEid);
|
LOG_I(NR_RRC, "remove UE %04x \n", UE->rnti);
|
||||||
if (ue_context_p) {
|
|
||||||
rrc_gNB_remove_ue_context(rrc, ue_context_p);
|
|
||||||
LOG_I(NR_RRC, "remove UE %lx \n", ctxt_pP->rntiMaybeUEid);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
rrc_gNB_remove_ue_context(rrc, ue_context_p);
|
||||||
break; // break RB_FOREACH
|
break; // break RB_FOREACH
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ int rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP(const protocol_ctxt_t *const ctxt_
|
|||||||
}
|
}
|
||||||
|
|
||||||
LOG_D(RRC, PROTOCOL_RRC_CTXT_UE_FMT " RX CREATE_TUNNEL_RESP num tunnels %u \n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), create_tunnel_resp_pP->num_tunnels);
|
LOG_D(RRC, PROTOCOL_RRC_CTXT_UE_FMT " RX CREATE_TUNNEL_RESP num tunnels %u \n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), create_tunnel_resp_pP->num_tunnels);
|
||||||
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt_pP->module_id], ctxt_pP->rntiMaybeUEid);
|
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context_by_rnti(RC.nrrrc[ctxt_pP->module_id], ctxt_pP->rntiMaybeUEid);
|
||||||
if (!ue_context_p) {
|
if (!ue_context_p) {
|
||||||
LOG_E(NR_RRC, "UE table error\n");
|
LOG_E(NR_RRC, "UE table error\n");
|
||||||
return -1;
|
return -1;
|
||||||
|
|||||||
@@ -279,8 +279,9 @@ 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;
|
NGAP_PDUSessionResourceSetupRequestTransfer_t *pdusessionTransfer;
|
||||||
|
asn_codec_ctx_t st = {.max_stack_size = 100 * 1000};
|
||||||
asn_dec_rval_t dec_rval =
|
asn_dec_rval_t dec_rval =
|
||||||
aper_decode(NULL, &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);
|
||||||
|
|
||||||
if (dec_rval.code != RC_OK) {
|
if (dec_rval.code != RC_OK) {
|
||||||
LOG_E(NR_RRC, "can not decode PDUSessionResourceSetupRequestTransfer\n");
|
LOG_E(NR_RRC, "can not decode PDUSessionResourceSetupRequestTransfer\n");
|
||||||
|
|||||||
@@ -123,10 +123,8 @@ void rrc_gNB_remove_ue_context(gNB_RRC_INST *rrc_instance_pP, rrc_gNB_ue_context
|
|||||||
}
|
}
|
||||||
|
|
||||||
RB_REMOVE(rrc_nr_ue_tree_s, &rrc_instance_pP->rrc_ue_head, ue_context_pP);
|
RB_REMOVE(rrc_nr_ue_tree_s, &rrc_instance_pP->rrc_ue_head, ue_context_pP);
|
||||||
rrc_gNB_free_mem_ue_context(ue_context_pP);
|
|
||||||
uid_linear_allocator_free(&rrc_instance_pP->uid_allocator, ue_context_pP->ue_context.gNB_ue_ngap_id);
|
uid_linear_allocator_free(&rrc_instance_pP->uid_allocator, ue_context_pP->ue_context.gNB_ue_ngap_id);
|
||||||
free(ue_context_pP);
|
rrc_gNB_free_mem_ue_context(ue_context_pP);
|
||||||
rrc_instance_pP->Nb_ue --;
|
|
||||||
LOG_I(NR_RRC, "Removed UE context\n");
|
LOG_I(NR_RRC, "Removed UE context\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -158,6 +156,16 @@ rrc_gNB_ue_context_t *rrc_gNB_ue_context_5g_s_tmsi_exist(gNB_RRC_INST *rrc_insta
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void rrc_gNB_update_ue_context_rnti(rnti_t rnti, gNB_RRC_INST *rrc_instance_pP, uint32_t gNB_ue_ngap_id)
|
||||||
|
{
|
||||||
|
// rnti will need to be a fast access key, with indexing, today it is sequential search
|
||||||
|
// This function will update the index when it will be made
|
||||||
|
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(rrc_instance_pP, gNB_ue_ngap_id);
|
||||||
|
if (ue_context_p)
|
||||||
|
ue_context_p->ue_context.rnti = rnti;
|
||||||
|
else
|
||||||
|
LOG_E(NR_RRC, "update rnti on a wrong UE id\n");
|
||||||
|
}
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// return a new ue context structure if ue_identityP, rnti not found in collection
|
// return a new ue context structure if ue_identityP, rnti not found in collection
|
||||||
rrc_gNB_ue_context_t *rrc_gNB_create_ue_context(rnti_t rnti, gNB_RRC_INST *rrc_instance_pP, const uint64_t ue_identityP)
|
rrc_gNB_ue_context_t *rrc_gNB_create_ue_context(rnti_t rnti, gNB_RRC_INST *rrc_instance_pP, const uint64_t ue_identityP)
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ void rrc_gNB_remove_ue_context(gNB_RRC_INST* rrc_instance_pP, rrc_gNB_ue_context
|
|||||||
rrc_gNB_ue_context_t* rrc_gNB_ue_context_random_exist(gNB_RRC_INST* rrc_instance_pP, const uint64_t ue_identityP);
|
rrc_gNB_ue_context_t* rrc_gNB_ue_context_random_exist(gNB_RRC_INST* rrc_instance_pP, const uint64_t ue_identityP);
|
||||||
|
|
||||||
rrc_gNB_ue_context_t* rrc_gNB_ue_context_5g_s_tmsi_exist(gNB_RRC_INST* rrc_instance_pP, const uint64_t s_TMSI);
|
rrc_gNB_ue_context_t* rrc_gNB_ue_context_5g_s_tmsi_exist(gNB_RRC_INST* rrc_instance_pP, const uint64_t s_TMSI);
|
||||||
|
void rrc_gNB_update_ue_context_rnti(rnti_t rnti, gNB_RRC_INST* rrc_instance_pP, uint32_t gNB_ue_ngap_id);
|
||||||
rrc_gNB_ue_context_t* rrc_gNB_create_ue_context(rnti_t rnti, gNB_RRC_INST* rrc_instance_pP, const uint64_t ue_identityP);
|
rrc_gNB_ue_context_t* rrc_gNB_create_ue_context(rnti_t rnti, gNB_RRC_INST* rrc_instance_pP, const uint64_t ue_identityP);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -145,7 +145,6 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc, rrc_gNB_ue_context_t *ue_context_p, x2a
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NR RRCReconfiguration
|
// NR RRCReconfiguration
|
||||||
AssertFatal(rrc->Nb_ue < MAX_NR_RRC_UE_CONTEXTS,"cannot add another UE\n");
|
|
||||||
UE->reconfig = calloc(1, sizeof(NR_RRCReconfiguration_t));
|
UE->reconfig = calloc(1, sizeof(NR_RRCReconfiguration_t));
|
||||||
UE->secondaryCellGroup = calloc(1, sizeof(NR_CellGroupConfig_t));
|
UE->secondaryCellGroup = calloc(1, sizeof(NR_CellGroupConfig_t));
|
||||||
memset((void *)UE->reconfig, 0, sizeof(NR_RRCReconfiguration_t));
|
memset((void *)UE->reconfig, 0, sizeof(NR_RRCReconfiguration_t));
|
||||||
@@ -237,8 +236,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc, rrc_gNB_ue_context_t *ue_context_p, x2a
|
|||||||
|
|
||||||
NR_ServingCellConfig_t *scc = UE->spCellConfig ? UE->spCellConfig->spCellConfigDedicated : NULL;
|
NR_ServingCellConfig_t *scc = UE->spCellConfig ? UE->spCellConfig->spCellConfigDedicated : NULL;
|
||||||
fill_default_reconfig(carrier->servingcellconfigcommon, scc, reconfig_ies, UE->secondaryCellGroup, UE->UE_Capability_nr, configuration, ue_context_p->ue_context.gNB_ue_ngap_id);
|
fill_default_reconfig(carrier->servingcellconfigcommon, scc, reconfig_ies, UE->secondaryCellGroup, UE->UE_Capability_nr, configuration, ue_context_p->ue_context.gNB_ue_ngap_id);
|
||||||
|
rrc_gNB_update_ue_context_rnti(UE->secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity, rrc, UE->gNB_ue_ngap_id);
|
||||||
ue_context_p->ue_context.rnti = UE->secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity;
|
|
||||||
NR_CG_Config_t *CG_Config = calloc(1,sizeof(*CG_Config));
|
NR_CG_Config_t *CG_Config = calloc(1,sizeof(*CG_Config));
|
||||||
memset((void *)CG_Config,0,sizeof(*CG_Config));
|
memset((void *)CG_Config,0,sizeof(*CG_Config));
|
||||||
// int CG_Config_size = generate_CG_Config(rrc,CG_Config,UE->reconfig,UE->rb_config);
|
// int CG_Config_size = generate_CG_Config(rrc,CG_Config,UE->reconfig,UE->rb_config);
|
||||||
@@ -328,7 +326,6 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc, rrc_gNB_ue_context_t *ue_context_p, x2a
|
|||||||
itti_send_msg_to_task(TASK_X2AP, ENB_MODULE_ID_TO_INSTANCE(0), msg); //Check right id instead of hardcoding
|
itti_send_msg_to_task(TASK_X2AP, ENB_MODULE_ID_TO_INSTANCE(0), msg); //Check right id instead of hardcoding
|
||||||
}
|
}
|
||||||
|
|
||||||
rrc->Nb_ue++;
|
|
||||||
// configure MAC and RLC
|
// configure MAC and RLC
|
||||||
if (NODE_IS_DU(rrc->node_type)) {
|
if (NODE_IS_DU(rrc->node_type)) {
|
||||||
rrc_mac_config_req_gNB(rrc->module_id,
|
rrc_mac_config_req_gNB(rrc->module_id,
|
||||||
@@ -384,7 +381,7 @@ void rrc_remove_nsa_user(gNB_RRC_INST *rrc, int rnti) {
|
|||||||
LOG_D(RRC, "calling rrc_remove_nsa_user rnti %d\n", rnti);
|
LOG_D(RRC, "calling rrc_remove_nsa_user rnti %d\n", rnti);
|
||||||
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, rrc->module_id, GNB_FLAG_YES, rnti, 0, 0, rrc->module_id);
|
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, rrc->module_id, GNB_FLAG_YES, rnti, 0, 0, rrc->module_id);
|
||||||
|
|
||||||
ue_context = rrc_gNB_get_ue_context(rrc, rnti);
|
ue_context = rrc_gNB_get_ue_context_by_rnti(rrc, rnti);
|
||||||
if (ue_context == NULL) {
|
if (ue_context == NULL) {
|
||||||
LOG_W(RRC, "rrc_remove_nsa_user: rnti %d not found\n", rnti);
|
LOG_W(RRC, "rrc_remove_nsa_user: rnti %d not found\n", rnti);
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -28,7 +28,6 @@ rrc_pdu_session_param_t *find_pduSession(gNB_RRC_UE_t *ue, int id, bool create)
|
|||||||
for (j = 0; j < ue->nb_of_pdusessions; j++)
|
for (j = 0; j < ue->nb_of_pdusessions; j++)
|
||||||
if (id == ue->pduSession[j].param.pdusession_id)
|
if (id == ue->pduSession[j].param.pdusession_id)
|
||||||
break;
|
break;
|
||||||
printf("%d XXXX %d\n", j, ue->nb_of_pdusessions);
|
|
||||||
if (j == ue->nb_of_pdusessions && create)
|
if (j == ue->nb_of_pdusessions && create)
|
||||||
ue->nb_of_pdusessions++;
|
ue->nb_of_pdusessions++;
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -53,8 +53,8 @@ static void allocCopy(ngap_pdu_t *out, OCTET_STRING_t in)
|
|||||||
if (in.size) {
|
if (in.size) {
|
||||||
out->buffer = malloc(in.size);
|
out->buffer = malloc(in.size);
|
||||||
memcpy(out->buffer, in.buf, in.size);
|
memcpy(out->buffer, in.buf, in.size);
|
||||||
out->length = in.size;
|
|
||||||
}
|
}
|
||||||
|
out->length = in.size;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *ngap_direction2String(int ngap_dir) {
|
char *ngap_direction2String(int ngap_dir) {
|
||||||
|
|||||||
@@ -54,8 +54,8 @@ static void allocCopy(OCTET_STRING_t *out, ngap_pdu_t in)
|
|||||||
if (in.length) {
|
if (in.length) {
|
||||||
out->buf = malloc(in.length);
|
out->buf = malloc(in.length);
|
||||||
memcpy(out->buf, in.buffer, in.length);
|
memcpy(out->buf, in.buffer, in.length);
|
||||||
out->size = in.length;
|
|
||||||
}
|
}
|
||||||
|
out->size = in.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void allocAddrCopy(BIT_STRING_t *out, ngap_transport_layer_addr_t in)
|
static void allocAddrCopy(BIT_STRING_t *out, ngap_transport_layer_addr_t in)
|
||||||
|
|||||||
Reference in New Issue
Block a user