forked from acouzens/open5gs
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:
parent
a470131489
commit
4f2803c058
|
@ -29,17 +29,48 @@ 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
|
||||
# - 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
|
||||
# - addr: 10.4.128.21
|
||||
# advertise_addr:
|
||||
# - 127.0.0.1
|
||||
# - ::1
|
||||
#
|
||||
# gtpu:
|
||||
# - addr: 10.4.128.21
|
||||
# advertise_name: sgw1.epc.mnc001.mcc001.3gppnetwork.org
|
||||
#
|
||||
# gtpu:
|
||||
# dev: ens3
|
||||
# - dev: ens3
|
||||
# advertise_name: sgw1.epc.mnc001.mcc001.3gppnetwork.org
|
||||
#
|
||||
# <PFCP Server>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
@ -197,6 +201,30 @@ int sgwu_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(
|
||||
>pu_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(>pu_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,7 +323,9 @@ int sgwu_context_parse_config(void)
|
|||
|
||||
memset(&info, 0, sizeof(info));
|
||||
ogs_pfcp_sockaddr_to_user_plane_ip_resource_info(
|
||||
adv_addr ? adv_addr :
|
||||
node ? node->addr : NULL,
|
||||
adv_addr6 ? adv_addr6 :
|
||||
node6 ? node6->addr : NULL,
|
||||
&info);
|
||||
|
||||
|
@ -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(>pu_array) ==
|
||||
YAML_SEQUENCE_NODE);
|
||||
|
||||
|
|
|
@ -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(
|
||||
>pu_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(>pu_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,7 +333,9 @@ int upf_context_parse_config(void)
|
|||
|
||||
memset(&info, 0, sizeof(info));
|
||||
ogs_pfcp_sockaddr_to_user_plane_ip_resource_info(
|
||||
adv_addr ? adv_addr :
|
||||
node ? node->addr : NULL,
|
||||
adv_addr6 ? adv_addr6 :
|
||||
node6 ? node6->addr : NULL,
|
||||
&info);
|
||||
|
||||
|
@ -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(>pu_array) ==
|
||||
YAML_SEQUENCE_NODE);
|
||||
|
||||
|
|
Loading…
Reference in New Issue