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