summaryrefslogtreecommitdiff
path: root/tuntap
diff options
context:
space:
mode:
authorChristian Pointner <equinox@anytun.org>2017-08-22 21:53:30 +0200
committerChristian Pointner <equinox@anytun.org>2017-08-22 21:53:30 +0200
commit290bb34c744707fc8b14bcfe38002d4c5d229fba (patch)
tree4f2e19f7a49d56ded442cc9ba2c0b85728f2409e /tuntap
parentifname length mangling has been merged upstream (diff)
make interface config more modular
Diffstat (limited to 'tuntap')
-rw-r--r--tuntap/tuntap.go57
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
}