open5gs/lib/gtp/gtp_path.c

109 lines
2.7 KiB
C
Raw Normal View History

2017-03-23 11:57:55 +00:00
#define TRACE_MODULE _gtp_path
#include "core_debug.h"
#include "core_pkbuf.h"
#include "core_net.h"
2017-03-24 12:10:13 +00:00
#include "3gpp_defs.h"
2017-03-23 11:57:55 +00:00
#include "gtp_path.h"
2017-03-26 15:48:33 +00:00
status_t gtp_open(gtp_node_t *gnode, net_sock_handler handler)
2017-03-23 11:57:55 +00:00
{
char buf[INET_ADDRSTRLEN];
int rc;
2017-03-26 15:48:33 +00:00
d_assert(gnode, return CORE_ERROR, "Null param");
rc = net_listen_with_addr(&gnode->s, SOCK_DGRAM, IPPROTO_UDP,
gnode->local_port, gnode->local_addr);
2017-03-23 11:57:55 +00:00
if (rc != 0)
{
d_error("Can't establish GTP[%s:%d] path(%d:%s)",
2017-03-26 15:48:33 +00:00
INET_NTOP(&gnode->local_addr, buf), gnode->local_port,
errno, strerror(errno));
2017-03-23 11:57:55 +00:00
return CORE_ERROR;
}
2017-03-26 15:48:33 +00:00
rc = net_register_sock(gnode->s, handler, gnode);
2017-03-23 11:57:55 +00:00
if (rc != 0)
{
d_error("Can't establish GTP path(%d:%s)",
errno, strerror(errno));
2017-03-26 15:48:33 +00:00
net_close(gnode->s);
2017-03-23 11:57:55 +00:00
return CORE_ERROR;
}
2017-03-26 15:48:33 +00:00
d_trace(1, "gtp_listen() %s:%d\n",
INET_NTOP(&gnode->local_addr, buf), gnode->local_port);
2017-03-23 11:57:55 +00:00
return CORE_OK;
}
2017-03-26 15:48:33 +00:00
status_t gtp_close(gtp_node_t *gnode)
2017-03-23 11:57:55 +00:00
{
2017-03-26 15:48:33 +00:00
d_assert(gnode, return CORE_ERROR, "Null param");
d_assert(gnode->s, return CORE_ERROR, "Null param");
2017-03-23 11:57:55 +00:00
2017-03-26 15:48:33 +00:00
net_unregister_sock(gnode->s);
net_close(gnode->s);
2017-03-23 11:57:55 +00:00
return CORE_OK;
}
2017-03-26 15:48:33 +00:00
pkbuf_t *gtp_read(gtp_node_t *gnode)
2017-03-23 11:57:55 +00:00
{
pkbuf_t *pkb;
int r;
2017-03-26 15:48:33 +00:00
d_assert(gnode, return NULL, "Null param");
d_assert(gnode->s, return NULL, "Null param");
2017-03-23 11:57:55 +00:00
2017-03-24 12:19:24 +00:00
pkb = pkbuf_alloc(0, MAX_SDU_LEN);
2017-03-23 11:57:55 +00:00
d_assert(pkb, return NULL, "Can't allocate pkbuf");
2017-03-26 15:48:33 +00:00
r = net_read(gnode->s, pkb->payload, pkb->len, 0);
2017-03-23 11:57:55 +00:00
if (r <= 0)
{
pkbuf_free(pkb);
2017-03-26 15:48:33 +00:00
if (gnode->s->sndrcv_errno != EAGAIN)
2017-03-23 11:57:55 +00:00
{
d_warn("net_read failed(%d:%s)",
2017-03-26 15:48:33 +00:00
gnode->s->sndrcv_errno, strerror(gnode->s->sndrcv_errno));
2017-03-23 11:57:55 +00:00
}
return NULL;
}
else
{
pkb->len = r;
return pkb;
}
}
2017-03-26 15:48:33 +00:00
status_t gtp_send(gtp_node_t *gnode, pkbuf_t *pkbuf)
2017-03-23 11:57:55 +00:00
{
char buf[INET_ADDRSTRLEN];
ssize_t sent;
2017-03-26 15:48:33 +00:00
d_assert(gnode, return CORE_ERROR, "Null param");
d_assert(gnode->s, return CORE_ERROR, "Null param");
2017-03-23 14:05:40 +00:00
d_assert(pkbuf, return CORE_ERROR, "Null param");
2017-03-23 11:57:55 +00:00
2017-03-26 15:48:33 +00:00
sent = net_sendto(gnode->s, pkbuf->payload, pkbuf->len,
gnode->remote_addr, gnode->remote_port);
d_trace(1,"Sent %d->%d bytes to [%s:%d]\n", pkbuf->len, sent,
INET_NTOP(&gnode->remote_addr, buf), gnode->remote_port);
2017-03-23 14:05:40 +00:00
d_trace_hex(1, pkbuf->payload, pkbuf->len);
if (sent < 0 || sent != pkbuf->len)
2017-03-23 11:57:55 +00:00
{
d_error("net_send error (%d:%s)",
2017-03-26 15:48:33 +00:00
gnode->s->sndrcv_errno, strerror(gnode->s->sndrcv_errno));
2017-03-23 11:57:55 +00:00
return CORE_ERROR;
}
2017-03-26 16:50:01 +00:00
pkbuf_free(pkbuf);
2017-03-23 11:57:55 +00:00
return CORE_OK;
}