diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2018-05-21 17:27:18 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2018-05-21 18:48:48 +0200 |
commit | ff3f2455e5cd74bd45c2f124a1d275462e33a4a0 (patch) | |
tree | c201e712664d808f8b166f9ac74f78dbfbcbb76a /conn_default.go | |
parent | b962d7d791bb13830d62d7ae326780b413463971 (diff) |
Rework freebsd support
Diffstat (limited to 'conn_default.go')
-rw-r--r-- | conn_default.go | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/conn_default.go b/conn_default.go index da6fa3d..9f1e0b0 100644 --- a/conn_default.go +++ b/conn_default.go @@ -9,7 +9,9 @@ package main import ( + "golang.org/x/sys/unix" "net" + "runtime" ) /* This code is meant to be a temporary solution @@ -138,6 +140,35 @@ func (bind *NativeBind) Send(buff []byte, endpoint Endpoint) error { return err } -func (bind *NativeBind) SetMark(_ uint32) error { +func (bind *NativeBind) SetMark(mark uint32) error { + if runtime.GOOS == "freebsd" { + fd4, err1 := bind.ipv4.SyscallConn() + fd6, err2 := bind.ipv6.SyscallConn() + if err1 != nil { + return err1 + } + if err2 != nil { + return err2 + } + err3 := fd4.Control(func(fd uintptr) { + err1 = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, 0x1014 /* unix.SO_SETFIB */, int(mark)) + }) + err4 := fd6.Control(func(fd uintptr) { + err2 = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, 0x1014 /* unix.SO_SETFIB */, int(mark)) + }) + if err1 != nil { + return err1 + } + if err2 != nil { + return err2 + } + if err3 != nil { + return err3 + } + if err4 != nil { + return err4 + } + return nil + } return nil } |