Add rudimentary NetworkSettings generation

This commit is contained in:
Jett Chen 2023-08-26 16:22:09 +08:00
parent 22e41203fb
commit 309db8085d
8 changed files with 418 additions and 10 deletions

View 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
}
}

View file

@ -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)

View file

@ -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();