diff --git a/quic/api/QuicSocket.h b/quic/api/QuicSocket.h index fd8716f18..ec89fa52f 100644 --- a/quic/api/QuicSocket.h +++ b/quic/api/QuicSocket.h @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -277,6 +278,11 @@ class QuicSocket { folly::Optional streamWriteError; }; + // Returns folly::none before the handshake is complete, otherwise is always + // non-empty. + virtual folly::Optional> + getPeerTransportParams() const = 0; + /** * Sets connection setup callback. This callback must be set before using the * socket. diff --git a/quic/api/test/MockQuicSocket.h b/quic/api/test/MockQuicSocket.h index 7b37cde46..ac0dee771 100644 --- a/quic/api/test/MockQuicSocket.h +++ b/quic/api/test/MockQuicSocket.h @@ -51,6 +51,11 @@ class MockQuicSocket : public QuicSocket { MOCK_METHOD(const folly::SocketAddress&, getPeerAddress, (), (const)); MOCK_METHOD(const folly::SocketAddress&, getOriginalPeerAddress, (), (const)); MOCK_METHOD(const folly::SocketAddress&, getLocalAddress, (), (const)); + MOCK_METHOD( + folly::Optional>, + getPeerTransportParams, + (), + (const)); MOCK_METHOD(std::shared_ptr, getEventBase, (), (const)); MOCK_METHOD( (folly::Expected), diff --git a/quic/api/test/QuicTransportBaseTest.cpp b/quic/api/test/QuicTransportBaseTest.cpp index dc06f07c5..48dcd75ef 100644 --- a/quic/api/test/QuicTransportBaseTest.cpp +++ b/quic/api/test/QuicTransportBaseTest.cpp @@ -261,6 +261,11 @@ class TestQuicTransport closeUdpSocket(); } + folly::Optional> getPeerTransportParams() + const override { + return folly::none; + } + std::chrono::milliseconds getLossTimeoutRemainingTime() { return lossTimeout_.getTimerCallbackTimeRemaining(); } diff --git a/quic/api/test/TestQuicTransport.h b/quic/api/test/TestQuicTransport.h index 2e4a211cb..1506e7278 100644 --- a/quic/api/test/TestQuicTransport.h +++ b/quic/api/test/TestQuicTransport.h @@ -50,6 +50,11 @@ class TestQuicTransport closeUdpSocket(); } + folly::Optional> getPeerTransportParams() + const override { + return folly::none; + } + QuicVersion getVersion() { auto& conn = getConnectionState(); return conn.version.value_or(*conn.originalVersion); diff --git a/quic/client/QuicClientTransport.cpp b/quic/client/QuicClientTransport.cpp index 05dcd47ab..567c9c6b9 100644 --- a/quic/client/QuicClientTransport.cpp +++ b/quic/client/QuicClientTransport.cpp @@ -1736,6 +1736,18 @@ void QuicClientTransport::maybeSendTransportKnobs() { } } +folly::Optional> +QuicClientTransport::getPeerTransportParams() const { + if (clientConn_ && clientConn_->clientHandshakeLayer) { + auto maybeParams = + clientConn_->clientHandshakeLayer->getServerTransportParams(); + if (maybeParams) { + return maybeParams->parameters; + } + } + return folly::none; +} + void QuicClientTransport::RecvmmsgStorage::resize(size_t numPackets) { if (msgs.size() != numPackets) { msgs.resize(numPackets); diff --git a/quic/client/QuicClientTransport.h b/quic/client/QuicClientTransport.h index fa8b2085e..46a099a9a 100644 --- a/quic/client/QuicClientTransport.h +++ b/quic/client/QuicClientTransport.h @@ -201,6 +201,9 @@ class QuicClientTransport conn_->bufAccessor = bufAccessor_.get(); } + folly::Optional> getPeerTransportParams() + const override; + class HappyEyeballsConnAttemptDelayTimeout : public QuicTimerCallback { public: explicit HappyEyeballsConnAttemptDelayTimeout( diff --git a/quic/server/QuicServerTransport.cpp b/quic/server/QuicServerTransport.cpp index 868bedb23..fbb1da2ca 100644 --- a/quic/server/QuicServerTransport.cpp +++ b/quic/server/QuicServerTransport.cpp @@ -1201,4 +1201,16 @@ void QuicServerTransport::logTimeBasedStats() const { } } +folly::Optional> +QuicServerTransport::getPeerTransportParams() const { + if (serverConn_ && serverConn_->serverHandshakeLayer) { + auto maybeParams = + serverConn_->serverHandshakeLayer->getClientTransportParams(); + if (maybeParams) { + return maybeParams->parameters; + } + } + return folly::none; +} + } // namespace quic diff --git a/quic/server/QuicServerTransport.h b/quic/server/QuicServerTransport.h index bb093e2dd..e25de0aae 100644 --- a/quic/server/QuicServerTransport.h +++ b/quic/server/QuicServerTransport.h @@ -168,6 +168,9 @@ class QuicServerTransport */ void logTimeBasedStats() const; + folly::Optional> getPeerTransportParams() + const override; + protected: // From QuicSocket SocketObserverContainer* getSocketObserverContainer() const override { diff --git a/quic/server/handshake/ServerTransportParametersExtension.h b/quic/server/handshake/ServerTransportParametersExtension.h index c4cb32002..1316a3dfa 100644 --- a/quic/server/handshake/ServerTransportParametersExtension.h +++ b/quic/server/handshake/ServerTransportParametersExtension.h @@ -121,8 +121,8 @@ class ServerTransportParametersExtension : public fizz::ServerExtensions { return exts; } - folly::Optional getClientTransportParams() { - return std::move(clientTransportParameters_); + const folly::Optional& getClientTransportParams() { + return clientTransportParameters_; } private: