Compare commits

..

3 Commits

Author SHA1 Message Date
wolfy 41206b5193 fix: more nix issues 2026-06-12 20:17:21 -05:00
wolfy b5acacda9d fix: simulator and nix issues 2026-06-12 20:09:35 -05:00
wolfy ae74cb807d fix: xcode 16 build 2026-06-12 18:04:39 -05:00
4 changed files with 35 additions and 68 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
// swift-tools-version:5.3
// swift-tools-version:5.9
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
+30 -66
View File
@@ -47,12 +47,6 @@ public class WireGuardAdapter {
/// Packet tunnel provider.
private weak var packetTunnelProvider: NEPacketTunnelProvider?
/// KVO observer for `NEProvider.defaultPath`.
private var defaultPathObserver: NSKeyValueObservation?
/// Last known default path.
private var currentDefaultPath: NetworkExtension.NWPath?
/// Log handler closure.
private let logHandler: LogHandler
@@ -187,7 +181,11 @@ public class WireGuardAdapter {
return
}
self.addDefaultPathObserver()
let networkMonitor = NWPathMonitor()
networkMonitor.pathUpdateHandler = { [weak self] path in
self?.didReceivePathUpdate(path: path)
}
networkMonitor.start(queue: self.workQueue)
do {
let settingsGenerator = try self.makeSettingsGenerator(with: tunnelConfiguration)
@@ -200,10 +198,10 @@ public class WireGuardAdapter {
try self.startWireGuardBackend(wgConfig: wgConfig),
settingsGenerator
)
self.networkMonitor = networkMonitor
completionHandler(nil)
} catch let error as WireGuardAdapterError {
self.removeDefaultPathObserver()
networkMonitor.cancel()
completionHandler(error)
} catch {
fatalError()
@@ -227,7 +225,8 @@ public class WireGuardAdapter {
return
}
self.removeDefaultPathObserver()
self.networkMonitor?.cancel()
self.networkMonitor = nil
self.state = .stopped
@@ -314,29 +313,26 @@ public class WireGuardAdapter {
/// - Returns: `PacketTunnelSettingsGenerator`.
private func setNetworkSettings(_ networkSettings: NEPacketTunnelNetworkSettings) throws {
var systemError: Error?
let condition = NSCondition()
let dispatchGroup = DispatchGroup()
dispatchGroup.enter()
// Activate the condition
condition.lock()
defer { condition.unlock() }
self.packetTunnelProvider?.setTunnelNetworkSettings(networkSettings) { error in
systemError = error
dispatchGroup.leave()
condition.signal()
}
// Packet tunnel's `setTunnelNetworkSettings` times out in certain
// scenarios & never calls the given callback.
let setTunnelNetworkSettingsTimeout: Int = 5 // seconds
let setTunnelNetworkSettingsTimeout: TimeInterval = 5 // seconds
let waitResult = dispatchGroup.wait(wallTimeout: .now() + .seconds(setTunnelNetworkSettingsTimeout))
switch waitResult {
case .success:
if condition.wait(until: Date().addingTimeInterval(setTunnelNetworkSettingsTimeout)) {
if let systemError = systemError {
throw WireGuardAdapterError.setNetworkSettings(systemError)
}
case .timedOut:
} else {
self.logHandler(.error, "setTunnelNetworkSettings timed out after 5 seconds; proceeding anyway")
}
}
@@ -415,48 +411,19 @@ public class WireGuardAdapter {
}
}
private func addDefaultPathObserver() {
guard let packetTunnelProvider = packetTunnelProvider else { return }
defaultPathObserver?.invalidate()
defaultPathObserver = packetTunnelProvider.observe(\.defaultPath, options: [.new]) { [weak self] _, change in
guard let self = self, let defaultPath = change.newValue?.flatMap({ $0 }) else { return }
self.workQueue.async {
self.didReceivePathUpdate(path: defaultPath)
}
}
currentDefaultPath = packetTunnelProvider.defaultPath
}
private func removeDefaultPathObserver() {
defaultPathObserver?.invalidate()
defaultPathObserver = nil
currentDefaultPath = nil
}
/// Method invoked by KVO observer when new network path is received.
/// Helper method used by network path monitor.
/// - Parameter path: new network path
private func didReceivePathUpdate(path: NetworkExtension.NWPath) {
let isSamePath = currentDefaultPath?.isEqual(to: path) ?? false
currentDefaultPath = path
self.logHandler(.verbose, "Network change detected with \(path.status)")
private func didReceivePathUpdate(path: Network.NWPath) {
self.logHandler(.verbose, "Network change detected with \(path.status) route and interface order \(path.availableInterfaces)")
#if os(macOS)
if case .started(let handle, _) = self.state, !isSamePath {
if case .started(let handle, _) = self.state {
wgBumpSockets(handle)
}
#elseif os(iOS)
let isSatisfiable = path.status == .satisfied || path.status == .satisfiable
switch self.state {
case .started(let handle, let settingsGenerator):
if isSatisfiable {
guard !isSamePath else { return }
if path.status.isSatisfiable {
let (wgConfig, resolutionResults) = settingsGenerator.endpointUapiConfiguration()
self.logEndpointResolutionResults(resolutionResults)
@@ -471,7 +438,7 @@ public class WireGuardAdapter {
}
case .temporaryShutdown(let settingsGenerator):
guard isSatisfiable else { return }
guard path.status.isSatisfiable else { return }
self.logHandler(.verbose, "Connectivity online, resuming backend.")
@@ -505,19 +472,16 @@ public enum WireGuardLogLevel: Int32 {
case error = 1
}
extension NetworkExtension.NWPathStatus: CustomDebugStringConvertible {
public var debugDescription: String {
private extension Network.NWPath.Status {
/// Returns `true` if the path is potentially satisfiable.
var isSatisfiable: Bool {
switch self {
case .requiresConnection, .satisfied:
return true
case .unsatisfied:
return "unsatisfied"
case .satisfied:
return "satisfied"
case .satisfiable:
return "satisfiable"
case .invalid:
return "invalid"
return false
@unknown default:
return "unknown (rawValue = \(rawValue))"
return true
}
}
}
+1
View File
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: MIT
// Copyright © 2018-2023 WireGuard LLC. All Rights Reserved.
#include <sys/types.h>
#include "key.h"
#include "x25519.h"
+3 -1
View File
@@ -20,16 +20,18 @@ GOARCH_arm64 := arm64
GOARCH_x86_64 := amd64
GOOS_macosx := darwin
GOOS_iphoneos := ios
GOOS_iphonesimulator := ios
build: $(DESTDIR)/libwg-go.a
version-header: $(DESTDIR)/wireguard-go-version.h
REAL_GOROOT := $(shell go env GOROOT 2>/dev/null)
REAL_GOROOT := $(shell export PATH="$(PATH):/usr/local/bin:/opt/homebrew/bin"; go env GOROOT 2>/dev/null)
export GOROOT := $(BUILDDIR)/goroot
$(GOROOT)/.prepared:
[ -n "$(REAL_GOROOT)" ]
mkdir -p "$(GOROOT)"
rsync -a --delete --exclude=pkg/obj/go-build "$(REAL_GOROOT)/" "$(GOROOT)/"
chmod -R u+w "$(GOROOT)"
cat goruntime-*.diff | patch -p1 -f -N -r- -d "$(GOROOT)"
touch "$@"