Skip to content

Commit

Permalink
More features in QEMU.
Browse files Browse the repository at this point in the history
  • Loading branch information
sunfishcode committed Sep 29, 2023
1 parent 1db7eb2 commit 9b36e16
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 0 deletions.
79 changes: 79 additions & 0 deletions ci/more-sockopts.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
From Dan Gohman <[email protected]>
Subject: [PATCH] Implement various socket options.

This implements the `SO_INCOMING_CPU`, `SO_COOKIE`, and `SO_PROTOCOL`
socket options.

diff -ur -x roms -x build a/linux-user/generic/sockbits.h b/linux-user/generic/sockbits.h
--- a/linux-user/generic/sockbits.h
+++ b/linux-user/generic/sockbits.h
@@ -60,4 +60,10 @@

#define TARGET_SO_PROTOCOL 38
#define TARGET_SO_DOMAIN 39
+#ifndef TARGET_SO_INCOMING_CPU
+#define TARGET_SO_INCOMING_CPU 49
+#endif
+#ifndef TARGET_SO_COOKIE
+#define TARGET_SO_COOKIE 57
+#endif
#endif
diff -ur -x roms -x build a/linux-user/syscall.c b/linux-user/syscall.c
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -2476,6 +2476,9 @@
case TARGET_SO_RCVLOWAT:
optname = SO_RCVLOWAT;
break;
+ case TARGET_SO_INCOMING_CPU:
+ optname = SO_INCOMING_CPU;
+ break;
default:
goto unimplemented;
}
@@ -2534,6 +2537,7 @@
{
abi_long ret;
int len, val;
+ int64_t val64;
socklen_t lv;

switch(level) {
@@ -2733,6 +2737,27 @@
case TARGET_SO_DOMAIN:
optname = SO_DOMAIN;
goto int_case;
+ case TARGET_SO_INCOMING_CPU:
+ optname = SO_INCOMING_CPU;
+ goto int_case;
+ case TARGET_SO_COOKIE:
+ optname = SO_COOKIE;
+ if (get_user_u64(len, optlen))
+ return -TARGET_EFAULT;
+ if (len < 0)
+ return -TARGET_EINVAL;
+ lv = sizeof(val64);
+ ret = get_errno(getsockopt(sockfd, level, optname, &val64, &lv));
+ if (ret < 0)
+ return ret;
+ if (len > lv)
+ len = lv;
+ assert(len == 8);
+ if (put_user_u64(val64, optval_addr))
+ return -TARGET_EFAULT;
+ if (put_user_u32(len, optlen))
+ return -TARGET_EFAULT;
+ break;
default:
goto int_case;
}
@@ -2756,6 +2781,9 @@
case SO_ERROR:
val = host_to_target_errno(val);
break;
+ case SO_PROTOCOL:
+ val = host_to_target_errno(val);
+ break;
}
if (level == SOL_SOCKET && optname == SO_ERROR) {
val = host_to_target_errno(val);
4 changes: 4 additions & 0 deletions tests/net/sockopt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,10 @@ fn test_sockopts_tcp(s: &OwnedFd) {
}

// Check the initial value of TCP_CONGESTION, set it, and check it.
//
// Temporarily disable this test on non-x86 as qemu isn't yet aware of
// TCP_CONGESTION.
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
#[cfg(any(linux_like, solarish, target_os = "freebsd", target_os = "fuchsia"))]
#[cfg(feature = "alloc")]
{
Expand Down

0 comments on commit 9b36e16

Please sign in to comment.