fix super event

This commit is contained in:
anlicheng 2026-04-15 10:04:24 +08:00
parent 75d7761896
commit a8f0bc7804
2 changed files with 89 additions and 24 deletions

View File

@ -625,6 +625,10 @@ actor SDLContextActor {
// Super
extension SDLContextActor {
private func makeSuperEventProcessor() -> SDLSuperEventProcessor {
return .init(networkAddress: self.config.networkAddress)
}
//
private func startRegisterLoop() {
guard self.registerTask == nil else {
@ -711,32 +715,21 @@ extension SDLContextActor {
}
private func handleEvent(event: SDLEvent) async {
switch event.event {
case .natChanged(let natChangedEvent):
let dstMac = natChangedEvent.mac
SDLLogger.log("[SDLContext] natChangedEvent, dstMac: \(dstMac)")
sessionManager.removeSession(dstMac: dstMac)
case .sendRegister(let sendRegisterEvent):
SDLLogger.log("[SDLContext] sendRegisterEvent, ip: \(sendRegisterEvent)")
// register
var register = SDLRegister()
register.networkID = self.config.networkAddress.networkId
register.srcMac = self.config.networkAddress.mac
register.dstMac = sendRegisterEvent.dstMac
let registerData = try! register.serializedData()
let processor = self.makeSuperEventProcessor()
let plan = await processor.makeProcessingPlan(event: event)
if let logMessage = plan.logMessage {
SDLLogger.log(logMessage)
}
if sendRegisterEvent.natIp > 0 && sendRegisterEvent.natPort > 0 {
let address = SDLUtil.int32ToIp(sendRegisterEvent.natIp)
if let remoteAddress = try? SocketAddress.makeAddressResolvingHost(address, port: Int(sendRegisterEvent.natPort)) {
self.sendPeerPacket(type: .register, data: registerData, remoteAddress: remoteAddress)
}
}
if sendRegisterEvent.hasV6Info, let remoteAddress = try? await sendRegisterEvent.v6Info.socketAddress() {
switch plan.action {
case .removeSession(let dstMac):
self.sessionManager.removeSession(dstMac: dstMac)
case .sendRegister(let registerData, let remoteAddresses):
remoteAddresses.forEach { remoteAddress in
self.sendPeerPacket(type: .register, data: registerData, remoteAddress: remoteAddress)
}
case .shutdown(let shutdownEvent):
let alertNotice = NoticeMessage.alert(alert: shutdownEvent.message)
case .shutdown(let message):
let alertNotice = NoticeMessage.alert(alert: message)
self.noticeClient?.send(data: alertNotice)
// 退

View File

@ -0,0 +1,72 @@
//
// SDLSuperEventProcessor.swift
// Tun
//
// Created by on 2026/4/15.
//
import Foundation
import NIOCore
final class SDLSuperEventProcessor {
enum ProcessingAction {
case removeSession(dstMac: Data)
case sendRegister(data: Data, remoteAddresses: [SocketAddress])
case shutdown(message: String)
case none
}
struct ProcessingPlan {
let logMessage: String?
let action: ProcessingAction
}
private let networkAddress: SDLConfiguration.NetworkAddress
init(networkAddress: SDLConfiguration.NetworkAddress) {
self.networkAddress = networkAddress
}
func makeProcessingPlan(event: SDLEvent) async -> ProcessingPlan {
switch event.event {
case .natChanged(let natChangedEvent):
let dstMac = natChangedEvent.mac
return .init(
logMessage: "[SDLContext] natChangedEvent, dstMac: \(dstMac)",
action: .removeSession(dstMac: dstMac)
)
case .sendRegister(let sendRegisterEvent):
return await self.makeSendRegisterPlan(sendRegisterEvent)
case .shutdown(let shutdownEvent):
return .init(logMessage: nil, action: .shutdown(message: shutdownEvent.message))
case .none:
return .init(logMessage: nil, action: .none)
}
}
private func makeSendRegisterPlan(_ event: SDLEvent.SendRegister) async -> ProcessingPlan {
// register
var register = SDLRegister()
register.networkID = self.networkAddress.networkId
register.srcMac = self.networkAddress.mac
register.dstMac = event.dstMac
let registerData = try! register.serializedData()
var remoteAddresses: [SocketAddress] = []
if event.natIp > 0 && event.natPort > 0 {
let address = SDLUtil.int32ToIp(event.natIp)
if let remoteAddress = try? SocketAddress.makeAddressResolvingHost(address, port: Int(event.natPort)) {
remoteAddresses.append(remoteAddress)
}
}
if event.hasV6Info, let remoteAddress = try? await event.v6Info.socketAddress() {
remoteAddresses.append(remoteAddress)
}
return .init(
logMessage: "[SDLContext] sendRegisterEvent, ip: \(event)",
action: .sendRegister(data: registerData, remoteAddresses: remoteAddresses)
)
}
}