diff --git a/Sources/SwiftNetwork/Protocols/QUICConnectionProtocol.swift b/Sources/SwiftNetwork/Protocols/QUICConnectionProtocol.swift index a20ff62..23f84b8 100644 --- a/Sources/SwiftNetwork/Protocols/QUICConnectionProtocol.swift +++ b/Sources/SwiftNetwork/Protocols/QUICConnectionProtocol.swift @@ -753,6 +753,7 @@ public struct QUICConnectionProtocol: NetworkProtocol { public var applicationErrorReason: String? public var activeConnectionIDLimit: Int = 0 + public var remoteMaxDatagramFrameSize: UInt16 = 0 #if NETWORK_PRIVATE var privateStorage = QUICConnectionMetadataPrivateStorage() #endif diff --git a/Sources/SwiftNetwork/QUIC/QUICConnection.swift b/Sources/SwiftNetwork/QUIC/QUICConnection.swift index f4956d6..e12d024 100644 --- a/Sources/SwiftNetwork/QUIC/QUICConnection.swift +++ b/Sources/SwiftNetwork/QUIC/QUICConnection.swift @@ -4246,6 +4246,7 @@ public final class QUICConnection: ManyToManyApplicationStreamProtocol, } guard let remoteTPMaxDatagramFrameSize else { self.remoteMaxDatagramFrameSize = 0 + self.connectionMetadata.remoteMaxDatagramFrameSize = 0 return } if remoteTPMaxDatagramFrameSize > TransportParameters.maxDatagramFrameSize { @@ -4253,6 +4254,7 @@ public final class QUICConnection: ManyToManyApplicationStreamProtocol, } else { self.remoteMaxDatagramFrameSize = remoteTPMaxDatagramFrameSize } + self.connectionMetadata.remoteMaxDatagramFrameSize = UInt16(truncatingIfNeeded: remoteMaxDatagramFrameSize) } private func discardKeys(keyState: PacketKeyState, discardRecoveryState: Bool = true) { diff --git a/Tests/SwiftNetworkTests/SwiftNetworkQUICHarnessTests.swift b/Tests/SwiftNetworkTests/SwiftNetworkQUICHarnessTests.swift index e2f6e94..6b470b3 100644 --- a/Tests/SwiftNetworkTests/SwiftNetworkQUICHarnessTests.swift +++ b/Tests/SwiftNetworkTests/SwiftNetworkQUICHarnessTests.swift @@ -653,6 +653,36 @@ final class SwiftNetworkQUICHarnessTests: NetTestCase { QUICTestHarness().runQUICTest(datagram: true, blockSize: 1000, blockCount: 10) } + func testQUICDatagramRemoteMaxDatagramFrameSize() { + QUICTestHarness().runQUICTest( + datagram: true, + blockSize: 1000, + blockCount: 1, + afterData: { harness in + let expectation = XCTestExpectation(description: "Wait for remote datagram frame size to be fetched") + harness.context.async { + let clientMetadata: ProtocolMetadata? = harness.state?.clientHarness.getMetadata() + XCTAssertNotNil(clientMetadata) + if let clientMetadata { + let clientRemoteSize = clientMetadata.connectionMetadata?.remoteMaxDatagramFrameSize + XCTAssertNotNil(clientRemoteSize) + XCTAssertEqual(clientRemoteSize, 65535) + } + let serverMetadata: ProtocolMetadata? = harness.state?.serverHarness.getMetadata() + XCTAssertNotNil(serverMetadata) + if let serverMetadata { + let serverRemoteSize = serverMetadata.connectionMetadata?.remoteMaxDatagramFrameSize + XCTAssertNotNil(serverRemoteSize) + XCTAssertEqual(serverRemoteSize, 65535) + } + expectation.fulfill() + } + let waitResult = XCTWaiter.wait(for: [expectation], timeout: 2.0) + XCTAssertEqual(waitResult, .completed, "Remote datagram frame size fetch should complete") + } + ) + } + // MARK: Unidirectional tests func testQUICHelloWorldUnidirectional() {