Skip to content

Commit a74f97f

Browse files
authored
Implement more socket options. (#858)
* Implement more socket options. Implement IP_FREEBINDC, IPV6_FREEBIND, IPV6_TCLASS, SO_COOKIE, SO_INCOMING_CPU, SO_PROTOCOL, SO_REUSEPORT, SO_REUSEPORT_LB, TCP_CORK, TCP_QUICKACK, TCP_THIN_LINEAR_TIMEOUTS, TCP_CONGESTION, SO_ORIGINAL_DST, and IP6T_SO_ORIGINAL_DST. * More features in QEMU.
1 parent 69319a3 commit a74f97f

8 files changed

Lines changed: 1116 additions & 79 deletions

File tree

.github/workflows/main.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,7 @@ jobs:
472472
patch -p1 < $GITHUB_WORKSPACE/ci/s390x-stat-have-nsec.patch
473473
patch -p1 < $GITHUB_WORKSPACE/ci/aarch64-o-largefile.patch
474474
patch -p1 < $GITHUB_WORKSPACE/ci/tcgets2-tcsets2.patch
475+
patch -p1 < $GITHUB_WORKSPACE/ci/more-sockopts.patch
475476
./configure --target-list=${{ matrix.qemu_target }} --prefix=${{ runner.tool_cache }}/qemu --disable-tools --disable-slirp --disable-fdt --disable-capstone --disable-docs
476477
ninja -C build install
477478
if: matrix.qemu != '' && matrix.os == 'ubuntu-latest'
@@ -605,6 +606,7 @@ jobs:
605606
patch -p1 < $GITHUB_WORKSPACE/ci/s390x-stat-have-nsec.patch
606607
patch -p1 < $GITHUB_WORKSPACE/ci/aarch64-o-largefile.patch
607608
patch -p1 < $GITHUB_WORKSPACE/ci/tcgets2-tcsets2.patch
609+
patch -p1 < $GITHUB_WORKSPACE/ci/more-sockopts.patch
608610
./configure --target-list=${{ matrix.qemu_target }} --prefix=${{ runner.tool_cache }}/qemu --disable-tools --disable-slirp --disable-fdt --disable-capstone --disable-docs
609611
ninja -C build install
610612
if: matrix.qemu != '' && matrix.os == 'ubuntu-latest'
@@ -696,6 +698,7 @@ jobs:
696698
patch -p1 < $GITHUB_WORKSPACE/ci/s390x-stat-have-nsec.patch
697699
patch -p1 < $GITHUB_WORKSPACE/ci/aarch64-o-largefile.patch
698700
patch -p1 < $GITHUB_WORKSPACE/ci/tcgets2-tcsets2.patch
701+
patch -p1 < $GITHUB_WORKSPACE/ci/more-sockopts.patch
699702
./configure --target-list=${{ matrix.qemu_target }} --prefix=${{ runner.tool_cache }}/qemu --disable-tools --disable-slirp --disable-fdt --disable-capstone --disable-docs
700703
ninja -C build install
701704
if: matrix.qemu != '' && matrix.os == 'ubuntu-latest'

ci/more-sockopts.patch

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
From Dan Gohman <dev@sunfishcode.online>
2+
Subject: [PATCH] Implement various socket options.
3+
4+
This implements the `SO_INCOMING_CPU`, `SO_COOKIE`, and `SO_PROTOCOL`
5+
socket options.
6+
7+
diff -ur -x roms -x build a/linux-user/generic/sockbits.h b/linux-user/generic/sockbits.h
8+
--- a/linux-user/generic/sockbits.h
9+
+++ b/linux-user/generic/sockbits.h
10+
@@ -60,4 +60,10 @@
11+
12+
#define TARGET_SO_PROTOCOL 38
13+
#define TARGET_SO_DOMAIN 39
14+
+#ifndef TARGET_SO_INCOMING_CPU
15+
+#define TARGET_SO_INCOMING_CPU 49
16+
+#endif
17+
+#ifndef TARGET_SO_COOKIE
18+
+#define TARGET_SO_COOKIE 57
19+
+#endif
20+
#endif
21+
diff -ur -x roms -x build a/linux-user/syscall.c b/linux-user/syscall.c
22+
--- a/linux-user/syscall.c
23+
+++ b/linux-user/syscall.c
24+
@@ -2476,6 +2476,9 @@
25+
case TARGET_SO_RCVLOWAT:
26+
optname = SO_RCVLOWAT;
27+
break;
28+
+ case TARGET_SO_INCOMING_CPU:
29+
+ optname = SO_INCOMING_CPU;
30+
+ break;
31+
default:
32+
goto unimplemented;
33+
}
34+
@@ -2534,6 +2537,7 @@
35+
{
36+
abi_long ret;
37+
int len, val;
38+
+ int64_t val64;
39+
socklen_t lv;
40+
41+
switch(level) {
42+
@@ -2733,6 +2737,27 @@
43+
case TARGET_SO_DOMAIN:
44+
optname = SO_DOMAIN;
45+
goto int_case;
46+
+ case TARGET_SO_INCOMING_CPU:
47+
+ optname = SO_INCOMING_CPU;
48+
+ goto int_case;
49+
+ case TARGET_SO_COOKIE:
50+
+ optname = SO_COOKIE;
51+
+ if (get_user_u32(len, optlen))
52+
+ return -TARGET_EFAULT;
53+
+ if (len < 0)
54+
+ return -TARGET_EINVAL;
55+
+ lv = sizeof(val64);
56+
+ ret = get_errno(getsockopt(sockfd, level, optname, &val64, &lv));
57+
+ if (ret < 0)
58+
+ return ret;
59+
+ if (len > lv)
60+
+ len = lv;
61+
+ assert(len == 8);
62+
+ if (put_user_u64(val64, optval_addr))
63+
+ return -TARGET_EFAULT;
64+
+ if (put_user_u32(len, optlen))
65+
+ return -TARGET_EFAULT;
66+
+ break;
67+
default:
68+
goto int_case;
69+
}
70+
@@ -2756,6 +2781,9 @@
71+
case SO_ERROR:
72+
val = host_to_target_errno(val);
73+
break;
74+
+ case SO_PROTOCOL:
75+
+ val = host_to_target_errno(val);
76+
+ break;
77+
}
78+
if (level == SOL_SOCKET && optname == SO_ERROR) {
79+
val = host_to_target_errno(val);

0 commit comments

Comments
 (0)