Просмотр исходного кода

!97 完善 socket 选项值在系统调用中的转换
Merge pull request !97 from qz-lab/fix-sockopt

bernard 5 лет назад
Родитель
Сommit
47d80f3933
1 измененных файлов с 205 добавлено и 90 удалено
  1. 205 90
      components/lwp/lwp_syscall.c

+ 205 - 90
components/lwp/lwp_syscall.c

@@ -83,117 +83,232 @@ static void kmem_put(void *kptr)
 #define INTF_SOL_SOCKET     1
 #define INTF_SOL_SOCKET     1
 #define IMPL_SOL_SOCKET     0xFFF
 #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_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_ACCEPTCONN  30
 #define INTF_SO_DONTROUTE   5
 #define INTF_SO_DONTROUTE   5
-#define INTF_SO_LINGER      13
 #define INTF_SO_OOBINLINE   10
 #define INTF_SO_OOBINLINE   10
 #define INTF_SO_REUSEPORT   15
 #define INTF_SO_REUSEPORT   15
 #define INTF_SO_SNDBUF      7
 #define INTF_SO_SNDBUF      7
-#define INTF_SO_RCVBUF      8
 #define INTF_SO_SNDLOWAT    19
 #define INTF_SO_SNDLOWAT    19
 #define INTF_SO_RCVLOWAT    18
 #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_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_ACCEPTCONN  0x0002
 #define IMPL_SO_DONTROUTE   0x0010
 #define IMPL_SO_DONTROUTE   0x0010
-#define IMPL_SO_LINGER      0x0080
 #define IMPL_SO_OOBINLINE   0x0100
 #define IMPL_SO_OOBINLINE   0x0100
 #define IMPL_SO_REUSEPORT   0x0200
 #define IMPL_SO_REUSEPORT   0x0200
 #define IMPL_SO_SNDBUF      0x1001
 #define IMPL_SO_SNDBUF      0x1001
-#define IMPL_SO_RCVBUF      0x1002
 #define IMPL_SO_SNDLOWAT    0x1003
 #define IMPL_SO_SNDLOWAT    0x1003
 #define IMPL_SO_RCVLOWAT    0x1004
 #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)
 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)
 static void sockaddr_tolwip(const struct musl_sockaddr *std, struct sockaddr *lwip)