conn: unbreak boundif on android

Another thing never tested ever.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
Jason A. Donenfeld 2020-06-07 01:41:08 -06:00
parent d6de6f3ce6
commit c403da6a39
4 changed files with 65 additions and 44 deletions

34
conn/boundif_android.go Normal file
View file

@ -0,0 +1,34 @@
/* SPDX-License-Identifier: MIT
*
* Copyright (C) 2017-2020 WireGuard LLC. All Rights Reserved.
*/
package conn
func (bind *nativeBind) PeekLookAtSocketFd4() (fd int, err error) {
sysconn, err := bind.ipv4.SyscallConn()
if err != nil {
return -1, err
}
err = sysconn.Control(func(f uintptr) {
fd = int(f)
})
if err != nil {
return -1, err
}
return
}
func (bind *nativeBind) PeekLookAtSocketFd6() (fd int, err error) {
sysconn, err := bind.ipv6.SyscallConn()
if err != nil {
return -1, err
}
err = sysconn.Control(func(f uintptr) {
fd = int(f)
})
if err != nil {
return -1, err
}
return
}

View file

@ -57,6 +57,13 @@ type BindSocketToInterface interface {
BindSocketToInterface6(interfaceIndex uint32, blackhole bool) error
}
// PeekLookAtSocketFd is implemented by Bind objects that support having their
// file descriptor peeked at.
type PeekLookAtSocketFd interface {
PeekLookAtSocketFd4() (fd int, err error)
PeekLookAtSocketFd6() (fd int, err error)
}
// An Endpoint maintains the source/destination caching for a peer.
//
// dst : the remote address of a peer ("endpoint" in uapi terminology)

View file

@ -34,3 +34,27 @@ func (device *Device) BindSocketToInterface6(interfaceIndex uint32, blackhole bo
}
return nil
}
// TODO(crawshaw): this method is a compatibility shim. Replace with direct use of conn.
func (device *Device) PeekLookAtSocketFd4() (fd int, err error) {
if device.net.bind == nil {
return -1, errors.New("Bind is not yet initialized")
}
if iface, ok := device.net.bind.(conn.PeekLookAtSocketFd); ok {
return iface.PeekLookAtSocketFd4()
}
return -1, errors.New("unimplemented")
}
// TODO(crawshaw): this method is a compatibility shim. Replace with direct use of conn.
func (device *Device) PeekLookAtSocketFd6() (fd int, err error) {
if device.net.bind == nil {
return -1, errors.New("Bind is not yet initialized")
}
if iface, ok := device.net.bind.(conn.PeekLookAtSocketFd); ok {
return iface.PeekLookAtSocketFd6()
}
return -1, errors.New("unimplemented")
}

View file

@ -1,44 +0,0 @@
/* SPDX-License-Identifier: MIT
*
* Copyright (C) 2017-2020 WireGuard LLC. All Rights Reserved.
*/
package device
import "errors"
func (device *Device) PeekLookAtSocketFd4() (fd int, err error) {
nb, ok := device.net.bind.(*nativeBind)
if !ok {
return 0, errors.New("no socket exists")
}
sysconn, err := nb.ipv4.SyscallConn()
if err != nil {
return
}
err = sysconn.Control(func(f uintptr) {
fd = int(f)
})
if err != nil {
return
}
return
}
func (device *Device) PeekLookAtSocketFd6() (fd int, err error) {
nb, ok := device.net.bind.(*nativeBind)
if !ok {
return 0, errors.New("no socket exists")
}
sysconn, err := nb.ipv6.SyscallConn()
if err != nil {
return
}
err = sysconn.Control(func(f uintptr) {
fd = int(f)
})
if err != nil {
return
}
return
}