1
1
package wireguard
2
2
3
3
import (
4
+ "errors"
4
5
"fmt"
5
6
"net"
6
7
"os/exec"
@@ -88,7 +89,7 @@ func createLinkUsingUserspaceImpl(iface string, wgUserspaceImplementationFallbac
88
89
89
90
}
90
91
91
- func createLinkUsingKernalModule (iface string ) error {
92
+ func createLinkUsingKernelModule (iface string ) error {
92
93
// link not created
93
94
wgLink := & netlink.GenericLink {
94
95
LinkAttrs : netlink.LinkAttrs {
@@ -104,49 +105,25 @@ func createLinkUsingKernalModule(iface string) error {
104
105
return nil
105
106
}
106
107
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 )
109
110
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
+ }
114
116
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 )
118
119
119
- if err != nil {
120
- return err
120
+ // Fallback to user space implementation.
121
+ wgUseUserspaceImpl = true
121
122
}
122
123
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 )
149
125
}
126
+ return fmt .Errorf ("link by name: %w" , err )
150
127
}
151
128
152
129
addresses , err := netlink .AddrList (link , syscall .AF_INET )
@@ -165,7 +142,7 @@ func SyncLink(_ agent.State, iface string, wgUserspaceImplementationFallback str
165
142
}
166
143
167
144
if err := netlink .LinkSetUp (link ); err != nil {
168
- return err
145
+ return fmt . Errorf ( "link set up: %w" , err )
169
146
}
170
147
return nil
171
148
}
0 commit comments