From f2ca2fc7c1a0ee39825e5a995a9a40a3f3029397 Mon Sep 17 00:00:00 2001 From: braginini Date: Thu, 24 Jun 2021 11:02:40 +0200 Subject: [PATCH] refactort: extract method to create Wireguard interface using kernel module --- iface/iface.go | 2 +- iface/iface_configuration.go | 4 +- iface/iface_linux.go | 96 +++++++++++++++++++----------------- 3 files changed, 54 insertions(+), 48 deletions(-) diff --git a/iface/iface.go b/iface/iface.go index 38beba6fa..830a2ae52 100644 --- a/iface/iface.go +++ b/iface/iface.go @@ -5,5 +5,5 @@ package iface // Create Creates a new Wireguard interface, sets a given IP and brings it up. // Will reuse an existing one. func Create(iface string, address string) error { - return CreateInUserspace(iface, address) + return CreateWithUserspace(iface, address) } diff --git a/iface/iface_configuration.go b/iface/iface_configuration.go index f611a8553..cb2a95ebf 100644 --- a/iface/iface_configuration.go +++ b/iface/iface_configuration.go @@ -26,8 +26,8 @@ func ConfigureWithKeyGen(iface string) (*wgtypes.Key, error) { return &key, Configure(iface, key.String()) } -// CreateInUserspace Creates a new Wireguard interface, using wireguard-go userspace implementation -func CreateInUserspace(iface string, address string) error { +// CreateWithUserspace Creates a new Wireguard interface, using wireguard-go userspace implementation +func CreateWithUserspace(iface string, address string) error { var err error tunIface, err := tun.CreateTUN(iface, defaultMTU) if err != nil { diff --git a/iface/iface_linux.go b/iface/iface_linux.go index 283ec2505..5d63695fc 100644 --- a/iface/iface_linux.go +++ b/iface/iface_linux.go @@ -11,56 +11,62 @@ import ( func Create(iface string, address string) error { if WireguardModExists() { - attrs := netlink.NewLinkAttrs() - attrs.Name = iface - - link := wgLink{ - attrs: &attrs, - } - - log.Debugf("adding device: %s", iface) - err := netlink.LinkAdd(&link) - if os.IsExist(err) { - log.Infof("interface %s already exists. Will reuse.", iface) - } else if err != nil { - return err - } - - log.Debugf("adding address %s to interface: %s", address, iface) - addr, _ := netlink.ParseAddr(address) - err = netlink.AddrAdd(&link, addr) - if os.IsExist(err) { - log.Infof("interface %s already has the address: %s", iface, address) - } else if err != nil { - return err - } - err = assignAddr(address, iface) - if err != nil { - return err - } - - // todo do a discovery - log.Debugf("setting MTU: %s", iface) - err = netlink.LinkSetMTU(&link, defaultMTU) - if err != nil { - log.Errorf("error setting MTU on interface: %s", iface) - return err - } - - log.Debugf("bringing up interface: %s", iface) - err = netlink.LinkSetUp(&link) - if err != nil { - log.Errorf("error bringing up interface: %s", iface) - return err - } - - return nil + return CreateWithKernel(iface, address) } else { - return CreateInUserspace(iface, address) + return CreateWithUserspace(iface, address) } } +// CreateWithKernel Creates a new Wireguard interface using kernel Wireguard module. +// Works for Linux and offers much better network performance +func CreateWithKernel(iface string, address string) error { + attrs := netlink.NewLinkAttrs() + attrs.Name = iface + + link := wgLink{ + attrs: &attrs, + } + + log.Debugf("adding device: %s", iface) + err := netlink.LinkAdd(&link) + if os.IsExist(err) { + log.Infof("interface %s already exists. Will reuse.", iface) + } else if err != nil { + return err + } + + log.Debugf("adding address %s to interface: %s", address, iface) + addr, _ := netlink.ParseAddr(address) + err = netlink.AddrAdd(&link, addr) + if os.IsExist(err) { + log.Infof("interface %s already has the address: %s", iface, address) + } else if err != nil { + return err + } + err = assignAddr(address, iface) + if err != nil { + return err + } + + // todo do a discovery + log.Debugf("setting MTU: %s", iface) + err = netlink.LinkSetMTU(&link, defaultMTU) + if err != nil { + log.Errorf("error setting MTU on interface: %s", iface) + return err + } + + log.Debugf("bringing up interface: %s", iface) + err = netlink.LinkSetUp(&link) + if err != nil { + log.Errorf("error bringing up interface: %s", iface) + return err + } + + return nil +} + // assignAddr Adds IP address to the tunnel interface func assignAddr(address, name string) error { var err error