18#if defined(RIOT_VERSION) 
   21#include "net/gnrc/ipv6.h" 
   22#include "net/gnrc/netreg.h" 
   27#include "net/sock/async.h" 
   31#define COAP_SELECT_THREAD_FLAG (1U << 4) 
   35  return !COAP_DISABLE_TCP;
 
   51  ret = sock_tcp_write(&sock->tcp, data, data_len);
 
   56#
if EAGAIN != EWOULDBLOCK
 
   57        errno == EWOULDBLOCK ||
 
   63    if (errno == EPIPE || errno == ECONNRESET) {
 
   72  if (ret < (ssize_t)data_len) {
 
   87  ret = sock_tcp_read(&sock->tcp, data, data_len, SOCK_NO_TIMEOUT);
 
   90    sock->
flags &= ~COAP_SOCKET_CAN_READ;
 
   96    sock->
flags &= ~COAP_SOCKET_CAN_READ;
 
   98#
if EAGAIN != EWOULDBLOCK
 
   99        errno == EWOULDBLOCK ||
 
  104    if (errno != ECONNRESET) {
 
  110  if (ret < (ssize_t)data_len)
 
  111    sock->
flags &= ~COAP_SOCKET_CAN_READ;
 
  115#ifdef MODULE_LWIP_TCP 
  117tcp_recv_session_cb(sock_tcp_t *sock, sock_async_flags_t flags, 
void *arg) {
 
  121  if (!(flags & (SOCK_ASYNC_MSG_RECV | SOCK_ASYNC_MSG_SENT)))
 
  124  if (flags & SOCK_ASYNC_MSG_RECV)
 
  126  if (session->
context->selecting_thread) {
 
  127    thread_flags_set(session->
context->selecting_thread,
 
  128                     COAP_SELECT_THREAD_FLAG);
 
  133#if COAP_CLIENT_SUPPORT 
  143  sock_tcp_ep_t remote;
 
  151  if (local_if && local_if->riot.family) {
 
  152    if (local_if->riot.family != connect_addr.riot.family) {
 
  153      coap_log_warn(
"coap_socket_connect_tcp1: local address family != " 
  154                    "remote address family\n");
 
  159  local.netif = SOCK_ADDR_ANY_NETIF;
 
  160  remote.netif = SOCK_ADDR_ANY_NETIF;
 
  161  switch (connect_addr.riot.family) {
 
  164    local.family = AF_INET;
 
  167      memcpy(local.addr.ipv4, &local_if->riot.
addr.ipv4, 
sizeof(local.addr.ipv4));
 
  168      local.port = local_if->riot.port;
 
  170      memset(local.addr.ipv4, 0, 
sizeof(local.addr.ipv4));
 
  172    remote.family = AF_INET;
 
  173    memcpy(remote.addr.ipv4, &server->riot.
addr.ipv4, 
sizeof(remote.addr.ipv4));
 
  174    if (connect_addr.riot.port == 0)
 
  175      connect_addr.riot.port = default_port;
 
  176    remote.port = connect_addr.riot.port;
 
  181    local.family = AF_INET6;
 
  184      memcpy(local.addr.ipv6, &local_if->riot.
addr.ipv6, 
sizeof(local.addr.ipv6));
 
  185      local.port = local_if->riot.port;
 
  187      memset(local.addr.ipv6, 0, 
sizeof(local.addr.ipv6));
 
  189    remote.family = AF_INET6;
 
  190    memcpy(remote.addr.ipv6, &server->riot.
addr.ipv6, 
sizeof(remote.addr.ipv6));
 
  191    if (connect_addr.riot.port == 0)
 
  192      connect_addr.riot.port = default_port;
 
  193    remote.port = connect_addr.riot.port;
 
  197    coap_log_alert(
"coap_socket_connect_tcp1: unsupported sa_family %d\n",
 
  198                   connect_addr.riot.family);
 
  202  ret = sock_tcp_connect(&sock->tcp, &remote, 0, 0);
 
  206    coap_log_warn(
"coap_socket_connect_tcp1: sock_tcp_create: %s (%d)\n",
 
  210  ret = sock_tcp_get_local(&sock->tcp, &local);
 
  214    coap_log_warn(
"coap_socket_connect_tcp1: sock_tcp_get_local: %s\n",
 
  217  memcpy(&local_addr->riot, &local, 
sizeof(local_addr->riot));
 
  219  ret = sock_tcp_get_remote(&sock->tcp, &remote);
 
  223    coap_log_warn(
"coap_socket_connect_tcp: sock_tcp_get_remote: %s\n",
 
  226  memcpy(&remote_addr->riot, &remote, 
sizeof(remote_addr->riot));
 
  228#ifdef MODULE_LWIP_TCP 
  229  sock_tcp_set_cb(&sock->tcp, tcp_recv_session_cb, sock->
session);
 
  236  coap_socket_close(sock);
 
  252#if COAP_SERVER_SUPPORT 
  254#define SOCK_QUEUE_LEN  (1U) 
  256static sock_tcp_t sock_queue[SOCK_QUEUE_LEN];
 
  257static sock_tcp_queue_t queue;
 
  267  ret = sock_tcp_listen(&queue, &listen_addr->riot, sock_queue, SOCK_QUEUE_LEN, 0);
 
  284  sock_tcp_t *sock = NULL;
 
  286  sock_tcp_ep_t scratch;
 
  289  server->
flags &= ~COAP_SOCKET_CAN_ACCEPT;
 
  290  ret = sock_tcp_accept(&queue, &sock, SOCK_NO_TIMEOUT);
 
  295  if (sock == NULL || ret < 0) {
 
  300  new_client->tcp = *sock;
 
  302  ret = sock_tcp_get_remote(&new_client->tcp, &scratch);
 
  307  memcpy(&remote_addr->riot, &scratch, 
sizeof(remote_addr->riot));
 
  308  ret = sock_tcp_get_local(&new_client->tcp, &scratch);
 
  313  memcpy(&local_addr->riot, &scratch, 
sizeof(local_addr->riot));
 
  315#ifdef MODULE_LWIP_TCP 
  316  sock_tcp_set_cb(&new_client->tcp, tcp_recv_session_cb, new_client->
session);
 
  325    sock_tcp_disconnect(&sock->tcp);
 
  338#pragma GCC diagnostic ignored "-Wunused-function" 
void coap_address_copy(coap_address_t *dst, const coap_address_t *src)
 
const char * coap_socket_strerror(void)
 
#define COAP_SOCKET_MULTICAST
socket is used for multicast communication
 
#define COAP_SOCKET_CAN_WRITE
non blocking socket can now write without blocking
 
#define COAP_SOCKET_WANT_WRITE
non blocking socket is waiting for writing
 
#define COAP_SOCKET_CAN_READ
non blocking socket can now read without blocking
 
#define COAP_SOCKET_CONNECTED
the socket is connected
 
#define COAP_SOCKET_EMPTY
coap_socket_flags_t values
 
Library specific build wrapper for coap_internal.h.
 
RIOT-specific definitions for libcoap.
 
#define coap_log_alert(...)
 
#define coap_log_info(...)
 
#define coap_log_warn(...)
 
int coap_socket_bind_tcp(coap_socket_t *sock, const coap_address_t *listen_addr, coap_address_t *bound_addr)
Create a new TCP socket and then listen for new incoming TCP sessions.
 
ssize_t coap_socket_read(coap_socket_t *sock, uint8_t *data, size_t data_len)
Function interface for data stream receiving off a socket.
 
ssize_t coap_socket_write(coap_socket_t *sock, const uint8_t *data, size_t data_len)
Function interface for data stream sending off a socket.
 
int coap_socket_connect_tcp1(coap_socket_t *sock, const coap_address_t *local_if, const coap_address_t *server, int default_port, coap_address_t *local_addr, coap_address_t *remote_addr)
Create a new TCP socket and initiate the connection.
 
int coap_socket_accept_tcp(coap_socket_t *server, coap_socket_t *new_client, coap_address_t *local_addr, coap_address_t *remote_addr, void *extra)
Accept a new incoming TCP session.
 
void coap_socket_strm_close(coap_socket_t *sock)
Function interface to close off a stream socket.
 
int coap_socket_connect_tcp2(coap_socket_t *sock, coap_address_t *local_addr, coap_address_t *remote_addr)
Complete the TCP Connection.
 
int coap_tcp_is_supported(void)
Check whether TCP is available.
 
Multi-purpose address abstraction.
 
union coap_address_t::@0 addr
 
Abstraction of virtual session that can be attached to coap_context_t (client) or coap_endpoint_t (se...
 
coap_socket_t sock
socket object for the session, if any
 
coap_context_t * context
session's context
 
coap_session_t * session
Used to determine session owner.
 
coap_socket_flags_t flags
1 or more of COAP_SOCKET* flag values