Commit c3bc4f63 authored by gauthier's avatar gauthier
Browse files

more parameters in config for S1U

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@6119 818b1a75-f10b-46b9-bf7c-635c3b92a50f
parent 0055b0ab
......@@ -698,6 +698,7 @@ sgw_lite_handle_sgi_endpoint_updated(
if (iptable_uplink_remove_gtpu == FALSE) {
ret = snprintf(cmd,
256,
// no "-p udp --dport 2152" because of fragmented packets
"iptables -t raw -I PREROUTING -i %s -s %u.%u.%u.%u -d %u.%u.%u.%u -p udp --dport 2152 -j GTPURH --action remove",
sgw_app.sgw_interface_name_for_S1u_S12_S4_up,
eps_bearer_entry_p->enb_ip_address_for_S1u.address.ipv4_address[0],
......
......@@ -51,6 +51,12 @@
#include "sgw_lite_defs.h"
#include "intertask_interface.h"
#ifdef LIBCONFIG_LONG
#define libconfig_int long
#else
#define libconfig_int int
#endif
#define NIPADDR(addr) \
(uint8_t)(addr & 0x000000FF), \
(uint8_t)((addr & 0x0000FF00) >> 8), \
......@@ -124,44 +130,6 @@ sgw_ipv6_mask_in6_addr(
}
}
/*int is_valid_ip_address(char *addr_pP, int ai_familyP , struct sockaddr *sock_addr_pP) {
struct addrinfo hints;
struct addrinfo *result, *rp;
int sfd, s;
if (addr_pP == NULL) {
SPGW_APP_ERROR("Bad parameter addr is NULL\n");
return 0;
}
if ((ai_familyP != AF_INET) && (ai_familyP != AF_INET6)) {
SPGW_APP_ERROR("Bad parameter ai_family:%d\n", ai_familyP);
return 0;
}
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = ai_familyP; // AF_INET, AF_INET6
hints.ai_socktype = 0; // UDP or TCP
hints.ai_flags = AI_PASSIVE; // For wildcard IP address
hints.ai_protocol = 0; // Any protocol
hints.ai_canonname = NULL;
hints.ai_addr = NULL;
hints.ai_next = NULL;
s = getaddrinfo(NULL, addr_pP, &hints, &result);
if (s != 0) {
SPGW_APP_ERROR("getaddrinfo: %s\n", gai_strerror(s));
return 0;
}
for (rp = result; rp != NULL; rp = rp->ai_next) {
memcpy(sock_addr_pP, (char*)rp->ai_addr, rp->ai_addrlen);
printf ("Found sock addr length %d\n", rp->ai_addrlen);
freeaddrinfo(result);
return 1;
}
return 0;
}*/
int spgw_config_init(char* lib_config_file_name_pP, spgw_config_t* config_pP) {
config_t cfg;
......@@ -172,6 +140,9 @@ int spgw_config_init(char* lib_config_file_name_pP, spgw_config_t* config_pP) {
char *sgw_ipv4_address_for_S5_S8_up = NULL;
char *sgw_interface_name_for_S11 = NULL;
char *sgw_ipv4_address_for_S11 = NULL;
char *sgw_drop_uplink_s1u_traffic = NULL;
char *sgw_drop_downlink_s1u_traffic = NULL;
libconfig_int sgw_interface_mtu_for_S1u_S12_S4_up = 1500;
config_setting_t *setting_pgw = NULL;
config_setting_t *subsetting = NULL;
......@@ -180,6 +151,7 @@ int spgw_config_init(char* lib_config_file_name_pP, spgw_config_t* config_pP) {
char *pgw_ipv4_address_for_S5_S8 = NULL;
char *pgw_interface_name_for_SGI = NULL;
char *pgw_ipv4_address_for_SGI = NULL;
char *pgw_masquerade_SGI = NULL;
char *pgw_default_dns_ipv4_address = NULL;
char *pgw_default_dns_sec_ipv4_address = NULL;
......@@ -289,6 +261,50 @@ int spgw_config_init(char* lib_config_file_name_pP, spgw_config_t* config_pP) {
config_pP->sgw_config.ipv4.sgw_ip_netmask_for_S11,
config_pP->sgw_config.ipv4.sgw_interface_name_for_S11);
}
// optional
if(config_setting_lookup_int(
subsetting,
SGW_CONFIG_STRING_SGW_INTERFACE_MTU_FOR_S1U_S12_S4_UP,
&sgw_interface_mtu_for_S1u_S12_S4_up)
) {
config_pP->sgw_config.sgw_interface_mtu_for_S1u_S12_S4_up = sgw_interface_mtu_for_S1u_S12_S4_up;
if (snprintf(system_cmd, 128,
"ip link set dev %s mtu %u",
config_pP->sgw_config.ipv4.sgw_interface_name_for_S1u_S12_S4_up,
config_pP->sgw_config.sgw_interface_mtu_for_S1u_S12_S4_up) > 0) {
SPGW_APP_INFO("Set S1U interface MTU: %s\n",system_cmd);
system(system_cmd);
} else {
SPGW_APP_ERROR("Set S1U interface MTU\n");
}
}
}
if( (
config_setting_lookup_string( setting_sgw, SGW_CONFIG_STRING_SGW_DROP_UPLINK_S1U_TRAFFIC,
(const char **)&sgw_drop_uplink_s1u_traffic)
&& config_setting_lookup_string( setting_sgw, SGW_CONFIG_STRING_SGW_DROP_DOWNLINK_S1U_TRAFFIC,
(const char **)&sgw_drop_downlink_s1u_traffic)
)
) {
if (strcasecmp(sgw_drop_uplink_s1u_traffic, "yes") == 0) {
config_pP->sgw_config.sgw_drop_uplink_traffic=1;
if (snprintf(system_cmd, 128,
"iptables -t raw -I PREROUTING -i %s --protocol udp --destination-port 2152 -j DROP",
config_pP->sgw_config.ipv4.sgw_interface_name_for_S1u_S12_S4_up) > 0) {
SPGW_APP_INFO("Drop uplink traffic: %s\n",system_cmd);
system(system_cmd);
} else {
SPGW_APP_ERROR("Drop uplink traffic\n");
}
} else {
config_pP->sgw_config.sgw_drop_uplink_traffic=0;
}
if (strcasecmp(sgw_drop_downlink_s1u_traffic, "yes") == 0) {
config_pP->sgw_config.sgw_drop_downlink_traffic=1;
} else {
config_pP->sgw_config.sgw_drop_downlink_traffic=0;
}
}
}
......@@ -310,6 +326,9 @@ int spgw_config_init(char* lib_config_file_name_pP, spgw_config_t* config_pP) {
&& config_setting_lookup_string(subsetting,
PGW_CONFIG_STRING_PGW_IPV4_ADDR_FOR_SGI,
(const char **)&pgw_ipv4_address_for_SGI)
&& config_setting_lookup_string(subsetting,
PGW_CONFIG_STRING_PGW_MASQUERADE_SGI,
(const char **)&pgw_masquerade_SGI)
)
) {
config_pP->pgw_config.ipv4.pgw_interface_name_for_S5_S8 = strdup(pgw_interface_name_for_S5_S8);
......@@ -321,9 +340,9 @@ int spgw_config_init(char* lib_config_file_name_pP, spgw_config_t* config_pP) {
free(cidr);
in_addr_var.s_addr = config_pP->pgw_config.ipv4.pgw_ipv4_address_for_S5_S8;
SPGW_APP_INFO("Parsing configuration file found pgw_ipv4_address_for_S5_S8: %s/%d on %s\n",
inet_ntoa(in_addr_var),
config_pP->pgw_config.ipv4.pgw_ip_netmask_for_S5_S8,
config_pP->pgw_config.ipv4.pgw_interface_name_for_S5_S8);
inet_ntoa(in_addr_var),
config_pP->pgw_config.ipv4.pgw_ip_netmask_for_S5_S8,
config_pP->pgw_config.ipv4.pgw_interface_name_for_S5_S8);
config_pP->pgw_config.ipv4.pgw_interface_name_for_SGI = strdup(pgw_interface_name_for_SGI);
cidr = strdup(pgw_ipv4_address_for_SGI);
......@@ -334,9 +353,24 @@ int spgw_config_init(char* lib_config_file_name_pP, spgw_config_t* config_pP) {
free(cidr);
in_addr_var.s_addr = config_pP->pgw_config.ipv4.pgw_ipv4_address_for_SGI;
SPGW_APP_INFO("Parsing configuration file found pgw_ipv4_address_for_SGI: %s/%d on %s\n",
inet_ntoa(in_addr_var),
config_pP->pgw_config.ipv4.pgw_ip_netmask_for_SGI,
config_pP->pgw_config.ipv4.pgw_interface_name_for_SGI);
inet_ntoa(in_addr_var),
config_pP->pgw_config.ipv4.pgw_ip_netmask_for_SGI,
config_pP->pgw_config.ipv4.pgw_interface_name_for_SGI);
if (strcasecmp(pgw_masquerade_SGI, "yes") == 0) {
config_pP->pgw_config.pgw_masquerade_SGI=1;
if (snprintf(system_cmd, 128,
"iptables -t nat -A POSTROUTING -o %s ! --protocol sctp -j MASQUERADE",
config_pP->pgw_config.ipv4.pgw_interface_name_for_SGI) > 0) {
SPGW_APP_INFO("Masquerade SGI: %s\n",system_cmd);
system(system_cmd);
} else {
SPGW_APP_ERROR("Masquerade SGI\n");
}
} else {
config_pP->pgw_config.pgw_masquerade_SGI=0;
SPGW_APP_INFO("No masquerading for SGI\n");
}
#if defined (ENABLE_USE_GTPU_IN_KERNEL)
if (snprintf(system_cmd, 128,
......@@ -356,14 +390,6 @@ int spgw_config_init(char* lib_config_file_name_pP, spgw_config_t* config_pP) {
} else {
SPGW_APP_ERROR("Restore mark\n");
}
if (snprintf(system_cmd, 128,
"iptables -t nat -A POSTROUTING -o %s ! --protocol sctp -j MASQUERADE",
config_pP->pgw_config.ipv4.pgw_interface_name_for_SGI) > 0) {
SPGW_APP_INFO("Masquerade SGI: %s\n",system_cmd);
system(system_cmd);
} else {
SPGW_APP_ERROR("Masquerade SGI\n");
}
#endif
} else {
SPGW_APP_WARN("CONFIG P-GW / NETWORK INTERFACES parsing failed\n");
......@@ -397,6 +423,25 @@ int spgw_config_init(char* lib_config_file_name_pP, spgw_config_t* config_pP) {
} else {
SPGW_APP_ERROR("Add route: for %s\n", astring);
}
if (config_pP->sgw_config.sgw_drop_downlink_traffic) {
if (snprintf(system_cmd, 128,
"iptables -t filter -I FORWARD -d %s/%s -j DROP",
astring, atoken2) > 0) {
SPGW_APP_INFO("Drop downlink traffic: %s\n",system_cmd);
system(system_cmd);
} else {
SPGW_APP_ERROR("Drop downlink traffic\n");
}
if (snprintf(system_cmd, 128,
"iptables -t filter -I OUTPUT -d %s/%s -j DROP",
astring, atoken2) > 0) {
SPGW_APP_INFO("Drop downlink traffic: %s\n",system_cmd);
system(system_cmd);
} else {
SPGW_APP_ERROR("Drop downlink traffic\n");
}
}
#endif
prefix_mask = atoi(atoken2);
if ((prefix_mask >= 2)&&(prefix_mask < 32)) {
......@@ -496,7 +541,6 @@ int spgw_config_init(char* lib_config_file_name_pP, spgw_config_t* config_pP) {
IPV4_STR_ADDR_TO_INT_NWBO ( pgw_default_dns_sec_ipv4_address, config_pP->pgw_config.ipv4.default_dns_sec_v4, "BAD IPv4 ADDRESS FORMAT FOR DEFAULT DNS SEC!\n" )
}
}
} else {
SPGW_APP_WARN("CONFIG P-GW not found\n");
}
......
......@@ -47,9 +47,12 @@
#define SGW_CONFIG_STRING_SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP "SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP"
#define SGW_CONFIG_STRING_SGW_PORT_FOR_S1U_S12_S4_UP "SGW_IPV4_PORT_FOR_S1U_S12_S4_UP"
#define SGW_CONFIG_STRING_SGW_INTERFACE_NAME_FOR_S5_S8_UP "SGW_INTERFACE_NAME_FOR_S5_S8_UP"
#define SGW_CONFIG_STRING_SGW_INTERFACE_MTU_FOR_S1U_S12_S4_UP "SGW_INTERFACE_MTU_FOR_S1U_S12_S4_UP"
#define SGW_CONFIG_STRING_SGW_IPV4_ADDRESS_FOR_S5_S8_UP "SGW_IPV4_ADDRESS_FOR_S5_S8_UP"
#define SGW_CONFIG_STRING_SGW_INTERFACE_NAME_FOR_S11 "SGW_INTERFACE_NAME_FOR_S11"
#define SGW_CONFIG_STRING_SGW_IPV4_ADDRESS_FOR_S11 "SGW_IPV4_ADDRESS_FOR_S11"
#define SGW_CONFIG_STRING_SGW_DROP_UPLINK_S1U_TRAFFIC "SGW_DROP_UPLINK_S1U_TRAFFIC"
#define SGW_CONFIG_STRING_SGW_DROP_DOWNLINK_S1U_TRAFFIC "SGW_DROP_DOWNLINK_S1U_TRAFFIC"
#define PGW_CONFIG_STRING_PGW_CONFIG "P-GW"
#define PGW_CONFIG_STRING_NETWORK_INTERFACES_CONFIG "NETWORK_INTERFACES"
......@@ -57,6 +60,7 @@
#define PGW_CONFIG_STRING_PGW_IPV4_ADDRESS_FOR_S5_S8 "PGW_IPV4_ADDRESS_FOR_S5_S8"
#define PGW_CONFIG_STRING_PGW_INTERFACE_NAME_FOR_SGI "PGW_INTERFACE_NAME_FOR_SGI"
#define PGW_CONFIG_STRING_PGW_IPV4_ADDR_FOR_SGI "PGW_IPV4_ADDRESS_FOR_SGI"
#define PGW_CONFIG_STRING_PGW_MASQUERADE_SGI "PGW_MASQUERADE_SGI"
#define PGW_CONFIG_STRING_IP_ADDRESS_POOL "IP_ADDRESS_POOL"
#define PGW_CONFIG_STRING_IPV4_ADDRESS_LIST "IPV4_LIST"
......@@ -91,6 +95,10 @@ typedef struct sgw_config_s {
uint32_t sgw_ipv4_address_for_S11;
int sgw_ip_netmask_for_S11;
} ipv4;
int sgw_interface_mtu_for_S1u_S12_S4_up;
uint8_t sgw_drop_uplink_traffic;
uint8_t sgw_drop_downlink_traffic;
} sgw_config_t;
// may be more
......@@ -123,6 +131,7 @@ typedef struct pgw_config_s {
uint32_t default_dns_v4; // NBO
uint32_t default_dns_sec_v4;// NBO
} ipv4;
uint8_t pgw_masquerade_SGI;
STAILQ_HEAD(pgw_lite_ipv4_pool_head_s, pgw_lite_conf_ipv4_list_elm_s) pgw_lite_ipv4_pool_list;
STAILQ_HEAD(pgw_lite_ipv6_pool_head_s, pgw_lite_conf_ipv6_list_elm_s) pgw_lite_ipv6_pool_list;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment