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

Improve zephyr's networking code (#4839)

* fix: zephyr sockets: fix get/set sockopt usages.

In multiple places, setsockopt is used when getsockopt shall be used, and vice-versa.
Additionally, pointer isn't checked correctly in two places, this commit fixes those as well.
Per man(7), most socket-level options utilize an int argument for optval. Use those for ttl.

Signed-off-by: Krisztian Szilvasi <34309983+kr-t@users.noreply.github.com>

* feat: zephyr sockets: implement missing networking functions

Some of the optvals are implemented by zephyr, some are missing.
Call the appropriate function and let set the retval based on that.

Signed-off-by: Krisztian Szilvasi <34309983+kr-t@users.noreply.github.com>
Krisztian 13 часов назад
Родитель
Сommit
ea063cdf5b
1 измененных файлов с 58 добавлено и 34 удалено
  1. 58 34
      core/shared/platform/zephyr/zephyr_socket.c

+ 58 - 34
core/shared/platform/zephyr/zephyr_socket.c

@@ -173,7 +173,7 @@ os_socket_getbooloption(bh_socket_t socket, int level, int optname,
     int optval;
     socklen_t optval_size = sizeof(optval);
 
-    if (zsock_setsockopt(socket->fd, level, optname, &optval, optval_size)
+    if (zsock_getsockopt(socket->fd, level, optname, &optval, &optval_size)
         != 0) {
         return BHT_ERROR;
     }
@@ -190,7 +190,7 @@ os_socket_create(bh_socket_t *sock, bool is_ipv4, bool is_tcp)
 
     *(sock) = BH_MALLOC(sizeof(zephyr_handle));
 
-    if (!sock) {
+    if (!*sock) {
         return BHT_ERROR;
     }
 
@@ -262,8 +262,13 @@ os_socket_settimeout(bh_socket_t socket, uint64 timeout_us)
     timeout.tv_sec = timeout_us / 1000000;
     timeout.tv_usec = timeout_us % 1000000;
 
-    return zsock_setsockopt(socket->fd, SOL_SOCKET, SO_RCVTIMEO, &timeout,
-                            sizeof(timeout));
+    if (zsock_setsockopt(socket->fd, SOL_SOCKET, SO_RCVTIMEO, &timeout,
+                         sizeof(timeout))
+        != 0) {
+        return BHT_ERROR;
+    }
+
+    return BHT_OK;
 }
 
 int
@@ -277,7 +282,7 @@ os_socket_accept(bh_socket_t server_sock, bh_socket_t *sock, void *addr,
                  unsigned int *addrlen)
 {
     *sock = BH_MALLOC(sizeof(zephyr_handle));
-    if (!sock) {
+    if (!*sock) {
         return BHT_ERROR;
     }
 
@@ -609,7 +614,7 @@ os_socket_get_send_timeout(bh_socket_t socket, uint64 *timeout_us)
     struct timeval tv;
     socklen_t tv_len = sizeof(tv);
 
-    if (zsock_setsockopt(socket->fd, SOL_SOCKET, SO_SNDTIMEO, &tv, tv_len)
+    if (zsock_getsockopt(socket->fd, SOL_SOCKET, SO_SNDTIMEO, &tv, &tv_len)
         != 0) {
         return BHT_ERROR;
     }
@@ -639,7 +644,7 @@ os_socket_get_recv_timeout(bh_socket_t socket, uint64 *timeout_us)
     struct timeval tv;
     socklen_t tv_len = sizeof(tv);
 
-    if (zsock_setsockopt(socket->fd, SOL_SOCKET, SO_RCVTIMEO, &tv, tv_len)
+    if (zsock_getsockopt(socket->fd, SOL_SOCKET, SO_RCVTIMEO, &tv, &tv_len)
         != 0) {
         return BHT_ERROR;
     }
@@ -693,21 +698,18 @@ os_socket_get_linger(bh_socket_t socket, bool *is_enabled, int *linger_s)
     return BHT_ERROR;
 }
 
-// TCP_NODELAY Disable TCP buffering (ignored, for compatibility)
 int
 os_socket_set_tcp_no_delay(bh_socket_t socket, bool is_enabled)
 {
-    errno = ENOSYS;
-
-    return BHT_ERROR;
+    return os_socket_setbooloption(socket, IPPROTO_TCP, TCP_NODELAY,
+                                   is_enabled);
 }
 
 int
 os_socket_get_tcp_no_delay(bh_socket_t socket, bool *is_enabled)
 {
-    errno = ENOSYS;
-
-    return BHT_ERROR;
+    return os_socket_getbooloption(socket, IPPROTO_TCP, TCP_NODELAY,
+                                   is_enabled);
 }
 
 int
@@ -760,8 +762,8 @@ os_socket_get_tcp_keep_idle(bh_socket_t socket, uint32_t *time_s)
     socklen_t time_s_len = sizeof(time_s_int);
 
 #ifdef TCP_KEEPIDLE
-    if (zsock_setsockopt(socket->fd, IPPROTO_TCP, TCP_KEEPIDLE, &time_s_int,
-                         time_s_len)
+    if (zsock_getsockopt(socket->fd, IPPROTO_TCP, TCP_KEEPIDLE, &time_s_int,
+                         &time_s_len)
         != 0) {
         return BHT_ERROR;
     }
@@ -769,8 +771,8 @@ os_socket_get_tcp_keep_idle(bh_socket_t socket, uint32_t *time_s)
 
     return BHT_OK;
 #elif defined(TCP_KEEPALIVE)
-    if (zsock_setsockopt(socket->fd, IPPROTO_TCP, TCP_KEEPALIVE, &time_s_int,
-                         time_s_len)
+    if (zsock_getsockopt(socket->fd, IPPROTO_TCP, TCP_KEEPALIVE, &time_s_int,
+                         &time_s_len)
         != 0) {
         return BHT_ERROR;
     }
@@ -856,17 +858,37 @@ os_socket_get_tcp_fastopen_connect(bh_socket_t socket, bool *is_enabled)
 int
 os_socket_set_ip_multicast_loop(bh_socket_t socket, bool ipv6, bool is_enabled)
 {
-    errno = ENOSYS;
-
-    return BHT_ERROR;
+    if (ipv6) {
+#ifdef IPPROTO_IPV6
+        return os_socket_setbooloption(socket, IPPROTO_IPV6,
+                                       IPV6_MULTICAST_LOOP, is_enabled);
+#else
+        errno = EAFNOSUPPORT;
+        return BHT_ERROR;
+#endif
+    }
+    else {
+        return os_socket_setbooloption(socket, IPPROTO_IP, IP_MULTICAST_LOOP,
+                                       is_enabled);
+    }
 }
 
 int
 os_socket_get_ip_multicast_loop(bh_socket_t socket, bool ipv6, bool *is_enabled)
 {
-    errno = ENOSYS;
-
-    return BHT_ERROR;
+    if (ipv6) {
+#ifdef IPPROTO_IPV6
+        return os_socket_getbooloption(socket, IPPROTO_IPV6,
+                                       IPV6_MULTICAST_LOOP, is_enabled);
+#else
+        errno = EAFNOSUPPORT;
+        return BHT_ERROR;
+#endif
+    }
+    else {
+        return os_socket_getbooloption(socket, IPPROTO_IP, IP_MULTICAST_LOOP,
+                                       is_enabled);
+    }
 }
 
 int
@@ -965,13 +987,13 @@ os_socket_set_ip_ttl(bh_socket_t socket, uint8_t ttl_s)
 int
 os_socket_get_ip_ttl(bh_socket_t socket, uint8_t *ttl_s)
 {
-    socklen_t opt_len = sizeof(*ttl_s);
-
-    if (zsock_setsockopt(socket->fd, IPPROTO_IP, IP_MULTICAST_TTL, ttl_s,
-                         opt_len)
-        != 0) {
+    /*  Most socket-level options utilize an int argument for optval */
+    int opt;
+    socklen_t opt_len = sizeof(opt);
+    if (zsock_getsockopt(socket->fd, IPPROTO_IP, IP_TTL, &opt, &opt_len) != 0) {
         return BHT_ERROR;
     }
+    *ttl_s = (uint8_t)opt;
 
     return BHT_OK;
 }
@@ -991,13 +1013,15 @@ os_socket_set_ip_multicast_ttl(bh_socket_t socket, uint8_t ttl_s)
 int
 os_socket_get_ip_multicast_ttl(bh_socket_t socket, uint8_t *ttl_s)
 {
-    socklen_t opt_len = sizeof(*ttl_s);
-
-    if (zsock_setsockopt(socket->fd, IPPROTO_IP, IP_MULTICAST_TTL, ttl_s,
-                         opt_len)
+    /*  Most socket-level options utilize an int argument for optval */
+    int opt;
+    socklen_t opt_len = sizeof(opt);
+    if (zsock_getsockopt(socket->fd, IPPROTO_IP, IP_MULTICAST_TTL, &opt,
+                         &opt_len)
         != 0) {
         return BHT_ERROR;
     }
+    *ttl_s = (uint8_t)opt;
 
     return BHT_OK;
 }
@@ -1059,4 +1083,4 @@ int
 os_poll(os_poll_file_handle *fds, os_nfds_t nfs, int timeout)
 {
     return zsock_poll(fds, nfs, timeout);
-}
+}