diff --git a/openair-cn/GTPV1-U/gtpv1u_eNB.c b/openair-cn/GTPV1-U/gtpv1u_eNB.c index 3e2587329ba744367f0c01be09b38af69d2b9181..9a9560234a7e0c99ac330e2c0461d203d4fec0af 100644 --- a/openair-cn/GTPV1-U/gtpv1u_eNB.c +++ b/openair-cn/GTPV1-U/gtpv1u_eNB.c @@ -53,8 +53,11 @@ #include "UTIL/LOG/log.h" #include "COMMON/platform_types.h" #include "COMMON/platform_constants.h" +#include "UTIL/LOG/vcd_signal_dumper.h" +#define GTP_DUMP_SOCKET 0 + extern boolean_t pdcp_data_req( const module_id_t enb_mod_idP, @@ -155,6 +158,56 @@ void * static gtpv1u_data_t gtpv1u_data_g; +#if defined(GTP_DUMP_SOCKET) +#include <linux/if.h> +static int gtpv1u_dump_socket_g; + +//----------------------------------------------------------------------------- +int gtpv1u_eNB_create_dump_socket(void) { + struct ifreq ifr; + int hdrincl=1; + + if ((gtpv1u_dump_socket_g = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0 ) { + LOG_E(GTPU, "Could not create dump socket %d:%s\n", errno, strerror(errno)); + return -1; + } + + if (setsockopt(gtpv1u_dump_socket_g, + IPPROTO_IP, + IP_HDRINCL, + &hdrincl, + sizeof(hdrincl))==-1) { + LOG_E(GTPU, "%s:%d set IP_HDRINCL %d:%s\n", + __FILE__, __LINE__, errno, strerror(errno)); + } + + memset(&ifr, 0, sizeof(ifr)); + snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "lo"); + if (setsockopt(gtpv1u_dump_socket_g, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr)) < 0) + { + LOG_E(GTPU, "%s:%d setsockopt SO_BINDTODEVICE %d:%s\n", + __FILE__, __LINE__, errno, strerror(errno)); + close(gtpv1u_dump_socket_g); + return -1; + } +} + +//----------------------------------------------------------------------------- +static void gtpv1u_eNB_write_dump_socket(uint8_t *buffer_pP, uint32_t buffer_lengthP) { + struct sockaddr_in sin; + memset(&sin, 0, sizeof(sin)); + sin.sin_family = AF_INET; + sin.sin_addr.s_addr = INADDR_LOOPBACK; + + if (sendto(gtpv1u_dump_socket_g, buffer_pP, (size_t)buffer_lengthP, 0, (struct sockaddr *)&sin, sizeof(struct sockaddr)) < 0) { + LOG_E(GTPU, "%s:%s:%d setsockopt SO_BINDTODEVICE %d:%s\n", + __FILE__, __FUNCTION__, __LINE__, errno, strerror(errno)); + } +} + +#endif + +//----------------------------------------------------------------------------- static int gtpv1u_eNB_send_init_udp(uint16_t port_number) { // Create and alloc new message @@ -176,6 +229,7 @@ static int gtpv1u_eNB_send_init_udp(uint16_t port_number) return itti_send_msg_to_task(TASK_UDP, INSTANCE_DEFAULT, message_p); } +//----------------------------------------------------------------------------- NwGtpv1uRcT gtpv1u_eNB_log_request(NwGtpv1uLogMgrHandleT hLogMgr, NwU32T logLevel, NwCharT *file, @@ -186,6 +240,7 @@ NwGtpv1uRcT gtpv1u_eNB_log_request(NwGtpv1uLogMgrHandleT hLogMgr, return NW_GTPV1U_OK; } +//----------------------------------------------------------------------------- NwGtpv1uRcT gtpv1u_eNB_send_udp_msg( NwGtpv1uUdpHandleT udpHandle, NwU8T *buffer, @@ -215,6 +270,7 @@ NwGtpv1uRcT gtpv1u_eNB_send_udp_msg( } +//----------------------------------------------------------------------------- /* Callback called when a gtpv1u message arrived on UDP interface */ NwGtpv1uRcT gtpv1u_eNB_process_stack_req( NwGtpv1uUlpHandleT hUlp, @@ -242,6 +298,9 @@ NwGtpv1uRcT gtpv1u_eNB_process_stack_req( LOG_E(GTPU, "Error while retrieving T-PDU"); } itti_free(TASK_UDP, ((NwGtpv1uMsgT*)pUlpApi->apiInfo.recvMsgInfo.hMsg)->msgBuf); +#if defined(GTP_DUMP_SOCKET) + gtpv1u_eNB_write_dump_socket(buffer,buffer_len); +#endif //----------------------- // GTPV1U->PDCP mapping @@ -284,6 +343,7 @@ NwGtpv1uRcT gtpv1u_eNB_process_stack_req( } +//----------------------------------------------------------------------------- int data_recv_callback(uint16_t portP, uint32_t address, uint8_t *buffer, @@ -401,6 +461,7 @@ int data_recv_callback(uint16_t portP, //} +//----------------------------------------------------------------------------- static NwGtpv1uRcT gtpv1u_start_timer_wrapper( NwGtpv1uTimerMgrHandleT tmrMgrHandle, NwU32T timeoutSec, @@ -435,7 +496,9 @@ static NwGtpv1uRcT gtpv1u_start_timer_wrapper( } -static NwGtpv1uRcT gtpv1u_stop_timer_wrapper( +//----------------------------------------------------------------------------- +static NwGtpv1uRcT +gtpv1u_stop_timer_wrapper( NwGtpv1uTimerMgrHandleT tmrMgrHandle, NwGtpv1uTimerHandleT hTmr) { @@ -446,6 +509,7 @@ static NwGtpv1uRcT gtpv1u_stop_timer_wrapper( } +//----------------------------------------------------------------------------- int gtpv1u_initial_req( gtpv1u_data_t *gtpv1u_data_pP, @@ -472,6 +536,7 @@ gtpv1u_initial_req( return (rc == NW_GTPV1U_OK) ? 0 : -1; } +//----------------------------------------------------------------------------- int gtpv1u_new_data_req( uint8_t enb_idP, @@ -557,7 +622,10 @@ gtpv1u_new_data_req( return 0; } -static int gtpv1u_create_s1u_tunnel(gtpv1u_enb_create_tunnel_req_t *create_tunnel_req_pP) +//----------------------------------------------------------------------------- +static int +gtpv1u_create_s1u_tunnel( + gtpv1u_enb_create_tunnel_req_t *create_tunnel_req_pP) { /* Create a new nw-gtpv1-u stack req using API */ NwGtpv1uUlpApiT stack_req; @@ -673,6 +741,7 @@ static int gtpv1u_create_s1u_tunnel(gtpv1u_enb_create_tunnel_req_t *create_tunne +//----------------------------------------------------------------------------- static int gtpv1u_delete_s1u_tunnel(gtpv1u_enb_delete_tunnel_req_t *req_pP) { NwGtpv1uUlpApiT stack_req; @@ -736,6 +805,7 @@ static int gtpv1u_delete_s1u_tunnel(gtpv1u_enb_delete_tunnel_req_t *req_pP) return itti_send_msg_to_task(TASK_RRC_ENB, INSTANCE_DEFAULT, message_p); } +//----------------------------------------------------------------------------- static int gtpv1u_eNB_init(void) { int ret; @@ -817,11 +887,11 @@ static int gtpv1u_eNB_init(void) return -1; } -/* if (itti_create_task(TASK_GTPV1_U, >pv1u_eNB_thread, NULL) < 0) { - LOG_E(GTPU, "gtpv1u phtread_create: %s", strerror(errno)); +#if defined(GTP_DUMP_SOCKET) + if ((ret = gtpv1u_eNB_create_dump_socket()) < 0) { return -1; } -*/ +#endif ret = gtpv1u_eNB_send_init_udp(gtpv1u_data_g.enb_port_for_S1u_S12_S4_up); if (ret < 0) { return ret; @@ -832,6 +902,7 @@ static int gtpv1u_eNB_init(void) } +//----------------------------------------------------------------------------- void *gtpv1u_eNB_task(void *args) { int rc = 0; @@ -845,6 +916,7 @@ void *gtpv1u_eNB_task(void *args) */ MessageDef *received_message_p = NULL; itti_receive_msg(TASK_GTPV1_U, &received_message_p); + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_GTPV1U_ENB_TASK, VCD_FUNCTION_IN); DevAssert(received_message_p != NULL); switch (ITTI_MSG_ID(received_message_p)) @@ -885,6 +957,9 @@ void *gtpv1u_eNB_task(void *args) data_req_p = >PV1U_ENB_TUNNEL_DATA_REQ(received_message_p); //ipv4_send_data(ipv4_data_p->sd, data_ind_p->buffer, data_ind_p->length); +#if defined(GTP_DUMP_SOCKET) + gtpv1u_eNB_write_dump_socket(&data_req_p->buffer[data_req_p->offset],data_req_p->length); +#endif memset(&stack_req, 0, sizeof(NwGtpv1uUlpApiT)); hash_rc = hashtable_get(gtpv1u_data_g.ue_mapping, (uint64_t)data_req_p->ue_index, (void**)>pv1u_ue_data_p); @@ -909,18 +984,18 @@ void *gtpv1u_eNB_task(void *args) data_req_p->offset, &(stack_req.apiInfo.sendtoInfo.hMsg)); - if (rc != NW_GTPV1U_OK) { - LOG_E(GTPU, "nwGtpv1uGpduMsgNew failed: 0x%x\n", rc); - } else { - rc = nwGtpv1uProcessUlpReq(gtpv1u_data_g.gtpv1u_stack, &stack_req); if (rc != NW_GTPV1U_OK) { - LOG_E(GTPU, "nwGtpv1uProcessUlpReq failed: 0x%x\n", rc); - } - rc = nwGtpv1uMsgDelete(gtpv1u_data_g.gtpv1u_stack, + LOG_E(GTPU, "nwGtpv1uGpduMsgNew failed: 0x%x\n", rc); + } else { + rc = nwGtpv1uProcessUlpReq(gtpv1u_data_g.gtpv1u_stack, &stack_req); + if (rc != NW_GTPV1U_OK) { + LOG_E(GTPU, "nwGtpv1uProcessUlpReq failed: 0x%x\n", rc); + } + rc = nwGtpv1uMsgDelete(gtpv1u_data_g.gtpv1u_stack, stack_req.apiInfo.sendtoInfo.hMsg); - if (rc != NW_GTPV1U_OK) { - LOG_E(GTPU, "nwGtpv1uMsgDelete failed: 0x%x\n", rc); - } + if (rc != NW_GTPV1U_OK) { + LOG_E(GTPU, "nwGtpv1uMsgDelete failed: 0x%x\n", rc); + } } } } @@ -942,6 +1017,7 @@ void *gtpv1u_eNB_task(void *args) case TIMER_HAS_EXPIRED: nwGtpv1uProcessTimeout(&received_message_p->ittiMsg.timer_has_expired.arg); break; + default: { LOG_E(GTPU, "Unkwnon message ID %d:%s\n", ITTI_MSG_ID(received_message_p), @@ -952,6 +1028,7 @@ void *gtpv1u_eNB_task(void *args) rc = itti_free(ITTI_MSG_ORIGIN_ID(received_message_p), received_message_p); AssertFatal(rc == EXIT_SUCCESS, "Failed to free memory (%d)!\n", rc); received_message_p = NULL; + vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_GTPV1U_ENB_TASK, VCD_FUNCTION_OUT); } return NULL; }