open5gs/src/mme/mme_gtp_path.c

216 lines
5.4 KiB
C
Raw Normal View History

2017-03-24 09:47:05 +00:00
#define TRACE_MODULE _mme_s11_path
2017-03-23 14:05:40 +00:00
#include "core_debug.h"
#include "core_pkbuf.h"
#include "core_net.h"
2017-04-04 01:49:19 +00:00
#include "mme_event.h"
2017-08-31 02:05:00 +00:00
#include "mme_gtp_path.h"
2017-09-07 06:56:31 +00:00
#include "mme_s11_build.h"
2017-03-23 14:05:40 +00:00
2017-04-03 06:27:00 +00:00
static int _gtpv2_c_recv_cb(net_sock_t *sock, void *data)
2017-03-24 04:19:36 +00:00
{
2017-03-26 15:48:33 +00:00
char buf[INET_ADDRSTRLEN];
2017-03-26 16:50:01 +00:00
status_t rv;
2017-03-24 04:19:36 +00:00
event_t e;
pkbuf_t *pkbuf = NULL;
2017-09-01 16:48:09 +00:00
c_uint32_t addr;
c_uint16_t port;
2017-04-06 11:10:00 +00:00
mme_sgw_t *sgw = NULL;
2017-03-26 15:48:33 +00:00
2017-04-03 06:27:00 +00:00
d_assert(sock, return -1, "Null param");
2017-03-24 04:19:36 +00:00
2017-04-03 06:27:00 +00:00
pkbuf = gtp_read(sock);
2017-03-24 04:19:36 +00:00
if (pkbuf == NULL)
{
2017-04-03 06:27:00 +00:00
if (sock->sndrcv_errno == EAGAIN)
2017-03-24 04:19:36 +00:00
return 0;
return -1;
}
2017-09-01 16:48:09 +00:00
addr = sock->remote.sin_addr.s_addr;
port = ntohs(sock->remote.sin_port);
2017-04-03 06:27:00 +00:00
2017-09-01 16:48:09 +00:00
sgw = mme_sgw_find(addr, port);
2017-04-03 06:27:00 +00:00
d_assert(sgw, return -1, "Can't find SGW from [%s:%d]",
2017-09-01 16:48:09 +00:00
INET_NTOP(&addr, buf), port);
sgw->sock = sock; /* Is it needed? */
2017-04-03 06:27:00 +00:00
2017-07-31 13:35:25 +00:00
d_trace(10, "S11_PDU is received from SGW[%s:%d]\n",
2017-09-01 16:48:09 +00:00
INET_NTOP(&addr, buf), port);
2017-07-31 13:35:25 +00:00
d_trace_hex(10, pkbuf->payload, pkbuf->len);
2017-03-24 04:19:36 +00:00
2017-08-25 15:25:55 +00:00
event_set(&e, MME_EVT_S11_MESSAGE);
event_set_param1(&e, (c_uintptr_t)sgw);
event_set_param2(&e, (c_uintptr_t)pkbuf);
2017-03-26 16:50:01 +00:00
rv = mme_event_send(&e);
if (rv != CORE_OK)
2017-03-26 15:48:33 +00:00
{
2017-03-26 16:50:01 +00:00
d_error("mme_event_send error");
2017-03-26 15:48:33 +00:00
pkbuf_free(pkbuf);
2017-03-26 16:50:01 +00:00
return -1;
2017-03-26 15:48:33 +00:00
}
2017-03-24 04:19:36 +00:00
return 0;
}
2017-08-31 02:05:00 +00:00
status_t mme_gtp_open()
2017-03-23 14:05:40 +00:00
{
2017-03-26 15:48:33 +00:00
status_t rv;
mme_sgw_t *sgw = mme_sgw_first();
2017-03-26 15:48:33 +00:00
2017-03-27 04:22:42 +00:00
rv = gtp_listen(&mme_self()->s11_sock, _gtpv2_c_recv_cb,
mme_self()->s11_addr, mme_self()->s11_port, NULL);
2017-03-26 15:48:33 +00:00
if (rv != CORE_OK)
{
2017-03-27 04:22:42 +00:00
d_error("Can't establish S11 Path for SGW");
2017-03-26 15:48:33 +00:00
return rv;
}
/* socket descriptor needs in gnode when packet is sending initilly */
while(sgw)
{
sgw->sock = mme_self()->s11_sock;
sgw = mme_sgw_next(sgw);
}
2017-03-26 15:48:33 +00:00
return CORE_OK;
2017-03-23 14:05:40 +00:00
}
2017-08-31 02:05:00 +00:00
status_t mme_gtp_close()
2017-03-23 14:05:40 +00:00
{
2017-03-26 15:48:33 +00:00
status_t rv;
2017-03-27 04:22:42 +00:00
rv = gtp_close(mme_self()->s11_sock);
2017-03-26 15:48:33 +00:00
if (rv != CORE_OK)
{
2017-03-27 04:22:42 +00:00
d_error("Can't close S11 Path for SGW");
2017-03-26 15:48:33 +00:00
return rv;
}
return CORE_OK;
2017-03-23 14:05:40 +00:00
}
2017-09-07 06:56:31 +00:00
status_t mme_gtp_send_modify_bearer_request(mme_bearer_t *bearer)
{
status_t rv;
gtp_xact_t *xact = NULL;
mme_ue_t *mme_ue = NULL;
mme_sess_t *sess = NULL;
gtp_header_t h;
pkbuf_t *pkbuf = NULL;
d_assert(bearer, return CORE_ERROR, "Null param");
sess = bearer->sess;
d_assert(sess, return CORE_ERROR, "Null param");
mme_ue = sess->mme_ue;
d_assert(mme_ue, return CORE_ERROR, "Null param");
memset(&h, 0, sizeof(gtp_header_t));
h.type = GTP_MODIFY_BEARER_REQUEST_TYPE;
h.teid = mme_ue->sgw_s11_teid;
rv = mme_s11_build_modify_bearer_request(&pkbuf, h.type, bearer);
d_assert(rv == CORE_OK, return CORE_ERROR, "S11 build error");
xact = gtp_xact_local_create(sess->sgw, &h, pkbuf);
d_assert(xact, return CORE_ERROR, "Null param");
rv = gtp_xact_commit(xact);
d_assert(rv == CORE_OK, return CORE_ERROR, "xact_commit error");
return CORE_OK;
}
2017-09-07 13:22:42 +00:00
status_t mme_gtp_send_delete_session_request(mme_sess_t *sess)
{
status_t rv;
pkbuf_t *s11buf = NULL;
gtp_header_t h;
gtp_xact_t *xact = NULL;
mme_ue_t *mme_ue = NULL;
d_assert(sess, return CORE_ERROR, "Null param");
mme_ue = sess->mme_ue;
d_assert(mme_ue, return CORE_ERROR, "Null param");
memset(&h, 0, sizeof(gtp_header_t));
h.type = GTP_DELETE_SESSION_REQUEST_TYPE;
h.teid = mme_ue->sgw_s11_teid;
rv = mme_s11_build_delete_session_request(&s11buf, h.type, sess);
d_assert(rv == CORE_OK, return CORE_ERROR, "S11 build error");
xact = gtp_xact_local_create(sess->sgw, &h, s11buf);
d_assert(xact, return CORE_ERROR, "Null param");
GTP_XACT_STORE_SESSION(xact, sess);
rv = gtp_xact_commit(xact);
d_assert(rv == CORE_OK, return CORE_ERROR, "xact_commit error");
return CORE_OK;
}
2017-09-07 06:56:31 +00:00
status_t mme_gtp_send_create_bearer_response(mme_bearer_t *bearer)
{
status_t rv;
gtp_xact_t *xact = NULL;
mme_ue_t *mme_ue = NULL;
gtp_header_t h;
pkbuf_t *pkbuf = NULL;
d_assert(bearer, return CORE_ERROR, "Null param");
mme_ue = bearer->mme_ue;
d_assert(mme_ue, return CORE_ERROR, "Null param");
xact = bearer->xact;
d_assert(xact, return CORE_ERROR, "Null param");
memset(&h, 0, sizeof(gtp_header_t));
h.type = GTP_CREATE_BEARER_RESPONSE_TYPE;
h.teid = mme_ue->sgw_s11_teid;
rv = mme_s11_build_create_bearer_response(&pkbuf, h.type, bearer);
d_assert(rv == CORE_OK, return CORE_ERROR, "S11 build error");
rv = gtp_xact_update_tx(xact, &h, pkbuf);
d_assert(xact, return CORE_ERROR, "Null param");
rv = gtp_xact_commit(xact);
d_assert(rv == CORE_OK, return CORE_ERROR, "xact_commit error");
return CORE_OK;
}
2017-09-07 10:44:08 +00:00
status_t mme_gtp_send_release_access_bearers_response(mme_sess_t *sess)
{
status_t rv;
gtp_header_t h;
pkbuf_t *pkbuf = NULL;
gtp_xact_t *xact = NULL;
mme_ue_t *mme_ue = NULL;
d_assert(sess, return CORE_ERROR, "Null param");
mme_ue = sess->mme_ue;
d_assert(mme_ue, return CORE_ERROR, "Null param");
memset(&h, 0, sizeof(gtp_header_t));
h.type = GTP_RELEASE_ACCESS_BEARERS_REQUEST_TYPE;
h.teid = mme_ue->sgw_s11_teid;
rv = mme_s11_build_release_access_bearers_request(&pkbuf, h.type);
d_assert(rv == CORE_OK, return CORE_ERROR, "S11 build error");
xact = gtp_xact_local_create(sess->sgw, &h, pkbuf);
d_assert(xact, return CORE_ERROR, "Null param");
rv = gtp_xact_commit(xact);
d_assert(rv == CORE_OK, return CORE_ERROR, "xact_commit error");
return CORE_OK;
}