diff options
author | Christian Pointner <equinox@anytun.org> | 2017-08-22 21:53:30 +0200 |
---|---|---|
committer | Christian Pointner <equinox@anytun.org> | 2017-08-22 21:53:30 +0200 |
commit | 290bb34c744707fc8b14bcfe38002d4c5d229fba (patch) | |
tree | 4f2e19f7a49d56ded442cc9ba2c0b85728f2409e /tuntap | |
parent | ifname length mangling has been merged upstream (diff) |
make interface config more modular
Diffstat (limited to 'tuntap')
-rw-r--r-- | tuntap/tuntap.go | 57 |
1 files changed, 41 insertions, 16 deletions
diff --git a/tuntap/tuntap.go b/tuntap/tuntap.go index fd3b4ae..19b9bf8 100644 --- a/tuntap/tuntap.go +++ b/tuntap/tuntap.go @@ -53,30 +53,45 @@ const ( type Device struct { iface *extlib.Interface iftype extlib.DevKind + nl netlink.Link } func (dev *Device) Name() string { return dev.iface.Name() } -func (dev *Device) Configure(addr net.IPNet) error { +func (dev *Device) AddAddress(addr net.IPNet) error { // TODO: this only works on linux... - ln, err := netlink.LinkByName(dev.iface.Name()) - if err != nil { - return fmt.Errorf("netlink(open netlink by name) failed: %v", err) - } - if err = netlink.AddrAdd(ln, &netlink.Addr{IPNet: &addr}); err != nil { + if err := netlink.AddrAdd(dev.nl, &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 nil +} + +func (dev *Device) SetMTU(mtu int) error { + // TODO: this only works on linux... + if err := netlink.LinkSetMTU(dev.nl, mtu); err != nil { return fmt.Errorf("netlink(link set mtu) failed: %v", err) } - if err = netlink.LinkSetUp(ln); err != nil { + return nil +} + +func (dev *Device) Up() error { + // TODO: this only works on linux... + if err := netlink.LinkSetUp(dev.nl); err != nil { return fmt.Errorf("netlink(link set up) failed: %v", err) } return nil } +func (dev *Device) Down() error { + // TODO: this only works on linux... + if err := netlink.LinkSetDown(dev.nl); err != nil { + return fmt.Errorf("netlink(link set down) failed: %v", err) + } + return nil +} + func (dev *Device) RunPostUp(script string) error { ctx, cancel := context.WithTimeout(context.Background(), PostUpScriptTimeout) defer cancel() @@ -119,19 +134,29 @@ func NewTapDevice(name string) (dev *Device, err error) { func NewDevice(iftype, name string) (dev *Device, err error) { if iftype == "" { if strings.HasPrefix(name, "tun") { - return NewTunDevice(name) - } - if strings.HasPrefix(name, "tap") { - return NewTapDevice(name) + iftype = "tun" + } else if strings.HasPrefix(name, "tap") { + iftype = "tap" + } else { + return nil, fmt.Errorf("no device type is set and the given interface name(%s) doesn't start with 'tun' or 'tap'", name) } - return nil, fmt.Errorf("no device type is set and the given interface name(%s) doesn't start with 'tun' or 'tap'", name) } switch strings.ToLower(iftype) { case "tun": - return NewTunDevice(name) + dev, err = NewTunDevice(name) case "tap": - return NewTapDevice(name) + dev, err = NewTapDevice(name) + default: + return nil, fmt.Errorf("invalid interface type: %s", iftype) + } + if err != nil { + return nil, err + } + + // TODO: this only works on linux... + if dev.nl, err = netlink.LinkByName(dev.iface.Name()); err != nil { + return nil, fmt.Errorf("netlink(open netlink by name) failed: %v", err) } - return nil, fmt.Errorf("invalid interface type: %s", iftype) + return dev, nil } |