summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/anygone.go14
-rw-r--r--app/conf.go16
-rw-r--r--tuntap/tuntap.go34
3 files changed, 48 insertions, 16 deletions
diff --git a/app/anygone.go b/app/anygone.go
index 8c1ca1b..239f4e8 100644
--- a/app/anygone.go
+++ b/app/anygone.go
@@ -75,9 +75,17 @@ func main() {
os.Exit(1)
}
- if err = dev.Configure(cfg.IFConfig.String(), cfg.PostUp); err != nil {
- al.Printf("Error while configuring device: %v", err)
- os.Exit(1)
+ if cfg.IFConfig.Valid {
+ if err = dev.Configure(cfg.IFConfig.Net); err != nil {
+ al.Printf("Error while configuring device: %v", err)
+ os.Exit(1)
+ }
+ }
+ if cfg.PostUp != "" {
+ if err = dev.RunPostUp(cfg.PostUp); err != nil {
+ al.Printf("Error while running post-up script: %v", err)
+ os.Exit(1)
+ }
}
for {
diff --git a/app/conf.go b/app/conf.go
index defe102..5066808 100644
--- a/app/conf.go
+++ b/app/conf.go
@@ -40,29 +40,29 @@ import (
"github.com/spf13/pflag"
)
-// IPNet adapts net.IPNet for use as a flag.
-type IPNet struct {
+type IPAddrCIDR struct {
Net net.IPNet
Valid bool
}
-func (ipnet IPNet) String() string {
+func (ipnet IPAddrCIDR) String() string {
if ipnet.Valid {
return ipnet.Net.String()
}
return ""
}
-func (ipnet *IPNet) Set(value string) error {
- _, n, err := net.ParseCIDR(strings.TrimSpace(value))
+func (ipnet *IPAddrCIDR) Set(value string) error {
+ ip, net, err := net.ParseCIDR(strings.TrimSpace(value))
if err != nil {
return err
}
- *ipnet = IPNet{*n, true}
+ net.IP = ip
+ *ipnet = IPAddrCIDR{*net, true}
return nil
}
-func (*IPNet) Type() string {
+func (*IPAddrCIDR) Type() string {
return "ipNet"
}
@@ -74,7 +74,7 @@ type Config struct {
Version bool
DeviceName string
DeviceType string
- IFConfig IPNet
+ IFConfig IPAddrCIDR
PostUp string
}
diff --git a/tuntap/tuntap.go b/tuntap/tuntap.go
index 27fd2b1..6c27171 100644
--- a/tuntap/tuntap.go
+++ b/tuntap/tuntap.go
@@ -32,22 +32,44 @@ package tuntap
import (
"fmt"
+ "net"
"strings"
extlib "github.com/lab11/go-tuntap/tuntap"
+ "github.com/vishvananda/netlink"
)
type Device struct {
iface *extlib.Interface
iftype extlib.DevKind
+ ifname string
}
-func (dev *Device) Configure(ip_mask string, postup string) error {
- fmt.Printf("running: ip link set up dev %s\n", dev.iface.Name())
- fmt.Printf("running: ip addr add dev %s %s\n", dev.iface.Name(), ip_mask)
- if postup != "" {
- fmt.Printf("running: %s %s\n", postup, dev.iface.Name())
+func (dev *Device) Name() string {
+ return dev.ifname
+}
+
+func (dev *Device) Configure(addr net.IPNet) error {
+ // TODO: this only works on linux...
+ ln, err := netlink.LinkByName(dev.ifname)
+ if err != nil {
+ return fmt.Errorf("netlink(open netlink by name) failed: %v", dev.ifname, err)
+ }
+ if err = netlink.AddrAdd(ln, &netlink.Addr{IPNet: &addr}); err != nil {
+ return fmt.Errorf("netlink(addr add) failed: %v", err)
+ }
+ if err = netlink.LinkSetMTU(ln, 1400); err != nil { // TODO: hardcoded value
+ return fmt.Errorf("netlink(link set mtu) failed: %v", err)
}
+ if err = netlink.LinkSetUp(ln); err != nil {
+ return fmt.Errorf("netlink(link set up) failed: %v", err)
+ }
+ return nil
+}
+
+func (dev *Device) RunPostUp(script string) error {
+ // TODO: implement this
+ fmt.Printf("running: %s %s\n", script, dev.iface.Name())
return nil
}
@@ -69,6 +91,7 @@ func NewTunDevice(name string) (dev *Device, err error) {
if dev.iface, err = extlib.Open(name, extlib.DevTun, true); err != nil {
return
}
+ dev.ifname = strings.TrimRight(dev.iface.Name(), "\x00") // TODO: fix this upstream
return
}
@@ -77,6 +100,7 @@ func NewTapDevice(name string) (dev *Device, err error) {
if dev.iface, err = extlib.Open(name, extlib.DevTap, false); err != nil {
return
}
+ dev.ifname = strings.TrimRight(dev.iface.Name(), "\x00") // TODO: fix this upstream
return
}