diff --git a/openair3/NAS/UE/ESM/esm_ebr_context.c b/openair3/NAS/UE/ESM/esm_ebr_context.c index ca69687abe5230849e6b697c6b1d554042c9f792..02278ddf1a2450358ccae33e0799901ef3d6ab8a 100644 --- a/openair3/NAS/UE/ESM/esm_ebr_context.c +++ b/openair3/NAS/UE/ESM/esm_ebr_context.c @@ -45,6 +45,7 @@ Description Defines functions used to handle EPS bearer contexts. #include "esm_ebr.h" #include "esm_ebr_context.h" +#include "openair2/RRC/NAS/nas_config.h" #include "emm_sap.h" #include "system.h" @@ -194,15 +195,6 @@ int esm_ebr_context_create( // LG ADD TEMP { - char *tmp = NULL; - char ipv4_addr[INET_ADDRSTRLEN]; - //char ipv6_addr[INET6_ADDRSTRLEN]; - int netmask = 32; - char broadcast[INET_ADDRSTRLEN]; - struct in_addr in_addr; - char command_line[500]; - int res = -1; - switch (pdn->type) { case NET_PDN_TYPE_IPV4V6: @@ -210,135 +202,14 @@ int esm_ebr_context_create( /* TODO? */ // etc - case NET_PDN_TYPE_IPV4: - // in_addr is in network byte order - in_addr.s_addr = pdn->ip_addr[0] << 24 | - ((pdn->ip_addr[1] << 16) & 0x00FF0000) | - ((pdn->ip_addr[2] << 8) & 0x0000FF00) | - ( pdn->ip_addr[3] & 0x000000FF); - in_addr.s_addr = htonl(in_addr.s_addr); - tmp = inet_ntoa(in_addr); - //AssertFatal(tmp , - // "error in PDN IPv4 address %x", - // in_addr.s_addr); - strcpy(ipv4_addr, tmp); - - if (IN_CLASSA(ntohl(in_addr.s_addr))) { - netmask = 8; - in_addr.s_addr = pdn->ip_addr[0] << 24 | - ((255 << 16) & 0x00FF0000) | - ((255 << 8) & 0x0000FF00) | - ( 255 & 0x000000FF); - in_addr.s_addr = htonl(in_addr.s_addr); - tmp = inet_ntoa(in_addr); - // AssertFatal(tmp , - // "error in PDN IPv4 address %x", - // in_addr.s_addr); - strcpy(broadcast, tmp); - } else if (IN_CLASSB(ntohl(in_addr.s_addr))) { - netmask = 16; - in_addr.s_addr = pdn->ip_addr[0] << 24 | - ((pdn->ip_addr[1] << 16) & 0x00FF0000) | - ((255 << 8) & 0x0000FF00) | - ( 255 & 0x000000FF); - in_addr.s_addr = htonl(in_addr.s_addr); - tmp = inet_ntoa(in_addr); - // AssertFatal(tmp , - // "error in PDN IPv4 address %x", - // in_addr.s_addr); - strcpy(broadcast, tmp); - } else if (IN_CLASSC(ntohl(in_addr.s_addr))) { - netmask = 24; - in_addr.s_addr = pdn->ip_addr[0] << 24 | - ((pdn->ip_addr[1] << 16) & 0x00FF0000) | - ((pdn->ip_addr[2] << 8) & 0x0000FF00) | - ( 255 & 0x000000FF); - in_addr.s_addr = htonl(in_addr.s_addr); - tmp = inet_ntoa(in_addr); - // AssertFatal(tmp , - // "error in PDN IPv4 address %x", - // in_addr.s_addr); - strcpy(broadcast, tmp); - } else { - netmask = 32; - strcpy(broadcast, ipv4_addr); - } - LOG_D(NAS, "setting commandline string: " - "ip address add %s/%d broadcast %s dev %s%d && " - "ip link set %s%d up && " - "ip rule add from %s/32 table %d && " - "ip rule add to %s/32 table %d && " - "ip route add default dev %s%d table %d", - ipv4_addr, netmask, broadcast, - UE_NAS_USE_TUN ? "oaitun_ue" : "oip", ueid + 1, - UE_NAS_USE_TUN ? "oaitun_ue" : "oip", ueid + 1, - ipv4_addr, ueid + 10000, - ipv4_addr, ueid + 10000, - UE_NAS_USE_TUN ? "oaitun_ue" : "oip", - ueid + 1, ueid + 10000); - if (!get_softmodem_params()->nsa) - { - res = sprintf(command_line, - "ip address add %s/%d broadcast %s dev %s%d && " - "ip link set %s%d up && " - "ip rule add from %s/32 table %d && " - "ip rule add to %s/32 table %d && " - "ip route add default dev %s%d table %d", - ipv4_addr, netmask, broadcast, - UE_NAS_USE_TUN ? "oaitun_ue" : "oip", ueid + 1, - UE_NAS_USE_TUN ? "oaitun_ue" : "oip", ueid + 1, - ipv4_addr, ueid + 10000, - ipv4_addr, ueid + 10000, - UE_NAS_USE_TUN ? "oaitun_ue" : "oip", - ueid + 1, ueid + 10000); - - if ( res<0 ) { - LOG_TRACE(WARNING, "ESM-PROC - Failed to system command string"); - } - - /* Calling system() here disrupts UE's realtime processing in some cases. - * This may be because of the call to fork(), which, for some - * unidentified reason, interacts badly with other (realtime) threads. - * background_system() is a replacement mechanism relying on a - * background process that does the system() and reports result to - * the parent process (lte-softmodem, oaisim, ...). The background - * process is created very early in the life of the parent process. - * The processes interact through standard pipes. See - * common/utils/system.c for details. - */ - - LOG_TRACE(INFO, "ESM-PROC - executing %s ", - command_line); - if (background_system(command_line) != 0) - { - LOG_TRACE(ERROR, "ESM-PROC - failed command '%s'", command_line); - } - } - else if (get_softmodem_params()->nsa) { - res = sprintf(command_line, - "ip address add %s/%d broadcast %s dev %s%d && " - "ip link set %s%d up && " - "ip rule add from %s/32 table %d && " - "ip rule add to %s/32 table %d && " - "ip route add default dev %s%d table %d", - ipv4_addr, netmask, broadcast, - UE_NAS_USE_TUN ? "oaitun_nru" : "oip", ueid + 1, - UE_NAS_USE_TUN ? "oaitun_nru" : "oip", ueid + 1, - ipv4_addr, ueid + 10000, - ipv4_addr, ueid + 10000, - UE_NAS_USE_TUN ? "oaitun_nru" : "oip", - ueid + 1, ueid + 10000); - - if ( res<0 ) { - LOG_TRACE(WARNING, "ESM-PROC - Failed to system command string"); - } - LOG_D(NAS, "Sending NAS_OAI_TUN_NSA msg to LTE UE via itti\n"); - MessageDef *msg_p = itti_alloc_new_message(TASK_NAS_UE, 0, NAS_OAI_TUN_NSA); - memcpy(NAS_OAI_TUN_NSA(msg_p).buffer, command_line, sizeof(NAS_OAI_TUN_NSA(msg_p).buffer)); - itti_send_msg_to_task(TASK_RRC_UE, 0, msg_p); - } - - break; + case NET_PDN_TYPE_IPV4: { + char ip[20]; + char *ip_addr = pdn->ip_addr; + snprintf(ip, sizeof(ip), "%d.%d.%d.%d", ip_addr[0], ip_addr[1], ip_addr[2], ip_addr[3]); + const char *ifn = get_softmodem_params()->nsa ? "oaitun_nru" : "oaitun_ue"; + nas_config(1, ip, NULL, ifn); + setup_ue_ipv4_route(1, ip, ifn); + } break; case NET_PDN_TYPE_IPV6: break;