pgw is done

This commit is contained in:
Sukchan Lee 2017-11-29 14:24:55 +09:00
parent 60ac1dbfe6
commit e7d3d2f4da
5 changed files with 661 additions and 24 deletions

View File

@ -917,6 +917,7 @@ status_t mme_context_parse_config()
else if (!strcmp(gtpc_key, "apn"))
{
apn = yaml_iter_value(&gtpc_iter);
printf("apn = [%s]\n", apn);
}
else
d_warn("unknown key `%s`", gtpc_key);

View File

@ -3,7 +3,11 @@
#include "core_pool.h"
#include "core_index.h"
#include "core_lib.h"
#include <mongoc.h>
#include <yaml.h>
#include "yaml_helper.h"
#include "fd_lib.h"
#include "gtp_path.h"
@ -136,7 +140,7 @@ static status_t pgw_context_validation()
return CORE_OK;
}
status_t pgw_context_parse_config()
status_t pgw_context_parse_old_config()
{
status_t rv;
config_t *config = &context_self()->config;
@ -169,6 +173,7 @@ status_t pgw_context_parse_config()
{
self.fd_conf_path = bson_iter_utf8(&pgw_iter, &length);
}
#if 0
else if (!strcmp(pgw_key, "NETWORK"))
{
bson_iter_t network_iter;
@ -220,8 +225,10 @@ status_t pgw_context_parse_config()
}
}
}
#endif
else if (!strcmp(pgw_key, "UE_NETWORK"))
{
#if 0
int ue_network_index = 0;
bson_iter_t ue_network_array;
@ -297,6 +304,7 @@ status_t pgw_context_parse_config()
} while(
BSON_ITER_HOLDS_ARRAY(&pgw_iter) &&
bson_iter_next(&ue_network_array));
#endif
}
else if (!strcmp(pgw_key, "DNS") &&
BSON_ITER_HOLDS_DOCUMENT(&pgw_iter))
@ -325,6 +333,357 @@ status_t pgw_context_parse_config()
}
}
return CORE_OK;
}
status_t pgw_context_parse_config()
{
status_t rv;
config_t *config = &context_self()->config;
yaml_document_t *document = NULL;
yaml_iter_t root_iter;
d_assert(config, return CORE_ERROR,);
document = config->document;
d_assert(document, return CORE_ERROR,);
rv = pgw_context_prepare();
if (rv != CORE_OK) return rv;
yaml_iter_init(&root_iter, document);
while(yaml_iter_next(&root_iter))
{
const char *root_key = yaml_iter_key(&root_iter);
d_assert(root_key, return CORE_ERROR,);
if (!strcmp(root_key, "pgw"))
{
yaml_iter_t pgw_iter;
yaml_iter_recurse(&root_iter, &pgw_iter);
while(yaml_iter_next(&pgw_iter))
{
const char *pgw_key = yaml_iter_key(&pgw_iter);
d_assert(pgw_key, return CORE_ERROR,);
if (!strcmp(pgw_key, "freeDiameter"))
{
self.fd_conf_path = yaml_iter_value(&pgw_iter);
}
else if (!strcmp(pgw_key, "gtpc"))
{
yaml_iter_t gtpc_array, gtpc_iter;
yaml_iter_recurse(&pgw_iter, &gtpc_array);
do
{
#if 0
pgw_gtpc_t *gtpc = NULL;
#endif
int family = AF_UNSPEC;
const char *hostname = NULL;
c_uint16_t port = GTPV2_C_UDP_PORT;
if (yaml_iter_type(&gtpc_array) == YAML_MAPPING_NODE)
{
memcpy(&gtpc_iter, &gtpc_array,
sizeof(yaml_iter_t));
}
else if (yaml_iter_type(&gtpc_array) ==
YAML_SEQUENCE_NODE)
{
if (!yaml_iter_next(&gtpc_array))
break;
yaml_iter_recurse(&gtpc_array, &gtpc_iter);
}
while(yaml_iter_next(&gtpc_iter))
{
const char *gtpc_key =
yaml_iter_key(&gtpc_iter);
d_assert(gtpc_key,
return CORE_ERROR,);
if (!strcmp(gtpc_key, "family"))
{
const char *v = yaml_iter_value(&gtpc_iter);
if (v) family = atoi(v);
if (family != AF_UNSPEC &&
family != AF_INET && family != AF_INET6)
{
d_warn("Ignore family(%d) : AF_UNSPEC(0), "
"AF_INET(2), AF_INET6(30) ", family);
family = AF_UNSPEC;
}
}
else if (!strcmp(gtpc_key, "hostname"))
{
hostname = yaml_iter_value(&gtpc_iter);
#if 1
if (hostname)
self.gtpc_addr = inet_addr(hostname);
#endif
}
else if (!strcmp(gtpc_key, "port"))
{
const char *v = yaml_iter_value(&gtpc_iter);
if (v) port = atoi(v);
}
else
d_warn("unknown key `%s`", gtpc_key);
}
#if 0
gtpc = pgw_gtpc_add(family, hostname, port);
d_assert(gtpc, return CORE_ERROR,);
#endif
} while(yaml_iter_type(&gtpc_array) == YAML_SEQUENCE_NODE);
}
else if (!strcmp(pgw_key, "gtpu"))
{
yaml_iter_t gtpu_array, gtpu_iter;
yaml_iter_recurse(&pgw_iter, &gtpu_array);
do
{
#if 0
pgw_gtpu_t *gtpu = NULL;
#endif
int family = AF_UNSPEC;
const char *hostname = NULL;
c_uint16_t port = GTPV1_U_UDP_PORT;
if (yaml_iter_type(&gtpu_array) == YAML_MAPPING_NODE)
{
memcpy(&gtpu_iter, &gtpu_array,
sizeof(yaml_iter_t));
}
else if (yaml_iter_type(&gtpu_array) ==
YAML_SEQUENCE_NODE)
{
if (!yaml_iter_next(&gtpu_array))
break;
yaml_iter_recurse(&gtpu_array, &gtpu_iter);
}
while(yaml_iter_next(&gtpu_iter))
{
const char *gtpu_key =
yaml_iter_key(&gtpu_iter);
d_assert(gtpu_key,
return CORE_ERROR,);
if (!strcmp(gtpu_key, "family"))
{
const char *v = yaml_iter_value(&gtpu_iter);
if (v) family = atoi(v);
if (family != AF_UNSPEC &&
family != AF_INET && family != AF_INET6)
{
d_warn("Ignore family(%d) : AF_UNSPEC(0), "
"AF_INET(2), AF_INET6(30) ", family);
family = AF_UNSPEC;
}
}
else if (!strcmp(gtpu_key, "hostname"))
{
hostname = yaml_iter_value(&gtpu_iter);
#if 1
if (hostname)
self.gtpu_addr = inet_addr(hostname);
#endif
}
else if (!strcmp(gtpu_key, "port"))
{
const char *v = yaml_iter_value(&gtpu_iter);
if (v) port = atoi(v);
}
else
d_warn("unknown key `%s`", gtpu_key);
}
#if 0
gtpu = pgw_gtpu_add(family, hostname, port);
d_assert(gtpu, return CORE_ERROR,);
#endif
} while(yaml_iter_type(&gtpu_array) == YAML_SEQUENCE_NODE);
}
else if (!strcmp(pgw_key, "pdn"))
{
yaml_iter_t pdn_array, pdn_iter;
yaml_iter_recurse(&pgw_iter, &pdn_array);
do
{
c_uint32_t addr = 0;
c_uint8_t bits = 0;
const char *dev = NULL;
const char *apn = NULL;
d_assert(self.num_of_ue_network <=
MAX_NUM_OF_UE_NETWORK, return CORE_ERROR,);
if (yaml_iter_type(&pdn_array) == YAML_MAPPING_NODE)
{
memcpy(&pdn_iter, &pdn_array, sizeof(yaml_iter_t));
}
else if (yaml_iter_type(&pdn_array) ==
YAML_SEQUENCE_NODE)
{
if (!yaml_iter_next(&pdn_array))
break;
yaml_iter_recurse(&pdn_array, &pdn_iter);
}
while(yaml_iter_next(&pdn_iter))
{
const char *pdn_key = yaml_iter_key(&pdn_iter);
d_assert(pdn_key,
return CORE_ERROR,);
if (!strcmp(pdn_key, "addr"))
{
yaml_iter_t addr_iter;
yaml_iter_recurse(&pdn_iter, &addr_iter);
d_assert(yaml_iter_type(&addr_iter) !=
YAML_MAPPING_NODE, return CORE_ERROR,);
do
{
char *v = NULL;
#if 0
d_assert(pdn->num_of_addr <=
MAX_NUM_OF_PDN_ADDR,
return CORE_ERROR,);
#endif
if (yaml_iter_type(&addr_iter) ==
YAML_SEQUENCE_NODE)
{
if (!yaml_iter_next(&addr_iter))
break;
}
v = (char *)yaml_iter_value(&addr_iter);
if (v)
{
char *str = strsep(&v, "/");
if (str)
{
addr = inet_addr(str);
bits = atoi(v);
}
}
} while(
yaml_iter_type(&addr_iter) ==
YAML_SEQUENCE_NODE);
}
else if (!strcmp(pdn_key, "dev"))
{
dev = yaml_iter_value(&pdn_iter);
}
else if (!strcmp(pdn_key, "apn"))
{
apn = yaml_iter_value(&pdn_iter);
d_warn("Not implemented");
}
else
d_warn("unknown key `%s`", pdn_key);
}
if (addr && bits)
{
self.ue_network[self.num_of_ue_network].ipv4.addr =
addr;
self.ue_network[self.num_of_ue_network].ipv4.bits =
bits;
self.ue_network[self.num_of_ue_network].if_name =
dev;
self.num_of_ue_network++;
}
else
{
d_warn("Ignore pdn : addr(0x%x), bits(%d)",
addr, bits);
}
} while(yaml_iter_type(&pdn_array) == YAML_SEQUENCE_NODE);
}
else if (!strcmp(pgw_key, "dns"))
{
int count = 0;
yaml_iter_t dns_iter;
yaml_iter_recurse(&pgw_iter, &dns_iter);
d_assert(yaml_iter_type(&dns_iter) !=
YAML_MAPPING_NODE, return CORE_ERROR,);
do
{
const char *v = NULL;
if (yaml_iter_type(&dns_iter) ==
YAML_SEQUENCE_NODE)
{
if (!yaml_iter_next(&dns_iter))
break;
}
v = yaml_iter_value(&dns_iter);
if (v)
{
if (count == 0)
{
self.primary_dns_addr = inet_addr(v);
}
else if (count == 1)
{
self.secondary_dns_addr = inet_addr(v);
}
else
d_warn("Ignored %d DNS(%s)", count, v);
}
count++;
} while(
yaml_iter_type(&dns_iter) ==
YAML_SEQUENCE_NODE);
}
else if (!strcmp(pgw_key, "dns6"))
{
int count = 0;
yaml_iter_t dns6_iter;
yaml_iter_recurse(&pgw_iter, &dns6_iter);
d_assert(yaml_iter_type(&dns6_iter) !=
YAML_MAPPING_NODE, return CORE_ERROR,);
do
{
const char *v = NULL;
if (yaml_iter_type(&dns6_iter) ==
YAML_SEQUENCE_NODE)
{
if (!yaml_iter_next(&dns6_iter))
break;
}
v = yaml_iter_value(&dns6_iter);
if (v)
{
if (count == 0)
{
}
else if (count == 1)
{
}
else
d_warn("Ignored %d DNS(%s)", count, v);
}
count++;
} while(
yaml_iter_type(&dns6_iter) ==
YAML_SEQUENCE_NODE);
}
else
d_warn("unknown key `%s`", pgw_key);
}
}
}
rv = pgw_context_validation();
if (rv != CORE_OK) return rv;

View File

@ -1,7 +1,7 @@
db_uri: "mongodb://localhost/nextepc"
db_uri: mongodb://localhost/nextepc
logger:
file: "@LOCALSTATE_DIR@/log/nextepc/nextepc.log"
file: @LOCALSTATE_DIR@/log/nextepc/nextepc.log
trace:
s1ap: 1
nas: 1
@ -19,24 +19,24 @@ parameter:
# prefer_ipv4: true
mme:
freeDiameter: "mme.conf"
freeDiameter: mme.conf
s1ap:
- hostname: "127.0.0.1"
- hostname: "::1"
- hostname: 127.0.0.1
- hostname: ::1
gtpc:
- hostname: "127.0.0.1"
- hostname: 127.0.0.1
gummei:
- plmn_id:
mcc: "001"
mnc: "01"
mcc: 001
mnc: 01
mme_gid: 2
mme_code: 1
tai:
- plmn_id:
mcc: "001"
mnc: "01"
mcc: 001
mnc: 01
tac: 12345
security:
@ -44,26 +44,34 @@ mme:
ciphering_order : [ EEA0, EEA1, EEA2 ]
hss:
freeDiameter: "hss.conf"
freeDiameter: hss.conf
sgw:
gtpc:
- hostname: "127.0.0.2"
- hostname: 127.0.0.2
gtpu:
- hostname: "127.0.0.2"
- hostname: 127.0.0.2
pgw:
freeDiameter: "pgw.conf"
freeDiameter: pgw.conf
gtpc:
- hostname: "127.0.0.3"
- hostname: 127.0.0.3
gtpu:
- hostname: "127.0.0.3"
- hostname: 127.0.0.3
pdn:
- pool: "45.45.0.1/16"
dns: ["8.8.8.8", "4.4.4.4"]
# interface: pgwtun
- addr: 45.45.0.1/16
dev: pgwtun
dns:
- 8.8.8.8
- 8.8.4.4
dns6:
- 2001:4860:4860::8888
- 2001:4860:4860::8844
pcrf:
freeDiameter: "pcrf.conf"

270
support/config/nextepc.yaml Normal file
View File

@ -0,0 +1,270 @@
db_uri: mongodb://localhost/nextepc
logger:
file: @LOCALSTATE_DIR@/log/nextepc/nextepc.log
trace:
s1ap: 1
nas: 1
diameter: 1
gtp: 1
others: 1
#
# Disable use of IPv4 addresses (only IPv6)
# o Type : boolean
# o Default : IPv6 enabled
#
# <Example>
# no_ipv4: true
#
#
# Disable use of IPv6 addresses (only IPv4)
# o Type : boolean
# o Default : IPv6 enabled
#
# <Example>
# no_ipv6: true
#
#
# Prefer IPv4 instead of IPv6 for estabishing new GTP connections.
# o Type : boolean
# o Default : IPv6 is attempted first.
#
# <Example>
# prefer_ipv4: true
#
#
# Disable load of EPC elements (Only applicable `nextepc-epcd`)
# o Type : boolean
# o Default : load all HSS/SGW/PGW/PCRF/MME element
#
# <Example>
# no_hss: true
# no_sgw: true
# no_pgw: true
# no_pcrf: true
#
parameter:
mme:
freeDiameter: mme.conf
#
# Specify local addresses the S1AP server must bind to
# o 'family' Type : enum
# 0 : AF_UNSPEC
# 2 : AF_INET
# 30 : AF_INET6
# o Default : liston on all address available
#
# <Example>
#
# o Single S1AP Server(0.0.0.0:36412)
# s1ap:
# - family: 2
#
# o Multiple S1AP Server(127.0.0.1:36412, [::1]:36413)
# s1ap:
# - family: 2
# hostname: localhost
# - hostname: ::1
# port: 36413
#
s1ap:
gtpc:
- family: 2
hostname: localhost
- family: 30
hostname: localhost
#
# Specify GUMMEI
#
# <Example>
#
# o Multiple GUMMEI
# gummei:
# - plmn_id:
# mcc: 001
# mnc: 01
# mme_gid: 2
# mme_code: 1
# - plmn_id:
# - mcc: 002
# mnc: 02
# - mcc: 003
# mnc: 03
# mme_gid: [3, 4]
# mme_code:
# - 2
# - 3
#
gummei:
plmn_id:
mcc: 001
mnc: 01
mme_gid: 2
mme_code: 1
#
# Specify TAI
#
# <Example>
#
# o Multiple TAI
# tai:
# - plmn_id:
# mcc: 001
# mnc: 01
# tac: 12345
# - plmn_id:
# mcc: 002
# mnc: 02
# tac: 12346
#
tai:
plmn_id:
mcc: 001
mnc: 01
tac: 12345
security:
integrity_order : [ EIA1, EIA2, EIA0 ]
ciphering_order : [ EEA0, EEA1, EEA2 ]
hss:
freeDiameter: hss.conf
sgw:
gtpc:
- hostname: 127.0.0.2
- hostname: ::2
#
# Specify local addresses the GTP-U server must bind to
# o 'family' Type : enum
# 0 : AF_UNSPEC
# 2 : AF_INET
# 30 : AF_INET6
# o Default : liston on all address available
#
#
# <Example>
#
# o Multiple GTP-U Server([::]:2152)
# gtpu:
# - family: 30
#
# o Multiple GTP-U Server(127.0.0.1:2153, [::1]:2152)
# gtpu:
# - family: 2
# hostname: localhost
# port: 2153
# - hostname: ::1
#
gtpu:
pgw:
freeDiameter: pgw.conf
#
# ------------------------ MME --------------------------
#
# Specify default PGW addresses the GTP-C must connect to
# o 'family' Type : enum
# 0 : AF_UNSPEC
# 2 : AF_INET
# 30 : AF_INET6
# o Default : None
#
# <NOTE>
# o only first address is attempted. Others are ignored.
# o if HSS provide PGW addresss(per-UE),
# it overwrites configuration.
#
# <Example>
#
# o 127.0.0.3:2123 is attempted. [::3]:2123 is ignored.
# gtpc:
# - hostname: 127.0.0.3
# - hostname: ::3
#
# o [::3]:2123 is attempted. [127.0.0.3]:2123 is ignored.
# gtpc:
# - hostname: ::3
# - hostname: 127.0.0.3
#
#
# ------------------------ PGW --------------------------
#
# Specify local addresses the GTP-C server must bind to
# o 'family' Type : enum
# 0 : AF_UNSPEC
# 2 : AF_INET
# 30 : AF_INET6
# o Default : liston on all address available
#
# <Example>
#
# o Single GTP-C Server(127.0.0.3:2123)
# gtpu:
# hostname: 127.0.0.3
#
# o Multiple GTP-C Server(127.0.0.3:2124, [::3]:2123)
# gtpu:
# - hostname: 127.0.0.3
# port: 2124
# - hostname: ::3
#
gtpc:
- hostname: 127.0.0.3
- hostname: ::3
gtpu:
- hostname: 127.0.0.3
- hostname: ::3
#
# Specify PDN network with UE IP pool
#
# <Example>
#
# o Multiple IPv4 Pool
# pdn:
# addr:
# - 45.45.0.1/16
# - 46.46.0.1/16
#
# o Multiple Interface
# pdn:
# - addr: 45.45.0.1/16
# dev: pgwtun1
# - addr:
# - 46.46.0.1/16
# - 47.47.0.1/16
# dev: pgwtun2
#
# o Pool allocated per-APN
# pdn:
# - addr: 45.45.0.1/16
# dev: pgwtun1
# apn : internet
# - addr:
# - 46.46.0.1/16
# - 47.47.0.1/16
# dev: pgwtun2
# apn : volte
#
pdn:
addr: 45.45.0.1/16
dns:
- 8.8.8.8
- 8.8.4.4
dns6:
- 2001:4860:4860::8888
- 2001:4860:4860::8844
pcrf:
freeDiameter: "pcrf.conf"

View File

@ -39,12 +39,11 @@ static void attach_test1(abts_case *tc, void *data)
char *_initial_context_setup_request =
"00090080d8000006 00000005c0010000 9d00080002000100 42000a183e800000"
"603e800000001800 8086000034008080 450009200f807f00 0002000000017127"
"45c2015402074202 49064000f1105ba0 00485221c1010909 08696e7465726e65"
"4db5d98302074202 49064000f1105ba0 00485221c1010909 08696e7465726e65"
"7405012d2d00025e 06fefeeeee030327 2980c22304030000 0480211002000010"
"8106080808088306 04040404000d0408 080808000d040404 0404500bf600f110"
"8106080808088306 08080404000d0408 080808000d040808 0404500bf600f110"
"0002010000000153 12172c5949640125 006b000518000c00 00004900203311c6"
"03c6a6d67f695e5a c02bb75b381b693c 3893a6d932fd9182 3544e3e79b000000"
"0000000000000000 00";
"03c6a6d67f695e5a c02bb75b381b693c 3893a6d932fd9182 3544e3e79b";
char *_emm_information =
"000b402a00000300 000005c00100009d 000800020001001a 001413279fcc7266"
"0307614771304112 527563490100";