5
0
mirror of https://github.com/cwinfo/yggdrasil-go.git synced 2024-11-22 15:20:30 +00:00

Move tunDevice into router

This commit is contained in:
Neil Alexander 2018-12-14 17:35:02 +00:00
parent d9b376b3ad
commit 10157483f9
No known key found for this signature in database
GPG Key ID: A02A2019A2BB0944
4 changed files with 24 additions and 20 deletions

View File

@ -160,9 +160,9 @@ func (a *admin) init(c *Core, listenaddr string) {
}() }()
return admin_info{ return admin_info{
a.core.tun.iface.Name(): admin_info{ a.core.router.tun.iface.Name(): admin_info{
"tap_mode": a.core.tun.iface.IsTAP(), "tap_mode": a.core.router.tun.iface.IsTAP(),
"mtu": a.core.tun.mtu, "mtu": a.core.router.tun.mtu,
}, },
}, nil }, nil
}) })
@ -185,8 +185,8 @@ func (a *admin) init(c *Core, listenaddr string) {
return admin_info{}, errors.New("Failed to configure adapter") return admin_info{}, errors.New("Failed to configure adapter")
} else { } else {
return admin_info{ return admin_info{
a.core.tun.iface.Name(): admin_info{ a.core.router.tun.iface.Name(): admin_info{
"tap_mode": a.core.tun.iface.IsTAP(), "tap_mode": a.core.router.tun.iface.IsTAP(),
"mtu": ifmtu, "mtu": ifmtu,
}, },
}, nil }, nil
@ -539,12 +539,12 @@ func (a *admin) removePeer(p string) error {
// startTunWithMTU creates the tun/tap device, sets its address, and sets the MTU to the provided value. // startTunWithMTU creates the tun/tap device, sets its address, and sets the MTU to the provided value.
func (a *admin) startTunWithMTU(ifname string, iftapmode bool, ifmtu int) error { func (a *admin) startTunWithMTU(ifname string, iftapmode bool, ifmtu int) error {
// Close the TUN first if open // Close the TUN first if open
_ = a.core.tun.close() _ = a.core.router.tun.close()
// Then reconfigure and start it // Then reconfigure and start it
addr := a.core.router.addr addr := a.core.router.addr
straddr := fmt.Sprintf("%s/%v", net.IP(addr[:]).String(), 8*len(address_prefix)-1) straddr := fmt.Sprintf("%s/%v", net.IP(addr[:]).String(), 8*len(address_prefix)-1)
if ifname != "none" { if ifname != "none" {
err := a.core.tun.setup(ifname, iftapmode, straddr, ifmtu) err := a.core.router.tun.setup(ifname, iftapmode, straddr, ifmtu)
if err != nil { if err != nil {
return err return err
} }
@ -559,9 +559,9 @@ func (a *admin) startTunWithMTU(ifname string, iftapmode bool, ifmtu int) error
a.core.sessions.sendPingPong(sinfo, false) a.core.sessions.sendPingPong(sinfo, false)
} }
// Aaaaand... go! // Aaaaand... go!
go a.core.tun.read() go a.core.router.tun.read()
} }
go a.core.tun.write() go a.core.router.tun.write()
return nil return nil
} }

View File

