11package wireguard
22
33import (
4+ "errors"
45 "fmt"
56 "net"
67 "os/exec"
@@ -88,7 +89,7 @@ func createLinkUsingUserspaceImpl(iface string, wgUserspaceImplementationFallbac
8889
8990}
9091
91- func createLinkUsingKernalModule (iface string ) error {
92+ func createLinkUsingKernelModule (iface string ) error {
9293 // link not created
9394 wgLink := & netlink.GenericLink {
9495 LinkAttrs : netlink.LinkAttrs {
@@ -104,49 +105,25 @@ func createLinkUsingKernalModule(iface string) error {
104105 return nil
105106}
106107
107- func SyncLink (_ agent.State , iface string , wgUserspaceImplementationFallback string , wgUseUserspaceImpl bool ) error {
108- _ , err := netlink .LinkByName (iface )
108+ func SyncLink (state agent.State , iface string , wgUserspaceImplementationFallback string , wgUseUserspaceImpl bool ) error {
109+ link , err := netlink .LinkByName (iface )
109110 if err != nil {
110- if _ , ok := err .(netlink.LinkNotFoundError ); ! ok {
111- return err
112- }
113- }
111+ if errors .As (err , & netlink.LinkNotFoundError {}) {
112+ if wgUseUserspaceImpl {
113+ if err := createLinkUsingUserspaceImpl (iface , wgUserspaceImplementationFallback ); err != nil {
114+ return fmt .Errorf ("create link using user space impl: %w" , err )
115+ }
114116
115- if _ , ok := err .(netlink.LinkNotFoundError ); ok {
116- if wgUseUserspaceImpl {
117- err = createLinkUsingUserspaceImpl (iface , wgUserspaceImplementationFallback )
117+ } else if err := createLinkUsingKernelModule (iface ); err != nil {
118+ fmt .Printf ("could not create link using kernel module, will attempt to fallback to user space implementation: %v\n " , err )
118119
119- if err != nil {
120- return err
120+ // Fallback to user space implementation.
121+ wgUseUserspaceImpl = true
121122 }
122123
123- } else {
124- err = createLinkUsingKernalModule (iface )
125-
126- if err != nil {
127- err = createLinkUsingUserspaceImpl (iface , wgUserspaceImplementationFallback )
128-
129- if err != nil {
130- return err
131- }
132- }
133- }
134-
135- // TODO: Can this be removed?
136- link , err := netlink .LinkByName (iface )
137- if err != nil {
138- return err
139- }
140- if err := netlink .LinkSetUp (link ); err != nil {
141- return err
142- }
143- }
144-
145- link , err := netlink .LinkByName (iface )
146- if err != nil {
147- if _ , ok := err .(netlink.LinkNotFoundError ); ! ok {
148- return err
124+ return SyncLink (state , iface , wgUserspaceImplementationFallback , wgUseUserspaceImpl )
149125 }
126+ return fmt .Errorf ("link by name: %w" , err )
150127 }
151128
152129 addresses , err := netlink .AddrList (link , syscall .AF_INET )
@@ -165,7 +142,7 @@ func SyncLink(_ agent.State, iface string, wgUserspaceImplementationFallback str
165142 }
166143
167144 if err := netlink .LinkSetUp (link ); err != nil {
168- return err
145+ return fmt . Errorf ( "link set up: %w" , err )
169146 }
170147 return nil
171148}
0 commit comments