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 // decrease waitgroup to 0
go device.RoutineReceiveIncomming(ipv4.Version, netc.bind) go device.RoutineReceiveIncoming(ipv4.Version, netc.bind)
go device.RoutineReceiveIncomming(ipv6.Version, netc.bind) go device.RoutineReceiveIncoming(ipv6.Version, netc.bind)
device.log.Debug.Println("UDP bind has been updated") 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 := device.log.Debug
logDebug.Println("Routine, receive incomming, IP version:", IP) logDebug.Println("Routine, receive incoming, IP version:", IP)
for { for {

View file

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

View file

@ -321,8 +321,14 @@ func (peer *Peer) RoutineHandshakeInitiator() {
goto BeginHandshakes goto BeginHandshakes
case <-timeout.C: 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" "net"
"os" "os"
"strings" "strings"
"time"
"unsafe" "unsafe"
) )
@ -60,15 +61,32 @@ func (tun *NativeTun) File() *os.File {
return tun.fd 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() { func (tun *NativeTun) RoutineNetlinkListener() {
sock := int(C.bind_rtmgrp()) sock := int(C.bind_rtmgrp())
if sock < 0 { if sock < 0 {
tun.errors <- errors.New("Failed to create netlink event listener") tun.errors <- errors.New("Failed to create netlink event listener")
return return
} }
tun.events <- TUNEventUp // TODO: Fix network namespace problem
for msg := make([]byte, 1<<16); ; { for msg := make([]byte, 1<<16); ; {
msgn, _, _, _, err := unix.Recvmsg(sock, msg[:], nil, 0) 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.RoutineNetlinkListener()
go device.RoutineHackListener() // cross namespace
// set default MTU // set default MTU
@ -324,6 +343,7 @@ func CreateTUN(name string) (TUNDevice, error) {
} }
go device.RoutineNetlinkListener() go device.RoutineNetlinkListener()
go device.RoutineHackListener() // cross namespace
// set default MTU // set default MTU