diff --git a/src/yggdrasil/awdl.go b/src/yggdrasil/awdl.go index e9e57a61..42366888 100644 --- a/src/yggdrasil/awdl.go +++ b/src/yggdrasil/awdl.go @@ -54,14 +54,14 @@ func (a *awdl) init(l *link) error { return nil } -func (a *awdl) create(name, local, remote string) (*awdlInterface, error) { +func (a *awdl) create(name, local, remote string, incoming bool) (*awdlInterface, error) { rwc := awdlReadWriteCloser{ fromAWDL: make(chan []byte, 1), toAWDL: make(chan []byte, 1), } s := stream{} s.init(rwc) - linkif, err := a.link.create(&s, name, "awdl", local, remote) + linkif, err := a.link.create(&s, name, "awdl", local, remote, incoming, true) if err != nil { return nil, err } diff --git a/src/yggdrasil/link.go b/src/yggdrasil/link.go index e52ff955..2d2155c9 100644 --- a/src/yggdrasil/link.go +++ b/src/yggdrasil/link.go @@ -40,12 +40,14 @@ type linkInterfaceMsgIO interface { } type linkInterface struct { - name string - link *link - peer *peer - msgIO linkInterfaceMsgIO - info linkInfo - closed chan struct{} + name string + link *link + peer *peer + msgIO linkInterfaceMsgIO + info linkInfo + incoming bool + force bool + closed chan struct{} } func (l *link) init(c *Core) error { @@ -62,7 +64,7 @@ func (l *link) init(c *Core) error { return nil } -func (l *link) create(msgIO linkInterfaceMsgIO, name, linkType, local, remote string) (*linkInterface, error) { +func (l *link) create(msgIO linkInterfaceMsgIO, name, linkType, local, remote string, incoming, force bool) (*linkInterface, error) { // Technically anything unique would work for names, but lets pick something human readable, just for debugging intf := linkInterface{ name: name, @@ -73,6 +75,8 @@ func (l *link) create(msgIO linkInterfaceMsgIO, name, linkType, local, remote st local: local, remote: remote, }, + incoming: incoming, + force: force, } //l.interfaces[intf.name] = &intf //go intf.start() @@ -106,7 +110,7 @@ func (intf *linkInterface) handler() error { return errors.New("failed to connect: wrong version") } // Check if we're authorized to connect to this key / IP - if !intf.link.core.peers.isAllowedEncryptionPublicKey(&meta.box) { + if !intf.force && !intf.link.core.peers.isAllowedEncryptionPublicKey(&meta.box) { intf.link.core.log.Debugf("%s connection to %s forbidden: AllowedEncryptionPublicKeys does not contain key %s", strings.ToUpper(intf.info.linkType), intf.info.remote, hex.EncodeToString(meta.box[:])) intf.msgIO.close() @@ -154,19 +158,14 @@ func (intf *linkInterface) handler() error { out <- msg } intf.peer.linkOut = make(chan []byte, 1) - intf.peer.close = func() { - intf.msgIO.close() - // Make output - themAddr := address.AddrForNodeID(crypto.GetNodeID(&intf.info.box)) - themAddrString := net.IP(themAddr[:]).String() - themString := fmt.Sprintf("%s@%s", themAddrString, intf.info.remote) - intf.link.core.log.Infof("Disconnected %s: %s, source %s", - strings.ToUpper(intf.info.linkType), themString, intf.info.local) - } - // Make output themAddr := address.AddrForNodeID(crypto.GetNodeID(&intf.info.box)) themAddrString := net.IP(themAddr[:]).String() themString := fmt.Sprintf("%s@%s", themAddrString, intf.info.remote) + intf.peer.close = func() { + intf.msgIO.close() + intf.link.core.log.Infof("Disconnected %s: %s, source %s", + strings.ToUpper(intf.info.linkType), themString, intf.info.local) + } intf.link.core.log.Infof("Connected %s: %s, source %s", strings.ToUpper(intf.info.linkType), themString, intf.info.local) // Start the link loop diff --git a/src/yggdrasil/mobile.go b/src/yggdrasil/mobile.go index 52215f06..76fbe54d 100644 --- a/src/yggdrasil/mobile.go +++ b/src/yggdrasil/mobile.go @@ -5,10 +5,11 @@ package yggdrasil import ( "encoding/hex" "encoding/json" - "log" "os" "time" + "github.com/gologme/log" + hjson "github.com/hjson/hjson-go" "github.com/mitchellh/mapstructure" "github.com/yggdrasil-network/yggdrasil-go/src/config" diff --git a/src/yggdrasil/mobile_ios.go b/src/yggdrasil/mobile_ios.go index c2ec63be..7b089992 100644 --- a/src/yggdrasil/mobile_ios.go +++ b/src/yggdrasil/mobile_ios.go @@ -29,8 +29,8 @@ func (nsl MobileLogger) Write(p []byte) (n int, err error) { return len(p), nil } -func (c *Core) AWDLCreateInterface(name, local, remote string) error { - if intf, err := c.link.awdl.create(name, local, remote); err != nil || intf == nil { +func (c *Core) AWDLCreateInterface(name, local, remote string, incoming bool) error { + if intf, err := c.link.awdl.create(name, local, remote, incoming); err != nil || intf == nil { c.log.Println("c.link.awdl.create:", err) return err } diff --git a/src/yggdrasil/tcp.go b/src/yggdrasil/tcp.go index 617aa225..979bc81b 100644 --- a/src/yggdrasil/tcp.go +++ b/src/yggdrasil/tcp.go @@ -284,8 +284,9 @@ func (iface *tcpInterface) handler(sock net.Conn, incoming bool) { stream.init(sock) local, _, _ := net.SplitHostPort(sock.LocalAddr().String()) remote, _, _ := net.SplitHostPort(sock.RemoteAddr().String()) + remotelinklocal := net.ParseIP(remote).IsLinkLocalUnicast() name := "tcp://" + sock.RemoteAddr().String() - link, err := iface.core.link.create(&stream, name, "tcp", local, remote) + link, err := iface.core.link.create(&stream, name, "tcp", local, remote, incoming, remotelinklocal) if err != nil { iface.core.log.Println(err) panic(err)