Skip to content

Commit 0a70464

Browse files
committed
update for FlyingSocks UDP branch multihoming changes
1 parent df339c6 commit 0a70464

File tree

3 files changed

+44
-30
lines changed

3 files changed

+44
-30
lines changed

Sources/SwiftOCA/OCP.1/Backend/Ocp1FlyingSocksConnection.swift

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -48,25 +48,6 @@ fileprivate extension SocketError {
4848
}
4949
}
5050

51-
package extension SocketAddress {
52-
func makeStorage() -> sockaddr_storage {
53-
var storage = sockaddr_storage()
54-
var addr = self
55-
let addrSize = MemoryLayout<Self>.size
56-
let storageSize = MemoryLayout<sockaddr_storage>.size
57-
58-
withUnsafePointer(to: &addr) { addrPtr in
59-
let addrRawPtr = UnsafeRawPointer(addrPtr)
60-
withUnsafeMutablePointer(to: &storage) { storagePtr in
61-
let storageRawPtr = UnsafeMutableRawPointer(storagePtr)
62-
let copySize = min(addrSize, storageSize)
63-
storageRawPtr.copyMemory(from: addrRawPtr, byteCount: copySize)
64-
}
65-
}
66-
return storage
67-
}
68-
}
69-
7051
#if os(Linux)
7152
extension sockaddr_in: SocketAddress {}
7253
extension sockaddr_in6: SocketAddress {}

Sources/SwiftOCADevice/OCP.1/Backend/FlyingSocks/Ocp1FlyingSocksDatagramController.swift

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ actor Ocp1FlyingSocksDatagramController: Ocp1ControllerInternal {
2929

3030
var subscriptions = [OcaONo: Set<OcaSubscriptionManagerSubscription>]()
3131
let peerAddress: sockaddr_storage
32+
let interfaceIndex: UInt32?
33+
let localAddress: sockaddr_storage?
3234
var keepAliveTask: Task<(), Error>?
3335
var lastMessageReceivedTime = ContinuousClock.now
3436
var lastMessageSentTime = ContinuousClock.now
@@ -42,10 +44,14 @@ actor Ocp1FlyingSocksDatagramController: Ocp1ControllerInternal {
4244

4345
init(
4446
endpoint: Ocp1FlyingSocksDatagramDeviceEndpoint,
45-
peerAddress: SocketAddress
47+
peerAddress: sockaddr_storage,
48+
interfaceIndex: UInt32?,
49+
localAddress: sockaddr_storage?
4650
) async throws {
4751
self.endpoint = endpoint
48-
self.peerAddress = peerAddress.makeStorage()
52+
self.peerAddress = peerAddress
53+
self.interfaceIndex = interfaceIndex
54+
self.localAddress = localAddress
4955
}
5056

5157
func onConnectionBecomingStale() async throws {
@@ -59,10 +65,15 @@ actor Ocp1FlyingSocksDatagramController: Ocp1ControllerInternal {
5965
}
6066

6167
func sendOcp1EncodedData(_ data: Data) async throws {
62-
try await sendOcp1EncodedMessage((peerAddress, data))
68+
try await sendOcp1EncodedMessage((peerAddress, data, interfaceIndex, localAddress))
6369
}
6470

65-
func sendOcp1EncodedMessage(_ messagePdu: (some SocketAddress, Data)) async throws {
71+
func sendOcp1EncodedMessage(_ messagePdu: (
72+
some SocketAddress,
73+
Data,
74+
UInt32?,
75+
(some SocketAddress)?
76+
)) async throws {
6677
try await endpoint?.sendOcp1EncodedMessage(messagePdu)
6778
}
6879

Sources/SwiftOCADevice/OCP.1/Backend/FlyingSocks/Ocp1FlyingSocksDatagramDeviceEndpoint.swift

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -117,14 +117,20 @@ public final class Ocp1FlyingSocksDatagramDeviceEndpoint: OcaDeviceEndpointPriva
117117
}
118118
}
119119

120-
func controller(for controllerAddress: SocketAddress) async throws -> ControllerType {
120+
func controller(
121+
for controllerAddress: sockaddr_storage,
122+
interfaceIndex: UInt32?,
123+
localAddress: sockaddr_storage?
124+
) async throws -> ControllerType {
121125
var controller: ControllerType!
122126

123127
controller = _controllers.first(where: { $0.matchesPeer(address: controllerAddress) })
124128
if controller == nil {
125129
controller = try await Ocp1FlyingSocksDatagramController(
126130
endpoint: self,
127-
peerAddress: controllerAddress
131+
peerAddress: controllerAddress,
132+
interfaceIndex: interfaceIndex,
133+
localAddress: localAddress
128134
)
129135
logger.info("datagram controller added", controller: controller)
130136
_controllers.insert(controller)
@@ -185,10 +191,16 @@ public final class Ocp1FlyingSocksDatagramDeviceEndpoint: OcaDeviceEndpointPriva
185191

186192
repeat {
187193
do {
188-
for try await messagePdu in asyncSocket!.messages(maxMessageLength: Ocp1MaximumDatagramPduSize) {
189-
let controller = try await controller(for: messagePdu.0)
194+
for try await messagePdu in asyncSocket!
195+
.messages(maxMessageLength: Ocp1MaximumDatagramPduSize)
196+
{
197+
let controller = try await controller(
198+
for: messagePdu.peerAddress,
199+
interfaceIndex: messagePdu.interfaceIndex,
200+
localAddress: messagePdu.localAddress
201+
)
190202
do {
191-
let messages = try await controller.decodeMessages(from: messagePdu.1)
203+
let messages = try await controller.decodeMessages(from: messagePdu.bytes)
192204
for (message, rrq) in messages {
193205
try await controller.handle(for: self, message: message, rrq: rrq)
194206
}
@@ -224,11 +236,21 @@ public final class Ocp1FlyingSocksDatagramDeviceEndpoint: OcaDeviceEndpointPriva
224236
#endif
225237
}
226238

227-
func sendOcp1EncodedMessage(_ message: (some SocketAddress, Data)) async throws {
239+
func sendOcp1EncodedMessage(_ message: (
240+
some SocketAddress,
241+
Data,
242+
UInt32?,
243+
(some SocketAddress)?
244+
)) async throws {
228245
guard let asyncSocket else {
229246
throw Ocp1Error.notConnected
230247
}
231-
try await asyncSocket.send(message.1, to: message.0)
248+
try await asyncSocket.send(
249+
message: message.1,
250+
to: message.0,
251+
interfaceIndex: message.2,
252+
from: message.3
253+
)
232254
}
233255

234256
public nonisolated var serviceType: OcaDeviceEndpointRegistrar.ServiceType {

0 commit comments

Comments
 (0)