Commit 4ff57bdd authored by Yan Kuo's avatar Yan Kuo

add GNB_IPV4_ADDRESS_FOR_NGU_EXTERNAL

parent 5de8d669
...@@ -232,6 +232,7 @@ static int create_gNB_tasks(ngran_node_t node_type, configmodule_interface_t *cf ...@@ -232,6 +232,7 @@ static int create_gNB_tasks(ngran_node_t node_type, configmodule_interface_t *cf
uint32_t gnb_port_for_NGU = 0; uint32_t gnb_port_for_NGU = 0;
char* gnb_ipv4_address_for_S1U = NULL; char* gnb_ipv4_address_for_S1U = NULL;
uint32_t gnb_port_for_S1U = 0; uint32_t gnb_port_for_S1U = 0;
char* gnb_ipv4_address_for_NGU_external = NULL;
paramdef_t NETParams[] = GNBNETPARAMS_DESC; paramdef_t NETParams[] = GNBNETPARAMS_DESC;
char aprefix[MAX_OPTNAME_SIZE*2 + 8]; char aprefix[MAX_OPTNAME_SIZE*2 + 8];
sprintf(aprefix,"%s.[%i].%s",GNB_CONFIG_STRING_GNB_LIST,0,GNB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG); sprintf(aprefix,"%s.[%i].%s",GNB_CONFIG_STRING_GNB_LIST,0,GNB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG);
......
...@@ -187,6 +187,8 @@ typedef struct { ...@@ -187,6 +187,8 @@ typedef struct {
char* localAddressF1U; char* localAddressF1U;
uint16_t localPortF1U; uint16_t localPortF1U;
char* localAddressN3; char* localAddressN3;
/* Optional: address advertised to CN/UPF (e.g. public IP behind NAT). If NULL, localAddressN3 is used. */
char* externalAddressN3;
uint16_t localPortN3; uint16_t localPortN3;
uint16_t remotePortN3; uint16_t remotePortN3;
} e1ap_net_config_t; } e1ap_net_config_t;
......
...@@ -553,7 +553,14 @@ void cuup_init_n3(instance_t instance) ...@@ -553,7 +553,14 @@ void cuup_init_n3(instance_t instance)
strcpy(tmp.originHost, nc->localAddressN3); strcpy(tmp.originHost, nc->localAddressN3);
sprintf(tmp.originService, "%d", nc->localPortN3); sprintf(tmp.originService, "%d", nc->localPortN3);
sprintf(tmp.destinationService, "%d", nc->remotePortN3); sprintf(tmp.destinationService, "%d", nc->remotePortN3);
LOG_I(GTPU, "Configuring GTPu address : %s, port : %s\n", tmp.originHost, tmp.originService); if (nc->externalAddressN3 != NULL && nc->externalAddressN3[0] != '\0')
strncpy(tmp.advertiseHost, nc->externalAddressN3, sizeof(tmp.advertiseHost) - 1);
LOG_I(GTPU,
"Configuring GTPu address : %s, port : %s%s%s\n",
tmp.originHost,
tmp.originService,
tmp.advertiseHost[0] ? ", advertise : " : "",
tmp.advertiseHost[0] ? tmp.advertiseHost : "");
// Fixme: fully inconsistent instances management // Fixme: fully inconsistent instances management
// dirty global var is a bad fix // dirty global var is a bad fix
extern instance_t legacyInstanceMapping; extern instance_t legacyInstanceMapping;
......
...@@ -14,13 +14,14 @@ ...@@ -14,13 +14,14 @@
#include "common/config/config_paramdesc.h" #include "common/config/config_paramdesc.h"
#include "common/config/config_userapi.h" #include "common/config/config_userapi.h"
static void get_NGU_S1U_addr(char **addr, uint16_t *port) static void get_NGU_S1U_addr(char **addr, uint16_t *port, char **external_addr)
{ {
int num_gnbs = 0; int num_gnbs = 0;
char *gnb_ipv4_address_for_NGU = NULL; char *gnb_ipv4_address_for_NGU = NULL;
uint32_t gnb_port_for_NGU = 0; uint32_t gnb_port_for_NGU = 0;
char *gnb_ipv4_address_for_S1U = NULL; char *gnb_ipv4_address_for_S1U = NULL;
uint32_t gnb_port_for_S1U = 0; uint32_t gnb_port_for_S1U = 0;
char *gnb_ipv4_address_for_NGU_external = NULL;
// get gNB params // get gNB params
GET_PARAMS(GNBSParams, GNBSPARAMS_DESC, NULL); GET_PARAMS(GNBSParams, GNBSPARAMS_DESC, NULL);
...@@ -48,6 +49,18 @@ static void get_NGU_S1U_addr(char **addr, uint16_t *port) ...@@ -48,6 +49,18 @@ static void get_NGU_S1U_addr(char **addr, uint16_t *port)
if (strchr(address, '/')) if (strchr(address, '/'))
*strchr(address, '/') = 0; *strchr(address, '/') = 0;
*addr = address; *addr = address;
*external_addr = NULL;
if (gnb_ipv4_address_for_NGU_external != NULL && gnb_ipv4_address_for_NGU_external[0] != '\0') {
char *ext = strdup(gnb_ipv4_address_for_NGU_external);
if (strchr(ext, '/'))
*strchr(ext, '/') = 0;
*external_addr = ext;
LOG_I(GTPU, "NG-U external/advertise address: %s (bind: %s)\n", ext, address);
} else {
*external_addr = address;
LOG_I(GTPU, "NG-U external/advertise address is not set, using NG-U IPv4 address: %s(bind: %s)\n", address, address);
}
return; return;
} }
...@@ -114,7 +127,7 @@ MessageDef *RCconfig_NR_CU_E1(const E1_t *entity) ...@@ -114,7 +127,7 @@ MessageDef *RCconfig_NR_CU_E1(const E1_t *entity)
e1ap_nc->remotePortF1U = *(GNBParamList.paramarray[0][GNB_REMOTE_S_PORTD_IDX].uptr); e1ap_nc->remotePortF1U = *(GNBParamList.paramarray[0][GNB_REMOTE_S_PORTD_IDX].uptr);
e1ap_nc->localAddressF1U = strdup(*(GNBParamList.paramarray[0][GNB_LOCAL_S_ADDRESS_IDX].strptr)); e1ap_nc->localAddressF1U = strdup(*(GNBParamList.paramarray[0][GNB_LOCAL_S_ADDRESS_IDX].strptr));
e1ap_nc->localPortF1U = *(GNBParamList.paramarray[0][GNB_LOCAL_S_PORTD_IDX].uptr); e1ap_nc->localPortF1U = *(GNBParamList.paramarray[0][GNB_LOCAL_S_PORTD_IDX].uptr);
get_NGU_S1U_addr(&e1ap_nc->localAddressN3, &e1ap_nc->localPortN3); get_NGU_S1U_addr(&e1ap_nc->localAddressN3, &e1ap_nc->localPortN3, &e1ap_nc->externalAddressN3);
e1ap_nc->remotePortN3 = e1ap_nc->localPortN3 ; e1ap_nc->remotePortN3 = e1ap_nc->localPortN3 ;
AssertFatal(config_isparamset(gnbParms, GNB_GNB_ID_IDX), "%s is not defined in configuration file\n", GNB_CONFIG_STRING_GNB_ID); AssertFatal(config_isparamset(gnbParms, GNB_GNB_ID_IDX), "%s is not defined in configuration file\n", GNB_CONFIG_STRING_GNB_ID);
......
...@@ -2385,6 +2385,7 @@ int RCconfig_NR_X2(MessageDef *msg_p, uint32_t i) { ...@@ -2385,6 +2385,7 @@ int RCconfig_NR_X2(MessageDef *msg_p, uint32_t i) {
uint32_t gnb_port_for_NGU = 0; uint32_t gnb_port_for_NGU = 0;
char* gnb_ipv4_address_for_S1U = NULL; char* gnb_ipv4_address_for_S1U = NULL;
uint32_t gnb_port_for_S1U = 0; uint32_t gnb_port_for_S1U = 0;
char* gnb_ipv4_address_for_NGU_external = NULL;
/* Some default/random parameters */ /* Some default/random parameters */
X2AP_REGISTER_ENB_REQ (msg_p).eNB_id = gnb_id; X2AP_REGISTER_ENB_REQ (msg_p).eNB_id = gnb_id;
......
...@@ -21,6 +21,7 @@ int RCconfig_NR_NG(MessageDef *msg_p, uint32_t i) ...@@ -21,6 +21,7 @@ int RCconfig_NR_NG(MessageDef *msg_p, uint32_t i)
uint32_t gnb_port_for_NGU = 0; uint32_t gnb_port_for_NGU = 0;
char *gnb_ipv4_address_for_S1U = NULL; char *gnb_ipv4_address_for_S1U = NULL;
uint32_t gnb_port_for_S1U = 0; uint32_t gnb_port_for_S1U = 0;
char *gnb_ipv4_address_for_NGU_external = NULL;
GET_PARAMS(GNBSParams, GNBSPARAMS_DESC, NULL); GET_PARAMS(GNBSParams, GNBSPARAMS_DESC, NULL);
AssertFatal(i < GNBSParams[GNB_ACTIVE_GNBS_IDX].numelt, AssertFatal(i < GNBSParams[GNB_ACTIVE_GNBS_IDX].numelt,
......
...@@ -602,6 +602,7 @@ typedef enum { ...@@ -602,6 +602,7 @@ typedef enum {
#define GNB_CONFIG_STRING_GNB_IPV4_ADDRESS_FOR_NG_AMF "GNB_IPV4_ADDRESS_FOR_NG_AMF" #define GNB_CONFIG_STRING_GNB_IPV4_ADDRESS_FOR_NG_AMF "GNB_IPV4_ADDRESS_FOR_NG_AMF"
#define GNB_CONFIG_STRING_GNB_IPV4_ADDR_FOR_NGU "GNB_IPV4_ADDRESS_FOR_NGU" #define GNB_CONFIG_STRING_GNB_IPV4_ADDR_FOR_NGU "GNB_IPV4_ADDRESS_FOR_NGU"
#define GNB_CONFIG_STRING_GNB_PORT_FOR_NGU "GNB_PORT_FOR_NGU" #define GNB_CONFIG_STRING_GNB_PORT_FOR_NGU "GNB_PORT_FOR_NGU"
#define GNB_CONFIG_STRING_GNB_IPV4_ADDR_FOR_NGU_EXTERNAL "GNB_IPV4_ADDRESS_FOR_NGU_EXTERNAL"
/* X2 interface configuration parameters names */ /* X2 interface configuration parameters names */
#define GNB_CONFIG_STRING_ENB_IPV4_ADDR_FOR_X2C "GNB_IPV4_ADDRESS_FOR_X2C" #define GNB_CONFIG_STRING_ENB_IPV4_ADDR_FOR_X2C "GNB_IPV4_ADDRESS_FOR_X2C"
...@@ -618,7 +619,8 @@ typedef enum { ...@@ -618,7 +619,8 @@ typedef enum {
{GNB_CONFIG_STRING_ENB_IPV4_ADDR_FOR_X2C, NULL, 0, .strptr=NULL, .defstrval=NULL, TYPE_STRING, 0}, \ {GNB_CONFIG_STRING_ENB_IPV4_ADDR_FOR_X2C, NULL, 0, .strptr=NULL, .defstrval=NULL, TYPE_STRING, 0}, \
{GNB_CONFIG_STRING_ENB_PORT_FOR_X2C, NULL, 0, .uptr=NULL, .defintval=0L, TYPE_UINT, 0}, \ {GNB_CONFIG_STRING_ENB_PORT_FOR_X2C, NULL, 0, .uptr=NULL, .defintval=0L, TYPE_UINT, 0}, \
{GNB_CONFIG_STRING_GNB_IPV4_ADDRESS_FOR_S1U, NULL, 0, .strptr=&gnb_ipv4_address_for_S1U, .defstrval="127.0.0.1",TYPE_STRING, 0}, \ {GNB_CONFIG_STRING_GNB_IPV4_ADDRESS_FOR_S1U, NULL, 0, .strptr=&gnb_ipv4_address_for_S1U, .defstrval="127.0.0.1",TYPE_STRING, 0}, \
{GNB_CONFIG_STRING_GNB_PORT_FOR_S1U, NULL, 0, .uptr=&gnb_port_for_S1U, .defintval=2152L, TYPE_UINT, 0} \ {GNB_CONFIG_STRING_GNB_PORT_FOR_S1U, NULL, 0, .uptr=&gnb_port_for_S1U, .defintval=2152L, TYPE_UINT, 0}, \
{GNB_CONFIG_STRING_GNB_IPV4_ADDR_FOR_NGU_EXTERNAL, NULL, 0, .strptr=&gnb_ipv4_address_for_NGU_external, .defstrval=NULL, TYPE_STRING, 0} \
} }
/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
......
...@@ -586,6 +586,23 @@ static int udpServerSocket(openAddr_s addr) ...@@ -586,6 +586,23 @@ static int udpServerSocket(openAddr_s addr)
return -1; return -1;
} }
/* Optionally override the address advertised in GTP tunnel setup (e.g. public IP behind NAT) */
if (addr.advertiseHost[0] != '\0') {
struct in_addr adv4;
if (inet_pton(AF_INET, addr.advertiseHost, &adv4) == 1) {
memcpy(globGtp.instances[sockfd].foundAddr, &adv4.s_addr, sizeof(adv4.s_addr));
globGtp.instances[sockfd].foundAddrLen = sizeof(adv4.s_addr);
globGtp.instances[sockfd].ipVersion = 4;
LOG_I(GTPU,
"GTP bind %s:%s, advertise Transport Layer Address %s\n",
addr.originHost,
addr.originService,
addr.advertiseHost);
} else {
LOG_E(GTPU, "Invalid advertiseHost '%s', keeping bind address for tunnel endpoints\n", addr.advertiseHost);
}
}
int sendbuff = 1000 * 1000 * 10; int sendbuff = 1000 * 1000 * 10;
AssertFatal(0 == setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sendbuff, sizeof(sendbuff)), ""); AssertFatal(0 == setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sendbuff, sizeof(sendbuff)), "");
LOG_D(GTPU, LOG_D(GTPU,
......
...@@ -69,6 +69,8 @@ typedef struct gtpv1u_gnb_delete_tunnel_req_s gtpv1u_gnb_delete_tunnel_req_t; ...@@ -69,6 +69,8 @@ typedef struct gtpv1u_gnb_delete_tunnel_req_s gtpv1u_gnb_delete_tunnel_req_t;
char originService[HOST_NAME_MAX]; char originService[HOST_NAME_MAX];
char destinationHost[HOST_NAME_MAX]; char destinationHost[HOST_NAME_MAX];
char destinationService[HOST_NAME_MAX]; char destinationService[HOST_NAME_MAX];
/* Optional: if set, used as Transport Layer Address in tunnel setup (bind still uses originHost) */
char advertiseHost[HOST_NAME_MAX];
instance_t originInstance; instance_t originInstance;
} openAddr_t; } openAddr_t;
......
...@@ -135,10 +135,10 @@ gNBs = ...@@ -135,10 +135,10 @@ gNBs =
# pattern1 # pattern1
# dl_UL_TransmissionPeriodicity # dl_UL_TransmissionPeriodicity
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
dl_UL_TransmissionPeriodicity = 5; dl_UL_TransmissionPeriodicity = 6;
nrofDownlinkSlots = 3; nrofDownlinkSlots = 7;
nrofDownlinkSymbols = 6; nrofDownlinkSymbols = 6;
nrofUplinkSlots = 1; nrofUplinkSlots = 2;
nrofUplinkSymbols = 4; nrofUplinkSymbols = 4;
ssPBCH_BlockPower = -25; ssPBCH_BlockPower = -25;
...@@ -157,13 +157,14 @@ gNBs = ...@@ -157,13 +157,14 @@ gNBs =
////////// AMF parameters: ////////// AMF parameters:
amf_ip_address = ({ ipv4 = "172.11.200.14"; }); amf_ip_address = ({ ipv4 = "18.119.182.0"; });
NETWORK_INTERFACES : NETWORK_INTERFACES :
{ {
GNB_IPV4_ADDRESS_FOR_NG_AMF = "172.11.200.1/24"; GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.199.102/24";
GNB_IPV4_ADDRESS_FOR_NGU = "172.11.200.1/24"; GNB_IPV4_ADDRESS_FOR_NGU = "192.168.199.102/24";
GNB_IPV4_ADDRESS_FOR_NGU_EXTERNAL = "111.198.54.3";
GNB_PORT_FOR_S1U = 2152; # Spec 2152 GNB_PORT_FOR_S1U = 2152; # Spec 2152
}; };
...@@ -204,7 +205,7 @@ RUs = ( ...@@ -204,7 +205,7 @@ RUs = (
eNB_instances = [0]; eNB_instances = [0];
sl_ahead = 2; sl_ahead = 2;
#clock_src = "internal"; #clock_src = "internal";
sdr_addrs = "dev=pciex:0,auxdac1=1488"; sdr_addrs = "dev=pciex:0,auxdac1=1628";
} }
); );
......
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