|
|
@@ -83,117 +83,232 @@ static void kmem_put(void *kptr)
|
|
|
#define INTF_SOL_SOCKET 1
|
|
|
#define IMPL_SOL_SOCKET 0xFFF
|
|
|
|
|
|
-/* socket option name */
|
|
|
-#define INTF_SO_REUSEADDR 2
|
|
|
-#define INTF_SO_KEEPALIVE 9
|
|
|
+#define INTF_IPPROTO_IP 0
|
|
|
+#define IMPL_IPPROTO_IP 0
|
|
|
+
|
|
|
+#define INTF_IPPROTO_TCP 6
|
|
|
+#define IMPL_IPPROTO_TCP 6
|
|
|
+
|
|
|
+#define INTF_IPPROTO_IPV6 41
|
|
|
+#define IMPL_IPPROTO_IPV6 41
|
|
|
+
|
|
|
+/* SOL_SOCKET option names */
|
|
|
#define INTF_SO_BROADCAST 6
|
|
|
+#define INTF_SO_KEEPALIVE 9
|
|
|
+#define INTF_SO_REUSEADDR 2
|
|
|
+#define INTF_SO_TYPE 3
|
|
|
+#define INTF_SO_ERROR 4
|
|
|
+#define INTF_SO_SNDTIMEO 21
|
|
|
+#define INTF_SO_RCVTIMEO 20
|
|
|
+#define INTF_SO_RCVBUF 8
|
|
|
+#define INTF_SO_LINGER 13
|
|
|
+#define INTF_SO_NO_CHECK 11
|
|
|
#define INTF_SO_ACCEPTCONN 30
|
|
|
#define INTF_SO_DONTROUTE 5
|
|
|
-#define INTF_SO_LINGER 13
|
|
|
#define INTF_SO_OOBINLINE 10
|
|
|
#define INTF_SO_REUSEPORT 15
|
|
|
#define INTF_SO_SNDBUF 7
|
|
|
-#define INTF_SO_RCVBUF 8
|
|
|
#define INTF_SO_SNDLOWAT 19
|
|
|
#define INTF_SO_RCVLOWAT 18
|
|
|
-#define INTF_SO_SNDTIMEO 21
|
|
|
-#define INTF_SO_RCVTIMEO 20
|
|
|
-#define INTF_SO_ERROR 4
|
|
|
-#define INTF_SO_TYPE 3
|
|
|
-#define INTF_SO_NO_CHECK 11
|
|
|
|
|
|
-#define IMPL_SO_REUSEADDR 0x0004
|
|
|
-#define IMPL_SO_KEEPALIVE 0x0008
|
|
|
#define IMPL_SO_BROADCAST 0x0020
|
|
|
+#define IMPL_SO_KEEPALIVE 0x0008
|
|
|
+#define IMPL_SO_REUSEADDR 0x0004
|
|
|
+#define IMPL_SO_TYPE 0x1008
|
|
|
+#define IMPL_SO_ERROR 0x1007
|
|
|
+#define IMPL_SO_SNDTIMEO 0x1005
|
|
|
+#define IMPL_SO_RCVTIMEO 0x1006
|
|
|
+#define IMPL_SO_RCVBUF 0x1002
|
|
|
+#define IMPL_SO_LINGER 0x0080
|
|
|
+#define IMPL_SO_NO_CHECK 0x100a
|
|
|
#define IMPL_SO_ACCEPTCONN 0x0002
|
|
|
#define IMPL_SO_DONTROUTE 0x0010
|
|
|
-#define IMPL_SO_LINGER 0x0080
|
|
|
#define IMPL_SO_OOBINLINE 0x0100
|
|
|
#define IMPL_SO_REUSEPORT 0x0200
|
|
|
#define IMPL_SO_SNDBUF 0x1001
|
|
|
-#define IMPL_SO_RCVBUF 0x1002
|
|
|
#define IMPL_SO_SNDLOWAT 0x1003
|
|
|
#define IMPL_SO_RCVLOWAT 0x1004
|
|
|
-#define IMPL_SO_SNDTIMEO 0x1005
|
|
|
-#define IMPL_SO_RCVTIMEO 0x1006
|
|
|
-#define IMPL_SO_ERROR 0x1007
|
|
|
-#define IMPL_SO_TYPE 0x1008
|
|
|
-#define IMPL_SO_NO_CHECK 0x100a
|
|
|
+
|
|
|
+/* IPPROTO_IP option names */
|
|
|
+#define INTF_IP_TTL 2
|
|
|
+#define INTF_IP_TOS 1
|
|
|
+#define INTF_IP_MULTICAST_TTL 33
|
|
|
+#define INTF_IP_MULTICAST_IF 32
|
|
|
+#define INTF_IP_MULTICAST_LOOP 34
|
|
|
+#define INTF_IP_ADD_MEMBERSHIP 35
|
|
|
+#define INTF_IP_DROP_MEMBERSHIP 36
|
|
|
+
|
|
|
+#define IMPL_IP_TTL 2
|
|
|
+#define IMPL_IP_TOS 1
|
|
|
+#define IMPL_IP_MULTICAST_TTL 5
|
|
|
+#define IMPL_IP_MULTICAST_IF 6
|
|
|
+#define IMPL_IP_MULTICAST_LOOP 7
|
|
|
+#define IMPL_IP_ADD_MEMBERSHIP 3
|
|
|
+#define IMPL_IP_DROP_MEMBERSHIP 4
|
|
|
+
|
|
|
+/* IPPROTO_TCP option names */
|
|
|
+#define INTF_TCP_NODELAY 1
|
|
|
+#define INTF_TCP_KEEPALIVE 9
|
|
|
+#define INTF_TCP_KEEPIDLE 4
|
|
|
+#define INTF_TCP_KEEPINTVL 5
|
|
|
+#define INTF_TCP_KEEPCNT 6
|
|
|
+
|
|
|
+#define IMPL_TCP_NODELAY 0x01
|
|
|
+#define IMPL_TCP_KEEPALIVE 0x02
|
|
|
+#define IMPL_TCP_KEEPIDLE 0x03
|
|
|
+#define IMPL_TCP_KEEPINTVL 0x04
|
|
|
+#define IMPL_TCP_KEEPCNT 0x05
|
|
|
+
|
|
|
+/* IPPROTO_IPV6 option names */
|
|
|
+#define INTF_IPV6_V6ONLY 26
|
|
|
+#define IMPL_IPV6_V6ONLY 27
|
|
|
|
|
|
static void convert_sockopt(int *level, int *optname)
|
|
|
{
|
|
|
- switch (*level)
|
|
|
- {
|
|
|
- case INTF_SOL_SOCKET:
|
|
|
- *level = IMPL_SOL_SOCKET;
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- switch (*optname)
|
|
|
- {
|
|
|
- case INTF_SO_REUSEADDR:
|
|
|
- *optname = IMPL_SO_REUSEADDR;
|
|
|
- break;
|
|
|
- case INTF_SO_KEEPALIVE:
|
|
|
- *optname = IMPL_SO_KEEPALIVE;
|
|
|
- break;
|
|
|
- case INTF_SO_BROADCAST:
|
|
|
- *optname = IMPL_SO_BROADCAST;
|
|
|
- break;
|
|
|
- case INTF_SO_ACCEPTCONN:
|
|
|
- *optname = IMPL_SO_ACCEPTCONN;
|
|
|
- break;
|
|
|
- case INTF_SO_DONTROUTE:
|
|
|
- *optname = IMPL_SO_DONTROUTE;
|
|
|
- break;
|
|
|
- case INTF_SO_LINGER:
|
|
|
- *optname = IMPL_SO_LINGER;
|
|
|
- break;
|
|
|
- case INTF_SO_OOBINLINE:
|
|
|
- *optname = IMPL_SO_OOBINLINE;
|
|
|
- break;
|
|
|
- case INTF_SO_REUSEPORT:
|
|
|
- *optname = IMPL_SO_REUSEPORT;
|
|
|
- break;
|
|
|
- case INTF_SO_SNDBUF:
|
|
|
- *optname = IMPL_SO_SNDBUF;
|
|
|
- break;
|
|
|
- case INTF_SO_RCVBUF:
|
|
|
- *optname = IMPL_SO_RCVBUF;
|
|
|
- break;
|
|
|
- case INTF_SO_SNDLOWAT:
|
|
|
- *optname = IMPL_SO_SNDLOWAT;
|
|
|
- break;
|
|
|
- case INTF_SO_RCVLOWAT:
|
|
|
- *optname = IMPL_SO_RCVLOWAT;
|
|
|
- break;
|
|
|
- case INTF_SO_SNDTIMEO:
|
|
|
- *optname = IMPL_SO_SNDTIMEO;
|
|
|
- break;
|
|
|
- case INTF_SO_RCVTIMEO:
|
|
|
- *optname = IMPL_SO_RCVTIMEO;
|
|
|
- break;
|
|
|
- case INTF_SO_ERROR:
|
|
|
- *optname = IMPL_SO_ERROR;
|
|
|
- break;
|
|
|
- case INTF_SO_TYPE:
|
|
|
- *optname = IMPL_SO_TYPE;
|
|
|
- break;
|
|
|
- case INTF_SO_NO_CHECK:
|
|
|
- *optname = IMPL_SO_NO_CHECK;
|
|
|
- break;
|
|
|
-
|
|
|
- /*
|
|
|
- * SO_DONTLINGER (*level = ((int)(~SO_LINGER))),
|
|
|
- * SO_USELOOPBACK (*level = 0x0040) and
|
|
|
- * SO_CONTIMEO (*level = 0x1009) are not supported for now.
|
|
|
- */
|
|
|
- default:
|
|
|
- *optname = 0;
|
|
|
- break;
|
|
|
+ if (*level == INTF_SOL_SOCKET)
|
|
|
+ {
|
|
|
+ *level = IMPL_SOL_SOCKET;
|
|
|
+
|
|
|
+ switch (*optname)
|
|
|
+ {
|
|
|
+ case INTF_SO_REUSEADDR:
|
|
|
+ *optname = IMPL_SO_REUSEADDR;
|
|
|
+ break;
|
|
|
+ case INTF_SO_KEEPALIVE:
|
|
|
+ *optname = IMPL_SO_KEEPALIVE;
|
|
|
+ break;
|
|
|
+ case INTF_SO_BROADCAST:
|
|
|
+ *optname = IMPL_SO_BROADCAST;
|
|
|
+ break;
|
|
|
+ case INTF_SO_ACCEPTCONN:
|
|
|
+ *optname = IMPL_SO_ACCEPTCONN;
|
|
|
+ break;
|
|
|
+ case INTF_SO_DONTROUTE:
|
|
|
+ *optname = IMPL_SO_DONTROUTE;
|
|
|
+ break;
|
|
|
+ case INTF_SO_LINGER:
|
|
|
+ *optname = IMPL_SO_LINGER;
|
|
|
+ break;
|
|
|
+ case INTF_SO_OOBINLINE:
|
|
|
+ *optname = IMPL_SO_OOBINLINE;
|
|
|
+ break;
|
|
|
+ case INTF_SO_REUSEPORT:
|
|
|
+ *optname = IMPL_SO_REUSEPORT;
|
|
|
+ break;
|
|
|
+ case INTF_SO_SNDBUF:
|
|
|
+ *optname = IMPL_SO_SNDBUF;
|
|
|
+ break;
|
|
|
+ case INTF_SO_RCVBUF:
|
|
|
+ *optname = IMPL_SO_RCVBUF;
|
|
|
+ break;
|
|
|
+ case INTF_SO_SNDLOWAT:
|
|
|
+ *optname = IMPL_SO_SNDLOWAT;
|
|
|
+ break;
|
|
|
+ case INTF_SO_RCVLOWAT:
|
|
|
+ *optname = IMPL_SO_RCVLOWAT;
|
|
|
+ break;
|
|
|
+ case INTF_SO_SNDTIMEO:
|
|
|
+ *optname = IMPL_SO_SNDTIMEO;
|
|
|
+ break;
|
|
|
+ case INTF_SO_RCVTIMEO:
|
|
|
+ *optname = IMPL_SO_RCVTIMEO;
|
|
|
+ break;
|
|
|
+ case INTF_SO_ERROR:
|
|
|
+ *optname = IMPL_SO_ERROR;
|
|
|
+ break;
|
|
|
+ case INTF_SO_TYPE:
|
|
|
+ *optname = IMPL_SO_TYPE;
|
|
|
+ break;
|
|
|
+ case INTF_SO_NO_CHECK:
|
|
|
+ *optname = IMPL_SO_NO_CHECK;
|
|
|
+ break;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * SO_DONTLINGER (*level = ((int)(~SO_LINGER))),
|
|
|
+ * SO_USELOOPBACK (*level = 0x0040) and
|
|
|
+ * SO_CONTIMEO (*level = 0x1009) are not supported for now.
|
|
|
+ */
|
|
|
+ default:
|
|
|
+ *optname = 0;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return;
|
|
|
}
|
|
|
+
|
|
|
+ if (*level == INTF_IPPROTO_IP)
|
|
|
+ {
|
|
|
+ *level = IMPL_IPPROTO_IP;
|
|
|
+
|
|
|
+ switch (*optname)
|
|
|
+ {
|
|
|
+ case INTF_IP_TTL:
|
|
|
+ *optname = IMPL_IP_TTL;
|
|
|
+ break;
|
|
|
+ case INTF_IP_TOS:
|
|
|
+ *optname = IMPL_IP_TOS;
|
|
|
+ break;
|
|
|
+ case INTF_IP_MULTICAST_TTL:
|
|
|
+ *optname = IMPL_IP_MULTICAST_TTL;
|
|
|
+ break;
|
|
|
+ case INTF_IP_MULTICAST_IF:
|
|
|
+ *optname = IMPL_IP_MULTICAST_IF;
|
|
|
+ break;
|
|
|
+ case INTF_IP_MULTICAST_LOOP:
|
|
|
+ *optname = IMPL_IP_MULTICAST_LOOP;
|
|
|
+ break;
|
|
|
+ case INTF_IP_ADD_MEMBERSHIP:
|
|
|
+ *optname = IMPL_IP_ADD_MEMBERSHIP;
|
|
|
+ break;
|
|
|
+ case INTF_IP_DROP_MEMBERSHIP:
|
|
|
+ *optname = IMPL_IP_DROP_MEMBERSHIP;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (*level == INTF_IPPROTO_TCP)
|
|
|
+ {
|
|
|
+ *level = IMPL_IPPROTO_TCP;
|
|
|
+
|
|
|
+ switch (*optname)
|
|
|
+ {
|
|
|
+ case INTF_TCP_NODELAY:
|
|
|
+ *optname = IMPL_TCP_NODELAY;
|
|
|
+ break;
|
|
|
+ case INTF_TCP_KEEPALIVE:
|
|
|
+ *optname = IMPL_TCP_KEEPALIVE;
|
|
|
+ break;
|
|
|
+ case INTF_TCP_KEEPIDLE:
|
|
|
+ *optname = IMPL_TCP_KEEPIDLE;
|
|
|
+ break;
|
|
|
+ case INTF_TCP_KEEPINTVL:
|
|
|
+ *optname = IMPL_TCP_KEEPINTVL;
|
|
|
+ break;
|
|
|
+ case INTF_TCP_KEEPCNT:
|
|
|
+ *optname = IMPL_TCP_KEEPCNT;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (*level == INTF_IPPROTO_IPV6)
|
|
|
+ {
|
|
|
+ *level = IMPL_IPPROTO_IPV6;
|
|
|
+
|
|
|
+ switch (*optname)
|
|
|
+ {
|
|
|
+ case INTF_IPV6_V6ONLY:
|
|
|
+ *optname = IMPL_IPV6_V6ONLY;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
static void sockaddr_tolwip(const struct musl_sockaddr *std, struct sockaddr *lwip)
|