1
0
mirror of https://git.zx2c4.com/wireguard-go synced 2024-11-15 01:05:15 +01:00

Added cross namespace TUN status detection

This commit is contained in:
Mathias Hall-Andersen 2017-11-29 18:46:31 +01:00
parent af464cff00
commit 471f7ff08e
5 changed files with 35 additions and 8 deletions

View File

@ -114,8 +114,8 @@ func updateBind(device *Device) error {
// decrease waitgroup to 0
go device.RoutineReceiveIncomming(ipv4.Version, netc.bind)
go device.RoutineReceiveIncomming(ipv6.Version, netc.bind)
go device.RoutineReceiveIncoming(ipv4.Version, netc.bind)
go device.RoutineReceiveIncoming(ipv6.Version, netc.bind)
device.log.Debug.Println("UDP bind has been updated")
}

View File

@ -93,10 +93,10 @@ func (device *Device) addToHandshakeQueue(
}
}
func (device *Device) RoutineReceiveIncomming(IP int, bind Bind) {
func (device *Device) RoutineReceiveIncoming(IP int, bind Bind) {
logDebug := device.log.Debug
logDebug.Println("Routine, receive incomming, IP version:", IP)
logDebug.Println("Routine, receive incoming, IP version:", IP)
for {

View File

@ -120,6 +120,7 @@ configure_peers() {
ip1 link set up dev wg1
ip2 link set up dev wg2
sleep 1
}
configure_peers

View File

@ -321,8 +321,14 @@ func (peer *Peer) RoutineHandshakeInitiator() {
goto BeginHandshakes
case <-timeout.C:
// TODO: Clear source address for peer
continue
// clear source address of peer
peer.mutex.Lock()
if peer.endpoint != nil {
peer.endpoint.ClearSrc()
}
peer.mutex.Unlock()
}
}

View File

@ -11,6 +11,7 @@ import (
"net"
"os"
"strings"
"time"
"unsafe"
)
@ -60,15 +61,32 @@ func (tun *NativeTun) File() *os.File {
return tun.fd
}
func (tun *NativeTun) RoutineHackListener() {
/* This is needed for the detection to work accross network namespaces
* If you are reading this and know a better method, please get in touch.
*/
fd := int(tun.fd.Fd())
for {
_, err := unix.Write(fd, nil)
switch err {
case unix.EINVAL:
tun.events <- TUNEventUp
case unix.EIO:
tun.events <- TUNEventDown
default:
}
time.Sleep(time.Second / 10)
}
}
func (tun *NativeTun) RoutineNetlinkListener() {
sock := int(C.bind_rtmgrp())
if sock < 0 {
tun.errors <- errors.New("Failed to create netlink event listener")
return
}
tun.events <- TUNEventUp // TODO: Fix network namespace problem
for msg := make([]byte, 1<<16); ; {
msgn, _, _, _, err := unix.Recvmsg(sock, msg[:], nil, 0)
@ -269,6 +287,7 @@ func CreateTUNFromFile(name string, fd *os.File) (TUNDevice, error) {
}
go device.RoutineNetlinkListener()
go device.RoutineHackListener() // cross namespace
// set default MTU
@ -324,6 +343,7 @@ func CreateTUN(name string) (TUNDevice, error) {
}
go device.RoutineNetlinkListener()
go device.RoutineHackListener() // cross namespace
// set default MTU