diff --git a/client/internal/connect.go b/client/internal/connect.go index d4d17e30b..c4840b4bb 100644 --- a/client/internal/connect.go +++ b/client/internal/connect.go @@ -3,6 +3,7 @@ package internal import ( "context" "fmt" + "runtime" "strings" "time" @@ -43,11 +44,12 @@ func RunClientMobile(ctx context.Context, config *Config, statusRecorder *peer.S return runClient(ctx, config, statusRecorder, mobileDependency) } -func RunClientiOS(ctx context.Context, config *Config, statusRecorder *peer.Status, fileDescriptor int32, networkChangeListener listener.NetworkChangeListener, dnsManager dns.IosDnsManager, interfaceName string) error { +func RunClientiOS(ctx context.Context, config *Config, statusRecorder *peer.Status, fileDescriptor int32, networkChangeListener listener.NetworkChangeListener, dnsManager dns.IosDnsManager, interfaceName string, engineReadyListener listener.EngineReadyListener) error { mobileDependency := MobileDependency{ FileDescriptor: fileDescriptor, InterfaceName: interfaceName, NetworkChangeListener: networkChangeListener, + EngineReadyListener: engineReadyListener, DnsManager: dnsManager, } return runClient(ctx, config, statusRecorder, mobileDependency) @@ -189,6 +191,10 @@ func runClient(ctx context.Context, config *Config, statusRecorder *peer.Status, return wrapErr(err) } + if runtime.GOOS == "ios" { + mobileDependency.EngineReadyListener.Notify() + } + log.Print("Netbird engine started, my IP is: ", peerConfig.Address) state.Set(StatusConnected) diff --git a/client/internal/listener/engine_ready.go b/client/internal/listener/engine_ready.go new file mode 100644 index 000000000..760aa0e2f --- /dev/null +++ b/client/internal/listener/engine_ready.go @@ -0,0 +1,7 @@ +package listener + +// EngineReadyListener is a callback interface for mobile system +type EngineReadyListener interface { + // Notify invoke when engine is ready + Notify() +} diff --git a/client/internal/mobile_dependency.go b/client/internal/mobile_dependency.go index 0f762a570..874cbda4b 100644 --- a/client/internal/mobile_dependency.go +++ b/client/internal/mobile_dependency.go @@ -12,6 +12,7 @@ type MobileDependency struct { TunAdapter iface.TunAdapter IFaceDiscover stdnet.ExternalIFaceDiscover NetworkChangeListener listener.NetworkChangeListener + EngineReadyListener listener.EngineReadyListener HostDNSAddresses []string DnsReadyListener dns.ReadyListener DnsManager dns.IosDnsManager diff --git a/client/ios/NetBirdSDK/client.go b/client/ios/NetBirdSDK/client.go index 8e46267d0..4b6351df6 100644 --- a/client/ios/NetBirdSDK/client.go +++ b/client/ios/NetBirdSDK/client.go @@ -33,6 +33,11 @@ type CustomLogger interface { Error(message string) } +// EngineReadyListener export internal EngineReadyListener for mobile +type EngineReadyListener interface { + listener.EngineReadyListener +} + func init() { formatter.SetLogcatFormatter(log.StandardLogger()) } @@ -67,7 +72,7 @@ func NewClient(cfgFile, deviceName string, osVersion string, osName string, netw } // Run start the internal client. It is a blocker function -func (c *Client) Run(fd int32, interfaceName string) error { +func (c *Client) Run(fd int32, interfaceName string, engineReadyListener EngineReadyListener) error { log.Infof("Starting NetBird client") log.Debugf("Tunnel uses interface: %s", interfaceName) cfg, err := internal.UpdateOrCreateConfig(internal.ConfigInput{ @@ -98,7 +103,7 @@ func (c *Client) Run(fd int32, interfaceName string) error { // todo do not throw error in case of cancelled context ctx = internal.CtxInitState(ctx) c.onHostDnsFn = func([]string) {} - return internal.RunClientiOS(ctx, cfg, c.recorder, fd, c.networkChangeListener, c.dnsManager, interfaceName) + return internal.RunClientiOS(ctx, cfg, c.recorder, fd, c.networkChangeListener, c.dnsManager, interfaceName, engineReadyListener) } // Stop the internal client and free the resources