From 399ce8435d6b16bbbb32c1028176191ea7a4f25f Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sun, 24 Feb 2019 16:06:24 +0300 Subject: [PATCH] Reset tunnel on disconnect --- Sources/OpenVPNAdapter/OpenVPNAdapter.h | 6 +++--- Sources/OpenVPNAdapter/OpenVPNAdapter.mm | 10 ++++++++++ Tests/OpenVPNAdapterTests.swift | 2 +- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Sources/OpenVPNAdapter/OpenVPNAdapter.h b/Sources/OpenVPNAdapter/OpenVPNAdapter.h index 45b5ccb..3105daa 100644 --- a/Sources/OpenVPNAdapter/OpenVPNAdapter.h +++ b/Sources/OpenVPNAdapter/OpenVPNAdapter.h @@ -34,11 +34,11 @@ typedef NS_ENUM(NSInteger, OpenVPNAdapterEvent); the TUN interface, or nil if an error occurred. @param openVPNAdapter The OpenVPNAdapter instance requesting this information. - @param networkSettings The NEPacketTunnelNetworkSettings to be used for the tunnel. - @param completionHandler The completion handler to be called with a NEPacketTunnelFlow object, or nil if an error occurred. + @param networkSettings The NEPacketTunnelNetworkSettings to be used for the tunnel. Provides nil to clear out the network settings. + @param completionHandler The completion handler to be called with a NEPacketTunnelFlow object, or nil if an error occurred or the network settings were cleared out. */ - (void)openVPNAdapter:(OpenVPNAdapter *)openVPNAdapter -configureTunnelWithNetworkSettings:(NEPacketTunnelNetworkSettings *)networkSettings +configureTunnelWithNetworkSettings:(nullable NEPacketTunnelNetworkSettings *)networkSettings completionHandler:(void (^)(id _Nullable packetFlow))completionHandler NS_SWIFT_NAME(openVPNAdapter(_:configureTunnelWithNetworkSettings:completionHandler:)); diff --git a/Sources/OpenVPNAdapter/OpenVPNAdapter.mm b/Sources/OpenVPNAdapter/OpenVPNAdapter.mm index 0e7a2e1..84a6e29 100644 --- a/Sources/OpenVPNAdapter/OpenVPNAdapter.mm +++ b/Sources/OpenVPNAdapter/OpenVPNAdapter.mm @@ -398,6 +398,16 @@ _sessionName = nil; _packetFlowBridge = nil; _networkSettingsBuilder = nil; + + dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); + + void (^completionHandler)(id _Nullable) = ^(id flow) { + dispatch_semaphore_signal(semaphore); + }; + + [self.delegate openVPNAdapter:self configureTunnelWithNetworkSettings:nil completionHandler:completionHandler]; + + dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, 30 * NSEC_PER_SEC)); } #pragma mark - diff --git a/Tests/OpenVPNAdapterTests.swift b/Tests/OpenVPNAdapterTests.swift index eb3a29d..11b7ec0 100644 --- a/Tests/OpenVPNAdapterTests.swift +++ b/Tests/OpenVPNAdapterTests.swift @@ -111,7 +111,7 @@ class OpenVPNAdapterTests: XCTestCase { extension OpenVPNAdapterTests: OpenVPNAdapterDelegate { - func openVPNAdapter(_ openVPNAdapter: OpenVPNAdapter, configureTunnelWithNetworkSettings networkSettings: NEPacketTunnelNetworkSettings, completionHandler: @escaping (OpenVPNAdapterPacketFlow?) -> Void) { + func openVPNAdapter(_ openVPNAdapter: OpenVPNAdapter, configureTunnelWithNetworkSettings networkSettings: NEPacketTunnelNetworkSettings?, completionHandler: @escaping (OpenVPNAdapterPacketFlow?) -> Void) { completionHandler(customFlow) }