// +build android openbsd freebsd /* SPDX-License-Identifier: MIT * * Copyright (C) 2017-2019 WireGuard LLC. All Rights Reserved. */ package device 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 }