Lines Matching refs:sock

131 #define SOCK_ADDR_TYPE_MATCH(name, sock) \
132 ((((name)->sa_family == AF_INET) && !(NETCONNTYPE_ISIPV6((sock)->conn->type))) || \
133 (((name)->sa_family == AF_INET6) && (NETCONNTYPE_ISIPV6((sock)->conn->type))))
146 #define SOCK_ADDR_TYPE_MATCH(name, sock) 1
155 #define SOCK_ADDR_TYPE_MATCH(name, sock) 1
165 #define SOCK_ADDR_TYPE_MATCH_OR_UNSPEC(name, sock) (((name)->sa_family == AF_UNSPEC) || \
166 SOCK_ADDR_TYPE_MATCH(name, sock))
170 #define LWIP_SOCKOPT_CHECK_OPTLEN(sock, optlen, opttype) do { if ((optlen) < sizeof(opttype)) { done_socket(sock); return EINVAL; }}while(0)
171 #define LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, opttype) do { \
172 LWIP_SOCKOPT_CHECK_OPTLEN(sock, optlen, opttype); \
173 if ((sock)->conn == NULL) { done_socket(sock); return EINVAL; } }while(0)
174 #define LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, opttype) do { \
175 LWIP_SOCKOPT_CHECK_OPTLEN(sock, optlen, opttype); \
176 if (((sock)->conn == NULL) || ((sock)->conn->pcb.tcp == NULL)) { done_socket(sock); return EINVAL; } }while(0)
177 #define LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, opttype, netconntype) do { \
178 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, opttype); \
179 if (NETCONNTYPE_GROUP(netconn_type((sock)->conn)) != netconntype) { done_socket(sock); return ENOPROTOOPT; } }while(0)
186 #define LWIP_SETGETSOCKOPT_DATA_VAR_ALLOC(name, sock) do { \
189 sock_set_errno(sock, ENOMEM); \
190 done_socket(sock); \
194 #define LWIP_SETGETSOCKOPT_DATA_VAR_ALLOC(name, sock)
234 struct lwip_sock *sock;
253 struct lwip_sock *sock;
308 static int free_socket_locked(struct lwip_sock *sock, int is_tcp, struct netconn **conn,
341 /* Thread-safe increment of sock->fd_used, with overflow check */
343 sock_inc_used(struct lwip_sock *sock)
348 LWIP_ASSERT("sock != NULL", sock != NULL);
351 if (sock->fd_free_pending) {
355 ++sock->fd_used;
357 LWIP_ASSERT("sock->fd_used != 0", sock->fd_used != 0);
365 sock_inc_used_locked(struct lwip_sock *sock)
367 LWIP_ASSERT("sock != NULL", sock != NULL);
369 if (sock->fd_free_pending) {
370 LWIP_ASSERT("sock->fd_used != 0", sock->fd_used != 0);
374 ++sock->fd_used;
375 LWIP_ASSERT("sock->fd_used != 0", sock->fd_used != 0);
379 /* In full-duplex mode,sock->fd_used != 0 prevents a socket descriptor from being
385 done_socket(struct lwip_sock *sock)
392 LWIP_ASSERT("sock != NULL", sock != NULL);
395 LWIP_ASSERT("sock->fd_used > 0", sock->fd_used > 0);
396 if (--sock->fd_used == 0) {
397 if (sock->fd_free_pending) {
399 sock->fd_used = 1;
400 is_tcp = sock->fd_free_pending & LWIP_SOCK_FD_FREE_TCP;
401 freed = free_socket_locked(sock, is_tcp, &conn, &lastdata);
412 #define sock_inc_used(sock) 1
413 #define sock_inc_used_locked(sock) 1
414 #define done_socket(sock)
470 struct lwip_sock *sock = tryget_socket_unconn(fd);
471 if (sock != NULL) {
472 if (sock->conn) {
473 return sock;
475 done_socket(sock);
489 struct lwip_sock *sock = tryget_socket(fd);
490 if (!sock) {
497 return sock;
551 * @param sock the socket to free
557 free_socket_locked(struct lwip_sock *sock, int is_tcp, struct netconn **conn,
561 LWIP_ASSERT("sock->fd_used > 0", sock->fd_used > 0);
562 sock->fd_used--;
563 if (sock->fd_used > 0) {
564 sock->fd_free_pending = LWIP_SOCK_FD_FREE_FREE | (is_tcp ? LWIP_SOCK_FD_FREE_TCP : 0);
571 *lastdata = sock->lastdata;
572 sock->lastdata.pbuf = NULL;
573 *conn = sock->conn;
574 sock->conn = NULL;
599 * @param sock the socket to free
603 free_socket(struct lwip_sock *sock, int is_tcp)
613 freed = free_socket_locked(sock, is_tcp, &conn, &lastdata);
615 /* don't use 'sock' after this line, as another task might have allocated it */
631 struct lwip_sock *sock, *nsock;
641 sock = get_socket(s);
642 if (!sock) {
647 err = netconn_accept(sock->conn, &newconn);
650 if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) {
651 sock_set_errno(sock, EOPNOTSUPP);
653 sock_set_errno(sock, EINVAL);
655 sock_set_errno(sock, err_to_errno(err));
657 done_socket(sock);
665 sock_set_errno(sock, ENFILE);
666 done_socket(sock);
701 sock_set_errno(sock, err_to_errno(err));
702 done_socket(sock);
712 LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d) returning new sock=%d addr=", s, newsock));
716 LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d) returning new sock=%d", s, newsock));
719 sock_set_errno(sock, 0);
720 done_socket(sock);
728 struct lwip_sock *sock;
733 sock = get_socket(s);
734 if (!sock) {
738 if (!SOCK_ADDR_TYPE_MATCH(name, sock)) {
740 sock_set_errno(sock, err_to_errno(ERR_VAL));
741 done_socket(sock);
748 sock_set_errno(sock, err_to_errno(ERR_ARG)); done_socket(sock); return -1;);
764 err = netconn_bind(sock->conn, &local_addr, local_port);
768 sock_set_errno(sock, err_to_errno(err));
769 done_socket(sock);
774 sock_set_errno(sock, 0);
775 done_socket(sock);
793 struct lwip_sock *sock;
799 sock = get_socket(s);
800 if (!sock) {
804 if (sock->conn != NULL) {
805 is_tcp = NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP;
807 LWIP_ASSERT("sock->lastdata == NULL", sock->lastdata.pbuf == NULL);
819 err = netconn_prepare_delete(sock->conn);
821 sock_set_errno(sock, err_to_errno(err));
822 done_socket(sock);
826 free_socket(sock, is_tcp);
845 struct lwip_sock *sock;
848 sock = get_socket(s);
849 if (!sock) {
853 if (!SOCK_ADDR_TYPE_MATCH_OR_UNSPEC(name, sock)) {
855 sock_set_errno(sock, err_to_errno(ERR_VAL));
856 done_socket(sock);
863 err = netconn_disconnect(sock->conn);
871 sock_set_errno(sock, err_to_errno(ERR_ARG)); done_socket(sock); return -1;);
886 err = netconn_connect(sock->conn, &remote_addr, remote_port);
891 sock_set_errno(sock, err_to_errno(err));
892 done_socket(sock);
897 sock_set_errno(sock, 0);
898 done_socket(sock);
913 struct lwip_sock *sock;
918 sock = get_socket(s);
919 if (!sock) {
926 err = netconn_listen_with_backlog(sock->conn, (u8_t)backlog);
930 if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) {
931 sock_set_errno(sock, EOPNOTSUPP);
933 sock_set_errno(sock, err_to_errno(err));
935 done_socket(sock);
939 sock_set_errno(sock, 0);
940 done_socket(sock);
947 * Keeps sock->lastdata for peeking or partly copying.
950 lwip_recv_tcp(struct lwip_sock *sock, void *mem, size_t len, int flags)
956 LWIP_ASSERT("no socket given", sock != NULL);
957 LWIP_ASSERT("this should be checked internally", NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP);
968 LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recv_tcp: top while sock->lastdata=%p\n", (void *)sock->lastdata.pbuf));
970 if (sock->lastdata.pbuf) {
971 p = sock->lastdata.pbuf;
975 err = netconn_recv_tcp_pbuf_flags(sock->conn, &p, apiflags);
988 sock_set_errno(sock, err_to_errno(err));
996 sock->lastdata.pbuf = p;
1027 /* If so, it should be saved in the sock structure for the next recv call.
1029 sock->lastdata.pbuf = pbuf_free_header(p, copylen);
1030 LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recv_tcp: lastdata now pbuf=%p\n", (void *)sock->lastdata.pbuf));
1032 sock->lastdata.pbuf = NULL;
1044 netconn_tcp_recvd(sock->conn, (size_t)recvd);
1046 sock_set_errno(sock, 0);
1087 lwip_recv_tcp_from(struct lwip_sock *sock, struct sockaddr *from, socklen_t *fromlen, const char *dbg_fn, int dbg_s, ssize_t dbg_ret)
1089 if (sock == NULL) {
1103 err_t err = netconn_getaddr(sock->conn, &tmpaddr, &port, 0);
1108 return lwip_sock_make_addr(sock->conn, &tmpaddr, port, from, fromlen);
1116 * Keeps sock->lastdata for peeking.
1119 lwip_recvfrom_udp_raw(struct lwip_sock *sock, int flags, struct msghdr *msg, u16_t *datagram_len, int dbg_s)
1136 LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom_udp_raw[UDP/RAW]: top sock->lastdata=%p\n", (void *)sock->lastdata.netbuf));
1138 buf = sock->lastdata.netbuf;
1142 err = netconn_recv_udp_raw_netbuf_flags(sock->conn, &buf, apiflags);
1150 sock->lastdata.netbuf = buf;
1180 lwip_sock_make_addr(sock->conn, netbuf_fromaddr(buf), netbuf_fromport(buf),
1220 sock->lastdata.netbuf = NULL;
1245 struct lwip_sock *sock;
1249 sock = get_socket(s);
1250 if (!sock) {
1254 if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {
1255 ret = lwip_recv_tcp(sock, mem, len, flags);
1256 lwip_recv_tcp_from(sock, from, fromlen, "lwip_recvfrom", s, ret);
1257 done_socket(sock);
1275 err = lwip_recvfrom_udp_raw(sock, flags, &msg, &datagram_len, s);
1279 sock_set_errno(sock, err_to_errno(err));
1280 done_socket(sock);
1289 sock_set_errno(sock, 0);
1290 done_socket(sock);
1326 struct lwip_sock *sock;
1340 sock = get_socket(s);
1341 if (!sock) {
1351 sock_set_errno(sock, err_to_errno(ERR_VAL));
1352 done_socket(sock);
1358 if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {
1366 ssize_t recvd_local = lwip_recv_tcp(sock, message->msg_iov[i].iov_base, message->msg_iov[i].iov_len, recv_flags);
1385 sock_set_errno(sock, 0);
1388 done_socket(sock);
1391 sock_set_errno(sock, err_to_errno(ERR_ARG));
1392 done_socket(sock);
1401 err = lwip_recvfrom_udp_raw(sock, flags, message, &datagram_len, s);
1405 sock_set_errno(sock, err_to_errno(err));
1406 done_socket(sock);
1413 sock_set_errno(sock, 0);
1414 done_socket(sock);
1418 sock_set_errno(sock, err_to_errno(ERR_ARG));
1419 done_socket(sock);
1427 struct lwip_sock *sock;
1435 sock = get_socket(s);
1436 if (!sock) {
1440 if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) {
1442 done_socket(sock);
1449 sock_set_errno(sock, err_to_errno(ERR_ARG));
1450 done_socket(sock);
1459 err = netconn_write_partly(sock->conn, data, size, write_flags, &written);
1462 sock_set_errno(sock, err_to_errno(err));
1463 done_socket(sock);
1482 struct lwip_sock *sock;
1489 sock = get_socket(s);
1490 if (!sock) {
1495 sock_set_errno(sock, err_to_errno(ERR_ARG)); done_socket(sock); return -1;);
1497 sock_set_errno(sock, err_to_errno(ERR_ARG)); done_socket(sock); return -1;);
1499 sock_set_errno(sock, EMSGSIZE); done_socket(sock); return -1;);
1501 sock_set_errno(sock, EOPNOTSUPP); done_socket(sock); return -1;);
1507 if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {
1514 err = netconn_write_vectors_partly(sock->conn, (struct netvector *)msg->msg_iov, (u16_t)msg->msg_iovlen, write_flags, &written);
1515 sock_set_errno(sock, err_to_errno(err));
1516 done_socket(sock);
1520 sock_set_errno(sock, err_to_errno(ERR_ARG));
1521 done_socket(sock);
1535 sock_set_errno(sock, err_to_errno(ERR_ARG)); done_socket(sock); return -1;);
1620 err = netconn_send(sock->conn, &chain_buf);
1626 sock_set_errno(sock, err_to_errno(err));
1627 done_socket(sock);
1630 sock_set_errno(sock, EMSGSIZE);
1632 done_socket(sock);
1636 sock_set_errno(sock, err_to_errno(ERR_ARG));
1637 done_socket(sock);
1658 struct lwip_sock *sock;
1664 sock = get_socket(s);
1665 if (!sock) {
1669 if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {
1671 done_socket(sock);
1675 sock_set_errno(sock, err_to_errno(ERR_ARG));
1676 done_socket(sock);
1683 sock_set_errno(sock, EMSGSIZE);
1684 done_socket(sock);
1691 sock_set_errno(sock, err_to_errno(ERR_ARG)); done_socket(sock); return -1;);
1703 ip_addr_set_any(NETCONNTYPE_ISIPV6(netconn_type(sock->conn)), &buf.addr);
1720 if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_RAW) {
1743 err = netconn_send(sock->conn, &buf);
1749 sock_set_errno(sock, err_to_errno(err));
1750 done_socket(sock);
1910 struct lwip_sock *sock;
1928 sock = tryget_socket_unconn_locked(i);
1929 if (sock != NULL) {
1930 void *lastdata = sock->lastdata.pbuf;
1931 s16_t rcvevent = sock->rcvevent;
1932 u16_t sendevent = sock->sendevent;
1933 u16_t errevent = sock->errevent;
1955 done_socket(sock);
1985 struct lwip_sock *sock;
1987 sock = tryget_socket_unconn_locked(i);
1988 if (sock != NULL) {
2020 struct lwip_sock *sock = tryget_socket_unconn_nouse(i);
2021 LWIP_ASSERT("socket gone at the end of select", sock != NULL);
2022 if (sock != NULL) {
2023 done_socket(sock);
2114 struct lwip_sock *sock;
2116 sock = tryget_socket_unconn_locked(i);
2117 if (sock != NULL) {
2118 sock->select_waiting++;
2119 if (sock->select_waiting == 0) {
2121 sock->select_waiting--;
2125 done_socket(sock);
2130 done_socket(sock);
2175 struct lwip_sock *sock;
2177 sock = tryget_socket_unconn_nouse(i);
2178 LWIP_ASSERT("socket gone at the end of select", sock != NULL);
2179 if (sock != NULL) {
2181 LWIP_ASSERT("sock->select_waiting > 0", sock->select_waiting > 0);
2182 if (sock->select_waiting > 0) {
2183 sock->select_waiting--;
2274 struct lwip_sock *sock;
2290 sock = tryget_socket_unconn_locked(fds[fdi].fd);
2291 if (sock != NULL) {
2292 void* lastdata = sock->lastdata.pbuf;
2293 s16_t rcvevent = sock->rcvevent;
2294 u16_t sendevent = sock->sendevent;
2295 u16_t errevent = sock->errevent;
2298 sock->select_waiting++;
2299 if (sock->select_waiting == 0) {
2301 sock->select_waiting--;
2304 done_socket(sock);
2309 LWIP_ASSERT("sock->select_waiting > 0", sock->select_waiting > 0);
2310 if (sock->select_waiting > 0) {
2311 sock->select_waiting--;
2315 done_socket(sock);
2383 struct lwip_sock *sock = tryget_socket_unconn_nouse(fds[fdi].fd);
2384 if (sock != NULL) {
2385 done_socket(sock);
2557 struct lwip_sock *sock;
2575 lwip_accept adjusts sock->recvevent if conn->socket < -1 */
2585 sock = get_socket(s);
2586 if (!sock) {
2598 sock->rcvevent++;
2599 if (sock->rcvevent > 1) {
2604 sock->rcvevent--;
2608 if (sock->sendevent) {
2611 sock->sendevent = 1;
2614 sock->sendevent = 0;
2618 sock->errevent = 1;
2625 if (sock->select_waiting && check_waiters) {
2628 has_recvevent = sock->rcvevent > 0;
2629 has_sendevent = sock->sendevent != 0;
2630 has_errevent = sock->errevent != 0;
2638 done_socket(sock);
2735 struct lwip_sock *sock;
2741 sock = get_socket(s);
2742 if (!sock) {
2746 if (sock->conn != NULL) {
2747 if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) {
2748 sock_set_errno(sock, EOPNOTSUPP);
2749 done_socket(sock);
2753 sock_set_errno(sock, ENOTCONN);
2754 done_socket(sock);
2766 sock_set_errno(sock, EINVAL);
2767 done_socket(sock);
2770 err = netconn_shutdown(sock->conn, shut_rx, shut_tx);
2772 sock_set_errno(sock, err_to_errno(err));
2773 done_socket(sock);
2780 struct lwip_sock *sock;
2786 sock = get_socket(s);
2787 if (!sock) {
2792 err = netconn_getaddr(sock->conn, &naddr, &port, local);
2794 sock_set_errno(sock, err_to_errno(err));
2795 done_socket(sock);
2801 if (NETCONNTYPE_ISIPV6(netconn_type(sock->conn)) &&
2819 sock_set_errno(sock, 0);
2820 done_socket(sock);
2840 struct lwip_sock *sock = get_socket(s);
2846 if (!sock) {
2851 sock_set_errno(sock, EFAULT);
2852 done_socket(sock);
2867 sock_set_errno(sock, ENOBUFS);
2868 done_socket(sock);
2873 LWIP_SETGETSOCKOPT_DATA_VAR_ALLOC(data, sock);
2885 LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).completed_sem = &sock->conn->op_completed;
2890 sock_set_errno(sock, err_to_errno(cberr));
2891 done_socket(sock);
2908 sock_set_errno(sock, err);
2909 done_socket(sock);
2963 struct lwip_sock *sock = tryget_socket(s);
2964 if (!sock) {
2969 if (LWIP_HOOK_SOCKETS_GETSOCKOPT(s, sock, level, optname, optval, optlen, &err)) {
2982 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int);
2983 if (NETCONNTYPE_GROUP(sock->conn->type) != NETCONN_TCP) {
2984 done_socket(sock);
2987 if ((sock->conn->pcb.tcp != NULL) && (sock->conn->pcb.tcp->state == LISTEN)) {
3002 (NETCONNTYPE_GROUP(sock->conn->type) != NETCONN_UDP)) {
3003 done_socket(sock);
3009 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int);
3010 *(int *)optval = ip_get_option(sock->conn->pcb.ip, optname);
3016 LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, int);
3017 switch (NETCONNTYPE_GROUP(netconn_type(sock->conn))) {
3028 *(int *)optval = netconn_type(sock->conn);
3032 } /* switch (netconn_type(sock->conn)) */
3038 LWIP_SOCKOPT_CHECK_OPTLEN(sock, *optlen, int);
3039 *(int *)optval = err_to_errno(netconn_err(sock->conn));
3046 LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, LWIP_SO_SNDRCVTIMEO_OPTTYPE);
3047 LWIP_SO_SNDRCVTIMEO_SET(optval, netconn_get_sendtimeout(sock->conn));
3052 LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, LWIP_SO_SNDRCVTIMEO_OPTTYPE);
3053 LWIP_SO_SNDRCVTIMEO_SET(optval, netconn_get_recvtimeout(sock->conn));
3058 LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, int);
3059 *(int *)optval = netconn_get_recvbufsize(sock->conn);
3066 LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, struct linger);
3067 conn_linger = sock->conn->linger;
3080 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, *optlen, int, NETCONN_UDP);
3082 if (udp_is_flag_set(sock->conn->pcb.udp, UDP_FLAGS_UDPLITE)) {
3084 done_socket(sock);
3088 *(int *)optval = udp_is_flag_set(sock->conn->pcb.udp, UDP_FLAGS_NOCHKSUM) ? 1 : 0;
3103 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int);
3104 *(int *)optval = sock->conn->pcb.ip->ttl;
3109 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int);
3110 *(int *)optval = sock->conn->pcb.ip->tos;
3116 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, u8_t);
3117 if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_UDP) {
3118 done_socket(sock);
3121 *(u8_t *)optval = udp_get_multicast_ttl(sock->conn->pcb.udp);
3126 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, struct in_addr);
3127 if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_UDP) {
3128 done_socket(sock);
3131 inet_addr_from_ip4addr((struct in_addr *)optval, udp_get_multicast_netif_addr(sock->conn->pcb.udp));
3136 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, u8_t);
3137 if ((sock->conn->pcb.udp->flags & UDP_FLAGS_MULTICAST_LOOP) != 0) {
3158 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, *optlen, int, NETCONN_TCP);
3159 if (sock->conn->pcb.tcp->state == LISTEN) {
3160 done_socket(sock);
3165 *(int *)optval = tcp_nagle_disabled(sock->conn->pcb.tcp);
3170 *(int *)optval = (int)sock->conn->pcb.tcp->keep_idle;
3177 *(int *)optval = (int)(sock->conn->pcb.tcp->keep_idle / 1000);
3182 *(int *)optval = (int)(sock->conn->pcb.tcp->keep_intvl / 1000);
3187 *(int *)optval = (int)sock->conn->pcb.tcp->keep_cnt;
3206 LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, int);
3207 *(int *)optval = (netconn_get_ipv6only(sock->conn) ? 1 : 0);
3224 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int);
3226 if (!NETCONNTYPE_ISUDPLITE(netconn_type(sock->conn))) {
3227 done_socket(sock);
3232 *(int *)optval = sock->conn->pcb.udp->chksum_len_tx;
3237 *(int *)optval = sock->conn->pcb.udp->chksum_len_rx;
3254 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, *optlen, int, NETCONN_RAW);
3255 if (sock->conn->pcb.raw->chksum_reqd == 0) {
3258 *(int *)optval = sock->conn->pcb.raw->chksum_offset;
3278 done_socket(sock);
3286 struct lwip_sock *sock = get_socket(s);
3292 if (!sock) {
3297 sock_set_errno(sock, EFAULT);
3298 done_socket(sock);
3316 sock_set_errno(sock, ENOBUFS);
3317 done_socket(sock);
3322 LWIP_SETGETSOCKOPT_DATA_VAR_ALLOC(data, sock);
3336 LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).completed_sem = &sock->conn->op_completed;
3341 sock_set_errno(sock, err_to_errno(cberr));
3342 done_socket(sock);
3352 sock_set_errno(sock, err);
3353 done_socket(sock);
3387 struct lwip_sock *sock = tryget_socket(s);
3388 if (!sock) {
3393 if (LWIP_HOOK_SOCKETS_SETSOCKOPT(s, sock, level, optname, optval, optlen, &err)) {
3413 (NETCONNTYPE_GROUP(sock->conn->type) != NETCONN_UDP)) {
3414 done_socket(sock);
3420 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int);
3422 ip_set_option(sock->conn->pcb.ip, optname);
3424 ip_reset_option(sock->conn->pcb.ip, optname);
3436 LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, LWIP_SO_SNDRCVTIMEO_OPTTYPE);
3439 done_socket(sock);
3442 netconn_set_sendtimeout(sock->conn, ms_long);
3449 LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, LWIP_SO_SNDRCVTIMEO_OPTTYPE);
3452 done_socket(sock);
3455 netconn_set_recvtimeout(sock->conn, (u32_t)ms_long);
3461 LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, int);
3462 netconn_set_recvbufsize(sock->conn, *(const int *)optval);
3468 LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, struct linger);
3472 done_socket(sock);
3478 sock->conn->linger = (s16_t)lingersec;
3480 sock->conn->linger = -1;
3487 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_UDP);
3489 if (udp_is_flag_set(sock->conn->pcb.udp, UDP_FLAGS_UDPLITE)) {
3491 done_socket(sock);
3496 udp_set_flags(sock->conn->pcb.udp, UDP_FLAGS_NOCHKSUM);
3498 udp_clear_flags(sock->conn->pcb.udp, UDP_FLAGS_NOCHKSUM);
3506 LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, struct ifreq);
3512 done_socket(sock);
3517 switch (NETCONNTYPE_GROUP(netconn_type(sock->conn))) {
3520 tcp_bind_netif(sock->conn->pcb.tcp, n);
3525 udp_bind_netif(sock->conn->pcb.udp, n);
3530 raw_bind_netif(sock->conn->pcb.raw, n);
3551 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int);
3552 sock->conn->pcb.ip->ttl = (u8_t)(*(const int *)optval);
3554 s, sock->conn->pcb.ip->ttl));
3557 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int);
3558 sock->conn->pcb.ip->tos = (u8_t)(*(const int *)optval);
3560 s, sock->conn->pcb.ip->tos));
3564 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_UDP);
3566 sock->conn->flags |= NETCONN_FLAG_PKTINFO;
3568 sock->conn->flags &= ~NETCONN_FLAG_PKTINFO;
3574 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, u8_t, NETCONN_UDP);
3575 udp_set_multicast_ttl(sock->conn->pcb.udp, (u8_t)(*(const u8_t *)optval));
3579 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, struct in_addr, NETCONN_UDP);
3581 udp_set_multicast_netif_addr(sock->conn->pcb.udp, &if_addr);
3585 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, u8_t, NETCONN_UDP);
3587 udp_set_flags(sock->conn->pcb.udp, UDP_FLAGS_MULTICAST_LOOP);
3589 udp_clear_flags(sock->conn->pcb.udp, UDP_FLAGS_MULTICAST_LOOP);
3601 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, struct ip_mreq, NETCONN_UDP);
3634 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_TCP);
3635 if (sock->conn->pcb.tcp->state == LISTEN) {
3636 done_socket(sock);
3642 tcp_nagle_disable(sock->conn->pcb.tcp);
3644 tcp_nagle_enable(sock->conn->pcb.tcp);
3650 sock->conn->pcb.tcp->keep_idle = (u32_t)(*(const int *)optval);
3652 s, sock->conn->pcb.tcp->keep_idle));
3657 sock->conn->pcb.tcp->keep_idle = 1000 * (u32_t)(*(const int *)optval);
3659 s, sock->conn->pcb.tcp->keep_idle));
3662 sock->conn->pcb.tcp->keep_intvl = 1000 * (u32_t)(*(const int *)optval);
3664 s, sock->conn->pcb.tcp->keep_intvl));
3667 sock->conn->pcb.tcp->keep_cnt = (u32_t)(*(const int *)optval);
3669 s, sock->conn->pcb.tcp->keep_cnt));
3686 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int);
3688 netconn_set_ipv6only(sock->conn, 1);
3690 netconn_set_ipv6only(sock->conn, 0);
3693 s, (netconn_get_ipv6only(sock->conn) ? 1 : 0)));
3703 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, struct ipv6_mreq, NETCONN_UDP);
3707 netif = netif_get_by_index((u8_t)imr->ipv6mr_interface, get_net_group_from_ippcb(sock->conn->pcb.ip));
3747 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int);
3749 if (!NETCONNTYPE_ISUDPLITE(netconn_type(sock->conn))) {
3750 done_socket(sock);
3757 sock->conn->pcb.udp->chksum_len_tx = 8;
3759 sock->conn->pcb.udp->chksum_len_tx = (u16_t) * (const int *)optval;
3767 sock->conn->pcb.udp->chksum_len_rx = 8;
3769 sock->conn->pcb.udp->chksum_len_rx = (u16_t) * (const int *)optval;
3789 if (sock->conn->pcb.raw->protocol == IPPROTO_ICMPV6) {
3790 done_socket(sock);
3794 LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_RAW);
3796 sock->conn->pcb.raw->chksum_reqd = 0;
3799 done_socket(sock);
3802 sock->conn->pcb.raw->chksum_reqd = 1;
3803 sock->conn->pcb.raw->chksum_offset = (u16_t) * (const int *)optval;
3806 s, sock->conn->pcb.raw->chksum_reqd));
3823 done_socket(sock);
3830 struct lwip_sock *sock = get_socket(s);
3836 if (!sock) {
3844 sock_set_errno(sock, EINVAL);
3845 done_socket(sock);
3849 if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) {
3851 if (sock->lastdata.netbuf) {
3852 nb = sock->lastdata.netbuf;
3856 err_t err = netconn_recv_udp_raw_netbuf_flags(sock->conn, &rxbuf, NETCONN_DONTBLOCK);
3860 sock->lastdata.netbuf = rxbuf;
3864 done_socket(sock);
3871 SYS_ARCH_GET(sock->conn->recv_avail, recv_avail);
3877 if (sock->lastdata.netbuf) {
3878 if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {
3879 recv_avail += sock->lastdata.pbuf->tot_len;
3881 recv_avail += sock->lastdata.netbuf->p->tot_len;
3887 sock_set_errno(sock, 0);
3888 done_socket(sock);
3900 netconn_set_nonblocking(sock->conn, val);
3902 sock_set_errno(sock, 0);
3903 done_socket(sock);
3911 sock_set_errno(sock, ENOSYS); /* not yet implemented */
3912 done_socket(sock);
3924 struct lwip_sock *sock = get_socket(s);
3928 if (!sock) {
3934 ret = netconn_is_nonblocking(sock->conn) ? O_NONBLOCK : 0;
3935 sock_set_errno(sock, 0);
3937 if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {
3947 if (sock->conn->pcb.tcp) {
3948 if (!(sock->conn->pcb.tcp->flags & TF_RXCLOSED)) {
3951 if (!(sock->conn->pcb.tcp->flags & TF_FIN)) {
3974 netconn_set_nonblocking(sock->conn, val & O_NONBLOCK);
3976 sock_set_errno(sock, 0);
3978 sock_set_errno(sock, ENOSYS); /* not yet implemented */
3983 sock_set_errno(sock, ENOSYS); /* not yet implemented */
3986 done_socket(sock);
4077 struct lwip_sock *sock = get_socket(s);
4080 if (!sock) {
4085 if (socket_ipv4_multicast_memberships[i].sock == NULL) {
4086 socket_ipv4_multicast_memberships[i].sock = sock;
4089 done_socket(sock);
4093 done_socket(sock);
4105 struct lwip_sock *sock = get_socket(s);
4108 if (!sock) {
4113 if ((socket_ipv4_multicast_memberships[i].sock == sock) &&
4116 socket_ipv4_multicast_memberships[i].sock = NULL;
4122 done_socket(sock);
4132 struct lwip_sock *sock = get_socket(s);
4135 if (!sock) {
4140 if (socket_ipv4_multicast_memberships[i].sock == sock) {
4144 socket_ipv4_multicast_memberships[i].sock = NULL;
4148 netconn_join_leave_group(sock->conn, &multi_addr, &if_addr, NETCONN_LEAVE);
4151 done_socket(sock);
4165 struct lwip_sock *sock = get_socket(s);
4168 if (!sock) {
4173 if (socket_ipv6_multicast_memberships[i].sock == NULL) {
4174 socket_ipv6_multicast_memberships[i].sock = sock;
4177 done_socket(sock);
4181 done_socket(sock);
4193 struct lwip_sock *sock = get_socket(s);
4196 if (!sock) {
4201 if ((socket_ipv6_multicast_memberships[i].sock == sock) &&
4204 socket_ipv6_multicast_memberships[i].sock = NULL;
4210 done_socket(sock);
4220 struct lwip_sock *sock = get_socket(s);
4223 if (!sock) {
4228 if (socket_ipv6_multicast_memberships[i].sock == sock) {
4235 socket_ipv6_multicast_memberships[i].sock = NULL;
4239 netconn_join_leave_group_netif(sock->conn, &multi_addr, if_idx, NETCONN_LEAVE);
4242 done_socket(sock);