[SGsAP] Client program

This commit is contained in:
Sukchan Lee 2019-06-16 18:20:40 +09:00
parent ec7d9f2917
commit e2aa8ec198
12 changed files with 63 additions and 44 deletions

View File

@ -15,7 +15,6 @@
#include "mme-event.h"
#include "s1ap-path.h"
#include "s1ap-handler.h"
#include "sgsap-path.h"
#include "mme-sm.h"
#define MAX_CELL_PER_ENB 8
@ -87,7 +86,7 @@ void mme_context_init()
/* Paging retry timer: 2 secs */
self.t3413_value = ogs_time_from_sec(2);
/* Client timer to connect to server: 3 secs */
self.connect_timer_value = ogs_time_from_sec(3);
self.t_conn_value = ogs_time_from_sec(3);
context_initialized = 1;
}
@ -1522,7 +1521,6 @@ ogs_sockaddr_t *mme_pgw_addr_find_by_apn(
mme_vlr_t *mme_vlr_add(ogs_sockaddr_t *addr)
{
mme_event_t e;
mme_vlr_t *vlr = NULL;
ogs_assert(addr);
@ -1534,14 +1532,6 @@ mme_vlr_t *mme_vlr_add(ogs_sockaddr_t *addr)
vlr->node = ogs_socknode_new(addr);
ogs_assert(vlr->node);
vlr->connect_timer =
ogs_timer_add(self.timer_mgr, sgsap_connect_timeout, vlr);
ogs_assert(vlr->connect_timer);
e.vlr = vlr;
ogs_fsm_create(&vlr->sm, sgsap_state_initial, sgsap_state_final);
ogs_fsm_init(&vlr->sm, &e);
ogs_list_add(&self.vlr_list, vlr);
return vlr;
@ -1549,18 +1539,10 @@ mme_vlr_t *mme_vlr_add(ogs_sockaddr_t *addr)
void mme_vlr_remove(mme_vlr_t *vlr)
{
mme_event_t e;
ogs_assert(vlr);
ogs_list_remove(&self.vlr_list, vlr);
ogs_timer_delete(vlr->connect_timer);
e.vlr = vlr;
ogs_fsm_fini(&vlr->sm, &e);
ogs_fsm_delete(&vlr->sm);
ogs_socknode_free(vlr->node);
ogs_pool_free(&mme_vlr_pool, vlr);

View File

@ -122,7 +122,7 @@ typedef struct mme_context_s {
/* Paging retry timer value */
ogs_time_t t3413_value;
/* Client timer value to connect to server */
ogs_time_t connect_timer_value;
ogs_time_t t_conn_value;
/* Generator for unique identification */
uint32_t mme_ue_s1ap_id; /* mme_ue_s1ap_id generator */
@ -172,10 +172,9 @@ typedef struct mme_pgw_s {
typedef struct mme_vlr_s {
ogs_lnode_t lnode;
ogs_fsm_t sm; /* A state machine */
ogs_fsm_t sm; /* A state machine */
/* client timer to connect to server */
ogs_timer_t *connect_timer;
ogs_timer_t *t_conn; /* client timer to connect to server */
nas_tai_t tai;
nas_lai_t lai;

View File

@ -22,6 +22,8 @@ int mme_initialize()
mme_context_init();
mme_event_init();
ogs_sctp_init(context_self()->config.usrsctp.udp_port);
rv = gtp_xact_init(mme_self()->timer_mgr);
if (rv != OGS_OK) return rv;
@ -37,9 +39,6 @@ int mme_initialize()
rv = mme_fd_init();
if (rv != OGS_OK) return OGS_ERROR;
rv = ogs_sctp_init(context_self()->config.usrsctp.udp_port);
if (rv != OGS_OK) return rv;
thread = ogs_thread_create(mme_main, NULL);
if (!thread) return OGS_ERROR;

View File

@ -8,6 +8,7 @@
#include "s1ap-handler.h"
#include "s1ap-path.h"
#include "sgsap-path.h"
#include "nas-security.h"
#include "nas-path.h"
#include "emm-handler.h"
@ -54,6 +55,12 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
ogs_error("Can't establish S11-GTP path");
break;
}
rv = sgsap_open();
if (rv != OGS_OK)
{
ogs_error("Can't establish SGsAP path");
break;
}
rv = s1ap_open();
if (rv != OGS_OK)
{
@ -66,6 +73,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
case OGS_FSM_EXIT_SIG:
{
mme_gtp_close();
sgsap_close();
s1ap_close();
break;

View File

@ -28,9 +28,8 @@ static int set_rtoinfo(ogs_sock_t *sock, ogs_sockopt_t *option);
static int set_initmsg(ogs_sock_t *sock, ogs_sockopt_t *option);
static int set_nodelay(ogs_sock_t *sock, int on);
int ogs_sctp_init(uint16_t port)
void ogs_sctp_init(uint16_t port)
{
return OGS_OK;
}
void ogs_sctp_final(void)

View File

@ -55,7 +55,7 @@ typedef struct ogs_sctp_info_s {
uint16_t outbound_streams;
} ogs_sctp_info_t;
int ogs_sctp_init(uint16_t port);
void ogs_sctp_init(uint16_t port);
void ogs_sctp_final(void);
ogs_sock_t *ogs_sctp_socket(int family, int type, ogs_socknode_t *node);

View File

@ -21,7 +21,7 @@
static void ogs_debug_printf(const char *format, ...);
int ogs_sctp_init(uint16_t port)
void ogs_sctp_init(uint16_t port)
{
usrsctp_init(port, NULL, ogs_debug_printf);
#ifdef SCTP_DEBUG
@ -29,8 +29,6 @@ int ogs_sctp_init(uint16_t port)
#endif
usrsctp_sysctl_set_sctp_blackhole(2);
usrsctp_sysctl_set_sctp_enable_sack_immediately(1);
return OGS_OK;
}
void ogs_sctp_final()

View File

@ -19,15 +19,36 @@
#include "ogs-sctp.h"
#include "mme-event.h"
#include "mme-sm.h"
#include "sgsap-path.h"
int sgsap_open()
{
mme_vlr_t *vlr = NULL;
ogs_list_for_each(&mme_self()->vlr_list, vlr) {
mme_event_t e;
e.vlr = vlr;
ogs_fsm_create(&vlr->sm, sgsap_state_initial, sgsap_state_final);
ogs_fsm_init(&vlr->sm, &e);
}
return OGS_OK;
}
void sgsap_close()
{
mme_vlr_t *vlr = NULL;
ogs_list_for_each(&mme_self()->vlr_list, vlr) {
mme_event_t e;
e.vlr = vlr;
ogs_fsm_fini(&vlr->sm, &e);
ogs_fsm_delete(&vlr->sm);
}
}
void sgsap_connect_timeout(void *data)

View File

@ -17,23 +17,42 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include "mme-context.h"
#include "mme-event.h"
#include "mme-sm.h"
#include "sgsap-path.h"
void sgsap_state_initial(ogs_fsm_t *s, mme_event_t *e)
{
mme_vlr_t *vlr = NULL;
ogs_assert(s);
ogs_assert(e);
mme_sm_debug(e);
vlr = e->vlr;
ogs_assert(vlr);
vlr->t_conn = ogs_timer_add(mme_self()->timer_mgr,
sgsap_connect_timeout, vlr);
ogs_assert(vlr->t_conn);
OGS_FSM_TRAN(s, &sgsap_state_will_connect);
}
void sgsap_state_final(ogs_fsm_t *s, mme_event_t *e)
{
mme_vlr_t *vlr = NULL;
ogs_assert(s);
ogs_assert(e);
mme_sm_debug(e);
vlr = e->vlr;
ogs_assert(vlr);
ogs_timer_delete(vlr->t_conn);
}
void sgsap_state_will_connect(ogs_fsm_t *s, mme_event_t *e)
@ -49,6 +68,8 @@ void sgsap_state_will_connect(ogs_fsm_t *s, mme_event_t *e)
switch (e->id) {
case OGS_FSM_ENTRY_SIG:
ogs_assert(vlr->node);
sgsap_client(vlr->node);
break;
case OGS_FSM_EXIT_SIG:
break;

View File

@ -41,7 +41,7 @@ ogs_sock_t *sgsap_client(ogs_socknode_t *node)
ogs_socknode_set_poll(node, mme_self()->pollset,
OGS_POLLIN, sgsap_usrsctp_recv_handler, node);
sock = ogs_sctp_client(SOCK_STREAM, node);
sock = ogs_sctp_client(SOCK_SEQPACKET, node);
ogs_assert(sock);
ogs_info("sgsap_client() [%s]:%d",

View File

@ -76,12 +76,7 @@ int test_initialize(app_param_t *param, int argc, const char *const argv[])
}
mme_context_init();
rv = ogs_sctp_init(context_self()->config.usrsctp.udp_port);
if (rv != OGS_OK) {
ogs_error("ogs_sctp_init() failed");
return OGS_ERROR;
}
ogs_sctp_init(context_self()->config.usrsctp.udp_port);
app_did_initialize();

View File

@ -88,11 +88,8 @@ int test_initialize(app_param_t *param, int argc, const char *const argv[])
ogs_error("pcscf_fd_init() failed");
return OGS_ERROR;
}
rv = ogs_sctp_init(context_self()->config.usrsctp.udp_port);
if (rv != OGS_OK) {
ogs_error("ogs_sctp_init() failed");
return OGS_ERROR;
}
ogs_sctp_init(context_self()->config.usrsctp.udp_port);
rv = testpacket_init();
if (rv != OGS_OK)
{