Skip to content

Commit b3dcccf

Browse files
committed
fix: 26.4 patch, add correct dest
- update minimuxer
1 parent dddb250 commit b3dcccf

3 files changed

Lines changed: 43 additions & 29 deletions

File tree

SideStore/IfManager.swift

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -30,21 +30,24 @@ fileprivate func socktouint(_ sock: inout sockaddr) -> UInt32 {
3030
return addr.s_addr.bigEndian
3131
}
3232

33-
struct NetInfo: Hashable, CustomStringConvertible {
34-
let name: String
35-
36-
let hostIP: String
37-
let maskIP: String
33+
public struct NetInfo: Hashable, CustomStringConvertible {
34+
public let name: String
35+
public let hostIP: String
36+
public let destIP: String
37+
public let maskIP: String
3838

3939
private let host: UInt32
40+
private let dest: UInt32
4041
private let mask: UInt32
4142

42-
init(name: String, host: UInt32, mask: UInt32) {
43+
init(name: String, host: UInt32, dest: UInt32, mask: UInt32) {
4344
self.name = name
4445
self.host = host
46+
self.dest = dest
4547
self.mask = mask
46-
self.hostIP = uti(host) ?? "nil"
47-
self.maskIP = uti(mask) ?? "nil"
48+
self.hostIP = uti(host) ?? "10.7.0.0"
49+
self.destIP = uti(dest) ?? "10.7.0.1"
50+
self.maskIP = uti(mask) ?? "255.255.255.0"
4851
}
4952

5053
init?(_ ifaddr: ifaddrs) {
@@ -53,33 +56,37 @@ struct NetInfo: Hashable, CustomStringConvertible {
5356
else { return nil }
5457

5558
let host = socktouint(&ifaddr.ifa_addr.pointee)
59+
let dest = socktouint(&ifaddr.ifa_dstaddr.pointee)
5660
let mask = socktouint(&ifaddr.ifa_netmask.pointee)
5761

58-
self.init(name: ianame, host: host, mask: mask)
62+
self.init(name: ianame, host: host, dest: dest, mask: mask)
5963
}
6064

6165
// computed networking values (still numeric internally)
62-
var minIPInSubnet: UInt32 { host & mask }
63-
var maxIPInSubnet: UInt32 { host | ~mask }
66+
public var minIP: UInt32 { host & mask }
67+
public var maxIP: UInt32 { host | ~mask }
6468

65-
var minIPString: String { uti(minIPInSubnet) ?? "nil" }
66-
var maxIPString: String { uti(maxIPInSubnet) ?? "nil" }
69+
public var minIPString: String { uti(minIP) ?? "nil" }
70+
public var maxIPString: String { uti(maxIP) ?? "nil" }
6771

68-
var description: String {
69-
"\(name) | ip=\(hostIP) mask=\(maskIP) range=\(minIPString)-\(maxIPString)"
72+
public var description: String {
73+
"\(name) | ip=\(hostIP) dest=\(destIP) mask=\(maskIP) range=\(minIPString)-\(maxIPString)"
7074
}
7175
}
7276

73-
final class IfManager: @unchecked Sendable {
77+
final class IfManager: Sendable {
78+
public static let shared = IfManager()
79+
nonisolated(unsafe) private(set) var addrs: Set<NetInfo> = Set()
7480

75-
private init() {}
76-
static let shared = IfManager()
77-
78-
// always get freshly computed addresses
79-
var addrs: Set<NetInfo> {
80-
Self.query()
81+
private init() {
82+
self.addrs = IfManager.query()
8183
}
84+
8285

86+
public func query() {
87+
addrs = IfManager.query()
88+
}
89+
8390
private static func query() -> Set<NetInfo> {
8491
var addrs = Set<NetInfo>()
8592
var head: UnsafeMutablePointer<ifaddrs>? = nil
@@ -112,15 +119,14 @@ final class IfManager: @unchecked Sendable {
112119
// try old 10.7.0.1 first, then fallback to next v4
113120
// user should only be connected to StosVPN/LocalDevVPN
114121
addrs.first {
115-
$0.minIPString == "10.7.0.1" ||
116-
$0.minIPString == "192.168.56.1" ||
122+
$0.hostIP == "10.7.0.1" ||
117123
$0.name.starts(with: "utun")
118124
}
119125
}
120126

121127
var sideVPNPatched: Bool {
122128
nextLAN?.maskIP == nextProbableSideVPN?.maskIP &&
123-
nextLAN?.maxIPInSubnet == nextProbableSideVPN?.maxIPInSubnet
129+
nextLAN?.maxIP == nextProbableSideVPN?.maxIP
124130
}
125131
}
126132

SideStore/MinimuxerWrapper.swift

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,24 @@ var isMinimuxerReady: Bool {
1313
print("isMinimuxerReady property is always true on simulator")
1414
return true
1515
#else
16-
return minimuxer.ready() && IfManager.shared.sideVPNPatched
16+
IfManager.shared.query()
17+
let dest = IfManager.shared.nextProbableSideVPN?.destIP
18+
if #available(iOS 26.4, *) {
19+
return minimuxer.ready(dest) && IfManager.shared.sideVPNPatched
20+
} else {
21+
return minimuxer.ready(dest)
22+
}
1723
#endif
1824
}
1925

2026
func minimuxerStartWithLogger(_ pairingFile: String, _ logPath: String, _ loggingEnabled: Bool) throws {
2127
#if targetEnvironment(simulator)
2228
print("minimuxerStartWithLogger(\(pairingFile), \(logPath), \(loggingEnabled)) is no-op on simulator")
2329
#else
24-
let hostIP = IfManager.shared.nextProbableSideVPN?.hostIP
25-
try minimuxer.startWithLogger(pairingFile, logPath, hostIP, loggingEnabled)
30+
IfManager.shared.query()
31+
let dest = IfManager.shared.nextProbableSideVPN?.destIP
32+
print("minimuxerStartWithLogger(\(pairingFile), \(logPath), \(dest), \(loggingEnabled)) is no-op on simulator")
33+
try minimuxer.startWithLogger(pairingFile, logPath, dest, loggingEnabled)
2634
#endif
2735
}
2836

0 commit comments

Comments
 (0)