17
17
package wireguard
18
18
19
19
import (
20
+ "cmp"
20
21
"context"
21
22
"encoding/json"
22
23
"fmt"
@@ -101,6 +102,7 @@ func (n *network) Run(ctx context.Context) {
101
102
102
103
type wireguardLeaseAttrs struct {
103
104
PublicKey string
105
+ Port uint16
104
106
}
105
107
106
108
// Select the endpoint address that is most likely to allow for a successful
@@ -115,24 +117,20 @@ type wireguardLeaseAttrs struct {
115
117
// address will only have a small chance of succeeding (ipv6 masquarading is
116
118
// very rare)
117
119
// - If neither is true default to ipv4 and cross fingers.
118
- func (n * network ) selectPublicEndpoint (ip4 * ip.IP4 , ip6 * ip.IP6 ) string {
120
+ func (n * network ) autoMode (ip4 * ip.IP4 , ip6 * ip.IP6 ) Mode {
119
121
if ip4 != nil && ip6 == nil {
120
- return ip4 . String ()
122
+ return Ipv4
121
123
}
122
-
123
124
if ip4 == nil && ip6 != nil {
124
- return fmt . Sprintf ( "[%s]" , ip6 . String ())
125
+ return Ipv6
125
126
}
126
-
127
127
if ! ip4 .IsPrivate () && n .extIface .ExtAddr != nil {
128
- return ip4 . String ()
128
+ return Ipv4
129
129
}
130
-
131
130
if ! ip6 .IsPrivate () && n .extIface .ExtV6Addr != nil && ! ip .FromIP6 (n .extIface .ExtV6Addr ).IsPrivate () {
132
- return fmt . Sprintf ( "[%s]" , ip6 . String ())
131
+ return Ipv6
133
132
}
134
-
135
- return ip4 .String ()
133
+ return Ipv4
136
134
}
137
135
138
136
func (n * network ) handleSubnetEvents (ctx context.Context , batch []lease.Event ) {
@@ -169,12 +167,18 @@ func (n *network) handleSubnetEvents(ctx context.Context, batch []lease.Event) {
169
167
subnets = append (subnets , event .Lease .IPv6Subnet .ToIPNet ()) //only used if n.mode != Separate
170
168
}
171
169
170
+ // default to the port in the attr, but use the device's listen port
171
+ // if it's not set for backwards compatibility with older flannel
172
+ // versions.
173
+ v4Port := cmp .Or (v4wireguardAttrs .Port , uint16 (n .dev .attrs .listenPort ))
174
+ v6Port := cmp .Or (v6wireguardAttrs .Port , uint16 (n .v6Dev .attrs .listenPort ))
175
+ v4PeerEndpoint := fmt .Sprintf ("%s:%d" , event .Lease .Attrs .PublicIP .String (), v4Port )
176
+ v6PeerEndpoint := fmt .Sprintf ("%s:%d" , event .Lease .Attrs .PublicIPv6 .String (), v6Port )
172
177
if n .mode == Separate {
173
178
if event .Lease .EnableIPv4 {
174
- publicEndpoint := fmt .Sprintf ("%s:%d" , event .Lease .Attrs .PublicIP .String (), n .dev .attrs .listenPort )
175
- log .Infof ("Subnet added: %v via %v" , event .Lease .Subnet , publicEndpoint )
179
+ log .Infof ("Subnet added: %v via %v" , event .Lease .Subnet , v4PeerEndpoint )
176
180
if err := n .dev .addPeer (
177
- publicEndpoint ,
181
+ v4PeerEndpoint ,
178
182
v4wireguardAttrs .PublicKey ,
179
183
[]net.IPNet {* event .Lease .Subnet .ToIPNet ()}); err != nil {
180
184
log .Errorf ("failed to setup ipv4 peer (%s): %v" , v4wireguardAttrs .PublicKey , err )
@@ -190,10 +194,9 @@ func (n *network) handleSubnetEvents(ctx context.Context, batch []lease.Event) {
190
194
}
191
195
192
196
if event .Lease .EnableIPv6 {
193
- publicEndpoint := fmt .Sprintf ("[%s]:%d" , event .Lease .Attrs .PublicIPv6 .String (), n .v6Dev .attrs .listenPort )
194
- log .Infof ("Subnet added: %v via %v" , event .Lease .IPv6Subnet , publicEndpoint )
197
+ log .Infof ("Subnet added: %v via %v" , event .Lease .IPv6Subnet , v6PeerEndpoint )
195
198
if err := n .v6Dev .addPeer (
196
- publicEndpoint ,
199
+ v6PeerEndpoint ,
197
200
v6wireguardAttrs .PublicKey ,
198
201
[]net.IPNet {* event .Lease .IPv6Subnet .ToIPNet ()}); err != nil {
199
202
log .Errorf ("failed to setup ipv6 peer (%s): %v" , v6wireguardAttrs .PublicKey , err )
@@ -209,14 +212,17 @@ func (n *network) handleSubnetEvents(ctx context.Context, batch []lease.Event) {
209
212
}
210
213
} else {
211
214
var publicEndpoint string
212
- if n .mode == Ipv4 {
213
- publicEndpoint = fmt .Sprintf ("%s:%d" , event .Lease .Attrs .PublicIP .String (), n .dev .attrs .listenPort )
214
- } else if n .mode == Ipv6 {
215
- publicEndpoint = fmt .Sprintf ("[%s]:%d" , event .Lease .Attrs .PublicIPv6 .String (), n .dev .attrs .listenPort )
216
- } else { // Auto mode
217
- publicEndpoint = fmt .Sprintf ("%s:%d" ,
218
- n .selectPublicEndpoint (& event .Lease .Attrs .PublicIP , event .Lease .Attrs .PublicIPv6 ),
219
- n .dev .attrs .listenPort )
215
+ mode := n .mode
216
+ if mode == Auto {
217
+ mode = n .autoMode (& event .Lease .Attrs .PublicIP , event .Lease .Attrs .PublicIPv6 )
218
+ }
219
+ switch mode {
220
+ case Ipv4 :
221
+ publicEndpoint = v4PeerEndpoint
222
+ case Ipv6 :
223
+ publicEndpoint = v6PeerEndpoint
224
+ default :
225
+ panic (fmt .Sprintf ("inexhaustive match: %v" , mode ))
220
226
}
221
227
222
228
log .Infof ("Subnet(s) added: %v via %v" , subnets , publicEndpoint )
0 commit comments