57#if LWIP_CHECKSUM_ON_COPY
61#if LWIP_COMPAT_SOCKETS == 2 && LWIP_POSIX_SOCKETS_IO_NAMES
67#ifdef LWIP_HOOK_FILENAME
68#include LWIP_HOOK_FILENAME
83#define API_SELECT_CB_VAR_REF(name) API_VAR_REF(name)
84#define API_SELECT_CB_VAR_DECLARE(name) API_VAR_DECLARE(struct lwip_select_cb, name)
85#define API_SELECT_CB_VAR_ALLOC(name, retblock) API_VAR_ALLOC_EXT(struct lwip_select_cb, MEMP_SELECT_CB, name, retblock)
86#define API_SELECT_CB_VAR_FREE(name) API_VAR_FREE(MEMP_SELECT_CB, name)
88#ifndef LWIP_SOCKET_HAVE_SA_LEN
89#define LWIP_SOCKET_HAVE_SA_LEN 0
93#if LWIP_SOCKET_HAVE_SA_LEN
96#define IP4ADDR_SOCKADDR_SET_LEN(sin) \
97 (sin)->sin_len = sizeof(struct sockaddr_in)
101#define IP6ADDR_SOCKADDR_SET_LEN(sin6) \
102 (sin6)->sin6_len = sizeof(struct sockaddr_in6)
105#define IPADDR_SOCKADDR_GET_LEN(addr) \
111#define IP4ADDR_SOCKADDR_SET_LEN(addr)
115#define IP6ADDR_SOCKADDR_SET_LEN(addr)
118#if LWIP_IPV4 && LWIP_IPV6
119#define IPADDR_SOCKADDR_GET_LEN(addr) \
120 ((addr)->sa.sa_family == AF_INET ? sizeof(struct sockaddr_in) \
121 : ((addr)->sa.sa_family == AF_INET6 ? sizeof(struct sockaddr_in6) : 0))
123#define IPADDR_SOCKADDR_GET_LEN(addr) sizeof(struct sockaddr_in)
125#define IPADDR_SOCKADDR_GET_LEN(addr) sizeof(struct sockaddr_in6)
127#define IPADDR_SOCKADDR_GET_LEN(addr) sizeof(struct sockaddr)
133#define IP4ADDR_PORT_TO_SOCKADDR(sin, ipaddr, port) do { \
134 IP4ADDR_SOCKADDR_SET_LEN(sin); \
135 (sin)->sin_family = AF_INET; \
136 (sin)->sin_port = lwip_htons((port)); \
137 inet_addr_from_ip4addr(&(sin)->sin_addr, ipaddr); \
138 memset((sin)->sin_zero, 0, SIN_ZERO_LEN); }while(0)
139#define SOCKADDR4_TO_IP4ADDR_PORT(sin, ipaddr, port) do { \
140 inet_addr_to_ip4addr(ip_2_ip4(ipaddr), &((sin)->sin_addr)); \
141 (port) = lwip_ntohs((sin)->sin_port); }while(0)
145#define IP6ADDR_PORT_TO_SOCKADDR(sin6, ipaddr, port) do { \
146 IP6ADDR_SOCKADDR_SET_LEN(sin6); \
147 (sin6)->sin6_family = AF_INET6; \
148 (sin6)->sin6_port = lwip_htons((port)); \
149 (sin6)->sin6_flowinfo = 0; \
150 inet6_addr_from_ip6addr(&(sin6)->sin6_addr, ipaddr); \
151 (sin6)->sin6_scope_id = ip6_addr_zone(ipaddr); }while(0)
152#define SOCKADDR6_TO_IP6ADDR_PORT(sin6, ipaddr, port) do { \
153 inet6_addr_to_ip6addr(ip_2_ip6(ipaddr), &((sin6)->sin6_addr)); \
154 if (ip6_addr_has_scope(ip_2_ip6(ipaddr), IP6_UNKNOWN)) { \
155 ip6_addr_set_zone(ip_2_ip6(ipaddr), (u8_t)((sin6)->sin6_scope_id)); \
157 (port) = lwip_ntohs((sin6)->sin6_port); }while(0)
160#if LWIP_IPV4 && LWIP_IPV6
163#define IS_SOCK_ADDR_LEN_VALID(namelen) (((namelen) == sizeof(struct sockaddr_in)) || \
164 ((namelen) == sizeof(struct sockaddr_in6)))
165#define IS_SOCK_ADDR_TYPE_VALID(name) (((name)->sa_family == AF_INET) || \
166 ((name)->sa_family == AF_INET6))
167#define SOCK_ADDR_TYPE_MATCH(name, sock) \
168 ((((name)->sa_family == AF_INET) && !(NETCONNTYPE_ISIPV6((sock)->conn->type))) || \
169 (((name)->sa_family == AF_INET6) && (NETCONNTYPE_ISIPV6((sock)->conn->type))))
170#define IPADDR_PORT_TO_SOCKADDR(sockaddr, ipaddr, port) do { \
171 if (IP_IS_ANY_TYPE_VAL(*ipaddr) || IP_IS_V6_VAL(*ipaddr)) { \
172 IP6ADDR_PORT_TO_SOCKADDR((struct sockaddr_in6*)(void*)(sockaddr), ip_2_ip6(ipaddr), port); \
174 IP4ADDR_PORT_TO_SOCKADDR((struct sockaddr_in*)(void*)(sockaddr), ip_2_ip4(ipaddr), port); \
176#define SOCKADDR_TO_IPADDR_PORT(sockaddr, ipaddr, port) sockaddr_to_ipaddr_port(sockaddr, ipaddr, &(port))
177#define DOMAIN_TO_NETCONN_TYPE(domain, type) (((domain) == AF_INET) ? \
178 (type) : (enum netconn_type)((type) | NETCONN_TYPE_IPV6))
180#define IS_SOCK_ADDR_LEN_VALID(namelen) ((namelen) == sizeof(struct sockaddr_in6))
181#define IS_SOCK_ADDR_TYPE_VALID(name) ((name)->sa_family == AF_INET6)
182#define SOCK_ADDR_TYPE_MATCH(name, sock) 1
183#define IPADDR_PORT_TO_SOCKADDR(sockaddr, ipaddr, port) \
184 IP6ADDR_PORT_TO_SOCKADDR((struct sockaddr_in6*)(void*)(sockaddr), ip_2_ip6(ipaddr), port)
185#define SOCKADDR_TO_IPADDR_PORT(sockaddr, ipaddr, port) \
186 SOCKADDR6_TO_IP6ADDR_PORT((const struct sockaddr_in6*)(const void*)(sockaddr), ipaddr, port)
187#define DOMAIN_TO_NETCONN_TYPE(domain, netconn_type) (netconn_type)
189#define IS_SOCK_ADDR_LEN_VALID(namelen) ((namelen) == sizeof(struct sockaddr_in))
190#define IS_SOCK_ADDR_TYPE_VALID(name) ((name)->sa_family == AF_INET)
191#define SOCK_ADDR_TYPE_MATCH(name, sock) 1
192#define IPADDR_PORT_TO_SOCKADDR(sockaddr, ipaddr, port) \
193 IP4ADDR_PORT_TO_SOCKADDR((struct sockaddr_in*)(void*)(sockaddr), ip_2_ip4(ipaddr), port)
194#define SOCKADDR_TO_IPADDR_PORT(sockaddr, ipaddr, port) \
195 SOCKADDR4_TO_IP4ADDR_PORT((const struct sockaddr_in*)(const void*)(sockaddr), ipaddr, port)
196#define DOMAIN_TO_NETCONN_TYPE(domain, netconn_type) (netconn_type)
199#define IS_SOCK_ADDR_TYPE_VALID_OR_UNSPEC(name) (((name)->sa_family == AF_UNSPEC) || \
200 IS_SOCK_ADDR_TYPE_VALID(name))
201#define SOCK_ADDR_TYPE_MATCH_OR_UNSPEC(name, sock) (((name)->sa_family == AF_UNSPEC) || \
202 SOCK_ADDR_TYPE_MATCH(name, sock))
203#define IS_SOCK_ADDR_ALIGNED(name) ((((mem_ptr_t)(name)) % LWIP_MIN(4, MEM_ALIGNMENT)) == 0)
206#define LWIP_SOCKOPT_CHECK_OPTLEN(sock, optlen, opttype) do { if ((optlen) < sizeof(opttype)) { done_socket(sock); return EINVAL; }}while(0)
207#define LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, opttype) do { \
208 LWIP_SOCKOPT_CHECK_OPTLEN(sock, optlen, opttype); \
209 if ((sock)->conn == NULL) { done_socket(sock); return EINVAL; } }while(0)
210#define LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, opttype) do { \
211 LWIP_SOCKOPT_CHECK_OPTLEN(sock, optlen, opttype); \
212 if (((sock)->conn == NULL) || ((sock)->conn->pcb.tcp == NULL)) { done_socket(sock); return EINVAL; } }while(0)
213#define LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, opttype, netconntype) do { \
214 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, opttype); \
215 if (NETCONNTYPE_GROUP(netconn_type((sock)->conn)) != netconntype) { done_socket(sock); return ENOPROTOOPT; } }while(0)
218#define LWIP_SETGETSOCKOPT_DATA_VAR_REF(name) API_VAR_REF(name)
219#define LWIP_SETGETSOCKOPT_DATA_VAR_DECLARE(name) API_VAR_DECLARE(struct lwip_setgetsockopt_data, name)
220#define LWIP_SETGETSOCKOPT_DATA_VAR_FREE(name) API_VAR_FREE(MEMP_SOCKET_SETGETSOCKOPT_DATA, name)
221#if LWIP_MPU_COMPATIBLE
222#define LWIP_SETGETSOCKOPT_DATA_VAR_ALLOC(name, sock) do { \
223 name = (struct lwip_setgetsockopt_data *)memp_malloc(MEMP_SOCKET_SETGETSOCKOPT_DATA); \
224 if (name == NULL) { \
230#define LWIP_SETGETSOCKOPT_DATA_VAR_ALLOC(name, sock)
233#if LWIP_SO_SNDRCVTIMEO_NONSTANDARD
234#define LWIP_SO_SNDRCVTIMEO_OPTTYPE int
235#define LWIP_SO_SNDRCVTIMEO_SET(optval, val) (*(int *)(optval) = (val))
236#define LWIP_SO_SNDRCVTIMEO_GET_MS(optval) ((long)*(const int*)(optval))
238#define LWIP_SO_SNDRCVTIMEO_OPTTYPE struct timeval
239#define LWIP_SO_SNDRCVTIMEO_SET(optval, val) do { \
241 ((struct timeval *)(optval))->tv_sec = (long)((loc) / 1000U); \
242 ((struct timeval *)(optval))->tv_usec = (long)(((loc) % 1000U) * 1000U); }while(0)
243#define LWIP_SO_SNDRCVTIMEO_GET_MS(optval) ((((const struct timeval *)(optval))->tv_sec * 1000) + (((const struct timeval *)(optval))->tv_usec / 1000))
250union sockaddr_aligned {
261#ifndef LWIP_SOCKET_MAX_MEMBERSHIPS
262#define LWIP_SOCKET_MAX_MEMBERSHIPS NUM_SOCKETS
268struct lwip_socket_multicast_pair {
270 struct lwip_sock *
sock;
274 ip4_addr_t multi_addr;
277static struct lwip_socket_multicast_pair socket_ipv4_multicast_memberships[LWIP_SOCKET_MAX_MEMBERSHIPS];
279static int lwip_socket_register_membership(
int s,
const ip4_addr_t *if_addr,
const ip4_addr_t *multi_addr);
280static void lwip_socket_unregister_membership(
int s,
const ip4_addr_t *if_addr,
const ip4_addr_t *multi_addr);
281static void lwip_socket_drop_registered_memberships(
int s);
287struct lwip_socket_multicast_mld6_pair {
289 struct lwip_sock *
sock;
293 ip6_addr_t multi_addr;
296static struct lwip_socket_multicast_mld6_pair socket_ipv6_multicast_memberships[LWIP_SOCKET_MAX_MEMBERSHIPS];
298static int lwip_socket_register_mld6_membership(
int s,
unsigned int if_idx,
const ip6_addr_t *multi_addr);
299static void lwip_socket_unregister_mld6_membership(
int s,
unsigned int if_idx,
const ip6_addr_t *multi_addr);
300static void lwip_socket_drop_registered_mld6_memberships(
int s);
306#if LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL
307#if LWIP_TCPIP_CORE_LOCKING
309#define LWIP_SOCKET_SELECT_DECL_PROTECT(lev)
310#define LWIP_SOCKET_SELECT_PROTECT(lev) LOCK_TCPIP_CORE()
311#define LWIP_SOCKET_SELECT_UNPROTECT(lev) UNLOCK_TCPIP_CORE()
314#define LWIP_SOCKET_SELECT_DECL_PROTECT(lev) SYS_ARCH_DECL_PROTECT(lev)
315#define LWIP_SOCKET_SELECT_PROTECT(lev) SYS_ARCH_PROTECT(lev)
316#define LWIP_SOCKET_SELECT_UNPROTECT(lev) SYS_ARCH_UNPROTECT(lev)
319static volatile int select_cb_ctr;
322static struct lwip_select_cb *select_cb_list;
326#if LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL
327static void event_callback(
struct netconn *conn,
enum netconn_evt evt,
u16_t len);
328#define DEFAULT_SOCKET_EVENTCB event_callback
329static void select_check_waiters(
int s,
int has_recvevent,
int has_sendevent,
int has_errevent);
331#define DEFAULT_SOCKET_EVENTCB NULL
333#if !LWIP_TCPIP_CORE_LOCKING
334static void lwip_getsockopt_callback(
void *
arg);
335static void lwip_setsockopt_callback(
void *
arg);
337static int lwip_getsockopt_impl(
int s,
int level,
int optname,
void *optval,
socklen_t *optlen);
338static int lwip_setsockopt_impl(
int s,
int level,
int optname,
const void *optval,
socklen_t optlen);
339static int free_socket_locked(
struct lwip_sock *
sock,
int is_tcp,
struct netconn **conn,
340 union lwip_sock_lastdata *lastdata);
341static void free_socket_free_elements(
int is_tcp,
struct netconn *conn,
union lwip_sock_lastdata *lastdata);
343#if LWIP_IPV4 && LWIP_IPV6
359lwip_socket_thread_init(
void)
361 netconn_thread_init();
366lwip_socket_thread_cleanup(
void)
368 netconn_thread_cleanup();
371#if LWIP_NETCONN_FULLDUPLEX
374sock_inc_used(
struct lwip_sock *
sock)
382 if (
sock->fd_free_pending) {
396sock_inc_used_locked(
struct lwip_sock *
sock)
400 if (
sock->fd_free_pending) {
416done_socket(
struct lwip_sock *
sock)
421 union lwip_sock_lastdata lastdata;
427 if (--
sock->fd_used == 0) {
428 if (
sock->fd_free_pending) {
431 is_tcp =
sock->fd_free_pending & LWIP_SOCK_FD_FREE_TCP;
432 freed = free_socket_locked(
sock, is_tcp, &conn, &lastdata);
438 free_socket_free_elements(is_tcp, conn, &lastdata);
443#define sock_inc_used(sock) 1
444#define sock_inc_used_locked(sock) 1
445#define done_socket(sock)
449static struct lwip_sock *
450tryget_socket_unconn_nouse(
int fd)
461lwip_socket_dbg_get_socket(
int fd)
463 return tryget_socket_unconn_nouse(
fd);
467static struct lwip_sock *
468tryget_socket_unconn(
int fd)
470 struct lwip_sock *
ret = tryget_socket_unconn_nouse(
fd);
472 if (!sock_inc_used(
ret)) {
480static struct lwip_sock *
481tryget_socket_unconn_locked(
int fd)
483 struct lwip_sock *
ret = tryget_socket_unconn_nouse(
fd);
485 if (!sock_inc_used_locked(
ret)) {
498static struct lwip_sock *
501 struct lwip_sock *
sock = tryget_socket_unconn(
fd);
517static struct lwip_sock *
520 struct lwip_sock *
sock = tryget_socket(
fd);
550 if (!sockets[
i].conn) {
551#if LWIP_NETCONN_FULLDUPLEX
552 if (sockets[
i].fd_used) {
556 sockets[
i].fd_used = 1;
557 sockets[
i].fd_free_pending = 0;
559 sockets[
i].conn = newconn;
563 sockets[
i].lastdata.pbuf =
NULL;
564#if LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL
565 LWIP_ASSERT(
"sockets[i].select_waiting == 0", sockets[
i].select_waiting == 0);
566 sockets[
i].rcvevent = 0;
569 sockets[
i].sendevent = (NETCONNTYPE_GROUP(newconn->type) == NETCONN_TCP ? (
accepted != 0) : 1);
570 sockets[
i].errevent = 0;
587free_socket_locked(
struct lwip_sock *
sock,
int is_tcp,
struct netconn **conn,
588 union lwip_sock_lastdata *lastdata)
590#if LWIP_NETCONN_FULLDUPLEX
593 if (
sock->fd_used > 0) {
594 sock->fd_free_pending = LWIP_SOCK_FD_FREE_FREE | (is_tcp ? LWIP_SOCK_FD_FREE_TCP : 0);
601 *lastdata =
sock->lastdata;
611free_socket_free_elements(
int is_tcp,
struct netconn *conn,
union lwip_sock_lastdata *lastdata)
613 if (lastdata->pbuf !=
NULL) {
617 netbuf_delete(lastdata->netbuf);
622 netconn_delete(conn);
633free_socket(
struct lwip_sock *
sock,
int is_tcp)
637 union lwip_sock_lastdata lastdata;
643 freed = free_socket_locked(
sock, is_tcp, &conn, &lastdata);
648 free_socket_free_elements(is_tcp, conn, &lastdata);
661 struct lwip_sock *
sock, *nsock;
671 sock = get_socket(
s);
677 err = netconn_accept(
sock->conn, &newconn);
680 if (NETCONNTYPE_GROUP(netconn_type(
sock->conn)) != NETCONN_TCP) {
692 newsock = alloc_socket(newconn, 1);
694 netconn_delete(newconn);
708 recvevent = (
s16_t)(-1 - newconn->callback_arg.
socket);
709 newconn->callback_arg.
socket = newsock;
712 if (newconn->callback) {
714 while (recvevent > 0) {
716 newconn->callback(newconn, NETCONN_EVT_RCVPLUS, 0);
725 union sockaddr_aligned tempaddr;
727 err = netconn_peer(newconn, &naddr, &
port);
730 free_socket(nsock, 1);
736 IPADDR_PORT_TO_SOCKADDR(&tempaddr, &naddr,
port);
737 if (*addrlen > IPADDR_SOCKADDR_GET_LEN(&tempaddr)) {
738 *addrlen = IPADDR_SOCKADDR_GET_LEN(&tempaddr);
758 struct lwip_sock *
sock;
763 sock = get_socket(
s);
768 if (!SOCK_ADDR_TYPE_MATCH(
name,
sock)) {
777 IS_SOCK_ADDR_TYPE_VALID(
name) && IS_SOCK_ADDR_ALIGNED(
name)),
781 SOCKADDR_TO_IPADDR_PORT(
name, &local_addr, local_port);
786#if LWIP_IPV4 && LWIP_IPV6
789 unmap_ipv4_mapped_ipv6(ip_2_ip4(&local_addr),
ip_2_ip6(&local_addr));
794 err = netconn_bind(
sock->conn, &local_addr, local_port);
812 struct lwip_sock *
sock;
818 sock = get_socket(
s);
824 is_tcp = NETCONNTYPE_GROUP(netconn_type(
sock->conn)) == NETCONN_TCP;
831 lwip_socket_drop_registered_memberships(
s);
835 lwip_socket_drop_registered_mld6_memberships(
s);
838 err = netconn_prepare_delete(
sock->conn);
845 free_socket(
sock, is_tcp);
853 struct lwip_sock *
sock;
856 sock = get_socket(
s);
861 if (!SOCK_ADDR_TYPE_MATCH_OR_UNSPEC(
name,
sock)) {
871 err = netconn_disconnect(
sock->conn);
878 IS_SOCK_ADDR_TYPE_VALID_OR_UNSPEC(
name) && IS_SOCK_ADDR_ALIGNED(
name),
881 SOCKADDR_TO_IPADDR_PORT(
name, &remote_addr, remote_port);
886#if LWIP_IPV4 && LWIP_IPV6
889 unmap_ipv4_mapped_ipv6(ip_2_ip4(&remote_addr),
ip_2_ip6(&remote_addr));
894 err = netconn_connect(
sock->conn, &remote_addr, remote_port);
919lwip_listen(
int s,
int backlog)
921 struct lwip_sock *
sock;
926 sock = get_socket(
s);
934 err = netconn_listen_with_backlog(
sock->conn, (
u8_t)backlog);
938 if (NETCONNTYPE_GROUP(netconn_type(
sock->conn)) != NETCONN_TCP) {
960 u8_t apiflags = NETCONN_NOAUTORCVD;
965 LWIP_ASSERT(
"this should be checked internally", NETCONNTYPE_GROUP(netconn_type(
sock->conn)) == NETCONN_TCP);
967 if (
flags & MSG_DONTWAIT) {
968 apiflags |= NETCONN_DONTBLOCK;
978 if (
sock->lastdata.pbuf) {
979 p =
sock->lastdata.pbuf;
983 err = netconn_recv_tcp_pbuf_flags(
sock->conn, &
p, apiflags);
991 goto lwip_recv_tcp_done;
1004 sock->lastdata.pbuf =
p;
1008 p->tot_len, (
int)recv_left, (
int)recvd));
1010 if (recv_left >
p->tot_len) {
1011 copylen =
p->tot_len;
1013 copylen = (
u16_t)recv_left;
1027 LWIP_ASSERT(
"invalid copylen, len would underflow", recv_left >= copylen);
1028 recv_left -= copylen;
1034 if (
p->tot_len - copylen > 0) {
1046 apiflags |= NETCONN_DONTBLOCK | NETCONN_NOFIN;
1052 netconn_tcp_recvd(
sock->conn, (
size_t)recvd);
1065 union sockaddr_aligned saddr;
1073#if LWIP_IPV4 && LWIP_IPV6
1075 if (NETCONNTYPE_ISIPV6(netconn_type(conn)) &&
IP_IS_V4(fromaddr)) {
1076 ip4_2_ipv4_mapped_ipv6(
ip_2_ip6(fromaddr), ip_2_ip4(fromaddr));
1081 IPADDR_PORT_TO_SOCKADDR(&saddr, fromaddr,
port);
1082 if (*fromlen < IPADDR_SOCKADDR_GET_LEN(&saddr)) {
1084 }
else if (*fromlen > IPADDR_SOCKADDR_GET_LEN(&saddr)) {
1085 *fromlen = IPADDR_SOCKADDR_GET_LEN(&saddr);
1104 if (
from && fromlen)
1110 netconn_getaddr(
sock->conn, &tmpaddr, &
port, 0);
1114 if (
from && fromlen) {
1115 return lwip_sock_make_addr(
sock->conn, &tmpaddr,
port,
from, fromlen);
1131 u16_t buflen, copylen, copied;
1137 if (
flags & MSG_DONTWAIT) {
1138 apiflags = NETCONN_DONTBLOCK;
1149 err = netconn_recv_udp_raw_netbuf_flags(
sock->conn, &
buf, apiflags);
1159 buflen =
buf->p->tot_len;
1164 for (
i = 0; (
i <
msg->msg_iovlen) && (copied < buflen);
i++) {
1166 if (
msg->msg_iov[
i].iov_len > len_left) {
1169 copylen = (
u16_t)
msg->msg_iov[
i].iov_len;
1175 copied = (
u16_t)(copied + copylen);
1180 if (
msg->msg_name &&
msg->msg_namelen)
1186 if (
msg->msg_name &&
msg->msg_namelen) {
1187 lwip_sock_make_addr(
sock->conn, netbuf_fromaddr(
buf), netbuf_fromport(
buf),
1195 if (
msg->msg_control) {
1197#if LWIP_NETBUF_RECVINFO
1199 if (
buf->flags & NETBUF_FLAG_DESTADDR) {
1202 if (
msg->msg_controllen >= CMSG_SPACE(
sizeof(
struct in_pktinfo))) {
1203 struct cmsghdr *chdr = CMSG_FIRSTHDR(
msg);
1207 chdr->cmsg_len = CMSG_LEN(
sizeof(
struct in_pktinfo));
1209 inet_addr_from_ip4addr(&pkti->
ipi_addr, ip_2_ip4(netbuf_destaddr(
buf)));
1210 msg->msg_controllen = CMSG_SPACE(
sizeof(
struct in_pktinfo));
1221 msg->msg_controllen = 0;
1231 *datagram_len = buflen;
1240 struct lwip_sock *
sock;
1244 sock = get_socket(
s);
1249 if (NETCONNTYPE_GROUP(netconn_type(
sock->conn)) == NETCONN_TCP) {
1251 lwip_recv_tcp_from(
sock,
from, fromlen,
"lwip_recvfrom",
s,
ret);
1257 u16_t datagram_len = 0;
1264 msg.msg_controllen = 0;
1269 msg.msg_namelen = (fromlen ? *fromlen : 0);
1280 *fromlen =
msg.msg_namelen;
1290lwip_read(
int s,
void *
mem,
size_t len)
1296lwip_readv(
int s,
const struct iovec *iov,
int iovcnt)
1301 msg.msg_namelen = 0;
1305 msg.msg_iovlen = iovcnt;
1307 msg.msg_controllen = 0;
1309 return lwip_recvmsg(
s, &
msg, 0);
1321 struct lwip_sock *
sock;
1330 if ((
message->msg_iovlen <= 0) || (
message->msg_iovlen > IOV_MAX)) {
1335 sock = get_socket(
s);
1353 if (NETCONNTYPE_GROUP(netconn_type(
sock->conn)) == NETCONN_TCP) {
1355 int recv_flags =
flags;
1362 if (recvd_local > 0) {
1364 buflen += recvd_local;
1366 if ((recvd_local < 0) || (recvd_local < (
int)
message->msg_iov[
i].iov_len) ||
1371 buflen = recvd_local;
1376 recv_flags |= MSG_DONTWAIT;
1392#if LWIP_UDP || LWIP_RAW
1394 u16_t datagram_len = 0;
1404 if (datagram_len > buflen) {
1410 return (
int)datagram_len;
1422 struct lwip_sock *
sock;
1430 sock = get_socket(
s);
1435 if (NETCONNTYPE_GROUP(netconn_type(
sock->conn)) != NETCONN_TCP) {
1436#if (LWIP_UDP || LWIP_RAW)
1446 write_flags = (
u8_t)(NETCONN_COPY |
1447 ((
flags & MSG_MORE) ? NETCONN_MORE : 0) |
1448 ((
flags & MSG_DONTWAIT) ? NETCONN_DONTBLOCK : 0));
1450 err = netconn_write_partly(
sock->conn,
data,
size, write_flags, &written);
1462 struct lwip_sock *
sock;
1469 sock = get_socket(
s);
1478 LWIP_ERROR(
"lwip_sendmsg: maximum iovs exceeded", (
msg->msg_iovlen > 0) && (
msg->msg_iovlen <= IOV_MAX),
1480 LWIP_ERROR(
"lwip_sendmsg: unsupported flags", (
flags & ~(MSG_DONTWAIT | MSG_MORE)) == 0,
1487 if (NETCONNTYPE_GROUP(netconn_type(
sock->conn)) == NETCONN_TCP) {
1489 write_flags = (
u8_t)(NETCONN_COPY |
1490 ((
flags & MSG_MORE) ? NETCONN_MORE : 0) |
1491 ((
flags & MSG_DONTWAIT) ? NETCONN_DONTBLOCK : 0));
1494 err = netconn_write_vectors_partly(
sock->conn, (
struct netvector *)
msg->msg_iov, (
u16_t)
msg->msg_iovlen, write_flags, &written);
1506#if LWIP_UDP || LWIP_RAW
1513 LWIP_ERROR(
"lwip_sendmsg: invalid msghdr name", (((
msg->msg_name ==
NULL) && (
msg->msg_namelen == 0)) ||
1514 IS_SOCK_ADDR_LEN_VALID(
msg->msg_namelen)),
1519 if (
msg->msg_name) {
1521 SOCKADDR_TO_IPADDR_PORT((
const struct sockaddr *)
msg->msg_name, &chain_buf.addr, remote_port);
1522 netbuf_fromport(&chain_buf) = remote_port;
1524#if LWIP_NETIF_TX_SINGLE_PBUF
1525 for (
i = 0;
i <
msg->msg_iovlen;
i++) {
1529 goto sendmsg_emsgsize;
1532 if (
size > 0xFFFF) {
1534 goto sendmsg_emsgsize;
1542 for (
i = 0;
i <
msg->msg_iovlen;
i++) {
1546#if LWIP_CHECKSUM_ON_COPY
1549 u16_t chksum = ~inet_chksum_pbuf(chain_buf.p);
1550 netbuf_set_chksum(&chain_buf, chksum);
1558 for (
i = 0;
i <
msg->msg_iovlen;
i++) {
1560 if (
msg->msg_iov[
i].iov_len > 0xFFFF) {
1562 goto sendmsg_emsgsize;
1569 p->payload =
msg->msg_iov[
i].iov_base;
1570 p->len =
p->tot_len = (
u16_t)
msg->msg_iov[
i].iov_len;
1572 if (chain_buf.p ==
NULL) {
1573 chain_buf.p = chain_buf.ptr =
p;
1576 if (chain_buf.p->tot_len +
p->len > 0xffff) {
1579 goto sendmsg_emsgsize;
1586 size = netbuf_len(&chain_buf);
1591#if LWIP_IPV4 && LWIP_IPV6
1594 unmap_ipv4_mapped_ipv6(ip_2_ip4(&chain_buf.addr),
ip_2_ip6(&chain_buf.addr));
1604 netbuf_free(&chain_buf);
1611 netbuf_free(&chain_buf);
1626 struct lwip_sock *
sock;
1632 sock = get_socket(
s);
1637 if (NETCONNTYPE_GROUP(netconn_type(
sock->conn)) == NETCONN_TCP) {
1656 LWIP_ERROR(
"lwip_sendto: invalid address", (((to ==
NULL) && (tolen == 0)) ||
1657 (IS_SOCK_ADDR_LEN_VALID(tolen) &&
1658 ((to !=
NULL) && (IS_SOCK_ADDR_TYPE_VALID(to) && IS_SOCK_ADDR_ALIGNED(to))))),
1664#if LWIP_CHECKSUM_ON_COPY
1668 SOCKADDR_TO_IPADDR_PORT(to, &
buf.addr, remote_port);
1673 netbuf_fromport(&
buf) = remote_port;
1682#if LWIP_NETIF_TX_SINGLE_PBUF
1684 if (netbuf_alloc(&
buf, short_size) ==
NULL) {
1687#if LWIP_CHECKSUM_ON_COPY
1688 if (NETCONNTYPE_GROUP(netconn_type(
sock->conn)) != NETCONN_RAW) {
1689 u16_t chksum = LWIP_CHKSUM_COPY(
buf.p->payload,
data, short_size);
1690 netbuf_set_chksum(&
buf, chksum);
1702#if LWIP_IPV4 && LWIP_IPV6
1705 unmap_ipv4_mapped_ipv6(ip_2_ip4(&
buf.addr),
ip_2_ip6(&
buf.addr));
1719 return (
err ==
ERR_OK ? short_size : -1);
1733 conn = netconn_new_with_proto_and_callback(DOMAIN_TO_NETCONN_TYPE(
domain, NETCONN_RAW),
1739 conn = netconn_new_with_callback(DOMAIN_TO_NETCONN_TYPE(
domain,
1740 ((
protocol == IPPROTO_UDPLITE) ? NETCONN_UDPLITE : NETCONN_UDP)),
1741 DEFAULT_SOCKET_EVENTCB);
1744#if LWIP_NETBUF_RECVINFO
1747 conn->flags &= ~NETCONN_FLAG_PKTINFO;
1752 conn = netconn_new_with_callback(DOMAIN_TO_NETCONN_TYPE(
domain, NETCONN_TCP), DEFAULT_SOCKET_EVENTCB);
1769 i = alloc_socket(conn, 0);
1772 netconn_delete(conn);
1776 conn->callback_arg.
socket =
i;
1784lwip_write(
int s,
const void *
data,
size_t size)
1790lwip_writev(
int s,
const struct iovec *iov,
int iovcnt)
1795 msg.msg_namelen = 0;
1799 msg.msg_iovlen = iovcnt;
1801 msg.msg_controllen = 0;
1803 return lwip_sendmsg(
s, &
msg, 0);
1806#if LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL
1809lwip_link_select_cb(
struct lwip_select_cb *select_cb)
1811 LWIP_SOCKET_SELECT_DECL_PROTECT(lev);
1814 LWIP_SOCKET_SELECT_PROTECT(lev);
1817 select_cb->next = select_cb_list;
1818 if (select_cb_list !=
NULL) {
1819 select_cb_list->prev = select_cb;
1821 select_cb_list = select_cb;
1822#if !LWIP_TCPIP_CORE_LOCKING
1828 LWIP_SOCKET_SELECT_UNPROTECT(lev);
1833lwip_unlink_select_cb(
struct lwip_select_cb *select_cb)
1835 LWIP_SOCKET_SELECT_DECL_PROTECT(lev);
1838 LWIP_SOCKET_SELECT_PROTECT(lev);
1839 if (select_cb->next !=
NULL) {
1840 select_cb->next->prev = select_cb->prev;
1842 if (select_cb_list == select_cb) {
1844 select_cb_list = select_cb->next;
1847 select_cb->prev->next = select_cb->next;
1849#if !LWIP_TCPIP_CORE_LOCKING
1853 LWIP_SOCKET_SELECT_UNPROTECT(lev);
1857#if LWIP_SOCKET_SELECT
1873lwip_selscan(
int maxfdp1,
fd_set *readset_in,
fd_set *writeset_in,
fd_set *exceptset_in,
1877 fd_set lreadset, lwriteset, lexceptset;
1878 struct lwip_sock *
sock;
1889 if (!(readset_in &&
FD_ISSET(
i, readset_in)) &&
1890 !(writeset_in &&
FD_ISSET(
i, writeset_in)) &&
1891 !(exceptset_in &&
FD_ISSET(
i, exceptset_in))) {
1896 sock = tryget_socket_unconn_locked(
i);
1898 void *lastdata =
sock->lastdata.pbuf;
1906 if (readset_in &&
FD_ISSET(
i, readset_in) && ((lastdata !=
NULL) || (rcvevent > 0))) {
1912 if (writeset_in &&
FD_ISSET(
i, writeset_in) && (sendevent != 0)) {
1918 if (exceptset_in &&
FD_ISSET(
i, exceptset_in) && (errevent != 0)) {
1931 *readset_out = lreadset;
1932 *writeset_out = lwriteset;
1933 *exceptset_out = lexceptset;
1939#if LWIP_NETCONN_FULLDUPLEX
1945lwip_select_inc_sockets_used_set(
int maxfdp,
fd_set *fdset,
fd_set *used_sockets)
1953 struct lwip_sock *
sock;
1955 sock = tryget_socket_unconn_locked(
i);
1975 lwip_select_inc_sockets_used_set(maxfdp, fdset1, used_sockets);
1976 lwip_select_inc_sockets_used_set(maxfdp, fdset2, used_sockets);
1977 lwip_select_inc_sockets_used_set(maxfdp, fdset3, used_sockets);
1982lwip_select_dec_sockets_used(
int maxfdp,
fd_set *used_sockets)
1988 struct lwip_sock *
sock = tryget_socket_unconn_nouse(
i);
1997#define lwip_select_inc_sockets_used(maxfdp1, readset, writeset, exceptset, used_sockets)
1998#define lwip_select_dec_sockets_used(maxfdp1, used_sockets)
2007 fd_set lreadset, lwriteset, lexceptset;
2011#if LWIP_NETCONN_SEM_PER_THREAD
2014#if LWIP_NETCONN_FULLDUPLEX
2020 maxfdp1, (
void *)readset, (
void *) writeset, (
void *) exceptset,
2024 if ((maxfdp1 < 0) || (maxfdp1 > LWIP_SELECT_MAXNFDS)) {
2029 lwip_select_inc_sockets_used(maxfdp1, readset, writeset, exceptset, &used_sockets);
2033 nready = lwip_selscan(maxfdp1, readset, writeset, exceptset, &lreadset, &lwriteset, &lexceptset);
2038 lwip_select_dec_sockets_used(maxfdp1, &used_sockets);
2040 }
else if (nready > 0) {
2055 API_SELECT_CB_VAR_DECLARE(select_cb);
2056 API_SELECT_CB_VAR_ALLOC(select_cb, set_errno(
ENOMEM); lwip_select_dec_sockets_used(maxfdp1, &used_sockets);
return -1);
2057 memset(&API_SELECT_CB_VAR_REF(select_cb), 0,
sizeof(
struct lwip_select_cb));
2059 API_SELECT_CB_VAR_REF(select_cb).readset = readset;
2060 API_SELECT_CB_VAR_REF(select_cb).writeset = writeset;
2061 API_SELECT_CB_VAR_REF(select_cb).exceptset = exceptset;
2062#if LWIP_NETCONN_SEM_PER_THREAD
2068 lwip_select_dec_sockets_used(maxfdp1, &used_sockets);
2069 API_SELECT_CB_VAR_FREE(select_cb);
2074 lwip_link_select_cb(&API_SELECT_CB_VAR_REF(select_cb));
2079 if ((readset &&
FD_ISSET(
i, readset)) ||
2081 (exceptset &&
FD_ISSET(
i, exceptset))) {
2082 struct lwip_sock *
sock;
2084 sock = tryget_socket_unconn_locked(
i);
2086 sock->select_waiting++;
2087 if (
sock->select_waiting == 0) {
2089 sock->select_waiting--;
2113 nready = lwip_selscan(maxfdp1, readset, writeset, exceptset, &lreadset, &lwriteset, &lexceptset);
2116 }
else if (!nready) {
2122 long msecs_long = ((
timeout->tv_sec * 1000) + ((
timeout->tv_usec + 500) / 1000));
2123 if (msecs_long <= 0) {
2127 msectimeout = (
u32_t)msecs_long;
2132#if LWIP_NETCONN_SEM_PER_THREAD
2140 if ((readset &&
FD_ISSET(
i, readset)) ||
2142 (exceptset &&
FD_ISSET(
i, exceptset))) {
2143 struct lwip_sock *
sock;
2145 sock = tryget_socket_unconn_nouse(
i);
2150 if (
sock->select_waiting > 0) {
2151 sock->select_waiting--;
2163 lwip_unlink_select_cb(&API_SELECT_CB_VAR_REF(select_cb));
2165#if LWIP_NETCONN_SEM_PER_THREAD
2173 API_SELECT_CB_VAR_FREE(select_cb);
2177 lwip_select_dec_sockets_used(maxfdp1, &used_sockets);
2188 nready = lwip_selscan(maxfdp1, readset, writeset, exceptset, &lreadset, &lwriteset, &lexceptset);
2192 lwip_select_dec_sockets_used(maxfdp1, &used_sockets);
2199 lwip_select_dec_sockets_used(maxfdp1, &used_sockets);
2202 *readset = lreadset;
2205 *writeset = lwriteset;
2208 *exceptset = lexceptset;
2216enum lwip_pollscan_opts
2219 LWIP_POLLSCAN_CLEAR = 1,
2222 LWIP_POLLSCAN_INC_WAIT = 2,
2225 LWIP_POLLSCAN_DEC_WAIT = 4
2238lwip_pollscan(
struct pollfd *fds, nfds_t nfds,
enum lwip_pollscan_opts opts)
2242 struct lwip_sock *
sock;
2246 for (fdi = 0; fdi < nfds; fdi++) {
2247 if ((opts & LWIP_POLLSCAN_CLEAR) != 0) {
2255 if (fds[fdi].
fd >= 0 && (fds[fdi].revents &
POLLNVAL) == 0) {
2258 sock = tryget_socket_unconn_locked(fds[fdi].
fd);
2260 void* lastdata =
sock->lastdata.pbuf;
2265 if ((opts & LWIP_POLLSCAN_INC_WAIT) != 0) {
2266 sock->select_waiting++;
2267 if (
sock->select_waiting == 0) {
2269 sock->select_waiting--;
2275 }
else if ((opts & LWIP_POLLSCAN_DEC_WAIT) != 0) {
2278 if (
sock->select_waiting > 0) {
2279 sock->select_waiting--;
2287 if ((fds[fdi].
events &
POLLIN) != 0 && ((lastdata !=
NULL) || (rcvevent > 0))) {
2297 if (errevent != 0) {
2313 if (fds[fdi].revents != 0) {
2322#if LWIP_NETCONN_FULLDUPLEX
2329lwip_poll_inc_sockets_used(
struct pollfd *fds, nfds_t nfds)
2335 for (fdi = 0; fdi < nfds; fdi++) {
2337 tryget_socket_unconn(fds[fdi].
fd);
2344lwip_poll_dec_sockets_used(
struct pollfd *fds, nfds_t nfds)
2350 for (fdi = 0; fdi < nfds; fdi++) {
2351 struct lwip_sock *
sock = tryget_socket_unconn_nouse(fds[fdi].
fd);
2359#define lwip_poll_inc_sockets_used(fds, nfds)
2360#define lwip_poll_dec_sockets_used(fds, nfds)
2369#if LWIP_NETCONN_SEM_PER_THREAD
2374 (
void*)fds, (
int)nfds,
timeout));
2375 LWIP_ERROR(
"lwip_poll: invalid fds", ((fds !=
NULL && nfds > 0) || (fds ==
NULL && nfds == 0)),
2376 set_errno(
EINVAL);
return -1;);
2378 lwip_poll_inc_sockets_used(fds, nfds);
2382 nready = lwip_pollscan(fds, nfds, LWIP_POLLSCAN_CLEAR);
2385 lwip_poll_dec_sockets_used(fds, nfds);
2391 API_SELECT_CB_VAR_DECLARE(select_cb);
2395 goto return_success;
2397 API_SELECT_CB_VAR_ALLOC(select_cb, set_errno(
EAGAIN); lwip_poll_dec_sockets_used(fds, nfds);
return -1);
2398 memset(&API_SELECT_CB_VAR_REF(select_cb), 0,
sizeof(
struct lwip_select_cb));
2405 API_SELECT_CB_VAR_REF(select_cb).poll_fds = fds;
2406 API_SELECT_CB_VAR_REF(select_cb).poll_nfds = nfds;
2407#if LWIP_NETCONN_SEM_PER_THREAD
2413 lwip_poll_dec_sockets_used(fds, nfds);
2414 API_SELECT_CB_VAR_FREE(select_cb);
2419 lwip_link_select_cb(&API_SELECT_CB_VAR_REF(select_cb));
2424 nready = lwip_pollscan(fds, nfds, LWIP_POLLSCAN_INC_WAIT);
2437#if LWIP_NETCONN_SEM_PER_THREAD
2444 nready = lwip_pollscan(fds, nfds, LWIP_POLLSCAN_DEC_WAIT);
2446 lwip_unlink_select_cb(&API_SELECT_CB_VAR_REF(select_cb));
2448#if LWIP_NETCONN_SEM_PER_THREAD
2456 API_SELECT_CB_VAR_FREE(select_cb);
2460 lwip_poll_dec_sockets_used(fds, nfds);
2467 goto return_success;
2473 lwip_poll_dec_sockets_used(fds, nfds);
2483lwip_poll_should_wake(
const struct lwip_select_cb *scb,
int fd,
int has_recvevent,
int has_sendevent,
int has_errevent)
2486 for (fdi = 0; fdi < scb->poll_nfds; fdi++) {
2508#if LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL
2524 int s, check_waiters;
2525 struct lwip_sock *
sock;
2532 s = conn->callback_arg.
socket;
2540 if (conn->callback_arg.
socket < 0) {
2541 if (evt == NETCONN_EVT_RCVPLUS) {
2544 conn->callback_arg.
socket--;
2549 s = conn->callback_arg.
socket;
2553 sock = get_socket(
s);
2565 case NETCONN_EVT_RCVPLUS:
2567 if (
sock->rcvevent > 1) {
2571 case NETCONN_EVT_RCVMINUS:
2575 case NETCONN_EVT_SENDPLUS:
2576 if (
sock->sendevent) {
2579 sock->sendevent = 1;
2581 case NETCONN_EVT_SENDMINUS:
2582 sock->sendevent = 0;
2585 case NETCONN_EVT_ERROR:
2593 if (
sock->select_waiting && check_waiters) {
2595 int has_recvevent, has_sendevent, has_errevent;
2596 has_recvevent =
sock->rcvevent > 0;
2597 has_sendevent =
sock->sendevent != 0;
2598 has_errevent =
sock->errevent != 0;
2601 select_check_waiters(
s, has_recvevent, has_sendevent, has_errevent);
2621static void select_check_waiters(
int s,
int has_recvevent,
int has_sendevent,
int has_errevent)
2623 struct lwip_select_cb *scb;
2624#if !LWIP_TCPIP_CORE_LOCKING
2625 int last_select_cb_ctr;
2631#if !LWIP_TCPIP_CORE_LOCKING
2635 last_select_cb_ctr = select_cb_ctr;
2637 for (scb = select_cb_list; scb !=
NULL; scb = scb->
next) {
2638 if (scb->sem_signalled == 0) {
2642 if (scb->poll_fds !=
NULL) {
2643 do_signal = lwip_poll_should_wake(scb,
s, has_recvevent, has_sendevent, has_errevent);
2646#if LWIP_SOCKET_SELECT && LWIP_SOCKET_POLL
2649#if LWIP_SOCKET_SELECT
2652 if (has_recvevent) {
2653 if (scb->readset &&
FD_ISSET(
s, scb->readset)) {
2657 if (has_sendevent) {
2658 if (!do_signal && scb->writeset &&
FD_ISSET(
s, scb->writeset)) {
2663 if (!do_signal && scb->exceptset &&
FD_ISSET(
s, scb->exceptset)) {
2670 scb->sem_signalled = 1;
2677#if LWIP_TCPIP_CORE_LOCKING
2684 if (last_select_cb_ctr != select_cb_ctr) {
2689 last_select_cb_ctr = select_cb_ctr;
2700lwip_shutdown(
int s,
int how)
2702 struct lwip_sock *
sock;
2704 u8_t shut_rx = 0, shut_tx = 0;
2708 sock = get_socket(
s);
2714 if (NETCONNTYPE_GROUP(netconn_type(
sock->conn)) != NETCONN_TCP) {
2725 if (how == SHUT_RD) {
2727 }
else if (how == SHUT_WR) {
2729 }
else if (how == SHUT_RDWR) {
2737 err = netconn_shutdown(
sock->conn, shut_rx, shut_tx);
2747 struct lwip_sock *
sock;
2748 union sockaddr_aligned saddr;
2753 sock = get_socket(
s);
2766#if LWIP_IPV4 && LWIP_IPV6
2768 if (NETCONNTYPE_ISIPV6(netconn_type(
sock->conn)) &&
2770 ip4_2_ipv4_mapped_ipv6(
ip_2_ip6(&naddr), ip_2_ip4(&naddr));
2775 IPADDR_PORT_TO_SOCKADDR(&saddr, &naddr,
port);
2781 if (*
namelen > IPADDR_SOCKADDR_GET_LEN(&saddr)) {
2782 *
namelen = IPADDR_SOCKADDR_GET_LEN(&saddr);
2804lwip_getsockopt(
int s,
int level,
int optname,
void *optval,
socklen_t *optlen)
2807 struct lwip_sock *
sock = get_socket(
s);
2808#if !LWIP_TCPIP_CORE_LOCKING
2810 LWIP_SETGETSOCKOPT_DATA_VAR_DECLARE(
data);
2817 if ((
NULL == optval) || (
NULL == optlen)) {
2823#if LWIP_TCPIP_CORE_LOCKING
2826 err = lwip_getsockopt_impl(
s,
level, optname, optval, optlen);
2831#if LWIP_MPU_COMPATIBLE
2833 if (*optlen > LWIP_SETGETSOCKOPT_MAXOPTLEN) {
2840 LWIP_SETGETSOCKOPT_DATA_VAR_ALLOC(
data,
sock);
2841 LWIP_SETGETSOCKOPT_DATA_VAR_REF(
data).s =
s;
2842 LWIP_SETGETSOCKOPT_DATA_VAR_REF(
data).level =
level;
2843 LWIP_SETGETSOCKOPT_DATA_VAR_REF(
data).optname = optname;
2844 LWIP_SETGETSOCKOPT_DATA_VAR_REF(
data).optlen = *optlen;
2845#if !LWIP_MPU_COMPATIBLE
2846 LWIP_SETGETSOCKOPT_DATA_VAR_REF(
data).optval.p = optval;
2848 LWIP_SETGETSOCKOPT_DATA_VAR_REF(
data).err = 0;
2849#if LWIP_NETCONN_SEM_PER_THREAD
2852 LWIP_SETGETSOCKOPT_DATA_VAR_REF(
data).completed_sem = &
sock->conn->op_completed;
2854 cberr =
tcpip_callback(lwip_getsockopt_callback, &LWIP_SETGETSOCKOPT_DATA_VAR_REF(
data));
2856 LWIP_SETGETSOCKOPT_DATA_VAR_FREE(
data);
2864 *optlen = LWIP_SETGETSOCKOPT_DATA_VAR_REF(
data).optlen;
2865#if LWIP_MPU_COMPATIBLE
2866 MEMCPY(optval, LWIP_SETGETSOCKOPT_DATA_VAR_REF(
data).optval,
2867 LWIP_SETGETSOCKOPT_DATA_VAR_REF(
data).optlen);
2871 err = LWIP_SETGETSOCKOPT_DATA_VAR_REF(
data).err;
2872 LWIP_SETGETSOCKOPT_DATA_VAR_FREE(
data);
2877 return err ? -1 : 0;
2880#if !LWIP_TCPIP_CORE_LOCKING
2885lwip_getsockopt_callback(
void *
arg)
2887 struct lwip_setgetsockopt_data *
data;
2889 data = (
struct lwip_setgetsockopt_data *)
arg;
2904lwip_sockopt_to_ipopt(
int optname)
2927lwip_getsockopt_impl(
int s,
int level,
int optname,
void *optval,
socklen_t *optlen)
2930 struct lwip_sock *
sock = tryget_socket(
s);
2935#ifdef LWIP_HOOK_SOCKETS_GETSOCKOPT
2936 if (LWIP_HOOK_SOCKETS_GETSOCKOPT(
s,
sock,
level, optname, optval, optlen, &
err)) {
2949 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(
sock, *optlen,
int);
2950 if (NETCONNTYPE_GROUP(
sock->conn->
type) != NETCONN_TCP) {
2969 (NETCONNTYPE_GROUP(
sock->conn->
type) != NETCONN_UDP)) {
2974 optname = lwip_sockopt_to_ipopt(optname);
2976 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(
sock, *optlen,
int);
2979 s, optname, (*(
int *)optval ?
"on" :
"off")));
2983 LWIP_SOCKOPT_CHECK_OPTLEN_CONN(
sock, *optlen,
int);
2984 switch (NETCONNTYPE_GROUP(netconn_type(
sock->conn))) {
2995 *(
int *)optval = netconn_type(
sock->conn);
2997 (
"lwip_getsockopt(%d, SOL_SOCKET, SO_TYPE): unrecognized socket type %d\n",
2998 s, *(
int *)optval));
3001 s, *(
int *)optval));
3005 LWIP_SOCKOPT_CHECK_OPTLEN(
sock, *optlen,
int);
3008 s, *(
int *)optval));
3013 LWIP_SOCKOPT_CHECK_OPTLEN_CONN(
sock, *optlen, LWIP_SO_SNDRCVTIMEO_OPTTYPE);
3014 LWIP_SO_SNDRCVTIMEO_SET(optval, netconn_get_sendtimeout(
sock->conn));
3019 LWIP_SOCKOPT_CHECK_OPTLEN_CONN(
sock, *optlen, LWIP_SO_SNDRCVTIMEO_OPTTYPE);
3020 LWIP_SO_SNDRCVTIMEO_SET(optval, netconn_get_recvtimeout(
sock->conn));
3025 LWIP_SOCKOPT_CHECK_OPTLEN_CONN(
sock, *optlen,
int);
3026 *(
int *)optval = netconn_get_recvbufsize(
sock->conn);
3033 LWIP_SOCKOPT_CHECK_OPTLEN_CONN(
sock, *optlen,
struct linger);
3035 if (conn_linger >= 0) {
3047 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(
sock, *optlen,
int, NETCONN_UDP);
3049 if (udp_is_flag_set(
sock->conn->pcb.udp, UDP_FLAGS_UDPLITE)) {
3055 *(
int *)optval = udp_is_flag_set(
sock->conn->pcb.udp, UDP_FLAGS_NOCHKSUM) ? 1 : 0;
3070 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(
sock, *optlen,
int);
3071 *(
int *)optval =
sock->conn->pcb.ip->ttl;
3073 s, *(
int *)optval));
3076 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(
sock, *optlen,
int);
3077 *(
int *)optval =
sock->conn->pcb.ip->tos;
3079 s, *(
int *)optval));
3081#if LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS && LWIP_UDP
3083 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(
sock, *optlen,
u8_t);
3084 if (NETCONNTYPE_GROUP(netconn_type(
sock->conn)) != NETCONN_UDP) {
3088 *(
u8_t *)optval = udp_get_multicast_ttl(
sock->conn->pcb.udp);
3090 s, *(
int *)optval));
3093 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(
sock, *optlen,
struct in_addr);
3094 if (NETCONNTYPE_GROUP(netconn_type(
sock->conn)) != NETCONN_UDP) {
3098 inet_addr_from_ip4addr((
struct in_addr *)optval, udp_get_multicast_netif_addr(
sock->conn->pcb.udp));
3103 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(
sock, *optlen,
u8_t);
3104 if ((
sock->conn->pcb.udp->flags & UDP_FLAGS_MULTICAST_LOOP) != 0) {
3105 *(
u8_t *)optval = 1;
3107 *(
u8_t *)optval = 0;
3110 s, *(
int *)optval));
3125 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(
sock, *optlen,
int, NETCONN_TCP);
3126 if (
sock->conn->pcb.tcp->
state == LISTEN) {
3132 *(
int *)optval = tcp_nagle_disabled(
sock->conn->pcb.tcp);
3134 s, (*(
int *)optval) ?
"on" :
"off") );
3137 *(
int *)optval = (
int)
sock->conn->pcb.tcp->keep_idle;
3139 s, *(
int *)optval));
3142#if LWIP_TCP_KEEPALIVE
3144 *(
int *)optval = (
int)(
sock->conn->pcb.tcp->keep_idle / 1000);
3146 s, *(
int *)optval));
3149 *(
int *)optval = (
int)(
sock->conn->pcb.tcp->keep_intvl / 1000);
3151 s, *(
int *)optval));
3154 *(
int *)optval = (
int)
sock->conn->pcb.tcp->keep_cnt;
3156 s, *(
int *)optval));
3173 LWIP_SOCKOPT_CHECK_OPTLEN_CONN(
sock, *optlen,
int);
3174 *(
int *)optval = (netconn_get_ipv6only(
sock->conn) ? 1 : 0);
3176 s, *(
int *)optval));
3187#if LWIP_UDP && LWIP_UDPLITE
3189 case IPPROTO_UDPLITE:
3191 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(
sock, *optlen,
int);
3193 if (!NETCONNTYPE_ISUDPLITE(netconn_type(
sock->conn))) {
3198 case UDPLITE_SEND_CSCOV:
3199 *(
int *)optval =
sock->conn->pcb.udp->chksum_len_tx;
3201 s, (*(
int *)optval)) );
3203 case UDPLITE_RECV_CSCOV:
3204 *(
int *)optval =
sock->conn->pcb.udp->chksum_len_rx;
3206 s, (*(
int *)optval)) );
3219#if LWIP_IPV6 && LWIP_RAW
3221 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(
sock, *optlen,
int, NETCONN_RAW);
3222 if (
sock->conn->pcb.raw->chksum_reqd == 0) {
3223 *(
int *)optval = -1;
3225 *(
int *)optval =
sock->conn->pcb.raw->chksum_offset;
3228 s, (*(
int *)optval)) );
3250lwip_setsockopt(
int s,
int level,
int optname,
const void *optval,
socklen_t optlen)
3253 struct lwip_sock *
sock = get_socket(
s);
3254#if !LWIP_TCPIP_CORE_LOCKING
3256 LWIP_SETGETSOCKOPT_DATA_VAR_DECLARE(
data);
3263 if (
NULL == optval) {
3269#if LWIP_TCPIP_CORE_LOCKING
3272 err = lwip_setsockopt_impl(
s,
level, optname, optval, optlen);
3277#if LWIP_MPU_COMPATIBLE
3279 if (optlen > LWIP_SETGETSOCKOPT_MAXOPTLEN) {
3286 LWIP_SETGETSOCKOPT_DATA_VAR_ALLOC(
data,
sock);
3287 LWIP_SETGETSOCKOPT_DATA_VAR_REF(
data).s =
s;
3288 LWIP_SETGETSOCKOPT_DATA_VAR_REF(
data).level =
level;
3289 LWIP_SETGETSOCKOPT_DATA_VAR_REF(
data).optname = optname;
3290 LWIP_SETGETSOCKOPT_DATA_VAR_REF(
data).optlen = optlen;
3291#if LWIP_MPU_COMPATIBLE
3292 MEMCPY(LWIP_SETGETSOCKOPT_DATA_VAR_REF(
data).optval, optval, optlen);
3294 LWIP_SETGETSOCKOPT_DATA_VAR_REF(
data).optval.pc = (
const void *)optval;
3296 LWIP_SETGETSOCKOPT_DATA_VAR_REF(
data).err = 0;
3297#if LWIP_NETCONN_SEM_PER_THREAD
3300 LWIP_SETGETSOCKOPT_DATA_VAR_REF(
data).completed_sem = &
sock->conn->op_completed;
3302 cberr =
tcpip_callback(lwip_setsockopt_callback, &LWIP_SETGETSOCKOPT_DATA_VAR_REF(
data));
3304 LWIP_SETGETSOCKOPT_DATA_VAR_FREE(
data);
3312 err = LWIP_SETGETSOCKOPT_DATA_VAR_REF(
data).err;
3313 LWIP_SETGETSOCKOPT_DATA_VAR_FREE(
data);
3318 return err ? -1 : 0;
3321#if !LWIP_TCPIP_CORE_LOCKING
3326lwip_setsockopt_callback(
void *
arg)
3328 struct lwip_setgetsockopt_data *
data;
3330 data = (
struct lwip_setgetsockopt_data *)
arg;
3348lwip_setsockopt_impl(
int s,
int level,
int optname,
const void *optval,
socklen_t optlen)
3351 struct lwip_sock *
sock = tryget_socket(
s);
3356#ifdef LWIP_HOOK_SOCKETS_SETSOCKOPT
3357 if (LWIP_HOOK_SOCKETS_SETSOCKOPT(
s,
sock,
level, optname, optval, optlen, &
err)) {
3377 (NETCONNTYPE_GROUP(
sock->conn->
type) != NETCONN_UDP)) {
3382 optname = lwip_sockopt_to_ipopt(optname);
3384 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(
sock, optlen,
int);
3385 if (*(
const int *)optval) {
3391 s, optname, (*(
const int *)optval ?
"on" :
"off")));
3400 LWIP_SOCKOPT_CHECK_OPTLEN_CONN(
sock, optlen, LWIP_SO_SNDRCVTIMEO_OPTTYPE);
3401 ms_long = LWIP_SO_SNDRCVTIMEO_GET_MS(optval);
3406 netconn_set_sendtimeout(
sock->conn, ms_long);
3413 LWIP_SOCKOPT_CHECK_OPTLEN_CONN(
sock, optlen, LWIP_SO_SNDRCVTIMEO_OPTTYPE);
3414 ms_long = LWIP_SO_SNDRCVTIMEO_GET_MS(optval);
3419 netconn_set_recvtimeout(
sock->conn, (
u32_t)ms_long);
3425 LWIP_SOCKOPT_CHECK_OPTLEN_CONN(
sock, optlen,
int);
3426 netconn_set_recvbufsize(
sock->conn, *(
const int *)optval);
3432 LWIP_SOCKOPT_CHECK_OPTLEN_CONN(
sock, optlen,
struct linger);
3435 if (lingersec < 0) {
3439 if (lingersec > 0xFFFF) {
3451 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(
sock, optlen,
int, NETCONN_UDP);
3453 if (udp_is_flag_set(
sock->conn->pcb.udp, UDP_FLAGS_UDPLITE)) {
3459 if (*(
const int *)optval) {
3460 udp_set_flags(
sock->conn->pcb.udp, UDP_FLAGS_NOCHKSUM);
3462 udp_clear_flags(
sock->conn->pcb.udp, UDP_FLAGS_NOCHKSUM);
3466 case SO_BINDTODEVICE: {
3467 const struct ifreq *iface;
3470 LWIP_SOCKOPT_CHECK_OPTLEN_CONN(
sock, optlen,
struct ifreq);
3472 iface = (
const struct ifreq *)optval;
3473 if (iface->ifr_name[0] != 0) {
3481 switch (NETCONNTYPE_GROUP(netconn_type(
sock->conn))) {
3484 tcp_bind_netif(
sock->conn->pcb.tcp,
n);
3489 udp_bind_netif(
sock->conn->pcb.udp,
n);
3494 raw_bind_netif(
sock->conn->pcb.raw,
n);
3498 LWIP_ASSERT(
"Unhandled netconn type in SO_BINDTODEVICE", 0);
3515 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(
sock, optlen,
int);
3516 sock->conn->pcb.ip->ttl = (
u8_t)(*(
const int *)optval);
3518 s,
sock->conn->pcb.ip->ttl));
3521 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(
sock, optlen,
int);
3522 sock->conn->pcb.ip->tos = (
u8_t)(*(
const int *)optval);
3524 s,
sock->conn->pcb.ip->tos));
3526#if LWIP_NETBUF_RECVINFO
3528 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(
sock, optlen,
int, NETCONN_UDP);
3529 if (*(
const int *)optval) {
3530 sock->conn->flags |= NETCONN_FLAG_PKTINFO;
3532 sock->conn->flags &= ~NETCONN_FLAG_PKTINFO;
3536#if LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS && LWIP_UDP
3538 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(
sock, optlen,
u8_t, NETCONN_UDP);
3539 udp_set_multicast_ttl(
sock->conn->pcb.udp, (
u8_t)(*(
const u8_t *)optval));
3543 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(
sock, optlen,
struct in_addr, NETCONN_UDP);
3544 inet_addr_to_ip4addr(&if_addr, (
const struct in_addr *)optval);
3545 udp_set_multicast_netif_addr(
sock->conn->pcb.udp, &if_addr);
3549 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(
sock, optlen,
u8_t, NETCONN_UDP);
3550 if (*(
const u8_t *)optval) {
3551 udp_set_flags(
sock->conn->pcb.udp, UDP_FLAGS_MULTICAST_LOOP);
3553 udp_clear_flags(
sock->conn->pcb.udp, UDP_FLAGS_MULTICAST_LOOP);
3564 ip4_addr_t multi_addr;
3565 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(
sock, optlen,
struct ip_mreq, NETCONN_UDP);
3569 if (!lwip_socket_register_membership(
s, &if_addr, &multi_addr)) {
3574 igmp_err = igmp_joingroup(&if_addr, &multi_addr);
3577 igmp_err = igmp_leavegroup(&if_addr, &multi_addr);
3578 lwip_socket_unregister_membership(
s, &if_addr, &multi_addr);
3580 if (igmp_err !=
ERR_OK) {
3598 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(
sock, optlen,
int, NETCONN_TCP);
3599 if (
sock->conn->pcb.tcp->
state == LISTEN) {
3605 if (*(
const int *)optval) {
3606 tcp_nagle_disable(
sock->conn->pcb.tcp);
3608 tcp_nagle_enable(
sock->conn->pcb.tcp);
3611 s, (*(
const int *)optval) ?
"on" :
"off") );
3614 sock->conn->pcb.tcp->keep_idle = (
u32_t)(*(
const int *)optval);
3616 s,
sock->conn->pcb.tcp->keep_idle));
3619#if LWIP_TCP_KEEPALIVE
3621 sock->conn->pcb.tcp->keep_idle = 1000 * (
u32_t)(*(
const int *)optval);
3623 s,
sock->conn->pcb.tcp->keep_idle));
3626 sock->conn->pcb.tcp->keep_intvl = 1000 * (
u32_t)(*(
const int *)optval);
3628 s,
sock->conn->pcb.tcp->keep_intvl));
3631 sock->conn->pcb.tcp->keep_cnt = (
u32_t)(*(
const int *)optval);
3633 s,
sock->conn->pcb.tcp->keep_cnt));
3650 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(
sock, optlen,
int);
3651 if (*(
const int *)optval) {
3652 netconn_set_ipv6only(
sock->conn, 1);
3654 netconn_set_ipv6only(
sock->conn, 0);
3657 s, (netconn_get_ipv6only(
sock->conn) ? 1 : 0)));
3665 ip6_addr_t multi_addr;
3667 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(
sock, optlen,
struct ipv6_mreq, NETCONN_UDP);
3677 if (!lwip_socket_register_mld6_membership(
s, imr->
ipv6mr_interface, &multi_addr)) {
3682 mld6_err = mld6_joingroup_netif(
netif, &multi_addr);
3685 mld6_err = mld6_leavegroup_netif(
netif, &multi_addr);
3688 if (mld6_err !=
ERR_OK) {
3703#if LWIP_UDP && LWIP_UDPLITE
3705 case IPPROTO_UDPLITE:
3707 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(
sock, optlen,
int);
3709 if (!NETCONNTYPE_ISUDPLITE(netconn_type(
sock->conn))) {
3714 case UDPLITE_SEND_CSCOV:
3715 if ((*(
const int *)optval != 0) && ((*(
const int *)optval < 8) || (*(
const int *)optval > 0xffff))) {
3717 sock->conn->pcb.udp->chksum_len_tx = 8;
3719 sock->conn->pcb.udp->chksum_len_tx = (
u16_t) * (
const int *)optval;
3722 s, (*(
const int *)optval)) );
3724 case UDPLITE_RECV_CSCOV:
3725 if ((*(
const int *)optval != 0) && ((*(
const int *)optval < 8) || (*(
const int *)optval > 0xffff))) {
3727 sock->conn->pcb.udp->chksum_len_rx = 8;
3729 sock->conn->pcb.udp->chksum_len_rx = (
u16_t) * (
const int *)optval;
3732 s, (*(
const int *)optval)) );
3745#if LWIP_IPV6 && LWIP_RAW
3754 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(
sock, optlen,
int, NETCONN_RAW);
3755 if (*(
const int *)optval < 0) {
3756 sock->conn->pcb.raw->chksum_reqd = 0;
3757 }
else if (*(
const int *)optval & 1) {
3762 sock->conn->pcb.raw->chksum_reqd = 1;
3763 sock->conn->pcb.raw->chksum_offset = (
u16_t) * (
const int *)optval;
3766 s,
sock->conn->pcb.raw->chksum_reqd));
3788lwip_ioctl(
int s,
long cmd,
void *argp)
3790 struct lwip_sock *
sock = get_socket(
s);
3801#if LWIP_SO_RCVBUF || LWIP_FIONREAD_LINUXMODE
3808#if LWIP_FIONREAD_LINUXMODE
3809 if (NETCONNTYPE_GROUP(netconn_type(
sock->conn)) != NETCONN_TCP) {
3811 if (
sock->lastdata.netbuf) {
3812 nb =
sock->lastdata.netbuf;
3813 *((
int *)argp) = nb->p->tot_len;
3816 err_t err = netconn_recv_udp_raw_netbuf_flags(
sock->conn, &rxbuf, NETCONN_DONTBLOCK);
3820 sock->lastdata.netbuf = rxbuf;
3821 *((
int *)argp) = rxbuf->p->tot_len;
3832 if (recv_avail < 0) {
3837 if (
sock->lastdata.netbuf) {
3838 if (NETCONNTYPE_GROUP(netconn_type(
sock->conn)) == NETCONN_TCP) {
3839 recv_avail +=
sock->lastdata.pbuf->tot_len;
3841 recv_avail +=
sock->lastdata.netbuf->p->tot_len;
3844 *((
int *)argp) = recv_avail;
3857 if (argp && *(
int *)argp) {
3860 netconn_set_nonblocking(
sock->conn,
val);
3881lwip_fcntl(
int s,
int cmd,
int val)
3883 struct lwip_sock *
sock = get_socket(
s);
3896 if (NETCONNTYPE_GROUP(netconn_type(
sock->conn)) == NETCONN_TCP) {
3897#if LWIP_TCPIP_CORE_LOCKING
3906 if (
sock->conn->pcb.tcp) {
3907 if (!(
sock->conn->pcb.tcp->flags & TF_RXCLOSED)) {
3910 if (!(
sock->conn->pcb.tcp->flags & TF_FIN)) {
3915#if LWIP_TCPIP_CORE_LOCKING
3949#if LWIP_COMPAT_SOCKETS == 2 && LWIP_POSIX_SOCKETS_IO_NAMES
3951fcntl(
int s,
int cmd, ...)
3959 return lwip_fcntl(
s,
cmd,
val);
3975 ret = ip4addr_ntoa_r((
const ip4_addr_t *)
src,
dst, size_int);
3983 ret = ip6addr_ntoa_r((
const ip6_addr_t *)
src,
dst, size_int);
3997lwip_inet_pton(
int af,
const char *
src,
void *
dst)
4003 err = ip4addr_aton(
src, (ip4_addr_t *)
dst);
4034lwip_socket_register_membership(
int s,
const ip4_addr_t *if_addr,
const ip4_addr_t *multi_addr)
4036 struct lwip_sock *
sock = get_socket(
s);
4043 for (
i = 0;
i < LWIP_SOCKET_MAX_MEMBERSHIPS;
i++) {
4044 if (socket_ipv4_multicast_memberships[
i].
sock ==
NULL) {
4045 socket_ipv4_multicast_memberships[
i].sock =
sock;
4046 ip4_addr_copy(socket_ipv4_multicast_memberships[
i].if_addr, *if_addr);
4047 ip4_addr_copy(socket_ipv4_multicast_memberships[
i].multi_addr, *multi_addr);
4062lwip_socket_unregister_membership(
int s,
const ip4_addr_t *if_addr,
const ip4_addr_t *multi_addr)
4064 struct lwip_sock *
sock = get_socket(
s);
4071 for (
i = 0;
i < LWIP_SOCKET_MAX_MEMBERSHIPS;
i++) {
4072 if ((socket_ipv4_multicast_memberships[
i].
sock ==
sock) &&
4073 ip4_addr_eq(&socket_ipv4_multicast_memberships[
i].if_addr, if_addr) &&
4074 ip4_addr_eq(&socket_ipv4_multicast_memberships[
i].multi_addr, multi_addr)) {
4075 socket_ipv4_multicast_memberships[
i].sock =
NULL;
4076 ip4_addr_set_zero(&socket_ipv4_multicast_memberships[
i].if_addr);
4077 ip4_addr_set_zero(&socket_ipv4_multicast_memberships[
i].multi_addr);
4089lwip_socket_drop_registered_memberships(
int s)
4091 struct lwip_sock *
sock = get_socket(
s);
4098 for (
i = 0;
i < LWIP_SOCKET_MAX_MEMBERSHIPS;
i++) {
4099 if (socket_ipv4_multicast_memberships[
i].
sock ==
sock) {
4101 ip_addr_copy_from_ip4(multi_addr, socket_ipv4_multicast_memberships[
i].multi_addr);
4102 ip_addr_copy_from_ip4(if_addr, socket_ipv4_multicast_memberships[
i].if_addr);
4103 socket_ipv4_multicast_memberships[
i].sock =
NULL;
4104 ip4_addr_set_zero(&socket_ipv4_multicast_memberships[
i].if_addr);
4105 ip4_addr_set_zero(&socket_ipv4_multicast_memberships[
i].multi_addr);
4107 netconn_join_leave_group(
sock->conn, &multi_addr, &if_addr, NETCONN_LEAVE);
4122lwip_socket_register_mld6_membership(
int s,
unsigned int if_idx,
const ip6_addr_t *multi_addr)
4124 struct lwip_sock *
sock = get_socket(
s);
4131 for (
i = 0;
i < LWIP_SOCKET_MAX_MEMBERSHIPS;
i++) {
4132 if (socket_ipv6_multicast_memberships[
i].
sock ==
NULL) {
4133 socket_ipv6_multicast_memberships[
i].sock =
sock;
4134 socket_ipv6_multicast_memberships[
i].if_idx = (
u8_t)if_idx;
4135 ip6_addr_copy(socket_ipv6_multicast_memberships[
i].multi_addr, *multi_addr);
4150lwip_socket_unregister_mld6_membership(
int s,
unsigned int if_idx,
const ip6_addr_t *multi_addr)
4152 struct lwip_sock *
sock = get_socket(
s);
4159 for (
i = 0;
i < LWIP_SOCKET_MAX_MEMBERSHIPS;
i++) {
4160 if ((socket_ipv6_multicast_memberships[
i].
sock ==
sock) &&
4161 (socket_ipv6_multicast_memberships[
i].if_idx == if_idx) &&
4162 ip6_addr_eq(&socket_ipv6_multicast_memberships[
i].multi_addr, multi_addr)) {
4163 socket_ipv6_multicast_memberships[
i].sock =
NULL;
4165 ip6_addr_set_zero(&socket_ipv6_multicast_memberships[
i].multi_addr);
4177lwip_socket_drop_registered_mld6_memberships(
int s)
4179 struct lwip_sock *
sock = get_socket(
s);
4186 for (
i = 0;
i < LWIP_SOCKET_MAX_MEMBERSHIPS;
i++) {
4187 if (socket_ipv6_multicast_memberships[
i].
sock ==
sock) {
4192 if_idx = socket_ipv6_multicast_memberships[
i].if_idx;
4194 socket_ipv6_multicast_memberships[
i].sock =
NULL;
4196 ip6_addr_set_zero(&socket_ipv6_multicast_memberships[
i].multi_addr);
4198 netconn_join_leave_group_netif(
sock->conn, &multi_addr, if_idx, NETCONN_LEAVE);
_STLP_DECLSPEC complex< float > _STLP_CALL sin(const complex< float > &)
static struct sockaddr_in sa
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
BOOL netconn_send(struct netconn *conn, const void *msg, size_t len, int *sent)
#define SYS_ARCH_UNPROTECT(lev)
#define SYS_ARCH_PROTECT(lev)
#define SYS_ARCH_DECL_PROTECT(lev)
int err_to_errno(err_t err)
#define LWIP_DEBUGF(debug, message)
#define LWIP_ERROR(message, expression, handler)
#define LWIP_ASSERT(message, assertion)
#define ip_set_option(pcb, opt)
#define ip_get_option(pcb, opt)
#define ip_reset_option(pcb, opt)
#define LOCK_TCPIP_CORE()
#define UNLOCK_TCPIP_CORE()
GLuint GLuint GLsizei GLenum type
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLenum GLuint GLenum GLsizei const GLchar * buf
GLenum const GLvoid * addr
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define LWIP_UNUSED_ARG(x)
#define LWIP_CONST_CAST(target_type, val)
#define LWIP_ASSERT_CORE_LOCKED()
#define LWIP_MPU_COMPATIBLE
#define LWIP_SOCKET_OFFSET
err_t tcpip_callback(tcpip_callback_fn function, void *ctx)
struct netif * netif_find(const char *name)
struct netif * netif_get_by_index(u8_t idx)
void pbuf_cat(struct pbuf *h, struct pbuf *t)
struct pbuf * pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type)
u8_t pbuf_free(struct pbuf *p)
u16_t pbuf_copy_partial(const struct pbuf *buf, void *dataptr, u16_t len, u16_t offset)
void sys_sem_free(sys_sem_t *sem)
u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
void sys_sem_signal(sys_sem_t *sem)
err_t sys_sem_new(sys_sem_t *sem, u8_t count)
#define IP_IS_V6_VAL(ipaddr)
#define IP_SET_TYPE(ipaddr, iptype)
#define ip_addr_set_any(is_ipv6, ipaddr)
#define IP_SET_TYPE_VAL(ipaddr, iptype)
#define IP_IS_V4_VAL(ipaddr)
#define ip_addr_copy_from_ip6(dest, src)
#define ip_addr_debug_print_val(debug, ipaddr)
#define LWIP_NETCONN_THREAD_SEM_GET()
#define MEMCPY(DST, SRC, BYTES)
#define memcpy(s1, s2, n)
struct pbuf * pbuf_free_header(struct pbuf *q, u16_t size)
static void accepted(enum accept_stat, struct rpc_err *)
struct in_addr imr_interface
struct in_addr imr_multiaddr
IN6_ADDR ipv6mr_multiaddr
volatile unsigned char state
#define SYS_ARCH_GET(var, ret)
void int int ULONGLONG int va_list * ap
#define FD_ISSET(fd, set)
#define IP_MULTICAST_LOOP
#define IP_ADD_MEMBERSHIP
#define IP_DROP_MEMBERSHIP