Re-add feature custom GTP-U address #367

Provide custom SGW-U GTP-U address to be advertised inside S1AP messages.
And also, custom UPF GTP-U address to be advertised inside NGAP messages.
This commit is contained in:
Sukchan Lee 2020-10-26 21:44:50 -04:00
parent a470131489
commit 4f2803c058
4 changed files with 164 additions and 15 deletions

View File

@ -29,18 +29,49 @@ logger:
# o GTP-U Server(all address available)
# gtpu:
#
# o Provide custom SGW GTP-U address to be advertised inside S1AP messages
# o GTP-U Server(127.0.0.6:2152, [::1]:2152)
# gtpu:
# addr: 10.4.128.21
# advertise_addr: 172.24.15.30
# - addr:
# - 127.0.0.6
# - ::1
#
# o GTP-U Server(127.0.0.1:2152, [::1]:2152)
# gtpu:
# - name: localhost
#
# o User Plane IP Resource information
# gtpu:
# - addr:
# - 127.0.0.6
# - ::1
# teid_range_indication: 4
# teid_range: 10
# network_instance: internet
# source_interface: 0
# - addr: 127.0.10.4
# teid_range_indication: 4
# teid_range: 5
# network_instance: ims
# source_interface: 1
#
# o Provide custom SGW-U GTP-U address to be advertised inside S1AP messages
# gtpu:
# - addr: 10.4.128.21
# advertise_addr: 172.24.15.30
#
# gtpu:
# addr: 10.4.128.21
# advertise_name: sgw1.epc.mnc001.mcc001.3gppnetwork.org
# - addr: 10.4.128.21
# advertise_addr:
# - 127.0.0.1
# - ::1
#
# gtpu:
# dev: ens3
# advertise_name: sgw1.epc.mnc001.mcc001.3gppnetwork.org
# - addr: 10.4.128.21
# advertise_name: sgw1.epc.mnc001.mcc001.3gppnetwork.org
#
# gtpu:
# - dev: ens3
# advertise_name: sgw1.epc.mnc001.mcc001.3gppnetwork.org
#
# <PFCP Server>
#

View File

@ -26,19 +26,23 @@ logger:
#
# <PFCP Server>
#
# o PFCP Server(127.0.0.7:8805)
# o PFCP Server(127.0.0.7:8805, ::1:8805)
# pfcp:
# addr: 127.0.0.7
# - addr: 127.0.0.7
# - addr: ::1
#
# <GTP-U Server>>
#
# o GTP-U Server(all address available)
# gtpu:
#
# o GTP-U Server(127.0.0.7:2152, [::1]:2152)
# gtpu:
# - addr:
# - 127.0.0.7
# - ::1
#
# o Same configuration(127.0.0.7:2152, [::1]:2152) as below.
# o GTP-U Server(127.0.0.1:2152, [::1]:2152)
# gtpu:
# name: localhost
#
@ -57,6 +61,26 @@ logger:
# network_instance: ims
# source_interface: 1
#
# o Provide custom UPF GTP-U address to be advertised inside NGAP messages
# gtpu:
# - addr: 10.4.128.21
# advertise_addr: 172.24.15.30
#
# gtpu:
# - addr: 10.4.128.21
# advertise_addr:
# - 127.0.0.1
# - ::1
#
# gtpu:
# - addr: 10.4.128.21
# advertise_name: upf1.5gc.mnc001.mcc001.3gppnetwork.org
#
# gtpu:
# - dev: ens3
# advertise_name: upf1.5gc.mnc001.mcc001.3gppnetwork.org
#
#
# <PDN Configuration with UE Pool>
#
# o IPv4 Pool

View File

