[SGSAP] start this feature

This commit is contained in:
Sukchan Lee 2019-06-16 16:47:20 +09:00
parent fa81c86e22
commit 0be339e52d
9 changed files with 55 additions and 22 deletions

View File

@ -1594,11 +1594,11 @@ mme_enb_t *mme_enb_add(ogs_sock_t *sock, ogs_sockaddr_t *addr)
enb->addr = addr;
enb->sock_type = mme_enb_sock_type(enb->sock);
enb->outbound_streams = DEFAULT_SCTP_MAX_NUM_OF_OSTREAMS;
enb->max_num_of_ostreams = DEFAULT_SCTP_MAX_NUM_OF_OSTREAMS;
if (context_self()->config.sockopt.sctp.max_num_of_ostreams) {
enb->outbound_streams =
enb->max_num_of_ostreams =
context_self()->config.sockopt.sctp.max_num_of_ostreams;
ogs_info("[ENB] max_num_of_ostreams : %d", enb->outbound_streams);
ogs_info("[ENB] max_num_of_ostreams : %d", enb->max_num_of_ostreams);
}
ogs_list_init(&enb->enb_ue_list);
@ -1906,7 +1906,8 @@ mme_ue_t* mme_ue_add(enb_ue_t *enb_ue)
* 0 : Non UE signalling
* 1-29 : UE specific association
*/
mme_ue->ostream_id = NEXT_ID(self.ostream_id, 1, enb->outbound_streams-1);
mme_ue->enb_ostream_id =
NEXT_ID(self.enb_ostream_id, 1, enb->max_num_of_ostreams-1);
/* Create New GUTI */
mme_ue_new_guti(mme_ue);
@ -1938,6 +1939,18 @@ mme_ue_t* mme_ue_add(enb_ue_t *enb_ue)
} else
ogs_assert_if_reached();
/* Clear VLR */
mme_ue->vlr = NULL;
mme_ue->vlr_ostream_id = 0;
#if 0 /* FIXME */
if (mme_ue->vlr) {
mme_ue->vlr_ostream_id =
NEXT_ID(self.vlr_ostream_id, 1, mme_ue->vlr->max_num_of_ostreams-1);
} else {
mme_ue->vlr_ostream_id = 0;
}
#endif
/* Create paging retry timer */
mme_ue->t3413 = ogs_timer_add(self.timer_mgr, s1ap_t3413_timeout, mme_ue);

View File

