diff --git a/configs/open5gs/sgwu.yaml.in b/configs/open5gs/sgwu.yaml.in index 6fa40f705..e635e463c 100644 --- a/configs/open5gs/sgwu.yaml.in +++ b/configs/open5gs/sgwu.yaml.in @@ -64,21 +64,21 @@ logger: # 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 +# advertise: 172.24.15.30 # # gtpu: # - addr: 10.4.128.21 -# advertise_addr: +# advertise: # - 127.0.0.1 # - ::1 # # gtpu: # - addr: 10.4.128.21 -# advertise_name: sgw1.epc.mnc001.mcc001.3gppnetwork.org +# advertise: sgw1.epc.mnc001.mcc001.3gppnetwork.org # # gtpu: # - dev: ens3 -# advertise_name: sgw1.epc.mnc001.mcc001.3gppnetwork.org +# advertise: sgw1.epc.mnc001.mcc001.3gppnetwork.org # sgwu: pfcp: diff --git a/configs/open5gs/upf.yaml.in b/configs/open5gs/upf.yaml.in index 3ded41406..c570232bc 100644 --- a/configs/open5gs/upf.yaml.in +++ b/configs/open5gs/upf.yaml.in @@ -64,21 +64,21 @@ logger: # 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 +# advertise: 172.24.15.30 # # gtpu: # - addr: 10.4.128.21 -# advertise_addr: +# advertise: # - 127.0.0.1 # - ::1 # # gtpu: # - addr: 10.4.128.21 -# advertise_name: upf1.5gc.mnc001.mcc001.3gppnetwork.org +# advertise: upf1.5gc.mnc001.mcc001.3gppnetwork.org # # gtpu: # - dev: ens3 -# advertise_name: upf1.5gc.mnc001.mcc001.3gppnetwork.org +# advertise: upf1.5gc.mnc001.mcc001.3gppnetwork.org # # # diff --git a/lib/gtp/context.c b/lib/gtp/context.c index 9f4a1f3f7..2d8a9763c 100644 --- a/lib/gtp/context.c +++ b/lib/gtp/context.c @@ -215,10 +215,10 @@ int ogs_gtp_context_parse_config(const char *local, const char *remote) do { int family = AF_UNSPEC; - int i, num = 0; - int adv_num = 0; + int i, num_of_hostname = 0; const char *hostname[OGS_MAX_NUM_OF_HOSTNAME]; - const char *adv_hostname[OGS_MAX_NUM_OF_HOSTNAME]; + int num_of_advertise = 0; + const char *advertise[OGS_MAX_NUM_OF_HOSTNAME]; uint16_t port = self.gtpu_port; const char *dev = NULL; ogs_sockaddr_t *addr = NULL; @@ -283,35 +283,34 @@ int ogs_gtp_context_parse_config(const char *local, const char *remote) break; } - ogs_assert(num < OGS_MAX_NUM_OF_HOSTNAME); - hostname[num++] = + ogs_assert(num_of_hostname < + OGS_MAX_NUM_OF_HOSTNAME); + hostname[num_of_hostname++] = 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; + } else if (!strcmp(gtpu_key, "advertise")) { + ogs_yaml_iter_t advertise_iter; ogs_yaml_iter_recurse( - >pu_iter, &adv_hostname_iter); + >pu_iter, &advertise_iter); ogs_assert(ogs_yaml_iter_type( - &adv_hostname_iter) != YAML_MAPPING_NODE); + &advertise_iter) != YAML_MAPPING_NODE); do { - if (ogs_yaml_iter_type( - &adv_hostname_iter) == + if (ogs_yaml_iter_type(&advertise_iter) == YAML_SEQUENCE_NODE) { if (!ogs_yaml_iter_next( - &adv_hostname_iter)) + &advertise_iter)) break; } - ogs_assert(adv_num < + ogs_assert(num_of_advertise < OGS_MAX_NUM_OF_HOSTNAME); - adv_hostname[adv_num++] = - ogs_yaml_iter_value(&adv_hostname_iter); + advertise[num_of_advertise++] = + ogs_yaml_iter_value(&advertise_iter); } while ( - ogs_yaml_iter_type(&adv_hostname_iter) == + ogs_yaml_iter_type(&advertise_iter) == YAML_SEQUENCE_NODE); } else if (!strcmp(gtpu_key, "port")) { const char *v = ogs_yaml_iter_value(>pu_iter); @@ -338,7 +337,7 @@ int ogs_gtp_context_parse_config(const char *local, const char *remote) } addr = NULL; - for (i = 0; i < num; i++) { + for (i = 0; i < num_of_hostname; i++) { rv = ogs_addaddrinfo(&addr, family, hostname[i], port, 0); ogs_assert(rv == OGS_OK); @@ -364,9 +363,9 @@ int ogs_gtp_context_parse_config(const char *local, const char *remote) } adv_addr = NULL; - for (i = 0; i < adv_num; i++) { + for (i = 0; i < num_of_advertise; i++) { rv = ogs_addaddrinfo(&adv_addr, - family, adv_hostname[i], port, 0); + family, advertise[i], port, 0); ogs_assert(rv == OGS_OK); } rv = ogs_copyaddrinfo(&adv_addr6, adv_addr); diff --git a/lib/sbi/context.c b/lib/sbi/context.c index db3a75b95..38b1c455f 100644 --- a/lib/sbi/context.c +++ b/lib/sbi/context.c @@ -146,14 +146,17 @@ int ogs_sbi_context_parse_config(const char *local, const char *remote) ogs_yaml_iter_t sbi_array, sbi_iter; ogs_yaml_iter_recurse(&local_iter, &sbi_array); do { - int family = AF_UNSPEC; - int i, num = 0; + int i, family = AF_UNSPEC; + int num = 0; const char *hostname[OGS_MAX_NUM_OF_HOSTNAME]; + int num_of_advertise = 0; + const char *advertise[OGS_MAX_NUM_OF_HOSTNAME]; + const char *key = NULL; + const char *pem = NULL; + uint16_t port = self.http_port; const char *dev = NULL; ogs_sockaddr_t *addr = NULL; - const char *key = NULL; - const char *pem = NULL; if (ogs_yaml_iter_type(&sbi_array) == YAML_MAPPING_NODE) { @@ -207,6 +210,28 @@ int ogs_sbi_context_parse_config(const char *local, const char *remote) } while ( ogs_yaml_iter_type(&hostname_iter) == YAML_SEQUENCE_NODE); + } else if (!strcmp(sbi_key, "advertise")) { + ogs_yaml_iter_t advertise_iter; + ogs_yaml_iter_recurse(&sbi_iter, + &advertise_iter); + ogs_assert(ogs_yaml_iter_type( + &advertise_iter) != YAML_MAPPING_NODE); + + do { + if (ogs_yaml_iter_type(&advertise_iter) == + YAML_SEQUENCE_NODE) { + if (!ogs_yaml_iter_next( + &advertise_iter)) + break; + } + + ogs_assert(num_of_advertise < + OGS_MAX_NUM_OF_HOSTNAME); + advertise[num_of_advertise++] = + ogs_yaml_iter_value(&advertise_iter); + } while ( + ogs_yaml_iter_type(&advertise_iter) == + YAML_SEQUENCE_NODE); } else if (!strcmp(sbi_key, "port")) { const char *v = ogs_yaml_iter_value(&sbi_iter); if (v) { @@ -261,12 +286,23 @@ int ogs_sbi_context_parse_config(const char *local, const char *remote) ogs_assert(rv == OGS_OK); } + addr = NULL; + for (i = 0; i < num_of_advertise; i++) { + rv = ogs_addaddrinfo(&addr, + family, advertise[i], port, 0); + ogs_assert(rv == OGS_OK); + } + node = ogs_list_first(&list); if (node) { ogs_sbi_server_t *server = ogs_sbi_server_add(node->addr); ogs_assert(server); + if (addr && ogs_app()->parameter.no_ipv4 == 0) + ogs_sbi_server_set_advertise( + server, AF_INET, addr); + if (key) server->tls.key = key; if (pem) server->tls.pem = pem; } @@ -276,12 +312,20 @@ int ogs_sbi_context_parse_config(const char *local, const char *remote) ogs_sbi_server_add(node6->addr); ogs_assert(server); + if (addr && ogs_app()->parameter.no_ipv6 == 0) + ogs_sbi_server_set_advertise( + server, AF_INET6, addr); + if (key) server->tls.key = key; if (pem) server->tls.pem = pem; } + if (addr) + ogs_freeaddrinfo(addr); + ogs_socknode_remove_all(&list); ogs_socknode_remove_all(&list6); + } while (ogs_yaml_iter_type(&sbi_array) == YAML_SEQUENCE_NODE); @@ -395,6 +439,8 @@ int ogs_sbi_context_parse_config(const char *local, const char *remote) } else ogs_warn("unknown key `%s`", tls_key); } + } else if (!strcmp(sbi_key, "advertise")) { + /* Nothing in client */ } else ogs_warn("unknown key `%s`", sbi_key); } @@ -781,18 +827,23 @@ void ogs_sbi_nf_instance_build_default( hostname = NULL; ogs_list_for_each(&ogs_sbi_self()->server_list, server) { - ogs_assert(server->node.addr); + ogs_sockaddr_t *advertise = NULL; + + advertise = server->advertise; + if (!advertise) + advertise = server->node.addr; + ogs_assert(advertise); /* First FQDN is selected */ if (!hostname) { - hostname = ogs_gethostname(server->node.addr); + hostname = ogs_gethostname(advertise); if (hostname) continue; } if (nf_instance->num_of_ipv4 < OGS_SBI_MAX_NUM_OF_IP_ADDRESS) { ogs_sockaddr_t *addr = NULL; - ogs_copyaddrinfo(&addr, server->node.addr); + ogs_copyaddrinfo(&addr, advertise); ogs_assert(addr); if (addr->ogs_sa_family == AF_INET) { @@ -840,11 +891,16 @@ ogs_sbi_nf_service_t *ogs_sbi_nf_service_build_default( hostname = NULL; ogs_list_for_each(&ogs_sbi_self()->server_list, server) { - ogs_assert(server->node.addr); + ogs_sockaddr_t *advertise = NULL; + + advertise = server->advertise; + if (!advertise) + advertise = server->node.addr; + ogs_assert(advertise); /* First FQDN is selected */ if (!hostname) { - hostname = ogs_gethostname(server->node.addr); + hostname = ogs_gethostname(advertise); if (hostname) continue; } @@ -852,7 +908,7 @@ ogs_sbi_nf_service_t *ogs_sbi_nf_service_build_default( if (nf_service->num_of_addr < OGS_SBI_MAX_NUM_OF_IP_ADDRESS) { int port = 0; ogs_sockaddr_t *addr = NULL; - ogs_copyaddrinfo(&addr, server->node.addr); + ogs_copyaddrinfo(&addr, advertise); ogs_assert(addr); port = OGS_PORT(addr); diff --git a/lib/sbi/conv.c b/lib/sbi/conv.c index c39270163..fedaeb128 100644 --- a/lib/sbi/conv.c +++ b/lib/sbi/conv.c @@ -67,6 +67,7 @@ char *ogs_uridup(bool https, ogs_sockaddr_t *addr, ogs_sbi_header_t *h) char *ogs_sbi_server_uri(ogs_sbi_server_t *server, ogs_sbi_header_t *h) { + ogs_sockaddr_t *advertise = NULL; bool https = false; ogs_assert(server); @@ -75,7 +76,13 @@ char *ogs_sbi_server_uri(ogs_sbi_server_t *server, ogs_sbi_header_t *h) if (server->tls.key && server->tls.pem) https = true; - return ogs_uridup(https, server->node.addr, h); + advertise = server->advertise; + + if (!advertise) + advertise = server->node.addr; + ogs_assert(advertise); + + return ogs_uridup(https, advertise, h); } char *ogs_sbi_client_uri(ogs_sbi_client_t *client, ogs_sbi_header_t *h) diff --git a/lib/sbi/server.c b/lib/sbi/server.c index e654f8da3..25097b2a0 100644 --- a/lib/sbi/server.c +++ b/lib/sbi/server.c @@ -78,6 +78,8 @@ void ogs_sbi_server_remove(ogs_sbi_server_t *server) ogs_assert(server->node.addr); ogs_freeaddrinfo(server->node.addr); + if (server->advertise) + ogs_freeaddrinfo(server->advertise); ogs_pool_free(&server_pool, server); } @@ -90,6 +92,22 @@ void ogs_sbi_server_remove_all(void) ogs_sbi_server_remove(server); } +void ogs_sbi_server_set_advertise( + ogs_sbi_server_t *server, int family, ogs_sockaddr_t *advertise) +{ + ogs_sockaddr_t *addr = NULL; + + ogs_assert(server); + ogs_assert(advertise); + + ogs_copyaddrinfo(&addr, advertise); + if (family != AF_UNSPEC) + ogs_filteraddrinfo(&addr, family); + + if (addr) + server->advertise = addr; +} + void ogs_sbi_server_start_all( int (*cb)(ogs_sbi_request_t *request, void *data)) { diff --git a/lib/sbi/server.h b/lib/sbi/server.h index 9d0229fc7..8aa3767b6 100644 --- a/lib/sbi/server.h +++ b/lib/sbi/server.h @@ -32,6 +32,7 @@ typedef struct ogs_sbi_stream_s ogs_sbi_stream_t; typedef struct ogs_sbi_server_s { ogs_socknode_t node; + ogs_sockaddr_t *advertise; struct { const char *key; @@ -65,6 +66,9 @@ ogs_sbi_server_t *ogs_sbi_server_add(ogs_sockaddr_t *addr); void ogs_sbi_server_remove(ogs_sbi_server_t *server); void ogs_sbi_server_remove_all(void); +void ogs_sbi_server_set_advertise( + ogs_sbi_server_t *server, int family, ogs_sockaddr_t *advertise); + void ogs_sbi_server_start_all( int (*cb)(ogs_sbi_request_t *request, void *data)); void ogs_sbi_server_stop_all(void);