Skip to content
This repository has been archived by the owner on Sep 29, 2024. It is now read-only.

Commit

Permalink
Merge pull request #8 from keeshux/ipv6-support
Browse files Browse the repository at this point in the history
IPv6 support
  • Loading branch information
keeshux authored Sep 2, 2018
2 parents 97866e6 + 474e633 commit 0360a32
Show file tree
Hide file tree
Showing 5 changed files with 297 additions and 150 deletions.
17 changes: 12 additions & 5 deletions TunnelKit/Sources/AppExtension/Transport/NETunnelInterface.swift
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,20 @@ import NetworkExtension
class NETunnelInterface: TunnelInterface {
private weak var impl: NEPacketTunnelFlow?

private let protocolNumber: NSNumber

init(impl: NEPacketTunnelFlow, isIPv6: Bool) {
self.impl = impl
protocolNumber = (isIPv6 ? AF_INET6 : AF_INET) as NSNumber
}

// MARK: TunnelInterface

var isPersistent: Bool {
return false
}

init(impl: NEPacketTunnelFlow) {
self.impl = impl
}
// MARK: IOInterface

func setReadHandler(queue: DispatchQueue, _ handler: @escaping ([Data]?, Error?) -> Void) {
loopReadPackets(queue, handler)
Expand All @@ -65,12 +72,12 @@ class NETunnelInterface: TunnelInterface {
}

func writePacket(_ packet: Data, completionHandler: ((Error?) -> Void)?) {
impl?.writePackets([packet], withProtocols: [AF_INET] as [NSNumber])
impl?.writePackets([packet], withProtocols: [protocolNumber])
completionHandler?(nil)
}

func writePackets(_ packets: [Data], completionHandler: ((Error?) -> Void)?) {
let protocols = [Int32](repeating: AF_INET, count: packets.count) as [NSNumber]
let protocols = [NSNumber](repeating: protocolNumber, count: packets.count)
impl?.writePackets(packets, withProtocols: protocols)
completionHandler?(nil)
}
Expand Down
56 changes: 40 additions & 16 deletions TunnelKit/Sources/AppExtension/TunnelKitProvider.swift
Original file line number Diff line number Diff line change
Expand Up @@ -458,8 +458,8 @@ extension TunnelKitProvider: SessionProxyDelegate {

log.info("Returned ifconfig parameters:")
log.info("\tRemote: \(remoteAddress)")
log.info("\tLocal: \(reply.address)/\(reply.addressMask)")
log.info("\tGateway: \(reply.defaultGateway)")
log.info("\tIPv4: \(reply.ipv4?.description ?? "not configured")")
log.info("\tIPv6: \(reply.ipv6?.description ?? "not configured")")
log.info("\tDNS: \(reply.dnsServers)")

bringNetworkUp(remoteAddress: remoteAddress, reply: reply) { (error) in
Expand All @@ -472,7 +472,7 @@ extension TunnelKitProvider: SessionProxyDelegate {

log.info("Tunnel interface is now UP")

proxy.setTunnel(tunnel: NETunnelInterface(impl: self.packetFlow))
proxy.setTunnel(tunnel: NETunnelInterface(impl: self.packetFlow, isIPv6: reply.ipv6 != nil))

self.pendingStartHandler?(nil)
self.pendingStartHandler = nil
Expand All @@ -492,24 +492,48 @@ extension TunnelKitProvider: SessionProxyDelegate {
private func bringNetworkUp(remoteAddress: String, reply: SessionReply, completionHandler: @escaping (Error?) -> Void) {

// route all traffic to VPN
let defaultRoute = NEIPv4Route.default()
defaultRoute.gatewayAddress = reply.defaultGateway

var routes: [NEIPv4Route] = [defaultRoute]
for r in reply.routes {
let ipv4Route = NEIPv4Route(destinationAddress: r.destination, subnetMask: r.mask)
ipv4Route.gatewayAddress = r.gateway ?? reply.defaultGateway
routes.append(ipv4Route)
var ipv4Settings: NEIPv4Settings?
if let ipv4 = reply.ipv4 {
let defaultRoute = NEIPv4Route.default()
defaultRoute.gatewayAddress = ipv4.defaultGateway

var routes: [NEIPv4Route] = [defaultRoute]
for r in ipv4.routes {
let ipv4Route = NEIPv4Route(destinationAddress: r.destination, subnetMask: r.mask)
ipv4Route.gatewayAddress = r.gateway ?? ipv4.defaultGateway
routes.append(ipv4Route)
}

ipv4Settings = NEIPv4Settings(addresses: [ipv4.address], subnetMasks: [ipv4.addressMask])
ipv4Settings?.includedRoutes = routes
ipv4Settings?.excludedRoutes = []
}

var ipv6Settings: NEIPv6Settings?
if let ipv6 = reply.ipv6 {
let defaultRoute = NEIPv6Route.default()
defaultRoute.gatewayAddress = ipv6.defaultGateway

var routes: [NEIPv6Route] = [defaultRoute]
for r in ipv6.routes {
let ipv6Route = NEIPv6Route(destinationAddress: r.destination, networkPrefixLength: r.prefixLength as NSNumber)
ipv6Route.gatewayAddress = r.gateway ?? ipv6.defaultGateway
routes.append(ipv6Route)
}

ipv6Settings = NEIPv6Settings(addresses: [ipv6.address], networkPrefixLengths: [ipv6.addressPrefixLength as NSNumber])
ipv6Settings?.includedRoutes = [defaultRoute]
ipv6Settings?.excludedRoutes = []
}

let ipv4Settings = NEIPv4Settings(addresses: [reply.address], subnetMasks: [reply.addressMask])
ipv4Settings.includedRoutes = routes
ipv4Settings.excludedRoutes = []

let dnsSettings = NEDNSSettings(servers: reply.dnsServers)

let newSettings = NEPacketTunnelNetworkSettings(tunnelRemoteAddress: remoteAddress)
newSettings.ipv4Settings = ipv4Settings
if let _ = ipv6Settings {
newSettings.ipv6Settings = ipv6Settings
} else {
newSettings.ipv4Settings = ipv4Settings
}
newSettings.dnsSettings = dnsSettings

setTunnelNetworkSettings(newSettings, completionHandler: completionHandler)
Expand Down
6 changes: 0 additions & 6 deletions TunnelKit/Sources/Core/DataPath.m
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ @interface DataPath ()

// inbound -> TUN
@property (nonatomic, strong) NSMutableArray *inPackets;
@property (nonatomic, strong) NSArray *inProtocols;
@property (nonatomic, unsafe_unretained) uint8_t *decBuffer;
@property (nonatomic, assign) int decBufferCapacity;
@property (nonatomic, strong) ReplayProtector *inReplay;
Expand Down Expand Up @@ -98,11 +97,6 @@ - (instancetype)initWithEncrypter:(id<DataPathEncrypter>)encrypter decrypter:(id
self.encBuffer = allocate_safely(self.encBufferCapacity);

self.inPackets = [[NSMutableArray alloc] initWithCapacity:maxPackets];
NSMutableArray *protocols = [[NSMutableArray alloc] initWithCapacity:maxPackets];
for (NSUInteger i = 0; i < maxPackets; ++i) {
[protocols addObject:@(AF_INET)];
}
self.inProtocols = protocols;
self.decBufferCapacity = 65000;
self.decBuffer = allocate_safely(self.decBufferCapacity);
if (usesReplayProtection) {
Expand Down
Loading

0 comments on commit 0360a32

Please sign in to comment.