Skip to content

Commit ea063cd

Browse files
authored
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>
1 parent 8bf91c1 commit ea063cd

File tree

1 file changed

+58
-34
lines changed

1 file changed

+58
-34
lines changed

core/shared/platform/zephyr/zephyr_socket.c

Lines changed: 58 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ os_socket_getbooloption(bh_socket_t socket, int level, int optname,
173173
int optval;
174174
socklen_t optval_size = sizeof(optval);
175175

176-
if (zsock_setsockopt(socket->fd, level, optname, &optval, optval_size)
176+
if (zsock_getsockopt(socket->fd, level, optname, &optval, &optval_size)
177177
!= 0) {
178178
return BHT_ERROR;
179179
}
@@ -190,7 +190,7 @@ os_socket_create(bh_socket_t *sock, bool is_ipv4, bool is_tcp)
190190

191191
*(sock) = BH_MALLOC(sizeof(zephyr_handle));
192192

193-
if (!sock) {
193+
if (!*sock) {
194194
return BHT_ERROR;
195195
}
196196

@@ -262,8 +262,13 @@ os_socket_settimeout(bh_socket_t socket, uint64 timeout_us)
262262
timeout.tv_sec = timeout_us / 1000000;
263263
timeout.tv_usec = timeout_us % 1000000;
264264

265-
return zsock_setsockopt(socket->fd, SOL_SOCKET, SO_RCVTIMEO, &timeout,
266-
sizeof(timeout));
265+
if (zsock_setsockopt(socket->fd, SOL_SOCKET, SO_RCVTIMEO, &timeout,
266+
sizeof(timeout))
267+
!= 0) {
268+
return BHT_ERROR;
269+
}
270+
271+
return BHT_OK;
267272
}
268273

269274
int
@@ -277,7 +282,7 @@ os_socket_accept(bh_socket_t server_sock, bh_socket_t *sock, void *addr,
277282
unsigned int *addrlen)
278283
{
279284
*sock = BH_MALLOC(sizeof(zephyr_handle));
280-
if (!sock) {
285+
if (!*sock) {
281286
return BHT_ERROR;
282287
}
283288

@@ -609,7 +614,7 @@ os_socket_get_send_timeout(bh_socket_t socket, uint64 *timeout_us)
609614
struct timeval tv;
610615
socklen_t tv_len = sizeof(tv);
611616

612-
if (zsock_setsockopt(socket->fd, SOL_SOCKET, SO_SNDTIMEO, &tv, tv_len)
617+
if (zsock_getsockopt(socket->fd, SOL_SOCKET, SO_SNDTIMEO, &tv, &tv_len)
613618
!= 0) {
614619
return BHT_ERROR;
615620
}
@@ -639,7 +644,7 @@ os_socket_get_recv_timeout(bh_socket_t socket, uint64 *timeout_us)
639644
struct timeval tv;
640645
socklen_t tv_len = sizeof(tv);
641646

642-
if (zsock_setsockopt(socket->fd, SOL_SOCKET, SO_RCVTIMEO, &tv, tv_len)
647+
if (zsock_getsockopt(socket->fd, SOL_SOCKET, SO_RCVTIMEO, &tv, &tv_len)
643648
!= 0) {
644649
return BHT_ERROR;
645650
}
@@ -693,21 +698,18 @@ os_socket_get_linger(bh_socket_t socket, bool *is_enabled, int *linger_s)
693698
return BHT_ERROR;
694699
}
695700

696-
// TCP_NODELAY Disable TCP buffering (ignored, for compatibility)
697701
int
698702
os_socket_set_tcp_no_delay(bh_socket_t socket, bool is_enabled)
699703
{
700-
errno = ENOSYS;
701-
702-
return BHT_ERROR;
704+
return os_socket_setbooloption(socket, IPPROTO_TCP, TCP_NODELAY,
705+
is_enabled);
703706
}
704707

705708
int
706709
os_socket_get_tcp_no_delay(bh_socket_t socket, bool *is_enabled)
707710
{
708-
errno = ENOSYS;
709-
710-
return BHT_ERROR;
711+
return os_socket_getbooloption(socket, IPPROTO_TCP, TCP_NODELAY,
712+
is_enabled);
711713
}
712714

713715
int
@@ -760,17 +762,17 @@ os_socket_get_tcp_keep_idle(bh_socket_t socket, uint32_t *time_s)
760762
socklen_t time_s_len = sizeof(time_s_int);
761763

762764
#ifdef TCP_KEEPIDLE
763-
if (zsock_setsockopt(socket->fd, IPPROTO_TCP, TCP_KEEPIDLE, &time_s_int,
764-
time_s_len)
765+
if (zsock_getsockopt(socket->fd, IPPROTO_TCP, TCP_KEEPIDLE, &time_s_int,
766+
&time_s_len)
765767
!= 0) {
766768
return BHT_ERROR;
767769
}
768770
*time_s = (uint32)time_s_int;
769771

770772
return BHT_OK;
771773
#elif defined(TCP_KEEPALIVE)
772-
if (zsock_setsockopt(socket->fd, IPPROTO_TCP, TCP_KEEPALIVE, &time_s_int,
773-
time_s_len)
774+
if (zsock_getsockopt(socket->fd, IPPROTO_TCP, TCP_KEEPALIVE, &time_s_int,
775+
&time_s_len)
774776
!= 0) {
775777
return BHT_ERROR;
776778
}
@@ -856,17 +858,37 @@ os_socket_get_tcp_fastopen_connect(bh_socket_t socket, bool *is_enabled)
856858
int
857859
os_socket_set_ip_multicast_loop(bh_socket_t socket, bool ipv6, bool is_enabled)
858860
{
859-
errno = ENOSYS;
860-
861-
return BHT_ERROR;
861+
if (ipv6) {
862+
#ifdef IPPROTO_IPV6
863+
return os_socket_setbooloption(socket, IPPROTO_IPV6,
864+
IPV6_MULTICAST_LOOP, is_enabled);
865+
#else
866+
errno = EAFNOSUPPORT;
867+
return BHT_ERROR;
868+
#endif
869+
}
870+
else {
871+
return os_socket_setbooloption(socket, IPPROTO_IP, IP_MULTICAST_LOOP,
872+
is_enabled);
873+
}
862874
}
863875

864876
int
865877
os_socket_get_ip_multicast_loop(bh_socket_t socket, bool ipv6, bool *is_enabled)
866878
{
867-
errno = ENOSYS;
868-
869-
return BHT_ERROR;
879+
if (ipv6) {
880+
#ifdef IPPROTO_IPV6
881+
return os_socket_getbooloption(socket, IPPROTO_IPV6,
882+
IPV6_MULTICAST_LOOP, is_enabled);
883+
#else
884+
errno = EAFNOSUPPORT;
885+
return BHT_ERROR;
886+
#endif
887+
}
888+
else {
889+
return os_socket_getbooloption(socket, IPPROTO_IP, IP_MULTICAST_LOOP,
890+
is_enabled);
891+
}
870892
}
871893

872894
int
@@ -965,13 +987,13 @@ os_socket_set_ip_ttl(bh_socket_t socket, uint8_t ttl_s)
965987
int
966988
os_socket_get_ip_ttl(bh_socket_t socket, uint8_t *ttl_s)
967989
{
968-
socklen_t opt_len = sizeof(*ttl_s);
969-
970-
if (zsock_setsockopt(socket->fd, IPPROTO_IP, IP_MULTICAST_TTL, ttl_s,
971-
opt_len)
972-
!= 0) {
990+
/* Most socket-level options utilize an int argument for optval */
991+
int opt;
992+
socklen_t opt_len = sizeof(opt);
993+
if (zsock_getsockopt(socket->fd, IPPROTO_IP, IP_TTL, &opt, &opt_len) != 0) {
973994
return BHT_ERROR;
974995
}
996+
*ttl_s = (uint8_t)opt;
975997

976998
return BHT_OK;
977999
}
@@ -991,13 +1013,15 @@ os_socket_set_ip_multicast_ttl(bh_socket_t socket, uint8_t ttl_s)
9911013
int
9921014
os_socket_get_ip_multicast_ttl(bh_socket_t socket, uint8_t *ttl_s)
9931015
{
994-
socklen_t opt_len = sizeof(*ttl_s);
995-
996-
if (zsock_setsockopt(socket->fd, IPPROTO_IP, IP_MULTICAST_TTL, ttl_s,
997-
opt_len)
1016+
/* Most socket-level options utilize an int argument for optval */
1017+
int opt;
1018+
socklen_t opt_len = sizeof(opt);
1019+
if (zsock_getsockopt(socket->fd, IPPROTO_IP, IP_MULTICAST_TTL, &opt,
1020+
&opt_len)
9981021
!= 0) {
9991022
return BHT_ERROR;
10001023
}
1024+
*ttl_s = (uint8_t)opt;
10011025

10021026
return BHT_OK;
10031027
}
@@ -1059,4 +1083,4 @@ int
10591083
os_poll(os_poll_file_handle *fds, os_nfds_t nfs, int timeout)
10601084
{
10611085
return zsock_poll(fds, nfs, timeout);
1062-
}
1086+
}

0 commit comments

Comments
 (0)