From d597ee5f835e4e71c2a1a711eb4d0cf8705d36c4 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Sun, 13 Aug 2017 22:27:35 +0200 Subject: basic interface configuration works now --- tuntap/tuntap.go | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) (limited to 'tuntap') 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 } -- cgit v1.2.3