203554620d
The sticky socket code stays in the device package for now, as it reaches deeply into the peer list. This is the first step in an effort to split some code out of the very busy device package. Signed-off-by: David Crawshaw <crawshaw@tailscale.com>
66 lines
1.1 KiB
Go
66 lines
1.1 KiB
Go
// +build android openbsd freebsd
|
|
|
|
/* SPDX-License-Identifier: MIT
|
|
*
|
|
* Copyright (C) 2017-2019 WireGuard LLC. All Rights Reserved.
|
|
*/
|
|
|
|
package conn
|
|
|
|
import (
|
|
"runtime"
|
|
|
|
"golang.org/x/sys/unix"
|
|
)
|
|
|
|
var fwmarkIoctl int
|
|
|
|
func init() {
|
|
switch runtime.GOOS {
|
|
case "linux", "android":
|
|
fwmarkIoctl = 36 /* unix.SO_MARK */
|
|
case "freebsd":
|
|
fwmarkIoctl = 0x1015 /* unix.SO_USER_COOKIE */
|
|
case "openbsd":
|
|
fwmarkIoctl = 0x1021 /* unix.SO_RTABLE */
|
|
}
|
|
}
|
|
|
|
func (bind *nativeBind) SetMark(mark uint32) error {
|
|
var operr error
|
|
if fwmarkIoctl == 0 {
|
|
return nil
|
|
}
|
|
if bind.ipv4 != nil {
|
|
fd, err := bind.ipv4.SyscallConn()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = fd.Control(func(fd uintptr) {
|
|
operr = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, fwmarkIoctl, int(mark))
|
|
})
|
|
if err == nil {
|
|
err = operr
|
|
}
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
if bind.ipv6 != nil {
|
|
fd, err := bind.ipv6.SyscallConn()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = fd.Control(func(fd uintptr) {
|
|
operr = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, fwmarkIoctl, int(mark))
|
|
})
|
|
if err == nil {
|
|
err = operr
|
|
}
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|