diff --git a/ci-scripts/xml_files/benetel_nsa_quectel.xml b/ci-scripts/xml_files/benetel_nsa_quectel.xml index 8c284b6673..5da8322f22 100644 --- a/ci-scripts/xml_files/benetel_nsa_quectel.xml +++ b/ci-scripts/xml_files/benetel_nsa_quectel.xml @@ -24,7 +24,7 @@ TEST-NSA-FR1-TM1 NSA Ping DL UL with QUECTEL tasks - 3 + 1 030000 040000 diff --git a/ci-scripts/xml_files/benetel_nsa_quectel_longrun.xml b/ci-scripts/xml_files/benetel_nsa_quectel_longrun.xml index 2e4494c819..3173e6315a 100644 --- a/ci-scripts/xml_files/benetel_nsa_quectel_longrun.xml +++ b/ci-scripts/xml_files/benetel_nsa_quectel_longrun.xml @@ -24,7 +24,7 @@ TEST-NSA-FR1-TM1 NSA Ping DL UL with QUECTEL tasks - 3 + 1 030000 040000 diff --git a/ci-scripts/xml_files/container_4g_l2sim_tdd.xml b/ci-scripts/xml_files/container_4g_l2sim_tdd.xml index 5298d01ef3..3ac32e1989 100644 --- a/ci-scripts/xml_files/container_4g_l2sim_tdd.xml +++ b/ci-scripts/xml_files/container_4g_l2sim_tdd.xml @@ -24,7 +24,7 @@ l2sim-4glte-tdd Testing 4G LTE L2 sim - FDD eNB wrench - 2 + 1 100001 000000 diff --git a/ci-scripts/xml_files/container_4g_rfsim_tdd_05MHz.xml b/ci-scripts/xml_files/container_4g_rfsim_tdd_05MHz.xml index aa70db1fed..7a29e50f39 100644 --- a/ci-scripts/xml_files/container_4g_rfsim_tdd_05MHz.xml +++ b/ci-scripts/xml_files/container_4g_rfsim_tdd_05MHz.xml @@ -24,7 +24,7 @@ rfsim-4glte-tdd05mhz Monolithic eNB - TDD 05MHz wrench - 2 + 1 100011 000011 diff --git a/ci-scripts/xml_files/container_5g_fdd_rfsim.xml b/ci-scripts/xml_files/container_5g_fdd_rfsim.xml index 9564b24b35..578d5f221f 100644 --- a/ci-scripts/xml_files/container_5g_fdd_rfsim.xml +++ b/ci-scripts/xml_files/container_5g_fdd_rfsim.xml @@ -24,7 +24,7 @@ rfsim-5gnr-fdd Monolithic FDD gNB with SDAP wrench - 4 + 1 100011 000010 diff --git a/ci-scripts/xml_files/container_5g_l2sim_tdd.xml b/ci-scripts/xml_files/container_5g_l2sim_tdd.xml index be6b789b6b..cc3c1ae391 100644 --- a/ci-scripts/xml_files/container_5g_l2sim_tdd.xml +++ b/ci-scripts/xml_files/container_5g_l2sim_tdd.xml @@ -24,7 +24,7 @@ l2sim-5gnr-tdd Testing 5G NR L2 sim - TDD gNB wrench - 2 + 1 100001 000000 diff --git a/ci-scripts/xml_files/container_5g_rfsim.xml b/ci-scripts/xml_files/container_5g_rfsim.xml index 653e1e6513..5ad400ecc1 100644 --- a/ci-scripts/xml_files/container_5g_rfsim.xml +++ b/ci-scripts/xml_files/container_5g_rfsim.xml @@ -24,7 +24,7 @@ rfsim-5gnr-tdd Monolithic TDD gNB wrench - 4 + 1 100001 000000 diff --git a/ci-scripts/xml_files/enb_ocp_usrp210_band7_test_05mhz_tm1.xml b/ci-scripts/xml_files/enb_ocp_usrp210_band7_test_05mhz_tm1.xml index d330d826bf..eebe62b3b5 100644 --- a/ci-scripts/xml_files/enb_ocp_usrp210_band7_test_05mhz_tm1.xml +++ b/ci-scripts/xml_files/enb_ocp_usrp210_band7_test_05mhz_tm1.xml @@ -24,7 +24,7 @@ test-05-tm1 Test-05MHz-TM1 tasks - 4 + 1 030201 040101 diff --git a/ci-scripts/xml_files/enb_ue_usrp210_band7_test_05mhz_tm1.xml b/ci-scripts/xml_files/enb_ue_usrp210_band7_test_05mhz_tm1.xml index 48ce2f298f..723956fe60 100644 --- a/ci-scripts/xml_files/enb_ue_usrp210_band7_test_05mhz_tm1.xml +++ b/ci-scripts/xml_files/enb_ue_usrp210_band7_test_05mhz_tm1.xml @@ -24,7 +24,7 @@ test-05-tm1-nos1-tunnel Test-05MHz-TM1-noS1-tunnel tasks - 4 + 1 030201 090109 030101 000001 090101 000002 040501 040502 000001 040601 040602 040641 040642 000001 090109 030201 diff --git a/ci-scripts/xml_files/enb_ue_usrp210_band7_test_05mhz_tm1_fembms_no_s1.xml b/ci-scripts/xml_files/enb_ue_usrp210_band7_test_05mhz_tm1_fembms_no_s1.xml index fb66ce0c66..cf090379df 100644 --- a/ci-scripts/xml_files/enb_ue_usrp210_band7_test_05mhz_tm1_fembms_no_s1.xml +++ b/ci-scripts/xml_files/enb_ue_usrp210_band7_test_05mhz_tm1_fembms_no_s1.xml @@ -24,7 +24,7 @@ test-05-tm1-fembms-nos1-tunnel Test-05MHz-FEMBMS-TM1-noS1-tunnel tasks - 2 + 1 030201 090109 030104 000001 090104 000002 040605 000001 090109 030201 diff --git a/ci-scripts/xml_files/enb_ue_usrp210_band7_test_05mhz_tm1_mbms_no_s1.xml b/ci-scripts/xml_files/enb_ue_usrp210_band7_test_05mhz_tm1_mbms_no_s1.xml index 234f6639ce..c778b43eb5 100644 --- a/ci-scripts/xml_files/enb_ue_usrp210_band7_test_05mhz_tm1_mbms_no_s1.xml +++ b/ci-scripts/xml_files/enb_ue_usrp210_band7_test_05mhz_tm1_mbms_no_s1.xml @@ -24,7 +24,7 @@ test-05-tm1-mbms-nos1-tunnel Test-05MHz-MBMS-TM1-noS1-tunnel tasks - 2 + 1 030201 090109 030103 000001 090103 000002 040605 000001 090109 030201 diff --git a/ci-scripts/xml_files/enb_ue_usrp210_band7_test_05mhz_tm1_s1.xml b/ci-scripts/xml_files/enb_ue_usrp210_band7_test_05mhz_tm1_s1.xml index 791d32eec0..07e3a4135a 100644 --- a/ci-scripts/xml_files/enb_ue_usrp210_band7_test_05mhz_tm1_s1.xml +++ b/ci-scripts/xml_files/enb_ue_usrp210_band7_test_05mhz_tm1_s1.xml @@ -24,7 +24,7 @@ test-05-tm1-tunnel Test-05MHz-TM1-tunnel tasks - 2 + 1 030201 090109 030102 000001 090102 000002 040503 000001 040603 040604 040643 040644 000001 090109 030201 diff --git a/ci-scripts/xml_files/enb_usrp210_band40_test_05mhz_tm2.xml b/ci-scripts/xml_files/enb_usrp210_band40_test_05mhz_tm2.xml index 2e7da714b0..9295306f23 100644 --- a/ci-scripts/xml_files/enb_usrp210_band40_test_05mhz_tm2.xml +++ b/ci-scripts/xml_files/enb_usrp210_band40_test_05mhz_tm2.xml @@ -25,7 +25,7 @@ test-05-tm2 Test-05MHz-TM2 tasks - 2 + 1 True 040608 diff --git a/ci-scripts/xml_files/enb_usrp210_band40_test_20mhz_tm1.xml b/ci-scripts/xml_files/enb_usrp210_band40_test_20mhz_tm1.xml index ef9fee0dca..1b32b873ca 100644 --- a/ci-scripts/xml_files/enb_usrp210_band40_test_20mhz_tm1.xml +++ b/ci-scripts/xml_files/enb_usrp210_band40_test_20mhz_tm1.xml @@ -24,7 +24,7 @@ test-20-tm1 Test-20MHz-TM1 tasks - 4 + 1 True 040623 diff --git a/ci-scripts/xml_files/enb_usrp210_band7_test_05mhz_tm1_rrc_inactivity_no_flexran.xml b/ci-scripts/xml_files/enb_usrp210_band7_test_05mhz_tm1_rrc_inactivity_no_flexran.xml index aedd980c34..90d54a2c82 100644 --- a/ci-scripts/xml_files/enb_usrp210_band7_test_05mhz_tm1_rrc_inactivity_no_flexran.xml +++ b/ci-scripts/xml_files/enb_usrp210_band7_test_05mhz_tm1_rrc_inactivity_no_flexran.xml @@ -24,7 +24,7 @@ test-05-tm1-rrc-no-flex Test-05MHz-TM1-RRC-Inactivity tasks - 2 + 1 030201 040101 diff --git a/ci-scripts/xml_files/enb_usrp210_band7_test_05mhz_tm1_rrc_inactivity_w_flexran.xml b/ci-scripts/xml_files/enb_usrp210_band7_test_05mhz_tm1_rrc_inactivity_w_flexran.xml index b488637483..1667e94f71 100644 --- a/ci-scripts/xml_files/enb_usrp210_band7_test_05mhz_tm1_rrc_inactivity_w_flexran.xml +++ b/ci-scripts/xml_files/enb_usrp210_band7_test_05mhz_tm1_rrc_inactivity_w_flexran.xml @@ -24,7 +24,7 @@ test-05-tm1-rrc-w-flex Test-05MHz-TM1-RRC-Inactivity-FlexRan tasks - 2 + 1 030201 040101 diff --git a/ci-scripts/xml_files/enb_usrp210_band7_test_10mhz_tm1_cdrx.xml b/ci-scripts/xml_files/enb_usrp210_band7_test_10mhz_tm1_cdrx.xml index 82e0a32f6a..28140305db 100644 --- a/ci-scripts/xml_files/enb_usrp210_band7_test_10mhz_tm1_cdrx.xml +++ b/ci-scripts/xml_files/enb_usrp210_band7_test_10mhz_tm1_cdrx.xml @@ -24,7 +24,7 @@ test-10-cdrx-tm1 Test-10MHz-CDRX-TM1 tasks - 4 + 1 030201 040101 diff --git a/ci-scripts/xml_files/gnb_nr_ue_usrp_run.xml b/ci-scripts/xml_files/gnb_nr_ue_usrp_run.xml index d025b95ce5..dd2b15a4f2 100644 --- a/ci-scripts/xml_files/gnb_nr_ue_usrp_run.xml +++ b/ci-scripts/xml_files/gnb_nr_ue_usrp_run.xml @@ -24,7 +24,7 @@ run-oai-gnb-nr-ue Run-gNB-and-NR-UE tasks - 2 + 1 090101 000001 090102 000002 090108 090109 diff --git a/ci-scripts/xml_files/gnb_nr_ue_usrp_run_multi_thread.xml b/ci-scripts/xml_files/gnb_nr_ue_usrp_run_multi_thread.xml index ffd41e9e86..7c9d689e44 100644 --- a/ci-scripts/xml_files/gnb_nr_ue_usrp_run_multi_thread.xml +++ b/ci-scripts/xml_files/gnb_nr_ue_usrp_run_multi_thread.xml @@ -24,7 +24,7 @@ run-oai-gnb-nr-ue-tx-write-thread Run-gNB-and-NR-UE-TX-Write-Thread tasks - 2 + 1 090103 000001 090104 000002 090108 090109 diff --git a/ci-scripts/xml_files/gnb_usrp_build.xml b/ci-scripts/xml_files/gnb_usrp_build.xml index 81c7d4e24e..f8ec797646 100644 --- a/ci-scripts/xml_files/gnb_usrp_build.xml +++ b/ci-scripts/xml_files/gnb_usrp_build.xml @@ -24,7 +24,7 @@ gnb-build-tab Build-gNB wrench - 4 + 1 010101 diff --git a/ci-scripts/xml_files/if4p5_usrp210_band40_test_10mhz.xml b/ci-scripts/xml_files/if4p5_usrp210_band40_test_10mhz.xml index f755a7ec96..b7c2622283 100644 --- a/ci-scripts/xml_files/if4p5_usrp210_band40_test_10mhz.xml +++ b/ci-scripts/xml_files/if4p5_usrp210_band40_test_10mhz.xml @@ -24,7 +24,7 @@ test-10 Test-10MHz tasks - 2 + 1 True 040612 diff --git a/ci-scripts/xml_files/if4p5_usrp210_band40_test_20mhz.xml b/ci-scripts/xml_files/if4p5_usrp210_band40_test_20mhz.xml index 4e84c47faf..287f75c59f 100644 --- a/ci-scripts/xml_files/if4p5_usrp210_band40_test_20mhz.xml +++ b/ci-scripts/xml_files/if4p5_usrp210_band40_test_20mhz.xml @@ -24,7 +24,7 @@ test-20 Test-20MHz tasks - 2 + 1 030201 040101 diff --git a/ci-scripts/xml_files/inria/enb_ue_usrp210_band7_test_05mhz_tm1.xml b/ci-scripts/xml_files/inria/enb_ue_usrp210_band7_test_05mhz_tm1.xml index c2fb2e8e2e..cd9ed8809e 100644 --- a/ci-scripts/xml_files/inria/enb_ue_usrp210_band7_test_05mhz_tm1.xml +++ b/ci-scripts/xml_files/inria/enb_ue_usrp210_band7_test_05mhz_tm1.xml @@ -24,7 +24,7 @@ test-05-tm1-oai-ue Test-05MHz-TM1-OAI-UE tasks - 4 + 1 030201 090109 030102 000001 090102 000002 040503 000002 040603 040604 040643 040644 000002 090109 000001 030201 diff --git a/ci-scripts/xml_files/inria/enb_ue_usrp210_band7_test_05mhz_tm1_nos1.xml b/ci-scripts/xml_files/inria/enb_ue_usrp210_band7_test_05mhz_tm1_nos1.xml index d5bdc5a42d..16cc4b9a41 100644 --- a/ci-scripts/xml_files/inria/enb_ue_usrp210_band7_test_05mhz_tm1_nos1.xml +++ b/ci-scripts/xml_files/inria/enb_ue_usrp210_band7_test_05mhz_tm1_nos1.xml @@ -24,7 +24,7 @@ test-05-tm1-nos1-tunnel Test-05MHz-TM1-noS1-tunnel tasks - 4 + 1 030201 090109 030101 000001 090101 000002 040501 040502 000001 040601 040602 040641 040642 000001 090109 030201 diff --git a/ci-scripts/xml_files/inria/enb_usrp210_band7_x2_ho_test_05Mhz_tm1.xml b/ci-scripts/xml_files/inria/enb_usrp210_band7_x2_ho_test_05Mhz_tm1.xml index b4b20c1239..36c4e2c1a8 100644 --- a/ci-scripts/xml_files/inria/enb_usrp210_band7_x2_ho_test_05Mhz_tm1.xml +++ b/ci-scripts/xml_files/inria/enb_usrp210_band7_x2_ho_test_05Mhz_tm1.xml @@ -24,7 +24,7 @@ test-x2-ho-05-tm1 Test-X2-Handover-05MHz-TM1 tasks - 2 + 1 040101 030201 030202 050102 diff --git a/ci-scripts/xml_files/multi_rru_band38_test_10mhz_tm1.xml b/ci-scripts/xml_files/multi_rru_band38_test_10mhz_tm1.xml index 3875a3df03..fdde60bd4c 100644 --- a/ci-scripts/xml_files/multi_rru_band38_test_10mhz_tm1.xml +++ b/ci-scripts/xml_files/multi_rru_band38_test_10mhz_tm1.xml @@ -24,7 +24,7 @@ test-multi-rru-10 Test-Multi-RRU-10MHz tasks - 2 + 1 030211 030212 030213 030111 030112 030113 diff --git a/ci-scripts/xml_files/nr_ue_usrp_build.xml b/ci-scripts/xml_files/nr_ue_usrp_build.xml index bc04efdb4b..dd3a10f2f5 100644 --- a/ci-scripts/xml_files/nr_ue_usrp_build.xml +++ b/ci-scripts/xml_files/nr_ue_usrp_build.xml @@ -24,7 +24,7 @@ nr-ue-build-tab Build-NR-UE wrench - 2 + 1 010102 diff --git a/ci-scripts/xml_files/ue_band20_test_10mhz_orange.xml b/ci-scripts/xml_files/ue_band20_test_10mhz_orange.xml index 49ccfbca14..eba64191f0 100644 --- a/ci-scripts/xml_files/ue_band20_test_10mhz_orange.xml +++ b/ci-scripts/xml_files/ue_band20_test_10mhz_orange.xml @@ -24,7 +24,7 @@ test-10mhz-orange Test-10Mhz-Orange tasks - 4 + 1 090109 090110 000001 090109 diff --git a/ci-scripts/xml_files/ue_band20_test_10mhz_sfr.xml b/ci-scripts/xml_files/ue_band20_test_10mhz_sfr.xml index fdc70a9bdd..359fca1a11 100644 --- a/ci-scripts/xml_files/ue_band20_test_10mhz_sfr.xml +++ b/ci-scripts/xml_files/ue_band20_test_10mhz_sfr.xml @@ -24,7 +24,7 @@ test-10mHz-sfr Test-10MHz-SFR tasks - 4 + 1 090109 090111 000001 090109 diff --git a/ci-scripts/xml_files/x2ho_enb_usrp210_band13_test_05mhz_tm1.xml b/ci-scripts/xml_files/x2ho_enb_usrp210_band13_test_05mhz_tm1.xml index 14872c9f8f..e7a2c42cd6 100644 --- a/ci-scripts/xml_files/x2ho_enb_usrp210_band13_test_05mhz_tm1.xml +++ b/ci-scripts/xml_files/x2ho_enb_usrp210_band13_test_05mhz_tm1.xml @@ -25,7 +25,7 @@ test-x2-ho-05-tm1 Test-X2-HO-FDD-05MHz-TM1 tasks - 2 + 1 True 030201 030202 diff --git a/common/config/config_userapi.c b/common/config/config_userapi.c index 9725c15845..78a6a1b2c9 100644 --- a/common/config/config_userapi.c +++ b/common/config/config_userapi.c @@ -113,7 +113,7 @@ void config_check_valptr(paramdef_t *cfgoptions, int elt_sz, int nb_elt) { sz=managed_ptr_sz(*cfgoptions->strptr); else sz=managed_ptr_sz(cfgoptions->voidptr); - if ( sz != -1) { + if ( sz == -1) { CONFIG_PRINTF_ERROR("[CONFIG] %s NOT SUPPORTED not NULL pointer with array types", cfgoptions->optname); return ; } diff --git a/common/utils/ocp_itti/intertask_interface.cpp b/common/utils/ocp_itti/intertask_interface.cpp index 82f7eb5774..5dbff3a40d 100644 --- a/common/utils/ocp_itti/intertask_interface.cpp +++ b/common/utils/ocp_itti/intertask_interface.cpp @@ -171,6 +171,8 @@ extern "C" { AssertFatal(epoll_ctl(t->epoll_fd, EPOLL_CTL_ADD, fd, &event) == 0, "epoll_ctl (EPOLL_CTL_ADD) failed for task %s, fd %d: %s!\n", itti_get_task_name(task_id), fd, strerror(errno)); + eventfd_t sem_counter = 1; + AssertFatal ( sizeof(sem_counter) == write(t->sem_fd, &sem_counter, sizeof(sem_counter)), ""); } void itti_unsubscribe_event_fd(task_id_t task_id, int fd) { diff --git a/openair3/ocp-gtpu/gtp_itf.cpp b/openair3/ocp-gtpu/gtp_itf.cpp index 2c0bd46a5d..af2a0ee9e8 100644 --- a/openair3/ocp-gtpu/gtp_itf.cpp +++ b/openair3/ocp-gtpu/gtp_itf.cpp @@ -163,11 +163,46 @@ static teid_t gtpv1uNewTeid(void) { } instance_t legacyInstanceMapping=0; -#define compatInst(a) ((a)==0 || (a)==INSTANCE_DEFAULT?legacyInstanceMapping:a) +#define compatInst(a) ((a)==0 || (a)==INSTANCE_DEFAULT ? legacyInstanceMapping:a) -#define GTPV1U_HEADER_SIZE (8) +#define getInstRetVoid(insT) \ + auto instChk=globGtp.instances.find(compatInst(insT)); \ + if (instChk == globGtp.instances.end()) { \ + LOG_E(GTPU,"try to get a gtp-u not existing output\n"); \ + pthread_mutex_unlock(&globGtp.gtp_lock); \ + return; \ + } \ + gtpEndPoint * inst=&instChk->second; - #define HDR_MAX 256 // 256 is supposed to be larger than any gtp header +#define getInstRetInt(insT) \ + auto instChk=globGtp.instances.find(compatInst(insT)); \ + if (instChk == globGtp.instances.end()) { \ + LOG_E(GTPU,"try to get a gtp-u not existing output\n"); \ + pthread_mutex_unlock(&globGtp.gtp_lock); \ + return GTPNOK; \ + } \ + gtpEndPoint * inst=&instChk->second; + + +#define getRntiRetVoid(insT, RnTi) \ + auto ptrRnti=insT->ue2te_mapping.find(RnTi); \ + \ + if ( ptrRnti==insT->ue2te_mapping.end() ) { \ + LOG_E(GTPU, "[%ld] gtpv1uSend failed: while getting ue rnti %x in hashtable ue_mapping\n", instance, rnti); \ + pthread_mutex_unlock(&globGtp.gtp_lock); \ + return; \ + } + +#define getRntiRetInt(insT, RnTi) \ + auto ptrRnti=insT->ue2te_mapping.find(RnTi); \ + \ + if ( ptrRnti==insT->ue2te_mapping.end() ) { \ + LOG_E(GTPU, "[%ld] gtpv1uSend failed: while getting ue rnti %x in hashtable ue_mapping\n", instance, rnti); \ + pthread_mutex_unlock(&globGtp.gtp_lock); \ + return GTPNOK; \ + } + +#define HDR_MAX 256 // 256 is supposed to be larger than any gtp header static int gtpv1uCreateAndSendMsg(int h, uint32_t peerIp, uint16_t peerPort, @@ -196,13 +231,11 @@ static int gtpv1uCreateAndSendMsg(int h, msgHdr->PT=1; msgHdr->version=1; msgHdr->msgType=msgType; - msgHdr->msgLength = htons(msgLen + extensionHeader_length); msgHdr->teid=htonl(teid); curPtr+=sizeof(Gtpv1uMsgHeaderT); if (seqNumFlag || (extHdrType != NO_MORE_EXT_HDRS) || npduNumFlag) { - msgHdr->msgLength += htons(4); *(uint16_t *)curPtr = seqNumFlag ? seqNum : 0x0000; curPtr+=sizeof(uint16_t); *(uint8_t *)curPtr = npduNumFlag ? npduNum : 0x00; @@ -229,9 +262,10 @@ static int gtpv1uCreateAndSendMsg(int h, curPtr+=msgLen; } - AssertFatal(curPtr-(buffer+msgLen) < HDR_MAX, ""); + msgHdr->msgLength = htons(curPtr-(buffer+sizeof(Gtpv1uMsgHeaderT))); + AssertFatal(curPtr-(buffer+msgLen) < HDR_MAX, "fixed max size of all headers too short"); // Fix me: add IPv6 support, using flag ipVersion - static struct sockaddr_in to= {0}; + struct sockaddr_in to= {0}; to.sin_family = AF_INET; to.sin_port = htons(peerPort); to.sin_addr.s_addr = peerIp ; @@ -253,14 +287,8 @@ static void gtpv1uSend(instance_t instance, gtpv1u_enb_tunnel_data_req_t *req, b rnti_t rnti=req->rnti; int rab_id=req->rab_id; pthread_mutex_lock(&globGtp.gtp_lock); - auto inst=&globGtp.instances[compatInst(instance)]; - auto ptrRnti=inst->ue2te_mapping.find(rnti); - - if ( ptrRnti==inst->ue2te_mapping.end() ) { - LOG_E(GTPU, "[%ld] gtpv1uSend failed: while getting ue rnti %x in hashtable ue_mapping\n", instance, rnti); - pthread_mutex_unlock(&globGtp.gtp_lock); - return; - } + getInstRetVoid(compatInst(instance)); + getRntiRetVoid(inst, rnti); map::iterator ptr2=ptrRnti->second.bearers.find(rab_id); @@ -292,14 +320,8 @@ static void gtpv1uSend2(instance_t instance, gtpv1u_gnb_tunnel_data_req_t *req, rnti_t rnti=req->rnti; int rab_id=req->pdusession_id; pthread_mutex_lock(&globGtp.gtp_lock); - auto inst=&globGtp.instances[compatInst(instance)]; - auto ptrRnti=inst->ue2te_mapping.find(rnti); - - if ( ptrRnti==inst->ue2te_mapping.end() ) { - LOG_E(GTPU, "[%ld] GTP-U gtpv1uSend failed: while getting ue rnti %x in hashtable ue_mapping\n", instance, rnti); - pthread_mutex_unlock(&globGtp.gtp_lock); - return; - } + getInstRetVoid(compatInst(instance)); + getRntiRetVoid(inst, rnti); map::iterator ptr2=ptrRnti->second.bearers.find(rab_id); @@ -385,14 +407,8 @@ static void gtpv1uSendDlDeliveryStatus(instance_t instance, gtpv1u_DU_buffer_rep rnti_t rnti=req->rnti; int rab_id=req->pdusession_id; pthread_mutex_lock(&globGtp.gtp_lock); - auto inst=&globGtp.instances[compatInst(instance)]; - auto ptrRnti=inst->ue2te_mapping.find(rnti); - - if ( ptrRnti==inst->ue2te_mapping.end() ) { - LOG_E(GTPU, "[%ld] GTP-U gtpv1uSend failed: while getting ue rnti %x in hashtable ue_mapping\n", instance, rnti); - pthread_mutex_unlock(&globGtp.gtp_lock); - return; - } + getInstRetVoid(compatInst(instance)); + getRntiRetVoid(inst, rnti); map::iterator ptr2=ptrRnti->second.bearers.find(rab_id); @@ -419,14 +435,8 @@ static void gtpv1uEndTunnel(instance_t instance, gtpv1u_enb_tunnel_data_req_t *r rnti_t rnti=req->rnti; int rab_id=req->rab_id; pthread_mutex_lock(&globGtp.gtp_lock); - auto inst=&globGtp.instances[compatInst(instance)]; - auto ptrRnti=inst->ue2te_mapping.find(rnti); - - if ( ptrRnti==inst->ue2te_mapping.end() ) { - LOG_E(GTPU, "[%ld] gtpv1uSend failed: while getting ue rnti %x in hashtable ue_mapping\n", instance, rnti); - pthread_mutex_unlock(&globGtp.gtp_lock); - return; - } + getInstRetVoid(compatInst(instance)); + getRntiRetVoid(inst, rnti); map::iterator ptr2=ptrRnti->second.bearers.find(rab_id); @@ -571,14 +581,8 @@ instance_t gtpv1Init(openAddr_t context) { void GtpuUpdateTunnelOutgoingTeid(instance_t instance, rnti_t rnti, ebi_t bearer_id, teid_t newOutgoingTeid) { pthread_mutex_lock(&globGtp.gtp_lock); - auto inst=&globGtp.instances[compatInst(instance)]; - auto ptrRnti=inst->ue2te_mapping.find(rnti); - - if ( ptrRnti == inst->ue2te_mapping.end() ) { - LOG_E(GTPU,"[%ld] Update tunnel for a not existing rnti %x\n", instance, rnti); - pthread_mutex_unlock(&globGtp.gtp_lock); - return; - } + getInstRetVoid(compatInst(instance)); + getRntiRetVoid(inst, rnti); map::iterator ptr2=ptrRnti->second.bearers.find(bearer_id); @@ -605,8 +609,7 @@ teid_t newGtpuCreateTunnel(instance_t instance, gtpCallback callBack, gtpCallbackSDAP callBackSDAP) { pthread_mutex_lock(&globGtp.gtp_lock); - instance=compatInst(instance); - auto inst=&globGtp.instances[instance]; + getInstRetInt(compatInst(instance)); auto it=inst->ue2te_mapping.find(rnti); if ( it != inst->ue2te_mapping.end() && it->second.bearers.find(outgoing_bearer_id) != it->second.bearers.end()) { @@ -682,8 +685,14 @@ int gtpv1u_create_s1u_tunnel(instance_t instance, create_tunnel_req->rnti, create_tunnel_req->num_tunnels, create_tunnel_req->sgw_S1u_teid[0]); - tcp_udp_port_t dstport=globGtp.instances[compatInst(instance)].get_dstport(); - + pthread_mutex_lock(&globGtp.gtp_lock); + getInstRetInt(compatInst(instance)); + + tcp_udp_port_t dstport=inst->get_dstport(); + uint8_t addr[inst->foundAddrLen]; + memcpy(addr, inst->foundAddr, inst->foundAddrLen); + pthread_mutex_unlock(&globGtp.gtp_lock); + for (int i = 0; i < create_tunnel_req->num_tunnels; i++) { AssertFatal(create_tunnel_req->eps_bearer_id[i] > 4, "From legacy code not clear, seems impossible (bearer=%d)\n", @@ -704,9 +713,8 @@ int gtpv1u_create_s1u_tunnel(instance_t instance, create_tunnel_resp->num_tunnels=create_tunnel_req->num_tunnels; create_tunnel_resp->enb_S1u_teid[i]=teid; create_tunnel_resp->eps_bearer_id[i] = create_tunnel_req->eps_bearer_id[i]; - memcpy(create_tunnel_resp->enb_addr.buffer,globGtp.instances[compatInst(instance)].foundAddr, - globGtp.instances[compatInst(instance)].foundAddrLen); - create_tunnel_resp->enb_addr.length= globGtp.instances[compatInst(instance)].foundAddrLen; + memcpy(create_tunnel_resp->enb_addr.buffer,addr,sizeof(addr)); + create_tunnel_resp->enb_addr.length= sizeof(addr); } return !GTPNOK; @@ -725,10 +733,11 @@ int gtpv1u_update_s1u_tunnel( create_tunnel_req->sgw_S1u_teid[0], create_tunnel_req->eps_bearer_id[0]); pthread_mutex_lock(&globGtp.gtp_lock); - auto inst=&globGtp.instances[compatInst(instance)]; + getInstRetInt(compatInst(instance)); if ( inst->ue2te_mapping.find(create_tunnel_req->rnti) == inst->ue2te_mapping.end() ) { - LOG_E(GTPU,"[%ld] Update not already existing tunnel (new rnti %x, old rnti %x)\n", instance, create_tunnel_req->rnti, prior_rnti); + LOG_E(GTPU,"[%ld] Update not already existing tunnel (new rnti %x, old rnti %x)\n", + instance, create_tunnel_req->rnti, prior_rnti); } auto it=inst->ue2te_mapping.find(prior_rnti); @@ -755,7 +764,13 @@ int gtpv1u_create_ngu_tunnel( const instance_t instance, create_tunnel_req->rnti, create_tunnel_req->num_tunnels, create_tunnel_req->outgoing_teid[0]); - tcp_udp_port_t dstport = globGtp.instances[compatInst(instance)].get_dstport(); + pthread_mutex_lock(&globGtp.gtp_lock); + getInstRetInt(compatInst(instance)); + + tcp_udp_port_t dstport = inst->get_dstport(); + uint8_t addr[inst->foundAddrLen]; + memcpy(addr, inst->foundAddr, inst->foundAddrLen); + pthread_mutex_unlock(&globGtp.gtp_lock); for (int i = 0; i < create_tunnel_req->num_tunnels; i++) { teid_t teid = newGtpuCreateTunnel(instance, create_tunnel_req->rnti, @@ -771,9 +786,8 @@ int gtpv1u_create_ngu_tunnel( const instance_t instance, create_tunnel_resp->rnti=create_tunnel_req->rnti; create_tunnel_resp->num_tunnels=create_tunnel_req->num_tunnels; create_tunnel_resp->gnb_NGu_teid[i]=teid; - memcpy(create_tunnel_resp->gnb_addr.buffer,globGtp.instances[compatInst(instance)].foundAddr, - globGtp.instances[compatInst(instance)].foundAddrLen); - create_tunnel_resp->gnb_addr.length= globGtp.instances[compatInst(instance)].foundAddrLen; + memcpy(create_tunnel_resp->gnb_addr.buffer,addr,sizeof(addr)); + create_tunnel_resp->gnb_addr.length= sizeof(addr); } return !GTPNOK; @@ -799,25 +813,19 @@ int newGtpuDeleteAllTunnels(instance_t instance, rnti_t rnti) { LOG_D(GTPU, "[%ld] Start delete tunnels for RNTI %x\n", instance, rnti); pthread_mutex_lock(&globGtp.gtp_lock); - auto inst=&globGtp.instances[compatInst(instance)]; - auto it=inst->ue2te_mapping.find(rnti); - - if ( it == inst->ue2te_mapping.end() ) { - LOG_W(GTPU,"[%ld] Delete GTP tunnels for rnti: %x, but no tunnel exits\n", instance, rnti); - pthread_mutex_unlock(&globGtp.gtp_lock); - return -1; - } + getInstRetInt(compatInst(instance)); + getRntiRetInt(inst, rnti); int nb=0; - for (auto j=it->second.bearers.begin(); - j!=it->second.bearers.end(); + for (auto j=ptrRnti->second.bearers.begin(); + j!=ptrRnti->second.bearers.end(); ++j) { inst->te2ue_mapping.erase(j->second.teid_incoming); nb++; } - inst->ue2te_mapping.erase(it); + inst->ue2te_mapping.erase(ptrRnti); pthread_mutex_unlock(&globGtp.gtp_lock); LOG_I(GTPU, "[%ld] Deleted all tunnels for RNTI %x (%d tunnels deleted)\n", instance, rnti, nb); return !GTPNOK; @@ -834,21 +842,14 @@ int newGtpuDeleteTunnels(instance_t instance, rnti_t rnti, int nbTunnels, pduses LOG_D(GTPU, "[%ld] Start delete tunnels for RNTI %x\n", instance, rnti); pthread_mutex_lock(&globGtp.gtp_lock); - auto inst=&globGtp.instances[compatInst(instance)]; - auto ptrRNTI=inst->ue2te_mapping.find(rnti); - - if ( ptrRNTI == inst->ue2te_mapping.end() ) { - LOG_W(GTPU,"[%ld] Delete GTP tunnels for rnti: %x, but no tunnel exits\n", instance, rnti); - pthread_mutex_unlock(&globGtp.gtp_lock); - return -1; - } - + getInstRetInt(compatInst(instance)); + getRntiRetInt(inst, rnti); int nb=0; for (int i=0; isecond.bearers.find(pdusession_id[i]); + auto ptr2=ptrRnti->second.bearers.find(pdusession_id[i]); - if ( ptr2 == ptrRNTI->second.bearers.end() ) { + if ( ptr2 == ptrRnti->second.bearers.end() ) { LOG_E(GTPU,"[%ld] GTP-U instance: delete of not existing tunnel RNTI:RAB: %x/%x\n", instance, rnti,pdusession_id[i]); } else { inst->te2ue_mapping.erase(ptr2->second.teid_incoming); @@ -856,9 +857,9 @@ int newGtpuDeleteTunnels(instance_t instance, rnti_t rnti, int nbTunnels, pduses } } - if (ptrRNTI->second.bearers.size() == 0 ) + if (ptrRnti->second.bearers.size() == 0 ) // no tunnels on this rnti, erase the ue entry - inst->ue2te_mapping.erase(ptrRNTI); + inst->ue2te_mapping.erase(ptrRnti); pthread_mutex_unlock(&globGtp.gtp_lock); LOG_I(GTPU, "[%ld] Deleted all tunnels for RNTI %x (%d tunnels deleted)\n", instance, rnti, nb); @@ -936,7 +937,8 @@ static int Gtpv1uHandleEndMarker(int h, pthread_mutex_lock(&globGtp.gtp_lock); // the socket Linux file handler is the instance id - auto inst=&globGtp.instances[h]; + getInstRetInt(h); + auto tunnel=inst->te2ue_mapping.find(ntohl(msgHdr->teid)); if ( tunnel == inst->te2ue_mapping.end() ) { @@ -996,7 +998,8 @@ static int Gtpv1uHandleGpdu(int h, pthread_mutex_lock(&globGtp.gtp_lock); // the socket Linux file handler is the instance id - auto inst=&globGtp.instances[h]; + getInstRetInt(h); + auto tunnel=inst->te2ue_mapping.find(ntohl(msgHdr->teid)); if ( tunnel == inst->te2ue_mapping.end() ) { @@ -1007,7 +1010,7 @@ static int Gtpv1uHandleGpdu(int h, /* see TS 29.281 5.1 */ //Minimum length of GTP-U header if non of the optional fields are present - int offset = sizeof(Gtpv1uMsgHeaderT); + unsigned int offset = sizeof(Gtpv1uMsgHeaderT); uint8_t qfi = -1; bool rqi = false; @@ -1025,12 +1028,20 @@ static int Gtpv1uHandleGpdu(int h, extension_header_length = msgBuf[offset]; switch (next_extension_header_type) { case PDU_SESSION_CONTAINER: { + if (offset + sizeof(PDUSessionContainerT) > msgBufLen ) { + LOG_E(GTPU, "gtp-u received header is malformed, ignore gtp packet\n"); + return GTPNOK; + } PDUSessionContainerT *pdusession_cntr = (PDUSessionContainerT *)(msgBuf + offset + 1); qfi = pdusession_cntr->QFI; rqi = pdusession_cntr->Reflective_QoS_activation; break; } case NR_RAN_CONTAINER: { + if (offset + 1 > msgBufLen ) { + LOG_E(GTPU, "gtp-u received header is malformed, ignore gtp packet\n"); + return GTPNOK; + } uint8_t PDU_type = (msgBuf[offset+1]>>4) & 0x0f; if (PDU_type == 0){ //DL USER Data Format int additional_offset = 6; //Additional offset capturing the first non-mandatory octet (TS 38.425, Figure 5.5.2.1-1) @@ -1057,10 +1068,14 @@ static int Gtpv1uHandleGpdu(int h, } default: LOG_W(GTPU, "unhandled extension 0x%2.2x, skipping\n", next_extension_header_type); - break; + break; } offset += extension_header_length * EXT_HDR_LNTH_OCTET_UNITS; + if (offset > msgBufLen ) { + LOG_E(GTPU, "gtp-u received header is malformed, ignore gtp packet\n"); + return GTPNOK; + } next_extension_header_type = msgBuf[offset - 1]; } } @@ -1081,40 +1096,21 @@ static int Gtpv1uHandleGpdu(int h, const rb_id_t rb_id=tunnel->second.incoming_rb_id; const mui_t mui=RLC_MUI_UNDEFINED; const confirm_t confirm=RLC_SDU_CONFIRM_NO; - const sdu_size_t sdu_buffer_size=msgBufLen-offset; + const sdu_size_t sdu_buffer_size = msgBufLen - offset; unsigned char *const sdu_buffer=msgBuf+offset; const pdcp_transmission_mode_t mode=PDCP_TRANSMISSION_MODE_DATA; const uint32_t sourceL2Id=0; const uint32_t destinationL2Id=0; pthread_mutex_unlock(&globGtp.gtp_lock); - if (qfi != -1 && tunnel->second.callBackSDAP) { - if ( !tunnel->second.callBackSDAP(&ctxt, - srb_flag, - rb_id, - mui, - confirm, - sdu_buffer_size, - sdu_buffer, - mode, - &sourceL2Id, - &destinationL2Id, - qfi, - rqi, - tunnel->second.pdusession_id) ) - LOG_E(GTPU,"[%d] down layer refused incoming packet\n", h); - } else { - if ( !tunnel->second.callBack(&ctxt, - srb_flag, - rb_id, - mui, - confirm, - sdu_buffer_size, - sdu_buffer, - mode, - &sourceL2Id, - &destinationL2Id) ) - LOG_E(GTPU,"[%d] down layer refused incoming packet\n", h); + if (sdu_buffer_size > 0) { + if (qfi != -1 && tunnel->second.callBackSDAP) { + if (!tunnel->second.callBackSDAP(&ctxt, srb_flag, rb_id, mui, confirm, sdu_buffer_size, sdu_buffer, mode, &sourceL2Id, &destinationL2Id, qfi, rqi, tunnel->second.pdusession_id)) + LOG_E(GTPU, "[%d] down layer refused incoming packet\n", h); + } else { + if (!tunnel->second.callBack(&ctxt, srb_flag, rb_id, mui, confirm, sdu_buffer_size, sdu_buffer, mode, &sourceL2Id, &destinationL2Id)) + LOG_E(GTPU, "[%d] down layer refused incoming packet\n", h); + } } if(NR_PDCP_PDU_SN > 0 && NR_PDCP_PDU_SN %5 ==0){ @@ -1139,7 +1135,10 @@ static int Gtpv1uHandleGpdu(int h, extensionHeader->buffer[offset] = (NR_PDCP_PDU_SN >> 16) & 0xff; extensionHeader->buffer[offset+1] = (NR_PDCP_PDU_SN >> 8) & 0xff; extensionHeader->buffer[offset+2] = NR_PDCP_PDU_SN & 0xff; - LOG_D(GTPU, "Octets reporting NR_PDCP_PDU_SN, extensionHeader->buffer[offset]: %u, extensionHeader->buffer[offset+1]:%u, extensionHeader->buffer[offset+2]:%u \n", extensionHeader->buffer[offset], extensionHeader->buffer[offset+1],extensionHeader->buffer[offset+2]); + LOG_D(GTPU, "Octets reporting NR_PDCP_PDU_SN, extensionHeader-> %u:%u:%u \n", + extensionHeader->buffer[offset], + extensionHeader->buffer[offset+1], + extensionHeader->buffer[offset+2]); extensionHeader->buffer[offset+3] = 0x00; //Padding octet extensionHeader->buffer[offset+4] = 0x00; //No more extension headers /*Total size of DDD_status PDU = size of mandatory part + @@ -1148,7 +1147,10 @@ static int Gtpv1uHandleGpdu(int h, * according to TS 38.425: Fig. 5.5.2.2-1 and section 5.5.3.24*/ extensionHeader->length = 1+sizeof(DlDataDeliveryStatus_flagsT)+3+1+1; gtpv1uCreateAndSendMsg( - h, peerIp, peerPort, GTP_GPDU, inst->te2ue_mapping[ntohl(msgHdr->teid)].outgoing_teid, NULL, 0, false, false, 0, 0, NR_RAN_CONTAINER, extensionHeader->buffer, extensionHeader->length); + h, peerIp, peerPort, GTP_GPDU, + inst->te2ue_mapping[ntohl(msgHdr->teid)].outgoing_teid, + NULL, 0, false, false, 0, 0, NR_RAN_CONTAINER, + extensionHeader->buffer, extensionHeader->length); } LOG_D(GTPU,"[%d] Received a %d bytes packet for: teid:%x\n", h, @@ -1158,7 +1160,7 @@ static int Gtpv1uHandleGpdu(int h, } void gtpv1uReceiver(int h) { - uint8_t udpData[65536]; + uint8_t udpData[65536]; int udpDataLen; socklen_t from_len; struct sockaddr_in addr; @@ -1172,10 +1174,17 @@ void gtpv1uReceiver(int h) { LOG_W(GTPU, "[%d] Recvfrom returned 0\n", h); return; } else { - uint8_t msgType = *((uint8_t *)(udpData + 1)); - LOG_D(GTPU, "[%d] Received GTP data, msg type: %x\n", h, msgType); - - switch(msgType) { + if ( udpDataLen < (int)sizeof(Gtpv1uMsgHeaderT) ) { + LOG_W(GTPU, "[%d] received malformed gtp packet \n", h); + return; + } + Gtpv1uMsgHeaderT* msg=(Gtpv1uMsgHeaderT*) udpData; + if ( (int)(ntohs(msg->msgLength) + sizeof(Gtpv1uMsgHeaderT)) != udpDataLen ) { + LOG_W(GTPU, "[%d] received malformed gtp packet length\n", h); + return; + } + LOG_D(GTPU, "[%d] Received GTP data, msg type: %x\n", h, msg->msgType); + switch(msg->msgType) { case GTP_ECHO_RSP: break; @@ -1200,7 +1209,7 @@ void gtpv1uReceiver(int h) { break; default: - LOG_E(GTPU, "[%d] Received a GTP packet of unknown type: %d\n", h, msgType); + LOG_E(GTPU, "[%d] Received a GTP packet of unknown type: %d\n", h, msg->msgType); break; } }