-
Notifications
You must be signed in to change notification settings - Fork 11
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #606 from Chilledheart/ios_add_packet_tunnel_glue_…
…code Ios add packet tunnel glue code
- Loading branch information
Showing
7 changed files
with
228 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
<plist version="1.0"> | ||
<dict> | ||
<key>NSExtension</key> | ||
<dict> | ||
<key>NSExtensionPointIdentifier</key> | ||
<string>com.apple.networkextension.packet-tunnel</string> | ||
<key>NSExtensionPrincipalClass</key> | ||
<string>PacketTunnelProvider</string> | ||
</dict> | ||
</dict> | ||
</plist> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
<plist version="1.0"> | ||
<dict> | ||
<key>com.apple.security.application-groups</key> | ||
<array> | ||
<string>group.it.gui.ios.yass</string> | ||
</array> | ||
</dict> | ||
</plist> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
/* Copyright (c) 2023 Chilledheart */ | ||
|
||
#import <NetworkExtension/NetworkExtension.h> | ||
|
||
@interface PacketTunnelProvider : NEPacketTunnelProvider | ||
|
||
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
/* Copyright (c) 2023 Chilledheart */ | ||
|
||
#import "PacketTunnelProvider.h" | ||
|
||
@implementation PacketTunnelProvider | ||
|
||
- (void)startTunnelWithOptions:(NSDictionary *)options completionHandler:(void (^)(NSError *))completionHandler { | ||
// Add code here to start the process of connecting the tunnel. | ||
} | ||
|
||
- (void)stopTunnelWithReason:(NEProviderStopReason)reason completionHandler:(void (^)(void))completionHandler { | ||
// Add code here to start the process of stopping the tunnel. | ||
completionHandler(); | ||
} | ||
|
||
- (void)handleAppMessage:(NSData *)messageData completionHandler:(void (^)(NSData *))completionHandler { | ||
// Add code here to handle the message. | ||
} | ||
|
||
- (void)sleepWithCompletionHandler:(void (^)(void))completionHandler { | ||
// Add code here to get ready to sleep. | ||
completionHandler(); | ||
} | ||
|
||
- (void)wake { | ||
// Add code here to wake up. | ||
} | ||
|
||
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
/* Copyright (c) 2023 Chilledheart */ | ||
#ifndef YASS_IOS_TUN2PROXY | ||
#define YASS_IOS_TUN2PROXY | ||
|
||
#import <Foundation/Foundation.h> | ||
|
||
@class NEPacketTunnelFlow; | ||
@class NEPacket; | ||
|
||
void Tun2Proxy_Init(NEPacketTunnelFlow *flow); | ||
void Tun2Proxy_ForwardReadPackets(NSArray<NEPacket *> *packets); | ||
void Tun2Proxy_Destroy(); | ||
|
||
#endif // YASS_IOS_TUN2PROXY |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,96 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
/* Copyright (c) 2023 Chilledheart */ | ||
#include "ios/tun2proxy.h" | ||
|
||
#import <NetworkExtension/NetworkExtension.h> | ||
|
||
struct InitContent { | ||
__weak NEPacketTunnelFlow *packetFlow; | ||
}; | ||
|
||
struct ReadPacketContent { | ||
NSArray<NEPacket *> *packets; | ||
}; | ||
|
||
static size_t GetPacketCount(void *content, void* packets) { | ||
NSArray<NEPacket *> *array = reinterpret_cast<ReadPacketContent*>(packets)->packets; | ||
return [array count]; | ||
} | ||
|
||
static const void* GetPacketDataAtIndex(void *content, void* packets, int index) { | ||
NSArray<NEPacket *> *array = reinterpret_cast<ReadPacketContent*>(packets)->packets; | ||
NEPacket *packet = array[index]; | ||
uint32_t prefix = CFSwapInt32HostToBig((uint32_t)packet.protocolFamily); | ||
// Prepend data with network protocol. It should be done because on tun2proxy | ||
// uses uint32_t prefixes containing network protocol. | ||
NSMutableData *data = [[NSMutableData alloc] initWithCapacity:sizeof(prefix) + packet.data.length]; | ||
[data appendBytes:&prefix length:sizeof(prefix)]; | ||
[data appendData:packet.data]; | ||
|
||
return data.bytes; | ||
} | ||
|
||
static size_t GetPacketSizeAtIndex(void *content, void* packets, int index) { | ||
NSArray<NEPacket *> *array = reinterpret_cast<ReadPacketContent*>(packets)->packets; | ||
return sizeof(uint32_t) + [[array[index] data] length]; | ||
} | ||
|
||
static NEPacket *packetFromData(NSData *data) { | ||
// Get network protocol from prefix | ||
NSUInteger prefixSize = sizeof(uint32_t); | ||
|
||
if (data.length < prefixSize) { | ||
return nil; | ||
} | ||
|
||
uint32_t protocol = PF_UNSPEC; | ||
[data getBytes:&protocol length:prefixSize]; | ||
protocol = CFSwapInt32BigToHost(protocol); | ||
|
||
NSRange range = NSMakeRange(prefixSize, data.length - prefixSize); | ||
NSData *packetData = [data subdataWithRange:range]; | ||
|
||
return [[NEPacket alloc] initWithData:packetData protocolFamily:protocol]; | ||
} | ||
|
||
static void WritePackets(void* content, void** packets, size_t* packetLengths, | ||
int packetsCount) { | ||
InitContent *c = reinterpret_cast<InitContent*>(content); | ||
NEPacketTunnelFlow* packetFlow = c->packetFlow;; | ||
NSMutableArray *packetsArray = [NSMutableArray array]; | ||
for (int i = 0; i < packetsCount; ++i) { | ||
NSData *data = [NSData dataWithBytes:packets[i] length:packetLengths[i]]; | ||
NEPacket *packet = packetFromData(data); | ||
[packetsArray addObject:packet]; | ||
} | ||
[packetFlow writePacketObjects:packetsArray]; | ||
} | ||
|
||
extern "C" | ||
void tun2proxy_init(void* content, decltype(WritePackets)); | ||
|
||
extern "C" | ||
void tun2proxy_read_packets(void* packets, decltype(GetPacketCount), | ||
decltype(GetPacketDataAtIndex), | ||
decltype(GetPacketSizeAtIndex)); | ||
|
||
extern "C" | ||
void* tun2proxy_destroy(); | ||
|
||
void Tun2Proxy_Init(NEPacketTunnelFlow *packetFlow) { | ||
InitContent *c = new InitContent; | ||
c->packetFlow = packetFlow; | ||
tun2proxy_init(c, WritePackets); | ||
} | ||
|
||
void Tun2Proxy_ForwardReadPackets(NSArray<NEPacket *> *packets) { | ||
ReadPacketContent p; | ||
p.packets = packets; | ||
tun2proxy_read_packets(&p, GetPacketCount, GetPacketDataAtIndex, | ||
GetPacketSizeAtIndex); | ||
} | ||
|
||
void Tun2Proxy_Destroy() { | ||
InitContent *c = reinterpret_cast<InitContent*>(tun2proxy_destroy()); | ||
delete c; | ||
} |