From 67eadd4d5343fd9f6f201dadd3cba34604bab64a Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Mon, 12 Jun 2023 18:08:10 +0200 Subject: [PATCH] Add newGtpuDeleteOneTunnel() to remove one GTP tunnel --- openair2/F1AP/f1ap_cu_ue_context_management.c | 3 +++ openair2/F1AP/f1ap_du_ue_context_management.c | 1 + openair3/ocp-gtpu/gtp_itf.cpp | 26 +++++++++++++++++++ openair3/ocp-gtpu/gtp_itf.h | 1 + 4 files changed, 31 insertions(+) diff --git a/openair2/F1AP/f1ap_cu_ue_context_management.c b/openair2/F1AP/f1ap_cu_ue_context_management.c index 32f95333bb..1fb4981330 100644 --- a/openair2/F1AP/f1ap_cu_ue_context_management.c +++ b/openair2/F1AP/f1ap_cu_ue_context_management.c @@ -1550,6 +1550,9 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, f1ap_ue_context &drbs_toBeReleased_item_ies->value.choice.DRBs_ToBeReleased_Item; /* dRBID */ drbs_toBeReleased_item->dRBID = f1ap_ue_context_modification_req->drbs_to_be_released[i].rb_id; + newGtpuDeleteOneTunnel(getCxt(instance)->gtpInst, + f1ap_ue_context_modification_req->gNB_CU_ue_id, + f1ap_ue_context_modification_req->drbs_to_be_released[i].rb_id); } } diff --git a/openair2/F1AP/f1ap_du_ue_context_management.c b/openair2/F1AP/f1ap_du_ue_context_management.c index 74d0c702fe..b9d29303f0 100644 --- a/openair2/F1AP/f1ap_du_ue_context_management.c +++ b/openair2/F1AP/f1ap_du_ue_context_management.c @@ -895,6 +895,7 @@ int DU_handle_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, sctp_assoc_t DevAssert(tbrel->id == F1AP_ProtocolIE_ID_id_DRBs_ToBeReleased_Item); DevAssert(tbrel->value.present == F1AP_DRBs_ToBeReleased_ItemIEs__value_PR_DRBs_ToBeReleased_Item); f1ap_ue_context_modification_req->drbs_to_be_released[i].rb_id = tbrel->value.choice.DRBs_ToBeReleased_Item.dRBID; + newGtpuDeleteOneTunnel(0, f1ap_ue_context_modification_req->gNB_DU_ue_id, f1ap_ue_context_modification_req->drbs_to_be_released[i].rb_id); } } diff --git a/openair3/ocp-gtpu/gtp_itf.cpp b/openair3/ocp-gtpu/gtp_itf.cpp index b1920b6522..20e9c8c127 100644 --- a/openair3/ocp-gtpu/gtp_itf.cpp +++ b/openair3/ocp-gtpu/gtp_itf.cpp @@ -803,6 +803,32 @@ int gtpv1u_create_x2u_tunnel( AssertFatal( false, "to be developped\n"); } +int newGtpuDeleteOneTunnel(instance_t instance, ue_id_t ue_id, int rb_id) +{ + pthread_mutex_lock(&globGtp.gtp_lock); + getInstRetInt(compatInst(instance)); + map::iterator ue_it = inst->ue2te_mapping.find(ue_id); + if (ue_it == inst->ue2te_mapping.end()) { + LOG_E(GTPU, "%s() no such UE %ld\n", __func__, ue_id); + pthread_mutex_unlock(&globGtp.gtp_lock); + return !GTPNOK; + } + map::iterator rb_it = ue_it->second.bearers.find(rb_id); + if (rb_it == ue_it->second.bearers.end()) { + LOG_E(GTPU, "%s() UE %ld has no bearer %d, available\n", __func__, ue_id, rb_id); + pthread_mutex_unlock(&globGtp.gtp_lock); + return !GTPNOK; + } + int teid = rb_it->second.teid_incoming; + globGtp.te2ue_mapping.erase(teid); + ue_it->second.bearers.erase(rb_id); + pthread_mutex_unlock(&globGtp.gtp_lock); + LOG_I(GTPU, "Deleted tunnel TEID %d (RB %d) for ue id %ld, remaining bearers:\n", teid, rb_id, ue_id); + for (auto b: ue_it->second.bearers) + LOG_I(GTPU, "bearer %ld\n", b.first); + return !GTPNOK; +} + int newGtpuDeleteAllTunnels(instance_t instance, ue_id_t ue_id) { LOG_D(GTPU, "[%ld] Start delete tunnels for ue id %lu\n", instance, ue_id); diff --git a/openair3/ocp-gtpu/gtp_itf.h b/openair3/ocp-gtpu/gtp_itf.h index d57769c509..7ac025f14a 100644 --- a/openair3/ocp-gtpu/gtp_itf.h +++ b/openair3/ocp-gtpu/gtp_itf.h @@ -98,6 +98,7 @@ extern "C" { in_addr_t newOutgoingAddr, teid_t newOutgoingTeid); + int newGtpuDeleteOneTunnel(instance_t instance, ue_id_t ue_id, int rb_id); int newGtpuDeleteAllTunnels(instance_t instance, ue_id_t ue_id); int newGtpuDeleteTunnels(instance_t instance, ue_id_t ue_id, int nbTunnels, pdusessionid_t *pdusession_id); instance_t gtpv1Init(openAddr_t context);