@ -124,7 +124,8 @@ typedef struct mme_context_s {
/* Generator for unique identification */
uint32_t mme_ue_s1ap_id; /* mme_ue_s1ap_id generator */
uint16_t ostream_id; /* ostream_id generator */
uint16_t enb_ostream_id; /* enb_ostream_id generator */
uint16_t vlr_ostream_id; /* vlr_ostream_id generator */
/* M-TMSI Pool */
OGS_POOL(m_tmsi, mme_m_tmsi_t);
@ -169,9 +170,13 @@ typedef struct mme_pgw_s {
typedef struct mme_vlr_s {
ogs_lnode_t lnode;
ogs_fsm_t sm; /* A state machine */
nas_tai_t tai;
nas_lai_t lai;
uint16_t max_num_of_ostreams; /* SCTP Max num of outbound streams */
ogs_socknode_t *node;
} mme_vlr_t;
@ -184,7 +189,7 @@ typedef struct mme_enb_s {
ogs_sockaddr_t *addr; /* eNB S1AP Address */
ogs_poll_t *poll; /* eNB S1AP Poll */
uint16_t outbound_streams; /* SCTP Max number of outbound streams */
uint16_t max_num_of_ostreams; /* SCTP Max num of outbound streams */
uint8_t num_of_supported_ta_list;
tai_t supported_ta_list[MAX_NUM_OF_TAI * MAX_NUM_OF_BPLMN];
@ -262,7 +267,8 @@ struct mme_ue_s {
uint32_t mme_s11_teid; /* MME-S11-TEID is derived from INDEX */
uint32_t sgw_s11_teid; /* SGW-S11-TEID is received from SGW */
uint16_t ostream_id; /* SCTP output stream identification */
uint16_t enb_ostream_id; /* SCTP output stream id for eNB */
uint16_t vlr_ostream_id; /* SCTP output stream id for VLR */
/* UE Info */
tai_t tai;
@ -410,6 +416,7 @@ struct mme_ue_s {
int session_context_will_deleted;
gtp_node_t *gnode;
mme_vlr_t *vlr;
};
#define MME_HAVE_SGW_S1U_PATH(__sESS) \

View File

@ -64,8 +64,8 @@ typedef struct mme_event_s {
ogs_sock_t *enb_sock;
ogs_sockaddr_t *enb_addr;
uint16_t inbound_streams;
uint16_t outbound_streams;
uint16_t max_num_of_istreams;
uint16_t max_num_of_ostreams;
S1AP_ProcedureCode_t s1ap_code;
s1ap_message_t *s1ap_message;

View File

@ -105,14 +105,14 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
ogs_sock_t *sock = NULL;
ogs_sockaddr_t *addr = NULL;
mme_enb_t *enb = NULL;
uint16_t outbound_streams = 0;
uint16_t max_num_of_ostreams = 0;
sock = e->enb_sock;
ogs_assert(sock);
addr = e->enb_addr;
ogs_assert(addr);
outbound_streams = e->outbound_streams;
max_num_of_ostreams = e->max_num_of_ostreams;
enb = mme_enb_find_by_addr(addr);
if (!enb)
@ -125,11 +125,11 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
ogs_free(addr);
}
enb->outbound_streams =
ogs_min(outbound_streams, enb->outbound_streams);
enb->max_num_of_ostreams =
ogs_min(max_num_of_ostreams, enb->max_num_of_ostreams);
ogs_debug("eNB-S1 SCTP_COMM_UP[%s] Outbound Streams[%d]",
OGS_ADDR(addr, buf), enb->outbound_streams);
ogs_debug("eNB-S1 SCTP_COMM_UP[%s] Max Num of Outbound Streams[%d]",
OGS_ADDR(addr, buf), enb->max_num_of_ostreams);
break;
}

View File

@ -148,9 +148,9 @@ void s1ap_recv_handler(short when, ogs_socket_t fd, void *data)
ogs_assert(e);
e->enb_sock = sock;
e->enb_addr = addr;
e->inbound_streams =
e->max_num_of_istreams =
not->sn_assoc_change.sac_inbound_streams;
e->outbound_streams =
e->max_num_of_ostreams =
not->sn_assoc_change.sac_outbound_streams;
rv = ogs_queue_push(mme_self()->queue, e);
if (rv != OGS_OK) {

View File

@ -117,7 +117,7 @@ int s1ap_send_to_enb_ue(enb_ue_t *enb_ue, ogs_pkbuf_t *pkbuf)
mme_ue = enb_ue->mme_ue;
ogs_assert(mme_ue);
return s1ap_send_to_enb(enb, pkbuf, mme_ue->ostream_id);
return s1ap_send_to_enb(enb, pkbuf, mme_ue->enb_ostream_id);
}
int s1ap_delayed_send_to_enb_ue(

View File

@ -116,9 +116,9 @@ int s1ap_usrsctp_recv_handler(struct socket *sock,
ogs_assert(e);
e->enb_sock = (ogs_sock_t *)sock;
e->enb_addr = addr;
e->inbound_streams =
e->max_num_of_istreams =
not->sn_assoc_change.sac_inbound_streams;
e->outbound_streams =
e->max_num_of_ostreams =
not->sn_assoc_change.sac_outbound_streams;
rv = ogs_queue_push(mme_self()->queue, e);
if (rv != OGS_OK) {

View File

@ -66,7 +66,8 @@ int sgsap_recv(ogs_sock_t *sock, ogs_pkbuf_t *pkbuf)
return OGS_OK;;
}
int sgsap_send_to_vlr(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf, uint16_t stream_no)
int sgsap_send_to_vlr_with_sid(
mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf, uint16_t stream_no)
{
char buf[OGS_ADDRSTRLEN];
ogs_socknode_t *node = NULL;;
@ -99,3 +100,13 @@ int sgsap_send_to_vlr(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf, uint16_t stream_no)
return OGS_OK;;
}
int sgsap_send_to_vlr(mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf)
{
mme_vlr_t *vlr = NULL;
ogs_assert(mme_ue);
ogs_assert(pkbuf);
vlr = mme_ue->vlr;
ogs_assert(vlr);
return sgsap_send_to_vlr_with_sid(vlr, pkbuf, mme_ue->vlr_ostream_id);
}

View File

@ -36,7 +36,9 @@ 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);
int sgsap_send_to_vlr(mme_vlr_t *vlr, ogs_pkbuf_t *pkb, uint16_t stream_no);
int sgsap_send_to_vlr_with_sid(
mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf, uint16_t stream_no);
int sgsap_send_to_vlr(mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf);
#ifdef __cplusplus
}