punchnet-macos/Tun/Punchnet/ArpServer.swift
2026-01-30 12:26:10 +08:00

52 lines
994 B
Swift

//
// ArpServer.swift
// sdlan
//
// Created by on 2025/7/14.
//
import Foundation
import Darwin
final class ArpServer {
private var known_macs: [UInt32:Data] = [:]
private var lock = os_unfair_lock()
init(known_macs: [UInt32:Data]) {
self.known_macs = known_macs
}
func query(ip: UInt32) -> Data? {
return withLock {
return self.known_macs[ip]
}
}
func append(ip: UInt32, mac: Data) {
withLock {
self.known_macs[ip] = mac
}
}
func remove(ip: UInt32) {
withLock {
_ = self.known_macs.removeValue(forKey: ip)
}
}
func clear() {
withLock {
self.known_macs = [:]
}
}
private func withLock<T>(_ body: () throws -> T) rethrows -> T {
os_unfair_lock_lock(&lock)
defer{
os_unfair_lock_unlock(&lock)
}
return try body()
}
}