mirror of
				https://github.com/open5gs/open5gs.git
				synced 2025-11-03 21:43:25 +00:00 
			
		
		
		
	[SGsAP] Client program
This commit is contained in:
		@@ -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);
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 
 | 
			
		||||
@@ -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()
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
 
 | 
			
		||||
@@ -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",
 | 
			
		||||
 
 | 
			
		||||
@@ -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();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
    {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user