memory optimization [#549]
1. number of packet buffer : 65,536 -> 32,768 2. Packet SDU Size : 8,192 -> 2,048 3. Stabilize test program
This commit is contained in:
parent
d4a9c140a8
commit
818f3139d4
|
@ -122,9 +122,9 @@ max:
|
||||||
# big: 8
|
# big: 8
|
||||||
#
|
#
|
||||||
# o Memory of Packet Buffering in UPF/SGW
|
# o Memory of Packet Buffering in UPF/SGW
|
||||||
# - Maximum Number of packet(SDU size = 8Kbytes) pool in UPF/SGW
|
# - Maximum Number of packet(SDU size = 2Kbytes) pool in UPF/SGW
|
||||||
# - UPF/SGW Memory Usage : 65536 * 8Kbytes = 512Mbytes
|
# - UPF/SGW Memory Usage : 32768 * 2Kbytes = 64Mbytes
|
||||||
#
|
#
|
||||||
# packet: 65536
|
# packet: 32768
|
||||||
#
|
#
|
||||||
pool:
|
pool:
|
||||||
|
|
|
@ -210,8 +210,8 @@ max:
|
||||||
# big: 8
|
# big: 8
|
||||||
#
|
#
|
||||||
# o Memory of Packet Buffering in UPF/SGW
|
# o Memory of Packet Buffering in UPF/SGW
|
||||||
# - Maximum Number of packet(SDU size = 8Kbytes) pool in UPF/SGW
|
# - Maximum Number of packet(SDU size = 2Kbytes) pool in UPF/SGW
|
||||||
# - UPF/SGW Memory Usage : 65536 * 8Kbytes = 512Mbytes
|
# - UPF/SGW Memory Usage : 32768 * 2Kbytes = 64Mbytes
|
||||||
#
|
#
|
||||||
# packet: 65536
|
# packet: 32768
|
||||||
pool:
|
pool:
|
||||||
|
|
|
@ -57,7 +57,7 @@ services:
|
||||||
environment:
|
environment:
|
||||||
- DB_URI=mongodb://mongodb/open5gs
|
- DB_URI=mongodb://mongodb/open5gs
|
||||||
- DISPLAY=$DISPLAY
|
- DISPLAY=$DISPLAY
|
||||||
# - DISPLAY=docker.for.mac.localhost:0
|
# - DISPLAY=host.docker.internal:0
|
||||||
cap_add:
|
cap_add:
|
||||||
- NET_ADMIN
|
- NET_ADMIN
|
||||||
devices:
|
devices:
|
||||||
|
|
|
@ -20,10 +20,16 @@ RUN apt-get update && \
|
||||||
vim \
|
vim \
|
||||||
sudo \
|
sudo \
|
||||||
iputils-ping \
|
iputils-ping \
|
||||||
wireshark \
|
|
||||||
net-tools && \
|
net-tools && \
|
||||||
apt-get clean
|
apt-get clean
|
||||||
|
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt-get install -y software-properties-common && \
|
||||||
|
sudo add-apt-repository ppa:wireshark-dev/stable -y && \
|
||||||
|
apt-get update && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive \
|
||||||
|
apt-get install -y wireshark
|
||||||
|
|
||||||
COPY setup.sh /root
|
COPY setup.sh /root
|
||||||
|
|
||||||
ARG username=acetcom
|
ARG username=acetcom
|
||||||
|
|
|
@ -57,6 +57,11 @@ $ meson build --prefix=`pwd`/install
|
||||||
$ ninja -C build
|
$ ninja -C build
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Please free up enough memory space on the VM and run the test program.
|
||||||
|
|
||||||
|
The test program has been run on [VirtualBox - CPU: 1, Memory: 4.00 GB] and [Docker for Mac - CPU: 2, Memory: 2.00 GB] with default setting (max.ue: 4,096, pool.packet: 32,768).
|
||||||
|
{: .notice--danger}
|
||||||
|
|
||||||
Check whether the compilation is correct.
|
Check whether the compilation is correct.
|
||||||
```bash
|
```bash
|
||||||
$ ./build/tests/attach/attach ## EPC Only
|
$ ./build/tests/attach/attach ## EPC Only
|
||||||
|
|
|
@ -179,7 +179,7 @@ static void app_context_prepare(void)
|
||||||
self.max.gnb = MAX_NUM_OF_GNB;
|
self.max.gnb = MAX_NUM_OF_GNB;
|
||||||
self.max.ue = MAX_NUM_OF_UE;
|
self.max.ue = MAX_NUM_OF_UE;
|
||||||
|
|
||||||
#define MAX_NUM_OF_PACKET_POOL 65536
|
#define MAX_NUM_OF_PACKET_POOL 32768
|
||||||
self.pool.packet = MAX_NUM_OF_PACKET_POOL;
|
self.pool.packet = MAX_NUM_OF_PACKET_POOL;
|
||||||
|
|
||||||
ogs_pkbuf_default_init(&self.pool.defconfig);
|
ogs_pkbuf_default_init(&self.pool.defconfig);
|
||||||
|
|
|
@ -37,6 +37,7 @@ extern "C" {
|
||||||
#define OGS_MAX_NUM_OF_PACKET_FILTER 16
|
#define OGS_MAX_NUM_OF_PACKET_FILTER 16
|
||||||
|
|
||||||
#define OGS_MAX_SDU_LEN 8192
|
#define OGS_MAX_SDU_LEN 8192
|
||||||
|
#define OGS_MAX_PKT_LEN 2048
|
||||||
#define OGS_PLMN_ID_LEN 3
|
#define OGS_PLMN_ID_LEN 3
|
||||||
#define OGS_MAX_PLMN_ID_BCD_LEN 6
|
#define OGS_MAX_PLMN_ID_BCD_LEN 6
|
||||||
|
|
||||||
|
|
|
@ -188,7 +188,7 @@ int ogs_pfcp_xact_update_tx(ogs_pfcp_xact_t *xact,
|
||||||
switch (stage) {
|
switch (stage) {
|
||||||
case PFCP_XACT_INITIAL_STAGE:
|
case PFCP_XACT_INITIAL_STAGE:
|
||||||
if (xact->step != 0) {
|
if (xact->step != 0) {
|
||||||
ogs_error("invalid step[%d]", xact->step);
|
ogs_error("invalid step[%d] type[%d]", xact->step, hdesc->type);
|
||||||
ogs_pkbuf_free(pkbuf);
|
ogs_pkbuf_free(pkbuf);
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
|
@ -201,7 +201,7 @@ int ogs_pfcp_xact_update_tx(ogs_pfcp_xact_t *xact,
|
||||||
|
|
||||||
case PFCP_XACT_FINAL_STAGE:
|
case PFCP_XACT_FINAL_STAGE:
|
||||||
if (xact->step != 2) {
|
if (xact->step != 2) {
|
||||||
ogs_error("invalid step[%d]", xact->step);
|
ogs_error("invalid step[%d] type[%d]", xact->step, hdesc->type);
|
||||||
ogs_pkbuf_free(pkbuf);
|
ogs_pkbuf_free(pkbuf);
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
|
@ -221,19 +221,19 @@ int ogs_pfcp_xact_update_tx(ogs_pfcp_xact_t *xact,
|
||||||
case PFCP_XACT_INTERMEDIATE_STAGE:
|
case PFCP_XACT_INTERMEDIATE_STAGE:
|
||||||
case PFCP_XACT_FINAL_STAGE:
|
case PFCP_XACT_FINAL_STAGE:
|
||||||
if (xact->step != 1) {
|
if (xact->step != 1) {
|
||||||
ogs_error("invalid step[%d]", xact->step);
|
ogs_error("invalid step[%d] type[%d]", xact->step, hdesc->type);
|
||||||
ogs_pkbuf_free(pkbuf);
|
ogs_pkbuf_free(pkbuf);
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
ogs_error("invalid stage[%d]", stage);
|
ogs_error("invalid stage[%d] type[%d]", stage, hdesc->type);
|
||||||
ogs_pkbuf_free(pkbuf);
|
ogs_pkbuf_free(pkbuf);
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ogs_error("invalid org[%d]", xact->org);
|
ogs_error("invalid org[%d] type[%d]", xact->org, hdesc->type);
|
||||||
ogs_pkbuf_free(pkbuf);
|
ogs_pkbuf_free(pkbuf);
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
|
@ -296,7 +296,7 @@ int ogs_pfcp_xact_update_rx(ogs_pfcp_xact_t *xact, uint8_t type)
|
||||||
ogs_pkbuf_t *pkbuf = NULL;
|
ogs_pkbuf_t *pkbuf = NULL;
|
||||||
|
|
||||||
if (xact->step != 2 && xact->step != 3) {
|
if (xact->step != 2 && xact->step != 3) {
|
||||||
ogs_error("invalid step[%d]", xact->step);
|
ogs_error("invalid step[%d] type[%d]", xact->step, type);
|
||||||
ogs_pkbuf_free(pkbuf);
|
ogs_pkbuf_free(pkbuf);
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
|
@ -335,7 +335,7 @@ int ogs_pfcp_xact_update_rx(ogs_pfcp_xact_t *xact, uint8_t type)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (xact->step != 1) {
|
if (xact->step != 1) {
|
||||||
ogs_error("invalid step[%d]", xact->step);
|
ogs_error("invalid step[%d] type[%d]", xact->step, type);
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -347,7 +347,7 @@ int ogs_pfcp_xact_update_rx(ogs_pfcp_xact_t *xact, uint8_t type)
|
||||||
|
|
||||||
case PFCP_XACT_FINAL_STAGE:
|
case PFCP_XACT_FINAL_STAGE:
|
||||||
if (xact->step != 1) {
|
if (xact->step != 1) {
|
||||||
ogs_error("invalid step[%d]", xact->step);
|
ogs_error("invalid step[%d] type[%d]", xact->step, type);
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -363,7 +363,7 @@ int ogs_pfcp_xact_update_rx(ogs_pfcp_xact_t *xact, uint8_t type)
|
||||||
ogs_pkbuf_t *pkbuf = NULL;
|
ogs_pkbuf_t *pkbuf = NULL;
|
||||||
|
|
||||||
if (xact->step != 1 && xact->step != 2) {
|
if (xact->step != 1 && xact->step != 2) {
|
||||||
ogs_error("invalid step[%d]", xact->step);
|
ogs_error("invalid step[%d] type[%d]", xact->step, type);
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -401,7 +401,7 @@ int ogs_pfcp_xact_update_rx(ogs_pfcp_xact_t *xact, uint8_t type)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (xact->step != 0) {
|
if (xact->step != 0) {
|
||||||
ogs_error("invalid step[%d]", xact->step);
|
ogs_error("invalid step[%d] type[%d]", xact->step, type);
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
if (xact->tm_holding)
|
if (xact->tm_holding)
|
||||||
|
@ -416,7 +416,7 @@ int ogs_pfcp_xact_update_rx(ogs_pfcp_xact_t *xact, uint8_t type)
|
||||||
|
|
||||||
case PFCP_XACT_FINAL_STAGE:
|
case PFCP_XACT_FINAL_STAGE:
|
||||||
if (xact->step != 2) {
|
if (xact->step != 2) {
|
||||||
ogs_error("invalid step[%d]", xact->step);
|
ogs_error("invalid step[%d] type[%d]", xact->step, type);
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -470,7 +470,7 @@ int ogs_pfcp_xact_commit(ogs_pfcp_xact_t *xact)
|
||||||
switch (stage) {
|
switch (stage) {
|
||||||
case PFCP_XACT_INITIAL_STAGE:
|
case PFCP_XACT_INITIAL_STAGE:
|
||||||
if (xact->step != 1) {
|
if (xact->step != 1) {
|
||||||
ogs_error("invalid step[%d]", xact->step);
|
ogs_error("invalid step[%d] type[%d]", xact->step, type);
|
||||||
ogs_pfcp_xact_delete(xact);
|
ogs_pfcp_xact_delete(xact);
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
|
@ -488,7 +488,7 @@ int ogs_pfcp_xact_commit(ogs_pfcp_xact_t *xact)
|
||||||
|
|
||||||
case PFCP_XACT_FINAL_STAGE:
|
case PFCP_XACT_FINAL_STAGE:
|
||||||
if (xact->step != 2 && xact->step != 3) {
|
if (xact->step != 2 && xact->step != 3) {
|
||||||
ogs_error("invalid step[%d]", xact->step);
|
ogs_error("invalid step[%d] type[%d]", xact->step, type);
|
||||||
ogs_pfcp_xact_delete(xact);
|
ogs_pfcp_xact_delete(xact);
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
|
@ -500,7 +500,7 @@ int ogs_pfcp_xact_commit(ogs_pfcp_xact_t *xact)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
ogs_error("invalid stage[%d]", stage);
|
ogs_error("invalid stage[%d] type[%d]", stage, type);
|
||||||
ogs_pfcp_xact_delete(xact);
|
ogs_pfcp_xact_delete(xact);
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
|
@ -513,7 +513,7 @@ int ogs_pfcp_xact_commit(ogs_pfcp_xact_t *xact)
|
||||||
|
|
||||||
case PFCP_XACT_INTERMEDIATE_STAGE:
|
case PFCP_XACT_INTERMEDIATE_STAGE:
|
||||||
if (xact->step != 2) {
|
if (xact->step != 2) {
|
||||||
ogs_error("invalid step[%d]", xact->step);
|
ogs_error("invalid step[%d] type[%d]", xact->step, type);
|
||||||
ogs_pfcp_xact_delete(xact);
|
ogs_pfcp_xact_delete(xact);
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
|
@ -525,7 +525,7 @@ int ogs_pfcp_xact_commit(ogs_pfcp_xact_t *xact)
|
||||||
|
|
||||||
case PFCP_XACT_FINAL_STAGE:
|
case PFCP_XACT_FINAL_STAGE:
|
||||||
if (xact->step != 2 && xact->step != 3) {
|
if (xact->step != 2 && xact->step != 3) {
|
||||||
ogs_error("invalid step[%d]", xact->step);
|
ogs_error("invalid step[%d] type[%d]", xact->step, type);
|
||||||
ogs_pfcp_xact_delete(xact);
|
ogs_pfcp_xact_delete(xact);
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
|
@ -537,12 +537,12 @@ int ogs_pfcp_xact_commit(ogs_pfcp_xact_t *xact)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
ogs_error("invalid stage[%d]", stage);
|
ogs_error("invalid stage[%d] type[%d]", stage, type);
|
||||||
ogs_pfcp_xact_delete(xact);
|
ogs_pfcp_xact_delete(xact);
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ogs_error("invalid org[%d]", xact->org);
|
ogs_error("invalid org[%d] type[%d]", xact->org, type);
|
||||||
ogs_pfcp_xact_delete(xact);
|
ogs_pfcp_xact_delete(xact);
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,8 +35,6 @@ typedef struct sgwu_bearer_s sgwu_bearer_t;
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SGWU_EVT_BASE = OGS_FSM_USER_SIG,
|
SGWU_EVT_BASE = OGS_FSM_USER_SIG,
|
||||||
|
|
||||||
SGWU_EVT_LO_DLDATA_NOTI,
|
|
||||||
|
|
||||||
SGWU_EVT_SXA_MESSAGE,
|
SGWU_EVT_SXA_MESSAGE,
|
||||||
SGWU_EVT_SXA_TIMER,
|
SGWU_EVT_SXA_TIMER,
|
||||||
SGWU_EVT_SXA_NO_HEARTBEAT,
|
SGWU_EVT_SXA_NO_HEARTBEAT,
|
||||||
|
|
|
@ -43,9 +43,9 @@ static void _gtpv1_u_recv_cb(short when, ogs_socket_t fd, void *data)
|
||||||
|
|
||||||
ogs_assert(fd != INVALID_SOCKET);
|
ogs_assert(fd != INVALID_SOCKET);
|
||||||
|
|
||||||
pkbuf = ogs_pkbuf_alloc(packet_pool, OGS_MAX_SDU_LEN);
|
pkbuf = ogs_pkbuf_alloc(packet_pool, OGS_MAX_PKT_LEN);
|
||||||
ogs_assert(pkbuf);
|
ogs_assert(pkbuf);
|
||||||
ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN);
|
ogs_pkbuf_put(pkbuf, OGS_MAX_PKT_LEN);
|
||||||
|
|
||||||
size = ogs_recvfrom(fd, pkbuf->data, pkbuf->len, 0, &from);
|
size = ogs_recvfrom(fd, pkbuf->data, pkbuf->len, 0, &from);
|
||||||
if (size <= 0) {
|
if (size <= 0) {
|
||||||
|
@ -181,7 +181,7 @@ int sgwu_gtp_open(void)
|
||||||
ogs_pkbuf_config_t config;
|
ogs_pkbuf_config_t config;
|
||||||
memset(&config, 0, sizeof config);
|
memset(&config, 0, sizeof config);
|
||||||
|
|
||||||
config.cluster_8192_pool = ogs_app()->pool.packet;
|
config.cluster_2048_pool = ogs_app()->pool.packet;
|
||||||
|
|
||||||
packet_pool = ogs_pkbuf_pool_create(&config);
|
packet_pool = ogs_pkbuf_pool_create(&config);
|
||||||
|
|
||||||
|
|
|
@ -29,10 +29,6 @@ extern "C" {
|
||||||
int sgwu_gtp_open(void);
|
int sgwu_gtp_open(void);
|
||||||
void sgwu_gtp_close(void);
|
void sgwu_gtp_close(void);
|
||||||
|
|
||||||
#if 0
|
|
||||||
void sgwu_gtp_send_end_marker(sgwu_tunnel_t *s1u_tunnel);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -45,8 +45,6 @@ void sgwu_state_operational(ogs_fsm_t *s, sgwu_event_t *e)
|
||||||
ogs_pfcp_node_t *node = NULL;
|
ogs_pfcp_node_t *node = NULL;
|
||||||
ogs_pfcp_xact_t *xact = NULL;
|
ogs_pfcp_xact_t *xact = NULL;
|
||||||
|
|
||||||
sgwu_bearer_t *bearer = NULL;
|
|
||||||
|
|
||||||
sgwu_sm_debug(e);
|
sgwu_sm_debug(e);
|
||||||
|
|
||||||
ogs_assert(s);
|
ogs_assert(s);
|
||||||
|
@ -67,16 +65,6 @@ void sgwu_state_operational(ogs_fsm_t *s, sgwu_event_t *e)
|
||||||
sgwu_pfcp_close();
|
sgwu_pfcp_close();
|
||||||
sgwu_gtp_close();
|
sgwu_gtp_close();
|
||||||
break;
|
break;
|
||||||
case SGWU_EVT_LO_DLDATA_NOTI:
|
|
||||||
ogs_assert(e);
|
|
||||||
|
|
||||||
bearer = e->bearer;
|
|
||||||
ogs_assert(bearer);
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
sgwu_s11_handle_lo_dldata_notification(bearer);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
case SGWU_EVT_SXA_MESSAGE:
|
case SGWU_EVT_SXA_MESSAGE:
|
||||||
ogs_assert(e);
|
ogs_assert(e);
|
||||||
recvbuf = e->pkbuf;
|
recvbuf = e->pkbuf;
|
||||||
|
|
|
@ -41,6 +41,8 @@
|
||||||
|
|
||||||
#define UPF_GTP_HANDLED 1
|
#define UPF_GTP_HANDLED 1
|
||||||
|
|
||||||
|
static ogs_pkbuf_pool_t *packet_pool = NULL;
|
||||||
|
|
||||||
static void upf_gtp_handle_multicast(ogs_pkbuf_t *recvbuf);
|
static void upf_gtp_handle_multicast(ogs_pkbuf_t *recvbuf);
|
||||||
static int upf_gtp_handle_slaac(upf_sess_t *sess, ogs_pkbuf_t *recvbuf);
|
static int upf_gtp_handle_slaac(upf_sess_t *sess, ogs_pkbuf_t *recvbuf);
|
||||||
static int upf_gtp_send_router_advertisement(
|
static int upf_gtp_send_router_advertisement(
|
||||||
|
@ -53,10 +55,10 @@ static void _gtpv1_tun_recv_cb(short when, ogs_socket_t fd, void *data)
|
||||||
ogs_pfcp_pdr_t *pdr = NULL;
|
ogs_pfcp_pdr_t *pdr = NULL;
|
||||||
ogs_pfcp_user_plane_report_t report;
|
ogs_pfcp_user_plane_report_t report;
|
||||||
|
|
||||||
recvbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN);
|
recvbuf = ogs_pkbuf_alloc(packet_pool, OGS_MAX_PKT_LEN);
|
||||||
ogs_assert(recvbuf);
|
ogs_assert(recvbuf);
|
||||||
ogs_pkbuf_reserve(recvbuf, OGS_GTPV1U_5GC_HEADER_LEN);
|
ogs_pkbuf_reserve(recvbuf, OGS_GTPV1U_5GC_HEADER_LEN);
|
||||||
ogs_pkbuf_put(recvbuf, OGS_MAX_SDU_LEN-OGS_GTPV1U_5GC_HEADER_LEN);
|
ogs_pkbuf_put(recvbuf, OGS_MAX_PKT_LEN-OGS_GTPV1U_5GC_HEADER_LEN);
|
||||||
|
|
||||||
n = ogs_read(fd, recvbuf->data, recvbuf->len);
|
n = ogs_read(fd, recvbuf->data, recvbuf->len);
|
||||||
if (n <= 0) {
|
if (n <= 0) {
|
||||||
|
@ -102,9 +104,9 @@ static void _gtpv1_u_recv_cb(short when, ogs_socket_t fd, void *data)
|
||||||
|
|
||||||
ogs_assert(fd != INVALID_SOCKET);
|
ogs_assert(fd != INVALID_SOCKET);
|
||||||
|
|
||||||
pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN);
|
pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_PKT_LEN);
|
||||||
ogs_assert(pkbuf);
|
ogs_assert(pkbuf);
|
||||||
ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN);
|
ogs_pkbuf_put(pkbuf, OGS_MAX_PKT_LEN);
|
||||||
|
|
||||||
size = ogs_recvfrom(fd, pkbuf->data, pkbuf->len, 0, &from);
|
size = ogs_recvfrom(fd, pkbuf->data, pkbuf->len, 0, &from);
|
||||||
if (size <= 0) {
|
if (size <= 0) {
|
||||||
|
@ -256,6 +258,13 @@ int upf_gtp_open(void)
|
||||||
ogs_sock_t *sock = NULL;
|
ogs_sock_t *sock = NULL;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
ogs_pkbuf_config_t config;
|
||||||
|
memset(&config, 0, sizeof config);
|
||||||
|
|
||||||
|
config.cluster_2048_pool = ogs_app()->pool.packet;
|
||||||
|
|
||||||
|
packet_pool = ogs_pkbuf_pool_create(&config);
|
||||||
|
|
||||||
ogs_list_for_each(&upf_self()->gtpu_list, node) {
|
ogs_list_for_each(&upf_self()->gtpu_list, node) {
|
||||||
sock = ogs_gtp_server(node);
|
sock = ogs_gtp_server(node);
|
||||||
ogs_assert(sock);
|
ogs_assert(sock);
|
||||||
|
@ -333,6 +342,8 @@ void upf_gtp_close(void)
|
||||||
ogs_pollset_remove(dev->poll);
|
ogs_pollset_remove(dev->poll);
|
||||||
ogs_closesocket(dev->fd);
|
ogs_closesocket(dev->fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ogs_pkbuf_pool_destroy(packet_pool);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void upf_gtp_handle_multicast(ogs_pkbuf_t *recvbuf)
|
static void upf_gtp_handle_multicast(ogs_pkbuf_t *recvbuf)
|
||||||
|
|
|
@ -49,27 +49,26 @@ int app_initialize(const char *const argv[])
|
||||||
|
|
||||||
if (ogs_app()->parameter.no_nrf == 0)
|
if (ogs_app()->parameter.no_nrf == 0)
|
||||||
nrf_thread = test_child_create("nrf", argv_out);
|
nrf_thread = test_child_create("nrf", argv_out);
|
||||||
|
|
||||||
if (ogs_app()->parameter.no_udr == 0)
|
if (ogs_app()->parameter.no_udr == 0)
|
||||||
udr_thread = test_child_create("udr", argv_out);
|
udr_thread = test_child_create("udr", argv_out);
|
||||||
if (ogs_app()->parameter.no_udm == 0)
|
if (ogs_app()->parameter.no_udm == 0)
|
||||||
udm_thread = test_child_create("udm", argv_out);
|
udm_thread = test_child_create("udm", argv_out);
|
||||||
if (ogs_app()->parameter.no_ausf == 0)
|
if (ogs_app()->parameter.no_ausf == 0)
|
||||||
ausf_thread = test_child_create("ausf", argv_out);
|
ausf_thread = test_child_create("ausf", argv_out);
|
||||||
|
|
||||||
if (ogs_app()->parameter.no_upf == 0)
|
if (ogs_app()->parameter.no_upf == 0)
|
||||||
upf_thread = test_child_create("upf", argv_out);
|
upf_thread = test_child_create("upf", argv_out);
|
||||||
|
|
||||||
/* Wait for PFCP association */
|
|
||||||
ogs_msleep(300);
|
|
||||||
|
|
||||||
if (ogs_app()->parameter.no_smf == 0)
|
if (ogs_app()->parameter.no_smf == 0)
|
||||||
smf_thread = test_child_create("smf", argv_out);
|
smf_thread = test_child_create("smf", argv_out);
|
||||||
|
|
||||||
if (ogs_app()->parameter.no_amf == 0)
|
if (ogs_app()->parameter.no_amf == 0)
|
||||||
amf_thread = test_child_create("amf", argv_out);
|
amf_thread = test_child_create("amf", argv_out);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Wait for all sockets listening
|
* Wait for all sockets listening
|
||||||
*
|
*
|
||||||
* If freeDiameter is not used, it uses a delay of less than 1 second.
|
* If freeDiameter is not used, it uses a delay of less than 4 seconds.
|
||||||
*/
|
*/
|
||||||
ogs_msleep(1500);
|
ogs_msleep(1500);
|
||||||
|
|
||||||
|
@ -78,14 +77,15 @@ int app_initialize(const char *const argv[])
|
||||||
|
|
||||||
void app_terminate(void)
|
void app_terminate(void)
|
||||||
{
|
{
|
||||||
ogs_msleep(300);
|
|
||||||
|
|
||||||
if (amf_thread) ogs_thread_destroy(amf_thread);
|
if (amf_thread) ogs_thread_destroy(amf_thread);
|
||||||
|
|
||||||
if (smf_thread) ogs_thread_destroy(smf_thread);
|
if (smf_thread) ogs_thread_destroy(smf_thread);
|
||||||
if (upf_thread) ogs_thread_destroy(upf_thread);
|
if (upf_thread) ogs_thread_destroy(upf_thread);
|
||||||
|
|
||||||
if (ausf_thread) ogs_thread_destroy(ausf_thread);
|
if (ausf_thread) ogs_thread_destroy(ausf_thread);
|
||||||
if (udm_thread) ogs_thread_destroy(udm_thread);
|
if (udm_thread) ogs_thread_destroy(udm_thread);
|
||||||
if (udr_thread) ogs_thread_destroy(udr_thread);
|
if (udr_thread) ogs_thread_destroy(udr_thread);
|
||||||
|
|
||||||
if (nrf_thread) ogs_thread_destroy(nrf_thread);
|
if (nrf_thread) ogs_thread_destroy(nrf_thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -71,13 +71,11 @@ int app_initialize(const char *const argv[])
|
||||||
if (ogs_app()->parameter.no_sgwu == 0)
|
if (ogs_app()->parameter.no_sgwu == 0)
|
||||||
sgwu_thread = test_child_create("sgwu", argv_out);
|
sgwu_thread = test_child_create("sgwu", argv_out);
|
||||||
|
|
||||||
/* Wait for PFCP association */
|
|
||||||
ogs_msleep(300);
|
|
||||||
|
|
||||||
if (ogs_app()->parameter.no_smf == 0)
|
if (ogs_app()->parameter.no_smf == 0)
|
||||||
smf_thread = test_child_create("smf", argv_out);
|
smf_thread = test_child_create("smf", argv_out);
|
||||||
if (ogs_app()->parameter.no_sgwc == 0)
|
if (ogs_app()->parameter.no_sgwc == 0)
|
||||||
sgwc_thread = test_child_create("sgwc", argv_out);
|
sgwc_thread = test_child_create("sgwc", argv_out);
|
||||||
|
|
||||||
if (ogs_app()->parameter.no_mme == 0)
|
if (ogs_app()->parameter.no_mme == 0)
|
||||||
mme_thread = test_child_create("mme", argv_out);
|
mme_thread = test_child_create("mme", argv_out);
|
||||||
if (ogs_app()->parameter.no_amf == 0)
|
if (ogs_app()->parameter.no_amf == 0)
|
||||||
|
@ -86,7 +84,7 @@ int app_initialize(const char *const argv[])
|
||||||
/*
|
/*
|
||||||
* Wait for all sockets listening
|
* Wait for all sockets listening
|
||||||
*
|
*
|
||||||
* Note that at least 1 second is needed if freeDiameter is running.
|
* Note that at least 4 seconds are needed if freeDiameter is running.
|
||||||
*/
|
*/
|
||||||
ogs_msleep(5000);
|
ogs_msleep(5000);
|
||||||
|
|
||||||
|
@ -95,10 +93,9 @@ int app_initialize(const char *const argv[])
|
||||||
|
|
||||||
void app_terminate(void)
|
void app_terminate(void)
|
||||||
{
|
{
|
||||||
ogs_msleep(300);
|
|
||||||
|
|
||||||
if (amf_thread) ogs_thread_destroy(amf_thread);
|
if (amf_thread) ogs_thread_destroy(amf_thread);
|
||||||
if (mme_thread) ogs_thread_destroy(mme_thread);
|
if (mme_thread) ogs_thread_destroy(mme_thread);
|
||||||
|
|
||||||
if (sgwc_thread) ogs_thread_destroy(sgwc_thread);
|
if (sgwc_thread) ogs_thread_destroy(sgwc_thread);
|
||||||
if (smf_thread) ogs_thread_destroy(smf_thread);
|
if (smf_thread) ogs_thread_destroy(smf_thread);
|
||||||
|
|
||||||
|
@ -111,7 +108,6 @@ void app_terminate(void)
|
||||||
|
|
||||||
if (hss_thread) ogs_thread_destroy(hss_thread);
|
if (hss_thread) ogs_thread_destroy(hss_thread);
|
||||||
if (pcrf_thread) ogs_thread_destroy(pcrf_thread);
|
if (pcrf_thread) ogs_thread_destroy(pcrf_thread);
|
||||||
|
|
||||||
if (nrf_thread) ogs_thread_destroy(nrf_thread);
|
if (nrf_thread) ogs_thread_destroy(nrf_thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -60,20 +60,18 @@ int app_initialize(const char *const argv[])
|
||||||
if (ogs_app()->parameter.no_sgwu == 0)
|
if (ogs_app()->parameter.no_sgwu == 0)
|
||||||
sgwu_thread = test_child_create("sgwu", argv_out);
|
sgwu_thread = test_child_create("sgwu", argv_out);
|
||||||
|
|
||||||
/* Wait for PFCP association */
|
|
||||||
ogs_msleep(300);
|
|
||||||
|
|
||||||
if (ogs_app()->parameter.no_smf == 0)
|
if (ogs_app()->parameter.no_smf == 0)
|
||||||
smf_thread = test_child_create("smf", argv_out);
|
smf_thread = test_child_create("smf", argv_out);
|
||||||
if (ogs_app()->parameter.no_sgwc == 0)
|
if (ogs_app()->parameter.no_sgwc == 0)
|
||||||
sgwc_thread = test_child_create("sgwc", argv_out);
|
sgwc_thread = test_child_create("sgwc", argv_out);
|
||||||
|
|
||||||
if (ogs_app()->parameter.no_mme == 0)
|
if (ogs_app()->parameter.no_mme == 0)
|
||||||
mme_thread = test_child_create("mme", argv_out);
|
mme_thread = test_child_create("mme", argv_out);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Wait for all sockets listening
|
* Wait for all sockets listening
|
||||||
*
|
*
|
||||||
* Note that at least 1 second is needed if freeDiameter is running.
|
* Note that at least 4 seconds are needed if freeDiameter is running.
|
||||||
*/
|
*/
|
||||||
ogs_msleep(5000);
|
ogs_msleep(5000);
|
||||||
|
|
||||||
|
@ -82,13 +80,14 @@ int app_initialize(const char *const argv[])
|
||||||
|
|
||||||
void app_terminate(void)
|
void app_terminate(void)
|
||||||
{
|
{
|
||||||
ogs_msleep(300);
|
|
||||||
|
|
||||||
if (mme_thread) ogs_thread_destroy(mme_thread);
|
if (mme_thread) ogs_thread_destroy(mme_thread);
|
||||||
|
|
||||||
if (sgwc_thread) ogs_thread_destroy(sgwc_thread);
|
if (sgwc_thread) ogs_thread_destroy(sgwc_thread);
|
||||||
if (smf_thread) ogs_thread_destroy(smf_thread);
|
if (smf_thread) ogs_thread_destroy(smf_thread);
|
||||||
|
|
||||||
if (sgwu_thread) ogs_thread_destroy(sgwu_thread);
|
if (sgwu_thread) ogs_thread_destroy(sgwu_thread);
|
||||||
if (upf_thread) ogs_thread_destroy(upf_thread);
|
if (upf_thread) ogs_thread_destroy(upf_thread);
|
||||||
|
|
||||||
if (hss_thread) ogs_thread_destroy(hss_thread);
|
if (hss_thread) ogs_thread_destroy(hss_thread);
|
||||||
if (pcrf_thread) ogs_thread_destroy(pcrf_thread);
|
if (pcrf_thread) ogs_thread_destroy(pcrf_thread);
|
||||||
if (nrf_thread) ogs_thread_destroy(nrf_thread);
|
if (nrf_thread) ogs_thread_destroy(nrf_thread);
|
||||||
|
|
|
@ -72,8 +72,6 @@ void test_app_run(int argc, const char *const argv[],
|
||||||
|
|
||||||
rv = test_context_parse_config();
|
rv = test_context_parse_config();
|
||||||
ogs_assert(rv == OGS_OK);
|
ogs_assert(rv == OGS_OK);
|
||||||
|
|
||||||
ogs_msleep(500); /* Wait for listening all sockets */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define MAX_CHILD_PROCESS 16
|
#define MAX_CHILD_PROCESS 16
|
||||||
|
|
Loading…
Reference in New Issue