Skip to content

Commit

Permalink
[client] Retry on tun creation for darwin (#2564)
Browse files Browse the repository at this point in the history
The interface creation on macOS seems to be asynchronus why the tun.create methode somethimes failes becasue the interface is not ready yet. To work around this issue we introduce a retry on tun.create
  • Loading branch information
pascal-fischer authored Sep 9, 2024
1 parent 51e1d3a commit f43a0a0
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 3 deletions.
2 changes: 1 addition & 1 deletion iface/iface_create.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
//go:build !android
//go:build (!android && !darwin) || ios

package iface

Expand Down
28 changes: 28 additions & 0 deletions iface/iface_darwin.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ package iface

import (
"fmt"
"time"

"github.com/cenkalti/backoff/v4"
"github.com/pion/transport/v3"

"github.com/netbirdio/netbird/iface/bind"
Expand Down Expand Up @@ -36,3 +38,29 @@ func NewWGIFace(iFaceName string, address string, wgPort int, wgPrivKey string,
func (w *WGIface) CreateOnAndroid([]string, string, []string) error {
return fmt.Errorf("this function has not implemented on this platform")
}

// Create creates a new Wireguard interface, sets a given IP and brings it up.
// Will reuse an existing one.
// this function is different on Android
func (w *WGIface) Create() error {
w.mu.Lock()
defer w.mu.Unlock()

backOff := &backoff.ExponentialBackOff{
InitialInterval: 20 * time.Millisecond,
MaxElapsedTime: 500 * time.Millisecond,
Stop: backoff.Stop,
Clock: backoff.SystemClock,
}

operation := func() error {
cfgr, err := w.tun.Create()
if err != nil {
return err
}
w.configurer = cfgr
return nil
}

return backoff.Retry(operation, backOff)
}
2 changes: 0 additions & 2 deletions management/server/peer.go
Original file line number Diff line number Diff line change
Expand Up @@ -550,8 +550,6 @@ func (am *DefaultAccountManager) SyncPeer(ctx context.Context, sync PeerSync, ac
}

if peer.UserID != "" {
log.Infof("Peer has no userID")

user, err := account.FindUser(peer.UserID)
if err != nil {
return nil, nil, nil, err
Expand Down

0 comments on commit f43a0a0

Please sign in to comment.