@ -127,10 +127,14 @@ int sgwu_context_parse_config(void)
do {
int family = AF_UNSPEC;
int i, num = 0;
int adv_num = 0;
const char *hostname[OGS_MAX_NUM_OF_HOSTNAME];
const char *adv_hostname[OGS_MAX_NUM_OF_HOSTNAME];
uint16_t port = self.gtpu_port;
const char *dev = NULL;
ogs_sockaddr_t *addr = NULL;
ogs_sockaddr_t *adv_addr = NULL;
ogs_sockaddr_t *adv_addr6 = NULL;
const char *teid_range_indication = NULL;
const char *teid_range = NULL;
const char *network_instance = NULL;
@ -192,11 +196,35 @@ int sgwu_context_parse_config(void)
}
ogs_assert(num <= OGS_MAX_NUM_OF_HOSTNAME);
hostname[num++] =
hostname[num++] =
ogs_yaml_iter_value(&hostname_iter);
} while (
ogs_yaml_iter_type(&hostname_iter) ==
YAML_SEQUENCE_NODE);
} else if (!strcmp(gtpu_key, "advertise_addr") ||
!strcmp(gtpu_key, "advertise_name")) {
ogs_yaml_iter_t adv_hostname_iter;
ogs_yaml_iter_recurse(
&gtpu_iter, &adv_hostname_iter);
ogs_assert(ogs_yaml_iter_type(
&adv_hostname_iter) != YAML_MAPPING_NODE);
do {
if (ogs_yaml_iter_type(
&adv_hostname_iter) ==
YAML_SEQUENCE_NODE) {
if (!ogs_yaml_iter_next(
&adv_hostname_iter))
break;
}
ogs_assert(adv_num <=
OGS_MAX_NUM_OF_HOSTNAME);
adv_hostname[adv_num++] =
ogs_yaml_iter_value(&adv_hostname_iter);
} while (
ogs_yaml_iter_type(&adv_hostname_iter) ==
YAML_SEQUENCE_NODE);
} else if (!strcmp(gtpu_key, "port")) {
const char *v = ogs_yaml_iter_value(&gtpu_iter);
if (v) port = atoi(v);
@ -247,6 +275,20 @@ int sgwu_context_parse_config(void)
ogs_assert(rv == OGS_OK);
}
adv_addr = NULL;
for (i = 0; i < adv_num; i++) {
rv = ogs_addaddrinfo(&adv_addr,
family, adv_hostname[i], port, 0);
ogs_assert(rv == OGS_OK);
}
rv = ogs_copyaddrinfo(&adv_addr6, adv_addr);
ogs_assert(rv == OGS_OK);
rv = ogs_filteraddrinfo(&adv_addr, AF_INET);
ogs_assert(rv == OGS_OK);
rv = ogs_filteraddrinfo(&adv_addr6, AF_INET6);
ogs_assert(rv == OGS_OK);
/* Find first IPv4/IPv6 address in the list.
*
* In the following configuration,
@ -281,8 +323,10 @@ int sgwu_context_parse_config(void)
memset(&info, 0, sizeof(info));
ogs_pfcp_sockaddr_to_user_plane_ip_resource_info(
node ? node->addr : NULL,
node6 ? node6->addr : NULL,
adv_addr ? adv_addr :
node ? node->addr : NULL,
adv_addr6 ? adv_addr6 :
node6 ? node6->addr : NULL,
&info);
if (teid_range_indication) {
@ -310,6 +354,9 @@ int sgwu_context_parse_config(void)
ogs_list_for_each_safe(&list6, next_iter, iter)
ogs_list_add(&self.gtpu_list, iter);
ogs_freeaddrinfo(adv_addr);
ogs_freeaddrinfo(adv_addr6);
} while (ogs_yaml_iter_type(&gtpu_array) ==
YAML_SEQUENCE_NODE);

View File

@ -137,10 +137,14 @@ int upf_context_parse_config(void)
do {
int family = AF_UNSPEC;
int i, num = 0;
int adv_num = 0;
const char *hostname[OGS_MAX_NUM_OF_HOSTNAME];
const char *adv_hostname[OGS_MAX_NUM_OF_HOSTNAME];
uint16_t port = self.gtpu_port;
const char *dev = NULL;
ogs_sockaddr_t *addr = NULL;
ogs_sockaddr_t *adv_addr = NULL;
ogs_sockaddr_t *adv_addr6 = NULL;
const char *teid_range_indication = NULL;
const char *teid_range = NULL;
const char *network_instance = NULL;
@ -207,6 +211,30 @@ int upf_context_parse_config(void)
} while (
ogs_yaml_iter_type(&hostname_iter) ==
YAML_SEQUENCE_NODE);
} else if (!strcmp(gtpu_key, "advertise_addr") ||
!strcmp(gtpu_key, "advertise_name")) {
ogs_yaml_iter_t adv_hostname_iter;
ogs_yaml_iter_recurse(
&gtpu_iter, &adv_hostname_iter);
ogs_assert(ogs_yaml_iter_type(
&adv_hostname_iter) != YAML_MAPPING_NODE);
do {
if (ogs_yaml_iter_type(
&adv_hostname_iter) ==
YAML_SEQUENCE_NODE) {
if (!ogs_yaml_iter_next(
&adv_hostname_iter))
break;
}
ogs_assert(adv_num <=
OGS_MAX_NUM_OF_HOSTNAME);
adv_hostname[adv_num++] =
ogs_yaml_iter_value(&adv_hostname_iter);
} while (
ogs_yaml_iter_type(&adv_hostname_iter) ==
YAML_SEQUENCE_NODE);
} else if (!strcmp(gtpu_key, "port")) {
const char *v = ogs_yaml_iter_value(&gtpu_iter);
if (v) port = atoi(v);
@ -257,6 +285,20 @@ int upf_context_parse_config(void)
ogs_assert(rv == OGS_OK);
}
adv_addr = NULL;
for (i = 0; i < adv_num; i++) {
rv = ogs_addaddrinfo(&adv_addr,
family, adv_hostname[i], port, 0);
ogs_assert(rv == OGS_OK);
}
rv = ogs_copyaddrinfo(&adv_addr6, adv_addr);
ogs_assert(rv == OGS_OK);
rv = ogs_filteraddrinfo(&adv_addr, AF_INET);
ogs_assert(rv == OGS_OK);
rv = ogs_filteraddrinfo(&adv_addr6, AF_INET6);
ogs_assert(rv == OGS_OK);
/* Find first IPv4/IPv6 address in the list.
*
* In the following configuration,
@ -291,8 +333,10 @@ int upf_context_parse_config(void)
memset(&info, 0, sizeof(info));
ogs_pfcp_sockaddr_to_user_plane_ip_resource_info(
node ? node->addr : NULL,
node6 ? node6->addr : NULL,
adv_addr ? adv_addr :
node ? node->addr : NULL,
adv_addr6 ? adv_addr6 :
node6 ? node6->addr : NULL,
&info);
if (teid_range_indication) {
@ -320,6 +364,9 @@ int upf_context_parse_config(void)
ogs_list_for_each_safe(&list6, next_iter, iter)
ogs_list_add(&self.gtpu_list, iter);
ogs_freeaddrinfo(adv_addr);
ogs_freeaddrinfo(adv_addr6);
} while (ogs_yaml_iter_type(&gtpu_array) ==
YAML_SEQUENCE_NODE);