Merge remote-tracking branch 'origin/simplify-pdu-session-management' into integration_2023_w18b
This commit is contained in:
@@ -111,7 +111,7 @@ 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)
|
void fill_DRB_configList(const protocol_ctxt_t *const ctxt_pP, rrc_gNB_ue_context_t *ue_context_pP, uint8_t xid)
|
||||||
{
|
{
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -263,17 +263,6 @@ typedef enum pdu_session_type_e {
|
|||||||
PDUSessionType_unstructured = 4
|
PDUSessionType_unstructured = 4
|
||||||
}pdu_session_type_t;
|
}pdu_session_type_t;
|
||||||
|
|
||||||
typedef struct ngap_transport_layer_addr_s {
|
|
||||||
/* Length of the transport layer address buffer in bits. NGAP layer received a
|
|
||||||
* bit string<1..160> containing one of the following addresses: ipv4,
|
|
||||||
* ipv6, or ipv4 and ipv6. The layer doesn't interpret the buffer but
|
|
||||||
* silently forward it to NG-U.
|
|
||||||
*/
|
|
||||||
uint8_t pdu_session_type;
|
|
||||||
uint8_t length;
|
|
||||||
uint8_t buffer[20]; // in network byte order
|
|
||||||
} ngap_transport_layer_addr_t;
|
|
||||||
|
|
||||||
typedef struct pdusession_s {
|
typedef struct pdusession_s {
|
||||||
/* Unique pdusession_id for the UE. */
|
/* Unique pdusession_id for the UE. */
|
||||||
int pdusession_id;
|
int pdusession_id;
|
||||||
@@ -283,11 +272,16 @@ typedef struct pdusession_s {
|
|||||||
/* Quality of service for this pdusession */
|
/* Quality of service for this pdusession */
|
||||||
pdusession_level_qos_parameter_t qos[QOSFLOW_MAX_VALUE];
|
pdusession_level_qos_parameter_t qos[QOSFLOW_MAX_VALUE];
|
||||||
/* The transport layer address for the IP packets */
|
/* The transport layer address for the IP packets */
|
||||||
ngap_transport_layer_addr_t upf_addr;
|
pdu_session_type_t pdu_session_type;
|
||||||
|
transport_layer_addr_t upf_addr;
|
||||||
/* S-GW Tunnel endpoint identifier */
|
/* S-GW Tunnel endpoint identifier */
|
||||||
uint32_t gtp_teid;
|
uint32_t gtp_teid;
|
||||||
/* Stores the DRB ID of the DRBs used by this PDU Session */
|
/* Stores the DRB ID of the DRBs used by this PDU Session */
|
||||||
uint8_t used_drbs[NGAP_MAX_DRBS_PER_UE];
|
uint8_t used_drbs[NGAP_MAX_DRBS_PER_UE];
|
||||||
|
uint32_t gNB_teid_N3;
|
||||||
|
transport_layer_addr_t gNB_addr_N3;
|
||||||
|
uint32_t UPF_teid_N3;
|
||||||
|
transport_layer_addr_t UPF_addr_N3;
|
||||||
} pdusession_t;
|
} pdusession_t;
|
||||||
|
|
||||||
typedef enum pdusession_qosflow_mapping_ind_e{
|
typedef enum pdusession_qosflow_mapping_ind_e{
|
||||||
@@ -306,7 +300,8 @@ typedef struct pdusession_setup_s {
|
|||||||
uint8_t pdusession_id;
|
uint8_t pdusession_id;
|
||||||
|
|
||||||
/* The transport layer address for the IP packets */
|
/* The transport layer address for the IP packets */
|
||||||
ngap_transport_layer_addr_t gNB_addr;
|
uint8_t pdu_session_type;
|
||||||
|
transport_layer_addr_t gNB_addr;
|
||||||
|
|
||||||
/* UPF Tunnel endpoint identifier */
|
/* UPF Tunnel endpoint identifier */
|
||||||
uint32_t gtp_teid;
|
uint32_t gtp_teid;
|
||||||
@@ -323,7 +318,8 @@ typedef struct pdusession_tobeswitched_s {
|
|||||||
uint8_t pdusession_id;
|
uint8_t pdusession_id;
|
||||||
|
|
||||||
/* The transport layer address for the IP packets */
|
/* The transport layer address for the IP packets */
|
||||||
ngap_transport_layer_addr_t upf_addr;
|
uint8_t pdu_session_type;
|
||||||
|
transport_layer_addr_t upf_addr;
|
||||||
|
|
||||||
/* S-GW Tunnel endpoint identifier */
|
/* S-GW Tunnel endpoint identifier */
|
||||||
uint32_t gtp_teid;
|
uint32_t gtp_teid;
|
||||||
|
|||||||
@@ -3808,7 +3808,6 @@ do_RRCConnectionReestablishment(
|
|||||||
LTE_DL_CCCH_Message_t dl_ccch_msg;
|
LTE_DL_CCCH_Message_t dl_ccch_msg;
|
||||||
LTE_RRCConnectionReestablishment_t *rrcConnectionReestablishment = NULL;
|
LTE_RRCConnectionReestablishment_t *rrcConnectionReestablishment = NULL;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
ue_context_pP->ue_context.reestablishment_xid = Transaction_id;
|
|
||||||
LTE_SRB_ToAddModList_t **SRB_configList2 = NULL;
|
LTE_SRB_ToAddModList_t **SRB_configList2 = NULL;
|
||||||
SRB_configList2 = &ue_context_pP->ue_context.SRB_configList2[Transaction_id];
|
SRB_configList2 = &ue_context_pP->ue_context.SRB_configList2[Transaction_id];
|
||||||
|
|
||||||
|
|||||||
@@ -1139,7 +1139,6 @@ int do_RRCReestablishment(const protocol_ctxt_t *const ctxt_pP,
|
|||||||
struct NR_SRB_ToAddMod *SRB2_config = NULL;
|
struct NR_SRB_ToAddMod *SRB2_config = NULL;
|
||||||
NR_DL_DCCH_Message_t dl_dcch_msg = {0};
|
NR_DL_DCCH_Message_t dl_dcch_msg = {0};
|
||||||
NR_RRCReestablishment_t *rrcReestablishment = NULL;
|
NR_RRCReestablishment_t *rrcReestablishment = NULL;
|
||||||
ue_context_pP->ue_context.reestablishment_xid = Transaction_id;
|
|
||||||
NR_SRB_ToAddModList_t **SRB_configList2 = NULL;
|
NR_SRB_ToAddModList_t **SRB_configList2 = NULL;
|
||||||
SRB_configList2 = &ue_context_pP->ue_context.SRB_configList2[Transaction_id];
|
SRB_configList2 = &ue_context_pP->ue_context.SRB_configList2[Transaction_id];
|
||||||
|
|
||||||
|
|||||||
@@ -179,13 +179,14 @@ static NR_SRB_ToAddModList_t **generateSRB2_confList(gNB_RRC_UE_t *ue, NR_SRB_To
|
|||||||
|
|
||||||
return SRB_configList2;
|
return SRB_configList2;
|
||||||
}
|
}
|
||||||
static void cucp_cuup_bearer_context_setup_direct(e1ap_bearer_setup_req_t *const req, instance_t instance) {
|
static void cucp_cuup_bearer_context_setup_direct(e1ap_bearer_setup_req_t *const req, instance_t instance, uint8_t xid)
|
||||||
|
{
|
||||||
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);
|
fill_DRB_configList(&ctxt, ue_context_p, xid);
|
||||||
|
|
||||||
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
|
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
|
||||||
// Fixme: xid not random, but almost!
|
// Fixme: xid not random, but almost!
|
||||||
@@ -208,7 +209,7 @@ static void cucp_cuup_bearer_context_setup_direct(e1ap_bearer_setup_req_t *const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cucp_cuup_bearer_context_mod_direct(e1ap_bearer_setup_req_t *const req, instance_t instance) {
|
static void cucp_cuup_bearer_context_mod_direct(e1ap_bearer_setup_req_t *const req, instance_t instance, uint8_t xid) {
|
||||||
instance_t gtpInst = getCxt(CUtype, instance)->gtpInst;
|
instance_t gtpInst = getCxt(CUtype, instance)->gtpInst;
|
||||||
CU_update_UP_DL_tunnel(req, gtpInst, req->rnti);
|
CU_update_UP_DL_tunnel(req, gtpInst, req->rnti);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,12 +35,13 @@
|
|||||||
|
|
||||||
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, uint8_t xid)
|
||||||
|
{
|
||||||
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);
|
||||||
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);
|
||||||
|
|
||||||
fill_DRB_configList(&ctxt, ue_context_p);
|
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));
|
||||||
@@ -48,7 +49,8 @@ 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) {
|
static void cucp_cuup_bearer_context_mod_e1ap(e1ap_bearer_setup_req_t *const req, instance_t instance, uint8_t xid)
|
||||||
|
{
|
||||||
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);
|
||||||
memcpy(req_msg, req, sizeof(*req));
|
memcpy(req_msg, req, sizeof(*req));
|
||||||
|
|||||||
@@ -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);
|
typedef void (*cucp_cuup_bearer_context_setup_func_t)(struct e1ap_bearer_setup_req_s *const req, instance_t instance, uint8_t xid);
|
||||||
|
|
||||||
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);
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ typedef enum UE_STATE_NR_e {
|
|||||||
#define NO_SECURITY_MODE 0x20
|
#define NO_SECURITY_MODE 0x20
|
||||||
|
|
||||||
/* TS 36.331: RRC-TransactionIdentifier ::= INTEGER (0..3) */
|
/* TS 36.331: RRC-TransactionIdentifier ::= INTEGER (0..3) */
|
||||||
#define NR_RRC_TRANSACTION_IDENTIFIER_NUMBER 3
|
#define NR_RRC_TRANSACTION_IDENTIFIER_NUMBER 4
|
||||||
|
|
||||||
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 */
|
||||||
@@ -260,12 +260,13 @@ typedef enum pdu_session_satus_e {
|
|||||||
PDU_SESSION_STATUS_REESTABLISHED, // after HO
|
PDU_SESSION_STATUS_REESTABLISHED, // after HO
|
||||||
PDU_SESSION_STATUS_TOMODIFY, // ENDC NSA
|
PDU_SESSION_STATUS_TOMODIFY, // ENDC NSA
|
||||||
PDU_SESSION_STATUS_FAILED,
|
PDU_SESSION_STATUS_FAILED,
|
||||||
PDU_SESSION_STATUS_TORELEASE // to release DRB between eNB and UE
|
PDU_SESSION_STATUS_TORELEASE, // to release DRB between eNB and UE
|
||||||
|
PDU_SESSION_STATUS_RELEASED
|
||||||
} pdu_session_status_t;
|
} pdu_session_status_t;
|
||||||
|
|
||||||
typedef struct pdu_session_param_s {
|
typedef struct pdu_session_param_s {
|
||||||
pdusession_t param;
|
pdusession_t param;
|
||||||
uint8_t status;
|
pdu_session_status_t status;
|
||||||
uint8_t xid; // transaction_id
|
uint8_t xid; // transaction_id
|
||||||
ngap_Cause_t cause;
|
ngap_Cause_t cause;
|
||||||
uint8_t cause_value;
|
uint8_t cause_value;
|
||||||
@@ -305,6 +306,19 @@ typedef struct drb_s {
|
|||||||
} pdcp_config;
|
} pdcp_config;
|
||||||
} drb_t;
|
} drb_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
RRC_FIRST_RECONF,
|
||||||
|
RRC_SETUP,
|
||||||
|
RRC_SETUP_FOR_REESTABLISHMENT,
|
||||||
|
RRC_REESTABLISH,
|
||||||
|
RRC_REESTABLISH_COMPLETE,
|
||||||
|
RRC_DEFAULT_RECONF,
|
||||||
|
RRC_DEDICATED_RECONF,
|
||||||
|
RRC_PDUSESSION_ESTABLISH,
|
||||||
|
RRC_PDUSESSION_MODIFY,
|
||||||
|
RRC_PDUSESSION_RELEASE
|
||||||
|
} rrc_action_t;
|
||||||
|
|
||||||
typedef struct gNB_RRC_UE_s {
|
typedef struct gNB_RRC_UE_s {
|
||||||
uint8_t primaryCC_id;
|
uint8_t primaryCC_id;
|
||||||
NR_SRB_ToAddModList_t *SRB_configList;
|
NR_SRB_ToAddModList_t *SRB_configList;
|
||||||
@@ -369,38 +383,20 @@ typedef struct gNB_RRC_UE_s {
|
|||||||
nr_rrc_guami_t ue_guami;
|
nr_rrc_guami_t ue_guami;
|
||||||
|
|
||||||
ngap_security_capabilities_t security_capabilities;
|
ngap_security_capabilities_t security_capabilities;
|
||||||
|
//NSA block
|
||||||
/* Total number of e_rab already setup in the list */
|
/* Number of NSA e_rab */
|
||||||
uint8_t setup_e_rabs;
|
|
||||||
/* Number of e_rab to be setup in the list */
|
|
||||||
uint8_t nb_of_e_rabs;
|
uint8_t nb_of_e_rabs;
|
||||||
/* Number of e_rab to be modified in the list */
|
|
||||||
uint8_t nb_of_modify_e_rabs;
|
|
||||||
uint8_t nb_of_failed_e_rabs;
|
|
||||||
nr_e_rab_param_t modify_e_rab[NB_RB_MAX];//[S1AP_MAX_E_RAB];
|
|
||||||
/* Number of pdu session managed for the ue */
|
|
||||||
uint8_t nb_of_pdusessions;
|
|
||||||
/* Number of e_rab to be modified in the list */
|
|
||||||
uint8_t nb_of_modify_pdusessions;
|
|
||||||
uint8_t nb_of_failed_pdusessions;
|
|
||||||
rrc_pdu_session_param_t modify_pdusession[NR_NB_RB_MAX];
|
|
||||||
/* list of e_rab to be setup by RRC layers */
|
|
||||||
/* list of pdu session to be setup by RRC layers */
|
/* list of pdu session to be setup by RRC layers */
|
||||||
nr_e_rab_param_t e_rab[NB_RB_MAX];//[S1AP_MAX_E_RAB];
|
nr_e_rab_param_t e_rab[NB_RB_MAX];//[S1AP_MAX_E_RAB];
|
||||||
rrc_pdu_session_param_t pduSession[NGAP_MAX_PDU_SESSION];
|
uint32_t nsa_gtp_teid[S1AP_MAX_E_RAB];
|
||||||
//release e_rabs
|
transport_layer_addr_t nsa_gtp_addrs[S1AP_MAX_E_RAB];
|
||||||
uint8_t nb_release_of_e_rabs;
|
rb_id_t nsa_gtp_ebi[S1AP_MAX_E_RAB];
|
||||||
e_rab_failed_t e_rabs_release_failed[S1AP_MAX_E_RAB];
|
rb_id_t nsa_gtp_psi[S1AP_MAX_E_RAB];
|
||||||
uint8_t nb_release_of_pdusessions;
|
|
||||||
pdusession_failed_t pdusessions_release_failed[NGAP_MAX_PDUSESSION];
|
|
||||||
// LG: For GTPV1 TUNNELS
|
|
||||||
uint32_t gnb_gtp_teid[S1AP_MAX_E_RAB];
|
|
||||||
transport_layer_addr_t gnb_gtp_addrs[S1AP_MAX_E_RAB];
|
|
||||||
rb_id_t gnb_gtp_ebi[S1AP_MAX_E_RAB];
|
|
||||||
rb_id_t gnb_gtp_psi[S1AP_MAX_E_RAB];
|
|
||||||
//GTPV1 F1-U TUNNELS
|
|
||||||
uint32_t incoming_teid[S1AP_MAX_E_RAB];
|
|
||||||
|
|
||||||
|
//SA block
|
||||||
|
int nb_of_pdusessions;
|
||||||
|
rrc_pdu_session_param_t pduSession[NGAP_MAX_PDU_SESSION];
|
||||||
|
rrc_action_t xids[NR_RRC_TRANSACTION_IDENTIFIER_NUMBER];
|
||||||
uint32_t ul_failure_timer;
|
uint32_t ul_failure_timer;
|
||||||
uint32_t ue_release_timer;
|
uint32_t ue_release_timer;
|
||||||
uint32_t ue_release_timer_thres;
|
uint32_t ue_release_timer_thres;
|
||||||
@@ -413,10 +409,7 @@ typedef struct gNB_RRC_UE_s {
|
|||||||
uint32_t ue_reestablishment_timer;
|
uint32_t ue_reestablishment_timer;
|
||||||
uint32_t ue_reestablishment_timer_thres;
|
uint32_t ue_reestablishment_timer_thres;
|
||||||
uint8_t e_rab_release_command_flag;
|
uint8_t e_rab_release_command_flag;
|
||||||
uint8_t pdu_session_release_command_flag;
|
|
||||||
uint8_t established_pdu_sessions_flag;
|
|
||||||
uint32_t ue_rrc_inactivity_timer;
|
uint32_t ue_rrc_inactivity_timer;
|
||||||
int8_t reestablishment_xid;
|
|
||||||
uint32_t ue_reestablishment_counter;
|
uint32_t ue_reestablishment_counter;
|
||||||
uint32_t ue_reconfiguration_after_reestablishment_counter;
|
uint32_t ue_reconfiguration_after_reestablishment_counter;
|
||||||
NR_CellGroupId_t cellGroupId;
|
NR_CellGroupId_t cellGroupId;
|
||||||
|
|||||||
@@ -164,8 +164,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,
|
void fill_DRB_configList(const protocol_ctxt_t *const ctxt_pP, rrc_gNB_ue_context_t *ue_context_pP, uint8_t xid);
|
||||||
rrc_gNB_ue_context_t *ue_context_pP);
|
|
||||||
|
|
||||||
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);
|
||||||
|
|||||||
+353
-407
File diff suppressed because it is too large
Load Diff
@@ -58,14 +58,14 @@ int rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP(const protocol_ctxt_t *const ctxt_
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
for (int i = 0; i < create_tunnel_resp_pP->num_tunnels; i++) {
|
for (int i = 0; i < create_tunnel_resp_pP->num_tunnels; i++) {
|
||||||
ue_context_p->ue_context.gnb_gtp_teid[inde_list[i]] = create_tunnel_resp_pP->enb_S1u_teid[i];
|
ue_context_p->ue_context.nsa_gtp_teid[inde_list[i]] = create_tunnel_resp_pP->enb_S1u_teid[i];
|
||||||
ue_context_p->ue_context.gnb_gtp_addrs[inde_list[i]] = create_tunnel_resp_pP->enb_addr;
|
ue_context_p->ue_context.nsa_gtp_addrs[inde_list[i]] = create_tunnel_resp_pP->enb_addr;
|
||||||
ue_context_p->ue_context.gnb_gtp_ebi[inde_list[i]] = create_tunnel_resp_pP->eps_bearer_id[i];
|
ue_context_p->ue_context.nsa_gtp_ebi[inde_list[i]] = create_tunnel_resp_pP->eps_bearer_id[i];
|
||||||
LOG_I(RRC,
|
LOG_I(RRC,
|
||||||
PROTOCOL_RRC_CTXT_UE_FMT " rrc_eNB_process_GTPV1U_CREATE_TUNNEL_RESP tunnel (%u, %u) bearer UE context index %u, msg index %u, id %u, gtp addr len %d \n",
|
PROTOCOL_RRC_CTXT_UE_FMT " rrc_eNB_process_GTPV1U_CREATE_TUNNEL_RESP tunnel (%u, %u) bearer UE context index %u, msg index %u, id %u, gtp addr len %d \n",
|
||||||
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),
|
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),
|
||||||
create_tunnel_resp_pP->enb_S1u_teid[i],
|
create_tunnel_resp_pP->enb_S1u_teid[i],
|
||||||
ue_context_p->ue_context.gnb_gtp_teid[inde_list[i]],
|
ue_context_p->ue_context.nsa_gtp_teid[inde_list[i]],
|
||||||
inde_list[i],
|
inde_list[i],
|
||||||
i,
|
i,
|
||||||
create_tunnel_resp_pP->eps_bearer_id[i],
|
create_tunnel_resp_pP->eps_bearer_id[i],
|
||||||
@@ -90,14 +90,14 @@ int nr_rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP(const protocol_ctxt_t *const ct
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < create_tunnel_resp_pP->num_tunnels; i++) {
|
for (int i = 0; i < create_tunnel_resp_pP->num_tunnels; i++) {
|
||||||
ue_context_p->ue_context.gnb_gtp_teid[i + offset] = create_tunnel_resp_pP->gnb_NGu_teid[i];
|
ue_context_p->ue_context.pduSession[i + offset].param.gNB_teid_N3 = create_tunnel_resp_pP->gnb_NGu_teid[i];
|
||||||
ue_context_p->ue_context.gnb_gtp_addrs[i + offset] = create_tunnel_resp_pP->gnb_addr;
|
ue_context_p->ue_context.pduSession[i + offset].param.gNB_addr_N3 = create_tunnel_resp_pP->gnb_addr;
|
||||||
ue_context_p->ue_context.gnb_gtp_psi[i + offset] = create_tunnel_resp_pP->pdusession_id[i];
|
AssertFatal(ue_context_p->ue_context.pduSession[i + offset].param.pdusession_id == create_tunnel_resp_pP->pdusession_id[i], "");
|
||||||
LOG_I(NR_RRC,
|
LOG_I(NR_RRC,
|
||||||
PROTOCOL_NR_RRC_CTXT_UE_FMT " nr_rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP tunnel (%u, %u) bearer UE context index %u, id %u, gtp addr len %d \n",
|
PROTOCOL_NR_RRC_CTXT_UE_FMT
|
||||||
|
" nr_rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP tunnel (%u) bearer UE context index %u, id %u, gtp addr len %d \n",
|
||||||
PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),
|
PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),
|
||||||
create_tunnel_resp_pP->gnb_NGu_teid[i],
|
create_tunnel_resp_pP->gnb_NGu_teid[i],
|
||||||
ue_context_p->ue_context.gnb_gtp_teid[i + offset],
|
|
||||||
i,
|
i,
|
||||||
create_tunnel_resp_pP->pdusession_id[i],
|
create_tunnel_resp_pP->pdusession_id[i],
|
||||||
create_tunnel_resp_pP->gnb_addr.length);
|
create_tunnel_resp_pP->gnb_addr.length);
|
||||||
|
|||||||
+100
-133
@@ -319,7 +319,8 @@ static int decodePDUSessionResourceSetup(pdusession_t *session)
|
|||||||
|
|
||||||
/* mandatory PDUSessionType */
|
/* mandatory PDUSessionType */
|
||||||
case NGAP_ProtocolIE_ID_id_PDUSessionType:
|
case NGAP_ProtocolIE_ID_id_PDUSessionType:
|
||||||
session->upf_addr.pdu_session_type = (uint8_t)pdusessionTransfer_ies->value.choice.PDUSessionType;
|
session->pdu_session_type = (uint8_t)pdusessionTransfer_ies->value.choice.PDUSessionType;
|
||||||
|
AssertFatal(session->pdu_session_type == PDUSessionType_ipv4, "To be developped: support not IPv4 sessions\n");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* optional SecurityIndication */
|
/* optional SecurityIndication */
|
||||||
@@ -405,7 +406,6 @@ int rrc_gNB_process_NGAP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, instance_t
|
|||||||
}
|
}
|
||||||
|
|
||||||
nr_rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP(&ctxt, &create_tunnel_resp, 0);
|
nr_rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP(&ctxt, &create_tunnel_resp, 0);
|
||||||
UE->established_pdu_sessions_flag = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* NAS PDU */
|
/* NAS PDU */
|
||||||
@@ -448,9 +448,11 @@ void rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_RESP(const protocol_ctxt_t *const c
|
|||||||
if (session->status == PDU_SESSION_STATUS_DONE) {
|
if (session->status == PDU_SESSION_STATUS_DONE) {
|
||||||
pdu_sessions_done++;
|
pdu_sessions_done++;
|
||||||
resp->pdusessions[pdusession].pdusession_id = session->param.pdusession_id;
|
resp->pdusessions[pdusession].pdusession_id = session->param.pdusession_id;
|
||||||
resp->pdusessions[pdusession].gtp_teid = UE->gnb_gtp_teid[pdusession];
|
resp->pdusessions[pdusession].gtp_teid = session->param.gNB_teid_N3;
|
||||||
memcpy(resp->pdusessions[pdusession].gNB_addr.buffer, UE->gnb_gtp_addrs[pdusession].buffer, 20);
|
memcpy(resp->pdusessions[pdusession].gNB_addr.buffer,
|
||||||
resp->pdusessions[pdusession].gNB_addr.length = 4;
|
session->param.gNB_addr_N3.buffer,
|
||||||
|
sizeof(resp->pdusessions[pdusession].gNB_addr.buffer));
|
||||||
|
resp->pdusessions[pdusession].gNB_addr.length = 4; // Fixme: IPv4 hard coded here
|
||||||
resp->pdusessions[pdusession].nb_of_qos_flow = session->param.nb_qos;
|
resp->pdusessions[pdusession].nb_of_qos_flow = session->param.nb_qos;
|
||||||
for (int qos_flow_index = 0; qos_flow_index < session->param.nb_qos; qos_flow_index++) {
|
for (int qos_flow_index = 0; qos_flow_index < session->param.nb_qos; qos_flow_index++) {
|
||||||
resp->pdusessions[pdusession].associated_qos_flows[qos_flow_index].qfi = session->param.qos[qos_flow_index].qfi;
|
resp->pdusessions[pdusession].associated_qos_flows[qos_flow_index].qfi = session->param.qos[qos_flow_index].qfi;
|
||||||
@@ -679,10 +681,10 @@ rrc_gNB_send_NGAP_PDUSESSION_SETUP_RESP(
|
|||||||
pdusession_setup_t *tmp = &resp->pdusessions[pdu_sessions_done];
|
pdusession_setup_t *tmp = &resp->pdusessions[pdu_sessions_done];
|
||||||
tmp->pdusession_id = session->param.pdusession_id;
|
tmp->pdusession_id = session->param.pdusession_id;
|
||||||
tmp->nb_of_qos_flow = session->param.nb_qos;
|
tmp->nb_of_qos_flow = session->param.nb_qos;
|
||||||
tmp->gtp_teid = UE->gnb_gtp_teid[pdusession];
|
tmp->gtp_teid = session->param.gNB_teid_N3;
|
||||||
tmp->gNB_addr.pdu_session_type = PDUSessionType_ipv4;
|
tmp->pdu_session_type = session->param.pdu_session_type; // FixMe: IPv4 hardcoded here
|
||||||
tmp->gNB_addr.length = UE->gnb_gtp_addrs[pdusession].length;
|
tmp->gNB_addr.length = session->param.gNB_addr_N3.length;
|
||||||
memcpy(tmp->gNB_addr.buffer, UE->gnb_gtp_addrs[pdusession].buffer, tmp->gNB_addr.length);
|
memcpy(tmp->gNB_addr.buffer, session->param.gNB_addr_N3.buffer, tmp->gNB_addr.length);
|
||||||
for (int qos_flow_index = 0; qos_flow_index < tmp->nb_of_qos_flow; qos_flow_index++) {
|
for (int qos_flow_index = 0; qos_flow_index < tmp->nb_of_qos_flow; qos_flow_index++) {
|
||||||
tmp->associated_qos_flows[qos_flow_index].qfi = session->param.qos[qos_flow_index].qfi;
|
tmp->associated_qos_flows[qos_flow_index].qfi = session->param.qos[qos_flow_index].qfi;
|
||||||
tmp->associated_qos_flows[qos_flow_index].qos_flow_mapping_ind = QOSFLOW_MAPPING_INDICATION_DL;
|
tmp->associated_qos_flows[qos_flow_index].qos_flow_mapping_ind = QOSFLOW_MAPPING_INDICATION_DL;
|
||||||
@@ -729,15 +731,13 @@ rrc_gNB_send_NGAP_PDUSESSION_SETUP_RESP(
|
|||||||
void rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(MessageDef *msg_p, instance_t instance)
|
void rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(MessageDef *msg_p, instance_t instance)
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
{
|
{
|
||||||
gNB_RRC_INST *rrc;
|
|
||||||
rrc_gNB_ue_context_t *ue_context_p = NULL;
|
|
||||||
protocol_ctxt_t ctxt={0};
|
protocol_ctxt_t ctxt={0};
|
||||||
|
|
||||||
ngap_pdusession_setup_req_t* msg=&NGAP_PDUSESSION_SETUP_REQ(msg_p);
|
ngap_pdusession_setup_req_t* msg=&NGAP_PDUSESSION_SETUP_REQ(msg_p);
|
||||||
ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[instance], msg->gNB_ue_ngap_id);
|
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[instance], msg->gNB_ue_ngap_id);
|
||||||
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
||||||
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);
|
||||||
rrc = RC.nrrrc[ctxt.module_id];
|
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
|
||||||
LOG_I(NR_RRC, "[gNB %ld] gNB_ue_ngap_id %u \n", instance, msg->gNB_ue_ngap_id);
|
LOG_I(NR_RRC, "[gNB %ld] gNB_ue_ngap_id %u \n", instance, msg->gNB_ue_ngap_id);
|
||||||
|
|
||||||
if (ue_context_p == NULL) {
|
if (ue_context_p == NULL) {
|
||||||
@@ -759,6 +759,7 @@ void rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(MessageDef *msg_p, instance_t ins
|
|||||||
pdusession_t *session = &pduSession->param;
|
pdusession_t *session = &pduSession->param;
|
||||||
LOG_I(NR_RRC, "Adding pdusession %d, total nb of sessions %d\n", session->pdusession_id, UE->nb_of_pdusessions);
|
LOG_I(NR_RRC, "Adding pdusession %d, total nb of sessions %d\n", session->pdusession_id, UE->nb_of_pdusessions);
|
||||||
session->pdusession_id = msg->pdusession_setup_params[i].pdusession_id;
|
session->pdusession_id = msg->pdusession_setup_params[i].pdusession_id;
|
||||||
|
session->pdu_session_type = msg->pdusession_setup_params[i].pdu_session_type;
|
||||||
session->nas_pdu = msg->pdusession_setup_params[i].nas_pdu;
|
session->nas_pdu = msg->pdusession_setup_params[i].nas_pdu;
|
||||||
session->pdusessionTransfer = msg->pdusession_setup_params[i].pdusessionTransfer;
|
session->pdusessionTransfer = msg->pdusession_setup_params[i].pdusessionTransfer;
|
||||||
decodePDUSessionResourceSetup(session);
|
decodePDUSessionResourceSetup(session);
|
||||||
@@ -818,7 +819,9 @@ void rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(MessageDef *msg_p, instance_t ins
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rrc->cucp_cuup.bearer_context_setup(&bearer_req, instance);
|
int xid = rrc_gNB_get_next_transaction_identifier(instance);
|
||||||
|
UE->xids[xid] = RRC_PDUSESSION_ESTABLISH;
|
||||||
|
rrc->cucp_cuup.bearer_context_setup(&bearer_req, instance, xid);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -929,50 +932,46 @@ int rrc_gNB_process_NGAP_PDUSESSION_MODIFY_REQ(MessageDef *msg_p, instance_t ins
|
|||||||
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
||||||
PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, GNB_FLAG_YES, UE->rnti, 0, 0);
|
PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, GNB_FLAG_YES, UE->rnti, 0, 0);
|
||||||
ctxt.eNB_index = 0;
|
ctxt.eNB_index = 0;
|
||||||
uint8_t nb_of_failed_pdusessions = 0;
|
bool all_failed = true;
|
||||||
|
|
||||||
for (int i = 0; i < req->nb_pdusessions_tomodify; i++) {
|
for (int i = 0; i < req->nb_pdusessions_tomodify; i++) {
|
||||||
int j;
|
rrc_pdu_session_param_t *sess;
|
||||||
for (j = 0; j < UE->nb_of_pdusessions; j++)
|
const pdusession_t *sessMod = req->pdusession_modify_params + i;
|
||||||
if (UE->modify_pdusession[j].param.pdusession_id == req->pdusession_modify_params[j].pdusession_id)
|
for (sess = UE->pduSession; sess < UE->pduSession + UE->nb_of_pdusessions; sess++)
|
||||||
|
if (sess->param.pdusession_id == sessMod->pdusession_id)
|
||||||
break;
|
break;
|
||||||
if (j == UE->nb_of_pdusessions) {
|
if (sess == UE->pduSession + UE->nb_of_pdusessions) {
|
||||||
LOG_W(NR_RRC, "To finish, modify a not existing pdu session\n");
|
LOG_W(NR_RRC, "Requested modification of non-existing PDU session, refusing modification\n");
|
||||||
// handle multiple pdu session id
|
UE->nb_of_pdusessions++;
|
||||||
LOG_D(NR_RRC, "handle multiple pdu session id \n");
|
sess->status = PDU_SESSION_STATUS_FAILED;
|
||||||
UE->modify_pdusession[j].status = PDU_SESSION_STATUS_NEW;
|
sess->param.pdusession_id = sessMod->pdusession_id;
|
||||||
UE->modify_pdusession[j].param.pdusession_id = req->pdusession_modify_params[j].pdusession_id;
|
sess->cause = NGAP_CAUSE_RADIO_NETWORK;
|
||||||
UE->modify_pdusession[j].cause = NGAP_CAUSE_RADIO_NETWORK;
|
UE->pduSession[i].cause_value = NGAP_CauseRadioNetwork_unknown_PDU_session_ID;
|
||||||
UE->modify_pdusession[i].cause_value = NGAP_CauseRadioNetwork_unknown_PDU_session_ID;
|
|
||||||
nb_of_failed_pdusessions++;
|
|
||||||
} else {
|
} else {
|
||||||
UE->modify_pdusession[j].status = PDU_SESSION_STATUS_NEW;
|
all_failed = false;
|
||||||
UE->modify_pdusession[j].param.pdusession_id = req->pdusession_modify_params[i].pdusession_id;
|
sess->status = PDU_SESSION_STATUS_NEW;
|
||||||
UE->modify_pdusession[j].cause = NGAP_CAUSE_RADIO_NETWORK;
|
sess->param.pdusession_id = sessMod->pdusession_id;
|
||||||
UE->modify_pdusession[j].cause_value = NGAP_CauseRadioNetwork_multiple_PDU_session_ID_instances;
|
sess->cause = NGAP_CAUSE_RADIO_NETWORK;
|
||||||
UE->modify_pdusession[j].status = PDU_SESSION_STATUS_NEW;
|
sess->cause_value = NGAP_CauseRadioNetwork_multiple_PDU_session_ID_instances;
|
||||||
UE->modify_pdusession[j].param.pdusession_id = req->pdusession_modify_params[i].pdusession_id;
|
sess->status = PDU_SESSION_STATUS_NEW;
|
||||||
UE->modify_pdusession[j].cause = NGAP_CAUSE_NOTHING;
|
sess->param.pdusession_id = sessMod->pdusession_id;
|
||||||
if (req->pdusession_modify_params[i].nas_pdu.buffer != NULL) {
|
sess->cause = NGAP_CAUSE_NOTHING;
|
||||||
UE->modify_pdusession[i].param.nas_pdu = req->pdusession_modify_params[i].nas_pdu;
|
if (sessMod->nas_pdu.buffer != NULL) {
|
||||||
|
UE->pduSession[i].param.nas_pdu = sessMod->nas_pdu;
|
||||||
}
|
}
|
||||||
// Save new pdu session parameters, qos, upf addr, teid
|
// Save new pdu session parameters, qos, upf addr, teid
|
||||||
decodePDUSessionResourceModify(&UE->modify_pdusession[j].param, UE->modify_pdusession[i].param.pdusessionTransfer);
|
decodePDUSessionResourceModify(&sess->param, UE->pduSession[i].param.pdusessionTransfer);
|
||||||
UE->modify_pdusession[j].param.upf_addr = UE->pduSession[j].param.upf_addr;
|
sess->param.UPF_addr_N3 = sessMod->upf_addr;
|
||||||
UE->modify_pdusession[j].param.gtp_teid = UE->pduSession[j].param.gtp_teid;
|
sess->param.UPF_teid_N3 = sessMod->gtp_teid;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
UE->nb_of_modify_pdusessions = req->nb_pdusessions_tomodify - nb_of_failed_pdusessions;
|
if (!all_failed) {
|
||||||
UE->nb_of_failed_pdusessions = nb_of_failed_pdusessions;
|
|
||||||
|
|
||||||
if (UE->nb_of_failed_pdusessions < UE->nb_of_modify_pdusessions) {
|
|
||||||
LOG_D(NR_RRC, "generate RRCReconfiguration \n");
|
LOG_D(NR_RRC, "generate RRCReconfiguration \n");
|
||||||
rrc_gNB_modify_dedicatedRRCReconfiguration(&ctxt, ue_context_p);
|
rrc_gNB_modify_dedicatedRRCReconfiguration(&ctxt, ue_context_p);
|
||||||
} else { // all pdu modification failed
|
} else {
|
||||||
LOG_I(NR_RRC, "pdu session modify failed, fill NGAP_PDUSESSION_MODIFY_RESP with the pdu session information that failed to modify \n");
|
LOG_I(NR_RRC,
|
||||||
MessageDef *msg_fail_p = NULL;
|
"pdu session modify failed, fill NGAP_PDUSESSION_MODIFY_RESP with the pdu session information that failed to modify \n");
|
||||||
msg_fail_p = itti_alloc_new_message(TASK_RRC_GNB, 0, NGAP_PDUSESSION_MODIFY_RESP);
|
MessageDef *msg_fail_p = itti_alloc_new_message(TASK_RRC_GNB, 0, NGAP_PDUSESSION_MODIFY_RESP);
|
||||||
if (msg_fail_p == NULL) {
|
if (msg_fail_p == NULL) {
|
||||||
LOG_E(NR_RRC, "itti_alloc_new_message failed, msg_fail_p is NULL \n");
|
LOG_E(NR_RRC, "itti_alloc_new_message failed, msg_fail_p is NULL \n");
|
||||||
return (-1);
|
return (-1);
|
||||||
@@ -981,21 +980,16 @@ int rrc_gNB_process_NGAP_PDUSESSION_MODIFY_REQ(MessageDef *msg_p, instance_t ins
|
|||||||
msg->gNB_ue_ngap_id = req->gNB_ue_ngap_id;
|
msg->gNB_ue_ngap_id = req->gNB_ue_ngap_id;
|
||||||
msg->nb_of_pdusessions = 0;
|
msg->nb_of_pdusessions = 0;
|
||||||
|
|
||||||
for (int i = 0; i < UE->nb_of_failed_pdusessions; i++) {
|
for (int i = 0; i < UE->nb_of_pdusessions; i++) {
|
||||||
msg->pdusessions_failed[i].pdusession_id = UE->modify_pdusession[i].param.pdusession_id;
|
if (UE->pduSession[i].status == PDU_SESSION_STATUS_FAILED) {
|
||||||
msg->pdusessions_failed[i].cause = UE->modify_pdusession[i].cause;
|
msg->pdusessions_failed[i].pdusession_id = UE->pduSession[i].param.pdusession_id;
|
||||||
msg->pdusessions_failed[i].cause_value = UE->modify_pdusession[i].cause_value;
|
msg->pdusessions_failed[i].cause = UE->pduSession[i].cause;
|
||||||
|
msg->pdusessions_failed[i].cause_value = UE->pduSession[i].cause_value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
msg->nb_of_pdusessions_failed = UE->nb_of_failed_pdusessions;
|
|
||||||
itti_send_msg_to_task(TASK_NGAP, instance, msg_fail_p);
|
itti_send_msg_to_task(TASK_NGAP, instance, msg_fail_p);
|
||||||
UE->nb_of_modify_pdusessions = 0;
|
|
||||||
UE->nb_of_failed_pdusessions = 0;
|
|
||||||
memset(UE->modify_pdusession, 0, sizeof(UE->modify_pdusession));
|
|
||||||
return (0);
|
|
||||||
}
|
}
|
||||||
|
return (0);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
@@ -1022,63 +1016,63 @@ rrc_gNB_send_NGAP_PDUSESSION_MODIFY_RESP(
|
|||||||
|
|
||||||
resp->gNB_ue_ngap_id = UE->gNB_ue_ngap_id;
|
resp->gNB_ue_ngap_id = UE->gNB_ue_ngap_id;
|
||||||
|
|
||||||
for (int i = 0; i < UE->nb_of_modify_pdusessions; i++) {
|
for (int i = 0; i < UE->nb_of_pdusessions; i++) {
|
||||||
if (xid != UE->modify_pdusession[i].xid) {
|
if (xid != UE->pduSession[i].xid) {
|
||||||
LOG_W(NR_RRC, "xid does not correspond (context pdu session index %d, status %d, xid %d/%d) \n ", i, UE->modify_pdusession[i].status, xid, UE->modify_pdusession[i].xid);
|
LOG_W(NR_RRC, "xid does not correspond (context pdu session index %d, status %d, xid %d/%d) \n ", i, UE->pduSession[i].status, xid, UE->pduSession[i].xid);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (UE->modify_pdusession[i].status == PDU_SESSION_STATUS_DONE) {
|
if (UE->pduSession[i].status == PDU_SESSION_STATUS_DONE) {
|
||||||
rrc_pdu_session_param_t *pduSession = find_pduSession(UE, UE->modify_pdusession[i].param.pdusession_id, false);
|
rrc_pdu_session_param_t *pduSession = find_pduSession(UE, UE->pduSession[i].param.pdusession_id, false);
|
||||||
if (pduSession) {
|
if (pduSession) {
|
||||||
LOG_I(NR_RRC, "update pdu session %d \n", pduSession->param.pdusession_id);
|
LOG_I(NR_RRC, "update pdu session %d \n", pduSession->param.pdusession_id);
|
||||||
// Update UE->pduSession
|
// Update UE->pduSession
|
||||||
pduSession->status = PDU_SESSION_STATUS_ESTABLISHED;
|
pduSession->status = PDU_SESSION_STATUS_ESTABLISHED;
|
||||||
pduSession->cause = NGAP_CAUSE_NOTHING;
|
pduSession->cause = NGAP_CAUSE_NOTHING;
|
||||||
for (int qos_flow_index = 0; qos_flow_index < UE->modify_pdusession[i].param.nb_qos; qos_flow_index++) {
|
for (int qos_flow_index = 0; qos_flow_index < UE->pduSession[i].param.nb_qos; qos_flow_index++) {
|
||||||
pduSession->param.qos[qos_flow_index] = UE->modify_pdusession[i].param.qos[qos_flow_index];
|
pduSession->param.qos[qos_flow_index] = UE->pduSession[i].param.qos[qos_flow_index];
|
||||||
}
|
}
|
||||||
resp->pdusessions[pdu_sessions_done].pdusession_id = UE->modify_pdusession[i].param.pdusession_id;
|
resp->pdusessions[pdu_sessions_done].pdusession_id = UE->pduSession[i].param.pdusession_id;
|
||||||
for (int qos_flow_index = 0; qos_flow_index < UE->modify_pdusession[i].param.nb_qos; qos_flow_index++) {
|
for (int qos_flow_index = 0; qos_flow_index < UE->pduSession[i].param.nb_qos; qos_flow_index++) {
|
||||||
resp->pdusessions[pdu_sessions_done].qos[qos_flow_index].qfi = UE->modify_pdusession[i].param.qos[qos_flow_index].qfi;
|
resp->pdusessions[pdu_sessions_done].qos[qos_flow_index].qfi = UE->pduSession[i].param.qos[qos_flow_index].qfi;
|
||||||
}
|
}
|
||||||
resp->pdusessions[pdu_sessions_done].pdusession_id = UE->modify_pdusession[i].param.pdusession_id;
|
resp->pdusessions[pdu_sessions_done].pdusession_id = UE->pduSession[i].param.pdusession_id;
|
||||||
resp->pdusessions[pdu_sessions_done].nb_of_qos_flow = UE->modify_pdusession[i].param.nb_qos;
|
resp->pdusessions[pdu_sessions_done].nb_of_qos_flow = UE->pduSession[i].param.nb_qos;
|
||||||
LOG_I(NR_RRC,
|
LOG_I(NR_RRC,
|
||||||
"Modify Resp (msg index %d, pdu session index %d, status %d, xid %d): nb_of_modify_pdusessions %d, pdusession_id %d \n ",
|
"Modify Resp (msg index %d, pdu session index %d, status %d, xid %d): nb_of_pduSessions %d, pdusession_id %d \n ",
|
||||||
pdu_sessions_done,
|
pdu_sessions_done,
|
||||||
i,
|
i,
|
||||||
UE->modify_pdusession[i].status,
|
UE->pduSession[i].status,
|
||||||
xid,
|
xid,
|
||||||
UE->nb_of_modify_pdusessions,
|
UE->nb_of_pdusessions,
|
||||||
resp->pdusessions[pdu_sessions_done].pdusession_id);
|
resp->pdusessions[pdu_sessions_done].pdusession_id);
|
||||||
pdu_sessions_done++;
|
pdu_sessions_done++;
|
||||||
} else {
|
} else {
|
||||||
LOG_W(NR_RRC, "PDU SESSION modify of a not existing pdu session %d \n", UE->modify_pdusession[i].param.pdusession_id);
|
LOG_W(NR_RRC, "PDU SESSION modify of a not existing pdu session %d \n", UE->pduSession[i].param.pdusession_id);
|
||||||
resp->pdusessions_failed[pdu_sessions_failed].pdusession_id = UE->modify_pdusession[i].param.pdusession_id;
|
resp->pdusessions_failed[pdu_sessions_failed].pdusession_id = UE->pduSession[i].param.pdusession_id;
|
||||||
resp->pdusessions_failed[pdu_sessions_failed].cause = NGAP_CAUSE_RADIO_NETWORK;
|
resp->pdusessions_failed[pdu_sessions_failed].cause = NGAP_CAUSE_RADIO_NETWORK;
|
||||||
resp->pdusessions_failed[pdu_sessions_failed].cause_value = NGAP_CauseRadioNetwork_unknown_PDU_session_ID;
|
resp->pdusessions_failed[pdu_sessions_failed].cause_value = NGAP_CauseRadioNetwork_unknown_PDU_session_ID;
|
||||||
pdu_sessions_failed++;
|
pdu_sessions_failed++;
|
||||||
}
|
}
|
||||||
} else if ((UE->modify_pdusession[i].status == PDU_SESSION_STATUS_NEW) || (UE->modify_pdusession[i].status == PDU_SESSION_STATUS_ESTABLISHED)) {
|
} else if ((UE->pduSession[i].status == PDU_SESSION_STATUS_NEW) || (UE->pduSession[i].status == PDU_SESSION_STATUS_ESTABLISHED)) {
|
||||||
LOG_D(NR_RRC, "PDU SESSION is NEW or already ESTABLISHED\n");
|
LOG_D(NR_RRC, "PDU SESSION is NEW or already ESTABLISHED\n");
|
||||||
} else if (UE->modify_pdusession[i].status == PDU_SESSION_STATUS_FAILED) {
|
} else if (UE->pduSession[i].status == PDU_SESSION_STATUS_FAILED) {
|
||||||
resp->pdusessions_failed[pdu_sessions_failed].pdusession_id = UE->modify_pdusession[i].param.pdusession_id;
|
resp->pdusessions_failed[pdu_sessions_failed].pdusession_id = UE->pduSession[i].param.pdusession_id;
|
||||||
resp->pdusessions_failed[pdu_sessions_failed].cause = UE->modify_pdusession[i].cause;
|
resp->pdusessions_failed[pdu_sessions_failed].cause = UE->pduSession[i].cause;
|
||||||
resp->pdusessions_failed[pdu_sessions_failed].cause_value = UE->modify_pdusession[i].cause_value;
|
resp->pdusessions_failed[pdu_sessions_failed].cause_value = UE->pduSession[i].cause_value;
|
||||||
pdu_sessions_failed++;
|
pdu_sessions_failed++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
LOG_W(NR_RRC,
|
LOG_W(NR_RRC,
|
||||||
"Modify pdu session %d, unknown state %d \n ",
|
"Modify pdu session %d, unknown state %d \n ",
|
||||||
UE->modify_pdusession[i].param.pdusession_id,
|
UE->pduSession[i].param.pdusession_id,
|
||||||
UE->modify_pdusession[i].status);
|
UE->pduSession[i].status);
|
||||||
}
|
}
|
||||||
|
|
||||||
resp->nb_of_pdusessions = pdu_sessions_done;
|
resp->nb_of_pdusessions = pdu_sessions_done;
|
||||||
resp->nb_of_pdusessions_failed = pdu_sessions_failed;
|
resp->nb_of_pdusessions_failed = pdu_sessions_failed;
|
||||||
|
|
||||||
if (pdu_sessions_done > 0 || pdu_sessions_failed > 0) {
|
if (pdu_sessions_done > 0 || pdu_sessions_failed > 0) {
|
||||||
LOG_D(NR_RRC, "NGAP_PDUSESSION_MODIFY_RESP: sending the message: nb_of_pdusessions %d, total pdu session %d\n", UE->nb_of_modify_pdusessions, UE->nb_of_pdusessions);
|
LOG_D(NR_RRC, "NGAP_PDUSESSION_MODIFY_RESP: sending the message (total pdu session %d)\n", UE->nb_of_pdusessions);
|
||||||
itti_send_msg_to_task (TASK_NGAP, ctxt_pP->instance, msg_p);
|
itti_send_msg_to_task (TASK_NGAP, ctxt_pP->instance, msg_p);
|
||||||
} else {
|
} else {
|
||||||
itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p);
|
itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p);
|
||||||
@@ -1179,16 +1173,13 @@ void rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_COMPLETE(
|
|||||||
itti_send_msg_to_task(TASK_NGAP, instance, msg);
|
itti_send_msg_to_task(TASK_NGAP, instance, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void rrc_gNB_send_NGAP_UE_CAPABILITIES_IND(const protocol_ctxt_t *const ctxt_pP,
|
||||||
rrc_gNB_send_NGAP_UE_CAPABILITIES_IND(
|
|
||||||
const protocol_ctxt_t *const ctxt_pP,
|
|
||||||
rrc_gNB_ue_context_t *const ue_context_pP,
|
rrc_gNB_ue_context_t *const ue_context_pP,
|
||||||
NR_UL_DCCH_Message_t *const ul_dcch_msg
|
const NR_UECapabilityInformation_t *const ue_cap_info)
|
||||||
)
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
{
|
{
|
||||||
NR_UE_CapabilityRAT_ContainerList_t *ueCapabilityRATContainerList = ul_dcch_msg->message.choice.c1->choice.ueCapabilityInformation->criticalExtensions.choice.ueCapabilityInformation->ue_CapabilityRAT_ContainerList;
|
NR_UE_CapabilityRAT_ContainerList_t *ueCapabilityRATContainerList =
|
||||||
/* 4096 is arbitrary, should be big enough */
|
ue_cap_info->criticalExtensions.choice.ueCapabilityInformation->ue_CapabilityRAT_ContainerList;
|
||||||
void *buf;
|
void *buf;
|
||||||
NR_UERadioAccessCapabilityInformation_t rac = {0};
|
NR_UERadioAccessCapabilityInformation_t rac = {0};
|
||||||
gNB_RRC_UE_t *UE = &ue_context_pP->ue_context;
|
gNB_RRC_UE_t *UE = &ue_context_pP->ue_context;
|
||||||
@@ -1242,31 +1233,21 @@ rrc_gNB_send_NGAP_PDUSESSION_RELEASE_RESPONSE(
|
|||||||
memset(resp, 0, sizeof(*resp));
|
memset(resp, 0, sizeof(*resp));
|
||||||
resp->gNB_ue_ngap_id = UE->gNB_ue_ngap_id;
|
resp->gNB_ue_ngap_id = UE->gNB_ue_ngap_id;
|
||||||
|
|
||||||
for (int i = 0; i < NB_RB_MAX; i++) {
|
for (int i = 0; i < UE->nb_of_pdusessions; i++) {
|
||||||
if (xid == UE->pduSession[i].xid) {
|
if (xid == UE->pduSession[i].xid) {
|
||||||
resp->pdusession_release[pdu_sessions_released].pdusession_id = UE->pduSession[i].param.pdusession_id;
|
resp->pdusession_release[pdu_sessions_released].pdusession_id = UE->pduSession[i].param.pdusession_id;
|
||||||
pdu_sessions_released++;
|
pdu_sessions_released++;
|
||||||
//clear
|
//clear
|
||||||
memset(&UE->pduSession[i], 0, sizeof(*UE->pduSession));
|
memset(&UE->pduSession[i], 0, sizeof(*UE->pduSession));
|
||||||
|
UE->pduSession[i].status = PDU_SESSION_STATUS_RELEASED;
|
||||||
|
LOG_W(NR_RRC, "Released pdu session, but code to finish to free memory\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
resp->nb_of_pdusessions_released = pdu_sessions_released;
|
resp->nb_of_pdusessions_released = pdu_sessions_released;
|
||||||
resp->nb_of_pdusessions_failed = UE->nb_release_of_pdusessions;
|
resp->nb_of_pdusessions_failed = 0;
|
||||||
memcpy(resp->pdusessions_failed, UE->pdusessions_release_failed, sizeof(pdusession_failed_t) * UE->nb_release_of_pdusessions);
|
|
||||||
LOG_E(NR_RRC, "we have to pack the array!!!\n");
|
|
||||||
UE->nb_of_pdusessions -= pdu_sessions_released;
|
|
||||||
LOG_I(NR_RRC, "NGAP PDUSESSION RELEASE RESPONSE: GNB_UE_NGAP_ID %u release_pdu_sessions %d\n", resp->gNB_ue_ngap_id, pdu_sessions_released);
|
LOG_I(NR_RRC, "NGAP PDUSESSION RELEASE RESPONSE: GNB_UE_NGAP_ID %u release_pdu_sessions %d\n", resp->gNB_ue_ngap_id, pdu_sessions_released);
|
||||||
itti_send_msg_to_task (TASK_NGAP, ctxt_pP->instance, msg_p);
|
itti_send_msg_to_task (TASK_NGAP, ctxt_pP->instance, msg_p);
|
||||||
|
|
||||||
//clear xid
|
|
||||||
for(int i = 0; i < NB_RB_MAX; i++) {
|
|
||||||
UE->pduSession[i].xid = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
//clear release pdusessions
|
|
||||||
UE->nb_release_of_pdusessions = 0;
|
|
||||||
memset(UE->pdusessions_release_failed, 0, sizeof(UE->pdusessions_release_failed));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
@@ -1275,8 +1256,6 @@ int rrc_gNB_process_NGAP_PDUSESSION_RELEASE_COMMAND(MessageDef *msg_p, instance_
|
|||||||
{
|
{
|
||||||
uint32_t gNB_ue_ngap_id;
|
uint32_t gNB_ue_ngap_id;
|
||||||
protocol_ctxt_t ctxt;
|
protocol_ctxt_t ctxt;
|
||||||
uint8_t xid;
|
|
||||||
uint8_t pdusession_release_drb = 0;
|
|
||||||
ngap_pdusession_release_command_t *cmd = &NGAP_PDUSESSION_RELEASE_COMMAND(msg_p);
|
ngap_pdusession_release_command_t *cmd = &NGAP_PDUSESSION_RELEASE_COMMAND(msg_p);
|
||||||
gNB_ue_ngap_id = cmd->gNB_ue_ngap_id;
|
gNB_ue_ngap_id = cmd->gNB_ue_ngap_id;
|
||||||
if (cmd->nb_pdusessions_torelease > NGAP_MAX_PDUSESSION) {
|
if (cmd->nb_pdusessions_torelease > NGAP_MAX_PDUSESSION) {
|
||||||
@@ -1293,18 +1272,21 @@ int rrc_gNB_process_NGAP_PDUSESSION_RELEASE_COMMAND(MessageDef *msg_p, instance_
|
|||||||
LOG_I(NR_RRC, "[gNB %ld] gNB_ue_ngap_id %u \n", instance, gNB_ue_ngap_id);
|
LOG_I(NR_RRC, "[gNB %ld] gNB_ue_ngap_id %u \n", instance, gNB_ue_ngap_id);
|
||||||
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
||||||
PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, GNB_FLAG_YES, UE->rnti, 0, 0);
|
PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, GNB_FLAG_YES, UE->rnti, 0, 0);
|
||||||
xid = rrc_gNB_get_next_transaction_identifier(ctxt.module_id);
|
|
||||||
LOG_I(
|
LOG_I(
|
||||||
NR_RRC, "PDU Session Release Command: AMF_UE_NGAP_ID %lu GNB_UE_NGAP_ID %u release_pdusessions %d \n", cmd->amf_ue_ngap_id, gNB_ue_ngap_id, cmd->nb_pdusessions_torelease);
|
NR_RRC, "PDU Session Release Command: AMF_UE_NGAP_ID %lu GNB_UE_NGAP_ID %u release_pdusessions %d \n", cmd->amf_ue_ngap_id, gNB_ue_ngap_id, cmd->nb_pdusessions_torelease);
|
||||||
|
bool found = false;
|
||||||
|
uint8_t xid = rrc_gNB_get_next_transaction_identifier(ctxt.module_id);
|
||||||
|
UE->xids[xid] = RRC_PDUSESSION_RELEASE;
|
||||||
for (int pdusession = 0; pdusession < cmd->nb_pdusessions_torelease; pdusession++) {
|
for (int pdusession = 0; pdusession < cmd->nb_pdusessions_torelease; pdusession++) {
|
||||||
rrc_pdu_session_param_t *pduSession = find_pduSession(UE, cmd->pdusession_release_params[pdusession].pdusession_id, false);
|
rrc_pdu_session_param_t *pduSession = find_pduSession(UE, cmd->pdusession_release_params[pdusession].pdusession_id, false);
|
||||||
if (!pduSession) {
|
if (!pduSession) {
|
||||||
LOG_I(NR_RRC, "no pdusession_id \n");
|
LOG_I(NR_RRC, "no pdusession_id, AMF requested to close it id=%d\n", cmd->pdusession_release_params[pdusession].pdusession_id);
|
||||||
UE->pdusessions_release_failed[UE->nb_release_of_pdusessions].pdusession_id = cmd->pdusession_release_params[pdusession].pdusession_id;
|
int j=UE->nb_of_pdusessions++;
|
||||||
UE->pdusessions_release_failed[UE->nb_release_of_pdusessions].cause = NGAP_CAUSE_RADIO_NETWORK;
|
UE->pduSession[j].status = PDU_SESSION_STATUS_FAILED;
|
||||||
UE->pdusessions_release_failed[UE->nb_release_of_pdusessions].cause_value = 30;
|
UE->pduSession[j].param.pdusession_id = cmd->pdusession_release_params[pdusession].pdusession_id;
|
||||||
UE->nb_release_of_pdusessions++;
|
UE->pduSession[j].cause = NGAP_CAUSE_RADIO_NETWORK;
|
||||||
|
UE->pduSession[j].cause_value = 30;
|
||||||
|
pduSession->xid = xid;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (pduSession->status == PDU_SESSION_STATUS_FAILED) {
|
if (pduSession->status == PDU_SESSION_STATUS_FAILED) {
|
||||||
@@ -1312,37 +1294,22 @@ int rrc_gNB_process_NGAP_PDUSESSION_RELEASE_COMMAND(MessageDef *msg_p, instance_
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (pduSession->status == PDU_SESSION_STATUS_ESTABLISHED) {
|
if (pduSession->status == PDU_SESSION_STATUS_ESTABLISHED) {
|
||||||
|
found = true;
|
||||||
LOG_I(NR_RRC, "RELEASE pdusession %d \n", pduSession->param.pdusession_id);
|
LOG_I(NR_RRC, "RELEASE pdusession %d \n", pduSession->param.pdusession_id);
|
||||||
pduSession->status = PDU_SESSION_STATUS_TORELEASE;
|
pduSession->status = PDU_SESSION_STATUS_TORELEASE;
|
||||||
pduSession->xid = xid;
|
pduSession->xid = xid;
|
||||||
pdusession_release_drb++;
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
// pdusession_id status NG
|
|
||||||
UE->pdusessions_release_failed[UE->nb_release_of_pdusessions].pdusession_id = cmd->pdusession_release_params[pdusession].pdusession_id;
|
|
||||||
UE->pdusessions_release_failed[UE->nb_release_of_pdusessions].cause = NGAP_CAUSE_RADIO_NETWORK;
|
|
||||||
UE->pdusessions_release_failed[UE->nb_release_of_pdusessions].cause_value = 0;
|
|
||||||
UE->nb_release_of_pdusessions++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pdusession_release_drb > 0) {
|
if (found) {
|
||||||
// TODO RRCReconfiguration To UE
|
// TODO RRCReconfiguration To UE
|
||||||
LOG_I(NR_RRC, "Send RRCReconfiguration To UE \n");
|
LOG_I(NR_RRC, "Send RRCReconfiguration To UE \n");
|
||||||
rrc_gNB_generate_dedicatedRRCReconfiguration_release(&ctxt, ue_context_p, xid, cmd->nas_pdu.length, cmd->nas_pdu.buffer);
|
rrc_gNB_generate_dedicatedRRCReconfiguration_release(&ctxt, ue_context_p, xid, cmd->nas_pdu.length, cmd->nas_pdu.buffer);
|
||||||
} else {
|
} else {
|
||||||
// gtp tunnel delete
|
// gtp tunnel delete
|
||||||
LOG_I(NR_RRC, "gtp tunnel delete \n");
|
LOG_I(NR_RRC, "gtp tunnel delete all tunnels for UE %04x\n", UE->rnti);
|
||||||
gtpv1u_gnb_delete_tunnel_req_t req = {0};
|
gtpv1u_gnb_delete_tunnel_req_t req = {0};
|
||||||
req.ue_id = UE->rnti;
|
req.ue_id = UE->rnti;
|
||||||
|
|
||||||
for (int i = 0; i < NB_RB_MAX; i++) {
|
|
||||||
if (xid == UE->pduSession[i].xid) {
|
|
||||||
req.pdusession_id[req.num_pdusession++] = UE->gnb_gtp_psi[i];
|
|
||||||
UE->gnb_gtp_teid[i] = 0;
|
|
||||||
memset(&UE->gnb_gtp_addrs[i], 0, sizeof(UE->gnb_gtp_addrs[i]));
|
|
||||||
UE->gnb_gtp_psi[i] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
gtpv1u_delete_ngu_tunnel(instance, &req);
|
gtpv1u_delete_ngu_tunnel(instance, &req);
|
||||||
// NGAP_PDUSESSION_RELEASE_RESPONSE
|
// NGAP_PDUSESSION_RELEASE_RESPONSE
|
||||||
rrc_gNB_send_NGAP_PDUSESSION_RELEASE_RESPONSE(&ctxt, ue_context_p, xid);
|
rrc_gNB_send_NGAP_PDUSESSION_RELEASE_RESPONSE(&ctxt, ue_context_p, xid);
|
||||||
|
|||||||
@@ -96,12 +96,9 @@ int rrc_gNB_process_NGAP_UE_CONTEXT_RELEASE_COMMAND(MessageDef *msg_p, instance_
|
|||||||
|
|
||||||
void rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance, uint32_t gNB_ue_ngap_id);
|
void rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance, uint32_t gNB_ue_ngap_id);
|
||||||
|
|
||||||
void
|
void rrc_gNB_send_NGAP_UE_CAPABILITIES_IND(const protocol_ctxt_t *const ctxt_pP,
|
||||||
rrc_gNB_send_NGAP_UE_CAPABILITIES_IND(
|
|
||||||
const protocol_ctxt_t *const ctxt_pP,
|
|
||||||
rrc_gNB_ue_context_t *const ue_context_pP,
|
rrc_gNB_ue_context_t *const ue_context_pP,
|
||||||
NR_UL_DCCH_Message_t *const ul_dcch_msg
|
const NR_UECapabilityInformation_t *const ue_cap_info);
|
||||||
);
|
|
||||||
|
|
||||||
int rrc_gNB_process_NGAP_PDUSESSION_RELEASE_COMMAND(MessageDef *msg_p, instance_t instance);
|
int rrc_gNB_process_NGAP_PDUSESSION_RELEASE_COMMAND(MessageDef *msg_p, instance_t instance);
|
||||||
|
|
||||||
|
|||||||
@@ -68,11 +68,8 @@ rrc_gNB_ue_context_t *rrc_gNB_allocate_new_ue_context(gNB_RRC_INST *rrc_instance
|
|||||||
}
|
}
|
||||||
new_p->ue_context.gNB_ue_ngap_id = uid_linear_allocator_new(&rrc_instance_pP->uid_allocator);
|
new_p->ue_context.gNB_ue_ngap_id = uid_linear_allocator_new(&rrc_instance_pP->uid_allocator);
|
||||||
|
|
||||||
for(int i = 0; i < NB_RB_MAX; i++) {
|
for(int i = 0; i < NB_RB_MAX; i++)
|
||||||
new_p->ue_context.e_rab[i].xid = -1;
|
|
||||||
new_p->ue_context.pduSession[i].xid = -1;
|
new_p->ue_context.pduSession[i].xid = -1;
|
||||||
new_p->ue_context.modify_e_rab[i].xid = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG_I(NR_RRC, "Returning new RRC UE context RRC ue id: %d\n", new_p->ue_context.gNB_ue_ngap_id);
|
LOG_I(NR_RRC, "Returning new RRC UE context RRC ue id: %d\n", new_p->ue_context.gNB_ue_ngap_id);
|
||||||
return(new_p);
|
return(new_p);
|
||||||
|
|||||||
@@ -411,11 +411,11 @@ void rrc_remove_nsa_user(gNB_RRC_INST *rrc, int rnti) {
|
|||||||
tmp.from_gnb=1;
|
tmp.from_gnb=1;
|
||||||
LOG_D(RRC, "ue_context->ue_context.nb_of_e_rabs %d will be deleted for rnti %d\n", ue_context->ue_context.nb_of_e_rabs, rnti);
|
LOG_D(RRC, "ue_context->ue_context.nb_of_e_rabs %d will be deleted for rnti %d\n", ue_context->ue_context.nb_of_e_rabs, rnti);
|
||||||
for (e_rab = 0; e_rab < ue_context->ue_context.nb_of_e_rabs; e_rab++) {
|
for (e_rab = 0; e_rab < ue_context->ue_context.nb_of_e_rabs; e_rab++) {
|
||||||
tmp.eps_bearer_id[tmp.num_erab++]= ue_context->ue_context.gnb_gtp_ebi[e_rab];
|
tmp.eps_bearer_id[tmp.num_erab++]= ue_context->ue_context.nsa_gtp_ebi[e_rab];
|
||||||
// erase data
|
// erase data
|
||||||
ue_context->ue_context.gnb_gtp_teid[e_rab] = 0;
|
ue_context->ue_context.nsa_gtp_teid[e_rab] = 0;
|
||||||
memset(&ue_context->ue_context.gnb_gtp_addrs[e_rab], 0, sizeof(ue_context->ue_context.gnb_gtp_addrs[e_rab]));
|
memset(&ue_context->ue_context.nsa_gtp_addrs[e_rab], 0, sizeof(ue_context->ue_context.nsa_gtp_addrs[e_rab]));
|
||||||
ue_context->ue_context.gnb_gtp_ebi[e_rab] = 0;
|
ue_context->ue_context.nsa_gtp_ebi[e_rab] = 0;
|
||||||
}
|
}
|
||||||
gtpv1u_delete_s1u_tunnel(rrc->module_id, &tmp);
|
gtpv1u_delete_s1u_tunnel(rrc->module_id, &tmp);
|
||||||
/* remove context */
|
/* remove context */
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ static void allocCopy(OCTET_STRING_t *out, ngap_pdu_t in)
|
|||||||
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, transport_layer_addr_t in)
|
||||||
{
|
{
|
||||||
if (in.length) {
|
if (in.length) {
|
||||||
out->buf = malloc(in.length);
|
out->buf = malloc(in.length);
|
||||||
|
|||||||
@@ -762,6 +762,7 @@ int gtpv1u_create_ngu_tunnel(const instance_t instance,
|
|||||||
create_tunnel_resp->gnb_NGu_teid[i]=teid;
|
create_tunnel_resp->gnb_NGu_teid[i]=teid;
|
||||||
memcpy(create_tunnel_resp->gnb_addr.buffer,addr,sizeof(addr));
|
memcpy(create_tunnel_resp->gnb_addr.buffer,addr,sizeof(addr));
|
||||||
create_tunnel_resp->gnb_addr.length= sizeof(addr);
|
create_tunnel_resp->gnb_addr.length= sizeof(addr);
|
||||||
|
create_tunnel_resp->pdusession_id[i] = create_tunnel_req->pdusession_id[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
return !GTPNOK;
|
return !GTPNOK;
|
||||||
|
|||||||
Reference in New Issue
Block a user