1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/sys/net/gnrc/sock/tcp/gnrc_sock_tcp.c
2021-08-14 21:27:34 +02:00

147 lines
4.0 KiB
C

/*
* Copyright (C) 2021 Simon Brummer <simon.brummer@posteo.de>
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @{
*
* @file
* @brief GNRC implementation of @ref net_sock_tcp
*
* @author Simon Brummer <simon.brummer@posteo.de>
*/
#include <assert.h>
#include "net/gnrc/tcp.h"
#include "net/sock/tcp.h"
#include "sock_types.h"
int sock_tcp_connect(sock_tcp_t *sock, const sock_tcp_ep_t *remote,
uint16_t local_port, uint16_t flags)
{
/* Asserts defined by API. */
assert(sock != NULL);
assert(remote != NULL);
assert(remote->port != 0);
/* Asserts to protect GNRC_TCP. Flags are not supported. */
assert(flags == 0);
(void) flags;
/* Initialize given TCB and try to open a connection */
gnrc_tcp_tcb_init(sock);
/* Forward call to gnrc_tcp_open. Return codes are identical except those that are
* not generated by gnrc_tcp_open: -ENETUNREACH and -EPERM */
return gnrc_tcp_open(sock, remote, local_port);
}
int sock_tcp_listen(sock_tcp_queue_t *queue, const sock_tcp_ep_t *local,
sock_tcp_t *queue_array, unsigned queue_len, uint16_t flags)
{
/* Asserts defined by API. */
assert(queue != NULL);
assert(local != NULL);
assert(local->port != 0);
assert(queue_array != NULL);
assert(queue_len != 0);
/* Asserts to protect GNRC_TCP. Flags are not supported. */
assert(flags == 0);
(void) flags;
/* Initialize given TCB queue, all given tcbs and forward call */
gnrc_tcp_tcb_queue_init(queue);
for (unsigned i = 0; i < queue_len; ++i) {
gnrc_tcp_tcb_init(&queue_array[i]);
}
return gnrc_tcp_listen(queue, queue_array, queue_len, local);
}
void sock_tcp_disconnect(sock_tcp_t *sock)
{
/* Asserts defined by API. */
assert(sock != NULL);
gnrc_tcp_close(sock);
}
void sock_tcp_stop_listen(sock_tcp_queue_t *queue)
{
/* Asserts defined by API. */
assert(queue != NULL);
gnrc_tcp_stop_listen(queue);
}
int sock_tcp_get_local(sock_tcp_t *sock, sock_tcp_ep_t *ep)
{
/* Asserts defined by API. */
assert(sock != NULL);
assert(ep != NULL);
return gnrc_tcp_get_local(sock, ep);
}
int sock_tcp_get_remote(sock_tcp_t *sock, sock_tcp_ep_t *ep)
{
/* Asserts defined by API. */
assert(sock != NULL);
assert(ep != NULL);
return gnrc_tcp_get_remote(sock, ep);
}
int sock_tcp_queue_get_local(sock_tcp_queue_t *queue, sock_tcp_ep_t *ep)
{
/* Asserts defined by API. */
assert(queue != NULL);
assert(ep != NULL);
return gnrc_tcp_queue_get_local(queue, ep);
}
int sock_tcp_accept(sock_tcp_queue_t *queue, sock_tcp_t **sock, uint32_t timeout)
{
/* Asserts defined by API. */
assert(queue != NULL);
assert(sock != NULL);
/* Map SOCK_NO_TIMEOUT to GNRC_TCP_NO_TIMEOUT */
if (timeout == SOCK_NO_TIMEOUT) {
timeout = GNRC_TCP_NO_TIMEOUT;
}
/* Forward call to gnrc_tcp_accept.
* NOTE: Errorcodes -ECONNABORTED, -EPERM are not returned by
* gnrc_tcp_accept. All other error codes share the same semantics. */
return gnrc_tcp_accept(queue, sock, timeout);
}
ssize_t sock_tcp_read(sock_tcp_t *sock, void *data, size_t max_len, uint32_t timeout)
{
/* Asserts defined by API. */
assert(sock != NULL);
assert(data != NULL);
/* Map SOCK_NO_TIMEOUT to GNRC_TCP_NO_TIMEOUT */
if (timeout == SOCK_NO_TIMEOUT) {
timeout = GNRC_TCP_NO_TIMEOUT;
}
/* Forward call to gnrc_tcp_recv: All error codes share the same semantics */
return gnrc_tcp_recv(sock, data, max_len, timeout);
}
ssize_t sock_tcp_write(sock_tcp_t *sock, const void *data, size_t len)
{
/* Asserts defined by API. */
assert(sock != NULL);
assert(data != NULL);
/* Forward call to gnrc_tcp_send.
* NOTE: gnrc_tcp_send offers a timeout. By setting it to 0, the call blocks
* until at least some data was transmitted. */
return gnrc_tcp_send(sock, data, len, 0);
}