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) 
   43  ssize_t bytes_written = 0;
 
   46    bytes_written = (ssize_t)datalen;
 
   48    bytes_written = sock_udp_send(&sock->udp, data, datalen, NULL);
 
   50    bytes_written = sock_udp_send(&sock->udp, data, datalen, &session->
addr_info.
remote.riot);
 
   53  if (bytes_written < 0) {
 
   54    errno = -bytes_written;
 
   79    sock->
flags &= ~COAP_SOCKET_CAN_READ;
 
   87      if (errno == ECONNREFUSED || errno == EHOSTUNREACH || errno == ECONNRESET) {
 
   95      if (errno != EAGAIN) {
 
  102    } 
else if (len > 0) {
 
  103      packet->
length = (size_t)len;
 
  106    sock_udp_aux_rx_t aux;
 
  107    sock_udp_ep_t remote;
 
  109    aux.flags = SOCK_AUX_GET_LOCAL;
 
  115      if (errno == ECONNREFUSED || errno == EHOSTUNREACH || errno == ECONNRESET) {
 
  123      if (errno != EAGAIN) {
 
  130    } 
else if (len > 0) {
 
  131      packet->
length = (size_t)len;
 
  143#if COAP_SERVER_SUPPORT 
  146udp_recv_endpoint_cb(sock_udp_t *sock, sock_async_flags_t flags, 
void *arg) {
 
  150  if (!(flags & (SOCK_ASYNC_MSG_RECV | SOCK_ASYNC_MSG_SENT)))
 
  153  if (flags & SOCK_ASYNC_MSG_RECV)
 
  155  if (endpoint->
context->selecting_thread) {
 
  156    thread_flags_set(endpoint->
context->selecting_thread,
 
  157                     COAP_SELECT_THREAD_FLAG);
 
  167  ret = sock_udp_create(&sock->udp, &listen_addr->riot, NULL, SOCK_FLAGS_REUSE_EP);
 
  171    coap_log_warn(
"coap_socket_bind_udp: sock_udp_create: %s (%d)\n",
 
  175  ret = sock_udp_get_local(&sock->udp, &bound_addr->riot);
 
  179    coap_log_warn(
"coap_socket_bind_udp: sock_udp_get_local: %s\n",
 
  182  sock_udp_set_cb(&sock->udp, udp_recv_endpoint_cb, sock->
endpoint);
 
  192#if COAP_CLIENT_SUPPORT 
  195udp_recv_session_cb(sock_udp_t *sock, sock_async_flags_t flags, 
void *arg) {
 
  199  if (!(flags & (SOCK_ASYNC_MSG_RECV | SOCK_ASYNC_MSG_SENT)))
 
  202  if (flags & SOCK_ASYNC_MSG_RECV)
 
  204  if (session->
context->selecting_thread) {
 
  205    thread_flags_set(session->
context->selecting_thread,
 
  206                     COAP_SELECT_THREAD_FLAG);
 
  218  sock_udp_ep_t remote;
 
  227  if (local_if && local_if->riot.family) {
 
  228    if (local_if->riot.family != connect_addr.riot.family) {
 
  229      coap_log_warn(
"coap_socket_connect_udp: local address family != " 
  230                    "remote address family\n");
 
  235  local.netif = SOCK_ADDR_ANY_NETIF;
 
  236  remote.netif = SOCK_ADDR_ANY_NETIF;
 
  237  switch (connect_addr.riot.family) {
 
  240    local.family = AF_INET;
 
  243      memcpy(local.addr.ipv4, &local_if->riot.
addr.ipv4, 
sizeof(local.addr.ipv4));
 
  244      local.port = local_if->riot.port;
 
  246      memset(local.addr.ipv4, 0, 
sizeof(local.addr.ipv4));
 
  248    remote.family = AF_INET;
 
  249    memcpy(remote.addr.ipv4, &server->riot.
addr.ipv4, 
sizeof(remote.addr.ipv4));
 
  250    if (connect_addr.riot.port == 0)
 
  251      connect_addr.riot.port = default_port;
 
  252    remote.port = connect_addr.riot.port;
 
  257    local.family = AF_INET6;
 
  260      memcpy(local.addr.ipv6, &local_if->riot.
addr.ipv6, 
sizeof(local.addr.ipv6));
 
  261      local.port = local_if->riot.port;
 
  263      memset(local.addr.ipv6, 0, 
sizeof(local.addr.ipv6));
 
  265    remote.family = AF_INET6;
 
  266    memcpy(remote.addr.ipv6, &server->riot.
addr.ipv6, 
sizeof(remote.addr.ipv6));
 
  267    if (connect_addr.riot.port == 0)
 
  268      connect_addr.riot.port = htons(default_port);
 
  269    remote.port = connect_addr.riot.port;
 
  273    coap_log_alert(
"coap_socket_connect_udp: unsupported sa_family %d\n",
 
  274                   connect_addr.riot.family);
 
  278  ret = sock_udp_create(&sock->udp, &local, &remote, is_mcast ? 0 : SOCK_FLAGS_CONNECT_REMOTE);
 
  282    coap_log_warn(
"coap_socket_connect_udp: sock_udp_create: %s (%d)\n",
 
  286  ret = sock_udp_get_local(&sock->udp, &local);
 
  290    coap_log_warn(
"coap_socket_connect_udp: sock_udp_get_local: %s\n",
 
  293  memcpy(&local_addr->riot, &local, 
sizeof(local_addr->riot));
 
  295  ret = sock_udp_get_remote(&sock->udp, &remote);
 
  299    coap_log_warn(
"coap_socket_connect_udp: sock_udp_get_remote: %s\n",
 
  302  memcpy(&remote_addr->riot, &remote, 
sizeof(remote_addr->riot));
 
  304  sock_udp_set_cb(&sock->udp, udp_recv_session_cb, sock->
session);
 
  326    sock_udp_close(&sock->udp);
 
  337#pragma GCC diagnostic ignored "-Wunused-function" 
int coap_is_mcast(const coap_address_t *a)
Checks if given address a denotes a multicast address.
 
void coap_address_copy(coap_address_t *dst, const coap_address_t *src)
 
int coap_debug_send_packet(void)
Check to see whether a packet should be sent or not.
 
const char * coap_socket_strerror(void)
 
#define COAP_RXBUFFER_SIZE
 
#define COAP_SOCKET_MULTICAST
socket is used for multicast communication
 
#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.
 
int coap_socket_connect_udp(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 UDP socket and 'connect' it to the address tuple.
 
ssize_t coap_socket_recv(coap_socket_t *sock, coap_packet_t *packet)
Function interface for reading data.
 
ssize_t coap_socket_send(coap_socket_t *sock, coap_session_t *session, const uint8_t *data, size_t datalen)
Function interface for data transmission.
 
int coap_socket_bind_udp(coap_socket_t *sock, const coap_address_t *listen_addr, coap_address_t *bound_addr)
Create a new UDP socket and then listen for new incoming UDP sessions to the specified IP address and...
 
void coap_socket_dgrm_close(coap_socket_t *sock)
Function interface to close off a datagram socket.
 
#define coap_log_alert(...)
 
const char * coap_session_str(const coap_session_t *session)
Get session description.
 
#define coap_log_warn(...)
 
#define coap_log_crit(...)
 
coap_address_t remote
remote address and port
 
coap_address_t local
local address and port
 
Multi-purpose address abstraction.
 
union coap_address_t::@0 addr
 
Abstraction of virtual endpoint that can be attached to coap_context_t.
 
coap_context_t * context
endpoint's context
 
coap_socket_t sock
socket object for the interface, if any
 
size_t length
length of payload
 
coap_addr_tuple_t addr_info
local and remote addresses
 
unsigned char * payload
payload
 
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_addr_tuple_t addr_info
remote/local address info
 
coap_context_t * context
session's context
 
coap_session_t * session
Used to determine session owner.
 
coap_endpoint_t * endpoint
Used by the epoll logic for a listening endpoint.
 
coap_address_t mcast_addr
remote address and port (multicast track)
 
coap_socket_flags_t flags
1 or more of COAP_SOCKET* flag values