@ -28,7 +28,6 @@ type Core struct {
sessions sessions sessions sessions
router router router router
dht dht dht dht
tun tunDevice
admin admin admin admin
searches searches searches searches
multicast multicast multicast multicast
@ -59,7 +58,6 @@ func (c *Core) init(bpub *boxPubKey,
c.peers.init(c) c.peers.init(c)
c.router.init(c) c.router.init(c)
c.switchTable.init(c, c.sigPub) // TODO move before peers? before router? c.switchTable.init(c, c.sigPub) // TODO move before peers? before router?
c.tun.init(c)
} }
// Get the current build name. This is usually injected if built from git, // Get the current build name. This is usually injected if built from git,
@ -188,7 +186,7 @@ func (c *Core) Start(nc *config.NodeConfig, log *log.Logger) error {
} }
ip := net.IP(c.router.addr[:]).String() ip := net.IP(c.router.addr[:]).String()
if err := c.tun.start(nc.IfName, nc.IfTAPMode, fmt.Sprintf("%s/%d", ip, 8*len(address_prefix)-1), nc.IfMTU); err != nil { if err := c.router.tun.start(nc.IfName, nc.IfTAPMode, fmt.Sprintf("%s/%d", ip, 8*len(address_prefix)-1), nc.IfMTU); err != nil {
c.log.Println("Failed to start TUN/TAP") c.log.Println("Failed to start TUN/TAP")
return err return err
} }
@ -200,7 +198,7 @@ func (c *Core) Start(nc *config.NodeConfig, log *log.Logger) error {
// Stops the Yggdrasil node. // Stops the Yggdrasil node.
func (c *Core) Stop() { func (c *Core) Stop() {
c.log.Println("Stopping...") c.log.Println("Stopping...")
c.tun.close() c.router.tun.close()
c.admin.close() c.admin.close()
} }
@ -293,10 +291,10 @@ func (c *Core) GetTUNDefaultIfTAPMode() bool {
// Gets the current TUN/TAP interface name. // Gets the current TUN/TAP interface name.
func (c *Core) GetTUNIfName() string { func (c *Core) GetTUNIfName() string {
return c.tun.iface.Name() return c.router.tun.iface.Name()
} }
// Gets the current TUN/TAP interface MTU. // Gets the current TUN/TAP interface MTU.
func (c *Core) GetTUNIfMTU() int { func (c *Core) GetTUNIfMTU() int {
return c.tun.mtu return c.router.tun.mtu
} }

View File

@ -30,6 +30,10 @@ import (
"golang.org/x/net/ipv6" "golang.org/x/net/ipv6"
) )
type adapter struct {
tunDevice
}
// The router struct has channels to/from the tun/tap device and a self peer (0), which is how messages are passed between this node and the peers/switch layer. // The router struct has channels to/from the tun/tap device and a self peer (0), which is how messages are passed between this node and the peers/switch layer.
// The router's mainLoop goroutine is responsible for managing all information related to the dht, searches, and crypto sessions. // The router's mainLoop goroutine is responsible for managing all information related to the dht, searches, and crypto sessions.
type router struct { type router struct {
@ -39,6 +43,7 @@ type router struct {
in <-chan []byte // packets we received from the network, link to peer's "out" in <-chan []byte // packets we received from the network, link to peer's "out"
out func([]byte) // packets we're sending to the network, link to peer's "in" out func([]byte) // packets we're sending to the network, link to peer's "in"
toRecv chan router_recvPacket // packets to handle via recvPacket() toRecv chan router_recvPacket // packets to handle via recvPacket()
tun tunDevice // TUN/TAP adapter
recv chan<- []byte // place where the tun pulls received packets from recv chan<- []byte // place where the tun pulls received packets from
send <-chan []byte // place where the tun puts outgoing packets send <-chan []byte // place where the tun puts outgoing packets
reset chan struct{} // signal that coords changed (re-init sessions/dht) reset chan struct{} // signal that coords changed (re-init sessions/dht)
@ -75,11 +80,12 @@ func (r *router) init(core *Core) {
send := make(chan []byte, 32) send := make(chan []byte, 32)
r.recv = recv r.recv = recv
r.send = send r.send = send
r.core.tun.recv = recv r.tun.recv = recv
r.core.tun.send = send r.tun.send = send
r.reset = make(chan struct{}, 1) r.reset = make(chan struct{}, 1)
r.admin = make(chan func(), 32) r.admin = make(chan func(), 32)
r.cryptokey.init(r.core) r.cryptokey.init(r.core)
r.tun.init(r.core)
// go r.mainLoop() // go r.mainLoop()
} }
@ -279,7 +285,7 @@ func (r *router) sendPacket(bs []byte) {
} }
// Create the ICMPv6 response from it // Create the ICMPv6 response from it
icmpv6Buf, err := r.core.tun.icmpv6.create_icmpv6_tun( icmpv6Buf, err := r.tun.icmpv6.create_icmpv6_tun(
bs[8:24], bs[24:40], bs[8:24], bs[24:40],
ipv6.ICMPTypeDestinationUnreachable, 1, ptb) ipv6.ICMPTypeDestinationUnreachable, 1, ptb)
if err == nil { if err == nil {
@ -304,7 +310,7 @@ func (r *router) sendPacket(bs []byte) {
} }
// Create the ICMPv6 response from it // Create the ICMPv6 response from it
icmpv6Buf, err := r.core.tun.icmpv6.create_icmpv6_tun( icmpv6Buf, err := r.tun.icmpv6.create_icmpv6_tun(
bs[8:24], bs[24:40], bs[8:24], bs[24:40],
ipv6.ICMPTypePacketTooBig, 0, ptb) ipv6.ICMPTypePacketTooBig, 0, ptb)
if err == nil { if err == nil {

View File

@ -273,7 +273,7 @@ func (ss *sessions) createSession(theirPermKey *boxPubKey) *sessionInfo {
sinfo.mySesPriv = *priv sinfo.mySesPriv = *priv
sinfo.myNonce = *newBoxNonce() sinfo.myNonce = *newBoxNonce()
sinfo.theirMTU = 1280 sinfo.theirMTU = 1280
sinfo.myMTU = uint16(ss.core.tun.mtu) sinfo.myMTU = uint16(ss.core.router.tun.mtu)
now := time.Now() now := time.Now()
sinfo.time = now sinfo.time = now
sinfo.mtuTime = now sinfo.mtuTime = now