ENDC path switch S1-U: Adding GTP-U tunnel related functionality at gNB
This commit is contained in:
@@ -93,6 +93,56 @@ rrc_eNB_process_GTPV1U_CREATE_TUNNEL_RESP(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP(
|
||||||
|
const protocol_ctxt_t *const ctxt_pP,
|
||||||
|
const gtpv1u_enb_create_tunnel_resp_t *const create_tunnel_resp_pP,
|
||||||
|
uint8_t *inde_list
|
||||||
|
) {
|
||||||
|
rnti_t rnti;
|
||||||
|
int i;
|
||||||
|
struct rrc_gNB_ue_context_s *ue_context_p = NULL;
|
||||||
|
|
||||||
|
if (create_tunnel_resp_pP) {
|
||||||
|
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);
|
||||||
|
rnti = create_tunnel_resp_pP->rnti;
|
||||||
|
ue_context_p = rrc_gNB_get_ue_context(
|
||||||
|
RC.nrrrc[ctxt_pP->module_id],
|
||||||
|
ctxt_pP->rnti);
|
||||||
|
|
||||||
|
for (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.gnb_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];
|
||||||
|
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_ARGS(ctxt_pP),
|
||||||
|
create_tunnel_resp_pP->enb_S1u_teid[i],
|
||||||
|
ue_context_p->ue_context.gnb_gtp_teid[inde_list[i]],
|
||||||
|
inde_list[i],
|
||||||
|
i,
|
||||||
|
create_tunnel_resp_pP->eps_bearer_id[i],
|
||||||
|
create_tunnel_resp_pP->enb_addr.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
MSC_LOG_RX_MESSAGE(
|
||||||
|
MSC_RRC_ENB,
|
||||||
|
MSC_GTPU_ENB,
|
||||||
|
NULL,0,
|
||||||
|
MSC_AS_TIME_FMT" CREATE_TUNNEL_RESP RNTI %"PRIx16" ntuns %u ebid %u enb-s1u teid %u",
|
||||||
|
0,0,rnti,
|
||||||
|
create_tunnel_resp_pP->num_tunnels,
|
||||||
|
ue_context_p->ue_context.gnb_gtp_ebi[0],
|
||||||
|
ue_context_p->ue_context.gnb_gtp_teid[0]);
|
||||||
|
(void)rnti; /* avoid gcc warning "set but not used" */
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
boolean_t
|
boolean_t
|
||||||
gtpv_data_req(
|
gtpv_data_req(
|
||||||
|
|||||||
@@ -43,6 +43,13 @@ rrc_eNB_process_GTPV1U_CREATE_TUNNEL_RESP(
|
|||||||
uint8_t *inde_list
|
uint8_t *inde_list
|
||||||
);
|
);
|
||||||
|
|
||||||
|
int
|
||||||
|
rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP(
|
||||||
|
const protocol_ctxt_t *const ctxt_pP,
|
||||||
|
const gtpv1u_enb_create_tunnel_resp_t *const create_tunnel_resp_pP,
|
||||||
|
uint8_t *inde_list
|
||||||
|
);
|
||||||
|
|
||||||
/*! \fn rrc_eNB_send_GTPV1U_ENB_DELETE_TUNNEL_REQ(module_id_t enb_mod_idP, const rrc_eNB_ue_context_t* const ue_context_pP)
|
/*! \fn rrc_eNB_send_GTPV1U_ENB_DELETE_TUNNEL_REQ(module_id_t enb_mod_idP, const rrc_eNB_ue_context_t* const ue_context_pP)
|
||||||
*\brief Send GTPV1U_ENB_DELETE_TUNNEL_REQ message to GTPV1U to destroy all UE-related tunnels.
|
*\brief Send GTPV1U_ENB_DELETE_TUNNEL_REQ message to GTPV1U to destroy all UE-related tunnels.
|
||||||
*\param module_id Instance ID of eNB.
|
*\param module_id Instance ID of eNB.
|
||||||
|
|||||||
@@ -326,9 +326,9 @@ typedef struct gNB_RRC_UE_s {
|
|||||||
uint8_t nb_release_of_e_rabs;
|
uint8_t nb_release_of_e_rabs;
|
||||||
e_rab_failed_t e_rabs_release_failed[S1AP_MAX_E_RAB];
|
e_rab_failed_t e_rabs_release_failed[S1AP_MAX_E_RAB];
|
||||||
// LG: For GTPV1 TUNNELS
|
// LG: For GTPV1 TUNNELS
|
||||||
uint32_t enb_gtp_teid[S1AP_MAX_E_RAB];
|
uint32_t gnb_gtp_teid[S1AP_MAX_E_RAB];
|
||||||
transport_layer_addr_t enb_gtp_addrs[S1AP_MAX_E_RAB];
|
transport_layer_addr_t gnb_gtp_addrs[S1AP_MAX_E_RAB];
|
||||||
rb_id_t enb_gtp_ebi[S1AP_MAX_E_RAB];
|
rb_id_t gnb_gtp_ebi[S1AP_MAX_E_RAB];
|
||||||
#endif
|
#endif
|
||||||
uint32_t ul_failure_timer;
|
uint32_t ul_failure_timer;
|
||||||
uint32_t ue_release_timer;
|
uint32_t ue_release_timer;
|
||||||
|
|||||||
@@ -166,12 +166,11 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
|
|||||||
ctxt.instance,
|
ctxt.instance,
|
||||||
&create_tunnel_req,
|
&create_tunnel_req,
|
||||||
&create_tunnel_resp);
|
&create_tunnel_resp);
|
||||||
rrc_eNB_process_GTPV1U_CREATE_TUNNEL_RESP(
|
rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP(
|
||||||
&ctxt,
|
&ctxt,
|
||||||
&create_tunnel_resp,
|
&create_tunnel_resp,
|
||||||
&inde_list[0]);
|
&inde_list[0]);
|
||||||
X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).nb_e_rabs_admitted_tobeadded = m->nb_e_rabs_tobeadded;
|
X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).nb_e_rabs_admitted_tobeadded = m->nb_e_rabs_tobeadded;
|
||||||
|
|
||||||
for(int i=0; i<ue_context_p->ue_context.nb_of_e_rabs; i++){
|
for(int i=0; i<ue_context_p->ue_context.nb_of_e_rabs; i++){
|
||||||
X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).e_rabs_admitted_tobeadded[i].e_rab_id = ue_context_p->ue_context.e_rab[i].param.e_rab_id;
|
X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).e_rabs_admitted_tobeadded[i].e_rab_id = ue_context_p->ue_context.e_rab[i].param.e_rab_id;
|
||||||
X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).e_rabs_admitted_tobeadded[i].gtp_teid = create_tunnel_resp.enb_S1u_teid[i];
|
X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).e_rabs_admitted_tobeadded[i].gtp_teid = create_tunnel_resp.enb_S1u_teid[i];
|
||||||
|
|||||||
Reference in New Issue
Block a user