add a udp close packet, and partial support for a removePeer admin call (sends close to UDP peers, but doesn't close TCP connections yet)

This commit is contained in:
Arceliar 2018-03-16 18:24:28 -05:00
parent 96399d586d
commit 0459f88b92
2 changed files with 95 additions and 3 deletions

View file

@ -3,6 +3,7 @@ package yggdrasil
import "net"
import "os"
import "bytes"
import "errors"
import "fmt"
import "sort"
import "strings"
@ -63,6 +64,13 @@ func (a *admin) init(c *Core, listenaddr string) {
*out = []byte("Failed to add peer: " + saddr[0] + "\n")
}
})
a.addHandler("removePeer", []string{"<peer>"}, func(out *[]byte, saddr ...string) {
if a.removePeer(saddr[0]) == nil {
*out = []byte("Removing peer: " + saddr[0] + "\n")
} else {
*out = []byte("Failed to remove peer: " + saddr[0] + "\n")
}
})
a.addHandler("setTunTap", []string{"<ifname|auto|none>", "[<tun|tap>]", "[<mtu>]"}, func(out *[]byte, ifparams ...string) {
// Set sane defaults
iftapmode := false
@ -216,6 +224,30 @@ func (a *admin) addPeer(p string) error {
return nil
}
func (a *admin) removePeer(p string) error {
pAddr := p
if p[:4] == "tcp:" || p[:4] == "udp:" {
pAddr = p[4:]
}
switch {
case len(p) >= 4 && p[:4] == "udp:":
// Connect to peer over UDP
udpAddr, err := net.ResolveUDPAddr("udp", pAddr)
if err != nil {
return err
}
var addr connAddr
addr.fromUDPAddr(udpAddr)
a.core.udp.sendClose(addr)
return nil
case len(p) >= 4 && p[:4] == "tcp:":
default:
// Connect to peer over TCP
return errors.New("Removing TCP peer not yet supported")
}
return nil
}
func (a *admin) startTunWithMTU(ifname string, iftapmode bool, ifmtu int) error {
// Close the TUN first if open
_ = a.core.tun.close()