From a02679b87a4538134f44fde7c9b22a81125c7eb1 Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Thu, 1 Sep 2022 10:08:15 -0400 Subject: [PATCH] revise ./contrib/format.sh --- contrib/format.sh | 4 +- llarp/apple/DNSTrampoline.m | 140 ++++++++------ llarp/apple/PacketTunnelProvider.m | 281 +++++++++++++++++------------ 3 files changed, 251 insertions(+), 174 deletions(-) diff --git a/contrib/format.sh b/contrib/format.sh index 956f5db92..6f4e8af36 100755 --- a/contrib/format.sh +++ b/contrib/format.sh @@ -21,11 +21,11 @@ fi cd "$(dirname $0)/../" if [ "$1" = "verify" ] ; then - if [ $($binary --output-replacements-xml $(find jni daemon llarp include pybind | grep -E '\.([hc](pp)?|mm?)$' | grep -v '\#') | grep '' | wc -l) -ne 0 ] ; then + if [ $($binary --output-replacements-xml $(find jni daemon llarp include pybind | grep -E '\.([hc](pp)?|m(m)?)$' | grep -v '\#') | grep '' | wc -l) -ne 0 ] ; then exit 2 fi else - $binary -i $(find jni daemon llarp include pybind | grep -E '\.([hc](pp)?|mm)$' | grep -v '\#') &> /dev/null + $binary -i $(find jni daemon llarp include pybind | grep -E '\.([hc](pp)?|m(m)?)$' | grep -v '\#') &> /dev/null fi swift_format=$(command -v swiftformat 2>/dev/null) diff --git a/llarp/apple/DNSTrampoline.m b/llarp/apple/DNSTrampoline.m index cbbe211a3..c30cabc25 100644 --- a/llarp/apple/DNSTrampoline.m +++ b/llarp/apple/DNSTrampoline.m @@ -3,23 +3,31 @@ NSString* error_domain = @"org.lokinet"; - // Receiving an incoming packet, presumably from libunbound. NB: this is called from the libuv // event loop. -static void on_request(uv_udp_t* socket, ssize_t nread, const uv_buf_t* buf, const struct sockaddr* addr, unsigned flags) { - if (nread < 0) { +static void +on_request( + uv_udp_t* socket, + ssize_t nread, + const uv_buf_t* buf, + const struct sockaddr* addr, + unsigned flags) +{ + if (nread < 0) + { NSLog(@"Read error: %s", uv_strerror(nread)); free(buf->base); return; } - if (nread == 0 || !addr) { + if (nread == 0 || !addr) + { if (buf) free(buf->base); return; } - LLARPDNSTrampoline* t = (__bridge LLARPDNSTrampoline*) socket->data; + LLARPDNSTrampoline* t = (__bridge LLARPDNSTrampoline*)socket->data; // We configure libunbound to use just one single port so we'll just send replies to the last port // to talk to us. (And we're only listening on localhost in the first place). @@ -31,61 +39,67 @@ static void on_request(uv_udp_t* socket, ssize_t nread, const uv_buf_t* buf, con [t flushWrites]; } -static void on_sent(uv_udp_send_t* req, int status) { - NSArray* datagrams = (__bridge_transfer NSArray*) req->data; +static void +on_sent(uv_udp_send_t* req, int status) +{ + NSArray* datagrams = (__bridge_transfer NSArray*)req->data; free(req); } // NB: called from the libuv event loop (so we don't have to worry about the above and this one // running at once from different threads). -static void write_flusher(uv_async_t* async) { - LLARPDNSTrampoline* t = (__bridge LLARPDNSTrampoline*) async->data; +static void +write_flusher(uv_async_t* async) +{ + LLARPDNSTrampoline* t = (__bridge LLARPDNSTrampoline*)async->data; if (t->pending_writes.count == 0) return; NSArray* data = [NSArray arrayWithArray:t->pending_writes]; [t->pending_writes removeAllObjects]; __weak LLARPDNSTrampoline* weakSelf = t; - [t->upstream writeMultipleDatagrams:data completionHandler: ^(NSError* error) - { - if (error) - NSLog(@"Failed to send request to upstream DNS: %@", error); - - // Trigger another flush in case anything built up while Apple was doing its things. Just - // call it unconditionally (rather than checking the queue) because this handler is probably - // running in some other thread. - [weakSelf flushWrites]; - } - ]; + [t->upstream writeMultipleDatagrams:data + completionHandler:^(NSError* error) { + if (error) + NSLog(@"Failed to send request to upstream DNS: %@", error); + + // Trigger another flush in case anything built up while Apple was doing its + // things. Just call it unconditionally (rather than checking the queue) + // because this handler is probably running in some other thread. + [weakSelf flushWrites]; + }]; } - -static void alloc_buffer(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { +static void +alloc_buffer(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) +{ buf->base = malloc(suggested_size); buf->len = suggested_size; } @implementation LLARPDNSTrampoline -- (void)startWithUpstreamDns:(NWUDPSession*) dns - listenIp:(NSString*) listenIp - listenPort:(uint16_t) listenPort - uvLoop:(uv_loop_t*) loop +- (void)startWithUpstreamDns:(NWUDPSession*)dns + listenIp:(NSString*)listenIp + listenPort:(uint16_t)listenPort + uvLoop:(uv_loop_t*)loop completionHandler:(void (^)(NSError* error))completionHandler { NSLog(@"Setting up trampoline"); pending_writes = [[NSMutableArray alloc] init]; - write_trigger.data = (__bridge void*) self; + write_trigger.data = (__bridge void*)self; uv_async_init(loop, &write_trigger, write_flusher); - request_socket.data = (__bridge void*) self; + request_socket.data = (__bridge void*)self; uv_udp_init(loop, &request_socket); struct sockaddr_in recv_addr; uv_ip4_addr(listenIp.UTF8String, listenPort, &recv_addr); - int ret = uv_udp_bind(&request_socket, (const struct sockaddr*) &recv_addr, UV_UDP_REUSEADDR); - if (ret < 0) { - NSString* errstr = [NSString stringWithFormat:@"Failed to start DNS trampoline: %s", uv_strerror(ret)]; - NSError *err = [NSError errorWithDomain:error_domain code:ret userInfo:@{@"Error": errstr}]; + int ret = uv_udp_bind(&request_socket, (const struct sockaddr*)&recv_addr, UV_UDP_REUSEADDR); + if (ret < 0) + { + NSString* errstr = + [NSString stringWithFormat:@"Failed to start DNS trampoline: %s", uv_strerror(ret)]; + NSError* err = [NSError errorWithDomain:error_domain code:ret userInfo:@{@"Error": errstr}]; NSLog(@"%@", err); return completionHandler(err); } @@ -95,30 +109,40 @@ static void alloc_buffer(uv_handle_t* handle, size_t suggested_size, uv_buf_t* b upstream = dns; __weak LLARPDNSTrampoline* weakSelf = self; - [upstream setReadHandler: ^(NSArray* datagrams, NSError* error) { - // Reading a reply back from the UDP socket used to talk to upstream - if (error) { - NSLog(@"Reader handler failed: %@", error); - return; - } - LLARPDNSTrampoline* strongSelf = weakSelf; - if (!strongSelf || datagrams.count == 0) - return; + [upstream + setReadHandler:^(NSArray* datagrams, NSError* error) { + // Reading a reply back from the UDP socket used to talk to upstream + if (error) + { + NSLog(@"Reader handler failed: %@", error); + return; + } + LLARPDNSTrampoline* strongSelf = weakSelf; + if (!strongSelf || datagrams.count == 0) + return; - uv_buf_t* buffers = malloc(datagrams.count * sizeof(uv_buf_t)); - size_t buf_count = 0; - for (NSData* packet in datagrams) { - buffers[buf_count].base = (void*) packet.bytes; - buffers[buf_count].len = packet.length; - buf_count++; - } - uv_udp_send_t* uvsend = malloc(sizeof(uv_udp_send_t)); - uvsend->data = (__bridge_retained void*) datagrams; - int ret = uv_udp_send(uvsend, &strongSelf->request_socket, buffers, buf_count, &strongSelf->reply_addr, on_sent); - free(buffers); - if (ret < 0) - NSLog(@"Error returning DNS responses to unbound: %s", uv_strerror(ret)); - } maxDatagrams:NSUIntegerMax]; + uv_buf_t* buffers = malloc(datagrams.count * sizeof(uv_buf_t)); + size_t buf_count = 0; + for (NSData* packet in datagrams) + { + buffers[buf_count].base = (void*)packet.bytes; + buffers[buf_count].len = packet.length; + buf_count++; + } + uv_udp_send_t* uvsend = malloc(sizeof(uv_udp_send_t)); + uvsend->data = (__bridge_retained void*)datagrams; + int ret = uv_udp_send( + uvsend, + &strongSelf->request_socket, + buffers, + buf_count, + &strongSelf->reply_addr, + on_sent); + free(buffers); + if (ret < 0) + NSLog(@"Error returning DNS responses to unbound: %s", uv_strerror(ret)); + } + maxDatagrams:NSUIntegerMax]; completionHandler(nil); } @@ -128,11 +152,11 @@ static void alloc_buffer(uv_handle_t* handle, size_t suggested_size, uv_buf_t* b uv_async_send(&write_trigger); } -- (void) dealloc +- (void)dealloc { NSLog(@"Stopping DNS trampoline"); - uv_close((uv_handle_t*) &request_socket, NULL); - uv_close((uv_handle_t*) &write_trigger, NULL); + uv_close((uv_handle_t*)&request_socket, NULL); + uv_close((uv_handle_t*)&write_trigger, NULL); } @end diff --git a/llarp/apple/PacketTunnelProvider.m b/llarp/apple/PacketTunnelProvider.m index 17e76d4f1..2cf8c2917 100644 --- a/llarp/apple/PacketTunnelProvider.m +++ b/llarp/apple/PacketTunnelProvider.m @@ -9,9 +9,12 @@ { void* lokinet; llarp_incoming_packet packet_buf[LLARP_APPLE_PACKET_BUF_SIZE]; - @public NEPacketTunnelNetworkSettings* settings; - @public NEIPv4Route* tun_route4; - @public NEIPv6Route* tun_route6; + @public + NEPacketTunnelNetworkSettings* settings; + @public + NEIPv4Route* tun_route4; + @public + NEIPv6Route* tun_route6; LLARPDNSTrampoline* dns_tramp; } @@ -30,107 +33,133 @@ @end -static void nslogger(const char* msg) { NSLog(@"%s", msg); } +static void +nslogger(const char* msg) +{ + NSLog(@"%s", msg); +} -static void packet_writer(int af, const void* data, size_t size, void* ctx) { +static void +packet_writer(int af, const void* data, size_t size, void* ctx) +{ if (ctx == nil || data == nil) return; NSData* buf = [NSData dataWithBytesNoCopy:(void*)data length:size freeWhenDone:NO]; - LLARPPacketTunnel* t = (__bridge LLARPPacketTunnel*) ctx; - [t.packetFlow writePackets:@[buf] - withProtocols:@[[NSNumber numberWithInt:af]]]; + LLARPPacketTunnel* t = (__bridge LLARPPacketTunnel*)ctx; + [t.packetFlow writePackets:@[buf] withProtocols:@[[NSNumber numberWithInt:af]]]; } -static void start_packet_reader(void* ctx) { +static void +start_packet_reader(void* ctx) +{ if (ctx == nil) return; - LLARPPacketTunnel* t = (__bridge LLARPPacketTunnel*) ctx; + LLARPPacketTunnel* t = (__bridge LLARPPacketTunnel*)ctx; [t readPackets]; } -static void add_ipv4_route(const char* addr, const char* netmask, void* ctx) { +static void +add_ipv4_route(const char* addr, const char* netmask, void* ctx) +{ NSLog(@"Adding IPv4 route %s:%s to packet tunnel", addr, netmask); - NEIPv4Route* route = [[NEIPv4Route alloc] - initWithDestinationAddress: [NSString stringWithUTF8String:addr] - subnetMask: [NSString stringWithUTF8String:netmask]]; + NEIPv4Route* route = + [[NEIPv4Route alloc] initWithDestinationAddress:[NSString stringWithUTF8String:addr] + subnetMask:[NSString stringWithUTF8String:netmask]]; - LLARPPacketTunnel* t = (__bridge LLARPPacketTunnel*) ctx; + LLARPPacketTunnel* t = (__bridge LLARPPacketTunnel*)ctx; for (NEIPv4Route* r in t->settings.IPv4Settings.includedRoutes) if ([r.destinationAddress isEqualToString:route.destinationAddress] && - [r.destinationSubnetMask isEqualToString:route.destinationSubnetMask]) - return; // Already in the settings, nothing to add. + [r.destinationSubnetMask isEqualToString:route.destinationSubnetMask]) + return; // Already in the settings, nothing to add. t->settings.IPv4Settings.includedRoutes = - [t->settings.IPv4Settings.includedRoutes arrayByAddingObject:route]; + [t->settings.IPv4Settings.includedRoutes arrayByAddingObject:route]; [t updateNetworkSettings]; } -static void del_ipv4_route(const char* addr, const char* netmask, void* ctx) { +static void +del_ipv4_route(const char* addr, const char* netmask, void* ctx) +{ NSLog(@"Removing IPv4 route %s:%s to packet tunnel", addr, netmask); - NEIPv4Route* route = [[NEIPv4Route alloc] - initWithDestinationAddress: [NSString stringWithUTF8String:addr] - subnetMask: [NSString stringWithUTF8String:netmask]]; + NEIPv4Route* route = + [[NEIPv4Route alloc] initWithDestinationAddress:[NSString stringWithUTF8String:addr] + subnetMask:[NSString stringWithUTF8String:netmask]]; - LLARPPacketTunnel* t = (__bridge LLARPPacketTunnel*) ctx; - NSMutableArray* routes = [NSMutableArray arrayWithArray:t->settings.IPv4Settings.includedRoutes]; - for (int i = 0; i < routes.count; i++) { + LLARPPacketTunnel* t = (__bridge LLARPPacketTunnel*)ctx; + NSMutableArray* routes = + [NSMutableArray arrayWithArray:t->settings.IPv4Settings.includedRoutes]; + for (int i = 0; i < routes.count; i++) + { if ([routes[i].destinationAddress isEqualToString:route.destinationAddress] && - [routes[i].destinationSubnetMask isEqualToString:route.destinationSubnetMask]) { + [routes[i].destinationSubnetMask isEqualToString:route.destinationSubnetMask]) + { [routes removeObjectAtIndex:i]; i--; } } - if (routes.count != t->settings.IPv4Settings.includedRoutes.count) { + if (routes.count != t->settings.IPv4Settings.includedRoutes.count) + { t->settings.IPv4Settings.includedRoutes = routes; [t updateNetworkSettings]; } } -static void add_ipv6_route(const char* addr, int prefix, void* ctx) { - NEIPv6Route* route = [[NEIPv6Route alloc] - initWithDestinationAddress: [NSString stringWithUTF8String:addr] - networkPrefixLength: [NSNumber numberWithInt:prefix]]; +static void +add_ipv6_route(const char* addr, int prefix, void* ctx) +{ + NEIPv6Route* route = + [[NEIPv6Route alloc] initWithDestinationAddress:[NSString stringWithUTF8String:addr] + networkPrefixLength:[NSNumber numberWithInt:prefix]]; - LLARPPacketTunnel* t = (__bridge LLARPPacketTunnel*) ctx; + LLARPPacketTunnel* t = (__bridge LLARPPacketTunnel*)ctx; for (NEIPv6Route* r in t->settings.IPv6Settings.includedRoutes) if ([r.destinationAddress isEqualToString:route.destinationAddress] && - [r.destinationNetworkPrefixLength isEqualToNumber:route.destinationNetworkPrefixLength]) - return; // Already in the settings, nothing to add. + [r.destinationNetworkPrefixLength isEqualToNumber:route.destinationNetworkPrefixLength]) + return; // Already in the settings, nothing to add. t->settings.IPv6Settings.includedRoutes = - [t->settings.IPv6Settings.includedRoutes arrayByAddingObject:route]; + [t->settings.IPv6Settings.includedRoutes arrayByAddingObject:route]; [t updateNetworkSettings]; } -static void del_ipv6_route(const char* addr, int prefix, void* ctx) { - NEIPv6Route* route = [[NEIPv6Route alloc] - initWithDestinationAddress: [NSString stringWithUTF8String:addr] - networkPrefixLength: [NSNumber numberWithInt:prefix]]; +static void +del_ipv6_route(const char* addr, int prefix, void* ctx) +{ + NEIPv6Route* route = + [[NEIPv6Route alloc] initWithDestinationAddress:[NSString stringWithUTF8String:addr] + networkPrefixLength:[NSNumber numberWithInt:prefix]]; - LLARPPacketTunnel* t = (__bridge LLARPPacketTunnel*) ctx; - NSMutableArray* routes = [NSMutableArray arrayWithArray:t->settings.IPv6Settings.includedRoutes]; - for (int i = 0; i < routes.count; i++) { + LLARPPacketTunnel* t = (__bridge LLARPPacketTunnel*)ctx; + NSMutableArray* routes = + [NSMutableArray arrayWithArray:t->settings.IPv6Settings.includedRoutes]; + for (int i = 0; i < routes.count; i++) + { if ([routes[i].destinationAddress isEqualToString:route.destinationAddress] && - [routes[i].destinationNetworkPrefixLength isEqualToNumber:route.destinationNetworkPrefixLength]) { + [routes[i].destinationNetworkPrefixLength + isEqualToNumber:route.destinationNetworkPrefixLength]) + { [routes removeObjectAtIndex:i]; i--; } } - if (routes.count != t->settings.IPv6Settings.includedRoutes.count) { + if (routes.count != t->settings.IPv6Settings.includedRoutes.count) + { t->settings.IPv6Settings.includedRoutes = routes; [t updateNetworkSettings]; } } -static void add_default_route(void* ctx) { +static void +add_default_route(void* ctx) +{ NSLog(@"Making the tunnel the default route"); - LLARPPacketTunnel* t = (__bridge LLARPPacketTunnel*) ctx; + LLARPPacketTunnel* t = (__bridge LLARPPacketTunnel*)ctx; t->settings.IPv4Settings.includedRoutes = @[NEIPv4Route.defaultRoute]; t->settings.IPv6Settings.includedRoutes = @[NEIPv6Route.defaultRoute]; @@ -138,9 +167,11 @@ static void add_default_route(void* ctx) { [t updateNetworkSettings]; } -static void del_default_route(void* ctx) { +static void +del_default_route(void* ctx) +{ NSLog(@"Removing default route from tunnel"); - LLARPPacketTunnel* t = (__bridge LLARPPacketTunnel*) ctx; + LLARPPacketTunnel* t = (__bridge LLARPPacketTunnel*)ctx; t->settings.IPv4Settings.includedRoutes = @[t->tun_route4]; t->settings.IPv6Settings.includedRoutes = @[t->tun_route6]; @@ -152,12 +183,13 @@ static void del_default_route(void* ctx) { - (void)readPackets { - [self.packetFlow readPacketObjectsWithCompletionHandler: ^(NSArray* packets) { + [self.packetFlow readPacketObjectsWithCompletionHandler:^(NSArray* packets) { if (lokinet == nil) return; size_t size = 0; - for (NEPacket* p in packets) { + for (NEPacket* p in packets) + { packet_buf[size].bytes = p.data.bytes; packet_buf[size].size = p.data.length; size++; @@ -186,19 +218,21 @@ static void del_default_route(void* ctx) { .ns_logger = nslogger, .packet_writer = packet_writer, .start_reading = start_packet_reader, - .route_callbacks = { - .add_ipv4_route = add_ipv4_route, - .del_ipv4_route = del_ipv4_route, - .add_ipv6_route = add_ipv6_route, - .del_ipv6_route = del_ipv6_route, - .add_default_route = add_default_route, - .del_default_route = del_default_route - }, + .route_callbacks = + {.add_ipv4_route = add_ipv4_route, + .del_ipv4_route = del_ipv4_route, + .add_ipv6_route = add_ipv6_route, + .del_ipv6_route = del_ipv6_route, + .add_default_route = add_default_route, + .del_default_route = del_default_route}, }; lokinet = llarp_apple_init(&conf); - if (!lokinet) { - NSError *init_failure = [NSError errorWithDomain:error_domain code:500 userInfo:@{@"Error": @"Failed to initialize lokinet"}]; + if (!lokinet) + { + NSError* init_failure = [NSError errorWithDomain:error_domain + code:500 + userInfo:@{@"Error": @"Failed to initialize lokinet"}]; NSLog(@"%@", [init_failure localizedDescription]); return completionHandler(init_failure); } @@ -237,11 +271,12 @@ static void del_default_route(void* ctx) { NWHostEndpoint* upstreamdns_ep; if (strlen(conf.upstream_dns)) - upstreamdns_ep = [NWHostEndpoint endpointWithHostname:[NSString stringWithUTF8String:conf.upstream_dns] port:@(conf.upstream_dns_port).stringValue]; + upstreamdns_ep = + [NWHostEndpoint endpointWithHostname:[NSString stringWithUTF8String:conf.upstream_dns] + port:@(conf.upstream_dns_port).stringValue]; - NEIPv4Settings* ipv4 = [[NEIPv4Settings alloc] initWithAddresses:@[ip] - subnetMasks:@[mask]]; - tun_route4 = [[NEIPv4Route alloc] initWithDestinationAddress:ip subnetMask: mask]; + NEIPv4Settings* ipv4 = [[NEIPv4Settings alloc] initWithAddresses:@[ip] subnetMasks:@[mask]]; + tun_route4 = [[NEIPv4Route alloc] initWithDestinationAddress:ip subnetMask:mask]; ipv4.includedRoutes = @[tun_route4]; settings.IPv4Settings = ipv4; @@ -249,50 +284,62 @@ static void del_default_route(void* ctx) { NSNumber* ip6_prefix = [NSNumber numberWithUnsignedInt:conf.tunnel_ipv6_prefix]; NEIPv6Settings* ipv6 = [[NEIPv6Settings alloc] initWithAddresses:@[ip6] networkPrefixLengths:@[ip6_prefix]]; - tun_route6 = [[NEIPv6Route alloc] initWithDestinationAddress:ip6 - networkPrefixLength:ip6_prefix]; + tun_route6 = [[NEIPv6Route alloc] initWithDestinationAddress:ip6 networkPrefixLength:ip6_prefix]; ipv6.includedRoutes = @[tun_route6]; settings.IPv6Settings = ipv6; __weak LLARPPacketTunnel* weakSelf = self; - [self setTunnelNetworkSettings:settings completionHandler:^(NSError* err) { - if (err) { - NSLog(@"Failed to configure lokinet tunnel: %@", err); - return completionHandler(err); - } - LLARPPacketTunnel* strongSelf = weakSelf; - if (!strongSelf) - return completionHandler(nil); + [self setTunnelNetworkSettings:settings + completionHandler:^(NSError* err) { + if (err) + { + NSLog(@"Failed to configure lokinet tunnel: %@", err); + return completionHandler(err); + } + LLARPPacketTunnel* strongSelf = weakSelf; + if (!strongSelf) + return completionHandler(nil); - int start_ret = llarp_apple_start(strongSelf->lokinet, (__bridge void*) strongSelf); - if (start_ret != 0) { - NSError *start_failure = [NSError errorWithDomain:error_domain code:start_ret userInfo:@{@"Error": @"Failed to start lokinet"}]; - NSLog(@"%@", start_failure); - lokinet = nil; - return completionHandler(start_failure); - } + int start_ret = llarp_apple_start(strongSelf->lokinet, (__bridge void*)strongSelf); + if (start_ret != 0) + { + NSError* start_failure = + [NSError errorWithDomain:error_domain + code:start_ret + userInfo:@{@"Error": @"Failed to start lokinet"}]; + NSLog(@"%@", start_failure); + lokinet = nil; + return completionHandler(start_failure); + } - NSString* dns_tramp_ip = @"127.0.0.1"; - NSLog(@"Starting DNS exit mode trampoline to %@ on %@:%d", upstreamdns_ep, dns_tramp_ip, dns_trampoline_port); - NWUDPSession* upstreamdns = [strongSelf createUDPSessionThroughTunnelToEndpoint:upstreamdns_ep fromEndpoint:nil]; - strongSelf->dns_tramp = [LLARPDNSTrampoline alloc]; - [strongSelf->dns_tramp - startWithUpstreamDns:upstreamdns - listenIp:dns_tramp_ip - listenPort:dns_trampoline_port - uvLoop:llarp_apple_get_uv_loop(strongSelf->lokinet) - completionHandler:^(NSError* error) { - if (error) - NSLog(@"Error starting dns trampoline: %@", error); - return completionHandler(error); - }]; - }]; + NSString* dns_tramp_ip = @"127.0.0.1"; + NSLog( + @"Starting DNS exit mode trampoline to %@ on %@:%d", + upstreamdns_ep, + dns_tramp_ip, + dns_trampoline_port); + NWUDPSession* upstreamdns = + [strongSelf createUDPSessionThroughTunnelToEndpoint:upstreamdns_ep + fromEndpoint:nil]; + strongSelf->dns_tramp = [LLARPDNSTrampoline alloc]; + [strongSelf->dns_tramp + startWithUpstreamDns:upstreamdns + listenIp:dns_tramp_ip + listenPort:dns_trampoline_port + uvLoop:llarp_apple_get_uv_loop(strongSelf->lokinet) + completionHandler:^(NSError* error) { + if (error) + NSLog(@"Error starting dns trampoline: %@", error); + return completionHandler(error); + }]; + }]; } - (void)stopTunnelWithReason:(NEProviderStopReason)reason completionHandler:(void (^)(void))completionHandler { - if (lokinet) { + if (lokinet) + { llarp_apple_shutdown(lokinet); lokinet = nil; } @@ -319,29 +366,35 @@ static void del_default_route(void* ctx) { // // Thanks for the accurate documentation, Apple. // - [self setTunnelNetworkSettings:nil completionHandler:^(NSError* err) { - if (err) - NSLog(@"Failed to clear lokinet tunnel settings: %@", err); - LLARPPacketTunnel* strongSelf = weakSelf; - if (strongSelf) { - [weakSelf setTunnelNetworkSettings:strongSelf->settings completionHandler:^(NSError* err) { - LLARPPacketTunnel* strongSelf = weakSelf; - if (strongSelf) - strongSelf.reasserting = NO; - if (err) - NSLog(@"Failed to reconfigure lokinet tunnel settings: %@", err); - }]; - } - }]; + [self setTunnelNetworkSettings:nil + completionHandler:^(NSError* err) { + if (err) + NSLog(@"Failed to clear lokinet tunnel settings: %@", err); + LLARPPacketTunnel* strongSelf = weakSelf; + if (strongSelf) + { + [weakSelf + setTunnelNetworkSettings:strongSelf->settings + completionHandler:^(NSError* err) { + LLARPPacketTunnel* strongSelf = weakSelf; + if (strongSelf) + strongSelf.reasserting = NO; + if (err) + NSLog(@"Failed to reconfigure lokinet tunnel settings: %@", err); + }]; + } + }]; } @end #ifdef MACOS_SYSTEM_EXTENSION -int main() { - [NEProvider startSystemExtensionMode]; - dispatch_main(); +int +main() +{ + [NEProvider startSystemExtensionMode]; + dispatch_main(); } #endif