forked from acouzens/open5gs
[SGSAP] start this feature
This commit is contained in:
parent
fa81c86e22
commit
0be339e52d
|
@ -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);
|
||||
|
|
|
@ -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) \
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue