s1ap structure changes from net_sock_t to sock_id

This commit is contained in:
Sukchan Lee 2017-11-22 21:50:08 +09:00
parent 38a5ad3c68
commit e44e613ff2
12 changed files with 96 additions and 63 deletions

View File

@ -53,15 +53,14 @@ status_t gtp_close(net_sock_t *sock)
return CORE_OK;
}
pkbuf_t *gtp_read(net_sock_t *sock)
status_t gtp_recv(net_sock_t *sock, pkbuf_t **pkbuf)
{
pkbuf_t *pkb;
int r;
d_assert(sock, return NULL, "Null param");
d_assert(sock, return CORE_ERROR, "Null param");
pkb = pkbuf_alloc(0, MAX_SDU_LEN);
if (pkb == NULL)
*pkbuf = pkbuf_alloc(0, MAX_SDU_LEN);
if ((*pkbuf) == NULL)
{
char tmp_buf[MAX_SDU_LEN];
@ -70,13 +69,13 @@ pkbuf_t *gtp_read(net_sock_t *sock)
/* Read data from socket to exit from select */
net_read(sock, tmp_buf, MAX_SDU_LEN, 0);
return NULL;
return CORE_ERROR;
}
r = net_read(sock, pkb->payload, pkb->len, 0);
r = net_read(sock, (*pkbuf)->payload, (*pkbuf)->len, 0);
if (r <= 0)
{
pkbuf_free(pkb);
pkbuf_free((*pkbuf));
if (sock->sndrcv_errno != EAGAIN)
{
@ -84,13 +83,53 @@ pkbuf_t *gtp_read(net_sock_t *sock)
sock->sndrcv_errno, strerror(sock->sndrcv_errno));
}
return NULL;
return CORE_ERROR;
}
else
{
pkb->len = r;
(*pkbuf)->len = r;
return pkb;
return CORE_OK;;
}
}
status_t gtp_recvfrom(net_sock_t *sock, pkbuf_t **pkbuf, c_sockaddr_t *from)
{
int r;
d_assert(sock, return CORE_ERROR, "Null param");
*pkbuf = pkbuf_alloc(0, MAX_SDU_LEN);
if ((*pkbuf) == NULL)
{
char tmp_buf[MAX_SDU_LEN];
d_fatal("Can't allocate pkbuf");
/* Read data from socket to exit from select */
net_read(sock, tmp_buf, MAX_SDU_LEN, 0);
return CORE_ERROR;
}
r = net_read(sock, (*pkbuf)->payload, (*pkbuf)->len, 0);
if (r <= 0)
{
pkbuf_free((*pkbuf));
if (sock->sndrcv_errno != EAGAIN)
{
d_warn("net_read failed(%d:%s)",
sock->sndrcv_errno, strerror(sock->sndrcv_errno));
}
return CORE_ERROR;
}
else
{
(*pkbuf)->len = r;
return CORE_OK;;
}
}

View File

@ -30,7 +30,9 @@ CORE_DECLARE(status_t) gtp_listen(net_sock_t **sock,
net_sock_handler handler, c_uint32_t addr, c_uint16_t port, void *data);
CORE_DECLARE(status_t) gtp_close(net_sock_t *sock);
CORE_DECLARE(pkbuf_t *) gtp_read(net_sock_t *sock);
CORE_DECLARE(status_t) gtp_recv(net_sock_t *sock, pkbuf_t **pkbuf);
CORE_DECLARE(status_t) gtp_recvfrom(net_sock_t *sock,
pkbuf_t **pkbuf, c_sockaddr_t *from);
CORE_DECLARE(status_t) gtp_send(gtp_node_t *gnode, pkbuf_t *pkbuf);
CORE_DECLARE(pkbuf_t*) gtp_handle_echo_req(pkbuf_t *pkt);

View File

@ -993,7 +993,7 @@ mme_sgw_t* mme_sgw_next(mme_sgw_t *sgw)
return list_next(sgw);
}
mme_enb_t* mme_enb_add(net_sock_t *sock)
mme_enb_t* mme_enb_add(sock_id sock)
{
mme_enb_t *enb = NULL;
event_t e;
@ -1059,7 +1059,7 @@ mme_enb_t* mme_enb_find(index_t index)
return index_find(&mme_enb_pool, index);
}
mme_enb_t* mme_enb_find_by_sock(net_sock_t *sock)
mme_enb_t* mme_enb_find_by_sock(sock_id sock)
{
d_assert(sock, return NULL,"Invalid param");
return (mme_enb_t *)hash_get(self.s1ap_sock_hash, &sock, sizeof(sock));

View File

@ -53,7 +53,7 @@ typedef struct _mme_context_t {
c_uint32_t s1ap_addr; /* MME S1AP local address */
c_uint16_t s1ap_port; /* MME S1AP local port */
net_sock_t *s1ap_sock; /* MME S1AP local listen socket */
sock_id s1ap_sock; /* MME S1AP local listen socket */
c_uint32_t gtpc_addr; /* MME GTPC local address */
c_uint16_t gtpc_port; /* MME GTPC local port */
@ -115,7 +115,7 @@ typedef struct _mme_enb_t {
c_uint32_t enb_id; /* eNB_ID received from eNB */
c_uint32_t s1ap_addr; /* eNB S1AP IP address */
c_uint16_t s1ap_port; /* eNB S1AP Port */
net_sock_t *s1ap_sock; /* eNB S1AP Socket */
sock_id s1ap_sock; /* eNB S1AP Socket */
c_uint8_t num_of_tai;
tai_t tai[MAX_NUM_OF_TAC * MAX_NUM_OF_BPLMN];
@ -443,11 +443,11 @@ CORE_DECLARE(status_t) mme_sgw_remove_all(void);
CORE_DECLARE(mme_sgw_t*) mme_sgw_first(void);
CORE_DECLARE(mme_sgw_t*) mme_sgw_next(mme_sgw_t *sgw);
CORE_DECLARE(mme_enb_t*) mme_enb_add(net_sock_t *sock);
CORE_DECLARE(mme_enb_t*) mme_enb_add(sock_id sock);
CORE_DECLARE(status_t) mme_enb_remove(mme_enb_t *enb);
CORE_DECLARE(status_t) mme_enb_remove_all(void);
CORE_DECLARE(mme_enb_t*) mme_enb_find(index_t index);
CORE_DECLARE(mme_enb_t*) mme_enb_find_by_sock(net_sock_t *sock);
CORE_DECLARE(mme_enb_t*) mme_enb_find_by_sock(sock_id sock);
CORE_DECLARE(mme_enb_t*) mme_enb_find_by_enb_id(c_uint32_t enb_id);
CORE_DECLARE(status_t) mme_enb_set_enb_id(
mme_enb_t *enb, c_uint32_t enb_id);

View File

@ -9,29 +9,22 @@
static int _gtpv2_c_recv_cb(net_sock_t *sock, void *data)
{
char buf[INET_ADDRSTRLEN];
status_t rv;
event_t e;
pkbuf_t *pkbuf = NULL;
c_uint32_t addr;
c_uint16_t port;
d_assert(sock, return -1, "Null param");
pkbuf = gtp_read(sock);
if (pkbuf == NULL)
rv = gtp_recv(sock, &pkbuf);
if (rv != CORE_OK)
{
if (sock->sndrcv_errno == EAGAIN)
if (errno == EAGAIN)
return 0;
return -1;
}
addr = sock->remote.sin_addr.s_addr;
port = ntohs(sock->remote.sin_port);
d_trace(10, "S11_PDU is received from SGW[%s:%d]\n",
INET_NTOP(&addr, buf), port);
d_trace(10, "S11_PDU is received from SGW\n");
d_trace_hex(10, pkbuf->payload, pkbuf->len);
event_set(&e, MME_EVT_S11_MESSAGE);

View File

@ -74,13 +74,13 @@ void mme_state_operational(fsm_t *s, event_t *e)
{
d_error("Can't close S1AP path");
}
mme_self()->s1ap_sock = NULL;
mme_self()->s1ap_sock = 0;
break;
}
case MME_EVT_S1AP_LO_ACCEPT:
{
net_sock_t *sock = (net_sock_t *)event_get_param1(e);
sock_id sock = (sock_id)event_get_param1(e);
d_assert(sock, break, "Null param");
c_uint32_t addr = (c_uint32_t)event_get_param2(e);
c_uint16_t port = (c_uint16_t)event_get_param3(e);
@ -116,9 +116,9 @@ void mme_state_operational(fsm_t *s, event_t *e)
case MME_EVT_S1AP_LO_CONNREFUSED:
{
mme_enb_t *enb = NULL;
net_sock_t *sock = NULL;
sock_id sock = 0;
sock = (net_sock_t *)event_get_param1(e);
sock = (sock_id)event_get_param1(e);
d_assert(sock, break, "Null param");
enb = mme_enb_find_by_sock(sock);
@ -139,10 +139,10 @@ void mme_state_operational(fsm_t *s, event_t *e)
{
s1ap_message_t message;
mme_enb_t *enb = NULL;
net_sock_t *sock = NULL;
sock_id sock = 0;
pkbuf_t *pkbuf = NULL;
sock = (net_sock_t *)event_get_param1(e);
sock = (sock_id)event_get_param1(e);
d_assert(sock, break, "Null param");
pkbuf = (pkbuf_t *)event_get_param2(e);

View File

@ -2,7 +2,6 @@
#define __S1AP_PATH_H__
#include "core_pkbuf.h"
#include "core_net.h"
#include "mme_context.h"
#include "s1ap_message.h"
@ -14,14 +13,11 @@ extern "C" {
CORE_DECLARE(status_t) s1ap_open();
CORE_DECLARE(status_t) s1ap_close();
CORE_DECLARE(status_t) s1ap_sctp_close(net_sock_t *sock);
CORE_DECLARE(status_t) s1ap_sctp_close(sock_id sock);
CORE_DECLARE(status_t) s1ap_final();
#if 0 /* depreciated */
CORE_DECLARE(status_t) s1ap_send(net_sock_t *s, pkbuf_t *pkb);
#endif
CORE_DECLARE(status_t) s1ap_sendto(net_sock_t *s, pkbuf_t *pkb,
CORE_DECLARE(status_t) s1ap_sendto(sock_id sock, pkbuf_t *pkb,
c_uint32_t addr, c_uint16_t port);
CORE_DECLARE(status_t) s1ap_send_to_enb(mme_enb_t *enb, pkbuf_t *pkb);
CORE_DECLARE(status_t) s1ap_delayed_send_to_enb(mme_enb_t *enb,
@ -51,7 +47,7 @@ CORE_DECLARE(status_t) s1ap_send_handover_cancel_ack(enb_ue_t *source_ue);
CORE_DECLARE(status_t) s1ap_send_mme_status_transfer(
enb_ue_t *target_ue, S1ap_ENBStatusTransferIEs_t *ies);
int s1ap_recv_cb(net_sock_t *net_sock, void *data);
int s1ap_recv_cb(sock_id sock, void *data);
#ifdef __cplusplus
}

View File

@ -29,14 +29,14 @@ void s1ap_state_final(fsm_t *s, event_t *e)
void s1ap_state_operational(fsm_t *s, event_t *e)
{
mme_enb_t *enb = NULL;
net_sock_t *sock = NULL;
sock_id sock = 0;
d_assert(s, return, "Null param");
d_assert(e, return, "Null param");
mme_sm_trace(3, e);
sock = (net_sock_t *)event_get_param1(e);
sock = (sock_id)event_get_param1(e);
d_assert(sock, return, "Null param");
enb = mme_enb_find_by_sock(sock);
d_assert(enb, return, "Null param");

View File

@ -64,7 +64,7 @@ status_t s1ap_open(void)
return CORE_ERROR;
}
mme_self()->s1ap_sock = (net_sock_t *)psock;
mme_self()->s1ap_sock = (sock_id)psock;
if (usrsctp_setsockopt(psock, IPPROTO_SCTP, SCTP_RECVRCVINFO,
&on, sizeof(int)) < 0)
@ -131,7 +131,7 @@ status_t s1ap_close()
struct socket *psock = NULL;
d_assert(mme_self(), return CORE_ERROR, "Null param");
d_assert(mme_self()->s1ap_sock != NULL, return CORE_ERROR,
d_assert(mme_self()->s1ap_sock, return CORE_ERROR,
"S1-ENB path already opened");
accept_thread_should_stop = 1;
@ -147,21 +147,21 @@ status_t s1ap_close()
return CORE_OK;
}
status_t s1ap_sctp_close(net_sock_t *sock)
status_t s1ap_sctp_close(sock_id sock)
{
usrsctp_close((struct socket *)sock);
return CORE_OK;
}
status_t s1ap_sendto(net_sock_t *s, pkbuf_t *pkbuf,
status_t s1ap_sendto(sock_id sock, pkbuf_t *pkbuf,
c_uint32_t addr, c_uint16_t port)
{
char buf[INET_ADDRSTRLEN];
ssize_t sent;
struct socket *psock = (struct socket *)s;
struct socket *psock = (struct socket *)sock;
struct sctp_sndinfo sndinfo;
d_assert(s, return CORE_ERROR, "Null param");
d_assert(sock, return CORE_ERROR, "Null param");
d_assert(pkbuf, return CORE_ERROR, "Null param");
memset((void *)&sndinfo, 0, sizeof(struct sctp_sndinfo));

View File

@ -89,10 +89,10 @@ static int _gtpv2_c_recv_cb(net_sock_t *sock, void *data)
d_assert(sock, return -1, "Null param");
pkbuf = gtp_read(sock);
if (pkbuf == NULL)
rv = gtp_recv(sock, &pkbuf);
if (rv != CORE_OK)
{
if (sock->sndrcv_errno == EAGAIN)
if (errno == EAGAIN)
return 0;
return -1;
@ -116,15 +116,16 @@ static int _gtpv2_c_recv_cb(net_sock_t *sock, void *data)
static int _gtpv1_u_recv_cb(net_sock_t *sock, void *data)
{
status_t rv;
pkbuf_t *pkbuf = NULL;
c_uint32_t size = GTPV1U_HEADER_LEN;
d_assert(sock, return -1, "Null param");
pkbuf = gtp_read(sock);
if (pkbuf == NULL)
rv = gtp_recv(sock, &pkbuf);
if (rv != CORE_OK)
{
if (sock->sndrcv_errno == EAGAIN)
if (errno == EAGAIN)
return 0;
return -1;

View File

@ -21,10 +21,10 @@ static int _gtpv2_c_recv_cb(net_sock_t *sock, void *data)
d_assert(sock, return -1, "Null param");
pkbuf = gtp_read(sock);
if (pkbuf == NULL)
rv = gtp_recv(sock, &pkbuf);
if (rv != CORE_OK)
{
if (sock->sndrcv_errno == EAGAIN)
if (errno == EAGAIN)
return 0;
return -1;
@ -62,7 +62,9 @@ static int _gtpv2_c_recv_cb(net_sock_t *sock, void *data)
static int _gtpv1_u_recv_cb(net_sock_t *sock, void *data)
{
status_t rv;
pkbuf_t *pkbuf = NULL;
c_sockaddr_t from;
gtp_node_t gnode;
gtp_header_t *gtp_h = NULL;
sgw_bearer_t *bearer = NULL;
@ -72,10 +74,10 @@ static int _gtpv1_u_recv_cb(net_sock_t *sock, void *data)
d_assert(sock, return -1, "Null param");
pkbuf = gtp_read(sock);
if (pkbuf == NULL)
rv = gtp_recvfrom(sock, &pkbuf, &from);
if (rv != CORE_OK)
{
if (sock->sndrcv_errno == EAGAIN)
if (errno == EAGAIN)
return 0;
return -1;

View File

@ -70,7 +70,7 @@ status_t tests1ap_enb_close(sock_id id)
status_t tests1ap_enb_send(sock_id id, pkbuf_t *sendbuf)
{
return s1ap_sendto((net_sock_t *)id, sendbuf, mme_self()->s1ap_addr,
return s1ap_sendto(id, sendbuf, mme_self()->s1ap_addr,
mme_self()->s1ap_port);
}