Codebase list wireguard-go / 0c2a60d
Import upstream version 0.0.20230223 Debian Janitor 1 year, 1 month ago
84 changed file(s) with 439 addition(s) and 1560 deletion(s). Raw diff Collapse all Expand all
5555
5656 ## License
5757
58 Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
58 Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
5959
6060 Permission is hereby granted, free of charge, to any person obtaining a copy of
6161 this software and associated documentation files (the "Software"), to deal in
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package conn
330330
331331 fd, err := unix.Socket(
332332 unix.AF_INET,
333 unix.SOCK_DGRAM,
333 unix.SOCK_DGRAM|unix.SOCK_CLOEXEC,
334334 0,
335335 )
336336 if err != nil {
372372
373373 fd, err := unix.Socket(
374374 unix.AF_INET6,
375 unix.SOCK_DGRAM,
375 unix.SOCK_DGRAM|unix.SOCK_CLOEXEC,
376376 0,
377377 )
378378 if err != nil {
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package conn
2626
2727 func NewStdNetBind() Bind { return &StdNetBind{} }
2828
29 type StdNetEndpoint net.UDPAddr
29 type StdNetEndpoint netip.AddrPort
3030
3131 var (
3232 _ Bind = (*StdNetBind)(nil)
33 _ Endpoint = (*StdNetEndpoint)(nil)
33 _ Endpoint = StdNetEndpoint{}
3434 )
3535
3636 func (*StdNetBind) ParseEndpoint(s string) (Endpoint, error) {
3737 e, err := netip.ParseAddrPort(s)
38 return (*StdNetEndpoint)(&net.UDPAddr{
39 IP: e.Addr().AsSlice(),
40 Port: int(e.Port()),
41 Zone: e.Addr().Zone(),
42 }), err
43 }
44
45 func (*StdNetEndpoint) ClearSrc() {}
46
47 func (e *StdNetEndpoint) DstIP() netip.Addr {
48 a, _ := netip.AddrFromSlice((*net.UDPAddr)(e).IP)
49 return a
50 }
51
52 func (e *StdNetEndpoint) SrcIP() netip.Addr {
38 return asEndpoint(e), err
39 }
40
41 func (StdNetEndpoint) ClearSrc() {}
42
43 func (e StdNetEndpoint) DstIP() netip.Addr {
44 return (netip.AddrPort)(e).Addr()
45 }
46
47 func (e StdNetEndpoint) SrcIP() netip.Addr {
5348 return netip.Addr{} // not supported
5449 }
5550
56 func (e *StdNetEndpoint) DstToBytes() []byte {
57 addr := (*net.UDPAddr)(e)
58 out := addr.IP.To4()
59 if out == nil {
60 out = addr.IP
61 }
62 out = append(out, byte(addr.Port&0xff))
63 out = append(out, byte((addr.Port>>8)&0xff))
64 return out
65 }
66
67 func (e *StdNetEndpoint) DstToString() string {
68 return (*net.UDPAddr)(e).String()
69 }
70
71 func (e *StdNetEndpoint) SrcToString() string {
51 func (e StdNetEndpoint) DstToBytes() []byte {
52 b, _ := (netip.AddrPort)(e).MarshalBinary()
53 return b
54 }
55
56 func (e StdNetEndpoint) DstToString() string {
57 return (netip.AddrPort)(e).String()
58 }
59
60 func (e StdNetEndpoint) SrcToString() string {
7261 return ""
7362 }
7463
161150
162151 func (*StdNetBind) makeReceiveIPv4(conn *net.UDPConn) ReceiveFunc {
163152 return func(buff []byte) (int, Endpoint, error) {
164 n, endpoint, err := conn.ReadFromUDP(buff)
165 if endpoint != nil {
166 endpoint.IP = endpoint.IP.To4()
167 }
168 return n, (*StdNetEndpoint)(endpoint), err
153 n, endpoint, err := conn.ReadFromUDPAddrPort(buff)
154 return n, asEndpoint(endpoint), err
169155 }
170156 }
171157
172158 func (*StdNetBind) makeReceiveIPv6(conn *net.UDPConn) ReceiveFunc {
173159 return func(buff []byte) (int, Endpoint, error) {
174 n, endpoint, err := conn.ReadFromUDP(buff)
175 return n, (*StdNetEndpoint)(endpoint), err
160 n, endpoint, err := conn.ReadFromUDPAddrPort(buff)
161 return n, asEndpoint(endpoint), err
176162 }
177163 }
178164
179165 func (bind *StdNetBind) Send(buff []byte, endpoint Endpoint) error {
180166 var err error
181 nend, ok := endpoint.(*StdNetEndpoint)
167 nend, ok := endpoint.(StdNetEndpoint)
182168 if !ok {
183169 return ErrWrongEndpointType
184170 }
171 addrPort := netip.AddrPort(nend)
185172
186173 bind.mu.Lock()
187174 blackhole := bind.blackhole4
188175 conn := bind.ipv4
189 if nend.IP.To4() == nil {
176 if addrPort.Addr().Is6() {
190177 blackhole = bind.blackhole6
191178 conn = bind.ipv6
192179 }
198185 if conn == nil {
199186 return syscall.EAFNOSUPPORT
200187 }
201 _, err = conn.WriteToUDP(buff, (*net.UDPAddr)(nend))
188 _, err = conn.WriteToUDPAddrPort(buff, addrPort)
202189 return err
203190 }
191
192 // endpointPool contains a re-usable set of mapping from netip.AddrPort to Endpoint.
193 // This exists to reduce allocations: Putting a netip.AddrPort in an Endpoint allocates,
194 // but Endpoints are immutable, so we can re-use them.
195 var endpointPool = sync.Pool{
196 New: func() any {
197 return make(map[netip.AddrPort]Endpoint)
198 },
199 }
200
201 // asEndpoint returns an Endpoint containing ap.
202 func asEndpoint(ap netip.AddrPort) Endpoint {
203 m := endpointPool.Get().(map[netip.AddrPort]Endpoint)
204 defer endpointPool.Put(m)
205 e, ok := m[ap]
206 if !ok {
207 e = Endpoint(StdNetEndpoint(ap))
208 m[ap] = e
209 }
210 return e
211 }
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package conn
7373 type WinRingBind struct {
7474 v4, v6 afWinRingBind
7575 mu sync.RWMutex
76 isOpen uint32
76 isOpen atomic.Uint32 // 0, 1, or 2
7777 }
7878
7979 func NewDefaultBind() Bind { return NewWinRingBind() }
211211 }
212212
213213 func (bind *WinRingBind) closeAndZero() {
214 atomic.StoreUint32(&bind.isOpen, 0)
214 bind.isOpen.Store(0)
215215 bind.v4.CloseAndZero()
216216 bind.v6.CloseAndZero()
217217 }
275275 bind.closeAndZero()
276276 }
277277 }()
278 if atomic.LoadUint32(&bind.isOpen) != 0 {
278 if bind.isOpen.Load() != 0 {
279279 return nil, 0, ErrBindAlreadyOpen
280280 }
281281 var sa windows.Sockaddr
298298 return nil, 0, err
299299 }
300300 }
301 atomic.StoreUint32(&bind.isOpen, 1)
301 bind.isOpen.Store(1)
302302 return []ReceiveFunc{bind.receiveIPv4, bind.receiveIPv6}, selectedPort, err
303303 }
304304
305305 func (bind *WinRingBind) Close() error {
306306 bind.mu.RLock()
307 if atomic.LoadUint32(&bind.isOpen) != 1 {
307 if bind.isOpen.Load() != 1 {
308308 bind.mu.RUnlock()
309309 return nil
310310 }
311 atomic.StoreUint32(&bind.isOpen, 2)
311 bind.isOpen.Store(2)
312312 windows.PostQueuedCompletionStatus(bind.v4.rx.iocp, 0, 0, nil)
313313 windows.PostQueuedCompletionStatus(bind.v4.tx.iocp, 0, 0, nil)
314314 windows.PostQueuedCompletionStatus(bind.v6.rx.iocp, 0, 0, nil)
344344 //go:linkname procyield runtime.procyield
345345 func procyield(cycles uint32)
346346
347 func (bind *afWinRingBind) Receive(buf []byte, isOpen *uint32) (int, Endpoint, error) {
348 if atomic.LoadUint32(isOpen) != 1 {
347 func (bind *afWinRingBind) Receive(buf []byte, isOpen *atomic.Uint32) (int, Endpoint, error) {
348 if isOpen.Load() != 1 {
349349 return 0, nil, net.ErrClosed
350350 }
351351 bind.rx.mu.Lock()
358358 count = 0
359359 for tries := 0; count == 0 && tries < receiveSpins; tries++ {
360360 if tries > 0 {
361 if atomic.LoadUint32(isOpen) != 1 {
361 if isOpen.Load() != 1 {
362362 return 0, nil, net.ErrClosed
363363 }
364364 procyield(1)
377377 if err != nil {
378378 return 0, nil, err
379379 }
380 if atomic.LoadUint32(isOpen) != 1 {
380 if isOpen.Load() != 1 {
381381 return 0, nil, net.ErrClosed
382382 }
383383 count = winrio.DequeueCompletion(bind.rx.cq, results[:])
394394 // huge packets. Just try again when this happens. The infinite loop this could cause is still limited to
395395 // attacker bandwidth, just like the rest of the receive path.
396396 if windows.Errno(results[0].Status) == windows.WSAEMSGSIZE {
397 if atomic.LoadUint32(isOpen) != 1 {
397 if isOpen.Load() != 1 {
398398 return 0, nil, net.ErrClosed
399399 }
400400 goto retry
420420 return bind.v6.Receive(buf, &bind.isOpen)
421421 }
422422
423 func (bind *afWinRingBind) Send(buf []byte, nend *WinRingEndpoint, isOpen *uint32) error {
424 if atomic.LoadUint32(isOpen) != 1 {
423 func (bind *afWinRingBind) Send(buf []byte, nend *WinRingEndpoint, isOpen *atomic.Uint32) error {
424 if isOpen.Load() != 1 {
425425 return net.ErrClosed
426426 }
427427 if len(buf) > bytesPerPacket {
443443 if err != nil {
444444 return err
445445 }
446 if atomic.LoadUint32(isOpen) != 1 {
446 if isOpen.Load() != 1 {
447447 return net.ErrClosed
448448 }
449449 count = winrio.DequeueCompletion(bind.tx.cq, results[:])
537537 func (bind *WinRingBind) BindSocketToInterface4(interfaceIndex uint32, blackhole bool) error {
538538 bind.mu.RLock()
539539 defer bind.mu.RUnlock()
540 if atomic.LoadUint32(&bind.isOpen) != 1 {
540 if bind.isOpen.Load() != 1 {
541541 return net.ErrClosed
542542 }
543543 err := bindSocketToInterface4(bind.v4.sock, interfaceIndex)
551551 func (bind *WinRingBind) BindSocketToInterface6(interfaceIndex uint32, blackhole bool) error {
552552 bind.mu.RLock()
553553 defer bind.mu.RUnlock()
554 if atomic.LoadUint32(&bind.isOpen) != 1 {
554 if bind.isOpen.Load() != 1 {
555555 return net.ErrClosed
556556 }
557557 err := bindSocketToInterface6(bind.v6.sock, interfaceIndex)
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2019-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package bindtest
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package conn
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 // Package conn implements WireGuard's network connections.
11
22 /* SPDX-License-Identifier: MIT
33 *
4 * Copyright (C) 2019-2021 WireGuard LLC. All Rights Reserved.
4 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
55 */
66
77 package conn
11
22 /* SPDX-License-Identifier: MIT
33 *
4 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
4 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
55 */
66
77 package conn
11
22 /* SPDX-License-Identifier: MIT
33 *
4 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
4 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
55 */
66
77 package conn
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package winrio
+0
-65
device/alignment_test.go less more
0 /* SPDX-License-Identifier: MIT
1 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
3 */
4
5 package device
6
7 import (
8 "reflect"
9 "testing"
10 "unsafe"
11 )
12
13 func checkAlignment(t *testing.T, name string, offset uintptr) {
14 t.Helper()
15 if offset%8 != 0 {
16 t.Errorf("offset of %q within struct is %d bytes, which does not align to 64-bit word boundaries (missing %d bytes). Atomic operations will crash on 32-bit systems.", name, offset, 8-(offset%8))
17 }
18 }
19
20 // TestPeerAlignment checks that atomically-accessed fields are
21 // aligned to 64-bit boundaries, as required by the atomic package.
22 //
23 // Unfortunately, violating this rule on 32-bit platforms results in a
24 // hard segfault at runtime.
25 func TestPeerAlignment(t *testing.T) {
26 var p Peer
27
28 typ := reflect.TypeOf(&p).Elem()
29 t.Logf("Peer type size: %d, with fields:", typ.Size())
30 for i := 0; i < typ.NumField(); i++ {
31 field := typ.Field(i)
32 t.Logf("\t%30s\toffset=%3v\t(type size=%3d, align=%d)",
33 field.Name,
34 field.Offset,
35 field.Type.Size(),
36 field.Type.Align(),
37 )
38 }
39
40 checkAlignment(t, "Peer.stats", unsafe.Offsetof(p.stats))
41 checkAlignment(t, "Peer.isRunning", unsafe.Offsetof(p.isRunning))
42 }
43
44 // TestDeviceAlignment checks that atomically-accessed fields are
45 // aligned to 64-bit boundaries, as required by the atomic package.
46 //
47 // Unfortunately, violating this rule on 32-bit platforms results in a
48 // hard segfault at runtime.
49 func TestDeviceAlignment(t *testing.T) {
50 var d Device
51
52 typ := reflect.TypeOf(&d).Elem()
53 t.Logf("Device type size: %d, with fields:", typ.Size())
54 for i := 0; i < typ.NumField(); i++ {
55 field := typ.Field(i)
56 t.Logf("\t%30s\toffset=%3v\t(type size=%3d, align=%d)",
57 field.Name,
58 field.Offset,
59 field.Type.Size(),
60 field.Type.Align(),
61 )
62 }
63 checkAlignment(t, "Device.rate.underLoadUntil", unsafe.Offsetof(d.rate)+unsafe.Offsetof(d.rate.underLoadUntil))
64 }
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
2929 // will become the actual state; Up can fail.
3030 // The device can also change state multiple times between time of check and time of use.
3131 // Unsynchronized uses of state must therefore be advisory/best-effort only.
32 state uint32 // actually a deviceState, but typed uint32 for convenience
32 state atomic.Uint32 // actually a deviceState, but typed uint32 for convenience
3333 // stopping blocks until all inputs to Device have been closed.
3434 stopping sync.WaitGroup
3535 // mu protects state changes.
5757 keyMap map[NoisePublicKey]*Peer
5858 }
5959
60 // Keep this 8-byte aligned
6160 rate struct {
62 underLoadUntil int64
61 underLoadUntil atomic.Int64
6362 limiter ratelimiter.Ratelimiter
6463 }
6564
8180
8281 tun struct {
8382 device tun.Device
84 mtu int32
83 mtu atomic.Int32
8584 }
8685
8786 ipcMutex sync.RWMutex
9392 // There are three states: down, up, closed.
9493 // Transitions:
9594 //
96 // down -----+
97 // ↑↓ ↓
98 // up -> closed
99 //
95 // down -----+
96 // ↑↓ ↓
97 // up -> closed
10098 type deviceState uint32
10199
102100 //go:generate go run golang.org/x/tools/cmd/stringer -type deviceState -trimprefix=deviceState
109107 // deviceState returns device.state.state as a deviceState
110108 // See those docs for how to interpret this value.
111109 func (device *Device) deviceState() deviceState {
112 return deviceState(atomic.LoadUint32(&device.state.state))
110 return deviceState(device.state.state.Load())
113111 }
114112
115113 // isClosed reports whether the device is closed (or is closing).
148146 case old:
149147 return nil
150148 case deviceStateUp:
151 atomic.StoreUint32(&device.state.state, uint32(deviceStateUp))
149 device.state.state.Store(uint32(deviceStateUp))
152150 err = device.upLocked()
153151 if err == nil {
154152 break
155153 }
156154 fallthrough // up failed; bring the device all the way back down
157155 case deviceStateDown:
158 atomic.StoreUint32(&device.state.state, uint32(deviceStateDown))
156 device.state.state.Store(uint32(deviceStateDown))
159157 errDown := device.downLocked()
160158 if err == nil {
161159 err = errDown
181179 device.peers.RLock()
182180 for _, peer := range device.peers.keyMap {
183181 peer.Start()
184 if atomic.LoadUint32(&peer.persistentKeepaliveInterval) > 0 {
182 if peer.persistentKeepaliveInterval.Load() > 0 {
185183 peer.SendKeepalive()
186184 }
187185 }
218216 now := time.Now()
219217 underLoad := len(device.queue.handshake.c) >= QueueHandshakeSize/8
220218 if underLoad {
221 atomic.StoreInt64(&device.rate.underLoadUntil, now.Add(UnderLoadAfterTime).UnixNano())
219 device.rate.underLoadUntil.Store(now.Add(UnderLoadAfterTime).UnixNano())
222220 return true
223221 }
224222 // check if recently under load
225 return atomic.LoadInt64(&device.rate.underLoadUntil) > now.UnixNano()
223 return device.rate.underLoadUntil.Load() > now.UnixNano()
226224 }
227225
228226 func (device *Device) SetPrivateKey(sk NoisePrivateKey) error {
266264 expiredPeers := make([]*Peer, 0, len(device.peers.keyMap))
267265 for _, peer := range device.peers.keyMap {
268266 handshake := &peer.handshake
269 handshake.precomputedStaticStatic = device.staticIdentity.privateKey.sharedSecret(handshake.remoteStatic)
267 handshake.precomputedStaticStatic, _ = device.staticIdentity.privateKey.sharedSecret(handshake.remoteStatic)
270268 expiredPeers = append(expiredPeers, peer)
271269 }
272270
282280
283281 func NewDevice(tunDevice tun.Device, bind conn.Bind, logger *Logger) *Device {
284282 device := new(Device)
285 device.state.state = uint32(deviceStateDown)
283 device.state.state.Store(uint32(deviceStateDown))
286284 device.closed = make(chan struct{})
287285 device.log = logger
288286 device.net.bind = bind
292290 device.log.Errorf("Trouble determining MTU, assuming default: %v", err)
293291 mtu = DefaultMTU
294292 }
295 device.tun.mtu = int32(mtu)
293 device.tun.mtu.Store(int32(mtu))
296294 device.peers.keyMap = make(map[NoisePublicKey]*Peer)
297295 device.rate.limiter.Init()
298296 device.indexTable.Init()
358356 if device.isClosed() {
359357 return
360358 }
361 atomic.StoreUint32(&device.state.state, uint32(deviceStateClosed))
359 device.state.state.Store(uint32(deviceStateClosed))
362360 device.log.Verbosef("Device closing")
363361
364362 device.tun.device.Close()
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
332332
333333 // Measure how long it takes to receive b.N packets,
334334 // starting when we receive the first packet.
335 var recv uint64
335 var recv atomic.Uint64
336336 var elapsed time.Duration
337337 var wg sync.WaitGroup
338338 wg.Add(1)
341341 var start time.Time
342342 for {
343343 <-pair[0].tun.Inbound
344 new := atomic.AddUint64(&recv, 1)
344 new := recv.Add(1)
345345 if new == 1 {
346346 start = time.Now()
347347 }
357357 ping := tuntest.Ping(pair[0].ip, pair[1].ip)
358358 pingc := pair[1].tun.Outbound
359359 var sent uint64
360 for atomic.LoadUint64(&recv) != uint64(b.N) {
360 for recv.Load() != uint64(b.N) {
361361 sent++
362362 pingc <- ping
363363 }
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
99 "sync"
1010 "sync/atomic"
1111 "time"
12 "unsafe"
1312
1413 "golang.zx2c4.com/wireguard/replay"
1514 )
2221 */
2322
2423 type Keypair struct {
25 sendNonce uint64 // accessed atomically
24 sendNonce atomic.Uint64
2625 send cipher.AEAD
2726 receive cipher.AEAD
2827 replayFilter replay.Filter
3635 sync.RWMutex
3736 current *Keypair
3837 previous *Keypair
39 next *Keypair
40 }
41
42 func (kp *Keypairs) storeNext(next *Keypair) {
43 atomic.StorePointer((*unsafe.Pointer)((unsafe.Pointer)(&kp.next)), (unsafe.Pointer)(next))
44 }
45
46 func (kp *Keypairs) loadNext() *Keypair {
47 return (*Keypair)(atomic.LoadPointer((*unsafe.Pointer)((unsafe.Pointer)(&kp.next))))
38 next atomic.Pointer[Keypair]
4839 }
4940
5041 func (kp *Keypairs) Current() *Keypair {
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
+0
-41
device/misc.go less more
0 /* SPDX-License-Identifier: MIT
1 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
3 */
4
5 package device
6
7 import (
8 "sync/atomic"
9 )
10
11 /* Atomic Boolean */
12
13 const (
14 AtomicFalse = int32(iota)
15 AtomicTrue
16 )
17
18 type AtomicBool struct {
19 int32
20 }
21
22 func (a *AtomicBool) Get() bool {
23 return atomic.LoadInt32(&a.int32) == AtomicTrue
24 }
25
26 func (a *AtomicBool) Swap(val bool) bool {
27 flag := AtomicFalse
28 if val {
29 flag = AtomicTrue
30 }
31 return atomic.SwapInt32(&a.int32, flag) == AtomicTrue
32 }
33
34 func (a *AtomicBool) Set(val bool) {
35 flag := AtomicFalse
36 if val {
37 flag = AtomicTrue
38 }
39 atomic.StoreInt32(&a.int32, flag)
40 }
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
88 "crypto/hmac"
99 "crypto/rand"
1010 "crypto/subtle"
11 "errors"
1112 "hash"
1213
1314 "golang.org/x/crypto/blake2s"
9394 return
9495 }
9596
96 func (sk *NoisePrivateKey) sharedSecret(pk NoisePublicKey) (ss [NoisePublicKeySize]byte) {
97 var errInvalidPublicKey = errors.New("invalid public key")
98
99 func (sk *NoisePrivateKey) sharedSecret(pk NoisePublicKey) (ss [NoisePublicKeySize]byte, err error) {
97100 apk := (*[NoisePublicKeySize]byte)(&pk)
98101 ask := (*[NoisePrivateKeySize]byte)(sk)
99102 curve25519.ScalarMult(&ss, ask, apk)
100 return ss
103 if isZero(ss[:]) {
104 return ss, errInvalidPublicKey
105 }
106 return ss, nil
101107 }
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
174174 }
175175
176176 func (device *Device) CreateMessageInitiation(peer *Peer) (*MessageInitiation, error) {
177 errZeroECDHResult := errors.New("ECDH returned all zeros")
178
179177 device.staticIdentity.RLock()
180178 defer device.staticIdentity.RUnlock()
181179
203201 handshake.mixHash(msg.Ephemeral[:])
204202
205203 // encrypt static key
206 ss := handshake.localEphemeral.sharedSecret(handshake.remoteStatic)
207 if isZero(ss[:]) {
208 return nil, errZeroECDHResult
204 ss, err := handshake.localEphemeral.sharedSecret(handshake.remoteStatic)
205 if err != nil {
206 return nil, err
209207 }
210208 var key [chacha20poly1305.KeySize]byte
211209 KDF2(
220218
221219 // encrypt timestamp
222220 if isZero(handshake.precomputedStaticStatic[:]) {
223 return nil, errZeroECDHResult
221 return nil, errInvalidPublicKey
224222 }
225223 KDF2(
226224 &handshake.chainKey,
263261 mixKey(&chainKey, &InitialChainKey, msg.Ephemeral[:])
264262
265263 // decrypt static key
266 var err error
267264 var peerPK NoisePublicKey
268265 var key [chacha20poly1305.KeySize]byte
269 ss := device.staticIdentity.privateKey.sharedSecret(msg.Ephemeral)
270 if isZero(ss[:]) {
266 ss, err := device.staticIdentity.privateKey.sharedSecret(msg.Ephemeral)
267 if err != nil {
271268 return nil
272269 }
273270 KDF2(&chainKey, &key, chainKey[:], ss[:])
281278 // lookup peer
282279
283280 peer := device.LookupPeer(peerPK)
284 if peer == nil || !peer.isRunning.Get() {
281 if peer == nil || !peer.isRunning.Load() {
285282 return nil
286283 }
287284
383380 handshake.mixHash(msg.Ephemeral[:])
384381 handshake.mixKey(msg.Ephemeral[:])
385382
386 func() {
387 ss := handshake.localEphemeral.sharedSecret(handshake.remoteEphemeral)
388 handshake.mixKey(ss[:])
389 ss = handshake.localEphemeral.sharedSecret(handshake.remoteStatic)
390 handshake.mixKey(ss[:])
391 }()
383 ss, err := handshake.localEphemeral.sharedSecret(handshake.remoteEphemeral)
384 if err != nil {
385 return nil, err
386 }
387 handshake.mixKey(ss[:])
388 ss, err = handshake.localEphemeral.sharedSecret(handshake.remoteStatic)
389 if err != nil {
390 return nil, err
391 }
392 handshake.mixKey(ss[:])
392393
393394 // add preshared key
394395
405406
406407 handshake.mixHash(tau[:])
407408
408 func() {
409 aead, _ := chacha20poly1305.New(key[:])
410 aead.Seal(msg.Empty[:0], ZeroNonce[:], nil, handshake.hash[:])
411 handshake.mixHash(msg.Empty[:])
412 }()
409 aead, _ := chacha20poly1305.New(key[:])
410 aead.Seal(msg.Empty[:0], ZeroNonce[:], nil, handshake.hash[:])
411 handshake.mixHash(msg.Empty[:])
413412
414413 handshake.state = handshakeResponseCreated
415414
454453 mixHash(&hash, &handshake.hash, msg.Ephemeral[:])
455454 mixKey(&chainKey, &handshake.chainKey, msg.Ephemeral[:])
456455
457 func() {
458 ss := handshake.localEphemeral.sharedSecret(msg.Ephemeral)
459 mixKey(&chainKey, &chainKey, ss[:])
460 setZero(ss[:])
461 }()
462
463 func() {
464 ss := device.staticIdentity.privateKey.sharedSecret(msg.Ephemeral)
465 mixKey(&chainKey, &chainKey, ss[:])
466 setZero(ss[:])
467 }()
456 ss, err := handshake.localEphemeral.sharedSecret(msg.Ephemeral)
457 if err != nil {
458 return false
459 }
460 mixKey(&chainKey, &chainKey, ss[:])
461 setZero(ss[:])
462
463 ss, err = device.staticIdentity.privateKey.sharedSecret(msg.Ephemeral)
464 if err != nil {
465 return false
466 }
467 mixKey(&chainKey, &chainKey, ss[:])
468 setZero(ss[:])
468469
469470 // add preshared key (psk)
470471
482483 // authenticate transcript
483484
484485 aead, _ := chacha20poly1305.New(key[:])
485 _, err := aead.Open(nil, ZeroNonce[:], msg.Empty[:], hash[:])
486 _, err = aead.Open(nil, ZeroNonce[:], msg.Empty[:], hash[:])
486487 if err != nil {
487488 return false
488489 }
580581 defer keypairs.Unlock()
581582
582583 previous := keypairs.previous
583 next := keypairs.loadNext()
584 next := keypairs.next.Load()
584585 current := keypairs.current
585586
586587 if isInitiator {
587588 if next != nil {
588 keypairs.storeNext(nil)
589 keypairs.next.Store(nil)
589590 keypairs.previous = next
590591 device.DeleteKeypair(current)
591592 } else {
594595 device.DeleteKeypair(previous)
595596 keypairs.current = keypair
596597 } else {
597 keypairs.storeNext(keypair)
598 keypairs.next.Store(keypair)
598599 device.DeleteKeypair(next)
599600 keypairs.previous = nil
600601 device.DeleteKeypair(previous)
606607 func (peer *Peer) ReceivedWithKeypair(receivedKeypair *Keypair) bool {
607608 keypairs := &peer.keypairs
608609
609 if keypairs.loadNext() != receivedKeypair {
610 if keypairs.next.Load() != receivedKeypair {
610611 return false
611612 }
612613 keypairs.Lock()
613614 defer keypairs.Unlock()
614 if keypairs.loadNext() != receivedKeypair {
615 if keypairs.next.Load() != receivedKeypair {
615616 return false
616617 }
617618 old := keypairs.previous
618619 keypairs.previous = keypairs.current
619620 peer.device.DeleteKeypair(old)
620 keypairs.current = keypairs.loadNext()
621 keypairs.storeNext(nil)
621 keypairs.current = keypairs.next.Load()
622 keypairs.next.Store(nil)
622623 return true
623624 }
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
2323 pk1 := sk1.publicKey()
2424 pk2 := sk2.publicKey()
2525
26 ss1 := sk1.sharedSecret(pk2)
27 ss2 := sk2.sharedSecret(pk1)
26 ss1, err1 := sk1.sharedSecret(pk2)
27 ss2, err2 := sk2.sharedSecret(pk1)
2828
29 if ss1 != ss2 {
29 if ss1 != ss2 || err1 != nil || err2 != nil {
3030 t.Fatal("Failed to compute shared secet")
3131 }
3232 }
147147 t.Fatal("failed to derive keypair for peer 2", err)
148148 }
149149
150 key1 := peer1.keypairs.loadNext()
150 key1 := peer1.keypairs.next.Load()
151151 key2 := peer2.keypairs.current
152152
153153 // encrypting / decryption test
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
1515 )
1616
1717 type Peer struct {
18 isRunning AtomicBool
19 sync.RWMutex // Mostly protects endpoint, but is generally taken whenever we modify peer
20 keypairs Keypairs
21 handshake Handshake
22 device *Device
23 endpoint conn.Endpoint
24 stopping sync.WaitGroup // routines pending stop
25
26 // These fields are accessed with atomic operations, which must be
27 // 64-bit aligned even on 32-bit platforms. Go guarantees that an
28 // allocated struct will be 64-bit aligned. So we place
29 // atomically-accessed fields up front, so that they can share in
30 // this alignment before smaller fields throw it off.
31 stats struct {
32 txBytes uint64 // bytes send to peer (endpoint)
33 rxBytes uint64 // bytes received from peer
34 lastHandshakeNano int64 // nano seconds since epoch
35 }
18 isRunning atomic.Bool
19 sync.RWMutex // Mostly protects endpoint, but is generally taken whenever we modify peer
20 keypairs Keypairs
21 handshake Handshake
22 device *Device
23 endpoint conn.Endpoint
24 stopping sync.WaitGroup // routines pending stop
25 txBytes atomic.Uint64 // bytes send to peer (endpoint)
26 rxBytes atomic.Uint64 // bytes received from peer
27 lastHandshakeNano atomic.Int64 // nano seconds since epoch
3628
3729 disableRoaming bool
3830
4234 newHandshake *Timer
4335 zeroKeyMaterial *Timer
4436 persistentKeepalive *Timer
45 handshakeAttempts uint32
46 needAnotherKeepalive AtomicBool
47 sentLastMinuteHandshake AtomicBool
37 handshakeAttempts atomic.Uint32
38 needAnotherKeepalive atomic.Bool
39 sentLastMinuteHandshake atomic.Bool
4840 }
4941
5042 state struct {
5951
6052 cookieGenerator CookieGenerator
6153 trieEntries list.List
62 persistentKeepaliveInterval uint32 // accessed atomically
54 persistentKeepaliveInterval atomic.Uint32
6355 }
6456
6557 func (device *Device) NewPeer(pk NoisePublicKey) (*Peer, error) {
9991 // pre-compute DH
10092 handshake := &peer.handshake
10193 handshake.mutex.Lock()
102 handshake.precomputedStaticStatic = device.staticIdentity.privateKey.sharedSecret(pk)
94 handshake.precomputedStaticStatic, _ = device.staticIdentity.privateKey.sharedSecret(pk)
10395 handshake.remoteStatic = pk
10496 handshake.mutex.Unlock()
10597
132124
133125 err := peer.device.net.bind.Send(buffer, peer.endpoint)
134126 if err == nil {
135 atomic.AddUint64(&peer.stats.txBytes, uint64(len(buffer)))
127 peer.txBytes.Add(uint64(len(buffer)))
136128 }
137129 return err
138130 }
173165 peer.state.Lock()
174166 defer peer.state.Unlock()
175167
176 if peer.isRunning.Get() {
168 if peer.isRunning.Load() {
177169 return
178170 }
179171
197189 go peer.RoutineSequentialSender()
198190 go peer.RoutineSequentialReceiver()
199191
200 peer.isRunning.Set(true)
192 peer.isRunning.Store(true)
201193 }
202194
203195 func (peer *Peer) ZeroAndFlushAll() {
209201 keypairs.Lock()
210202 device.DeleteKeypair(keypairs.previous)
211203 device.DeleteKeypair(keypairs.current)
212 device.DeleteKeypair(keypairs.loadNext())
204 device.DeleteKeypair(keypairs.next.Load())
213205 keypairs.previous = nil
214206 keypairs.current = nil
215 keypairs.storeNext(nil)
207 keypairs.next.Store(nil)
216208 keypairs.Unlock()
217209
218210 // clear handshake state
237229 keypairs := &peer.keypairs
238230 keypairs.Lock()
239231 if keypairs.current != nil {
240 atomic.StoreUint64(&keypairs.current.sendNonce, RejectAfterMessages)
241 }
242 if keypairs.next != nil {
243 next := keypairs.loadNext()
244 atomic.StoreUint64(&next.sendNonce, RejectAfterMessages)
232 keypairs.current.sendNonce.Store(RejectAfterMessages)
233 }
234 if next := keypairs.next.Load(); next != nil {
235 next.sendNonce.Store(RejectAfterMessages)
245236 }
246237 keypairs.Unlock()
247238 }
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
1313 pool sync.Pool
1414 cond sync.Cond
1515 lock sync.Mutex
16 count uint32
16 count atomic.Uint32
1717 max uint32
1818 }
1919
2626 func (p *WaitPool) Get() any {
2727 if p.max != 0 {
2828 p.lock.Lock()
29 for atomic.LoadUint32(&p.count) >= p.max {
29 for p.count.Load() >= p.max {
3030 p.cond.Wait()
3131 }
32 atomic.AddUint32(&p.count, 1)
32 p.count.Add(1)
3333 p.lock.Unlock()
3434 }
3535 return p.pool.Get()
4040 if p.max == 0 {
4141 return
4242 }
43 atomic.AddUint32(&p.count, ^uint32(0))
43 p.count.Add(^uint32(0))
4444 p.cond.Signal()
4545 }
4646
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2019-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
1616 func TestWaitPool(t *testing.T) {
1717 t.Skip("Currently disabled")
1818 var wg sync.WaitGroup
19 trials := int32(100000)
19 var trials atomic.Int32
20 startTrials := int32(100000)
2021 if raceEnabled {
2122 // This test can be very slow with -race.
22 trials /= 10
23 startTrials /= 10
2324 }
25 trials.Store(startTrials)
2426 workers := runtime.NumCPU() + 2
2527 if workers-4 <= 0 {
2628 t.Skip("Not enough cores")
2729 }
2830 p := NewWaitPool(uint32(workers-4), func() any { return make([]byte, 16) })
2931 wg.Add(workers)
30 max := uint32(0)
32 var max atomic.Uint32
3133 updateMax := func() {
32 count := atomic.LoadUint32(&p.count)
34 count := p.count.Load()
3335 if count > p.max {
3436 t.Errorf("count (%d) > max (%d)", count, p.max)
3537 }
3638 for {
37 old := atomic.LoadUint32(&max)
39 old := max.Load()
3840 if count <= old {
3941 break
4042 }
41 if atomic.CompareAndSwapUint32(&max, old, count) {
43 if max.CompareAndSwap(old, count) {
4244 break
4345 }
4446 }
4648 for i := 0; i < workers; i++ {
4749 go func() {
4850 defer wg.Done()
49 for atomic.AddInt32(&trials, -1) > 0 {
51 for trials.Add(-1) > 0 {
5052 updateMax()
5153 x := p.Get()
5254 updateMax()
5860 }()
5961 }
6062 wg.Wait()
61 if max != p.max {
63 if max.Load() != p.max {
6264 t.Errorf("Actual maximum count (%d) != ideal maximum count (%d)", max, p.max)
6365 }
6466 }
6567
6668 func BenchmarkWaitPool(b *testing.B) {
6769 var wg sync.WaitGroup
68 trials := int32(b.N)
70 var trials atomic.Int32
71 trials.Store(int32(b.N))
6972 workers := runtime.NumCPU() + 2
7073 if workers-4 <= 0 {
7174 b.Skip("Not enough cores")
7679 for i := 0; i < workers; i++ {
7780 go func() {
7881 defer wg.Done()
79 for atomic.AddInt32(&trials, -1) > 0 {
82 for trials.Add(-1) > 0 {
8083 x := p.Get()
8184 time.Sleep(time.Duration(rand.Intn(100)) * time.Microsecond)
8285 p.Put(x)
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
11
22 /* SPDX-License-Identifier: MIT
33 *
4 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
4 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
55 */
66
77 package device
11
22 /* SPDX-License-Identifier: MIT
33 *
4 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
4 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
55 */
66
77 package device
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
11
22 /* SPDX-License-Identifier: MIT
33 *
4 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
4 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
55 */
66
77 package device
11
22 /* SPDX-License-Identifier: MIT
33 *
4 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
4 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
55 */
66
77 package device
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
1010 "errors"
1111 "net"
1212 "sync"
13 "sync/atomic"
1413 "time"
1514
1615 "golang.org/x/crypto/chacha20poly1305"
5150 * NOTE: Not thread safe, but called by sequential receiver!
5251 */
5352 func (peer *Peer) keepKeyFreshReceiving() {
54 if peer.timers.sentLastMinuteHandshake.Get() {
53 if peer.timers.sentLastMinuteHandshake.Load() {
5554 return
5655 }
5756 keypair := peer.keypairs.Current()
5857 if keypair != nil && keypair.isInitiator && time.Since(keypair.created) > (RejectAfterTime-KeepaliveTimeout-RekeyTimeout) {
59 peer.timers.sentLastMinuteHandshake.Set(true)
58 peer.timers.sentLastMinuteHandshake.Store(true)
6059 peer.SendHandshakeInitiation(false)
6160 }
6261 }
162161 elem.Lock()
163162
164163 // add to decryption queues
165 if peer.isRunning.Get() {
164 if peer.isRunning.Load() {
166165 peer.queue.inbound.c <- elem
167166 device.queue.decryption.c <- elem
168167 buffer = device.GetMessageBuffer()
267266
268267 // consume reply
269268
270 if peer := entry.peer; peer.isRunning.Get() {
269 if peer := entry.peer; peer.isRunning.Load() {
271270 device.log.Verbosef("Receiving cookie response from %s", elem.endpoint.DstToString())
272271 if !peer.cookieGenerator.ConsumeReply(&reply) {
273272 device.log.Verbosef("Could not decrypt invalid cookie response")
340339 peer.SetEndpointFromPacket(elem.endpoint)
341340
342341 device.log.Verbosef("%v - Received handshake initiation", peer)
343 atomic.AddUint64(&peer.stats.rxBytes, uint64(len(elem.packet)))
342 peer.rxBytes.Add(uint64(len(elem.packet)))
344343
345344 peer.SendHandshakeResponse()
346345
368367 peer.SetEndpointFromPacket(elem.endpoint)
369368
370369 device.log.Verbosef("%v - Received handshake response", peer)
371 atomic.AddUint64(&peer.stats.rxBytes, uint64(len(elem.packet)))
370 peer.rxBytes.Add(uint64(len(elem.packet)))
372371
373372 // update timers
374373
425424 peer.keepKeyFreshReceiving()
426425 peer.timersAnyAuthenticatedPacketTraversal()
427426 peer.timersAnyAuthenticatedPacketReceived()
428 atomic.AddUint64(&peer.stats.rxBytes, uint64(len(elem.packet)+MinMessageSize))
427 peer.rxBytes.Add(uint64(len(elem.packet) + MinMessageSize))
429428
430429 if len(elem.packet) == 0 {
431430 device.log.Verbosef("%v - Receiving keepalive packet", peer)
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
1111 "net"
1212 "os"
1313 "sync"
14 "sync/atomic"
1514 "time"
1615
1716 "golang.org/x/crypto/chacha20poly1305"
7574 /* Queues a keepalive if no packets are queued for peer
7675 */
7776 func (peer *Peer) SendKeepalive() {
78 if len(peer.queue.staged) == 0 && peer.isRunning.Get() {
77 if len(peer.queue.staged) == 0 && peer.isRunning.Load() {
7978 elem := peer.device.NewOutboundElement()
8079 select {
8180 case peer.queue.staged <- elem:
9089
9190 func (peer *Peer) SendHandshakeInitiation(isRetry bool) error {
9291 if !isRetry {
93 atomic.StoreUint32(&peer.timers.handshakeAttempts, 0)
92 peer.timers.handshakeAttempts.Store(0)
9493 }
9594
9695 peer.handshake.mutex.RLock()
192191 if keypair == nil {
193192 return
194193 }
195 nonce := atomic.LoadUint64(&keypair.sendNonce)
194 nonce := keypair.sendNonce.Load()
196195 if nonce > RekeyAfterMessages || (keypair.isInitiator && time.Since(keypair.created) > RekeyAfterTime) {
197196 peer.SendHandshakeInitiation(false)
198197 }
268267 if peer == nil {
269268 continue
270269 }
271 if peer.isRunning.Get() {
270 if peer.isRunning.Load() {
272271 peer.StagePacket(elem)
273272 elem = nil
274273 peer.SendStagedPackets()
299298 }
300299
301300 keypair := peer.keypairs.Current()
302 if keypair == nil || atomic.LoadUint64(&keypair.sendNonce) >= RejectAfterMessages || time.Since(keypair.created) >= RejectAfterTime {
301 if keypair == nil || keypair.sendNonce.Load() >= RejectAfterMessages || time.Since(keypair.created) >= RejectAfterTime {
303302 peer.SendHandshakeInitiation(false)
304303 return
305304 }
308307 select {
309308 case elem := <-peer.queue.staged:
310309 elem.peer = peer
311 elem.nonce = atomic.AddUint64(&keypair.sendNonce, 1) - 1
310 elem.nonce = keypair.sendNonce.Add(1) - 1
312311 if elem.nonce >= RejectAfterMessages {
313 atomic.StoreUint64(&keypair.sendNonce, RejectAfterMessages)
312 keypair.sendNonce.Store(RejectAfterMessages)
314313 peer.StagePacket(elem) // XXX: Out of order, but we can't front-load go chans
315314 goto top
316315 }
319318 elem.Lock()
320319
321320 // add to parallel and sequential queue
322 if peer.isRunning.Get() {
321 if peer.isRunning.Load() {
323322 peer.queue.outbound.c <- elem
324323 peer.device.queue.encryption.c <- elem
325324 } else {
384383 binary.LittleEndian.PutUint64(fieldNonce, elem.nonce)
385384
386385 // pad content to multiple of 16
387 paddingSize := calculatePaddingSize(len(elem.packet), int(atomic.LoadInt32(&device.tun.mtu)))
386 paddingSize := calculatePaddingSize(len(elem.packet), int(device.tun.mtu.Load()))
388387 elem.packet = append(elem.packet, paddingZeros[:paddingSize]...)
389388
390389 // encrypt content and release to consumer
418417 return
419418 }
420419 elem.Lock()
421 if !peer.isRunning.Get() {
420 if !peer.isRunning.Load() {
422421 // peer has been stopped; return re-usable elems to the shared pool.
423422 // This is an optimization only. It is possible for the peer to be stopped
424423 // immediately after this check, in which case, elem will get processed.
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 *
44 * This implements userspace semantics of "sticky sockets", modeled after
55 * WireGuard's kernelspace implementation. This is more or less a straight port
203203 }
204204
205205 func createNetlinkRouteSocket() (int, error) {
206 sock, err := unix.Socket(unix.AF_NETLINK, unix.SOCK_RAW, unix.NETLINK_ROUTE)
206 sock, err := unix.Socket(unix.AF_NETLINK, unix.SOCK_RAW|unix.SOCK_CLOEXEC, unix.NETLINK_ROUTE)
207207 if err != nil {
208208 return -1, err
209209 }
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 *
44 * This is based heavily on timers.c from the kernel implementation.
55 */
88
99 import (
1010 "sync"
11 "sync/atomic"
1211 "time"
1312 _ "unsafe"
1413 )
7372 }
7473
7574 func (peer *Peer) timersActive() bool {
76 return peer.isRunning.Get() && peer.device != nil && peer.device.isUp()
75 return peer.isRunning.Load() && peer.device != nil && peer.device.isUp()
7776 }
7877
7978 func expiredRetransmitHandshake(peer *Peer) {
80 if atomic.LoadUint32(&peer.timers.handshakeAttempts) > MaxTimerHandshakes {
79 if peer.timers.handshakeAttempts.Load() > MaxTimerHandshakes {
8180 peer.device.log.Verbosef("%s - Handshake did not complete after %d attempts, giving up", peer, MaxTimerHandshakes+2)
8281
8382 if peer.timersActive() {
9695 peer.timers.zeroKeyMaterial.Mod(RejectAfterTime * 3)
9796 }
9897 } else {
99 atomic.AddUint32(&peer.timers.handshakeAttempts, 1)
100 peer.device.log.Verbosef("%s - Handshake did not complete after %d seconds, retrying (try %d)", peer, int(RekeyTimeout.Seconds()), atomic.LoadUint32(&peer.timers.handshakeAttempts)+1)
98 peer.timers.handshakeAttempts.Add(1)
99 peer.device.log.Verbosef("%s - Handshake did not complete after %d seconds, retrying (try %d)", peer, int(RekeyTimeout.Seconds()), peer.timers.handshakeAttempts.Load()+1)
101100
102101 /* We clear the endpoint address src address, in case this is the cause of trouble. */
103102 peer.Lock()
112111
113112 func expiredSendKeepalive(peer *Peer) {
114113 peer.SendKeepalive()
115 if peer.timers.needAnotherKeepalive.Get() {
116 peer.timers.needAnotherKeepalive.Set(false)
114 if peer.timers.needAnotherKeepalive.Load() {
115 peer.timers.needAnotherKeepalive.Store(false)
117116 if peer.timersActive() {
118117 peer.timers.sendKeepalive.Mod(KeepaliveTimeout)
119118 }
137136 }
138137
139138 func expiredPersistentKeepalive(peer *Peer) {
140 if atomic.LoadUint32(&peer.persistentKeepaliveInterval) > 0 {
139 if peer.persistentKeepaliveInterval.Load() > 0 {
141140 peer.SendKeepalive()
142141 }
143142 }
155154 if !peer.timers.sendKeepalive.IsPending() {
156155 peer.timers.sendKeepalive.Mod(KeepaliveTimeout)
157156 } else {
158 peer.timers.needAnotherKeepalive.Set(true)
157 peer.timers.needAnotherKeepalive.Store(true)
159158 }
160159 }
161160 }
186185 if peer.timersActive() {
187186 peer.timers.retransmitHandshake.Del()
188187 }
189 atomic.StoreUint32(&peer.timers.handshakeAttempts, 0)
190 peer.timers.sentLastMinuteHandshake.Set(false)
191 atomic.StoreInt64(&peer.stats.lastHandshakeNano, time.Now().UnixNano())
188 peer.timers.handshakeAttempts.Store(0)
189 peer.timers.sentLastMinuteHandshake.Store(false)
190 peer.lastHandshakeNano.Store(time.Now().UnixNano())
192191 }
193192
194193 /* Should be called after an ephemeral key is created, which is before sending a handshake response or after receiving a handshake response. */
200199
201200 /* Should be called before a packet with authentication -- keepalive, data, or handshake -- is sent, or after one is received. */
202201 func (peer *Peer) timersAnyAuthenticatedPacketTraversal() {
203 keepalive := atomic.LoadUint32(&peer.persistentKeepaliveInterval)
202 keepalive := peer.persistentKeepaliveInterval.Load()
204203 if keepalive > 0 && peer.timersActive() {
205204 peer.timers.persistentKeepalive.Mod(time.Duration(keepalive) * time.Second)
206205 }
215214 }
216215
217216 func (peer *Peer) timersStart() {
218 atomic.StoreUint32(&peer.timers.handshakeAttempts, 0)
219 peer.timers.sentLastMinuteHandshake.Set(false)
220 peer.timers.needAnotherKeepalive.Set(false)
217 peer.timers.handshakeAttempts.Store(0)
218 peer.timers.sentLastMinuteHandshake.Store(false)
219 peer.timers.needAnotherKeepalive.Store(false)
221220 }
222221
223222 func (peer *Peer) timersStop() {
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
66
77 import (
88 "fmt"
9 "sync/atomic"
109
1110 "golang.zx2c4.com/wireguard/tun"
1211 )
3231 tooLarge = fmt.Sprintf(" (too large, capped at %v)", MaxContentSize)
3332 mtu = MaxContentSize
3433 }
35 old := atomic.SwapInt32(&device.tun.mtu, int32(mtu))
34 old := device.tun.mtu.Swap(int32(mtu))
3635 if int(old) != mtu {
3736 device.log.Verbosef("MTU updated: %v%s", mtu, tooLarge)
3837 }
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package device
1515 "strconv"
1616 "strings"
1717 "sync"
18 "sync/atomic"
1918 "time"
2019
2120 "golang.zx2c4.com/wireguard/ipc"
111110 sendf("endpoint=%s", peer.endpoint.DstToString())
112111 }
113112
114 nano := atomic.LoadInt64(&peer.stats.lastHandshakeNano)
113 nano := peer.lastHandshakeNano.Load()
115114 secs := nano / time.Second.Nanoseconds()
116115 nano %= time.Second.Nanoseconds()
117116
118117 sendf("last_handshake_time_sec=%d", secs)
119118 sendf("last_handshake_time_nsec=%d", nano)
120 sendf("tx_bytes=%d", atomic.LoadUint64(&peer.stats.txBytes))
121 sendf("rx_bytes=%d", atomic.LoadUint64(&peer.stats.rxBytes))
122 sendf("persistent_keepalive_interval=%d", atomic.LoadUint32(&peer.persistentKeepaliveInterval))
119 sendf("tx_bytes=%d", peer.txBytes.Load())
120 sendf("rx_bytes=%d", peer.rxBytes.Load())
121 sendf("persistent_keepalive_interval=%d", peer.persistentKeepaliveInterval.Load())
123122
124123 device.allowedips.EntriesForPeer(peer, func(prefix netip.Prefix) bool {
125124 sendf("allowed_ip=%s", prefix.String())
357356 return ipcErrorf(ipc.IpcErrorInvalid, "failed to set persistent keepalive interval: %w", err)
358357 }
359358
360 old := atomic.SwapUint32(&peer.persistentKeepaliveInterval, uint32(secs))
359 old := peer.persistentKeepaliveInterval.Swap(uint32(secs))
361360
362361 // Send immediate keepalive if we're turning it on and before it wasn't on.
363362 peer.pkaOn = old == 0 && secs != 0
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44 package main
55
00 module golang.zx2c4.com/wireguard
11
2 go 1.18
2 go 1.19
33
44 require (
55 golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd
66 golang.org/x/net v0.0.0-20220225172249-27dd8689420f
7 golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86
7 golang.org/x/sys v0.2.0
88 golang.zx2c4.com/wintun v0.0.0-20211104114900-415007cec224
9 gvisor.dev/gvisor v0.0.0-20221203005347-703fd9b7fbc0
910 )
11
12 require (
13 github.com/google/btree v1.0.1 // indirect
14 golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect
15 )
0 github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=
1 github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
02 golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd h1:XcWmESyNjXJMLahc3mqVQJcgSTDxFxhETVlfk9uGc38=
13 golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
24 golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc=
35 golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
4 golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86 h1:A9i04dxx7Cribqbs8jf3FQLogkL/CV2YN7hj9KWJCkc=
5 golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
6 golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A=
7 golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
8 golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs=
9 golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
610 golang.zx2c4.com/wintun v0.0.0-20211104114900-415007cec224 h1:Ug9qvr1myri/zFN6xL17LSCBGFDnphBBhzmILHsM5TY=
711 golang.zx2c4.com/wintun v0.0.0-20211104114900-415007cec224/go.mod h1:deeaetjYA+DHMHg+sMSMI58GrEteJUUzzw7en6TJQcI=
12 gvisor.dev/gvisor v0.0.0-20221203005347-703fd9b7fbc0 h1:Wobr37noukisGxpKo5jAsLREcpj61RxrWYzD8uwveOY=
13 gvisor.dev/gvisor v0.0.0-20221203005347-703fd9b7fbc0/go.mod h1:Dn5idtptoW1dIos9U6A2rpebLs/MtTwFacjKb8jLdQA=
5353 handle windows.Handle
5454 wg sync.WaitGroup
5555 wgLock sync.RWMutex
56 closing uint32 // used as atomic boolean
56 closing atomic.Bool
5757 socket bool
5858 readDeadline deadlineHandler
5959 writeDeadline deadlineHandler
6464 channel timeoutChan
6565 channelLock sync.RWMutex
6666 timer *time.Timer
67 timedout uint32 // used as atomic boolean
67 timedout atomic.Bool
6868 }
6969
7070 // makeFile makes a new file from an existing file handle
8888 func (f *file) closeHandle() {
8989 f.wgLock.Lock()
9090 // Atomically set that we are closing, releasing the resources only once.
91 if atomic.SwapUint32(&f.closing, 1) == 0 {
91 if f.closing.Swap(true) == false {
9292 f.wgLock.Unlock()
9393 // cancel all IO and wait for it to complete
9494 windows.CancelIoEx(f.handle, nil)
111111 // The caller must call f.wg.Done() when the IO is finished, prior to Close() returning.
112112 func (f *file) prepareIo() (*ioOperation, error) {
113113 f.wgLock.RLock()
114 if atomic.LoadUint32(&f.closing) == 1 {
114 if f.closing.Load() {
115115 f.wgLock.RUnlock()
116116 return nil, os.ErrClosed
117117 }
143143 return int(bytes), err
144144 }
145145
146 if atomic.LoadUint32(&f.closing) == 1 {
146 if f.closing.Load() {
147147 windows.CancelIoEx(f.handle, &c.o)
148148 }
149149
159159 case r = <-c.ch:
160160 err = r.err
161161 if err == windows.ERROR_OPERATION_ABORTED {
162 if atomic.LoadUint32(&f.closing) == 1 {
162 if f.closing.Load() {
163163 err = os.ErrClosed
164164 }
165165 } else if err != nil && f.socket {
191191 }
192192 defer f.wg.Done()
193193
194 if atomic.LoadUint32(&f.readDeadline.timedout) == 1 {
194 if f.readDeadline.timedout.Load() {
195195 return 0, os.ErrDeadlineExceeded
196196 }
197197
218218 }
219219 defer f.wg.Done()
220220
221 if atomic.LoadUint32(&f.writeDeadline.timedout) == 1 {
221 if f.writeDeadline.timedout.Load() {
222222 return 0, os.ErrDeadlineExceeded
223223 }
224224
255255 }
256256 d.timer = nil
257257 }
258 atomic.StoreUint32(&d.timedout, 0)
258 d.timedout.Store(false)
259259
260260 select {
261261 case <-d.channel:
270270 }
271271
272272 timeoutIO := func() {
273 atomic.StoreUint32(&d.timedout, 1)
273 d.timedout.Store(true)
274274 close(d.channel)
275275 }
276276
2828
2929 type messageBytePipe struct {
3030 pipe
31 writeClosed int32
31 writeClosed atomic.Bool
3232 readEOF bool
3333 }
3434
5050
5151 // CloseWrite closes the write side of a message pipe in byte mode.
5252 func (f *messageBytePipe) CloseWrite() error {
53 if !atomic.CompareAndSwapInt32(&f.writeClosed, 0, 1) {
53 if !f.writeClosed.CompareAndSwap(false, true) {
5454 return io.ErrClosedPipe
5555 }
5656 err := f.file.Flush()
5757 if err != nil {
58 atomic.StoreInt32(&f.writeClosed, 0)
58 f.writeClosed.Store(false)
5959 return err
6060 }
6161 _, err = f.file.Write(nil)
6262 if err != nil {
63 atomic.StoreInt32(&f.writeClosed, 0)
63 f.writeClosed.Store(false)
6464 return err
6565 }
6666 return nil
6969 // Write writes bytes to a message pipe in byte mode. Zero-byte writes are ignored, since
7070 // they are used to implement CloseWrite.
7171 func (f *messageBytePipe) Write(b []byte) (int, error) {
72 if atomic.LoadInt32(&f.writeClosed) != 0 {
72 if f.writeClosed.Load() {
7373 return 0, io.ErrClosedPipe
7474 }
7575 if len(b) == 0 {
11
22 /* SPDX-License-Identifier: MIT
33 *
4 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
4 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
55 */
66
77 package ipc
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package ipc
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package ipc
11
22 /* SPDX-License-Identifier: MIT
33 *
4 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
4 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
55 */
66
77 package ipc
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package ipc
11
22 /* SPDX-License-Identifier: MIT
33 *
4 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
4 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
55 */
66
77 package main
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package main
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package ratelimiter
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package ratelimiter
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 // Package replay implements an efficient anti-replay algorithm as specified in RFC 6479.
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package replay
11
22 /* SPDX-License-Identifier: MIT
33 *
4 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
4 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
55 */
66
77 // Package rwcancel implements cancelable read/write operations on
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package tai64n
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package tai64n
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package tun
22
33 /* SPDX-License-Identifier: MIT
44 *
5 * Copyright (C) 2019-2021 WireGuard LLC. All Rights Reserved.
5 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
66 */
77
88 package main
2020
2121 func main() {
2222 tun, tnet, err := netstack.CreateNetTUN(
23 []netip.Addr{netip.MustParseAddr("192.168.4.29")},
23 []netip.Addr{netip.MustParseAddr("192.168.4.28")},
2424 []netip.Addr{netip.MustParseAddr("8.8.8.8")},
2525 1420)
2626 if err != nil {
2727 log.Panic(err)
2828 }
2929 dev := device.NewDevice(tun, conn.NewDefaultBind(), device.NewLogger(device.LogLevelVerbose, ""))
30 dev.IpcSet(`private_key=a8dac1d8a70a751f0f699fb14ba1cff7b79cf4fbd8f09f44c6e6a90d0369604f
31 public_key=25123c5dcd3328ff645e4f2a3fce0d754400d3887a0cb7c56f0267e20fbf3c5b
32 endpoint=163.172.161.0:12912
30 err = dev.IpcSet(`private_key=087ec6e14bbed210e7215cdc73468dfa23f080a1bfb8665b2fd809bd99d28379
31 public_key=c4c8e984c5322c8184c72265b92b250fdb63688705f504ba003c88f03393cf28
3332 allowed_ip=0.0.0.0/0
33 endpoint=127.0.0.1:58120
3434 `)
3535 err = dev.Up()
3636 if err != nil {
4242 DialContext: tnet.DialContext,
4343 },
4444 }
45 resp, err := client.Get("https://www.zx2c4.com/ip")
45 resp, err := client.Get("http://192.168.4.29/")
4646 if err != nil {
4747 log.Panic(err)
4848 }
22
33 /* SPDX-License-Identifier: MIT
44 *
5 * Copyright (C) 2019-2021 WireGuard LLC. All Rights Reserved.
5 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
66 */
77
88 package main
2929 log.Panic(err)
3030 }
3131 dev := device.NewDevice(tun, conn.NewDefaultBind(), device.NewLogger(device.LogLevelVerbose, ""))
32 dev.IpcSet(`private_key=a8dac1d8a70a751f0f699fb14ba1cff7b79cf4fbd8f09f44c6e6a90d0369604f
33 public_key=25123c5dcd3328ff645e4f2a3fce0d754400d3887a0cb7c56f0267e20fbf3c5b
34 endpoint=163.172.161.0:12912
35 allowed_ip=0.0.0.0/0
32 dev.IpcSet(`private_key=003ed5d73b55806c30de3f8a7bdab38af13539220533055e635690b8b87ad641
33 listen_port=58120
34 public_key=f928d4f6c1b86c12f2562c10b07c555c5c57fd00f59e90c8d8d88767271cbf7c
35 allowed_ip=192.168.4.28/32
3636 persistent_keepalive_interval=25
3737 `)
3838 dev.Up()
22
33 /* SPDX-License-Identifier: MIT
44 *
5 * Copyright (C) 2019-2021 WireGuard LLC. All Rights Reserved.
5 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
66 */
77
88 package main
+0
-17
tun/netstack/go.mod less more
0 module golang.zx2c4.com/wireguard/tun/netstack
1
2 go 1.18
3
4 require (
5 golang.org/x/net v0.0.0-20220225172249-27dd8689420f
6 golang.zx2c4.com/wireguard v0.0.0-20220316235147-5aff28b14c24
7 gvisor.dev/gvisor v0.0.0-20211020211948-f76a604701b6
8 )
9
10 require (
11 github.com/google/btree v1.0.1 // indirect
12 golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd // indirect
13 golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86 // indirect
14 golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect
15 golang.zx2c4.com/wintun v0.0.0-20211104114900-415007cec224 // indirect
16 )
+0
-973
tun/netstack/go.sum less more
0 bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8=
1 cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
2 cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
3 cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
4 cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
5 cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
6 cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
7 cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
8 cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
9 cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
10 cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
11 cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
12 cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
13 cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
14 cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
15 cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
16 cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
17 cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
18 cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
19 cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
20 cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
21 cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
22 cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
23 cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
24 cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
25 cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
26 cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
27 cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
28 cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
29 cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
30 cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
31 cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
32 cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
33 cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
34 cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
35 cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
36 cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
37 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
38 github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
39 github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
40 github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
41 github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
42 github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw=
43 github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0=
44 github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg=
45 github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A=
46 github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA=
47 github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=
48 github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
49 github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
50 github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
51 github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
52 github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc=
53 github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
54 github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
55 github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
56 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
57 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
58 github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=
59 github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
60 github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0=
61 github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
62 github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg=
63 github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg=
64 github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg=
65 github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
66 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
67 github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
68 github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
69 github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
70 github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
71 github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
72 github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ=
73 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
74 github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
75 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
76 github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
77 github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0=
78 github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
79 github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
80 github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
81 github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0=
82 github.com/bazelbuild/rules_go v0.27.0/go.mod h1:MC23Dc/wkXEyk3Wpq6lCqz0ZAYOZDw2DR5y3N1q2i7M=
83 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
84 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
85 github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
86 github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
87 github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA=
88 github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
89 github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
90 github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
91 github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk=
92 github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
93 github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8=
94 github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50=
95 github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE=
96 github.com/cenkalti/backoff v1.1.1-0.20190506075156-2146c9339422/go.mod h1:b6Nc7NRH5C4aCISLry0tLnTjcuTEvoiqcWDdsU0sOGM=
97 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
98 github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
99 github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
100 github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw=
101 github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
102 github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
103 github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
104 github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg=
105 github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs=
106 github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs=
107 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
108 github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
109 github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
110 github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
111 github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
112 github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
113 github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss=
114 github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI=
115 github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM=
116 github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE=
117 github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw=
118 github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw=
119 github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE=
120 github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw=
121 github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
122 github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
123 github.com/containerd/containerd v1.3.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
124 github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
125 github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
126 github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM=
127 github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI=
128 github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI=
129 github.com/containerd/fifo v0.0.0-20191213151349-ff969a566b00/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0=
130 github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk=
131 github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0=
132 github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0=
133 github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g=
134 github.com/containerd/imgcrypt v1.0.3/go.mod h1:v4X3p/H0lzcvVE0r7whbRYjYuK9Y2KEJnL08tXT63Is=
135 github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o=
136 github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o=
137 github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y=
138 github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc=
139 github.com/containerd/typeurl v0.0.0-20200205145503-b45ef1f1f737/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg=
140 github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
141 github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
142 github.com/containernetworking/plugins v0.8.7/go.mod h1:R7lXeZaBzpfqapcAbHRW8/CYwm0dHzbz0XEjofx0uB0=
143 github.com/containers/ocicrypt v1.0.3/go.mod h1:CUBa+8MRNL/VkpxYIpaMtgn1WgXGyvPQj8jcy0EVG6g=
144 github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
145 github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
146 github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU=
147 github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU=
148 github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=
149 github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
150 github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
151 github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
152 github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
153 github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
154 github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
155 github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
156 github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
157 github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
158 github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
159 github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
160 github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
161 github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4=
162 github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ=
163 github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s=
164 github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8=
165 github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I=
166 github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
167 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
168 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
169 github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0=
170 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
171 github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
172 github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
173 github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
174 github.com/docker/docker v1.4.2-0.20191028175130-9e7d5ac5ea55/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
175 github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
176 github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA=
177 github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA=
178 github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw=
179 github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
180 github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE=
181 github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
182 github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
183 github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
184 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
185 github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
186 github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
187 github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
188 github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
189 github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
190 github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
191 github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
192 github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
193 github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
194 github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
195 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
196 github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
197 github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
198 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
199 github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
200 github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
201 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
202 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
203 github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA=
204 github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
205 github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
206 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
207 github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
208 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
209 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
210 github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
211 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
212 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
213 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
214 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
215 github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
216 github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
217 github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0=
218 github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
219 github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
220 github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg=
221 github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
222 github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
223 github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc=
224 github.com/go-openapi/spec v0.19.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
225 github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I=
226 github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
227 github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
228 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
229 github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw=
230 github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw=
231 github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4=
232 github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
233 github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
234 github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU=
235 github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4=
236 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
237 github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
238 github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
239 github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
240 github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
241 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
242 github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
243 github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
244 github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
245 github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
246 github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
247 github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
248 github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
249 github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
250 github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
251 github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
252 github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
253 github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
254 github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
255 github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
256 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
257 github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
258 github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
259 github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
260 github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
261 github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
262 github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
263 github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
264 github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
265 github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
266 github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
267 github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
268 github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
269 github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
270 github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
271 github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
272 github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
273 github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=
274 github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
275 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
276 github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
277 github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
278 github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
279 github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
280 github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
281 github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
282 github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
283 github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
284 github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
285 github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
286 github.com/google/go-github/v32 v32.1.0/go.mod h1:rIEpZD9CTDQwDK9GDrtMTycQNA4JU3qBsCizh3q2WCI=
287 github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
288 github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=
289 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
290 github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
291 github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
292 github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
293 github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
294 github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
295 github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
296 github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
297 github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
298 github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
299 github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
300 github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
301 github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
302 github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
303 github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
304 github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
305 github.com/google/pprof v0.0.0-20210423192551-a2663126120b/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
306 github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
307 github.com/google/subcommands v1.0.2-0.20190508160503-636abe8753b8/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
308 github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
309 github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
310 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
311 github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
312 github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
313 github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
314 github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
315 github.com/googleapis/gnostic v0.4.0/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU=
316 github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8=
317 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
318 github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
319 github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
320 github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
321 github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
322 github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
323 github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
324 github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
325 github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
326 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
327 github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
328 github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
329 github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
330 github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
331 github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=
332 github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
333 github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
334 github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
335 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
336 github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
337 github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
338 github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
339 github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
340 github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
341 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
342 github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA=
343 github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
344 github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
345 github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
346 github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
347 github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
348 github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
349 github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
350 github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
351 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
352 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
353 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
354 github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
355 github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
356 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
357 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
358 github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
359 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
360 github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
361 github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
362 github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
363 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
364 github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
365 github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
366 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
367 github.com/kr/pty v1.1.4-0.20190131011033-7dc38fb350b1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
368 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
369 github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
370 github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
371 github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
372 github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
373 github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
374 github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
375 github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho=
376 github.com/mattbaird/jsonpatch v0.0.0-20171005235357-81af80346b1a/go.mod h1:M1qoD/MqPgTZIk0EWKB38wE28ACRfVcn+cU08jyArI0=
377 github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
378 github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
379 github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
380 github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
381 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
382 github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
383 github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
384 github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4=
385 github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
386 github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
387 github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A=
388 github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc=
389 github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A=
390 github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ=
391 github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo=
392 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
393 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
394 github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
395 github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
396 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
397 github.com/mohae/deepcopy v0.0.0-20170308212314-bb9b5e7adda9/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
398 github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ=
399 github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
400 github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
401 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
402 github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
403 github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM=
404 github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
405 github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
406 github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
407 github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
408 github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
409 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
410 github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
411 github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
412 github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
413 github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
414 github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
415 github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
416 github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
417 github.com/onsi/gomega v1.10.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
418 github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
419 github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
420 github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
421 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
422 github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
423 github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
424 github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
425 github.com/opencontainers/runc v1.0.0-rc90/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
426 github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
427 github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
428 github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
429 github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs=
430 github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo=
431 github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
432 github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
433 github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
434 github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
435 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
436 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
437 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
438 github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
439 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
440 github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
441 github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
442 github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=
443 github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
444 github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
445 github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
446 github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
447 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
448 github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
449 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
450 github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
451 github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
452 github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
453 github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
454 github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
455 github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
456 github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
457 github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
458 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
459 github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
460 github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
461 github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
462 github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
463 github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
464 github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
465 github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
466 github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
467 github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
468 github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
469 github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
470 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
471 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
472 github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4=
473 github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
474 github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo=
475 github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
476 github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
477 github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
478 github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
479 github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
480 github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
481 github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
482 github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
483 github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
484 github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
485 github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
486 github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
487 github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
488 github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
489 github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
490 github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
491 github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
492 github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
493 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
494 github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
495 github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
496 github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8=
497 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
498 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
499 github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
500 github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
501 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
502 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
503 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
504 github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
505 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
506 github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
507 github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I=
508 github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
509 github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
510 github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
511 github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
512 github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
513 github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
514 github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk=
515 github.com/vishvananda/netlink v1.0.1-0.20190930145447-2ec5bdc52b86/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk=
516 github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI=
517 github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
518 github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI=
519 github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
520 github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
521 github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
522 github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
523 github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
524 github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
525 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
526 github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
527 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
528 github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs=
529 github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA=
530 github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg=
531 go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
532 go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
533 go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
534 go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg=
535 go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk=
536 go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
537 go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
538 go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
539 go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
540 go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
541 go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
542 go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
543 go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
544 go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
545 go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
546 go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
547 go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
548 go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
549 go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
550 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
551 golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
552 golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
553 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
554 golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
555 golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
556 golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
557 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
558 golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
559 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
560 golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
561 golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
562 golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd h1:XcWmESyNjXJMLahc3mqVQJcgSTDxFxhETVlfk9uGc38=
563 golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
564 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
565 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
566 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
567 golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
568 golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
569 golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
570 golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
571 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
572 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
573 golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
574 golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
575 golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
576 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
577 golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
578 golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
579 golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
580 golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
581 golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
582 golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
583 golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
584 golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
585 golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
586 golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
587 golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
588 golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
589 golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
590 golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
591 golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
592 golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
593 golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
594 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
595 golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
596 golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
597 golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
598 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
599 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
600 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
601 golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
602 golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
603 golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
604 golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
605 golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
606 golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
607 golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
608 golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
609 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
610 golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
611 golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
612 golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
613 golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
614 golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
615 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
616 golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
617 golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
618 golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
619 golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
620 golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
621 golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
622 golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
623 golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
624 golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
625 golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
626 golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
627 golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
628 golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
629 golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
630 golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
631 golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
632 golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
633 golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
634 golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
635 golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
636 golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
637 golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
638 golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
639 golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
640 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
641 golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc=
642 golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
643 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
644 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
645 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
646 golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
647 golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
648 golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
649 golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
650 golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
651 golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
652 golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
653 golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
654 golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
655 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
656 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
657 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
658 golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
659 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
660 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
661 golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
662 golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
663 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
664 golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
665 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
666 golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
667 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
668 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
669 golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
670 golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
671 golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
672 golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
673 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
674 golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
675 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
676 golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
677 golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
678 golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
679 golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
680 golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
681 golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
682 golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
683 golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
684 golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
685 golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
686 golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
687 golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
688 golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
689 golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
690 golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
691 golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
692 golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
693 golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
694 golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
695 golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
696 golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
697 golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
698 golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
699 golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
700 golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
701 golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
702 golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
703 golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
704 golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
705 golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
706 golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
707 golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
708 golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
709 golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
710 golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
711 golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
712 golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
713 golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
714 golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
715 golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
716 golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
717 golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
718 golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
719 golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
720 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
721 golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
722 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
723 golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
724 golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
725 golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
726 golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
727 golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
728 golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
729 golang.org/x/sys v0.0.0-20210314195730-07df6a141424/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
730 golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86 h1:A9i04dxx7Cribqbs8jf3FQLogkL/CV2YN7hj9KWJCkc=
731 golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
732 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
733 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
734 golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
735 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
736 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
737 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
738 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
739 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
740 golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
741 golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
742 golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
743 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
744 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
745 golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs=
746 golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
747 golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
748 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
749 golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
750 golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
751 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
752 golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
753 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
754 golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
755 golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
756 golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
757 golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
758 golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
759 golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
760 golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
761 golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
762 golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
763 golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
764 golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
765 golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
766 golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
767 golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
768 golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
769 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
770 golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
771 golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
772 golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
773 golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
774 golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
775 golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
776 golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
777 golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
778 golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
779 golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
780 golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
781 golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
782 golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
783 golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
784 golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
785 golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
786 golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
787 golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
788 golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
789 golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
790 golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
791 golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
792 golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
793 golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
794 golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
795 golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
796 golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
797 golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
798 golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
799 golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
800 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
801 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
802 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
803 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
804 golang.zx2c4.com/wintun v0.0.0-20211104114900-415007cec224 h1:Ug9qvr1myri/zFN6xL17LSCBGFDnphBBhzmILHsM5TY=
805 golang.zx2c4.com/wintun v0.0.0-20211104114900-415007cec224/go.mod h1:deeaetjYA+DHMHg+sMSMI58GrEteJUUzzw7en6TJQcI=
806 golang.zx2c4.com/wireguard v0.0.0-20220316235147-5aff28b14c24 h1:KwsvzlnmErwMd3BXoBSEuL8qU72QxFM/uOUAgZmavRc=
807 golang.zx2c4.com/wireguard v0.0.0-20220316235147-5aff28b14c24/go.mod h1:bVQfyl2sCM/QIIGHpWbFGfHPuDvqnCNkT6MQLTCjO/U=
808 google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
809 google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
810 google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
811 google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
812 google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
813 google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
814 google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
815 google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
816 google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
817 google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
818 google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
819 google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
820 google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
821 google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
822 google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
823 google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
824 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
825 google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=
826 google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
827 google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=
828 google.golang.org/api v0.42.0/go.mod h1:+Oj4s6ch2SEGtPjGqfUfZonBH0GjQH89gTeKKAEGZKI=
829 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
830 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
831 google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
832 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
833 google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
834 google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
835 google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
836 google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk=
837 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
838 google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
839 google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
840 google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
841 google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
842 google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
843 google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
844 google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
845 google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
846 google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
847 google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
848 google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
849 google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
850 google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
851 google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
852 google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
853 google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
854 google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
855 google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
856 google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
857 google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
858 google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
859 google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
860 google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
861 google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
862 google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
863 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
864 google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
865 google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
866 google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
867 google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
868 google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
869 google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
870 google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
871 google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
872 google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
873 google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
874 google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
875 google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
876 google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
877 google.golang.org/genproto v0.0.0-20210312152112-fc591d9ea70f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
878 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
879 google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
880 google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
881 google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
882 google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
883 google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
884 google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA=
885 google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
886 google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
887 google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
888 google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
889 google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
890 google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
891 google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
892 google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
893 google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
894 google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
895 google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
896 google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
897 google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
898 google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
899 google.golang.org/grpc v1.39.0-dev.0.20210518002758-2713b77e8526/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
900 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
901 google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
902 google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
903 google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
904 google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
905 google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
906 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
907 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
908 google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
909 google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
910 google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
911 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
912 gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
913 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
914 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
915 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
916 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
917 gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
918 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
919 gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
920 gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo=
921 gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
922 gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
923 gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
924 gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
925 gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
926 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
927 gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
928 gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
929 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
930 gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
931 gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
932 gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
933 gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
934 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
935 gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
936 gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=
937 gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8=
938 gvisor.dev/gvisor v0.0.0-20211020211948-f76a604701b6 h1:lgV5mAyX6S2EZAkZcvFkAs18WZ7yJbRzEv/PCH8iSlw=
939 gvisor.dev/gvisor v0.0.0-20211020211948-f76a604701b6/go.mod h1:m1RK/gef4nU1CWOFscQWVk7iUgGH2Hz9Ee+lgeCzOBo=
940 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
941 honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
942 honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
943 honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
944 honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
945 honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
946 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
947 honnef.co/go/tools v0.1.1/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=
948 k8s.io/api v0.16.13/go.mod h1:QWu8UWSTiuQZMMeYjwLs6ILu5O74qKSJ0c+4vrchDxs=
949 k8s.io/apimachinery v0.16.13/go.mod h1:4HMHS3mDHtVttspuuhrJ1GGr/0S9B6iWYWZ57KnnZqQ=
950 k8s.io/apimachinery v0.16.14-rc.0/go.mod h1:4HMHS3mDHtVttspuuhrJ1GGr/0S9B6iWYWZ57KnnZqQ=
951 k8s.io/client-go v0.16.13/go.mod h1:UKvVT4cajC2iN7DCjLgT0KVY/cbY6DGdUCyRiIfws5M=
952 k8s.io/component-base v0.16.13/go.mod h1:cNe9ZU2A6tqBG0gPQ4/T/KolI9Cv2NA1+7uvmkA7Cyc=
953 k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc=
954 k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
955 k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
956 k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
957 k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
958 k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
959 k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
960 k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
961 k8s.io/kube-openapi v0.0.0-20200410163147-594e756bea31/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E=
962 k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk=
963 k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
964 k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
965 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
966 rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
967 rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
968 sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
969 sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI=
970 sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
971 sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
972 sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2019-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package netstack
66
77 import (
8 "bytes"
89 "context"
910 "crypto/rand"
1011 "encoding/binary"
2223 "golang.zx2c4.com/wireguard/tun"
2324
2425 "golang.org/x/net/dns/dnsmessage"
26 "gvisor.dev/gvisor/pkg/bufferv2"
2527 "gvisor.dev/gvisor/pkg/tcpip"
2628 "gvisor.dev/gvisor/pkg/tcpip/adapters/gonet"
27 "gvisor.dev/gvisor/pkg/tcpip/buffer"
2829 "gvisor.dev/gvisor/pkg/tcpip/header"
30 "gvisor.dev/gvisor/pkg/tcpip/link/channel"
2931 "gvisor.dev/gvisor/pkg/tcpip/network/ipv4"
3032 "gvisor.dev/gvisor/pkg/tcpip/network/ipv6"
3133 "gvisor.dev/gvisor/pkg/tcpip/stack"
3638 )
3739
3840 type netTun struct {
41 ep *channel.Endpoint
3942 stack *stack.Stack
40 dispatcher stack.NetworkDispatcher
4143 events chan tun.Event
42 incomingPacket chan buffer.VectorisedView
44 incomingPacket chan *bufferv2.View
4345 mtu int
4446 dnsServers []netip.Addr
4547 hasV4, hasV6 bool
4648 }
4749
48 type (
49 endpoint netTun
50 Net netTun
51 )
52
53 func (e *endpoint) Attach(dispatcher stack.NetworkDispatcher) {
54 e.dispatcher = dispatcher
55 }
56
57 func (e *endpoint) IsAttached() bool {
58 return e.dispatcher != nil
59 }
60
61 func (e *endpoint) MTU() uint32 {
62 mtu, err := (*netTun)(e).MTU()
63 if err != nil {
64 panic(err)
65 }
66 return uint32(mtu)
67 }
68
69 func (*endpoint) Capabilities() stack.LinkEndpointCapabilities {
70 return stack.CapabilityNone
71 }
72
73 func (*endpoint) MaxHeaderLength() uint16 {
74 return 0
75 }
76
77 func (*endpoint) LinkAddress() tcpip.LinkAddress {
78 return ""
79 }
80
81 func (*endpoint) Wait() {}
82
83 func (e *endpoint) WritePacket(_ stack.RouteInfo, _ tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) tcpip.Error {
84 e.incomingPacket <- buffer.NewVectorisedView(pkt.Size(), pkt.Views())
85 return nil
86 }
87
88 func (e *endpoint) WritePackets(stack.RouteInfo, stack.PacketBufferList, tcpip.NetworkProtocolNumber) (int, tcpip.Error) {
89 panic("not implemented")
90 }
91
92 func (e *endpoint) WriteRawPacket(*stack.PacketBuffer) tcpip.Error {
93 panic("not implemented")
94 }
95
96 func (*endpoint) ARPHardwareType() header.ARPHardwareType {
97 return header.ARPHardwareNone
98 }
99
100 func (e *endpoint) AddHeader(tcpip.LinkAddress, tcpip.LinkAddress, tcpip.NetworkProtocolNumber, *stack.PacketBuffer) {
101 }
50 type Net netTun
10251
10352 func CreateNetTUN(localAddresses, dnsServers []netip.Addr, mtu int) (tun.Device, *Net, error) {
10453 opts := stack.Options{
10756 HandleLocal: true,
10857 }
10958 dev := &netTun{
59 ep: channel.New(1024, uint32(mtu), ""),
11060 stack: stack.New(opts),
11161 events: make(chan tun.Event, 10),
112 incomingPacket: make(chan buffer.VectorisedView),
62 incomingPacket: make(chan *bufferv2.View),
11363 dnsServers: dnsServers,
11464 mtu: mtu,
11565 }
116 tcpipErr := dev.stack.CreateNIC(1, (*endpoint)(dev))
66 dev.ep.AddNotify(dev)
67 tcpipErr := dev.stack.CreateNIC(1, dev.ep)
11768 if tcpipErr != nil {
11869 return nil, nil, fmt.Errorf("CreateNIC: %v", tcpipErr)
11970 }
157108 return nil
158109 }
159110
160 func (tun *netTun) Events() chan tun.Event {
111 func (tun *netTun) Events() <-chan tun.Event {
161112 return tun.events
162113 }
163114
166117 if !ok {
167118 return 0, os.ErrClosed
168119 }
120
169121 return view.Read(buf[offset:])
170122 }
171123
175127 return 0, nil
176128 }
177129
178 pkb := stack.NewPacketBuffer(stack.PacketBufferOptions{Data: buffer.NewVectorisedView(len(packet), []buffer.View{buffer.NewViewFromBytes(packet)})})
130 pkb := stack.NewPacketBuffer(stack.PacketBufferOptions{Payload: bufferv2.MakeWithData(packet)})
179131 switch packet[0] >> 4 {
180132 case 4:
181 tun.dispatcher.DeliverNetworkPacket("", "", ipv4.ProtocolNumber, pkb)
133 tun.ep.InjectInbound(header.IPv4ProtocolNumber, pkb)
182134 case 6:
183 tun.dispatcher.DeliverNetworkPacket("", "", ipv6.ProtocolNumber, pkb)
135 tun.ep.InjectInbound(header.IPv6ProtocolNumber, pkb)
184136 }
185137
186138 return len(buf), nil
139 }
140
141 func (tun *netTun) WriteNotify() {
142 pkt := tun.ep.Read()
143 if pkt.IsNil() {
144 return
145 }
146
147 view := pkt.ToView()
148 pkt.DecRef()
149
150 tun.incomingPacket <- view
187151 }
188152
189153 func (tun *netTun) Flush() error {
196160 if tun.events != nil {
197161 close(tun.events)
198162 }
163
164 tun.ep.Close()
165
199166 if tun.incomingPacket != nil {
200167 close(tun.incomingPacket)
201168 }
169
202170 return nil
203171 }
204172
433401 return 0, fmt.Errorf("ping write: mismatched protocols")
434402 }
435403
436 buf := buffer.NewViewFromBytes(p)
437 rdr := buf.Reader()
404 buf := bytes.NewReader(p)
438405 rfa, _ := convertToFullAddr(netip.AddrPortFrom(na, 0))
439406 // won't block, no deadlines
440 n64, tcpipErr := pc.ep.Write(&rdr, tcpip.WriteOptions{
407 n64, tcpipErr := pc.ep.Write(buf, tcpip.WriteOptions{
441408 To: &rfa,
442409 })
443410 if tcpipErr != nil {
452419 }
453420
454421 func (pc *PingConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) {
455 e, notifyCh := waiter.NewChannelEntry(nil)
456 pc.wq.EventRegister(&e, waiter.EventIn)
422 e, notifyCh := waiter.NewChannelEntry(waiter.EventIn)
423 pc.wq.EventRegister(&e)
457424 defer pc.wq.EventUnregister(&e)
458425
459426 select {
487454 }
488455
489456 func (pc *PingConn) SetReadDeadline(t time.Time) error {
490 pc.deadline.Reset(t.Sub(time.Now()))
457 pc.deadline.Reset(time.Until(t))
491458 return nil
492459 }
493460
11
22 /* SPDX-License-Identifier: MIT
33 *
4 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
4 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
55 */
66
77 package tun
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package tun
2323 Flush() error // flush all previous writes to the device
2424 MTU() (int, error) // returns the MTU of the device
2525 Name() (string, error) // fetches and returns the current name
26 Events() chan Event // returns a constant channel of events related to the device
26 Events() <-chan Event // returns a constant channel of events related to the device
2727 Close() error // stops the device and closes the event channel
2828 }
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package tun
106106 }
107107 }
108108
109 fd, err := unix.Socket(unix.AF_SYSTEM, unix.SOCK_DGRAM, 2)
109 fd, err := socketCloexec(unix.AF_SYSTEM, unix.SOCK_DGRAM, 2)
110110 if err != nil {
111111 return nil, err
112112 }
172172 return nil, err
173173 }
174174
175 tun.routeSocket, err = unix.Socket(unix.AF_ROUTE, unix.SOCK_RAW, unix.AF_UNSPEC)
175 tun.routeSocket, err = socketCloexec(unix.AF_ROUTE, unix.SOCK_RAW, unix.AF_UNSPEC)
176176 if err != nil {
177177 tun.tunFile.Close()
178178 return nil, err
212212 return tun.tunFile
213213 }
214214
215 func (tun *NativeTun) Events() chan Event {
215 func (tun *NativeTun) Events() <-chan Event {
216216 return tun.events
217217 }
218218
275275 }
276276
277277 func (tun *NativeTun) setMTU(n int) error {
278 fd, err := unix.Socket(
278 fd, err := socketCloexec(
279279 unix.AF_INET,
280280 unix.SOCK_DGRAM,
281281 0,
298298 }
299299
300300 func (tun *NativeTun) MTU() (int, error) {
301 fd, err := unix.Socket(
301 fd, err := socketCloexec(
302302 unix.AF_INET,
303303 unix.SOCK_DGRAM,
304304 0,
316316
317317 return int(ifr.MTU), nil
318318 }
319
320 func socketCloexec(family, sotype, proto int) (fd int, err error) {
321 // See go/src/net/sys_cloexec.go for background.
322 syscall.ForkLock.RLock()
323 defer syscall.ForkLock.RUnlock()
324
325 fd, err = unix.Socket(family, sotype, proto)
326 if err == nil {
327 unix.CloseOnExec(fd)
328 }
329 return
330 }
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package tun
142142
143143 // Destroy a named system interface
144144 func tunDestroy(name string) error {
145 fd, err := unix.Socket(unix.AF_INET, unix.SOCK_DGRAM, 0)
145 fd, err := unix.Socket(unix.AF_INET, unix.SOCK_DGRAM|unix.SOCK_CLOEXEC, 0)
146146 if err != nil {
147147 return err
148148 }
169169 return nil, fmt.Errorf("interface %s already exists", name)
170170 }
171171
172 tunFile, err := os.OpenFile("/dev/tun", unix.O_RDWR, 0)
172 tunFile, err := os.OpenFile("/dev/tun", unix.O_RDWR|unix.O_CLOEXEC, 0)
173173 if err != nil {
174174 return nil, err
175175 }
212212 // Disable link-local v6, not just because WireGuard doesn't do that anyway, but
213213 // also because there are serious races with attaching and detaching LLv6 addresses
214214 // in relation to interface lifetime within the FreeBSD kernel.
215 confd6, err := unix.Socket(unix.AF_INET6, unix.SOCK_DGRAM, 0)
215 confd6, err := unix.Socket(unix.AF_INET6, unix.SOCK_DGRAM|unix.SOCK_CLOEXEC, 0)
216216 if err != nil {
217217 tunFile.Close()
218218 tunDestroy(assignedName)
237237 }
238238
239239 if name != "" {
240 confd, err := unix.Socket(unix.AF_INET, unix.SOCK_DGRAM, 0)
240 confd, err := unix.Socket(unix.AF_INET, unix.SOCK_DGRAM|unix.SOCK_CLOEXEC, 0)
241241 if err != nil {
242242 tunFile.Close()
243243 tunDestroy(assignedName)
294294 return nil, err
295295 }
296296
297 tun.routeSocket, err = unix.Socket(unix.AF_ROUTE, unix.SOCK_RAW, unix.AF_UNSPEC)
297 tun.routeSocket, err = unix.Socket(unix.AF_ROUTE, unix.SOCK_RAW|unix.SOCK_CLOEXEC, unix.AF_UNSPEC)
298298 if err != nil {
299299 tun.tunFile.Close()
300300 return nil, err
328328 return tun.tunFile
329329 }
330330
331 func (tun *NativeTun) Events() chan Event {
331 func (tun *NativeTun) Events() <-chan Event {
332332 return tun.events
333333 }
334334
396396 }
397397
398398 func (tun *NativeTun) setMTU(n int) error {
399 fd, err := unix.Socket(unix.AF_INET, unix.SOCK_DGRAM, 0)
399 fd, err := unix.Socket(unix.AF_INET, unix.SOCK_DGRAM|unix.SOCK_CLOEXEC, 0)
400400 if err != nil {
401401 return err
402402 }
413413 }
414414
415415 func (tun *NativeTun) MTU() (int, error) {
416 fd, err := unix.Socket(unix.AF_INET, unix.SOCK_DGRAM, 0)
416 fd, err := unix.Socket(unix.AF_INET, unix.SOCK_DGRAM|unix.SOCK_CLOEXEC, 0)
417417 if err != nil {
418418 return 0, err
419419 }
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package tun
88 */
99
1010 import (
11 "bytes"
1211 "errors"
1312 "fmt"
1413 "os"
9998 }
10099
101100 func createNetlinkSocket() (int, error) {
102 sock, err := unix.Socket(unix.AF_NETLINK, unix.SOCK_RAW, unix.NETLINK_ROUTE)
101 sock, err := unix.Socket(unix.AF_NETLINK, unix.SOCK_RAW|unix.SOCK_CLOEXEC, unix.NETLINK_ROUTE)
103102 if err != nil {
104103 return -1, err
105104 }
194193 func getIFIndex(name string) (int32, error) {
195194 fd, err := unix.Socket(
196195 unix.AF_INET,
197 unix.SOCK_DGRAM,
196 unix.SOCK_DGRAM|unix.SOCK_CLOEXEC,
198197 0,
199198 )
200199 if err != nil {
228227 // open datagram socket
229228 fd, err := unix.Socket(
230229 unix.AF_INET,
231 unix.SOCK_DGRAM,
230 unix.SOCK_DGRAM|unix.SOCK_CLOEXEC,
232231 0,
233232 )
234233 if err != nil {
264263 // open datagram socket
265264 fd, err := unix.Socket(
266265 unix.AF_INET,
267 unix.SOCK_DGRAM,
266 unix.SOCK_DGRAM|unix.SOCK_CLOEXEC,
268267 0,
269268 )
270269 if err != nil {
320319 if errno != 0 {
321320 return "", fmt.Errorf("failed to get name of TUN device: %w", errno)
322321 }
323 name := ifr[:]
324 if i := bytes.IndexByte(name, 0); i != -1 {
325 name = name[:i]
326 }
327 return string(name), nil
322 return unix.ByteSliceToString(ifr[:]), nil
328323 }
329324
330325 func (tun *NativeTun) Write(buf []byte, offset int) (int, error) {
380375 return
381376 }
382377
383 func (tun *NativeTun) Events() chan Event {
378 func (tun *NativeTun) Events() <-chan Event {
384379 return tun.events
385380 }
386381
404399 }
405400
406401 func CreateTUN(name string, mtu int) (Device, error) {
407 nfd, err := unix.Open(cloneDevicePath, os.O_RDWR, 0)
402 nfd, err := unix.Open(cloneDevicePath, unix.O_RDWR|unix.O_CLOEXEC, 0)
408403 if err != nil {
409404 if os.IsNotExist(err) {
410405 return nil, fmt.Errorf("CreateTUN(%q) failed; %s does not exist", name, cloneDevicePath)
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package tun
113113 var err error
114114
115115 if ifIndex != -1 {
116 tunfile, err = os.OpenFile(fmt.Sprintf("/dev/tun%d", ifIndex), unix.O_RDWR, 0)
116 tunfile, err = os.OpenFile(fmt.Sprintf("/dev/tun%d", ifIndex), unix.O_RDWR|unix.O_CLOEXEC, 0)
117117 } else {
118118 for ifIndex = 0; ifIndex < 256; ifIndex++ {
119 tunfile, err = os.OpenFile(fmt.Sprintf("/dev/tun%d", ifIndex), unix.O_RDWR, 0)
119 tunfile, err = os.OpenFile(fmt.Sprintf("/dev/tun%d", ifIndex), unix.O_RDWR|unix.O_CLOEXEC, 0)
120120 if err == nil || !errors.Is(err, syscall.EBUSY) {
121121 break
122122 }
164164 return nil, err
165165 }
166166
167 tun.routeSocket, err = unix.Socket(unix.AF_ROUTE, unix.SOCK_RAW, unix.AF_UNSPEC)
167 tun.routeSocket, err = unix.Socket(unix.AF_ROUTE, unix.SOCK_RAW|unix.SOCK_CLOEXEC, unix.AF_UNSPEC)
168168 if err != nil {
169169 tun.tunFile.Close()
170170 return nil, err
199199 return tun.tunFile
200200 }
201201
202 func (tun *NativeTun) Events() chan Event {
202 func (tun *NativeTun) Events() <-chan Event {
203203 return tun.events
204204 }
205205
269269
270270 fd, err := unix.Socket(
271271 unix.AF_INET,
272 unix.SOCK_DGRAM,
272 unix.SOCK_DGRAM|unix.SOCK_CLOEXEC,
273273 0,
274274 )
275275 if err != nil {
303303
304304 fd, err := unix.Socket(
305305 unix.AF_INET,
306 unix.SOCK_DGRAM,
306 unix.SOCK_DGRAM|unix.SOCK_CLOEXEC,
307307 0,
308308 )
309309 if err != nil {
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2018-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package tun
2525 )
2626
2727 type rateJuggler struct {
28 current uint64
29 nextByteCount uint64
30 nextStartTime int64
31 changing int32
28 current atomic.Uint64
29 nextByteCount atomic.Uint64
30 nextStartTime atomic.Int64
31 changing atomic.Bool
3232 }
3333
3434 type NativeTun struct {
4141 events chan Event
4242 running sync.WaitGroup
4343 closeOnce sync.Once
44 close int32
44 close atomic.Bool
4545 forcedMTU int
4646 }
4747
5656 //go:linkname nanotime runtime.nanotime
5757 func nanotime() int64
5858
59 //
6059 // CreateTUN creates a Wintun interface with the given name. Should a Wintun
6160 // interface with the same name exist, it is reused.
62 //
6361 func CreateTUN(ifname string, mtu int) (Device, error) {
6462 return CreateTUNWithRequestedGUID(ifname, WintunStaticRequestedGUID, mtu)
6563 }
6664
67 //
6865 // CreateTUNWithRequestedGUID creates a Wintun interface with the given name and
6966 // a requested GUID. Should a Wintun interface with the same name exist, it is reused.
70 //
7167 func CreateTUNWithRequestedGUID(ifname string, requestedGUID *windows.GUID, mtu int) (Device, error) {
7268 wt, err := wintun.CreateAdapter(ifname, WintunTunnelType, requestedGUID)
7369 if err != nil {
105101 return nil
106102 }
107103
108 func (tun *NativeTun) Events() chan Event {
104 func (tun *NativeTun) Events() <-chan Event {
109105 return tun.events
110106 }
111107
112108 func (tun *NativeTun) Close() error {
113109 var err error
114110 tun.closeOnce.Do(func() {
115 atomic.StoreInt32(&tun.close, 1)
111 tun.close.Store(true)
116112 windows.SetEvent(tun.readWait)
117113 tun.running.Wait()
118114 tun.session.End()
143139 tun.running.Add(1)
144140 defer tun.running.Done()
145141 retry:
146 if atomic.LoadInt32(&tun.close) == 1 {
142 if tun.close.Load() {
147143 return 0, os.ErrClosed
148144 }
149145 start := nanotime()
150 shouldSpin := atomic.LoadUint64(&tun.rate.current) >= spinloopRateThreshold && uint64(start-atomic.LoadInt64(&tun.rate.nextStartTime)) <= rateMeasurementGranularity*2
146 shouldSpin := tun.rate.current.Load() >= spinloopRateThreshold && uint64(start-tun.rate.nextStartTime.Load()) <= rateMeasurementGranularity*2
151147 for {
152 if atomic.LoadInt32(&tun.close) == 1 {
148 if tun.close.Load() {
153149 return 0, os.ErrClosed
154150 }
155151 packet, err := tun.session.ReceivePacket()
183179 func (tun *NativeTun) Write(buff []byte, offset int) (int, error) {
184180 tun.running.Add(1)
185181 defer tun.running.Done()
186 if atomic.LoadInt32(&tun.close) == 1 {
182 if tun.close.Load() {
187183 return 0, os.ErrClosed
188184 }
189185
209205 func (tun *NativeTun) LUID() uint64 {
210206 tun.running.Add(1)
211207 defer tun.running.Done()
212 if atomic.LoadInt32(&tun.close) == 1 {
208 if tun.close.Load() {
213209 return 0
214210 }
215211 return tun.wt.LUID()
222218
223219 func (rate *rateJuggler) update(packetLen uint64) {
224220 now := nanotime()
225 total := atomic.AddUint64(&rate.nextByteCount, packetLen)
226 period := uint64(now - atomic.LoadInt64(&rate.nextStartTime))
221 total := rate.nextByteCount.Add(packetLen)
222 period := uint64(now - rate.nextStartTime.Load())
227223 if period >= rateMeasurementGranularity {
228 if !atomic.CompareAndSwapInt32(&rate.changing, 0, 1) {
224 if !rate.changing.CompareAndSwap(false, true) {
229225 return
230226 }
231 atomic.StoreInt64(&rate.nextStartTime, now)
232 atomic.StoreUint64(&rate.current, total*uint64(time.Second/time.Nanosecond)/period)
233 atomic.StoreUint64(&rate.nextByteCount, 0)
234 atomic.StoreInt32(&rate.changing, 0)
235 }
236 }
227 rate.nextStartTime.Store(now)
228 rate.current.Store(total * uint64(time.Second/time.Nanosecond) / period)
229 rate.nextByteCount.Store(0)
230 rate.changing.Store(false)
231 }
232 }
00 /* SPDX-License-Identifier: MIT
11 *
2 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
2 * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
33 */
44
55 package tuntest
137137
138138 const DefaultMTU = 1420
139139
140 func (t *chTun) Flush() error { return nil }
141 func (t *chTun) MTU() (int, error) { return DefaultMTU, nil }
142 func (t *chTun) Name() (string, error) { return "loopbackTun1", nil }
143 func (t *chTun) Events() chan tun.Event { return t.c.events }
140 func (t *chTun) Flush() error { return nil }
141 func (t *chTun) MTU() (int, error) { return DefaultMTU, nil }
142 func (t *chTun) Name() (string, error) { return "loopbackTun1", nil }
143 func (t *chTun) Events() <-chan tun.Event { return t.c.events }
144144 func (t *chTun) Close() error {
145145 t.Write(nil, -1)
146146 return nil
00 package main
11
2 const Version = "0.0.20220316"
2 const Version = "0.0.20230223"