Reconnection Bugfix Proposal (#20)

* Add proposed fix to reconnection bug

* Utilise tun_builder_teardown method to initiate settings reset

* Move socket teardown code to -teardownTunnel:
This commit is contained in:
Jonathan Downing
2017-09-23 09:46:51 +01:00
committed by Sergey Abramchuk
parent 7230e1f83d
commit 73d593fe4c
3 changed files with 38 additions and 23 deletions
@@ -30,6 +30,7 @@ using namespace openvpn;
- (BOOL)setMTU:(NSNumber *)mtu;
- (NSInteger)establishTunnel;
- (void)teardownTunnel:(BOOL)disconnect;
- (void)handleEvent:(const ClientAPI::Event *)event;
- (void)handleLog:(const ClientAPI::LogInfo *)log;
+34 -22
View File
@@ -38,8 +38,8 @@
@property (assign, nonatomic) OpenVPNClient *vpnClient;
@property CFSocketRef vpnSocket;
@property CFSocketRef tunSocket;
@property (assign, nonatomic) CFSocketRef vpnSocket;
@property (assign, nonatomic) CFSocketRef tunSocket;
@property (strong, nonatomic) NSString *remoteAddress;
@@ -333,6 +333,32 @@ static void socketCallback(CFSocketRef socket, CFSocketCallBackType type, CFData
}
}
- (void)teardownTunnel:(BOOL)disconnect {
[self resetTunnelSettings];
if (self.vpnSocket) {
CFSocketInvalidate(self.vpnSocket);
CFRelease(self.vpnSocket);
self.vpnSocket = nil;
}
if (self.tunSocket) {
CFSocketInvalidate(self.tunSocket);
CFRelease(self.tunSocket);
self.tunSocket = nil;
}
}
- (void)resetTunnelSettings {
self.remoteAddress = nil;
self.defaultGatewayIPv6 = nil;
self.defaultGatewayIPv4 = nil;
self.tunnelSettingsIPv6 = [[OpenVPNTunnelSettings alloc] init];
self.tunnelSettingsIPv4 = [[OpenVPNTunnelSettings alloc] init];
self.searchDomains = [[NSMutableArray alloc] init];
self.mtu = nil;
}
#pragma mark Event and Log Handlers
- (void)handleEvent:(const ClientAPI::Event *)event {
@@ -499,25 +525,6 @@ static void socketCallback(CFSocketRef socket, CFSocketCallBackType type, CFData
}];
}
self.remoteAddress = nil;
self.tunnelSettingsIPv6 = nil;
self.tunnelSettingsIPv4 = nil;
self.searchDomains = nil;
self.mtu = nil;
if (self.vpnSocket) {
CFSocketInvalidate(self.vpnSocket);
CFRelease(self.vpnSocket);
}
if (self.tunSocket) {
CFSocketInvalidate(self.tunSocket);
CFRelease(self.tunSocket);
}
OpenVPNClient::uninit_process();
});
}
@@ -565,7 +572,12 @@ static void socketCallback(CFSocketRef socket, CFSocketCallBackType type, CFData
}
- (void)writeVPNPackets:(NSArray<NSData *> *)packets protocols:(NSArray<NSNumber *> *)protocols {
[packets enumerateObjectsUsingBlock:^(NSData * data, NSUInteger idx, BOOL * stop) {
[packets enumerateObjectsUsingBlock:^(NSData *data, NSUInteger idx, BOOL *stop) {
if (!self.vpnSocket) {
*stop = YES;
return;
}
// Prepare data for sending
NSData *packet = [self prepareVPNPacket:data protocol:protocols[idx]];
+3 -1
View File
@@ -93,7 +93,9 @@ bool OpenVPNClient::tun_builder_persist() {
void OpenVPNClient::tun_builder_establish_lite() { }
void OpenVPNClient::tun_builder_teardown(bool disconnect) { }
void OpenVPNClient::tun_builder_teardown(bool disconnect) {
[(__bridge OpenVPNAdapter *)adapter teardownTunnel:disconnect];
}
bool OpenVPNClient::socket_protect(int socket) {
return true;