52 lines
994 B
Swift
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()
|
|
}
|
|
|
|
}
|