19#if ! defined(WITH_LWIP) && ! defined(WITH_CONTIKI) && ! defined (RIOT_VERSION)
29#ifdef HAVE_SYS_SELECT_H
30# include <sys/select.h>
32#ifdef HAVE_SYS_SOCKET_H
33# include <sys/socket.h>
34# define OPTVAL_T(t) (t)
35# define OPTVAL_GT(t) (t)
37#ifdef HAVE_SYS_IOCTL_H
40#ifdef HAVE_NETINET_IN_H
41# include <netinet/in.h>
43#ifdef HAVE_NETINET_IP_ICMP_H
44# include <netinet/ip_icmp.h>
46#ifdef HAVE_NETINET_ICMP6_H
47# include <netinet/icmp6.h>
49#ifdef HAVE_LINUX_ERRQUEUE_H
50# include <linux/errqueue.h>
52#ifdef HAVE_SYS_SELECT_H
53# include <sys/select.h>
57# define OPTVAL_T(t) (const char*)(t)
58# define OPTVAL_GT(t) (char*)(t)
60# define CMSG_DATA WSA_CMSG_DATA
68#ifdef COAP_EPOLL_SUPPORT
70#include <sys/timerfd.h>
77#include <sys/select.h>
78#define OPTVAL_T(t) (const void*)(t)
79#define OPTVAL_GT(t) (void*)(t)
82#ifdef IPV6_RECVPKTINFO
83#define IPV6_PKTINFO IPV6_RECVPKTINFO
85#define IPV6_PKTINFO IP_PKTINFO
87#ifndef IN6_IS_ADDR_V4MAPPED
88#define IN6_IS_ADDR_V4MAPPED(a) \
89 ((((a)->s6_addr32[0]) == 0) && (((a)->s6_addr32[1]) == 0) && \
90 (((a)->s6_addr32[2]) == htonl(0xffff)))
96#if defined(IP_PKTINFO)
97# define GEN_IP_PKTINFO IP_PKTINFO
98#elif defined(IP_RECVDSTADDR)
99# define GEN_IP_PKTINFO IP_RECVDSTADDR
101# error "Need IP_PKTINFO or IP_RECVDSTADDR to request ancillary data from OS."
105#ifdef IPV6_RECVPKTINFO
106# define GEN_IPV6_PKTINFO IPV6_RECVPKTINFO
107#elif defined(IPV6_PKTINFO)
108# define GEN_IPV6_PKTINFO IPV6_PKTINFO
110# error "Need IPV6_PKTINFO or IPV6_RECVPKTINFO to request ancillary data from OS."
113#if COAP_SERVER_SUPPORT
126 sock->
fd = socket(listen_addr->
addr.
sa.sa_family, SOCK_DGRAM, 0);
141 if (setsockopt(sock->
fd, SOL_SOCKET, SO_REUSEADDR, OPTVAL_T(&on),
sizeof(on)) ==
COAP_SOCKET_ERROR)
142 coap_log_warn(
"coap_socket_bind_udp: setsockopt SO_REUSEADDR: %s\n",
145 switch (listen_addr->
addr.
sa.sa_family) {
148 if (setsockopt(sock->
fd, IPPROTO_IP, GEN_IP_PKTINFO, OPTVAL_T(&on),
150 coap_log_alert(
"coap_socket_bind_udp: setsockopt IP_PKTINFO: %s\n",
157 if (setsockopt(sock->
fd, IPPROTO_IPV6, IPV6_V6ONLY, OPTVAL_T(&off),
159 coap_log_alert(
"coap_socket_bind_udp: setsockopt IPV6_V6ONLY: %s\n",
161#if !defined(ESPIDF_VERSION)
162 if (setsockopt(sock->
fd, IPPROTO_IPV6, GEN_IPV6_PKTINFO, OPTVAL_T(&on),
164 coap_log_alert(
"coap_socket_bind_udp: setsockopt IPV6_PKTINFO: %s\n",
168 setsockopt(sock->
fd, IPPROTO_IP, GEN_IP_PKTINFO, OPTVAL_T(&on),
sizeof(on));
172#if COAP_AF_UNIX_SUPPORT
176#if COAP_AF_LLC_SUPPORT
185 if (bind(sock->
fd, &listen_addr->
addr.
sa,
187 listen_addr->
addr.
sa.sa_family == AF_INET ?
188 (socklen_t)
sizeof(
struct sockaddr_in) :
196 bound_addr->
size = (socklen_t)
sizeof(*bound_addr);
197 if (getsockname(sock->
fd, &bound_addr->
addr.
sa, &bound_addr->
size) < 0) {
210#if COAP_CLIENT_SUPPORT
230 sock->
fd = socket(connect_addr.
addr.
sa.sa_family, SOCK_DGRAM, 0);
246 int keep_errno = errno;
248 coap_log_warn(
"coap_socket_connect_udp: ioctl FIONBIO: %s (%d)\n",
253 switch (connect_addr.
addr.
sa.sa_family) {
256 if (connect_addr.
addr.
sin.sin_port == 0)
257 connect_addr.
addr.
sin.sin_port = htons(default_port);
258#if IP_RECVERR && defined(HAVE_STRUCT_CMSGHDR) && defined(HAVE_LINUX_ERRQUEUE_H)
259 if (setsockopt(sock->
fd, IPPROTO_IP, IP_RECVERR, OPTVAL_T(&on),
261 coap_log_alert(
"coap_socket_connect_udp: setsockopt IP_RECVERR: %s\n",
268 if (connect_addr.
addr.
sin6.sin6_port == 0)
269 connect_addr.
addr.
sin6.sin6_port = htons(default_port);
271 if (setsockopt(sock->
fd, IPPROTO_IPV6, IPV6_V6ONLY, OPTVAL_T(&off),
273 if (errno != ENOSYS) {
274 coap_log_warn(
"coap_socket_connect_udp: setsockopt IPV6_V6ONLY: %s\n",
277#if IPV6_RECVERR && defined(HAVE_STRUCT_CMSGHDR) && defined(HAVE_LINUX_ERRQUEUE_H)
278 if (setsockopt(sock->
fd, IPPROTO_IPV6, IPV6_RECVERR, OPTVAL_T(&on),
280 coap_log_alert(
"coap_socket_connect_udp: setsockopt IPV6_RECVERR: %s\n",
285#if COAP_AF_UNIX_SUPPORT
289#if COAP_AF_LLC_SUPPORT
294 coap_log_alert(
"coap_socket_connect_udp: unsupported sa_family %d\n",
295 connect_addr.
addr.
sa.sa_family);
299 if (local_if && local_if->
addr.
sa.sa_family) {
300 if (local_if->
addr.
sa.sa_family != connect_addr.
addr.
sa.sa_family) {
301 coap_log_warn(
"coap_socket_connect_udp: local address family != "
302 "remote address family\n");
305 if (setsockopt(sock->
fd, SOL_SOCKET, SO_REUSEADDR, OPTVAL_T(&on),
sizeof(on)) ==
COAP_SOCKET_ERROR)
306 coap_log_warn(
"coap_socket_connect_udp: setsockopt SO_REUSEADDR: %s\n",
308 if (bind(sock->
fd, &local_if->
addr.
sa,
310 local_if->
addr.
sa.sa_family == AF_INET ?
311 (socklen_t)
sizeof(
struct sockaddr_in) :
318#if COAP_AF_UNIX_SUPPORT
319 }
else if (connect_addr.
addr.
sa.sa_family == AF_UNIX) {
321 coap_log_warn(
"coap_socket_connect_udp: local address required\n");
328 if (!(local_if && local_if->
addr.
sa.sa_family)) {
333 bind_addr.
addr.
sa.sa_family = connect_addr.
addr.
sa.sa_family;
334 if (bind(sock->
fd, &bind_addr.
addr.
sa,
336 bind_addr.
addr.
sa.sa_family == AF_INET ?
337 (socklen_t)
sizeof(
struct sockaddr_in) :
346 coap_log_warn(
"coap_socket_connect_udp: getsockname for multicast socket: %s\n",
353 setsockopt(sock->
fd, SOL_SOCKET, SO_BROADCAST, OPTVAL_T(&on),
355 coap_log_warn(
"coap_socket_connect_udp: setsockopt SO_BROADCAST: %s\n",
360 switch (connect_addr.
addr.
sa.sa_family) {
361#if COAP_AF_LLC_SUPPORT
366#if COAP_AF_UNIX_SUPPORT
371#if COAP_AF_UNIX_SUPPORT
372 if (connect_addr.
addr.
sa.sa_family == AF_UNIX) {
396#if COAP_AF_LLC_SUPPORT
411#if !defined(__ZEPHYR__)
412#if 0 == ( defined(HAVE_NETINET_IN_H) || defined(HAVE_WS2TCPIP_H) )
416#if !defined(__MINGW32__)
433#define SOL_IP IPPROTO_IP
436#define COAP_SOL_IP IPPROTO_IP
438#define COAP_SOL_IP SOL_IP
443#if defined(__MINGW32__)
444static __thread LPFN_WSARECVMSG lpWSARecvMsg =
NULL;
445#if(_WIN32_WINNT >= 0x0600)
446#define CMSG_FIRSTHDR WSA_CMSG_FIRSTHDR
447#define CMSG_NXTHDR WSA_CMSG_NXTHDR
448#define CMSG_LEN WSA_CMSG_LEN
449#define CMSG_SPACE WSA_CMSG_SPACE
450#if(_WIN32_WINNT < 0x0603 || _WIN32_WINNT == 0x0a00)
451#define cmsghdr _WSACMSGHDR
455static __declspec(thread) LPFN_WSARECVMSG lpWSARecvMsg =
NULL;
458#define msghdr _WSAMSG
460#define msg_namelen namelen
461#define msg_iov lpBuffers
462#define msg_iovlen dwBufferCount
463#define msg_control Control.buf
464#define msg_controllen Control.len
468#define iov_len_t u_long
470#define CMSG_DATA WSA_CMSG_DATA
471#define ipi_spec_dst ipi_addr
472#if !defined(__MINGW32__)
473#pragma warning( disable : 4116 )
476#define iov_len_t size_t
479#if defined(_CYGWIN_ENV) || defined(__QNXNTO__)
480#define ipi_spec_dst ipi_addr
483#if COAP_CLIENT_SUPPORT
484static uint32_t cid_track_counter;
489 session->negotiated_cid &&
492 if ((++cid_track_counter) % session->
context->testing_cids == 0) {
507#ifdef COAP_EPOLL_SUPPORT
522#if defined(HAVE_LINUX_ERRQUEUE_H) && defined(HAVE_STRUCT_CMSGHDR)
524coap_get_icmp_data(
coap_socket_t *sock, uint8_t *data,
size_t length) {
526 char control_buf[1024];
529 struct cmsghdr *cmsg;
539 memset(&msg, 0,
sizeof(msg));
544 msg.msg_control = control_buf;
545 msg.msg_controllen =
sizeof(control_buf);
548 ret = recvmsg(fd, &msg, MSG_ERRQUEUE);
555 for (cmsg = CMSG_FIRSTHDR(&msg); cmsg !=
NULL; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
556#if COAP_IPV4_SUPPORT && IP_RECVERR
557 if (cmsg->cmsg_level ==
SOL_IP && cmsg->cmsg_type == IP_RECVERR) {
558 struct sock_extended_err *err = (
struct sock_extended_err *)CMSG_DATA(cmsg);
561 if (err->ee_origin == SO_EE_ORIGIN_ICMP) {
562 info->
length = (uint32_t)ret;
567#if COAP_SERVER_SUPPORT
571 err->ee_type, err->ee_code);
575 err->ee_type, err->ee_code);
581#if COAP_IPV6_SUPPORT && IPV6_RECVERR
582 if (cmsg->cmsg_level == SOL_IPV6 && cmsg->cmsg_type == IPV6_RECVERR) {
583 struct sock_extended_err *err = (
struct sock_extended_err *)CMSG_DATA(cmsg);
586 if (err->ee_origin == SO_EE_ORIGIN_ICMP6 || err->ee_origin == SO_EE_ORIGIN_ICMP) {
587 info->
length = (uint32_t)ret;
592#if COAP_SERVER_SUPPORT
596 err->ee_origin == SO_EE_ORIGIN_ICMP6 ?
"6" :
"",
597 err->ee_type, err->ee_code);
601 err->ee_origin == SO_EE_ORIGIN_ICMP6 ?
"6" :
"",
602 err->ee_type, err->ee_code);
608 coap_log_debug(
"MSG_ERRQUEUE: Level %d, Type: %d\n", cmsg->cmsg_level, cmsg->cmsg_type);
621 const uint8_t *data,
size_t datalen) {
622 ssize_t bytes_written = 0;
625#if COAP_CLIENT_SUPPORT
626 coap_test_cid_tuple_change(session);
633 bytes_written = (ssize_t)datalen;
637 bytes_written = send(sock->
fd, (
const char *)data, (
int)datalen, 0);
639 bytes_written = send(sock->
fd, data, datalen, 0);
643 DWORD dwNumberOfBytesSent = 0;
645#ifdef HAVE_STRUCT_CMSGHDR
654 memcpy(&iov[0].iov_base, &data,
sizeof(iov[0].iov_base));
657 memset(buf, 0,
sizeof(buf));
659 memset(&mhdr, 0,
sizeof(
struct msghdr));
660 memcpy(&mhdr.msg_name, &addr,
sizeof(mhdr.msg_name));
662 (socklen_t)
sizeof(
struct sockaddr_in) :
673 struct cmsghdr *cmsg;
677#if defined(IP_PKTINFO)
679 mhdr.msg_control = buf;
680 mhdr.msg_controllen = CMSG_SPACE(
sizeof(
struct in_pktinfo));
682 cmsg = CMSG_FIRSTHDR(&mhdr);
684 cmsg->cmsg_type = IP_PKTINFO;
685 cmsg->cmsg_len = CMSG_LEN(
sizeof(
struct in_pktinfo));
687 pktinfo = (
struct in_pktinfo *)CMSG_DATA(cmsg);
693#elif defined(IP_SENDSRCADDR)
694 mhdr.msg_control = buf;
695 mhdr.msg_controllen = CMSG_SPACE(
sizeof(
struct in_addr));
697 cmsg = CMSG_FIRSTHDR(&mhdr);
698 cmsg->cmsg_level = IPPROTO_IP;
699 cmsg->cmsg_type = IP_SENDSRCADDR;
700 cmsg->cmsg_len = CMSG_LEN(
sizeof(
struct in_addr));
702 memcpy(CMSG_DATA(cmsg),
704 sizeof(
struct in_addr));
709 mhdr.msg_control = buf;
710 mhdr.msg_controllen = CMSG_SPACE(
sizeof(
struct in6_pktinfo));
712 cmsg = CMSG_FIRSTHDR(&mhdr);
713 cmsg->cmsg_level = IPPROTO_IPV6;
714 cmsg->cmsg_type = IPV6_PKTINFO;
715 cmsg->cmsg_len = CMSG_LEN(
sizeof(
struct in6_pktinfo));
735#if defined(IP_PKTINFO)
736 struct cmsghdr *cmsg;
739 mhdr.msg_control = buf;
740 mhdr.msg_controllen = CMSG_SPACE(
sizeof(
struct in_pktinfo));
742 cmsg = CMSG_FIRSTHDR(&mhdr);
744 cmsg->cmsg_type = IP_PKTINFO;
745 cmsg->cmsg_len = CMSG_LEN(
sizeof(
struct in_pktinfo));
747 pktinfo = (
struct in_pktinfo *)CMSG_DATA(cmsg);
753#elif defined(IP_SENDSRCADDR)
754 struct cmsghdr *cmsg;
755 mhdr.msg_control = buf;
756 mhdr.msg_controllen = CMSG_SPACE(
sizeof(
struct in_addr));
758 cmsg = CMSG_FIRSTHDR(&mhdr);
759 cmsg->cmsg_level = IPPROTO_IP;
760 cmsg->cmsg_type = IP_SENDSRCADDR;
761 cmsg->cmsg_len = CMSG_LEN(
sizeof(
struct in_addr));
763 memcpy(CMSG_DATA(cmsg),
765 sizeof(
struct in_addr));
770#if COAP_AF_UNIX_SUPPORT
774#if COAP_AF_LLC_SUPPORT
787 r = WSASendMsg(sock->
fd, &mhdr, 0 , &dwNumberOfBytesSent,
NULL ,
790 bytes_written = (ssize_t)dwNumberOfBytesSent;
793 coap_win_error_to_errno();
796#ifdef HAVE_STRUCT_CMSGHDR
797 bytes_written = sendmsg(sock->
fd, &mhdr, 0);
799 bytes_written = sendto(sock->
fd, (
const void *)data, datalen, 0,
806 if (bytes_written < 0)
809 return bytes_written;
812#define SIN6(A) ((struct sockaddr_in6 *)(A))
823#if defined(HAVE_LINUX_ERRQUEUE_H) && defined(HAVE_STRUCT_CMSGHDR)
845 coap_win_error_to_errno();
848#if defined(HAVE_LINUX_ERRQUEUE_H) && defined(HAVE_STRUCT_CMSGHDR)
855 if (errno == ECONNREFUSED || errno == EHOSTUNREACH || errno == ECONNRESET) {
863 if (errno != EAGAIN) {
870 }
else if (len > 0) {
871 packet->
length = (size_t)len;
875 DWORD dwNumberOfBytesRecvd = 0;
878#ifdef HAVE_STRUCT_CMSGHDR
881 struct cmsghdr *cmsg;
885#if defined(__MINGW32__)
886 iov[0].iov_base = (
char *) packet->
payload;
888 iov[0].iov_base = packet->
payload;
892 memset(&mhdr, 0,
sizeof(
struct msghdr));
900 mhdr.msg_control = buf;
901 mhdr.msg_controllen =
sizeof(buf);
904 cmsg = (
struct cmsghdr *)buf;
905 cmsg->cmsg_len = CMSG_LEN(
sizeof(buf));
906 cmsg->cmsg_level = -1;
907 cmsg->cmsg_type = -1;
911 GUID wsaid = WSAID_WSARECVMSG;
912 DWORD cbBytesReturned = 0;
913 if (WSAIoctl(sock->
fd, SIO_GET_EXTENSION_FUNCTION_POINTER, &wsaid,
sizeof(wsaid), &lpWSARecvMsg,
914 sizeof(lpWSARecvMsg), &cbBytesReturned,
NULL,
NULL) != 0) {
919 r = lpWSARecvMsg(sock->
fd, &mhdr, &dwNumberOfBytesRecvd,
NULL ,
922 len = (ssize_t)dwNumberOfBytesRecvd;
924 coap_win_error_to_errno();
926 len = recvmsg(sock->
fd, &mhdr, 0);
937 coap_win_error_to_errno();
939 if (errno == ECONNREFUSED || errno == EHOSTUNREACH || errno == ECONNRESET) {
947 if (errno != EAGAIN) {
952#ifdef HAVE_STRUCT_CMSGHDR
956 packet->
length = (size_t)len;
960 for (cmsg = CMSG_FIRSTHDR(&mhdr); cmsg; cmsg = CMSG_NXTHDR(&mhdr, cmsg)) {
964 if (cmsg->cmsg_level == IPPROTO_IPV6 && cmsg->cmsg_type == IPV6_PKTINFO) {
969 u.c = CMSG_DATA(cmsg);
970 packet->
ifindex = (int)(u.p->ipi6_ifindex);
972 &u.p->ipi6_addr,
sizeof(
struct in6_addr));
980#if defined(IP_PKTINFO)
981 if (cmsg->cmsg_level ==
COAP_SOL_IP && cmsg->cmsg_type == IP_PKTINFO) {
986 u.c = CMSG_DATA(cmsg);
987 packet->
ifindex = u.p->ipi_ifindex;
994 &u.p->ipi_addr,
sizeof(
struct in_addr));
999 &u.p->ipi_addr,
sizeof(
struct in_addr));
1005#if defined(IP_RECVDSTADDR)
1006 if (cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_RECVDSTADDR) {
1009 CMSG_DATA(cmsg),
sizeof(
struct in_addr));
1018 if (cmsg->cmsg_level != -1 && cmsg->cmsg_type != -1) {
1019 coap_log_debug(
"cmsg_level = %d and cmsg_type = %d not supported - fix\n",
1020 cmsg->cmsg_level, cmsg->cmsg_type);
1034 packet->
length = (size_t)len;
1054#ifdef COAP_EPOLL_SUPPORT
1055#if COAP_SERVER_SUPPORT
1057 sock->endpoint ? sock->endpoint->context :
NULL;
1061 if (context !=
NULL) {
1063 struct epoll_event event;
1066 ret = epoll_ctl(context->epfd, EPOLL_CTL_DEL, sock->
fd, &event);
1067 if (ret == -1 && errno != ENOENT) {
1068 coap_log_err(
"%s: epoll_ctl DEL failed: %d: %s (%d)\n",
1069 "coap_socket_close",
1075#if COAP_SERVER_SUPPORT
1076#if COAP_AF_UNIX_SUPPORT
1077 if (sock->endpoint &&
1078 sock->endpoint->bind_addr.addr.sa.sa_family == AF_UNIX) {
1081 _unlink(sock->endpoint->bind_addr.addr.cun.sun_path);
1083 unlink(sock->endpoint->bind_addr.addr.cun.sun_path);
1087 sock->endpoint =
NULL;
1089#if COAP_CLIENT_SUPPORT
1090#if COAP_AF_UNIX_SUPPORT
1115#pragma GCC diagnostic ignored "-Wunused-function"
void coap_address_set_port(coap_address_t *addr, uint16_t port)
Set the port field of addr to port (in host byte order).
int coap_is_bcast(const coap_address_t *a)
Checks if given address a denotes a broadcast address.
void coap_address_init(coap_address_t *addr)
Resets the given coap_address_t object addr to its default values.
int coap_is_mcast(const coap_address_t *a)
Checks if given address a denotes a multicast address.
uint16_t coap_address_get_port(const coap_address_t *addr)
Returns the port from addr in host byte order.
int coap_is_af_llc(const coap_address_t *a)
Checks if given address a denotes an AF_LLC address.
void coap_address_copy(coap_address_t *dst, const coap_address_t *src)
COAP_STATIC_INLINE int coap_address_isany(const coap_address_t *a)
Checks if given address object a denotes the wildcard address.
int coap_debug_send_packet(void)
Check to see whether a packet should be sent or not.
#define COAP_IPV4_SUPPORT
const char * coap_socket_strerror(void)
#define COAP_RXBUFFER_SIZE
#define COAP_SOCKET_ERROR
#define COAP_INVALID_SOCKET
#define COAP_SOCKET_MULTICAST
socket is used for multicast communication
void coap_epoll_ctl_add(coap_socket_t *sock, uint32_t events, const char *func)
Epoll specific function to add the state of events that epoll is to track for the appropriate file de...
#define COAP_SOCKET_NOT_EMPTY
the socket is not empty
#define COAP_SOCKET_BOUND
the socket is bound
#define COAP_SOCKET_SLAVE
socket is a slave socket - do not close
#define COAP_SOCKET_WANT_READ
non blocking socket is waiting for reading
#define COAP_SOCKET_WANT_SENDTO
socket requires a destination address for sending
#define COAP_SOCKET_WANT_CONNECT
non blocking client socket is waiting for connect
#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.
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.
void coap_socket_dgrm_close(coap_socket_t *sock)
Function interface to close off a datagram socket.
#define coap_log_debug(...)
#define coap_log_alert(...)
const char * coap_endpoint_str(const coap_endpoint_t *endpoint)
Get endpoint description.
const char * coap_session_str(const coap_session_t *session)
Get session description.
#define coap_log_warn(...)
#define coap_log_err(...)
@ COAP_SESSION_TYPE_CLIENT
client-side
@ COAP_SESSION_STATE_ESTABLISHED
coap_address_t remote
remote address and port
coap_address_t local
local address and port
Multi-purpose address abstraction.
union coap_address_t::@240002377300042076074216002206221156022102076005 addr
socklen_t size
size of addr
struct coap_sockaddr_un cun
The CoAP stack's global state is stored in a coap_context_t object.
size_t length
length of payload
coap_addr_tuple_t addr_info
local and remote addresses
unsigned char * payload
payload
int ifindex
the interface index
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_session_state_t state
current state of relationship with peer
coap_addr_tuple_t addr_info
remote/local address info
coap_proto_t proto
protocol used
coap_session_type_t type
client or server side socket
coap_context_t * context
session's context
int ifindex
interface index
char sun_path[COAP_UNIX_PATH_MAX]
coap_session_t * session
Used to determine session owner.
coap_socket_flags_t flags
1 or more of COAP_SOCKET* flag values
struct in6_addr ipi6_addr
unsigned int ipi6_ifindex
struct in_addr ipi_spec_dst