25 lines
673 B
Go
25 lines
673 B
Go
|
// Copyright (c) Tailscale Inc & AUTHORS
|
||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||
|
|
||
|
//go:build ios || darwin
|
||
|
|
||
|
package captivedetection
|
||
|
|
||
|
import (
|
||
|
"syscall"
|
||
|
|
||
|
"golang.org/x/sys/unix"
|
||
|
"tailscale.com/types/logger"
|
||
|
)
|
||
|
|
||
|
// setSocketInterfaceIndex sets the IP_BOUND_IF socket option on the given RawConn.
|
||
|
// This forces the socket to use the given interface.
|
||
|
func setSocketInterfaceIndex(c syscall.RawConn, ifIndex int, logf logger.Logf) error {
|
||
|
return c.Control((func(fd uintptr) {
|
||
|
err := unix.SetsockoptInt(int(fd), unix.IPPROTO_IP, unix.IP_BOUND_IF, ifIndex)
|
||
|
if err != nil {
|
||
|
logf("captivedetection: failed to set IP_BOUND_IF (ifIndex=%d): %v", ifIndex, err)
|
||
|
}
|
||
|
}))
|
||
|
}
|