Skip to content

Commit d096a16

Browse files
committed
Add unbind control
1 parent 95fba22 commit d096a16

5 files changed

Lines changed: 34 additions & 0 deletions

File tree

common/control/bind.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ func BindToInterfaceFunc(finder InterfaceFinder, block func(network string, addr
2424
}
2525
}
2626

27+
func UnbindFromInterface() Func {
28+
return func(network, address string, conn syscall.RawConn) error {
29+
return unbindFromInterface(conn, network, address)
30+
}
31+
}
32+
2733
func BindToInterface0(finder InterfaceFinder, conn syscall.RawConn, network string, address string, interfaceName string, interfaceIndex int, preferInterfaceName bool) error {
2834
if interfaceName == "" && interfaceIndex == -1 {
2935
return E.New("interface not found: ", interfaceName)

common/control/bind_darwin.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,7 @@ func bindToInterface(conn syscall.RawConn, network string, address string, finde
2727
}
2828
})
2929
}
30+
31+
func unbindFromInterface(conn syscall.RawConn, network string, address string) error {
32+
return bindToInterface(conn, network, address, nil, "", 0, false)
33+
}

common/control/bind_linux.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,19 @@ func bindToInterface(conn syscall.RawConn, network string, address string, finde
4040
return unix.BindToDevice(int(fd), interfaceName)
4141
})
4242
}
43+
44+
func unbindFromInterface(conn syscall.RawConn, network string, address string) error {
45+
return Raw(conn, func(fd uintptr) error {
46+
if !ifIndexDisabled.Load() {
47+
err := unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_BINDTOIFINDEX, 0)
48+
if err == nil {
49+
return nil
50+
} else if E.IsMulti(err, unix.ENOPROTOOPT, unix.EINVAL) {
51+
ifIndexDisabled.Store(true)
52+
} else {
53+
return err
54+
}
55+
}
56+
return unix.BindToDevice(int(fd), "")
57+
})
58+
}

common/control/bind_other.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,7 @@ import "syscall"
77
func bindToInterface(conn syscall.RawConn, network string, address string, finder InterfaceFinder, interfaceName string, interfaceIndex int, preferInterfaceName bool) error {
88
return nil
99
}
10+
11+
func unbindFromInterface(conn syscall.RawConn, network string, address string) error {
12+
return nil
13+
}

common/control/bind_windows.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ func bindToInterface(conn syscall.RawConn, network string, address string, finde
4040
})
4141
}
4242

43+
func unbindFromInterface(conn syscall.RawConn, network string, address string) error {
44+
return bindToInterface(conn, network, address, nil, "", 0, false)
45+
}
46+
4347
const (
4448
IP_UNICAST_IF = 31
4549
IPV6_UNICAST_IF = 31

0 commit comments

Comments
 (0)