summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2023-03-23 18:38:34 +0100
committerJason A. Donenfeld <Jason@zx2c4.com>2023-03-23 18:39:00 +0100
commit3a9e75374f434e4cebadb6cfb322be3e2e80d0f0 (patch)
tree637653fe6b47a491e62a0c5d4f32fd77088ef031
parentcc20c08c9615edbb31b96c89201bf1b2189fe159 (diff)
conn: disable sticky sockets on Android
We can't have the netlink listener socket, so it's not possible to support it. Plus, android networking stack complexity makes it a bit tricky anyway, so best to leave it disabled. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-rw-r--r--conn/controlfns_linux.go17
-rw-r--r--conn/sticky_default.go4
-rw-r--r--conn/sticky_linux.go4
-rw-r--r--conn/sticky_linux_test.go2
-rw-r--r--device/sticky_linux.go3
5 files changed, 22 insertions, 8 deletions
diff --git a/conn/controlfns_linux.go b/conn/controlfns_linux.go
index aff6245..a2396fe 100644
--- a/conn/controlfns_linux.go
+++ b/conn/controlfns_linux.go
@@ -7,6 +7,7 @@ package conn
import (
"fmt"
+ "runtime"
"syscall"
"golang.org/x/sys/unix"
@@ -36,14 +37,18 @@ func init() {
var err error
switch network {
case "udp4":
- c.Control(func(fd uintptr) {
- err = unix.SetsockoptInt(int(fd), unix.IPPROTO_IP, unix.IP_PKTINFO, 1)
- })
+ if runtime.GOOS != "android" {
+ c.Control(func(fd uintptr) {
+ err = unix.SetsockoptInt(int(fd), unix.IPPROTO_IP, unix.IP_PKTINFO, 1)
+ })
+ }
case "udp6":
c.Control(func(fd uintptr) {
- err = unix.SetsockoptInt(int(fd), unix.IPPROTO_IPV6, unix.IPV6_RECVPKTINFO, 1)
- if err != nil {
- return
+ if runtime.GOOS != "android" {
+ err = unix.SetsockoptInt(int(fd), unix.IPPROTO_IPV6, unix.IPV6_RECVPKTINFO, 1)
+ if err != nil {
+ return
+ }
}
err = unix.SetsockoptInt(int(fd), unix.IPPROTO_IPV6, unix.IPV6_V6ONLY, 1)
})
diff --git a/conn/sticky_default.go b/conn/sticky_default.go
index 8c0adf5..05f00ea 100644
--- a/conn/sticky_default.go
+++ b/conn/sticky_default.go
@@ -1,4 +1,4 @@
-//go:build !linux
+//go:build !linux || android
/* SPDX-License-Identifier: MIT
*
@@ -23,3 +23,5 @@ func setSrcControl(control *[]byte, ep *StdNetEndpoint) {
// srcControlSize returns the recommended buffer size for pooling sticky control
// data.
const srcControlSize = 0
+
+const StdNetSupportsStickySockets = false
diff --git a/conn/sticky_linux.go b/conn/sticky_linux.go
index 278eb19..274fa38 100644
--- a/conn/sticky_linux.go
+++ b/conn/sticky_linux.go
@@ -1,3 +1,5 @@
+//go:build linux && !android
+
/* SPDX-License-Identifier: MIT
*
* Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
@@ -111,3 +113,5 @@ func setSrcControl(control *[]byte, ep *StdNetEndpoint) {
}
var srcControlSize = unix.CmsgSpace(unix.SizeofInet6Pktinfo)
+
+const StdNetSupportsStickySockets = true
diff --git a/conn/sticky_linux_test.go b/conn/sticky_linux_test.go
index 3213e77..0219ac3 100644
--- a/conn/sticky_linux_test.go
+++ b/conn/sticky_linux_test.go
@@ -1,4 +1,4 @@
-//go:build linux
+//go:build linux && !android
/* SPDX-License-Identifier: MIT
*
diff --git a/device/sticky_linux.go b/device/sticky_linux.go
index 3ce0769..f9230f8 100644
--- a/device/sticky_linux.go
+++ b/device/sticky_linux.go
@@ -25,6 +25,9 @@ import (
)
func (device *Device) startRouteListener(bind conn.Bind) (*rwcancel.RWCancel, error) {
+ if !conn.StdNetSupportsStickySockets {
+ return nil, nil
+ }
if _, ok := bind.(*conn.StdNetBind); !ok {
return nil, nil
}