Add rudimentary NetworkSettings generation
This commit is contained in:
parent
22e41203fb
commit
309db8085d
8 changed files with 418 additions and 10 deletions
|
|
@ -7,6 +7,7 @@
|
|||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
0B90A6DF2A99BDB300EE4E7F /* NetworkSettingsConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B90A6DE2A99BDB300EE4E7F /* NetworkSettingsConverter.swift */; };
|
||||
43AA26D82A10004900F14CE6 /* MenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43AA26D72A10004900F14CE6 /* MenuView.swift */; };
|
||||
D00AA8972A4669BC005C8102 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00AA8962A4669BC005C8102 /* AppDelegate.swift */; };
|
||||
D020F65829E4A697002790F6 /* PacketTunnelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D020F65729E4A697002790F6 /* PacketTunnelProvider.swift */; };
|
||||
|
|
@ -46,6 +47,7 @@
|
|||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
0B90A6DE2A99BDB300EE4E7F /* NetworkSettingsConverter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkSettingsConverter.swift; sourceTree = "<group>"; };
|
||||
43AA26D72A10004900F14CE6 /* MenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuView.swift; sourceTree = "<group>"; };
|
||||
D00AA8962A4669BC005C8102 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||
D020F63D29E4A1FF002790F6 /* Identity.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Identity.xcconfig; sourceTree = "<group>"; };
|
||||
|
|
@ -118,6 +120,7 @@
|
|||
isa = PBXGroup;
|
||||
children = (
|
||||
D020F65729E4A697002790F6 /* PacketTunnelProvider.swift */,
|
||||
0B90A6DE2A99BDB300EE4E7F /* NetworkSettingsConverter.swift */,
|
||||
D020F65929E4A697002790F6 /* Info.plist */,
|
||||
D020F66729E4A95D002790F6 /* NetworkExtension-iOS.entitlements */,
|
||||
D020F66629E4A95D002790F6 /* NetworkExtension-macOS.entitlements */,
|
||||
|
|
@ -304,6 +307,7 @@
|
|||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
0B90A6DF2A99BDB300EE4E7F /* NetworkSettingsConverter.swift in Sources */,
|
||||
D020F65829E4A697002790F6 /* PacketTunnelProvider.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
|
|
|
|||
56
Apple/NetworkExtension/NetworkSettingsConverter.swift
Normal file
56
Apple/NetworkExtension/NetworkSettingsConverter.swift
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
//
|
||||
// NetworkSettingsConverter.swift
|
||||
// NetworkExtension
|
||||
//
|
||||
// Created by Jett Chen on 2023/7/7.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import NetworkExtension
|
||||
|
||||
public struct TunCrateNetworkSettings {
|
||||
let addr: Int64
|
||||
let netmask: Int64
|
||||
let mtu: Int32
|
||||
}
|
||||
|
||||
extension TunCrateNetworkSettings {
|
||||
var decodedIPv4Addr: String? {
|
||||
return decodeIPv4(addr)
|
||||
}
|
||||
|
||||
var decodedIPv4Netmask: String? {
|
||||
return decodeIPv4(netmask)
|
||||
}
|
||||
|
||||
var decodedMTU: Int? {
|
||||
return mtu >= 0 ? Int(mtu) : nil
|
||||
}
|
||||
|
||||
private func decodeIPv4(_ addr: Int64) -> String? {
|
||||
if addr < 0 {
|
||||
return nil
|
||||
}
|
||||
let bytes = (
|
||||
UInt8((addr & 0xFF000000) >> 24),
|
||||
UInt8((addr & 0x00FF0000) >> 16),
|
||||
UInt8((addr & 0x0000FF00) >> 8),
|
||||
UInt8(addr & 0x000000FF)
|
||||
)
|
||||
return "\(bytes.0).\(bytes.1).\(bytes.2).\(bytes.3)"
|
||||
}
|
||||
|
||||
func generateNetworkSettings() -> NEPacketTunnelNetworkSettings {
|
||||
let neSettings = NEPacketTunnelNetworkSettings()
|
||||
|
||||
if let addr = decodedIPv4Addr, let netmask = decodedIPv4Netmask {
|
||||
neSettings.ipv4Settings = NEIPv4Settings(addresses: [addr], subnetMasks: [netmask])
|
||||
}
|
||||
if let mtuValue = decodedMTU {
|
||||
neSettings.mtu = NSNumber(value: mtuValue)
|
||||
}
|
||||
return neSettings
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -4,7 +4,9 @@ import OSLog
|
|||
|
||||
class PacketTunnelProvider: NEPacketTunnelProvider {
|
||||
let logger = Logger(subsystem: "com.hackclub.burrow", category: "General")
|
||||
|
||||
override func startTunnel(options: [String: NSObject]?, completionHandler: @escaping (Error?) -> Void) {
|
||||
libburrow.initialize_oslog()
|
||||
let fild = libburrow.retrieve()
|
||||
if fild == -1 {
|
||||
// Not sure if this is the right way to return an error
|
||||
|
|
@ -17,6 +19,8 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
|
|||
completionHandler(err)
|
||||
}
|
||||
logger.info("fd: \(fild)")
|
||||
let networkSettings = genNetSec(fild: fild)
|
||||
logger.info("Network Settings: - ipv4:\(networkSettings.ipv4Settings) -mtu: \(networkSettings.mtu)")
|
||||
completionHandler(nil)
|
||||
}
|
||||
|
||||
|
|
@ -24,6 +28,14 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
|
|||
completionHandler()
|
||||
}
|
||||
|
||||
func genNetSec(fild: Int32) -> NEPacketTunnelNetworkSettings {
|
||||
logger.debug("getting Network settings with fild \(fild) ...")
|
||||
let settings = libburrow.getNetworkSettings(fild)
|
||||
logger.debug("genNetSec Called: \n ipv4: \(settings.ipv4_addr) \n netmask: \(settings.ipv4_netmask) \n mtu: \(settings.mtu)")
|
||||
let tNetworksettings = TunCrateNetworkSettings(addr: settings.ipv4_addr, netmask: settings.ipv4_netmask, mtu: settings.mtu)
|
||||
return tNetworksettings.generateNetworkSettings()
|
||||
}
|
||||
|
||||
override func handleAppMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)?) {
|
||||
if let handler = completionHandler {
|
||||
handler(messageData)
|
||||
|
|
|
|||
|
|
@ -1 +1,11 @@
|
|||
#include <stdint.h>
|
||||
int retrieve();
|
||||
|
||||
typedef struct {
|
||||
int64_t ipv4_addr;
|
||||
int64_t ipv4_netmask;
|
||||
int32_t mtu;
|
||||
} NetWorkSettings;
|
||||
|
||||
NetWorkSettings getNetworkSettings(int);
|
||||
void initialize_oslog();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue