[SGsAP] continue to implement it

This commit is contained in:
Sukchan Lee 2019-06-16 17:33:45 +09:00
parent 0be339e52d
commit ec7d9f2917
8 changed files with 63 additions and 7 deletions

@ -1 +1 @@
Subproject commit 1239ee54c9d168ce094bab66d38a2ae84fe3cada
Subproject commit 1106c4453e686b5f166b596468e218f6fd06c50a

View File

@ -15,6 +15,7 @@
#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
@ -83,8 +84,10 @@ void mme_context_init()
self.imsi_ue_hash = ogs_hash_make();
self.guti_ue_hash = ogs_hash_make();
/* Timer value */
self.t3413_value = ogs_time_from_sec(2); /* Paging retry timer: 2 secs */
/* 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);
context_initialized = 1;
}
@ -1519,6 +1522,7 @@ 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);
@ -1530,6 +1534,14 @@ 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;
@ -1537,11 +1549,20 @@ 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

@ -119,8 +119,10 @@ typedef struct mme_context_s {
/* S1SetupResponse */
uint8_t relative_capacity;
/* Timer value */
ogs_time_t t3413_value; /* Paging retry timer value */
/* Paging retry timer value */
ogs_time_t t3413_value;
/* Client timer value to connect to server */
ogs_time_t connect_timer_value;
/* Generator for unique identification */
uint32_t mme_ue_s1ap_id; /* mme_ue_s1ap_id generator */
@ -170,7 +172,10 @@ 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;
nas_tai_t tai;
nas_lai_t lai;

View File

@ -52,6 +52,7 @@ typedef enum {
typedef long S1AP_ProcedureCode_t;
typedef struct S1AP_S1AP_PDU s1ap_message_t;
typedef struct nas_message_s nas_message_t;
typedef struct mme_vlr_s mme_vlr_t;
typedef struct mme_enb_s mme_enb_t;
typedef struct enb_ue_s enb_ue_t;
typedef struct mme_ue_s mme_ue_t;
@ -73,6 +74,7 @@ typedef struct mme_event_s {
uint8_t nas_type;
nas_message_t *nas_message;
mme_vlr_t *vlr;
mme_enb_t *enb;
enb_ue_t *enb_ue;
mme_ue_t *mme_ue;

View File

@ -55,7 +55,6 @@ void s1ap_state_operational(ogs_fsm_t *s, mme_event_t *e)
ogs_assert(s);
ogs_assert(e);
ogs_assert(e);
mme_sm_debug(e);
enb = e->enb;

View File

@ -30,6 +30,29 @@ void sgsap_close()
{
}
void sgsap_connect_timeout(void *data)
{
#if 0
mme_vlr_t *vlr = data;
ogs_assert(vlr);
if (mme_ue->max_paging_retry >= MAX_NUM_OF_PAGING) {
/* Paging failed */
ogs_warn("[EMM] Paging to IMSI[%s] failed. Stop paging",
mme_ue->imsi_bcd);
if (mme_ue->last_paging_msg) {
ogs_pkbuf_free(mme_ue->last_paging_msg);
mme_ue->last_paging_msg = NULL;
}
} else {
mme_ue->max_paging_retry++;
s1ap_handle_paging(mme_ue);
/* Start T3413 */
ogs_timer_start(mme_ue->t3413, mme_self()->t3413_value);
}
#endif
}
int sgsap_send(ogs_sock_t *sock, ogs_pkbuf_t *pkbuf,
ogs_sockaddr_t *addr, uint16_t stream_no)
{

View File

@ -32,6 +32,8 @@ void sgsap_close(void);
ogs_sock_t *sgsap_client(ogs_socknode_t *node);
void sgsap_recv_handler(short when, ogs_socket_t fd, void *data);
void sgsap_connect_timeout(void *data);
int sgsap_send(ogs_sock_t *sock,
ogs_pkbuf_t *pkbuf, ogs_sockaddr_t *addr, uint16_t stream_no);
int sgsap_recv(ogs_sock_t *sock, ogs_pkbuf_t *pkbuf);

View File

@ -38,11 +38,15 @@ void sgsap_state_final(ogs_fsm_t *s, mme_event_t *e)
void sgsap_state_will_connect(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);
switch (e->id) {
case OGS_FSM_ENTRY_SIG:
break;