From 21bf5c464c42bfd153ef397b9d6e91a9eb553609 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Wed, 11 Dec 2024 08:46:23 +0100 Subject: [PATCH 1/9] GTPV1U_ENB_END_MARKER_REQ: use correct message struct --- openair3/ocp-gtpu/gtp_itf.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/openair3/ocp-gtpu/gtp_itf.cpp b/openair3/ocp-gtpu/gtp_itf.cpp index b9ffea6531..8a595c8a88 100644 --- a/openair3/ocp-gtpu/gtp_itf.cpp +++ b/openair3/ocp-gtpu/gtp_itf.cpp @@ -403,9 +403,10 @@ static void gtpv1uSendDlDeliveryStatus(instance_t instance, gtpv1u_DU_buffer_rep compatInst(instance), tmp.outgoing_ip_addr, tmp.outgoing_port, GTP_GPDU, tmp.teid_outgoing, NULL, 0, false, false, 0, 0, NR_RAN_CONTAINER, extensionHeader->buffer, extensionHeader->length); } -static void gtpv1uEndTunnel(instance_t instance, gtpv1u_tunnel_data_req_t *req) { - ue_id_t ue_id=req->ue_id; - int bearer_id=req->bearer_id; +static void gtpv1uEndTunnel(instance_t instance, gtpv1u_enb_end_marker_req_t *req) +{ + ue_id_t ue_id=req->rnti; + int bearer_id=req->rab_id; pthread_mutex_lock(&globGtp.gtp_lock); getInstRetVoid(compatInst(instance)); getUeRetVoid(inst, ue_id); @@ -1305,8 +1306,8 @@ void *gtpv1uTask(void *args) { break; case GTPV1U_ENB_END_MARKER_REQ: - gtpv1uEndTunnel(compatInst(myInstance), >PV1U_TUNNEL_DATA_REQ(message_p)); - itti_free(TASK_GTPV1_U, GTPV1U_TUNNEL_DATA_REQ(message_p).buffer); + gtpv1uEndTunnel(compatInst(myInstance), >PV1U_ENB_END_MARKER_REQ(message_p)); + itti_free(TASK_GTPV1_U, GTPV1U_ENB_END_MARKER_REQ(message_p).buffer); break; case GTPV1U_ENB_DATA_FORWARDING_REQ: From cb726af80751fe57ed9a3e0d2a19deb48962d1a6 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Wed, 11 Dec 2024 08:45:40 +0100 Subject: [PATCH 2/9] GTP: Fix function name in macro --- openair3/ocp-gtpu/gtp_itf.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openair3/ocp-gtpu/gtp_itf.cpp b/openair3/ocp-gtpu/gtp_itf.cpp index 8a595c8a88..68d9a0cc3d 100644 --- a/openair3/ocp-gtpu/gtp_itf.cpp +++ b/openair3/ocp-gtpu/gtp_itf.cpp @@ -193,7 +193,7 @@ instance_t legacyInstanceMapping=0; auto ptrUe=insT->ue2te_mapping.find(Ue); \ \ if ( ptrUe==insT->ue2te_mapping.end() ) { \ - LOG_E(GTPU, "[%ld] gtpv1uSend failed: while getting ue id %ld in hashtable ue_mapping\n", instance, ue_id); \ + LOG_E(GTPU, "[%ld] %s failed: while getting ue id %ld in hashtable ue_mapping\n", instance, __func__, ue_id); \ pthread_mutex_unlock(&globGtp.gtp_lock); \ return; \ } @@ -202,7 +202,7 @@ instance_t legacyInstanceMapping=0; auto ptrUe=insT->ue2te_mapping.find(Ue); \ \ if ( ptrUe==insT->ue2te_mapping.end() ) { \ - LOG_E(GTPU, "[%ld] gtpv1uSend failed: while getting ue id %ld in hashtable ue_mapping\n", instance, ue_id); \ + LOG_E(GTPU, "[%ld] %s failed: while getting ue id %ld in hashtable ue_mapping\n", instance, __func__, ue_id); \ pthread_mutex_unlock(&globGtp.gtp_lock); \ return GTPNOK; \ } From 789ee2335ea5fed6ad5044cdd924d9ae420f61b9 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Wed, 11 Dec 2024 08:33:29 +0100 Subject: [PATCH 3/9] Correct documentation: PDCP passes to SDAP --- doc/SW_archi.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/SW_archi.md b/doc/SW_archi.md index b186bea524..6ba78ad8f1 100644 --- a/doc/SW_archi.md +++ b/doc/SW_archi.md @@ -338,7 +338,7 @@ On the Tx side (downlink in gNB), the entry functions `nr_pdcp_data_req_drb()` a ## PDCP Rx flow -At the Rx side, `pdcp_data_ind()` serves as the entry point for receiving data from RLC. Within `pdcp_data_ind()`, the PDCP manager mutex protects access to the PDU receiving function of PDCP (`recv_pdu()` callback corresponding to `nr_pdcp_entity_recv_pdu()` for DRBs). Following this, the `deliver_sdu_drb()` function dispatches the received data to the GTP thread via an ITTI message (`GTPV1U_TUNNEL_DATA_REQ`). +At the Rx side, `pdcp_data_ind()` serves as the entry point for receiving data from RLC. Within `pdcp_data_ind()`, the PDCP manager mutex protects access to the PDU receiving function of PDCP (`recv_pdu()` callback corresponding to `nr_pdcp_entity_recv_pdu()` for DRBs). Following this, the `deliver_sdu_drb()` function dispatches the received data to the SDAP sublayer. ## PDCP security From f6238eddec8062cb21a761920deb57e77a781015 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Wed, 11 Dec 2024 08:04:18 +0100 Subject: [PATCH 4/9] Reformat gtpv1uSend(), shorten buf/len variable names --- openair3/ocp-gtpu/gtp_itf.cpp | 57 ++++++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 18 deletions(-) diff --git a/openair3/ocp-gtpu/gtp_itf.cpp b/openair3/ocp-gtpu/gtp_itf.cpp index 68d9a0cc3d..f8fd6b0c5b 100644 --- a/openair3/ocp-gtpu/gtp_itf.cpp +++ b/openair3/ocp-gtpu/gtp_itf.cpp @@ -286,38 +286,47 @@ static int gtpv1uCreateAndSendMsg(int h, return !GTPNOK; } -static void gtpv1uSend(instance_t instance, gtpv1u_tunnel_data_req_t *req, bool seqNumFlag, bool npduNumFlag) { - uint8_t *buffer=req->buffer+req->offset; - size_t length=req->length; - ue_id_t ue_id=req->ue_id; - int bearer_id=req->bearer_id; +static void gtpv1uSend(instance_t instance, gtpv1u_tunnel_data_req_t *req, bool seqNumFlag, bool npduNumFlag) +{ + uint8_t *buf = req->buffer + req->offset; + size_t len = req->length; + ue_id_t ue_id = req->ue_id; + int bearer_id = req->bearer_id; + pthread_mutex_lock(&globGtp.gtp_lock); getInstRetVoid(compatInst(instance)); getUeRetVoid(inst, ue_id); - auto ptr2=ptrUe->second.bearers.find(bearer_id); + auto ptr2 = ptrUe->second.bearers.find(bearer_id); - if ( ptr2 == ptrUe->second.bearers.end() ) { - LOG_E(GTPU,"[%ld] GTP-U instance: sending a packet to a non existant UE:RAB: %lx/%x\n", instance, ue_id, bearer_id); + if (ptr2 == ptrUe->second.bearers.end()) { + LOG_E(GTPU, "[%ld] GTP-U instance: sending a packet to a non existant UE:RAB: %lx/%x\n", instance, ue_id, bearer_id); pthread_mutex_unlock(&globGtp.gtp_lock); return; } - LOG_D(GTPU,"[%ld] sending a packet to UE:RAB:teid %lx/%x/%x, len %lu, oldseq %d, oldnum %d\n", - instance, ue_id, bearer_id,ptr2->second.teid_outgoing,length, ptr2->second.seqNum,ptr2->second.npduNum ); + LOG_D(GTPU, + "[%ld] sending a packet to UE:RAB:teid %lx/%x/%x, len %lu, oldseq %d, oldnum %d\n", + instance, + ue_id, + bearer_id, + ptr2->second.teid_outgoing, + len, + ptr2->second.seqNum, + ptr2->second.npduNum); - if(seqNumFlag) + if (seqNumFlag) ptr2->second.seqNum++; - if(npduNumFlag) + if (npduNumFlag) ptr2->second.npduNum++; // copy to release the mutex - gtpv1u_bearer_t tmp=ptr2->second; + gtpv1u_bearer_t tmp = ptr2->second; pthread_mutex_unlock(&globGtp.gtp_lock); if (tmp.outgoing_qfi != -1) { - Gtpv1uExtHeaderT ext = { 0 }; + Gtpv1uExtHeaderT ext = {0}; ext.ExtHeaderLen = 1; // in quad bytes EXT_HDR_LNTH_OCTET_UNITS ext.pdusession_cntr.spare = 0; ext.pdusession_cntr.PDU_type = UL_PDU_SESSION_INFORMATION; @@ -331,8 +340,8 @@ static void gtpv1uSend(instance_t instance, gtpv1u_tunnel_data_req_t *req, bool tmp.outgoing_port, GTP_GPDU, tmp.teid_outgoing, - buffer, - length, + buf, + len, seqNumFlag, npduNumFlag, tmp.seqNum, @@ -341,8 +350,20 @@ static void gtpv1uSend(instance_t instance, gtpv1u_tunnel_data_req_t *req, bool (uint8_t *)&ext, sizeof(ext)); } else { - gtpv1uCreateAndSendMsg( - compatInst(instance), tmp.outgoing_ip_addr, tmp.outgoing_port, GTP_GPDU, tmp.teid_outgoing, buffer, length, seqNumFlag, npduNumFlag, tmp.seqNum, tmp.npduNum, NO_MORE_EXT_HDRS, NULL, 0); + gtpv1uCreateAndSendMsg(compatInst(instance), + tmp.outgoing_ip_addr, + tmp.outgoing_port, + GTP_GPDU, + tmp.teid_outgoing, + buf, + len, + seqNumFlag, + npduNumFlag, + tmp.seqNum, + tmp.npduNum, + NO_MORE_EXT_HDRS, + NULL, + 0); } } From 70fa7137124f257aa5aa5443bf8160c48cf351b9 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Wed, 11 Dec 2024 08:06:02 +0100 Subject: [PATCH 5/9] Create direct API to send GTP-U msgs --- openair3/ocp-gtpu/gtp_itf.cpp | 23 +++++++++++++++++------ openair3/ocp-gtpu/gtp_itf.h | 3 +++ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/openair3/ocp-gtpu/gtp_itf.cpp b/openair3/ocp-gtpu/gtp_itf.cpp index f8fd6b0c5b..146828ba53 100644 --- a/openair3/ocp-gtpu/gtp_itf.cpp +++ b/openair3/ocp-gtpu/gtp_itf.cpp @@ -286,13 +286,14 @@ static int gtpv1uCreateAndSendMsg(int h, return !GTPNOK; } -static void gtpv1uSend(instance_t instance, gtpv1u_tunnel_data_req_t *req, bool seqNumFlag, bool npduNumFlag) +void gtpv1uSendDirect(instance_t instance, + ue_id_t ue_id, + int bearer_id, + uint8_t *buf, + size_t len, + bool seqNumFlag, + bool npduNumFlag) { - uint8_t *buf = req->buffer + req->offset; - size_t len = req->length; - ue_id_t ue_id = req->ue_id; - int bearer_id = req->bearer_id; - pthread_mutex_lock(&globGtp.gtp_lock); getInstRetVoid(compatInst(instance)); getUeRetVoid(inst, ue_id); @@ -367,6 +368,16 @@ static void gtpv1uSend(instance_t instance, gtpv1u_tunnel_data_req_t *req, bool } } +static void gtpv1uSend(instance_t instance, gtpv1u_tunnel_data_req_t *req, bool seqNumFlag, bool npduNumFlag) +{ + uint8_t *buf = req->buffer + req->offset; + size_t len = req->length; + ue_id_t ue_id = req->ue_id; + int bearer_id = req->bearer_id; + + gtpv1uSendDirect(instance, ue_id, bearer_id, buf, len, seqNumFlag, npduNumFlag); +} + static void fillDlDeliveryStatusReport(extensionHeader_t *extensionHeader, uint32_t RLC_buffer_availability, uint32_t NR_PDCP_PDU_SN){ extensionHeader->buffer[0] = (1+sizeof(DlDataDeliveryStatus_flagsT)+(NR_PDCP_PDU_SN>0?3:0)+(NR_PDCP_PDU_SN>0?1:0)+1)/4; diff --git a/openair3/ocp-gtpu/gtp_itf.h b/openair3/ocp-gtpu/gtp_itf.h index ce806f0bfc..f3f336dc2c 100644 --- a/openair3/ocp-gtpu/gtp_itf.h +++ b/openair3/ocp-gtpu/gtp_itf.h @@ -103,6 +103,9 @@ extern "C" { 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); + + void gtpv1uSendDirect(instance_t instance, ue_id_t ue_id, int bearer_id, uint8_t *buf, size_t len, bool seqNumFlag, bool npduNumFlag); + instance_t gtpv1Init(openAddr_t context); void *gtpv1uTask(void *args); From 3c5e999f6d55a88286ed074a03480dfa76bb2713 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Wed, 11 Dec 2024 08:21:43 +0100 Subject: [PATCH 6/9] SDAP: Use GTP direct API instead of ITTI Using ITTI calls for user plane implies (1) a memory allocation, (2) mutexes, and (3) queueing messages for each user plane packet, which is heavy. Use a direct API call instead to reduce overhead. --- openair2/SDAP/nr_sdap/nr_sdap_entity.c | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/openair2/SDAP/nr_sdap/nr_sdap_entity.c b/openair2/SDAP/nr_sdap/nr_sdap_entity.c index bcc93c87dc..bf9eb97666 100644 --- a/openair2/SDAP/nr_sdap/nr_sdap_entity.c +++ b/openair2/SDAP/nr_sdap/nr_sdap_entity.c @@ -240,24 +240,14 @@ static void nr_sdap_rx_entity(nr_sdap_entity_t *entity, } } + uint8_t *gtp_buf = (uint8_t *)(buf + offset); + size_t gtp_len = size - offset; + // Pushing SDAP SDU to GTP-U Layer - MessageDef *message_p = itti_alloc_new_message_sized(TASK_PDCP_ENB, - 0, - GTPV1U_TUNNEL_DATA_REQ, - sizeof(gtpv1u_tunnel_data_req_t) - + size + GTPU_HEADER_OVERHEAD_MAX - offset); - AssertFatal(message_p != NULL, "OUT OF MEMORY"); - gtpv1u_tunnel_data_req_t *req = >PV1U_TUNNEL_DATA_REQ(message_p); - uint8_t *gtpu_buffer_p = (uint8_t *) (req + 1); - memcpy(gtpu_buffer_p + GTPU_HEADER_OVERHEAD_MAX, buf + offset, size - offset); - req->buffer = gtpu_buffer_p; - req->length = size - offset; - req->offset = GTPU_HEADER_OVERHEAD_MAX; - req->ue_id = ue_id; - req->bearer_id = pdusession_id; - LOG_D(SDAP, "%s() sending message to gtp size %d\n", __func__, size-offset); + LOG_D(SDAP, "sending message to gtp size %ld\n", gtp_len); // very very dirty hack gloabl var N3GTPUInst - itti_send_msg_to_task(TASK_GTPV1_U, *N3GTPUInst, message_p); + instance_t inst = *N3GTPUInst; + gtpv1uSendDirect(inst, ue_id, pdusession_id, gtp_buf, gtp_len, false, false); } else { //nrUE /* * TS 37.324 5.2 Data transfer From 2ffb674d5842f9b65a94a5c513f46c153565a672 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Wed, 11 Dec 2024 08:28:16 +0100 Subject: [PATCH 7/9] F1AP: Use GTP direct API instead of ITTI See parent commit for more information. --- doc/F1AP/F1-design.md | 8 ++++---- openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c | 16 +--------------- openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c | 12 ++---------- 3 files changed, 7 insertions(+), 29 deletions(-) diff --git a/doc/F1AP/F1-design.md b/doc/F1AP/F1-design.md index 627e2b4fc2..65ea6b38cf 100644 --- a/doc/F1AP/F1-design.md +++ b/doc/F1AP/F1-design.md @@ -378,15 +378,15 @@ You might also want to consult TS 38.401 regarding the message exchange. ### General In the DU in UL, RLC checks in `deliver_sdu()` if we are operating in split -mode, and either (direct) calls `pdcp_data_ind` (DRB) or (f1ap) sends an -`GTPV1U_TUNNEL_DATA_REQ` ITTI message to the GTP task. +mode, and either (direct) calls `pdcp_data_ind` (DRB) or (f1ap) sends a GTP +message through the GTP API. In the CU in UL, assuming the tunnel is in place, GTP decapsulates the packet and calls the callback `cu_f1u_data_req()`, which calls `pdcp_data_ind()` in CU. In the CU in DL, the PDCP function `deliver_pdu_drb_gnb()` either (direct) calls -into the RLC via `enqueue_rlc_data_req()`, or (f1ap) sends a -`GTPV1U_TUNNEL_DATA_REQ` ITTI message to the GTP task. +into the RLC via `enqueue_rlc_data_req()`, or (f1ap) sends a GTP message +through the GTP API. In the DU in DL, assuming the GTP-U tunnel exists, GTP decapsulates the packet and calls the reception call back `du_rlc_data_req()`, which calls diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c index cb80ec99ce..7691871b33 100644 --- a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c +++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c @@ -718,23 +718,9 @@ static void deliver_pdu_drb_gnb(void *deliver_pdu_data, ue_id_t ue_id, int rb_id protocol_ctxt_t ctxt = { .enb_flag = 1, .rntiMaybeUEid = ue_data.secondary_ue }; if (NODE_IS_CU(node_type)) { - MessageDef *message_p = itti_alloc_new_message_sized(TASK_PDCP_ENB, 0, - GTPV1U_TUNNEL_DATA_REQ, - sizeof(gtpv1u_tunnel_data_req_t) - + size - + GTPU_HEADER_OVERHEAD_MAX); - AssertFatal(message_p != NULL, "OUT OF MEMORY"); - gtpv1u_tunnel_data_req_t *req=>PV1U_TUNNEL_DATA_REQ(message_p); - uint8_t *gtpu_buffer_p = (uint8_t*)(req+1); - memcpy(gtpu_buffer_p + GTPU_HEADER_OVERHEAD_MAX, buf, size); - req->buffer = gtpu_buffer_p; - req->length = size; - req->offset = GTPU_HEADER_OVERHEAD_MAX; - req->ue_id = ue_id; // use CU UE ID as GTP will use that to look up TEID - req->bearer_id = rb_id; LOG_D(PDCP, "%s() (drb %d) sending message to gtp size %d\n", __func__, rb_id, size); extern instance_t CUuniqInstance; - itti_send_msg_to_task(TASK_GTPV1_U, CUuniqInstance, message_p); + gtpv1uSendDirect(CUuniqInstance, ue_id, rb_id, (uint8_t *)buf, size, false, false); } else { uint8_t *memblock = malloc16(size); memcpy(memblock, buf, size); diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c index 2ebd18f5e7..64a152f847 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c +++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c @@ -40,6 +40,7 @@ #include "openair2/F1AP/f1ap_du_rrc_message_transfer.h" #include "openair2/F1AP/f1ap_ids.h" +#include "openair3/ocp-gtpu/gtp_itf.h" extern RAN_CONTEXT_t RC; @@ -525,18 +526,9 @@ rb_found: itti_send_msg_to_task(TASK_DU_F1, ENB_MODULE_ID_TO_INSTANCE(0 /*ctxt_pP->module_id*/), msg); return; } else { - MessageDef *msg = itti_alloc_new_message_sized(TASK_RLC_ENB, 0, GTPV1U_TUNNEL_DATA_REQ, - sizeof(gtpv1u_tunnel_data_req_t) + size); - gtpv1u_tunnel_data_req_t *req=>PV1U_TUNNEL_DATA_REQ(msg); - req->buffer=(uint8_t*)(req+1); - memcpy(req->buffer,buf,size); - req->length=size; - req->offset = 0; - req->ue_id = ue->ue_id; - req->bearer_id=rb_id; LOG_D(RLC, "Received uplink user-plane traffic at RLC-DU to be sent to the CU, size %d \n", size); extern instance_t DUuniqInstance; - itti_send_msg_to_task(TASK_GTPV1_U, DUuniqInstance, msg); + gtpv1uSendDirect(DUuniqInstance, ue->ue_id, rb_id, (uint8_t*) buf, size, false, false); return; } } From ad9645ffb980dc4ab22823ac6fefe29c44b97a23 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Wed, 11 Dec 2024 08:43:38 +0100 Subject: [PATCH 8/9] LTE PDCP: Use GTP direct API instead of ITTI See parent commit for more information. LTE PDCP uses GTP, so need to link GTP into the corresponding library. --- CMakeLists.txt | 1 + openair2/LAYER2/PDCP_v10.1.0/pdcp.c | 19 +++++-------------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e6147ce3fb..b80eb72986 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1474,6 +1474,7 @@ add_library(L2_UE ${MAC_SRC_UE} ) target_link_libraries(L2_UE PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs) +target_link_libraries(L2_UE PRIVATE GTPV1U) add_library(L2_UE_LTE_NR ${L2_RRC_SRC_UE} diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c index 3356889bf7..e8042abd80 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c @@ -597,7 +597,6 @@ bool pdcp_data_ind(const protocol_ctxt_t *const ctxt_pP, uint8_t rb_offset= (srb_flagP == 0) ? DTCH -1 :0; uint16_t pdcp_uid=0; - MessageDef *message_p = NULL; uint32_t rx_hfn_for_count; int pdcp_sn_for_count; int security_ok; @@ -999,19 +998,11 @@ bool pdcp_data_ind(const protocol_ctxt_t *const ctxt_pP, if (LINK_ENB_PDCP_TO_GTPV1U) { if ((true == ctxt_pP->enb_flag) && (false == srb_flagP)) { - LOG_D(PDCP, "Sending packet to GTP, Calling GTPV1U_TUNNEL_DATA_REQ ue %lx rab %ld len %u\n", ctxt_pP->rntiMaybeUEid, rb_id + 4, sdu_buffer_sizeP - payload_offset); - message_p = itti_alloc_new_message_sized(TASK_PDCP_ENB, 0, GTPV1U_TUNNEL_DATA_REQ, - sizeof(gtpv1u_tunnel_data_req_t) + - sdu_buffer_sizeP - payload_offset + GTPU_HEADER_OVERHEAD_MAX ); - AssertFatal(message_p != NULL, "OUT OF MEMORY"); - gtpv1u_tunnel_data_req_t *req=>PV1U_TUNNEL_DATA_REQ(message_p); - req->buffer = (uint8_t*)(req+1); - memcpy(req->buffer + GTPU_HEADER_OVERHEAD_MAX, sdu_buffer_pP + payload_offset, sdu_buffer_sizeP - payload_offset); - req->length = sdu_buffer_sizeP - payload_offset; - req->offset = GTPU_HEADER_OVERHEAD_MAX; - req->ue_id = ctxt_pP->rntiMaybeUEid; - req->bearer_id = rb_id + 4; - itti_send_msg_to_task(TASK_GTPV1_U, INSTANCE_DEFAULT, message_p); + ue_id_t ue_id = ctxt_pP->rntiMaybeUEid; + uint8_t *gtp_buf = sdu_buffer_pP + payload_offset; + size_t gtp_len = sdu_buffer_sizeP - payload_offset; + LOG_D(PDCP, "Sending packet to GTP ue %lx rab %ld len %ld\n", ue_id, rb_id + 4, gtp_len); + gtpv1uSendDirect(INSTANCE_DEFAULT, ue_id, rb_id + 4, gtp_buf, gtp_len, false, false); packet_forwarded = true; } } else { From 27f1c0db65792c6f6ecfd18729f84129f6e72f7c Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Wed, 11 Dec 2024 08:45:03 +0100 Subject: [PATCH 9/9] Remove GTPV1U_TUNNEL_DATA_REQ ITTI message: it is not used --- openair2/COMMON/gtpv1_u_messages_def.h | 1 - openair2/COMMON/gtpv1_u_messages_types.h | 10 ---------- openair3/ocp-gtpu/gtp_itf.cpp | 15 --------------- 3 files changed, 26 deletions(-) diff --git a/openair2/COMMON/gtpv1_u_messages_def.h b/openair2/COMMON/gtpv1_u_messages_def.h index 35af0c04e7..19001b883e 100644 --- a/openair2/COMMON/gtpv1_u_messages_def.h +++ b/openair2/COMMON/gtpv1_u_messages_def.h @@ -20,7 +20,6 @@ */ -MESSAGE_DEF(GTPV1U_TUNNEL_DATA_REQ, MESSAGE_PRIORITY_MED, gtpv1u_tunnel_data_req_t, Gtpv1uTunnelDataReq) MESSAGE_DEF(GTPV1U_ENB_DATA_FORWARDING_REQ, MESSAGE_PRIORITY_MED, gtpv1u_enb_data_forwarding_req_t,Gtpv1uDataForwardingReq) MESSAGE_DEF(GTPV1U_ENB_DATA_FORWARDING_IND, MESSAGE_PRIORITY_MED, gtpv1u_enb_data_forwarding_ind_t,Gtpv1uDataForwardingInd) MESSAGE_DEF(GTPV1U_ENB_END_MARKER_REQ, MESSAGE_PRIORITY_MED, gtpv1u_enb_end_marker_req_t, Gtpv1uEndMarkerReq) diff --git a/openair2/COMMON/gtpv1_u_messages_types.h b/openair2/COMMON/gtpv1_u_messages_types.h index 0a2691e643..5f12d1e9a2 100644 --- a/openair2/COMMON/gtpv1_u_messages_types.h +++ b/openair2/COMMON/gtpv1_u_messages_types.h @@ -30,7 +30,6 @@ #define NR_GTPV1U_MAX_BEARERS_PER_UE max_val_NR_DRB_Identity #define GTPV1U_ENB_TUNNEL_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.Gtpv1uTunnelDataInd -#define GTPV1U_TUNNEL_DATA_REQ(mSGpTR) (mSGpTR)->ittiMsg.Gtpv1uTunnelDataReq #define GTPV1U_ENB_DATA_FORWARDING_REQ(mSGpTR) (mSGpTR)->ittiMsg.Gtpv1uDataForwardingReq #define GTPV1U_ENB_DATA_FORWARDING_IND(mSGpTR) (mSGpTR)->ittiMsg.Gtpv1uDataForwardingInd #define GTPV1U_ENB_END_MARKER_REQ(mSGpTR) (mSGpTR)->ittiMsg.Gtpv1uEndMarkerReq @@ -107,15 +106,6 @@ typedef struct gtpv1u_enb_delete_tunnel_resp_s { teid_t enb_S1u_teid; ///< local S1U Tunnel Endpoint Identifier to be deleted } gtpv1u_enb_delete_tunnel_resp_t; - -typedef struct gtpv1u_tunnel_data_req_s { - uint8_t *buffer; - uint32_t length; - uint32_t offset; ///< start of message offset in buffer - ue_id_t ue_id; - rb_id_t bearer_id; -} gtpv1u_tunnel_data_req_t; - typedef struct gtpv1u_enb_data_forwarding_req_s { uint8_t *buffer; uint32_t length; diff --git a/openair3/ocp-gtpu/gtp_itf.cpp b/openair3/ocp-gtpu/gtp_itf.cpp index 146828ba53..3036565fad 100644 --- a/openair3/ocp-gtpu/gtp_itf.cpp +++ b/openair3/ocp-gtpu/gtp_itf.cpp @@ -368,16 +368,6 @@ void gtpv1uSendDirect(instance_t instance, } } -static void gtpv1uSend(instance_t instance, gtpv1u_tunnel_data_req_t *req, bool seqNumFlag, bool npduNumFlag) -{ - uint8_t *buf = req->buffer + req->offset; - size_t len = req->length; - ue_id_t ue_id = req->ue_id; - int bearer_id = req->bearer_id; - - gtpv1uSendDirect(instance, ue_id, bearer_id, buf, len, seqNumFlag, npduNumFlag); -} - static void fillDlDeliveryStatusReport(extensionHeader_t *extensionHeader, uint32_t RLC_buffer_availability, uint32_t NR_PDCP_PDU_SN){ extensionHeader->buffer[0] = (1+sizeof(DlDataDeliveryStatus_flagsT)+(NR_PDCP_PDU_SN>0?3:0)+(NR_PDCP_PDU_SN>0?1:0)+1)/4; @@ -1320,11 +1310,6 @@ void *gtpv1uTask(void *args) { switch (msgType) { // DATA TO BE SENT TO UDP - case GTPV1U_TUNNEL_DATA_REQ: { - gtpv1uSend(compatInst(myInstance), >PV1U_TUNNEL_DATA_REQ(message_p), false, false); - } - break; - case GTPV1U_DU_BUFFER_REPORT_REQ:{ gtpv1uSendDlDeliveryStatus(compatInst(myInstance), >PV1U_DU_BUFFER_REPORT_REQ(message_p)); }