From 4601c4bdaec176556cb5483f40c89d8e41134af9 Mon Sep 17 00:00:00 2001 From: Matt Joras Date: Thu, 10 Jul 2025 15:57:07 -0700 Subject: [PATCH] Migrate folly::Expected to quic::Expected Summary: This migrates the quic code to use quic::Expected instead of folly::Expected. quic::Expected is a vendored wrapper for expected-lite, which itself matches std::expected. std::expected is not available to us, but once it is, we would be able to further simplify to the std version. This migration is almost entirely mechanical. --- > Generated by [Confucius Code Assist (CCA)](https://www.internalfb.com/wiki/Confucius/Analect/Shared_Analects/Confucius_Code_Assist_(CCA)/) [Session](https://www.internalfb.com/confucius?session_id=7044a18e-4d22-11f0-afeb-97de80927172&tab=Chat), [Trace](https://www.internalfb.com/confucius?session_id=7044a18e-4d22-11f0-afeb-97de80927172&tab=Trace) --- > Generated by [RACER](https://www.internalfb.com/wiki/RACER_(Risk-Aware_Code_Editing_and_Refactoring)/), powered by [Confucius](https://www.internalfb.com/wiki/Confucius/Analect/Shared_Analects/Confucius_Code_Assist_(CCA)/) [Session](https://www.internalfb.com/confucius?session_id=1fea6620-4d30-11f0-a206-ad0241db9ec9&tab=Chat), [Trace](https://www.internalfb.com/confucius?session_id=1fea6620-4d30-11f0-a206-ad0241db9ec9&tab=Trace) [Session](https://www.internalfb.com/confucius?session_id=2bdbabba-505a-11f0-a21b-fb3d40195e00&tab=Chat), [Trace](https://www.internalfb.com/confucius?session_id=2bdbabba-505a-11f0-a21b-fb3d40195e00&tab=Trace) [Session](https://www.internalfb.com/confucius?session_id=eb689fd2-5114-11f0-ade8-99c0fe2f80f2&tab=Chat), [Trace](https://www.internalfb.com/confucius?session_id=eb689fd2-5114-11f0-ade8-99c0fe2f80f2&tab=Trace) [Session](https://www.internalfb.com/confucius?session_id=9bc2dcec-51f8-11f0-8604-7bc1f5225a86&tab=Chat), [Trace](https://www.internalfb.com/confucius?session_id=9bc2dcec-51f8-11f0-8604-7bc1f5225a86&tab=Trace) [Session](https://www.internalfb.com/confucius?session_id=46b187ea-5cdd-11f0-9bab-7b6b886e8a09&tab=Chat), [Trace](https://www.internalfb.com/confucius?session_id=46b187ea-5cdd-11f0-9bab-7b6b886e8a09&tab=Trace) Reviewed By: kvtsoy Differential Revision: D76488955 fbshipit-source-id: 92b9cbeac85a28722a6180464b47d84696b1e81b --- quic/QuicConstants.h | 16 + quic/api/BUCK | 2 +- quic/api/IoBufQuicBatch.cpp | 12 +- quic/api/IoBufQuicBatch.h | 6 +- quic/api/QuicAckScheduler.cpp | 8 +- quic/api/QuicAckScheduler.h | 2 +- quic/api/QuicPacketScheduler.cpp | 192 ++- quic/api/QuicPacketScheduler.h | 30 +- quic/api/QuicSocket.h | 69 +- quic/api/QuicSocketLite.h | 52 +- quic/api/QuicStreamAsyncTransport.cpp | 106 +- quic/api/QuicTransportBase.cpp | 231 ++-- quic/api/QuicTransportBase.h | 69 +- quic/api/QuicTransportBaseLite.cpp | 313 ++--- quic/api/QuicTransportBaseLite.h | 56 +- quic/api/QuicTransportFunctions.cpp | 239 ++-- quic/api/QuicTransportFunctions.h | 27 +- quic/api/test/MockQuicSocket.h | 117 +- quic/api/test/Mocks.h | 4 +- quic/api/test/QuicBatchWriterTest.cpp | 18 +- quic/api/test/QuicTransportBaseTest.cpp | 774 ++++++----- quic/api/test/QuicTransportTest.cpp | 546 +++++--- quic/api/test/QuicTypedTransportTest.cpp | 224 ++-- quic/api/test/QuicTypedTransportTestUtil.h | 4 +- quic/api/test/TestQuicTransport.h | 18 +- quic/client/BUCK | 5 +- quic/client/QuicClientTransport.cpp | 19 +- quic/client/QuicClientTransport.h | 7 +- quic/client/QuicClientTransportLite.cpp | 311 ++--- quic/client/QuicClientTransportLite.h | 24 +- quic/client/handshake/ClientHandshake.cpp | 56 +- quic/client/handshake/ClientHandshake.h | 22 +- .../ClientTransportParametersExtension.h | 44 +- quic/client/state/ClientStateMachine.cpp | 69 +- quic/client/state/ClientStateMachine.h | 5 +- quic/client/test/ClientStateMachineTest.cpp | 10 +- quic/client/test/Mocks.h | 34 +- .../test/QuicClientTransportLiteTest.cpp | 32 +- quic/client/test/QuicClientTransportMock.h | 8 +- quic/client/test/QuicClientTransportTest.cpp | 45 +- quic/codec/BUCK | 5 +- quic/codec/ConnectionIdAlgo.h | 8 +- quic/codec/Decode.cpp | 450 +++---- quic/codec/Decode.h | 79 +- quic/codec/DefaultConnectionIdAlgo.cpp | 143 +- quic/codec/DefaultConnectionIdAlgo.h | 8 +- quic/codec/PacketNumberCipher.cpp | 20 +- quic/codec/PacketNumberCipher.h | 22 +- quic/codec/QuicConnectionId.cpp | 13 +- quic/codec/QuicConnectionId.h | 7 +- quic/codec/QuicHeaderCodec.cpp | 39 +- quic/codec/QuicHeaderCodec.h | 2 +- quic/codec/QuicInteger.cpp | 8 +- quic/codec/QuicInteger.h | 14 +- quic/codec/QuicPacketBuilder.cpp | 44 +- quic/codec/QuicPacketBuilder.h | 15 +- quic/codec/QuicPacketRebuilder.cpp | 26 +- quic/codec/QuicPacketRebuilder.h | 2 +- quic/codec/QuicReadCodec.cpp | 23 +- quic/codec/QuicReadCodec.h | 6 +- quic/codec/QuicWriteCodec.cpp | 198 +-- quic/codec/QuicWriteCodec.h | 12 +- quic/codec/test/DecodeTest.cpp | 26 +- quic/codec/test/Mocks.h | 9 +- quic/codec/test/QuicConnectionIdTest.cpp | 8 +- quic/codec/test/QuicHeaderCodecTest.cpp | 4 +- quic/codec/test/QuicIntegerTest.cpp | 4 +- quic/codec/test/QuicPacketBuilderTest.cpp | 4 +- quic/codec/test/QuicPacketRebuilderTest.cpp | 18 +- quic/codec/test/QuicReadCodecTest.cpp | 4 +- quic/codec/test/QuicWriteCodecTest.cpp | 60 +- quic/codec/test/TypesTest.cpp | 14 +- quic/common/BUCK | 2 +- quic/common/Expected.h | 37 + quic/common/SocketUtil.h | 4 +- quic/common/test/SocketUtilTest.cpp | 18 +- quic/common/test/TestUtils.cpp | 24 +- quic/common/test/TestUtils.h | 17 +- quic/common/testutil/MockAsyncUDPSocket.h | 62 +- quic/common/third-party/expected.hpp | 2 + quic/common/udpsocket/BUCK | 6 +- .../udpsocket/FollyQuicAsyncUDPSocket.cpp | 143 +- .../udpsocket/FollyQuicAsyncUDPSocket.h | 50 +- .../udpsocket/LibevQuicAsyncUDPSocket.cpp | 135 +- .../udpsocket/LibevQuicAsyncUDPSocket.h | 58 +- quic/common/udpsocket/QuicAsyncUDPSocket.h | 66 +- .../udpsocket/QuicAsyncUDPSocketImpl.cpp | 12 +- .../common/udpsocket/QuicAsyncUDPSocketImpl.h | 3 +- .../udpsocket/test/QuicAsyncUDPSocketMock.h | 56 +- quic/congestion_control/test/BbrTest.cpp | 12 +- quic/dsr/frontend/Scheduler.cpp | 14 +- quic/dsr/frontend/Scheduler.h | 6 +- quic/dsr/frontend/WriteCodec.cpp | 8 +- quic/dsr/frontend/WriteCodec.h | 2 +- quic/dsr/frontend/WriteFunctions.cpp | 6 +- quic/dsr/frontend/WriteFunctions.h | 2 +- .../client/handshake/FizzClientHandshake.cpp | 25 +- .../client/handshake/FizzClientHandshake.h | 10 +- .../client/test/QuicClientTransportTest.cpp | 421 +++--- .../client/test/QuicClientTransportTestUtil.h | 58 +- quic/fizz/handshake/FizzBridge.h | 6 +- quic/fizz/handshake/FizzCryptoFactory.cpp | 22 +- quic/fizz/handshake/FizzCryptoFactory.h | 8 +- .../fizz/handshake/FizzPacketNumberCipher.cpp | 20 +- quic/fizz/handshake/FizzPacketNumberCipher.h | 10 +- .../handshake/test/FizzCryptoFactoryTest.cpp | 4 +- .../server/handshake/FizzServerHandshake.cpp | 2 +- .../server/handshake/FizzServerHandshake.h | 2 +- quic/flowcontrol/BUCK | 1 + quic/flowcontrol/QuicFlowController.cpp | 48 +- quic/flowcontrol/QuicFlowController.h | 24 +- quic/handshake/Aead.h | 15 +- quic/handshake/BUCK | 6 +- quic/handshake/CryptoFactory.cpp | 36 +- quic/handshake/CryptoFactory.h | 20 +- quic/handshake/HandshakeLayer.h | 4 +- quic/handshake/TransportParameters.cpp | 34 +- quic/handshake/TransportParameters.h | 10 +- quic/handshake/test/BUCK | 2 +- quic/handshake/test/Mocks.h | 15 +- .../QuicHappyEyeballsFunctions.cpp | 38 +- .../QuicHappyEyeballsFunctions.h | 2 +- quic/logging/test/QLoggerTest.cpp | 2 +- quic/loss/BUCK | 2 +- quic/loss/QuicLossFunctions.cpp | 51 +- quic/loss/QuicLossFunctions.h | 34 +- quic/loss/test/QuicLossFunctionsTest.cpp | 262 ++-- quic/samples/echo/EchoClient.h | 16 +- quic/samples/echo/EchoHandler.h | 17 +- quic/server/QuicServer.cpp | 2 +- quic/server/QuicServerTransport.cpp | 309 ++--- quic/server/QuicServerTransport.h | 11 +- quic/server/QuicServerWorker.cpp | 10 +- quic/server/handshake/AppToken.cpp | 22 +- quic/server/handshake/AppToken.h | 4 +- quic/server/handshake/BUCK | 2 +- quic/server/handshake/ServerHandshake.cpp | 52 +- quic/server/handshake/ServerHandshake.h | 28 +- .../handshake/test/ServerHandshakeTest.cpp | 18 +- quic/server/state/ServerStateMachine.cpp | 209 +-- quic/server/state/ServerStateMachine.h | 14 +- .../test/QuicClientServerIntegrationTest.cpp | 4 +- quic/server/test/QuicServerTest.cpp | 4 +- quic/server/test/QuicServerTransportTest.cpp | 301 +++-- .../server/test/QuicServerTransportTestUtil.h | 43 +- quic/server/test/QuicSocketTest.cpp | 4 +- quic/server/test/ServerStateMachineTest.cpp | 2 +- quic/state/AckHandlers.cpp | 18 +- quic/state/AckHandlers.h | 10 +- quic/state/BUCK | 16 +- quic/state/QuicStreamFunctions.cpp | 58 +- quic/state/QuicStreamFunctions.h | 16 +- quic/state/QuicStreamManager.cpp | 160 ++- quic/state/QuicStreamManager.h | 44 +- quic/state/SimpleFrameFunctions.cpp | 36 +- quic/state/SimpleFrameFunctions.h | 4 +- quic/state/StateData.h | 3 +- quic/state/stream/StreamReceiveHandlers.cpp | 18 +- quic/state/stream/StreamReceiveHandlers.h | 5 +- quic/state/stream/StreamSendHandlers.cpp | 26 +- quic/state/stream/StreamSendHandlers.h | 8 +- quic/state/stream/StreamStateFunctions.cpp | 23 +- quic/state/stream/StreamStateFunctions.h | 4 +- quic/state/test/AckHandlersTest.cpp | 1187 ++++++++++------- quic/state/test/QuicStateFunctionsTest.cpp | 2 +- quic/state/test/QuicStreamFunctionsTest.cpp | 42 +- quic/state/test/QuicStreamManagerTest.cpp | 156 +-- quic/tools/tperf/TperfServer.cpp | 4 +- quic/xsk/BUCK | 2 +- quic/xsk/BaseXskContainer.cpp | 6 +- quic/xsk/BaseXskContainer.h | 4 +- quic/xsk/HashingXskContainer.cpp | 6 +- quic/xsk/HashingXskContainer.h | 2 +- quic/xsk/ThreadLocalXskContainer.cpp | 4 +- quic/xsk/ThreadLocalXskContainer.h | 2 +- quic/xsk/XskSender.cpp | 32 +- quic/xsk/XskSender.h | 8 +- 177 files changed, 5430 insertions(+), 4608 deletions(-) diff --git a/quic/QuicConstants.h b/quic/QuicConstants.h index c96d51de7..60d4ef5be 100644 --- a/quic/QuicConstants.h +++ b/quic/QuicConstants.h @@ -7,6 +7,14 @@ #pragma once +// Protect against Windows NO_ERROR macro that conflicts with our enums +#ifdef _WIN32 +#ifdef NO_ERROR +#define QUIC_CONSTANTS_HAD_NO_ERROR_MACRO +#undef NO_ERROR +#endif +#endif // _WIN32 + #include #include #include @@ -800,3 +808,11 @@ constexpr uint8_t kEcnCE = 0b11; constexpr uint16_t kSkipOneInNPacketSequenceNumber = 1000; constexpr uint16_t kDistanceToClearSkippedPacketNumber = 1000; } // namespace quic + +// Restore Windows NO_ERROR macro if it was previously defined +#ifdef _WIN32 +#ifdef QUIC_CONSTANTS_HAD_NO_ERROR_MACRO +#define NO_ERROR 0L +#undef QUIC_CONSTANTS_HAD_NO_ERROR_MACRO +#endif +#endif // _WIN32 diff --git a/quic/api/BUCK b/quic/api/BUCK index 71c952ed9..b544729bb 100644 --- a/quic/api/BUCK +++ b/quic/api/BUCK @@ -168,7 +168,6 @@ mvfst_cpp_library( exported_deps = [ ":ack_scheduler", ":quic_batch_writer", - "//folly:expected", "//folly/lang:assume", "//quic:constants", "//quic:exception", @@ -177,6 +176,7 @@ mvfst_cpp_library( "//quic/codec:pktbuilder", "//quic/codec:pktrebuilder", "//quic/codec:types", + "//quic/common:expected", "//quic/common/udpsocket:quic_async_udp_socket", "//quic/flowcontrol:flow_control", "//quic/handshake:transport_parameters", diff --git a/quic/api/IoBufQuicBatch.cpp b/quic/api/IoBufQuicBatch.cpp index 46c315ce2..f8209173e 100644 --- a/quic/api/IoBufQuicBatch.cpp +++ b/quic/api/IoBufQuicBatch.cpp @@ -24,7 +24,7 @@ IOBufQuicBatch::IOBufQuicBatch( statsCallback_(statsCallback), happyEyeballsState_(happyEyeballsState) {} -folly::Expected IOBufQuicBatch::write( +quic::Expected IOBufQuicBatch::write( BufPtr&& buf, size_t encodedSize) { result_.packetsSent++; @@ -34,7 +34,7 @@ folly::Expected IOBufQuicBatch::write( if (batchWriter_->needsFlush(encodedSize)) { // continue even if we get an error here auto result = flush(); - if (result.hasError()) { + if (!result.has_value()) { return result; } } @@ -48,7 +48,7 @@ folly::Expected IOBufQuicBatch::write( return true; } -folly::Expected IOBufQuicBatch::flush() { +quic::Expected IOBufQuicBatch::flush() { auto ret = flushInternal(); reset(); @@ -63,7 +63,7 @@ bool IOBufQuicBatch::isRetriableError(int err) { return err == EAGAIN || err == EWOULDBLOCK || err == ENOBUFS; } -folly::Expected IOBufQuicBatch::flushInternal() { +quic::Expected IOBufQuicBatch::flushInternal() { if (batchWriter_->empty()) { return true; } @@ -152,11 +152,11 @@ folly::Expected IOBufQuicBatch::flushInternal() { // We can get write error for any reason, close the conn only if network // is unreachable, for all others, we throw a transport exception if (isNetworkUnreachable(errno)) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( LocalErrorCode::CONNECTION_ABANDONED, fmt::format("Error on socket write {}", errorMsg))); } else { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::INTERNAL_ERROR, fmt::format("Error on socket write {}", errorMsg))); } diff --git a/quic/api/IoBufQuicBatch.h b/quic/api/IoBufQuicBatch.h index cf0dccb09..90dc28654 100644 --- a/quic/api/IoBufQuicBatch.h +++ b/quic/api/IoBufQuicBatch.h @@ -30,11 +30,11 @@ class IOBufQuicBatch { ~IOBufQuicBatch() = default; // returns true if it succeeds and false if the loop should end - [[nodiscard]] folly::Expected write( + [[nodiscard]] quic::Expected write( BufPtr&& buf, size_t encodedSize); - [[nodiscard]] folly::Expected flush(); + [[nodiscard]] quic::Expected flush(); FOLLY_ALWAYS_INLINE uint64_t getPktSent() const { return result_.packetsSent; @@ -52,7 +52,7 @@ class IOBufQuicBatch { void reset(); // flushes the internal buffers - [[nodiscard]] folly::Expected flushInternal(); + [[nodiscard]] quic::Expected flushInternal(); /** * Returns whether or not the errno can be retried later. diff --git a/quic/api/QuicAckScheduler.cpp b/quic/api/QuicAckScheduler.cpp index c80061cef..19682a155 100644 --- a/quic/api/QuicAckScheduler.cpp +++ b/quic/api/QuicAckScheduler.cpp @@ -33,7 +33,7 @@ AckScheduler::AckScheduler( const AckState& ackState) : conn_(conn), ackState_(ackState) {} -folly::Expected, QuicError> AckScheduler::writeNextAcks( +quic::Expected, QuicError> AckScheduler::writeNextAcks( PacketBuilderInterface& builder) { // Use default ack delay for long headers. Usually long headers are sent // before crypto negotiation, so the peer might not know about the ack delay @@ -62,7 +62,7 @@ folly::Expected, QuicError> AckScheduler::writeNextAcks( }; auto ackWriteResult = - [&]() -> folly::Expected, QuicError> { + [&]() -> quic::Expected, QuicError> { uint64_t peerRequestedTimestampsCount = conn_.maybePeerAckReceiveTimestampsConfig.has_value() ? conn_.maybePeerAckReceiveTimestampsConfig.value() @@ -103,8 +103,8 @@ folly::Expected, QuicError> AckScheduler::writeNextAcks( } }(); - if (ackWriteResult.hasError()) { - return folly::makeUnexpected(ackWriteResult.error()); + if (!ackWriteResult.has_value()) { + return quic::make_unexpected(ackWriteResult.error()); } if (!ackWriteResult.value()) { diff --git a/quic/api/QuicAckScheduler.h b/quic/api/QuicAckScheduler.h index 3dcb829fa..8db277f5a 100644 --- a/quic/api/QuicAckScheduler.h +++ b/quic/api/QuicAckScheduler.h @@ -16,7 +16,7 @@ class AckScheduler { public: AckScheduler(const QuicConnectionStateBase& conn, const AckState& ackState); - [[nodiscard]] folly::Expected, QuicError> writeNextAcks( + [[nodiscard]] quic::Expected, QuicError> writeNextAcks( PacketBuilderInterface& builder); [[nodiscard]] bool hasPendingAcks() const; diff --git a/quic/api/QuicPacketScheduler.cpp b/quic/api/QuicPacketScheduler.cpp index 7bf34dabe..2cbbcc354 100644 --- a/quic/api/QuicPacketScheduler.cpp +++ b/quic/api/QuicPacketScheduler.cpp @@ -218,7 +218,7 @@ FrameScheduler::FrameScheduler( QuicConnectionStateBase& conn) : name_(name), conn_(conn) {} -folly::Expected +quic::Expected FrameScheduler::scheduleFramesForPacket( PacketBuilderInterface&& builder, uint32_t writableBytes) { @@ -228,16 +228,16 @@ FrameScheduler::scheduleFramesForPacket( bool initialPacket = longHeader && longHeader->getHeaderType() == LongHeader::Types::Initial; auto encodeRes = builder.encodePacketHeader(); - if (encodeRes.hasError()) { - return folly::makeUnexpected(encodeRes.error()); + if (!encodeRes.has_value()) { + return quic::make_unexpected(encodeRes.error()); } // Add fixed padding at start of short header packets if configured if (shortHeader && conn_.transportSettings.fixedShortHeaderPadding > 0) { for (size_t i = 0; i < conn_.transportSettings.fixedShortHeaderPadding; i++) { auto writeRes = writeFrame(PaddingFrame(), builder); - if (writeRes.hasError()) { - return folly::makeUnexpected(writeRes.error()); + if (!writeRes.has_value()) { + return quic::make_unexpected(writeRes.error()); } } shortHeaderPadding = conn_.transportSettings.fixedShortHeaderPadding; @@ -253,15 +253,15 @@ FrameScheduler::scheduleFramesForPacket( bool rstWritten = false; if (cryptoStreamScheduler_ && cryptoStreamScheduler_->hasData()) { auto cryptoDataRes = cryptoStreamScheduler_->writeCryptoData(wrapper); - if (cryptoDataRes.hasError()) { - return folly::makeUnexpected(cryptoDataRes.error()); + if (!cryptoDataRes.has_value()) { + return quic::make_unexpected(cryptoDataRes.error()); } cryptoDataWritten = cryptoDataRes.value(); } if (rstScheduler_ && rstScheduler_->hasPendingRsts()) { auto rstWrittenRes = rstScheduler_->writeRsts(wrapper); - if (rstWrittenRes.hasError()) { - return folly::makeUnexpected(rstWrittenRes.error()); + if (!rstWrittenRes.has_value()) { + return quic::make_unexpected(rstWrittenRes.error()); } rstWritten = rstWrittenRes.value(); } @@ -271,8 +271,8 @@ FrameScheduler::scheduleFramesForPacket( // If packet has non ack data, it is subject to congestion control. We // need to use the wrapper/ auto writeAcksRes = ackScheduler_->writeNextAcks(wrapper); - if (writeAcksRes.hasError()) { - return folly::makeUnexpected(writeAcksRes.error()); + if (!writeAcksRes.has_value()) { + return quic::make_unexpected(writeAcksRes.error()); } } else { // If we start with writing acks, we will let the ack scheduler write @@ -281,8 +281,8 @@ FrameScheduler::scheduleFramesForPacket( // controller. Otherwise, we will give other schedulers an opportunity to // write up to writable bytes. auto writeAcksRes = ackScheduler_->writeNextAcks(builder); - if (writeAcksRes.hasError()) { - return folly::makeUnexpected(writeAcksRes.error()); + if (!writeAcksRes.has_value()) { + return quic::make_unexpected(writeAcksRes.error()); } } } @@ -296,14 +296,14 @@ FrameScheduler::scheduleFramesForPacket( if (windowUpdateScheduler_ && windowUpdateScheduler_->hasPendingWindowUpdates()) { auto result = windowUpdateScheduler_->writeWindowUpdates(wrapper); - if (result.hasError()) { - return folly::makeUnexpected(result.error()); + if (!result.has_value()) { + return quic::make_unexpected(result.error()); } } if (blockedScheduler_ && blockedScheduler_->hasPendingBlockedFrames()) { auto result = blockedScheduler_->writeBlockedFrames(wrapper); - if (result.hasError()) { - return folly::makeUnexpected(result.error()); + if (!result.has_value()) { + return quic::make_unexpected(result.error()); } } // Simple frames should be scheduled before stream frames and retx frames @@ -320,15 +320,15 @@ FrameScheduler::scheduleFramesForPacket( } if (streamFrameScheduler_ && streamFrameScheduler_->hasPendingData()) { auto result = streamFrameScheduler_->writeStreams(wrapper); - if (result.hasError()) { - return folly::makeUnexpected(result.error()); + if (!result.has_value()) { + return quic::make_unexpected(result.error()); } } if (datagramFrameScheduler_ && datagramFrameScheduler_->hasPendingDatagramFrames()) { auto datagramRes = datagramFrameScheduler_->writeDatagramFrames(wrapper); - if (datagramRes.hasError()) { - return folly::makeUnexpected(datagramRes.error()); + if (!datagramRes.has_value()) { + return quic::make_unexpected(datagramRes.error()); } } @@ -337,8 +337,8 @@ FrameScheduler::scheduleFramesForPacket( // This is the initial packet, we need to fill er up. while (builder.remainingSpaceInPkt() > 0) { auto writeRes = writeFrame(PaddingFrame(), builder); - if (writeRes.hasError()) { - return folly::makeUnexpected(writeRes.error()); + if (!writeRes.has_value()) { + return quic::make_unexpected(writeRes.error()); } } } @@ -348,8 +348,8 @@ FrameScheduler::scheduleFramesForPacket( size_t paddingIncrement = wrapper.remainingSpaceInPkt() % paddingModulo; for (size_t i = 0; i < paddingIncrement; i++) { auto writeRes = writeFrame(PaddingFrame(), builder); - if (writeRes.hasError()) { - return folly::makeUnexpected(writeRes.error()); + if (!writeRes.has_value()) { + return quic::make_unexpected(writeRes.error()); } } shortHeaderPadding += paddingIncrement; @@ -389,7 +389,7 @@ folly::StringPiece FrameScheduler::name() const { return name_; } -folly::Expected StreamFrameScheduler::writeStreamLossBuffers( +quic::Expected StreamFrameScheduler::writeStreamLossBuffers( PacketBuilderInterface& builder, QuicStreamState& stream) { bool wroteStreamFrame = false; @@ -406,8 +406,8 @@ folly::Expected StreamFrameScheduler::writeStreamLossBuffers( buffer->eof, std::nullopt /* skipLenHint */, stream.groupId); - if (res.hasError()) { - return folly::makeUnexpected(res.error()); + if (!res.has_value()) { + return quic::make_unexpected(res.error()); } auto dataLen = *res; if (dataLen) { @@ -428,7 +428,7 @@ folly::Expected StreamFrameScheduler::writeStreamLossBuffers( StreamFrameScheduler::StreamFrameScheduler(QuicConnectionStateBase& conn) : conn_(conn) {} -folly::Expected +quic::Expected StreamFrameScheduler::writeSingleStream( PacketBuilderInterface& builder, QuicStreamState& stream, @@ -436,8 +436,8 @@ StreamFrameScheduler::writeSingleStream( StreamWriteResult result = StreamWriteResult::NOT_LIMITED; if (!stream.lossBuffer.empty()) { auto writeResult = writeStreamLossBuffers(builder, stream); - if (writeResult.hasError()) { - return folly::makeUnexpected(writeResult.error()); + if (!writeResult.has_value()) { + return quic::make_unexpected(writeResult.error()); } if (!writeResult.value()) { return StreamWriteResult::PACKET_FULL; @@ -446,8 +446,8 @@ StreamFrameScheduler::writeSingleStream( if (stream.hasWritableData(true)) { if (connWritableBytes > 0 || stream.hasWritableData(false)) { auto writeResult = writeStreamFrame(builder, stream, connWritableBytes); - if (writeResult.hasError()) { - return folly::makeUnexpected(writeResult.error()); + if (!writeResult.has_value()) { + return quic::make_unexpected(writeResult.error()); } if (!writeResult.value()) { return StreamWriteResult::PACKET_FULL; @@ -461,7 +461,7 @@ StreamFrameScheduler::writeSingleStream( return result; } -folly::Expected StreamFrameScheduler::writeStreamsHelper( +quic::Expected StreamFrameScheduler::writeStreamsHelper( PacketBuilderInterface& builder, const std::set& writableStreams, StreamId nextScheduledStream, @@ -477,8 +477,8 @@ folly::Expected StreamFrameScheduler::writeStreamsHelper( auto stream = conn_.streamManager->findStream(*writableStreamItr); CHECK(stream); auto writeResult = writeSingleStream(builder, *stream, connWritableBytes); - if (writeResult.hasError()) { - return folly::makeUnexpected(writeResult.error()); + if (!writeResult.has_value()) { + return quic::make_unexpected(writeResult.error()); } if (writeResult.value() == StreamWriteResult::PACKET_FULL) { break; @@ -491,8 +491,7 @@ folly::Expected StreamFrameScheduler::writeStreamsHelper( return *writableStreamItr; } -folly::Expected -StreamFrameScheduler::writeStreamsHelper( +quic::Expected StreamFrameScheduler::writeStreamsHelper( PacketBuilderInterface& builder, deprecated::PriorityQueue& writableStreams, uint64_t& connWritableBytes, @@ -513,13 +512,13 @@ StreamFrameScheduler::writeStreamsHelper( auto stream = CHECK_NOTNULL(conn_.streamManager->findStream(streamId)); if (!stream->hasSchedulableData() && stream->hasSchedulableDsr()) { // We hit a DSR stream - return folly::unit; + return {}; } CHECK(stream) << "streamId=" << streamId << "inc=" << uint64_t(level.incremental); auto writeResult = writeSingleStream(builder, *stream, connWritableBytes); - if (writeResult.hasError()) { - return folly::makeUnexpected(writeResult.error()); + if (!writeResult.has_value()) { + return quic::make_unexpected(writeResult.error()); } if (writeResult.value() == StreamWriteResult::PACKET_FULL) { break; @@ -531,15 +530,14 @@ StreamFrameScheduler::writeStreamsHelper( bool forceNext = remainingSpaceAfter > 0; level.iterator->next(forceNext); if (streamPerPacket) { - return folly::unit; + return {}; } } while (!level.iterator->end()); } - return folly::unit; + return {}; } -folly::Expected -StreamFrameScheduler::writeStreamsHelper( +quic::Expected StreamFrameScheduler::writeStreamsHelper( PacketBuilderInterface& builder, PriorityQueue& writableStreams, uint64_t& connWritableBytes, @@ -558,14 +556,14 @@ StreamFrameScheduler::writeStreamsHelper( auto stream = CHECK_NOTNULL(conn_.streamManager->findStream(streamId)); if (!stream->hasSchedulableData() && stream->hasSchedulableDsr()) { // We hit a DSR stream - return folly::unit; + return {}; } CHECK(stream) << "streamId=" << streamId; // TODO: this is counting STREAM frame overhead against the stream itself auto lastWriteBytes = builder.remainingSpaceInPkt(); auto writeResult = writeSingleStream(builder, *stream, connWritableBytes); - if (writeResult.hasError()) { - return folly::makeUnexpected(writeResult.error()); + if (!writeResult.has_value()) { + return quic::make_unexpected(writeResult.error()); } if (writeResult.value() == StreamWriteResult::PACKET_FULL) { break; @@ -585,13 +583,13 @@ StreamFrameScheduler::writeStreamsHelper( writableStreams.consume(lastWriteBytes); } if (streamPerPacket) { - return folly::unit; + return {}; } } - return folly::unit; + return {}; } -folly::Expected StreamFrameScheduler::writeStreams( +quic::Expected StreamFrameScheduler::writeStreams( PacketBuilderInterface& builder) { DCHECK(conn_.streamManager->hasWritable()); uint64_t connWritableBytes = getSendConnFlowControlBytesWire(conn_); @@ -604,8 +602,8 @@ folly::Expected StreamFrameScheduler::writeStreams( conn_.schedulingState.nextScheduledControlStream, connWritableBytes, conn_.transportSettings.streamFramePerPacket); - if (result.hasError()) { - return folly::makeUnexpected(result.error()); + if (!result.has_value()) { + return quic::make_unexpected(result.error()); } conn_.schedulingState.nextScheduledControlStream = result.value(); } @@ -618,8 +616,8 @@ folly::Expected StreamFrameScheduler::writeStreams( *oldWriteQueue, connWritableBytes, conn_.transportSettings.streamFramePerPacket); - if (result.hasError()) { - return folly::makeUnexpected(result.error()); + if (!result.has_value()) { + return quic::make_unexpected(result.error()); } auto streamId = oldWriteQueue->getNextScheduledStream(); nextStream = conn_.streamManager->findStream(streamId); @@ -632,8 +630,8 @@ folly::Expected StreamFrameScheduler::writeStreams( writeQueue, connWritableBytes, conn_.transportSettings.streamFramePerPacket); - if (result.hasError()) { - return folly::makeUnexpected(result.error()); + if (!result.has_value()) { + return quic::make_unexpected(result.error()); } if (!writeQueue.empty()) { auto id = writeQueue.peekNextScheduledID(); @@ -650,7 +648,7 @@ folly::Expected StreamFrameScheduler::writeStreams( if (nextStream && !nextStream->hasSchedulableData()) { nextStreamDsr_ = true; } - return folly::unit; + return {}; } bool StreamFrameScheduler::hasPendingData() const { @@ -660,7 +658,7 @@ bool StreamFrameScheduler::hasPendingData() const { getSendConnFlowControlBytesWire(conn_) > 0)); } -folly::Expected StreamFrameScheduler::writeStreamFrame( +quic::Expected StreamFrameScheduler::writeStreamFrame( PacketBuilderInterface& builder, QuicStreamState& stream, uint64_t& connWritableBytes) { @@ -688,8 +686,8 @@ folly::Expected StreamFrameScheduler::writeStreamFrame( canWriteFin, std::nullopt /* skipLenHint */, stream.groupId); - if (res.hasError()) { - return folly::makeUnexpected(res.error()); + if (!res.has_value()) { + return quic::make_unexpected(res.error()); } auto dataLen = *res; if (!dataLen) { @@ -712,7 +710,7 @@ bool RstStreamScheduler::hasPendingRsts() const { return !conn_.pendingEvents.resets.empty(); } -folly::Expected RstStreamScheduler::writeRsts( +quic::Expected RstStreamScheduler::writeRsts( PacketBuilderInterface& builder) { bool rstWritten = false; for (const auto& resetStream : conn_.pendingEvents.resets) { @@ -729,8 +727,8 @@ folly::Expected RstStreamScheduler::writeRsts( // it in this implementation because it dramatically simplifies flow // control accounting. auto bytesWrittenResult = writeFrame(resetStream.second, builder); - if (bytesWrittenResult.hasError()) { - return folly::makeUnexpected(bytesWrittenResult.error()); + if (!bytesWrittenResult.has_value()) { + return quic::make_unexpected(bytesWrittenResult.error()); } if (!bytesWrittenResult.value()) { break; @@ -777,7 +775,7 @@ bool PingFrameScheduler::hasPingFrame() const { bool PingFrameScheduler::writePing(PacketBuilderInterface& builder) { auto writeFrameResult = writeFrame(PingFrame(), builder); // We shouldn't ever error on a PING. - CHECK(!writeFrameResult.hasError()); + CHECK(writeFrameResult.has_value()); return writeFrameResult.value() != 0; } @@ -788,7 +786,7 @@ bool DatagramFrameScheduler::hasPendingDatagramFrames() const { return !conn_.datagramState.writeBuffer.empty(); } -folly::Expected DatagramFrameScheduler::writeDatagramFrames( +quic::Expected DatagramFrameScheduler::writeDatagramFrames( PacketBuilderInterface& builder) { bool sent = false; for (size_t i = 0; i <= conn_.datagramState.writeBuffer.size(); ++i) { @@ -797,21 +795,21 @@ folly::Expected DatagramFrameScheduler::writeDatagramFrames( uint64_t spaceLeft = builder.remainingSpaceInPkt(); QuicInteger frameTypeQuicInt(static_cast(FrameType::DATAGRAM_LEN)); auto frameTypeSize = frameTypeQuicInt.getSize(); - if (frameTypeSize.hasError()) { - return folly::makeUnexpected(frameTypeSize.error()); + if (!frameTypeSize.has_value()) { + return quic::make_unexpected(frameTypeSize.error()); } QuicInteger datagramLenInt(len); auto datagramLenSize = datagramLenInt.getSize(); - if (datagramLenSize.hasError()) { - return folly::makeUnexpected(datagramLenSize.error()); + if (!datagramLenSize.has_value()) { + return quic::make_unexpected(datagramLenSize.error()); } uint64_t datagramFrameLength = frameTypeSize.value() + len + datagramLenSize.value(); if (datagramFrameLength <= spaceLeft) { auto datagramFrame = DatagramFrame(len, payload.move()); auto res = writeFrame(datagramFrame, builder); - if (res.hasError()) { - return folly::makeUnexpected(res.error()); + if (!res.has_value()) { + return quic::make_unexpected(res.error()); } // Must always succeed since we have already checked that there is enough // space to write the frame @@ -836,14 +834,14 @@ bool WindowUpdateScheduler::hasPendingWindowUpdates() const { conn_.pendingEvents.connWindowUpdate; } -folly::Expected -WindowUpdateScheduler::writeWindowUpdates(PacketBuilderInterface& builder) { +quic::Expected WindowUpdateScheduler::writeWindowUpdates( + PacketBuilderInterface& builder) { if (conn_.pendingEvents.connWindowUpdate) { auto maxDataFrame = generateMaxDataFrame(conn_); auto maximumData = maxDataFrame.maximumData; auto bytesResult = writeFrame(std::move(maxDataFrame), builder); - if (bytesResult.hasError()) { - return folly::makeUnexpected(bytesResult.error()); + if (!bytesResult.has_value()) { + return quic::make_unexpected(bytesResult.error()); } if (bytesResult.value()) { VLOG(4) << "Wrote max_data=" << maximumData << " " << conn_; @@ -857,8 +855,8 @@ WindowUpdateScheduler::writeWindowUpdates(PacketBuilderInterface& builder) { auto maxStreamDataFrame = generateMaxStreamDataFrame(*stream); auto maximumData = maxStreamDataFrame.maximumData; auto bytesResult = writeFrame(std::move(maxStreamDataFrame), builder); - if (bytesResult.hasError()) { - return folly::makeUnexpected(bytesResult.error()); + if (!bytesResult.has_value()) { + return quic::make_unexpected(bytesResult.error()); } if (!bytesResult.value()) { break; @@ -866,7 +864,7 @@ WindowUpdateScheduler::writeWindowUpdates(PacketBuilderInterface& builder) { VLOG(4) << "Wrote max_stream_data stream=" << stream->id << " maximumData=" << maximumData << " " << conn_; } - return folly::unit; + return {}; } BlockedScheduler::BlockedScheduler(const QuicConnectionStateBase& conn) @@ -877,33 +875,33 @@ bool BlockedScheduler::hasPendingBlockedFrames() const { conn_.pendingEvents.sendDataBlocked; } -folly::Expected BlockedScheduler::writeBlockedFrames( +quic::Expected BlockedScheduler::writeBlockedFrames( PacketBuilderInterface& builder) { if (conn_.pendingEvents.sendDataBlocked) { // Connection is write blocked due to connection level flow control. DataBlockedFrame blockedFrame( conn_.flowControlState.peerAdvertisedMaxOffset); auto result = writeFrame(blockedFrame, builder); - if (result.hasError()) { - return folly::makeUnexpected(result.error()); + if (!result.has_value()) { + return quic::make_unexpected(result.error()); } if (!result.value()) { // If there is not enough room to write data blocked frame in the // current packet, we won't be able to write stream blocked frames either // so just return. - return folly::unit; + return {}; } } for (const auto& blockedStream : conn_.streamManager->blockedStreams()) { auto bytesWrittenResult = writeFrame(blockedStream.second, builder); - if (bytesWrittenResult.hasError()) { - return folly::makeUnexpected(bytesWrittenResult.error()); + if (!bytesWrittenResult.has_value()) { + return quic::make_unexpected(bytesWrittenResult.error()); } if (!bytesWrittenResult.value()) { break; } } - return folly::unit; + return {}; } CryptoStreamScheduler::CryptoStreamScheduler( @@ -911,7 +909,7 @@ CryptoStreamScheduler::CryptoStreamScheduler( const QuicCryptoStream& cryptoStream) : conn_(conn), cryptoStream_(cryptoStream) {} -folly::Expected CryptoStreamScheduler::writeCryptoData( +quic::Expected CryptoStreamScheduler::writeCryptoData( PacketBuilderInterface& builder) { bool cryptoDataWritten = false; uint64_t writableData = cryptoStream_.pendingWrites.chainLength(); @@ -920,8 +918,8 @@ folly::Expected CryptoStreamScheduler::writeCryptoData( // will always take precedence over the crypto data. for (const auto& buffer : cryptoStream_.lossBuffer) { auto res = writeCryptoFrame(buffer.offset, buffer.data, builder); - if (res.hasError()) { - return folly::makeUnexpected(res.error()); + if (!res.has_value()) { + return quic::make_unexpected(res.error()); } if (!res.value()) { return cryptoDataWritten; @@ -934,8 +932,8 @@ folly::Expected CryptoStreamScheduler::writeCryptoData( if (writableData != 0) { auto res = writeCryptoFrame( cryptoStream_.currentWriteOffset, cryptoStream_.pendingWrites, builder); - if (res.hasError()) { - return folly::makeUnexpected(res.error()); + if (!res.has_value()) { + return quic::make_unexpected(res.error()); } if (res.value()) { VLOG(4) << "Wrote crypto frame" @@ -964,7 +962,7 @@ bool ImmediateAckFrameScheduler::writeImmediateAckFrame( PacketBuilderInterface& builder) { auto result = writeFrame(ImmediateAckFrame(), builder); // We shouldn't ever error on an IMMEDIATE_ACK. - CHECK(!result.hasError()); + CHECK(result.has_value()); return result.value() != 0; } @@ -983,7 +981,7 @@ bool CloningScheduler::hasData() const { conn_.outstandings.numOutstanding() > conn_.outstandings.dsrCount; } -folly::Expected +quic::Expected CloningScheduler::scheduleFramesForPacket( PacketBuilderInterface&& builder, uint32_t writableBytes) { @@ -1078,8 +1076,8 @@ CloningScheduler::scheduleFramesForPacket( internalBuilder->accountForCipherOverhead(cipherOverhead_); auto encodeRes = internalBuilder->encodePacketHeader(); - if (encodeRes.hasError()) { - return folly::makeUnexpected(encodeRes.error()); + if (!encodeRes.has_value()) { + return quic::make_unexpected(encodeRes.error()); } PacketRebuilder rebuilder(*internalBuilder, conn_); @@ -1094,8 +1092,8 @@ CloningScheduler::scheduleFramesForPacket( // Rebuilder will write the rest of frames auto rebuildResultExpected = rebuilder.rebuildFromPacket(outstandingPacket); - if (rebuildResultExpected.hasError()) { - return folly::makeUnexpected(rebuildResultExpected.error()); + if (!rebuildResultExpected.has_value()) { + return quic::make_unexpected(rebuildResultExpected.error()); } if (rebuildResultExpected.value()) { return SchedulingResult( diff --git a/quic/api/QuicPacketScheduler.h b/quic/api/QuicPacketScheduler.h index 6907e95d2..a7c49e212 100644 --- a/quic/api/QuicPacketScheduler.h +++ b/quic/api/QuicPacketScheduler.h @@ -53,7 +53,7 @@ class QuicPacketScheduler { * packet is a clone and the associated ClonedPacketIdentifier for both origin * and clone. */ - [[nodiscard]] virtual folly::Expected + [[nodiscard]] virtual quic::Expected scheduleFramesForPacket( PacketBuilderInterface&& builder, uint32_t writableBytes) = 0; @@ -77,14 +77,14 @@ class StreamFrameScheduler { * Return: the first boolean indicates if at least one Blocked frame * is written into the packet by writeStreams function. */ - [[nodiscard]] folly::Expected writeStreams( + [[nodiscard]] quic::Expected writeStreams( PacketBuilderInterface& builder); bool hasPendingData() const; private: // Return true if this stream wrote some data - [[nodiscard]] folly::Expected writeStreamLossBuffers( + [[nodiscard]] quic::Expected writeStreamLossBuffers( PacketBuilderInterface& builder, QuicStreamState& stream); @@ -101,25 +101,25 @@ class StreamFrameScheduler { * flow control limited, or not limited by connection flow control. */ enum class StreamWriteResult { PACKET_FULL, NOT_LIMITED, CONN_FC_LIMITED }; - [[nodiscard]] folly::Expected writeSingleStream( + [[nodiscard]] quic::Expected writeSingleStream( PacketBuilderInterface& builder, QuicStreamState& stream, uint64_t& connWritableBytes); - [[nodiscard]] folly::Expected writeStreamsHelper( + [[nodiscard]] quic::Expected writeStreamsHelper( PacketBuilderInterface& builder, const std::set& writableStreams, StreamId nextScheduledStream, uint64_t& connWritableBytes, bool streamPerPacket); - [[nodiscard]] folly::Expected writeStreamsHelper( + [[nodiscard]] quic::Expected writeStreamsHelper( PacketBuilderInterface& builder, deprecated::PriorityQueue& writableStreams, uint64_t& connWritableBytes, bool streamPerPacket); - [[nodiscard]] folly::Expected writeStreamsHelper( + [[nodiscard]] quic::Expected writeStreamsHelper( PacketBuilderInterface& builder, PriorityQueue& writableStreams, uint64_t& connWritableBytes, @@ -131,7 +131,7 @@ class StreamFrameScheduler { * * Return: A boolean indicates if write is successful. */ - [[nodiscard]] folly::Expected writeStreamFrame( + [[nodiscard]] quic::Expected writeStreamFrame( PacketBuilderInterface& builder, QuicStreamState& stream, uint64_t& connWritableBytes); @@ -146,7 +146,7 @@ class RstStreamScheduler { bool hasPendingRsts() const; - [[nodiscard]] folly::Expected writeRsts( + [[nodiscard]] quic::Expected writeRsts( PacketBuilderInterface& builder); private: @@ -187,7 +187,7 @@ class DatagramFrameScheduler { [[nodiscard]] bool hasPendingDatagramFrames() const; - [[nodiscard]] folly::Expected writeDatagramFrames( + [[nodiscard]] quic::Expected writeDatagramFrames( PacketBuilderInterface& builder); private: @@ -200,7 +200,7 @@ class WindowUpdateScheduler { bool hasPendingWindowUpdates() const; - [[nodiscard]] folly::Expected writeWindowUpdates( + [[nodiscard]] quic::Expected writeWindowUpdates( PacketBuilderInterface& builder); private: @@ -213,7 +213,7 @@ class BlockedScheduler { bool hasPendingBlockedFrames() const; - [[nodiscard]] folly::Expected writeBlockedFrames( + [[nodiscard]] quic::Expected writeBlockedFrames( PacketBuilderInterface& builder); private: @@ -229,7 +229,7 @@ class CryptoStreamScheduler { /** * Returns whether or we could write data to the stream. */ - [[nodiscard]] folly::Expected writeCryptoData( + [[nodiscard]] quic::Expected writeCryptoData( PacketBuilderInterface& builder); bool hasData() const; @@ -300,7 +300,7 @@ class FrameScheduler : public QuicPacketScheduler { FrameScheduler(folly::StringPiece name, QuicConnectionStateBase& conn); - [[nodiscard]] folly::Expected + [[nodiscard]] quic::Expected scheduleFramesForPacket( PacketBuilderInterface&& builder, uint32_t writableBytes) override; @@ -356,7 +356,7 @@ class CloningScheduler : public QuicPacketScheduler { * packet is a clone and the associated ClonedPacketIdentifier for both origin * and clone. */ - [[nodiscard]] folly::Expected + [[nodiscard]] quic::Expected scheduleFramesForPacket( PacketBuilderInterface&& builder, uint32_t writableBytes) override; diff --git a/quic/api/QuicSocket.h b/quic/api/QuicSocket.h index 8257f2a3d..58cccc200 100644 --- a/quic/api/QuicSocket.h +++ b/quic/api/QuicSocket.h @@ -115,48 +115,49 @@ class QuicSocket : virtual public QuicSocketLite { * Returns the current offset already read or written by the application on * the given stream. */ - virtual folly::Expected getStreamReadOffset( + virtual quic::Expected getStreamReadOffset( StreamId id) const = 0; - virtual folly::Expected getStreamWriteOffset( + virtual quic::Expected getStreamWriteOffset( StreamId id) const = 0; /** * Returns the amount of data buffered by the transport waiting to be written */ - virtual folly::Expected getStreamWriteBufferedBytes( + virtual quic::Expected getStreamWriteBufferedBytes( StreamId id) const = 0; /** * Returns the current flow control windows for the connection. * Use getStreamFlowControl for stream flow control window. */ - virtual folly::Expected + virtual quic::Expected getConnectionFlowControl() const = 0; /** * Returns the minimum of current send flow control window and available * buffer space. */ - virtual folly::Expected getMaxWritableOnStream( + virtual quic::Expected getMaxWritableOnStream( StreamId id) const = 0; /** * Sets the flow control window for the connection. * Use setStreamFlowControlWindow for per Stream flow control. */ - virtual folly::Expected - setConnectionFlowControlWindow(uint64_t windowSize) = 0; + virtual quic::Expected setConnectionFlowControlWindow( + uint64_t windowSize) = 0; /** * Sets the flow control window for the stream. * Use setConnectionFlowControlWindow for connection flow control. */ - virtual folly::Expected - setStreamFlowControlWindow(StreamId id, uint64_t windowSize) = 0; + virtual quic::Expected setStreamFlowControlWindow( + StreamId id, + uint64_t windowSize) = 0; /** * Get stream priority. */ - virtual folly::Expected + virtual quic::Expected getStreamPriority(StreamId id) = 0; /** @@ -179,10 +180,8 @@ class QuicSocket : virtual public QuicSocketLite { /** * Pause/Resume read callback being triggered when data is available. */ - virtual folly::Expected pauseRead( - StreamId id) = 0; - virtual folly::Expected resumeRead( - StreamId id) = 0; + virtual quic::Expected pauseRead(StreamId id) = 0; + virtual quic::Expected resumeRead(StreamId id) = 0; /** * ===== Peek/Consume API ===== @@ -207,17 +206,15 @@ class QuicSocket : virtual public QuicSocketLite { * }; */ - virtual folly::Expected setPeekCallback( + virtual quic::Expected setPeekCallback( StreamId id, PeekCallback* cb) = 0; /** * Pause/Resume peek callback being triggered when data is available. */ - virtual folly::Expected pausePeek( - StreamId id) = 0; - virtual folly::Expected resumePeek( - StreamId id) = 0; + virtual quic::Expected pausePeek(StreamId id) = 0; + virtual quic::Expected resumePeek(StreamId id) = 0; /** * Peek at the given stream. @@ -233,7 +230,7 @@ class QuicSocket : virtual public QuicSocketLite { * Calling peek() when there is no data/eof to deliver will return an * EAGAIN-like error code. */ - virtual folly::Expected peek( + virtual quic::Expected peek( StreamId id, const std::function&)>& peekCallback) = 0; @@ -252,39 +249,38 @@ class QuicSocket : virtual public QuicSocketLite { * will return an EAGAIN-like error code. * */ - virtual folly:: - Expected>> - consume(StreamId id, uint64_t offset, size_t amount) = 0; + virtual quic::Expected>> + consume(StreamId id, uint64_t offset, size_t amount) = 0; /** * Equivalent of calling consume(id, stream->currentReadOffset, amount); */ - virtual folly::Expected consume( + virtual quic::Expected consume( StreamId id, size_t amount) = 0; /** * Create a bidirectional stream group. */ - virtual folly::Expected + virtual quic::Expected createBidirectionalStreamGroup() = 0; /** * Create a unidirectional stream group. */ - virtual folly::Expected + virtual quic::Expected createUnidirectionalStreamGroup() = 0; /** * Same as createBidirectionalStream(), but creates a stream in a group. */ - virtual folly::Expected + virtual quic::Expected createBidirectionalStreamInGroup(StreamGroupId groupId) = 0; /** * Same as createBidirectionalStream(), but creates a stream in a group. */ - virtual folly::Expected + virtual quic::Expected createUnidirectionalStreamInGroup(StreamGroupId groupId) = 0; /** @@ -315,7 +311,7 @@ class QuicSocket : virtual public QuicSocketLite { * be invoked for anything. If the registration succeeds, the callback is * guaranteed to receive an onByteEventRegistered() notification. */ - virtual folly::Expected registerTxCallback( + virtual quic::Expected registerTxCallback( const StreamId id, const uint64_t offset, ByteEventCallback* cb) = 0; @@ -336,13 +332,14 @@ class QuicSocket : virtual public QuicSocketLite { * Returns true if the error was an ApplicationErrorCode, and the stream was * reset. */ - virtual folly::Expected - maybeResetStreamFromReadError(StreamId id, QuicErrorCode error) = 0; + virtual quic::Expected maybeResetStreamFromReadError( + StreamId id, + QuicErrorCode error) = 0; /** * Set the ping callback */ - virtual folly::Expected setPingCallback( + virtual quic::Expected setPingCallback( PingCallback* cb) = 0; /** @@ -387,7 +384,7 @@ class QuicSocket : virtual public QuicSocketLite { /** * Set the read callback for Datagrams */ - virtual folly::Expected setDatagramCallback( + virtual quic::Expected setDatagramCallback( DatagramCallback* cb) = 0; /** @@ -407,20 +404,20 @@ class QuicSocket : virtual public QuicSocketLite { * Returns the currently available received Datagrams. * Returns all datagrams if atMost is 0. */ - virtual folly::Expected, LocalErrorCode> + virtual quic::Expected, LocalErrorCode> readDatagrams(size_t atMost = 0) = 0; /** * Returns the currently available received Datagram IOBufs. * Returns all datagrams if atMost is 0. */ - virtual folly::Expected, LocalErrorCode> readDatagramBufs( + virtual quic::Expected, LocalErrorCode> readDatagramBufs( size_t atMost = 0) = 0; /** * Sets a retransmission policy on a stream group. */ - virtual folly::Expected + virtual quic::Expected setStreamGroupRetransmissionPolicy( StreamGroupId groupId, std::optional policy) noexcept = 0; diff --git a/quic/api/QuicSocketLite.h b/quic/api/QuicSocketLite.h index 5b5c5cb1a..dd4eaea08 100644 --- a/quic/api/QuicSocketLite.h +++ b/quic/api/QuicSocketLite.h @@ -303,7 +303,7 @@ class QuicSocketLite { * If replaySafe is false, the transport will buffer (up to the send buffer * limits) any writes on this stream until the transport is replay safe. */ - virtual folly::Expected createBidirectionalStream( + virtual quic::Expected createBidirectionalStream( bool replaySafe = true) = 0; /** @@ -313,7 +313,7 @@ class QuicSocketLite { * If replaySafe is false, the transport will buffer (up to the send buffer * limits) any writes on this stream until the transport is replay safe. */ - virtual folly::Expected createUnidirectionalStream( + virtual quic::Expected createUnidirectionalStream( bool replaySafe = true) = 0; /** @@ -356,7 +356,7 @@ class QuicSocketLite { * Calling read() when there is no data/eof to deliver will return an * EAGAIN-like error code. */ - virtual folly::Expected, LocalErrorCode> read( + virtual quic::Expected, LocalErrorCode> read( StreamId id, size_t maxLen) = 0; @@ -374,7 +374,7 @@ class QuicSocketLite { * Users should remove the callback via setReadCallback(id, nullptr) after * reading an error or eof to allow streams to be reaped by the transport. */ - virtual folly::Expected setReadCallback( + virtual quic::Expected setReadCallback( StreamId id, ReadCallback* cb, Optional err = @@ -497,8 +497,7 @@ class QuicSocketLite { * be invoked for anything. If the registration succeeds, the callback is * guaranteed to receive an onByteEventRegistered() notification. */ - virtual folly::Expected - registerByteEventCallback( + virtual quic::Expected registerByteEventCallback( const ByteEvent::Type type, const StreamId id, const uint64_t offset, @@ -561,7 +560,7 @@ class QuicSocketLite { * * An error code is present if there was an error with the write. */ - using WriteResult = folly::Expected; + using WriteResult = quic::Expected; virtual WriteResult writeChain( StreamId id, BufPtr data, @@ -593,7 +592,7 @@ class QuicSocketLite { * Register a callback to be invoked when the peer has acknowledged the * given offset on the given stream. */ - virtual folly::Expected registerDeliveryCallback( + virtual quic::Expected registerDeliveryCallback( StreamId id, uint64_t offset, ByteEventCallback* cb) = 0; @@ -603,19 +602,20 @@ class QuicSocketLite { * An app shouldn't mix connection and stream calls to this API * Use this if the app wants to do prioritization. */ - virtual folly::Expected - notifyPendingWriteOnConnection(ConnectionWriteCallback* wcb) = 0; + virtual quic::Expected notifyPendingWriteOnConnection( + ConnectionWriteCallback* wcb) = 0; /** * Inform the transport that there is data to write on a given stream. * An app shouldn't mix connection and stream calls to this API * Use the Connection call if the app wants to do prioritization. */ - virtual folly::Expected - notifyPendingWriteOnStream(StreamId id, StreamWriteCallback* wcb) = 0; + virtual quic::Expected notifyPendingWriteOnStream( + StreamId id, + StreamWriteCallback* wcb) = 0; - virtual folly::Expected - unregisterStreamWriteCallback(StreamId) = 0; + virtual quic::Expected unregisterStreamWriteCallback( + StreamId) = 0; /** * Application can invoke this function to signal the transport to @@ -629,7 +629,7 @@ class QuicSocketLite { /** * Cancel the given stream */ - virtual folly::Expected resetStream( + virtual quic::Expected resetStream( StreamId id, ApplicationErrorCode error) = 0; @@ -640,14 +640,14 @@ class QuicSocketLite { * can potentially be called multiple times on a stream to advance the offset, * but it is an error to call it after sending a reset. */ - virtual folly::Expected - updateReliableDeliveryCheckpoint(StreamId id) = 0; + virtual quic::Expected updateReliableDeliveryCheckpoint( + StreamId id) = 0; /** * Send a reliable reset to the peer. The reliable size sent to the peer is * determined by when checkpoint(streamId) was last called. */ - virtual folly::Expected resetStreamReliably( + virtual quic::Expected resetStreamReliably( StreamId id, ApplicationErrorCode error) = 0; @@ -682,7 +682,7 @@ class QuicSocketLite { * stream. A caller can use this function when they are no longer processing * received data on the stream. */ - virtual folly::Expected stopSending( + virtual quic::Expected stopSending( StreamId id, ApplicationErrorCode error) = 0; @@ -783,7 +783,7 @@ class QuicSocketLite { * application can act on by e.g. changing transport settings during the * connection. */ - virtual folly::Expected + virtual quic::Expected setKnob(uint64_t knobSpace, uint64_t knobId, BufPtr knobBlob) = 0; /** @@ -794,13 +794,13 @@ class QuicSocketLite { /* * Set the priority queue implementation. */ - virtual folly::Expected setPriorityQueue( + virtual quic::Expected setPriorityQueue( std::unique_ptr queue) = 0; /** * Set stream priority. */ - virtual folly::Expected setStreamPriority( + virtual quic::Expected setStreamPriority( StreamId id, PriorityQueue::Priority pri) = 0; @@ -808,7 +808,7 @@ class QuicSocketLite { * Sets the maximum pacing rate in Bytes per second to be used * if pacing is enabled */ - virtual folly::Expected setMaxPacingRate( + virtual quic::Expected setMaxPacingRate( uint64_t rateBytesPerSec) = 0; /** @@ -832,7 +832,7 @@ class QuicSocketLite { * Get internal transport info similar to TCP information. * Returns LocalErrorCode::STREAM_NOT_EXISTS if the stream is not found */ - virtual folly::Expected + virtual quic::Expected getStreamTransportInfo(StreamId id) const = 0; /** @@ -897,8 +897,8 @@ class QuicSocketLite { * Returns the current flow control windows for the stream, id != 0. * Use getConnectionFlowControl for connection flow control window. */ - virtual folly::Expected - getStreamFlowControl(StreamId id) const = 0; + virtual quic::Expected getStreamFlowControl( + StreamId id) const = 0; virtual const TransportSettings& getTransportSettings() const = 0; diff --git a/quic/api/QuicStreamAsyncTransport.cpp b/quic/api/QuicStreamAsyncTransport.cpp index bc48d9df9..d7fb1a755 100644 --- a/quic/api/QuicStreamAsyncTransport.cpp +++ b/quic/api/QuicStreamAsyncTransport.cpp @@ -43,7 +43,14 @@ void QuicStreamAsyncTransport::setStreamId(quic::StreamId id) { id_ = id; // TODO: handle timeout for assigning stream id - sock_->setReadCallback(*id_, this); + auto setCallbackResult = sock_->setReadCallback(*id_, this); + if (setCallbackResult.hasError()) { + throw folly::AsyncSocketException( + folly::AsyncSocketException::UNKNOWN, + folly::to( + "Failed to set read callback: ", + toString(setCallbackResult.error()))); + } handleRead(); if (!writeCallbacks_.empty()) { @@ -62,7 +69,13 @@ void QuicStreamAsyncTransport::setStreamId(quic::StreamId id) { p.first += *streamWriteOffset; } streamWriteOffset_ += *streamWriteOffset; - sock_->notifyPendingWriteOnStream(*id_, this); + auto res = sock_->notifyPendingWriteOnStream(*id_, this); + if (!res) { + LOG(WARNING) << "Failed to notify pending write on stream: " + << toString(res.error()); + // Continue anyway - this matches original behavior where + // [[maybe_unused]] was used to ignore failures + } } } @@ -80,10 +93,19 @@ void QuicStreamAsyncTransport::setReadCB( readCb_ = callback; if (id_) { if (!readCb_) { - sock_->pauseRead(*id_); + auto pauseResult = sock_->pauseRead(*id_); + if (pauseResult.hasError()) { + VLOG(1) << "Failed to pause read: " << toString(pauseResult.error()); + } } else if (sock_->resumeRead(*id_).hasError()) { // this is our first time installing the read callback - sock_->setReadCallback(*id_, this); + auto setCallbackResult = sock_->setReadCallback(*id_, this); + if (setCallbackResult.hasError()) { + VLOG(1) << "Failed to set read callback: " + << toString(setCallbackResult.error()); + // Continue anyway - this matches original behavior where + // [[maybe_unused]] was used to ignore failures + } } // It should be ok to do this immediately, rather than in the loop handleRead(); @@ -100,7 +122,13 @@ void QuicStreamAsyncTransport::addWriteCallback( size_t size = writeBuf_.chainLength(); writeCallbacks_.emplace_back(streamWriteOffset_ + size, callback); if (id_) { - sock_->notifyPendingWriteOnStream(*id_, this); + auto res = sock_->notifyPendingWriteOnStream(*id_, this); + if (!res) { + VLOG(1) << "Failed to notify pending write on stream: " + << toString(res.error()); + // Continue anyway - this matches original behavior where + // [[maybe_unused]] was used to ignore failures + } } } @@ -165,7 +193,8 @@ void QuicStreamAsyncTransport::writeChain( void QuicStreamAsyncTransport::close() { state_ = CloseState::CLOSING; if (id_) { - sock_->stopSending(*id_, quic::GenericApplicationErrorCode::UNKNOWN); + CHECK(sock_->stopSending(*id_, quic::GenericApplicationErrorCode::UNKNOWN) + .has_value()); } shutdownWrite(); if (readCb_ && readEOF_ != EOFState::DELIVERED) { @@ -181,7 +210,12 @@ void QuicStreamAsyncTransport::closeNow() { folly::AsyncSocketException ex( folly::AsyncSocketException::UNKNOWN, "Quic closeNow"); if (id_) { - sock_->stopSending(*id_, quic::GenericApplicationErrorCode::UNKNOWN); + auto res = + sock_->stopSending(*id_, quic::GenericApplicationErrorCode::UNKNOWN); + if (!res) { + VLOG(1) << "Failed to stop sending during closeNow: " + << toString(res.error()); + } shutdownWriteNow(); } closeNowImpl(std::move(ex)); @@ -189,8 +223,18 @@ void QuicStreamAsyncTransport::closeNow() { void QuicStreamAsyncTransport::closeWithReset() { if (id_) { - sock_->stopSending(*id_, quic::GenericApplicationErrorCode::UNKNOWN); - sock_->resetStream(*id_, quic::GenericApplicationErrorCode::UNKNOWN); + auto res1 = + sock_->stopSending(*id_, quic::GenericApplicationErrorCode::UNKNOWN); + if (!res1) { + VLOG(1) << "Failed to stop sending during closeWithReset: " + << toString(res1.error()); + } + auto res2 = + sock_->resetStream(*id_, quic::GenericApplicationErrorCode::UNKNOWN); + if (!res2) { + VLOG(1) << "Failed to reset stream during closeWithReset: " + << toString(res2.error()); + } } folly::AsyncSocketException ex( folly::AsyncSocketException::UNKNOWN, "Quic closeNow"); @@ -201,7 +245,13 @@ void QuicStreamAsyncTransport::shutdownWrite() { if (writeEOF_ == EOFState::NOT_SEEN) { writeEOF_ = EOFState::QUEUED; if (id_) { - sock_->notifyPendingWriteOnStream(*id_, this); + auto res = sock_->notifyPendingWriteOnStream(*id_, this); + if (!res) { + VLOG(1) << "Failed to notify pending write on stream: " + << toString(res.error()); + // Continue anyway - this matches original behavior where + // [[maybe_unused]] was used to ignore failures + } } } } @@ -214,8 +264,14 @@ void QuicStreamAsyncTransport::shutdownWriteNow() { shutdownWrite(); send(0); if (id_ && writeEOF_ != EOFState::DELIVERED) { - sock_->resetStream(*id_, quic::GenericApplicationErrorCode::UNKNOWN); - VLOG(4) << "Reset stream from shutdownWriteNow"; + auto res = + sock_->resetStream(*id_, quic::GenericApplicationErrorCode::UNKNOWN); + if (!res) { + VLOG(1) << "Failed to reset stream during shutdownWriteNow: " + << toString(res.error()); + } else { + VLOG(4) << "Reset stream from shutdownWriteNow"; + } } } @@ -399,7 +455,10 @@ void QuicStreamAsyncTransport::handleRead() { if (id_) { if (!readCb_ || readEOF_ != EOFState::NOT_SEEN) { - sock_->setReadCallback(*id_, nullptr); + auto res = sock_->setReadCallback(*id_, nullptr); + if (!res) { + VLOG(1) << "Failed to clear read callback: " << toString(res.error()); + } } } } @@ -433,11 +492,10 @@ void QuicStreamAsyncTransport::send(uint64_t maxToSend) { VLOG(4) << __func__ << " buffered data, requesting callback"; auto res2 = sock_->notifyPendingWriteOnStream(*id_, this); if (!res2) { - folly::AsyncSocketException ex( - folly::AsyncSocketException::UNKNOWN, - fmt::format("Quic write error: {}", toString(res2.error()))); - failWrites(ex); - return; + VLOG(1) << "Failed to notify pending write on stream: " + << toString(res2.error()); + // Continue anyway - this matches original behavior where + // [[maybe_unused]] was used to ignore failures } } // not actually sent. Mirrors AsyncSocket and invokes when data is in @@ -503,8 +561,16 @@ void QuicStreamAsyncTransport::closeNowImpl(folly::AsyncSocketException&& ex) { ex_ = ex; readCb_ = nullptr; if (id_) { - sock_->setReadCallback(*id_, nullptr); - sock_->unregisterStreamWriteCallback(*id_); + auto res1 = sock_->setReadCallback(*id_, nullptr); + if (!res1) { + VLOG(1) << "Failed to clear read callback during cleanup: " + << toString(res1.error()); + } + auto res2 = sock_->unregisterStreamWriteCallback(*id_); + if (!res2) { + VLOG(1) << "Failed to unregister write callback during cleanup: " + << toString(res2.error()); + } id_.reset(); } failWrites(*ex_); diff --git a/quic/api/QuicTransportBase.cpp b/quic/api/QuicTransportBase.cpp index e54e491b6..6f75d870e 100644 --- a/quic/api/QuicTransportBase.cpp +++ b/quic/api/QuicTransportBase.cpp @@ -49,7 +49,7 @@ QuicTransportBase::QuicTransportBase( // TODO we probably should have a better way to return error from // creating a connection. // Can't really do anything with this at this point. - (void)socket_->setAdditionalCmsgsFunc(std::move(func)); + CHECK(socket_->setAdditionalCmsgsFunc(std::move(func)).has_value()); } } @@ -113,18 +113,18 @@ void QuicTransportBase::closeGracefully() { } } -folly::Expected QuicTransportBase::getStreamReadOffset( +quic::Expected QuicTransportBase::getStreamReadOffset( StreamId) const { return 0; } -folly::Expected QuicTransportBase::getStreamWriteOffset( +quic::Expected QuicTransportBase::getStreamWriteOffset( StreamId id) const { if (isReceivingStream(conn_->nodeType, id)) { - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } if (!conn_->streamManager->streamExists(id)) { - return folly::makeUnexpected(LocalErrorCode::STREAM_NOT_EXISTS); + return quic::make_unexpected(LocalErrorCode::STREAM_NOT_EXISTS); } try { auto stream = @@ -132,23 +132,23 @@ folly::Expected QuicTransportBase::getStreamWriteOffset( return stream->currentWriteOffset; } catch (const QuicInternalException& ex) { VLOG(4) << __func__ << " " << ex.what() << " " << *this; - return folly::makeUnexpected(ex.errorCode()); + return quic::make_unexpected(ex.errorCode()); } catch (const QuicTransportException& ex) { VLOG(4) << __func__ << " " << ex.what() << " " << *this; - return folly::makeUnexpected(LocalErrorCode::TRANSPORT_ERROR); + return quic::make_unexpected(LocalErrorCode::TRANSPORT_ERROR); } catch (const std::exception& ex) { VLOG(4) << __func__ << " " << ex.what() << " " << *this; - return folly::makeUnexpected(LocalErrorCode::INTERNAL_ERROR); + return quic::make_unexpected(LocalErrorCode::INTERNAL_ERROR); } } -folly::Expected +quic::Expected QuicTransportBase::getStreamWriteBufferedBytes(StreamId id) const { if (isReceivingStream(conn_->nodeType, id)) { - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } if (!conn_->streamManager->streamExists(id)) { - return folly::makeUnexpected(LocalErrorCode::STREAM_NOT_EXISTS); + return quic::make_unexpected(LocalErrorCode::STREAM_NOT_EXISTS); } try { auto stream = @@ -156,17 +156,17 @@ QuicTransportBase::getStreamWriteBufferedBytes(StreamId id) const { return stream->pendingWrites.chainLength(); } catch (const QuicInternalException& ex) { VLOG(4) << __func__ << " " << ex.what() << " " << *this; - return folly::makeUnexpected(ex.errorCode()); + return quic::make_unexpected(ex.errorCode()); } catch (const QuicTransportException& ex) { VLOG(4) << __func__ << " " << ex.what() << " " << *this; - return folly::makeUnexpected(LocalErrorCode::TRANSPORT_ERROR); + return quic::make_unexpected(LocalErrorCode::TRANSPORT_ERROR); } catch (const std::exception& ex) { VLOG(4) << __func__ << " " << ex.what() << " " << *this; - return folly::makeUnexpected(LocalErrorCode::INTERNAL_ERROR); + return quic::make_unexpected(LocalErrorCode::INTERNAL_ERROR); } } -folly::Expected +quic::Expected QuicTransportBase::getConnectionFlowControl() const { return QuicSocket::FlowControlState( getSendConnFlowControlBytesAPI(*conn_), @@ -175,13 +175,13 @@ QuicTransportBase::getConnectionFlowControl() const { conn_->flowControlState.advertisedMaxOffset); } -folly::Expected +quic::Expected QuicTransportBase::getMaxWritableOnStream(StreamId id) const { if (!conn_->streamManager->streamExists(id)) { - return folly::makeUnexpected(LocalErrorCode::STREAM_NOT_EXISTS); + return quic::make_unexpected(LocalErrorCode::STREAM_NOT_EXISTS); } if (isReceivingStream(conn_->nodeType, id)) { - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } auto stream = @@ -189,44 +189,44 @@ QuicTransportBase::getMaxWritableOnStream(StreamId id) const { return maxWritableOnStream(*stream); } -folly::Expected +quic::Expected QuicTransportBase::setConnectionFlowControlWindow(uint64_t windowSize) { if (closeState_ != CloseState::OPEN) { - return folly::makeUnexpected(LocalErrorCode::CONNECTION_CLOSED); + return quic::make_unexpected(LocalErrorCode::CONNECTION_CLOSED); } conn_->flowControlState.windowSize = windowSize; maybeSendConnWindowUpdate(*conn_, Clock::now()); updateWriteLooper(true); - return folly::unit; + return {}; } -folly::Expected +quic::Expected QuicTransportBase::setStreamFlowControlWindow( StreamId id, uint64_t windowSize) { if (closeState_ != CloseState::OPEN) { - return folly::makeUnexpected(LocalErrorCode::CONNECTION_CLOSED); + return quic::make_unexpected(LocalErrorCode::CONNECTION_CLOSED); } if (!conn_->streamManager->streamExists(id)) { - return folly::makeUnexpected(LocalErrorCode::STREAM_NOT_EXISTS); + return quic::make_unexpected(LocalErrorCode::STREAM_NOT_EXISTS); } auto stream = CHECK_NOTNULL(conn_->streamManager->getStream(id).value_or(nullptr)); stream->flowControlState.windowSize = windowSize; maybeSendStreamWindowUpdate(*stream, Clock::now()); updateWriteLooper(true); - return folly::unit; + return {}; } void QuicTransportBase::unsetAllReadCallbacks() { for (const auto& [id, _] : readCallbacks_) { - setReadCallbackInternal(id, nullptr, APP_NO_ERROR); + CHECK(setReadCallbackInternal(id, nullptr, APP_NO_ERROR).has_value()); } } void QuicTransportBase::unsetAllPeekCallbacks() { for (const auto& [id, _] : peekCallbacks_) { - setPeekCallbackInternal(id, nullptr); + CHECK(setPeekCallbackInternal(id, nullptr).has_value()); } } @@ -237,55 +237,53 @@ void QuicTransportBase::unsetAllDeliveryCallbacks() { } } -folly::Expected QuicTransportBase::pauseRead( - StreamId id) { +quic::Expected QuicTransportBase::pauseRead(StreamId id) { VLOG(4) << __func__ << " " << *this << " stream=" << id; return pauseOrResumeRead(id, false); } -folly::Expected QuicTransportBase::resumeRead( +quic::Expected QuicTransportBase::resumeRead( StreamId id) { VLOG(4) << __func__ << " " << *this << " stream=" << id; return pauseOrResumeRead(id, true); } -folly::Expected -QuicTransportBase::pauseOrResumeRead(StreamId id, bool resume) { +quic::Expected QuicTransportBase::pauseOrResumeRead( + StreamId id, + bool resume) { if (isSendingStream(conn_->nodeType, id)) { - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } if (closeState_ != CloseState::OPEN) { - return folly::makeUnexpected(LocalErrorCode::CONNECTION_CLOSED); + return quic::make_unexpected(LocalErrorCode::CONNECTION_CLOSED); } if (!conn_->streamManager->streamExists(id)) { - return folly::makeUnexpected(LocalErrorCode::STREAM_NOT_EXISTS); + return quic::make_unexpected(LocalErrorCode::STREAM_NOT_EXISTS); } auto readCb = readCallbacks_.find(id); if (readCb == readCallbacks_.end()) { - return folly::makeUnexpected(LocalErrorCode::APP_ERROR); + return quic::make_unexpected(LocalErrorCode::APP_ERROR); } if (readCb->second.resumed != resume) { readCb->second.resumed = resume; updateReadLooper(); } - return folly::unit; + return {}; } -folly::Expected QuicTransportBase::setPeekCallback( +quic::Expected QuicTransportBase::setPeekCallback( StreamId id, PeekCallback* cb) { if (closeState_ != CloseState::OPEN) { - return folly::makeUnexpected(LocalErrorCode::CONNECTION_CLOSED); + return quic::make_unexpected(LocalErrorCode::CONNECTION_CLOSED); } if (!conn_->streamManager->streamExists(id)) { - return folly::makeUnexpected(LocalErrorCode::STREAM_NOT_EXISTS); + return quic::make_unexpected(LocalErrorCode::STREAM_NOT_EXISTS); } - setPeekCallbackInternal(id, cb); - return folly::unit; + return setPeekCallbackInternal(id, cb); } -folly::Expected -QuicTransportBase::setPeekCallbackInternal( +quic::Expected QuicTransportBase::setPeekCallbackInternal( StreamId id, PeekCallback* cb) noexcept { VLOG(4) << "Setting setPeekCallback for stream=" << id << " cb=" << cb << " " @@ -294,7 +292,7 @@ QuicTransportBase::setPeekCallbackInternal( if (peekCbIt == peekCallbacks_.end()) { // Don't allow initial setting of a nullptr callback. if (!cb) { - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } peekCbIt = peekCallbacks_.emplace(id, PeekCallbackData(cb)).first; } @@ -304,46 +302,46 @@ QuicTransportBase::setPeekCallbackInternal( } peekCbIt->second.peekCb = cb; updatePeekLooper(); - return folly::unit; + return {}; } -folly::Expected QuicTransportBase::pausePeek( - StreamId id) { +quic::Expected QuicTransportBase::pausePeek(StreamId id) { VLOG(4) << __func__ << " " << *this << " stream=" << id; return pauseOrResumePeek(id, false); } -folly::Expected QuicTransportBase::resumePeek( +quic::Expected QuicTransportBase::resumePeek( StreamId id) { VLOG(4) << __func__ << " " << *this << " stream=" << id; return pauseOrResumePeek(id, true); } -folly::Expected -QuicTransportBase::pauseOrResumePeek(StreamId id, bool resume) { +quic::Expected QuicTransportBase::pauseOrResumePeek( + StreamId id, + bool resume) { if (closeState_ != CloseState::OPEN) { - return folly::makeUnexpected(LocalErrorCode::CONNECTION_CLOSED); + return quic::make_unexpected(LocalErrorCode::CONNECTION_CLOSED); } if (!conn_->streamManager->streamExists(id)) { - return folly::makeUnexpected(LocalErrorCode::STREAM_NOT_EXISTS); + return quic::make_unexpected(LocalErrorCode::STREAM_NOT_EXISTS); } auto peekCb = peekCallbacks_.find(id); if (peekCb == peekCallbacks_.end()) { - return folly::makeUnexpected(LocalErrorCode::APP_ERROR); + return quic::make_unexpected(LocalErrorCode::APP_ERROR); } if (peekCb->second.resumed != resume) { peekCb->second.resumed = resume; updatePeekLooper(); } - return folly::unit; + return {}; } -folly::Expected QuicTransportBase::peek( +quic::Expected QuicTransportBase::peek( StreamId id, const std::function&)>& peekCallback) { if (closeState_ != CloseState::OPEN) { - return folly::makeUnexpected(LocalErrorCode::CONNECTION_CLOSED); + return quic::make_unexpected(LocalErrorCode::CONNECTION_CLOSED); } [[maybe_unused]] auto self = sharedGuard(); SCOPE_EXIT { @@ -352,7 +350,7 @@ folly::Expected QuicTransportBase::peek( }; if (!conn_->streamManager->streamExists(id)) { - return folly::makeUnexpected(LocalErrorCode::STREAM_NOT_EXISTS); + return quic::make_unexpected(LocalErrorCode::STREAM_NOT_EXISTS); } auto stream = CHECK_NOTNULL(conn_->streamManager->getStream(id).value_or(nullptr)); @@ -360,37 +358,37 @@ folly::Expected QuicTransportBase::peek( if (stream->streamReadError) { switch (stream->streamReadError->type()) { case QuicErrorCode::Type::LocalErrorCode: - return folly::makeUnexpected( + return quic::make_unexpected( *stream->streamReadError->asLocalErrorCode()); default: - return folly::makeUnexpected(LocalErrorCode::INTERNAL_ERROR); + return quic::make_unexpected(LocalErrorCode::INTERNAL_ERROR); } } peekDataFromQuicStream(*stream, std::move(peekCallback)); - return folly::makeExpected(folly::Unit()); + return {}; } -folly::Expected QuicTransportBase::consume( +quic::Expected QuicTransportBase::consume( StreamId id, size_t amount) { if (!conn_->streamManager->streamExists(id)) { - return folly::makeUnexpected(LocalErrorCode::STREAM_NOT_EXISTS); + return quic::make_unexpected(LocalErrorCode::STREAM_NOT_EXISTS); } auto stream = CHECK_NOTNULL(conn_->streamManager->getStream(id).value_or(nullptr)); auto result = consume(id, stream->currentReadOffset, amount); - if (result.hasError()) { - return folly::makeUnexpected(result.error().first); + if (!result.has_value()) { + return quic::make_unexpected(result.error().first); } - return folly::makeExpected(result.value()); + return {}; } -folly::Expected>> +quic::Expected>> QuicTransportBase::consume(StreamId id, uint64_t offset, size_t amount) { using ConsumeError = std::pair>; if (closeState_ != CloseState::OPEN) { - return folly::makeUnexpected( + return quic::make_unexpected( ConsumeError{LocalErrorCode::CONNECTION_CLOSED, std::nullopt}); } [[maybe_unused]] auto self = sharedGuard(); @@ -405,76 +403,80 @@ QuicTransportBase::consume(StreamId id, uint64_t offset, size_t amount) { // accidentally let the API create a peer stream that was not // sent by the peer. if (!conn_->streamManager->streamExists(id)) { - return folly::makeUnexpected( + return quic::make_unexpected( ConsumeError{LocalErrorCode::STREAM_NOT_EXISTS, readOffset}); } auto stream = CHECK_NOTNULL(conn_->streamManager->getStream(id).value_or(nullptr)); readOffset = stream->currentReadOffset; if (stream->currentReadOffset != offset) { - return folly::makeUnexpected( + return quic::make_unexpected( ConsumeError{LocalErrorCode::INTERNAL_ERROR, readOffset}); } if (stream->streamReadError) { switch (stream->streamReadError->type()) { case QuicErrorCode::Type::LocalErrorCode: - return folly::makeUnexpected(ConsumeError{ + return quic::make_unexpected(ConsumeError{ *stream->streamReadError->asLocalErrorCode(), std::nullopt}); default: - return folly::makeUnexpected( + return quic::make_unexpected( ConsumeError{LocalErrorCode::INTERNAL_ERROR, std::nullopt}); } } - consumeDataFromQuicStream(*stream, amount); - return folly::makeExpected(folly::Unit()); + auto consumeResult = consumeDataFromQuicStream(*stream, amount); + if (!consumeResult.has_value()) { + return quic::make_unexpected( + ConsumeError{LocalErrorCode::INTERNAL_ERROR, std::nullopt}); + } + return {}; } catch (const QuicTransportException& ex) { VLOG(4) << "consume() error " << ex.what() << " " << *this; exceptionCloseWhat_ = ex.what(); closeImpl(QuicError( QuicErrorCode(ex.errorCode()), std::string("consume() error"))); - return folly::makeUnexpected( + return quic::make_unexpected( ConsumeError{LocalErrorCode::TRANSPORT_ERROR, readOffset}); } catch (const QuicInternalException& ex) { VLOG(4) << __func__ << " " << ex.what() << " " << *this; exceptionCloseWhat_ = ex.what(); closeImpl(QuicError( QuicErrorCode(ex.errorCode()), std::string("consume() error"))); - return folly::makeUnexpected(ConsumeError{ex.errorCode(), readOffset}); + return quic::make_unexpected(ConsumeError{ex.errorCode(), readOffset}); } catch (const std::exception& ex) { VLOG(4) << "consume() error " << ex.what() << " " << *this; exceptionCloseWhat_ = ex.what(); closeImpl(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::string("consume() error"))); - return folly::makeUnexpected( + return quic::make_unexpected( ConsumeError{LocalErrorCode::INTERNAL_ERROR, readOffset}); } } -folly::Expected +quic::Expected QuicTransportBase::createBidirectionalStreamGroup() { if (closeState_ != CloseState::OPEN) { - return folly::makeUnexpected(LocalErrorCode::CONNECTION_CLOSED); + return quic::make_unexpected(LocalErrorCode::CONNECTION_CLOSED); } return conn_->streamManager->createNextBidirectionalStreamGroup(); } -folly::Expected +quic::Expected QuicTransportBase::createUnidirectionalStreamGroup() { if (closeState_ != CloseState::OPEN) { - return folly::makeUnexpected(LocalErrorCode::CONNECTION_CLOSED); + return quic::make_unexpected(LocalErrorCode::CONNECTION_CLOSED); } return conn_->streamManager->createNextUnidirectionalStreamGroup(); } -folly::Expected +quic::Expected QuicTransportBase::createBidirectionalStreamInGroup(StreamGroupId groupId) { return createStreamInternal(true, groupId); } -folly::Expected +quic::Expected QuicTransportBase::createUnidirectionalStreamInGroup(StreamGroupId groupId) { return createStreamInternal(false, groupId); } @@ -492,23 +494,22 @@ StreamDirectionality QuicTransportBase::getStreamDirectionality( return quic::getStreamDirectionality(stream); } -folly::Expected -QuicTransportBase::registerTxCallback( +quic::Expected QuicTransportBase::registerTxCallback( StreamId id, uint64_t offset, ByteEventCallback* cb) { return registerByteEventCallback(ByteEvent::Type::TX, id, offset, cb); } -folly::Expected QuicTransportBase::setPingCallback( +quic::Expected QuicTransportBase::setPingCallback( PingCallback* cb) { if (closeState_ != CloseState::OPEN) { - return folly::makeUnexpected(LocalErrorCode::CONNECTION_CLOSED); + return quic::make_unexpected(LocalErrorCode::CONNECTION_CLOSED); } VLOG(4) << "Setting ping callback " << " cb=" << cb << " " << *this; pingCallback_ = cb; - return folly::unit; + return {}; } void QuicTransportBase::sendPing(std::chrono::milliseconds pingTimeout) { @@ -571,7 +572,9 @@ void QuicTransportBase::resetNonControlStreams( writeCallbackIt->second->onStreamWriteError( id, QuicError(error, errorMsg.str())); } - resetStream(id, error); + // TODO: Change external API signature to return Expected instead of using + // (void). Right now we apparently partially support this as a non error. + (void)resetStream(id, error); } if (isReceivingStream(conn_->nodeType, id) || isBidirectionalStream(id)) { auto readCallbackIt = readCallbacks_.find(id); @@ -588,21 +591,21 @@ void QuicTransportBase::resetNonControlStreams( } } peekCallbacks_.erase(id); - stopSending(id, error); + (void)stopSending(id, error); } } } -folly::Expected -QuicTransportBase::setDatagramCallback(DatagramCallback* cb) { +quic::Expected QuicTransportBase::setDatagramCallback( + DatagramCallback* cb) { if (closeState_ != CloseState::OPEN) { - return folly::makeUnexpected(LocalErrorCode::CONNECTION_CLOSED); + return quic::make_unexpected(LocalErrorCode::CONNECTION_CLOSED); } VLOG(4) << "Setting datagram callback " << " cb=" << cb << " " << *this; datagramCallback_ = cb; updateReadLooper(); - return folly::unit; + return {}; } uint16_t QuicTransportBase::getDatagramSizeLimit() const { @@ -613,14 +616,14 @@ uint16_t QuicTransportBase::getDatagramSizeLimit() const { 0, maxDatagramPacketSize - kMaxDatagramPacketOverhead); } -folly::Expected QuicTransportBase::writeDatagram( +quic::Expected QuicTransportBase::writeDatagram( BufPtr buf) { // TODO(lniccolini) update max datagram frame size // https://github.com/quicwg/datagram/issues/3 // For now, max_datagram_size > 0 means the peer supports datagram frames if (conn_->datagramState.maxWriteFrameSize == 0) { QUIC_STATS(conn_->statsCallback, onDatagramDroppedOnWrite); - return folly::makeUnexpected(LocalErrorCode::INVALID_WRITE_DATA); + return quic::make_unexpected(LocalErrorCode::INVALID_WRITE_DATA); } if (conn_->datagramState.writeBuffer.size() >= conn_->datagramState.maxWriteBufferSize) { @@ -628,22 +631,22 @@ folly::Expected QuicTransportBase::writeDatagram( if (!conn_->transportSettings.datagramConfig.sendDropOldDataFirst) { // TODO(lniccolini) use different return codes to signal the application // exactly why the datagram got dropped - return folly::makeUnexpected(LocalErrorCode::INVALID_WRITE_DATA); + return quic::make_unexpected(LocalErrorCode::INVALID_WRITE_DATA); } else { conn_->datagramState.writeBuffer.pop_front(); } } conn_->datagramState.writeBuffer.emplace_back(std::move(buf)); updateWriteLooper(true); - return folly::unit; + return {}; } -folly::Expected, LocalErrorCode> +quic::Expected, LocalErrorCode> QuicTransportBase::readDatagrams(size_t atMost) { CHECK(conn_); auto datagrams = &conn_->datagramState.readBuffer; if (closeState_ != CloseState::OPEN) { - return folly::makeUnexpected(LocalErrorCode::CONNECTION_CLOSED); + return quic::make_unexpected(LocalErrorCode::CONNECTION_CLOSED); } if (atMost == 0) { atMost = datagrams->size(); @@ -661,12 +664,12 @@ QuicTransportBase::readDatagrams(size_t atMost) { return retDatagrams; } -folly::Expected, LocalErrorCode> +quic::Expected, LocalErrorCode> QuicTransportBase::readDatagramBufs(size_t atMost) { CHECK(conn_); auto datagrams = &conn_->datagramState.readBuffer; if (closeState_ != CloseState::OPEN) { - return folly::makeUnexpected(LocalErrorCode::CONNECTION_CLOSED); + return quic::make_unexpected(LocalErrorCode::CONNECTION_CLOSED); } if (atMost == 0) { atMost = datagrams->size(); @@ -684,15 +687,15 @@ QuicTransportBase::readDatagramBufs(size_t atMost) { return retDatagrams; } -folly::Expected +quic::Expected QuicTransportBase::getStreamPriority(StreamId id) { if (closeState_ != CloseState::OPEN) { - return folly::makeUnexpected(LocalErrorCode::CONNECTION_CLOSED); + return quic::make_unexpected(LocalErrorCode::CONNECTION_CLOSED); } if (auto stream = conn_->streamManager->findStream(id)) { return stream->priority; } - return folly::makeUnexpected(LocalErrorCode::STREAM_NOT_EXISTS); + return quic::make_unexpected(LocalErrorCode::STREAM_NOT_EXISTS); } bool QuicTransportBase::isDetachable() { @@ -783,51 +786,51 @@ inline std::ostream& operator<<( return os; } -folly::Expected +quic::Expected QuicTransportBase::maybeResetStreamFromReadError( StreamId id, QuicErrorCode error) { if (quic::ApplicationErrorCode* code = error.asApplicationErrorCode()) { return resetStream(id, *code); } - return folly::Expected(folly::unit); + return {}; } void QuicTransportBase::setCmsgs(const folly::SocketCmsgMap& options) { // TODO figure out what we want to do here in the unlikely error case. - (void)socket_->setCmsgs(options); + CHECK(socket_->setCmsgs(options).has_value()); } void QuicTransportBase::appendCmsgs(const folly::SocketCmsgMap& options) { // TODO figure out what we want to do here in the unlikely error case. - (void)socket_->appendCmsgs(options); + CHECK(socket_->appendCmsgs(options).has_value()); } bool QuicTransportBase::checkCustomRetransmissionProfilesEnabled() const { return quic::checkCustomRetransmissionProfilesEnabled(*conn_); } -folly::Expected +quic::Expected QuicTransportBase::setStreamGroupRetransmissionPolicy( StreamGroupId groupId, std::optional policy) noexcept { // Reset the policy to default one. if (policy == std::nullopt) { conn_->retransmissionPolicies.erase(groupId); - return folly::unit; + return {}; } if (!checkCustomRetransmissionProfilesEnabled()) { - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } if (conn_->retransmissionPolicies.size() >= conn_->transportSettings.advertisedMaxStreamGroups) { - return folly::makeUnexpected(LocalErrorCode::RTX_POLICIES_LIMIT_EXCEEDED); + return quic::make_unexpected(LocalErrorCode::RTX_POLICIES_LIMIT_EXCEEDED); } conn_->retransmissionPolicies.emplace(groupId, *policy); - return folly::unit; + return {}; } } // namespace quic diff --git a/quic/api/QuicTransportBase.h b/quic/api/QuicTransportBase.h index 885497c43..af3ff478a 100644 --- a/quic/api/QuicTransportBase.h +++ b/quic/api/QuicTransportBase.h @@ -56,69 +56,68 @@ class QuicTransportBase : public QuicSocket, void closeGracefully() override; - folly::Expected getStreamReadOffset( + quic::Expected getStreamReadOffset( StreamId id) const override; - folly::Expected getStreamWriteOffset( + quic::Expected getStreamWriteOffset( StreamId id) const override; - folly::Expected getStreamWriteBufferedBytes( + quic::Expected getStreamWriteBufferedBytes( StreamId id) const override; - folly::Expected + quic::Expected getConnectionFlowControl() const override; - folly::Expected getMaxWritableOnStream( + quic::Expected getMaxWritableOnStream( StreamId id) const override; - folly::Expected setConnectionFlowControlWindow( + quic::Expected setConnectionFlowControlWindow( uint64_t windowSize) override; - folly::Expected setStreamFlowControlWindow( + quic::Expected setStreamFlowControlWindow( StreamId id, uint64_t windowSize) override; void unsetAllReadCallbacks() override; void unsetAllPeekCallbacks() override; void unsetAllDeliveryCallbacks() override; - folly::Expected pauseRead(StreamId id) override; - folly::Expected resumeRead(StreamId id) override; + quic::Expected pauseRead(StreamId id) override; + quic::Expected resumeRead(StreamId id) override; - folly::Expected setPeekCallback( + quic::Expected setPeekCallback( StreamId id, PeekCallback* cb) override; - folly::Expected pausePeek(StreamId id) override; - folly::Expected resumePeek(StreamId id) override; + quic::Expected pausePeek(StreamId id) override; + quic::Expected resumePeek(StreamId id) override; - folly::Expected peek( + quic::Expected peek( StreamId id, const std::function&)>& peekCallback) override; - folly::Expected consume( - StreamId id, - size_t amount) override; + quic::Expected consume(StreamId id, size_t amount) + override; - folly::Expected>> + quic::Expected>> consume(StreamId id, uint64_t offset, size_t amount) override; - folly::Expected - createBidirectionalStreamGroup() override; - folly::Expected + quic::Expected createBidirectionalStreamGroup() + override; + quic::Expected createUnidirectionalStreamGroup() override; - folly::Expected createBidirectionalStreamInGroup( + quic::Expected createBidirectionalStreamInGroup( StreamGroupId groupId) override; - folly::Expected createUnidirectionalStreamInGroup( + quic::Expected createUnidirectionalStreamInGroup( StreamGroupId groupId) override; bool isClientStream(StreamId stream) noexcept override; bool isServerStream(StreamId stream) noexcept override; StreamDirectionality getStreamDirectionality( StreamId stream) noexcept override; - folly::Expected maybeResetStreamFromReadError( + quic::Expected maybeResetStreamFromReadError( StreamId id, QuicErrorCode error) override; - folly::Expected setPingCallback( + quic::Expected setPingCallback( PingCallback* cb) override; void sendPing(std::chrono::milliseconds pingTimeout) override; @@ -142,7 +141,7 @@ class QuicTransportBase : public QuicSocket, // Subclass API. - folly::Expected getStreamPriority( + quic::Expected getStreamPriority( StreamId id) override; /** @@ -153,7 +152,7 @@ class QuicTransportBase : public QuicSocket, * congestion control and pacing. In the future, this callback may be * triggered by socket/NIC software or hardware timestamps. */ - folly::Expected registerTxCallback( + quic::Expected registerTxCallback( const StreamId id, const uint64_t offset, ByteEventCallback* cb) override; @@ -174,7 +173,7 @@ class QuicTransportBase : public QuicSocket, /** * Set the read callback for Datagrams */ - folly::Expected setDatagramCallback( + quic::Expected setDatagramCallback( DatagramCallback* cb) override; /** @@ -188,21 +187,20 @@ class QuicTransportBase : public QuicSocket, * getDatagramSizeLimit(), or if the write buffer is full, buf will simply be * dropped, and a LocalErrorCode will be returned to caller. */ - folly::Expected writeDatagram( - BufPtr buf) override; + quic::Expected writeDatagram(BufPtr buf) override; /** * Returns the currently available received Datagrams. * Returns all datagrams if atMost is 0. */ - folly::Expected, LocalErrorCode> readDatagrams( + quic::Expected, LocalErrorCode> readDatagrams( size_t atMost = 0) override; /** * Returns the currently available received Datagram IOBufs. * Returns all datagrams if atMost is 0. */ - folly::Expected, LocalErrorCode> readDatagramBufs( + quic::Expected, LocalErrorCode> readDatagramBufs( size_t atMost = 0) override; /** @@ -219,8 +217,7 @@ class QuicTransportBase : public QuicSocket, * If policy == std::nullopt, the policy is removed for corresponding stream * group id (reset to the default rtx policy). */ - folly::Expected - setStreamGroupRetransmissionPolicy( + quic::Expected setStreamGroupRetransmissionPolicy( StreamGroupId groupId, std::optional policy) noexcept override; @@ -237,13 +234,13 @@ class QuicTransportBase : public QuicSocket, } protected: - folly::Expected pauseOrResumeRead( + quic::Expected pauseOrResumeRead( StreamId id, bool resume); - folly::Expected pauseOrResumePeek( + quic::Expected pauseOrResumePeek( StreamId id, bool resume); - folly::Expected setPeekCallbackInternal( + quic::Expected setPeekCallbackInternal( StreamId id, PeekCallback* cb) noexcept; diff --git a/quic/api/QuicTransportBaseLite.cpp b/quic/api/QuicTransportBaseLite.cpp index 4c14d89ec..566e98d51 100644 --- a/quic/api/QuicTransportBaseLite.cpp +++ b/quic/api/QuicTransportBaseLite.cpp @@ -127,7 +127,7 @@ void QuicTransportBaseLite::onNetworkData( auto packets = std::move(networkData).movePackets(); for (auto& packet : packets) { auto res = onReadData(peer, std::move(packet)); - if (res.hasError()) { + if (!res.has_value()) { VLOG(4) << __func__ << " " << res.error().message << " " << *this; exceptionCloseWhat_ = res.error().message; return closeImpl(res.error()); @@ -171,7 +171,7 @@ void QuicTransportBaseLite::onNetworkData( // If ECN is enabled, make sure that the packet marking is happening as // expected auto ecnResult = validateECNState(); - if (ecnResult.hasError()) { + if (!ecnResult.has_value()) { VLOG(4) << __func__ << " " << ecnResult.error().message << " " << *this; exceptionCloseWhat_ = ecnResult.error().message; closeImpl(ecnResult.error()); @@ -180,7 +180,7 @@ void QuicTransportBaseLite::onNetworkData( // In the closed state, we would want to write a close if possible // however the write looper will not be set. auto result = writeSocketData(); - if (result.hasError()) { + if (!result.has_value()) { VLOG(4) << __func__ << " " << result.error().message << " " << *this; exceptionCloseWhat_ = result.error().message; closeImpl(result.error()); @@ -237,23 +237,23 @@ void QuicTransportBaseLite::closeNow(Optional errorCode) { } } -folly::Expected QuicTransportBaseLite::stopSending( +quic::Expected QuicTransportBaseLite::stopSending( StreamId id, ApplicationErrorCode error) { if (isSendingStream(conn_->nodeType, id)) { - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } if (closeState_ != CloseState::OPEN) { - return folly::makeUnexpected(LocalErrorCode::CONNECTION_CLOSED); + return quic::make_unexpected(LocalErrorCode::CONNECTION_CLOSED); } if (!conn_->streamManager->streamExists(id)) { - return folly::makeUnexpected(LocalErrorCode::STREAM_NOT_EXISTS); + return quic::make_unexpected(LocalErrorCode::STREAM_NOT_EXISTS); } auto* stream = conn_->streamManager->getStream(id).value_or(nullptr); CHECK(stream) << "Invalid stream in " << __func__ << ": " << id; if (stream->recvState == StreamRecvState::Closed) { // skip STOP_SENDING if ingress is already closed - return folly::unit; + return {}; } if (conn_->transportSettings.dropIngressOnStopSending) { @@ -262,15 +262,15 @@ folly::Expected QuicTransportBaseLite::stopSending( // send STOP_SENDING frame to peer sendSimpleFrame(*conn_, StopSendingFrame(id, error)); updateWriteLooper(true); - return folly::unit; + return {}; } -folly::Expected +quic::Expected QuicTransportBaseLite::createBidirectionalStream(bool /*replaySafe*/) { return createStreamInternal(true); } -folly::Expected +quic::Expected QuicTransportBaseLite::createUnidirectionalStream(bool /*replaySafe*/) { return createStreamInternal(false); } @@ -297,22 +297,22 @@ QuicSocketLite::WriteResult QuicTransportBaseLite::writeChain( bool eof, ByteEventCallback* cb) { if (isReceivingStream(conn_->nodeType, id)) { - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } if (closeState_ != CloseState::OPEN) { - return folly::makeUnexpected(LocalErrorCode::CONNECTION_CLOSED); + return quic::make_unexpected(LocalErrorCode::CONNECTION_CLOSED); } [[maybe_unused]] auto self = sharedGuard(); try { // Check whether stream exists before calling getStream to avoid // creating a peer stream if it does not exist yet. if (!conn_->streamManager->streamExists(id)) { - return folly::makeUnexpected(LocalErrorCode::STREAM_NOT_EXISTS); + return quic::make_unexpected(LocalErrorCode::STREAM_NOT_EXISTS); } auto stream = conn_->streamManager->getStream(id).value_or(nullptr); CHECK(stream) << "Invalid stream in " << __func__ << ": " << id; if (!stream->writable()) { - return folly::makeUnexpected(LocalErrorCode::STREAM_CLOSED); + return quic::make_unexpected(LocalErrorCode::STREAM_CLOSED); } // Register DeliveryCallback for the data + eof offset. if (cb) { @@ -320,8 +320,17 @@ QuicSocketLite::WriteResult QuicTransportBaseLite::writeChain( (data ? data->computeChainDataLength() : 0) + (eof ? 1 : 0); if (dataLength) { auto currentLargestWriteOffset = getLargestWriteOffsetSeen(*stream); - registerDeliveryCallback( + auto deliveryResult = registerDeliveryCallback( id, currentLargestWriteOffset + dataLength - 1, cb); + if (!deliveryResult.has_value()) { + VLOG(4) << "Failed to register delivery callback: " + << toString(deliveryResult.error()); + exceptionCloseWhat_ = "Failed to register delivery callback"; + closeImpl(QuicError( + deliveryResult.error(), + std::string("registerDeliveryCallback() error"))); + return quic::make_unexpected(LocalErrorCode::TRANSPORT_ERROR); + } } } bool wasAppLimitedOrIdle = false; @@ -330,13 +339,13 @@ QuicSocketLite::WriteResult QuicTransportBaseLite::writeChain( wasAppLimitedOrIdle |= conn_->streamManager->isAppIdle(); } auto result = writeDataToQuicStream(*stream, std::move(data), eof); - if (result.hasError()) { + if (!result.has_value()) { VLOG(4) << __func__ << " streamId=" << id << " " << result.error().message << " " << *this; exceptionCloseWhat_ = result.error().message; closeImpl( QuicError(result.error().code, std::string("writeChain() error"))); - return folly::makeUnexpected(LocalErrorCode::TRANSPORT_ERROR); + return quic::make_unexpected(LocalErrorCode::TRANSPORT_ERROR); } // If we were previously app limited restart pacing with the current rate. if (wasAppLimitedOrIdle && conn_->pacer) { @@ -349,14 +358,14 @@ QuicSocketLite::WriteResult QuicTransportBaseLite::writeChain( exceptionCloseWhat_ = ex.what(); closeImpl(QuicError( QuicErrorCode(ex.errorCode()), std::string("writeChain() error"))); - return folly::makeUnexpected(LocalErrorCode::TRANSPORT_ERROR); + return quic::make_unexpected(LocalErrorCode::TRANSPORT_ERROR); } catch (const QuicInternalException& ex) { VLOG(4) << __func__ << " streamId=" << id << " " << ex.what() << " " << *this; exceptionCloseWhat_ = ex.what(); closeImpl(QuicError( QuicErrorCode(ex.errorCode()), std::string("writeChain() error"))); - return folly::makeUnexpected(ex.errorCode()); + return quic::make_unexpected(ex.errorCode()); } catch (const std::exception& ex) { VLOG(4) << __func__ << " streamId=" << id << " " << ex.what() << " " << *this; @@ -364,9 +373,9 @@ QuicSocketLite::WriteResult QuicTransportBaseLite::writeChain( closeImpl(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::string("writeChain() error"))); - return folly::makeUnexpected(LocalErrorCode::INTERNAL_ERROR); + return quic::make_unexpected(LocalErrorCode::INTERNAL_ERROR); } - return folly::unit; + return {}; } Optional QuicTransportBaseLite::shutdownWrite(StreamId id) { @@ -376,7 +385,7 @@ Optional QuicTransportBaseLite::shutdownWrite(StreamId id) { return std::nullopt; } -folly::Expected +quic::Expected QuicTransportBaseLite::registerDeliveryCallback( StreamId id, uint64_t offset, @@ -384,14 +393,14 @@ QuicTransportBaseLite::registerDeliveryCallback( return registerByteEventCallback(ByteEvent::Type::ACK, id, offset, cb); } -folly::Expected +quic::Expected QuicTransportBaseLite::notifyPendingWriteOnConnection( ConnectionWriteCallback* wcb) { if (closeState_ != CloseState::OPEN) { - return folly::makeUnexpected(LocalErrorCode::CONNECTION_CLOSED); + return quic::make_unexpected(LocalErrorCode::CONNECTION_CLOSED); } if (connWriteCallback_ != nullptr) { - return folly::makeUnexpected(LocalErrorCode::INVALID_WRITE_CALLBACK); + return quic::make_unexpected(LocalErrorCode::INVALID_WRITE_CALLBACK); } // Assign the write callback before going into the loop so that if we close // the connection while we are still scheduled, the write callback will get @@ -409,31 +418,31 @@ QuicTransportBaseLite::notifyPendingWriteOnConnection( connWriteCallback->onConnectionWriteReady(connWritableBytes); } }); - return folly::unit; + return {}; } -folly::Expected +quic::Expected QuicTransportBaseLite::unregisterStreamWriteCallback(StreamId id) { if (!conn_->streamManager->streamExists(id)) { - return folly::makeUnexpected(LocalErrorCode::STREAM_NOT_EXISTS); + return quic::make_unexpected(LocalErrorCode::STREAM_NOT_EXISTS); } if (pendingWriteCallbacks_.find(id) == pendingWriteCallbacks_.end()) { - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } pendingWriteCallbacks_.erase(id); - return folly::unit; + return {}; } -folly::Expected QuicTransportBaseLite::resetStream( +quic::Expected QuicTransportBaseLite::resetStream( StreamId id, ApplicationErrorCode errorCode) { return resetStreamInternal(id, errorCode, false /* reliable */); } -folly::Expected +quic::Expected QuicTransportBaseLite::updateReliableDeliveryCheckpoint(StreamId id) { if (!conn_->streamManager->streamExists(id)) { - return folly::makeUnexpected(LocalErrorCode::STREAM_NOT_EXISTS); + return quic::make_unexpected(LocalErrorCode::STREAM_NOT_EXISTS); } auto stream = CHECK_NOTNULL(conn_->streamManager->getStream(id).value_or(nullptr)); @@ -441,20 +450,19 @@ QuicTransportBaseLite::updateReliableDeliveryCheckpoint(StreamId id) { // We already sent a reset, so there's really no reason why we should be // doing any more checkpointing, especially since we cannot // increase the reliable size in subsequent resets. - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } stream->reliableResetCheckpoint = stream->currentWriteOffset + stream->pendingWrites.chainLength(); - return folly::Unit(); + return {}; } -folly::Expected -QuicTransportBaseLite::resetStreamReliably( +quic::Expected QuicTransportBaseLite::resetStreamReliably( StreamId id, ApplicationErrorCode errorCode) { if (!conn_->transportSettings.advertisedReliableResetStreamSupport || !conn_->peerAdvertisedReliableStreamResetSupport) { - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } return resetStreamInternal(id, errorCode, true /* reliable */); } @@ -488,27 +496,27 @@ void QuicTransportBaseLite::cancelByteEventCallbacksForStream( }); } -folly::Expected +quic::Expected QuicTransportBaseLite::notifyPendingWriteOnStream( StreamId id, StreamWriteCallback* wcb) { if (isReceivingStream(conn_->nodeType, id)) { - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } if (closeState_ != CloseState::OPEN) { - return folly::makeUnexpected(LocalErrorCode::CONNECTION_CLOSED); + return quic::make_unexpected(LocalErrorCode::CONNECTION_CLOSED); } if (!conn_->streamManager->streamExists(id)) { - return folly::makeUnexpected(LocalErrorCode::STREAM_NOT_EXISTS); + return quic::make_unexpected(LocalErrorCode::STREAM_NOT_EXISTS); } auto stream = conn_->streamManager->getStream(id).value_or(nullptr); CHECK(stream) << "Invalid stream in " << __func__ << ": " << id; if (!stream->writable()) { - return folly::makeUnexpected(LocalErrorCode::STREAM_CLOSED); + return quic::make_unexpected(LocalErrorCode::STREAM_CLOSED); } if (wcb == nullptr) { - return folly::makeUnexpected(LocalErrorCode::INVALID_WRITE_CALLBACK); + return quic::make_unexpected(LocalErrorCode::INVALID_WRITE_CALLBACK); } // Add the callback to the pending write callbacks so that if we are closed // while we are scheduled in the loop, the close will error out the @@ -516,9 +524,9 @@ QuicTransportBaseLite::notifyPendingWriteOnStream( auto wcbEmplaceResult = pendingWriteCallbacks_.emplace(id, wcb); if (!wcbEmplaceResult.second) { if ((wcbEmplaceResult.first)->second != wcb) { - return folly::makeUnexpected(LocalErrorCode::INVALID_WRITE_CALLBACK); + return quic::make_unexpected(LocalErrorCode::INVALID_WRITE_CALLBACK); } else { - return folly::makeUnexpected(LocalErrorCode::CALLBACK_ALREADY_INSTALLED); + return quic::make_unexpected(LocalErrorCode::CALLBACK_ALREADY_INSTALLED); } } runOnEvbAsync([id](auto self) { @@ -548,27 +556,27 @@ QuicTransportBaseLite::notifyPendingWriteOnStream( writeCallback->onStreamWriteReady(id, maxCanWrite); } }); - return folly::unit; + return {}; } -folly::Expected +quic::Expected QuicTransportBaseLite::registerByteEventCallback( const ByteEvent::Type type, const StreamId id, const uint64_t offset, ByteEventCallback* cb) { if (isReceivingStream(conn_->nodeType, id)) { - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } if (closeState_ != CloseState::OPEN) { - return folly::makeUnexpected(LocalErrorCode::CONNECTION_CLOSED); + return quic::make_unexpected(LocalErrorCode::CONNECTION_CLOSED); } [[maybe_unused]] auto self = sharedGuard(); if (!conn_->streamManager->streamExists(id)) { - return folly::makeUnexpected(LocalErrorCode::STREAM_NOT_EXISTS); + return quic::make_unexpected(LocalErrorCode::STREAM_NOT_EXISTS); } if (!cb) { - return folly::unit; + return {}; } ByteEventMap& byteEventMap = getByteEventMap(type); @@ -597,7 +605,7 @@ QuicTransportBaseLite::registerByteEventCallback( // ByteEvent has been already registered for the same type, id, // offset and for the same recipient, return an INVALID_OPERATION // error to prevent duplicate registrations. - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } } byteEventMapIt->second.emplace(pos, offset, cb); @@ -653,7 +661,7 @@ QuicTransportBaseLite::registerByteEventCallback( cb->onByteEvent(ByteEvent{id, offset, type}); }); } - return folly::unit; + return {}; } bool QuicTransportBaseLite::good() const { @@ -701,30 +709,29 @@ Optional QuicTransportBaseLite::setControlStream(StreamId id) { return std::nullopt; } -folly::Expected -QuicTransportBaseLite::setReadCallback( +quic::Expected QuicTransportBaseLite::setReadCallback( StreamId id, ReadCallback* cb, Optional err) { if (isSendingStream(conn_->nodeType, id)) { - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } if (cb != nullptr && closeState_ != CloseState::OPEN) { - return folly::makeUnexpected(LocalErrorCode::CONNECTION_CLOSED); + return quic::make_unexpected(LocalErrorCode::CONNECTION_CLOSED); } if (!conn_->streamManager->streamExists(id)) { - return folly::makeUnexpected(LocalErrorCode::STREAM_NOT_EXISTS); + return quic::make_unexpected(LocalErrorCode::STREAM_NOT_EXISTS); } return setReadCallbackInternal(id, cb, err); } -folly::Expected, LocalErrorCode> +quic::Expected, LocalErrorCode> QuicTransportBaseLite::read(StreamId id, size_t maxLen) { if (isSendingStream(conn_->nodeType, id)) { - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } if (closeState_ != CloseState::OPEN) { - return folly::makeUnexpected(LocalErrorCode::CONNECTION_CLOSED); + return quic::make_unexpected(LocalErrorCode::CONNECTION_CLOSED); } [[maybe_unused]] auto self = sharedGuard(); SCOPE_EXIT { @@ -734,17 +741,17 @@ QuicTransportBaseLite::read(StreamId id, size_t maxLen) { }; try { if (!conn_->streamManager->streamExists(id)) { - return folly::makeUnexpected(LocalErrorCode::STREAM_NOT_EXISTS); + return quic::make_unexpected(LocalErrorCode::STREAM_NOT_EXISTS); } auto stream = conn_->streamManager->getStream(id).value_or(nullptr); CHECK(stream) << "Invalid stream in " << __func__ << ": " << id; auto readResult = readDataFromQuicStream(*stream, maxLen); - if (readResult.hasError()) { + if (!readResult.has_value()) { VLOG(4) << "read() error " << readResult.error().message << " " << *this; exceptionCloseWhat_ = readResult.error().message; closeImpl(QuicError( QuicErrorCode(readResult.error().code), std::string("read() error"))); - return folly::makeUnexpected(LocalErrorCode::TRANSPORT_ERROR); + return quic::make_unexpected(LocalErrorCode::TRANSPORT_ERROR); } auto result = std::move(readResult.value()); if (result.second) { @@ -758,26 +765,27 @@ QuicTransportBaseLite::read(StreamId id, size_t maxLen) { it->second.deliveredEOM = true; } } - return folly::makeExpected(std::move(result)); + return quic::Expected, LocalErrorCode>( + std::move(result)); } catch (const QuicTransportException& ex) { VLOG(4) << "read() error " << ex.what() << " " << *this; exceptionCloseWhat_ = ex.what(); closeImpl( QuicError(QuicErrorCode(ex.errorCode()), std::string("read() error"))); - return folly::makeUnexpected(LocalErrorCode::TRANSPORT_ERROR); + return quic::make_unexpected(LocalErrorCode::TRANSPORT_ERROR); } catch (const QuicInternalException& ex) { VLOG(4) << __func__ << " " << ex.what() << " " << *this; exceptionCloseWhat_ = ex.what(); closeImpl( QuicError(QuicErrorCode(ex.errorCode()), std::string("read() error"))); - return folly::makeUnexpected(ex.errorCode()); + return quic::make_unexpected(ex.errorCode()); } catch (const std::exception& ex) { VLOG(4) << "read() error " << ex.what() << " " << *this; exceptionCloseWhat_ = ex.what(); closeImpl(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::string("read() error"))); - return folly::makeUnexpected(LocalErrorCode::INTERNAL_ERROR); + return quic::make_unexpected(LocalErrorCode::INTERNAL_ERROR); } } @@ -815,24 +823,23 @@ const std::shared_ptr QuicTransportBaseLite::getQLogger() const { return conn_->qLogger; } -folly::Expected -QuicTransportBaseLite::setPriorityQueue(std::unique_ptr queue) { +quic::Expected QuicTransportBaseLite::setPriorityQueue( + std::unique_ptr queue) { if (conn_) { return conn_->streamManager->setPriorityQueue(std::move(queue)); } - return folly::makeUnexpected(LocalErrorCode::INTERNAL_ERROR); + return quic::make_unexpected(LocalErrorCode::INTERNAL_ERROR); } -folly::Expected -QuicTransportBaseLite::setStreamPriority( +quic::Expected QuicTransportBaseLite::setStreamPriority( StreamId id, PriorityQueue::Priority priority) { if (closeState_ != CloseState::OPEN) { - return folly::makeUnexpected(LocalErrorCode::CONNECTION_CLOSED); + return quic::make_unexpected(LocalErrorCode::CONNECTION_CLOSED); } if (!conn_->streamManager->streamExists(id)) { // It's not an error to try to prioritize a non-existent stream. - return folly::unit; + return {}; } // It's not an error to prioritize a stream after it's sent its FIN - this // can reprioritize retransmissions. @@ -841,19 +848,19 @@ QuicTransportBaseLite::setStreamPriority( priority, getSendConnFlowControlBytesWire(*conn_) > 0, conn_->qLogger); - return folly::unit; + return {}; } -folly::Expected -QuicTransportBaseLite::setMaxPacingRate(uint64_t maxRateBytesPerSec) { +quic::Expected QuicTransportBaseLite::setMaxPacingRate( + uint64_t maxRateBytesPerSec) { if (conn_->pacer) { conn_->pacer->setMaxPacingRate(maxRateBytesPerSec); - return folly::unit; + return {}; } else { LOG(WARNING) << "Cannot set max pacing rate without a pacer. Pacing Enabled = " << conn_->transportSettings.pacingEnabled; - return folly::makeUnexpected(LocalErrorCode::PACER_NOT_AVAILABLE); + return quic::make_unexpected(LocalErrorCode::PACER_NOT_AVAILABLE); } } @@ -922,10 +929,10 @@ QuicTransportBaseLite::getByteEventMapConst(const ByteEvent::Type type) const { folly::assume_unreachable(); } -folly::Expected +quic::Expected QuicTransportBaseLite::getStreamTransportInfo(StreamId id) const { if (!conn_->streamManager->streamExists(id)) { - return folly::makeUnexpected(LocalErrorCode::STREAM_NOT_EXISTS); + return quic::make_unexpected(LocalErrorCode::STREAM_NOT_EXISTS); } auto stream = conn_->streamManager->getStream(id).value_or(nullptr); CHECK(stream) << "Invalid stream in " << __func__ << ": " << id; @@ -963,10 +970,10 @@ uint64_t QuicTransportBaseLite::getConnectionBufferAvailable() const { return bufferSpaceAvailable(); } -folly::Expected +quic::Expected QuicTransportBaseLite::getStreamFlowControl(StreamId id) const { if (!conn_->streamManager->streamExists(id)) { - return folly::makeUnexpected(LocalErrorCode::STREAM_NOT_EXISTS); + return quic::make_unexpected(LocalErrorCode::STREAM_NOT_EXISTS); } auto stream = conn_->streamManager->getStream(id).value_or(nullptr); CHECK(stream) << "Invalid stream in " << __func__ << ": " << id; @@ -1127,7 +1134,7 @@ void QuicTransportBaseLite::maybeStopWriteLooperAndArmSocketWritableEvent() { // Re-arm the write event and stop the write // looper. auto resumeResult = socket_->resumeWrite(this); - if (resumeResult.hasError()) { + if (!resumeResult.has_value()) { exceptionCloseWhat_ = resumeResult.error().message; closeImpl(QuicError( resumeResult.error().code, @@ -1204,7 +1211,7 @@ void QuicTransportBaseLite::checkForClosedStream() { connCallback_->onStreamPreReaped(*itr); } auto result = conn_->streamManager->removeClosedStream(*itr); - if (result.hasError()) { + if (!result.has_value()) { exceptionCloseWhat_ = result.error().message; closeImpl(QuicError( result.error().code, std::string("checkForClosedStream() error"))); @@ -1230,7 +1237,7 @@ void QuicTransportBaseLite::writeSocketDataAndCatch() { [[maybe_unused]] auto self = sharedGuard(); try { auto result = writeSocketData(); - if (result.hasError()) { + if (!result.has_value()) { VLOG(4) << __func__ << " " << result.error().message << " " << *this; exceptionCloseWhat_ = result.error().message; closeImpl(result.error()); @@ -1296,8 +1303,7 @@ void QuicTransportBaseLite::pacedWriteDataToSocket() { writeSocketDataAndCatch(); } -folly::Expected -QuicTransportBaseLite::writeSocketData() { +quic::Expected QuicTransportBaseLite::writeSocketData() { if (socket_) { ++(conn_->writeCount); // incremented on each write (or write attempt) @@ -1318,7 +1324,7 @@ QuicTransportBaseLite::writeSocketData() { notifyStartWritingFromAppRateLimited(); } auto result = writeData(); - if (result.hasError()) { + if (!result.has_value()) { return result; } if (conn_->transportSettings.isPriming && conn_->primingData_.size() > 0) { @@ -1327,7 +1333,7 @@ QuicTransportBaseLite::writeSocketData() { } if (closeState_ != CloseState::CLOSED) { if (conn_->pendingEvents.closeTransport == true) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::PROTOCOL_VIOLATION, "Max packet number reached")); } @@ -1412,7 +1418,7 @@ QuicTransportBaseLite::writeSocketData() { scheduleAckTimeout(); schedulePathValidationTimeout(); updateWriteLooper(false); - return folly::unit; + return {}; } // TODO: t64691045 change the closeImpl API to include both the sanitized and @@ -1599,7 +1605,7 @@ void QuicTransportBaseLite::closeImpl( // We might be invoked from the destructor, so just send the connection // close directly. auto result = writeData(); - if (result.hasError()) { + if (!result.has_value()) { LOG(ERROR) << "close failed with error: " << result.error().message << " " << *this; } @@ -1683,16 +1689,15 @@ void QuicTransportBaseLite::processCallbacksAfterNetworkData() { cleanupAckEventState(); } -folly::Expected -QuicTransportBaseLite::resetStreamInternal( +quic::Expected QuicTransportBaseLite::resetStreamInternal( StreamId id, ApplicationErrorCode errorCode, bool reliable) { if (isReceivingStream(conn_->nodeType, id)) { - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } if (closeState_ != CloseState::OPEN) { - return folly::makeUnexpected(LocalErrorCode::CONNECTION_CLOSED); + return quic::make_unexpected(LocalErrorCode::CONNECTION_CLOSED); } [[maybe_unused]] auto self = sharedGuard(); SCOPE_EXIT { @@ -1705,14 +1710,14 @@ QuicTransportBaseLite::resetStreamInternal( // Check whether stream exists before calling getStream to avoid // creating a peer stream if it does not exist yet. if (!conn_->streamManager->streamExists(id)) { - return folly::makeUnexpected(LocalErrorCode::STREAM_NOT_EXISTS); + return quic::make_unexpected(LocalErrorCode::STREAM_NOT_EXISTS); } auto stream = conn_->streamManager->getStream(id).value_or(nullptr); CHECK(stream) << "Invalid stream in " << __func__ << ": " << id; if (stream->appErrorCodeToPeer && *stream->appErrorCodeToPeer != errorCode) { // We can't change the error code across resets for a stream - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } Optional maybeReliableSize = std::nullopt; if (reliable) { @@ -1721,23 +1726,23 @@ QuicTransportBaseLite::resetStreamInternal( if (stream->reliableSizeToPeer && maybeReliableSize && *maybeReliableSize > *stream->reliableSizeToPeer) { // We can't increase the reliable size in a reset - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } if (maybeReliableSize && *maybeReliableSize > 0 && (stream->sendState == StreamSendState::ResetSent)) { // We can't send a reliable reset with a non-zero reliable size if // we've already sent a non-reliable reset - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } // Invoke state machine auto result = sendRstSMHandler(*stream, errorCode, maybeReliableSize); - if (result.hasError()) { + if (!result.has_value()) { VLOG(4) << __func__ << " streamId=" << id << " " << result.error().message << " " << *this; exceptionCloseWhat_ = result.error().message; closeImpl( QuicError(result.error().code, std::string("resetStream() error"))); - return folly::makeUnexpected(LocalErrorCode::TRANSPORT_ERROR); + return quic::make_unexpected(LocalErrorCode::TRANSPORT_ERROR); } // Cancel all byte events for this stream which have offsets that don't @@ -1758,14 +1763,14 @@ QuicTransportBaseLite::resetStreamInternal( exceptionCloseWhat_ = ex.what(); closeImpl(QuicError( QuicErrorCode(ex.errorCode()), std::string("resetStream() error"))); - return folly::makeUnexpected(LocalErrorCode::TRANSPORT_ERROR); + return quic::make_unexpected(LocalErrorCode::TRANSPORT_ERROR); } catch (const QuicInternalException& ex) { VLOG(4) << __func__ << " streamId=" << id << " " << ex.what() << " " << *this; exceptionCloseWhat_ = ex.what(); closeImpl(QuicError( QuicErrorCode(ex.errorCode()), std::string("resetStream() error"))); - return folly::makeUnexpected(ex.errorCode()); + return quic::make_unexpected(ex.errorCode()); } catch (const std::exception& ex) { VLOG(4) << __func__ << " streamId=" << id << " " << ex.what() << " " << *this; @@ -1773,9 +1778,9 @@ QuicTransportBaseLite::resetStreamInternal( closeImpl(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::string("resetStream() error"))); - return folly::makeUnexpected(LocalErrorCode::INTERNAL_ERROR); + return quic::make_unexpected(LocalErrorCode::INTERNAL_ERROR); } - return folly::unit; + return {}; } void QuicTransportBaseLite::cancelByteEventCallbacksForStreamInternal( @@ -2113,7 +2118,7 @@ void QuicTransportBaseLite::cleanupAckEventState() { } // memory allocated for vector will be freed } -folly::Expected +quic::Expected QuicTransportBaseLite::handleInitialWriteDataCommon( const ConnectionId& srcConnId, const ConnectionId& dstConnId, @@ -2147,7 +2152,7 @@ QuicTransportBaseLite::handleInitialWriteDataCommon( return WriteQuicDataResult{}; } -folly::Expected +quic::Expected QuicTransportBaseLite::handleHandshakeWriteDataCommon( const ConnectionId& srcConnId, const ConnectionId& dstConnId, @@ -2193,18 +2198,18 @@ void QuicTransportBaseLite::closeUdpSocket() { socket_ = nullptr; sock->pauseRead(); auto closeResult = sock->close(); - LOG_IF(ERROR, closeResult.hasError()) + LOG_IF(ERROR, !closeResult.has_value()) << "close hit an error: " << closeResult.error().message; } -folly::Expected +quic::Expected QuicTransportBaseLite::createStreamInternal( bool bidirectional, const OptionalIntegral& streamGroupId) { if (closeState_ != CloseState::OPEN) { - return folly::makeUnexpected(LocalErrorCode::CONNECTION_CLOSED); + return quic::make_unexpected(LocalErrorCode::CONNECTION_CLOSED); } - folly::Expected streamResult; + quic::Expected streamResult; if (bidirectional) { streamResult = conn_->streamManager->createNextBidirectionalStream(streamGroupId); @@ -2212,29 +2217,32 @@ QuicTransportBaseLite::createStreamInternal( streamResult = conn_->streamManager->createNextUnidirectionalStream(streamGroupId); } - if (streamResult) { - const StreamId streamId = streamResult.value()->id; - - if (getSocketObserverContainer() && - getSocketObserverContainer() - ->hasObserversForEvent< - SocketObserverInterface::Events::streamEvents>()) { - getSocketObserverContainer() - ->invokeInterfaceMethod< - SocketObserverInterface::Events::streamEvents>( - [event = SocketObserverInterface::StreamOpenEvent( - streamId, - getStreamInitiator(streamId), - getStreamDirectionality(streamId))]( - auto observer, auto observed) { - observer->streamOpened(observed, event); - }); - } - - return streamId; - } else { - return folly::makeUnexpected(streamResult.error()); + if (!streamResult.has_value()) { + return quic::make_unexpected(streamResult.error()); } + + auto* streamState = *streamResult; + if (!streamState) { + return quic::make_unexpected(LocalErrorCode::INTERNAL_ERROR); + } + + const StreamId streamId = streamState->id; + if (getSocketObserverContainer() && + getSocketObserverContainer() + ->hasObserversForEvent< + SocketObserverInterface::Events::streamEvents>()) { + getSocketObserverContainer() + ->invokeInterfaceMethod( + [event = SocketObserverInterface::StreamOpenEvent( + streamId, + getStreamInitiator(streamId), + getStreamDirectionality(streamId))]( + auto observer, auto observed) { + observer->streamOpened(observed, event); + }); + } + + return streamId; } void QuicTransportBaseLite::cancelTimeout(QuicTimerCallback* callback) { @@ -2254,7 +2262,7 @@ void QuicTransportBaseLite::lossTimeoutExpired() noexcept { [[maybe_unused]] auto self = sharedGuard(); try { auto result = onLossDetectionAlarm(*conn_, markPacketLoss); - if (result.hasError()) { + if (!result.has_value()) { closeImpl(QuicError( result.error().code, std::string("lossTimeoutExpired() error"))); return; @@ -2714,7 +2722,7 @@ void QuicTransportBaseLite::invokePeekDataAndCallbacks() { } } -folly::Expected +quic::Expected QuicTransportBaseLite::setReadCallbackInternal( StreamId id, ReadCallback* cb, @@ -2725,14 +2733,14 @@ QuicTransportBaseLite::setReadCallbackInternal( if (readCbIt == readCallbacks_.end()) { // Don't allow initial setting of a nullptr callback. if (!cb) { - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } readCbIt = readCallbacks_.emplace(id, ReadCallbackData(cb)).first; } auto& readCb = readCbIt->second.readCb; if (readCb == nullptr && cb != nullptr) { // It's already been set to nullptr we do not allow unsetting it. - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } else { readCb = cb; if (readCb == nullptr && err) { @@ -2740,7 +2748,7 @@ QuicTransportBaseLite::setReadCallbackInternal( } } updateReadLooper(); - return folly::unit; + return {}; } Optional @@ -2969,7 +2977,7 @@ void QuicTransportBaseLite::setTransportSettings( conn_->transportSettings = std::move(transportSettings); auto result = conn_->streamManager->refreshTransportSettings( conn_->transportSettings); - LOG_IF(FATAL, result.hasError()) << result.error().message; + LOG_IF(FATAL, !result.has_value()) << result.error().message; if (conn_->nodeType == QuicNodeType::Client && conn_->transportSettings.isPriming) { setSupportedVersions({QuicVersion::MVFST_PRIMING}); @@ -3070,16 +3078,16 @@ void QuicTransportBaseLite::addPacketProcessor( conn_->packetProcessors.push_back(std::move(packetProcessor)); } -folly::Expected QuicTransportBaseLite::setKnob( +quic::Expected QuicTransportBaseLite::setKnob( uint64_t knobSpace, uint64_t knobId, BufPtr knobBlob) { if (isKnobSupported()) { sendSimpleFrame(*conn_, KnobFrame(knobSpace, knobId, std::move(knobBlob))); - return folly::unit; + return {}; } LOG(ERROR) << "Cannot set knob. Peer does not support the knob frame"; - return folly::makeUnexpected(LocalErrorCode::KNOB_FRAME_UNSUPPORTED); + return quic::make_unexpected(LocalErrorCode::KNOB_FRAME_UNSUPPORTED); } bool QuicTransportBaseLite::isKnobSupported() const { @@ -3139,26 +3147,25 @@ void QuicTransportBaseLite::updateSocketTosSettings(uint8_t dscpValue) { if (socket_ && socket_->isBound() && conn_->socketTos.value != initialTosValue) { auto tosResult = socket_->setTosOrTrafficClass(conn_->socketTos.value); - if (tosResult.hasError()) { + if (!tosResult.has_value()) { exceptionCloseWhat_ = tosResult.error().message; return closeImpl(tosResult.error()); } } } -folly::Expected -QuicTransportBaseLite::validateECNState() { +quic::Expected QuicTransportBaseLite::validateECNState() { if (conn_->ecnState == ECNState::NotAttempted || conn_->ecnState == ECNState::FailedValidation) { // Verification not needed - return folly::unit; + return {}; } const auto& minExpectedMarkedPacketsCount = conn_->ackStates.appDataAckState.minimumExpectedEcnMarksEchoed; if (minExpectedMarkedPacketsCount < 10) { // We wait for 10 ack-eliciting app data packets to be marked before trying // to validate ECN. - return folly::unit; + return {}; } const auto& maxExpectedMarkedPacketsCount = conn_->lossState.totalPacketsSent; @@ -3219,7 +3226,7 @@ QuicTransportBaseLite::validateECNState() { conn_->socketTos.fields.ecn = 0; CHECK(socket_ && socket_->isBound()); auto result = socket_->setTosOrTrafficClass(conn_->socketTos.value); - if (result.hasError()) { + if (!result.has_value()) { return result; } @@ -3234,7 +3241,7 @@ QuicTransportBaseLite::validateECNState() { conn_->ecnL4sTracker.reset(); } } - return folly::unit; + return {}; } void QuicTransportBaseLite::scheduleAckTimeout() { diff --git a/quic/api/QuicTransportBaseLite.h b/quic/api/QuicTransportBaseLite.h index f0bcfc365..6bb5f73e6 100644 --- a/quic/api/QuicTransportBaseLite.h +++ b/quic/api/QuicTransportBaseLite.h @@ -29,7 +29,7 @@ class QuicTransportBaseLite : virtual public QuicSocketLite, * It may also throw an exception in case of an error in which case the * connection will be closed. */ - [[nodiscard]] virtual folly::Expected writeData() = 0; + [[nodiscard]] virtual quic::Expected writeData() = 0; // Interface with the Transport layer when data is available. // This is invoked when new data is received from the UDP socket. @@ -43,7 +43,7 @@ class QuicTransportBaseLite : virtual public QuicSocketLite, * The sub-class may throw an exception if there was an error in processing * the packet in which case the connection will be closed. */ - virtual folly::Expected onReadData( + virtual quic::Expected onReadData( const folly::SocketAddress& peer, ReceivedUdpPacket&& udpPacket) = 0; @@ -51,13 +51,13 @@ class QuicTransportBaseLite : virtual public QuicSocketLite, void closeNow(Optional error) override; - folly::Expected stopSending( + quic::Expected stopSending( StreamId id, ApplicationErrorCode error) override; - folly::Expected createBidirectionalStream( + quic::Expected createBidirectionalStream( bool replaySafe = true) override; - folly::Expected createUnidirectionalStream( + quic::Expected createUnidirectionalStream( bool replaySafe = true) override; uint64_t getNumOpenableBidirectionalStreams() const override; uint64_t getNumOpenableUnidirectionalStreams() const override; @@ -72,29 +72,29 @@ class QuicTransportBaseLite : virtual public QuicSocketLite, Optional shutdownWrite(StreamId id) override; - folly::Expected registerDeliveryCallback( + quic::Expected registerDeliveryCallback( StreamId id, uint64_t offset, ByteEventCallback* cb) override; - folly::Expected notifyPendingWriteOnStream( + quic::Expected notifyPendingWriteOnStream( StreamId id, StreamWriteCallback* wcb) override; - folly::Expected notifyPendingWriteOnConnection( + quic::Expected notifyPendingWriteOnConnection( ConnectionWriteCallback* wcb) override; - folly::Expected unregisterStreamWriteCallback( + quic::Expected unregisterStreamWriteCallback( StreamId id) override; - folly::Expected resetStream( + quic::Expected resetStream( StreamId id, ApplicationErrorCode errorCode) override; - folly::Expected updateReliableDeliveryCheckpoint( + quic::Expected updateReliableDeliveryCheckpoint( StreamId id) override; - folly::Expected resetStreamReliably( + quic::Expected resetStreamReliably( StreamId id, ApplicationErrorCode errorCode) override; @@ -134,7 +134,7 @@ class QuicTransportBaseLite : virtual public QuicSocketLite, * Register a byte event to be triggered when specified event type occurs for * the specified stream and offset. */ - folly::Expected registerByteEventCallback( + quic::Expected registerByteEventCallback( const ByteEvent::Type type, const StreamId id, const uint64_t offset, @@ -160,13 +160,13 @@ class QuicTransportBaseLite : virtual public QuicSocketLite, Optional setControlStream(StreamId id) override; - folly::Expected setReadCallback( + quic::Expected setReadCallback( StreamId id, ReadCallback* cb, Optional err = GenericApplicationErrorCode::NO_ERROR) override; - folly::Expected, LocalErrorCode> read( + quic::Expected, LocalErrorCode> read( StreamId id, size_t maxLen) override; @@ -206,7 +206,7 @@ class QuicTransportBaseLite : virtual public QuicSocketLite, * application can act on by e.g. changing transport settings during the * connection. */ - folly::Expected + quic::Expected setKnob(uint64_t knobSpace, uint64_t knobId, BufPtr knobBlob) override; /** @@ -214,10 +214,10 @@ class QuicTransportBaseLite : virtual public QuicSocketLite, */ [[nodiscard]] bool isKnobSupported() const override; - folly::Expected setPriorityQueue( + quic::Expected setPriorityQueue( std::unique_ptr queue) override; - folly::Expected setStreamPriority( + quic::Expected setStreamPriority( StreamId id, PriorityQueue::Priority priority) override; @@ -225,7 +225,7 @@ class QuicTransportBaseLite : virtual public QuicSocketLite, * Sets the maximum pacing rate in Bytes per second to be used * if pacing is enabled. */ - folly::Expected setMaxPacingRate( + quic::Expected setMaxPacingRate( uint64_t maxRateBytesPerSec) override; void setThrottlingSignalProvider( @@ -235,7 +235,7 @@ class QuicTransportBaseLite : virtual public QuicSocketLite, [[nodiscard]] std::shared_ptr getEventBase() const override; - folly::Expected getStreamTransportInfo( + quic::Expected getStreamTransportInfo( StreamId id) const override; const QuicConnectionStateBase* getState() const override { @@ -250,7 +250,7 @@ class QuicTransportBaseLite : virtual public QuicSocketLite, uint64_t getConnectionBufferAvailable() const override; - folly::Expected + quic::Expected getStreamFlowControl(StreamId id) const override; /** @@ -620,7 +620,7 @@ class QuicTransportBaseLite : virtual public QuicSocketLite, * both pacing oblivious and writeLooper oblivious. Caller needs to explicitly * invoke updateWriteLooper afterwards if that's desired. */ - [[nodiscard]] folly::Expected writeSocketData(); + [[nodiscard]] quic::Expected writeSocketData(); void closeImpl( Optional error, @@ -629,7 +629,7 @@ class QuicTransportBaseLite : virtual public QuicSocketLite, void processCallbacksAfterNetworkData(); - folly::Expected resetStreamInternal( + quic::Expected resetStreamInternal( StreamId id, ApplicationErrorCode errorCode, bool reliable); @@ -656,14 +656,14 @@ class QuicTransportBaseLite : virtual public QuicSocketLite, void handleConnWritable(); void cleanupAckEventState(); - [[nodiscard]] folly::Expected + [[nodiscard]] quic::Expected handleInitialWriteDataCommon( const ConnectionId& srcConnId, const ConnectionId& dstConnId, uint64_t packetLimit, const std::string& token = ""); - [[nodiscard]] folly::Expected + [[nodiscard]] quic::Expected handleHandshakeWriteDataCommon( const ConnectionId& srcConnId, const ConnectionId& dstConnId, @@ -671,7 +671,7 @@ class QuicTransportBaseLite : virtual public QuicSocketLite, void closeUdpSocket(); - folly::Expected createStreamInternal( + quic::Expected createStreamInternal( bool bidirectional, const OptionalIntegral& streamGroupId = std::nullopt); @@ -702,7 +702,7 @@ class QuicTransportBaseLite : virtual public QuicSocketLite, void invokeReadDataAndCallbacks(bool updateLoopersAndCheckForClosedStream); void invokePeekDataAndCallbacks(); - folly::Expected setReadCallbackInternal( + quic::Expected setReadCallbackInternal( StreamId id, ReadCallback* cb, Optional err) noexcept; @@ -777,7 +777,7 @@ class QuicTransportBaseLite : virtual public QuicSocketLite, * is not enabled or has already failed validation, this function does * nothing. */ - [[nodiscard]] folly::Expected validateECNState(); + [[nodiscard]] quic::Expected validateECNState(); std::shared_ptr evb_; std::unique_ptr socket_; diff --git a/quic/api/QuicTransportFunctions.cpp b/quic/api/QuicTransportFunctions.cpp index 61762c2c6..50097cac6 100644 --- a/quic/api/QuicTransportFunctions.cpp +++ b/quic/api/QuicTransportFunctions.cpp @@ -110,7 +110,7 @@ uint64_t maybeUnvalidatedClientWritableBytes( conn.udpSendPacketLen; } -folly::Expected writeQuicDataToSocketImpl( +quic::Expected writeQuicDataToSocketImpl( QuicAsyncUDPSocket& sock, QuicConnectionStateBase& connection, const ConnectionId& srcConnId, @@ -159,8 +159,8 @@ folly::Expected writeQuicDataToSocketImpl( aead, headerCipher, version); - if (!probeResult.hasValue()) { - return folly::makeUnexpected(probeResult.error()); + if (!probeResult.has_value()) { + return quic::make_unexpected(probeResult.error()); } probesWritten = probeResult->probesWritten; bytesWritten += probeResult->bytesWritten; @@ -206,8 +206,8 @@ folly::Expected writeQuicDataToSocketImpl( headerCipher, version, writeLoopBeginTime); - if (!connectionDataResult.hasValue()) { - return folly::makeUnexpected(connectionDataResult.error()); + if (!connectionDataResult.has_value()) { + return quic::make_unexpected(connectionDataResult.error()); } packetsWritten += connectionDataResult->packetsWritten; bytesWritten += connectionDataResult->bytesWritten; @@ -230,7 +230,7 @@ void updateErrnoCount( } } -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected continuousMemoryBuildScheduleEncrypt( QuicConnectionStateBase& connection, PacketHeader header, @@ -259,16 +259,16 @@ continuousMemoryBuildScheduleEncrypt( CHECK(scheduler.hasData()); auto result = scheduler.scheduleFramesForPacket(std::move(pktBuilder), writableBytes); - if (result.hasError()) { - return folly::makeUnexpected(result.error()); + if (!result.has_value()) { + return quic::make_unexpected(result.error()); } CHECK(connection.bufAccessor->ownsBuffer()); auto& packet = result->packet; if (!packet || packet->packet.frames.empty()) { rollbackBuf(); auto flushResult = ioBufBatch.flush(); - if (flushResult.hasError()) { - return folly::makeUnexpected(flushResult.error()); + if (!flushResult.has_value()) { + return quic::make_unexpected(flushResult.error()); } updateErrnoCount(connection, ioBufBatch); if (connection.loopDetectorCallback) { @@ -280,8 +280,8 @@ continuousMemoryBuildScheduleEncrypt( // No more space remaining. rollbackBuf(); auto flushResult = ioBufBatch.flush(); - if (flushResult.hasError()) { - return folly::makeUnexpected(flushResult.error()); + if (!flushResult.has_value()) { + return quic::make_unexpected(flushResult.error()); } updateErrnoCount(connection, ioBufBatch); if (connection.loopDetectorCallback) { @@ -304,8 +304,8 @@ continuousMemoryBuildScheduleEncrypt( auto buf = connection.bufAccessor->obtain(); auto encryptResult = aead.inplaceEncrypt(std::move(buf), &packet->header, packetNum); - if (encryptResult.hasError()) { - return folly::makeUnexpected(encryptResult.error()); + if (!encryptResult.has_value()) { + return quic::make_unexpected(encryptResult.error()); } auto packetBuf = std::move(encryptResult.value()); CHECK(packetBuf->headroom() == headerLen + prevSize); @@ -320,11 +320,11 @@ continuousMemoryBuildScheduleEncrypt( packetBuf->data() + headerLen, packetBuf->length() - headerLen, headerCipher); - if (headerEncryptResult.hasError()) { - return folly::makeUnexpected(headerEncryptResult.error()); + if (!headerEncryptResult.has_value()) { + return quic::make_unexpected(headerEncryptResult.error()); } - if (headerEncryptResult.hasError()) { - return folly::makeUnexpected(headerEncryptResult.error()); + if (!headerEncryptResult.has_value()) { + return quic::make_unexpected(headerEncryptResult.error()); } CHECK(!packetBuf->isChained()); auto encodedSize = packetBuf->length(); @@ -346,8 +346,8 @@ continuousMemoryBuildScheduleEncrypt( // TODO: I think we should add an API that doesn't need a buffer. auto writeResult = ioBufBatch.write(nullptr /* no need to pass buf */, encodedSize); - if (writeResult.hasError()) { - return folly::makeUnexpected(writeResult.error()); + if (!writeResult.has_value()) { + return quic::make_unexpected(writeResult.error()); } updateErrnoCount(connection, ioBufBatch); return DataPathResult::makeWriteResult( @@ -357,7 +357,7 @@ continuousMemoryBuildScheduleEncrypt( encodedBodySize); } -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected iobufChainBasedBuildScheduleEncrypt( QuicConnectionStateBase& connection, PacketHeader header, @@ -377,14 +377,14 @@ iobufChainBasedBuildScheduleEncrypt( pktBuilder.accountForCipherOverhead(cipherOverhead); auto result = scheduler.scheduleFramesForPacket(std::move(pktBuilder), writableBytes); - if (result.hasError()) { - return folly::makeUnexpected(result.error()); + if (!result.has_value()) { + return quic::make_unexpected(result.error()); } auto& packet = result->packet; if (!packet || packet->packet.frames.empty()) { auto flushResult = ioBufBatch.flush(); - if (flushResult.hasError()) { - return folly::makeUnexpected(flushResult.error()); + if (!flushResult.has_value()) { + return quic::make_unexpected(flushResult.error()); } updateErrnoCount(connection, ioBufBatch); if (connection.loopDetectorCallback) { @@ -395,8 +395,8 @@ iobufChainBasedBuildScheduleEncrypt( if (packet->body.empty()) { // No more space remaining. auto flushResult = ioBufBatch.flush(); - if (flushResult.hasError()) { - return folly::makeUnexpected(flushResult.error()); + if (!flushResult.has_value()) { + return quic::make_unexpected(flushResult.error()); } updateErrnoCount(connection, ioBufBatch); if (connection.loopDetectorCallback) { @@ -415,8 +415,8 @@ iobufChainBasedBuildScheduleEncrypt( unencrypted->append(bodyLen); auto encryptResult = aead.inplaceEncrypt(std::move(unencrypted), &packet->header, packetNum); - if (encryptResult.hasError()) { - return folly::makeUnexpected(encryptResult.error()); + if (!encryptResult.has_value()) { + return quic::make_unexpected(encryptResult.error()); } auto packetBuf = std::move(encryptResult.value()); DCHECK(packetBuf->headroom() == headerLen); @@ -433,8 +433,8 @@ iobufChainBasedBuildScheduleEncrypt( packetBuf->data() + headerLen, packetBuf->length() - headerLen, headerCipher); - if (headerEncryptResult.hasError()) { - return folly::makeUnexpected(headerEncryptResult.error()); + if (!headerEncryptResult.has_value()) { + return quic::make_unexpected(headerEncryptResult.error()); } auto encodedSize = packetBuf->computeChainDataLength(); auto encodedBodySize = encodedSize - headerLen; @@ -449,8 +449,8 @@ iobufChainBasedBuildScheduleEncrypt( true, std::move(result.value()), encodedSize, encodedBodySize); } auto writeResult = ioBufBatch.write(std::move(packetBuf), encodedSize); - if (writeResult.hasError()) { - return folly::makeUnexpected(writeResult.error()); + if (!writeResult.has_value()) { + return quic::make_unexpected(writeResult.error()); } updateErrnoCount(connection, ioBufBatch); return DataPathResult::makeWriteResult( @@ -591,7 +591,7 @@ void handleRetransmissionBufMetaWritten( * with new data, as well as retranmissions. Returns true if the data sent is * new data. */ -folly::Expected handleStreamWritten( +quic::Expected handleStreamWritten( QuicConnectionStateBase& conn, QuicStreamLike& stream, uint64_t frameOffset, @@ -605,7 +605,7 @@ folly::Expected handleStreamWritten( handleNewStreamDataWritten(stream, frameLen, frameFin); writtenNewData = true; } else if (frameOffset > stream.currentWriteOffset) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::INTERNAL_ERROR, fmt::format( "Byte offset of first byte in written stream frame ({}) is " @@ -696,7 +696,7 @@ bool handleStreamBufMetaWritten( return false; } -folly::Expected updateConnection( +quic::Expected updateConnection( QuicConnectionStateBase& conn, Optional clonedPacketIdentifier, RegularQuicWritePacket packet, @@ -730,7 +730,7 @@ folly::Expected updateConnection( auto streamResult = conn.streamManager->getStream(writeStreamFrame.streamId); if (!streamResult) { - return folly::makeUnexpected(streamResult.error()); + return quic::make_unexpected(streamResult.error()); } auto stream = streamResult.value(); bool newStreamDataWritten = false; @@ -752,16 +752,16 @@ folly::Expected updateConnection( writeStreamFrame.fin, packetNum, packetNumberSpace); - if (streamWrittenResult.hasError()) { - return folly::makeUnexpected(streamWrittenResult.error()); + if (!streamWrittenResult.has_value()) { + return quic::make_unexpected(streamWrittenResult.error()); } newStreamDataWritten = streamWrittenResult.value(); } if (newStreamDataWritten) { auto flowControlResult = updateFlowControlOnWriteToSocket(*stream, writeStreamFrame.len); - if (flowControlResult.hasError()) { - return folly::makeUnexpected(flowControlResult.error()); + if (!flowControlResult.has_value()) { + return quic::make_unexpected(flowControlResult.error()); } maybeWriteBlockAfterSocketWrite(*stream); maybeWriteDataBlockedAfterSocketWrite(conn); @@ -791,8 +791,8 @@ folly::Expected updateConnection( false /* fin */, packetNum, packetNumberSpace); - if (cryptoWritten.hasError()) { - return folly::makeUnexpected(cryptoWritten.error()); + if (!cryptoWritten.has_value()) { + return quic::make_unexpected(cryptoWritten.error()); } break; } @@ -858,8 +858,8 @@ folly::Expected updateConnection( *frame.asMaxStreamDataFrame(); auto streamResult = conn.streamManager->getStream(maxStreamDataFrame.streamId); - if (streamResult.hasError()) { - return folly::makeUnexpected(streamResult.error()); + if (!streamResult.has_value()) { + return quic::make_unexpected(streamResult.error()); } auto stream = streamResult.value(); retransmittable = true; @@ -964,7 +964,7 @@ folly::Expected updateConnection( if (!retransmittable && !isPing) { DCHECK(!clonedPacketIdentifier); - return folly::unit; + return {}; } conn.lossState.totalAckElicitingPacketsSent++; @@ -1053,7 +1053,7 @@ folly::Expected updateConnection( } else { ++conn.outstandings.packetCount[packetNumberSpace]; } - return folly::unit; + return {}; } uint64_t probePacketWritableBytes(QuicConnectionStateBase& conn) { @@ -1137,7 +1137,7 @@ HeaderBuilder ShortHeaderBuilder(ProtectionType keyPhase) { }; } -folly::Expected writeCryptoAndAckDataToSocket( +quic::Expected writeCryptoAndAckDataToSocket( QuicAsyncUDPSocket& sock, QuicConnectionStateBase& connection, const ConnectionId& srcConnId, @@ -1185,8 +1185,8 @@ folly::Expected writeCryptoAndAckDataToSocket( headerCipher, version, token); - if (probeResult.hasError()) { - return folly::makeUnexpected(probeResult.error()); + if (!probeResult.has_value()) { + return quic::make_unexpected(probeResult.error()); } probesWritten += probeResult->probesWritten; bytesWritten += probeResult->bytesWritten; @@ -1211,8 +1211,8 @@ folly::Expected writeCryptoAndAckDataToSocket( Clock::now(), token); - if (writeResult.hasError()) { - return folly::makeUnexpected(writeResult.error()); + if (!writeResult.has_value()) { + return quic::make_unexpected(writeResult.error()); } packetsWritten += writeResult->packetsWritten; @@ -1235,8 +1235,8 @@ folly::Expected writeCryptoAndAckDataToSocket( headerCipher, version, token); - if (cloneResult.hasError()) { - return folly::makeUnexpected(cloneResult.error()); + if (!cloneResult.has_value()) { + return quic::make_unexpected(cloneResult.error()); } probesWritten += cloneResult->probesWritten; bytesWritten += cloneResult->bytesWritten; @@ -1251,7 +1251,7 @@ folly::Expected writeCryptoAndAckDataToSocket( return result; } -folly::Expected writeQuicDataToSocket( +quic::Expected writeQuicDataToSocket( QuicAsyncUDPSocket& sock, QuicConnectionStateBase& connection, const ConnectionId& srcConnId, @@ -1274,7 +1274,7 @@ folly::Expected writeQuicDataToSocket( writeLoopBeginTime); } -folly::Expected +quic::Expected writeQuicDataExceptCryptoStreamToSocket( QuicAsyncUDPSocket& socket, QuicConnectionStateBase& connection, @@ -1297,7 +1297,7 @@ writeQuicDataExceptCryptoStreamToSocket( Clock::now()); } -folly::Expected writeZeroRttDataToSocket( +quic::Expected writeZeroRttDataToSocket( QuicAsyncUDPSocket& socket, QuicConnectionStateBase& connection, const ConnectionId& srcConnId, @@ -1339,8 +1339,8 @@ folly::Expected writeZeroRttDataToSocket( version, Clock::now()); - if (writeResult.hasError()) { - return folly::makeUnexpected(writeResult.error()); + if (!writeResult.has_value()) { + return quic::make_unexpected(writeResult.error()); } auto written = writeResult->packetsWritten; @@ -1372,7 +1372,7 @@ void writeCloseCommon( header, getAckState(connection, pnSpace).largestAckedByPeer.value_or(0)); auto encodeResult = packetBuilder.encodePacketHeader(); - if (encodeResult.hasError()) { + if (!encodeResult.has_value()) { LOG(ERROR) << "Error encoding packet header: " << encodeResult.error().message; return; @@ -1385,7 +1385,7 @@ void writeCloseCommon( QuicErrorCode(TransportErrorCode::NO_ERROR), std::string("No error")), packetBuilder); - if (writeResult.hasError()) { + if (!writeResult.has_value()) { LOG(ERROR) << "Error writing frame: " << writeResult.error().message; return; } @@ -1399,7 +1399,7 @@ void writeCloseCommon( closeDetails->message, quic::FrameType::CONNECTION_CLOSE_APP_ERR), packetBuilder); - if (writeResult.hasError()) { + if (!writeResult.has_value()) { LOG(ERROR) << "Error writing frame: " << writeResult.error().message; return; } @@ -1413,7 +1413,7 @@ void writeCloseCommon( closeDetails->message, quic::FrameType::CONNECTION_CLOSE), packetBuilder); - if (writeResult.hasError()) { + if (!writeResult.has_value()) { LOG(ERROR) << "Error writing frame: " << writeResult.error().message; return; } @@ -1427,7 +1427,7 @@ void writeCloseCommon( std::string("Internal error"), quic::FrameType::CONNECTION_CLOSE), packetBuilder); - if (writeResult.hasError()) { + if (!writeResult.has_value()) { LOG(ERROR) << "Error writing frame: " << writeResult.error().message; return; } @@ -1440,7 +1440,7 @@ void writeCloseCommon( connection.nodeType == QuicNodeType::Client) { while (packetBuilder.remainingSpaceInPkt() > 0) { auto paddingResult = writeFrame(PaddingFrame(), packetBuilder); - if (paddingResult.hasError()) { + if (!paddingResult.has_value()) { LOG(ERROR) << "Error writing padding frame: " << paddingResult.error().message; return; @@ -1456,19 +1456,24 @@ void writeCloseCommon( auto bufUniquePtr = packet.body.clone(); auto encryptResult = aead.inplaceEncrypt(std::move(bufUniquePtr), &packet.header, packetNum); - if (encryptResult.hasError()) { + if (!encryptResult.has_value()) { LOG(ERROR) << "Error encrypting packet: " << encryptResult.error().message; return; } bufUniquePtr = std::move(encryptResult.value()); bufUniquePtr->coalesce(); - encryptPacketHeader( + auto headerEncryptResult = encryptPacketHeader( headerForm, packet.header.writableData(), packet.header.length(), bufUniquePtr->data(), bufUniquePtr->length(), headerCipher); + if (!headerEncryptResult.has_value()) { + LOG(ERROR) << "Failed to encrypt packet header: " + << headerEncryptResult.error().message; + return; + } Buf packetBuf(std::move(packet.header)); packetBuf.appendToChain(std::move(bufUniquePtr)); auto packetSize = packetBuf.computeChainDataLength(); @@ -1546,7 +1551,7 @@ void writeShortClose( headerCipher); } -folly::Expected encryptPacketHeader( +quic::Expected encryptPacketHeader( HeaderForm headerForm, uint8_t* header, size_t headerLen, @@ -1569,17 +1574,17 @@ folly::Expected encryptPacketHeader( if (headerForm == HeaderForm::Short) { auto result = headerCipher.encryptShortHeader( sample, initialByteRange, packetNumByteRange); - if (result.hasError()) { - return folly::makeUnexpected(result.error()); + if (!result.has_value()) { + return quic::make_unexpected(result.error()); } } else { auto result = headerCipher.encryptLongHeader( sample, initialByteRange, packetNumByteRange); - if (result.hasError()) { - return folly::makeUnexpected(result.error()); + if (!result.has_value()) { + return quic::make_unexpected(result.error()); } } - return folly::unit; + return {}; } /** @@ -1640,7 +1645,7 @@ folly::Expected encryptPacketHeader( * network, since currently there is no way to rewind scheduler and connection * state after the packets have been written to a batch. */ -folly::Expected writeConnectionDataToSocket( +quic::Expected writeConnectionDataToSocket( QuicAsyncUDPSocket& sock, QuicConnectionStateBase& connection, const ConnectionId& srcConnId, @@ -1678,9 +1683,9 @@ folly::Expected writeConnectionDataToSocket( if (!connection.gsoSupported.has_value()) { auto gsoResult = sock.getGSO(); - if (gsoResult.hasError()) { + if (!gsoResult.has_value()) { LOG(ERROR) << "Failed to get GSO: " << gsoResult.error().message; - return folly::makeUnexpected(gsoResult.error()); + return quic::make_unexpected(gsoResult.error()); } connection.gsoSupported = sock.getGSO().value() >= 0; } @@ -1707,8 +1712,8 @@ folly::Expected writeConnectionDataToSocket( // succeeds before scheduling any new data. if (pendingBufferedWrite) { auto flushResult = ioBufBatch.flush(); - if (flushResult.hasError()) { - return folly::makeUnexpected(flushResult.error()); + if (!flushResult.has_value()) { + return quic::make_unexpected(flushResult.error()); } auto flushSuccess = flushResult.value(); updateErrnoCount(connection, ioBufBatch); @@ -1781,15 +1786,15 @@ folly::Expected writeConnectionDataToSocket( headerCipher); // This is a fatal error vs. a build error. - if (ret.hasError()) { - return folly::makeUnexpected(ret.error()); + if (!ret.has_value()) { + return quic::make_unexpected(ret.error()); } if (!ret->buildSuccess) { // If we're returning because we couldn't schedule more packets, // make sure we flush the buffer in this function. auto flushResult = ioBufBatch.flush(); - if (flushResult.hasError()) { - return folly::makeUnexpected(flushResult.error()); + if (!flushResult.has_value()) { + return quic::make_unexpected(flushResult.error()); } updateErrnoCount(connection, ioBufBatch); return WriteQuicDataResult{ioBufBatch.getPktSent(), 0, bytesWritten}; @@ -1818,8 +1823,8 @@ folly::Expected writeConnectionDataToSocket( static_cast(ret->encodedSize), static_cast(ret->encodedBodySize), false /* isDSRPacket */); - if (updateConnResult.hasError()) { - return folly::makeUnexpected(updateConnResult.error()); + if (!updateConnResult.has_value()) { + return quic::make_unexpected(updateConnResult.error()); } guard.dismiss(); connection.streamManager->writeQueue().commitTransaction( @@ -1843,8 +1848,8 @@ folly::Expected writeConnectionDataToSocket( // With SinglePacketInplaceBatchWriter we always write one packet, and so // ioBufBatch needs a flush. auto flushResult = ioBufBatch.flush(); - if (flushResult.hasError()) { - return folly::makeUnexpected(flushResult.error()); + if (!flushResult.has_value()) { + return quic::make_unexpected(flushResult.error()); } updateErrnoCount(connection, ioBufBatch); } @@ -1852,8 +1857,8 @@ folly::Expected writeConnectionDataToSocket( // Ensure that the buffer is flushed before returning auto flushResult = ioBufBatch.flush(); - if (flushResult.hasError()) { - return folly::makeUnexpected(flushResult.error()); + if (!flushResult.has_value()) { + return quic::make_unexpected(flushResult.error()); } updateErrnoCount(connection, ioBufBatch); @@ -1867,7 +1872,7 @@ folly::Expected writeConnectionDataToSocket( return WriteQuicDataResult{ioBufBatch.getPktSent(), 0, bytesWritten}; } -folly::Expected writeProbingDataToSocket( +quic::Expected writeProbingDataToSocket( QuicAsyncUDPSocket& sock, QuicConnectionStateBase& connection, const ConnectionId& srcConnId, @@ -1912,8 +1917,8 @@ folly::Expected writeProbingDataToSocket( version, writeLoopBeginTime, token); - if (cloningResult.hasError()) { - return folly::makeUnexpected(cloningResult.error()); + if (!cloningResult.has_value()) { + return quic::make_unexpected(cloningResult.error()); } auto probesWritten = cloningResult->packetsWritten; auto bytesWritten = cloningResult->bytesWritten; @@ -1948,8 +1953,8 @@ folly::Expected writeProbingDataToSocket( headerCipher, version, writeLoopBeginTime); - if (probingResult.hasError()) { - return folly::makeUnexpected(probingResult.error()); + if (!probingResult.has_value()) { + return quic::make_unexpected(probingResult.error()); } probesWritten += probingResult->packetsWritten; bytesWritten += probingResult->bytesWritten; @@ -2113,11 +2118,11 @@ void implicitAckCryptoStream( conn, packetNumSpace, implicitAck, - [](const auto&) { + [](const auto&) -> quic::Expected { // ackedPacketVisitor. No action needed. - return folly::unit; + return {}; }, - [&](auto&, auto& packetFrame) { + [&](auto&, auto& packetFrame) -> quic::Expected { switch (packetFrame.type()) { case QuicWriteFrame::Type::WriteCryptoFrame: { const WriteCryptoFrame& frame = *packetFrame.asWriteCryptoFrame(); @@ -2136,17 +2141,17 @@ void implicitAckCryptoStream( // our outstanding packets. } } - return folly::unit; + return {}; }, // We shouldn't mark anything as lost from the implicit ACK, as it should // be ACKing the entire rangee. - [](auto&, auto&, auto) { + [](auto&, auto&, auto) -> quic::Expected { LOG(FATAL) << "Got loss from implicit crypto ACK."; - return folly::unit; + return {}; }, implicitAckTime); // TODO handle error - CHECK(result.hasValue()) << result.error().message; + CHECK(result.has_value()) << result.error().message; // Clear our the loss buffer explicitly. The implicit ACK itself will not // remove data already in the loss buffer. auto cryptoStream = getCryptoStream(*conn.cryptoState, encryptionLevel); @@ -2219,14 +2224,14 @@ void updateOneRttWriteCipher( conn.oneRttWritePacketsSentInCurrentPhase = 0; } -folly::Expected maybeHandleIncomingKeyUpdate( +quic::Expected maybeHandleIncomingKeyUpdate( QuicConnectionStateBase& conn) { if (conn.readCodec->getCurrentOneRttReadPhase() != conn.oneRttWritePhase) { // Peer has initiated a key update. auto nextOneRttWriteCipherResult = conn.handshakeLayer->getNextOneRttWriteCipher(); - if (nextOneRttWriteCipherResult.hasError()) { - return folly::makeUnexpected(nextOneRttWriteCipherResult.error()); + if (!nextOneRttWriteCipherResult.has_value()) { + return quic::make_unexpected(nextOneRttWriteCipherResult.error()); } updateOneRttWriteCipher( conn, @@ -2235,8 +2240,8 @@ folly::Expected maybeHandleIncomingKeyUpdate( auto nextOneRttReadCipherResult = conn.handshakeLayer->getNextOneRttReadCipher(); - if (nextOneRttReadCipherResult.hasError()) { - return folly::makeUnexpected(nextOneRttReadCipherResult.error()); + if (!nextOneRttReadCipherResult.has_value()) { + return quic::make_unexpected(nextOneRttReadCipherResult.error()); } conn.readCodec->setNextOneRttReadCipher( std::move(nextOneRttReadCipherResult.value())); @@ -2245,10 +2250,10 @@ folly::Expected maybeHandleIncomingKeyUpdate( // update interval if we are initiating key updates. conn.transportSettings.firstKeyUpdatePacketCount.reset(); } - return folly::unit; + return {}; } -folly::Expected maybeInitiateKeyUpdate( +quic::Expected maybeInitiateKeyUpdate( QuicConnectionStateBase& conn) { if (conn.transportSettings.initiateKeyUpdate) { if (conn.nodeType == QuicNodeType::Server && conn.version.has_value() && @@ -2257,7 +2262,7 @@ folly::Expected maybeInitiateKeyUpdate( // Some old versions of MVFST did not support key updates. // So as the server, do not attempt to initiate key updates if the client // hasn't initiated one yet. - return folly::unit; + return {}; } auto packetsBeforeNextUpdate = conn.transportSettings.firstKeyUpdatePacketCount @@ -2275,8 +2280,8 @@ folly::Expected maybeInitiateKeyUpdate( auto nextOneRttWriteCipherResult = conn.handshakeLayer->getNextOneRttWriteCipher(); - if (nextOneRttWriteCipherResult.hasError()) { - return folly::makeUnexpected(nextOneRttWriteCipherResult.error()); + if (!nextOneRttWriteCipherResult.has_value()) { + return quic::make_unexpected(nextOneRttWriteCipherResult.error()); } updateOneRttWriteCipher( conn, @@ -2285,8 +2290,8 @@ folly::Expected maybeInitiateKeyUpdate( auto nextOneRttReadCipherResult = conn.handshakeLayer->getNextOneRttReadCipher(); - if (nextOneRttReadCipherResult.hasError()) { - return folly::makeUnexpected(nextOneRttReadCipherResult.error()); + if (!nextOneRttReadCipherResult.has_value()) { + return quic::make_unexpected(nextOneRttReadCipherResult.error()); } conn.readCodec->setNextOneRttReadCipher( std::move(nextOneRttReadCipherResult.value())); @@ -2295,10 +2300,10 @@ folly::Expected maybeInitiateKeyUpdate( conn.oneRttWritePendingVerificationPacketNumber.reset(); } } - return folly::unit; + return {}; } -folly::Expected maybeVerifyPendingKeyUpdate( +quic::Expected maybeVerifyPendingKeyUpdate( QuicConnectionStateBase& conn, const OutstandingPacketWrapper& outstandingPacket, const RegularQuicPacket& ackPacket) { @@ -2306,7 +2311,7 @@ folly::Expected maybeVerifyPendingKeyUpdate( outstandingPacket.packet.header.getProtectionType()) == EncryptionLevel::AppData)) { // This is not an app data packet. We can't have initiated a key update yet. - return folly::unit; + return {}; } if (conn.oneRttWritePendingVerificationPacketNumber && @@ -2319,12 +2324,12 @@ folly::Expected maybeVerifyPendingKeyUpdate( conn.oneRttWritePendingVerificationPacketNumber.reset(); conn.oneRttWritePendingVerification = false; } else { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::CRYPTO_ERROR, "Packet with key update was acked in the wrong phase")); } } - return folly::unit; + return {}; } // Unfortunate, we should make this more portable. diff --git a/quic/api/QuicTransportFunctions.h b/quic/api/QuicTransportFunctions.h index c086f5643..b0b73fa38 100644 --- a/quic/api/QuicTransportFunctions.h +++ b/quic/api/QuicTransportFunctions.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include @@ -89,7 +89,7 @@ struct WriteQuicDataResult { * Attempts to write data from all frames in the QUIC connection into the UDP * socket supplied with the aead and the headerCipher. */ -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected writeQuicDataToSocket( QuicAsyncUDPSocket& sock, QuicConnectionStateBase& connection, @@ -106,7 +106,7 @@ writeQuicDataToSocket( * * return the number of packets written to socket. */ -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected writeCryptoAndAckDataToSocket( QuicAsyncUDPSocket& sock, QuicConnectionStateBase& connection, @@ -124,7 +124,7 @@ writeCryptoAndAckDataToSocket( * This is useful when the crypto stream still needs to be sent in separate * packets and cannot use the encryption of the data key. */ -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected writeQuicDataExceptCryptoStreamToSocket( QuicAsyncUDPSocket& socket, QuicConnectionStateBase& connection, @@ -139,7 +139,7 @@ writeQuicDataExceptCryptoStreamToSocket( * Writes frame data including zero rtt data to the socket with the supplied * zero rtt cipher. */ -[[nodiscard]] folly::Expected writeZeroRttDataToSocket( +[[nodiscard]] quic::Expected writeZeroRttDataToSocket( QuicAsyncUDPSocket& socket, QuicConnectionStateBase& connection, const ConnectionId& srcConnId, @@ -181,7 +181,7 @@ void handleRetransmissionWritten( * with new data, as well as retranmissions. Returns true if the data sent is * new data. */ -[[nodiscard]] folly::Expected handleStreamWritten( +[[nodiscard]] quic::Expected handleStreamWritten( QuicConnectionStateBase& conn, QuicStreamLike& stream, uint64_t frameOffset, @@ -202,7 +202,7 @@ bool handleStreamBufMetaWritten( /** * Update the connection state after sending a new packet. */ -[[nodiscard]] folly::Expected updateConnection( +[[nodiscard]] quic::Expected updateConnection( QuicConnectionStateBase& conn, Optional clonedPacketIdentifier, RegularQuicWritePacket packet, @@ -268,7 +268,7 @@ void writeShortClose( * whether or not there are enough bytes to sample for the header encryption * from the encryptedBody via a CHECK. */ -folly::Expected encryptPacketHeader( +quic::Expected encryptPacketHeader( HeaderForm headerForm, uint8_t* header, size_t headerLen, @@ -282,7 +282,7 @@ folly::Expected encryptPacketHeader( * data allowed by the writableBytesFunc and will only write a maximum * number of packetLimit packets at each invocation. */ -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected writeConnectionDataToSocket( QuicAsyncUDPSocket& sock, QuicConnectionStateBase& connection, @@ -299,7 +299,7 @@ writeConnectionDataToSocket( TimePoint writeLoopBeginTime, const std::string& token = std::string()); -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected writeProbingDataToSocket( QuicAsyncUDPSocket& sock, QuicConnectionStateBase& connection, @@ -338,12 +338,11 @@ void updateOneRttWriteCipher( QuicConnectionStateBase& conn, std::unique_ptr aead, ProtectionType oneRttPhase); -folly::Expected maybeHandleIncomingKeyUpdate( +quic::Expected maybeHandleIncomingKeyUpdate( QuicConnectionStateBase& conn); -[[nodiscard]] folly::Expected maybeInitiateKeyUpdate( +[[nodiscard]] quic::Expected maybeInitiateKeyUpdate( QuicConnectionStateBase& conn); -[[nodiscard]] folly::Expected -maybeVerifyPendingKeyUpdate( +[[nodiscard]] quic::Expected maybeVerifyPendingKeyUpdate( QuicConnectionStateBase& conn, const OutstandingPacketWrapper& outstandingPacket, const RegularQuicPacket& ackPacket); diff --git a/quic/api/test/MockQuicSocket.h b/quic/api/test/MockQuicSocket.h index fa71dfc64..29459aa29 100644 --- a/quic/api/test/MockQuicSocket.h +++ b/quic/api/test/MockQuicSocket.h @@ -55,23 +55,23 @@ class MockQuicSocket : public QuicSocket { (const)); MOCK_METHOD(std::shared_ptr, getEventBase, (), (const)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), getStreamReadOffset, (StreamId), (const)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), getStreamWriteOffset, (StreamId), (const)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), getStreamWriteBufferedBytes, (StreamId), (const)); MOCK_METHOD(QuicSocket::TransportInfo, getTransportInfo, (), (const)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), getStreamTransportInfo, (StreamId), (const)); @@ -80,17 +80,17 @@ class MockQuicSocket : public QuicSocket { MOCK_METHOD(void, setSendBuffer, (StreamId, size_t, size_t)); MOCK_METHOD(uint64_t, getConnectionBufferAvailable, (), (const)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), getConnectionFlowControl, (), (const)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), getStreamFlowControl, (StreamId), (const)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), getMaxWritableOnStream, (StreamId), (const)); @@ -103,44 +103,44 @@ class MockQuicSocket : public QuicSocket { cancelDeliveryCallbacksForStream, (StreamId, uint64_t offset)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), setConnectionFlowControlWindow, (uint64_t)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), setStreamFlowControlWindow, (StreamId, uint64_t)); MOCK_METHOD(void, setTransportSettings, (TransportSettings)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), setMaxPacingRate, (uint64_t)); - folly::Expected + quic::Expected setKnob(uint64_t knobSpace, uint64_t knobId, BufPtr knobBlob) override { SharedBuf sharedBlob(knobBlob.release()); return setKnob(knobSpace, knobId, sharedBlob); } MOCK_METHOD( - (folly::Expected), + (quic::Expected), setKnob, (uint64_t, uint64_t, SharedBuf)); MOCK_METHOD(bool, isKnobSupported, (), (const)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), setStreamPriority, (StreamId, PriorityQueue::Priority)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), setPriorityQueue, (std::unique_ptr queue)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), getStreamPriority, (StreamId)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), setReadCallback, (StreamId, ReadCallback*, Optional err)); MOCK_METHOD( @@ -160,25 +160,19 @@ class MockQuicSocket : public QuicSocket { earlyDataAppParamsGetter_ = std::move(getter); } + MOCK_METHOD((quic::Expected), pauseRead, (StreamId)); + MOCK_METHOD((quic::Expected), resumeRead, (StreamId)); MOCK_METHOD( - (folly::Expected), - pauseRead, - (StreamId)); - MOCK_METHOD( - (folly::Expected), - resumeRead, - (StreamId)); - MOCK_METHOD( - (folly::Expected), + (quic::Expected), stopSending, (StreamId, ApplicationErrorCode)); - folly::Expected, LocalErrorCode> read( + quic::Expected, LocalErrorCode> read( StreamId id, size_t maxRead) override { auto res = readNaked(id, maxRead); if (res.hasError()) { - return folly::makeUnexpected(res.error()); + return quic::make_unexpected(res.error()); } else { return std::pair( BufPtr(res.value().first), res.value().second); @@ -186,14 +180,14 @@ class MockQuicSocket : public QuicSocket { } using ReadResult = - folly::Expected, LocalErrorCode>; + quic::Expected, LocalErrorCode>; MOCK_METHOD(ReadResult, readNaked, (StreamId, size_t)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), createBidirectionalStream, (bool)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), createUnidirectionalStream, (bool)); MOCK_METHOD(uint64_t, getNumOpenableBidirectionalStreams, (), (const)); @@ -209,23 +203,23 @@ class MockQuicSocket : public QuicSocket { (StreamId), (noexcept)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), notifyPendingWriteOnConnection, (ConnectionWriteCallback*)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), notifyPendingWriteOnStream, (StreamId, StreamWriteCallback*)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), unregisterStreamWriteCallback, (StreamId)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), registerTxCallback, (const StreamId, const uint64_t, ByteEventCallback*)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), registerByteEventCallback, (const ByteEvent::Type, const StreamId, @@ -254,7 +248,7 @@ class MockQuicSocket : public QuicSocket { (const ByteEvent::Type, const StreamId), (const)); - folly::Expected writeChain( + quic::Expected writeChain( StreamId id, BufPtr data, bool eof, @@ -276,28 +270,28 @@ class MockQuicSocket : public QuicSocket { setDSRPacketizationRequestSender, (StreamId, std::unique_ptr)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), registerDeliveryCallback, (StreamId, uint64_t, ByteEventCallback*)); MOCK_METHOD(Optional, shutdownWrite, (StreamId)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), resetStream, (StreamId, ApplicationErrorCode)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), updateReliableDeliveryCheckpoint, (StreamId)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), resetStreamReliably, (StreamId, ApplicationErrorCode)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), maybeResetStreamFromReadError, (StreamId, QuicErrorCode)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), setPingCallback, (PingCallback*)); MOCK_METHOD(void, sendPing, (std::chrono::milliseconds)); @@ -308,34 +302,26 @@ class MockQuicSocket : public QuicSocket { MOCK_METHOD(Optional, setControlStream, (StreamId)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), setPeekCallback, (StreamId, PeekCallback*)); - MOCK_METHOD( - (folly::Expected), - pausePeek, - (StreamId)); - MOCK_METHOD( - (folly::Expected), - resumePeek, - (StreamId)); + MOCK_METHOD((quic::Expected), pausePeek, (StreamId)); + MOCK_METHOD((quic::Expected), resumePeek, (StreamId)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), peek, (StreamId, const std::function< void(StreamId, const folly::Range&)>&)); MOCK_METHOD( - (folly::Expected< - folly::Unit, - std::pair>>), + (quic::Expected>>), consume, (StreamId, uint64_t, size_t)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), consume, (StreamId, size_t)); @@ -361,24 +347,23 @@ class MockQuicSocket : public QuicSocket { (ApplicationErrorCode, folly::StringPiece)); MOCK_METHOD(QuicConnectionStats, getConnectionsStats, (), (const)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), setDatagramCallback, (DatagramCallback*)); MOCK_METHOD(uint16_t, getDatagramSizeLimit, (), (const)); - folly::Expected writeDatagram( - BufPtr data) override { + quic::Expected writeDatagram(BufPtr data) override { SharedBuf sharedData(data.release()); return writeDatagram(sharedData); } MOCK_METHOD(WriteResult, writeDatagram, (SharedBuf)); MOCK_METHOD( - (folly::Expected, LocalErrorCode>), + (quic::Expected, LocalErrorCode>), readDatagrams, (size_t)); MOCK_METHOD( - (folly::Expected, LocalErrorCode>), + (quic::Expected, LocalErrorCode>), readDatagramBufs, (size_t)); MOCK_METHOD( @@ -387,23 +372,23 @@ class MockQuicSocket : public QuicSocket { (), (const)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), createBidirectionalStreamGroup, ()); MOCK_METHOD( - (folly::Expected), + (quic::Expected), createUnidirectionalStreamGroup, ()); MOCK_METHOD( - (folly::Expected), + (quic::Expected), createBidirectionalStreamInGroup, (StreamGroupId)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), createUnidirectionalStreamInGroup, (StreamGroupId)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), setStreamGroupRetransmissionPolicy, (StreamGroupId, std::optional), (noexcept)); diff --git a/quic/api/test/Mocks.h b/quic/api/test/Mocks.h index f8c18211f..7ce63beb7 100644 --- a/quic/api/test/Mocks.h +++ b/quic/api/test/Mocks.h @@ -30,7 +30,7 @@ class MockFrameScheduler : public FrameScheduler { : FrameScheduler("mock", *conn) {} // override methods accepting rvalue ref since gmock doesn't support it - folly::Expected scheduleFramesForPacket( + quic::Expected scheduleFramesForPacket( PacketBuilderInterface&& builderIn, uint32_t writableBytes) override { return _scheduleFramesForPacket(&builderIn, writableBytes); @@ -39,7 +39,7 @@ class MockFrameScheduler : public FrameScheduler { MOCK_METHOD((bool), hasData, (), (const)); MOCK_METHOD((bool), hasImmediateData, (), (const)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), _scheduleFramesForPacket, (PacketBuilderInterface*, uint32_t)); }; diff --git a/quic/api/test/QuicBatchWriterTest.cpp b/quic/api/test/QuicBatchWriterTest.cpp index c340042a4..1619d5983 100644 --- a/quic/api/test/QuicBatchWriterTest.cpp +++ b/quic/api/test/QuicBatchWriterTest.cpp @@ -64,7 +64,8 @@ TEST_F(QuicBatchWriterTest, TestBatchingGSOBase) { std::shared_ptr qEvb = std::make_shared(&evb); FollyQuicAsyncUDPSocket sock(qEvb); - sock.setReuseAddr(false); + auto ret = sock.setReuseAddr(false); + ASSERT_FALSE(ret.hasError()); ASSERT_FALSE(sock.bind(folly::SocketAddress("127.0.0.1", 0)).hasError()); auto gsoResult = sock.getGSO(); ASSERT_FALSE(gsoResult.hasError()); @@ -96,7 +97,8 @@ TEST_F(QuicBatchWriterTest, TestBatchingGSOLastSmallPacket) { std::shared_ptr qEvb = std::make_shared(&evb); FollyQuicAsyncUDPSocket sock(qEvb); - sock.setReuseAddr(false); + auto ret = sock.setReuseAddr(false); + ASSERT_FALSE(ret.hasError()); ASSERT_FALSE(sock.bind(folly::SocketAddress("127.0.0.1", 0)).hasError()); auto gsoResult = sock.getGSO(); ASSERT_FALSE(gsoResult.hasError()); @@ -140,7 +142,8 @@ TEST_F(QuicBatchWriterTest, TestBatchingGSOLastBigPacket) { std::shared_ptr qEvb = std::make_shared(&evb); FollyQuicAsyncUDPSocket sock(qEvb); - sock.setReuseAddr(false); + auto ret = sock.setReuseAddr(false); + ASSERT_FALSE(ret.hasError()); ASSERT_FALSE(sock.bind(folly::SocketAddress("127.0.0.1", 0)).hasError()); auto gsoResult = sock.getGSO(); ASSERT_FALSE(gsoResult.hasError()); @@ -179,7 +182,8 @@ TEST_F(QuicBatchWriterTest, TestBatchingGSOBatchNum) { std::shared_ptr qEvb = std::make_shared(&evb); FollyQuicAsyncUDPSocket sock(qEvb); - sock.setReuseAddr(false); + auto ret = sock.setReuseAddr(false); + ASSERT_FALSE(ret.hasError()); ASSERT_FALSE(sock.bind(folly::SocketAddress("127.0.0.1", 0)).hasError()); auto gsoResult = sock.getGSO(); ASSERT_FALSE(gsoResult.hasError()); @@ -482,7 +486,8 @@ TEST_F(QuicBatchWriterTest, TestBatchingSendmmsgGSOBatchNum) { std::shared_ptr qEvb = std::make_shared(&evb); FollyQuicAsyncUDPSocket sock(qEvb); - sock.setReuseAddr(false); + auto ret = sock.setReuseAddr(false); + ASSERT_FALSE(ret.hasError()); ASSERT_FALSE(sock.bind(folly::SocketAddress("127.0.0.1", 0)).hasError()); auto gsoResult = sock.getGSO(); ASSERT_FALSE(gsoResult.hasError()); @@ -530,7 +535,8 @@ TEST_F(QuicBatchWriterTest, TestBatchingSendmmsgGSOBatcBigSmallPacket) { std::shared_ptr qEvb = std::make_shared(&evb); FollyQuicAsyncUDPSocket sock(qEvb); - sock.setReuseAddr(false); + auto ret = sock.setReuseAddr(false); + ASSERT_FALSE(ret.hasError()); ASSERT_FALSE(sock.bind(folly::SocketAddress("127.0.0.1", 0)).hasError()); auto gsoResult = sock.getGSO(); ASSERT_FALSE(gsoResult.hasError()); diff --git a/quic/api/test/QuicTransportBaseTest.cpp b/quic/api/test/QuicTransportBaseTest.cpp index 436765abe..c9e638bf2 100644 --- a/quic/api/test/QuicTransportBaseTest.cpp +++ b/quic/api/test/QuicTransportBaseTest.cpp @@ -266,13 +266,13 @@ class TestQuicTransport const BufferMeta& /* data */, bool /* eof */, ByteEventCallback* /* cb */) override { - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } WriteResult setDSRPacketizationRequestSender( StreamId /* id */, std::unique_ptr /* sender */) override { - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } Optional> getPeerTransportParams() @@ -284,11 +284,11 @@ class TestQuicTransport return lossTimeout_.getTimerCallbackTimeRemaining(); } - folly::Expected onReadData( + quic::Expected onReadData( const folly::SocketAddress&, ReceivedUdpPacket&& udpPacket) override { if (udpPacket.buf.empty()) { - return folly::unit; + return {}; } Cursor cursor(udpPacket.buf.front()); while (!cursor.isAtEnd()) { @@ -298,21 +298,27 @@ class TestQuicTransport auto type = static_cast(cursor.readBE()); if (type == TestFrameType::CRYPTO) { auto cryptoBuffer = decodeCryptoBuffer(cursor); - CHECK(!appendDataToReadBuffer( - conn_->cryptoState->initialStream, std::move(cryptoBuffer)) - .hasError()); + auto cryptoResult = appendDataToReadBuffer( + conn_->cryptoState->initialStream, std::move(cryptoBuffer)); + if (cryptoResult.hasError()) { + return quic::make_unexpected(cryptoResult.error()); + } } else if (type == TestFrameType::MAX_STREAMS) { auto maxStreamsFrame = decodeMaxStreamsFrame(cursor); if (maxStreamsFrame.isForBidirectionalStream()) { - CHECK( - !conn_->streamManager - ->setMaxLocalBidirectionalStreams(maxStreamsFrame.maxStreams) - .hasError()); + auto bidirResult = + conn_->streamManager->setMaxLocalBidirectionalStreams( + maxStreamsFrame.maxStreams); + if (bidirResult.hasError()) { + return quic::make_unexpected(bidirResult.error()); + } } else { - CHECK(!conn_->streamManager - ->setMaxLocalUnidirectionalStreams( - maxStreamsFrame.maxStreams) - .hasError()); + auto unidirResult = + conn_->streamManager->setMaxLocalUnidirectionalStreams( + maxStreamsFrame.maxStreams); + if (unidirResult.hasError()) { + return quic::make_unexpected(unidirResult.error()); + } } } else if (type == TestFrameType::DATAGRAM) { auto buffer = decodeDatagramFrame(cursor); @@ -323,35 +329,41 @@ class TestQuicTransport auto streamResult = conn_->streamManager->getStream(res.id, res.groupId); if (streamResult.hasError()) { - return folly::makeUnexpected(streamResult.error()); + return quic::make_unexpected(streamResult.error()); } QuicStreamState* stream = streamResult.value(); if (!stream) { continue; } - CHECK(!appendDataToReadBuffer(*stream, std::move(res.buf)).hasError()); + auto streamGroupResult = + appendDataToReadBuffer(*stream, std::move(res.buf)); + if (streamGroupResult.hasError()) { + return quic::make_unexpected(streamGroupResult.error()); + } conn_->streamManager->updateReadableStreams(*stream); conn_->streamManager->updatePeekableStreams(*stream); } else { auto buffer = decodeStreamBuffer(cursor); auto streamResult = conn_->streamManager->getStream(buffer.first); if (streamResult.hasError()) { - return folly::makeUnexpected(streamResult.error()); + return quic::make_unexpected(streamResult.error()); } QuicStreamState* stream = streamResult.value(); if (!stream) { continue; } - (void)appendDataToReadBuffer(*stream, std::move(buffer.second)) - .hasError(); + auto result = appendDataToReadBuffer(*stream, std::move(buffer.second)); + if (result.hasError()) { + return quic::make_unexpected(result.error()); + } conn_->streamManager->updateReadableStreams(*stream); conn_->streamManager->updatePeekableStreams(*stream); } } - return folly::unit; + return {}; } - [[nodiscard]] folly::Expected writeData() override { + [[nodiscard]] quic::Expected writeData() override { auto result = writeQuicDataToSocket( *socket_, *conn_, @@ -362,9 +374,9 @@ class TestQuicTransport *conn_->version, conn_->transportSettings.writeConnectionDataPacketsLimit); if (result.hasError()) { - return folly::makeUnexpected(result.error()); + return quic::make_unexpected(result.error()); } - return folly::unit; + return {}; } // This is to expose the protected pacedWriteDataToSocket() function @@ -651,18 +663,27 @@ class QuicTransportImplTest : public Test { auto socket = std::make_unique>(qEvb); ON_CALL(*socket, setAdditionalCmsgsFunc(_)) - .WillByDefault(Return(folly::unit)); - ON_CALL(*socket, close()).WillByDefault(Return(folly::unit)); - ON_CALL(*socket, resumeWrite(_)).WillByDefault(Return(folly::unit)); - ON_CALL(*socket, bind(_)).WillByDefault(Return(folly::unit)); - ON_CALL(*socket, connect(_)).WillByDefault(Return(folly::unit)); - ON_CALL(*socket, setReuseAddr(_)).WillByDefault(Return(folly::unit)); - ON_CALL(*socket, setReusePort(_)).WillByDefault(Return(folly::unit)); - ON_CALL(*socket, setRecvTos(_)).WillByDefault(Return(folly::unit)); + .WillByDefault(Return(quic::Expected{})); + ON_CALL(*socket, close()) + .WillByDefault(Return(quic::Expected{})); + ON_CALL(*socket, resumeWrite(_)) + .WillByDefault(Return(quic::Expected{})); + ON_CALL(*socket, bind(_)) + .WillByDefault(Return(quic::Expected{})); + ON_CALL(*socket, connect(_)) + .WillByDefault(Return(quic::Expected{})); + ON_CALL(*socket, setReuseAddr(_)) + .WillByDefault(Return(quic::Expected{})); + ON_CALL(*socket, setReusePort(_)) + .WillByDefault(Return(quic::Expected{})); + ON_CALL(*socket, setRecvTos(_)) + .WillByDefault(Return(quic::Expected{})); ON_CALL(*socket, getRecvTos()).WillByDefault(Return(false)); ON_CALL(*socket, getGSO()).WillByDefault(Return(0)); - ON_CALL(*socket, setCmsgs(_)).WillByDefault(Return(folly::unit)); - ON_CALL(*socket, appendCmsgs(_)).WillByDefault(Return(folly::unit)); + ON_CALL(*socket, setCmsgs(_)) + .WillByDefault(Return(quic::Expected{})); + ON_CALL(*socket, appendCmsgs(_)) + .WillByDefault(Return(quic::Expected{})); socketPtr = socket.get(); transport = std::make_shared( qEvb, std::move(socket), &connSetupCallback, &connCallback); @@ -774,8 +795,8 @@ TEST_P(QuicTransportImplTestBase, IdleTimeoutStreamMaessage) { NiceMock readCb1; NiceMock readCb2; - transport->setReadCallback(stream1, &readCb1); - transport->setReadCallback(stream2, &readCb2); + ASSERT_TRUE(transport->setReadCallback(stream1, &readCb1).has_value()); + ASSERT_TRUE(transport->setReadCallback(stream2, &readCb2).has_value()); transport->addDataToStream( stream1, StreamBuffer(folly::IOBuf::copyBuffer("actual stream data"), 0)); @@ -807,13 +828,17 @@ TEST_P(QuicTransportImplTestBase, StopSendingClosesIngress) { // create bidirectional stream streamID = transport->createBidirectionalStream().value(); NiceMock readCb1; - transport->setReadCallback(streamID, &readCb1); + ASSERT_TRUE(transport->setReadCallback(streamID, &readCb1).has_value()); // add ingress & egress data to stream transport->addDataToStream( streamID, StreamBuffer(folly::IOBuf::copyBuffer(ingressData), 0)); - transport->writeChain( - streamID, folly::IOBuf::copyBuffer("some egress stream data"), false); + ASSERT_TRUE(transport + ->writeChain( + streamID, + folly::IOBuf::copyBuffer("some egress stream data"), + false) + .has_value()); transport->driveReadCallbacks(); stream = CHECK_NOTNULL(transport->getStream(streamID)); @@ -825,7 +850,9 @@ TEST_P(QuicTransportImplTestBase, StopSendingClosesIngress) { // send stop sending to peer – this and later invoking reset stream should not // invoke ReadCallback::readError() EXPECT_CALL(readCb1, readError(streamID, _)).Times(0); - transport->stopSending(streamID, GenericApplicationErrorCode::NO_ERROR); + ASSERT_TRUE( + transport->stopSending(streamID, GenericApplicationErrorCode::NO_ERROR) + .has_value()); // check that we've discarded any ingress data and ingress SM is closed EXPECT_FALSE(stream->hasReadableData()); @@ -835,7 +862,9 @@ TEST_P(QuicTransportImplTestBase, StopSendingClosesIngress) { // suppose we tx a rst stream (and rx its corresponding ack), expect // terminal state and queued in closed streams - transport->resetStream(streamID, GenericApplicationErrorCode::NO_ERROR); + ASSERT_TRUE( + transport->resetStream(streamID, GenericApplicationErrorCode::NO_ERROR) + .has_value()); ASSERT_FALSE(sendRstAckSMHandler(*stream, std::nullopt).hasError()); EXPECT_TRUE(stream->inTerminalStates()); EXPECT_TRUE(streamManager.closedStreams().contains(streamID)); @@ -855,12 +884,13 @@ TEST_P(QuicTransportImplTestBase, StopSendingClosesIngress) { // sending second to validate that .stopSending() queues stream to be closed NiceMock readCb2; streamID = transport->createBidirectionalStream().value(); - transport->setReadCallback(streamID, &readCb2); + [[maybe_unused]] auto setReadCallback4 = + transport->setReadCallback(streamID, &readCb2); // add ingress & egress data to new stream transport->addDataToStream( streamID, StreamBuffer(folly::IOBuf::copyBuffer(ingressData), 0)); - transport->writeChain( + [[maybe_unused]] auto writeChain2 = transport->writeChain( streamID, folly::IOBuf::copyBuffer("some egress stream data"), false); transport->driveReadCallbacks(); stream = CHECK_NOTNULL(transport->getStream(streamID)); @@ -871,7 +901,8 @@ TEST_P(QuicTransportImplTestBase, StopSendingClosesIngress) { EXPECT_EQ(stream->recvState, StreamRecvState::Open); // suppose we tx a rst stream (and rx its corresponding ack) - transport->resetStream(streamID, GenericApplicationErrorCode::NO_ERROR); + [[maybe_unused]] auto resetStream2 = + transport->resetStream(streamID, GenericApplicationErrorCode::NO_ERROR); ASSERT_FALSE(sendRstAckSMHandler(*stream, std::nullopt).hasError()); EXPECT_EQ(stream->sendState, StreamSendState::Closed); EXPECT_EQ(stream->recvState, StreamRecvState::Open); @@ -880,7 +911,8 @@ TEST_P(QuicTransportImplTestBase, StopSendingClosesIngress) { // send stop sending to peer – does not deliver an error to the read callback // even tho the stream is in terminal state and queued for closing EXPECT_CALL(readCb2, readError(streamID, _)).Times(0); - transport->stopSending(streamID, GenericApplicationErrorCode::NO_ERROR); + [[maybe_unused]] auto stopSending2 = + transport->stopSending(streamID, GenericApplicationErrorCode::NO_ERROR); // check that we've discarded any ingress data and ingress SM is closed, // expect terminal state and queued in closed streams @@ -922,7 +954,8 @@ TEST_P(QuicTransportImplTestBase, NoopStopSendingIngressClosed) { EXPECT_EQ(stream->recvState, StreamRecvState::Closed); // send stop sending to peer should no-op - transport->stopSending(streamID, GenericApplicationErrorCode::NO_ERROR); + [[maybe_unused]] auto stopSending3 = + transport->stopSending(streamID, GenericApplicationErrorCode::NO_ERROR); EXPECT_EQ(transport->transportConn->pendingEvents.frames.size(), 0); // now test ingress uni-directional stream @@ -947,7 +980,8 @@ TEST_P(QuicTransportImplTestBase, NoopStopSendingIngressClosed) { EXPECT_TRUE(stream->inTerminalStates()); // send stop sending to peer should no-op - transport->stopSending(stream->id, GenericApplicationErrorCode::NO_ERROR); + [[maybe_unused]] auto stopSending4 = + transport->stopSending(stream->id, GenericApplicationErrorCode::NO_ERROR); EXPECT_EQ(transport->transportConn->pendingEvents.frames.size(), 0); transport.reset(); @@ -986,8 +1020,10 @@ TEST_P(QuicTransportImplTestBase, ReadCallbackDataAvailable) { NiceMock readCb2; NiceMock readCb3; - transport->setReadCallback(stream1, &readCb1); - transport->setReadCallback(stream2, &readCb2); + [[maybe_unused]] auto setReadCallback5 = + transport->setReadCallback(stream1, &readCb1); + [[maybe_unused]] auto setReadCallback6 = + transport->setReadCallback(stream2, &readCb2); transport->addDataToStream( stream1, StreamBuffer(folly::IOBuf::copyBuffer("actual stream data"), 0)); @@ -998,7 +1034,8 @@ TEST_P(QuicTransportImplTestBase, ReadCallbackDataAvailable) { transport->addDataToStream( stream3, StreamBuffer(folly::IOBuf::copyBuffer("actual stream data"), 0)); - transport->setReadCallback(stream3, &readCb3); + [[maybe_unused]] auto setReadCallback7 = + transport->setReadCallback(stream3, &readCb3); EXPECT_CALL(readCb1, readAvailable(stream1)); EXPECT_CALL(readCb3, readAvailable(stream3)); @@ -1019,7 +1056,8 @@ TEST_P(QuicTransportImplTestBase, ReadCallbackDataAvailable) { EXPECT_CALL(readCb2, readAvailable(stream2)); EXPECT_CALL(readCb3, readAvailable(stream3)); - transport->setReadCallback(stream1, nullptr); + [[maybe_unused]] auto setReadCallback8 = + transport->setReadCallback(stream1, nullptr); transport->driveReadCallbacks(); transport.reset(); } @@ -1028,7 +1066,8 @@ TEST_P(QuicTransportImplTestBase, ReliableResetReadCallback) { auto stream = transport->createBidirectionalStream().value(); NiceMock readCb; - transport->setReadCallback(stream, &readCb); + [[maybe_unused]] auto setReadCallback9 = + transport->setReadCallback(stream, &readCb); transport->addDataToStream( stream, StreamBuffer( @@ -1081,8 +1120,10 @@ TEST_P( NiceMock requestStreamCb; NiceMock qpackStreamCb; - transport->setReadCallback(requestStream, &requestStreamCb); - transport->setReadCallback(qpackStream, &qpackStreamCb); + [[maybe_unused]] auto setReadCallback10 = + transport->setReadCallback(requestStream, &requestStreamCb); + [[maybe_unused]] auto setReadCallback11 = + transport->setReadCallback(qpackStream, &qpackStreamCb); transport->addDataToStream( qpackStream, @@ -1116,8 +1157,10 @@ TEST_P(QuicTransportImplTestBase, ReadCallbackDataAvailableNoReap) { NiceMock readCb2; NiceMock readCb3; - transport->setReadCallback(stream1, &readCb1); - transport->setReadCallback(stream2, &readCb2); + [[maybe_unused]] auto setReadCallback12 = + transport->setReadCallback(stream1, &readCb1); + [[maybe_unused]] auto setReadCallback13 = + transport->setReadCallback(stream2, &readCb2); transport->addDataToStream( stream1, StreamBuffer(folly::IOBuf::copyBuffer("actual stream data"), 0)); @@ -1132,7 +1175,8 @@ TEST_P(QuicTransportImplTestBase, ReadCallbackDataAvailableNoReap) { EXPECT_CALL(readCb1, readAvailable(stream1)); transport->driveReadCallbacks(); - transport->setReadCallback(stream3, &readCb3); + [[maybe_unused]] auto setReadCallback14 = + transport->setReadCallback(stream3, &readCb3); transport->addDataToStream( stream2, StreamBuffer(folly::IOBuf::copyBuffer("actual stream data"), 0)); @@ -1148,7 +1192,8 @@ TEST_P(QuicTransportImplTestBase, ReadCallbackDataAvailableNoReap) { EXPECT_CALL(readCb2, readAvailable(stream2)); EXPECT_CALL(readCb3, readAvailable(stream3)); - transport->setReadCallback(stream1, nullptr); + [[maybe_unused]] auto setReadCallback15 = + transport->setReadCallback(stream1, nullptr); transport->driveReadCallbacks(); transport.reset(); } @@ -1167,8 +1212,10 @@ TEST_P(QuicTransportImplTestBase, ReadCallbackDataAvailableOrdered) { NiceMock readCb2; NiceMock readCb3; - transport->setReadCallback(stream1, &readCb1); - transport->setReadCallback(stream2, &readCb2); + [[maybe_unused]] auto setReadCallback16 = + transport->setReadCallback(stream1, &readCb1); + [[maybe_unused]] auto setReadCallback17 = + transport->setReadCallback(stream2, &readCb2); transport->addDataToStream( stream1, StreamBuffer(folly::IOBuf::copyBuffer("actual stream data"), 0)); @@ -1179,7 +1226,8 @@ TEST_P(QuicTransportImplTestBase, ReadCallbackDataAvailableOrdered) { transport->addDataToStream( stream3, StreamBuffer(folly::IOBuf::copyBuffer("actual stream data"), 0)); - transport->setReadCallback(stream3, &readCb3); + [[maybe_unused]] auto setReadCallback18 = + transport->setReadCallback(stream3, &readCb3); EXPECT_CALL(readCb1, readAvailable(stream1)); EXPECT_CALL(readCb3, readAvailable(stream3)); @@ -1200,7 +1248,8 @@ TEST_P(QuicTransportImplTestBase, ReadCallbackDataAvailableOrdered) { EXPECT_CALL(readCb2, readAvailable(stream2)); EXPECT_CALL(readCb3, readAvailable(stream3)); - transport->setReadCallback(stream1, nullptr); + [[maybe_unused]] auto setReadCallback19 = + transport->setReadCallback(stream1, nullptr); transport->driveReadCallbacks(); transport.reset(); } @@ -1213,7 +1262,8 @@ TEST_P(QuicTransportImplTestBase, ReadCallbackChangeReadCallback) { EXPECT_TRUE(transport->setReadCallback(stream1, nullptr).hasError()); - transport->setReadCallback(stream1, &readCb1); + [[maybe_unused]] auto setReadCallback20 = + transport->setReadCallback(stream1, &readCb1); transport->addDataToStream( stream1, StreamBuffer(folly::IOBuf::copyBuffer("actual stream data"), 0)); @@ -1221,13 +1271,15 @@ TEST_P(QuicTransportImplTestBase, ReadCallbackChangeReadCallback) { EXPECT_CALL(readCb1, readAvailable(stream1)); transport->driveReadCallbacks(); - transport->setReadCallback(stream1, &readCb2); + [[maybe_unused]] auto setReadCallback21 = + transport->setReadCallback(stream1, &readCb2); EXPECT_CALL(readCb2, readAvailable(stream1)); transport->driveReadCallbacks(); auto& conn = transport->getConnectionState(); EXPECT_EQ(conn.pendingEvents.frames.size(), 0); - transport->setReadCallback(stream1, nullptr); + [[maybe_unused]] auto setReadCallback22 = + transport->setReadCallback(stream1, nullptr); EXPECT_EQ(conn.pendingEvents.frames.size(), 1); EXPECT_CALL(readCb2, readAvailable(_)).Times(0); transport->driveReadCallbacks(); @@ -1247,8 +1299,10 @@ TEST_P(QuicTransportImplTestBase, ReadCallbackUnsetAll) { // Set the read callbacks, and then add data to the stream, and see that the // callbacks are, in fact, called. - transport->setReadCallback(stream1, &readCb1); - transport->setReadCallback(stream2, &readCb2); + [[maybe_unused]] auto setReadCallback23 = + transport->setReadCallback(stream1, &readCb1); + [[maybe_unused]] auto setReadCallback24 = + transport->setReadCallback(stream2, &readCb2); EXPECT_CALL(readCb1, readAvailable(stream1)); EXPECT_CALL(readCb2, readAvailable(stream2)); @@ -1284,8 +1338,10 @@ TEST_P(QuicTransportImplTestBase, ReadCallbackPauseResume) { NiceMock readCb1; NiceMock readCb2; - transport->setReadCallback(stream1, &readCb1); - transport->setReadCallback(stream2, &readCb2); + [[maybe_unused]] auto setReadCallback25 = + transport->setReadCallback(stream1, &readCb1); + [[maybe_unused]] auto setReadCallback26 = + transport->setReadCallback(stream2, &readCb2); transport->addDataToStream( stream1, StreamBuffer(folly::IOBuf::copyBuffer("actual stream data"), 0)); @@ -1338,27 +1394,34 @@ TEST_P(QuicTransportImplTestBase, ReadData) { NiceMock readCb1; auto readData = folly::IOBuf::copyBuffer("actual stream data"); - transport->setReadCallback(stream1, &readCb1); + [[maybe_unused]] auto setReadCallback27 = + transport->setReadCallback(stream1, &readCb1); EXPECT_CALL(readCb1, readAvailable(stream1)); transport->addDataToStream(stream1, StreamBuffer(readData->clone(), 0)); transport->driveReadCallbacks(); - transport->read(stream1, 10).thenOrThrow([&](std::pair data) { + { + auto readResult = transport->read(stream1, 10); + ASSERT_TRUE(readResult.has_value()); + auto data = std::move(readResult).value(); IOBufEqualTo eq; auto expected = readData->clone(); expected->trimEnd(expected->length() - 10); EXPECT_TRUE(eq(*data.first, *expected)); - }); + } EXPECT_CALL(readCb1, readAvailable(stream1)); transport->driveReadCallbacks(); - transport->read(stream1, 100).thenOrThrow([&](std::pair data) { + { + auto readResult = transport->read(stream1, 100); + ASSERT_TRUE(readResult.has_value()); + auto data = std::move(readResult).value(); IOBufEqualTo eq; auto expected = readData->clone(); expected->trimStart(10); EXPECT_TRUE(eq(*data.first, *expected)); - }); + } transport->driveReadCallbacks(); transport.reset(); @@ -1373,25 +1436,32 @@ TEST_P(QuicTransportImplTestBase, UnidirectionalReadData) { auto readData = folly::IOBuf::copyBuffer("actual stream data"); transport->addDataToStream(stream1, StreamBuffer(readData->clone(), 0)); - transport->setReadCallback(stream1, &readCb1); + [[maybe_unused]] auto setReadCallback28 = + transport->setReadCallback(stream1, &readCb1); EXPECT_CALL(readCb1, readAvailable(stream1)); transport->driveReadCallbacks(); - transport->read(stream1, 10).thenOrThrow([&](std::pair data) { + { + auto readResult = transport->read(stream1, 10); + ASSERT_TRUE(readResult.has_value()); + auto data = std::move(readResult).value(); IOBufEqualTo eq; auto expected = readData->clone(); expected->trimEnd(expected->length() - 10); EXPECT_TRUE(eq(*data.first, *expected)); - }); + } EXPECT_CALL(readCb1, readAvailable(stream1)); transport->driveReadCallbacks(); - transport->read(stream1, 100).thenOrThrow([&](std::pair data) { + { + auto readResult2 = transport->read(stream1, 100); + ASSERT_TRUE(readResult2.has_value()); + auto data = std::move(readResult2).value(); IOBufEqualTo eq; auto expected = readData->clone(); expected->trimStart(10); EXPECT_TRUE(eq(*data.first, *expected)); - }); + } transport->driveReadCallbacks(); transport.reset(); @@ -1402,13 +1472,16 @@ TEST_P(QuicTransportImplTestBase, ReadDataUnsetReadCallbackInCallback) { auto readData = folly::IOBuf::copyBuffer("actual stream data"); NiceMock readCb1; - transport->setReadCallback(stream1, &readCb1); + [[maybe_unused]] auto setReadCallback29 = + transport->setReadCallback(stream1, &readCb1); transport->addDataToStream(stream1, StreamBuffer(readData->clone(), 0, true)); EXPECT_CALL(readCb1, readAvailable(stream1)) - .WillOnce(Invoke( - [&](StreamId id) { transport->setReadCallback(id, nullptr); })); + .WillOnce(Invoke([&](StreamId id) { + [[maybe_unused]] auto setReadCb_tmp = + transport->setReadCallback(id, nullptr); + })); transport->driveReadCallbacks(); transport->driveReadCallbacks(); transport->getEventBase()->loop(); @@ -1421,11 +1494,14 @@ TEST_P(QuicTransportImplTestBase, ReadDataNoCallback) { transport->addDataToStream(stream1, StreamBuffer(readData->clone(), 0, true)); transport->driveReadCallbacks(); - transport->read(stream1, 100).thenOrThrow([&](std::pair data) { + { + auto readResult = transport->read(stream1, 100); + ASSERT_TRUE(readResult.has_value()); + auto data = std::move(readResult).value(); IOBufEqualTo eq; EXPECT_TRUE(eq(*data.first, *readData)); EXPECT_TRUE(data.second); - }); + } transport.reset(); } @@ -1443,25 +1519,29 @@ TEST_P(QuicTransportImplTestBase, ReadCallbackForClientOutOfOrderStream) { if (notifyOnNewStreamsExplicitly) { EXPECT_CALL(connCallback, onNewBidirectionalStream(clientOutOfOrderStream)) - .WillOnce(Invoke( - [&](StreamId id) { transport->setReadCallback(id, &streamRead); })); + .WillOnce(Invoke([&](StreamId id) { + [[maybe_unused]] auto setReadCb_tmp = + transport->setReadCallback(id, &streamRead); + })); } else { for (StreamId start = 0x00; start <= clientOutOfOrderStream; start += kStreamIncrement) { EXPECT_CALL(connCallback, onNewBidirectionalStream(start)) .WillOnce(Invoke([&](StreamId id) { - transport->setReadCallback(id, &streamRead); + [[maybe_unused]] auto setReadCallback30 = + transport->setReadCallback(id, &streamRead); })); } } EXPECT_CALL(streamRead, readAvailable(clientOutOfOrderStream)) .WillOnce(Invoke([&](StreamId id) { - transport->read(id, 100).thenOrThrow([&](std::pair data) { - IOBufEqualTo eq; - EXPECT_TRUE(eq(*data.first, *readData)); - EXPECT_TRUE(data.second); - }); + auto readResult = transport->read(id, 100); + ASSERT_TRUE(readResult.has_value()); + auto data = std::move(readResult).value(); + IOBufEqualTo eq; + EXPECT_TRUE(eq(*data.first, *readData)); + EXPECT_TRUE(data.second); })); transport->addDataToStream( @@ -1471,19 +1551,22 @@ TEST_P(QuicTransportImplTestBase, ReadCallbackForClientOutOfOrderStream) { if (notifyOnNewStreamsExplicitly) { EXPECT_CALL(connCallback, onNewBidirectionalStream(clientOutOfOrderStream2)) - .WillOnce(Invoke( - [&](StreamId id) { transport->setReadCallback(id, &streamRead); })); + .WillOnce(Invoke([&](StreamId id) { + [[maybe_unused]] auto setReadCb_tmp = + transport->setReadCallback(id, &streamRead); + })); } transport->addDataToStream( clientOutOfOrderStream2, StreamBuffer(readData->clone(), 0, true)); EXPECT_CALL(streamRead, readAvailable(clientOutOfOrderStream2)) .WillOnce(Invoke([&](StreamId id) { - transport->read(id, 100).thenOrThrow([&](std::pair data) { - IOBufEqualTo eq; - EXPECT_TRUE(eq(*data.first, *readData)); - EXPECT_TRUE(data.second); - }); + auto readResult = transport->read(id, 100); + ASSERT_TRUE(readResult.has_value()); + auto data = std::move(readResult).value(); + IOBufEqualTo eq; + EXPECT_TRUE(eq(*data.first, *readData)); + EXPECT_TRUE(data.second); })); transport->driveReadCallbacks(); transport.reset(); @@ -1491,9 +1574,9 @@ TEST_P(QuicTransportImplTestBase, ReadCallbackForClientOutOfOrderStream) { TEST_P(QuicTransportImplTestBase, ReadDataInvalidStream) { StreamId invalidStream = 10; - EXPECT_THROW( - transport->read(invalidStream, 100).thenOrThrow([&](auto) {}), - folly::BadExpectedAccess); + auto readResult = transport->read(invalidStream, 100); + EXPECT_FALSE(readResult.has_value()); + EXPECT_EQ(LocalErrorCode::STREAM_NOT_EXISTS, readResult.error()); transport.reset(); } @@ -1503,7 +1586,8 @@ TEST_P(QuicTransportImplTestBase, ReadError) { NiceMock readCb1; auto readData = folly::IOBuf::copyBuffer("actual stream data"); - transport->setReadCallback(stream1, &readCb1); + [[maybe_unused]] auto setReadCallback31 = + transport->setReadCallback(stream1, &readCb1); EXPECT_CALL( readCb1, readError(stream1, IsError(LocalErrorCode::STREAM_CLOSED))); @@ -1519,8 +1603,10 @@ TEST_P(QuicTransportImplTestBase, ReadCallbackDeleteTransport) { NiceMock readCb1; NiceMock readCb2; - transport->setReadCallback(stream1, &readCb1); - transport->setReadCallback(stream2, &readCb2); + [[maybe_unused]] auto setReadCallback32 = + transport->setReadCallback(stream1, &readCb1); + [[maybe_unused]] auto setReadCallback33 = + transport->setReadCallback(stream2, &readCb2); transport->addStreamReadError(stream1, LocalErrorCode::NO_ERROR); @@ -1642,22 +1728,27 @@ TEST_P(QuicTransportImplTestBase, onNewBidirectionalStreamSetReadCallback) { NiceMock stream2Read; StreamId stream2 = 0x00; EXPECT_CALL(connCallback, onNewBidirectionalStream(stream2)) - .WillOnce(Invoke( - [&](StreamId id) { transport->setReadCallback(id, &stream2Read); })); + .WillOnce(Invoke([&](StreamId id) { + [[maybe_unused]] auto setReadCb_tmp = + transport->setReadCallback(id, &stream2Read); + })); transport->addDataToStream(stream2, StreamBuffer(readData->clone(), 0, true)); StreamId stream3 = 0x10; NiceMock streamRead; if (notifyOnNewStreamsExplicitly) { EXPECT_CALL(connCallback, onNewBidirectionalStream(stream3)) - .WillOnce(Invoke( - [&](StreamId id) { transport->setReadCallback(id, &streamRead); })); + .WillOnce(Invoke([&](StreamId id) { + [[maybe_unused]] auto setReadCb_tmp = + transport->setReadCallback(id, &streamRead); + })); } else { for (StreamId start = stream2 + kStreamIncrement; start <= stream3; start += kStreamIncrement) { EXPECT_CALL(connCallback, onNewBidirectionalStream(start)) .WillOnce(Invoke([&](StreamId id) { - transport->setReadCallback(id, &streamRead); + [[maybe_unused]] auto setReadCallback34 = + transport->setReadCallback(id, &streamRead); })); } } @@ -1858,7 +1949,8 @@ TEST_P(QuicTransportImplTestBase, onUniStreamsAvailableCallbackAfterExausted) { TEST_P(QuicTransportImplTestBase, ReadDataAlsoChecksLossAlarm) { transport->transportConn->oneRttWriteCipher = test::createNoOpAead(); auto stream = transport->createBidirectionalStream().value(); - transport->writeChain(stream, folly::IOBuf::copyBuffer("Hey"), true); + [[maybe_unused]] auto writeChain1 = + transport->writeChain(stream, folly::IOBuf::copyBuffer("Hey"), true); // Artificially stop the write looper so that the read can trigger it. transport->writeLooper()->stop(); transport->addDataToStream( @@ -1875,7 +1967,8 @@ TEST_P(QuicTransportImplTestBase, ConnectionErrorOnWrite) { auto stream = transport->createBidirectionalStream().value(); EXPECT_CALL(*socketPtr, write(_, _, _)) .WillOnce(SetErrnoAndReturn(ENETUNREACH, -1)); - transport->writeChain(stream, folly::IOBuf::copyBuffer("Hey"), true, nullptr); + [[maybe_unused]] auto writeChain2 = transport->writeChain( + stream, folly::IOBuf::copyBuffer("Hey"), true, nullptr); transport->addDataToStream( stream, StreamBuffer(folly::IOBuf::copyBuffer("Data"), 0)); qEvb->loopOnce(); @@ -1891,7 +1984,8 @@ TEST_P(QuicTransportImplTestBase, ReadErrorUnsanitizedErrorMsg) { transport->transportConn->oneRttWriteCipher = test::createNoOpAead(); auto stream = transport->createBidirectionalStream().value(); MockReadCallback rcb; - transport->setReadCallback(stream, &rcb); + [[maybe_unused]] auto setReadCallback35 = + transport->setReadCallback(stream, &rcb); EXPECT_CALL(rcb, readError(stream, _)) .Times(1) .WillOnce(Invoke([](StreamId, QuicError error) { @@ -1904,7 +1998,7 @@ TEST_P(QuicTransportImplTestBase, ReadErrorUnsanitizedErrorMsg) { throw std::runtime_error("You need to calm down."); return 0; })); - transport->writeChain( + auto writeChain_tmp = transport->writeChain( stream, folly::IOBuf::copyBuffer("You are being too loud."), true, @@ -1928,7 +2022,8 @@ TEST_P(QuicTransportImplTestBase, ConnectionErrorUnhandledException) { throw std::runtime_error("Well there's your problem"); return 0; })); - transport->writeChain(stream, folly::IOBuf::copyBuffer("Hey"), true, nullptr); + [[maybe_unused]] auto writeChain3 = transport->writeChain( + stream, folly::IOBuf::copyBuffer("Hey"), true, nullptr); transport->addDataToStream( stream, StreamBuffer(folly::IOBuf::copyBuffer("Data"), 0)); qEvb->loopOnce(); @@ -1954,7 +2049,8 @@ TEST_P(QuicTransportImplTestBase, CloseStreamAfterReadError) { auto stream1 = transport->createBidirectionalStream().value(); NiceMock readCb1; - transport->setReadCallback(stream1, &readCb1); + [[maybe_unused]] auto setReadCallback36 = + transport->setReadCallback(stream1, &readCb1); transport->addStreamReadError(stream1, LocalErrorCode::NO_ERROR); transport->closeStream(stream1); @@ -1977,7 +2073,8 @@ TEST_P(QuicTransportImplTestBase, CloseStreamAfterReadError) { TEST_P(QuicTransportImplTestBase, CloseStreamAfterReadFin) { auto stream2 = transport->createBidirectionalStream().value(); NiceMock readCb2; - transport->setReadCallback(stream2, &readCb2); + [[maybe_unused]] auto setReadCallback37 = + transport->setReadCallback(stream2, &readCb2); transport->addDataToStream( stream2, @@ -2009,8 +2106,10 @@ TEST_P(QuicTransportImplTestBase, DeliveryCallbackUnsetAll) { NiceMock dcb1; NiceMock dcb2; - transport->registerDeliveryCallback(stream1, 10, &dcb1); - transport->registerDeliveryCallback(stream2, 20, &dcb2); + auto registerDelivery1 = + transport->registerDeliveryCallback(stream1, 10, &dcb1); + auto registerDelivery2 = + transport->registerDeliveryCallback(stream2, 20, &dcb2); EXPECT_CALL(dcb1, onCanceled(_, _)); EXPECT_CALL(dcb2, onCanceled(_, _)); @@ -2029,8 +2128,10 @@ TEST_P(QuicTransportImplTestBase, DeliveryCallbackUnsetOne) { NiceMock dcb1; NiceMock dcb2; - transport->registerDeliveryCallback(stream1, 10, &dcb1); - transport->registerDeliveryCallback(stream2, 20, &dcb2); + auto registerDelivery3 = + transport->registerDeliveryCallback(stream1, 10, &dcb1); + auto registerDelivery4 = + transport->registerDeliveryCallback(stream2, 20, &dcb2); EXPECT_CALL(dcb1, onCanceled(_, _)); EXPECT_CALL(dcb2, onCanceled(_, _)).Times(0); @@ -2053,13 +2154,13 @@ TEST_P(QuicTransportImplTestBase, ByteEventCallbacksManagementSingleStream) { ByteEvent ackEvent2 = ByteEvent{stream, offset2, ByteEvent::Type::ACK}; // Register 2 TX and 2 ACK events for the same stream at 2 different offsets - transport->registerTxCallback( + [[maybe_unused]] auto registerTx1 = transport->registerTxCallback( txEvent1.id, txEvent1.offset, &byteEventCallback); - transport->registerTxCallback( + [[maybe_unused]] auto registerTx2 = transport->registerTxCallback( txEvent2.id, txEvent2.offset, &byteEventCallback); - transport->registerByteEventCallback( + auto registerByteEvent1 = transport->registerByteEventCallback( ByteEvent::Type::ACK, ackEvent1.id, ackEvent1.offset, &byteEventCallback); - transport->registerByteEventCallback( + auto registerByteEvent2 = transport->registerByteEventCallback( ByteEvent::Type::ACK, ackEvent2.id, ackEvent2.offset, &byteEventCallback); EXPECT_THAT( byteEventCallback.getByteEventTracker(), @@ -2075,7 +2176,7 @@ TEST_P(QuicTransportImplTestBase, ByteEventCallbacksManagementSingleStream) { // Registering the same events a second time will result in an error. // as double registrations are not allowed. - folly::Expected ret; + quic::Expected ret; ret = transport->registerTxCallback( txEvent1.id, txEvent1.offset, &byteEventCallback); EXPECT_EQ(LocalErrorCode::INVALID_OPERATION, ret.error()); @@ -2138,13 +2239,13 @@ TEST_P( EXPECT_THAT(byteEventCallback.getByteEventTracker(), IsEmpty()); // Register 2 TX and 2 ACK events for 2 separate streams. - transport->registerTxCallback( + auto registerTx1 = transport->registerTxCallback( txEvent1.id, txEvent1.offset, &byteEventCallback); - transport->registerTxCallback( + auto registerTx2 = transport->registerTxCallback( txEvent2.id, txEvent2.offset, &byteEventCallback); - transport->registerByteEventCallback( + auto registerByteEvent3 = transport->registerByteEventCallback( ByteEvent::Type::ACK, ackEvent1.id, ackEvent1.offset, &byteEventCallback); - transport->registerByteEventCallback( + auto registerByteEvent4 = transport->registerByteEventCallback( ByteEvent::Type::ACK, ackEvent2.id, ackEvent2.offset, &byteEventCallback); EXPECT_THAT( byteEventCallback.getByteEventTracker(), @@ -2208,10 +2309,12 @@ TEST_P(QuicTransportImplTestBase, RegisterTxDeliveryCallbackLowerThanExpected) { EXPECT_CALL(txcb1, onByteEventRegistered(getTxMatcher(stream, 10))); EXPECT_CALL(txcb2, onByteEventRegistered(getTxMatcher(stream, 20))); - transport->registerTxCallback(stream, 10, &txcb1); - transport->registerTxCallback(stream, 20, &txcb2); - transport->registerDeliveryCallback(stream, 10, &dcb1); - transport->registerDeliveryCallback(stream, 20, &dcb2); + auto registerTx3 = transport->registerTxCallback(stream, 10, &txcb1); + auto registerTx4 = transport->registerTxCallback(stream, 20, &txcb2); + auto registerDelivery5 = + transport->registerDeliveryCallback(stream, 10, &dcb1); + auto registerDelivery6 = + transport->registerDeliveryCallback(stream, 20, &dcb2); Mock::VerifyAndClearExpectations(&txcb1); Mock::VerifyAndClearExpectations(&txcb2); auto streamStateResult = @@ -2224,8 +2327,9 @@ TEST_P(QuicTransportImplTestBase, RegisterTxDeliveryCallbackLowerThanExpected) { EXPECT_CALL(txcb3, onByteEventRegistered(getTxMatcher(stream, 2))); EXPECT_CALL(txcb3, onByteEvent(getTxMatcher(stream, 2))); EXPECT_CALL(dcb3, onDeliveryAck(stream, 2, _)); - transport->registerTxCallback(stream, 2, &txcb3); - transport->registerDeliveryCallback(stream, 2, &dcb3); + auto registerTx5 = transport->registerTxCallback(stream, 2, &txcb3); + auto registerDelivery7 = + transport->registerDeliveryCallback(stream, 2, &dcb3); qEvb->loopOnce(); Mock::VerifyAndClearExpectations(&txcb3); Mock::VerifyAndClearExpectations(&dcb3); @@ -2258,8 +2362,8 @@ TEST_F( EXPECT_CALL(txcb, onByteEventRegistered(getTxMatcher(stream, 2))); EXPECT_CALL(txcb, onByteEventCanceled(getTxMatcher(stream, 2))); EXPECT_CALL(dcb, onCanceled(_, _)); - transport->registerTxCallback(stream, 2, &txcb); - transport->registerDeliveryCallback(stream, 2, &dcb); + auto registerTx6 = transport->registerTxCallback(stream, 2, &txcb); + auto registerDelivery8 = transport->registerDeliveryCallback(stream, 2, &dcb); transport->close(std::nullopt); qEvb->loopOnce(); Mock::VerifyAndClearExpectations(&txcb); @@ -2286,8 +2390,8 @@ TEST_P( // scheduled for immediate delivery. EXPECT_CALL(txcb1, onByteEventRegistered(getTxMatcher(stream, 3))); EXPECT_CALL(txcb2, onByteEventRegistered(getTxMatcher(stream, 3))); - transport->registerTxCallback(stream, 3, &txcb1); - transport->registerTxCallback(stream, 3, &txcb2); + auto registerTx7 = transport->registerTxCallback(stream, 3, &txcb1); + auto registerTx8 = transport->registerTxCallback(stream, 3, &txcb2); Mock::VerifyAndClearExpectations(&txcb1); Mock::VerifyAndClearExpectations(&txcb2); @@ -2325,8 +2429,10 @@ TEST_F( // scheduled for immediate delivery. EXPECT_CALL(txcb1, onByteEventRegistered(getAckMatcher(stream, 3))); EXPECT_CALL(txcb2, onByteEventRegistered(getAckMatcher(stream, 3))); - transport->registerByteEventCallback(ByteEvent::Type::ACK, stream, 3, &txcb1); - transport->registerByteEventCallback(ByteEvent::Type::ACK, stream, 3, &txcb2); + auto registerByteEvent5 = transport->registerByteEventCallback( + ByteEvent::Type::ACK, stream, 3, &txcb1); + auto registerByteEvent6 = transport->registerByteEventCallback( + ByteEvent::Type::ACK, stream, 3, &txcb2); Mock::VerifyAndClearExpectations(&txcb1); Mock::VerifyAndClearExpectations(&txcb2); @@ -2365,8 +2471,8 @@ TEST_P( // and offset. EXPECT_CALL(txcb1, onByteEventRegistered(getTxMatcher(stream, 3))); EXPECT_CALL(txcb2, onByteEventRegistered(getTxMatcher(stream, 3))); - transport->registerTxCallback(stream, 3, &txcb1); - transport->registerTxCallback(stream, 3, &txcb2); + auto registerTx9 = transport->registerTxCallback(stream, 3, &txcb1); + auto registerTx10 = transport->registerTxCallback(stream, 3, &txcb2); Mock::VerifyAndClearExpectations(&txcb1); Mock::VerifyAndClearExpectations(&txcb2); @@ -2406,8 +2512,10 @@ TEST_P( // and offset. EXPECT_CALL(txcb1, onByteEventRegistered(getAckMatcher(stream, 3))); EXPECT_CALL(txcb2, onByteEventRegistered(getAckMatcher(stream, 3))); - transport->registerByteEventCallback(ByteEvent::Type::ACK, stream, 3, &txcb1); - transport->registerByteEventCallback(ByteEvent::Type::ACK, stream, 3, &txcb2); + auto registerByteEvent7 = transport->registerByteEventCallback( + ByteEvent::Type::ACK, stream, 3, &txcb1); + auto registerByteEvent8 = transport->registerByteEventCallback( + ByteEvent::Type::ACK, stream, 3, &txcb2); Mock::VerifyAndClearExpectations(&txcb1); Mock::VerifyAndClearExpectations(&txcb2); @@ -2448,8 +2556,8 @@ TEST_P(QuicTransportImplTestBase, RegisterDeliveryCallbackAsyncDeliveryTx) { // when the actual TX for this offset occurs in the future. EXPECT_CALL(txcb1, onByteEventRegistered(getTxMatcher(stream, 3))); EXPECT_CALL(txcb2, onByteEventRegistered(getTxMatcher(stream, 10))); - transport->registerTxCallback(stream, 3, &txcb1); - transport->registerTxCallback(stream, 10, &txcb2); + auto registerTx11 = transport->registerTxCallback(stream, 3, &txcb1); + auto registerTx12 = transport->registerTxCallback(stream, 10, &txcb2); Mock::VerifyAndClearExpectations(&txcb1); Mock::VerifyAndClearExpectations(&txcb2); @@ -2496,8 +2604,9 @@ TEST_P(QuicTransportImplTestBase, RegisterDeliveryCallbackAsyncDeliveryAck) { // when the actual TX for this offset occurs in the future. EXPECT_CALL(txcb1, onByteEventRegistered(getAckMatcher(stream, 3))); EXPECT_CALL(txcb2, onByteEventRegistered(getAckMatcher(stream, 10))); - transport->registerByteEventCallback(ByteEvent::Type::ACK, stream, 3, &txcb1); - transport->registerByteEventCallback( + auto registerByteEvent9 = transport->registerByteEventCallback( + ByteEvent::Type::ACK, stream, 3, &txcb1); + auto registerByteEvent10 = transport->registerByteEventCallback( ByteEvent::Type::ACK, stream, 10, &txcb2); Mock::VerifyAndClearExpectations(&txcb1); Mock::VerifyAndClearExpectations(&txcb2); @@ -2533,13 +2642,15 @@ TEST_P(QuicTransportImplTestBase, CancelAllByteEventCallbacks) { NiceMock txcb2; EXPECT_CALL(txcb1, onByteEventRegistered(getTxMatcher(stream1, 10))); EXPECT_CALL(txcb2, onByteEventRegistered(getTxMatcher(stream2, 20))); - transport->registerTxCallback(stream1, 10, &txcb1); - transport->registerTxCallback(stream2, 20, &txcb2); + auto registerTx13 = transport->registerTxCallback(stream1, 10, &txcb1); + auto registerTx14 = transport->registerTxCallback(stream2, 20, &txcb2); NiceMock dcb1; NiceMock dcb2; - transport->registerDeliveryCallback(stream1, 10, &dcb1); - transport->registerDeliveryCallback(stream2, 20, &dcb2); + auto registerDelivery9 = + transport->registerDeliveryCallback(stream1, 10, &dcb1); + auto registerDelivery10 = + transport->registerDeliveryCallback(stream2, 20, &dcb2); EXPECT_EQ(2, transport->getNumByteEventCallbacksForStream(stream1)); EXPECT_EQ(2, transport->getNumByteEventCallbacksForStream(stream2)); @@ -2612,10 +2723,12 @@ TEST_P(QuicTransportImplTestBase, CancelByteEventCallbacksForStream) { EXPECT_CALL(txcb1, onByteEventRegistered(getTxMatcher(stream1, 10))); EXPECT_CALL(txcb2, onByteEventRegistered(getTxMatcher(stream2, 20))); - transport->registerTxCallback(stream1, 10, &txcb1); - transport->registerTxCallback(stream2, 20, &txcb2); - transport->registerDeliveryCallback(stream1, 10, &dcb1); - transport->registerDeliveryCallback(stream2, 20, &dcb2); + auto registerTx15 = transport->registerTxCallback(stream1, 10, &txcb1); + auto registerTx16 = transport->registerTxCallback(stream2, 20, &txcb2); + auto registerDelivery11 = + transport->registerDeliveryCallback(stream1, 10, &dcb1); + auto registerDelivery12 = + transport->registerDeliveryCallback(stream2, 20, &dcb2); EXPECT_EQ(2, transport->getNumByteEventCallbacksForStream(stream1)); EXPECT_EQ(2, transport->getNumByteEventCallbacksForStream(stream2)); @@ -2711,12 +2824,12 @@ TEST_P(QuicTransportImplTestBase, CancelByteEventCallbacksForStreamWithOffset) { EXPECT_CALL(txcb2, onByteEventRegistered(getTxMatcher(stream2, 10))); EXPECT_CALL(txcb2, onByteEventRegistered(getTxMatcher(stream2, 15))); EXPECT_CALL(txcb2, onByteEventRegistered(getTxMatcher(stream2, 20))); - transport->registerTxCallback(stream1, 10, &txcb1); - transport->registerTxCallback(stream1, 15, &txcb1); - transport->registerTxCallback(stream1, 20, &txcb1); - transport->registerTxCallback(stream2, 10, &txcb2); - transport->registerTxCallback(stream2, 15, &txcb2); - transport->registerTxCallback(stream2, 20, &txcb2); + auto registerTx17 = transport->registerTxCallback(stream1, 10, &txcb1); + auto registerTx18 = transport->registerTxCallback(stream1, 15, &txcb1); + auto registerTx19 = transport->registerTxCallback(stream1, 20, &txcb1); + auto registerTx20 = transport->registerTxCallback(stream2, 10, &txcb2); + auto registerTx21 = transport->registerTxCallback(stream2, 15, &txcb2); + auto registerTx22 = transport->registerTxCallback(stream2, 20, &txcb2); EXPECT_EQ(3, transport->getNumByteEventCallbacksForStream(stream1)); EXPECT_EQ(3, transport->getNumByteEventCallbacksForStream(stream2)); @@ -2737,12 +2850,18 @@ TEST_P(QuicTransportImplTestBase, CancelByteEventCallbacksForStreamWithOffset) { transport->getNumByteEventCallbacksForStream( ByteEvent::Type::ACK, stream2)); - transport->registerDeliveryCallback(stream1, 10, &dcb1); - transport->registerDeliveryCallback(stream1, 15, &dcb1); - transport->registerDeliveryCallback(stream1, 20, &dcb1); - transport->registerDeliveryCallback(stream2, 10, &dcb2); - transport->registerDeliveryCallback(stream2, 15, &dcb2); - transport->registerDeliveryCallback(stream2, 20, &dcb2); + auto registerDelivery13 = + transport->registerDeliveryCallback(stream1, 10, &dcb1); + auto registerDelivery14 = + transport->registerDeliveryCallback(stream1, 15, &dcb1); + auto registerDelivery15 = + transport->registerDeliveryCallback(stream1, 20, &dcb1); + auto registerDelivery16 = + transport->registerDeliveryCallback(stream2, 10, &dcb2); + auto registerDelivery17 = + transport->registerDeliveryCallback(stream2, 15, &dcb2); + auto registerDelivery18 = + transport->registerDeliveryCallback(stream2, 20, &dcb2); EXPECT_EQ(6, transport->getNumByteEventCallbacksForStream(stream1)); EXPECT_EQ(6, transport->getNumByteEventCallbacksForStream(stream2)); @@ -2868,14 +2987,18 @@ TEST_P(QuicTransportImplTestBase, CancelByteEventCallbacksTx) { EXPECT_CALL(txcb1, onByteEventRegistered(getTxMatcher(stream1, 15))); EXPECT_CALL(txcb2, onByteEventRegistered(getTxMatcher(stream2, 10))); EXPECT_CALL(txcb2, onByteEventRegistered(getTxMatcher(stream2, 15))); - transport->registerTxCallback(stream1, 10, &txcb1); - transport->registerTxCallback(stream1, 15, &txcb1); - transport->registerTxCallback(stream2, 10, &txcb2); - transport->registerTxCallback(stream2, 15, &txcb2); - transport->registerDeliveryCallback(stream1, 10, &dcb1); - transport->registerDeliveryCallback(stream1, 15, &dcb1); - transport->registerDeliveryCallback(stream2, 10, &dcb2); - transport->registerDeliveryCallback(stream2, 15, &dcb2); + auto registerTx23 = transport->registerTxCallback(stream1, 10, &txcb1); + auto registerTx24 = transport->registerTxCallback(stream1, 15, &txcb1); + auto registerTx25 = transport->registerTxCallback(stream2, 10, &txcb2); + auto registerTx26 = transport->registerTxCallback(stream2, 15, &txcb2); + auto registerDelivery19 = + transport->registerDeliveryCallback(stream1, 10, &dcb1); + auto registerDelivery20 = + transport->registerDeliveryCallback(stream1, 15, &dcb1); + auto registerDelivery21 = + transport->registerDeliveryCallback(stream2, 10, &dcb2); + auto registerDelivery22 = + transport->registerDeliveryCallback(stream2, 15, &dcb2); EXPECT_EQ(4, transport->getNumByteEventCallbacksForStream(stream1)); EXPECT_EQ(4, transport->getNumByteEventCallbacksForStream(stream2)); @@ -2950,14 +3073,18 @@ TEST_P(QuicTransportImplTestBase, CancelByteEventCallbacksDelivery) { EXPECT_CALL(txcb1, onByteEventRegistered(getTxMatcher(stream1, 15))); EXPECT_CALL(txcb2, onByteEventRegistered(getTxMatcher(stream2, 10))); EXPECT_CALL(txcb2, onByteEventRegistered(getTxMatcher(stream2, 15))); - transport->registerTxCallback(stream1, 10, &txcb1); - transport->registerTxCallback(stream1, 15, &txcb1); - transport->registerTxCallback(stream2, 10, &txcb2); - transport->registerTxCallback(stream2, 15, &txcb2); - transport->registerDeliveryCallback(stream1, 10, &dcb1); - transport->registerDeliveryCallback(stream1, 15, &dcb1); - transport->registerDeliveryCallback(stream2, 10, &dcb2); - transport->registerDeliveryCallback(stream2, 15, &dcb2); + auto registerTx27 = transport->registerTxCallback(stream1, 10, &txcb1); + auto registerTx28 = transport->registerTxCallback(stream1, 15, &txcb1); + auto registerTx29 = transport->registerTxCallback(stream2, 10, &txcb2); + auto registerTx30 = transport->registerTxCallback(stream2, 15, &txcb2); + auto registerDelivery23 = + transport->registerDeliveryCallback(stream1, 10, &dcb1); + auto registerDelivery24 = + transport->registerDeliveryCallback(stream1, 15, &dcb1); + auto registerDelivery25 = + transport->registerDeliveryCallback(stream2, 10, &dcb2); + auto registerDelivery26 = + transport->registerDeliveryCallback(stream2, 15, &dcb2); EXPECT_EQ(4, transport->getNumByteEventCallbacksForStream(stream1)); EXPECT_EQ(4, transport->getNumByteEventCallbacksForStream(stream2)); @@ -3027,14 +3154,14 @@ TEST_P( EXPECT_CALL( wcb, onConnectionWriteError(IsError(GenericApplicationErrorCode::NO_ERROR))); - transport->notifyPendingWriteOnConnection(&wcb); + auto notifyWrite1 = transport->notifyPendingWriteOnConnection(&wcb); transport->close(std::nullopt); qEvb->loopOnce(); } TEST_P(QuicTransportImplTestClose, TestNotifyPendingConnWriteOnCloseWithError) { NiceMock wcb; - transport->notifyPendingWriteOnConnection(&wcb); + auto notifyWrite2 = transport->notifyPendingWriteOnConnection(&wcb); if (GetParam()) { EXPECT_CALL( wcb, @@ -3054,7 +3181,7 @@ TEST_P(QuicTransportImplTestBase, TestNotifyPendingWriteWithActiveCallback) { NiceMock wcb; EXPECT_CALL(wcb, onStreamWriteReady(stream, _)); auto ok1 = transport->notifyPendingWriteOnStream(stream, &wcb); - EXPECT_TRUE(ok1.hasValue()); + EXPECT_TRUE(ok1.has_value()); auto ok2 = transport->notifyPendingWriteOnStream(stream, &wcb); EXPECT_EQ(ok2.error(), quic::LocalErrorCode::CALLBACK_ALREADY_INSTALLED); qEvb->loopOnce(); @@ -3067,7 +3194,7 @@ TEST_P(QuicTransportImplTestBase, TestNotifyPendingWriteOnCloseWithoutError) { wcb, onStreamWriteError( stream, IsError(GenericApplicationErrorCode::NO_ERROR))); - transport->notifyPendingWriteOnStream(stream, &wcb); + auto notifyWrite3 = transport->notifyPendingWriteOnStream(stream, &wcb); transport->close(std::nullopt); qEvb->loopOnce(); } @@ -3075,7 +3202,7 @@ TEST_P(QuicTransportImplTestBase, TestNotifyPendingWriteOnCloseWithoutError) { TEST_P(QuicTransportImplTestClose, TestNotifyPendingWriteOnCloseWithError) { auto stream = transport->createBidirectionalStream().value(); NiceMock wcb; - transport->notifyPendingWriteOnStream(stream, &wcb); + auto notifyWrite4 = transport->notifyPendingWriteOnStream(stream, &wcb); if (GetParam()) { EXPECT_CALL( wcb, @@ -3123,12 +3250,14 @@ TEST_P(QuicTransportImplTestBase, TestGracefulCloseWithActiveStream) { EXPECT_CALL(txCb, onByteEventCanceled(getTxMatcher(stream, 0))); EXPECT_CALL(txCb, onByteEventCanceled(getTxMatcher(stream, 4))); - transport->notifyPendingWriteOnConnection(&wcbConn); - transport->notifyPendingWriteOnStream(stream, &wcb); - transport->setReadCallback(stream, &rcb); + auto notifyWrite5 = transport->notifyPendingWriteOnConnection(&wcbConn); + auto notifyWrite6 = transport->notifyPendingWriteOnStream(stream, &wcb); + [[maybe_unused]] auto setReadCallback38 = + transport->setReadCallback(stream, &rcb); EXPECT_CALL(*socketPtr, write(_, _, _)) .WillRepeatedly(SetErrnoAndReturn(EAGAIN, -1)); - transport->writeChain(stream, IOBuf::copyBuffer("hello"), true, &deliveryCb); + [[maybe_unused]] auto writeChain4 = transport->writeChain( + stream, IOBuf::copyBuffer("hello"), true, &deliveryCb); EXPECT_CALL(txCb, onByteEventRegistered(getTxMatcher(stream, 0))); EXPECT_CALL(txCb, onByteEventRegistered(getTxMatcher(stream, 4))); EXPECT_FALSE(transport->registerTxCallback(stream, 0, &txCb).hasError()); @@ -3181,10 +3310,12 @@ TEST_P(QuicTransportImplTestBase, TestGracefulCloseWithNoActiveStream) { EXPECT_CALL(connCallback, onConnectionEnd()).Times(0); EXPECT_CALL(connCallback, onConnectionError(_)).Times(0); - transport->setReadCallback(stream, &rcb); + [[maybe_unused]] auto setReadCallback39 = + transport->setReadCallback(stream, &rcb); EXPECT_CALL(*socketPtr, write(_, _, _)) .WillRepeatedly(SetErrnoAndReturn(EAGAIN, -1)); - transport->writeChain(stream, IOBuf::copyBuffer("hello"), true, &deliveryCb); + [[maybe_unused]] auto writeChain5 = transport->writeChain( + stream, IOBuf::copyBuffer("hello"), true, &deliveryCb); EXPECT_CALL(txCb, onByteEventRegistered(getTxMatcher(stream, 0))); EXPECT_CALL(txCb, onByteEventRegistered(getTxMatcher(stream, 4))); EXPECT_FALSE(transport->registerTxCallback(stream, 0, &txCb).hasError()); @@ -3225,8 +3356,10 @@ TEST_P(QuicTransportImplTestBase, TestResetRemovesDeliveryCb) { NiceMock deliveryCb2; EXPECT_CALL(*socketPtr, write(_, _, _)) .WillRepeatedly(SetErrnoAndReturn(EAGAIN, -1)); - transport->writeChain(stream1, IOBuf::copyBuffer("hello"), true, nullptr); - transport->writeChain(stream2, IOBuf::copyBuffer("hello"), true, nullptr); + [[maybe_unused]] auto writeChain6 = + transport->writeChain(stream1, IOBuf::copyBuffer("hello"), true, nullptr); + [[maybe_unused]] auto writeChain7 = + transport->writeChain(stream2, IOBuf::copyBuffer("hello"), true, nullptr); EXPECT_FALSE( transport->registerDeliveryCallback(stream1, 2, &deliveryCb1).hasError()); EXPECT_FALSE( @@ -3264,14 +3397,16 @@ TEST_P(QuicTransportImplTestBase, TestImmediateClose) { ON_CALL( rcb, readError(stream, IsAppError(GenericApplicationErrorCode::UNKNOWN))) .WillByDefault(InvokeWithoutArgs([this, stream2, &resetCount] { - transport->setReadCallback(stream2, nullptr); + [[maybe_unused]] auto setReadCallback40 = + transport->setReadCallback(stream2, nullptr); resetCount++; })); ON_CALL( rcb2, readError(stream2, IsAppError(GenericApplicationErrorCode::UNKNOWN))) .WillByDefault(InvokeWithoutArgs([this, stream, &resetCount] { - transport->setReadCallback(stream, nullptr); + [[maybe_unused]] auto setReadCallback41 = + transport->setReadCallback(stream, nullptr); resetCount++; })); EXPECT_CALL( @@ -3282,14 +3417,17 @@ TEST_P(QuicTransportImplTestBase, TestImmediateClose) { EXPECT_CALL(connCallback, onConnectionError(_)).Times(0); - transport->notifyPendingWriteOnConnection(&wcbConn); - transport->notifyPendingWriteOnStream(stream, &wcb); - transport->setReadCallback(stream, &rcb); - transport->setReadCallback(stream2, &rcb2); - transport->setPeekCallback(stream, &pcb); + auto notifyWrite7 = transport->notifyPendingWriteOnConnection(&wcbConn); + auto notifyWrite8 = transport->notifyPendingWriteOnStream(stream, &wcb); + [[maybe_unused]] auto setReadCallback42 = + transport->setReadCallback(stream, &rcb); + [[maybe_unused]] auto setReadCallback43 = + transport->setReadCallback(stream2, &rcb2); + auto setPeek1 = transport->setPeekCallback(stream, &pcb); EXPECT_CALL(*socketPtr, write(_, _, _)) .WillRepeatedly(SetErrnoAndReturn(EAGAIN, -1)); - transport->writeChain(stream, IOBuf::copyBuffer("hello"), true, &deliveryCb); + [[maybe_unused]] auto writeChain8 = transport->writeChain( + stream, IOBuf::copyBuffer("hello"), true, &deliveryCb); EXPECT_CALL(txCb, onByteEventRegistered(getTxMatcher(stream, 0))); EXPECT_CALL(txCb, onByteEventRegistered(getTxMatcher(stream, 4))); EXPECT_FALSE(transport->registerTxCallback(stream, 0, &txCb).hasError()); @@ -3326,7 +3464,7 @@ TEST_P(QuicTransportImplTestBase, ResetStreamUnsetWriteCallback) { auto stream = transport->createBidirectionalStream().value(); NiceMock wcb; EXPECT_CALL(wcb, onStreamWriteError(stream, _)).Times(0); - transport->notifyPendingWriteOnStream(stream, &wcb); + auto notifyWrite9 = transport->notifyPendingWriteOnStream(stream, &wcb); EXPECT_FALSE( transport->resetStream(stream, GenericApplicationErrorCode::UNKNOWN) .hasError()); @@ -3340,31 +3478,36 @@ TEST_P(QuicTransportImplTestBase, ResetAllNonControlStreams) { NiceMock rcb1; EXPECT_CALL(wcb1, onStreamWriteError(stream1, _)).Times(0); EXPECT_CALL(rcb1, readError(stream1, _)).Times(0); - transport->notifyPendingWriteOnStream(stream1, &wcb1); - transport->setReadCallback(stream1, &rcb1); + auto notifyWrite10 = transport->notifyPendingWriteOnStream(stream1, &wcb1); + [[maybe_unused]] auto setReadCallback44 = + transport->setReadCallback(stream1, &rcb1); auto stream2 = transport->createBidirectionalStream().value(); NiceMock wcb2; NiceMock rcb2; EXPECT_CALL(wcb2, onStreamWriteError(stream2, _)).Times(1); EXPECT_CALL(rcb2, readError(stream2, _)).Times(1); - transport->notifyPendingWriteOnStream(stream2, &wcb2); - transport->setReadCallback(stream2, &rcb2); + auto notifyWrite11 = transport->notifyPendingWriteOnStream(stream2, &wcb2); + [[maybe_unused]] auto setReadCallback45 = + transport->setReadCallback(stream2, &rcb2); auto stream3 = transport->createUnidirectionalStream().value(); NiceMock wcb3; - transport->notifyPendingWriteOnStream(stream3, &wcb3); + auto notifyWrite12 = transport->notifyPendingWriteOnStream(stream3, &wcb3); EXPECT_CALL(wcb3, onStreamWriteError(stream3, _)).Times(1); auto stream4 = transport->createBidirectionalStream().value(); NiceMock wcb4; NiceMock rcb4; EXPECT_CALL(wcb4, onStreamWriteError(stream4, _)) - .WillOnce(Invoke( - [&](auto, auto) { transport->setReadCallback(stream4, nullptr); })); + .WillOnce(Invoke([&](auto, auto) { + [[maybe_unused]] auto setReadCb = + transport->setReadCallback(stream4, nullptr); + })); EXPECT_CALL(rcb4, readError(_, _)).Times(0); - transport->notifyPendingWriteOnStream(stream4, &wcb4); - transport->setReadCallback(stream4, &rcb4); + auto notifyWrite13 = transport->notifyPendingWriteOnStream(stream4, &wcb4); + [[maybe_unused]] auto setReadCallback46 = + transport->setReadCallback(stream4, &rcb4); transport->resetNonControlStreams( GenericApplicationErrorCode::UNKNOWN, "bye bye"); @@ -3419,7 +3562,7 @@ TEST_P(QuicTransportImplTestBase, AsyncStreamFlowControlWrite) { transport->setServerConnectionId(); transport->writeLooper()->stop(); streamState->flowControlState.advertisedMaxOffset = 0; // Easier to calculate - transport->setStreamFlowControlWindow(stream, 4000); + auto setFlow1 = transport->setStreamFlowControlWindow(stream, 4000); EXPECT_EQ(0, streamState->flowControlState.advertisedMaxOffset); // Loop it: EXPECT_TRUE(transport->writeLooper()->isRunning()); @@ -3429,8 +3572,10 @@ TEST_P(QuicTransportImplTestBase, AsyncStreamFlowControlWrite) { TEST_P(QuicTransportImplTestBase, ExceptionInWriteLooperDoesNotCrash) { auto stream = transport->createBidirectionalStream().value(); - transport->setReadCallback(stream, nullptr); - transport->writeChain(stream, IOBuf::copyBuffer("hello"), true, nullptr); + [[maybe_unused]] auto setReadCallback47 = + transport->setReadCallback(stream, nullptr); + [[maybe_unused]] auto writeChain9 = + transport->writeChain(stream, IOBuf::copyBuffer("hello"), true, nullptr); transport->addDataToStream( stream, StreamBuffer(IOBuf::copyBuffer("hello"), 0, false)); EXPECT_CALL(*socketPtr, write(_, _, _)) @@ -3517,64 +3662,40 @@ TEST_P(QuicTransportImplTestUniBidi, AppIdleTestOnlyControlStreams) { TEST_P(QuicTransportImplTestBase, UnidirectionalInvalidReadFuncs) { auto stream = transport->createUnidirectionalStream().value(); - EXPECT_THROW( - transport->read(stream, 100).thenOrThrow([&](auto) {}), - folly::BadExpectedAccess); - EXPECT_THROW( - transport->setReadCallback(stream, nullptr).thenOrThrow([&](auto) {}), - folly::BadExpectedAccess); - EXPECT_THROW( - transport->pauseRead(stream).thenOrThrow([&](auto) {}), - folly::BadExpectedAccess); - EXPECT_THROW( - transport->resumeRead(stream).thenOrThrow([&](auto) {}), - folly::BadExpectedAccess); - EXPECT_THROW( + EXPECT_FALSE(transport->read(stream, 100).has_value()); + EXPECT_FALSE(transport->setReadCallback(stream, nullptr).has_value()); + EXPECT_FALSE(transport->pauseRead(stream).has_value()); + EXPECT_FALSE(transport->resumeRead(stream).has_value()); + EXPECT_FALSE( transport->stopSending(stream, GenericApplicationErrorCode::UNKNOWN) - .thenOrThrow([&](auto) {}), - folly::BadExpectedAccess); + .has_value()); } TEST_P(QuicTransportImplTestBase, UnidirectionalInvalidWriteFuncs) { auto readData = folly::IOBuf::copyBuffer("actual stream data"); StreamId stream = 0x6; transport->addDataToStream(stream, StreamBuffer(readData->clone(), 0, true)); - EXPECT_THROW( - transport->getStreamWriteOffset(stream).thenOrThrow([&](auto) {}), - folly::BadExpectedAccess); - EXPECT_THROW( - transport->getStreamWriteBufferedBytes(stream).thenOrThrow([&](auto) {}), - folly::BadExpectedAccess); - EXPECT_THROW( - transport->notifyPendingWriteOnStream(stream, nullptr) - .thenOrThrow([&](auto) {}), - folly::BadExpectedAccess); - EXPECT_THROW( + EXPECT_FALSE(transport->getStreamWriteOffset(stream).has_value()); + EXPECT_FALSE(transport->getStreamWriteBufferedBytes(stream).has_value()); + EXPECT_FALSE( + transport->notifyPendingWriteOnStream(stream, nullptr).has_value()); + EXPECT_FALSE( transport->writeChain(stream, folly::IOBuf::copyBuffer("Hey"), false) - .thenOrThrow([&](auto) {}), - folly::BadExpectedAccess); - EXPECT_THROW( - transport->registerDeliveryCallback(stream, 0, nullptr) - .thenOrThrow([&](auto) {}), - folly::BadExpectedAccess); - EXPECT_THROW( - transport->registerTxCallback(stream, 0, nullptr).thenOrThrow([&](auto) { - }), - folly::BadExpectedAccess); - EXPECT_THROW( + .has_value()); + EXPECT_FALSE( + transport->registerDeliveryCallback(stream, 0, nullptr).has_value()); + EXPECT_FALSE(transport->registerTxCallback(stream, 0, nullptr).has_value()); + EXPECT_FALSE( transport ->registerByteEventCallback(ByteEvent::Type::ACK, stream, 0, nullptr) - .thenOrThrow([&](auto) {}), - folly::BadExpectedAccess); - EXPECT_THROW( + .has_value()); + EXPECT_FALSE( transport ->registerByteEventCallback(ByteEvent::Type::TX, stream, 0, nullptr) - .thenOrThrow([&](auto) {}), - folly::BadExpectedAccess); - EXPECT_THROW( + .has_value()); + EXPECT_FALSE( transport->resetStream(stream, GenericApplicationErrorCode::UNKNOWN) - .thenOrThrow([&](auto) {}), - folly::BadExpectedAccess); + .has_value()); } TEST_P(QuicTransportImplTestUniBidi, IsServerStream) { @@ -3618,8 +3739,8 @@ TEST_P(QuicTransportImplTestBase, PeekCallbackDataAvailable) { NiceMock peekCb1; NiceMock peekCb2; - transport->setPeekCallback(stream1, &peekCb1); - transport->setPeekCallback(stream2, &peekCb2); + auto setPeek2 = transport->setPeekCallback(stream1, &peekCb1); + auto setPeek3 = transport->setPeekCallback(stream2, &peekCb2); transport->addDataToStream( stream1, StreamBuffer(folly::IOBuf::copyBuffer("actual stream data"), 0)); @@ -3647,8 +3768,8 @@ TEST_P(QuicTransportImplTestBase, PeekCallbackDataAvailable) { EXPECT_CALL(peekCb2, onDataAvailable(stream2, _)); transport->driveReadCallbacks(); - transport->setPeekCallback(stream1, nullptr); - transport->setPeekCallback(stream2, nullptr); + auto setPeek4 = transport->setPeekCallback(stream1, nullptr); + auto setPeek5 = transport->setPeekCallback(stream2, nullptr); transport->driveReadCallbacks(); transport.reset(); @@ -3658,7 +3779,7 @@ TEST_P(QuicTransportImplTestBase, PeekError) { auto stream1 = transport->createBidirectionalStream().value(); NiceMock peekCb1; - transport->setPeekCallback(stream1, &peekCb1); + auto setPeek6 = transport->setPeekCallback(stream1, &peekCb1); transport->addDataToStream( stream1, StreamBuffer(folly::IOBuf::copyBuffer("actual stream data"), 0)); @@ -3684,8 +3805,8 @@ TEST_P(QuicTransportImplTestBase, PeekCallbackUnsetAll) { // Set the peek callbacks and add data to the streams, and see that the // callbacks do indeed fire - transport->setPeekCallback(stream1, &peekCb1); - transport->setPeekCallback(stream2, &peekCb2); + auto setPeek7 = transport->setPeekCallback(stream1, &peekCb1); + auto setPeek8 = transport->setPeekCallback(stream2, &peekCb2); transport->addDataToStream( stream1, StreamBuffer(folly::IOBuf::copyBuffer("actual stream data"), 0)); @@ -3721,7 +3842,7 @@ TEST_P(QuicTransportImplTestBase, PeekCallbackChangePeekCallback) { NiceMock peekCb1; NiceMock peekCb2; - transport->setPeekCallback(stream1, &peekCb1); + auto setPeek9 = transport->setPeekCallback(stream1, &peekCb1); transport->addDataToStream( stream1, StreamBuffer(folly::IOBuf::copyBuffer("actual stream data"), 0)); @@ -3729,7 +3850,7 @@ TEST_P(QuicTransportImplTestBase, PeekCallbackChangePeekCallback) { EXPECT_CALL(peekCb1, onDataAvailable(stream1, _)); transport->driveReadCallbacks(); - transport->setPeekCallback(stream1, &peekCb2); + auto setPeek10 = transport->setPeekCallback(stream1, &peekCb2); transport->addDataToStream( stream1, StreamBuffer(folly::IOBuf::copyBuffer("actual stream data"), 0)); @@ -3744,7 +3865,7 @@ TEST_P(QuicTransportImplTestBase, PeekCallbackPauseResume) { auto stream1 = transport->createBidirectionalStream().value(); NiceMock peekCb1; - transport->setPeekCallback(stream1, &peekCb1); + auto setPeek11 = transport->setPeekCallback(stream1, &peekCb1); transport->addDataToStream( stream1, StreamBuffer(folly::IOBuf::copyBuffer("actual stream data"), 0)); @@ -3794,7 +3915,7 @@ TEST_P(QuicTransportImplTestBase, PeekData) { NiceMock peekCb1; auto peekData = folly::IOBuf::copyBuffer("actual stream data"); - transport->setPeekCallback(stream1, &peekCb1); + auto setPeek12 = transport->setPeekCallback(stream1, &peekCb1); EXPECT_CALL(peekCb1, onDataAvailable(stream1, _)); transport->addDataToStream(stream1, StreamBuffer(peekData->clone(), 0)); @@ -3810,7 +3931,7 @@ TEST_P(QuicTransportImplTestBase, PeekData) { EXPECT_EQ("actual stream data", bufClone->to()); }; - transport->peek(stream1, peekCallback); + auto peekResult = transport->peek(stream1, peekCallback); EXPECT_TRUE(cbCalled); transport.reset(); } @@ -3877,8 +3998,9 @@ TEST_P(QuicTransportImplTestBase, PeekConsumeReadTest) { NiceMock peekCb; NiceMock readCb; - transport->setPeekCallback(stream1, &peekCb); - transport->setReadCallback(stream1, &readCb); + auto setPeek13 = transport->setPeekCallback(stream1, &peekCb); + [[maybe_unused]] auto setReadCallback48 = + transport->setReadCallback(stream1, &readCb); transport->addDataToStream( stream1, StreamBuffer(folly::IOBuf::copyBuffer("actual stream data"), 0)); @@ -3893,7 +4015,7 @@ TEST_P(QuicTransportImplTestBase, PeekConsumeReadTest) { transport->driveReadCallbacks(); // Consume 5 bytes. - transport->consume(stream1, 5); + auto transportConsumeResult1 = transport->consume(stream1, 5); // Both peek and read should be called. // Read - because it is called every time @@ -3903,9 +4025,12 @@ TEST_P(QuicTransportImplTestBase, PeekConsumeReadTest) { transport->driveReadCallbacks(); // Read 10 bytes. - transport->read(stream1, 10).thenOrThrow([&](std::pair data) { + { + auto readResult = transport->read(stream1, 10); + ASSERT_TRUE(readResult.has_value()); + auto data = std::move(readResult).value(); EXPECT_EQ("l stream d", data.first->to()); - }); + } // Both peek and read should be called. // Read - because it is called every time @@ -3920,7 +4045,7 @@ TEST_P(QuicTransportImplTestBase, PeekConsumeReadTest) { // Consume the rest of the data. // Only 3 bytes left, try consuming 42. - transport->consume(stream1, 42); + auto transportConsumeResult2 = transport->consume(stream1, 42); // Neither read nor peek should be called. EXPECT_CALL(readCb, readAvailable(stream1)).Times(0); @@ -3944,7 +4069,8 @@ TEST_P(QuicTransportImplTestBase, PeekConsumeReadTest) { transport->driveReadCallbacks(); // Consume left part. - transport->consume(stream1, buf1->computeChainDataLength()); + auto transportConsumeResult3 = + transport->consume(stream1, buf1->computeChainDataLength()); // Only peek should be called. EXPECT_CALL(peekCb, onDataAvailable(stream1, _)); @@ -3960,10 +4086,13 @@ TEST_P(QuicTransportImplTestBase, PeekConsumeReadTest) { transport->driveReadCallbacks(); // Read the rest of the buffer. - transport->read(stream1, 0).thenOrThrow([&](std::pair data) { + { + auto readResult = transport->read(stream1, 0); + ASSERT_TRUE(readResult.has_value()); + auto data = std::move(readResult).value(); EXPECT_EQ( " Here is my number, so call me maybe.", data.first->to()); - }); + } // Neither read nor peek should be called. EXPECT_CALL(readCb, readAvailable(stream1)).Times(0); @@ -4048,7 +4177,7 @@ TEST_P(QuicTransportImplTestBase, SuccessfulPing) { auto conn = transport->transportConn; std::chrono::milliseconds interval(10); TestPingCallback pingCallback; - transport->setPingCallback(&pingCallback); + auto transportSetPingCallback1 = transport->setPingCallback(&pingCallback); transport->invokeSendPing(interval); EXPECT_EQ(transport->isPingTimeoutScheduled(), true); EXPECT_EQ(conn->pendingEvents.cancelPingTimeout, false); @@ -4063,7 +4192,7 @@ TEST_P(QuicTransportImplTestBase, FailedPing) { auto conn = transport->transportConn; std::chrono::milliseconds interval(10); TestPingCallback pingCallback; - transport->setPingCallback(&pingCallback); + auto transportSetPingCallback2 = transport->setPingCallback(&pingCallback); transport->invokeSendPing(interval); EXPECT_EQ(transport->isPingTimeoutScheduled(), true); EXPECT_EQ(conn->pendingEvents.cancelPingTimeout, false); @@ -4134,7 +4263,8 @@ TEST_P(QuicTransportImplTestBase, StreamWriteCallbackUnregister) { result = transport->notifyPendingWriteOnStream(stream, wcb.get()); EXPECT_TRUE(result); MockReadCallback rcb; - transport->setReadCallback(stream, &rcb); + [[maybe_unused]] auto setReadCallback49 = + transport->setReadCallback(stream, &rcb); // ReadCallback kills WriteCallback EXPECT_CALL(rcb, readError(stream, _)) .WillOnce(Invoke([&](StreamId stream, auto) { @@ -4460,7 +4590,8 @@ TEST_P(QuicTransportImplTestBase, GetConnectionStatsSmoke) { TEST_P(QuicTransportImplTestBase, DatagramCallbackDatagramAvailable) { NiceMock datagramCb; transport->enableDatagram(); - transport->setDatagramCallback(&datagramCb); + auto transportSetDatagramCallback1 = + transport->setDatagramCallback(&datagramCb); transport->addDatagram(folly::IOBuf::copyBuffer("datagram payload")); EXPECT_CALL(datagramCb, onDatagramsAvailable()); transport->driveReadCallbacks(); @@ -4469,7 +4600,8 @@ TEST_P(QuicTransportImplTestBase, DatagramCallbackDatagramAvailable) { TEST_P(QuicTransportImplTestBase, ZeroLengthDatagram) { NiceMock datagramCb; transport->enableDatagram(); - transport->setDatagramCallback(&datagramCb); + auto transportSetDatagramCallback2 = + transport->setDatagramCallback(&datagramCb); transport->addDatagram(folly::IOBuf::copyBuffer("")); EXPECT_CALL(datagramCb, onDatagramsAvailable()); transport->driveReadCallbacks(); @@ -4483,7 +4615,8 @@ TEST_P(QuicTransportImplTestBase, ZeroLengthDatagram) { TEST_P(QuicTransportImplTestBase, ZeroLengthDatagramBufs) { NiceMock datagramCb; transport->enableDatagram(); - transport->setDatagramCallback(&datagramCb); + auto transportSetDatagramCallback3 = + transport->setDatagramCallback(&datagramCb); auto recvTime = Clock::now() + 5000ns; transport->addDatagram(folly::IOBuf::copyBuffer(""), recvTime); EXPECT_CALL(datagramCb, onDatagramsAvailable()); @@ -4543,15 +4676,17 @@ TEST_P(QuicTransportImplTestWithGroups, ReadCallbackWithGroupsDataAvailable) { .hasError()); auto groupId = transport->createBidirectionalStreamGroup(); - EXPECT_TRUE(groupId.hasValue()); + EXPECT_TRUE(groupId.has_value()); auto stream1 = transport->createBidirectionalStreamInGroup(*groupId).value(); auto stream2 = transport->createBidirectionalStreamInGroup(*groupId).value(); NiceMock readCb1; NiceMock readCb2; - transport->setReadCallback(stream1, &readCb1); - transport->setReadCallback(stream2, &readCb2); + [[maybe_unused]] auto setReadCallback50 = + transport->setReadCallback(stream1, &readCb1); + [[maybe_unused]] auto setReadCallback51 = + transport->setReadCallback(stream2, &readCb2); transport->addDataToStream( stream1, @@ -4580,7 +4715,8 @@ TEST_P(QuicTransportImplTestWithGroups, ReadCallbackWithGroupsDataAvailable) { transport->driveReadCallbacks(); EXPECT_CALL(readCb2, readAvailableWithGroup(stream2, *groupId)); - transport->setReadCallback(stream1, nullptr); + [[maybe_unused]] auto setReadCallback52 = + transport->setReadCallback(stream1, nullptr); transport->driveReadCallbacks(); transport.reset(); } @@ -4594,12 +4730,13 @@ TEST_P(QuicTransportImplTestWithGroups, ReadErrorCallbackWithGroups) { .hasError()); auto groupId = transport->createBidirectionalStreamGroup(); - EXPECT_TRUE(groupId.hasValue()); + EXPECT_TRUE(groupId.has_value()); auto stream1 = transport->createBidirectionalStreamInGroup(*groupId).value(); NiceMock readCb1; - transport->setReadCallback(stream1, &readCb1); + [[maybe_unused]] auto setReadCallback53 = + transport->setReadCallback(stream1, &readCb1); transport->addStreamReadError(stream1, LocalErrorCode::NO_ERROR); transport->addDataToStream( @@ -4624,15 +4761,17 @@ TEST_P( .hasError()); auto groupId = transport->createBidirectionalStreamGroup(); - EXPECT_TRUE(groupId.hasValue()); + EXPECT_TRUE(groupId.has_value()); auto stream1 = transport->createBidirectionalStreamInGroup(*groupId).value(); auto stream2 = transport->createBidirectionalStreamInGroup(*groupId).value(); NiceMock readCb1; NiceMock readCb2; - transport->setReadCallback(stream1, &readCb1); - transport->setReadCallback(stream2, &readCb2); + [[maybe_unused]] auto setReadCallback54 = + transport->setReadCallback(stream1, &readCb1); + [[maybe_unused]] auto setReadCallback55 = + transport->setReadCallback(stream2, &readCb2); transport->addDataToStream( stream1, @@ -4700,7 +4839,7 @@ TEST_P( // Test policy set allowed auto res = transport->setStreamGroupRetransmissionPolicy(groupId, policy); - EXPECT_TRUE(res.hasValue()); + EXPECT_TRUE(res.has_value()); // Test policy set not allowed. transportSettings.advertisedMaxStreamGroups = 0; @@ -4731,23 +4870,23 @@ TEST_P( // Add the policy. auto res = transport->setStreamGroupRetransmissionPolicy(groupId, policy); - EXPECT_TRUE(res.hasValue()); + EXPECT_TRUE(res.has_value()); EXPECT_EQ(transport->getStreamGroupRetransmissionPolicies().size(), 1); // Reset allowed. res = transport->setStreamGroupRetransmissionPolicy(groupId, std::nullopt); - EXPECT_TRUE(res.hasValue()); + EXPECT_TRUE(res.has_value()); EXPECT_EQ(transport->getStreamGroupRetransmissionPolicies().size(), 0); // Add the policy back. res = transport->setStreamGroupRetransmissionPolicy(groupId, policy); - EXPECT_TRUE(res.hasValue()); + EXPECT_TRUE(res.has_value()); EXPECT_EQ(transport->getStreamGroupRetransmissionPolicies().size(), 1); // Reset allowed even if custom policies are disabled. transportSettings.advertisedMaxStreamGroups = 0; res = transport->setStreamGroupRetransmissionPolicy(groupId, std::nullopt); - EXPECT_TRUE(res.hasValue()); + EXPECT_TRUE(res.has_value()); EXPECT_EQ(transport->getStreamGroupRetransmissionPolicies().size(), 0); transport.reset(); @@ -4767,24 +4906,24 @@ TEST_P( const StreamGroupId groupId = 0x00; const QuicStreamGroupRetransmissionPolicy policy; auto res = transport->setStreamGroupRetransmissionPolicy(groupId, policy); - EXPECT_TRUE(res.hasValue()); + EXPECT_TRUE(res.has_value()); EXPECT_EQ(transport->getStreamGroupRetransmissionPolicies().size(), 1); // Add another one. const StreamGroupId groupId2 = 0x04; const QuicStreamGroupRetransmissionPolicy policy2; res = transport->setStreamGroupRetransmissionPolicy(groupId2, policy2); - EXPECT_TRUE(res.hasValue()); + EXPECT_TRUE(res.has_value()); EXPECT_EQ(transport->getStreamGroupRetransmissionPolicies().size(), 2); // Remove second policy. res = transport->setStreamGroupRetransmissionPolicy(groupId2, std::nullopt); - EXPECT_TRUE(res.hasValue()); + EXPECT_TRUE(res.has_value()); EXPECT_EQ(transport->getStreamGroupRetransmissionPolicies().size(), 1); // Remove first policy. res = transport->setStreamGroupRetransmissionPolicy(groupId, std::nullopt); - EXPECT_TRUE(res.hasValue()); + EXPECT_TRUE(res.has_value()); EXPECT_EQ(transport->getStreamGroupRetransmissionPolicies().size(), 0); transport.reset(); @@ -4804,7 +4943,7 @@ TEST_P( const StreamGroupId groupId = 0x00; const QuicStreamGroupRetransmissionPolicy policy; auto res = transport->setStreamGroupRetransmissionPolicy(groupId, policy); - EXPECT_TRUE(res.hasValue()); + EXPECT_TRUE(res.has_value()); EXPECT_EQ(transport->getStreamGroupRetransmissionPolicies().size(), 1); // Try adding another one; should be over the limit. @@ -4871,7 +5010,8 @@ TEST_P( // Write event is not armed. EXPECT_CALL(*socketPtr, isWritableCallbackSet()).WillOnce(Return(false)); - EXPECT_CALL(*socketPtr, resumeWrite(_)).WillOnce(Return(folly::unit)); + EXPECT_CALL(*socketPtr, resumeWrite(_)) + .WillOnce(Return(quic::Expected{})); transport->maybeStopWriteLooperAndArmSocketWritableEvent(); // Write looper is stopped. EXPECT_FALSE(transport->writeLooper()->isRunning()); @@ -5080,10 +5220,12 @@ TEST_P( return writeCallbackArmed; })); EXPECT_CALL(*socketPtr, resumeWrite(_)) - .WillOnce(Invoke([&](QuicAsyncUDPSocket::WriteCallback*) { - writeCallbackArmed = true; - return folly::unit; - })); + .WillOnce(Invoke( + [&](QuicAsyncUDPSocket::WriteCallback*) + -> quic::Expected { + writeCallbackArmed = true; + return {}; + })); // Fail the first write loop. EXPECT_CALL(*socketPtr, write(_, _, _)) diff --git a/quic/api/test/QuicTransportTest.cpp b/quic/api/test/QuicTransportTest.cpp index 70eb12ee6..d3ccdcf8c 100644 --- a/quic/api/test/QuicTransportTest.cpp +++ b/quic/api/test/QuicTransportTest.cpp @@ -76,22 +76,32 @@ class QuicTransportTest : public Test { std::make_unique>(qEvb_); socket_ = sock.get(); ON_CALL(*socket_, setAdditionalCmsgsFunc(_)) - .WillByDefault(Return(folly::unit)); + .WillByDefault(Return(quic::Expected{})); ON_CALL(*socket_, setTosOrTrafficClass(_)) - .WillByDefault(Return(folly::unit)); - ON_CALL(*socket_, close()).WillByDefault(Return(folly::unit)); + .WillByDefault(Return(quic::Expected{})); + ON_CALL(*socket_, close()) + .WillByDefault(Return(quic::Expected{})); ON_CALL(*socket_, getGSO()).WillByDefault(Return(0)); - ON_CALL(*socket_, init(_)).WillByDefault(Return(folly::unit)); - ON_CALL(*socket_, bind(_)).WillByDefault(Return(folly::unit)); - ON_CALL(*socket_, connect(_)).WillByDefault(Return(folly::unit)); - ON_CALL(*socket_, setRecvTos(_)).WillByDefault(Return(folly::unit)); - ON_CALL(*socket_, setReuseAddr(_)).WillByDefault(Return(folly::unit)); - ON_CALL(*socket_, setReusePort(_)).WillByDefault(Return(folly::unit)); - ON_CALL(*socket_, setRcvBuf(_)).WillByDefault(Return(folly::unit)); - ON_CALL(*socket_, setSndBuf(_)).WillByDefault(Return(folly::unit)); + ON_CALL(*socket_, init(_)) + .WillByDefault(Return(quic::Expected{})); + ON_CALL(*socket_, bind(_)) + .WillByDefault(Return(quic::Expected{})); + ON_CALL(*socket_, connect(_)) + .WillByDefault(Return(quic::Expected{})); + ON_CALL(*socket_, setRecvTos(_)) + .WillByDefault(Return(quic::Expected{})); + ON_CALL(*socket_, setReuseAddr(_)) + .WillByDefault(Return(quic::Expected{})); + ON_CALL(*socket_, setReusePort(_)) + .WillByDefault(Return(quic::Expected{})); + ON_CALL(*socket_, setRcvBuf(_)) + .WillByDefault(Return(quic::Expected{})); + ON_CALL(*socket_, setSndBuf(_)) + .WillByDefault(Return(quic::Expected{})); ON_CALL(*socket_, setErrMessageCallback(_)) - .WillByDefault(Return(folly::unit)); - ON_CALL(*socket_, applyOptions(_, _)).WillByDefault(Return(folly::unit)); + .WillByDefault(Return(quic::Expected{})); + ON_CALL(*socket_, applyOptions(_, _)) + .WillByDefault(Return(quic::Expected{})); transport_.reset(new TestQuicTransport( qEvb_, std::move(sock), &connSetupCallback_, &connCallback_)); // Set the write handshake state to tell the client that the handshake has @@ -296,7 +306,7 @@ TEST_F(QuicTransportTest, WriteDataWithProbing) { socketWriteCounter++; return getTotalIovecLen(vec, iovec_len); })); - transport_->writeChain(streamId, buf->clone(), true); + auto writeChain1 = transport_->writeChain(streamId, buf->clone(), true); loopForWrites(); transport_->close(std::nullopt); } @@ -323,7 +333,7 @@ TEST_F(QuicTransportTest, NotAppLimitedWithLoss) { ChainedByteRangeHead largeBufRch(largeBuf); lossStreamState->lossBuffer.emplace_back(std::move(largeBufRch), 31, false); conn.streamManager->updateWritableStreams(*lossStreamState); - transport_->writeChain( + auto writeChain2 = transport_->writeChain( stream, IOBuf::copyBuffer("An elephant sitting still"), false, nullptr); EXPECT_CALL(*rawCongestionController, setAppLimited()).Times(0); EXPECT_CALL(connCallback_, onAppRateLimited()).Times(0); @@ -346,7 +356,7 @@ TEST_F(QuicTransportTest, NotAppLimitedWithNoWritableBytes) { })); auto stream = transport_->createBidirectionalStream().value(); - transport_->writeChain( + auto writeChain3 = transport_->writeChain( stream, IOBuf::copyBuffer("An elephant sitting still"), false, nullptr); EXPECT_CALL(*rawCongestionController, setAppLimited()).Times(0); EXPECT_CALL(connCallback_, onAppRateLimited()).Times(0); @@ -365,7 +375,8 @@ TEST_F(QuicTransportTest, NotAppLimitedWithLargeBuffer) { auto stream = transport_->createBidirectionalStream().value(); auto buf = buildRandomInputData(100 * 2000); - transport_->writeChain(stream, buf->clone(), false, nullptr); + auto writeChain4 = + transport_->writeChain(stream, buf->clone(), false, nullptr); EXPECT_CALL(*rawCongestionController, setAppLimited()).Times(0); EXPECT_CALL(connCallback_, onAppRateLimited()).Times(0); loopForWrites(); @@ -383,7 +394,7 @@ TEST_F(QuicTransportTest, AppLimited) { transport_->setTransportReadyNotified(true); auto stream = transport_->createBidirectionalStream().value(); - transport_->writeChain( + auto writeChain5 = transport_->writeChain( stream, IOBuf::copyBuffer("An elephant sitting still"), false, nullptr); EXPECT_CALL(*rawCongestionController, setAppLimited()).Times(1); EXPECT_CALL(connCallback_, onAppRateLimited()).Times(1); @@ -421,7 +432,7 @@ TEST_F(QuicTransportTest, ObserverNotAppLimitedWithNoWritableBytes) { transport_->addObserver(cb3.get()); auto stream = transport_->createBidirectionalStream().value(); - transport_->writeChain( + auto writeChain6 = transport_->writeChain( stream, IOBuf::copyBuffer("An elephant sitting still"), false, nullptr); EXPECT_CALL(*cb1, startWritingFromAppLimited(transport_.get(), _)); EXPECT_CALL(*cb1, packetsWritten(transport_.get(), _)); @@ -471,7 +482,8 @@ TEST_F(QuicTransportTest, ObserverNotAppLimitedWithLargeBuffer) { auto stream = transport_->createBidirectionalStream().value(); auto buf = buildRandomInputData(100 * 2000); - transport_->writeChain(stream, buf->clone(), false, nullptr); + auto writeChain7 = + transport_->writeChain(stream, buf->clone(), false, nullptr); EXPECT_CALL(*cb1, startWritingFromAppLimited(transport_.get(), _)); EXPECT_CALL(*cb1, packetsWritten(transport_.get(), _)); EXPECT_CALL(*cb1, appRateLimited(transport_.get(), _)).Times(0); @@ -519,7 +531,7 @@ TEST_F(QuicTransportTest, ObserverAppLimited) { .WillRepeatedly(Return(5000)); auto stream = transport_->createBidirectionalStream().value(); - transport_->writeChain( + auto writeChain8 = transport_->writeChain( stream, IOBuf::copyBuffer("An elephant sitting still"), false, nullptr); EXPECT_CALL(*rawCongestionController, setAppLimited()).Times(1); EXPECT_CALL(*cb1, startWritingFromAppLimited(transport_.get(), _)); @@ -739,7 +751,8 @@ TEST_F(QuicTransportTest, ObserverPacketsWrittenCycleCheckDetails) { // write some data auto stream = transport_->createBidirectionalStream().value(); - transport_->writeChain(stream, buildRandomInputData(8000), false, nullptr); + auto writeChain9 = transport_->writeChain( + stream, buildRandomInputData(8000), false, nullptr); // loop twice to get all packets cleared out transport_->updateWriteLooper(true); @@ -848,7 +861,8 @@ TEST_F(QuicTransportTest, ObserverPacketsWrittenCycleCheckDetails) { } // write some more data - transport_->writeChain(stream, buildRandomInputData(2000), false, nullptr); + auto writeChain10 = transport_->writeChain( + stream, buildRandomInputData(2000), false, nullptr); // loop transport_->updateWriteLooper(true); @@ -998,7 +1012,8 @@ TEST_F(QuicTransportTest, ObserverPacketsWrittenCheckBytesSent) { })); auto stream = transport_->createBidirectionalStream().value(); - transport_->writeChain(stream, buildRandomInputData(4000), false, nullptr); + auto writeChain11 = transport_->writeChain( + stream, buildRandomInputData(4000), false, nullptr); transport_->updateWriteLooper(true); loopForWrites(); loopForWrites(); @@ -1039,7 +1054,8 @@ TEST_F(QuicTransportTest, ObserverPacketsWrittenCheckBytesSent) { })); auto stream = transport_->createBidirectionalStream().value(); - transport_->writeChain(stream, buildRandomInputData(1000), false, nullptr); + auto writeChain12 = transport_->writeChain( + stream, buildRandomInputData(1000), false, nullptr); transport_->updateWriteLooper(true); loopForWrites(); } @@ -1129,7 +1145,8 @@ TEST_F(QuicTransportTest, ObserverPacketsWrittenCheckBytesSent) { conn.ackStates.appDataAckState.needsToSendAckImmediately = true; conn.ackStates.appDataAckState.numNonRxPacketsRecvd = 3; auto stream = transport_->createBidirectionalStream().value(); - transport_->writeChain(stream, buildRandomInputData(1000), false, nullptr); + auto writeChain13 = transport_->writeChain( + stream, buildRandomInputData(1000), false, nullptr); transport_->updateWriteLooper(true); loopForWrites(); @@ -1295,7 +1312,7 @@ TEST_F(QuicTransportTest, ObserverWriteEventsCheckCwndPacketsWritable) { })); auto stream = transport_->createBidirectionalStream().value(); - transport_->writeChain( + auto writeChain14 = transport_->writeChain( stream, buildRandomInputData(bytesToWrite), false, nullptr); transport_->updateWriteLooper(true); loopForWrites(); @@ -1407,7 +1424,7 @@ TEST_F(QuicTransportTest, ObserverWriteEventsCheckCwndPacketsWritable) { })); auto stream = transport_->createBidirectionalStream().value(); - transport_->writeChain( + auto writeChain15 = transport_->writeChain( stream, buildRandomInputData(bytesToWrite), false, nullptr); transport_->updateWriteLooper(true); loopForWrites(); @@ -1673,8 +1690,9 @@ TEST_F(QuicTransportTest, WriteSmall) { EXPECT_CALL(*socket_, write(_, _, _)) .WillOnce(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); - transport_->writeChain(stream, buf->clone(), false); - transport_->setStreamPriority(stream, HTTPPriorityQueue::Priority(0, false)); + auto writeChain16 = transport_->writeChain(stream, buf->clone(), false); + auto setPriority1 = transport_->setStreamPriority( + stream, HTTPPriorityQueue::Priority(0, false)); loopForWrites(); auto& conn = transport_->getConnectionState(); verifyCorrectness(conn, 0, stream, *buf); @@ -1708,7 +1726,7 @@ TEST_F(QuicTransportTest, WriteLarge) { EXPECT_CALL(*socket_, write(_, _, _)) .Times(NumFullPackets + 1) .WillRepeatedly(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); - transport_->writeChain(stream, buf->clone(), false); + auto writeChain17 = transport_->writeChain(stream, buf->clone(), false); loopForWrites(); auto& conn = transport_->getConnectionState(); EXPECT_EQ(NumFullPackets + 1, conn.outstandings.packets.size()); @@ -1739,7 +1757,7 @@ TEST_F(QuicTransportTest, WriteMultipleTimes) { auto buf = buildRandomInputData(20); EXPECT_CALL(*socket_, write(_, _, _)) .WillOnce(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); - transport_->writeChain(stream, buf->clone(), false); + auto writeChain18 = transport_->writeChain(stream, buf->clone(), false); loopForWrites(); auto& conn = transport_->getConnectionState(); size_t originalWriteOffset = @@ -1751,7 +1769,7 @@ TEST_F(QuicTransportTest, WriteMultipleTimes) { buf = buildRandomInputData(50); EXPECT_CALL(*socket_, write(_, _, _)) .WillOnce(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); - transport_->writeChain(stream, buf->clone(), false); + auto writeChain19 = transport_->writeChain(stream, buf->clone(), false); loopForWrites(); verifyCorrectness(conn, originalWriteOffset, stream, *buf); EXPECT_EQ(WriteDataReason::NO_WRITE, shouldWriteData(conn)); @@ -1764,7 +1782,7 @@ TEST_F(QuicTransportTest, WriteMultipleStreams) { auto buf = buildRandomInputData(20); EXPECT_CALL(*socket_, write(_, _, _)) .WillOnce(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); - transport_->writeChain(s1, buf->clone(), false); + auto writeChain20 = transport_->writeChain(s1, buf->clone(), false); loopForWrites(); auto& conn = transport_->getConnectionState(); verifyCorrectness(conn, 0, s1, *buf); @@ -1772,7 +1790,7 @@ TEST_F(QuicTransportTest, WriteMultipleStreams) { auto buf2 = buildRandomInputData(20); EXPECT_CALL(*socket_, write(_, _, _)) .WillOnce(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); - transport_->writeChain(s2, buf2->clone(), false); + auto writeChain21 = transport_->writeChain(s2, buf2->clone(), false); loopForWrites(); verifyCorrectness(conn, 0, s2, *buf2); @@ -1816,7 +1834,7 @@ TEST_F(QuicTransportTest, WriteFlowControl) { // Write stream blocked frame EXPECT_CALL(*socket_, write(_, _, _)) .WillOnce(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); - transport_->writeChain(streamId, buf->clone(), false); + auto writeChain22 = transport_->writeChain(streamId, buf->clone(), false); loopForWrites(); EXPECT_EQ(conn.outstandings.packets.size(), 1); @@ -1934,7 +1952,7 @@ TEST_F(QuicTransportTest, WriteErrorEagain) { auto stream = transport_->createBidirectionalStream().value(); auto buf = buildRandomInputData(20); EXPECT_CALL(*socket_, write(_, _, _)).WillOnce(SetErrnoAndReturn(EAGAIN, -1)); - transport_->writeChain(stream, buf->clone(), false); + auto writeChain23 = transport_->writeChain(stream, buf->clone(), false); loopForWrites(); } @@ -1943,7 +1961,7 @@ TEST_F(QuicTransportTest, WriteErrorBad) { auto stream = transport_->createBidirectionalStream().value(); auto buf = buildRandomInputData(20); EXPECT_CALL(*socket_, write(_, _, _)).WillOnce(SetErrnoAndReturn(EBADF, -1)); - transport_->writeChain(stream, buf->clone(), false); + auto writeChain24 = transport_->writeChain(stream, buf->clone(), false); loopForWrites(); EXPECT_TRUE(transport_->closed); } @@ -1962,7 +1980,7 @@ TEST_F(QuicTransportTest, WriteFin) { auto buf = buildRandomInputData(20); EXPECT_CALL(*socket_, write(_, _, _)) .WillOnce(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); - transport_->writeChain(stream, buf->clone(), true); + auto writeChain25 = transport_->writeChain(stream, buf->clone(), true); loopForWrites(); auto& conn = transport_->getConnectionState(); verifyCorrectness(conn, 0, stream, *buf, true); @@ -1990,11 +2008,11 @@ TEST_F(QuicTransportTest, WriteOnlyFin) { auto buf = buildRandomInputData(20); EXPECT_CALL(*socket_, write(_, _, _)) .WillOnce(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); - transport_->writeChain(stream, buf->clone(), false); + auto writeChain26 = transport_->writeChain(stream, buf->clone(), false); loopForWrites(); EXPECT_CALL(*socket_, write(_, _, _)) .WillOnce(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); - transport_->writeChain(stream, nullptr, true); + auto writeChain27 = transport_->writeChain(stream, nullptr, true); loopForWrites(); auto& conn = transport_->getConnectionState(); verifyCorrectness(conn, 0, stream, *buf, true); @@ -2022,7 +2040,7 @@ TEST_F(QuicTransportTest, WriteDataWithRetransmission) { auto buf = buildRandomInputData(20); EXPECT_CALL(*socket_, write(_, _, _)) .WillOnce(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); - transport_->writeChain(stream, buf->clone(), false); + auto writeChain28 = transport_->writeChain(stream, buf->clone(), false); loopForWrites(); auto& conn = transport_->getConnectionState(); verifyCorrectness(conn, 0, stream, *buf); @@ -2031,7 +2049,7 @@ TEST_F(QuicTransportTest, WriteDataWithRetransmission) { auto buf2 = buildRandomInputData(50); EXPECT_CALL(*socket_, write(_, _, _)) .WillOnce(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); - transport_->writeChain(stream, buf2->clone(), false); + auto writeChain29 = transport_->writeChain(stream, buf2->clone(), false); loopForWrites(); // The first packet was lost. We should expect this packet contains both // lost data and new data @@ -2077,7 +2095,7 @@ TEST_F(QuicTransportTest, WritePendingAckIfHavingData) { EXPECT_CALL(*socket_, write(_, _, _)) .WillOnce(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); // We should write acks if there is data pending - transport_->writeChain(streamId, buf->clone(), true); + auto writeChain30 = transport_->writeChain(streamId, buf->clone(), true); loopForWrites(); EXPECT_EQ(conn.outstandings.packets.size(), 1); auto& packet = @@ -2119,7 +2137,7 @@ TEST_F(QuicTransportTest, NoWritePendingAckIfHavingData) { EXPECT_CALL(*socket_, write(_, _, _)) .WillOnce(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); // We should write acks if there is data pending - transport_->writeChain(streamId, buf->clone(), true); + auto writeChain31 = transport_->writeChain(streamId, buf->clone(), true); loopForWrites(); EXPECT_EQ(conn.outstandings.packets.size(), 1); auto& packet = @@ -2157,7 +2175,7 @@ TEST_F(QuicTransportTest, NoWritePendingAckIfHavingDataNonStream) { .WillOnce(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); // We should write acks if there is data pending conn.streamManager->queueWindowUpdate(streamId); - transport_->read(streamId, 0); + auto read_tmp = transport_->read(streamId, 0); loopForWrites(); EXPECT_EQ(conn.outstandings.packets.size(), 1); auto& packet = @@ -2186,7 +2204,8 @@ TEST_F(QuicTransportTest, RstStream) { auto streamId = transport_->createBidirectionalStream().value(); EXPECT_CALL(*socket_, write(_, _, _)) .WillOnce(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); - transport_->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN); + auto resetStream1 = + transport_->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN); loopForWrites(); EXPECT_EQ(1, transport_->getConnectionState().outstandings.packets.size()); auto packet = @@ -2224,9 +2243,9 @@ TEST_F(QuicTransportTest, CheckpointBeforeAnyWrites) { auto streamState = transport_->getConnectionState().streamManager->findStream(streamId); - auto checkpointResult = + auto updateCheckpoint1 = transport_->updateReliableDeliveryCheckpoint(streamId); - EXPECT_FALSE(checkpointResult.hasError()); + EXPECT_FALSE(updateCheckpoint1.hasError()); EXPECT_EQ(streamState->reliableResetCheckpoint, 0); } @@ -2238,12 +2257,12 @@ TEST_F(QuicTransportTest, CheckpointAfterWriteBuffered) { auto buf1 = IOBuf::create(10); buf1->append(10); - transport_->writeChain(streamId, std::move(buf1), false); + auto writeChain32 = transport_->writeChain(streamId, std::move(buf1), false); EXPECT_EQ(streamState->pendingWrites.chainLength(), 10); - auto checkpointResult = + auto updateCheckpoint2 = transport_->updateReliableDeliveryCheckpoint(streamId); - EXPECT_FALSE(checkpointResult.hasError()); + EXPECT_FALSE(updateCheckpoint2.hasError()); EXPECT_EQ(streamState->reliableResetCheckpoint, 10); } @@ -2255,7 +2274,7 @@ TEST_F(QuicTransportTest, CheckpointAfterWriteWrittenToWire) { auto buf1 = IOBuf::create(10); buf1->append(10); - transport_->writeChain(streamId, std::move(buf1), false); + auto writeChain33 = transport_->writeChain(streamId, std::move(buf1), false); EXPECT_EQ(streamState->pendingWrites.chainLength(), 10); EXPECT_CALL(*socket_, write(_, _, _)) @@ -2264,9 +2283,9 @@ TEST_F(QuicTransportTest, CheckpointAfterWriteWrittenToWire) { EXPECT_TRUE(streamState->pendingWrites.empty()); - auto checkpointResult = + auto updateCheckpoint3 = transport_->updateReliableDeliveryCheckpoint(streamId); - EXPECT_FALSE(checkpointResult.hasError()); + EXPECT_FALSE(updateCheckpoint3.hasError()); EXPECT_EQ(streamState->reliableResetCheckpoint, 10); } @@ -2278,7 +2297,7 @@ TEST_F(QuicTransportTest, CheckpointAfterWritePartiallyWrittenToWire) { auto buf1 = IOBuf::create(10); buf1->append(10); - transport_->writeChain(streamId, std::move(buf1), false); + auto writeChain34 = transport_->writeChain(streamId, std::move(buf1), false); EXPECT_EQ(streamState->pendingWrites.chainLength(), 10); EXPECT_CALL(*socket_, write(_, _, _)) @@ -2288,12 +2307,12 @@ TEST_F(QuicTransportTest, CheckpointAfterWritePartiallyWrittenToWire) { auto buf2 = IOBuf::create(5); buf2->append(5); - transport_->writeChain(streamId, std::move(buf2), false); + auto writeChain35 = transport_->writeChain(streamId, std::move(buf2), false); EXPECT_EQ(streamState->pendingWrites.chainLength(), 5); - auto checkpointResult = + auto updateCheckpoint4 = transport_->updateReliableDeliveryCheckpoint(streamId); - EXPECT_FALSE(checkpointResult.hasError()); + EXPECT_FALSE(updateCheckpoint4.hasError()); EXPECT_EQ(streamState->reliableResetCheckpoint, 15); } @@ -2305,35 +2324,36 @@ TEST_F(QuicTransportTest, CheckpointMultipleTimes) { auto buf1 = IOBuf::create(10); buf1->append(10); - transport_->writeChain(streamId, std::move(buf1), false); - auto checkpointResult1 = + auto writeChain36 = transport_->writeChain(streamId, std::move(buf1), false); + auto updateCheckpoint5 = transport_->updateReliableDeliveryCheckpoint(streamId); - EXPECT_FALSE(checkpointResult1.hasError()); + EXPECT_FALSE(updateCheckpoint5.hasError()); EXPECT_EQ(streamState->reliableResetCheckpoint, 10); auto buf2 = IOBuf::create(7); buf2->append(7); - transport_->writeChain(streamId, std::move(buf2), false); - auto checkpointResult2 = + auto writeChain37 = transport_->writeChain(streamId, std::move(buf2), false); + auto updateCheckpoint6 = transport_->updateReliableDeliveryCheckpoint(streamId); - EXPECT_FALSE(checkpointResult2.hasError()); + EXPECT_FALSE(updateCheckpoint6.hasError()); EXPECT_EQ(streamState->reliableResetCheckpoint, 17); auto buf3 = IOBuf::create(2); buf3->append(2); - transport_->writeChain(streamId, std::move(buf3), false); - auto checkpointResult3 = + auto writeChain38 = transport_->writeChain(streamId, std::move(buf3), false); + auto updateCheckpoint7 = transport_->updateReliableDeliveryCheckpoint(streamId); - EXPECT_FALSE(checkpointResult3.hasError()); + EXPECT_FALSE(updateCheckpoint7.hasError()); EXPECT_EQ(streamState->reliableResetCheckpoint, 19); } TEST_F(QuicTransportTest, CheckpointAfterSendingReset) { auto streamId = transport_->createBidirectionalStream().value(); - transport_->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN); - auto checkpointResult = + auto resetStream2 = + transport_->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN); + auto updateCheckpoint8 = transport_->updateReliableDeliveryCheckpoint(streamId); - EXPECT_TRUE(checkpointResult.hasError()); + EXPECT_TRUE(updateCheckpoint8.hasError()); } TEST_F(QuicTransportTest, RstStreamReliably) { @@ -2350,19 +2370,20 @@ TEST_F(QuicTransportTest, RstStreamReliably) { // Write 10 bytes to the transport auto buf1 = IOBuf::create(10); buf1->append(10); - transport_->writeChain(streamId, std::move(buf1), false); + auto writeChain39 = transport_->writeChain(streamId, std::move(buf1), false); // Egress the 10 bytes loopForWrites(); // Write 2 bytes to the transport auto buf2 = IOBuf::create(2); buf2->append(2); - transport_->writeChain(streamId, std::move(buf2), false); + auto writeChain40 = transport_->writeChain(streamId, std::move(buf2), false); // Make a checkpoint, so that we set the reliable size to 12 bytes - transport_->updateReliableDeliveryCheckpoint(streamId); + auto updateCheckpoint_tmp = + transport_->updateReliableDeliveryCheckpoint(streamId); // Write 3 bytes to the transport auto buf3 = IOBuf::create(3); buf3->append(3); - transport_->writeChain(streamId, std::move(buf3), false); + auto writeChain41 = transport_->writeChain(streamId, std::move(buf3), false); EXPECT_EQ(stream->pendingWrites.chainLength(), 5); auto resetResult = transport_->resetStreamReliably( @@ -2405,7 +2426,8 @@ TEST_F(QuicTransportTest, StopSending) { auto streamId = transport_->createBidirectionalStream().value(); EXPECT_CALL(*socket_, write(_, _, _)) .WillOnce(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); - transport_->stopSending(streamId, GenericApplicationErrorCode::UNKNOWN); + auto stopSending_tmp = + transport_->stopSending(streamId, GenericApplicationErrorCode::UNKNOWN); loopForWrites(); EXPECT_EQ(1, transport_->getConnectionState().outstandings.packets.size()); auto packet = @@ -2435,8 +2457,8 @@ TEST_F(QuicTransportTest, StopSendingReadCallbackDefault) { NiceMock readCb; EXPECT_CALL(*socket_, write(_, _, _)) .WillOnce(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); - transport_->setReadCallback(streamId, &readCb); - transport_->setReadCallback(streamId, nullptr); + auto setReadCallback1 = transport_->setReadCallback(streamId, &readCb); + auto setReadCallback2 = transport_->setReadCallback(streamId, nullptr); loopForWrites(); EXPECT_EQ(1, transport_->getConnectionState().outstandings.packets.size()); auto packet = @@ -2466,8 +2488,8 @@ TEST_F(QuicTransportTest, StopSendingReadCallback) { NiceMock readCb; EXPECT_CALL(*socket_, write(_, _, _)) .WillOnce(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); - transport_->setReadCallback(streamId, &readCb); - transport_->setReadCallback( + auto setReadCallback3 = transport_->setReadCallback(streamId, &readCb); + auto setReadCallback4 = transport_->setReadCallback( streamId, nullptr, GenericApplicationErrorCode::UNKNOWN); loopForWrites(); EXPECT_EQ(1, transport_->getConnectionState().outstandings.packets.size()); @@ -2496,8 +2518,9 @@ TEST_F(QuicTransportTest, StopSendingReadCallback) { TEST_F(QuicTransportTest, StopSendingReadCallbackNone) { auto streamId = transport_->createBidirectionalStream().value(); NiceMock readCb; - transport_->setReadCallback(streamId, &readCb); - transport_->setReadCallback(streamId, nullptr, std::nullopt); + auto setReadCallback5 = transport_->setReadCallback(streamId, &readCb); + auto setReadCallback6 = + transport_->setReadCallback(streamId, nullptr, std::nullopt); loopForWrites(); EXPECT_EQ(0, transport_->getConnectionState().outstandings.packets.size()); } @@ -2505,10 +2528,11 @@ TEST_F(QuicTransportTest, StopSendingReadCallbackNone) { TEST_F(QuicTransportTest, NoStopSendingReadCallback) { auto streamId = transport_->createBidirectionalStream().value(); NiceMock readCb; - transport_->setReadCallback(streamId, &readCb); + auto setReadCallback7 = transport_->setReadCallback(streamId, &readCb); loopForWrites(); EXPECT_EQ(0, transport_->getConnectionState().outstandings.packets.size()); - transport_->setReadCallback(streamId, nullptr, std::nullopt); + auto setReadCallback8 = + transport_->setReadCallback(streamId, nullptr, std::nullopt); } TEST_F(QuicTransportTest, SendPathChallenge) { @@ -2778,7 +2802,7 @@ TEST_F(QuicTransportTest, SendPathResponse) { TEST_F(QuicTransportTest, CloneAfterRecvReset) { auto& conn = transport_->getConnectionState(); auto streamId = transport_->createBidirectionalStream().value(); - transport_->writeChain(streamId, IOBuf::create(0), true); + auto writeChain42 = transport_->writeChain(streamId, IOBuf::create(0), true); loopForWrites(); EXPECT_EQ(1, conn.outstandings.packets.size()); auto streamResult = conn.streamManager->getStream(streamId); @@ -2966,7 +2990,7 @@ TEST_F(QuicTransportTest, BusyWriteLoopDetection) { auto stream = transport_->createBidirectionalStream().value(); auto buf = buildRandomInputData(100); - transport_->writeChain(stream, buf->clone(), true); + auto writeChain43 = transport_->writeChain(stream, buf->clone(), true); transport_->updateWriteLooper(true); EXPECT_TRUE(conn.writeDebugState.needsWriteLoopDetect); EXPECT_EQ(0, conn.writeDebugState.currentEmptyLoopCount); @@ -3119,7 +3143,7 @@ TEST_F(QuicTransportTest, NonWritableStreamAPI) { auto& streamState = streamResult.value(); // write EOF - transport_->writeChain(streamId, buf->clone(), true); + auto writeChain44 = transport_->writeChain(streamId, buf->clone(), true); loopForWrites(); EXPECT_FALSE(streamState->writable()); @@ -3144,7 +3168,7 @@ TEST_F(QuicTransportTest, NonWritableStreamAPI) { TEST_F(QuicTransportTest, RstWrittenStream) { auto streamId = transport_->createBidirectionalStream().value(); auto buf = buildRandomInputData(20); - transport_->writeChain(streamId, buf->clone(), false); + auto writeChain45 = transport_->writeChain(streamId, buf->clone(), false); loopForWrites(); auto& conn = transport_->getConnectionState(); auto stream = conn.streamManager->findStream(streamId); @@ -3153,7 +3177,8 @@ TEST_F(QuicTransportTest, RstWrittenStream) { EXPECT_CALL(*socket_, write(_, _, _)) .WillOnce(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); - transport_->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN); + auto resetStream3 = + transport_->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN); loopForWrites(); // 2 packets are outstanding: one for Stream frame one for RstStream frame: EXPECT_EQ(2, transport_->getConnectionState().outstandings.packets.size()); @@ -3187,7 +3212,8 @@ TEST_F(QuicTransportTest, RstWrittenStream) { TEST_F(QuicTransportTest, RstStreamUDPWriteFailNonFatal) { auto streamId = transport_->createBidirectionalStream().value(); EXPECT_CALL(*socket_, write(_, _, _)).WillOnce(SetErrnoAndReturn(EAGAIN, -1)); - transport_->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN); + auto resetStream4 = + transport_->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN); loopForWrites(); EXPECT_EQ(1, transport_->getConnectionState().outstandings.packets.size()); @@ -3225,7 +3251,8 @@ TEST_F(QuicTransportTest, RstStreamUDPWriteFailFatal) { auto streamId = transport_->createBidirectionalStream().value(); EXPECT_CALL(*socket_, write(_, _, _)) .WillRepeatedly(SetErrnoAndReturn(EBADF, -1)); - transport_->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN); + auto resetStream5 = + transport_->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN); loopForWrites(); EXPECT_TRUE(transport_->getConnectionState().outstandings.packets.empty()); @@ -3236,7 +3263,7 @@ TEST_F(QuicTransportTest, RstStreamUDPWriteFailFatal) { TEST_F(QuicTransportTest, WriteAfterSendRst) { auto streamId = transport_->createBidirectionalStream().value(); auto buf = buildRandomInputData(20); - transport_->writeChain(streamId, buf->clone(), false); + auto writeChain46 = transport_->writeChain(streamId, buf->clone(), false); loopForWrites(); auto& conn = transport_->getConnectionState(); auto stream = conn.streamManager->findStream(streamId); @@ -3244,7 +3271,8 @@ TEST_F(QuicTransportTest, WriteAfterSendRst) { auto currentWriteOffset = stream->currentWriteOffset; EXPECT_CALL(*socket_, write(_, _, _)) .WillOnce(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); - transport_->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN); + auto resetStream6 = + transport_->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN); loopForWrites(); EXPECT_EQ(stream->sendState, StreamSendState::ResetSent); @@ -3289,15 +3317,15 @@ TEST_F(QuicTransportTest, DoubleReset) { auto streamId = transport_->createBidirectionalStream().value(); EXPECT_CALL(*socket_, write(_, _, _)) .WillOnce(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); - EXPECT_FALSE( - transport_->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN) - .hasError()); + auto resetStream7 = + transport_->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN); + EXPECT_FALSE(resetStream7.hasError()); loopForWrites(); // Then reset again, which is a no-op: - EXPECT_FALSE( - transport_->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN) - .hasError()); + auto resetStream8 = + transport_->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN); + EXPECT_FALSE(resetStream8.hasError()); } TEST_F(QuicTransportTest, WriteStreamDataSetLossAlarm) { @@ -3305,7 +3333,7 @@ TEST_F(QuicTransportTest, WriteStreamDataSetLossAlarm) { auto buf = buildRandomInputData(1); EXPECT_CALL(*socket_, write(_, _, _)) .WillOnce(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); - transport_->writeChain(stream, buf->clone(), false); + auto writeChain47 = transport_->writeChain(stream, buf->clone(), false); loopForWrites(); EXPECT_TRUE(transport_->isLossTimeoutScheduled()); } @@ -3409,7 +3437,10 @@ TEST_F(QuicTransportTest, FlowControlCallbacks) { EXPECT_CALL(connCallback_, onFlowControlUpdate(streamState1.value()->id)); // We should be able to create streams from this callback. EXPECT_CALL(connCallback_, onFlowControlUpdate(streamState2.value()->id)) - .WillOnce(Invoke([&](auto) { transport_->createBidirectionalStream(); })); + .WillOnce(Invoke([&](auto) { + [[maybe_unused]] auto newStream = + transport_->createBidirectionalStream(); + })); transport_->onNetworkData( SocketAddress("::1", 10000), NetworkData(ReceivedUdpPacket(IOBuf::copyBuffer("fake data")))); @@ -3423,7 +3454,7 @@ TEST_F(QuicTransportTest, DeliveryCallbackClosesClosedTransport) { TransportClosingDeliveryCallback dc(transport_.get(), 20); EXPECT_CALL(*socket_, write(_, _, _)) .WillRepeatedly(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); - transport_->writeChain(stream1, buf1->clone(), true, &dc); + auto writeChain48 = transport_->writeChain(stream1, buf1->clone(), true, &dc); loopForWrites(); transport_->close(std::nullopt); } @@ -3434,8 +3465,9 @@ TEST_F(QuicTransportTest, DeliveryCallbackClosesTransportOnDelivered) { TransportClosingDeliveryCallback dc(transport_.get(), 0); EXPECT_CALL(*socket_, write(_, _, _)) .WillRepeatedly(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); - transport_->registerDeliveryCallback(stream1, 0, &dc); - transport_->writeChain(stream1, buf1->clone(), true); + auto registerDelivery_tmp = + transport_->registerDeliveryCallback(stream1, 0, &dc); + auto writeChain49 = transport_->writeChain(stream1, buf1->clone(), true); loopForWrites(); auto& conn = transport_->getConnectionState(); @@ -3456,8 +3488,9 @@ TEST_F(QuicTransportTest, InvokeDeliveryCallbacksNothingDelivered) { auto buf = buildRandomInputData(20); EXPECT_CALL(*socket_, write(_, _, _)) .WillRepeatedly(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); - transport_->registerDeliveryCallback(stream, 1, &mockedDeliveryCallback); - transport_->writeChain(stream, buf->clone(), false); + auto registerDelivery_tmp = + transport_->registerDeliveryCallback(stream, 1, &mockedDeliveryCallback); + auto writeChain50 = transport_->writeChain(stream, buf->clone(), false); loopForWrites(); auto& conn = transport_->getConnectionState(); @@ -3474,7 +3507,7 @@ TEST_F(QuicTransportTest, InvokeDeliveryCallbacksNothingDelivered) { // Otherwise, transport will be holding on to delivery callback pointers // that are already dead: auto buf2 = buildRandomInputData(100); - transport_->writeChain(stream, buf2->clone(), true); + auto writeChain51 = transport_->writeChain(stream, buf2->clone(), true); streamState->ackedIntervals.insert(20, 99); loopForWrites(); @@ -3493,8 +3526,9 @@ TEST_F(QuicTransportTest, InvokeDeliveryCallbacksAllDelivered) { auto buf = buildRandomInputData(20); EXPECT_CALL(*socket_, write(_, _, _)) .WillRepeatedly(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); - transport_->registerDeliveryCallback(stream, 1, &mockedDeliveryCallback); - transport_->writeChain(stream, buf->clone(), true); + auto registerDelivery_tmp = + transport_->registerDeliveryCallback(stream, 1, &mockedDeliveryCallback); + auto writeChain52 = transport_->writeChain(stream, buf->clone(), true); loopForWrites(); auto& conn = transport_->getConnectionState(); @@ -3520,9 +3554,11 @@ TEST_F(QuicTransportTest, InvokeDeliveryCallbacksPartialDelivered) { auto buf = buildRandomInputData(100); EXPECT_CALL(*socket_, write(_, _, _)) .WillRepeatedly(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); - transport_->registerDeliveryCallback(stream, 50, &mockedDeliveryCallback1); - transport_->registerDeliveryCallback(stream, 150, &mockedDeliveryCallback2); - transport_->writeChain(stream, buf->clone(), false); + auto registerDelivery1 = transport_->registerDeliveryCallback( + stream, 50, &mockedDeliveryCallback1); + auto registerDelivery2 = transport_->registerDeliveryCallback( + stream, 150, &mockedDeliveryCallback2); + auto writeChain53 = transport_->writeChain(stream, buf->clone(), false); loopForWrites(); auto& conn = transport_->getConnectionState(); @@ -3545,7 +3581,7 @@ TEST_F(QuicTransportTest, InvokeDeliveryCallbacksPartialDelivered) { // Otherwise, transport will be holding on to delivery callback pointers // that are already dead: auto buf2 = buildRandomInputData(100); - transport_->writeChain(stream, buf2->clone(), true); + auto writeChain54 = transport_->writeChain(stream, buf2->clone(), true); loopForWrites(); streamState->retransmissionBuffer.clear(); streamState->lossBuffer.clear(); @@ -3564,9 +3600,11 @@ TEST_F(QuicTransportTest, InvokeDeliveryCallbacksRetxBuffer) { auto buf = buildRandomInputData(100); EXPECT_CALL(*socket_, write(_, _, _)) .WillRepeatedly(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); - transport_->registerDeliveryCallback(stream, 50, &mockedDeliveryCallback1); - transport_->registerDeliveryCallback(stream, 150, &mockedDeliveryCallback2); - transport_->writeChain(stream, buf->clone(), false); + auto registerDelivery3 = transport_->registerDeliveryCallback( + stream, 50, &mockedDeliveryCallback1); + auto registerDelivery4 = transport_->registerDeliveryCallback( + stream, 150, &mockedDeliveryCallback2); + auto writeChain55 = transport_->writeChain(stream, buf->clone(), false); loopForWrites(); auto& conn = transport_->getConnectionState(); @@ -3595,7 +3633,7 @@ TEST_F(QuicTransportTest, InvokeDeliveryCallbacksRetxBuffer) { // Otherwise, transport will be holding on to delivery callback pointers // that are already dead: auto buf2 = buildRandomInputData(100); - transport_->writeChain(stream, buf2->clone(), true); + auto writeChain56 = transport_->writeChain(stream, buf2->clone(), true); loopForWrites(); streamState->retransmissionBuffer.clear(); streamState->lossBuffer.clear(); @@ -3614,10 +3652,13 @@ TEST_F(QuicTransportTest, InvokeDeliveryCallbacksLossAndRetxBuffer) { auto buf = buildRandomInputData(100); EXPECT_CALL(*socket_, write(_, _, _)) .WillRepeatedly(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); - transport_->registerDeliveryCallback(stream, 30, &mockedDeliveryCallback1); - transport_->registerDeliveryCallback(stream, 50, &mockedDeliveryCallback2); - transport_->registerDeliveryCallback(stream, 150, &mockedDeliveryCallback3); - transport_->writeChain(stream, buf->clone(), false); + auto registerDelivery5 = transport_->registerDeliveryCallback( + stream, 30, &mockedDeliveryCallback1); + auto registerDelivery6 = transport_->registerDeliveryCallback( + stream, 50, &mockedDeliveryCallback2); + auto registerDelivery7 = transport_->registerDeliveryCallback( + stream, 150, &mockedDeliveryCallback3); + auto writeChain57 = transport_->writeChain(stream, buf->clone(), false); loopForWrites(); auto& conn = transport_->getConnectionState(); @@ -3650,7 +3691,7 @@ TEST_F(QuicTransportTest, InvokeDeliveryCallbacksLossAndRetxBuffer) { // Otherwise, transport will be holding on to delivery callback pointers // that are already dead: auto buf2 = buildRandomInputData(100); - transport_->writeChain(stream, buf2->clone(), true); + auto writeChain58 = transport_->writeChain(stream, buf2->clone(), true); loopForWrites(); streamState->retransmissionBuffer.clear(); streamState->lossBuffer.clear(); @@ -3676,11 +3717,14 @@ TEST_F(QuicTransportTest, InvokeDeliveryCallbacksSingleByte) { auto stream = transport_->createBidirectionalStream().value(); auto buf = buildRandomInputData(1); - transport_->writeChain( + auto writeChain59 = transport_->writeChain( stream, buf->clone(), false /* eof */, &writeChainDeliveryCb); - transport_->registerDeliveryCallback(stream, 0, &firstByteDeliveryCb); - transport_->registerDeliveryCallback(stream, 0, &lastByteDeliveryCb); - transport_->registerDeliveryCallback(stream, 1, &unsentByteDeliveryCb); + auto registerDelivery1 = + transport_->registerDeliveryCallback(stream, 0, &firstByteDeliveryCb); + auto registerDelivery2 = + transport_->registerDeliveryCallback(stream, 0, &lastByteDeliveryCb); + auto registerDelivery3 = + transport_->registerDeliveryCallback(stream, 1, &unsentByteDeliveryCb); // writeChain, first, last byte callbacks triggered after delivery auto& conn = transport_->getConnectionState(); @@ -3704,8 +3748,10 @@ TEST_F(QuicTransportTest, InvokeDeliveryCallbacksSingleByte) { // callbacks should be triggered immediately EXPECT_CALL(firstByteDeliveryCb, onDeliveryAck(stream, 0, _)).Times(1); EXPECT_CALL(lastByteDeliveryCb, onDeliveryAck(stream, 0, _)).Times(1); - transport_->registerDeliveryCallback(stream, 0, &firstByteDeliveryCb); - transport_->registerDeliveryCallback(stream, 0, &lastByteDeliveryCb); + auto registerDelivery4 = + transport_->registerDeliveryCallback(stream, 0, &firstByteDeliveryCb); + auto registerDelivery5 = + transport_->registerDeliveryCallback(stream, 0, &lastByteDeliveryCb); loopForWrites(); Mock::VerifyAndClearExpectations(&firstByteDeliveryCb); Mock::VerifyAndClearExpectations(&lastByteDeliveryCb); @@ -3730,12 +3776,16 @@ TEST_F(QuicTransportTest, InvokeDeliveryCallbacksSingleByteWithFin) { auto stream = transport_->createBidirectionalStream().value(); auto buf = buildRandomInputData(1); - transport_->writeChain( + auto writeChain60 = transport_->writeChain( stream, buf->clone(), true /* eof */, &writeChainDeliveryCb); - transport_->registerDeliveryCallback(stream, 0, &firstByteDeliveryCb); - transport_->registerDeliveryCallback(stream, 0, &lastByteDeliveryCb); - transport_->registerDeliveryCallback(stream, 1, &finDeliveryCb); - transport_->registerDeliveryCallback(stream, 2, &unsentByteDeliveryCb); + auto registerDelivery6 = + transport_->registerDeliveryCallback(stream, 0, &firstByteDeliveryCb); + auto registerDelivery7 = + transport_->registerDeliveryCallback(stream, 0, &lastByteDeliveryCb); + auto registerDelivery8 = + transport_->registerDeliveryCallback(stream, 1, &finDeliveryCb); + auto registerDelivery9 = + transport_->registerDeliveryCallback(stream, 2, &unsentByteDeliveryCb); // writeChain, first, last byte, fin callbacks triggered after delivery auto& conn = transport_->getConnectionState(); @@ -3761,9 +3811,12 @@ TEST_F(QuicTransportTest, InvokeDeliveryCallbacksSingleByteWithFin) { EXPECT_CALL(firstByteDeliveryCb, onDeliveryAck(stream, 0, _)).Times(1); EXPECT_CALL(lastByteDeliveryCb, onDeliveryAck(stream, 0, _)).Times(1); EXPECT_CALL(finDeliveryCb, onDeliveryAck(stream, 1, _)).Times(1); - transport_->registerDeliveryCallback(stream, 0, &firstByteDeliveryCb); - transport_->registerDeliveryCallback(stream, 0, &lastByteDeliveryCb); - transport_->registerDeliveryCallback(stream, 1, &finDeliveryCb); + auto registerDelivery10 = + transport_->registerDeliveryCallback(stream, 0, &firstByteDeliveryCb); + auto registerDelivery11 = + transport_->registerDeliveryCallback(stream, 0, &lastByteDeliveryCb); + auto registerDelivery12 = + transport_->registerDeliveryCallback(stream, 1, &finDeliveryCb); loopForWrites(); Mock::VerifyAndClearExpectations(&firstByteDeliveryCb); Mock::VerifyAndClearExpectations(&lastByteDeliveryCb); @@ -3783,16 +3836,20 @@ TEST_F(QuicTransportTest, InvokeTxCallbacksSingleByte) { auto stream = transport_->createBidirectionalStream().value(); auto buf = buildRandomInputData(1); - transport_->writeChain(stream, buf->clone(), false /* eof */); + auto writeChain61 = + transport_->writeChain(stream, buf->clone(), false /* eof */); EXPECT_CALL(firstByteTxCb, onByteEventRegistered(getTxMatcher(stream, 0))) .Times(1); EXPECT_CALL(lastByteTxCb, onByteEventRegistered(getTxMatcher(stream, 0))) .Times(1); EXPECT_CALL(pastlastByteTxCb, onByteEventRegistered(getTxMatcher(stream, 1))) .Times(1); - transport_->registerTxCallback(stream, 0, &firstByteTxCb); - transport_->registerTxCallback(stream, 0, &lastByteTxCb); - transport_->registerTxCallback(stream, 1, &pastlastByteTxCb); + auto transportRegisterTxCallback1 = + transport_->registerTxCallback(stream, 0, &firstByteTxCb); + auto transportRegisterTxCallback2 = + transport_->registerTxCallback(stream, 0, &lastByteTxCb); + auto transportRegisterTxCallback3 = + transport_->registerTxCallback(stream, 1, &pastlastByteTxCb); Mock::VerifyAndClearExpectations(&firstByteTxCb); Mock::VerifyAndClearExpectations(&lastByteTxCb); Mock::VerifyAndClearExpectations(&pastlastByteTxCb); @@ -3811,8 +3868,10 @@ TEST_F(QuicTransportTest, InvokeTxCallbacksSingleByte) { .Times(1); EXPECT_CALL(lastByteTxCb, onByteEventRegistered(getTxMatcher(stream, 0))) .Times(1); - transport_->registerTxCallback(stream, 0, &firstByteTxCb); - transport_->registerTxCallback(stream, 0, &lastByteTxCb); + auto transportRegisterTxCallback4 = + transport_->registerTxCallback(stream, 0, &firstByteTxCb); + auto transportRegisterTxCallback5 = + transport_->registerTxCallback(stream, 0, &lastByteTxCb); Mock::VerifyAndClearExpectations(&firstByteTxCb); Mock::VerifyAndClearExpectations(&lastByteTxCb); EXPECT_CALL(firstByteTxCb, onByteEvent(getTxMatcher(stream, 0))).Times(1); @@ -3847,7 +3906,8 @@ TEST_F(QuicTransportTest, InvokeTxCallbacksSingleByteWithFin) { auto stream = transport_->createBidirectionalStream().value(); auto buf = buildRandomInputData(1); - transport_->writeChain(stream, buf->clone(), true /* eof */); + auto writeChain62 = + transport_->writeChain(stream, buf->clone(), true /* eof */); EXPECT_CALL(firstByteTxCb, onByteEventRegistered(getTxMatcher(stream, 0))) .Times(1); EXPECT_CALL(lastByteTxCb, onByteEventRegistered(getTxMatcher(stream, 0))) @@ -3855,10 +3915,14 @@ TEST_F(QuicTransportTest, InvokeTxCallbacksSingleByteWithFin) { EXPECT_CALL(finTxCb, onByteEventRegistered(getTxMatcher(stream, 1))).Times(1); EXPECT_CALL(pastlastByteTxCb, onByteEventRegistered(getTxMatcher(stream, 2))) .Times(1); - transport_->registerTxCallback(stream, 0, &firstByteTxCb); - transport_->registerTxCallback(stream, 0, &lastByteTxCb); - transport_->registerTxCallback(stream, 1, &finTxCb); - transport_->registerTxCallback(stream, 2, &pastlastByteTxCb); + auto transportRegisterTxCallback6 = + transport_->registerTxCallback(stream, 0, &firstByteTxCb); + auto transportRegisterTxCallback7 = + transport_->registerTxCallback(stream, 0, &lastByteTxCb); + auto transportRegisterTxCallback8 = + transport_->registerTxCallback(stream, 1, &finTxCb); + auto transportRegisterTxCallback9 = + transport_->registerTxCallback(stream, 2, &pastlastByteTxCb); Mock::VerifyAndClearExpectations(&firstByteTxCb); Mock::VerifyAndClearExpectations(&lastByteTxCb); Mock::VerifyAndClearExpectations(&pastlastByteTxCb); @@ -3884,9 +3948,12 @@ TEST_F(QuicTransportTest, InvokeTxCallbacksSingleByteWithFin) { EXPECT_CALL(lastByteTxCb, onByteEventRegistered(getTxMatcher(stream, 0))) .Times(1); EXPECT_CALL(finTxCb, onByteEventRegistered(getTxMatcher(stream, 1))).Times(1); - transport_->registerTxCallback(stream, 0, &firstByteTxCb); - transport_->registerTxCallback(stream, 0, &lastByteTxCb); - transport_->registerTxCallback(stream, 1, &finTxCb); + auto transportRegisterTxCallback10 = + transport_->registerTxCallback(stream, 0, &firstByteTxCb); + auto transportRegisterTxCallback11 = + transport_->registerTxCallback(stream, 0, &lastByteTxCb); + auto transportRegisterTxCallback12 = + transport_->registerTxCallback(stream, 1, &finTxCb); loopForWrites(); // have to loop since processed async Mock::VerifyAndClearExpectations(&firstByteTxCb); Mock::VerifyAndClearExpectations(&lastByteTxCb); @@ -3911,7 +3978,8 @@ TEST_F(QuicTransportTest, InvokeTxCallbacksMultipleBytes) { auto buf = buildRandomInputData(streamBytes); CHECK_EQ(streamBytes, buf->length()); - transport_->writeChain(stream, buf->clone(), false /* eof */); + auto writeChain63 = + transport_->writeChain(stream, buf->clone(), false /* eof */); EXPECT_CALL(firstByteTxCb, onByteEventRegistered(getTxMatcher(stream, 0))) .Times(1); EXPECT_CALL( @@ -3921,9 +3989,12 @@ TEST_F(QuicTransportTest, InvokeTxCallbacksMultipleBytes) { pastlastByteTxCb, onByteEventRegistered(getTxMatcher(stream, lastByte + 1))) .Times(1); - transport_->registerTxCallback(stream, 0, &firstByteTxCb); - transport_->registerTxCallback(stream, lastByte, &lastByteTxCb); - transport_->registerTxCallback(stream, lastByte + 1, &pastlastByteTxCb); + auto transportRegisterTxCallback13 = + transport_->registerTxCallback(stream, 0, &firstByteTxCb); + auto transportRegisterTxCallback14 = + transport_->registerTxCallback(stream, lastByte, &lastByteTxCb); + auto transportRegisterTxCallback15 = + transport_->registerTxCallback(stream, lastByte + 1, &pastlastByteTxCb); Mock::VerifyAndClearExpectations(&firstByteTxCb); Mock::VerifyAndClearExpectations(&lastByteTxCb); Mock::VerifyAndClearExpectations(&pastlastByteTxCb); @@ -3943,8 +4014,10 @@ TEST_F(QuicTransportTest, InvokeTxCallbacksMultipleBytes) { EXPECT_CALL( lastByteTxCb, onByteEventRegistered(getTxMatcher(stream, lastByte))) .Times(1); - transport_->registerTxCallback(stream, 0, &firstByteTxCb); - transport_->registerTxCallback(stream, lastByte, &lastByteTxCb); + auto transportRegisterTxCallback16 = + transport_->registerTxCallback(stream, 0, &firstByteTxCb); + auto transportRegisterTxCallback17 = + transport_->registerTxCallback(stream, lastByte, &lastByteTxCb); Mock::VerifyAndClearExpectations(&firstByteTxCb); Mock::VerifyAndClearExpectations(&lastByteTxCb); EXPECT_CALL(firstByteTxCb, onByteEvent(getTxMatcher(stream, 0))).Times(1); @@ -3978,7 +4051,8 @@ TEST_F(QuicTransportTest, InvokeTxCallbacksMultipleBytesWriteRateLimited) { const uint64_t lastByte = streamBytes - 1; auto buf = buildRandomInputData(streamBytes); CHECK_EQ(streamBytes, buf->length()); - transport_->writeChain(stream, buf->clone(), false /* eof */); + auto writeChain64 = + transport_->writeChain(stream, buf->clone(), false /* eof */); EXPECT_CALL(firstByteTxCb, onByteEventRegistered(getTxMatcher(stream, 0))) .Times(1); @@ -3993,11 +4067,15 @@ TEST_F(QuicTransportTest, InvokeTxCallbacksMultipleBytesWriteRateLimited) { pastlastByteTxCb, onByteEventRegistered(getTxMatcher(stream, lastByte + 1))) .Times(1); - transport_->registerTxCallback(stream, 0, &firstByteTxCb); - transport_->registerTxCallback( - stream, kDefaultUDPSendPacketLen * 2, &secondPacketByteOffsetTxCb); - transport_->registerTxCallback(stream, lastByte, &lastByteTxCb); - transport_->registerTxCallback(stream, lastByte + 1, &pastlastByteTxCb); + auto transportRegisterTxCallback18 = + transport_->registerTxCallback(stream, 0, &firstByteTxCb); + [[maybe_unused]] auto transportRegisterTxCallback19 = + transport_->registerTxCallback( + stream, kDefaultUDPSendPacketLen * 2, &secondPacketByteOffsetTxCb); + auto transportRegisterTxCallback20 = + transport_->registerTxCallback(stream, lastByte, &lastByteTxCb); + auto transportRegisterTxCallback21 = + transport_->registerTxCallback(stream, lastByte + 1, &pastlastByteTxCb); Mock::VerifyAndClearExpectations(&firstByteTxCb); Mock::VerifyAndClearExpectations(&secondPacketByteOffsetTxCb); Mock::VerifyAndClearExpectations(&lastByteTxCb); @@ -4048,10 +4126,12 @@ TEST_F(QuicTransportTest, InvokeTxCallbacksMultipleBytesMultipleWrites) { // call writeChain, writing 10 bytes { auto buf = buildRandomInputData(10); - transport_->writeChain(stream, buf->clone(), false /* eof */); + auto writeChain65 = + transport_->writeChain(stream, buf->clone(), false /* eof */); } EXPECT_CALL(txCb1, onByteEventRegistered(getTxMatcher(stream, 0))).Times(1); - transport_->registerTxCallback(stream, 0, &txCb1); + auto transportRegisterTxCallback21 = + transport_->registerTxCallback(stream, 0, &txCb1); Mock::VerifyAndClearExpectations(&txCb1); EXPECT_CALL(txCb1, onByteEvent(getTxMatcher(stream, 0))).Times(1); loopForWrites(); @@ -4060,10 +4140,12 @@ TEST_F(QuicTransportTest, InvokeTxCallbacksMultipleBytesMultipleWrites) { // call writeChain and write another 10 bytes { auto buf = buildRandomInputData(10); - transport_->writeChain(stream, buf->clone(), false /* eof */); + auto writeChain66 = + transport_->writeChain(stream, buf->clone(), false /* eof */); } EXPECT_CALL(txCb2, onByteEventRegistered(getTxMatcher(stream, 10))).Times(1); - transport_->registerTxCallback(stream, 10, &txCb2); + auto transportRegisterTxCallback22 = + transport_->registerTxCallback(stream, 10, &txCb2); Mock::VerifyAndClearExpectations(&txCb2); EXPECT_CALL(txCb2, onByteEvent(getTxMatcher(stream, 10))).Times(1); loopForWrites(); @@ -4072,10 +4154,12 @@ TEST_F(QuicTransportTest, InvokeTxCallbacksMultipleBytesMultipleWrites) { // write the fin { auto buf = buildRandomInputData(0); - transport_->writeChain(stream, buf->clone(), true /* eof */); + auto writeChain67 = + transport_->writeChain(stream, buf->clone(), true /* eof */); } EXPECT_CALL(txCb3, onByteEventRegistered(getTxMatcher(stream, 20))).Times(1); - transport_->registerTxCallback(stream, 20, &txCb3); + auto transportRegisterTxCallback23 = + transport_->registerTxCallback(stream, 20, &txCb3); Mock::VerifyAndClearExpectations(&txCb3); EXPECT_CALL(txCb3, onByteEvent(getTxMatcher(stream, 20))).Times(1); loopForWrites(); @@ -4101,10 +4185,12 @@ TEST_F( // call writeChain, writing 10 bytes { auto buf = buildRandomInputData(10); - transport_->writeChain(stream, buf->clone(), false /* eof */, &deliveryCb1); + auto writeChain68 = transport_->writeChain( + stream, buf->clone(), false /* eof */, &deliveryCb1); } EXPECT_CALL(txCb1, onByteEventRegistered(getTxMatcher(stream, 0))).Times(1); - transport_->registerTxCallback(stream, 0, &txCb1); + auto transportRegisterTxCallback24 = + transport_->registerTxCallback(stream, 0, &txCb1); Mock::VerifyAndClearExpectations(&txCb1); EXPECT_CALL(txCb1, onByteEvent(getTxMatcher(stream, 0))).Times(1); loopForWrites(); @@ -4113,10 +4199,12 @@ TEST_F( // call writeChain and write another 10 bytes { auto buf = buildRandomInputData(10); - transport_->writeChain(stream, buf->clone(), false /* eof */, &deliveryCb2); + auto writeChain69 = transport_->writeChain( + stream, buf->clone(), false /* eof */, &deliveryCb2); } EXPECT_CALL(txCb2, onByteEventRegistered(getTxMatcher(stream, 10))).Times(1); - transport_->registerTxCallback(stream, 10, &txCb2); + auto transportRegisterTxCallback25 = + transport_->registerTxCallback(stream, 10, &txCb2); Mock::VerifyAndClearExpectations(&txCb2); EXPECT_CALL(txCb2, onByteEvent(getTxMatcher(stream, 10))).Times(1); loopForWrites(); @@ -4125,10 +4213,12 @@ TEST_F( // write the fin { auto buf = buildRandomInputData(0); - transport_->writeChain(stream, buf->clone(), true /* eof */, &deliveryCb3); + auto writeChain70 = transport_->writeChain( + stream, buf->clone(), true /* eof */, &deliveryCb3); } EXPECT_CALL(txCb3, onByteEventRegistered(getTxMatcher(stream, 20))).Times(1); - transport_->registerTxCallback(stream, 20, &txCb3); + auto transportRegisterTxCallback26 = + transport_->registerTxCallback(stream, 20, &txCb3); Mock::VerifyAndClearExpectations(&txCb3); EXPECT_CALL(txCb3, onByteEvent(getTxMatcher(stream, 20))).Times(1); loopForWrites(); @@ -4149,7 +4239,8 @@ TEST_F( TEST_F(QuicTransportTest, NotifyPendingWriteConnImmediate) { EXPECT_CALL(writeCallback_, onConnectionWriteReady(_)); - transport_->notifyPendingWriteOnConnection(&writeCallback_); + auto transportNotifyPendingWrite1 = + transport_->notifyPendingWriteOnConnection(&writeCallback_); evb_.loop(); } @@ -4164,20 +4255,23 @@ TEST_F(QuicTransportTest, NotifyPendingWriteConnWritableBytesBacpressure) { conn.congestionController = std::move(mockCongestionController); EXPECT_CALL(*rawCongestionController, getWritableBytes()) .WillRepeatedly(Return(10 * kDefaultUDPSendPacketLen)); - transport_->notifyPendingWriteOnConnection(&writeCallback_); + auto transportNotifyPendingWrite2 = + transport_->notifyPendingWriteOnConnection(&writeCallback_); evb_.loop(); Mock::VerifyAndClearExpectations(&writeCallback_); EXPECT_CALL( writeCallback_, onConnectionWriteReady(20 * kDefaultUDPSendPacketLen)); conn.transportSettings.backpressureHeadroomFactor = 2; - transport_->notifyPendingWriteOnConnection(&writeCallback_); + auto transportNotifyPendingWrite3 = + transport_->notifyPendingWriteOnConnection(&writeCallback_); evb_.loop(); } TEST_F(QuicTransportTest, NotifyPendingWriteStreamImmediate) { auto stream = transport_->createBidirectionalStream().value(); EXPECT_CALL(writeCallback_, onStreamWriteReady(stream, _)); - transport_->notifyPendingWriteOnStream(stream, &writeCallback_); + auto transportNotifyPendingWriteStream1 = + transport_->notifyPendingWriteOnStream(stream, &writeCallback_); evb_.loop(); StreamId nonExistentStream = 3; @@ -4199,7 +4293,8 @@ TEST_F(QuicTransportTest, NotifyPendingWriteConnAsync) { .hasError()); EXPECT_CALL(writeCallback_, onConnectionWriteReady(_)).Times(0); - transport_->notifyPendingWriteOnConnection(&writeCallback_); + auto transportNotifyPendingWrite4 = + transport_->notifyPendingWriteOnConnection(&writeCallback_); evb_.loop(); PacketNum num = 10; @@ -4228,7 +4323,8 @@ TEST_F(QuicTransportTest, NotifyPendingWriteConnBufferFreeUpSpace) { // Fill up the buffer to its limit ASSERT_FALSE(updateFlowControlOnWriteToStream(*stream, 100).hasError()); - transport_->notifyPendingWriteOnConnection(&writeCallback_); + auto transportNotifyPendingWrite5 = + transport_->notifyPendingWriteOnConnection(&writeCallback_); EXPECT_CALL(writeCallback_, onConnectionWriteReady(_)).Times(0); @@ -4287,7 +4383,8 @@ TEST_F(QuicTransportTest, NotifyPendingWriteConnBufferUseTotalSpace) { // Fill up the buffer to its limit ASSERT_FALSE(updateFlowControlOnWriteToStream(*stream, 100).hasError()); - transport_->notifyPendingWriteOnConnection(&writeCallback_); + auto transportNotifyPendingWrite6 = + transport_->notifyPendingWriteOnConnection(&writeCallback_); EXPECT_CALL(writeCallback_, onConnectionWriteReady(_)).Times(0); @@ -4313,7 +4410,8 @@ TEST_F(QuicTransportTest, NotifyPendingWriteConnBufferOveruseSpace) { // Fill up the buffer to its limit ASSERT_FALSE(updateFlowControlOnWriteToStream(*stream, 1000).hasError()); - transport_->notifyPendingWriteOnConnection(&writeCallback_); + auto transportNotifyPendingWrite7 = + transport_->notifyPendingWriteOnConnection(&writeCallback_); EXPECT_CALL(writeCallback_, onConnectionWriteReady(_)).Times(0); @@ -4344,7 +4442,8 @@ TEST_F( ASSERT_FALSE(updateFlowControlOnWriteToStream( *stream, conn.flowControlState.peerAdvertisedMaxOffset) .hasError()); - transport_->notifyPendingWriteOnConnection(&writeCallback_); + auto transportNotifyPendingWrite8 = + transport_->notifyPendingWriteOnConnection(&writeCallback_); EXPECT_CALL(writeCallback_, onConnectionWriteReady(_)).Times(0); @@ -4377,7 +4476,8 @@ TEST_F(QuicTransportTest, NotifyPendingWriteStreamAsyncConnBlocked) { .hasError()); EXPECT_CALL(writeCallback_, onStreamWriteReady(stream->id, _)).Times(0); - transport_->notifyPendingWriteOnStream(stream->id, &writeCallback_); + auto transportNotifyPendingWriteStream2 = + transport_->notifyPendingWriteOnStream(stream->id, &writeCallback_); evb_.loop(); transport_->onNetworkData( @@ -4414,7 +4514,8 @@ TEST_F(QuicTransportTest, NotifyPendingWriteStreamWritableBytesBackpressure) { .hasError()); EXPECT_CALL(writeCallback_, onStreamWriteReady(stream->id, _)).Times(0); - transport_->notifyPendingWriteOnStream(stream->id, &writeCallback_); + auto transportNotifyPendingWriteStream3 = + transport_->notifyPendingWriteOnStream(stream->id, &writeCallback_); evb_.loop(); Mock::VerifyAndClearExpectations(&writeCallback_); @@ -4457,7 +4558,8 @@ TEST_F(QuicTransportTest, NotifyPendingWriteStreamAsyncStreamBlocked) { stream->currentWriteOffset = stream->flowControlState.peerAdvertisedMaxOffset; EXPECT_CALL(writeCallback_, onStreamWriteReady(stream->id, _)).Times(0); - transport_->notifyPendingWriteOnStream(stream->id, &writeCallback_); + auto transportNotifyPendingWriteStream4 = + transport_->notifyPendingWriteOnStream(stream->id, &writeCallback_); evb_.loop(); transport_->onNetworkData( @@ -4488,11 +4590,13 @@ TEST_F(QuicTransportTest, NotifyPendingWriteConnTwice) { .hasError()); EXPECT_CALL(writeCallback_, onConnectionWriteReady(_)).Times(0); - EXPECT_FALSE( - transport_->notifyPendingWriteOnConnection(&writeCallback_).hasError()); + auto transportNotifyPendingWrite9 = + transport_->notifyPendingWriteOnConnection(&writeCallback_); + EXPECT_FALSE(transportNotifyPendingWrite9.hasError()); evb_.loop(); - EXPECT_TRUE( - transport_->notifyPendingWriteOnConnection(&writeCallback_).hasError()); + auto transportNotifyPendingWrite10 = + transport_->notifyPendingWriteOnConnection(&writeCallback_); + EXPECT_TRUE(transportNotifyPendingWrite10.hasError()); } TEST_F(QuicTransportTest, NotifyPendingWriteStreamTwice) { @@ -4529,8 +4633,10 @@ TEST_F(QuicTransportTest, NotifyPendingWriteConnDuringClose) { *stream, conn.flowControlState.peerAdvertisedMaxOffset) .hasError()); - transport_->notifyPendingWriteOnStream(stream->id, &writeCallback_); - transport_->notifyPendingWriteOnStream(streamId2, &writeCallback_); + auto transportNotifyPendingWriteStream5 = + transport_->notifyPendingWriteOnStream(stream->id, &writeCallback_); + auto transportNotifyPendingWriteStream6 = + transport_->notifyPendingWriteOnStream(streamId2, &writeCallback_); evb_.loop(); EXPECT_CALL(writeCallback_, onStreamWriteReady(_, _)) @@ -4569,8 +4675,10 @@ TEST_F(QuicTransportTest, NotifyPendingWriteStreamDuringClose) { stream2->currentWriteOffset = stream2->flowControlState.peerAdvertisedMaxOffset; - transport_->notifyPendingWriteOnStream(stream->id, &writeCallback_); - transport_->notifyPendingWriteOnStream(streamId2, &writeCallback_); + auto transportNotifyPendingWriteStream7 = + transport_->notifyPendingWriteOnStream(stream->id, &writeCallback_); + auto transportNotifyPendingWriteStream8 = + transport_->notifyPendingWriteOnStream(streamId2, &writeCallback_); evb_.loop(); PacketNum num = 10; @@ -4806,7 +4914,7 @@ TEST_F(QuicTransportTest, CloseTransportCancelsAckTimeout) { folly::IOBuf passedIn; EXPECT_CALL(*socket_, write(_, _, _)) .WillRepeatedly(testing::WithArgs<1, 2>(Invoke(getTotalIovecLen))); - transport_->writeChain(stream, buf->clone(), false); + auto writeChain71 = transport_->writeChain(stream, buf->clone(), false); loopForWrites(); transport_->scheduleLossTimeout(500ms); EXPECT_TRUE(transport_->isLossTimeoutScheduled()); @@ -4886,7 +4994,7 @@ TEST_F(QuicTransportTest, PacingWillBurstFirst) { auto buf = buildRandomInputData(200); auto streamId = transport_->createBidirectionalStream().value(); - transport_->writeChain(streamId, buf->clone(), false); + auto writeChain72 = transport_->writeChain(streamId, buf->clone(), false); EXPECT_CALL(*socket_, write(_, _, _)).WillOnce(Return(0)); EXPECT_CALL(*rawPacer, updateAndGetWriteBatchSize(_)) .WillRepeatedly(Return(1)); @@ -4914,7 +5022,7 @@ TEST_F(QuicTransportTest, AlreadyScheduledPacingNoWrite) { auto buf = buildRandomInputData(200); auto streamId = transport_->createBidirectionalStream().value(); - transport_->writeChain(streamId, buf->clone(), false); + auto writeChain73 = transport_->writeChain(streamId, buf->clone(), false); EXPECT_CALL(*socket_, write(_, _, _)).WillOnce(Return(0)); EXPECT_CALL(*rawPacer, updateAndGetWriteBatchSize(_)) .WillRepeatedly(Return(1)); @@ -4946,7 +5054,7 @@ TEST_F(QuicTransportTest, NoScheduleIfNoNewData) { auto buf = buildRandomInputData(200); auto streamId = transport_->createBidirectionalStream().value(); - transport_->writeChain(streamId, buf->clone(), false); + auto writeChain74 = transport_->writeChain(streamId, buf->clone(), false); EXPECT_CALL(*socket_, write(_, _, _)).WillOnce(Return(0)); EXPECT_CALL(*rawPacer, updateAndGetWriteBatchSize(_)) .WillRepeatedly(Return(1)); @@ -4977,10 +5085,12 @@ TEST_F(QuicTransportTest, GetStreamPackestTxedSingleByte) { auto stream = transport_->createBidirectionalStream().value(); auto buf = buildRandomInputData(1); - transport_->writeChain(stream, buf->clone(), false /* eof */); + auto writeChain75 = + transport_->writeChain(stream, buf->clone(), false /* eof */); EXPECT_CALL(firstByteTxCb, onByteEventRegistered(getTxMatcher(stream, 0))) .Times(1); - transport_->registerTxCallback(stream, 0, &firstByteTxCb); + auto transportRegisterTxCallback27 = + transport_->registerTxCallback(stream, 0, &firstByteTxCb); Mock::VerifyAndClearExpectations(&firstByteTxCb); // when first byte TX callback gets invoked, numPacketsTxWithNewData should be @@ -5005,14 +5115,17 @@ TEST_F(QuicTransportTest, GetStreamPacketsTxedMultipleBytes) { auto buf = buildRandomInputData(streamBytes); CHECK_EQ(streamBytes, buf->length()); - transport_->writeChain(stream, buf->clone(), false /* eof */); + auto writeChain76 = + transport_->writeChain(stream, buf->clone(), false /* eof */); EXPECT_CALL(firstByteTxCb, onByteEventRegistered(getTxMatcher(stream, 0))) .Times(1); EXPECT_CALL( lastByteTxCb, onByteEventRegistered(getTxMatcher(stream, lastByte))) .Times(1); - transport_->registerTxCallback(stream, 0, &firstByteTxCb); - transport_->registerTxCallback(stream, lastByte, &lastByteTxCb); + auto transportRegisterTxCallback28 = + transport_->registerTxCallback(stream, 0, &firstByteTxCb); + auto transportRegisterTxCallback29 = + transport_->registerTxCallback(stream, lastByte, &lastByteTxCb); Mock::VerifyAndClearExpectations(&firstByteTxCb); Mock::VerifyAndClearExpectations(&lastByteTxCb); @@ -5055,7 +5168,8 @@ TEST_F(QuicTransportTest, GetStreamPacketsTxedMultiplePackets) { auto stream = transport_->createBidirectionalStream().value(); auto buf = buildRandomInputData(streamBytes); CHECK_EQ(streamBytes, buf->length()); - transport_->writeChain(stream, buf->clone(), false /* eof */); + auto writeChain77 = + transport_->writeChain(stream, buf->clone(), false /* eof */); EXPECT_CALL(firstByteTxCb, onByteEventRegistered(getTxMatcher(stream, 0))) .Times(1); @@ -5074,14 +5188,19 @@ TEST_F(QuicTransportTest, GetStreamPacketsTxedMultiplePackets) { EXPECT_CALL( lastByteTxCb, onByteEventRegistered(getTxMatcher(stream, lastByte))) .Times(1); - transport_->registerTxCallback(stream, 0, &firstByteTxCb); - transport_->registerTxCallback( - stream, firstPacketNearTailByte, &firstPacketNearTailByteTxCb); - transport_->registerTxCallback( - stream, secondPacketNearHeadByte, &secondPacketNearHeadByteTxCb); - transport_->registerTxCallback( - stream, secondPacketNearTailByte, &secondPacketNearTailByteTxCb); - transport_->registerTxCallback(stream, lastByte, &lastByteTxCb); + auto transportRegisterTxCallback30 = + transport_->registerTxCallback(stream, 0, &firstByteTxCb); + [[maybe_unused]] auto transportRegisterTxCallback32 = + transport_->registerTxCallback( + stream, firstPacketNearTailByte, &firstPacketNearTailByteTxCb); + [[maybe_unused]] auto transportRegisterTxCallback33 = + transport_->registerTxCallback( + stream, secondPacketNearHeadByte, &secondPacketNearHeadByteTxCb); + [[maybe_unused]] auto transportRegisterTxCallback34 = + transport_->registerTxCallback( + stream, secondPacketNearTailByte, &secondPacketNearTailByteTxCb); + auto transportRegisterTxCallback31 = + transport_->registerTxCallback(stream, lastByte, &lastByteTxCb); Mock::VerifyAndClearExpectations(&firstByteTxCb); Mock::VerifyAndClearExpectations(&firstPacketNearTailByteTxCb); @@ -5150,7 +5269,8 @@ TEST_F(QuicTransportTest, PrioritySetAndGet) { defaultPri, HTTPPriorityQueue::Priority( transport_->getStreamPriority(stream).value())); - transport_->setStreamPriority(stream, HTTPPriorityQueue::Priority(0, false)); + auto setPriority2 = transport_->setStreamPriority( + stream, HTTPPriorityQueue::Priority(0, false)); EXPECT_EQ( HTTPPriorityQueue::Priority(0, false), HTTPPriorityQueue::Priority( diff --git a/quic/api/test/QuicTypedTransportTest.cpp b/quic/api/test/QuicTypedTransportTest.cpp index 02e0980a6..847eabdb8 100644 --- a/quic/api/test/QuicTypedTransportTest.cpp +++ b/quic/api/test/QuicTypedTransportTest.cpp @@ -110,8 +110,9 @@ TYPED_TEST(QuicTypedTransportAfterStartTest, TransportInfoRttSignals) { // lambda to send and ACK a packet const auto sendAndAckPacket = [&](const auto& rttIn, const auto& ackDelayIn) { auto streamId = this->getTransport()->createBidirectionalStream().value(); - this->getTransport()->writeChain( - streamId, IOBuf::copyBuffer("hello"), false); + [[maybe_unused]] auto typedTestWriteChain1 = + this->getTransport()->writeChain( + streamId, IOBuf::copyBuffer("hello"), false); const auto maybeWriteInterval = this->loopForWrites(); EXPECT_EQ(1, this->getNumPacketsWritten(maybeWriteInterval)); @@ -311,8 +312,9 @@ TYPED_TEST(QuicTypedTransportAfterStartTest, RttSampleAckDelayEqual) { // lambda to send and ACK a packet const auto sendAndAckPacket = [&](const auto& rttIn, const auto& ackDelayIn) { auto streamId = this->getTransport()->createBidirectionalStream().value(); - this->getTransport()->writeChain( - streamId, IOBuf::copyBuffer("hello"), false); + [[maybe_unused]] auto typedTestWriteChain2 = + this->getTransport()->writeChain( + streamId, IOBuf::copyBuffer("hello"), false); const auto maybeWriteInterval = this->loopForWrites(); EXPECT_EQ(1, this->getNumPacketsWritten(maybeWriteInterval)); @@ -372,8 +374,9 @@ TYPED_TEST(QuicTypedTransportAfterStartTest, RttSampleAckDelayGreater) { // lambda to send and ACK a packet const auto sendAndAckPacket = [&](const auto& rttIn, const auto& ackDelayIn) { auto streamId = this->getTransport()->createBidirectionalStream().value(); - this->getTransport()->writeChain( - streamId, IOBuf::copyBuffer("hello"), false); + [[maybe_unused]] auto typedTestWriteChain3 = + this->getTransport()->writeChain( + streamId, IOBuf::copyBuffer("hello"), false); const auto maybeWriteInterval = this->loopForWrites(); EXPECT_EQ(1, this->getNumPacketsWritten(maybeWriteInterval)); @@ -435,7 +438,7 @@ TYPED_TEST(QuicTypedTransportAfterStartTest, RttSampleZeroTime) { // lambda to send and ACK a packet const auto sendAndAckPacket = [&](const auto& rttIn, const auto& ackDelayIn) { auto streamId = this->getTransport()->createBidirectionalStream().value(); - this->getTransport()->writeChain( + auto typedTestWriteChain4 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("hello"), false); const auto maybeWriteInterval = this->loopForWrites(); EXPECT_EQ(1, this->getNumPacketsWritten(maybeWriteInterval)); @@ -498,7 +501,8 @@ TYPED_TEST( // open a stream and write some bytes auto streamId = this->getTransport()->createBidirectionalStream().value(); - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("hello"), false); + auto typedTestWriteChain5 = this->getTransport()->writeChain( + streamId, IOBuf::copyBuffer("hello"), false); const auto maybeWrittenPackets = this->loopForWrites(); // should have sent one packet @@ -529,7 +533,8 @@ TYPED_TEST( // open a stream and write some bytes auto streamId = this->getTransport()->createBidirectionalStream().value(); - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("hello"), false); + auto typedTestWriteChain6 = this->getTransport()->writeChain( + streamId, IOBuf::copyBuffer("hello"), false); const auto maybeWrittenPackets1 = this->loopForWrites(); // should have sent one packet @@ -537,7 +542,8 @@ TYPED_TEST( EXPECT_EQ(1, this->getNumPacketsWritten(maybeWrittenPackets1)); // write some more bytes into the same stream - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("world"), false); + auto typedTestWriteChain7 = this->getTransport()->writeChain( + streamId, IOBuf::copyBuffer("world"), false); const auto maybeWrittenPackets2 = this->loopForWrites(); // should have sent another packet @@ -582,7 +588,8 @@ TYPED_TEST( // open a stream and write some bytes auto streamId = this->getTransport()->createBidirectionalStream().value(); - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("hello"), false); + auto typedTestWriteChain8 = this->getTransport()->writeChain( + streamId, IOBuf::copyBuffer("hello"), false); const auto maybeWrittenPackets1 = this->loopForWrites(); // should have sent one packet @@ -590,7 +597,8 @@ TYPED_TEST( EXPECT_EQ(1, this->getNumPacketsWritten(maybeWrittenPackets1)); // write some more bytes into the same stream - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("world"), false); + auto typedTestWriteChain9 = this->getTransport()->writeChain( + streamId, IOBuf::copyBuffer("world"), false); const auto maybeWrittenPackets2 = this->loopForWrites(); // should have sent another packet @@ -637,7 +645,8 @@ TYPED_TEST( // open a stream and write some bytes auto streamId = this->getTransport()->createBidirectionalStream().value(); - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("hello"), false); + auto typedTestWriteChain10 = this->getTransport()->writeChain( + streamId, IOBuf::copyBuffer("hello"), false); const auto maybeWrittenPackets = this->loopForWrites(); // should have sent one packet @@ -694,11 +703,13 @@ TYPED_TEST( // open a stream and write some bytes auto streamId = this->getTransport()->createBidirectionalStream().value(); - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("hello"), false); + auto typedTestWriteChain11 = this->getTransport()->writeChain( + streamId, IOBuf::copyBuffer("hello"), false); const auto maybeWrittenPackets1 = this->loopForWrites(); // write some more bytes into the same stream - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("world"), false); + auto typedTestWriteChain12 = this->getTransport()->writeChain( + streamId, IOBuf::copyBuffer("world"), false); const auto maybeWrittenPackets2 = this->loopForWrites(); // should have sent two packets @@ -781,7 +792,8 @@ TYPED_TEST(QuicTypedTransportAfterStartTest, TotalAppLimitedTime) { const auto bufLength = 1700; auto buf = buildRandomInputData(bufLength); - this->getTransport()->writeChain(streamId, std::move(buf), false); + auto typedTestWriteChain13 = + this->getTransport()->writeChain(streamId, std::move(buf), false); const auto maybeWrittenPackets1 = this->loopForWrites(); // should have sent two packets @@ -833,7 +845,8 @@ TYPED_TEST(QuicTypedTransportAfterStartTest, TotalAppLimitedTime) { const auto bufLength = 10000; auto buf = buildRandomInputData(bufLength); - this->getTransport()->writeChain(streamId, std::move(buf), false /* eof */); + auto typedTestWriteChain14 = this->getTransport()->writeChain( + streamId, std::move(buf), false /* eof */); const auto maybeWrittenPackets = this->loopForWrites(); @@ -901,7 +914,8 @@ TYPED_TEST(QuicTypedTransportAfterStartTest, TotalAppLimitedTime) { const auto bufLength = 1700; auto buf = buildRandomInputData(bufLength); - this->getTransport()->writeChain(streamId, std::move(buf), false); + auto typedTestWriteChain15 = + this->getTransport()->writeChain(streamId, std::move(buf), false); const auto maybeWrittenPackets1 = this->loopForWrites(); // should have sent two packets @@ -962,7 +976,8 @@ TYPED_TEST( auto streamId = this->getTransport()->createBidirectionalStream().value(); const auto bufLength = 1000; auto buf = buildRandomInputData(bufLength); - this->getTransport()->writeChain(streamId, std::move(buf), false); + auto typedTestWriteChain16 = + this->getTransport()->writeChain(streamId, std::move(buf), false); this->loopForWrites(); ASSERT_FALSE(this->getConn().outstandings.packets.empty()); @@ -998,7 +1013,8 @@ TYPED_TEST( auto streamId = this->getTransport()->createBidirectionalStream().value(); const auto bufLength = 1700; // Two packets auto buf = buildRandomInputData(bufLength); - this->getTransport()->writeChain(streamId, std::move(buf), false); + auto typedTestWriteChain17 = + this->getTransport()->writeChain(streamId, std::move(buf), false); this->loopForWrites(); packetsSent += 2; ASSERT_EQ(this->getConn().outstandings.packets.size(), packetsSent); @@ -1018,7 +1034,8 @@ TYPED_TEST( auto streamId = this->getTransport()->createBidirectionalStream().value(); const auto bufLength = 1700; // Two packets auto buf = buildRandomInputData(bufLength); - this->getTransport()->writeChain(streamId, std::move(buf), false); + auto typedTestWriteChain18 = + this->getTransport()->writeChain(streamId, std::move(buf), false); this->loopForWrites(); packetsSent += 2; ASSERT_EQ(this->getConn().outstandings.packets.size(), packetsSent); @@ -1040,7 +1057,8 @@ TYPED_TEST( auto streamId = this->getTransport()->createBidirectionalStream().value(); const auto bufLength = 1700; // Two packets auto buf = buildRandomInputData(bufLength); - this->getTransport()->writeChain(streamId, std::move(buf), false); + auto typedTestWriteChain19 = + this->getTransport()->writeChain(streamId, std::move(buf), false); this->loopForWrites(); packetsSent += 2; ASSERT_EQ(this->getConn().outstandings.packets.size(), packetsSent); @@ -1064,12 +1082,14 @@ TYPED_TEST( // open a stream and write some bytes auto streamId = this->getTransport()->createBidirectionalStream().value(); auto data1 = IOBuf::copyBuffer("hello"); - this->getTransport()->writeChain(streamId, data1->clone(), false); + auto typedTestWriteChain20 = + this->getTransport()->writeChain(streamId, data1->clone(), false); const auto maybeWrittenPackets1 = this->loopForWrites(); // write some more bytes into the same stream auto data2 = IOBuf::copyBuffer("world"); - this->getTransport()->writeChain(streamId, data2->clone(), false); + auto typedTestWriteChain21 = + this->getTransport()->writeChain(streamId, data2->clone(), false); const auto maybeWrittenPackets2 = this->loopForWrites(); data1->appendToChain(std::move(data2)); @@ -1085,11 +1105,13 @@ TYPED_TEST( MockDeliveryCallback cb; for (uint64_t offset = 0; offset < combined->computeChainDataLength(); offset++) { - this->getTransport()->registerDeliveryCallback(streamId, offset, &cb); + auto typedTestRegisterDelivery1 = + this->getTransport()->registerDeliveryCallback(streamId, offset, &cb); EXPECT_CALL(cb, onDeliveryAck(streamId, offset, _)).Times(1); } - this->getTransport()->registerDeliveryCallback( - streamId, combined->computeChainDataLength(), &cb); + auto typedTestRegisterDelivery2 = + this->getTransport()->registerDeliveryCallback( + streamId, combined->computeChainDataLength(), &cb); EXPECT_CALL( cb, onDeliveryAck(streamId, combined->computeChainDataLength(), _)) .Times(0); @@ -1119,13 +1141,15 @@ TYPED_TEST( // open a stream and write some bytes auto streamId = this->getTransport()->createBidirectionalStream().value(); - this->getTransport()->writeChain(streamId, nullptr, true); + auto typedTestWriteChain22 = + this->getTransport()->writeChain(streamId, nullptr, true); const auto maybeWrittenPackets1 = this->loopForWrites(); // should have sent one packet ASSERT_TRUE(maybeWrittenPackets1.has_value()); MockDeliveryCallback cb; - this->getTransport()->registerDeliveryCallback(streamId, 0, &cb); + auto typedTestRegisterDelivery3 = + this->getTransport()->registerDeliveryCallback(streamId, 0, &cb); EXPECT_CALL(cb, onDeliveryAck(streamId, 0, _)); // deliver an ACK for all of the outstanding packets @@ -1150,14 +1174,15 @@ TYPED_TEST( // open a stream and write some bytes auto streamId = this->getTransport()->createBidirectionalStream().value(); - this->getTransport()->writeChain( + auto typedTestWriteChain23 = this->getTransport()->writeChain( streamId, folly::IOBuf::copyBuffer("a"), false); const auto maybeWrittenPackets1 = this->loopForWrites(); // should have sent one packet ASSERT_TRUE(maybeWrittenPackets1.has_value()); MockDeliveryCallback cb; - this->getTransport()->registerDeliveryCallback(streamId, 0, &cb); + auto typedTestRegisterDelivery4 = + this->getTransport()->registerDeliveryCallback(streamId, 0, &cb); EXPECT_CALL(cb, onDeliveryAck(streamId, 0, _)); // deliver an ACK for all of the outstanding packets @@ -1188,7 +1213,7 @@ TYPED_TEST(QuicTypedTransportAfterStartTest, HandleIncomingKeyUpdate) { { // Send a packet in the current phase - this->getTransport()->writeChain( + auto typedTestWriteChain24 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("hello"), false); this->loopForWrites(); EXPECT_EQ( @@ -1227,7 +1252,7 @@ TYPED_TEST(QuicTypedTransportAfterStartTest, HandleIncomingKeyUpdate) { { // Send a packet. The connection should stay in phase one and increment the // number of packets written in this phase. - this->getTransport()->writeChain( + auto typedTestWriteChain25 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("hello4"), false); this->loopForWrites(); EXPECT_EQ(this->getConn().oneRttWritePhase, ProtectionType::KeyPhaseOne); @@ -1287,7 +1312,7 @@ TYPED_TEST(QuicTypedTransportAfterStartTest, InitiateKeyUpdateSuccess) { { // Send and receive a packet in the current phase - this->getTransport()->writeChain( + auto typedTestWriteChain26 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("hello"), false); this->loopForWrites(); EXPECT_EQ( @@ -1314,7 +1339,7 @@ TYPED_TEST(QuicTypedTransportAfterStartTest, InitiateKeyUpdateSuccess) { conn.transportSettings.firstKeyUpdatePacketCount.reset(); // A key update should be triggered after this write is completed. - this->getTransport()->writeChain( + auto typedTestWriteChain27 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("hello3"), false); this->loopForWrites(); @@ -1362,7 +1387,7 @@ TYPED_TEST(QuicTypedTransportAfterStartTest, InitiateKeyUpdateFailure) { { // Send and receive a packet in the current phase - this->getTransport()->writeChain( + auto typedTestWriteChain28 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("hello"), false); this->loopForWrites(); EXPECT_EQ( @@ -1389,7 +1414,7 @@ TYPED_TEST(QuicTypedTransportAfterStartTest, InitiateKeyUpdateFailure) { conn.transportSettings.firstKeyUpdatePacketCount.reset(); // A key update should be triggered after this write is completed. - this->getTransport()->writeChain( + auto typedTestWriteChain29 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("hello3"), false); const auto maybeWriteInterval = this->loopForWrites(); ASSERT_EQ(1, this->getNumPacketsWritten(maybeWriteInterval)); @@ -1410,7 +1435,7 @@ TYPED_TEST(QuicTypedTransportAfterStartTest, InitiateKeyUpdateFailure) { { // Send a packet in the new phase. - this->getTransport()->writeChain( + auto typedTestWriteChain30 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("hello3"), false); const auto maybeWriteInterval = this->loopForWrites(); ASSERT_EQ(1, this->getNumPacketsWritten(maybeWriteInterval)); @@ -1465,7 +1490,7 @@ TYPED_TEST(QuicTypedTransportAfterStartTest, InitiateFirstKeyUpdateSuccess) { { // Send and receive a packet in the current phase - this->getTransport()->writeChain( + auto typedTestWriteChain31 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("hello"), false); this->loopForWrites(); EXPECT_EQ( @@ -1494,7 +1519,7 @@ TYPED_TEST(QuicTypedTransportAfterStartTest, InitiateFirstKeyUpdateSuccess) { kDefaultKeyUpdatePacketCountInterval; // A key update should be triggered after this write is completed. - this->getTransport()->writeChain( + auto typedTestWriteChain32 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("hello3"), false); this->loopForWrites(); @@ -1553,7 +1578,7 @@ TYPED_TEST( { // Send and receive a packet in the current phase - this->getTransport()->writeChain( + auto typedTestWriteChain33 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("hello"), false); this->loopForWrites(); EXPECT_EQ( @@ -1584,7 +1609,7 @@ TYPED_TEST( kDefaultKeyUpdatePacketCountInterval; // A key update should be triggered after this write is completed. - this->getTransport()->writeChain( + auto typedTestWriteChain34 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("hello3"), false); this->loopForWrites(); @@ -1613,7 +1638,7 @@ TYPED_TEST( numberOfWrittenPacketsInPhase; // A key update should be triggered after this write is completed. - this->getTransport()->writeChain( + auto typedTestWriteChain35 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("hello3"), false); this->loopForWrites(); @@ -2205,7 +2230,7 @@ TYPED_TEST( EXPECT_EQ(expectedStreamId, streamId); // send some stream data, see a packet be written - this->getTransport()->writeChain( + auto typedTestWriteChain36 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("hello1"), false /* eof */); const auto maybeWrittenPackets1 = this->loopForWrites(); EXPECT_EQ(1, this->getNumPacketsWritten(maybeWrittenPackets1)); @@ -2219,7 +2244,7 @@ TYPED_TEST( streamId, IOBuf::copyBuffer("hello2"))); // local sends goodbye with EOF, gets the ACK - this->getTransport()->writeChain( + auto typedTestWriteChain37 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("goodbye1"), true /* eof */); const auto maybeWrittenPackets2 = this->loopForWrites(); EXPECT_EQ(1, this->getNumPacketsWritten(maybeWrittenPackets2)); @@ -2276,7 +2301,7 @@ TYPED_TEST( EXPECT_EQ(expectedStreamId, streamId); // send some stream data with EOF, see a packet be written - this->getTransport()->writeChain( + auto typedTestWriteChain38 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("hello1"), true /* eof */); const auto maybeWrittenPackets1 = this->loopForWrites(); EXPECT_EQ(1, this->getNumPacketsWritten(maybeWrittenPackets1)); @@ -2339,7 +2364,7 @@ TYPED_TEST( EXPECT_EQ(expectedStreamId, streamId); // send some stream data with EOF, see a packet be written - this->getTransport()->writeChain( + auto typedTestWriteChain39 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("hello1"), true /* eof */); const auto maybeWrittenPackets1 = this->loopForWrites(); EXPECT_EQ(1, this->getNumPacketsWritten(maybeWrittenPackets1)); @@ -2399,7 +2424,7 @@ TYPED_TEST( EXPECT_EQ(expectedStreamId, streamId); // send some stream data, see a packet be written - this->getTransport()->writeChain( + auto typedTestWriteChain40 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("hello1"), false /* eof */); const auto maybeWrittenPackets1 = this->loopForWrites(); EXPECT_EQ(1, this->getNumPacketsWritten(maybeWrittenPackets1)); @@ -2472,7 +2497,7 @@ TYPED_TEST( EXPECT_EQ(expectedStreamId, streamId); // send some stream data, see a packet be written - this->getTransport()->writeChain( + auto typedTestWriteChain41 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("hello1"), false /* eof */); const auto maybeWrittenPackets1 = this->loopForWrites(); EXPECT_EQ(1, this->getNumPacketsWritten(maybeWrittenPackets1)); @@ -2541,7 +2566,7 @@ TYPED_TEST( streamId, IOBuf::copyBuffer("hello1"))); // local sends some stream data, see a packet be written, gets the ACK - this->getTransport()->writeChain( + auto typedTestWriteChain42 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("hello2"), false /* eof */); const auto maybeWrittenPackets1 = this->loopForWrites(); EXPECT_EQ(1, this->getNumPacketsWritten(maybeWrittenPackets1)); @@ -2553,7 +2578,7 @@ TYPED_TEST( streamId, IOBuf::copyBuffer("goodbye1"))); // local sends goodbye with EOF too, get the ACK, stream should close - this->getTransport()->writeChain( + auto typedTestWriteChain43 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("goodbye2"), true /* eof */); const auto maybeWrittenPackets2 = this->loopForWrites(); EXPECT_EQ(1, this->getNumPacketsWritten(maybeWrittenPackets2)); @@ -2606,7 +2631,7 @@ TYPED_TEST( streamId, IOBuf::copyBuffer("hello1"))); // send some stream data, see a packet be written, get the ACK - this->getTransport()->writeChain( + auto typedTestWriteChain44 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("hello2"), false /* eof */); const auto maybeWrittenPackets1 = this->loopForWrites(); EXPECT_EQ(1, this->getNumPacketsWritten(maybeWrittenPackets1)); @@ -2614,7 +2639,7 @@ TYPED_TEST( this->buildAckPacketForSentAppDataPackets(maybeWrittenPackets1)); // local sends goodbye with EOF too, get the ACK, stream should close - this->getTransport()->writeChain( + auto typedTestWriteChain45 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("goodbye"), true /* eof */); const auto maybeWrittenPackets2 = this->loopForWrites(); EXPECT_EQ(1, this->getNumPacketsWritten(maybeWrittenPackets2)); @@ -2667,7 +2692,7 @@ TYPED_TEST( streamId, IOBuf::copyBuffer("hello1"))); // send some stream data with EOF, see a packet be written, get the ACK - this->getTransport()->writeChain( + auto typedTestWriteChain46 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("hello2"), true /* eof */); const auto maybeWrittenPackets1 = this->loopForWrites(); EXPECT_EQ(1, this->getNumPacketsWritten(maybeWrittenPackets1)); @@ -2722,7 +2747,7 @@ TYPED_TEST( streamId, IOBuf::copyBuffer("hello1"))); // local sends some stream data, see a packet be written, gets the ACK - this->getTransport()->writeChain( + auto typedTestWriteChain47 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("hello2"), false /* eof */); const auto maybeWrittenPackets1 = this->loopForWrites(); EXPECT_EQ(1, this->getNumPacketsWritten(maybeWrittenPackets1)); @@ -2801,7 +2826,7 @@ TYPED_TEST( streamId, IOBuf::copyBuffer("hello1"))); // local sends some stream data, see a packet be written, ACK not received - this->getTransport()->writeChain( + auto typedTestWriteChain48 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("hello2"), false /* eof */); const auto maybeWrittenPackets1 = this->loopForWrites(); EXPECT_EQ(1, this->getNumPacketsWritten(maybeWrittenPackets1)); @@ -2878,7 +2903,7 @@ TYPED_TEST( streamId, IOBuf::copyBuffer("hello1"))); // local sends some stream data, see a packet be written, ACK not received - this->getTransport()->writeChain( + auto typedTestWriteChain49 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("hello2"), false /* eof */); const auto maybeWrittenPackets1 = this->loopForWrites(); EXPECT_EQ(1, this->getNumPacketsWritten(maybeWrittenPackets1)); @@ -2952,13 +2977,13 @@ TYPED_TEST( streamId, IOBuf::copyBuffer("hello1"))); // local sends some stream data, see a packet be written - this->getTransport()->writeChain( + auto typedTestWriteChain50 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("hello2"), false /* eof */); const auto maybeWrittenPackets1 = this->loopForWrites(); EXPECT_EQ(1, this->getNumPacketsWritten(maybeWrittenPackets1)); // local sends some more stream data, see another packet be written - this->getTransport()->writeChain( + auto typedTestWriteChain51 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("hello2"), false /* eof */); const auto maybeWrittenPackets2 = this->loopForWrites(); EXPECT_EQ(1, this->getNumPacketsWritten(maybeWrittenPackets2)); @@ -3243,7 +3268,8 @@ TYPED_TEST( // open a stream and write string { - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer(str1), false); + auto typedTestWriteChain52 = this->getTransport()->writeChain( + streamId, IOBuf::copyBuffer(str1), false); const auto maybeWrittenPackets = this->loopForWrites(); // should have sent one packet @@ -3297,7 +3323,7 @@ TYPED_TEST( }); // open a stream and write string - this->getTransport()->writeChain( + auto typedTestWriteChain53 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("hello"), false); const auto maybeWrittenPackets = this->loopForWrites(); @@ -3336,7 +3362,7 @@ TYPED_TEST( }); // open a stream and write string - this->getTransport()->writeChain( + auto typedTestWriteChain54 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("goodbye"), false); const auto maybeWrittenPackets = this->loopForWrites(); @@ -3401,7 +3427,8 @@ TYPED_TEST( // open a stream and write string auto buf = buildRandomInputData(2000 /* bufLength */); - this->getTransport()->writeChain(streamId, std::move(buf), false); + auto typedTestWriteChain55 = + this->getTransport()->writeChain(streamId, std::move(buf), false); const auto maybeWrittenPackets = this->loopForWrites(); // should have sent two packets @@ -3448,7 +3475,7 @@ TYPED_TEST( }); // open a stream and write string - this->getTransport()->writeChain( + auto typedTestWriteChain56 = this->getTransport()->writeChain( streamId, IOBuf::copyBuffer("goodbye"), false); const auto maybeWrittenPackets = this->loopForWrites(); @@ -3488,7 +3515,8 @@ TYPED_TEST( // open a stream and write string auto buf = buildRandomInputData(3000 /* bufLength */); - this->getTransport()->writeChain(streamId, std::move(buf), false); + auto typedTestWriteChain57 = + this->getTransport()->writeChain(streamId, std::move(buf), false); const auto maybeWrittenPackets = this->loopForWrites(); // should have sent three packets @@ -3656,7 +3684,8 @@ TYPED_TEST( // open a stream and write string { - this->getTransport()->writeChain(streamId, std::move(buf), false); + auto typedTestWriteChain58 = + this->getTransport()->writeChain(streamId, std::move(buf), false); const auto maybeWrittenPackets = this->loopForWrites(); // should have sent one packet @@ -3800,7 +3829,8 @@ TYPED_TEST( EXPECT_EQ(bytesWritten, event.numBytesWritten); }); - this->getTransport()->writeChain(streamId, std::move(buf), false); + auto typedTestWriteChain59 = + this->getTransport()->writeChain(streamId, std::move(buf), false); const auto maybeWrittenPackets = this->loopForWrites(); // make sure we wrote @@ -4017,7 +4047,8 @@ TYPED_TEST( // open a stream and write str1 { - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer(str1), false); + auto typedTestWriteChain60 = this->getTransport()->writeChain( + streamId, IOBuf::copyBuffer(str1), false); const auto maybeWrittenPackets = this->loopForWrites(); // should have sent one packet @@ -4058,7 +4089,8 @@ TYPED_TEST( // open a stream and write some bytes auto streamId = this->getTransport()->createBidirectionalStream().value(); - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("hello"), false); + auto typedTestWriteChain61 = this->getTransport()->writeChain( + streamId, IOBuf::copyBuffer("hello"), false); const auto maybeWrittenPackets = this->loopForWrites(); // should have sent one packet @@ -4131,7 +4163,8 @@ TYPED_TEST( // open a stream and write some bytes auto streamId = this->getTransport()->createBidirectionalStream().value(); - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("hello"), false); + auto typedTestWriteChain62 = this->getTransport()->writeChain( + streamId, IOBuf::copyBuffer("hello"), false); const auto maybeWrittenPackets = this->loopForWrites(); // should have sent one packet @@ -4204,7 +4237,8 @@ TYPED_TEST( // open a stream and write some bytes auto streamId = this->getTransport()->createBidirectionalStream().value(); - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("hello"), false); + auto typedTestWriteChain63 = this->getTransport()->writeChain( + streamId, IOBuf::copyBuffer("hello"), false); const auto maybeWrittenPackets = this->loopForWrites(); // should have sent one packet @@ -4301,7 +4335,8 @@ TYPED_TEST( // open a stream and write some bytes auto streamId = this->getTransport()->createBidirectionalStream().value(); - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("hello"), false); + auto typedTestWriteChain64 = this->getTransport()->writeChain( + streamId, IOBuf::copyBuffer("hello"), false); const auto maybeWrittenPackets = this->loopForWrites(); // should have sent one packet @@ -4396,15 +4431,18 @@ TYPED_TEST( // open a stream and write some bytes auto streamId = this->getTransport()->createBidirectionalStream().value(); - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("hello"), false); + auto typedTestWriteChain65 = this->getTransport()->writeChain( + streamId, IOBuf::copyBuffer("hello"), false); const auto maybeWrittenPackets1 = this->loopForWrites(); // write some more bytes into the same stream - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("world"), false); + auto typedTestWriteChain66 = this->getTransport()->writeChain( + streamId, IOBuf::copyBuffer("world"), false); const auto maybeWrittenPackets2 = this->loopForWrites(); // third and final write, this time with EOF - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("!"), true); + auto typedTestWriteChain67 = + this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("!"), true); const auto maybeWrittenPackets3 = this->loopForWrites(); // should have sent three packets @@ -4482,7 +4520,8 @@ TYPED_TEST( // open a stream, write some bytes, send packet, deliver ACK auto streamId = this->getTransport()->createBidirectionalStream().value(); - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("hello"), false); + auto typedTestWriteChain68 = this->getTransport()->writeChain( + streamId, IOBuf::copyBuffer("hello"), false); { const auto maybeWrittenPackets = this->loopForWrites(); ASSERT_TRUE(maybeWrittenPackets.has_value()); @@ -4523,7 +4562,8 @@ TYPED_TEST( } // write some more bytes into the same stream, send packet, deliver ACK - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("world"), false); + auto typedTestWriteChain69 = this->getTransport()->writeChain( + streamId, IOBuf::copyBuffer("world"), false); { const auto maybeWrittenPackets = this->loopForWrites(); ASSERT_TRUE(maybeWrittenPackets.has_value()); @@ -4563,7 +4603,8 @@ TYPED_TEST( } // third and final write, this time with EOF, send packet, deliver ACK - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("!"), true); + auto typedTestWriteChain70 = + this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("!"), true); { const auto maybeWrittenPackets = this->loopForWrites(); ASSERT_TRUE(maybeWrittenPackets.has_value()); @@ -4634,15 +4675,18 @@ TYPED_TEST( // open a stream and write some bytes auto streamId = this->getTransport()->createBidirectionalStream().value(); - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("hello"), false); + auto typedTestWriteChain71 = this->getTransport()->writeChain( + streamId, IOBuf::copyBuffer("hello"), false); const auto maybeWrittenPackets1 = this->loopForWrites(); // write some more bytes into the same stream - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("world"), false); + auto typedTestWriteChain72 = this->getTransport()->writeChain( + streamId, IOBuf::copyBuffer("world"), false); const auto maybeWrittenPackets2 = this->loopForWrites(); // third and final write, this time with EOF - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("!"), true); + auto typedTestWriteChain73 = + this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("!"), true); const auto maybeWrittenPackets3 = this->loopForWrites(); // should have sent three packets @@ -4801,15 +4845,18 @@ TYPED_TEST( // open a stream and write some bytes auto streamId = this->getTransport()->createBidirectionalStream().value(); - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("hello"), false); + auto typedTestWriteChain74 = this->getTransport()->writeChain( + streamId, IOBuf::copyBuffer("hello"), false); const auto maybeWrittenPackets1 = this->loopForWrites(); // write some more bytes into the same stream - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("world"), false); + auto typedTestWriteChain75 = this->getTransport()->writeChain( + streamId, IOBuf::copyBuffer("world"), false); const auto maybeWrittenPackets2 = this->loopForWrites(); // third and final write, this time with EOF - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("!"), true); + auto typedTestWriteChain76 = + this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("!"), true); const auto maybeWrittenPackets3 = this->loopForWrites(); // should have sent three packets @@ -4966,15 +5013,18 @@ TYPED_TEST( // open a stream and write some bytes auto streamId = this->getTransport()->createBidirectionalStream().value(); - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("hello"), false); + auto typedTestWriteChain77 = this->getTransport()->writeChain( + streamId, IOBuf::copyBuffer("hello"), false); const auto maybeWrittenPackets1 = this->loopForWrites(); // write some more bytes into the same stream - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("world"), false); + auto typedTestWriteChain78 = this->getTransport()->writeChain( + streamId, IOBuf::copyBuffer("world"), false); const auto maybeWrittenPackets2 = this->loopForWrites(); // third and final write, this time with EOF - this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("!"), true); + auto typedTestWriteChain79 = + this->getTransport()->writeChain(streamId, IOBuf::copyBuffer("!"), true); const auto maybeWrittenPackets3 = this->loopForWrites(); // should have sent three packets diff --git a/quic/api/test/QuicTypedTransportTestUtil.h b/quic/api/test/QuicTypedTransportTestUtil.h index 9ab64f85e..0366f5825 100644 --- a/quic/api/test/QuicTypedTransportTestUtil.h +++ b/quic/api/test/QuicTypedTransportTestUtil.h @@ -610,7 +610,7 @@ class QuicTypedTransportTestBase : protected QuicTransportTestClass { StreamId createUnidirectionalStream() { const auto expectedStreamId = this->getTransport()->createUnidirectionalStream(); - CHECK(expectedStreamId.hasValue()); + CHECK(expectedStreamId.has_value()); return expectedStreamId.value(); } @@ -620,7 +620,7 @@ class QuicTypedTransportTestBase : protected QuicTransportTestClass { StreamId createBidirectionalStream() { const auto expectedStreamId = this->getTransport()->createBidirectionalStream(); - CHECK(expectedStreamId.hasValue()); + CHECK(expectedStreamId.has_value()); return expectedStreamId.value(); } diff --git a/quic/api/test/TestQuicTransport.h b/quic/api/test/TestQuicTransport.h index 0b5316102..134bb4b51 100644 --- a/quic/api/test/TestQuicTransport.h +++ b/quic/api/test/TestQuicTransport.h @@ -54,13 +54,13 @@ class TestQuicTransport const BufferMeta& /* data */, bool /* eof */, ByteEventCallback* /* cb */) override { - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } WriteResult setDSRPacketizationRequestSender( StreamId /* id */, std::unique_ptr /* sender */) override { - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } Optional> getPeerTransportParams() @@ -85,15 +85,15 @@ class TestQuicTransport return writeLooper_->isPacingScheduled(); } - folly::Expected onReadData( + quic::Expected onReadData( const folly::SocketAddress& /* peer */, ReceivedUdpPacket&& /* udpPacket */) noexcept override { - return folly::unit; + return {}; } - [[nodiscard]] folly::Expected writeData() override { + [[nodiscard]] quic::Expected writeData() override { if (closed) { - return folly::unit; + return {}; } auto result = writeQuicDataToSocket( *socket_, @@ -107,9 +107,9 @@ class TestQuicTransport ? conn_->pacer->updateAndGetWriteBatchSize(Clock::now()) : conn_->transportSettings.writeConnectionDataPacketsLimit)); if (result.hasError()) { - return folly::makeUnexpected(result.error()); + return quic::make_unexpected(result.error()); } - writePacketizationRequest( + [[maybe_unused]] auto writePacketization = writePacketizationRequest( *dynamic_cast(conn_.get()), *conn_->clientConnectionId, (isConnectionPaced(*conn_) @@ -117,7 +117,7 @@ class TestQuicTransport : conn_->transportSettings.writeConnectionDataPacketsLimit), *aead, Clock::now()); - return folly::unit; + return {}; } void closeTransport() override { diff --git a/quic/client/BUCK b/quic/client/BUCK index aaba66c18..c16b93c0e 100644 --- a/quic/client/BUCK +++ b/quic/client/BUCK @@ -13,6 +13,7 @@ mvfst_cpp_library( exported_deps = [ ":client_lite", "//quic/api:transport", + "//quic/common:expected", ], ) @@ -51,6 +52,7 @@ mvfst_cpp_library( "//quic/api:transport_lite", "//quic/common:buf_accessor", "//quic/common:buf_util", + "//quic/common:expected", "//quic/common/udpsocket:quic_async_udp_socket", "//quic/state:quic_connection_stats", ], @@ -85,6 +87,7 @@ mvfst_cpp_library( "//folly/io/async:delayed_destruction", "//quic:constants", "//quic:exception", + "//quic/common:expected", "//quic/common:network_data", "//quic/common/udpsocket:quic_async_udp_socket", "//quic/congestion_control:cubic", @@ -103,8 +106,8 @@ mvfst_cpp_library( "handshake/ClientTransportParametersExtension.h", ], exported_deps = [ - "//folly:expected", "//quic:exception", + "//quic/common:expected", "//quic/handshake:transport_parameters", ], ) diff --git a/quic/client/QuicClientTransport.cpp b/quic/client/QuicClientTransport.cpp index 77d8748e1..701cd7b54 100644 --- a/quic/client/QuicClientTransport.cpp +++ b/quic/client/QuicClientTransport.cpp @@ -43,7 +43,7 @@ void QuicClientTransport::onNotifyDataAvailable( ? conn_->transportSettings.readCoalescingSize : readBufferSize; - auto result = [&]() -> folly::Expected { + auto result = [&]() -> quic::Expected { if (conn_->transportSettings.networkDataPerSocketRead) { return readWithRecvmsgSinglePacketLoop(sock, readAllocSize); } else if (conn_->transportSettings.shouldUseWrapperRecvmmsgForBatchRecv) { @@ -54,13 +54,12 @@ void QuicClientTransport::onNotifyDataAvailable( return readWithRecvmsg(sock, readAllocSize, numPackets); } }(); - if (result.hasError()) { + if (!result.has_value()) { asyncClose(result.error()); } } -folly::Expected -QuicClientTransport::readWithRecvmmsgWrapper( +quic::Expected QuicClientTransport::readWithRecvmmsgWrapper( QuicAsyncUDPSocket& sock, uint64_t readBufferSize, uint16_t numPackets) { @@ -72,8 +71,8 @@ QuicClientTransport::readWithRecvmmsgWrapper( const auto result = sock.recvmmsgNetworkData( readBufferSize, numPackets, networkData, server, totalData); - if (result.hasError()) { - return folly::makeUnexpected(result.error()); + if (!result.has_value()) { + return quic::make_unexpected(result.error()); } // track the received packets @@ -120,7 +119,7 @@ QuicClientTransport::readWithRecvmmsgWrapper( return processPackets(std::move(networkData), server); } -folly::Expected QuicClientTransport::readWithRecvmmsg( +quic::Expected QuicClientTransport::readWithRecvmmsg( QuicAsyncUDPSocket& sock, uint64_t readBufferSize, uint16_t numPackets) { @@ -133,14 +132,14 @@ folly::Expected QuicClientTransport::readWithRecvmmsg( recvmmsgStorage_.resize(numPackets); auto recvResult = recvMmsg( sock, readBufferSize, numPackets, networkData, server, totalData); - if (recvResult.hasError()) { + if (!recvResult.has_value()) { return recvResult; } return processPackets(std::move(networkData), server); } -folly::Expected QuicClientTransport::readWithRecvmsg( +quic::Expected QuicClientTransport::readWithRecvmsg( QuicAsyncUDPSocket& sock, uint64_t readBufferSize, uint16_t numPackets) { @@ -152,7 +151,7 @@ folly::Expected QuicClientTransport::readWithRecvmsg( // TODO(bschlinker): Deprecate in favor of Wrapper::recvmmsg auto recvResult = recvMsg(sock, readBufferSize, numPackets, networkData, server, totalData); - if (recvResult.hasError()) { + if (!recvResult.has_value()) { return recvResult; } diff --git a/quic/client/QuicClientTransport.h b/quic/client/QuicClientTransport.h index 840dda8a1..f7af98e9a 100644 --- a/quic/client/QuicClientTransport.h +++ b/quic/client/QuicClientTransport.h @@ -9,6 +9,7 @@ #include #include +#include namespace quic { @@ -101,17 +102,17 @@ class QuicClientTransport : public QuicTransportBase, return wrappedObserverContainer_.getPtr(); } - [[nodiscard]] folly::Expected readWithRecvmmsgWrapper( + [[nodiscard]] quic::Expected readWithRecvmmsgWrapper( QuicAsyncUDPSocket& sock, uint64_t readBufferSize, uint16_t numPackets); - [[nodiscard]] folly::Expected readWithRecvmmsg( + [[nodiscard]] quic::Expected readWithRecvmmsg( QuicAsyncUDPSocket& sock, uint64_t readBufferSize, uint16_t numPackets); - [[nodiscard]] folly::Expected readWithRecvmsg( + [[nodiscard]] quic::Expected readWithRecvmsg( QuicAsyncUDPSocket& sock, uint64_t readBufferSize, uint16_t numPackets); diff --git a/quic/client/QuicClientTransportLite.cpp b/quic/client/QuicClientTransportLite.cpp index fc4b20b60..3bbb3126d 100644 --- a/quic/client/QuicClientTransportLite.cpp +++ b/quic/client/QuicClientTransportLite.cpp @@ -82,7 +82,7 @@ QuicClientTransportLite::QuicClientTransportLite( conn_->selfConnectionIds.emplace_back(srcConnId, kInitialSequenceNumber); auto randCidExpected = ConnectionId::createRandom(kMinInitialDestinationConnIdLength); - CHECK(randCidExpected.hasValue()); + CHECK(randCidExpected.has_value()); clientConn_->initialDestinationConnectionId = randCidExpected.value(); clientConn_->originalDestinationConnectionId = clientConn_->initialDestinationConnectionId; @@ -124,8 +124,7 @@ QuicClientTransportLite::~QuicClientTransportLite() { } } -folly::Expected -QuicClientTransportLite::processUdpPacket( +quic::Expected QuicClientTransportLite::processUdpPacket( const folly::SocketAddress& peer, ReceivedUdpPacket&& udpPacket) { // Process the arriving UDP packet, which may have coalesced QUIC packets. @@ -142,7 +141,7 @@ QuicClientTransportLite::processUdpPacket( << " versions=" << std::hex << versionNegotiation->versions << " " << *this; - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( LocalErrorCode::NEW_VERSION_NEGOTIATED, "Received version negotiation packet")); } @@ -152,7 +151,7 @@ QuicClientTransportLite::processUdpPacket( !udpData.empty() && processedPackets < kMaxNumCoalescedPackets; processedPackets++) { auto res = processUdpPacketData(peer, udpPacket); - if (res.hasError()) { + if (!res.has_value()) { return res; } } @@ -172,7 +171,7 @@ QuicClientTransportLite::processUdpPacket( auto res = processUdpPacketData(pendingPacket.peer, pendingPacket.udpPacket); - if (res.hasError()) { + if (!res.has_value()) { return res; } } @@ -187,22 +186,21 @@ QuicClientTransportLite::processUdpPacket( auto res = processUdpPacketData(pendingPacket.peer, pendingPacket.udpPacket); - if (res.hasError()) { + if (!res.has_value()) { return res; } } clientConn_->pendingHandshakeData.clear(); } - return folly::unit; + return {}; } -folly::Expected -QuicClientTransportLite::processUdpPacketData( +quic::Expected QuicClientTransportLite::processUdpPacketData( const folly::SocketAddress& peer, ReceivedUdpPacket& udpPacket) { auto packetSize = udpPacket.buf.chainLength(); if (packetSize == 0) { - return folly::unit; + return {}; } auto parsedPacket = conn_->readCodec->parsePacket( udpPacket.buf, conn_->ackStates, conn_->clientConnectionId->size()); @@ -214,12 +212,12 @@ QuicClientTransportLite::processUdpPacketData( conn_->peerConnectionError = QuicError( QuicErrorCode(LocalErrorCode::CONNECTION_RESET), toString(LocalErrorCode::CONNECTION_RESET).str()); - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(LocalErrorCode::NO_ERROR, "Stateless Reset Received")); } VLOG(4) << "Drop StatelessReset for bad connId or token " << *this; // Don't treat this as a fatal error, just ignore the packet. - return folly::unit; + return {}; } RetryPacket* retryPacket = parsedPacket.retryPacket(); @@ -239,7 +237,7 @@ QuicClientTransportLite::processUdpPacketData( VLOG(4) << "Server incorrectly issued a retry packet; dropping retry " << *this; // Not a fatal error, just ignore the packet. - return folly::unit; + return {}; } const ConnectionId* originalDstConnId = @@ -250,7 +248,7 @@ QuicClientTransportLite::processUdpPacketData( VLOG(4) << "The integrity tag in the retry packet was invalid. " << "Dropping bad retry packet. " << *this; // Not a fatal error, just ignore the packet. - return folly::unit; + return {}; } if (happyEyeballsEnabled_) { @@ -276,10 +274,10 @@ QuicClientTransportLite::processUdpPacketData( // upon receiving a subsequent initial from the server. auto handshakeResult = startCryptoHandshake(); - if (handshakeResult.hasError()) { - return folly::makeUnexpected(handshakeResult.error()); + if (!handshakeResult.has_value()) { + return quic::make_unexpected(handshakeResult.error()); } - return folly::unit; // Retry processed successfully + return {}; // Retry processed successfully } auto cipherUnavailable = parsedPacket.cipherUnavailable(); @@ -305,12 +303,12 @@ QuicClientTransportLite::processUdpPacketData( cipherUnavailable->protectionType, packetSize); } // Packet buffered, not an error - return folly::unit; + return {}; } auto codecError = parsedPacket.codecError(); if (codecError) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( *codecError->error.code.asTransportErrorCode(), std::move(codecError->error.message))); } @@ -325,7 +323,7 @@ QuicClientTransportLite::processUdpPacketData( } // If this was a protocol violation, we would return a codec error instead. // Ignore this case as something that caused a non-codec parse error. - return folly::unit; + return {}; } if (regularOptional->frames.empty()) { @@ -342,7 +340,7 @@ QuicClientTransportLite::processUdpPacketData( packetSize, PacketDropReason(PacketDropReason::PROTOCOL_VIOLATION)._to_string()); } - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::PROTOCOL_VIOLATION, "Packet has no frames")); } @@ -377,7 +375,7 @@ QuicClientTransportLite::processUdpPacketData( auto isPing = quicFrame.asPingFrame(); // TODO: add path challenge and response if (!isPadding && !isAck && !isClose && !isCrypto && !isPing) { - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(TransportErrorCode::PROTOCOL_VIOLATION, "Invalid frame")); } } @@ -406,7 +404,7 @@ QuicClientTransportLite::processUdpPacketData( connidMatched = false; } if (!connidMatched) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::PROTOCOL_VIOLATION, "Invalid connection id")); } @@ -440,7 +438,7 @@ QuicClientTransportLite::processUdpPacketData( AckedFrameVisitor ackedFrameVisitor = [&](const OutstandingPacketWrapper& outstandingPacket, const QuicWriteFrame& packetFrame) - -> folly::Expected { + -> quic::Expected { auto outstandingProtectionType = outstandingPacket.packet.header.getProtectionType(); switch (packetFrame.type()) { @@ -469,8 +467,8 @@ QuicClientTransportLite::processUdpPacketData( auto ackedStreamResult = conn_->streamManager->getStream(frame.streamId); - if (ackedStreamResult.hasError()) { - return folly::makeUnexpected(ackedStreamResult.error()); + if (!ackedStreamResult.has_value()) { + return quic::make_unexpected(ackedStreamResult.error()); } auto& ackedStream = ackedStreamResult.value(); VLOG(4) << "Client got ack for stream=" << frame.streamId @@ -498,7 +496,7 @@ QuicClientTransportLite::processUdpPacketData( // ignore other frames. break; } - return folly::unit; + return {}; }; for (auto& quicFrame : regularPacket.frames) { @@ -510,14 +508,14 @@ QuicClientTransportLite::processUdpPacketData( if (ackFrame.frameType == FrameType::ACK_EXTENDED && !conn_->transportSettings.advertisedExtendedAckFeatures) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::PROTOCOL_VIOLATION, "Received unexpected ACK_EXTENDED frame")); } else if ( ackFrame.frameType == FrameType::ACK_RECEIVE_TIMESTAMPS && !conn_->transportSettings .maybeAckReceiveTimestampsConfigSentToPeer) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::PROTOCOL_VIOLATION, "Received unexpected ACK_RECEIVE_TIMESTAMPS frame")); } @@ -530,8 +528,8 @@ QuicClientTransportLite::processUdpPacketData( ackedFrameVisitor, markPacketLoss, udpPacket.timings.receiveTimePoint); - if (result.hasError()) { - return folly::makeUnexpected(result.error()); + if (!result.has_value()) { + return quic::make_unexpected(result.error()); } conn_->lastProcessedAckEvents.emplace_back(std::move(result.value())); break; @@ -542,22 +540,22 @@ QuicClientTransportLite::processUdpPacketData( << *this; if (frame.reliableSize.has_value()) { // We're not yet supporting the handling of RESET_STREAM_AT frames - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::PROTOCOL_VIOLATION, "Reliable resets not supported")); } pktHasRetransmittableData = true; auto streamResult = conn_->streamManager->getStream(frame.streamId); - if (streamResult.hasError()) { - return folly::makeUnexpected(streamResult.error()); + if (!streamResult.has_value()) { + return quic::make_unexpected(streamResult.error()); } auto& stream = streamResult.value(); if (!stream) { break; } auto rstResult = receiveRstStreamSMHandler(*stream, frame); - if (rstResult.hasError()) { - return folly::makeUnexpected(rstResult.error()); + if (!rstResult.has_value()) { + return quic::make_unexpected(rstResult.error()); } break; } @@ -572,8 +570,8 @@ QuicClientTransportLite::processUdpPacketData( *getCryptoStream(*conn_->cryptoState, encryptionLevel), StreamBuffer( std::move(cryptoFrame.data), cryptoFrame.offset, false)); - if (appendResult.hasError()) { - return folly::makeUnexpected(appendResult.error()); + if (!appendResult.has_value()) { + return quic::make_unexpected(appendResult.error()); } break; } @@ -585,8 +583,8 @@ QuicClientTransportLite::processUdpPacketData( << " fin=" << frame.fin << " packetNum=" << packetNum << " " << *this; auto streamResult = conn_->streamManager->getStream(frame.streamId); - if (streamResult.hasError()) { - return folly::makeUnexpected(streamResult.error()); + if (!streamResult.has_value()) { + return quic::make_unexpected(streamResult.error()); } auto& stream = streamResult.value(); pktHasRetransmittableData = true; @@ -597,8 +595,8 @@ QuicClientTransportLite::processUdpPacketData( } auto readResult = receiveReadStreamFrameSMHandler(*stream, std::move(frame)); - if (readResult.hasError()) { - return folly::makeUnexpected(readResult.error()); + if (!readResult.has_value()) { + return quic::make_unexpected(readResult.error()); } break; } @@ -628,15 +626,15 @@ QuicClientTransportLite::processUdpPacketData( << " offset=" << streamWindowUpdate.maximumData << " " << *this; if (isReceivingStream(conn_->nodeType, streamWindowUpdate.streamId)) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_STATE_ERROR, "Received MaxStreamDataFrame for receiving stream.")); } pktHasRetransmittableData = true; auto streamResult = conn_->streamManager->getStream(streamWindowUpdate.streamId); - if (streamResult.hasError()) { - return folly::makeUnexpected(streamResult.error()); + if (!streamResult.has_value()) { + return quic::make_unexpected(streamResult.error()); } auto& stream = streamResult.value(); if (stream) { @@ -659,8 +657,8 @@ QuicClientTransportLite::processUdpPacketData( << *this; pktHasRetransmittableData = true; auto streamResult = conn_->streamManager->getStream(blocked.streamId); - if (streamResult.hasError()) { - return folly::makeUnexpected(streamResult.error()); + if (!streamResult.has_value()) { + return quic::make_unexpected(streamResult.error()); } auto& stream = streamResult.value(); if (stream) { @@ -691,7 +689,7 @@ QuicClientTransportLite::processUdpPacketData( QuicError(QuicErrorCode(connFrame.errorCode), std::move(errMsg)); // We don't return an error here, as receiving a close triggers the // peer connection error path instead of the local error path. - return folly::unit; + return {}; } case QuicFrame::Type::PingFrame: // Ping isn't retransmittable. But we would like to ack them early. @@ -710,8 +708,8 @@ QuicClientTransportLite::processUdpPacketData( longHeader ? longHeader->getDestinationConnId() : shortHeader->getConnectionId(), false); - if (updateResult.hasError()) { - return folly::makeUnexpected(updateResult.error()); + if (!updateResult.has_value()) { + return quic::make_unexpected(updateResult.error()); } break; } @@ -729,7 +727,7 @@ QuicClientTransportLite::processUdpPacketData( if (!conn_->transportSettings.minAckDelay.has_value()) { // We do not accept IMMEDIATE_ACK frames. This is a protocol // violation. - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::PROTOCOL_VIOLATION, "Received IMMEDIATE_ACK frame without announcing min_ack_delay")); } @@ -755,7 +753,10 @@ QuicClientTransportLite::processUdpPacketData( } maybeScheduleAckForCongestionFeedback(udpPacket, ackState); - maybeHandleIncomingKeyUpdate(*conn_); + if (auto handleKeyUpdate = maybeHandleIncomingKeyUpdate(*conn_); + !handleKeyUpdate.has_value()) { + return quic::make_unexpected(handleKeyUpdate.error()); + } // Try reading bytes off of crypto, and performing a handshake. auto cryptoData = readDataFromCryptoStream( @@ -764,8 +765,8 @@ QuicClientTransportLite::processUdpPacketData( bool hadOneRttKey = conn_->oneRttWriteCipher != nullptr; auto handshakeResult = handshakeLayer->doHandshake(std::move(cryptoData), encryptionLevel); - if (handshakeResult.hasError()) { - return folly::makeUnexpected(handshakeResult.error()); + if (!handshakeResult.has_value()) { + return quic::make_unexpected(handshakeResult.error()); } bool oneRttKeyDerivationTriggered = false; if (!hadOneRttKey && conn_->oneRttWriteCipher) { @@ -786,7 +787,7 @@ QuicClientTransportLite::processUdpPacketData( QUIC_STATS(conn_->statsCallback, onZeroRttRejected); handshakeLayer->removePsk(hostname_); if (!handshakeLayer->getCanResendZeroRtt().value_or(false)) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::TRANSPORT_PARAMETER_ERROR, "Zero-rtt attempted but the early parameters do not match the handshake parameters")); } @@ -804,7 +805,7 @@ QuicClientTransportLite::processUdpPacketData( if (oneRttKeyDerivationTriggered) { const auto& serverParams = handshakeLayer->getServerTransportParams(); if (!serverParams) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::TRANSPORT_PARAMETER_ERROR, "No server transport params")); } @@ -825,21 +826,21 @@ QuicClientTransportLite::processUdpPacketData( auto maxStreamsBidi = getIntegerParameter( TransportParameterId::initial_max_streams_bidi, serverParams->parameters); - if (maxStreamsBidi.hasError()) { - return folly::makeUnexpected(maxStreamsBidi.error()); + if (!maxStreamsBidi.has_value()) { + return quic::make_unexpected(maxStreamsBidi.error()); } auto maxStreamsUni = getIntegerParameter( TransportParameterId::initial_max_streams_uni, serverParams->parameters); - if (maxStreamsUni.hasError()) { - return folly::makeUnexpected(maxStreamsUni.error()); + if (!maxStreamsUni.has_value()) { + return quic::make_unexpected(maxStreamsUni.error()); } auto processResult = processServerInitialParams( *clientConn_, serverParams.value(), packetNum); - if (processResult.hasError()) { - return folly::makeUnexpected(processResult.error()); + if (!processResult.has_value()) { + return quic::make_unexpected(processResult.error()); } cacheServerInitialParams( @@ -884,7 +885,7 @@ QuicClientTransportLite::processUdpPacketData( originalPeerInitialStreamOffsetUni > conn_->flowControlState .peerAdvertisedInitialMaxStreamOffsetUni) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::TRANSPORT_PARAMETER_ERROR, "Rejection of zero rtt parameters unsupported")); } @@ -899,7 +900,7 @@ QuicClientTransportLite::processUdpPacketData( !*clientConn_->zeroRttRejected) { auto updatedPacketSize = getIntegerParameter( TransportParameterId::max_packet_size, serverParams->parameters); - uint64_t newPacketSize = updatedPacketSize.hasError() + uint64_t newPacketSize = !updatedPacketSize.has_value() ? kDefaultUDPSendPacketLen : updatedPacketSize.value().value_or(kDefaultUDPSendPacketLen); newPacketSize = @@ -914,7 +915,7 @@ QuicClientTransportLite::processUdpPacketData( if (!clientConn_->statelessResetToken) { auto statelessResetTokenResult = getStatelessResetTokenParameter(serverParams->parameters); - if (!statelessResetTokenResult.hasError()) { + if (statelessResetTokenResult.has_value()) { clientConn_->statelessResetToken = statelessResetTokenResult.value(); } } @@ -934,7 +935,7 @@ QuicClientTransportLite::processUdpPacketData( clientConn_->zeroRttWriteCipher.reset(); clientConn_->zeroRttWriteHeaderCipher.reset(); auto result = markZeroRttPacketsLost(*conn_, markPacketLoss); - if (result.hasError()) { + if (!result.has_value()) { return result; } } @@ -954,10 +955,10 @@ QuicClientTransportLite::processUdpPacketData( implicitAckCryptoStream(*conn_, EncryptionLevel::Initial); } - return folly::unit; + return {}; } -folly::Expected QuicClientTransportLite::onReadData( +quic::Expected QuicClientTransportLite::onReadData( const folly::SocketAddress& peer, ReceivedUdpPacket&& udpPacket) { if (closeState_ == CloseState::CLOSED) { @@ -967,11 +968,11 @@ folly::Expected QuicClientTransportLite::onReadData( if (conn_->qLogger) { conn_->qLogger->addPacketDrop(0, kAlreadyClosed); } - return folly::unit; + return {}; } bool waitingForFirstPacket = !hasReceivedUdpPackets(*conn_); auto res = processUdpPacket(peer, std::move(udpPacket)); - if (res.hasError()) { + if (!res.has_value()) { return res; } if (connSetupCallback_ && waitingForFirstPacket && @@ -994,18 +995,18 @@ folly::Expected QuicClientTransportLite::onReadData( // We don't need this any more. Also unset it so that we don't allow random // middleboxes to shutdown our connection once we have crypto keys. auto result = socket_->setErrMessageCallback(nullptr); - if (result.hasError()) { - return folly::makeUnexpected(result.error()); + if (!result.has_value()) { + return quic::make_unexpected(result.error()); } connSetupCallback_->onReplaySafe(); } auto result = maybeSendTransportKnobs(); - if (result.hasError()) { + if (!result.has_value()) { return result; } - return folly::unit; + return {}; } QuicSocketLite::WriteResult QuicClientTransportLite::writeBufMeta( @@ -1013,17 +1014,17 @@ QuicSocketLite::WriteResult QuicClientTransportLite::writeBufMeta( const BufferMeta& /* data */, bool /* eof */, ByteEventCallback* /* cb */) { - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } QuicSocketLite::WriteResult QuicClientTransportLite::setDSRPacketizationRequestSender( StreamId /* id */, std::unique_ptr /* sender */) { - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } -folly::Expected QuicClientTransportLite::writeData() { +quic::Expected QuicClientTransportLite::writeData() { QuicVersion version = conn_->version.value_or(*conn_->originalVersion); const ConnectionId& srcConnId = *conn_->clientConnectionId; const ConnectionId& destConnId = conn_->serverConnectionId.value_or( @@ -1035,7 +1036,7 @@ folly::Expected QuicClientTransportLite::writeData() { : clientConn_->lossState.srtt; if (clientConn_->lastCloseSentTime && Clock::now() - *clientConn_->lastCloseSentTime < rtt) { - return folly::unit; + return {}; } clientConn_->lastCloseSentTime = Clock::now(); if (clientConn_->clientHandshakeLayer->getPhase() == @@ -1076,7 +1077,7 @@ folly::Expected QuicClientTransportLite::writeData() { *conn_->initialHeaderCipher, version); } - return folly::unit; + return {}; } uint64_t packetLimit = @@ -1094,23 +1095,23 @@ folly::Expected QuicClientTransportLite::writeData() { : clientConn_->retryToken; auto result = handleInitialWriteDataCommon(srcConnId, destConnId, packetLimit, token); - if (result.hasError()) { - return folly::makeUnexpected(result.error()); + if (!result.has_value()) { + return quic::make_unexpected(result.error()); } packetLimit -= result->packetsWritten; if (!packetLimit && !conn_->pendingEvents.anyProbePackets()) { - return folly::unit; + return {}; } } if (conn_->handshakeWriteCipher) { auto result = handleHandshakeWriteDataCommon(srcConnId, destConnId, packetLimit); - if (result.hasError()) { - return folly::makeUnexpected(result.error()); + if (!result.has_value()) { + return quic::make_unexpected(result.error()); } packetLimit -= result->packetsWritten; if (!packetLimit && !conn_->pendingEvents.anyProbePackets()) { - return folly::unit; + return {}; } } if (clientConn_->zeroRttWriteCipher && !conn_->oneRttWriteCipher) { @@ -1124,13 +1125,13 @@ folly::Expected QuicClientTransportLite::writeData() { *clientConn_->zeroRttWriteHeaderCipher, version, packetLimit); - if (result.hasError()) { - return folly::makeUnexpected(result.error()); + if (!result.has_value()) { + return quic::make_unexpected(result.error()); } packetLimit -= *result; } if (!packetLimit && !conn_->pendingEvents.anyProbePackets()) { - return folly::unit; + return {}; } if (conn_->oneRttWriteCipher) { CHECK(clientConn_->oneRttWriteHeaderCipher); @@ -1143,14 +1144,14 @@ folly::Expected QuicClientTransportLite::writeData() { *conn_->oneRttWriteHeaderCipher, version, packetLimit); - if (result.hasError()) { - return folly::makeUnexpected(result.error()); + if (!result.has_value()) { + return quic::make_unexpected(result.error()); } } return maybeInitiateKeyUpdate(*conn_); } -folly::Expected +quic::Expected QuicClientTransportLite::startCryptoHandshake() { auto self = this->shared_from_this(); setIdleTimer(); @@ -1166,31 +1167,31 @@ QuicClientTransportLite::startCryptoHandshake() { auto version = conn_->originalVersion.value(); auto initialWriteCipherResult = cryptoFactory.getClientInitialCipher( *clientConn_->initialDestinationConnectionId, version); - if (initialWriteCipherResult.hasError()) { - return folly::makeUnexpected(initialWriteCipherResult.error()); + if (!initialWriteCipherResult.has_value()) { + return quic::make_unexpected(initialWriteCipherResult.error()); } conn_->initialWriteCipher = std::move(initialWriteCipherResult.value()); auto serverInitialCipherResult = cryptoFactory.getServerInitialCipher( *clientConn_->initialDestinationConnectionId, version); - if (serverInitialCipherResult.hasError()) { - return folly::makeUnexpected(serverInitialCipherResult.error()); + if (!serverInitialCipherResult.has_value()) { + return quic::make_unexpected(serverInitialCipherResult.error()); } conn_->readCodec->setInitialReadCipher( std::move(serverInitialCipherResult.value())); auto serverHeaderCipherResult = cryptoFactory.makeServerInitialHeaderCipher( *clientConn_->initialDestinationConnectionId, version); - if (serverHeaderCipherResult.hasError()) { - return folly::makeUnexpected(serverHeaderCipherResult.error()); + if (!serverHeaderCipherResult.has_value()) { + return quic::make_unexpected(serverHeaderCipherResult.error()); } conn_->readCodec->setInitialHeaderCipher( std::move(serverHeaderCipherResult.value())); auto clientHeaderCipherResult = cryptoFactory.makeClientInitialHeaderCipher( *clientConn_->initialDestinationConnectionId, version); - if (clientHeaderCipherResult.hasError()) { - return folly::makeUnexpected(clientHeaderCipherResult.error()); + if (!clientHeaderCipherResult.has_value()) { + return quic::make_unexpected(clientHeaderCipherResult.error()); } conn_->initialHeaderCipher = std::move(clientHeaderCipherResult.value()); @@ -1219,13 +1220,13 @@ QuicClientTransportLite::startCryptoHandshake() { conn_->transportParametersEncoded = true; auto connectResult = handshakeLayer->connect(hostname_, std::move(paramsExtension)); - if (connectResult.hasError()) { - return folly::makeUnexpected(connectResult.error()); + if (!connectResult.has_value()) { + return quic::make_unexpected(connectResult.error()); } auto writeResult = writeSocketData(); - if (writeResult.hasError()) { - return folly::makeUnexpected(writeResult.error()); + if (!writeResult.has_value()) { + return quic::make_unexpected(writeResult.error()); } if (!transportReadyNotified_ && clientConn_->zeroRttWriteCipher) { @@ -1245,7 +1246,7 @@ QuicClientTransportLite::startCryptoHandshake() { } } - return folly::unit; + return {}; } bool QuicClientTransportLite::hasWriteCipher() const { @@ -1338,7 +1339,7 @@ bool QuicClientTransportLite::shouldOnlyNotify() { return true; } -folly::Expected QuicClientTransportLite::recvMsg( +quic::Expected QuicClientTransportLite::recvMsg( QuicAsyncUDPSocket& sock, uint64_t readBufferSize, int numPackets, @@ -1360,8 +1361,8 @@ folly::Expected QuicClientTransportLite::recvMsg( if (!server) { rawAddr = reinterpret_cast(&addrStorage); auto familyResult = sock.getLocalAddressFamily(); - if (familyResult.hasError()) { - return folly::makeUnexpected(QuicError( + if (!familyResult.has_value()) { + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), fmt::format( "Failed to get address family: {}", @@ -1385,7 +1386,7 @@ folly::Expected QuicClientTransportLite::recvMsg( bool recvTos = false; auto groResult = sock.getGRO(); - if (groResult.hasError()) { + if (!groResult.has_value()) { // Non-fatal, just log and continue LOG(WARNING) << "Failed to get GRO status: " << groResult.error().message; } else { @@ -1393,7 +1394,7 @@ folly::Expected QuicClientTransportLite::recvMsg( } auto tsResult = sock.getTimestamping(); - if (tsResult.hasError()) { + if (!tsResult.has_value()) { // Non-fatal, just log and continue LOG(WARNING) << "Failed to get timestamping status: " << tsResult.error().message; @@ -1402,7 +1403,7 @@ folly::Expected QuicClientTransportLite::recvMsg( } auto tosResult = sock.getRecvTos(); - if (tosResult.hasError()) { + if (!tosResult.has_value()) { // Non-fatal, just log and continue LOG(WARNING) << "Failed to get TOS status: " << tosResult.error().message; } else { @@ -1438,7 +1439,7 @@ folly::Expected QuicClientTransportLite::recvMsg( if (conn_->loopDetectorCallback) { conn_->readDebugState.noReadReason = NoReadReason::NONRETRIABLE_ERROR; } - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(LocalErrorCode::CONNECTION_ABANDONED), fmt::format( "recvmsg() failed, errno={} {}", errno, folly::errnoStr(errno)))); @@ -1512,10 +1513,10 @@ folly::Expected QuicClientTransportLite::recvMsg( trackDatagramsReceived( networkData.getPackets().size(), networkData.getTotalData()); - return folly::unit; + return {}; } -folly::Expected QuicClientTransportLite::recvMmsg( +quic::Expected QuicClientTransportLite::recvMmsg( QuicAsyncUDPSocket& sock, uint64_t readBufferSize, uint16_t numPackets, @@ -1526,8 +1527,8 @@ folly::Expected QuicClientTransportLite::recvMmsg( int flags = 0; #ifdef FOLLY_HAVE_MSG_ERRQUEUE auto groResult = sock.getGRO(); - if (groResult.hasError()) { - return folly::makeUnexpected(QuicError( + if (!groResult.has_value()) { + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), fmt::format( "Failed to get GRO status: {}", groResult.error().message))); @@ -1535,8 +1536,8 @@ folly::Expected QuicClientTransportLite::recvMmsg( bool useGRO = groResult.value() > 0; auto tsResult = sock.getTimestamping(); - if (tsResult.hasError()) { - return folly::makeUnexpected(QuicError( + if (!tsResult.has_value()) { + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), fmt::format( "Failed to get timestamping status: {}", @@ -1545,8 +1546,8 @@ folly::Expected QuicClientTransportLite::recvMmsg( bool useTs = tsResult.value() > 0; auto tosResult = sock.getRecvTos(); - if (tosResult.hasError()) { - return folly::makeUnexpected(QuicError( + if (!tosResult.has_value()) { + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), fmt::format( "Failed to get TOS status: {}", tosResult.error().message))); @@ -1581,8 +1582,8 @@ folly::Expected QuicClientTransportLite::recvMmsg( auto* rawAddr = reinterpret_cast(&addr); auto addrResult = sock.address(); - if (addrResult.hasError()) { - return folly::makeUnexpected(QuicError( + if (!addrResult.has_value()) { + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), fmt::format( "Failed to get socket address: {}", addrResult.error().message))); @@ -1606,7 +1607,7 @@ folly::Expected QuicClientTransportLite::recvMmsg( if (conn_->loopDetectorCallback) { conn_->readDebugState.noReadReason = NoReadReason::RETRIABLE_ERROR; } - return folly::unit; + return {}; } // If we got a non-retriable error, we might have received // a packet that we could process, however let's just quit early. @@ -1614,7 +1615,7 @@ folly::Expected QuicClientTransportLite::recvMmsg( if (conn_->loopDetectorCallback) { conn_->readDebugState.noReadReason = NoReadReason::NONRETRIABLE_ERROR; } - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), fmt::format( "recvmmsg() failed, errno={} {}", errno, folly::errnoStr(errno)))); @@ -1703,10 +1704,10 @@ folly::Expected QuicClientTransportLite::recvMmsg( trackDatagramsReceived( networkData.getPackets().size(), networkData.getTotalData()); - return folly::unit; + return {}; } -folly::Expected QuicClientTransportLite::processPackets( +quic::Expected QuicClientTransportLite::processPackets( NetworkData&& networkData, const Optional& server) { if (networkData.getPackets().empty()) { @@ -1721,7 +1722,7 @@ folly::Expected QuicClientTransportLite::processPackets( conn_->readDebugState.noReadReason); } } - return folly::unit; + return {}; } DCHECK(server.has_value()); // TODO: we can get better receive time accuracy than this, with @@ -1730,10 +1731,10 @@ folly::Expected QuicClientTransportLite::processPackets( networkData.setReceiveTimePoint(packetReceiveTime); onNetworkData(*server, std::move(networkData)); - return folly::unit; + return {}; } -folly::Expected +quic::Expected QuicClientTransportLite::readWithRecvmsgSinglePacketLoop( QuicAsyncUDPSocket& sock, uint64_t readBufferSize) { @@ -1751,13 +1752,13 @@ QuicClientTransportLite::readWithRecvmsgSinglePacketLoop( server, totalData); - if (recvResult.hasError()) { + if (!recvResult.has_value()) { return recvResult; } if (!socket_) { // Socket has been closed. - return folly::unit; + return {}; } if (networkDataSinglePacket.getPackets().size() == 0) { @@ -1766,13 +1767,13 @@ QuicClientTransportLite::readWithRecvmsgSinglePacketLoop( auto processResult = processPackets(std::move(networkDataSinglePacket), server); - if (processResult.hasError()) { + if (!processResult.has_value()) { return processResult; } if (!socket_) { // Socket has been closed. - return folly::unit; + return {}; } } @@ -1783,7 +1784,7 @@ QuicClientTransportLite::readWithRecvmsgSinglePacketLoop( updateReadLooper(); updateWriteLooper(true); - return folly::unit; + return {}; } void QuicClientTransportLite::onNotifyDataAvailable( @@ -1799,7 +1800,7 @@ void QuicClientTransportLite::onNotifyDataAvailable( : readBufferSize; auto result = readWithRecvmsgSinglePacketLoop(sock, readAllocSize); - if (result.hasError()) { + if (!result.has_value()) { asyncClose(result.error()); } } @@ -1813,7 +1814,8 @@ void QuicClientTransportLite:: // to the outstanding packet list yet. runOnEvbAsync([&](auto) { auto result = markZeroRttPacketsLost(*conn_, markPacketLoss); - LOG_IF(ERROR, result.hasError()) << "Failed to mark 0-RTT packets as lost."; + LOG_IF(ERROR, !result.has_value()) + << "Failed to mark 0-RTT packets as lost."; }); } @@ -1857,19 +1859,19 @@ void QuicClientTransportLite::start( this, socketOptions_); - if (socketResult.hasError()) { + if (!socketResult.has_value()) { asyncClose(socketResult.error()); return; } auto adjustResult = adjustGROBuffers(); - if (adjustResult.hasError()) { + if (!adjustResult.has_value()) { asyncClose(adjustResult.error()); return; } auto handshakeResult = startCryptoHandshake(); - if (handshakeResult.hasError()) { + if (!handshakeResult.has_value()) { asyncClose(handshakeResult.error()); return; } @@ -1924,23 +1926,22 @@ void QuicClientTransportLite::setSelfOwning() { selfOwning_ = shared_from_this(); } -folly::Expected -QuicClientTransportLite::adjustGROBuffers() { +quic::Expected QuicClientTransportLite::adjustGROBuffers() { if (socket_ && conn_) { if (conn_->transportSettings.numGROBuffers_ > kDefaultNumGROBuffers) { auto setResult = socket_->setGRO(true); - if (setResult.hasError()) { + if (!setResult.has_value()) { // Not a fatal error, just log and continue with default buffers LOG(WARNING) << "Failed to enable GRO: " << setResult.error().message; - return folly::unit; + return {}; } auto groResult = socket_->getGRO(); - if (groResult.hasError()) { + if (!groResult.has_value()) { // Not a fatal error, just log and continue with default buffers LOG(WARNING) << "Failed to get GRO status: " << groResult.error().message; - return folly::unit; + return {}; } if (groResult.value() > 0) { @@ -1951,7 +1952,7 @@ QuicClientTransportLite::adjustGROBuffers() { } } } - return folly::unit; + return {}; } void QuicClientTransportLite::closeTransport() { @@ -2001,12 +2002,12 @@ void QuicClientTransportLite::onNetworkSwitch( if (socket_ && newSock) { auto sock = std::move(socket_); socket_ = nullptr; - if (auto err = sock->setErrMessageCallback(nullptr); err.hasError()) { + if (auto err = sock->setErrMessageCallback(nullptr); !err.has_value()) { asyncClose(err.error()); return; } sock->pauseRead(); - if (auto err = sock->close(); err.hasError()) { + if (auto err = sock->close(); !err.has_value()) { asyncClose(err.error()); return; } @@ -2014,7 +2015,7 @@ void QuicClientTransportLite::onNetworkSwitch( socket_ = std::move(newSock); if (auto err = socket_->setAdditionalCmsgsFunc( [&]() { return getAdditionalCmsgsForAsyncUDPSocket(); }); - err.hasError()) { + !err.has_value()) { asyncClose(err.error()); return; } @@ -2027,7 +2028,7 @@ void QuicClientTransportLite::onNetworkSwitch( this, this, socketOptions_); - if (setupResult.hasError()) { + if (!setupResult.has_value()) { asyncClose(setupResult.error()); return; } @@ -2036,7 +2037,7 @@ void QuicClientTransportLite::onNetworkSwitch( } auto adjustResult = adjustGROBuffers(); - if (adjustResult.hasError()) { + if (!adjustResult.has_value()) { asyncClose(adjustResult.error()); } } @@ -2067,16 +2068,16 @@ void QuicClientTransportLite::trackDatagramsReceived( QUIC_STATS(statsCallback_, onRead, totalPacketLen); } -folly::Expected +quic::Expected QuicClientTransportLite::maybeSendTransportKnobs() { if (!transportKnobsSent_ && hasWriteCipher()) { for (const auto& knob : conn_->transportSettings.knobs) { auto res = setKnob(knob.space, knob.id, BufHelpers::copyBuffer(knob.blob)); - if (res.hasError()) { + if (!res.has_value()) { if (res.error() != LocalErrorCode::KNOB_FRAME_UNSUPPORTED) { LOG(ERROR) << "Unexpected error while sending knob frames"; - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(res.error()), "Unexpected error while sending knob frames")); } @@ -2086,7 +2087,7 @@ QuicClientTransportLite::maybeSendTransportKnobs() { } transportKnobsSent_ = true; } - return folly::unit; + return {}; } Optional> diff --git a/quic/client/QuicClientTransportLite.h b/quic/client/QuicClientTransportLite.h index 9f3323544..52a72ce9b 100644 --- a/quic/client/QuicClientTransportLite.h +++ b/quic/client/QuicClientTransportLite.h @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -157,10 +158,10 @@ class QuicClientTransportLite bool hasZeroRttWriteCipher() const; // From QuicTransportBase - folly::Expected onReadData( + quic::Expected onReadData( const folly::SocketAddress& peer, ReceivedUdpPacket&& udpPacket) override; - folly::Expected writeData() override; + quic::Expected writeData() override; void closeTransport() override; void unbindConnection() override; bool hasWriteCipher() const override; @@ -285,7 +286,7 @@ class QuicClientTransportLite bool shouldOnlyNotify() override; void onNotifyDataAvailable(QuicAsyncUDPSocket& sock) noexcept override; - [[nodiscard]] folly::Expected recvMsg( + [[nodiscard]] quic::Expected recvMsg( QuicAsyncUDPSocket& sock, uint64_t readBufferSize, int numPackets, @@ -293,7 +294,7 @@ class QuicClientTransportLite Optional& server, size_t& totalData); - [[nodiscard]] folly::Expected recvMmsg( + [[nodiscard]] quic::Expected recvMmsg( QuicAsyncUDPSocket& sock, uint64_t readBufferSize, uint16_t numPackets, @@ -311,7 +312,7 @@ class QuicClientTransportLite * @param peer The address of the remote peer. * @param networkData UDP packet. */ - folly::Expected processUdpPacket( + quic::Expected processUdpPacket( const folly::SocketAddress& peer, ReceivedUdpPacket&& udpPacket); @@ -333,12 +334,12 @@ class QuicClientTransportLite * Bytes transformed into a QUIC packet will be * removed from this buffer. */ - folly::Expected processUdpPacketData( + quic::Expected processUdpPacketData( const folly::SocketAddress& peer, ReceivedUdpPacket& udpPacket); [[nodiscard]] - folly::Expected startCryptoHandshake(); + quic::Expected startCryptoHandshake(); void happyEyeballsConnAttemptDelayTimeoutExpired() noexcept; @@ -347,12 +348,11 @@ class QuicClientTransportLite const QuicWriteFrame& packetFrame, const ReadAckFrame&); - [[nodiscard]] virtual folly::Expected processPackets( + [[nodiscard]] virtual quic::Expected processPackets( NetworkData&& networkData, const Optional& server); - [[nodiscard]] folly::Expected - readWithRecvmsgSinglePacketLoop( + [[nodiscard]] quic::Expected readWithRecvmsgSinglePacketLoop( QuicAsyncUDPSocket& sock, uint64_t readBufferSize); @@ -391,7 +391,7 @@ class QuicClientTransportLite RecvmmsgStorage recvmmsgStorage_; private: - [[nodiscard]] folly::Expected adjustGROBuffers(); + [[nodiscard]] quic::Expected adjustGROBuffers(); void runOnEvbAsync( std::function)> func); @@ -400,7 +400,7 @@ class QuicClientTransportLite * Send quic transport knobs defined by transportSettings.knobs to peer. This * calls setKnobs() internally. */ - folly::Expected maybeSendTransportKnobs(); + quic::Expected maybeSendTransportKnobs(); bool replaySafeNotified_{false}; // Set it QuicClientTransportLite is in a self owning mode. This will be diff --git a/quic/client/handshake/ClientHandshake.cpp b/quic/client/handshake/ClientHandshake.cpp index 8de1e1caa..a0615ab1c 100644 --- a/quic/client/handshake/ClientHandshake.cpp +++ b/quic/client/handshake/ClientHandshake.cpp @@ -17,20 +17,20 @@ namespace quic { ClientHandshake::ClientHandshake(QuicClientConnectionState* conn) : conn_(conn) {} -folly::Expected ClientHandshake::connect( +quic::Expected ClientHandshake::connect( Optional hostname, std::shared_ptr transportParams) { transportParams_ = std::move(transportParams); auto cachedServerTransportParamsResult = connectImpl(std::move(hostname)); - if (cachedServerTransportParamsResult.hasError()) { - return folly::makeUnexpected(cachedServerTransportParamsResult.error()); + if (!cachedServerTransportParamsResult.has_value()) { + return quic::make_unexpected(cachedServerTransportParamsResult.error()); } Optional cachedServerTransportParams = std::move(cachedServerTransportParamsResult.value()); - if (error_.hasError()) { + if (!error_.has_value()) { return error_; } @@ -57,19 +57,19 @@ folly::Expected ClientHandshake::connect( cachedServerTransportParams->extendedAckFeatures); auto result = updateTransportParamsFromCachedEarlyParams( *conn_, *cachedServerTransportParams); - if (result.hasError()) { + if (!result.has_value()) { // Why are we not returning here? - error_ = folly::makeUnexpected(std::move(result.error())); + error_ = quic::make_unexpected(std::move(result.error())); } } - return folly::unit; + return {}; } -folly::Expected ClientHandshake::doHandshake( +quic::Expected ClientHandshake::doHandshake( quic::BufPtr data, EncryptionLevel encryptionLevel) { if (!data) { - return folly::unit; + return {}; } // TODO: deal with clear text alert messages. It's possible that a MITM who // mucks with the finished messages could cause the decryption to be invalid @@ -114,11 +114,11 @@ folly::Expected ClientHandshake::doHandshake( default: LOG(FATAL) << "Unhandled EncryptionLevel"; } - if (error_.hasError()) { + if (!error_.has_value()) { return std::move(error_); } } - return folly::unit; + return {}; } void ClientHandshake::handshakeConfirmed() { @@ -160,13 +160,13 @@ bool ClientHandshake::waitingForData() const { void ClientHandshake::computeCiphers(CipherKind kind, ByteRange secret) { auto aeadResult = buildAead(kind, secret); - if (aeadResult.hasError()) { - error_ = folly::makeUnexpected(std::move(aeadResult.error())); + if (!aeadResult.has_value()) { + error_ = quic::make_unexpected(std::move(aeadResult.error())); return; } auto packetNumberCipherResult = buildHeaderCipher(secret); - if (packetNumberCipherResult.hasError()) { - error_ = folly::makeUnexpected(std::move(packetNumberCipherResult.error())); + if (!packetNumberCipherResult.has_value()) { + error_ = quic::make_unexpected(std::move(packetNumberCipherResult.error())); return; } @@ -193,8 +193,8 @@ void ClientHandshake::computeCiphers(CipherKind kind, ByteRange secret) { conn_->readCodec->setOneRttReadCipher(std::move(aead)); conn_->readCodec->setOneRttHeaderCipher(std::move(packetNumberCipher)); auto nextOneRttReadCipher = getNextOneRttReadCipher(); - if (nextOneRttReadCipher.hasError()) { - error_ = folly::makeUnexpected(std::move(nextOneRttReadCipher.error())); + if (!nextOneRttReadCipher.has_value()) { + error_ = quic::make_unexpected(std::move(nextOneRttReadCipher.error())); return; } conn_->readCodec->setNextOneRttReadCipher( @@ -211,10 +211,10 @@ void ClientHandshake::computeCiphers(CipherKind kind, ByteRange secret) { } } -folly::Expected, QuicError> +quic::Expected, QuicError> ClientHandshake::getNextOneRttWriteCipher() { - if (error_.hasError()) { - return folly::makeUnexpected(std::move(error_.error())); + if (!error_.has_value()) { + return quic::make_unexpected(std::move(error_.error())); } CHECK(writeTrafficSecret_); @@ -222,8 +222,8 @@ ClientHandshake::getNextOneRttWriteCipher() { << "Client read and write secrets are out of sync"; auto nextSecretResult = getNextTrafficSecret(writeTrafficSecret_->coalesce()); - if (nextSecretResult.hasError()) { - return folly::makeUnexpected(std::move(nextSecretResult.error())); + if (!nextSecretResult.has_value()) { + return quic::make_unexpected(std::move(nextSecretResult.error())); } writeTrafficSecret_ = std::move(nextSecretResult.value()); trafficSecretSync_--; @@ -231,10 +231,10 @@ ClientHandshake::getNextOneRttWriteCipher() { return buildAead(CipherKind::OneRttWrite, writeTrafficSecret_->coalesce()); } -folly::Expected, QuicError> +quic::Expected, QuicError> ClientHandshake::getNextOneRttReadCipher() { - if (error_.hasError()) { - return folly::makeUnexpected(std::move(error_.error())); + if (!error_.has_value()) { + return quic::make_unexpected(std::move(error_.error())); } CHECK(readTrafficSecret_); @@ -242,8 +242,8 @@ ClientHandshake::getNextOneRttReadCipher() { << "Client read and write secrets are out of sync"; auto nextSecretResult = getNextTrafficSecret(readTrafficSecret_->coalesce()); - if (nextSecretResult.hasError()) { - return folly::makeUnexpected(std::move(nextSecretResult.error())); + if (!nextSecretResult.has_value()) { + return quic::make_unexpected(std::move(nextSecretResult.error())); } readTrafficSecret_ = std::move(nextSecretResult.value()); trafficSecretSync_++; @@ -298,7 +298,7 @@ void ClientHandshake::computeOneRttCipher(bool earlyDataAccepted) { } void ClientHandshake::setError(QuicError error) { - error_ = folly::makeUnexpected(std::move(error)); + error_ = quic::make_unexpected(std::move(error)); } QuicClientConnectionState* ClientHandshake::getClientConn() { diff --git a/quic/client/handshake/ClientHandshake.h b/quic/client/handshake/ClientHandshake.h index dce20b6f9..85629afe2 100644 --- a/quic/client/handshake/ClientHandshake.h +++ b/quic/client/handshake/ClientHandshake.h @@ -14,6 +14,7 @@ #include #include +#include #include #include @@ -34,7 +35,7 @@ class ClientHandshake : public Handshake { /** * Initiate the handshake with the supplied parameters. */ - [[nodiscard]] folly::Expected connect( + [[nodiscard]] quic::Expected connect( Optional hostname, std::shared_ptr transportParams); @@ -43,7 +44,7 @@ class ClientHandshake : public Handshake { * This can change the state of the transport which may result in ciphers * being initialized, bytes written out, or the write phase changing. */ - [[nodiscard]] virtual folly::Expected doHandshake( + [[nodiscard]] virtual quic::Expected doHandshake( BufPtr data, EncryptionLevel encryptionLevel); @@ -62,7 +63,7 @@ class ClientHandshake : public Handshake { * one rtt write cipher using the current traffic secret and advance the * traffic secret. */ - [[nodiscard]] folly::Expected, QuicError> + [[nodiscard]] quic::Expected, QuicError> getNextOneRttWriteCipher() override; /** @@ -70,7 +71,7 @@ class ClientHandshake : public Handshake { * one rtt read cipher using the current traffic secret and advance the * traffic secret. */ - [[nodiscard]] folly::Expected, QuicError> + [[nodiscard]] quic::Expected, QuicError> getNextOneRttReadCipher() override; /** @@ -102,8 +103,7 @@ class ClientHandshake : public Handshake { * API used to verify that the integrity token present in the retry packet * matches what we would expect */ - [[nodiscard]] virtual folly::Expected - verifyRetryIntegrityTag( + [[nodiscard]] virtual quic::Expected verifyRetryIntegrityTag( const ConnectionId& originalDstConnId, const RetryPacket& retryPacket) = 0; @@ -177,7 +177,7 @@ class ClientHandshake : public Handshake { * Given secret_n, returns secret_n+1 to be used for generating the next Aead * on key updates. */ - [[nodiscard]] virtual folly::Expected getNextTrafficSecret( + [[nodiscard]] virtual quic::Expected getNextTrafficSecret( ByteRange secret) const = 0; BufPtr readTrafficSecret_; @@ -187,15 +187,15 @@ class ClientHandshake : public Handshake { Optional canResendZeroRtt_; private: - [[nodiscard]] virtual folly:: + [[nodiscard]] virtual quic:: Expected, QuicError> connectImpl(Optional hostname) = 0; virtual void processSocketData(folly::IOBufQueue& queue) = 0; virtual bool matchEarlyParameters() = 0; - [[nodiscard]] virtual folly::Expected, QuicError> + [[nodiscard]] virtual quic::Expected, QuicError> buildAead(CipherKind kind, ByteRange secret) = 0; - [[nodiscard]] virtual folly:: + [[nodiscard]] virtual quic:: Expected, QuicError> buildHeaderCipher(ByteRange secret) = 0; @@ -219,7 +219,7 @@ class ClientHandshake : public Handshake { // transport's read and write ciphers are likely out of sync. int8_t trafficSecretSync_{0}; - folly::Expected error_{folly::unit}; + quic::Expected error_{}; }; } // namespace quic diff --git a/quic/client/handshake/ClientTransportParametersExtension.h b/quic/client/handshake/ClientTransportParametersExtension.h index 9a21e86ab..8f83403dd 100644 --- a/quic/client/handshake/ClientTransportParametersExtension.h +++ b/quic/client/handshake/ClientTransportParametersExtension.h @@ -7,8 +7,8 @@ #pragma once -#include #include +#include #include namespace quic { @@ -47,7 +47,7 @@ struct ClientTransportParametersExtension { return serverTransportParameters_; } - folly::Expected, QuicError> + quic::Expected, QuicError> getChloTransportParameters() { constexpr uint8_t kDefaultMinNumParams = 12; using TpId = TransportParameterId; @@ -58,72 +58,72 @@ struct ClientTransportParametersExtension { auto bidiLocalResult = encodeIntegerParameter( TpId::initial_max_stream_data_bidi_local, initialMaxStreamDataBidiLocal_); - if (bidiLocalResult.hasError()) { - return folly::makeUnexpected(bidiLocalResult.error()); + if (!bidiLocalResult.has_value()) { + return quic::make_unexpected(bidiLocalResult.error()); } res.push_back(std::move(bidiLocalResult.value())); auto bidiRemoteResult = encodeIntegerParameter( TpId::initial_max_stream_data_bidi_remote, initialMaxStreamDataBidiRemote_); - if (bidiRemoteResult.hasError()) { - return folly::makeUnexpected(bidiRemoteResult.error()); + if (!bidiRemoteResult.has_value()) { + return quic::make_unexpected(bidiRemoteResult.error()); } res.push_back(std::move(bidiRemoteResult.value())); auto uniResult = encodeIntegerParameter( TpId::initial_max_stream_data_uni, initialMaxStreamDataUni_); - if (uniResult.hasError()) { - return folly::makeUnexpected(uniResult.error()); + if (!uniResult.has_value()) { + return quic::make_unexpected(uniResult.error()); } res.push_back(std::move(uniResult.value())); auto maxDataResult = encodeIntegerParameter(TpId::initial_max_data, initialMaxData_); - if (maxDataResult.hasError()) { - return folly::makeUnexpected(maxDataResult.error()); + if (!maxDataResult.has_value()) { + return quic::make_unexpected(maxDataResult.error()); } res.push_back(std::move(maxDataResult.value())); auto streamsBidiResult = encodeIntegerParameter( TpId::initial_max_streams_bidi, initialMaxStreamsBidi_); - if (streamsBidiResult.hasError()) { - return folly::makeUnexpected(streamsBidiResult.error()); + if (!streamsBidiResult.has_value()) { + return quic::make_unexpected(streamsBidiResult.error()); } res.push_back(std::move(streamsBidiResult.value())); auto streamsUniResult = encodeIntegerParameter( TpId::initial_max_streams_uni, initialMaxStreamsUni_); - if (streamsUniResult.hasError()) { - return folly::makeUnexpected(streamsUniResult.error()); + if (!streamsUniResult.has_value()) { + return quic::make_unexpected(streamsUniResult.error()); } res.push_back(std::move(streamsUniResult.value())); auto idleTimeoutResult = encodeIntegerParameter(TpId::idle_timeout, idleTimeout_.count()); - if (idleTimeoutResult.hasError()) { - return folly::makeUnexpected(idleTimeoutResult.error()); + if (!idleTimeoutResult.has_value()) { + return quic::make_unexpected(idleTimeoutResult.error()); } res.push_back(std::move(idleTimeoutResult.value())); auto ackDelayResult = encodeIntegerParameter(TpId::ack_delay_exponent, ackDelayExponent_); - if (ackDelayResult.hasError()) { - return folly::makeUnexpected(ackDelayResult.error()); + if (!ackDelayResult.has_value()) { + return quic::make_unexpected(ackDelayResult.error()); } res.push_back(std::move(ackDelayResult.value())); auto maxPacketSizeResult = encodeIntegerParameter(TpId::max_packet_size, maxRecvPacketSize_); - if (maxPacketSizeResult.hasError()) { - return folly::makeUnexpected(maxPacketSizeResult.error()); + if (!maxPacketSizeResult.has_value()) { + return quic::make_unexpected(maxPacketSizeResult.error()); } res.push_back(std::move(maxPacketSizeResult.value())); auto activeConnLimitResult = encodeIntegerParameter( TpId::active_connection_id_limit, activeConnectionLimit_); - if (activeConnLimitResult.hasError()) { - return folly::makeUnexpected(activeConnLimitResult.error()); + if (!activeConnLimitResult.has_value()) { + return quic::make_unexpected(activeConnLimitResult.error()); } res.push_back(std::move(activeConnLimitResult.value())); diff --git a/quic/client/state/ClientStateMachine.cpp b/quic/client/state/ClientStateMachine.cpp index d56768f79..492d59d45 100644 --- a/quic/client/state/ClientStateMachine.cpp +++ b/quic/client/state/ClientStateMachine.cpp @@ -103,14 +103,14 @@ std::unique_ptr undoAllClientStateForRetry( return newConn; } -folly::Expected processServerInitialParams( +quic::Expected processServerInitialParams( QuicClientConnectionState& conn, const ServerTransportParameters& serverParams, PacketNum packetNum) { auto maxDataResult = getIntegerParameter( TransportParameterId::initial_max_data, serverParams.parameters); if (maxDataResult.hasError()) { - return folly::makeUnexpected(maxDataResult.error()); + return quic::make_unexpected(maxDataResult.error()); } auto maxData = maxDataResult.value(); @@ -118,7 +118,7 @@ folly::Expected processServerInitialParams( TransportParameterId::initial_max_stream_data_bidi_local, serverParams.parameters); if (maxStreamDataBidiLocalResult.hasError()) { - return folly::makeUnexpected(maxStreamDataBidiLocalResult.error()); + return quic::make_unexpected(maxStreamDataBidiLocalResult.error()); } auto maxStreamDataBidiLocal = maxStreamDataBidiLocalResult.value(); @@ -126,7 +126,7 @@ folly::Expected processServerInitialParams( TransportParameterId::initial_max_stream_data_bidi_remote, serverParams.parameters); if (maxStreamDataBidiRemoteResult.hasError()) { - return folly::makeUnexpected(maxStreamDataBidiRemoteResult.error()); + return quic::make_unexpected(maxStreamDataBidiRemoteResult.error()); } auto maxStreamDataBidiRemote = maxStreamDataBidiRemoteResult.value(); @@ -134,49 +134,49 @@ folly::Expected processServerInitialParams( TransportParameterId::initial_max_stream_data_uni, serverParams.parameters); if (maxStreamDataUniResult.hasError()) { - return folly::makeUnexpected(maxStreamDataUniResult.error()); + return quic::make_unexpected(maxStreamDataUniResult.error()); } auto maxStreamDataUni = maxStreamDataUniResult.value(); auto idleTimeoutResult = getIntegerParameter( TransportParameterId::idle_timeout, serverParams.parameters); if (idleTimeoutResult.hasError()) { - return folly::makeUnexpected(idleTimeoutResult.error()); + return quic::make_unexpected(idleTimeoutResult.error()); } auto idleTimeout = idleTimeoutResult.value(); auto maxStreamsBidiResult = getIntegerParameter( TransportParameterId::initial_max_streams_bidi, serverParams.parameters); if (maxStreamsBidiResult.hasError()) { - return folly::makeUnexpected(maxStreamsBidiResult.error()); + return quic::make_unexpected(maxStreamsBidiResult.error()); } auto maxStreamsBidi = maxStreamsBidiResult.value(); auto maxStreamsUniResult = getIntegerParameter( TransportParameterId::initial_max_streams_uni, serverParams.parameters); if (maxStreamsUniResult.hasError()) { - return folly::makeUnexpected(maxStreamsUniResult.error()); + return quic::make_unexpected(maxStreamsUniResult.error()); } auto maxStreamsUni = maxStreamsUniResult.value(); auto ackDelayExponentResult = getIntegerParameter( TransportParameterId::ack_delay_exponent, serverParams.parameters); if (ackDelayExponentResult.hasError()) { - return folly::makeUnexpected(ackDelayExponentResult.error()); + return quic::make_unexpected(ackDelayExponentResult.error()); } auto ackDelayExponent = ackDelayExponentResult.value(); auto packetSizeResult = getIntegerParameter( TransportParameterId::max_packet_size, serverParams.parameters); if (packetSizeResult.hasError()) { - return folly::makeUnexpected(packetSizeResult.error()); + return quic::make_unexpected(packetSizeResult.error()); } auto packetSize = packetSizeResult.value(); auto statelessResetTokenResult = getStatelessResetTokenParameter(serverParams.parameters); if (statelessResetTokenResult.hasError()) { - return folly::makeUnexpected(statelessResetTokenResult.error()); + return quic::make_unexpected(statelessResetTokenResult.error()); } auto statelessResetToken = statelessResetTokenResult.value(); @@ -184,14 +184,14 @@ folly::Expected processServerInitialParams( TransportParameterId::active_connection_id_limit, serverParams.parameters); if (activeConnectionIdLimitResult.hasError()) { - return folly::makeUnexpected(activeConnectionIdLimitResult.error()); + return quic::make_unexpected(activeConnectionIdLimitResult.error()); } auto activeConnectionIdLimit = activeConnectionIdLimitResult.value(); auto maxDatagramFrameSizeResult = getIntegerParameter( TransportParameterId::max_datagram_frame_size, serverParams.parameters); if (maxDatagramFrameSizeResult.hasError()) { - return folly::makeUnexpected(maxDatagramFrameSizeResult.error()); + return quic::make_unexpected(maxDatagramFrameSizeResult.error()); } auto maxDatagramFrameSize = maxDatagramFrameSizeResult.value(); @@ -200,7 +200,7 @@ folly::Expected processServerInitialParams( TransportParameterId::stream_groups_enabled), serverParams.parameters); if (peerAdvertisedMaxStreamGroupsResult.hasError()) { - return folly::makeUnexpected(peerAdvertisedMaxStreamGroupsResult.error()); + return quic::make_unexpected(peerAdvertisedMaxStreamGroupsResult.error()); } auto peerAdvertisedMaxStreamGroups = peerAdvertisedMaxStreamGroupsResult.value(); @@ -208,7 +208,7 @@ folly::Expected processServerInitialParams( auto minAckDelayResult = getIntegerParameter( TransportParameterId::min_ack_delay, serverParams.parameters); if (minAckDelayResult.hasError()) { - return folly::makeUnexpected(minAckDelayResult.error()); + return quic::make_unexpected(minAckDelayResult.error()); } auto minAckDelay = minAckDelayResult.value(); @@ -216,7 +216,7 @@ folly::Expected processServerInitialParams( TransportParameterId::ack_receive_timestamps_enabled, serverParams.parameters); if (isAckReceiveTimestampsEnabledResult.hasError()) { - return folly::makeUnexpected(isAckReceiveTimestampsEnabledResult.error()); + return quic::make_unexpected(isAckReceiveTimestampsEnabledResult.error()); } auto isAckReceiveTimestampsEnabled = isAckReceiveTimestampsEnabledResult.value(); @@ -225,7 +225,7 @@ folly::Expected processServerInitialParams( TransportParameterId::max_receive_timestamps_per_ack, serverParams.parameters); if (maxReceiveTimestampsPerAckResult.hasError()) { - return folly::makeUnexpected(maxReceiveTimestampsPerAckResult.error()); + return quic::make_unexpected(maxReceiveTimestampsPerAckResult.error()); } auto maxReceiveTimestampsPerAck = maxReceiveTimestampsPerAckResult.value(); @@ -233,7 +233,7 @@ folly::Expected processServerInitialParams( TransportParameterId::receive_timestamps_exponent, serverParams.parameters); if (receiveTimestampsExponentResult.hasError()) { - return folly::makeUnexpected(receiveTimestampsExponentResult.error()); + return quic::make_unexpected(receiveTimestampsExponentResult.error()); } auto receiveTimestampsExponent = receiveTimestampsExponentResult.value(); @@ -242,7 +242,7 @@ folly::Expected processServerInitialParams( TransportParameterId::knob_frames_supported), serverParams.parameters); if (knobFrameSupportedResult.hasError()) { - return folly::makeUnexpected(knobFrameSupportedResult.error()); + return quic::make_unexpected(knobFrameSupportedResult.error()); } auto knobFrameSupported = knobFrameSupportedResult.value(); @@ -251,7 +251,7 @@ folly::Expected processServerInitialParams( TransportParameterId::extended_ack_features), serverParams.parameters); if (extendedAckFeaturesResult.hasError()) { - return folly::makeUnexpected(extendedAckFeaturesResult.error()); + return quic::make_unexpected(extendedAckFeaturesResult.error()); } auto extendedAckFeatures = extendedAckFeaturesResult.value(); @@ -261,7 +261,7 @@ folly::Expected processServerInitialParams( TransportParameterId::reliable_stream_reset)); if (reliableResetTpIter != serverParams.parameters.end()) { if (!reliableResetTpIter->value->empty()) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::TRANSPORT_PARAMETER_ERROR, "Reliable reset transport parameter must be empty")); } @@ -277,7 +277,7 @@ folly::Expected processServerInitialParams( TransportParameterId::initial_source_connection_id, serverParams.parameters); if (initialSourceConnIdResult.hasError()) { - return folly::makeUnexpected(initialSourceConnIdResult.error()); + return quic::make_unexpected(initialSourceConnIdResult.error()); } auto initialSourceConnId = initialSourceConnIdResult.value(); @@ -285,7 +285,7 @@ folly::Expected processServerInitialParams( TransportParameterId::original_destination_connection_id, serverParams.parameters); if (originalDestinationConnIdResult.hasError()) { - return folly::makeUnexpected(originalDestinationConnIdResult.error()); + return quic::make_unexpected(originalDestinationConnIdResult.error()); } auto originalDestinationConnId = originalDestinationConnIdResult.value(); @@ -294,7 +294,7 @@ folly::Expected processServerInitialParams( conn.readCodec->getServerConnectionId() || originalDestinationConnId.value() != conn.originalDestinationConnectionId) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::TRANSPORT_PARAMETER_ERROR, "Initial CID does not match.")); } @@ -306,7 +306,7 @@ folly::Expected processServerInitialParams( packetSize = kDefaultUDPSendPacketLen; } if (*packetSize < kMinMaxUDPPayload) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::TRANSPORT_PARAMETER_ERROR, fmt::format( "Max packet size too small. received max_packetSize = {}", @@ -331,19 +331,19 @@ folly::Expected processServerInitialParams( auto resultBidi = conn.streamManager->setMaxLocalBidirectionalStreams( maxStreamsBidi.value_or(0)); if (resultBidi.hasError()) { - return folly::makeUnexpected(resultBidi.error()); + return quic::make_unexpected(resultBidi.error()); } conn.peerAdvertisedInitialMaxStreamsBidi = maxStreamsBidi.value_or(0); auto resultUni = conn.streamManager->setMaxLocalUnidirectionalStreams( maxStreamsUni.value_or(0)); if (resultUni.hasError()) { - return folly::makeUnexpected(resultUni.error()); + return quic::make_unexpected(resultUni.error()); } conn.peerAdvertisedInitialMaxStreamsUni = maxStreamsUni.value_or(0); conn.peerIdleTimeout = std::chrono::milliseconds(idleTimeout.value_or(0)); conn.peerIdleTimeout = timeMin(conn.peerIdleTimeout, kMaxIdleTimeout); if (ackDelayExponent && *ackDelayExponent > kMaxAckDelayExponent) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::TRANSPORT_PARAMETER_ERROR, "ack_delay_exponent too large")); } @@ -379,7 +379,7 @@ folly::Expected processServerInitialParams( if (maxDatagramFrameSize.has_value()) { if (maxDatagramFrameSize.value() > 0 && maxDatagramFrameSize.value() <= kMaxDatagramPacketOverhead) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::TRANSPORT_PARAMETER_ERROR, "max_datagram_frame_size too small")); } @@ -408,7 +408,7 @@ folly::Expected processServerInitialParams( conn.peerAdvertisedKnobFrameSupport = knobFrameSupported.value_or(0) > 0; conn.peerAdvertisedExtendedAckFeatures = extendedAckFeatures.value_or(0); - return folly::unit; + return {}; } void cacheServerInitialParams( @@ -490,8 +490,7 @@ CachedServerTransportParameters getServerCachedTransportParameters( return transportParams; } -folly::Expected -updateTransportParamsFromCachedEarlyParams( +quic::Expected updateTransportParamsFromCachedEarlyParams( QuicClientConnectionState& conn, const CachedServerTransportParameters& transportParams) { conn.peerIdleTimeout = std::chrono::milliseconds(transportParams.idleTimeout); @@ -506,12 +505,12 @@ updateTransportParamsFromCachedEarlyParams( auto resultBidi = conn.streamManager->setMaxLocalBidirectionalStreams( transportParams.initialMaxStreamsBidi); if (resultBidi.hasError()) { - return folly::makeUnexpected(resultBidi.error()); + return quic::make_unexpected(resultBidi.error()); } auto resultUni = conn.streamManager->setMaxLocalUnidirectionalStreams( transportParams.initialMaxStreamsUni); if (resultUni.hasError()) { - return folly::makeUnexpected(resultUni.error()); + return quic::make_unexpected(resultUni.error()); } conn.peerAdvertisedKnobFrameSupport = transportParams.knobFrameSupport; conn.peerAdvertisedReliableStreamResetSupport = @@ -529,6 +528,6 @@ updateTransportParamsFromCachedEarlyParams( conn.maybePeerAckReceiveTimestampsConfig = std::nullopt; } conn.peerAdvertisedExtendedAckFeatures = transportParams.extendedAckFeatures; - return folly::unit; + return {}; } } // namespace quic diff --git a/quic/client/state/ClientStateMachine.h b/quic/client/state/ClientStateMachine.h index 16059b3ed..a581132b2 100644 --- a/quic/client/state/ClientStateMachine.h +++ b/quic/client/state/ClientStateMachine.h @@ -141,8 +141,7 @@ struct QuicClientConnectionState : public QuicConnectionStateBase { std::unique_ptr undoAllClientStateForRetry( std::unique_ptr conn); -[[nodiscard]] folly::Expected -processServerInitialParams( +[[nodiscard]] quic::Expected processServerInitialParams( QuicClientConnectionState& conn, const ServerTransportParameters& serverParams, PacketNum packetNum); @@ -165,7 +164,7 @@ void cacheServerInitialParams( CachedServerTransportParameters getServerCachedTransportParameters( const QuicClientConnectionState& conn); -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected updateTransportParamsFromCachedEarlyParams( QuicClientConnectionState& conn, const CachedServerTransportParameters& transportParams); diff --git a/quic/client/test/ClientStateMachineTest.cpp b/quic/client/test/ClientStateMachineTest.cpp index 48eeed025..91025c5c7 100644 --- a/quic/client/test/ClientStateMachineTest.cpp +++ b/quic/client/test/ClientStateMachineTest.cpp @@ -114,13 +114,13 @@ TEST_F(ClientStateMachineTest, TestUpdateTransportParamsFromCachedEarlyParams) { for (unsigned long i = 0; i < initialMaxStreamsBidi; i++) { EXPECT_TRUE( - client_->streamManager->createNextBidirectionalStream().hasValue()); + client_->streamManager->createNextBidirectionalStream().has_value()); } EXPECT_TRUE( client_->streamManager->createNextBidirectionalStream().hasError()); for (unsigned long i = 0; i < initialMaxStreamsUni; i++) { EXPECT_TRUE( - client_->streamManager->createNextUnidirectionalStream().hasValue()); + client_->streamManager->createNextUnidirectionalStream().has_value()); } EXPECT_TRUE( client_->streamManager->createNextUnidirectionalStream().hasError()); @@ -130,7 +130,7 @@ TEST_F(ClientStateMachineTest, PreserveHappyeyabllsDuringUndo) { folly::EventBase evb; auto qEvb = std::make_shared(&evb); auto randomCid = ConnectionId::createRandom(8); - ASSERT_TRUE(randomCid.hasValue()); + ASSERT_TRUE(randomCid.has_value()); client_->clientConnectionId = randomCid.value(); client_->happyEyeballsState.finished = true; client_->happyEyeballsState.secondSocket = @@ -147,7 +147,7 @@ TEST_F(ClientStateMachineTest, PreserveObserverContainer) { SocketObserverContainer::ManagedObserver obs; observerContainer->addObserver(&obs); auto randomCid = ConnectionId::createRandom(8); - ASSERT_TRUE(randomCid.hasValue()); + ASSERT_TRUE(randomCid.has_value()); client_->clientConnectionId = randomCid.value(); client_->observerContainer = observerContainer; @@ -170,7 +170,7 @@ TEST_F(ClientStateMachineTest, PreserveObserverContainer) { TEST_F(ClientStateMachineTest, PreserveObserverContainerNullptr) { auto randomCid = ConnectionId::createRandom(8); - ASSERT_TRUE(randomCid.hasValue()); + ASSERT_TRUE(randomCid.has_value()); client_->clientConnectionId = randomCid.value(); ASSERT_THAT(client_->observerContainer.lock(), IsNull()); diff --git a/quic/client/test/Mocks.h b/quic/client/test/Mocks.h index ab4e41cc5..6ee282cec 100644 --- a/quic/client/test/Mocks.h +++ b/quic/client/test/Mocks.h @@ -43,16 +43,16 @@ class MockClientHandshakeBase : public ClientHandshake { } // Legacy workaround for move-only types - folly::Expected doHandshake( + quic::Expected doHandshake( BufPtr data, EncryptionLevel encryptionLevel) override { doHandshakeImpl(data.get(), encryptionLevel); - return folly::unit; + return {}; } MOCK_METHOD(void, doHandshakeImpl, (folly::IOBuf*, EncryptionLevel)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), verifyRetryIntegrityTag, (const ConnectionId&, const RetryPacket&), (override)); @@ -75,12 +75,12 @@ class MockClientHandshakeBase : public ClientHandshake { (override)); MOCK_METHOD(void, destroy, ()); MOCK_METHOD( - (folly::Expected, QuicError>), + (quic::Expected, QuicError>), getNextOneRttWriteCipher, (), (override)); MOCK_METHOD( - (folly::Expected, QuicError>), + (quic::Expected, QuicError>), getNextOneRttReadCipher, (), (override)); @@ -98,14 +98,14 @@ class MockClientHandshakeBase : public ClientHandshake { MOCK_METHOD(Handshake::TLSSummary, getTLSSummaryImpl, (), (const)); // Mock the public connect method - folly::Expected connect( + quic::Expected connect( Optional hostname, std::shared_ptr transportParams) { return mockConnect(std::move(hostname), std::move(transportParams)); } MOCK_METHOD( - (folly::Expected), + (quic::Expected), mockConnect, (Optional, std::shared_ptr)); @@ -117,15 +117,15 @@ class MockClientHandshakeBase : public ClientHandshake { MOCK_METHOD(void, processSocketData, (folly::IOBufQueue & queue)); MOCK_METHOD(bool, matchEarlyParameters, ()); MOCK_METHOD( - (folly::Expected, QuicError>), + (quic::Expected, QuicError>), buildAead, (ClientHandshake::CipherKind kind, ByteRange secret)); MOCK_METHOD( - (folly::Expected, QuicError>), + (quic::Expected, QuicError>), buildHeaderCipher, (ByteRange secret)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), getNextTrafficSecret, (ByteRange secret), (const)); @@ -150,7 +150,7 @@ class MockClientHandshake : public MockClientHandshakeBase { private: // Implement the private pure virtual methods from ClientHandshake - folly::Expected, QuicError> + quic::Expected, QuicError> connectImpl(Optional /* hostname */) override { return Optional(std::nullopt); } @@ -161,22 +161,22 @@ class MockClientHandshake : public MockClientHandshakeBase { return false; } - folly::Expected, QuicError> buildAead( + quic::Expected, QuicError> buildAead( CipherKind /* kind */, ByteRange /* secret */) override { - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(TransportErrorCode::INTERNAL_ERROR, "Not implemented")); } - folly::Expected, QuicError> + quic::Expected, QuicError> buildHeaderCipher(ByteRange /* secret */) override { - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(TransportErrorCode::INTERNAL_ERROR, "Not implemented")); } - folly::Expected getNextTrafficSecret( + quic::Expected getNextTrafficSecret( ByteRange /* secret */) const override { - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(TransportErrorCode::INTERNAL_ERROR, "Not implemented")); } }; diff --git a/quic/client/test/QuicClientTransportLiteTest.cpp b/quic/client/test/QuicClientTransportLiteTest.cpp index 565d8dcbc..d0254880a 100644 --- a/quic/client/test/QuicClientTransportLiteTest.cpp +++ b/quic/client/test/QuicClientTransportLiteTest.cpp @@ -39,17 +39,25 @@ class QuicClientTransportLiteTest : public Test { auto socket = std::make_unique(); sockPtr_ = socket.get(); ON_CALL(*socket, setAdditionalCmsgsFunc(_)) - .WillByDefault(Return(folly::unit)); - ON_CALL(*socket, close()).WillByDefault(Return(folly::unit)); - ON_CALL(*socket, bind(_)).WillByDefault(Return(folly::unit)); - ON_CALL(*socket, connect(_)).WillByDefault(Return(folly::unit)); - ON_CALL(*socket, setReuseAddr(_)).WillByDefault(Return(folly::unit)); - ON_CALL(*socket, setReusePort(_)).WillByDefault(Return(folly::unit)); - ON_CALL(*socket, setRecvTos(_)).WillByDefault(Return(folly::unit)); + .WillByDefault(Return(quic::Expected{})); + ON_CALL(*socket, close()) + .WillByDefault(Return(quic::Expected{})); + ON_CALL(*socket, bind(_)) + .WillByDefault(Return(quic::Expected{})); + ON_CALL(*socket, connect(_)) + .WillByDefault(Return(quic::Expected{})); + ON_CALL(*socket, setReuseAddr(_)) + .WillByDefault(Return(quic::Expected{})); + ON_CALL(*socket, setReusePort(_)) + .WillByDefault(Return(quic::Expected{})); + ON_CALL(*socket, setRecvTos(_)) + .WillByDefault(Return(quic::Expected{})); ON_CALL(*socket, getRecvTos()).WillByDefault(Return(false)); ON_CALL(*socket, getGSO()).WillByDefault(Return(0)); - ON_CALL(*socket, setCmsgs(_)).WillByDefault(Return(folly::unit)); - ON_CALL(*socket, appendCmsgs(_)).WillByDefault(Return(folly::unit)); + ON_CALL(*socket, setCmsgs(_)) + .WillByDefault(Return(quic::Expected{})); + ON_CALL(*socket, appendCmsgs(_)) + .WillByDefault(Return(quic::Expected{})); auto mockFactory = std::make_shared(); EXPECT_CALL(*mockFactory, makeClientHandshakeImpl(_)) .WillRepeatedly(Invoke( @@ -68,7 +76,8 @@ class QuicClientTransportLiteTest : public Test { } void TearDown() override { - EXPECT_CALL(*sockPtr_, close()).WillRepeatedly(Return(folly::unit)); + EXPECT_CALL(*sockPtr_, close()) + .WillRepeatedly(Return(quic::Expected{})); quicClient_->closeNow(std::nullopt); } @@ -90,7 +99,8 @@ TEST_F(QuicClientTransportLiteTest, TestPriming) { quicClient_->getConn()->zeroRttWriteCipher = test::createNoOpAead(); StreamId streamId = quicClient_->createBidirectionalStream().value(); - quicClient_->writeChain(streamId, folly::IOBuf::copyBuffer("test"), false); + [[maybe_unused]] auto writeChainResult = quicClient_->writeChain( + streamId, folly::IOBuf::copyBuffer("test"), false); EXPECT_CALL(mockConnectionSetupCallback_, onPrimingDataAvailable(_)); evb_.loopOnce(EVLOOP_NONBLOCK); } diff --git a/quic/client/test/QuicClientTransportMock.h b/quic/client/test/QuicClientTransportMock.h index 835ccdeaf..072b36e84 100644 --- a/quic/client/test/QuicClientTransportMock.h +++ b/quic/client/test/QuicClientTransportMock.h @@ -25,7 +25,7 @@ class QuicClientTransportMock : public QuicClientTransport { std::move(handshakeFactory)) {} MOCK_METHOD( - (folly::Expected, LocalErrorCode>), + (quic::Expected, LocalErrorCode>), read, (StreamId, size_t)); MOCK_METHOD( @@ -43,20 +43,20 @@ class QuicClientTransportMock : public QuicClientTransport { MOCK_METHOD((void), onNotifyDataAvailable, (QuicAsyncUDPSocket&), (noexcept)); MOCK_METHOD((void), errMessage, (const cmsghdr&), (noexcept)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), setReadCallback, (StreamId, quic::QuicSocket::ReadCallback*, Optional)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), getStreamTransportInfo, (StreamId), (const)); MOCK_METHOD((bool), isTLSResumed, (), (const)); MOCK_METHOD((ZeroRttAttemptState), getZeroRttState, ()); MOCK_METHOD((void), close, (Optional)); - MOCK_METHOD((folly::Expected), writeData, ()); + MOCK_METHOD((quic::Expected), writeData, ()); MOCK_METHOD((void), closeSecondSocket, ()); MOCK_METHOD((void), setHappyEyeballsEnabled, (bool)); MOCK_METHOD( diff --git a/quic/client/test/QuicClientTransportTest.cpp b/quic/client/test/QuicClientTransportTest.cpp index ba990ac8d..2eeb6137d 100644 --- a/quic/client/test/QuicClientTransportTest.cpp +++ b/quic/client/test/QuicClientTransportTest.cpp @@ -47,12 +47,12 @@ class QuicClientTransportMock : public QuicClientTransport { .hasError()); } - folly::Expected processPackets( + quic::Expected processPackets( NetworkData&& networkData, const Optional& server) override { networkDataVec_.push_back(std::move(networkData)); server_ = server; - return folly::unit; + return {}; } QuicClientConnectionState* getClientConn() { @@ -69,44 +69,46 @@ class QuicClientTransportTest : public Test { evb_ = std::make_shared(); auto sock = std::make_unique(); sockPtr_ = sock.get(); - ON_CALL(*sock, setReuseAddr(_)).WillByDefault(testing::Return(folly::unit)); + ON_CALL(*sock, setReuseAddr(_)) + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, setAdditionalCmsgsFunc(_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, setDFAndTurnOffPMTU()) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, setErrMessageCallback(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, setTosOrTrafficClass(_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, init(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, applyOptions(testing::_, testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, bind(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, connect(testing::_)) - .WillByDefault(testing::Return(folly::unit)); - ON_CALL(*sock, close()).WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); + ON_CALL(*sock, close()) + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, setGRO(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, getGRO()).WillByDefault(testing::Return(0)); ON_CALL(*sock, getGSO()).WillByDefault(testing::Return(0)); ON_CALL(*sock, setRecvTos(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, getRecvTos()).WillByDefault(testing::Return(false)); ON_CALL(*sock, setCmsgs(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, appendCmsgs(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, getTimestamping()).WillByDefault(testing::Return(0)); ON_CALL(*sock, setReusePort(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, setRcvBuf(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, setSndBuf(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, setFD(testing::_, testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); mockFactory_ = std::make_shared(); EXPECT_CALL(*mockFactory_, makeClientHandshakeImpl(_)) @@ -163,7 +165,8 @@ TEST_F(QuicClientTransportTest, TestReadWithRecvmsgSinglePacketLoop) { ->streamManager->setMaxLocalBidirectionalStreams(128) .hasError()); StreamId streamId = quicClient_->createBidirectionalStream().value(); - quicClient_->writeChain(streamId, folly::IOBuf::copyBuffer("test"), false); + [[maybe_unused]] auto writeChainResult = quicClient_->writeChain( + streamId, folly::IOBuf::copyBuffer("test"), false); EXPECT_CALL(*sockPtr_, recvmsg(_, _)) .WillRepeatedly(Invoke([&](struct msghdr* /* msg */, int /* flags */) { diff --git a/quic/codec/BUCK b/quic/codec/BUCK index 4d60d42ef..971056c7c 100644 --- a/quic/codec/BUCK +++ b/quic/codec/BUCK @@ -22,7 +22,6 @@ mvfst_cpp_library( ], exported_deps = [ ":packet_number", - "//folly:expected", "//folly:network_address", "//folly:string", "//folly/hash:hash", @@ -33,6 +32,7 @@ mvfst_cpp_library( "//quic:exception", "//quic/common:buf_util", "//quic/common:circular_deque", + "//quic/common:expected", "//quic/common:interval_set", "//quic/common:network_data", "//quic/common:optional", @@ -74,11 +74,11 @@ mvfst_cpp_library( ":types", ], exported_deps = [ - "//folly:expected", "//folly:unit", "//folly/io:iobuf", "//quic:exception", "//quic/common:buf_util", + "//quic/common:expected", "//quic/common:optional", ], ) @@ -102,6 +102,7 @@ mvfst_cpp_library( ":types", "//folly/io:iobuf", "//quic:constants", + "//quic/common:expected", "//quic/state:transport_settings", ], ) diff --git a/quic/codec/ConnectionIdAlgo.h b/quic/codec/ConnectionIdAlgo.h index 1dea2a016..2ba6a1b18 100644 --- a/quic/codec/ConnectionIdAlgo.h +++ b/quic/codec/ConnectionIdAlgo.h @@ -7,9 +7,9 @@ #pragma once -#include #include #include +#include namespace quic { @@ -33,13 +33,13 @@ class ConnectionIdAlgo { /** * Parses ServerConnectionIdParams from the given connection id. */ - virtual folly::Expected - parseConnectionId(const ConnectionId& id) noexcept = 0; + virtual quic::Expected parseConnectionId( + const ConnectionId& id) noexcept = 0; /** * Encodes the given ServerConnectionIdParams into connection id */ - virtual folly::Expected encodeConnectionId( + virtual quic::Expected encodeConnectionId( const ServerConnectionIdParams& params) noexcept = 0; }; diff --git a/quic/codec/Decode.cpp b/quic/codec/Decode.cpp index cb3cb35db..67e125117 100644 --- a/quic/codec/Decode.cpp +++ b/quic/codec/Decode.cpp @@ -16,25 +16,25 @@ namespace { -folly::Expected nextAckedPacketGap( +quic::Expected nextAckedPacketGap( quic::PacketNum packetNum, uint64_t gap) noexcept { // Gap cannot overflow because of the definition of quic integer encoding, so // we can just add to gap. uint64_t adjustedGap = gap + 2; if (packetNum < adjustedGap) { - return folly::makeUnexpected(quic::QuicError( + return quic::make_unexpected(quic::QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad gap")); } return packetNum - adjustedGap; } -folly::Expected nextAckedPacketLen( +quic::Expected nextAckedPacketLen( quic::PacketNum packetNum, uint64_t ackBlockLen) noexcept { // Going to allow 0 as a valid value. if (packetNum < ackBlockLen) { - return folly::makeUnexpected(quic::QuicError( + return quic::make_unexpected(quic::QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad block len")); } return packetNum - ackBlockLen; @@ -44,7 +44,7 @@ folly::Expected nextAckedPacketLen( namespace quic { -folly::Expected decodePaddingFrame(Cursor& cursor) { +quic::Expected decodePaddingFrame(Cursor& cursor) { // we might have multiple padding frames in sequence in the common case. // Let's consume all the padding and return 1 padding frame for everything. static_assert( @@ -67,24 +67,24 @@ folly::Expected decodePaddingFrame(Cursor& cursor) { return PaddingFrame(); } -folly::Expected decodePingFrame(Cursor&) { +quic::Expected decodePingFrame(Cursor&) { return PingFrame(); } -folly::Expected decodeKnobFrame(Cursor& cursor) { +quic::Expected decodeKnobFrame(Cursor& cursor) { auto knobSpace = decodeQuicInteger(cursor); if (!knobSpace) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad knob space")); } auto knobId = decodeQuicInteger(cursor); if (!knobId) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad knob id")); } auto knobLen = decodeQuicInteger(cursor); if (!knobLen) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad knob len")); } BufPtr knobBlob; @@ -93,28 +93,28 @@ folly::Expected decodeKnobFrame(Cursor& cursor) { KnobFrame(knobSpace->first, knobId->first, std::move(knobBlob))); } -folly::Expected decodeAckFrequencyFrame( +quic::Expected decodeAckFrequencyFrame( Cursor& cursor) { auto sequenceNumber = decodeQuicInteger(cursor); if (!sequenceNumber) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad sequence number")); } auto packetTolerance = decodeQuicInteger(cursor); if (!packetTolerance) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad packet tolerance")); } auto updateMaxAckDelay = decodeQuicInteger(cursor); if (!updateMaxAckDelay) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad update max ack delay")); } auto reorderThreshold = decodeQuicInteger(cursor); if (!reorderThreshold) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad reorder threshold")); } @@ -127,11 +127,11 @@ folly::Expected decodeAckFrequencyFrame( return QuicSimpleFrame(frame); } -folly::Expected decodeImmediateAckFrame(Cursor&) { +quic::Expected decodeImmediateAckFrame(Cursor&) { return ImmediateAckFrame(); } -folly::Expected convertEncodedDurationToMicroseconds( +quic::Expected convertEncodedDurationToMicroseconds( uint8_t exponentToUse, uint64_t delay) noexcept { // ackDelayExponentToUse is guaranteed to be less than the size of uint64_t @@ -144,7 +144,7 @@ folly::Expected convertEncodedDurationToMicroseconds( uint8_t leftShift = (delayValWidth - exponentToUse); delayOverflowMask = delayOverflowMask << leftShift; if ((delay & delayOverflowMask) != 0) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Decoded delay overflows")); } @@ -152,13 +152,13 @@ folly::Expected convertEncodedDurationToMicroseconds( if (adjustedDelay > static_cast( std::numeric_limits::max())) { - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad delay")); } return adjustedDelay; } -folly::Expected decodeAckFrame( +quic::Expected decodeAckFrame( Cursor& cursor, const PacketHeader& header, const CodecParameters& params, @@ -167,23 +167,23 @@ folly::Expected decodeAckFrame( frame.frameType = frameType; auto largestAckedInt = decodeQuicInteger(cursor); if (!largestAckedInt) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad largest acked")); } PacketNum largestAcked = largestAckedInt->first; auto ackDelay = decodeQuicInteger(cursor); if (!ackDelay) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad ack delay")); } auto additionalAckBlocks = decodeQuicInteger(cursor); if (!additionalAckBlocks) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad ack block count")); } auto firstAckBlockLen = decodeQuicInteger(cursor); if (!firstAckBlockLen) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad first block")); } // Using default ack delay for long header packets. Before negotiating @@ -197,7 +197,7 @@ folly::Expected decodeAckFrame( auto res = nextAckedPacketLen(largestAcked, firstAckBlockLen->first); if (res.hasError()) { - return folly::makeUnexpected(res.error()); + return quic::make_unexpected(res.error()); } PacketNum currentPacketNum = *res; frame.largestAcked = largestAcked; @@ -205,7 +205,7 @@ folly::Expected decodeAckFrame( auto delayRes = convertEncodedDurationToMicroseconds( ackDelayExponentToUse, ackDelay->first); if (delayRes.hasError()) { - return folly::makeUnexpected(delayRes.error()); + return quic::make_unexpected(delayRes.error()); } auto adjustedDelay = *delayRes; @@ -221,22 +221,22 @@ folly::Expected decodeAckFrame( ++numBlocks) { auto currentGap = decodeQuicInteger(cursor); if (!currentGap) { - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad gap")); } auto blockLen = decodeQuicInteger(cursor); if (!blockLen) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad block len")); } res = nextAckedPacketGap(currentPacketNum, currentGap->first); if (res.hasError()) { - return folly::makeUnexpected(res.error()); + return quic::make_unexpected(res.error()); } PacketNum nextEndPacket = *res; res = nextAckedPacketLen(nextEndPacket, blockLen->first); if (res.hasError()) { - return folly::makeUnexpected(res.error()); + return quic::make_unexpected(res.error()); } currentPacketNum = *res; // We don't need to add the entry when the block length is zero since we @@ -247,13 +247,13 @@ folly::Expected decodeAckFrame( return frame; } -static folly::Expected decodeReceiveTimestampsInAck( +static quic::Expected decodeReceiveTimestampsInAck( ReadAckFrame& frame, Cursor& cursor, const CodecParameters& params) { auto latestRecvdPacketNum = decodeQuicInteger(cursor); if (!latestRecvdPacketNum) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad latest received packet number")); } @@ -261,7 +261,7 @@ static folly::Expected decodeReceiveTimestampsInAck( auto latestRecvdPacketTimeDelta = decodeQuicInteger(cursor); if (!latestRecvdPacketTimeDelta) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad receive packet timestamp delta")); } @@ -270,7 +270,7 @@ static folly::Expected decodeReceiveTimestampsInAck( auto timeStampRangeCount = decodeQuicInteger(cursor); if (!timeStampRangeCount) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad receive timestamps range count")); } @@ -279,14 +279,14 @@ static folly::Expected decodeReceiveTimestampsInAck( RecvdPacketsTimestampsRange timeStampRange; auto receiveTimeStampsGap = decodeQuicInteger(cursor); if (!receiveTimeStampsGap) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad receive timestamps gap")); } timeStampRange.gap = receiveTimeStampsGap->first; auto receiveTimeStampsLen = decodeQuicInteger(cursor); if (!receiveTimeStampsLen) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad receive timestamps block length")); } @@ -299,7 +299,7 @@ static folly::Expected decodeReceiveTimestampsInAck( for (uint64_t i = 0; i < receiveTimeStampsLen->first; i++) { auto delta = decodeQuicInteger(cursor); if (!delta) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad receive timestamps delta")); } @@ -307,52 +307,52 @@ static folly::Expected decodeReceiveTimestampsInAck( auto res = convertEncodedDurationToMicroseconds( receiveTimestampsExponentToUse, delta->first); if (res.hasError()) { - return folly::makeUnexpected(res.error()); + return quic::make_unexpected(res.error()); } auto adjustedDelta = *res; timeStampRange.deltas.push_back(adjustedDelta); } frame.recvdPacketsTimestampRanges.emplace_back(timeStampRange); } - return folly::unit; + return {}; } -static folly::Expected decodeEcnCountsInAck( +static quic::Expected decodeEcnCountsInAck( ReadAckFrame& frame, Cursor& cursor) { auto ect_0 = decodeQuicInteger(cursor); auto ect_1 = decodeQuicInteger(cursor); auto ce = decodeQuicInteger(cursor); if (!ect_0 || !ect_1 || !ce) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad ECN value")); } frame.ecnECT0Count = ect_0->first; frame.ecnECT1Count = ect_1->first; frame.ecnCECount = ce->first; - return folly::unit; + return {}; } -folly::Expected decodeAckExtendedFrame( +quic::Expected decodeAckExtendedFrame( Cursor& cursor, const PacketHeader& header, const CodecParameters& params) { ReadAckFrame frame; auto res = decodeAckFrame(cursor, header, params, FrameType::ACK_EXTENDED); if (res.hasError()) { - return folly::makeUnexpected(res.error()); + return quic::make_unexpected(res.error()); } frame = *res; auto extendedAckFeatures = decodeQuicInteger(cursor); if (!extendedAckFeatures) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad extended ACK features field")); } auto includedFeatures = extendedAckFeatures->first; if ((includedFeatures | params.extendedAckFeatures) != params.extendedAckFeatures) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Extended ACK has unexpected features")); } @@ -361,7 +361,7 @@ folly::Expected decodeAckExtendedFrame( ExtendedAckFeatureMask::ECN_COUNTS)) { auto ecnResult = decodeEcnCountsInAck(frame, cursor); if (ecnResult.hasError()) { - return folly::makeUnexpected(ecnResult.error()); + return quic::make_unexpected(ecnResult.error()); } } if (includedFeatures & @@ -369,13 +369,13 @@ folly::Expected decodeAckExtendedFrame( ExtendedAckFeatureMask::RECEIVE_TIMESTAMPS)) { auto tsResult = decodeReceiveTimestampsInAck(frame, cursor, params); if (tsResult.hasError()) { - return folly::makeUnexpected(tsResult.error()); + return quic::make_unexpected(tsResult.error()); } } return frame; } -folly::Expected decodeAckFrameWithReceivedTimestamps( +quic::Expected decodeAckFrameWithReceivedTimestamps( Cursor& cursor, const PacketHeader& header, const CodecParameters& params, @@ -384,20 +384,20 @@ folly::Expected decodeAckFrameWithReceivedTimestamps( auto ack = decodeAckFrame(cursor, header, params, frameType); if (ack.hasError()) { - return folly::makeUnexpected(ack.error()); + return quic::make_unexpected(ack.error()); } frame = *ack; frame.frameType = frameType; auto ts = decodeReceiveTimestampsInAck(frame, cursor, params); if (ts.hasError()) { - return folly::makeUnexpected(ts.error()); + return quic::make_unexpected(ts.error()); } return QuicFrame(frame); } -folly::Expected decodeAckFrameWithECN( +quic::Expected decodeAckFrameWithECN( Cursor& cursor, const PacketHeader& header, const CodecParameters& params) { @@ -405,25 +405,25 @@ folly::Expected decodeAckFrameWithECN( auto ack = decodeAckFrame(cursor, header, params); if (ack.hasError()) { - return folly::makeUnexpected(ack.error()); + return quic::make_unexpected(ack.error()); } readAckFrame = *ack; readAckFrame.frameType = FrameType::ACK_ECN; auto ecn = decodeEcnCountsInAck(readAckFrame, cursor); if (ecn.hasError()) { - return folly::makeUnexpected(ecn.error()); + return quic::make_unexpected(ecn.error()); } return QuicFrame(readAckFrame); } -folly::Expected decodeRstStreamFrame( +quic::Expected decodeRstStreamFrame( Cursor& cursor, bool reliable) { auto streamId = decodeQuicInteger(cursor); if (!streamId) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad streamId")); } ApplicationErrorCode errorCode; @@ -431,26 +431,26 @@ folly::Expected decodeRstStreamFrame( if (varCode) { errorCode = static_cast(varCode->first); } else { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Cannot decode error code")); } auto finalSize = decodeQuicInteger(cursor); if (!finalSize) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad offset")); } Optional> reliableSize = std::nullopt; if (reliable) { reliableSize = decodeQuicInteger(cursor); if (!reliableSize) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad value of reliable size")); } if (reliableSize->first > finalSize->first) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Reliable size is greater than final size")); } @@ -462,11 +462,11 @@ folly::Expected decodeRstStreamFrame( reliableSize ? Optional(reliableSize->first) : std::nullopt); } -folly::Expected decodeStopSendingFrame( +quic::Expected decodeStopSendingFrame( Cursor& cursor) { auto streamId = decodeQuicInteger(cursor); if (!streamId) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad streamId")); } ApplicationErrorCode errorCode; @@ -474,35 +474,35 @@ folly::Expected decodeStopSendingFrame( if (varCode) { errorCode = static_cast(varCode->first); } else { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Cannot decode error code")); } return StopSendingFrame(streamId->first, errorCode); } -folly::Expected decodeCryptoFrame(Cursor& cursor) { +quic::Expected decodeCryptoFrame(Cursor& cursor) { auto optionalOffset = decodeQuicInteger(cursor); if (!optionalOffset) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Invalid offset")); } uint64_t offset = optionalOffset->first; auto dataLength = decodeQuicInteger(cursor); if (!dataLength) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Invalid length")); } BufPtr data; if (cursor.totalLength() < dataLength->first) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Length mismatch")); } size_t cloned = cursor.cloneAtMost(data, dataLength->first); if (cloned < dataLength->first) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Failed to clone complete data")); } @@ -510,22 +510,22 @@ folly::Expected decodeCryptoFrame(Cursor& cursor) { return ReadCryptoFrame(offset, std::move(data)); } -folly::Expected decodeNewTokenFrame( +quic::Expected decodeNewTokenFrame( Cursor& cursor) { auto tokenLength = decodeQuicInteger(cursor); if (!tokenLength) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Invalid length")); } BufPtr token; if (cursor.totalLength() < tokenLength->first) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Length mismatch")); } size_t cloned = cursor.cloneAtMost(token, tokenLength->first); if (cloned < tokenLength->first) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Failed to clone token")); } @@ -533,7 +533,7 @@ folly::Expected decodeNewTokenFrame( return ReadNewTokenFrame(std::move(token)); } -folly::Expected decodeStreamFrame( +quic::Expected decodeStreamFrame( BufQueue& queue, StreamTypeField frameTypeField, bool isGroupFrame) { @@ -541,7 +541,7 @@ folly::Expected decodeStreamFrame( auto streamId = decodeQuicInteger(cursor); if (!streamId) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Invalid stream id")); } @@ -549,7 +549,7 @@ folly::Expected decodeStreamFrame( if (isGroupFrame) { auto gId = decodeQuicInteger(cursor); if (!gId) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Invalid group stream id")); } @@ -560,7 +560,7 @@ folly::Expected decodeStreamFrame( if (frameTypeField.hasOffset()) { auto optionalOffset = decodeQuicInteger(cursor); if (!optionalOffset) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Invalid offset")); } offset = optionalOffset->first; @@ -570,7 +570,7 @@ folly::Expected decodeStreamFrame( if (frameTypeField.hasDataLength()) { dataLength = decodeQuicInteger(cursor); if (!dataLength) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Invalid length")); } } @@ -581,7 +581,7 @@ folly::Expected decodeStreamFrame( if (trimAmount > 0) { size_t trimmed = queue.trimStartAtMost(trimAmount); if (trimmed < trimAmount) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Failed to trim queue")); } @@ -589,12 +589,12 @@ folly::Expected decodeStreamFrame( if (dataLength.has_value()) { if (queue.chainLength() < dataLength->first) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Length mismatch")); } data = queue.splitAtMost(dataLength->first); if (!data || data->computeChainDataLength() < dataLength->first) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Failed to extract data")); } @@ -603,7 +603,7 @@ folly::Expected decodeStreamFrame( // frame are all data. data = queue.move(); if (!data) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Failed to extract data")); } @@ -612,130 +612,130 @@ folly::Expected decodeStreamFrame( streamId->first, offset, std::move(data), fin, groupId); } -folly::Expected decodeMaxDataFrame(Cursor& cursor) { +quic::Expected decodeMaxDataFrame(Cursor& cursor) { auto maximumData = decodeQuicInteger(cursor); if (!maximumData) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad Max Data")); } return MaxDataFrame(maximumData->first); } -folly::Expected decodeMaxStreamDataFrame( +quic::Expected decodeMaxStreamDataFrame( Cursor& cursor) { auto streamId = decodeQuicInteger(cursor); if (!streamId) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Invalid streamId")); } auto offset = decodeQuicInteger(cursor); if (!offset) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Invalid offset")); } return MaxStreamDataFrame(streamId->first, offset->first); } -folly::Expected decodeBiDiMaxStreamsFrame( +quic::Expected decodeBiDiMaxStreamsFrame( Cursor& cursor) { auto streamCount = decodeQuicInteger(cursor); if (!streamCount || streamCount->first > kMaxMaxStreams) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Invalid Bi-directional streamId")); } return MaxStreamsFrame(streamCount->first, true /* isBidirectional*/); } -folly::Expected decodeUniMaxStreamsFrame( +quic::Expected decodeUniMaxStreamsFrame( Cursor& cursor) { auto streamCount = decodeQuicInteger(cursor); if (!streamCount || streamCount->first > kMaxMaxStreams) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Invalid Uni-directional streamId")); } return MaxStreamsFrame(streamCount->first, false /* isUnidirectional */); } -folly::Expected decodeDataBlockedFrame( +quic::Expected decodeDataBlockedFrame( Cursor& cursor) { auto dataLimit = decodeQuicInteger(cursor); if (!dataLimit) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad offset")); } return DataBlockedFrame(dataLimit->first); } -folly::Expected decodeStreamDataBlockedFrame( +quic::Expected decodeStreamDataBlockedFrame( Cursor& cursor) { auto streamId = decodeQuicInteger(cursor); if (!streamId) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad streamId")); } auto dataLimit = decodeQuicInteger(cursor); if (!dataLimit) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad offset")); } return StreamDataBlockedFrame(streamId->first, dataLimit->first); } -folly::Expected decodeBiDiStreamsBlockedFrame( +quic::Expected decodeBiDiStreamsBlockedFrame( Cursor& cursor) { auto streamId = decodeQuicInteger(cursor); if (!streamId) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad Bi-Directional streamId")); } return StreamsBlockedFrame(streamId->first, true /* isBidirectional */); } -folly::Expected decodeUniStreamsBlockedFrame( +quic::Expected decodeUniStreamsBlockedFrame( Cursor& cursor) { auto streamId = decodeQuicInteger(cursor); if (!streamId) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad Uni-direcitonal streamId")); } return StreamsBlockedFrame(streamId->first, false /* isBidirectional */); } -folly::Expected decodeNewConnectionIdFrame( +quic::Expected decodeNewConnectionIdFrame( Cursor& cursor) { auto sequenceNumber = decodeQuicInteger(cursor); if (!sequenceNumber) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad sequence")); } auto retirePriorTo = decodeQuicInteger(cursor); if (!retirePriorTo) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad retire prior to")); } if (!cursor.canAdvance(sizeof(uint8_t))) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Not enough input bytes to read Dest. ConnectionId")); } auto connIdLen = cursor.readBE(); if (cursor.totalLength() < connIdLen) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad connid")); } if (connIdLen > kMaxConnectionIdSize) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "ConnectionId invalid length")); } auto connIdResult = ConnectionId::create(cursor, connIdLen); if (connIdResult.hasError()) { - return folly::makeUnexpected(connIdResult.error()); + return quic::make_unexpected(connIdResult.error()); } ConnectionId connId = connIdResult.value(); @@ -743,7 +743,7 @@ folly::Expected decodeNewConnectionIdFrame( size_t bytesRead = cursor.pullAtMost(statelessResetToken.data(), statelessResetToken.size()); if (bytesRead < statelessResetToken.size()) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Failed to read StatelessResetToken")); } @@ -755,20 +755,20 @@ folly::Expected decodeNewConnectionIdFrame( std::move(statelessResetToken)); } -folly::Expected +quic::Expected decodeRetireConnectionIdFrame(Cursor& cursor) { auto sequenceNum = decodeQuicInteger(cursor); if (!sequenceNum) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad sequence num")); } return RetireConnectionIdFrame(sequenceNum->first); } -folly::Expected decodePathChallengeFrame( +quic::Expected decodePathChallengeFrame( Cursor& cursor) { if (!cursor.canAdvance(sizeof(uint64_t))) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Not enough input bytes to read path challenge frame.")); } @@ -776,10 +776,10 @@ folly::Expected decodePathChallengeFrame( return PathChallengeFrame(pathData); } -folly::Expected decodePathResponseFrame( +quic::Expected decodePathResponseFrame( Cursor& cursor) { if (!cursor.canAdvance(sizeof(uint64_t))) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Not enough input bytes to read path response frame.")); } @@ -787,12 +787,12 @@ folly::Expected decodePathResponseFrame( return PathResponseFrame(pathData); } -folly::Expected decodeConnectionCloseFrame( +quic::Expected decodeConnectionCloseFrame( Cursor& cursor) { TransportErrorCode errorCode{}; auto varCode = decodeQuicInteger(cursor); if (!varCode) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Failed to parse error code.")); } @@ -800,7 +800,7 @@ folly::Expected decodeConnectionCloseFrame( auto frameTypeField = decodeQuicInteger(cursor); if (!frameTypeField || frameTypeField->second != sizeof(uint8_t)) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad connection close triggering frame type value")); } @@ -809,7 +809,7 @@ folly::Expected decodeConnectionCloseFrame( auto reasonPhraseLength = decodeQuicInteger(cursor); if (!reasonPhraseLength || reasonPhraseLength->first > kMaxReasonPhraseLength) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad reason phrase length")); } @@ -825,12 +825,12 @@ folly::Expected decodeConnectionCloseFrame( QuicErrorCode(errorCode), std::move(reasonPhrase), triggeringFrameType); } -folly::Expected decodeApplicationClose( +quic::Expected decodeApplicationClose( Cursor& cursor) { ApplicationErrorCode errorCode{}; auto varCode = decodeQuicInteger(cursor); if (!varCode) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Failed to parse error code.")); } @@ -839,7 +839,7 @@ folly::Expected decodeApplicationClose( auto reasonPhraseLength = decodeQuicInteger(cursor); if (!reasonPhraseLength || reasonPhraseLength->first > kMaxReasonPhraseLength) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( quic::TransportErrorCode::FRAME_ENCODING_ERROR, "Bad reason phrase length")); } @@ -855,7 +855,7 @@ folly::Expected decodeApplicationClose( QuicErrorCode(errorCode), std::move(reasonPhrase)); } -folly::Expected decodeHandshakeDoneFrame( +quic::Expected decodeHandshakeDoneFrame( Cursor& /*cursor*/) { return HandshakeDoneFrame(); } @@ -865,18 +865,18 @@ folly::Expected decodeHandshakeDoneFrame( * differentiate tokens based on the success of decrypting with differing aead * associated data. */ -folly::Expected parsePlaintextRetryOrNewToken( +quic::Expected parsePlaintextRetryOrNewToken( Cursor& cursor) { // Read in the timestamp if (!cursor.canAdvance(sizeof(uint64_t))) { - return folly::makeUnexpected(TransportErrorCode::INVALID_TOKEN); + return quic::make_unexpected(TransportErrorCode::INVALID_TOKEN); } auto timestampInMs = cursor.readBE(); return timestampInMs; } -folly::Expected decodeDatagramFrame( +quic::Expected decodeDatagramFrame( BufQueue& queue, bool hasLen) { Cursor cursor(queue.front()); @@ -884,12 +884,12 @@ folly::Expected decodeDatagramFrame( if (hasLen) { auto decodeLength = decodeQuicInteger(cursor); if (!decodeLength) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::FRAME_ENCODING_ERROR, "Invalid datagram len")); } length = decodeLength->first; if (cursor.length() < length) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::FRAME_ENCODING_ERROR, "Invalid datagram frame")); } queue.trimStart(decodeLength->second); @@ -897,34 +897,34 @@ folly::Expected decodeDatagramFrame( return DatagramFrame(length, queue.splitAtMost(length)); } -folly::Expected parseFrame( +quic::Expected parseFrame( BufQueue& queue, const PacketHeader& header, const CodecParameters& params) { Cursor cursor(queue.front()); auto frameTypeInt = decodeQuicInteger(cursor); if (!frameTypeInt) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::FRAME_ENCODING_ERROR, "Invalid frame-type field")); } queue.trimStart(cursor - queue.front()); cursor.reset(queue.front()); FrameType frameType = static_cast(frameTypeInt->first); - // No more try/catch, just use Expected/makeUnexpected pattern + // No more try/catch, just use Expected/make_unexpected pattern switch (frameType) { case FrameType::PADDING: { auto paddingRes = decodePaddingFrame(cursor); - if (!paddingRes.hasValue()) { - return folly::makeUnexpected(paddingRes.error()); + if (!paddingRes.has_value()) { + return quic::make_unexpected(paddingRes.error()); } queue.trimStart(cursor - queue.front()); return QuicFrame(*paddingRes); } case FrameType::PING: { auto pingRes = decodePingFrame(cursor); - if (!pingRes.hasValue()) { - return folly::makeUnexpected(pingRes.error()); + if (!pingRes.has_value()) { + return quic::make_unexpected(pingRes.error()); } queue.trimStart(cursor - queue.front()); return QuicFrame(*pingRes); @@ -949,32 +949,32 @@ folly::Expected parseFrame( case FrameType::RST_STREAM_AT: { auto rstRes = decodeRstStreamFrame(cursor, frameType == FrameType::RST_STREAM_AT); - if (!rstRes.hasValue()) { - return folly::makeUnexpected(rstRes.error()); + if (!rstRes.has_value()) { + return quic::make_unexpected(rstRes.error()); } queue.trimStart(cursor - queue.front()); return QuicFrame(*rstRes); } case FrameType::STOP_SENDING: { auto stopRes = decodeStopSendingFrame(cursor); - if (!stopRes.hasValue()) { - return folly::makeUnexpected(stopRes.error()); + if (!stopRes.has_value()) { + return quic::make_unexpected(stopRes.error()); } queue.trimStart(cursor - queue.front()); return QuicFrame(*stopRes); } case FrameType::CRYPTO_FRAME: { auto cryptoRes = decodeCryptoFrame(cursor); - if (!cryptoRes.hasValue()) { - return folly::makeUnexpected(cryptoRes.error()); + if (!cryptoRes.has_value()) { + return quic::make_unexpected(cryptoRes.error()); } queue.trimStart(cursor - queue.front()); return QuicFrame(*cryptoRes); } case FrameType::NEW_TOKEN: { auto tokenRes = decodeNewTokenFrame(cursor); - if (!tokenRes.hasValue()) { - return folly::makeUnexpected(tokenRes.error()); + if (!tokenRes.has_value()) { + return quic::make_unexpected(tokenRes.error()); } queue.trimStart(cursor - queue.front()); return QuicFrame(*tokenRes); @@ -991,8 +991,8 @@ folly::Expected parseFrame( queue, StreamTypeField(frameTypeInt->first), false /* isGroupFrame */); - if (!streamRes.hasValue()) { - return folly::makeUnexpected(streamRes.error()); + if (!streamRes.has_value()) { + return quic::make_unexpected(streamRes.error()); } return QuicFrame(*streamRes); } @@ -1006,142 +1006,142 @@ folly::Expected parseFrame( case FrameType::GROUP_STREAM_OFF_LEN_FIN: { auto streamRes = decodeStreamFrame( queue, StreamTypeField(frameTypeInt->first), true /* isGroupFrame */); - if (!streamRes.hasValue()) { - return folly::makeUnexpected(streamRes.error()); + if (!streamRes.has_value()) { + return quic::make_unexpected(streamRes.error()); } return QuicFrame(*streamRes); } case FrameType::MAX_DATA: { auto maxDataRes = decodeMaxDataFrame(cursor); - if (!maxDataRes.hasValue()) { - return folly::makeUnexpected(maxDataRes.error()); + if (!maxDataRes.has_value()) { + return quic::make_unexpected(maxDataRes.error()); } queue.trimStart(cursor - queue.front()); return QuicFrame(*maxDataRes); } case FrameType::MAX_STREAM_DATA: { auto maxStreamRes = decodeMaxStreamDataFrame(cursor); - if (!maxStreamRes.hasValue()) { - return folly::makeUnexpected(maxStreamRes.error()); + if (!maxStreamRes.has_value()) { + return quic::make_unexpected(maxStreamRes.error()); } queue.trimStart(cursor - queue.front()); return QuicFrame(*maxStreamRes); } case FrameType::MAX_STREAMS_BIDI: { auto streamsBidiRes = decodeBiDiMaxStreamsFrame(cursor); - if (!streamsBidiRes.hasValue()) { - return folly::makeUnexpected(streamsBidiRes.error()); + if (!streamsBidiRes.has_value()) { + return quic::make_unexpected(streamsBidiRes.error()); } queue.trimStart(cursor - queue.front()); return QuicFrame(*streamsBidiRes); } case FrameType::MAX_STREAMS_UNI: { auto streamsUniRes = decodeUniMaxStreamsFrame(cursor); - if (!streamsUniRes.hasValue()) { - return folly::makeUnexpected(streamsUniRes.error()); + if (!streamsUniRes.has_value()) { + return quic::make_unexpected(streamsUniRes.error()); } queue.trimStart(cursor - queue.front()); return QuicFrame(*streamsUniRes); } case FrameType::DATA_BLOCKED: { auto blockedRes = decodeDataBlockedFrame(cursor); - if (!blockedRes.hasValue()) { - return folly::makeUnexpected(blockedRes.error()); + if (!blockedRes.has_value()) { + return quic::make_unexpected(blockedRes.error()); } queue.trimStart(cursor - queue.front()); return QuicFrame(*blockedRes); } case FrameType::STREAM_DATA_BLOCKED: { auto streamBlockedRes = decodeStreamDataBlockedFrame(cursor); - if (!streamBlockedRes.hasValue()) { - return folly::makeUnexpected(streamBlockedRes.error()); + if (!streamBlockedRes.has_value()) { + return quic::make_unexpected(streamBlockedRes.error()); } queue.trimStart(cursor - queue.front()); return QuicFrame(*streamBlockedRes); } case FrameType::STREAMS_BLOCKED_BIDI: { auto streamsBidiBlockedRes = decodeBiDiStreamsBlockedFrame(cursor); - if (!streamsBidiBlockedRes.hasValue()) { - return folly::makeUnexpected(streamsBidiBlockedRes.error()); + if (!streamsBidiBlockedRes.has_value()) { + return quic::make_unexpected(streamsBidiBlockedRes.error()); } queue.trimStart(cursor - queue.front()); return QuicFrame(*streamsBidiBlockedRes); } case FrameType::STREAMS_BLOCKED_UNI: { auto streamsUniBlockedRes = decodeUniStreamsBlockedFrame(cursor); - if (!streamsUniBlockedRes.hasValue()) { - return folly::makeUnexpected(streamsUniBlockedRes.error()); + if (!streamsUniBlockedRes.has_value()) { + return quic::make_unexpected(streamsUniBlockedRes.error()); } queue.trimStart(cursor - queue.front()); return QuicFrame(*streamsUniBlockedRes); } case FrameType::NEW_CONNECTION_ID: { auto newConnIdRes = decodeNewConnectionIdFrame(cursor); - if (!newConnIdRes.hasValue()) { - return folly::makeUnexpected(newConnIdRes.error()); + if (!newConnIdRes.has_value()) { + return quic::make_unexpected(newConnIdRes.error()); } queue.trimStart(cursor - queue.front()); return QuicFrame(*newConnIdRes); } case FrameType::RETIRE_CONNECTION_ID: { auto retireConnIdRes = decodeRetireConnectionIdFrame(cursor); - if (!retireConnIdRes.hasValue()) { - return folly::makeUnexpected(retireConnIdRes.error()); + if (!retireConnIdRes.has_value()) { + return quic::make_unexpected(retireConnIdRes.error()); } queue.trimStart(cursor - queue.front()); return QuicFrame(*retireConnIdRes); } case FrameType::PATH_CHALLENGE: { auto pathChallengeRes = decodePathChallengeFrame(cursor); - if (!pathChallengeRes.hasValue()) { - return folly::makeUnexpected(pathChallengeRes.error()); + if (!pathChallengeRes.has_value()) { + return quic::make_unexpected(pathChallengeRes.error()); } queue.trimStart(cursor - queue.front()); return QuicFrame(*pathChallengeRes); } case FrameType::PATH_RESPONSE: { auto pathResponseRes = decodePathResponseFrame(cursor); - if (!pathResponseRes.hasValue()) { - return folly::makeUnexpected(pathResponseRes.error()); + if (!pathResponseRes.has_value()) { + return quic::make_unexpected(pathResponseRes.error()); } queue.trimStart(cursor - queue.front()); return QuicFrame(*pathResponseRes); } case FrameType::CONNECTION_CLOSE: { auto connCloseRes = decodeConnectionCloseFrame(cursor); - if (!connCloseRes.hasValue()) { - return folly::makeUnexpected(connCloseRes.error()); + if (!connCloseRes.has_value()) { + return quic::make_unexpected(connCloseRes.error()); } queue.trimStart(cursor - queue.front()); return QuicFrame(*connCloseRes); } case FrameType::CONNECTION_CLOSE_APP_ERR: { auto appCloseRes = decodeApplicationClose(cursor); - if (!appCloseRes.hasValue()) { - return folly::makeUnexpected(appCloseRes.error()); + if (!appCloseRes.has_value()) { + return quic::make_unexpected(appCloseRes.error()); } queue.trimStart(cursor - queue.front()); return QuicFrame(*appCloseRes); } case FrameType::HANDSHAKE_DONE: { auto handshakeDoneRes = decodeHandshakeDoneFrame(cursor); - if (!handshakeDoneRes.hasValue()) { - return folly::makeUnexpected(handshakeDoneRes.error()); + if (!handshakeDoneRes.has_value()) { + return quic::make_unexpected(handshakeDoneRes.error()); } queue.trimStart(cursor - queue.front()); return QuicFrame(*handshakeDoneRes); } case FrameType::DATAGRAM: { auto datagramRes = decodeDatagramFrame(queue, false /* hasLen */); - if (!datagramRes.hasValue()) { - return folly::makeUnexpected(datagramRes.error()); + if (!datagramRes.has_value()) { + return quic::make_unexpected(datagramRes.error()); } return QuicFrame(*datagramRes); } case FrameType::DATAGRAM_LEN: { auto datagramRes = decodeDatagramFrame(queue, true /* hasLen */); - if (!datagramRes.hasValue()) { - return folly::makeUnexpected(datagramRes.error()); + if (!datagramRes.has_value()) { + return quic::make_unexpected(datagramRes.error()); } return QuicFrame(*datagramRes); } @@ -1155,16 +1155,16 @@ folly::Expected parseFrame( } case FrameType::ACK_FREQUENCY: { auto ackFreqRes = decodeAckFrequencyFrame(cursor); - if (!ackFreqRes.hasValue()) { - return folly::makeUnexpected(ackFreqRes.error()); + if (!ackFreqRes.has_value()) { + return quic::make_unexpected(ackFreqRes.error()); } queue.trimStart(cursor - queue.front()); return QuicFrame(*ackFreqRes); } case FrameType::IMMEDIATE_ACK: { auto immediateAckRes = decodeImmediateAckFrame(cursor); - if (!immediateAckRes.hasValue()) { - return folly::makeUnexpected(immediateAckRes.error()); + if (!immediateAckRes.has_value()) { + return quic::make_unexpected(immediateAckRes.error()); } queue.trimStart(cursor - queue.front()); return QuicFrame(*immediateAckRes); @@ -1180,22 +1180,22 @@ folly::Expected parseFrame( } case FrameType::ACK_EXTENDED: { auto ackExtRes = decodeAckExtendedFrame(cursor, header, params); - if (!ackExtRes.hasValue()) { - return folly::makeUnexpected(ackExtRes.error()); + if (!ackExtRes.has_value()) { + return quic::make_unexpected(ackExtRes.error()); } queue.trimStart(cursor - queue.front()); return QuicFrame(*ackExtRes); } } - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::FRAME_ENCODING_ERROR, fmt::format("Unknown frame, type={}", frameTypeInt->first))); } // Parse packet -folly::Expected decodeRegularPacket( +quic::Expected decodeRegularPacket( PacketHeader&& header, const CodecParameters& params, BufPtr packetData) { @@ -1207,15 +1207,15 @@ folly::Expected decodeRegularPacket( } // Parse out one packet before any conditionals. auto frameRes = parseFrame(queue, packet.header, params); - if (!frameRes.hasValue()) { - return folly::makeUnexpected(frameRes.error()); + if (!frameRes.has_value()) { + return quic::make_unexpected(frameRes.error()); } packet.frames.push_back(std::move(*frameRes)); while (queue.chainLength() > 0) { auto fRes = parseFrame(queue, packet.header, params); - if (!fRes.hasValue()) { - return folly::makeUnexpected(fRes.error()); + if (!fRes.has_value()) { + return quic::make_unexpected(fRes.error()); } if (packet.frames.back().asPaddingFrame() && fRes->asPaddingFrame()) { packet.frames.back().asPaddingFrame()->numFrames++; @@ -1266,48 +1266,48 @@ ParsedLongHeaderInvariant::ParsedLongHeaderInvariant( invariant(std::move(headerInvariant)), invariantLength(length) {} -folly::Expected +quic::Expected parseLongHeaderInvariant(uint8_t initialByte, Cursor& cursor) { size_t initialLength = cursor.totalLength(); if (!cursor.canAdvance(sizeof(QuicVersionType))) { VLOG(5) << "Not enough input bytes to read Version or connection-id"; - return folly::makeUnexpected(TransportErrorCode::FRAME_ENCODING_ERROR); + return quic::make_unexpected(TransportErrorCode::FRAME_ENCODING_ERROR); } auto version = static_cast(cursor.readBE()); if (!cursor.canAdvance(1)) { VLOG(5) << "Not enough input bytes to read Dest. ConnectionId length"; - return folly::makeUnexpected(TransportErrorCode::FRAME_ENCODING_ERROR); + return quic::make_unexpected(TransportErrorCode::FRAME_ENCODING_ERROR); } uint8_t destConnIdLen = cursor.readBE(); if (destConnIdLen > kMaxConnectionIdSize) { VLOG(5) << "destConnIdLen > kMaxConnectionIdSize: " << destConnIdLen; - return folly::makeUnexpected(TransportErrorCode::PROTOCOL_VIOLATION); + return quic::make_unexpected(TransportErrorCode::PROTOCOL_VIOLATION); } if (!cursor.canAdvance(destConnIdLen)) { VLOG(5) << "Not enough input bytes to read Dest. ConnectionId"; - return folly::makeUnexpected(TransportErrorCode::FRAME_ENCODING_ERROR); + return quic::make_unexpected(TransportErrorCode::FRAME_ENCODING_ERROR); } auto destConnIdResult = ConnectionId::create(cursor, destConnIdLen); if (destConnIdResult.hasError()) { - return folly::makeUnexpected(TransportErrorCode::FRAME_ENCODING_ERROR); + return quic::make_unexpected(TransportErrorCode::FRAME_ENCODING_ERROR); } ConnectionId destConnId = destConnIdResult.value(); if (!cursor.canAdvance(1)) { VLOG(5) << "Not enough input bytes to read Source ConnectionId length"; - return folly::makeUnexpected(TransportErrorCode::FRAME_ENCODING_ERROR); + return quic::make_unexpected(TransportErrorCode::FRAME_ENCODING_ERROR); } uint8_t srcConnIdLen = cursor.readBE(); if (srcConnIdLen > kMaxConnectionIdSize) { VLOG(5) << "srcConnIdLen > kMaxConnectionIdSize: " << srcConnIdLen; - return folly::makeUnexpected(TransportErrorCode::PROTOCOL_VIOLATION); + return quic::make_unexpected(TransportErrorCode::PROTOCOL_VIOLATION); } if (!cursor.canAdvance(srcConnIdLen)) { VLOG(5) << "Not enough input bytes to read Source ConnectionId"; - return folly::makeUnexpected(TransportErrorCode::FRAME_ENCODING_ERROR); + return quic::make_unexpected(TransportErrorCode::FRAME_ENCODING_ERROR); } auto srcConnIdResult = ConnectionId::create(cursor, srcConnIdLen); if (srcConnIdResult.hasError()) { - return folly::makeUnexpected(TransportErrorCode::FRAME_ENCODING_ERROR); + return quic::make_unexpected(TransportErrorCode::FRAME_ENCODING_ERROR); } ConnectionId srcConnId = srcConnIdResult.value(); size_t currentLength = cursor.totalLength(); @@ -1351,12 +1351,12 @@ std::pair parsePacketNumber( packetNumLen); } -folly::Expected parseLongHeader( +quic::Expected parseLongHeader( uint8_t initialByte, Cursor& cursor) { if (getHeaderForm(initialByte) != HeaderForm::Long) { VLOG(5) << "Bad header form bit"; - return folly::makeUnexpected(TransportErrorCode::FRAME_ENCODING_ERROR); + return quic::make_unexpected(TransportErrorCode::FRAME_ENCODING_ERROR); } LongHeader::Types type = parseLongHeaderType(initialByte); switch (type) { @@ -1366,14 +1366,14 @@ folly::Expected parseLongHeader( case LongHeader::Types::ZeroRtt: break; default: - return folly::makeUnexpected(TransportErrorCode::FRAME_ENCODING_ERROR); + return quic::make_unexpected(TransportErrorCode::FRAME_ENCODING_ERROR); } auto parsedLongHeaderInvariant = parseLongHeaderInvariant(initialByte, cursor); if (!parsedLongHeaderInvariant) { VLOG(5) << "Bad invariants fields in long header"; - return folly::makeUnexpected(TransportErrorCode::FRAME_ENCODING_ERROR); + return quic::make_unexpected(TransportErrorCode::FRAME_ENCODING_ERROR); } auto version = parsedLongHeaderInvariant->invariant.version; @@ -1383,12 +1383,12 @@ folly::Expected parseLongHeader( auto parsedHeader = parseLongHeaderVariants( type, std::move(*parsedLongHeaderInvariant), cursor); if (!parsedHeader) { - return folly::makeUnexpected(parsedHeader.error()); + return quic::make_unexpected(parsedHeader.error()); } return ParsedLongHeaderResult(false, std::move(*parsedHeader)); } -folly::Expected parseLongHeaderVariants( +quic::Expected parseLongHeaderVariants( LongHeader::Types type, ParsedLongHeaderInvariant parsedLongHeaderInvariant, Cursor& cursor, @@ -1399,7 +1399,7 @@ folly::Expected parseLongHeaderVariants( // be > kRetryIntegrityTagLen. if (cursor.totalLength() <= kRetryIntegrityTagLen) { VLOG(5) << "Not enough bytes for retry token"; - return folly::makeUnexpected(TransportErrorCode::FRAME_ENCODING_ERROR); + return quic::make_unexpected(TransportErrorCode::FRAME_ENCODING_ERROR); } BufPtr token; @@ -1420,7 +1420,7 @@ folly::Expected parseLongHeaderVariants( kMinInitialDestinationConnIdLength) { VLOG(5) << "Dest Conn-Id length in client initial packet must be >= 8 bytes."; - return folly::makeUnexpected(TransportErrorCode::FRAME_ENCODING_ERROR); + return quic::make_unexpected(TransportErrorCode::FRAME_ENCODING_ERROR); } BufPtr token; @@ -1428,11 +1428,11 @@ folly::Expected parseLongHeaderVariants( auto tokenLen = decodeQuicInteger(cursor); if (!tokenLen) { VLOG(5) << "Token len not found in Long header"; - return folly::makeUnexpected(TransportErrorCode::FRAME_ENCODING_ERROR); + return quic::make_unexpected(TransportErrorCode::FRAME_ENCODING_ERROR); } if (!cursor.canAdvance(tokenLen->first)) { VLOG(5) << "Not enough input bytes to read input token"; - return folly::makeUnexpected(TransportErrorCode::FRAME_ENCODING_ERROR); + return quic::make_unexpected(TransportErrorCode::FRAME_ENCODING_ERROR); } if (tokenLen->first > 0) { @@ -1445,19 +1445,19 @@ folly::Expected parseLongHeaderVariants( auto pktLen = decodeQuicInteger(cursor); if (!pktLen) { VLOG(5) << "Packet len not found in Long header"; - return folly::makeUnexpected(TransportErrorCode::FRAME_ENCODING_ERROR); + return quic::make_unexpected(TransportErrorCode::FRAME_ENCODING_ERROR); } if (!cursor.canAdvance(pktLen->first)) { VLOG(5) << "Not enough input bytes to read packet number"; - return folly::makeUnexpected(TransportErrorCode::FRAME_ENCODING_ERROR); + return quic::make_unexpected(TransportErrorCode::FRAME_ENCODING_ERROR); } size_t packetNumLen = parsePacketNumberLength(parsedLongHeaderInvariant.initialByte); if (!cursor.canAdvance(packetNumLen)) { - return folly::makeUnexpected(TransportErrorCode::FRAME_ENCODING_ERROR); + return quic::make_unexpected(TransportErrorCode::FRAME_ENCODING_ERROR); } if (packetNumLen > kMaxPacketNumEncodingSize) { - return folly::makeUnexpected(TransportErrorCode::FRAME_ENCODING_ERROR); + return quic::make_unexpected(TransportErrorCode::FRAME_ENCODING_ERROR); } return ParsedLongHeader( LongHeader( @@ -1467,54 +1467,54 @@ folly::Expected parseLongHeaderVariants( PacketLength(pktLen->first, pktLen->second)); } -folly::Expected +quic::Expected parseShortHeaderInvariants( uint8_t initialByte, Cursor& cursor, size_t dstConnIdSize) { if (getHeaderForm(initialByte) != HeaderForm::Short) { VLOG(5) << "Bad header form bit"; - return folly::makeUnexpected(TransportErrorCode::FRAME_ENCODING_ERROR); + return quic::make_unexpected(TransportErrorCode::FRAME_ENCODING_ERROR); } // TODO(t39154014, yangchi): read the length from the connection state in // draft-17 if (dstConnIdSize > kMaxConnectionIdSize) { VLOG(5) << "dstConnIdSize > kMaxConnectionIdSize: " << dstConnIdSize; - return folly::makeUnexpected(TransportErrorCode::PROTOCOL_VIOLATION); + return quic::make_unexpected(TransportErrorCode::PROTOCOL_VIOLATION); } if (!cursor.canAdvance(dstConnIdSize)) { VLOG(5) << "Not enough input bytes for ConnectionId"; - return folly::makeUnexpected(TransportErrorCode::FRAME_ENCODING_ERROR); + return quic::make_unexpected(TransportErrorCode::FRAME_ENCODING_ERROR); } auto connIdResult = ConnectionId::create(cursor, dstConnIdSize); if (connIdResult.hasError()) { - return folly::makeUnexpected(TransportErrorCode::FRAME_ENCODING_ERROR); + return quic::make_unexpected(TransportErrorCode::FRAME_ENCODING_ERROR); } ConnectionId connId = connIdResult.value(); return ShortHeaderInvariant(std::move(connId)); } -folly::Expected +quic::Expected parseShortHeader(uint8_t initialByte, Cursor& cursor, size_t dstConnIdSize) { if (getHeaderForm(initialByte) != HeaderForm::Short) { VLOG(5) << "Bad header form bit"; - return folly::makeUnexpected(TransportErrorCode::FRAME_ENCODING_ERROR); + return quic::make_unexpected(TransportErrorCode::FRAME_ENCODING_ERROR); } if (!(initialByte & ShortHeader::kFixedBitMask)) { VLOG(5) << "Fixed bit in ShortHeader is 0"; // Specs doesn't say which error code to use - return folly::makeUnexpected(TransportErrorCode::FRAME_ENCODING_ERROR); + return quic::make_unexpected(TransportErrorCode::FRAME_ENCODING_ERROR); } if (initialByte & ShortHeader::kReservedBitsMask) { VLOG(5) << "Non-zero reserved bits in ShortHeader"; // Specs asks this to be PROTOCOL_VIOLATION - return folly::makeUnexpected(TransportErrorCode::PROTOCOL_VIOLATION); + return quic::make_unexpected(TransportErrorCode::PROTOCOL_VIOLATION); } auto invariant = parseShortHeaderInvariants(initialByte, cursor, dstConnIdSize); if (!invariant) { VLOG(5) << "Error parsing short header invariant"; - return folly::makeUnexpected(TransportErrorCode::FRAME_ENCODING_ERROR); + return quic::make_unexpected(TransportErrorCode::FRAME_ENCODING_ERROR); } auto protectionType = initialByte & ShortHeader::kKeyPhaseMask ? ProtectionType::KeyPhaseOne diff --git a/quic/codec/Decode.h b/quic/codec/Decode.h index 9ca8dd151..ccf7219da 100644 --- a/quic/codec/Decode.h +++ b/quic/codec/Decode.h @@ -11,6 +11,7 @@ #include #include #include +#include #include namespace quic { @@ -69,7 +70,7 @@ Optional decodeVersionNegotiation( * Throws with a QuicException if the data in the cursor is not a complete QUIC * packet or the packet could not be decoded correctly. */ -[[nodiscard]] folly::Expected decodeRegularPacket( +[[nodiscard]] quic::Expected decodeRegularPacket( PacketHeader&& header, const CodecParameters& params, BufPtr packetData); @@ -78,7 +79,7 @@ Optional decodeVersionNegotiation( * Parses a single frame from the queue. Throws a QuicException if the frame * could not be parsed. */ -[[nodiscard]] folly::Expected parseFrame( +[[nodiscard]] quic::Expected parseFrame( BufQueue& queue, const PacketHeader& header, const CodecParameters& params); @@ -87,111 +88,111 @@ Optional decodeVersionNegotiation( * The following functions decode frames. They return an Expected with error * when decoding fails. */ -[[nodiscard]] folly::Expected decodePaddingFrame( +[[nodiscard]] quic::Expected decodePaddingFrame( Cursor& cursor); -[[nodiscard]] folly::Expected decodeRstStreamFrame( +[[nodiscard]] quic::Expected decodeRstStreamFrame( Cursor& cursor, bool reliable); -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected decodeConnectionCloseFrame(Cursor& cursor); -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected decodeApplicationClose(Cursor& cursor); -[[nodiscard]] folly::Expected decodeMaxDataFrame( +[[nodiscard]] quic::Expected decodeMaxDataFrame( Cursor& cursor); -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected decodeMaxStreamDataFrame(Cursor& cursor); -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected decodeBiDiMaxStreamsFrame(Cursor& cursor); -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected decodeUniMaxStreamsFrame(Cursor& cursor); -[[nodiscard]] folly::Expected decodePingFrame( +[[nodiscard]] quic::Expected decodePingFrame( Cursor& cursor); -[[nodiscard]] folly::Expected decodeKnobFrame( +[[nodiscard]] quic::Expected decodeKnobFrame( Cursor& cursor); -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected decodeAckFrequencyFrame(Cursor& cursor); -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected decodeImmediateAckFrame(Cursor& cursor); -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected decodeDataBlockedFrame(Cursor& cursor); -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected decodeStreamDataBlockedFrame(Cursor& cursor); -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected decodeBiDiStreamsBlockedFrame(Cursor& cursor); -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected decodeUniStreamsBlockedFrame(Cursor& cursor); -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected decodeNewConnectionIdFrame(Cursor& cursor); -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected decodeRetireConnectionIdFrame(Cursor& cursor); -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected decodeStopSendingFrame(Cursor& cursor); -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected decodePathChallengeFrame(Cursor& cursor); -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected decodePathResponseFrame(Cursor& cursor); -[[nodiscard]] folly::Expected decodeAckFrame( +[[nodiscard]] quic::Expected decodeAckFrame( Cursor& cursor, const PacketHeader& header, const CodecParameters& params, FrameType frameType = FrameType::ACK); -[[nodiscard]] folly::Expected decodeAckExtendedFrame( +[[nodiscard]] quic::Expected decodeAckExtendedFrame( Cursor& cursor, const PacketHeader& header, const CodecParameters& params); -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected decodeAckFrameWithReceivedTimestamps( Cursor& cursor, const PacketHeader& header, const CodecParameters& params, FrameType frameType); -[[nodiscard]] folly::Expected decodeAckFrameWithECN( +[[nodiscard]] quic::Expected decodeAckFrameWithECN( Cursor& cursor, const PacketHeader& header, const CodecParameters& params); -[[nodiscard]] folly::Expected decodeStreamFrame( +[[nodiscard]] quic::Expected decodeStreamFrame( BufQueue& queue, StreamTypeField frameTypeField, bool isGroupFrame = false); -[[nodiscard]] folly::Expected decodeCryptoFrame( +[[nodiscard]] quic::Expected decodeCryptoFrame( Cursor& cursor); -[[nodiscard]] folly::Expected decodeNewTokenFrame( +[[nodiscard]] quic::Expected decodeNewTokenFrame( Cursor& cursor); -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected decodeHandshakeDoneFrame(Cursor& cursor); -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected parsePlaintextRetryOrNewToken(Cursor& cursor); -[[nodiscard]] folly::Expected decodeDatagramFrame( +[[nodiscard]] quic::Expected decodeDatagramFrame( BufQueue& queue, bool hasLen); @@ -201,7 +202,7 @@ parsePlaintextRetryOrNewToken(Cursor& cursor); * cursor: points to the byte just past initialByte. After parsing, cursor * will be moved to the byte right after Source Connection ID. */ -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected parseLongHeaderInvariant(uint8_t initalByte, Cursor& cursor); struct PacketLength { @@ -247,29 +248,29 @@ std::pair parsePacketNumber( PacketNum expectedNextPacketNum); // cursor: has to be point to the byte just past initialByte -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected parseLongHeader(uint8_t initialByte, Cursor& cursor); // nodeType: Determine if we allow 0-len dst connection ids. -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected parseLongHeaderVariants( LongHeader::Types type, ParsedLongHeaderInvariant longHeaderInvariant, Cursor& cursor, QuicNodeType nodeType = QuicNodeType::Server); -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected parseShortHeaderInvariants( uint8_t initialByte, Cursor& cursor, size_t dstConnIdSize = kDefaultConnectionIdSize); -[[nodiscard]] folly::Expected parseShortHeader( +[[nodiscard]] quic::Expected parseShortHeader( uint8_t initialByte, Cursor& cursor, size_t dstConnIdSize = kDefaultConnectionIdSize); -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected convertEncodedDurationToMicroseconds( uint8_t exponentToUse, uint64_t delay) noexcept; diff --git a/quic/codec/DefaultConnectionIdAlgo.cpp b/quic/codec/DefaultConnectionIdAlgo.cpp index 025c282d6..40e9e383f 100644 --- a/quic/codec/DefaultConnectionIdAlgo.cpp +++ b/quic/codec/DefaultConnectionIdAlgo.cpp @@ -33,11 +33,11 @@ constexpr uint8_t kShortVersionBitsMask = 0xc0; /** * Sets the short version id bits (0 - 1) into the given ConnectionId */ -folly::Expected setVersionBitsInConnId( +quic::Expected setVersionBitsInConnId( quic::ConnectionId& connId, quic::ConnectionIdVersion version) noexcept { if (UNLIKELY(connId.size() == 0)) { - return folly::makeUnexpected(quic::QuicError( + return quic::make_unexpected(quic::QuicError( quic::TransportErrorCode::INTERNAL_ERROR, "ConnectionId is too small for version")); } @@ -45,16 +45,16 @@ folly::Expected setVersionBitsInConnId( connId.data()[0] &= (~kShortVersionBitsMask); connId.data()[0] |= (kShortVersionBitsMask & (static_cast(version) << 6)); - return folly::unit; + return {}; } /** * Extract the version id bits (0 - 1) from the given ConnectionId */ -folly::Expected +quic::Expected getVersionBitsFromConnId(const quic::ConnectionId& connId) noexcept { if (UNLIKELY(connId.size() == 0)) { - return folly::makeUnexpected(quic::QuicError( + return quic::make_unexpected(quic::QuicError( quic::TransportErrorCode::INTERNAL_ERROR, "ConnectionId is too small for version")); } @@ -66,13 +66,13 @@ getVersionBitsFromConnId(const quic::ConnectionId& connId) noexcept { /** * Sets the host id bits into the given ConnectionId */ -folly::Expected setHostIdBitsInConnId( +quic::Expected setHostIdBitsInConnId( quic::ConnectionId& connId, uint32_t hostId, quic::ConnectionIdVersion version) noexcept { if (version == quic::ConnectionIdVersion::V1) { if (UNLIKELY(connId.size() < quic::kMinSelfConnectionIdV1Size)) { - return folly::makeUnexpected(quic::QuicError( + return quic::make_unexpected(quic::QuicError( quic::TransportErrorCode::INTERNAL_ERROR, "ConnectionId is too small for hostid V1")); } @@ -90,20 +90,20 @@ folly::Expected setHostIdBitsInConnId( connId.data()[1] |= (kHostIdV1SecondByteMask & (hostIdV1 >> 2)); // set 16 - 17 bits in the connId with the last 2 bits of the worker id connId.data()[2] |= (kHostIdV1ThirdByteMask & (hostIdV1 << 6)); - return folly::unit; + return {}; } else if (version == quic::ConnectionIdVersion::V2) { if (UNLIKELY(connId.size() < quic::kMinSelfConnectionIdV2Size)) { - return folly::makeUnexpected(quic::QuicError( + return quic::make_unexpected(quic::QuicError( quic::TransportErrorCode::INTERNAL_ERROR, "ConnectionId is too small for hostid V2")); } connId.data()[1] = hostId >> 16; connId.data()[2] = hostId >> 8; connId.data()[3] = hostId; - return folly::unit; + return {}; } else if (version == quic::ConnectionIdVersion::V3) { if (UNLIKELY(connId.size() < quic::kMinSelfConnectionIdV3Size)) { - return folly::makeUnexpected(quic::QuicError( + return quic::make_unexpected(quic::QuicError( quic::TransportErrorCode::INTERNAL_ERROR, "ConnectionId is too small for hostid V3")); } @@ -111,9 +111,9 @@ folly::Expected setHostIdBitsInConnId( connId.data()[2] = hostId >> 16; connId.data()[3] = hostId >> 8; connId.data()[4] = hostId; - return folly::unit; + return {}; } else { - return folly::makeUnexpected(quic::QuicError( + return quic::make_unexpected(quic::QuicError( quic::TransportErrorCode::INTERNAL_ERROR, "Unsupported CID version")); } } @@ -121,11 +121,11 @@ folly::Expected setHostIdBitsInConnId( /** * Extract the host id bits from the given ConnectionId */ -folly::Expected getHostIdBitsInConnId( +quic::Expected getHostIdBitsInConnId( const quic::ConnectionId& connId, quic::ConnectionIdVersion version) noexcept { if (UNLIKELY(connId.size() < quic::kMinSelfConnectionIdV1Size)) { - return folly::makeUnexpected(quic::QuicError( + return quic::make_unexpected(quic::QuicError( quic::TransportErrorCode::INTERNAL_ERROR, "ConnectionId is too small for hostid")); } @@ -142,7 +142,7 @@ folly::Expected getHostIdBitsInConnId( return hostId; } else if (version == quic::ConnectionIdVersion::V2) { if (UNLIKELY(connId.size() < quic::kMinSelfConnectionIdV2Size)) { - return folly::makeUnexpected(quic::QuicError( + return quic::make_unexpected(quic::QuicError( quic::TransportErrorCode::INTERNAL_ERROR, "ConnectionId is too small for hostid V2")); } @@ -153,7 +153,7 @@ folly::Expected getHostIdBitsInConnId( return hostId; } else if (version == quic::ConnectionIdVersion::V3) { if (UNLIKELY(connId.size() < quic::kMinSelfConnectionIdV3Size)) { - return folly::makeUnexpected(quic::QuicError( + return quic::make_unexpected(quic::QuicError( quic::TransportErrorCode::INTERNAL_ERROR, "ConnectionId is too small for hostid V3")); } @@ -164,7 +164,7 @@ folly::Expected getHostIdBitsInConnId( hostId |= connId.data()[4]; return hostId; } else { - return folly::makeUnexpected(quic::QuicError( + return quic::make_unexpected(quic::QuicError( quic::TransportErrorCode::INTERNAL_ERROR, "Unsupported CID version")); } } @@ -172,13 +172,13 @@ folly::Expected getHostIdBitsInConnId( /** * Sets the given 8-bit workerId into the given connectionId's */ -folly::Expected setWorkerIdBitsInConnId( +quic::Expected setWorkerIdBitsInConnId( quic::ConnectionId& connId, uint8_t workerId, quic::ConnectionIdVersion version) noexcept { if (version == quic::ConnectionIdVersion::V1) { if (UNLIKELY(connId.size() < quic::kMinSelfConnectionIdV1Size)) { - return folly::makeUnexpected(quic::QuicError( + return quic::make_unexpected(quic::QuicError( quic::TransportErrorCode::INTERNAL_ERROR, "ConnectionId is too small for workerid")); } @@ -190,25 +190,25 @@ folly::Expected setWorkerIdBitsInConnId( connId.data()[2] |= (kWorkerIdV1FirstByteMask & workerId) >> 2; // set 24 - 25 bits in the connId with the last 2 bits of the worker id connId.data()[3] |= (kWorkerIdV1SecondByteMask & workerId) << 6; - return folly::unit; + return {}; } else if (version == quic::ConnectionIdVersion::V2) { if (UNLIKELY(connId.size() < quic::kMinSelfConnectionIdV2Size)) { - return folly::makeUnexpected(quic::QuicError( + return quic::make_unexpected(quic::QuicError( quic::TransportErrorCode::INTERNAL_ERROR, "ConnectionId is too small for hostid V2")); } connId.data()[4] = workerId; - return folly::unit; + return {}; } else if (version == quic::ConnectionIdVersion::V3) { if (UNLIKELY(connId.size() < quic::kMinSelfConnectionIdV3Size)) { - return folly::makeUnexpected(quic::QuicError( + return quic::make_unexpected(quic::QuicError( quic::TransportErrorCode::INTERNAL_ERROR, "ConnectionId is too small for hostid V3")); } connId.data()[5] = workerId; - return folly::unit; + return {}; } else { - return folly::makeUnexpected(quic::QuicError( + return quic::make_unexpected(quic::QuicError( quic::TransportErrorCode::INTERNAL_ERROR, "Unsupported CID version")); } } @@ -216,12 +216,12 @@ folly::Expected setWorkerIdBitsInConnId( /** * Extracts the 'workerId' bits from the given ConnectionId */ -folly::Expected getWorkerIdFromConnId( +quic::Expected getWorkerIdFromConnId( const quic::ConnectionId& connId, quic::ConnectionIdVersion version) noexcept { if (version == quic::ConnectionIdVersion::V1) { if (UNLIKELY(connId.size() < quic::kMinSelfConnectionIdV1Size)) { - return folly::makeUnexpected(quic::QuicError( + return quic::make_unexpected(quic::QuicError( quic::TransportErrorCode::INTERNAL_ERROR, "ConnectionId is too small for workerid")); } @@ -232,20 +232,20 @@ folly::Expected getWorkerIdFromConnId( return workerId; } else if (version == quic::ConnectionIdVersion::V2) { if (UNLIKELY(connId.size() < quic::kMinSelfConnectionIdV2Size)) { - return folly::makeUnexpected(quic::QuicError( + return quic::make_unexpected(quic::QuicError( quic::TransportErrorCode::INTERNAL_ERROR, "ConnectionId is too small for workerid V2")); } return connId.data()[4]; } else if (version == quic::ConnectionIdVersion::V3) { if (UNLIKELY(connId.size() < quic::kMinSelfConnectionIdV3Size)) { - return folly::makeUnexpected(quic::QuicError( + return quic::make_unexpected(quic::QuicError( quic::TransportErrorCode::INTERNAL_ERROR, "ConnectionId is too small for workerid V3")); } return connId.data()[5]; } else { - return folly::makeUnexpected(quic::QuicError( + return quic::make_unexpected(quic::QuicError( quic::TransportErrorCode::INTERNAL_ERROR, "Unsupported CID version")); } } @@ -253,42 +253,42 @@ folly::Expected getWorkerIdFromConnId( /** * Sets the server id bit into the given ConnectionId */ -folly::Expected setProcessIdBitsInConnId( +quic::Expected setProcessIdBitsInConnId( quic::ConnectionId& connId, uint8_t processId, quic::ConnectionIdVersion version) noexcept { if (version == quic::ConnectionIdVersion::V1) { if (UNLIKELY(connId.size() < quic::kMinSelfConnectionIdV1Size)) { - return folly::makeUnexpected(quic::QuicError( + return quic::make_unexpected(quic::QuicError( quic::TransportErrorCode::INTERNAL_ERROR, "ConnectionId is too small for processid")); } // clear the 26th bit connId.data()[3] &= (~kProcessIdV1BitMask); connId.data()[3] |= (kProcessIdV1BitMask & (processId << 5)); - return folly::unit; + return {}; } else if (version == quic::ConnectionIdVersion::V2) { if (UNLIKELY(connId.size() < quic::kMinSelfConnectionIdV2Size)) { - return folly::makeUnexpected(quic::QuicError( + return quic::make_unexpected(quic::QuicError( quic::TransportErrorCode::INTERNAL_ERROR, "ConnectionId is too small for processid V2")); } // clear the 40th bit connId.data()[5] &= (~kProcessIdV2BitMask); connId.data()[5] |= (kProcessIdV2BitMask & (processId << 7)); - return folly::unit; + return {}; } else if (version == quic::ConnectionIdVersion::V3) { if (UNLIKELY(connId.size() < quic::kMinSelfConnectionIdV3Size)) { - return folly::makeUnexpected(quic::QuicError( + return quic::make_unexpected(quic::QuicError( quic::TransportErrorCode::INTERNAL_ERROR, "ConnectionId is too small for processid V3")); } // clear the 40th bit connId.data()[6] &= (~kProcessIdV3BitMask); connId.data()[6] |= (kProcessIdV3BitMask & (processId << 7)); - return folly::unit; + return {}; } else { - return folly::makeUnexpected(quic::QuicError( + return quic::make_unexpected(quic::QuicError( quic::TransportErrorCode::INTERNAL_ERROR, "Unsupported CID version")); } } @@ -296,12 +296,12 @@ folly::Expected setProcessIdBitsInConnId( /** * Extract the server id bit (at 26th bit) from the given ConnectionId */ -folly::Expected getProcessIdBitsFromConnId( +quic::Expected getProcessIdBitsFromConnId( const quic::ConnectionId& connId, quic::ConnectionIdVersion version) noexcept { if (version == quic::ConnectionIdVersion::V1) { if (connId.size() < quic::kMinSelfConnectionIdV1Size) { - return folly::makeUnexpected(quic::QuicError( + return quic::make_unexpected(quic::QuicError( quic::TransportErrorCode::INTERNAL_ERROR, "ConnectionId is too small for processid")); } @@ -310,7 +310,7 @@ folly::Expected getProcessIdBitsFromConnId( return processId; } else if (version == quic::ConnectionIdVersion::V2) { if (UNLIKELY(connId.size() < quic::kMinSelfConnectionIdV2Size)) { - return folly::makeUnexpected(quic::QuicError( + return quic::make_unexpected(quic::QuicError( quic::TransportErrorCode::INTERNAL_ERROR, "ConnectionId is too small for processid V2")); } @@ -319,7 +319,7 @@ folly::Expected getProcessIdBitsFromConnId( return processId; } else if (version == quic::ConnectionIdVersion::V3) { if (UNLIKELY(connId.size() < quic::kMinSelfConnectionIdV3Size)) { - return folly::makeUnexpected(quic::QuicError( + return quic::make_unexpected(quic::QuicError( quic::TransportErrorCode::INTERNAL_ERROR, "ConnectionId is too small for processid V3")); } @@ -327,7 +327,7 @@ folly::Expected getProcessIdBitsFromConnId( processId = (kProcessIdV3BitMask & connId.data()[6]) >> 7; return processId; } else { - return folly::makeUnexpected(quic::QuicError( + return quic::make_unexpected(quic::QuicError( quic::TransportErrorCode::INTERNAL_ERROR, "Unsupported CID version")); } } @@ -352,62 +352,67 @@ bool DefaultConnectionIdAlgo::canParse(const ConnectionId& id) const noexcept { } } -folly::Expected +quic::Expected DefaultConnectionIdAlgo::parseConnectionIdDefault( const ConnectionId& id) noexcept { auto expectingVersion = getVersionBitsFromConnId(id); if (UNLIKELY(!expectingVersion)) { - return folly::makeUnexpected(expectingVersion.error()); + return quic::make_unexpected(expectingVersion.error()); } auto expectingHost = getHostIdBitsInConnId(id, *expectingVersion); if (UNLIKELY(!expectingHost)) { - return folly::makeUnexpected(expectingHost.error()); + return quic::make_unexpected(expectingHost.error()); } auto expectingProcess = getProcessIdBitsFromConnId(id, *expectingVersion); if (UNLIKELY(!expectingProcess)) { - return folly::makeUnexpected(expectingProcess.error()); + return quic::make_unexpected(expectingProcess.error()); } auto expectingWorker = getWorkerIdFromConnId(id, *expectingVersion); if (UNLIKELY(!expectingWorker)) { - return folly::makeUnexpected(expectingWorker.error()); + return quic::make_unexpected(expectingWorker.error()); } ServerConnectionIdParams serverConnIdParams( *expectingVersion, *expectingHost, *expectingProcess, *expectingWorker); return serverConnIdParams; } -folly::Expected +quic::Expected DefaultConnectionIdAlgo::parseConnectionId(const ConnectionId& id) noexcept { return parseConnectionIdDefault(id); } -folly::Expected +quic::Expected DefaultConnectionIdAlgo::encodeConnectionId( const ServerConnectionIdParams& params) noexcept { // Create a random connection id using createRandom auto connIdExpected = ConnectionId::createRandom(kDefaultConnectionIdSize); if (!connIdExpected) { - return folly::makeUnexpected(connIdExpected.error()); + return quic::make_unexpected(connIdExpected.error()); } ConnectionId connId = std::move(*connIdExpected); - auto expected = - setVersionBitsInConnId(connId, params.version) - .then([&](auto) { - return setHostIdBitsInConnId(connId, params.hostId, params.version); - }) - .then([&](auto) { - return setProcessIdBitsInConnId( - connId, params.processId, params.version); - }) - .then([&](auto) { - return setWorkerIdBitsInConnId( - connId, params.workerId, params.version); - }); - if (UNLIKELY(expected.hasError())) { - // Convert QuicInternalException to QuicError - return folly::makeUnexpected(QuicError( - TransportErrorCode::INTERNAL_ERROR, "Failed to encode connection ID")); + + auto versionResult = setVersionBitsInConnId(connId, params.version); + if (UNLIKELY(!versionResult.has_value())) { + return quic::make_unexpected(versionResult.error()); + } + + auto hostIdResult = + setHostIdBitsInConnId(connId, params.hostId, params.version); + if (UNLIKELY(!hostIdResult.has_value())) { + return quic::make_unexpected(hostIdResult.error()); + } + + auto processIdResult = + setProcessIdBitsInConnId(connId, params.processId, params.version); + if (UNLIKELY(!processIdResult.has_value())) { + return quic::make_unexpected(processIdResult.error()); + } + + auto workerIdResult = + setWorkerIdBitsInConnId(connId, params.workerId, params.version); + if (UNLIKELY(!workerIdResult.has_value())) { + return quic::make_unexpected(workerIdResult.error()); } return connId; } diff --git a/quic/codec/DefaultConnectionIdAlgo.h b/quic/codec/DefaultConnectionIdAlgo.h index a0cb4a8e8..856dd1107 100644 --- a/quic/codec/DefaultConnectionIdAlgo.h +++ b/quic/codec/DefaultConnectionIdAlgo.h @@ -7,10 +7,10 @@ #pragma once -#include #include #include #include +#include namespace quic { @@ -54,7 +54,7 @@ class DefaultConnectionIdAlgo : public ConnectionIdAlgo { public: ~DefaultConnectionIdAlgo() override = default; - static folly::Expected + static quic::Expected parseConnectionIdDefault(const ConnectionId& id) noexcept; /** @@ -65,13 +65,13 @@ class DefaultConnectionIdAlgo : public ConnectionIdAlgo { /** * Parses ServerConnectionIdParams from the given connection id. */ - folly::Expected parseConnectionId( + quic::Expected parseConnectionId( const ConnectionId& id) noexcept override; /** * Encodes the given ServerConnectionIdParams into connection id */ - folly::Expected encodeConnectionId( + quic::Expected encodeConnectionId( const ServerConnectionIdParams& params) noexcept override; }; diff --git a/quic/codec/PacketNumberCipher.cpp b/quic/codec/PacketNumberCipher.cpp index cc3e40fea..03ebb43dc 100644 --- a/quic/codec/PacketNumberCipher.cpp +++ b/quic/codec/PacketNumberCipher.cpp @@ -13,7 +13,7 @@ namespace quic { -folly::Expected PacketNumberCipher::decipherHeader( +quic::Expected PacketNumberCipher::decipherHeader( ByteRange sample, MutableByteRange initialByte, MutableByteRange packetNumberBytes, @@ -22,7 +22,7 @@ folly::Expected PacketNumberCipher::decipherHeader( CHECK_EQ(packetNumberBytes.size(), kMaxPacketNumEncodingSize); auto maskResult = mask(sample); if (maskResult.hasError()) { - return folly::makeUnexpected(maskResult.error()); + return quic::make_unexpected(maskResult.error()); } HeaderProtectionMask headerMask = std::move(maskResult.value()); // Mask size should be > packet number length + 1. @@ -32,10 +32,10 @@ folly::Expected PacketNumberCipher::decipherHeader( for (size_t i = 0; i < packetNumLength; ++i) { packetNumberBytes.data()[i] ^= headerMask.data()[i + 1]; } - return folly::unit; + return {}; } -folly::Expected PacketNumberCipher::cipherHeader( +quic::Expected PacketNumberCipher::cipherHeader( ByteRange sample, MutableByteRange initialByte, MutableByteRange packetNumberBytes, @@ -43,7 +43,7 @@ folly::Expected PacketNumberCipher::cipherHeader( uint8_t /* packetNumLengthMask */) const { auto maskResult = mask(sample); if (maskResult.hasError()) { - return folly::makeUnexpected(maskResult.error()); + return quic::make_unexpected(maskResult.error()); } HeaderProtectionMask headerMask = std::move(maskResult.value()); // Mask size should be > packet number length + 1. @@ -53,10 +53,10 @@ folly::Expected PacketNumberCipher::cipherHeader( for (size_t i = 0; i < packetNumLength; ++i) { packetNumberBytes.data()[i] ^= headerMask.data()[i + 1]; } - return folly::unit; + return {}; } -folly::Expected PacketNumberCipher::decryptLongHeader( +quic::Expected PacketNumberCipher::decryptLongHeader( ByteRange sample, MutableByteRange initialByte, MutableByteRange packetNumberBytes) const { @@ -68,7 +68,7 @@ folly::Expected PacketNumberCipher::decryptLongHeader( LongHeader::kPacketNumLenMask); } -folly::Expected PacketNumberCipher::decryptShortHeader( +quic::Expected PacketNumberCipher::decryptShortHeader( ByteRange sample, MutableByteRange initialByte, MutableByteRange packetNumberBytes) const { @@ -80,7 +80,7 @@ folly::Expected PacketNumberCipher::decryptShortHeader( ShortHeader::kPacketNumLenMask); } -folly::Expected PacketNumberCipher::encryptLongHeader( +quic::Expected PacketNumberCipher::encryptLongHeader( ByteRange sample, MutableByteRange initialByte, MutableByteRange packetNumberBytes) const { @@ -92,7 +92,7 @@ folly::Expected PacketNumberCipher::encryptLongHeader( LongHeader::kPacketNumLenMask); } -folly::Expected PacketNumberCipher::encryptShortHeader( +quic::Expected PacketNumberCipher::encryptShortHeader( ByteRange sample, MutableByteRange initialByte, MutableByteRange packetNumberBytes) const { diff --git a/quic/codec/PacketNumberCipher.h b/quic/codec/PacketNumberCipher.h index fc02efb81..78dfda4d7 100644 --- a/quic/codec/PacketNumberCipher.h +++ b/quic/codec/PacketNumberCipher.h @@ -7,11 +7,11 @@ #pragma once -#include #include #include #include #include +#include #include namespace quic { @@ -23,10 +23,10 @@ class PacketNumberCipher { public: virtual ~PacketNumberCipher() = default; - [[nodiscard]] virtual folly::Expected setKey( + [[nodiscard]] virtual quic::Expected setKey( ByteRange key) = 0; - [[nodiscard]] virtual folly::Expected mask( + [[nodiscard]] virtual quic::Expected mask( ByteRange sample) const = 0; /** @@ -35,8 +35,7 @@ class PacketNumberCipher { * initialByte is the initial byte. * packetNumberBytes should be supplied with at least 4 bytes. */ - [[nodiscard]] virtual folly::Expected - decryptLongHeader( + [[nodiscard]] virtual quic::Expected decryptLongHeader( ByteRange sample, MutableByteRange initialByte, MutableByteRange packetNumberBytes) const; @@ -47,8 +46,7 @@ class PacketNumberCipher { * initialByte is the initial byte. * packetNumberBytes should be supplied with at least 4 bytes. */ - [[nodiscard]] virtual folly::Expected - decryptShortHeader( + [[nodiscard]] virtual quic::Expected decryptShortHeader( ByteRange sample, MutableByteRange initialByte, MutableByteRange packetNumberBytes) const; @@ -58,8 +56,7 @@ class PacketNumberCipher { * sample should be 16 bytes long. * initialByte is the initial byte. */ - [[nodiscard]] virtual folly::Expected - encryptLongHeader( + [[nodiscard]] virtual quic::Expected encryptLongHeader( ByteRange sample, MutableByteRange initialByte, MutableByteRange packetNumberBytes) const; @@ -69,8 +66,7 @@ class PacketNumberCipher { * sample should be 16 bytes long. * initialByte is the initial byte. */ - [[nodiscard]] virtual folly::Expected - encryptShortHeader( + [[nodiscard]] virtual quic::Expected encryptShortHeader( ByteRange sample, MutableByteRange initialByte, MutableByteRange packetNumberBytes) const; @@ -86,14 +82,14 @@ class PacketNumberCipher { [[nodiscard]] virtual const BufPtr& getKey() const = 0; protected: - [[nodiscard]] virtual folly::Expected cipherHeader( + [[nodiscard]] virtual quic::Expected cipherHeader( ByteRange sample, MutableByteRange initialByte, MutableByteRange packetNumberBytes, uint8_t initialByteMask, uint8_t packetNumLengthMask) const; - [[nodiscard]] virtual folly::Expected decipherHeader( + [[nodiscard]] virtual quic::Expected decipherHeader( ByteRange sample, MutableByteRange initialByte, MutableByteRange packetNumberBytes, diff --git a/quic/codec/QuicConnectionId.cpp b/quic/codec/QuicConnectionId.cpp index d8e9ac685..3ae6c90b3 100644 --- a/quic/codec/QuicConnectionId.cpp +++ b/quic/codec/QuicConnectionId.cpp @@ -50,13 +50,13 @@ ConnectionId::ConnectionId(Cursor& cursor, size_t len) { cursor.pull(connid.data(), len); } -folly::Expected ConnectionId::create( +quic::Expected ConnectionId::create( const std::vector& connidIn) { static_assert( std::numeric_limits::max() > kMaxConnectionIdSize, "Max connection size is too big"); if (connidIn.size() > kMaxConnectionIdSize) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::INTERNAL_ERROR, "ConnectionId invalid size")); } ConnectionId connid; @@ -67,7 +67,7 @@ folly::Expected ConnectionId::create( return connid; } -folly::Expected ConnectionId::create( +quic::Expected ConnectionId::create( Cursor& cursor, size_t len) { // Zero is special case for connids. @@ -77,7 +77,7 @@ folly::Expected ConnectionId::create( return connid; } if (len > kMaxConnectionIdSize) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::INTERNAL_ERROR, "ConnectionId invalid size")); } ConnectionId connid; @@ -104,10 +104,9 @@ ConnectionId ConnectionId::createZeroLength() { return connid; } -folly::Expected ConnectionId::createRandom( - size_t len) { +quic::Expected ConnectionId::createRandom(size_t len) { if (len > kMaxConnectionIdSize) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::INTERNAL_ERROR, "ConnectionId invalid size")); } ConnectionId connid; diff --git a/quic/codec/QuicConnectionId.h b/quic/codec/QuicConnectionId.h index 0bfe6e30a..73ce62809 100644 --- a/quic/codec/QuicConnectionId.h +++ b/quic/codec/QuicConnectionId.h @@ -7,6 +7,7 @@ #pragma once +#include #include #include @@ -51,14 +52,14 @@ struct ConnectionId { * Create a ConnectionId from a vector of bytes. * Returns Expected to handle validation errors. */ - [[nodiscard]] static folly::Expected create( + [[nodiscard]] static quic::Expected create( const std::vector& connidIn); /** * Create a ConnectionId from a cursor and length. * Returns Expected to handle validation errors. */ - [[nodiscard]] static folly::Expected create( + [[nodiscard]] static quic::Expected create( Cursor& cursor, size_t len); @@ -76,7 +77,7 @@ struct ConnectionId { * Create a random ConnectionId with the given length. * Returns Expected to handle validation errors. */ - static folly::Expected createRandom(size_t len); + static quic::Expected createRandom(size_t len); private: ConnectionId() = default; diff --git a/quic/codec/QuicHeaderCodec.cpp b/quic/codec/QuicHeaderCodec.cpp index bcba87f2c..31c834ebc 100644 --- a/quic/codec/QuicHeaderCodec.cpp +++ b/quic/codec/QuicHeaderCodec.cpp @@ -18,30 +18,35 @@ ParsedHeaderResult::ParsedHeaderResult( CHECK(isVersionNegotiation || parsedHeader); } -folly::Expected parseHeader( +quic::Expected parseHeader( const folly::IOBuf& data) { Cursor cursor(&data); if (!cursor.canAdvance(sizeof(uint8_t))) { - return folly::makeUnexpected(TransportErrorCode::FRAME_ENCODING_ERROR); + return quic::make_unexpected(TransportErrorCode::FRAME_ENCODING_ERROR); } uint8_t initialByte = cursor.readBE(); if (getHeaderForm(initialByte) == HeaderForm::Long) { - return parseLongHeader(initialByte, cursor) - .then([](ParsedLongHeaderResult&& parsedLongHeaderResult) { - if (parsedLongHeaderResult.isVersionNegotiation) { - return ParsedHeaderResult(true, std::nullopt); - } - // We compensate for the type byte length by adding it back. - DCHECK(parsedLongHeaderResult.parsedLongHeader); - return ParsedHeaderResult( - false, - PacketHeader( - std::move(parsedLongHeaderResult.parsedLongHeader->header))); - }); + auto longHeaderResult = parseLongHeader(initialByte, cursor); + if (!longHeaderResult.has_value()) { + return quic::make_unexpected(longHeaderResult.error()); + } + auto parsedLongHeaderResult = std::move(longHeaderResult.value()); + if (parsedLongHeaderResult.isVersionNegotiation) { + return ParsedHeaderResult(true, std::nullopt); + } + // We compensate for the type byte length by adding it back. + DCHECK(parsedLongHeaderResult.parsedLongHeader); + return ParsedHeaderResult( + false, + PacketHeader( + std::move(parsedLongHeaderResult.parsedLongHeader->header))); } else { - return parseShortHeader(initialByte, cursor).then([](ShortHeader&& header) { - return ParsedHeaderResult(false, PacketHeader(std::move(header))); - }); + auto shortHeaderResult = parseShortHeader(initialByte, cursor); + if (!shortHeaderResult.has_value()) { + return quic::make_unexpected(shortHeaderResult.error()); + } + return ParsedHeaderResult( + false, PacketHeader(std::move(shortHeaderResult.value()))); } } diff --git a/quic/codec/QuicHeaderCodec.h b/quic/codec/QuicHeaderCodec.h index 79cac89cc..a953cc280 100644 --- a/quic/codec/QuicHeaderCodec.h +++ b/quic/codec/QuicHeaderCodec.h @@ -22,6 +22,6 @@ struct ParsedHeaderResult { Optional parsedHeaderIn); }; -folly::Expected parseHeader( +quic::Expected parseHeader( const folly::IOBuf& data); } // namespace quic diff --git a/quic/codec/QuicInteger.cpp b/quic/codec/QuicInteger.cpp index 207ddfbcd..3184009e9 100644 --- a/quic/codec/QuicInteger.cpp +++ b/quic/codec/QuicInteger.cpp @@ -9,7 +9,7 @@ namespace quic { -folly::Expected getQuicIntegerSize(uint64_t value) { +quic::Expected getQuicIntegerSize(uint64_t value) { if (value <= kOneByteLimit) { return 1; } else if (value <= kTwoByteLimit) { @@ -19,7 +19,7 @@ folly::Expected getQuicIntegerSize(uint64_t value) { } else if (value <= kEightByteLimit) { return 8; } - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(TransportErrorCode::INTERNAL_ERROR, "Cannot encode value")); } @@ -68,13 +68,13 @@ Optional> decodeQuicInteger( QuicInteger::QuicInteger(uint64_t value) : value_(value) {} -folly::Expected QuicInteger::getSize() const { +quic::Expected QuicInteger::getSize() const { auto size = getQuicIntegerSize(value_); if (size.hasError()) { LOG(ERROR) << "Value too large value=" << value_; std::string errorMsg = "Value too large "; errorMsg += std::to_string(value_); - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(TransportErrorCode::INTERNAL_ERROR, std::move(errorMsg))); } return size.value(); diff --git a/quic/codec/QuicInteger.h b/quic/codec/QuicInteger.h index 7c8ba2092..8a1fdb500 100644 --- a/quic/codec/QuicInteger.h +++ b/quic/codec/QuicInteger.h @@ -7,12 +7,12 @@ #pragma once -#include #include #include #include #include #include +#include #include namespace quic { @@ -60,7 +60,7 @@ inline size_t encodeEightBytes(BufOp bufop, uint64_t value) { * variable length encoding. */ template -folly::Expected encodeQuicInteger( +quic::Expected encodeQuicInteger( uint64_t value, BufOp bufop) { if (value <= kOneByteLimit) { @@ -72,11 +72,11 @@ folly::Expected encodeQuicInteger( } else if (value <= kEightByteLimit) { return encodeEightBytes(std::move(bufop), value); } - return folly::makeUnexpected(TransportErrorCode::INTERNAL_ERROR); + return quic::make_unexpected(TransportErrorCode::INTERNAL_ERROR); } template -folly::Expected +quic::Expected encodeQuicInteger(uint64_t value, BufOp bufop, int outputSize) { switch (outputSize) { case 1: @@ -92,7 +92,7 @@ encodeQuicInteger(uint64_t value, BufOp bufop, int outputSize) { CHECK(value <= kEightByteLimit); return encodeEightBytes(std::move(bufop), value); default: - return folly::makeUnexpected(TransportErrorCode::INTERNAL_ERROR); + return quic::make_unexpected(TransportErrorCode::INTERNAL_ERROR); } } @@ -115,7 +115,7 @@ uint8_t decodeQuicIntegerLength(uint8_t firstByte); * if value is too large to be represented with the variable * length encoding */ -[[nodiscard]] folly::Expected getQuicIntegerSize( +[[nodiscard]] quic::Expected getQuicIntegerSize( uint64_t value); /** @@ -146,7 +146,7 @@ class QuicInteger { * Returns the number of bytes needed to represent the QUIC integer in * its encoded form. **/ - [[nodiscard]] folly::Expected getSize() const; + [[nodiscard]] quic::Expected getSize() const; /** * Returns the real value of the QUIC integer that it was instantiated with. diff --git a/quic/codec/QuicPacketBuilder.cpp b/quic/codec/QuicPacketBuilder.cpp index a595c8c7f..5b29513db 100644 --- a/quic/codec/QuicPacketBuilder.cpp +++ b/quic/codec/QuicPacketBuilder.cpp @@ -14,7 +14,7 @@ namespace quic { template -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected encodeLongHeaderHelper( const LongHeader& longHeader, BufOp& bufop, @@ -44,8 +44,8 @@ encodeLongHeaderHelper( // For initial packets, we write both the token length and the token itself. uint64_t tokenLength = token.size(); auto tokenLengthInt = QuicInteger(tokenLength).getSize(); - if (tokenLengthInt.hasError()) { - return folly::makeUnexpected(tokenLengthInt.error()); + if (!tokenLengthInt.has_value()) { + return quic::make_unexpected(tokenLengthInt.error()); } tokenHeaderLength = tokenLengthInt.value() + tokenLength; } else if (isRetry) { @@ -281,17 +281,16 @@ RegularQuicPacketBuilder::Packet RegularQuicPacketBuilder::buildPacket() && { return Packet(std::move(packet_), std::move(header_), std::move(body_)); } -folly::Expected -RegularQuicPacketBuilder::encodeLongHeader( +quic::Expected RegularQuicPacketBuilder::encodeLongHeader( const LongHeader& longHeader, PacketNum largestAckedPacketNum) { auto encodingResult = encodeLongHeaderHelper( longHeader, headerAppender_, remainingBytes_, largestAckedPacketNum); - if (encodingResult.hasError()) { - return folly::makeUnexpected(encodingResult.error()); + if (!encodingResult.has_value()) { + return quic::make_unexpected(encodingResult.error()); } packetNumberEncoding_ = std::move(encodingResult.value()); - return folly::unit; + return {}; } void RegularQuicPacketBuilder::encodeShortHeader( @@ -582,10 +581,11 @@ RetryPacketBuilder::RetryPacketBuilder( retryToken_(std::move(retryToken)), integrityTag_(integrityTag), remainingBytes_(kDefaultUDPSendPacketLen) { - writeRetryPacket(); + auto result = writeRetryPacket(); + CHECK(result.has_value()) << "Failed to write retry packet"; } -folly::Expected RetryPacketBuilder::writeRetryPacket() { +quic::Expected RetryPacketBuilder::writeRetryPacket() { packetBuf_ = BufHelpers::create(kAppenderGrowthSize); // Encode the portion of the retry packet that comes before the @@ -600,8 +600,8 @@ folly::Expected RetryPacketBuilder::writeRetryPacket() { retryToken_); auto encodeResult = encodeLongHeaderHelper(header, appender, remainingBytes_, 0); - if (encodeResult.hasError()) { - return folly::makeUnexpected(encodeResult.error()); + if (!encodeResult.has_value()) { + return quic::make_unexpected(encodeResult.error()); } packetBuf_->coalesce(); @@ -614,7 +614,7 @@ folly::Expected RetryPacketBuilder::writeRetryPacket() { BufAppender appender2(packetBuf_.get(), kRetryIntegrityTagLen); appender2.push(integrityTag_.data(), integrityTag_.size()); } - return folly::unit; + return {}; } bool RetryPacketBuilder::canBuildPacket() const noexcept { @@ -838,31 +838,29 @@ InplaceQuicPacketBuilder::~InplaceQuicPacketBuilder() { releaseOutputBufferInternal(); } -folly::Expected -RegularQuicPacketBuilder::encodePacketHeader() { +quic::Expected RegularQuicPacketBuilder::encodePacketHeader() { CHECK(!packetNumberEncoding_.has_value()); if (packet_.header.getHeaderForm() == HeaderForm::Long) { LongHeader& longHeader = *packet_.header.asLong(); auto result = encodeLongHeader(longHeader, largestAckedPacketNum_); - if (result.hasError()) { - return folly::makeUnexpected(result.error()); + if (!result.has_value()) { + return quic::make_unexpected(result.error()); } } else { ShortHeader& shortHeader = *packet_.header.asShort(); encodeShortHeader(shortHeader, largestAckedPacketNum_); } - return folly::unit; + return {}; } -folly::Expected -InplaceQuicPacketBuilder::encodePacketHeader() { +quic::Expected InplaceQuicPacketBuilder::encodePacketHeader() { CHECK(!packetNumberEncoding_.has_value()); if (packet_.header.getHeaderForm() == HeaderForm::Long) { LongHeader& longHeader = *packet_.header.asLong(); auto encodingResult = encodeLongHeaderHelper( longHeader, bufWriter_, remainingBytes_, largestAckedPacketNum_); - if (encodingResult.hasError()) { - return folly::makeUnexpected(encodingResult.error()); + if (!encodingResult.has_value()) { + return quic::make_unexpected(encodingResult.error()); } packetNumberEncoding_ = std::move(encodingResult.value()); if (longHeader.getHeaderType() != LongHeader::Types::Retry) { @@ -887,7 +885,7 @@ InplaceQuicPacketBuilder::encodePacketHeader() { } } bodyStart_ = bufWriter_.tail(); - return folly::unit; + return {}; } } // namespace quic diff --git a/quic/codec/QuicPacketBuilder.h b/quic/codec/QuicPacketBuilder.h index 1770458e4..237e689e9 100644 --- a/quic/codec/QuicPacketBuilder.h +++ b/quic/codec/QuicPacketBuilder.h @@ -58,7 +58,7 @@ class PacketBuilderInterface { [[nodiscard]] virtual uint32_t remainingSpaceInPkt() const = 0; - [[nodiscard]] virtual folly::Expected + [[nodiscard]] virtual quic::Expected encodePacketHeader() = 0; // Functions to write bytes to the packet @@ -130,8 +130,7 @@ class InplaceQuicPacketBuilder final : public PacketBuilderInterface { // PacketBuilderInterface [[nodiscard]] uint32_t remainingSpaceInPkt() const override; - [[nodiscard]] folly::Expected encodePacketHeader() - override; + [[nodiscard]] quic::Expected encodePacketHeader() override; void writeBE(uint8_t data) override; void writeBE(uint16_t data) override; @@ -209,8 +208,7 @@ class RegularQuicPacketBuilder final : public PacketBuilderInterface { [[nodiscard]] uint32_t getHeaderBytes() const override; - [[nodiscard]] folly::Expected encodePacketHeader() - override; + [[nodiscard]] quic::Expected encodePacketHeader() override; // PacketBuilderInterface [[nodiscard]] uint32_t remainingSpaceInPkt() const override; @@ -253,7 +251,7 @@ class RegularQuicPacketBuilder final : public PacketBuilderInterface { void releaseOutputBuffer() && override; private: - [[nodiscard]] folly::Expected encodeLongHeader( + [[nodiscard]] quic::Expected encodeLongHeader( const LongHeader& longHeader, PacketNum largestAckedPacketNum); void encodeShortHeader( @@ -432,7 +430,7 @@ class RetryPacketBuilder { [[nodiscard]] bool canBuildPacket() const noexcept; private: - folly::Expected writeRetryPacket(); + quic::Expected writeRetryPacket(); BufPtr packetBuf_; @@ -481,8 +479,7 @@ class PacketBuilderWrapper : public PacketBuilderInterface { : 0; } - [[nodiscard]] folly::Expected encodePacketHeader() - override { + [[nodiscard]] quic::Expected encodePacketHeader() override { CHECK(false) << "We only support wrapping builder that has already encoded header"; } diff --git a/quic/codec/QuicPacketRebuilder.cpp b/quic/codec/QuicPacketRebuilder.cpp index d0008efa2..ce5d3a4f4 100644 --- a/quic/codec/QuicPacketRebuilder.cpp +++ b/quic/codec/QuicPacketRebuilder.cpp @@ -46,7 +46,7 @@ ClonedPacketIdentifier PacketRebuilder::cloneOutstandingPacket( return *packet.maybeClonedPacketIdentifier; } -folly::Expected, QuicError> +quic::Expected, QuicError> PacketRebuilder::rebuildFromPacket(OutstandingPacketWrapper& packet) { // TODO: if PMTU changes between the transmission of the original packet and // now, then we cannot clone everything in the packet. @@ -94,7 +94,7 @@ PacketRebuilder::rebuildFromPacket(OutstandingPacketWrapper& packet) { << " for cloning WriteStreamFrame: " << streamResult.error().message; // Propagate error - return folly::makeUnexpected(streamResult.error()); + return quic::make_unexpected(streamResult.error()); } auto* stream = streamResult.value(); if (stream && retransmittable(*stream)) { @@ -115,7 +115,7 @@ PacketRebuilder::rebuildFromPacket(OutstandingPacketWrapper& packet) { if (res.hasError()) { VLOG(4) << "Failed to write stream frame header for cloning: " << res.error().message; - return folly::makeUnexpected(res.error()); + return quic::make_unexpected(res.error()); } auto dataLen = *res; @@ -154,7 +154,7 @@ PacketRebuilder::rebuildFromPacket(OutstandingPacketWrapper& packet) { auto cryptoWriteResult = writeCryptoFrame(cryptoFrame.offset, *buf, builder_); if (cryptoWriteResult.hasError()) { - return folly::makeUnexpected(cryptoWriteResult.error()); + return quic::make_unexpected(cryptoWriteResult.error()); } bool ret = cryptoWriteResult.value()->offset == cryptoFrame.offset && @@ -167,7 +167,7 @@ PacketRebuilder::rebuildFromPacket(OutstandingPacketWrapper& packet) { shouldWriteWindowUpdate = true; auto writeResult = writeFrame(generateMaxDataFrame(conn_), builder_); if (writeResult.hasError()) { - return folly::makeUnexpected(writeResult.error()); + return quic::make_unexpected(writeResult.error()); } bool ret = writeResult.value() != 0; windowUpdateWritten |= ret; @@ -184,7 +184,7 @@ PacketRebuilder::rebuildFromPacket(OutstandingPacketWrapper& packet) { VLOG(4) << "Failed to get stream " << maxStreamDataFrame.streamId << " for cloning MaxStreamDataFrame: " << streamResult.error().message; - return folly::makeUnexpected(streamResult.error()); + return quic::make_unexpected(streamResult.error()); } auto* stream = streamResult.value(); @@ -196,7 +196,7 @@ PacketRebuilder::rebuildFromPacket(OutstandingPacketWrapper& packet) { auto writeResult = writeFrame(generateMaxStreamDataFrame(*stream), builder_); if (writeResult.hasError()) { - return folly::makeUnexpected(writeResult.error()); + return quic::make_unexpected(writeResult.error()); } bool ret = writeResult.value() != 0; windowUpdateWritten |= ret; @@ -208,7 +208,7 @@ PacketRebuilder::rebuildFromPacket(OutstandingPacketWrapper& packet) { const PaddingFrame& paddingFrame = *frame.asPaddingFrame(); auto writeResult = writeFrame(paddingFrame, builder_); if (writeResult.hasError()) { - return folly::makeUnexpected(writeResult.error()); + return quic::make_unexpected(writeResult.error()); } writeSuccess = writeResult.value() != 0; break; @@ -217,7 +217,7 @@ PacketRebuilder::rebuildFromPacket(OutstandingPacketWrapper& packet) { const PingFrame& pingFrame = *frame.asPingFrame(); auto writeResult = writeFrame(pingFrame, builder_); if (writeResult.hasError()) { - return folly::makeUnexpected(writeResult.error()); + return quic::make_unexpected(writeResult.error()); } writeSuccess = writeResult.value() != 0; notPureAck |= writeSuccess; @@ -234,7 +234,7 @@ PacketRebuilder::rebuildFromPacket(OutstandingPacketWrapper& packet) { auto writeResult = writeSimpleFrame(std::move(*updatedSimpleFrame), builder_); if (writeResult.hasError()) { - return folly::makeUnexpected(writeResult.error()); + return quic::make_unexpected(writeResult.error()); } bool ret = writeResult.value() != 0; notPureAck |= ret; @@ -248,7 +248,7 @@ PacketRebuilder::rebuildFromPacket(OutstandingPacketWrapper& packet) { default: { auto writeResult = writeFrame(QuicWriteFrame(frame), builder_); if (writeResult.hasError()) { - return folly::makeUnexpected(writeResult.error()); + return quic::make_unexpected(writeResult.error()); } bool ret = writeResult.value() != 0; notPureAck |= ret; @@ -273,7 +273,7 @@ PacketRebuilder::rebuildFromPacket(OutstandingPacketWrapper& packet) { AckScheduler ackScheduler(conn_, ackState); auto writeResult = ackScheduler.writeNextAcks(builder_); if (writeResult.hasError()) { - return folly::makeUnexpected(writeResult.error()); + return quic::make_unexpected(writeResult.error()); } } @@ -290,7 +290,7 @@ PacketRebuilder::rebuildFromPacket(OutstandingPacketWrapper& packet) { while (builder_.remainingSpaceInPkt() > 0) { auto writeResult = writeFrame(PaddingFrame(), builder_); if (writeResult.hasError()) { - return folly::makeUnexpected(writeResult.error()); + return quic::make_unexpected(writeResult.error()); } } } diff --git a/quic/codec/QuicPacketRebuilder.h b/quic/codec/QuicPacketRebuilder.h index 8137108b0..56c74cc94 100644 --- a/quic/codec/QuicPacketRebuilder.h +++ b/quic/codec/QuicPacketRebuilder.h @@ -27,7 +27,7 @@ class PacketRebuilder { PacketBuilderInterface& regularBuilder, QuicConnectionStateBase& conn); - [[nodiscard]] folly::Expected, QuicError> + [[nodiscard]] quic::Expected, QuicError> rebuildFromPacket(OutstandingPacketWrapper& packet); // TODO: Same as passing cipherOverhead into the CloningScheduler, this really diff --git a/quic/codec/QuicReadCodec.cpp b/quic/codec/QuicReadCodec.cpp index 2d5d5fb99..8b43e1a2f 100644 --- a/quic/codec/QuicReadCodec.cpp +++ b/quic/codec/QuicReadCodec.cpp @@ -39,11 +39,11 @@ Optional QuicReadCodec::tryParsingVersionNegotiation( return decodeVersionNegotiation(*longHeaderInvariant, cursor); } -folly::Expected tryParseLongHeader( +quic::Expected tryParseLongHeader( Cursor& cursor, QuicNodeType nodeType) { if (cursor.isAtEnd() || !cursor.canAdvance(sizeof(uint8_t))) { - return folly::makeUnexpected(TransportErrorCode::PROTOCOL_VIOLATION); + return quic::make_unexpected(TransportErrorCode::PROTOCOL_VIOLATION); } auto initialByte = cursor.readBE(); auto longHeaderInvariant = parseLongHeaderInvariant(initialByte, cursor); @@ -52,7 +52,7 @@ folly::Expected tryParseLongHeader( // We've failed to parse the long header, so we have no idea where this // packet ends. Clear the queue since no other data in this packet is // parse-able. - return folly::makeUnexpected(longHeaderInvariant.error()); + return quic::make_unexpected(longHeaderInvariant.error()); } if (longHeaderInvariant->invariant.version == QuicVersion::VERSION_NEGOTIATION) { @@ -61,7 +61,7 @@ folly::Expected tryParseLongHeader( // function. // Since VN is not allowed to be coalesced with another packet // type, we clear out the buffer to avoid anyone else parsing it. - return folly::makeUnexpected(TransportErrorCode::PROTOCOL_VIOLATION); + return quic::make_unexpected(TransportErrorCode::PROTOCOL_VIOLATION); } auto type = parseLongHeaderType(initialByte); @@ -72,7 +72,7 @@ folly::Expected tryParseLongHeader( // We've failed to parse the long header, so we have no idea where this // packet ends. Clear the queue since no other data in this packet is // parse-able. - return folly::makeUnexpected(parsedLongHeader.error()); + return quic::make_unexpected(parsedLongHeader.error()); } return std::move(parsedLongHeader.value()); @@ -91,7 +91,7 @@ static PacketDropReason getDecryptErrorReason(ProtectionType protectionType) { } } -folly::Expected QuicReadCodec::parseLongHeaderPacket( +quic::Expected QuicReadCodec::parseLongHeaderPacket( BufQueue& queue, const AckStates& ackStates) { Cursor cursor(queue.front()); @@ -217,7 +217,7 @@ folly::Expected QuicReadCodec::parseLongHeaderPacket( folly::range(sample), initialByteRange, packetNumberByteRange); if (decryptResult.hasError()) { VLOG(4) << "Failed to decrypt long header " << connIdToHex(); - return folly::makeUnexpected(decryptResult.error()); + return quic::make_unexpected(decryptResult.error()); } std::pair packetNum = parsePacketNumber( initialByteRange.data()[0], packetNumberByteRange, expectedNextPacketNum); @@ -257,15 +257,14 @@ folly::Expected QuicReadCodec::parseLongHeaderPacket( auto packetRes = decodeRegularPacket(std::move(longHeader), params_, std::move(decrypted)); - if (!packetRes.hasValue()) { + if (!packetRes.has_value()) { return CodecResult(CodecError(std::move(packetRes.error()))); } return CodecResult(std::move(*packetRes)); } -folly::Expected -QuicReadCodec::tryParseShortHeaderPacket( +quic::Expected QuicReadCodec::tryParseShortHeaderPacket( BufPtr data, const AckStates& ackStates, size_t dstConnIdSize, @@ -293,7 +292,7 @@ QuicReadCodec::tryParseShortHeaderPacket( sampleByteRange, initialByteRange, packetNumberByteRange); if (decryptResult.hasError()) { VLOG(4) << "Failed to decrypt short header " << connIdToHex(); - return folly::makeUnexpected(decryptResult.error()); + return quic::make_unexpected(decryptResult.error()); } std::pair packetNum = parsePacketNumber( initialByteRange.data()[0], packetNumberByteRange, expectedNextPacketNum); @@ -399,7 +398,7 @@ QuicReadCodec::tryParseShortHeaderPacket( auto packetRes = decodeRegularPacket( std::move(*shortHeader), params_, std::move(decrypted)); - if (!packetRes.hasValue()) { + if (!packetRes.has_value()) { return CodecResult(CodecError(std::move(packetRes.error()))); } return CodecResult(std::move(*packetRes)); diff --git a/quic/codec/QuicReadCodec.h b/quic/codec/QuicReadCodec.h index 88f6228d1..df6a3f3a8 100644 --- a/quic/codec/QuicReadCodec.h +++ b/quic/codec/QuicReadCodec.h @@ -98,7 +98,7 @@ struct CodecResult { * Reads given data and returns parsed long header. * Returns an error if parsing is unsuccessful. */ -folly::Expected tryParseLongHeader( +quic::Expected tryParseLongHeader( Cursor& cursor, QuicNodeType nodeType); @@ -198,12 +198,12 @@ class QuicReadCodec { Optional getHandshakeDoneTime(); private: - folly::Expected tryParseShortHeaderPacket( + quic::Expected tryParseShortHeaderPacket( BufPtr data, const AckStates& ackStates, size_t dstConnIdSize, Cursor& cursor); - folly::Expected parseLongHeaderPacket( + quic::Expected parseLongHeaderPacket( BufQueue& queue, const AckStates& ackStates); diff --git a/quic/codec/QuicWriteCodec.cpp b/quic/codec/QuicWriteCodec.cpp index bb4a9eda4..0b5c29e1d 100644 --- a/quic/codec/QuicWriteCodec.cpp +++ b/quic/codec/QuicWriteCodec.cpp @@ -26,7 +26,7 @@ bool packetSpaceCheck(uint64_t limit, size_t require) { } // namespace namespace quic { -folly::Expected, QuicError> writeStreamFrameHeader( +quic::Expected, QuicError> writeStreamFrameHeader( PacketBuilderInterface& builder, StreamId id, uint64_t offset, @@ -40,7 +40,7 @@ folly::Expected, QuicError> writeStreamFrameHeader( return std::nullopt; } if (writeBufferLen == 0 && !fin) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( LocalErrorCode::INTERNAL_ERROR, "No data or fin supplied when writing stream.")); } @@ -58,13 +58,13 @@ folly::Expected, QuicError> writeStreamFrameHeader( // and (optional) group id. auto idIntSize = idInt.getSize(); if (idIntSize.hasError()) { - return folly::makeUnexpected(idIntSize.error()); + return quic::make_unexpected(idIntSize.error()); } uint64_t headerSize = sizeof(uint8_t) + idIntSize.value(); if (groupIdInt) { auto groupIdIntSize = groupIdInt->getSize(); if (groupIdIntSize.hasError()) { - return folly::makeUnexpected(groupIdIntSize.error()); + return quic::make_unexpected(groupIdIntSize.error()); } headerSize += groupIdIntSize.value(); } @@ -78,7 +78,7 @@ folly::Expected, QuicError> writeStreamFrameHeader( streamTypeBuilder.setOffset(); auto offsetIntSize = offsetInt.getSize(); if (offsetIntSize.hasError()) { - return folly::makeUnexpected(offsetIntSize.error()); + return quic::make_unexpected(offsetIntSize.error()); } headerSize += offsetIntSize.value(); } @@ -185,7 +185,7 @@ void writeStreamFrameData( } } -folly::Expected, QuicError> writeCryptoFrame( +quic::Expected, QuicError> writeCryptoFrame( uint64_t offsetIn, const ChainedByteRangeHead& data, PacketBuilderInterface& builder) { @@ -193,13 +193,13 @@ folly::Expected, QuicError> writeCryptoFrame( QuicInteger intFrameType(static_cast(FrameType::CRYPTO_FRAME)); auto intFrameTypeRes = intFrameType.getSize(); if (intFrameTypeRes.hasError()) { - return folly::makeUnexpected(intFrameTypeRes.error()); + return quic::make_unexpected(intFrameTypeRes.error()); } QuicInteger offsetInteger(offsetIn); auto offsetIntegerRes = offsetInteger.getSize(); if (offsetIntegerRes.hasError()) { - return folly::makeUnexpected(offsetIntegerRes.error()); + return quic::make_unexpected(offsetIntegerRes.error()); } size_t lengthBytes = 2; @@ -218,7 +218,7 @@ folly::Expected, QuicError> writeCryptoFrame( QuicInteger lengthVarInt(writableData); auto lengthVarIntSizeRes = lengthVarInt.getSize(); if (lengthVarIntSizeRes.hasError()) { - return folly::makeUnexpected(lengthVarIntSizeRes.error()); + return quic::make_unexpected(lengthVarIntSizeRes.error()); } CHECK(lengthVarIntSizeRes.value() <= lengthBytes) @@ -237,7 +237,7 @@ folly::Expected, QuicError> writeCryptoFrame( * parameter ackBlocks until it runs out of space (bytesLimit). The largest * ack block should have been inserted by the caller. */ -[[nodiscard]] static folly::Expected fillFrameWithAckBlocks( +[[nodiscard]] static quic::Expected fillFrameWithAckBlocks( const AckBlocks& ackBlocks, WriteAckFrame& ackFrame, uint64_t bytesLimit) { @@ -262,23 +262,23 @@ folly::Expected, QuicError> writeCryptoFrame( // can be reused by the caller when writing the frame. auto gapSizeRes = getQuicIntegerSize(gap); if (gapSizeRes.hasError()) { - return folly::makeUnexpected(gapSizeRes.error()); + return quic::make_unexpected(gapSizeRes.error()); } auto currBlockLenSizeRes = getQuicIntegerSize(currBlockLen); if (currBlockLenSizeRes.hasError()) { - return folly::makeUnexpected(currBlockLenSizeRes.error()); + return quic::make_unexpected(currBlockLenSizeRes.error()); } auto numAdditionalAckBlocksSizeRes = getQuicIntegerSize(numAdditionalAckBlocks + 1); if (numAdditionalAckBlocksSizeRes.hasError()) { - return folly::makeUnexpected(numAdditionalAckBlocksSizeRes.error()); + return quic::make_unexpected(numAdditionalAckBlocksSizeRes.error()); } auto previousNumAckBlocksSizeRes = getQuicIntegerSize(previousNumAckBlocks); if (previousNumAckBlocksSizeRes.hasError()) { - return folly::makeUnexpected(previousNumAckBlocksSizeRes.error()); + return quic::make_unexpected(previousNumAckBlocksSizeRes.error()); } size_t additionalSize = gapSizeRes.value() + currBlockLenSizeRes.value() + @@ -296,28 +296,28 @@ folly::Expected, QuicError> writeCryptoFrame( return numAdditionalAckBlocks; } -folly::Expected computeSizeUsedByRecvdTimestamps( +quic::Expected computeSizeUsedByRecvdTimestamps( WriteAckFrame& ackFrame) { size_t usedSize = 0; for (auto& recvdPacketsTimestampRanges : ackFrame.recvdPacketsTimestampRanges) { auto gapSize = getQuicIntegerSize(recvdPacketsTimestampRanges.gap); if (gapSize.hasError()) { - return folly::makeUnexpected(gapSize.error()); + return quic::make_unexpected(gapSize.error()); } usedSize += gapSize.value(); auto countSize = getQuicIntegerSize(recvdPacketsTimestampRanges.timestamp_delta_count); if (countSize.hasError()) { - return folly::makeUnexpected(countSize.error()); + return quic::make_unexpected(countSize.error()); } usedSize += countSize.value(); for (auto& timestampDelta : recvdPacketsTimestampRanges.deltas) { auto deltaSize = getQuicIntegerSize(timestampDelta); if (deltaSize.hasError()) { - return folly::makeUnexpected(deltaSize.error()); + return quic::make_unexpected(deltaSize.error()); } usedSize += deltaSize.value(); } @@ -325,7 +325,7 @@ folly::Expected computeSizeUsedByRecvdTimestamps( return usedSize; } -[[nodiscard]] static folly::Expected +[[nodiscard]] static quic::Expected fillFrameWithPacketReceiveTimestamps( const quic::WriteAckFrameMetaData& ackFrameMetaData, WriteAckFrame& ackFrame, @@ -369,7 +369,7 @@ fillFrameWithPacketReceiveTimestamps( // Initialize spaced used by the next candidate time-stamp range auto gapSizeResult = getQuicIntegerSize(nextTimestampRange.gap); if (gapSizeResult.hasError()) { - return folly::makeUnexpected(gapSizeResult.error()); + return quic::make_unexpected(gapSizeResult.error()); } nextTimestampRangeUsedSpace += gapSizeResult.value(); @@ -397,19 +397,19 @@ fillFrameWithPacketReceiveTimestamps( // into nextTimestampRangeUsedSpace. auto deltaSizeResult = getQuicIntegerSize(delta); if (deltaSizeResult.hasError()) { - return folly::makeUnexpected(deltaSizeResult.error()); + return quic::make_unexpected(deltaSizeResult.error()); } auto deltasCountSizeResult = getQuicIntegerSize(nextTimestampRange.deltas.size() + 1); if (deltasCountSizeResult.hasError()) { - return folly::makeUnexpected(deltasCountSizeResult.error()); + return quic::make_unexpected(deltasCountSizeResult.error()); } auto rangesCountSizeResult = getQuicIntegerSize(ackFrame.recvdPacketsTimestampRanges.size() + 1); if (rangesCountSizeResult.hasError()) { - return folly::makeUnexpected(rangesCountSizeResult.error()); + return quic::make_unexpected(rangesCountSizeResult.error()); } if (spaceLeft < (cumUsedSpace + nextTimestampRangeUsedSpace + @@ -429,7 +429,7 @@ fillFrameWithPacketReceiveTimestamps( auto deltasCountSizeResult = getQuicIntegerSize(nextTimestampRange.deltas.size()); if (deltasCountSizeResult.hasError()) { - return folly::makeUnexpected(deltasCountSizeResult.error()); + return quic::make_unexpected(deltasCountSizeResult.error()); } cumUsedSpace += @@ -445,13 +445,13 @@ fillFrameWithPacketReceiveTimestamps( auto computedSizeResult = computeSizeUsedByRecvdTimestamps(ackFrame); if (computedSizeResult.hasError()) { - return folly::makeUnexpected(computedSizeResult.error()); + return quic::make_unexpected(computedSizeResult.error()); } DCHECK(cumUsedSpace == computedSizeResult.value()); return ackFrame.recvdPacketsTimestampRanges.size(); } -[[nodiscard]] static folly::Expected, QuicError> +[[nodiscard]] static quic::Expected, QuicError> maybeWriteAckBaseFields( const quic::WriteAckFrameMetaData& ackFrameMetaData, PacketBuilderInterface& builder, @@ -482,27 +482,27 @@ maybeWriteAckBaseFields( auto largestAckedPacketIntSize = largestAckedPacketInt.getSize(); if (largestAckedPacketIntSize.hasError()) { - return folly::makeUnexpected(largestAckedPacketIntSize.error()); + return quic::make_unexpected(largestAckedPacketIntSize.error()); } auto ackDelayIntSize = ackDelayInt.getSize(); if (ackDelayIntSize.hasError()) { - return folly::makeUnexpected(ackDelayIntSize.error()); + return quic::make_unexpected(ackDelayIntSize.error()); } auto minAdditionalAckBlockCountSize = minAdditionalAckBlockCount.getSize(); if (minAdditionalAckBlockCountSize.hasError()) { - return folly::makeUnexpected(minAdditionalAckBlockCountSize.error()); + return quic::make_unexpected(minAdditionalAckBlockCountSize.error()); } auto firstAckBlockLengthIntSize = firstAckBlockLengthInt.getSize(); if (firstAckBlockLengthIntSize.hasError()) { - return folly::makeUnexpected(firstAckBlockLengthIntSize.error()); + return quic::make_unexpected(firstAckBlockLengthIntSize.error()); } auto encodedintFrameTypeSize = encodedintFrameType.getSize(); if (encodedintFrameTypeSize.hasError()) { - return folly::makeUnexpected(encodedintFrameTypeSize.error()); + return quic::make_unexpected(encodedintFrameTypeSize.error()); } uint64_t headerSize = encodedintFrameTypeSize.value() + @@ -526,7 +526,7 @@ maybeWriteAckBaseFields( auto numAdditionalAckBlocksResult = fillFrameWithAckBlocks(ackState.acks, ackFrame, spaceLeft); if (numAdditionalAckBlocksResult.hasError()) { - return folly::makeUnexpected(numAdditionalAckBlocksResult.error()); + return quic::make_unexpected(numAdditionalAckBlocksResult.error()); } QuicInteger numAdditionalAckBlocksInt(numAdditionalAckBlocksResult.value()); @@ -554,7 +554,7 @@ maybeWriteAckBaseFields( return Optional(std::move(ackFrame)); } -[[nodiscard]] static folly::Expected +[[nodiscard]] static quic::Expected computeEcnRequiredSpace(const quic::WriteAckFrameMetaData& ackFrameMetaData) { QuicInteger ecnECT0Count(ackFrameMetaData.ackState.ecnECT0CountReceived); QuicInteger ecnECT1Count(ackFrameMetaData.ackState.ecnECT1CountReceived); @@ -562,23 +562,23 @@ computeEcnRequiredSpace(const quic::WriteAckFrameMetaData& ackFrameMetaData) { auto ecnECT0Size = ecnECT0Count.getSize(); if (ecnECT0Size.hasError()) { - return folly::makeUnexpected(ecnECT0Size.error()); + return quic::make_unexpected(ecnECT0Size.error()); } auto ecnECT1Size = ecnECT1Count.getSize(); if (ecnECT1Size.hasError()) { - return folly::makeUnexpected(ecnECT1Size.error()); + return quic::make_unexpected(ecnECT1Size.error()); } auto ecnCESize = ecnCECount.getSize(); if (ecnCESize.hasError()) { - return folly::makeUnexpected(ecnCESize.error()); + return quic::make_unexpected(ecnCESize.error()); } return ecnECT0Size.value() + ecnECT1Size.value() + ecnCESize.value(); } -[[nodiscard]] static folly::Expected +[[nodiscard]] static quic::Expected computeReceiveTimestampsMinimumSpace( const quic::WriteAckFrameMetaData& ackFrameMetaData) { // Compute minimum size requirements for 3 fields that must be sent @@ -632,7 +632,7 @@ struct AckReceiveTimesStampsWritten { }; } // namespace -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected writeReceiveTimestampFieldsToAck( const quic::WriteAckFrameMetaData& ackFrameMetaData, WriteAckFrame& ackFrame, @@ -677,7 +677,7 @@ writeReceiveTimestampFieldsToAck( receiveTimestampsExponentToUse, maxRecvTimestampsToSend); if (countTimestampRangesResult.hasError()) { - return folly::makeUnexpected(countTimestampRangesResult.error()); + return quic::make_unexpected(countTimestampRangesResult.error()); } countTimestampRanges = countTimestampRangesResult.value(); if (countTimestampRanges > 0) { @@ -705,7 +705,7 @@ writeReceiveTimestampFieldsToAck( return AckReceiveTimesStampsWritten{countTimestampRanges, countTimestamps}; } -folly::Expected, QuicError> writeAckFrame( +quic::Expected, QuicError> writeAckFrame( const quic::WriteAckFrameMetaData& ackFrameMetaData, PacketBuilderInterface& builder, FrameType frameType, @@ -734,7 +734,7 @@ folly::Expected, QuicError> writeAckFrame( auto extendedAckRequiredSpaceResult = QuicInteger(extendedAckFeatures).getSize(); if (extendedAckRequiredSpaceResult.hasError()) { - return folly::makeUnexpected(extendedAckRequiredSpaceResult.error()); + return quic::make_unexpected(extendedAckRequiredSpaceResult.error()); } auto extendedAckRequiredSpace = extendedAckRequiredSpaceResult.value(); if (spaceLeft < extendedAckRequiredSpace) { @@ -747,7 +747,7 @@ folly::Expected, QuicError> writeAckFrame( if (ecnEnabled) { auto ecnRequiredSpaceResult = computeEcnRequiredSpace(ackFrameMetaData); if (ecnRequiredSpaceResult.hasError()) { - return folly::makeUnexpected(ecnRequiredSpaceResult.error()); + return quic::make_unexpected(ecnRequiredSpaceResult.error()); } auto ecnRequiredSpace = ecnRequiredSpaceResult.value(); if (spaceLeft < ecnRequiredSpace) { @@ -761,7 +761,7 @@ folly::Expected, QuicError> writeAckFrame( auto receiveTimestampsMinimumSpaceResult = computeReceiveTimestampsMinimumSpace(ackFrameMetaData); if (receiveTimestampsMinimumSpaceResult.hasError()) { - return folly::makeUnexpected(receiveTimestampsMinimumSpaceResult.error()); + return quic::make_unexpected(receiveTimestampsMinimumSpaceResult.error()); } auto receiveTimestampsMinimumSpace = receiveTimestampsMinimumSpaceResult.value(); @@ -777,7 +777,7 @@ folly::Expected, QuicError> writeAckFrame( auto maybeAckFrameResult = maybeWriteAckBaseFields(ackFrameMetaData, builder, frameType, spaceLeft); if (maybeAckFrameResult.hasError()) { - return folly::makeUnexpected(maybeAckFrameResult.error()); + return quic::make_unexpected(maybeAckFrameResult.error()); } auto& maybeAckFrame = maybeAckFrameResult.value(); if (!maybeAckFrame.has_value()) { @@ -806,7 +806,7 @@ folly::Expected, QuicError> writeAckFrame( recvTimestampsConfig, maxRecvTimestampsToSend); if (receiveTimestampsResult.hasError()) { - return folly::makeUnexpected(receiveTimestampsResult.error()); + return quic::make_unexpected(receiveTimestampsResult.error()); } receiveTimestampsWritten = receiveTimestampsResult.value(); } @@ -823,7 +823,7 @@ folly::Expected, QuicError> writeAckFrame( return Optional(std::move(ackFrameWriteResult)); } -folly::Expected writeSimpleFrame( +quic::Expected writeSimpleFrame( QuicSimpleFrame&& frame, PacketBuilderInterface& builder) { using FrameTypeType = std::underlying_type::type; @@ -838,15 +838,15 @@ folly::Expected writeSimpleFrame( QuicInteger errorCode(static_cast(stopSendingFrame.errorCode)); auto errorSizeRes = errorCode.getSize(); if (errorSizeRes.hasError()) { - return folly::makeUnexpected(errorSizeRes.error()); + return quic::make_unexpected(errorSizeRes.error()); } auto intFrameTypeSize = intFrameType.getSize(); if (intFrameTypeSize.hasError()) { - return folly::makeUnexpected(intFrameTypeSize.error()); + return quic::make_unexpected(intFrameTypeSize.error()); } auto streamIdSize = streamId.getSize(); if (streamIdSize.hasError()) { - return folly::makeUnexpected(streamIdSize.error()); + return quic::make_unexpected(streamIdSize.error()); } auto stopSendingFrameSize = intFrameTypeSize.value() + streamIdSize.value() + errorSizeRes.value(); @@ -866,7 +866,7 @@ folly::Expected writeSimpleFrame( QuicInteger frameType(static_cast(FrameType::PATH_CHALLENGE)); auto frameTypeSize = frameType.getSize(); if (frameTypeSize.hasError()) { - return folly::makeUnexpected(frameTypeSize.error()); + return quic::make_unexpected(frameTypeSize.error()); } auto pathChallengeFrameSize = frameTypeSize.value() + sizeof(pathChallengeFrame.pathData); @@ -884,7 +884,7 @@ folly::Expected writeSimpleFrame( QuicInteger frameType(static_cast(FrameType::PATH_RESPONSE)); auto frameTypeSize = frameType.getSize(); if (frameTypeSize.hasError()) { - return folly::makeUnexpected(frameTypeSize.error()); + return quic::make_unexpected(frameTypeSize.error()); } auto pathResponseFrameSize = frameTypeSize.value() + sizeof(pathResponseFrame.pathData); @@ -906,15 +906,15 @@ folly::Expected writeSimpleFrame( auto frameTypeSize = frameType.getSize(); if (frameTypeSize.hasError()) { - return folly::makeUnexpected(frameTypeSize.error()); + return quic::make_unexpected(frameTypeSize.error()); } auto sequenceNumberSize = sequenceNumber.getSize(); if (sequenceNumberSize.hasError()) { - return folly::makeUnexpected(sequenceNumberSize.error()); + return quic::make_unexpected(sequenceNumberSize.error()); } auto retirePriorToSize = retirePriorTo.getSize(); if (retirePriorToSize.hasError()) { - return folly::makeUnexpected(retirePriorToSize.error()); + return quic::make_unexpected(retirePriorToSize.error()); } // Include an 8-bit unsigned integer containing the length of the connId @@ -949,11 +949,11 @@ folly::Expected writeSimpleFrame( auto intFrameTypeSize = intFrameType.getSize(); if (intFrameTypeSize.hasError()) { - return folly::makeUnexpected(intFrameTypeSize.error()); + return quic::make_unexpected(intFrameTypeSize.error()); } auto streamCountSize = streamCount.getSize(); if (streamCountSize.hasError()) { - return folly::makeUnexpected(streamCountSize.error()); + return quic::make_unexpected(streamCountSize.error()); } auto maxStreamsFrameSize = @@ -975,11 +975,11 @@ folly::Expected writeSimpleFrame( auto frameTypeSize = frameType.getSize(); if (frameTypeSize.hasError()) { - return folly::makeUnexpected(frameTypeSize.error()); + return quic::make_unexpected(frameTypeSize.error()); } auto sequenceSize = sequence.getSize(); if (sequenceSize.hasError()) { - return folly::makeUnexpected(sequenceSize.error()); + return quic::make_unexpected(sequenceSize.error()); } auto retireConnectionIdFrameSize = @@ -1001,7 +1001,7 @@ folly::Expected writeSimpleFrame( auto intFrameTypeSize = intFrameType.getSize(); if (intFrameTypeSize.hasError()) { - return folly::makeUnexpected(intFrameTypeSize.error()); + return quic::make_unexpected(intFrameTypeSize.error()); } if (packetSpaceCheck(spaceLeft, intFrameTypeSize.value())) { @@ -1021,19 +1021,19 @@ folly::Expected writeSimpleFrame( auto intFrameTypeSize = intFrameType.getSize(); if (intFrameTypeSize.hasError()) { - return folly::makeUnexpected(intFrameTypeSize.error()); + return quic::make_unexpected(intFrameTypeSize.error()); } auto intKnobSpaceSize = intKnobSpace.getSize(); if (intKnobSpaceSize.hasError()) { - return folly::makeUnexpected(intKnobSpaceSize.error()); + return quic::make_unexpected(intKnobSpaceSize.error()); } auto intKnobIdSize = intKnobId.getSize(); if (intKnobIdSize.hasError()) { - return folly::makeUnexpected(intKnobIdSize.error()); + return quic::make_unexpected(intKnobIdSize.error()); } auto intKnobLenSize = intKnobLen.getSize(); if (intKnobLenSize.hasError()) { - return folly::makeUnexpected(intKnobLenSize.error()); + return quic::make_unexpected(intKnobLenSize.error()); } size_t knobFrameLen = intFrameTypeSize.value() + @@ -1061,23 +1061,23 @@ folly::Expected writeSimpleFrame( auto intFrameTypeSize = intFrameType.getSize(); if (intFrameTypeSize.hasError()) { - return folly::makeUnexpected(intFrameTypeSize.error()); + return quic::make_unexpected(intFrameTypeSize.error()); } auto intSequenceNumberSize = intSequenceNumber.getSize(); if (intSequenceNumberSize.hasError()) { - return folly::makeUnexpected(intSequenceNumberSize.error()); + return quic::make_unexpected(intSequenceNumberSize.error()); } auto intPacketToleranceSize = intPacketTolerance.getSize(); if (intPacketToleranceSize.hasError()) { - return folly::makeUnexpected(intPacketToleranceSize.error()); + return quic::make_unexpected(intPacketToleranceSize.error()); } auto intUpdateMaxAckDelaySize = intUpdateMaxAckDelay.getSize(); if (intUpdateMaxAckDelaySize.hasError()) { - return folly::makeUnexpected(intUpdateMaxAckDelaySize.error()); + return quic::make_unexpected(intUpdateMaxAckDelaySize.error()); } auto intReorderThresholdSize = intReorderThreshold.getSize(); if (intReorderThresholdSize.hasError()) { - return folly::makeUnexpected(intReorderThresholdSize.error()); + return quic::make_unexpected(intReorderThresholdSize.error()); } size_t ackFrequencyFrameLen = intFrameTypeSize.value() + @@ -1104,11 +1104,11 @@ folly::Expected writeSimpleFrame( auto intFrameTypeSize = intFrameType.getSize(); if (intFrameTypeSize.hasError()) { - return folly::makeUnexpected(intFrameTypeSize.error()); + return quic::make_unexpected(intFrameTypeSize.error()); } auto tokenLengthSize = tokenLength.getSize(); if (tokenLengthSize.hasError()) { - return folly::makeUnexpected(tokenLengthSize.error()); + return quic::make_unexpected(tokenLengthSize.error()); } auto newTokenFrameLength = intFrameTypeSize.value() + @@ -1129,7 +1129,7 @@ folly::Expected writeSimpleFrame( folly::assume_unreachable(); } -folly::Expected writeFrame( +quic::Expected writeFrame( QuicWriteFrame&& frame, PacketBuilderInterface& builder) { using FrameTypeType = std::underlying_type::type; @@ -1141,7 +1141,7 @@ folly::Expected writeFrame( QuicInteger intFrameType(static_cast(FrameType::PADDING)); auto intFrameTypeSize = intFrameType.getSize(); if (intFrameTypeSize.hasError()) { - return folly::makeUnexpected(intFrameTypeSize.error()); + return quic::make_unexpected(intFrameTypeSize.error()); } if (packetSpaceCheck(spaceLeft, intFrameTypeSize.value())) { builder.write(intFrameType); @@ -1161,19 +1161,19 @@ folly::Expected writeFrame( Optional maybeReliableSize = std::nullopt; auto intFrameTypeSize = intFrameType.getSize(); if (intFrameTypeSize.hasError()) { - return folly::makeUnexpected(intFrameTypeSize.error()); + return quic::make_unexpected(intFrameTypeSize.error()); } auto streamIdSize = streamId.getSize(); if (streamIdSize.hasError()) { - return folly::makeUnexpected(streamIdSize.error()); + return quic::make_unexpected(streamIdSize.error()); } auto finalSizeSize = finalSize.getSize(); if (finalSizeSize.hasError()) { - return folly::makeUnexpected(finalSizeSize.error()); + return quic::make_unexpected(finalSizeSize.error()); } auto errorSize = errorCode.getSize(); if (errorSize.hasError()) { - return folly::makeUnexpected(errorSize.error()); + return quic::make_unexpected(errorSize.error()); } auto rstStreamFrameSize = intFrameTypeSize.value() + errorSize.value() + streamIdSize.value() + finalSizeSize.value(); @@ -1181,7 +1181,7 @@ folly::Expected writeFrame( maybeReliableSize = QuicInteger(*rstStreamFrame.reliableSize); auto reliableSize = maybeReliableSize->getSize(); if (reliableSize.hasError()) { - return folly::makeUnexpected(reliableSize.error()); + return quic::make_unexpected(reliableSize.error()); } rstStreamFrameSize += reliableSize.value(); } @@ -1205,11 +1205,11 @@ folly::Expected writeFrame( QuicInteger maximumData(maxDataFrame.maximumData); auto intFrameTypeSize = intFrameType.getSize(); if (intFrameTypeSize.hasError()) { - return folly::makeUnexpected(intFrameTypeSize.error()); + return quic::make_unexpected(intFrameTypeSize.error()); } auto maximumDataSize = maximumData.getSize(); if (maximumDataSize.hasError()) { - return folly::makeUnexpected(maximumDataSize.error()); + return quic::make_unexpected(maximumDataSize.error()); } auto frameSize = intFrameTypeSize.value() + maximumDataSize.value(); if (packetSpaceCheck(spaceLeft, frameSize)) { @@ -1228,15 +1228,15 @@ folly::Expected writeFrame( QuicInteger maximumData(maxStreamDataFrame.maximumData); auto intFrameTypeSize = intFrameType.getSize(); if (intFrameTypeSize.hasError()) { - return folly::makeUnexpected(intFrameTypeSize.error()); + return quic::make_unexpected(intFrameTypeSize.error()); } auto streamIdSize = streamId.getSize(); if (streamIdSize.hasError()) { - return folly::makeUnexpected(streamIdSize.error()); + return quic::make_unexpected(streamIdSize.error()); } auto maximumDataSize = maximumData.getSize(); if (maximumDataSize.hasError()) { - return folly::makeUnexpected(maximumDataSize.error()); + return quic::make_unexpected(maximumDataSize.error()); } auto maxStreamDataFrameSize = intFrameTypeSize.value() + streamIdSize.value() + maximumDataSize.value(); @@ -1255,11 +1255,11 @@ folly::Expected writeFrame( QuicInteger dataLimit(blockedFrame.dataLimit); auto intFrameTypeSize = intFrameType.getSize(); if (intFrameTypeSize.hasError()) { - return folly::makeUnexpected(intFrameTypeSize.error()); + return quic::make_unexpected(intFrameTypeSize.error()); } auto dataLimitSize = dataLimit.getSize(); if (dataLimitSize.hasError()) { - return folly::makeUnexpected(dataLimitSize.error()); + return quic::make_unexpected(dataLimitSize.error()); } auto blockedFrameSize = intFrameTypeSize.value() + dataLimitSize.value(); if (packetSpaceCheck(spaceLeft, blockedFrameSize)) { @@ -1279,15 +1279,15 @@ folly::Expected writeFrame( QuicInteger dataLimit(streamBlockedFrame.dataLimit); auto intFrameTypeSize = intFrameType.getSize(); if (intFrameTypeSize.hasError()) { - return folly::makeUnexpected(intFrameTypeSize.error()); + return quic::make_unexpected(intFrameTypeSize.error()); } auto streamIdSize = streamId.getSize(); if (streamIdSize.hasError()) { - return folly::makeUnexpected(streamIdSize.error()); + return quic::make_unexpected(streamIdSize.error()); } auto dataLimitSize = dataLimit.getSize(); if (dataLimitSize.hasError()) { - return folly::makeUnexpected(dataLimitSize.error()); + return quic::make_unexpected(dataLimitSize.error()); } auto blockedFrameSize = intFrameTypeSize.value() + streamIdSize.value() + dataLimitSize.value(); @@ -1309,11 +1309,11 @@ folly::Expected writeFrame( QuicInteger streamId(streamsBlockedFrame.streamLimit); auto intFrameTypeSize = intFrameType.getSize(); if (intFrameTypeSize.hasError()) { - return folly::makeUnexpected(intFrameTypeSize.error()); + return quic::make_unexpected(intFrameTypeSize.error()); } auto streamIdSize = streamId.getSize(); if (streamIdSize.hasError()) { - return folly::makeUnexpected(streamIdSize.error()); + return quic::make_unexpected(streamIdSize.error()); } auto streamBlockedFrameSize = intFrameTypeSize.value() + streamIdSize.value(); @@ -1351,17 +1351,17 @@ folly::Expected writeFrame( ApplicationErrorCode(*isApplicationErrorCode))); auto intFrameTypeSize = intFrameType.getSize(); if (intFrameTypeSize.hasError()) { - return folly::makeUnexpected(intFrameTypeSize.error()); + return quic::make_unexpected(intFrameTypeSize.error()); } auto errorSize = errorCode.getSize(); if (errorSize.hasError()) { - return folly::makeUnexpected(errorSize.error()); + return quic::make_unexpected(errorSize.error()); } auto reasonLengthSize = reasonLength.getSize(); if (reasonLengthSize.hasError()) { - return folly::makeUnexpected(reasonLengthSize.error()); + return quic::make_unexpected(reasonLengthSize.error()); } - folly::Expected closingFrameTypeSize = [&]() { + quic::Expected closingFrameTypeSize = [&]() { if (closingFrameType) { auto result = closingFrameType.value().getSize(); if (result.hasError()) { @@ -1369,12 +1369,12 @@ folly::Expected writeFrame( } return result; } else { - return folly::Expected(0); + return quic::Expected(0); } }(); if (closingFrameType && closingFrameTypeSize.hasError()) { - return folly::makeUnexpected(closingFrameTypeSize.error()); + return quic::make_unexpected(closingFrameTypeSize.error()); } size_t closingFrameTypeSizeValue = @@ -1403,7 +1403,7 @@ folly::Expected writeFrame( QuicInteger intFrameType(static_cast(FrameType::PING)); auto intFrameTypeSize = intFrameType.getSize(); if (intFrameTypeSize.hasError()) { - return folly::makeUnexpected(intFrameTypeSize.error()); + return quic::make_unexpected(intFrameTypeSize.error()); } if (packetSpaceCheck(spaceLeft, intFrameTypeSize.value())) { builder.write(intFrameType); @@ -1422,11 +1422,11 @@ folly::Expected writeFrame( QuicInteger datagramLenInt(datagramFrame.length); auto frameTypeQuicIntSize = frameTypeQuicInt.getSize(); if (frameTypeQuicIntSize.hasError()) { - return folly::makeUnexpected(frameTypeQuicIntSize.error()); + return quic::make_unexpected(frameTypeQuicIntSize.error()); } auto datagramLenIntSize = datagramLenInt.getSize(); if (datagramLenIntSize.hasError()) { - return folly::makeUnexpected(datagramLenIntSize.error()); + return quic::make_unexpected(datagramLenIntSize.error()); } auto datagramFrameLength = frameTypeQuicIntSize.value() + datagramFrame.length + datagramLenIntSize.value(); @@ -1444,7 +1444,7 @@ folly::Expected writeFrame( QuicInteger intFrameType(static_cast(FrameType::IMMEDIATE_ACK)); auto intFrameTypeSize = intFrameType.getSize(); if (intFrameTypeSize.hasError()) { - return folly::makeUnexpected(intFrameTypeSize.error()); + return quic::make_unexpected(intFrameTypeSize.error()); } if (packetSpaceCheck(spaceLeft, intFrameTypeSize.value())) { builder.write(intFrameType); diff --git a/quic/codec/QuicWriteCodec.h b/quic/codec/QuicWriteCodec.h index 005064757..10a5341d3 100644 --- a/quic/codec/QuicWriteCodec.h +++ b/quic/codec/QuicWriteCodec.h @@ -24,7 +24,7 @@ namespace quic { * The input parameter is the frame to be written to the output appender. * */ -[[nodiscard]] folly::Expected writeSimpleFrame( +[[nodiscard]] quic::Expected writeSimpleFrame( QuicSimpleFrame&& frame, PacketBuilderInterface& builder); @@ -34,7 +34,7 @@ namespace quic { * The input parameter is the frame to be written to the output appender. * */ -[[nodiscard]] folly::Expected writeFrame( +[[nodiscard]] quic::Expected writeFrame( QuicWriteFrame&& frame, PacketBuilderInterface& builder); @@ -50,7 +50,7 @@ namespace quic { * to decide it. When skipLenHint is true, the field is skipped. When it's * false, it will be encoded into the header. */ -folly::Expected, QuicError> writeStreamFrameHeader( +quic::Expected, QuicError> writeStreamFrameHeader( PacketBuilderInterface& builder, StreamId id, uint64_t offset, @@ -77,7 +77,7 @@ void writeStreamFrameData( * written. The caller should check the structure to confirm how many bytes were * written. */ -[[nodiscard]] folly::Expected, QuicError> +[[nodiscard]] quic::Expected, QuicError> writeCryptoFrame( uint64_t offsetIn, const ChainedByteRangeHead& data, @@ -99,7 +99,7 @@ writeCryptoFrame( * written to the appender. Returns an empty optional if an ack block could not * be written. */ -[[nodiscard]] folly::Expected, QuicError> +[[nodiscard]] quic::Expected, QuicError> writeAckFrame( const WriteAckFrameMetaData& ackFrameMetaData, PacketBuilderInterface& builder, @@ -112,7 +112,7 @@ writeAckFrame( /** * Helper functions to write the fields for ACK_RECEIVE_TIMESTAMPS frame */ -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected computeSizeUsedByRecvdTimestamps(quic::WriteAckFrame& writeAckFrame); } // namespace quic diff --git a/quic/codec/test/DecodeTest.cpp b/quic/codec/test/DecodeTest.cpp index 6988311f5..d31dacaff 100644 --- a/quic/codec/test/DecodeTest.cpp +++ b/quic/codec/test/DecodeTest.cpp @@ -300,7 +300,7 @@ TEST_F(DecodeTest, ValidAckFrame) { cursor, makeHeader(), CodecParameters(kDefaultAckDelayExponent, QuicVersion::MVFST)); - EXPECT_TRUE(res.hasValue()); + EXPECT_TRUE(res.has_value()); auto ackFrame = *res; EXPECT_EQ(ackFrame.ackBlocks.size(), 2); EXPECT_EQ(ackFrame.largestAcked, 1000); @@ -331,7 +331,7 @@ TEST_F(DecodeTest, AckEcnFrame) { cursor, makeHeader(), CodecParameters(kDefaultAckDelayExponent, QuicVersion::MVFST)); - EXPECT_TRUE(res.hasValue()); + EXPECT_TRUE(res.has_value()); auto ackFrame = *res->asReadAckFrame(); EXPECT_EQ(ackFrame.ackBlocks.size(), 2); EXPECT_EQ(ackFrame.largestAcked, 1000); @@ -373,7 +373,7 @@ TEST_F(DecodeTest, AckExtendedFrameWithECN) { std::nullopt, static_cast( ExtendedAckFeatureMask::ECN_COUNTS))); - ASSERT_TRUE(ackFrameRes.hasValue()); + ASSERT_TRUE(ackFrameRes.has_value()); auto ackFrame = *ackFrameRes; EXPECT_EQ(ackFrame.ackBlocks.size(), 2); EXPECT_EQ(ackFrame.largestAcked, 1000); @@ -412,7 +412,7 @@ TEST_F(DecodeTest, AckExtendedFrameWithNoFeatures) { cursor, makeHeader(), CodecParameters(kDefaultAckDelayExponent, QuicVersion::MVFST)); - ASSERT_TRUE(ackFrameRes.hasValue()); + ASSERT_TRUE(ackFrameRes.has_value()); auto ackFrame = *ackFrameRes; EXPECT_EQ(ackFrame.ackBlocks.size(), 2); EXPECT_EQ(ackFrame.largestAcked, 1000); @@ -480,7 +480,7 @@ TEST_F(DecodeTest, AckFrameLargestAckExceedsRange) { cursor, makeHeader(), CodecParameters(kDefaultAckDelayExponent, QuicVersion::MVFST)); - EXPECT_TRUE(res.hasValue()); + EXPECT_TRUE(res.has_value()); auto ackFrame = *res; // it will interpret this as a 8 byte range with the max value. EXPECT_EQ(ackFrame.largestAcked, 4611686018427387903); @@ -754,7 +754,7 @@ TEST_F(DecodeTest, AckFrameBlockLengthZero) { cursor, makeHeader(), CodecParameters(kDefaultAckDelayExponent, QuicVersion::MVFST)); - EXPECT_TRUE(res.hasValue()); + EXPECT_TRUE(res.has_value()); auto readAckFrame = *res; EXPECT_EQ(readAckFrame.ackBlocks[0].endPacket, 1000); EXPECT_EQ(readAckFrame.ackBlocks[0].startPacket, 990); @@ -777,7 +777,7 @@ TEST_F(DecodeTest, StreamDecodeSuccess) { BufQueue queue; queue.append(streamFrame->clone()); auto decodedFrameRes = decodeStreamFrame(queue, streamType); - ASSERT_TRUE(decodedFrameRes.hasValue()); + ASSERT_TRUE(decodedFrameRes.has_value()); auto decodedFrame = decodedFrameRes.value(); EXPECT_EQ(decodedFrame.offset, 10); EXPECT_EQ(decodedFrame.data->computeChainDataLength(), 1); @@ -870,12 +870,12 @@ void MaxStreamsIdCheckSuccess(StreamId maxStreamsId) { Cursor cursorBiDi(buf.get()); auto maxStreamsBiDiFrameRes = decodeBiDiMaxStreamsFrame(cursorBiDi); - ASSERT_TRUE(maxStreamsBiDiFrameRes.hasValue()); + ASSERT_TRUE(maxStreamsBiDiFrameRes.has_value()); EXPECT_EQ(maxStreamsBiDiFrameRes->maxStreams, maxStreamsId); Cursor cursorUni(buf.get()); auto maxStreamsUniFrameRes = decodeUniMaxStreamsFrame(cursorUni); - ASSERT_TRUE(maxStreamsUniFrameRes.hasValue()); + ASSERT_TRUE(maxStreamsUniFrameRes.has_value()); EXPECT_EQ(maxStreamsUniFrameRes->maxStreams, maxStreamsId); } @@ -1043,7 +1043,7 @@ TEST_F(DecodeTest, ParsePlaintextNewToken) { auto parseResult = parsePlaintextRetryOrNewToken(cursor); - EXPECT_TRUE(parseResult.hasValue()); + EXPECT_TRUE(parseResult.has_value()); EXPECT_EQ(parseResult.value(), timestampInMs); } @@ -1067,7 +1067,7 @@ TEST_F(DecodeTest, ParsePlaintextRetryToken) { */ auto parseResult = parsePlaintextRetryOrNewToken(cursor); - EXPECT_TRUE(parseResult.hasValue()); + EXPECT_TRUE(parseResult.has_value()); EXPECT_EQ(parseResult.value(), timestampInMs); } @@ -1095,7 +1095,7 @@ TEST_F(DecodeTest, StreamGroupDecodeSuccess) { queue.append(streamFrame->clone()); auto decodedFrameRes = decodeStreamFrame(queue, streamType, true /* isGroupFrame */); - ASSERT_TRUE(decodedFrameRes.hasValue()); + ASSERT_TRUE(decodedFrameRes.has_value()); auto decodedFrame = decodedFrameRes.value(); EXPECT_EQ(decodedFrame.offset, 10); EXPECT_EQ(decodedFrame.data->computeChainDataLength(), 1); @@ -1115,7 +1115,7 @@ TEST_F(DecodeTest, AckFrequencyFrameDecodeValid) { Cursor cursor(ackFrequencyFrame.get()); auto res = decodeAckFrequencyFrame(cursor); - EXPECT_TRUE(res.hasValue()); + EXPECT_TRUE(res.has_value()); auto decodedFrame = *res->asAckFrequencyFrame(); EXPECT_EQ(decodedFrame.sequenceNumber, 1); EXPECT_EQ(decodedFrame.packetTolerance, 100); diff --git a/quic/codec/test/Mocks.h b/quic/codec/test/Mocks.h index b63c948b9..625f96075 100644 --- a/quic/codec/test/Mocks.h +++ b/quic/codec/test/Mocks.h @@ -18,12 +18,12 @@ class MockConnectionIdAlgo : public ConnectionIdAlgo { public: MOCK_METHOD((bool), canParseNonConst, (const ConnectionId& id), (noexcept)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), parseConnectionId, (const ConnectionId&), (noexcept)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), encodeConnectionId, (const ServerConnectionIdParams&), (noexcept)); @@ -96,10 +96,7 @@ class MockQuicPacketBuilder : public PacketBuilderInterface { MOCK_METHOD(uint32_t, getHeaderBytes, (), (const)); MOCK_METHOD(bool, hasFramesPending, (), (const)); MOCK_METHOD(void, releaseOutputBufferMock, ()); - MOCK_METHOD( - (folly::Expected), - encodePacketHeader, - ()); + MOCK_METHOD((quic::Expected), encodePacketHeader, ()); void releaseOutputBuffer() && override { releaseOutputBufferMock(); diff --git a/quic/codec/test/QuicConnectionIdTest.cpp b/quic/codec/test/QuicConnectionIdTest.cpp index 14bd612cf..974d6c131 100644 --- a/quic/codec/test/QuicConnectionIdTest.cpp +++ b/quic/codec/test/QuicConnectionIdTest.cpp @@ -16,7 +16,7 @@ TEST(ConnectionIdTest, TestConnidLen) { folly::IOBuf buf = folly::IOBuf::wrapBufferAsValue(out.data(), out.size()); Cursor cursor(&buf); auto connidExpected = ConnectionId::create(cursor, out.size()); - EXPECT_TRUE(connidExpected.hasValue()); + EXPECT_TRUE(connidExpected.has_value()); ConnectionId connid = std::move(connidExpected.value()); EXPECT_EQ(static_cast(connid.size()), out.size()); for (size_t i = 0; i < connid.size(); ++i) { @@ -31,7 +31,7 @@ TEST(ConnectionIdTest, TestZeroLenConnid) { folly::IOBuf buf = folly::IOBuf::wrapBufferAsValue(out.data(), out.size()); Cursor cursor(&buf); auto connidExpected = ConnectionId::create(cursor, out.size()); - EXPECT_TRUE(connidExpected.hasValue()); + EXPECT_TRUE(connidExpected.has_value()); ConnectionId connid = std::move(connidExpected.value()); EXPECT_EQ(static_cast(connid.size()), out.size()); } @@ -57,12 +57,12 @@ TEST(ConnectionIdTest, ConnIdSize) { for (size_t i = 0; i < kMaxConnectionIdSize + 2; ++i) { testconnid.push_back(0); } - EXPECT_FALSE(ConnectionId::create(testconnid).hasValue()); + EXPECT_FALSE(ConnectionId::create(testconnid).has_value()); testconnid.clear(); for (size_t i = 0; i < kMinSelfConnectionIdV1Size - 1; ++i) { testconnid.push_back(0); } - EXPECT_TRUE(ConnectionId::create(testconnid).hasValue()); + EXPECT_TRUE(ConnectionId::create(testconnid).has_value()); } } // namespace quic::test diff --git a/quic/codec/test/QuicHeaderCodecTest.cpp b/quic/codec/test/QuicHeaderCodecTest.cpp index 20433a471..d7f22ce33 100644 --- a/quic/codec/test/QuicHeaderCodecTest.cpp +++ b/quic/codec/test/QuicHeaderCodecTest.cpp @@ -20,7 +20,7 @@ class QuicHeaderCodecTest : public Test {}; TEST_F(QuicHeaderCodecTest, EmptyBuffer) { auto emptyBuffer = folly::IOBuf::create(0); - EXPECT_FALSE(parseHeader(*emptyBuffer).hasValue()); + EXPECT_FALSE(parseHeader(*emptyBuffer).has_value()); } TEST_F(QuicHeaderCodecTest, TooSmallBuffer) { @@ -28,7 +28,7 @@ TEST_F(QuicHeaderCodecTest, TooSmallBuffer) { smallBuffer->append(1); folly::io::RWPrivateCursor wcursor(smallBuffer.get()); wcursor.writeBE(0x01); - EXPECT_FALSE(parseHeader(*smallBuffer).hasValue()); + EXPECT_FALSE(parseHeader(*smallBuffer).has_value()); } TEST_F(QuicHeaderCodecTest, VersionNegotiationPacketTest) { diff --git a/quic/codec/test/QuicIntegerTest.cpp b/quic/codec/test/QuicIntegerTest.cpp index a0546a8ee..55d27390a 100644 --- a/quic/codec/test/QuicIntegerTest.cpp +++ b/quic/codec/test/QuicIntegerTest.cpp @@ -5,10 +5,10 @@ * LICENSE file in the root directory of this source tree. */ -#include #include #include #include +#include #include #include @@ -125,7 +125,7 @@ TEST_F(QuicIntegerEncodeTest, ForceWrongBytes) { auto queue = folly::IOBuf::create(0); BufAppender appender(queue.get(), 10); auto appendOp = [&](auto val) { appender.writeBE(val); }; - EXPECT_DEATH(encodeQuicInteger(15293, appendOp, 1), ""); + EXPECT_DEATH((void)encodeQuicInteger(15293, appendOp, 1), ""); } INSTANTIATE_TEST_SUITE_P( diff --git a/quic/codec/test/QuicPacketBuilderTest.cpp b/quic/codec/test/QuicPacketBuilderTest.cpp index 6dde89a8f..538121b22 100644 --- a/quic/codec/test/QuicPacketBuilderTest.cpp +++ b/quic/codec/test/QuicPacketBuilderTest.cpp @@ -705,7 +705,7 @@ TEST_F(QuicPacketBuilderTest, RetryPacketValid) { // dcid auto dcidResult = ConnectionId::create(cursor, dcidLen); - ASSERT_TRUE(dcidResult.hasValue()); + ASSERT_TRUE(dcidResult.has_value()); ConnectionId dcidObtained = std::move(dcidResult.value()); EXPECT_EQ(dcidObtained, dstConnId); @@ -715,7 +715,7 @@ TEST_F(QuicPacketBuilderTest, RetryPacketValid) { // scid auto scidResult = ConnectionId::create(cursor, scidLen); - ASSERT_TRUE(scidResult.hasValue()); + ASSERT_TRUE(scidResult.has_value()); ConnectionId scidObtained = std::move(scidResult.value()); EXPECT_EQ(scidObtained, srcConnId); diff --git a/quic/codec/test/QuicPacketRebuilderTest.cpp b/quic/codec/test/QuicPacketRebuilderTest.cpp index 3eb00173f..2d422a533 100644 --- a/quic/codec/test/QuicPacketRebuilderTest.cpp +++ b/quic/codec/test/QuicPacketRebuilderTest.cpp @@ -137,7 +137,7 @@ TEST_F(QuicPacketRebuilderTest, RebuildPacket) { ASSERT_FALSE( writeFrame(QuicSimpleFrame(maxStreamsFrame), regularBuilder1).hasError()); ASSERT_FALSE(writeFrame(pingFrame, regularBuilder1).hasError()); - writeStreamFrameHeader( + (void)writeStreamFrameHeader( regularBuilder1, streamId, 0, @@ -272,7 +272,7 @@ TEST_F(QuicPacketRebuilderTest, RebuildAfterResetStream) { auto stream = conn.streamManager->createNextBidirectionalStream().value(); auto streamId = stream->id; auto buf = folly::IOBuf::copyBuffer("A million miles away."); - writeStreamFrameHeader( + (void)writeStreamFrameHeader( regularBuilder1, streamId, 0, @@ -314,7 +314,7 @@ TEST_F(QuicPacketRebuilderTest, FinOnlyStreamRebuild) { auto streamId = stream->id; // Write them with a regular builder - writeStreamFrameHeader( + (void)writeStreamFrameHeader( regularBuilder1, streamId, 0, 0, 0, true, std::nullopt /* skipLenHint */); auto packet1 = std::move(regularBuilder1).buildPacket(); stream->retransmissionBuffer.emplace( @@ -367,7 +367,7 @@ TEST_F(QuicPacketRebuilderTest, RebuildDataStreamAndEmptyCryptoStream) { auto cryptoBuf = folly::IOBuf::copyBuffer("NewSessionTicket"); // Write them with a regular builder - writeStreamFrameHeader( + (void)writeStreamFrameHeader( regularBuilder1, streamId, 0, @@ -487,7 +487,7 @@ TEST_F(QuicPacketRebuilderTest, CannotRebuild) { ASSERT_FALSE(writeFrame(maxStreamIdFrame, regularBuilder1).hasError()); ASSERT_FALSE(writeFrame(pingFrame, regularBuilder1).hasError()); ASSERT_FALSE(writeAckFrame(ackMeta, regularBuilder1).hasError()); - writeStreamFrameHeader( + (void)writeStreamFrameHeader( regularBuilder1, streamId, 0, @@ -587,7 +587,7 @@ TEST_F(QuicPacketRebuilderTest, LastStreamFrameSkipLen) { RegularQuicPacketBuilder regularBuilder( kDefaultUDPSendPacketLen, std::move(shortHeader), 0); ASSERT_FALSE(regularBuilder.encodePacketHeader().hasError()); - writeStreamFrameHeader( + (void)writeStreamFrameHeader( regularBuilder, streamId, 0, @@ -597,7 +597,7 @@ TEST_F(QuicPacketRebuilderTest, LastStreamFrameSkipLen) { std::nullopt); writeStreamFrameData( regularBuilder, buf1->clone(), buf1->computeChainDataLength()); - writeStreamFrameHeader( + (void)writeStreamFrameHeader( regularBuilder, streamId, buf1->computeChainDataLength(), @@ -666,7 +666,7 @@ TEST_F(QuicPacketRebuilderTest, LastStreamFrameFinOnlySkipLen) { RegularQuicPacketBuilder regularBuilder( kDefaultUDPSendPacketLen, std::move(shortHeader), 0); ASSERT_FALSE(regularBuilder.encodePacketHeader().hasError()); - writeStreamFrameHeader( + (void)writeStreamFrameHeader( regularBuilder, streamId, 0, @@ -676,7 +676,7 @@ TEST_F(QuicPacketRebuilderTest, LastStreamFrameFinOnlySkipLen) { std::nullopt); writeStreamFrameData( regularBuilder, buf1->clone(), buf1->computeChainDataLength()); - writeStreamFrameHeader( + (void)writeStreamFrameHeader( regularBuilder, streamId, buf1->computeChainDataLength(), diff --git a/quic/codec/test/QuicReadCodecTest.cpp b/quic/codec/test/QuicReadCodecTest.cpp index 946982c3f..076c234ef 100644 --- a/quic/codec/test/QuicReadCodecTest.cpp +++ b/quic/codec/test/QuicReadCodecTest.cpp @@ -833,7 +833,7 @@ TEST_F(QuicReadCodecTest, parseEmptyStreamFrame) { PacketHeader(ShortHeader( ProtectionType::KeyPhaseOne, ConnectionId::createRandom(10).value())), CodecParameters()); - EXPECT_FALSE(result.hasValue()); + EXPECT_FALSE(result.has_value()); EXPECT_EQ(result.error().code, TransportErrorCode::FRAME_ENCODING_ERROR); } @@ -845,7 +845,7 @@ TEST_F(QuicReadCodecTest, parseEmptyDatagramFrame) { PacketHeader(ShortHeader( ProtectionType::KeyPhaseOne, ConnectionId::createRandom(10).value())), CodecParameters()); - EXPECT_FALSE(result.hasValue()); + EXPECT_FALSE(result.has_value()); EXPECT_EQ(result.error().code, TransportErrorCode::FRAME_ENCODING_ERROR); } diff --git a/quic/codec/test/QuicWriteCodecTest.cpp b/quic/codec/test/QuicWriteCodecTest.cpp index 54d108a8c..63ed04d6d 100644 --- a/quic/codec/test/QuicWriteCodecTest.cpp +++ b/quic/codec/test/QuicWriteCodecTest.cpp @@ -53,7 +53,7 @@ QuicFrame parseQuicFrame( receiveTimeStampsConfig, extendedAckSupport)); - if (!result.hasValue()) { + if (!result.has_value()) { throw QuicTransportException( result.error().message, *result.error().code.asTransportErrorCode()); } @@ -534,7 +534,7 @@ TEST_F(QuicWriteCodecTest, WriteStreamFrameToEmptyPacket) { 10, fin, std::nullopt /* skipLenHint */); - ASSERT_TRUE(res.hasValue()); + ASSERT_TRUE(res.has_value()); auto dataLen = *res; ASSERT_TRUE(dataLen); ASSERT_EQ(*dataLen, 10); @@ -588,7 +588,7 @@ TEST_F(QuicWriteCodecTest, WriteStreamFrameToPartialPacket) { 20, fin, std::nullopt /* skipLenHint */); - ASSERT_TRUE(res.hasValue()); + ASSERT_TRUE(res.has_value()); auto dataLen = *res; ASSERT_TRUE(dataLen); EXPECT_EQ(*dataLen, 20); @@ -645,7 +645,7 @@ TEST_F(QuicWriteCodecTest, WriteTwoStreamFrames) { 30, fin1, std::nullopt /* skipLenHint */); - ASSERT_TRUE(res.hasValue()); + ASSERT_TRUE(res.has_value()); auto dataLen = *res; ASSERT_TRUE(dataLen); ASSERT_EQ(*dataLen, 30); @@ -674,7 +674,7 @@ TEST_F(QuicWriteCodecTest, WriteTwoStreamFrames) { remainingSpace, fin2, std::nullopt /* skipLenHint */); - ASSERT_TRUE(res.hasValue()); + ASSERT_TRUE(res.has_value()); dataLen = *res; ASSERT_TRUE(dataLen); ASSERT_EQ(*dataLen, remainingSpace - 7); @@ -711,7 +711,7 @@ TEST_F(QuicWriteCodecTest, WriteTwoStreamFrames) { queue, regularPacket.header, CodecParameters(kDefaultAckDelayExponent, QuicVersion::MVFST)); - ASSERT_TRUE(streamFrameDecoded1.hasValue()); + ASSERT_TRUE(streamFrameDecoded1.has_value()); auto& decodedStreamFrame1 = *streamFrameDecoded1->asReadStreamFrame(); EXPECT_EQ(decodedStreamFrame1.streamId, streamId1); EXPECT_EQ(decodedStreamFrame1.offset, offset1); @@ -722,7 +722,7 @@ TEST_F(QuicWriteCodecTest, WriteTwoStreamFrames) { queue, regularPacket.header, CodecParameters(kDefaultAckDelayExponent, QuicVersion::MVFST)); - ASSERT_TRUE(streamFrameDecoded2.hasValue()); + ASSERT_TRUE(streamFrameDecoded2.has_value()); auto& decodedStreamFrame2 = *streamFrameDecoded2->asReadStreamFrame(); EXPECT_EQ(decodedStreamFrame2.streamId, streamId2); EXPECT_EQ(decodedStreamFrame2.offset, offset2); @@ -754,7 +754,7 @@ TEST_F(QuicWriteCodecTest, WriteStreamFramePartialData) { 50, fin, std::nullopt /* skipLenHint */); - ASSERT_TRUE(res.hasValue()); + ASSERT_TRUE(res.has_value()); auto dataLen = *res; ASSERT_TRUE(dataLen); ASSERT_EQ(*dataLen, 33); @@ -795,7 +795,7 @@ TEST_F(QuicWriteCodecTest, WriteStreamFrameTooSmallForStreamHeader) { bool fin = false; auto res = writeStreamFrameHeader( pktBuilder, streamId, offset, 1, 1, fin, std::nullopt /* skipLenHint */); - EXPECT_TRUE(res.hasValue()); + EXPECT_TRUE(res.has_value()); auto dataLen = *res; EXPECT_FALSE(dataLen); EXPECT_EQ(1, pktBuilder.remainingSpaceInPkt()); @@ -821,7 +821,7 @@ TEST_F(QuicWriteCodecTest, WriteStreamNoSpaceForData) { 10, fin, std::nullopt /* skipLenHint */); - ASSERT_TRUE(res.hasValue()); + ASSERT_TRUE(res.has_value()); auto dataLen = *res; EXPECT_FALSE(dataLen.has_value()); EXPECT_EQ(pktBuilder.remainingSpaceInPkt(), 3); @@ -851,7 +851,7 @@ TEST_F(QuicWriteCodecTest, WriteStreamSpaceForOneByte) { 100, fin, std::nullopt /* skipLenHint */); - ASSERT_TRUE(res.hasValue()); + ASSERT_TRUE(res.has_value()); auto dataLen = *res; ASSERT_TRUE(dataLen); ASSERT_EQ(*dataLen, 1); @@ -877,7 +877,7 @@ TEST_F(QuicWriteCodecTest, WriteStreamSpaceForOneByte) { queue, regularPacket.header, CodecParameters(kDefaultAckDelayExponent, QuicVersion::MVFST)); - ASSERT_TRUE(decodedFrame.hasValue()); + ASSERT_TRUE(decodedFrame.has_value()); auto& decodedStreamFrame = *decodedFrame->asReadStreamFrame(); EXPECT_EQ(decodedStreamFrame.streamId, streamId); EXPECT_EQ(decodedStreamFrame.offset, offset); @@ -906,7 +906,7 @@ TEST_F(QuicWriteCodecTest, WriteFinToEmptyPacket) { 10, fin, std::nullopt /* skipLenHint */); - ASSERT_TRUE(res.hasValue()); + ASSERT_TRUE(res.has_value()); auto dataLen = *res; ASSERT_TRUE(dataLen); ASSERT_EQ(*dataLen, 10); @@ -933,7 +933,7 @@ TEST_F(QuicWriteCodecTest, WriteFinToEmptyPacket) { queue, regularPacket.header, CodecParameters(kDefaultAckDelayExponent, QuicVersion::MVFST)); - ASSERT_TRUE(decodedFrame.hasValue()); + ASSERT_TRUE(decodedFrame.has_value()); auto& decodedStreamFrame = *decodedFrame->asReadStreamFrame(); EXPECT_EQ(decodedStreamFrame.streamId, streamId); EXPECT_EQ(decodedStreamFrame.offset, offset); @@ -966,7 +966,7 @@ TEST_F(QuicWriteCodecTest, TestWriteIncompleteDataAndFin) { inDataSize, fin, std::nullopt /* skipLenHint */); - ASSERT_TRUE(res.hasValue()); + ASSERT_TRUE(res.has_value()); auto dataLen = *res; ASSERT_TRUE(dataLen); EXPECT_LT(*dataLen, inDataSize); @@ -985,7 +985,7 @@ TEST_F(QuicWriteCodecTest, TestWriteNoDataAndFin) { BufPtr empty; auto res = writeStreamFrameHeader( pktBuilder, streamId, offset, 0, 0, fin, std::nullopt /* skipLenHint */); - ASSERT_TRUE(res.hasValue()); + ASSERT_TRUE(res.has_value()); auto dataLen = *res; ASSERT_TRUE(dataLen); EXPECT_EQ(*dataLen, 0); @@ -1029,7 +1029,7 @@ TEST_F(QuicWriteCodecTest, PacketOnlyHasSpaceForStreamHeader) { 20, fin, std::nullopt /* skipLenHint */); - ASSERT_TRUE(res.hasValue()); + ASSERT_TRUE(res.has_value()); auto dataLen = *res; EXPECT_FALSE(dataLen.has_value()); EXPECT_EQ(pktBuilder.remainingSpaceInPkt(), 2); @@ -1048,7 +1048,7 @@ TEST_F(QuicWriteCodecTest, PacketOnlyHasSpaceForStreamHeaderWithFin) { bool fin = true; auto res = writeStreamFrameHeader( pktBuilder, streamId, offset, 0, 0, fin, std::nullopt /* skipLenHint */); - ASSERT_TRUE(res.hasValue()); + ASSERT_TRUE(res.has_value()); auto dataLen = *res; ASSERT_TRUE(dataLen.has_value()); EXPECT_EQ(*dataLen, 0); @@ -1068,7 +1068,7 @@ TEST_F(QuicWriteCodecTest, PacketNotEnoughSpaceForStreamHeaderWithFin) { bool fin = true; auto res = writeStreamFrameHeader( pktBuilder, streamId, offset, 0, 0, fin, std::nullopt /* skipLenHint */); - EXPECT_TRUE(res.hasValue()); + EXPECT_TRUE(res.has_value()); auto dataLen = *res; ASSERT_FALSE(dataLen.has_value()); EXPECT_EQ(pktBuilder.remainingSpaceInPkt(), 2); @@ -1098,7 +1098,7 @@ TEST_F(QuicWriteCodecTest, WriteStreamFrameHeadeSkipLen) { bool fin = false; auto res = writeStreamFrameHeader( pktBuilder, streamId, offset, 1200 * 2, 1200 * 2, fin, std::nullopt); - EXPECT_TRUE(res.hasValue()); + EXPECT_TRUE(res.has_value()); auto dataLen = *res; EXPECT_LT(*dataLen, 1200); } @@ -1126,7 +1126,7 @@ TEST_F(QuicWriteCodecTest, WriteStreamFrameHeadeNotSkipLen) { bool fin = false; auto res = writeStreamFrameHeader( pktBuilder, streamId, offset, 200, 200, fin, std::nullopt); - EXPECT_TRUE(res.hasValue()); + EXPECT_TRUE(res.has_value()); auto dataLen = *res; EXPECT_EQ(*dataLen, 200); } @@ -1154,7 +1154,7 @@ TEST_F(QuicWriteCodecTest, WriteStreamFrameHeadeLengthHintTrue) { bool fin = false; auto res = writeStreamFrameHeader(pktBuilder, streamId, offset, 200, 200, fin, true); - EXPECT_TRUE(res.hasValue()); + EXPECT_TRUE(res.has_value()); auto dataLen = *res; EXPECT_EQ(*dataLen, 200); } @@ -1182,7 +1182,7 @@ TEST_F(QuicWriteCodecTest, WriteStreamFrameHeadeLengthHintFalse) { bool fin = false; auto res = writeStreamFrameHeader( pktBuilder, streamId, offset, 1200 * 2, 1200 * 2, fin, false); - EXPECT_TRUE(res.hasValue()); + EXPECT_TRUE(res.has_value()); auto dataLen = *res; EXPECT_LT(*dataLen, 1200); } @@ -1589,7 +1589,7 @@ TEST_P(QuicWriteCodecTest, WriteWithDifferentAckDelayExponent) { frameType, defaultAckReceiveTimestmpsConfig, kMaxReceivedPktsTimestampsStored); - EXPECT_TRUE(ackFrameWriteResult.hasValue()); + EXPECT_TRUE(ackFrameWriteResult.has_value()); auto builtOut = std::move(pktBuilder).buildTestPacket(); auto wireBuf = std::move(builtOut.second); BufQueue queue; @@ -1598,7 +1598,7 @@ TEST_P(QuicWriteCodecTest, WriteWithDifferentAckDelayExponent) { queue, builtOut.first.header, CodecParameters(ackDelayExponent, QuicVersion::MVFST)); - EXPECT_TRUE(decodedFrameResult.hasValue()); + EXPECT_TRUE(decodedFrameResult.has_value()); auto& decodedAckFrame = *decodedFrameResult.value().asReadAckFrame(); EXPECT_EQ( decodedAckFrame.ackDelay.count(), @@ -1628,7 +1628,7 @@ TEST_P(QuicWriteCodecTest, WriteExponentInLongHeaderPacket) { frameType, defaultAckReceiveTimestmpsConfig, kMaxReceivedPktsTimestampsStored); - EXPECT_TRUE(ackFrameWriteResult.hasValue()); + EXPECT_TRUE(ackFrameWriteResult.has_value()); auto builtOut = std::move(pktBuilder).buildLongHeaderPacket(); auto wireBuf = std::move(builtOut.second); Cursor cursor(wireBuf.get()); @@ -1638,7 +1638,7 @@ TEST_P(QuicWriteCodecTest, WriteExponentInLongHeaderPacket) { queue, builtOut.first.header, CodecParameters(ackDelayExponent, QuicVersion::MVFST)); - EXPECT_TRUE(decodedFrameResult.hasValue()); + EXPECT_TRUE(decodedFrameResult.has_value()); auto& decodedAckFrame = *decodedFrameResult.value().asReadAckFrame(); EXPECT_EQ( decodedAckFrame.ackDelay.count(), @@ -2808,7 +2808,7 @@ TEST_F(QuicWriteCodecTest, WriteStreamFrameWithGroup) { fin, std::nullopt /* skipLenHint */, groupId); - ASSERT_TRUE(res.hasValue()); + ASSERT_TRUE(res.has_value()); auto dataLen = *res; ASSERT_TRUE(dataLen); ASSERT_EQ(*dataLen, 50); @@ -2834,7 +2834,7 @@ TEST_F(QuicWriteCodecTest, WriteStreamFrameWithGroup) { queue, regularPacket.header, CodecParameters(kDefaultAckDelayExponent, QuicVersion::MVFST)); - ASSERT_TRUE(streamFrameDecodedExpected.hasValue()); + ASSERT_TRUE(streamFrameDecodedExpected.has_value()); auto& decodedStreamFrame = *streamFrameDecodedExpected->asReadStreamFrame(); EXPECT_EQ(decodedStreamFrame.streamId, streamId); EXPECT_EQ(decodedStreamFrame.streamGroupId, groupId); @@ -2883,7 +2883,7 @@ TEST_F(QuicWriteCodecTest, WriteAckFrequencyFrame) { queue, regularPacket.header, CodecParameters(kDefaultAckDelayExponent, QuicVersion::MVFST)); - ASSERT_TRUE(parsedFrameExpected.hasValue()); + ASSERT_TRUE(parsedFrameExpected.has_value()); auto decodedFrame = parsedFrameExpected->asQuicSimpleFrame()->asAckFrequencyFrame(); ASSERT_TRUE(decodedFrame); diff --git a/quic/codec/test/TypesTest.cpp b/quic/codec/test/TypesTest.cpp index 3856d7970..75e2b7669 100644 --- a/quic/codec/test/TypesTest.cpp +++ b/quic/codec/test/TypesTest.cpp @@ -39,7 +39,7 @@ TEST_F(TypesTest, ReadHeaderForm) { EXPECT_EQ(HeaderForm::Long, getHeaderForm(0xFF)); } -folly::Expected makeLongHeader( +quic::Expected makeLongHeader( LongHeader::Types packetType) { LongHeader headerRegular( packetType, @@ -86,8 +86,8 @@ TEST_F(TypesTest, LongHeaderTypes) { LongHeader::Types::ZeroRtt, makeLongHeader(LongHeader::Types::ZeroRtt) ->parsedLongHeader->header.getHeaderType()); - EXPECT_FALSE( - makeLongHeader(static_cast(badLongHeader)).hasValue()); + EXPECT_FALSE(makeLongHeader(static_cast(badLongHeader)) + .has_value()); } TEST_F(TypesTest, LongHeaderEmptyInput) { @@ -96,7 +96,7 @@ TEST_F(TypesTest, LongHeaderEmptyInput) { auto buf = folly::IOBuf::create(0); buf->append(0); Cursor cursor(buf.get()); - EXPECT_FALSE(parseLongHeader(versionNegotiation, cursor).hasValue()); + EXPECT_FALSE(parseLongHeader(versionNegotiation, cursor).has_value()); } TEST_F(TypesTest, LongHeaderSmallInput) { @@ -115,7 +115,7 @@ TEST_F(TypesTest, LongHeaderSmallInput) { wcursor.writeBE(3); Cursor cursor(buf.get()); - EXPECT_FALSE(parseLongHeader(clientCleartext, cursor).hasValue()); + EXPECT_FALSE(parseLongHeader(clientCleartext, cursor).has_value()); } TEST_F(TypesTest, LongHeaderInvalid) { @@ -132,7 +132,7 @@ TEST_F(TypesTest, LongHeaderInvalid) { wcursor.writeBE(static_cast(version)); Cursor cursor(buf.get()); - EXPECT_FALSE(parseLongHeader(badInitialValue, cursor).hasValue()); + EXPECT_FALSE(parseLongHeader(badInitialValue, cursor).has_value()); } TEST_F(TypesTest, ShortHeader) { @@ -149,7 +149,7 @@ TEST_F(TypesTest, ShortHeader) { auto buf4 = folly::IOBuf::create(0); buf4->append(0); Cursor cursor4(buf4.get()); - EXPECT_FALSE(parseShortHeader(0x01, cursor4).hasValue()); + EXPECT_FALSE(parseShortHeader(0x01, cursor4).has_value()); } TEST_F(TypesTest, TestHasDataLength) { diff --git a/quic/common/BUCK b/quic/common/BUCK index 61b162038..8f1b98c05 100644 --- a/quic/common/BUCK +++ b/quic/common/BUCK @@ -115,7 +115,7 @@ mvfst_cpp_library( "SocketUtil.h", ], exported_deps = [ - "//folly:expected", + ":expected", "//folly/io:socket_option_map", "//folly/net:net_ops", "//quic:exception", diff --git a/quic/common/Expected.h b/quic/common/Expected.h index cfecfef8b..43b2c00f0 100644 --- a/quic/common/Expected.h +++ b/quic/common/Expected.h @@ -12,6 +12,27 @@ #include +// Protect against Windows macros that interfere with standard library and QUIC +// code +#ifdef _WIN32 +#ifndef NOMINMAX +#define NOMINMAX +#endif +// If the macros are already defined, undefine them temporarily +#ifdef max +#define QUIC_EXPECTED_HAD_MAX_MACRO +#undef max +#endif +#ifdef min +#define QUIC_EXPECTED_HAD_MIN_MACRO +#undef min +#endif +#ifdef NO_ERROR +#define QUIC_EXPECTED_HAD_NO_ERROR_MACRO +#undef NO_ERROR +#endif +#endif // _WIN32 + // Forward-declare nonstd::expected_lite first, then create the compatibility // alias *before* including the vendor header, so its hash specializations can // resolve. @@ -63,3 +84,19 @@ constexpr auto make_unexpected(E&& err) { return ::nonstd::expected_lite::make_unexpected(std::forward(err)); } } // namespace quic + +// Restore Windows macros if they were previously defined +#ifdef _WIN32 +#ifdef QUIC_EXPECTED_HAD_MAX_MACRO +#define max(a, b) (((a) > (b)) ? (a) : (b)) +#undef QUIC_EXPECTED_HAD_MAX_MACRO +#endif +#ifdef QUIC_EXPECTED_HAD_MIN_MACRO +#define min(a, b) (((a) < (b)) ? (a) : (b)) +#undef QUIC_EXPECTED_HAD_MIN_MACRO +#endif +#ifdef QUIC_EXPECTED_HAD_NO_ERROR_MACRO +#define NO_ERROR 0L +#undef QUIC_EXPECTED_HAD_NO_ERROR_MACRO +#endif +#endif // _WIN32 diff --git a/quic/common/SocketUtil.h b/quic/common/SocketUtil.h index a65a9dac6..b263eb3ff 100644 --- a/quic/common/SocketUtil.h +++ b/quic/common/SocketUtil.h @@ -7,10 +7,10 @@ #pragma once -#include #include #include #include +#include namespace quic { @@ -23,7 +23,7 @@ inline bool isNetworkUnreachable(int err) { // const folly::SocketOptionMap& /* options */, // folly::SocketOptionKey::ApplyPos /* pos */) template -folly::Expected applySocketOptions( +quic::Expected applySocketOptions( T& sock, const folly::SocketOptionMap& options, sa_family_t family, diff --git a/quic/common/test/SocketUtilTest.cpp b/quic/common/test/SocketUtilTest.cpp index 7c4d0346f..88cc1146c 100644 --- a/quic/common/test/SocketUtilTest.cpp +++ b/quic/common/test/SocketUtilTest.cpp @@ -18,7 +18,7 @@ class MockQuicAsyncUDPSocket : public quic::FollyQuicAsyncUDPSocket { MOCK_METHOD2( applyOptions, - folly::Expected( + quic::Expected( const folly::SocketOptionMap&, folly::SocketOptionKey::ApplyPos)); }; @@ -81,30 +81,30 @@ TEST(SocketUtilTest, applySocketOptions) { sock, applyOptions( expected_v4_prebind_opts, folly::SocketOptionKey::ApplyPos::PRE_BIND)) - .WillOnce(testing::Return(folly::unit)); - applySocketOptions( + .WillOnce(testing::Return(quic::Expected{})); + auto result1 = applySocketOptions( sock, opts, AF_INET, folly::SocketOptionKey::ApplyPos::PRE_BIND); EXPECT_CALL( sock, applyOptions( expected_v4_postbind_opts, folly::SocketOptionKey::ApplyPos::POST_BIND)) - .WillOnce(testing::Return(folly::unit)); - applySocketOptions( + .WillOnce(testing::Return(quic::Expected{})); + auto result2 = applySocketOptions( sock, opts, AF_INET, folly::SocketOptionKey::ApplyPos::POST_BIND); EXPECT_CALL( sock, applyOptions( expected_v6_prebind_opts, folly::SocketOptionKey::ApplyPos::PRE_BIND)) - .WillOnce(testing::Return(folly::unit)); - applySocketOptions( + .WillOnce(testing::Return(quic::Expected{})); + auto result3 = applySocketOptions( sock, opts, AF_INET6, folly::SocketOptionKey::ApplyPos::PRE_BIND); EXPECT_CALL( sock, applyOptions( expected_v6_postbind_opts, folly::SocketOptionKey::ApplyPos::POST_BIND)) - .WillOnce(testing::Return(folly::unit)); - applySocketOptions( + .WillOnce(testing::Return(quic::Expected{})); + auto result4 = applySocketOptions( sock, opts, AF_INET6, folly::SocketOptionKey::ApplyPos::POST_BIND); } diff --git a/quic/common/test/TestUtils.cpp b/quic/common/test/TestUtils.cpp index f688468a9..05922a5f8 100644 --- a/quic/common/test/TestUtils.cpp +++ b/quic/common/test/TestUtils.cpp @@ -274,7 +274,7 @@ std::unique_ptr createNoOpAead(uint64_t cipherOverhead) { return createNoOpAeadImpl(cipherOverhead); } -folly::Expected, QuicError> +quic::Expected, QuicError> createNoOpHeaderCipher() { auto headerCipher = std::make_unique>(); ON_CALL(*headerCipher, mask(_)).WillByDefault(Return(HeaderProtectionMask{})); @@ -365,7 +365,7 @@ RegularQuicPacketBuilder::Packet createInitialCryptoPacket( CHECK(!builder->encodePacketHeader().hasError()); builder->accountForCipherOverhead(aead.getCipherOverhead()); auto res = writeCryptoFrame(offset, data, *builder); - CHECK(res.hasValue()) << "failed to write crypto frame"; + CHECK(res.has_value()) << "failed to write crypto frame"; return std::move(*builder).buildPacket(); } @@ -408,7 +408,7 @@ RegularQuicPacketBuilder::Packet createCryptoPacket( CHECK(!builder.encodePacketHeader().hasError()); builder.accountForCipherOverhead(aead.getCipherOverhead()); auto res = writeCryptoFrame(offset, data, builder); - CHECK(res.hasValue()) << "failed to write crypto frame"; + CHECK(res.has_value()) << "failed to write crypto frame"; return std::move(builder).buildPacket(); } @@ -456,13 +456,23 @@ BufPtr packetToBufCleartext( } auto encryptedBody = std::move(encryptResult.value()); encryptedBody->coalesce(); - encryptPacketHeader( + auto headerEncryptResult = encryptPacketHeader( headerForm, packet.header.writableData(), packet.header.length(), encryptedBody->data(), encryptedBody->length(), headerCipher); + if (headerEncryptResult.hasError()) { + auto& quicError = headerEncryptResult.error(); + auto transportErrorCode = quicError.code.asTransportErrorCode(); + if (transportErrorCode) { + throw QuicTransportException( + "Failed to encrypt packet header", *transportErrorCode); + } + throw QuicTransportException( + "Failed to encrypt packet header", TransportErrorCode::INTERNAL_ERROR); + } packetBuf->appendToChain(std::move(encryptedBody)); return packetBuf; } @@ -787,12 +797,12 @@ bool writableContains(QuicStreamManager& streamManager, StreamId streamId) { streamManager.controlWriteQueue().count(streamId) > 0; } -folly::Expected, QuicError> +quic::Expected, QuicError> FizzCryptoTestFactory::makePacketNumberCipher(fizz::CipherSuite) const { return std::move(packetNumberCipher_); } -folly::Expected, QuicError> +quic::Expected, QuicError> FizzCryptoTestFactory::makePacketNumberCipher(ByteRange secret) const { return _makePacketNumberCipher(secret); } @@ -805,7 +815,7 @@ void FizzCryptoTestFactory::setMockPacketNumberCipher( void FizzCryptoTestFactory::setDefault() { ON_CALL(*this, _makePacketNumberCipher(_)) .WillByDefault(Invoke( - [&](ByteRange secret) -> folly::Expected< + [&](ByteRange secret) -> quic::Expected< std::unique_ptr, QuicError> { return FizzCryptoFactory::makePacketNumberCipher(secret); diff --git a/quic/common/test/TestUtils.h b/quic/common/test/TestUtils.h index 433f0e0ad..ed04ed809 100644 --- a/quic/common/test/TestUtils.h +++ b/quic/common/test/TestUtils.h @@ -189,7 +189,7 @@ std::unique_ptr createNoOpAeadImpl(uint64_t cipherOverhead = 0) { std::unique_ptr createNoOpAead(uint64_t cipherOverhead = 0); -folly::Expected, QuicError> +quic::Expected, QuicError> createNoOpHeaderCipher(); // For backward compatibility with existing code @@ -354,16 +354,16 @@ class FizzCryptoTestFactory : public FizzCryptoFactory { ~FizzCryptoTestFactory() override = default; using FizzCryptoFactory::makePacketNumberCipher; - folly::Expected, QuicError> + quic::Expected, QuicError> makePacketNumberCipher(fizz::CipherSuite) const override; MOCK_METHOD( - (folly::Expected, QuicError>), + (quic::Expected, QuicError>), _makePacketNumberCipher, (ByteRange), (const)); - folly::Expected, QuicError> + quic::Expected, QuicError> makePacketNumberCipher(ByteRange secret) const override; void setMockPacketNumberCipher( @@ -428,7 +428,7 @@ class FakeServerHandshake : public FizzServerHandshake { void accept(std::shared_ptr) override {} MOCK_METHOD( - (folly::Expected), + (quic::Expected), writeNewSessionTicket, (const AppToken&)); @@ -461,9 +461,8 @@ class FakeServerHandshake : public FizzServerHandshake { handshakeDone_ = true; } - folly::Expected doHandshake( - BufPtr data, - EncryptionLevel) override { + quic::Expected doHandshake(BufPtr data, EncryptionLevel) + override { folly::IOBufEqualTo eq; auto chlo = BufHelpers::copyBuffer("CHLO"); auto chloWithCert = BufHelpers::copyBuffer("CHLO_CERT"); @@ -495,7 +494,7 @@ class FakeServerHandshake : public FizzServerHandshake { }); } } - return folly::unit; + return {}; } Optional getClientTransportParams() override { diff --git a/quic/common/testutil/MockAsyncUDPSocket.h b/quic/common/testutil/MockAsyncUDPSocket.h index 44eb7ee83..d240baae5 100644 --- a/quic/common/testutil/MockAsyncUDPSocket.h +++ b/quic/common/testutil/MockAsyncUDPSocket.h @@ -20,19 +20,19 @@ struct MockAsyncUDPSocket : public FollyQuicAsyncUDPSocket { ~MockAsyncUDPSocket() override {} - MOCK_METHOD((folly::Expected), init, (sa_family_t)); + MOCK_METHOD((quic::Expected), init, (sa_family_t)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), address, (), (const)); MOCK_METHOD((const folly::SocketAddress&), addressRef, (), (const)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), bind, (const folly::SocketAddress&)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), setFD, (int, QuicAsyncUDPSocket::FDOwnership)); MOCK_METHOD( @@ -70,80 +70,74 @@ struct MockAsyncUDPSocket : public FollyQuicAsyncUDPSocket { size_t count, const WriteOptions* options)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), recvmmsgNetworkData, (uint64_t readBufferSize, uint16_t numPackets, NetworkData& networkData, Optional& peerAddress, size_t& totalData)); - MOCK_METHOD((folly::Expected), getGRO, ()); - MOCK_METHOD((folly::Expected), setGRO, (bool)); + MOCK_METHOD((quic::Expected), getGRO, ()); + MOCK_METHOD((quic::Expected), setGRO, (bool)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), setAdditionalCmsgsFunc, (std::function()>&&)); - MOCK_METHOD((folly::Expected), setRcvBuf, (int)); - MOCK_METHOD((folly::Expected), setSndBuf, (int)); - MOCK_METHOD((folly::Expected), getTimestamping, ()); + MOCK_METHOD((quic::Expected), setRcvBuf, (int)); + MOCK_METHOD((quic::Expected), setSndBuf, (int)); + MOCK_METHOD((quic::Expected), getTimestamping, ()); MOCK_METHOD(void, resumeRead, (QuicAsyncUDPSocket::ReadCallback*)); MOCK_METHOD(void, pauseRead, ()); - MOCK_METHOD((folly::Expected), close, ()); - MOCK_METHOD( - (folly::Expected), - setDFAndTurnOffPMTU, - ()); + MOCK_METHOD((quic::Expected), close, ()); + MOCK_METHOD((quic::Expected), setDFAndTurnOffPMTU, ()); MOCK_METHOD(int, getFD, ()); - MOCK_METHOD((folly::Expected), setReusePort, (bool)); - MOCK_METHOD((folly::Expected), setReuseAddr, (bool)); + MOCK_METHOD((quic::Expected), setReusePort, (bool)); + MOCK_METHOD((quic::Expected), setReuseAddr, (bool)); MOCK_METHOD(void, dontFragment, (bool)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), setErrMessageCallback, (QuicAsyncUDPSocket::ErrMessageCallback*)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), connect, (const folly::SocketAddress&)); MOCK_METHOD(bool, isBound, (), (const)); - MOCK_METHOD((folly::Expected), getGSO, ()); - MOCK_METHOD((folly::Expected), setGSO, (int)); + MOCK_METHOD((quic::Expected), getGSO, ()); + MOCK_METHOD((quic::Expected), setGSO, (int)); MOCK_METHOD(ssize_t, recvmsg, (struct msghdr*, int)); MOCK_METHOD( int, recvmmsg, (struct mmsghdr*, unsigned int, unsigned int, struct timespec*)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), setCmsgs, (const folly::SocketCmsgMap&)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), setNontrivialCmsgs, (const folly::SocketNontrivialCmsgMap&)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), appendCmsgs, (const folly::SocketCmsgMap&)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), appendNontrivialCmsgs, (const folly::SocketNontrivialCmsgMap&)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), applyOptions, (const folly::SocketOptionMap&, folly::SocketOptionKey::ApplyPos)); - MOCK_METHOD((folly::Expected), setRecvTos, (bool)); - MOCK_METHOD((folly::Expected), getRecvTos, ()); + MOCK_METHOD((quic::Expected), setRecvTos, (bool)); + MOCK_METHOD((quic::Expected), getRecvTos, ()); MOCK_METHOD( - (folly::Expected), + (quic::Expected), setTosOrTrafficClass, (uint8_t)); MOCK_METHOD((bool), isWritableCallbackSet, (), (const)); - MOCK_METHOD( - (folly::Expected), - resumeWrite, - (WriteCallback*)); + MOCK_METHOD((quic::Expected), resumeWrite, (WriteCallback*)); MOCK_METHOD((void), pauseWrite, ()); }; diff --git a/quic/common/third-party/expected.hpp b/quic/common/third-party/expected.hpp index 64cfc44fa..589b49bed 100644 --- a/quic/common/third-party/expected.hpp +++ b/quic/common/third-party/expected.hpp @@ -1761,6 +1761,7 @@ struct error_traits< std::exception_ptr > { #if nsel_CONFIG_NO_EXCEPTIONS_SEH RaiseException( EXCEPTION_ACCESS_VIOLATION, EXCEPTION_NONCONTINUABLE, 0, NULL ); + __assume(0); // Tell compiler this point is never reached #else assert( false && detail::text("throw bad_expected_access{ e };") ); std::terminate(); @@ -1775,6 +1776,7 @@ struct error_traits< std::error_code > { #if nsel_CONFIG_NO_EXCEPTIONS_SEH RaiseException( EXCEPTION_ACCESS_VIOLATION, EXCEPTION_NONCONTINUABLE, 0, NULL ); + __assume(0); // Tell compiler this point is never reached #else assert( false && detail::text("throw std::system_error( e );") ); std::terminate(); diff --git a/quic/common/udpsocket/BUCK b/quic/common/udpsocket/BUCK index 9cef2485f..c9f815abb 100644 --- a/quic/common/udpsocket/BUCK +++ b/quic/common/udpsocket/BUCK @@ -12,7 +12,6 @@ mvfst_cpp_library( "QuicAsyncUDPSocket.h", ], exported_deps = [ - "//folly:expected", "//folly:network_address", "//folly:range", "//folly/io:iobuf", @@ -21,6 +20,7 @@ mvfst_cpp_library( "//folly/lang:exception", "//folly/portability:sockets", "//quic:exception", + "//quic/common:expected", "//quic/common:network_data", "//quic/common:optional", "//quic/common/events:eventbase", @@ -63,9 +63,9 @@ mvfst_cpp_library( ], exported_deps = [ ":quic_async_udp_socket_impl", - "//folly:expected", "//folly/io/async:async_udp_socket", "//folly/net:network_socket", + "//quic/common:expected", "//quic/common:network_data", "//quic/common/events:folly_eventbase", ], @@ -87,8 +87,8 @@ mvfst_cpp_library( ], exported_deps = [ ":quic_async_udp_socket_impl", - "//folly:expected", "//quic:exception", + "//quic/common:expected", "//quic/common:network_data", "//quic/common/events:libev_eventbase", ], diff --git a/quic/common/udpsocket/FollyQuicAsyncUDPSocket.cpp b/quic/common/udpsocket/FollyQuicAsyncUDPSocket.cpp index ad15422f7..b1a28a3d1 100644 --- a/quic/common/udpsocket/FollyQuicAsyncUDPSocket.cpp +++ b/quic/common/udpsocket/FollyQuicAsyncUDPSocket.cpp @@ -6,43 +6,43 @@ */ #include // For errno -#include #include #include #include #include // For folly::errnoStr #include // For QuicError, QuicErrorCode, TransportErrorCode +#include #include #include namespace quic { -folly::Expected FollyQuicAsyncUDPSocket::init( +quic::Expected FollyQuicAsyncUDPSocket::init( sa_family_t family) { try { follySocket_.init(family); - return folly::unit; + return {}; } catch (const folly::AsyncSocketException& ex) { std::string errorMsg = "Folly init failed: " + std::string(ex.what()); if (ex.getErrno() != 0) { errorMsg += ": " + folly::errnoStr(ex.getErrno()); } - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } } -folly::Expected FollyQuicAsyncUDPSocket::bind( +quic::Expected FollyQuicAsyncUDPSocket::bind( const folly::SocketAddress& address) { try { follySocket_.bind(address); - return folly::unit; + return {}; } catch (const folly::AsyncSocketException& ex) { std::string errorMsg = "Folly bind failed: " + std::string(ex.what()); if (ex.getErrno() != 0) { errorMsg += ": " + folly::errnoStr(ex.getErrno()); } - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } @@ -52,34 +52,34 @@ folly::Expected FollyQuicAsyncUDPSocket::bind( return follySocket_.isBound(); } -folly::Expected FollyQuicAsyncUDPSocket::connect( +quic::Expected FollyQuicAsyncUDPSocket::connect( const folly::SocketAddress& address) { try { follySocket_.connect(address); - return folly::unit; + return {}; } catch (const folly::AsyncSocketException& ex) { std::string errorMsg = "Folly connect failed: " + std::string(ex.what()); if (ex.getErrno() != 0) { errorMsg += ": " + folly::errnoStr(ex.getErrno()); } - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } } -folly::Expected FollyQuicAsyncUDPSocket::close() { +quic::Expected FollyQuicAsyncUDPSocket::close() { try { follySocket_.close(); readCallbackWrapper_.reset(); // Ensure wrapper is cleared on close errCallbackWrapper_.reset(); - return folly::unit; + return {}; } catch (const folly::AsyncSocketException& ex) { std::string errorMsg = "Folly close failed: " + std::string(ex.what()); if (ex.getErrno() != 0) { errorMsg += ": " + folly::errnoStr(ex.getErrno()); } - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } @@ -94,7 +94,7 @@ void FollyQuicAsyncUDPSocket::resumeRead(ReadCallback* callback) { follySocket_.resumeRead(readCallbackWrapper_.get()); // TODO: This should return Expected } catch (const folly::AsyncSocketException& ex) { - // TODO: Convert to QuicError and return folly::makeUnexpected + // TODO: Convert to QuicError and return quic::make_unexpected LOG(ERROR) << "FollyQuicAsyncUDPSocket::resumeRead failed: " << ex.what(); throw; // Re-throw for now until signature is updated } @@ -105,8 +105,8 @@ void FollyQuicAsyncUDPSocket::pauseRead() { readCallbackWrapper_.reset(); } -folly::Expected -FollyQuicAsyncUDPSocket::setErrMessageCallback(ErrMessageCallback* callback) { +quic::Expected FollyQuicAsyncUDPSocket::setErrMessageCallback( + ErrMessageCallback* callback) { try { if (errCallbackWrapper_) { errCallbackWrapper_.reset(); @@ -117,14 +117,14 @@ FollyQuicAsyncUDPSocket::setErrMessageCallback(ErrMessageCallback* callback) { } else { follySocket_.setErrMessageCallback(nullptr); } - return folly::unit; + return {}; } catch (const folly::AsyncSocketException& ex) { std::string errorMsg = "Folly setErrMessageCallback failed: " + std::string(ex.what()); if (ex.getErrno() != 0) { errorMsg += ": " + folly::errnoStr(ex.getErrno()); } - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } @@ -251,7 +251,7 @@ int FollyQuicAsyncUDPSocket::recvmmsg( } } -folly::Expected FollyQuicAsyncUDPSocket::getGSO() { +quic::Expected FollyQuicAsyncUDPSocket::getGSO() { try { return follySocket_.getGSO(); } catch (const folly::AsyncSocketException& ex) { @@ -260,13 +260,13 @@ folly::Expected FollyQuicAsyncUDPSocket::getGSO() { errorMsg += ": " + folly::errnoStr(ex.getErrno()); } LOG(ERROR) << "getGSO failed: " << errorMsg; - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } } -folly::Expected FollyQuicAsyncUDPSocket::getGRO() { +quic::Expected FollyQuicAsyncUDPSocket::getGRO() { try { return follySocket_.getGRO(); } catch (const folly::AsyncSocketException& ex) { @@ -274,17 +274,16 @@ folly::Expected FollyQuicAsyncUDPSocket::getGRO() { if (ex.getErrno() != 0) { errorMsg += ": " + folly::errnoStr(ex.getErrno()); } - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } } -folly::Expected FollyQuicAsyncUDPSocket::setGRO( - bool bVal) { +quic::Expected FollyQuicAsyncUDPSocket::setGRO(bool bVal) { try { if (follySocket_.setGRO(bVal)) { - return folly::unit; + return {}; } else { // Folly's setGRO returns bool, not throwing. Assume failure means error. int errnoCopy = errno; // Capture errno immediately after failure @@ -292,7 +291,7 @@ folly::Expected FollyQuicAsyncUDPSocket::setGRO( if (errnoCopy != 0) { errorMsg += ": " + folly::errnoStr(errnoCopy); } - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } @@ -302,29 +301,29 @@ folly::Expected FollyQuicAsyncUDPSocket::setGRO( if (ex.getErrno() != 0) { errorMsg += ": " + folly::errnoStr(ex.getErrno()); } - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } } -folly::Expected FollyQuicAsyncUDPSocket::setRecvTos( +quic::Expected FollyQuicAsyncUDPSocket::setRecvTos( bool recvTos) { try { follySocket_.setRecvTos(recvTos); - return folly::unit; + return {}; } catch (const folly::AsyncSocketException& ex) { std::string errorMsg = "Folly setRecvTos failed: " + std::string(ex.what()); if (ex.getErrno() != 0) { errorMsg += ": " + folly::errnoStr(ex.getErrno()); } - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } } -folly::Expected FollyQuicAsyncUDPSocket::getRecvTos() { +quic::Expected FollyQuicAsyncUDPSocket::getRecvTos() { try { return follySocket_.getRecvTos(); } catch (const folly::AsyncSocketException& ex) { @@ -332,30 +331,30 @@ folly::Expected FollyQuicAsyncUDPSocket::getRecvTos() { if (ex.getErrno() != 0) { errorMsg += ": " + folly::errnoStr(ex.getErrno()); } - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } } -folly::Expected -FollyQuicAsyncUDPSocket::setTosOrTrafficClass(uint8_t tos) { +quic::Expected FollyQuicAsyncUDPSocket::setTosOrTrafficClass( + uint8_t tos) { try { follySocket_.setTosOrTrafficClass(tos); - return folly::unit; + return {}; } catch (const folly::AsyncSocketException& ex) { std::string errorMsg = "Folly setTosOrTrafficClass failed: " + std::string(ex.what()); if (ex.getErrno() != 0) { errorMsg += ": " + folly::errnoStr(ex.getErrno()); } - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } } -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected FollyQuicAsyncUDPSocket::address() const { try { return follySocket_.address(); @@ -364,7 +363,7 @@ FollyQuicAsyncUDPSocket::address() const { if (ex.getErrno() != 0) { errorMsg += ": " + folly::errnoStr(ex.getErrno()); } - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } @@ -407,41 +406,40 @@ FollyQuicAsyncUDPSocket::getEventBase() const { return evb_; } -folly::Expected FollyQuicAsyncUDPSocket::setCmsgs( +quic::Expected FollyQuicAsyncUDPSocket::setCmsgs( const folly::SocketCmsgMap& cmsgs) { try { follySocket_.setCmsgs(cmsgs); - return folly::unit; + return {}; } catch (const folly::AsyncSocketException& ex) { std::string errorMsg = "Folly setCmsgs failed: " + std::string(ex.what()); if (ex.getErrno() != 0) { errorMsg += ": " + folly::errnoStr(ex.getErrno()); } - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } } -folly::Expected FollyQuicAsyncUDPSocket::appendCmsgs( +quic::Expected FollyQuicAsyncUDPSocket::appendCmsgs( const folly::SocketCmsgMap& cmsgs) { try { follySocket_.appendCmsgs(cmsgs); - return folly::unit; + return {}; } catch (const folly::AsyncSocketException& ex) { std::string errorMsg = "Folly appendCmsgs failed: " + std::string(ex.what()); if (ex.getErrno() != 0) { errorMsg += ": " + folly::errnoStr(ex.getErrno()); } - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } } -folly::Expected -FollyQuicAsyncUDPSocket::setAdditionalCmsgsFunc( +quic::Expected FollyQuicAsyncUDPSocket::setAdditionalCmsgsFunc( std::function()>&& additionalCmsgsFunc) { try { auto adapter = [originalFunc = std::move(additionalCmsgsFunc)]() @@ -459,20 +457,20 @@ FollyQuicAsyncUDPSocket::setAdditionalCmsgsFunc( }; follySocket_.setAdditionalCmsgsFunc(std::move(adapter)); - return folly::unit; + return {}; } catch (const folly::AsyncSocketException& ex) { std::string errorMsg = "Folly setAdditionalCmsgsFunc failed: " + std::string(ex.what()); if (ex.getErrno() != 0) { errorMsg += ": " + folly::errnoStr(ex.getErrno()); } - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } } -folly::Expected FollyQuicAsyncUDPSocket::getTimestamping() { +quic::Expected FollyQuicAsyncUDPSocket::getTimestamping() { try { return follySocket_.getTimestamping(); } catch (const folly::AsyncSocketException& ex) { @@ -481,114 +479,111 @@ folly::Expected FollyQuicAsyncUDPSocket::getTimestamping() { if (ex.getErrno() != 0) { errorMsg += ": " + folly::errnoStr(ex.getErrno()); } - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } } -folly::Expected FollyQuicAsyncUDPSocket::setReuseAddr( +quic::Expected FollyQuicAsyncUDPSocket::setReuseAddr( bool reuseAddr) { try { follySocket_.setReuseAddr(reuseAddr); - return folly::unit; + return {}; } catch (const folly::AsyncSocketException& ex) { std::string errorMsg = "Folly setReuseAddr failed: " + std::string(ex.what()); if (ex.getErrno() != 0) { errorMsg += ": " + folly::errnoStr(ex.getErrno()); } - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } } -folly::Expected -FollyQuicAsyncUDPSocket::setDFAndTurnOffPMTU() { +quic::Expected FollyQuicAsyncUDPSocket::setDFAndTurnOffPMTU() { try { follySocket_.setDFAndTurnOffPMTU(); - return folly::unit; + return {}; } catch (const folly::AsyncSocketException& ex) { std::string errorMsg = "Folly setDFAndTurnOffPMTU failed: " + std::string(ex.what()); if (ex.getErrno() != 0) { errorMsg += ": " + folly::errnoStr(ex.getErrno()); } - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } } -folly::Expected FollyQuicAsyncUDPSocket::applyOptions( +quic::Expected FollyQuicAsyncUDPSocket::applyOptions( const folly::SocketOptionMap& options, folly::SocketOptionKey::ApplyPos pos) { try { follySocket_.applyOptions(options, pos); - return folly::unit; + return {}; } catch (const folly::AsyncSocketException& ex) { std::string errorMsg = "Folly applyOptions failed: " + std::string(ex.what()); if (ex.getErrno() != 0) { errorMsg += ": " + folly::errnoStr(ex.getErrno()); } - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } } -folly::Expected FollyQuicAsyncUDPSocket::setReusePort( +quic::Expected FollyQuicAsyncUDPSocket::setReusePort( bool reusePort) { try { follySocket_.setReusePort(reusePort); - return folly::unit; + return {}; } catch (const folly::AsyncSocketException& ex) { std::string errorMsg = "Folly setReusePort failed: " + std::string(ex.what()); if (ex.getErrno() != 0) { errorMsg += ": " + folly::errnoStr(ex.getErrno()); } - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } } -folly::Expected FollyQuicAsyncUDPSocket::setRcvBuf( - int rcvBuf) { +quic::Expected FollyQuicAsyncUDPSocket::setRcvBuf(int rcvBuf) { try { follySocket_.setRcvBuf(rcvBuf); - return folly::unit; + return {}; } catch (const folly::AsyncSocketException& ex) { std::string errorMsg = "Folly setRcvBuf failed: " + std::string(ex.what()); if (ex.getErrno() != 0) { errorMsg += ": " + folly::errnoStr(ex.getErrno()); } - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } } -folly::Expected FollyQuicAsyncUDPSocket::setSndBuf( - int sndBuf) { +quic::Expected FollyQuicAsyncUDPSocket::setSndBuf(int sndBuf) { try { follySocket_.setSndBuf(sndBuf); - return folly::unit; + return {}; } catch (const folly::AsyncSocketException& ex) { std::string errorMsg = "Folly setSndBuf failed: " + std::string(ex.what()); if (ex.getErrno() != 0) { errorMsg += ": " + folly::errnoStr(ex.getErrno()); } - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } } -folly::Expected FollyQuicAsyncUDPSocket::setFD( +quic::Expected FollyQuicAsyncUDPSocket::setFD( int fd, FDOwnership ownership) { folly::AsyncUDPSocket::FDOwnership follyOwnership; @@ -602,13 +597,13 @@ folly::Expected FollyQuicAsyncUDPSocket::setFD( } try { follySocket_.setFD(folly::NetworkSocket::fromFd(fd), follyOwnership); - return folly::unit; + return {}; } catch (const folly::AsyncSocketException& ex) { std::string errorMsg = "Folly setFD failed: " + std::string(ex.what()); if (ex.getErrno() != 0) { errorMsg += ": " + folly::errnoStr(ex.getErrno()); } - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } diff --git a/quic/common/udpsocket/FollyQuicAsyncUDPSocket.h b/quic/common/udpsocket/FollyQuicAsyncUDPSocket.h index 1a12fdbfb..5c58587a5 100644 --- a/quic/common/udpsocket/FollyQuicAsyncUDPSocket.h +++ b/quic/common/udpsocket/FollyQuicAsyncUDPSocket.h @@ -11,9 +11,9 @@ #include #include -#include #include #include +#include #include #include @@ -55,19 +55,19 @@ class FollyQuicAsyncUDPSocket : public QuicAsyncUDPSocketImpl { } } - [[nodiscard]] folly::Expected init( + [[nodiscard]] quic::Expected init( sa_family_t family) override; - [[nodiscard]] folly::Expected bind( + [[nodiscard]] quic::Expected bind( const folly::SocketAddress& address) override; // TODO: bind should return Expected [[nodiscard]] bool isBound() const override; - folly::Expected connect( + quic::Expected connect( const folly::SocketAddress& address) override; - folly::Expected close() override; + quic::Expected close() override; void resumeRead(ReadCallback* callback) override; // TODO: resumeRead should return Expected @@ -123,26 +123,25 @@ class FollyQuicAsyncUDPSocket : public QuicAsyncUDPSocketImpl { // generic segmentation offload get/set // negative return value means GSO is not available - folly::Expected getGSO() override; + quic::Expected getGSO() override; // generic receive offload get/set // negative return value means GRO is not available - folly::Expected getGRO() override; - folly::Expected setGRO(bool bVal) override; + quic::Expected getGRO() override; + quic::Expected setGRO(bool bVal) override; // receive tos cmsgs // if true, the IPv6 Traffic Class/IPv4 Type of Service field should be // populated in OnDataAvailableParams. - folly::Expected setRecvTos(bool recvTos) override; - folly::Expected getRecvTos() override; + quic::Expected setRecvTos(bool recvTos) override; + quic::Expected getRecvTos() override; - folly::Expected setTosOrTrafficClass( - uint8_t tos) override; + quic::Expected setTosOrTrafficClass(uint8_t tos) override; /** * Returns the socket address this socket is bound to and error otherwise. */ - [[nodiscard]] folly::Expected address() + [[nodiscard]] quic::Expected address() const override; /** @@ -160,23 +159,23 @@ class FollyQuicAsyncUDPSocket : public QuicAsyncUDPSocketImpl { /** * Set extra control messages to send */ - folly::Expected setCmsgs( + quic::Expected setCmsgs( const folly::SocketCmsgMap& cmsgs) override; - folly::Expected appendCmsgs( + quic::Expected appendCmsgs( const folly::SocketCmsgMap& cmsgs) override; - folly::Expected setAdditionalCmsgsFunc( + quic::Expected setAdditionalCmsgsFunc( std::function()>&& additionalCmsgsFunc) override; /* * Packet timestamping is currentl not supported. */ - folly::Expected getTimestamping() override; + quic::Expected getTimestamping() override; /** * Set SO_REUSEADDR flag on the socket. Default is OFF. */ - folly::Expected setReuseAddr(bool reuseAddr) override; + quic::Expected setReuseAddr(bool reuseAddr) override; /** * Set Dont-Fragment (DF) but ignore Path MTU. @@ -186,32 +185,32 @@ class FollyQuicAsyncUDPSocket : public QuicAsyncUDPSocketImpl { * This may be desirable for apps that has its own PMTU Discovery mechanism. * See http://man7.org/linux/man-pages/man7/ip.7.html for more info. */ - folly::Expected setDFAndTurnOffPMTU() override; + quic::Expected setDFAndTurnOffPMTU() override; /** * Callback for receiving errors on the UDP sockets */ - folly::Expected setErrMessageCallback( + quic::Expected setErrMessageCallback( ErrMessageCallback* /* errMessageCallback */) override; - folly::Expected applyOptions( + quic::Expected applyOptions( const folly::SocketOptionMap& options, folly::SocketOptionKey::ApplyPos pos) override; /** * Set reuse port mode to call bind() on the same address multiple times */ - folly::Expected setReusePort(bool reusePort) override; + quic::Expected setReusePort(bool reusePort) override; /** * Set SO_RCVBUF option on the socket, if not zero. Default is zero. */ - folly::Expected setRcvBuf(int rcvBuf) override; + quic::Expected setRcvBuf(int rcvBuf) override; /** * Set SO_SNDBUF option on the socket, if not zero. Default is zero. */ - folly::Expected setSndBuf(int sndBuf) override; + quic::Expected setSndBuf(int sndBuf) override; /** * Use an already bound file descriptor. You can either transfer ownership @@ -219,8 +218,7 @@ class FollyQuicAsyncUDPSocket : public QuicAsyncUDPSocketImpl { * FDOwnership::SHARED. In case FD is shared, it will not be `close`d in * destructor. */ - folly::Expected setFD(int fd, FDOwnership ownership) - override; + quic::Expected setFD(int fd, FDOwnership ownership) override; int getFD() override; diff --git a/quic/common/udpsocket/LibevQuicAsyncUDPSocket.cpp b/quic/common/udpsocket/LibevQuicAsyncUDPSocket.cpp index 33781dbe3..07397de83 100644 --- a/quic/common/udpsocket/LibevQuicAsyncUDPSocket.cpp +++ b/quic/common/udpsocket/LibevQuicAsyncUDPSocket.cpp @@ -5,10 +5,10 @@ * LICENSE file in the root directory of this source tree. */ -#include #include #include // For folly::errnoStr #include // For QuicError, QuicErrorCode, TransportErrorCode +#include #include #include @@ -37,7 +37,7 @@ LibevQuicAsyncUDPSocket::LibevQuicAsyncUDPSocket( LibevQuicAsyncUDPSocket::~LibevQuicAsyncUDPSocket() { if (fd_ != -1) { - // Use folly::Expected result even in destructor? Best effort close. + // Use quic::Expected result even in destructor? Best effort close. auto closeResult = LibevQuicAsyncUDPSocket::close(); if (closeResult.hasError()) { LOG(ERROR) << "Error closing socket in destructor: " @@ -69,7 +69,7 @@ void LibevQuicAsyncUDPSocket::resumeRead(ReadCallback* cb) { // TODO: This should return Expected } -folly::Expected LibevQuicAsyncUDPSocket::resumeWrite( +quic::Expected LibevQuicAsyncUDPSocket::resumeWrite( WriteCallback* cob) { CHECK(!writeCallback_) << "A write callback is already installed"; CHECK_NE(fd_, -1) @@ -77,7 +77,7 @@ folly::Expected LibevQuicAsyncUDPSocket::resumeWrite( CHECK(cob) << "A non-null callback is required to resume write"; writeCallback_ = cob; addEvent(EV_WRITE); - return folly::unit; + return {}; } void LibevQuicAsyncUDPSocket::pauseWrite() { @@ -126,7 +126,7 @@ ssize_t LibevQuicAsyncUDPSocket::write( return ::sendmsg(fd_, &msg, msg_flags); } -folly::Expected LibevQuicAsyncUDPSocket::getGSO() { +quic::Expected LibevQuicAsyncUDPSocket::getGSO() { // TODO: Implement GSO return -1; } @@ -140,25 +140,24 @@ int LibevQuicAsyncUDPSocket::writem( return -1; } -folly::Expected -LibevQuicAsyncUDPSocket::setAdditionalCmsgsFunc( +quic::Expected LibevQuicAsyncUDPSocket::setAdditionalCmsgsFunc( std::function()>&& /* additionalCmsgsFunc */) { LOG(WARNING) << "Setting an additional cmsgs function is not implemented for LibevQuicAsyncUDPSocket"; // Return success despite warning, or error if strictness needed - return folly::unit; + return {}; } bool LibevQuicAsyncUDPSocket::isBound() const { return bound_; } -folly::Expected +quic::Expected LibevQuicAsyncUDPSocket::address() const { if (!bound_) { // Return error if not bound - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), "socket is not bound")); } @@ -180,7 +179,7 @@ LibevQuicAsyncUDPSocket::getEventBase() const { return evb_; } -folly::Expected LibevQuicAsyncUDPSocket::close() { +quic::Expected LibevQuicAsyncUDPSocket::close() { CHECK(evb_->isInEventBaseThread()); if (readCallback_) { @@ -198,7 +197,7 @@ folly::Expected LibevQuicAsyncUDPSocket::close() { fd_ = -1; // Mark as closed even if error occurred std::string errorMsg = "Failed to close socket: " + folly::errnoStr(errnoCopy); - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } @@ -207,36 +206,36 @@ folly::Expected LibevQuicAsyncUDPSocket::close() { fd_ = -1; bound_ = false; // Reset state connected_ = false; - return folly::unit; + return {}; } void LibevQuicAsyncUDPSocket::detachEventBase() { LOG(FATAL) << __func__ << "is not implemented in LibevQuicAsyncUDPSocket"; } -folly::Expected LibevQuicAsyncUDPSocket::setCmsgs( +quic::Expected LibevQuicAsyncUDPSocket::setCmsgs( const folly::SocketCmsgMap& /* cmsgs */) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), "setCmsgs is not implemented.")); } -folly::Expected LibevQuicAsyncUDPSocket::appendCmsgs( +quic::Expected LibevQuicAsyncUDPSocket::appendCmsgs( const folly::SocketCmsgMap& /* cmsgs */) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), "appendCmsgs is not implemented.")); } -folly::Expected LibevQuicAsyncUDPSocket::init( +quic::Expected LibevQuicAsyncUDPSocket::init( sa_family_t family) { if (fd_ != -1) { // Socket already initialized. - return folly::unit; + return {}; } if (family != AF_INET && family != AF_INET6) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), "address family not supported")); } @@ -246,7 +245,7 @@ folly::Expected LibevQuicAsyncUDPSocket::init( int errnoCopy = errno; std::string errorMsg = "error creating socket: " + folly::errnoStr(errnoCopy); - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } @@ -259,7 +258,7 @@ folly::Expected LibevQuicAsyncUDPSocket::init( int errnoCopy = errno; std::string errorMsg = "error getting socket flags: " + folly::errnoStr(errnoCopy); - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } @@ -267,7 +266,7 @@ folly::Expected LibevQuicAsyncUDPSocket::init( int errnoCopy = errno; std::string errorMsg = "error setting socket nonblocking flag: " + folly::errnoStr(errnoCopy); - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } @@ -279,7 +278,7 @@ folly::Expected LibevQuicAsyncUDPSocket::init( int errnoCopy = errno; std::string errorMsg = "error setting reuse address on socket: " + folly::errnoStr(errnoCopy); - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } @@ -289,7 +288,7 @@ folly::Expected LibevQuicAsyncUDPSocket::init( int errnoCopy = errno; std::string errorMsg = "error setting reuse port on socket: " + folly::errnoStr(errnoCopy); - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } @@ -301,7 +300,7 @@ folly::Expected LibevQuicAsyncUDPSocket::init( int errnoCopy = errno; std::string errorMsg = "failed to set SO_RCVBUF on the socket: " + folly::errnoStr(errnoCopy); - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } @@ -314,7 +313,7 @@ folly::Expected LibevQuicAsyncUDPSocket::init( int errnoCopy = errno; std::string errorMsg = "failed to set SO_SNDBUF on the socket: " + folly::errnoStr(errnoCopy); - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } @@ -329,10 +328,10 @@ folly::Expected LibevQuicAsyncUDPSocket::init( ev_io_set(&readWatcher_, fd_, EV_READ); ev_io_set(&writeWatcher_, fd_, EV_WRITE); - return folly::unit; + return {}; } -folly::Expected LibevQuicAsyncUDPSocket::bind( +quic::Expected LibevQuicAsyncUDPSocket::bind( const folly::SocketAddress& address) { // TODO: remove dependency on folly::SocketAdress since this pulls in // folly::portability and other headers which should be avoidable. @@ -355,7 +354,7 @@ folly::Expected LibevQuicAsyncUDPSocket::bind( int errnoCopy = errno; std::string errorMsg = "error binding socket to " + address.describe() + ": " + folly::errnoStr(errnoCopy); - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } @@ -366,7 +365,7 @@ folly::Expected LibevQuicAsyncUDPSocket::bind( int errnoCopy = errno; std::string errorMsg = "error retrieving local address: " + folly::errnoStr(errnoCopy); - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } @@ -374,10 +373,10 @@ folly::Expected LibevQuicAsyncUDPSocket::bind( localAddress_.setFromSockaddr(&saddr, len); bound_ = true; - return folly::unit; + return {}; } -folly::Expected LibevQuicAsyncUDPSocket::connect( +quic::Expected LibevQuicAsyncUDPSocket::connect( const folly::SocketAddress& address) { if (fd_ == -1) { auto initResult = init(address.getFamily()); @@ -393,7 +392,7 @@ folly::Expected LibevQuicAsyncUDPSocket::connect( int errnoCopy = errno; std::string errorMsg = "Libev connect failed to " + address.describe(); errorMsg += ": " + folly::errnoStr(errnoCopy); - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } @@ -409,20 +408,19 @@ folly::Expected LibevQuicAsyncUDPSocket::connect( std::string errorMsg = "Libev getsockname failed after connect: " + folly::errnoStr(errnoCopy); // Connect succeeded, but getsockname failed. - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } localAddress_.setFromSockaddr(&saddr, len); } - return folly::unit; + return {}; } -folly::Expected -LibevQuicAsyncUDPSocket::setDFAndTurnOffPMTU() { +quic::Expected LibevQuicAsyncUDPSocket::setDFAndTurnOffPMTU() { if (fd_ == -1) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), "socket is not initialized")); } @@ -440,7 +438,7 @@ LibevQuicAsyncUDPSocket::setDFAndTurnOffPMTU() { #endif auto familyResult = address(); // address() now returns Expected if (familyResult.hasError()) { - return folly::makeUnexpected(familyResult.error()); + return quic::make_unexpected(familyResult.error()); } sa_family_t family = familyResult->getFamily(); @@ -449,7 +447,7 @@ LibevQuicAsyncUDPSocket::setDFAndTurnOffPMTU() { int errnoCopy = errno; std::string errorMsg = "failed to turn off PMTU discovery (IPv4): " + folly::errnoStr(errnoCopy); - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } @@ -459,20 +457,19 @@ LibevQuicAsyncUDPSocket::setDFAndTurnOffPMTU() { int errnoCopy = errno; std::string errorMsg = "failed to turn off PMTU discovery (IPv6): " + folly::errnoStr(errnoCopy); - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } } // If options are not defined for the family, we succeed silently. - return folly::unit; + return {}; } -folly::Expected -LibevQuicAsyncUDPSocket::setErrMessageCallback( +quic::Expected LibevQuicAsyncUDPSocket::setErrMessageCallback( ErrMessageCallback* errMessageCallback) { if (fd_ == -1) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), "socket not initialized for setErrMessageCallback")); } @@ -487,7 +484,7 @@ LibevQuicAsyncUDPSocket::setErrMessageCallback( #endif auto familyResult = address(); // address() now returns Expected if (familyResult.hasError()) { - return folly::makeUnexpected(familyResult.error()); + return quic::make_unexpected(familyResult.error()); } sa_family_t family = familyResult->getFamily(); @@ -498,7 +495,7 @@ LibevQuicAsyncUDPSocket::setErrMessageCallback( int errnoCopy = errno; std::string errorMsg = "Failed to set IP_RECVERR: " + folly::errnoStr(errnoCopy); - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } @@ -507,14 +504,14 @@ LibevQuicAsyncUDPSocket::setErrMessageCallback( int errnoCopy = errno; std::string errorMsg = "Failed to set IPV6_RECVERR: " + folly::errnoStr(errnoCopy); - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } - return folly::unit; + return {}; } -folly::Expected LibevQuicAsyncUDPSocket::getGRO() { +quic::Expected LibevQuicAsyncUDPSocket::getGRO() { return -1; } @@ -550,19 +547,19 @@ int LibevQuicAsyncUDPSocket::recvmmsg( return static_cast(vlen); } -folly::Expected LibevQuicAsyncUDPSocket::setGRO( +quic::Expected LibevQuicAsyncUDPSocket::setGRO( bool /* bVal */) { // Not supported, return error - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), "setGRO not supported")); } -folly::Expected LibevQuicAsyncUDPSocket::applyOptions( +quic::Expected LibevQuicAsyncUDPSocket::applyOptions( const folly::SocketOptionMap& options, folly::SocketOptionKey::ApplyPos pos) { if (fd_ == -1) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), "socket not initialized for applyOptions")); } @@ -577,16 +574,16 @@ folly::Expected LibevQuicAsyncUDPSocket::applyOptions( int errnoCopy = errno; std::string errorMsg = "failed to apply socket options: " + folly::errnoStr(errnoCopy); - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } } } - return folly::unit; + return {}; } -folly::Expected LibevQuicAsyncUDPSocket::setFD( +quic::Expected LibevQuicAsyncUDPSocket::setFD( int fd, FDOwnership ownership) { // TODO: Check if fd is valid? setsockopt? @@ -619,7 +616,7 @@ folly::Expected LibevQuicAsyncUDPSocket::setFD( } // TODO: Check if the FD is actually usable? Maybe getsockopt? // For now, assume success if we reach here. - return folly::unit; + return {}; } int LibevQuicAsyncUDPSocket::getFD() { @@ -757,8 +754,7 @@ void LibevQuicAsyncUDPSocket::sockEventsWatcherCallback( } } -folly::Expected LibevQuicAsyncUDPSocket::setRcvBuf( - int rcvBuf) { +quic::Expected LibevQuicAsyncUDPSocket::setRcvBuf(int rcvBuf) { rcvBuf_ = rcvBuf; if (fd_ != -1) { // Apply immediately if socket exists @@ -767,16 +763,15 @@ folly::Expected LibevQuicAsyncUDPSocket::setRcvBuf( int errnoCopy = errno; std::string errorMsg = "failed to set SO_RCVBUF: " + folly::errnoStr(errnoCopy); - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } } - return folly::unit; + return {}; } -folly::Expected LibevQuicAsyncUDPSocket::setSndBuf( - int sndBuf) { +quic::Expected LibevQuicAsyncUDPSocket::setSndBuf(int sndBuf) { sndBuf_ = sndBuf; if (fd_ != -1) { // Apply immediately if socket exists @@ -785,15 +780,15 @@ folly::Expected LibevQuicAsyncUDPSocket::setSndBuf( int errnoCopy = errno; std::string errorMsg = "failed to set SO_SNDBUF: " + folly::errnoStr(errnoCopy); - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } } - return folly::unit; + return {}; } -folly::Expected LibevQuicAsyncUDPSocket::setReuseAddr( +quic::Expected LibevQuicAsyncUDPSocket::setReuseAddr( bool reuseAddr) { reuseAddr_ = reuseAddr; if (fd_ != -1) { @@ -804,12 +799,12 @@ folly::Expected LibevQuicAsyncUDPSocket::setReuseAddr( int errnoCopy = errno; std::string errorMsg = "failed to set SO_REUSEADDR: " + folly::errnoStr(errnoCopy); - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); } } - return folly::unit; + return {}; } bool LibevQuicAsyncUDPSocket::isWritableCallbackSet() const { diff --git a/quic/common/udpsocket/LibevQuicAsyncUDPSocket.h b/quic/common/udpsocket/LibevQuicAsyncUDPSocket.h index d58ed706d..2d8354d4d 100644 --- a/quic/common/udpsocket/LibevQuicAsyncUDPSocket.h +++ b/quic/common/udpsocket/LibevQuicAsyncUDPSocket.h @@ -7,8 +7,8 @@ #pragma once -#include #include // For QuicError +#include #include #include #include @@ -21,18 +21,18 @@ class LibevQuicAsyncUDPSocket : public QuicAsyncUDPSocketImpl { explicit LibevQuicAsyncUDPSocket(std::shared_ptr qEvb); ~LibevQuicAsyncUDPSocket() override; - [[nodiscard]] folly::Expected init( + [[nodiscard]] quic::Expected init( sa_family_t family) override; - [[nodiscard]] folly::Expected bind( + [[nodiscard]] quic::Expected bind( const folly::SocketAddress& address) override; [[nodiscard]] bool isBound() const override; - folly::Expected connect( + quic::Expected connect( const folly::SocketAddress& address) override; - folly::Expected close() override; + quic::Expected close() override; void resumeRead(ReadCallback* callback) override; // TODO: resumeRead should return Expected @@ -96,36 +96,35 @@ class LibevQuicAsyncUDPSocket : public QuicAsyncUDPSocketImpl { // generic segmentation offload get/set // negative return value means GSO is not available - folly::Expected getGSO() override; + quic::Expected getGSO() override; // generic receive offload get/set // negative return value means GRO is not available - folly::Expected getGRO() override; - folly::Expected setGRO(bool bVal) override; + quic::Expected getGRO() override; + quic::Expected setGRO(bool bVal) override; // receive tos cmsgs // if true, the IPv6 Traffic Class/IPv4 Type of Service field should be // populated in OnDataAvailableParams. - folly::Expected setRecvTos( - bool /*recvTos*/) override { + quic::Expected setRecvTos(bool /*recvTos*/) override { LOG(WARNING) << __func__ << " not implemented in LibevQuicAsyncUDPSocket"; - return folly::unit; // Or return error if strictness needed + return {}; // Or return error if strictness needed } - folly::Expected getRecvTos() override { + quic::Expected getRecvTos() override { return false; // Not implemented, return default/false } - folly::Expected setTosOrTrafficClass( + quic::Expected setTosOrTrafficClass( uint8_t /*tos*/) override { LOG(WARNING) << __func__ << " not implemented in LibevQuicAsyncUDPSocket"; - return folly::unit; // Or return error if strictness needed + return {}; // Or return error if strictness needed } /** * Returns the socket address this socket is bound to and error otherwise. */ - [[nodiscard]] folly::Expected address() + [[nodiscard]] quic::Expected address() const override; /** @@ -143,35 +142,35 @@ class LibevQuicAsyncUDPSocket : public QuicAsyncUDPSocketImpl { /** * Set extra control messages to send */ - folly::Expected setCmsgs( + quic::Expected setCmsgs( const folly::SocketCmsgMap& cmsgs) override; - folly::Expected appendCmsgs( + quic::Expected appendCmsgs( const folly::SocketCmsgMap& cmsgs) override; - folly::Expected setAdditionalCmsgsFunc( + quic::Expected setAdditionalCmsgsFunc( std::function()>&& additionalCmsgsFunc) override; /* * Packet timestamping is currently not supported. */ - folly::Expected getTimestamping() override { + quic::Expected getTimestamping() override { return -1; // Keep returning -1 for not supported } /** * Set SO_REUSEADDR flag on the socket. Default is OFF. */ - folly::Expected setReuseAddr(bool reuseAddr) override; + quic::Expected setReuseAddr(bool reuseAddr) override; /** * Set SO_RCVBUF option on the socket, if not zero. Default is zero. */ - folly::Expected setRcvBuf(int rcvBuf) override; + quic::Expected setRcvBuf(int rcvBuf) override; /** * Set SO_SNDBUF option on the socket, if not zero. Default is zero. */ - folly::Expected setSndBuf(int sndBuf) override; + quic::Expected setSndBuf(int sndBuf) override; /** * Set Dont-Fragment (DF) but ignore Path MTU. * @@ -180,25 +179,25 @@ class LibevQuicAsyncUDPSocket : public QuicAsyncUDPSocketImpl { * This may be desirable for apps that has its own PMTU Discovery mechanism. * See http://man7.org/linux/man-pages/man7/ip.7.html for more info. */ - folly::Expected setDFAndTurnOffPMTU() override; + quic::Expected setDFAndTurnOffPMTU() override; /** * Callback for receiving errors on the UDP sockets */ - folly::Expected setErrMessageCallback( + quic::Expected setErrMessageCallback( ErrMessageCallback* /* errMessageCallback */) override; - folly::Expected applyOptions( + quic::Expected applyOptions( const folly::SocketOptionMap& options, folly::SocketOptionKey::ApplyPos pos) override; /** * Set reuse port mode to call bind() on the same address multiple times */ - folly::Expected setReusePort(bool) override { + quic::Expected setReusePort(bool) override { LOG(FATAL) << __func__ << " not implemented in LibevQuicAsyncUDPSocket"; // Return success as it's just a warning, or error if strictness needed - return folly::unit; + return {}; } /** @@ -207,15 +206,14 @@ class LibevQuicAsyncUDPSocket : public QuicAsyncUDPSocketImpl { * FDOwnership::SHARED. In case FD is shared, it will not be `close`d in * destructor. */ - folly::Expected setFD(int fd, FDOwnership ownership) - override; + quic::Expected setFD(int fd, FDOwnership ownership) override; int getFD() override; /** * Start listening to writable events on the socket. */ - folly::Expected resumeWrite( + quic::Expected resumeWrite( WriteCallback* /* cob */) override; /** diff --git a/quic/common/udpsocket/QuicAsyncUDPSocket.h b/quic/common/udpsocket/QuicAsyncUDPSocket.h index fa8b91c62..e622d98fe 100644 --- a/quic/common/udpsocket/QuicAsyncUDPSocket.h +++ b/quic/common/udpsocket/QuicAsyncUDPSocket.h @@ -9,7 +9,6 @@ #include -#include #include #include #include @@ -17,6 +16,7 @@ #include #include // For folly::errnoStr #include +#include #include // Include for existing QuicError and QuicErrorCode #include @@ -97,7 +97,7 @@ class QuicAsyncUDPSocket { // internally if fd is not yet set at the time of the call. But if there is a // need to apply socket options pre-bind, one can call this function // explicitly before bind()/connect() and socket opts application. - [[nodiscard]] virtual folly::Expected init( + [[nodiscard]] virtual quic::Expected init( sa_family_t /* family */) = 0; /** @@ -106,7 +106,7 @@ class QuicAsyncUDPSocket { * use `address()` method above to get it after this method successfully * returns. */ - [[nodiscard]] virtual folly::Expected bind( + [[nodiscard]] virtual quic::Expected bind( const folly::SocketAddress& address) = 0; [[nodiscard]] virtual bool isBound() const = 0; @@ -130,13 +130,13 @@ class QuicAsyncUDPSocket { * * Returns the result of calling the connect syscall. */ - [[nodiscard]] virtual folly::Expected connect( + [[nodiscard]] virtual quic::Expected connect( const folly::SocketAddress& /* address */) = 0; /** * Stop listening on the socket. */ - [[nodiscard]] virtual folly::Expected close() = 0; + [[nodiscard]] virtual quic::Expected close() = 0; /** * Start reading datagrams @@ -156,9 +156,9 @@ class QuicAsyncUDPSocket { /** * Start listening to writable events on the socket. */ - [[nodiscard]] virtual folly::Expected resumeWrite( + [[nodiscard]] virtual quic::Expected resumeWrite( WriteCallback* /* cb */) { - return folly::unit; + return {}; } /** @@ -270,7 +270,7 @@ class QuicAsyncUDPSocket { Optional maybeNoReadReason; }; - [[nodiscard]] virtual folly::Expected + [[nodiscard]] virtual quic::Expected recvmmsgNetworkData( uint64_t readBufferSize, uint16_t numPackets, @@ -280,28 +280,28 @@ class QuicAsyncUDPSocket { // generic segmentation offload get/set // negative return value means GSO is not available - [[nodiscard]] virtual folly::Expected getGSO() = 0; + [[nodiscard]] virtual quic::Expected getGSO() = 0; // generic receive offload get/set // negative return value means GRO is not available - [[nodiscard]] virtual folly::Expected getGRO() = 0; - [[nodiscard]] virtual folly::Expected setGRO( + [[nodiscard]] virtual quic::Expected getGRO() = 0; + [[nodiscard]] virtual quic::Expected setGRO( bool /* bVal */) = 0; // receive tos cmsgs // if true, the IPv6 Traffic Class/IPv4 Type of Service field should be // populated in OnDataAvailableParams. - [[nodiscard]] virtual folly::Expected setRecvTos( + [[nodiscard]] virtual quic::Expected setRecvTos( bool recvTos) = 0; - [[nodiscard]] virtual folly::Expected getRecvTos() = 0; + [[nodiscard]] virtual quic::Expected getRecvTos() = 0; - [[nodiscard]] virtual folly::Expected - setTosOrTrafficClass(uint8_t tos) = 0; + [[nodiscard]] virtual quic::Expected setTosOrTrafficClass( + uint8_t tos) = 0; /** * Returns the socket address this socket is bound to and error otherwise. */ - [[nodiscard]] virtual folly::Expected + [[nodiscard]] virtual quic::Expected address() const = 0; /** @@ -318,23 +318,23 @@ class QuicAsyncUDPSocket { /** * Set extra control messages to send */ - [[nodiscard]] virtual folly::Expected setCmsgs( + [[nodiscard]] virtual quic::Expected setCmsgs( const folly::SocketCmsgMap& /* cmsgs */) = 0; - [[nodiscard]] virtual folly::Expected appendCmsgs( + [[nodiscard]] virtual quic::Expected appendCmsgs( const folly::SocketCmsgMap& /* cmsgs */) = 0; - [[nodiscard]] virtual folly::Expected - setAdditionalCmsgsFunc(std::function()>&& - /* additionalCmsgsFunc */) = 0; + [[nodiscard]] virtual quic::Expected setAdditionalCmsgsFunc( + std::function()>&& + /* additionalCmsgsFunc */) = 0; /* * Packet timestamping is currentl not supported. */ - [[nodiscard]] virtual folly::Expected getTimestamping() = 0; + [[nodiscard]] virtual quic::Expected getTimestamping() = 0; /** * Set SO_REUSEADDR flag on the socket. Default is OFF. */ - [[nodiscard]] virtual folly::Expected setReuseAddr( + [[nodiscard]] virtual quic::Expected setReuseAddr( bool reuseAddr) = 0; /** @@ -345,35 +345,35 @@ class QuicAsyncUDPSocket { * This may be desirable for apps that has its own PMTU Discovery mechanism. * See http://man7.org/linux/man-pages/man7/ip.7.html for more info. */ - [[nodiscard]] virtual folly::Expected + [[nodiscard]] virtual quic::Expected setDFAndTurnOffPMTU() = 0; /** * Callback for receiving errors on the UDP sockets */ - [[nodiscard]] virtual folly::Expected - setErrMessageCallback(ErrMessageCallback* /* errMessageCallback */) = 0; + [[nodiscard]] virtual quic::Expected setErrMessageCallback( + ErrMessageCallback* /* errMessageCallback */) = 0; - [[nodiscard]] virtual folly::Expected applyOptions( + [[nodiscard]] virtual quic::Expected applyOptions( const folly::SocketOptionMap& /* options */, folly::SocketOptionKey::ApplyPos /* pos */) = 0; /** * Set reuse port mode to call bind() on the same address multiple times */ - [[nodiscard]] virtual folly::Expected setReusePort( + [[nodiscard]] virtual quic::Expected setReusePort( bool reusePort) = 0; /** * Set SO_RCVBUF option on the socket, if not zero. Default is zero. */ - [[nodiscard]] virtual folly::Expected setRcvBuf( + [[nodiscard]] virtual quic::Expected setRcvBuf( int rcvBuf) = 0; /** * Set SO_SNDBUF option on the socket, if not zero. Default is zero. */ - [[nodiscard]] virtual folly::Expected setSndBuf( + [[nodiscard]] virtual quic::Expected setSndBuf( int sndBuf) = 0; enum class FDOwnership { OWNS, SHARED }; @@ -384,17 +384,17 @@ class QuicAsyncUDPSocket { * FDOwnership::SHARED. In case FD is shared, it will not be `close`d in * destructor. */ - [[nodiscard]] virtual folly::Expected setFD( + [[nodiscard]] virtual quic::Expected setFD( int /* fd */, FDOwnership /* ownership */) = 0; virtual int getFD() = 0; - [[nodiscard]] virtual folly::Expected + [[nodiscard]] virtual quic::Expected getLocalAddressFamily() const { auto addrResult = address(); if (addrResult.hasError()) { - return folly::makeUnexpected(addrResult.error()); + return quic::make_unexpected(addrResult.error()); } return addrResult->getFamily(); } diff --git a/quic/common/udpsocket/QuicAsyncUDPSocketImpl.cpp b/quic/common/udpsocket/QuicAsyncUDPSocketImpl.cpp index 4d9858ffe..71049804e 100644 --- a/quic/common/udpsocket/QuicAsyncUDPSocketImpl.cpp +++ b/quic/common/udpsocket/QuicAsyncUDPSocketImpl.cpp @@ -17,7 +17,7 @@ constexpr socklen_t kAddrLen = sizeof(sockaddr_storage); namespace quic { -folly::Expected +quic::Expected QuicAsyncUDPSocketImpl::recvmmsgNetworkData( uint64_t readBufferSize, uint16_t numPackets, @@ -36,15 +36,15 @@ QuicAsyncUDPSocketImpl::recvmmsgNetworkData( // Check socket options using Expected results auto groResult = getGRO(); if (FOLLY_UNLIKELY(groResult.hasError())) { - return folly::makeUnexpected(groResult.error()); + return quic::make_unexpected(groResult.error()); } auto timestampingResult = getTimestamping(); if (FOLLY_UNLIKELY(timestampingResult.hasError())) { - return folly::makeUnexpected(timestampingResult.error()); + return quic::make_unexpected(timestampingResult.error()); } auto recvTosResult = getRecvTos(); if (FOLLY_UNLIKELY(recvTosResult.hasError())) { - return folly::makeUnexpected(recvTosResult.error()); + return quic::make_unexpected(recvTosResult.error()); } #if defined(FOLLY_HAVE_MSG_ERRQUEUE) || defined(_WIN32) bool useGRO = *groResult > 0; @@ -76,7 +76,7 @@ QuicAsyncUDPSocketImpl::recvmmsgNetworkData( auto localAddrResult = address(); if (FOLLY_UNLIKELY(localAddrResult.hasError())) { - return folly::makeUnexpected(localAddrResult.error()); + return quic::make_unexpected(localAddrResult.error()); } auto* rawAddr = reinterpret_cast(&addr); // Assuming addr is large enough @@ -106,7 +106,7 @@ QuicAsyncUDPSocketImpl::recvmmsgNetworkData( // Return the error from recvmmsg itself int errnoCopy = errno; std::string errorMsg = "recvmmsg failed: " + folly::errnoStr(errnoCopy); - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::move(errorMsg))); // Original code returned RecvResult(NoReadReason::NONRETRIABLE_ERROR); diff --git a/quic/common/udpsocket/QuicAsyncUDPSocketImpl.h b/quic/common/udpsocket/QuicAsyncUDPSocketImpl.h index f906f84cb..a25168b88 100644 --- a/quic/common/udpsocket/QuicAsyncUDPSocketImpl.h +++ b/quic/common/udpsocket/QuicAsyncUDPSocketImpl.h @@ -13,8 +13,7 @@ namespace quic { class QuicAsyncUDPSocketImpl : public QuicAsyncUDPSocket { public: - folly::Expected - recvmmsgNetworkData( + quic::Expected recvmmsgNetworkData( uint64_t readBufferSize, uint16_t numPackets, NetworkData& networkData, diff --git a/quic/common/udpsocket/test/QuicAsyncUDPSocketMock.h b/quic/common/udpsocket/test/QuicAsyncUDPSocketMock.h index e0dc61a62..18587ad55 100644 --- a/quic/common/udpsocket/test/QuicAsyncUDPSocketMock.h +++ b/quic/common/udpsocket/test/QuicAsyncUDPSocketMock.h @@ -13,17 +13,17 @@ namespace quic::test { class QuicAsyncUDPSocketMock : public QuicAsyncUDPSocket { public: - MOCK_METHOD((folly::Expected), init, (sa_family_t)); + MOCK_METHOD((quic::Expected), init, (sa_family_t)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), bind, (const folly::SocketAddress&)); MOCK_METHOD((bool), isBound, (), (const)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), connect, (const folly::SocketAddress&)); - MOCK_METHOD((folly::Expected), close, ()); + MOCK_METHOD((quic::Expected), close, ()); MOCK_METHOD((void), resumeRead, (ReadCallback*)); MOCK_METHOD((void), pauseRead, ()); MOCK_METHOD( @@ -62,18 +62,18 @@ class QuicAsyncUDPSocketMock : public QuicAsyncUDPSocket { recvmmsg, (struct mmsghdr*, unsigned int, unsigned int, struct timespec*)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), recvmmsgNetworkData, (uint64_t, uint16_t, NetworkData&, Optional&, size_t&)); - MOCK_METHOD((folly::Expected), getGSO, ()); - MOCK_METHOD((folly::Expected), getGRO, ()); - MOCK_METHOD((folly::Expected), setGRO, (bool)); + MOCK_METHOD((quic::Expected), getGSO, ()); + MOCK_METHOD((quic::Expected), getGRO, ()); + MOCK_METHOD((quic::Expected), setGRO, (bool)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), address, (), (const)); @@ -82,47 +82,41 @@ class QuicAsyncUDPSocketMock : public QuicAsyncUDPSocket { MOCK_METHOD((void), detachEventBase, ()); MOCK_METHOD((std::shared_ptr), getEventBase, (), (const)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), setCmsgs, (const folly::SocketCmsgMap&)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), appendCmsgs, (const folly::SocketCmsgMap&)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), setAdditionalCmsgsFunc, (std::function()>&&)); - MOCK_METHOD((folly::Expected), getTimestamping, ()); - MOCK_METHOD((folly::Expected), setReuseAddr, (bool)); + MOCK_METHOD((quic::Expected), getTimestamping, ()); + MOCK_METHOD((quic::Expected), setReuseAddr, (bool)); + MOCK_METHOD((quic::Expected), setDFAndTurnOffPMTU, ()); MOCK_METHOD( - (folly::Expected), - setDFAndTurnOffPMTU, - ()); - MOCK_METHOD( - (folly::Expected), + (quic::Expected), setErrMessageCallback, (ErrMessageCallback*)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), applyOptions, (const folly::SocketOptionMap&, folly::SocketOptionKey::ApplyPos)); - MOCK_METHOD((folly::Expected), setReusePort, (bool)); - MOCK_METHOD((folly::Expected), setRcvBuf, (int)); - MOCK_METHOD((folly::Expected), setSndBuf, (int)); - MOCK_METHOD( - (folly::Expected), - setFD, - (int, FDOwnership)); + MOCK_METHOD((quic::Expected), setReusePort, (bool)); + MOCK_METHOD((quic::Expected), setRcvBuf, (int)); + MOCK_METHOD((quic::Expected), setSndBuf, (int)); + MOCK_METHOD((quic::Expected), setFD, (int, FDOwnership)); MOCK_METHOD((int), getFD, ()); - MOCK_METHOD((folly::Expected), setRecvTos, (bool)); - MOCK_METHOD((folly::Expected), getRecvTos, ()); + MOCK_METHOD((quic::Expected), setRecvTos, (bool)); + MOCK_METHOD((quic::Expected), getRecvTos, ()); MOCK_METHOD( - (folly::Expected), + (quic::Expected), setTosOrTrafficClass, (uint8_t)); MOCK_METHOD( - (folly::Expected), + (quic::Expected), getLocalAddressFamily, (), (const)); diff --git a/quic/congestion_control/test/BbrTest.cpp b/quic/congestion_control/test/BbrTest.cpp index 19cf4231a..e81bd9cd7 100644 --- a/quic/congestion_control/test/BbrTest.cpp +++ b/quic/congestion_control/test/BbrTest.cpp @@ -709,9 +709,15 @@ TEST_F(BbrTest, BytesCounting) { ReadAckFrame ackFrame; ackFrame.largestAcked = packetNum; ackFrame.ackBlocks.emplace_back(packetNum, packetNum); - auto ackPacketVisitor = [](auto&) { return folly::unit; }; - auto ackFrameVisitor = [](auto&, auto&) { return folly::unit; }; - auto lossVisitor = [](auto&, auto&, bool) { return folly::unit; }; + auto ackPacketVisitor = [](auto&) -> quic::Expected { + return {}; + }; + auto ackFrameVisitor = + [](auto&, auto&) -> quic::Expected { return {}; }; + auto lossVisitor = + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }; ASSERT_FALSE(processAckFrame( conn, PacketNumberSpace::AppData, diff --git a/quic/dsr/frontend/Scheduler.cpp b/quic/dsr/frontend/Scheduler.cpp index 9a2c72b9d..4709c045d 100644 --- a/quic/dsr/frontend/Scheduler.cpp +++ b/quic/dsr/frontend/Scheduler.cpp @@ -78,7 +78,7 @@ DSRStreamFrameScheduler::enrichAndAddSendInstruction( * same backend. Thus one SendInstruction can only have one stream. So this API * only write a single stream. */ -folly::Expected +quic::Expected DSRStreamFrameScheduler::writeStream(DSRPacketBuilderBase& builder) { auto oldWriteQueue = conn_.streamManager->oldWriteQueue(); if (oldWriteQueue) { @@ -88,7 +88,7 @@ DSRStreamFrameScheduler::writeStream(DSRPacketBuilderBase& builder) { } } -folly::Expected +quic::Expected DSRStreamFrameScheduler::writeStreamImpl( DSRPacketBuilderBase& builder, PriorityQueue& writeQueue) { @@ -124,7 +124,7 @@ DSRStreamFrameScheduler::writeStreamImpl( stream->lossBufMetas.front().eof, stream->currentWriteOffset + stream->pendingWrites.chainLength()); if (encodedSizeExpected.hasError()) { - return folly::makeUnexpected(encodedSizeExpected.error()); + return quic::make_unexpected(encodedSizeExpected.error()); } auto encodedSize = encodedSizeExpected.value(); @@ -174,7 +174,7 @@ DSRStreamFrameScheduler::writeStreamImpl( canWriteFin, stream->currentWriteOffset + stream->pendingWrites.chainLength()); if (encodedSizeExpected.hasError()) { - return folly::makeUnexpected(encodedSizeExpected.error()); + return quic::make_unexpected(encodedSizeExpected.error()); } auto encodedSize = encodedSizeExpected.value(); @@ -195,7 +195,7 @@ DSRStreamFrameScheduler::writeStreamImpl( return result; } -folly::Expected +quic::Expected DSRStreamFrameScheduler::writeStreamImpl( DSRPacketBuilderBase& builder, const deprecated::PriorityQueue& writeQueue) { @@ -232,7 +232,7 @@ DSRStreamFrameScheduler::writeStreamImpl( stream->currentWriteOffset + stream->pendingWrites.chainLength()); if (encodedSizeExpected.hasError()) { - return folly::makeUnexpected(encodedSizeExpected.error()); + return quic::make_unexpected(encodedSizeExpected.error()); } auto encodedSize = encodedSizeExpected.value(); @@ -282,7 +282,7 @@ DSRStreamFrameScheduler::writeStreamImpl( stream->currentWriteOffset + stream->pendingWrites.chainLength()); if (encodedSizeExpected.hasError()) { - return folly::makeUnexpected(encodedSizeExpected.error()); + return quic::make_unexpected(encodedSizeExpected.error()); } auto encodedSize = encodedSizeExpected.value(); diff --git a/quic/dsr/frontend/Scheduler.h b/quic/dsr/frontend/Scheduler.h index 82f934bf8..4a57f9ec2 100644 --- a/quic/dsr/frontend/Scheduler.h +++ b/quic/dsr/frontend/Scheduler.h @@ -31,7 +31,7 @@ class DSRStreamFrameScheduler { }; // Write a single stream's data into builder. - [[nodiscard]] folly::Expected writeStream( + [[nodiscard]] quic::Expected writeStream( DSRPacketBuilderBase& builder); private: @@ -55,11 +55,11 @@ class DSRStreamFrameScheduler { const PriorityQueue&, QuicStreamState&); - folly::Expected + quic::Expected writeStreamImpl( DSRPacketBuilderBase& builder, const deprecated::PriorityQueue&); - folly::Expected + quic::Expected writeStreamImpl(DSRPacketBuilderBase& builder, PriorityQueue&); private: diff --git a/quic/dsr/frontend/WriteCodec.cpp b/quic/dsr/frontend/WriteCodec.cpp index 0b841fed2..4b497703d 100644 --- a/quic/dsr/frontend/WriteCodec.cpp +++ b/quic/dsr/frontend/WriteCodec.cpp @@ -10,7 +10,7 @@ namespace quic { -folly::Expected writeDSRStreamFrame( +quic::Expected writeDSRStreamFrame( DSRPacketBuilderBase& packetBuilder, SendInstruction::Builder& instructionBuilder, StreamId id, @@ -23,7 +23,7 @@ folly::Expected writeDSRStreamFrame( return 0; } if (writeBufferLen == 0 && !fin) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::INTERNAL_ERROR, "No data or fin supplied when writing stream.")); } @@ -31,7 +31,7 @@ folly::Expected writeDSRStreamFrame( QuicInteger idInt(id); auto idIntSize = idInt.getSize(); if (idIntSize.hasError()) { - return folly::makeUnexpected(idIntSize.error()); + return quic::make_unexpected(idIntSize.error()); } uint64_t headerSize = sizeof(uint8_t) + idIntSize.value(); if (packetBuilder.remainingSpace() < headerSize) { @@ -44,7 +44,7 @@ folly::Expected writeDSRStreamFrame( if (offset != 0) { auto offsetIntSize = offsetInt.getSize(); if (offsetIntSize.hasError()) { - return folly::makeUnexpected(offsetIntSize.error()); + return quic::make_unexpected(offsetIntSize.error()); } headerSize += offsetIntSize.value(); } diff --git a/quic/dsr/frontend/WriteCodec.h b/quic/dsr/frontend/WriteCodec.h index e0796717f..f08458ba6 100644 --- a/quic/dsr/frontend/WriteCodec.h +++ b/quic/dsr/frontend/WriteCodec.h @@ -11,7 +11,7 @@ #include namespace quic { -[[nodiscard]] folly::Expected writeDSRStreamFrame( +[[nodiscard]] quic::Expected writeDSRStreamFrame( DSRPacketBuilderBase& packetBuilder, SendInstruction::Builder& instructionBuilder, StreamId id, diff --git a/quic/dsr/frontend/WriteFunctions.cpp b/quic/dsr/frontend/WriteFunctions.cpp index 3e27a9845..e89d8d002 100644 --- a/quic/dsr/frontend/WriteFunctions.cpp +++ b/quic/dsr/frontend/WriteFunctions.cpp @@ -9,7 +9,7 @@ #include namespace quic { -folly::Expected writePacketizationRequest( +quic::Expected writePacketizationRequest( QuicServerConnectionState& connection, const ConnectionId& dstCid, size_t packetLimit, @@ -51,7 +51,7 @@ folly::Expected writePacketizationRequest( .largestAckedByPeer.value_or(0)); auto schedulerResult = scheduler.writeStream(packetBuilder); if (schedulerResult.hasError()) { - return folly::makeUnexpected(schedulerResult.error()); + return quic::make_unexpected(schedulerResult.error()); } if (!schedulerResult->writeSuccess) { /** @@ -98,7 +98,7 @@ folly::Expected writePacketizationRequest( true /* isDSRPacket */); if (updateResult.hasError()) { - return folly::makeUnexpected(updateResult.error()); + return quic::make_unexpected(updateResult.error()); } connection.dsrPacketCount++; diff --git a/quic/dsr/frontend/WriteFunctions.h b/quic/dsr/frontend/WriteFunctions.h index 8081ab052..fa0c8ed93 100644 --- a/quic/dsr/frontend/WriteFunctions.h +++ b/quic/dsr/frontend/WriteFunctions.h @@ -15,7 +15,7 @@ #include namespace quic { -folly::Expected writePacketizationRequest( +quic::Expected writePacketizationRequest( QuicServerConnectionState& connection, const ConnectionId& dstCid, size_t packetLimit, diff --git a/quic/fizz/client/handshake/FizzClientHandshake.cpp b/quic/fizz/client/handshake/FizzClientHandshake.cpp index 763874321..285d47b48 100644 --- a/quic/fizz/client/handshake/FizzClientHandshake.cpp +++ b/quic/fizz/client/handshake/FizzClientHandshake.cpp @@ -31,7 +31,7 @@ FizzClientHandshake::FizzClientHandshake( CHECK(cryptoFactory_->getFizzFactory()); } -folly::Expected, QuicError> +quic::Expected, QuicError> FizzClientHandshake::connectImpl(Optional hostname) { // Look up psk auto quicCachedPsk = getPsk(hostname); @@ -85,14 +85,14 @@ FizzClientHandshake::connectImpl(Optional hostname) { ex.getAlert().value()); alertNum += static_cast::type>( TransportErrorCode::CRYPTO_ERROR); - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(static_cast(alertNum), ex.what())); } else { - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(TransportErrorCode::INTERNAL_ERROR, ex.what())); } } catch (const std::exception& ex) { - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(TransportErrorCode::INTERNAL_ERROR, ex.what())); } @@ -149,7 +149,7 @@ const Optional& FizzClientHandshake::getApplicationProtocol() } } -folly::Expected FizzClientHandshake::verifyRetryIntegrityTag( +quic::Expected FizzClientHandshake::verifyRetryIntegrityTag( const ConnectionId& originalDstConnId, const RetryPacket& retryPacket) { try { @@ -172,7 +172,7 @@ folly::Expected FizzClientHandshake::verifyRetryIntegrityTag( retryPacket.integrityTag.data(), retryPacket.integrityTag.size()); return BufEq()(*expectedIntegrityTag, integrityTagWrapper); } catch (const std::exception& ex) { - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(TransportErrorCode::INTERNAL_ERROR, ex.what())); } } @@ -218,8 +218,9 @@ bool FizzClientHandshake::matchEarlyParameters() { return fizz::client::earlyParametersMatch(state_); } -folly::Expected, QuicError> -FizzClientHandshake::buildAead(CipherKind kind, ByteRange secret) { +quic::Expected, QuicError> FizzClientHandshake::buildAead( + CipherKind kind, + ByteRange secret) { try { bool isEarlyTraffic = kind == CipherKind::ZeroRttWrite; fizz::CipherSuite cipher = @@ -240,17 +241,17 @@ FizzClientHandshake::buildAead(CipherKind kind, ByteRange secret) { return aead; } catch (const std::exception& ex) { - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(TransportErrorCode::INTERNAL_ERROR, ex.what())); } } -folly::Expected, QuicError> +quic::Expected, QuicError> FizzClientHandshake::buildHeaderCipher(ByteRange secret) { return cryptoFactory_->makePacketNumberCipher(secret); } -folly::Expected FizzClientHandshake::getNextTrafficSecret( +quic::Expected FizzClientHandshake::getNextTrafficSecret( ByteRange secret) const { try { auto deriver = @@ -259,7 +260,7 @@ folly::Expected FizzClientHandshake::getNextTrafficSecret( secret, kQuicKULabel, BufHelpers::create(0), secret.size()); return nextSecret; } catch (const std::exception& ex) { - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(TransportErrorCode::INTERNAL_ERROR, ex.what())); } } diff --git a/quic/fizz/client/handshake/FizzClientHandshake.h b/quic/fizz/client/handshake/FizzClientHandshake.h index 3efb77ae6..c61e111f5 100644 --- a/quic/fizz/client/handshake/FizzClientHandshake.h +++ b/quic/fizz/client/handshake/FizzClientHandshake.h @@ -33,7 +33,7 @@ class FizzClientHandshake : public ClientHandshake { const Optional& getApplicationProtocol() const override; - [[nodiscard]] folly::Expected verifyRetryIntegrityTag( + [[nodiscard]] quic::Expected verifyRetryIntegrityTag( const ConnectionId& originalDstConnId, const RetryPacket& retryPacket) override; @@ -70,19 +70,19 @@ class FizzClientHandshake : public ClientHandshake { void echRetryAvailable(fizz::client::ECHRetryAvailable& retry); private: - [[nodiscard]] folly:: + [[nodiscard]] quic:: Expected, QuicError> connectImpl(Optional hostname) override; EncryptionLevel getReadRecordLayerEncryptionLevel() override; void processSocketData(folly::IOBufQueue& queue) override; bool matchEarlyParameters() override; - [[nodiscard]] folly::Expected, QuicError> buildAead( + [[nodiscard]] quic::Expected, QuicError> buildAead( CipherKind kind, ByteRange secret) override; - [[nodiscard]] folly::Expected, QuicError> + [[nodiscard]] quic::Expected, QuicError> buildHeaderCipher(ByteRange secret) override; - [[nodiscard]] folly::Expected getNextTrafficSecret( + [[nodiscard]] quic::Expected getNextTrafficSecret( ByteRange secret) const override; class ActionMoveVisitor; diff --git a/quic/fizz/client/test/QuicClientTransportTest.cpp b/quic/fizz/client/test/QuicClientTransportTest.cpp index d35a3ff0d..cc5ee03b2 100644 --- a/quic/fizz/client/test/QuicClientTransportTest.cpp +++ b/quic/fizz/client/test/QuicClientTransportTest.cpp @@ -293,8 +293,17 @@ QuicClientTransportIntegrationTest::sendRequestAndResponse( std::unique_ptr data, StreamId streamId, MockReadCallback* readCallback) { - client->setReadCallback(streamId, readCallback); - client->writeChain(streamId, data->clone(), true); + auto readCallbackResult = client->setReadCallback(streamId, readCallback); + if (!readCallbackResult.has_value()) { + return folly::makeFuture( + folly::make_exception_wrapper( + "setReadCallback failed")); + } + auto writeResult = client->writeChain(streamId, data->clone(), true); + if (!writeResult.has_value()) { + return folly::makeFuture( + folly::make_exception_wrapper("writeChain failed")); + } auto streamData = new StreamData(streamId); auto dataCopy = std::shared_ptr(std::move(data)); EXPECT_CALL(*readCallback, readAvailable(streamId)) @@ -309,13 +318,21 @@ QuicClientTransportIntegrationTest::sendRequestAndResponse( << " sent=" << dataCopy->computeChainDataLength(); streamData->append(std::move(readData->first), readData->second); if (readData->second) { - c->setReadCallback(id, nullptr); + auto clearCallbackResult = c->setReadCallback(id, nullptr); + if (!clearCallbackResult.has_value()) { + LOG(WARNING) << "Failed to clear read callback: " + << toString(clearCallbackResult.error()); + } } })); ON_CALL(*readCallback, readError(streamId, _)) .WillByDefault(Invoke([streamData, this](auto sid, auto err) mutable { streamData->setException(err); - client->setReadCallback(sid, nullptr); + auto clearErrorCallbackResult = client->setReadCallback(sid, nullptr); + if (!clearErrorCallbackResult.has_value()) { + LOG(WARNING) << "Failed to clear read callback on error: " + << toString(clearErrorCallbackResult.error()); + } })); return streamData->promise.getFuture().within(30s); } @@ -367,7 +384,8 @@ TEST_P(QuicClientTransportIntegrationTest, FlowControlLimitedTest) { eventbase_.loopForever(); auto streamId = client->createBidirectionalStream().value(); - client->setStreamFlowControlWindow(streamId, 256); + auto setStreamFlowControlWindowResult = + client->setStreamFlowControlWindow(streamId, 256); auto data = IOBuf::create(4096); data->append(4096); memset(data->writableData(), 'a', data->length()); @@ -1104,44 +1122,45 @@ TEST_F(QuicClientTransportTest, onNetworkSwitchReplaceAfterHandshake) { auto newSocket = std::make_unique>(qEvb_); ON_CALL(*newSocket, setReuseAddr(_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, setAdditionalCmsgsFunc(_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, setDFAndTurnOffPMTU()) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, setErrMessageCallback(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, setTosOrTrafficClass(_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, init(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, applyOptions(testing::_, testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, bind(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, connect(testing::_)) - .WillByDefault(testing::Return(folly::unit)); - ON_CALL(*newSocket, close()).WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); + ON_CALL(*newSocket, close()) + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, resumeWrite(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, setGRO(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, setRecvTos(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, getRecvTos()).WillByDefault(testing::Return(false)); ON_CALL(*newSocket, setCmsgs(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, appendCmsgs(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, getTimestamping()).WillByDefault(testing::Return(0)); ON_CALL(*newSocket, setReusePort(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, setRcvBuf(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, setSndBuf(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, setFD(testing::_, testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); auto newSocketPtr = newSocket.get(); EXPECT_CALL(*sock, pauseRead()); @@ -1160,44 +1179,45 @@ TEST_F(QuicClientTransportTest, onNetworkSwitchReplaceNoHandshake) { auto newSocket = std::make_unique>(qEvb_); ON_CALL(*newSocket, setReuseAddr(_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, setAdditionalCmsgsFunc(_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, setDFAndTurnOffPMTU()) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, setErrMessageCallback(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, setTosOrTrafficClass(_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, init(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, applyOptions(testing::_, testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, bind(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, connect(testing::_)) - .WillByDefault(testing::Return(folly::unit)); - ON_CALL(*newSocket, close()).WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); + ON_CALL(*newSocket, close()) + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, resumeWrite(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, setGRO(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, setRecvTos(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, getRecvTos()).WillByDefault(testing::Return(false)); ON_CALL(*newSocket, setCmsgs(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, appendCmsgs(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, getTimestamping()).WillByDefault(testing::Return(0)); ON_CALL(*newSocket, setReusePort(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, setRcvBuf(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, setSndBuf(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*newSocket, setFD(testing::_, testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); auto newSocketPtr = newSocket.get(); auto mockQLogger = std::make_shared(VantagePoint::Client); EXPECT_CALL(*mockQLogger, addConnectionMigrationUpdate(true)).Times(0); @@ -1453,46 +1473,47 @@ class QuicClientTransportHappyEyeballsTest ON_CALL(*secondSock, address()).WillByDefault(testing::Return(serverAddr)); ON_CALL(*secondSock, setAdditionalCmsgsFunc(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, getGSO).WillByDefault(testing::Return(0)); ON_CALL(*secondSock, getGRO).WillByDefault(testing::Return(0)); ON_CALL(*secondSock, init(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, bind(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, connect(testing::_)) - .WillByDefault(testing::Return(folly::unit)); - ON_CALL(*secondSock, close()).WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); + ON_CALL(*secondSock, close()) + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, resumeWrite(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, setGRO(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, setRecvTos(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, getRecvTos()).WillByDefault(testing::Return(false)); ON_CALL(*secondSock, setTosOrTrafficClass(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, setCmsgs(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, appendCmsgs(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, getTimestamping()).WillByDefault(testing::Return(0)); ON_CALL(*secondSock, setReuseAddr(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, setDFAndTurnOffPMTU()) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, setErrMessageCallback(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, applyOptions(testing::_, testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, setReusePort(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, setRcvBuf(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, setSndBuf(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, setFD(testing::_, testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); } protected: @@ -1732,7 +1753,7 @@ class QuicClientTransportHappyEyeballsTest EXPECT_CALL(*sock, write(firstAddress, _, _)); EXPECT_CALL(*secondSock, bind(_)) .WillOnce(Invoke([](const folly::SocketAddress&) { - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(TransportErrorCode::INTERNAL_ERROR, "oopsies")); })); client->start(&clientConnSetupCallback, &clientConnCallback); @@ -2447,7 +2468,7 @@ class QuicClientVersionParamInvalidTest TEST_F(QuicClientTransportAfterStartTest, ReadStream) { StreamId streamId = client->createBidirectionalStream().value(); - client->setReadCallback(streamId, &readCb); + auto fizzClientSetReadCallback3 = client->setReadCallback(streamId, &readCb); bool dataDelivered = false; auto expected = IOBuf::copyBuffer("hello"); EXPECT_CALL(readCb, readAvailable(streamId)).WillOnce(Invoke([&](auto) { @@ -2551,7 +2572,7 @@ TEST_F(QuicClientTransportAfterStartTest, PartialReadLoopCounting) { TEST_F(QuicClientTransportAfterStartTest, ReadStreamMultiplePackets) { StreamId streamId = client->createBidirectionalStream().value(); - client->setReadCallback(streamId, &readCb); + auto fizzClientSetReadCallback4 = client->setReadCallback(streamId, &readCb); bool dataDelivered = false; auto data = IOBuf::copyBuffer("hello"); @@ -2600,22 +2621,22 @@ TEST_F(QuicClientTransportAfterStartTest, ReadStreamMultiplePackets) { TEST_F(QuicClientTransportAfterStartTest, ReadStreamWithRetriableError) { StreamId streamId = client->createBidirectionalStream().value(); - client->setReadCallback(streamId, &readCb); + auto fizzClientSetReadCallback5 = client->setReadCallback(streamId, &readCb); EXPECT_CALL(readCb, readAvailable(_)).Times(0); EXPECT_CALL(readCb, readError(_, _)).Times(0); deliverNetworkError(EAGAIN); - client->setReadCallback(streamId, nullptr); + auto fizzClientSetReadCallback6 = client->setReadCallback(streamId, nullptr); client->close(std::nullopt); } TEST_F(QuicClientTransportAfterStartTest, ReadStreamWithNonRetriableError) { StreamId streamId = client->createBidirectionalStream().value(); - client->setReadCallback(streamId, &readCb); + auto fizzClientSetReadCallback7 = client->setReadCallback(streamId, &readCb); EXPECT_CALL(readCb, readAvailable(_)).Times(0); // TODO: we currently do not close the socket, but maybe we can in the future. EXPECT_CALL(readCb, readError(_, _)).Times(0); deliverNetworkError(EBADF); - client->setReadCallback(streamId, nullptr); + auto fizzClientSetReadCallback8 = client->setReadCallback(streamId, nullptr); client->close(std::nullopt); } @@ -2624,7 +2645,7 @@ TEST_F( ReadStreamMultiplePacketsWithRetriableError) { StreamId streamId = client->createBidirectionalStream().value(); - client->setReadCallback(streamId, &readCb); + auto fizzClientSetReadCallback9 = client->setReadCallback(streamId, &readCb); bool dataDelivered = false; auto expected = IOBuf::copyBuffer("hello"); EXPECT_CALL(readCb, readAvailable(streamId)).WillOnce(Invoke([&](auto) { @@ -2659,7 +2680,7 @@ TEST_F( ReadStreamMultiplePacketsWithNonRetriableError) { StreamId streamId = client->createBidirectionalStream().value(); - client->setReadCallback(streamId, &readCb); + auto fizzClientSetReadCallback10 = client->setReadCallback(streamId, &readCb); auto expected = IOBuf::copyBuffer("hello"); EXPECT_CALL(readCb, readAvailable(streamId)).Times(0); @@ -2679,7 +2700,7 @@ TEST_F( socketReads.emplace_back(TestReadData(packet->coalesce(), serverAddr)); deliverNetworkError(EBADF); } - client->setReadCallback(streamId, nullptr); + auto fizzClientSetReadCallback11 = client->setReadCallback(streamId, nullptr); } TEST_F(QuicClientTransportAfterStartTest, RecvNewConnectionIdValid) { @@ -2896,7 +2917,7 @@ TEST_P(QuicClientTransportAfterStartTest, ReadStreamCoalesced) { auto qLogger = std::make_shared(VantagePoint::Client); client->getNonConstConn().qLogger = qLogger; - client->setReadCallback(streamId, &readCb); + auto fizzClientSetReadCallback12 = client->setReadCallback(streamId, &readCb); bool dataDelivered = false; auto expected = IOBuf::copyBuffer("hello"); EXPECT_CALL(readCb, readAvailable(streamId)).WillOnce(Invoke([&](auto) { @@ -2957,7 +2978,7 @@ TEST_P(QuicClientTransportAfterStartTest, ReadStreamCoalesced) { TEST_F(QuicClientTransportAfterStartTest, ReadStreamCoalescedMany) { StreamId streamId = client->createBidirectionalStream().value(); - client->setReadCallback(streamId, &readCb); + auto fizzClientSetReadCallback13 = client->setReadCallback(streamId, &readCb); auto expected = IOBuf::copyBuffer("hello"); EXPECT_CALL(readCb, readAvailable(streamId)).Times(0); FizzCryptoFactory cryptoFactory; @@ -3084,8 +3105,9 @@ TEST_F(QuicClientTransportAfterStartTest, CloseConnectionWithStreamPending) { auto qLogger = std::make_shared(VantagePoint::Client); client->getNonConstConn().qLogger = qLogger; auto expected = IOBuf::copyBuffer("hello"); - client->setReadCallback(streamId, &readCb); - client->writeChain(streamId, expected->clone(), true); + auto fizzClientSetReadCallback14 = client->setReadCallback(streamId, &readCb); + auto fizzClientWriteChain2 = + client->writeChain(streamId, expected->clone(), true); loopForWrites(); // ack all the packets ASSERT_FALSE(client->getConn().outstandings.packets.empty()); @@ -3157,8 +3179,9 @@ TEST_F(QuicClientTransportAfterStartTest, CloseConnectionWithNoStreamPending) { StreamId streamId = client->createBidirectionalStream().value(); auto expected = IOBuf::copyBuffer("hello"); - client->setReadCallback(streamId, &readCb); - client->writeChain(streamId, expected->clone(), true); + auto fizzClientSetReadCallback15 = client->setReadCallback(streamId, &readCb); + auto fizzClientWriteChain3 = + client->writeChain(streamId, expected->clone(), true); loopForWrites(); @@ -3219,8 +3242,9 @@ TEST_P( auto qLogger = std::make_shared(VantagePoint::Client); client->getNonConstConn().qLogger = qLogger; auto expected = IOBuf::copyBuffer("hello"); - client->setReadCallback(streamId, &readCb); - client->writeChain(streamId, expected->clone(), true); + auto fizzClientSetReadCallback16 = client->setReadCallback(streamId, &readCb); + auto fizzClientWriteChain4 = + client->writeChain(streamId, expected->clone(), true); loopForWrites(); socketWrites.clear(); @@ -3348,8 +3372,9 @@ TEST_F(QuicClientTransportAfterStartTest, RecvOneRttAck) { StreamId streamId = client->createBidirectionalStream().value(); auto expected = IOBuf::copyBuffer("hello"); - client->setReadCallback(streamId, &readCb); - client->writeChain(streamId, expected->clone(), true); + auto fizzClientSetReadCallback17 = client->setReadCallback(streamId, &readCb); + auto fizzClientWriteChain5 = + client->writeChain(streamId, expected->clone(), true); loopForWrites(); AckBlocks sentPackets; @@ -3377,8 +3402,9 @@ TEST_P(QuicClientTransportAfterStartTestClose, CloseConnectionWithError) { StreamId streamId = client->createBidirectionalStream().value(); auto expected = IOBuf::copyBuffer("hello"); - client->setReadCallback(streamId, &readCb); - client->writeChain(streamId, expected->clone(), true); + auto fizzClientSetReadCallback18 = client->setReadCallback(streamId, &readCb); + auto fizzClientWriteChain6 = + client->writeChain(streamId, expected->clone(), true); loopForWrites(); auto packet = packetToBuf(createStreamPacket( *serverChosenConnId /* src */, @@ -3562,7 +3588,8 @@ TEST_F(QuicClientTransportAfterStartTest, IdleTimerNotResetOnWritingOldData) { auto expected = IOBuf::copyBuffer("hello"); client->idleTimeout().cancelTimerCallback(); ASSERT_FALSE(client->idleTimeout().isTimerCallbackScheduled()); - client->writeChain(streamId, expected->clone(), false); + auto fizzClientWriteChain7 = + client->writeChain(streamId, expected->clone(), false); loopForWrites(); ASSERT_FALSE(client->getConn().receivedNewPacketBeforeWrite); @@ -3577,7 +3604,8 @@ TEST_F(QuicClientTransportAfterStartTest, IdleTimerResetNoOutstandingPackets) { client->idleTimeout().cancelTimerCallback(); auto streamId = client->createBidirectionalStream().value(); auto expected = folly::IOBuf::copyBuffer("hello"); - client->writeChain(streamId, expected->clone(), false); + auto fizzClientWriteChain8 = + client->writeChain(streamId, expected->clone(), false); loopForWrites(); ASSERT_TRUE(client->idleTimeout().isTimerCallbackScheduled()); } @@ -3696,7 +3724,7 @@ TEST_F( TEST_F(QuicClientTransportAfterStartTest, ReceiveReliableRst) { auto streamId = client->createBidirectionalStream(false /* replaySafe */).value(); - client->setReadCallback(streamId, &readCb); + auto fizzClientSetReadCallback19 = client->setReadCallback(streamId, &readCb); RstStreamFrame rstFrame(streamId, GenericApplicationErrorCode::UNKNOWN, 5, 5); ShortHeader header( ProtectionType::KeyPhaseZero, *originalConnId, appDataPacketNum++); @@ -3746,21 +3774,22 @@ TEST_F( ASSERT_FALSE(writeFrame(rstFrame, builder2).hasError()); auto data = folly::IOBuf::copyBuffer("hello"); - writeStreamFrameHeader( - builder2, - streamId, - 0, - data->computeChainDataLength(), - data->computeChainDataLength(), - false, - std::nullopt /* skipLenHint */); + ASSERT_TRUE(writeStreamFrameHeader( + builder2, + streamId, + 0, + data->computeChainDataLength(), + data->computeChainDataLength(), + false, + std::nullopt /* skipLenHint */) + .has_value()); writeStreamFrameData(builder2, data->clone(), data->computeChainDataLength()); auto packetObject = std::move(builder2).buildPacket(); auto packet2 = packetToBuf(std::move(packetObject)); deliverData(packet2->coalesce()); auto readData = client->read(streamId, 0); - ASSERT_TRUE(readData.hasValue()); + ASSERT_TRUE(readData.has_value()); ASSERT_NE(readData.value().first, nullptr); EXPECT_TRUE(folly::IOBufEqualTo()(*readData.value().first, *data)); } @@ -3769,7 +3798,7 @@ TEST_F(QuicClientTransportAfterStartTest, ReceiveRstStreamAfterEom) { // A RstStreamFrame will be written to sock when we receive a RstStreamFrame auto streamId = client->createBidirectionalStream(false /* replaySafe */).value(); - client->setReadCallback(streamId, &readCb); + auto fizzClientSetReadCallback20 = client->setReadCallback(streamId, &readCb); EXPECT_CALL(readCb, readAvailable(streamId)).WillOnce(Invoke([&](auto id) { auto readData = client->read(id, 0); @@ -3812,7 +3841,7 @@ TEST_F( // A RstStreamFrame will be written to sock when we receive a RstStreamFrame auto streamId = client->createBidirectionalStream(false /* replaySafe */).value(); - client->setReadCallback(streamId, &readCb); + auto fizzClientSetReadCallback21 = client->setReadCallback(streamId, &readCb); EXPECT_CALL(readCb, readAvailable(streamId)).WillOnce(Invoke([&](auto id) { auto readData = client->read(id, 0); @@ -3831,11 +3860,12 @@ TEST_F( 0 /* largestAcked */)); deliverData(packet->coalesce()); - client->setReadCallback(streamId, nullptr); + auto fizzClientSetReadCallback22 = client->setReadCallback(streamId, nullptr); AckBlocks sentPackets; auto writeData = IOBuf::copyBuffer("some data"); - client->writeChain(streamId, writeData->clone(), true); + auto fizzClientWriteChain9 = + client->writeChain(streamId, writeData->clone(), true); loopForWrites(); verifyShortPackets(sentPackets); @@ -3861,7 +3891,8 @@ TEST_F(QuicClientTransportAfterStartTest, StreamClosedIfReadCallbackNull) { AckBlocks sentPackets; auto writeData = IOBuf::copyBuffer("some data"); - client->writeChain(streamId, writeData->clone(), true); + auto fizzClientWriteChain10 = + client->writeChain(streamId, writeData->clone(), true); loopForWrites(); verifyShortPackets(sentPackets); @@ -3897,10 +3928,12 @@ TEST_F(QuicClientTransportAfterStartTest, ReceiveAckInvokesDeliveryCallback) { AckBlocks sentPackets; auto streamId = client->createBidirectionalStream(false /* replaySafe */).value(); - client->registerDeliveryCallback(streamId, 0, &deliveryCallback); + auto fizzClientRegisterDelivery1 = + client->registerDeliveryCallback(streamId, 0, &deliveryCallback); auto data = IOBuf::copyBuffer("some data"); - client->writeChain(streamId, data->clone(), true); + auto fizzClientWriteChain11 = + client->writeChain(streamId, data->clone(), true); loopForWrites(); verifyShortPackets(sentPackets); @@ -3922,7 +3955,8 @@ TEST_F(QuicClientTransportAfterStartTest, InvokesDeliveryCallbackFinOnly) { auto streamId = client->createBidirectionalStream(false /* replaySafe */).value(); - client->writeChain(streamId, nullptr, true, &deliveryCallback); + auto fizzClientWriteChain12 = + client->writeChain(streamId, nullptr, true, &deliveryCallback); loopForWrites(); verifyShortPackets(sentPackets); @@ -3946,13 +3980,18 @@ TEST_F(QuicClientTransportAfterStartTest, InvokesDeliveryCallbackRange) { client->createBidirectionalStream(false /* replaySafe */).value(); auto data = IOBuf::copyBuffer("some data"); - client->writeChain(streamId, data->clone(), false, nullptr); + auto fizzClientWriteChain13 = + client->writeChain(streamId, data->clone(), false, nullptr); for (uint64_t offset = 0; offset < data->computeChainDataLength(); offset++) { - client->registerDeliveryCallback(streamId, offset, &deliveryCallback); + auto fizzClientRegisterDelivery2 = + client->registerDeliveryCallback(streamId, offset, &deliveryCallback); EXPECT_CALL(deliveryCallback, onDeliveryAck(streamId, offset, _)).Times(1); } - client->registerDeliveryCallback( - streamId, data->computeChainDataLength(), &deliveryCallback); + ASSERT_TRUE( + client + ->registerDeliveryCallback( + streamId, data->computeChainDataLength(), &deliveryCallback) + .has_value()); EXPECT_CALL( deliveryCallback, onDeliveryAck(streamId, data->computeChainDataLength(), _)) @@ -3982,7 +4021,8 @@ TEST_F( client->createBidirectionalStream(false /* replaySafe */).value(); auto data = IOBuf::copyBuffer("some data"); - client->writeChain(streamId, data->clone(), true); + auto fizzClientWriteChain14 = + client->writeChain(streamId, data->clone(), true); loopForWrites(); verifyShortPackets(sentPackets); @@ -3998,7 +4038,8 @@ TEST_F( // Register a DeliveryCallback for an offset that's already delivered, will // callback immediately EXPECT_CALL(deliveryCallback, onDeliveryAck(streamId, 0, _)).Times(1); - client->registerDeliveryCallback(streamId, 0, &deliveryCallback); + auto fizzClientRegisterDelivery3 = + client->registerDeliveryCallback(streamId, 0, &deliveryCallback); eventbase_->loopOnce(); client->close(std::nullopt); } @@ -4011,7 +4052,8 @@ TEST_F(QuicClientTransportAfterStartTest, DeliveryCallbackFromWriteChain) { // Write 10 bytes of data, and write EOF on an empty stream. So EOF offset is // 10 auto data = test::buildRandomInputData(10); - client->writeChain(streamId, data->clone(), true, &deliveryCallback); + auto fizzClientWriteChain15 = + client->writeChain(streamId, data->clone(), true, &deliveryCallback); loopForWrites(); verifyShortPackets(sentPackets); @@ -4032,7 +4074,8 @@ TEST_F(QuicClientTransportAfterStartTest, DeliveryCallbackFromWriteChain) { TEST_F(QuicClientTransportAfterStartTest, NotifyPendingWrite) { NiceMock writeCallback; EXPECT_CALL(writeCallback, onConnectionWriteReady(_)); - client->notifyPendingWriteOnConnection(&writeCallback); + auto fizzClientNotifyPendingWrite1 = + client->notifyPendingWriteOnConnection(&writeCallback); loopForWrites(); client->close(std::nullopt); } @@ -4042,7 +4085,8 @@ TEST_F(QuicClientTransportAfterStartTest, SwitchEvbWhileAsyncEventPending) { EventBase evb2; auto qEvb2 = std::make_shared(&evb2); EXPECT_CALL(writeCallback, onConnectionWriteReady(_)).Times(0); - client->notifyPendingWriteOnConnection(&writeCallback); + auto fizzClientNotifyPendingWrite2 = + client->notifyPendingWriteOnConnection(&writeCallback); client->detachEventBase(); client->attachEventBase(qEvb2); loopForWrites(); @@ -4121,7 +4165,8 @@ TEST_F(QuicClientTransportVersionAndRetryTest, RetryPacket) { StreamId streamId = *client->createBidirectionalStream(); auto write = IOBuf::copyBuffer("ice cream"); - client->writeChain(streamId, write->clone(), true, nullptr); + auto fizzClientWriteChain16 = + client->writeChain(streamId, write->clone(), true, nullptr); loopForWrites(); std::unique_ptr bytesWrittenToNetwork = nullptr; @@ -4171,10 +4216,11 @@ TEST_F( VersionNegotiationPacketNotSupported) { StreamId streamId = *client->createBidirectionalStream(); - client->setReadCallback(streamId, &readCb); + auto fizzClientSetReadCallback23 = client->setReadCallback(streamId, &readCb); auto write = IOBuf::copyBuffer("no"); - client->writeChain(streamId, write->clone(), true, &deliveryCallback); + auto fizzClientWriteChain17 = + client->writeChain(streamId, write->clone(), true, &deliveryCallback); loopForWrites(); auto packet = VersionNegotiationPacketBuilder( *client->getConn().initialDestinationConnectionId, @@ -4198,10 +4244,11 @@ TEST_F( VersionNegotiationPacketCurrentVersion) { StreamId streamId = *client->createBidirectionalStream(); - client->setReadCallback(streamId, &readCb); + auto fizzClientSetReadCallback24 = client->setReadCallback(streamId, &readCb); auto write = IOBuf::copyBuffer("no"); - client->writeChain(streamId, write->clone(), true, &deliveryCallback); + auto fizzClientWriteChain18 = + client->writeChain(streamId, write->clone(), true, &deliveryCallback); loopForWrites(); auto packet = VersionNegotiationPacketBuilder( @@ -4331,11 +4378,13 @@ TEST_F(QuicClientTransportVersionAndRetryTest, FrameNotAllowed) { TEST_F(QuicClientTransportAfterStartTest, SendReset) { AckBlocks sentPackets; StreamId streamId = client->createBidirectionalStream().value(); - client->setReadCallback(streamId, &readCb); - client->registerDeliveryCallback(streamId, 100, &deliveryCallback); + auto fizzClientSetReadCallback25 = client->setReadCallback(streamId, &readCb); + auto fizzClientRegisterDelivery4 = + client->registerDeliveryCallback(streamId, 100, &deliveryCallback); EXPECT_CALL(deliveryCallback, onCanceled(streamId, 100)); EXPECT_CALL(readCb, readError(streamId, _)); - client->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN); + auto fizzClientResetStream1 = + client->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN); loopForWrites(); verifyShortPackets(sentPackets); @@ -4381,11 +4430,12 @@ RegularQuicWritePacket* findPacketWithStream( TEST_F(QuicClientTransportAfterStartTest, ResetClearsPendingLoss) { StreamId streamId = client->createBidirectionalStream().value(); - client->setReadCallback(streamId, &readCb); + auto fizzClientSetReadCallback26 = client->setReadCallback(streamId, &readCb); SCOPE_EXIT { client->close(std::nullopt); }; - client->writeChain(streamId, IOBuf::copyBuffer("hello"), true); + auto fizzClientWriteChain19 = + client->writeChain(streamId, IOBuf::copyBuffer("hello"), true); loopForWrites(); ASSERT_FALSE(client->getConn().outstandings.packets.empty()); @@ -4396,21 +4446,24 @@ TEST_F(QuicClientTransportAfterStartTest, ResetClearsPendingLoss) { ASSERT_FALSE(result.hasError()); ASSERT_TRUE(client->getConn().streamManager->hasLoss()); - client->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN); + auto fizzClientResetStream2 = + client->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN); ASSERT_FALSE(client->getConn().streamManager->hasLoss()); } TEST_F(QuicClientTransportAfterStartTest, LossAfterResetStream) { StreamId streamId = client->createBidirectionalStream().value(); - client->setReadCallback(streamId, &readCb); + auto fizzClientSetReadCallback27 = client->setReadCallback(streamId, &readCb); SCOPE_EXIT { client->close(std::nullopt); }; - client->writeChain(streamId, IOBuf::copyBuffer("hello"), true); + auto fizzClientWriteChain20 = + client->writeChain(streamId, IOBuf::copyBuffer("hello"), true); loopForWrites(); ASSERT_FALSE(client->getConn().outstandings.packets.empty()); - client->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN); + auto fizzClientResetStream3 = + client->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN); RegularQuicWritePacket* forceLossPacket = CHECK_NOTNULL(findPacketWithStream(client->getNonConstConn(), streamId)); @@ -4428,12 +4481,15 @@ TEST_F(QuicClientTransportAfterStartTest, LossAfterResetStream) { TEST_F(QuicClientTransportAfterStartTest, SendResetAfterEom) { AckBlocks sentPackets; StreamId streamId = client->createBidirectionalStream().value(); - client->setReadCallback(streamId, &readCb); - client->registerDeliveryCallback(streamId, 100, &deliveryCallback); + auto fizzClientSetReadCallback28 = client->setReadCallback(streamId, &readCb); + auto fizzClientRegisterDelivery5 = + client->registerDeliveryCallback(streamId, 100, &deliveryCallback); EXPECT_CALL(deliveryCallback, onCanceled(streamId, 100)); - client->writeChain(streamId, IOBuf::copyBuffer("hello"), true); + auto fizzClientWriteChain21 = + client->writeChain(streamId, IOBuf::copyBuffer("hello"), true); - client->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN); + auto fizzClientResetStream4 = + client->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN); loopForWrites(); verifyShortPackets(sentPackets); const auto& readCbs = client->getReadCallbacks(); @@ -4461,9 +4517,10 @@ TEST_F(QuicClientTransportAfterStartTest, HalfClosedLocalToClosed) { AckBlocks sentPackets; StreamId streamId = client->createBidirectionalStream().value(); - client->setReadCallback(streamId, &readCb); + auto fizzClientSetReadCallback29 = client->setReadCallback(streamId, &readCb); auto data = test::buildRandomInputData(10); - client->writeChain(streamId, data->clone(), true, &deliveryCallback); + auto fizzClientWriteChain22 = + client->writeChain(streamId, data->clone(), true, &deliveryCallback); loopForWrites(); verifyShortPackets(sentPackets); @@ -4515,13 +4572,17 @@ TEST_F(QuicClientTransportAfterStartTest, SendResetSyncOnAck) { NiceMock deliveryCallback2; auto data = IOBuf::copyBuffer("hello"); - client->writeChain(streamId, data->clone(), true, &deliveryCallback); - client->writeChain(streamId2, data->clone(), true, &deliveryCallback2); + auto fizzClientWriteChain23 = + client->writeChain(streamId, data->clone(), true, &deliveryCallback); + auto fizzClientWriteChain24 = + client->writeChain(streamId2, data->clone(), true, &deliveryCallback2); EXPECT_CALL(deliveryCallback, onDeliveryAck(streamId, _, _)) .WillOnce(Invoke([&](auto, auto, auto) { - client->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN); - client->resetStream(streamId2, GenericApplicationErrorCode::UNKNOWN); + auto fizzClientResetStream5 = + client->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN); + auto fizzClientResetStream6 = client->resetStream( + streamId2, GenericApplicationErrorCode::UNKNOWN); })); auto packet1 = packetToBuf(createStreamPacket( *serverChosenConnId /* src */, @@ -4566,7 +4627,7 @@ TEST_F(QuicClientTransportAfterStartTest, HalfClosedRemoteToClosed) { .transportSettings.removeStreamAfterEomCallbackUnset = true; StreamId streamId = client->createBidirectionalStream().value(); - client->setReadCallback(streamId, &readCb); + auto fizzClientSetReadCallback30 = client->setReadCallback(streamId, &readCb); auto data = test::buildRandomInputData(10); auto packet = packetToBuf(createStreamPacket( *serverChosenConnId /* src */, @@ -4595,7 +4656,8 @@ TEST_F(QuicClientTransportAfterStartTest, HalfClosedRemoteToClosed) { EXPECT_EQ(conn.streamManager->readableStreams().count(streamId), 0); AckBlocks sentPackets; - client->writeChain(streamId, data->clone(), true, &deliveryCallback); + auto fizzClientWriteChain25 = + client->writeChain(streamId, data->clone(), true, &deliveryCallback); loopForWrites(); verifyShortPackets(sentPackets); @@ -4712,13 +4774,14 @@ TEST_F(QuicClientTransportAfterStartTest, ReceiveApplicationCloseNoError) { TEST_F(QuicClientTransportAfterStartTest, DestroyWithoutClosing) { StreamId streamId = client->createBidirectionalStream().value(); - client->setReadCallback(streamId, &readCb); + auto fizzClientSetReadCallback31 = client->setReadCallback(streamId, &readCb); EXPECT_CALL(clientConnCallback, onConnectionError(_)).Times(0); EXPECT_CALL(clientConnCallback, onConnectionEnd()); auto write = IOBuf::copyBuffer("no"); - client->writeChain(streamId, write->clone(), true, &deliveryCallback); + auto fizzClientWriteChain26 = + client->writeChain(streamId, write->clone(), true, &deliveryCallback); loopForWrites(); EXPECT_CALL(deliveryCallback, onCanceled(_, _)); @@ -4728,10 +4791,11 @@ TEST_F(QuicClientTransportAfterStartTest, DestroyWithoutClosing) { TEST_F(QuicClientTransportAfterStartTest, DestroyWhileDraining) { StreamId streamId = client->createBidirectionalStream().value(); - client->setReadCallback(streamId, &readCb); + auto fizzClientSetReadCallback32 = client->setReadCallback(streamId, &readCb); auto write = IOBuf::copyBuffer("no"); - client->writeChain(streamId, write->clone(), true, &deliveryCallback); + auto fizzClientWriteChain27 = + client->writeChain(streamId, write->clone(), true, &deliveryCallback); loopForWrites(); EXPECT_CALL(clientConnCallback, onConnectionError(_)).Times(0); @@ -4782,10 +4846,11 @@ TEST_F(QuicClientTransportAfterStartTest, WriteThrowsExceptionWhileDraining) { TEST_F(QuicClientTransportAfterStartTest, DestroyEvbWhileLossTimeoutActive) { StreamId streamId = client->createBidirectionalStream().value(); - client->setReadCallback(streamId, &readCb); + auto fizzClientSetReadCallback33 = client->setReadCallback(streamId, &readCb); auto write = IOBuf::copyBuffer("no"); - client->writeChain(streamId, write->clone(), true); + auto fizzClientWriteChain28 = + client->writeChain(streamId, write->clone(), true); loopForWrites(); EXPECT_TRUE(client->lossTimeout().isTimerCallbackScheduled()); eventbase_.reset(); @@ -5238,7 +5303,8 @@ TEST_F(QuicZeroRttClientTest, TestReplaySafeCallback) { socketWrites.clear(); auto streamId = client->createBidirectionalStream().value(); - client->writeChain(streamId, IOBuf::copyBuffer("hello"), true); + auto fizzClientWriteChain29 = + client->writeChain(streamId, IOBuf::copyBuffer("hello"), true); loopForWrites(); EXPECT_TRUE(zeroRttPacketsOutstanding()); assertWritten(false, LongHeader::Types::ZeroRtt); @@ -5316,7 +5382,8 @@ TEST_F(QuicZeroRttClientTest, TestEarlyRetransmit0Rtt) { socketWrites.clear(); auto streamId = client->createBidirectionalStream().value(); - client->writeChain(streamId, IOBuf::copyBuffer("hello"), true); + auto fizzClientWriteChain30 = + client->writeChain(streamId, IOBuf::copyBuffer("hello"), true); loopForWrites(); EXPECT_TRUE(zeroRttPacketsOutstanding()); assertWritten(false, LongHeader::Types::ZeroRtt); @@ -5396,7 +5463,8 @@ TEST_F(QuicZeroRttClientTest, TestZeroRttRejection) { socketWrites.clear(); auto streamId = client->createBidirectionalStream().value(); - client->writeChain(streamId, IOBuf::copyBuffer("hello"), true); + auto fizzClientWriteChain31 = + client->writeChain(streamId, IOBuf::copyBuffer("hello"), true); loopForWrites(); EXPECT_TRUE(zeroRttPacketsOutstanding()); EXPECT_CALL(clientConnSetupCallback, onReplaySafe()); @@ -5449,7 +5517,8 @@ TEST_F(QuicZeroRttClientTest, TestZeroRttRejectionWithSmallerFlowControl) { mockClientHandshake->maxInitialStreamData = 10; socketWrites.clear(); auto streamId = client->createBidirectionalStream().value(); - client->writeChain(streamId, IOBuf::copyBuffer("hello"), true); + auto fizzClientWriteChain32 = + client->writeChain(streamId, IOBuf::copyBuffer("hello"), true); loopForWrites(); EXPECT_TRUE(zeroRttPacketsOutstanding()); mockClientHandshake->setZeroRttRejected( @@ -5491,7 +5560,8 @@ TEST_F(QuicZeroRttClientTest, TestZeroRttRejectionCannotResendZeroRttData) { socketWrites.clear(); auto streamId = client->createBidirectionalStream().value(); - client->writeChain(streamId, IOBuf::copyBuffer("hello"), true); + auto fizzClientWriteChain33 = + client->writeChain(streamId, IOBuf::copyBuffer("hello"), true); loopForWrites(); EXPECT_TRUE(zeroRttPacketsOutstanding()); EXPECT_CALL(clientConnSetupCallback, onReplaySafe()).Times(0); @@ -5512,48 +5582,49 @@ class QuicZeroRttHappyEyeballsClientTransportTest secondSock = secondSocket.get(); ON_CALL(*secondSock, address()).WillByDefault(testing::Return(serverAddr)); ON_CALL(*secondSock, setAdditionalCmsgsFunc(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, getGSO).WillByDefault(testing::Return(0)); ON_CALL(*secondSock, getGRO).WillByDefault(testing::Return(0)); ON_CALL(*secondSock, init(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, bind(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, connect(testing::_)) - .WillByDefault(testing::Return(folly::unit)); - ON_CALL(*secondSock, close()).WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); + ON_CALL(*secondSock, close()) + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, resumeWrite(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, setGRO(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, setRecvTos(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, getRecvTos()).WillByDefault(testing::Return(false)); ON_CALL(*secondSock, setTosOrTrafficClass(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, setCmsgs(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, appendCmsgs(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, getTimestamping()).WillByDefault(testing::Return(0)); ON_CALL(*secondSock, setReuseAddr(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, setDFAndTurnOffPMTU()) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, setAdditionalCmsgsFunc(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, setErrMessageCallback(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, applyOptions(testing::_, testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, setReusePort(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, setRcvBuf(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, setSndBuf(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*secondSock, setFD(testing::_, testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); client->setHappyEyeballsEnabled(true); client->addNewPeerAddress(firstAddress); client->addNewPeerAddress(secondAddress); @@ -5625,7 +5696,8 @@ TEST_F( client->happyEyeballsConnAttemptDelayTimeout().cancelTimerCallback(); auto streamId = client->createBidirectionalStream().value(); - client->writeChain(streamId, IOBuf::copyBuffer("hello"), true); + auto fizzClientWriteChain34 = + client->writeChain(streamId, IOBuf::copyBuffer("hello"), true); loopForWrites(); EXPECT_TRUE(zeroRttPacketsOutstanding()); assertWritten(false, LongHeader::Types::ZeroRtt); @@ -5720,7 +5792,8 @@ TEST_F( return -1; })); auto streamId = client->createBidirectionalStream().value(); - client->writeChain(streamId, IOBuf::copyBuffer("hello"), true); + auto fizzClientWriteChain35 = + client->writeChain(streamId, IOBuf::copyBuffer("hello"), true); loopForWrites(); EXPECT_FALSE(zeroRttPacketsOutstanding()); ASSERT_FALSE(client->happyEyeballsConnAttemptDelayTimeout() @@ -6106,8 +6179,8 @@ TEST(AsyncUDPSocketTest, CloseMultipleTimes) { .hasError()); socket.pauseRead(); - socket.close(); + ASSERT_TRUE(socket.close().has_value()); socket.pauseRead(); - socket.close(); + ASSERT_TRUE(socket.close().has_value()); } } // namespace quic::test diff --git a/quic/fizz/client/test/QuicClientTransportTestUtil.h b/quic/fizz/client/test/QuicClientTransportTestUtil.h index dd453b9fd..999d729b3 100644 --- a/quic/fizz/client/test/QuicClientTransportTestUtil.h +++ b/quic/fizz/client/test/QuicClientTransportTestUtil.h @@ -169,7 +169,7 @@ class FakeOneRttHandshakeLayer : public FizzClientHandshake { std::move(fizzContext), std::make_unique()) {} - folly::Expected, QuicError> + quic::Expected, QuicError> connectImpl(Optional hostname) override { // Look up psk auto quicCachedPsk = getPsk(hostname); @@ -325,7 +325,7 @@ class FakeOneRttHandshakeLayer : public FizzClientHandshake { } } - folly::Expected doHandshake( + quic::Expected doHandshake( std::unique_ptr buf, EncryptionLevel level) override { EXPECT_EQ(writeBuf.get(), nullptr); @@ -346,7 +346,7 @@ class FakeOneRttHandshakeLayer : public FizzClientHandshake { handshakeInitiated(); } readBuffers[level].append(std::move(buf)); - return folly::unit; + return {}; } bool connectInvoked() { @@ -358,7 +358,7 @@ class FakeOneRttHandshakeLayer : public FizzClientHandshake { return params_; } - folly::Expected getNextTrafficSecret( + quic::Expected getNextTrafficSecret( ByteRange /*secret*/) const override { return folly::IOBuf::copyBuffer(getRandSecret()); } @@ -412,13 +412,13 @@ class FakeOneRttHandshakeLayer : public FizzClientHandshake { throw std::runtime_error("matchEarlyParameters not implemented"); } - folly::Expected, QuicError> buildAead( + quic::Expected, QuicError> buildAead( CipherKind, ByteRange) override { return createNoOpAead(); } - folly::Expected, QuicError> + quic::Expected, QuicError> buildHeaderCipher(ByteRange) override { return createNoOpHeaderCipher(); } @@ -475,8 +475,9 @@ class QuicClientTransportTestBase : public virtual testing::Test { qEvb_); sock = socket.get(); EXPECT_CALL(*sock, setAdditionalCmsgsFunc(testing::_)) - .WillRepeatedly(testing::Return(folly::unit)); - EXPECT_CALL(*sock, close()).WillRepeatedly(testing::Return(folly::unit)); + .WillRepeatedly(testing::Return(quic::Expected{})); + EXPECT_CALL(*sock, close()) + .WillRepeatedly(testing::Return(quic::Expected{})); client = TestingQuicClientTransport::newClient( qEvb_, std::move(socket), getFizzClientContext()); @@ -529,40 +530,41 @@ class QuicClientTransportTestBase : public virtual testing::Test { ON_CALL(*sock, getGRO()).WillByDefault(testing::Return(0)); ON_CALL(*sock, getTimestamping()).WillByDefault(testing::Return(0)); ON_CALL(*sock, setTosOrTrafficClass(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, init(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, bind(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, connect(testing::_)) - .WillByDefault(testing::Return(folly::unit)); - ON_CALL(*sock, close()).WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); + ON_CALL(*sock, close()) + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, setReuseAddr(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, setDFAndTurnOffPMTU()) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, setErrMessageCallback(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, applyOptions(testing::_, testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, setReusePort(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, setRcvBuf(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, setSndBuf(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, resumeWrite(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, setGRO(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, setRecvTos(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, setCmsgs(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, appendCmsgs(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, setFD(testing::_, testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); EXPECT_EQ(client->getConn().selfConnectionIds.size(), 1); EXPECT_EQ( client->getConn().selfConnectionIds[0].connId, @@ -1038,13 +1040,13 @@ class QuicClientTransportTestBase : public virtual testing::Test { auto initialReadCipher = cryptoFactory.getClientInitialCipher( *client->getConn().initialDestinationConnectionId, QuicVersion::MVFST); - CHECK(initialReadCipher.hasValue()); + CHECK(initialReadCipher.has_value()); codec->setInitialReadCipher(std::move(initialReadCipher.value())); auto initialHeaderCipher = cryptoFactory.makeClientInitialHeaderCipher( *client->getConn().initialDestinationConnectionId, QuicVersion::MVFST); - CHECK(initialHeaderCipher.hasValue()); + CHECK(initialHeaderCipher.has_value()); codec->setInitialHeaderCipher(std::move(initialHeaderCipher.value())); codec->setHandshakeReadCipher(test::createNoOpAead()); diff --git a/quic/fizz/handshake/FizzBridge.h b/quic/fizz/handshake/FizzBridge.h index f132f9242..8f6ed21ae 100644 --- a/quic/fizz/handshake/FizzBridge.h +++ b/quic/fizz/handshake/FizzBridge.h @@ -32,9 +32,9 @@ class FizzAead final : public Aead { /** * Forward calls to fizz::Aead, catching any exceptions and converting them to - * folly::Expected. + * quic::Expected. */ - folly::Expected, QuicError> inplaceEncrypt( + quic::Expected, QuicError> inplaceEncrypt( std::unique_ptr&& plaintext, const folly::IOBuf* associatedData, uint64_t seqNum) const override { @@ -42,7 +42,7 @@ class FizzAead final : public Aead { return fizzAead->inplaceEncrypt( std::move(plaintext), associatedData, seqNum); } catch (const std::exception& ex) { - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(TransportErrorCode::INTERNAL_ERROR, ex.what())); } } diff --git a/quic/fizz/handshake/FizzCryptoFactory.cpp b/quic/fizz/handshake/FizzCryptoFactory.cpp index 4bc5e3004..3edf344ab 100644 --- a/quic/fizz/handshake/FizzCryptoFactory.cpp +++ b/quic/fizz/handshake/FizzCryptoFactory.cpp @@ -14,7 +14,7 @@ namespace quic { -folly::Expected FizzCryptoFactory::makeInitialTrafficSecret( +quic::Expected FizzCryptoFactory::makeInitialTrafficSecret( folly::StringPiece label, const ConnectionId& clientDestinationConnId, QuicVersion version) const { @@ -31,15 +31,15 @@ folly::Expected FizzCryptoFactory::makeInitialTrafficSecret( return trafficSecret; } -folly::Expected, QuicError> +quic::Expected, QuicError> FizzCryptoFactory::makeInitialAead( folly::StringPiece label, const ConnectionId& clientDestinationConnId, QuicVersion version) const { auto trafficSecretResult = makeInitialTrafficSecret(label, clientDestinationConnId, version); - if (trafficSecretResult.hasError()) { - return folly::makeUnexpected(trafficSecretResult.error()); + if (!trafficSecretResult.has_value()) { + return quic::make_unexpected(trafficSecretResult.error()); } auto& trafficSecret = trafficSecretResult.value(); @@ -64,12 +64,12 @@ FizzCryptoFactory::makeInitialAead( return FizzAead::wrap(std::move(aead)); } -folly::Expected, QuicError> +quic::Expected, QuicError> FizzCryptoFactory::makePacketNumberCipher(ByteRange baseSecret) const { auto pnCipherResult = makePacketNumberCipher(fizz::CipherSuite::TLS_AES_128_GCM_SHA256); - if (pnCipherResult.hasError()) { - return folly::makeUnexpected(pnCipherResult.error()); + if (!pnCipherResult.has_value()) { + return quic::make_unexpected(pnCipherResult.error()); } auto pnCipher = std::move(pnCipherResult.value()); @@ -78,13 +78,13 @@ FizzCryptoFactory::makePacketNumberCipher(ByteRange baseSecret) const { auto pnKey = deriver->expandLabel( baseSecret, kQuicPNLabel, BufHelpers::create(0), pnCipher->keyLength()); auto setKeyResult = pnCipher->setKey(pnKey->coalesce()); - if (setKeyResult.hasError()) { - return folly::makeUnexpected(setKeyResult.error()); + if (!setKeyResult.has_value()) { + return quic::make_unexpected(setKeyResult.error()); } return pnCipher; } -folly::Expected, QuicError> +quic::Expected, QuicError> FizzCryptoFactory::makePacketNumberCipher(fizz::CipherSuite cipher) const { switch (cipher) { case fizz::CipherSuite::TLS_AES_128_GCM_SHA256: @@ -92,7 +92,7 @@ FizzCryptoFactory::makePacketNumberCipher(fizz::CipherSuite cipher) const { case fizz::CipherSuite::TLS_AES_256_GCM_SHA384: return std::make_unique(); default: - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::INTERNAL_ERROR, "Packet number cipher not implemented")); } diff --git a/quic/fizz/handshake/FizzCryptoFactory.h b/quic/fizz/handshake/FizzCryptoFactory.h index c022af1f6..93b6045de 100644 --- a/quic/fizz/handshake/FizzCryptoFactory.h +++ b/quic/fizz/handshake/FizzCryptoFactory.h @@ -16,21 +16,21 @@ class FizzCryptoFactory : public CryptoFactory { public: FizzCryptoFactory() : fizzFactory_{std::make_shared()} {} - [[nodiscard]] folly::Expected makeInitialTrafficSecret( + [[nodiscard]] quic::Expected makeInitialTrafficSecret( folly::StringPiece label, const ConnectionId& clientDestinationConnId, QuicVersion version) const override; - [[nodiscard]] folly::Expected, QuicError> + [[nodiscard]] quic::Expected, QuicError> makeInitialAead( folly::StringPiece label, const ConnectionId& clientDestinationConnId, QuicVersion version) const override; - [[nodiscard]] folly::Expected, QuicError> + [[nodiscard]] quic::Expected, QuicError> makePacketNumberCipher(ByteRange baseSecret) const override; - [[nodiscard]] virtual folly:: + [[nodiscard]] virtual quic:: Expected, QuicError> makePacketNumberCipher(fizz::CipherSuite cipher) const; diff --git a/quic/fizz/handshake/FizzPacketNumberCipher.cpp b/quic/fizz/handshake/FizzPacketNumberCipher.cpp index 41f098576..fd08d6884 100644 --- a/quic/fizz/handshake/FizzPacketNumberCipher.cpp +++ b/quic/fizz/handshake/FizzPacketNumberCipher.cpp @@ -9,26 +9,26 @@ namespace quic { -static folly::Expected setKeyImpl( +static quic::Expected setKeyImpl( folly::ssl::EvpCipherCtxUniquePtr& context, const EVP_CIPHER* cipher, ByteRange key) { DCHECK_EQ(key.size(), EVP_CIPHER_key_length(cipher)); context.reset(EVP_CIPHER_CTX_new()); if (context == nullptr) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::INTERNAL_ERROR, "Unable to allocate an EVP_CIPHER_CTX object")); } if (EVP_EncryptInit_ex(context.get(), cipher, nullptr, key.data(), nullptr) != 1) { - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(TransportErrorCode::INTERNAL_ERROR, "Init error")); } - return folly::unit; + return {}; } -static folly::Expected maskImpl( +static quic::Expected maskImpl( const folly::ssl::EvpCipherCtxUniquePtr& context, ByteRange sample) { HeaderProtectionMask outMask; @@ -41,19 +41,19 @@ static folly::Expected maskImpl( sample.data(), static_cast(sample.size())) != 1 || static_cast(outLen) != outMask.size()) { - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(TransportErrorCode::INTERNAL_ERROR, "Encryption error")); } return outMask; } -folly::Expected Aes128PacketNumberCipher::setKey( +quic::Expected Aes128PacketNumberCipher::setKey( ByteRange key) { pnKey_ = BufHelpers::copyBuffer(key); return setKeyImpl(encryptCtx_, EVP_aes_128_ecb(), key); } -folly::Expected Aes256PacketNumberCipher::setKey( +quic::Expected Aes256PacketNumberCipher::setKey( ByteRange key) { pnKey_ = BufHelpers::copyBuffer(key); return setKeyImpl(encryptCtx_, EVP_aes_256_ecb(), key); @@ -67,12 +67,12 @@ const BufPtr& Aes256PacketNumberCipher::getKey() const { return pnKey_; } -folly::Expected Aes128PacketNumberCipher::mask( +quic::Expected Aes128PacketNumberCipher::mask( ByteRange sample) const { return maskImpl(encryptCtx_, sample); } -folly::Expected Aes256PacketNumberCipher::mask( +quic::Expected Aes256PacketNumberCipher::mask( ByteRange sample) const { return maskImpl(encryptCtx_, sample); } diff --git a/quic/fizz/handshake/FizzPacketNumberCipher.h b/quic/fizz/handshake/FizzPacketNumberCipher.h index e35befae4..29958138a 100644 --- a/quic/fizz/handshake/FizzPacketNumberCipher.h +++ b/quic/fizz/handshake/FizzPacketNumberCipher.h @@ -17,12 +17,11 @@ class Aes128PacketNumberCipher : public PacketNumberCipher { public: ~Aes128PacketNumberCipher() override = default; - [[nodiscard]] folly::Expected setKey( - ByteRange key) override; + [[nodiscard]] quic::Expected setKey(ByteRange key) override; [[nodiscard]] const BufPtr& getKey() const override; - [[nodiscard]] folly::Expected mask( + [[nodiscard]] quic::Expected mask( ByteRange sample) const override; [[nodiscard]] size_t keyLength() const override; @@ -37,12 +36,11 @@ class Aes256PacketNumberCipher : public PacketNumberCipher { public: ~Aes256PacketNumberCipher() override = default; - [[nodiscard]] folly::Expected setKey( - ByteRange key) override; + [[nodiscard]] quic::Expected setKey(ByteRange key) override; [[nodiscard]] const BufPtr& getKey() const override; - [[nodiscard]] folly::Expected mask( + [[nodiscard]] quic::Expected mask( ByteRange sample) const override; [[nodiscard]] size_t keyLength() const override; diff --git a/quic/fizz/handshake/test/FizzCryptoFactoryTest.cpp b/quic/fizz/handshake/test/FizzCryptoFactoryTest.cpp index 534351311..78cdd690e 100644 --- a/quic/fizz/handshake/test/FizzCryptoFactoryTest.cpp +++ b/quic/fizz/handshake/test/FizzCryptoFactoryTest.cpp @@ -49,9 +49,9 @@ class FizzCryptoFactoryTest : public Test { std::unique_ptr createMockPacketNumberCipher() { auto mockPacketNumberCipher = std::make_unique(); EXPECT_CALL(*mockPacketNumberCipher, setKey(_)) - .WillOnce(Invoke([&](ByteRange key) { + .WillOnce(Invoke([&](ByteRange key) -> quic::Expected { packetCipherKey_ = folly::IOBuf::copyBuffer(key); - return folly::Expected(folly::unit); + return {}; })); EXPECT_CALL(*mockPacketNumberCipher, keyLength()) .WillRepeatedly(Return(fizz::AESGCM128::kKeyLength)); diff --git a/quic/fizz/server/handshake/FizzServerHandshake.cpp b/quic/fizz/server/handshake/FizzServerHandshake.cpp index b1ceae184..f575bcef2 100644 --- a/quic/fizz/server/handshake/FizzServerHandshake.cpp +++ b/quic/fizz/server/handshake/FizzServerHandshake.cpp @@ -97,7 +97,7 @@ std::unique_ptr FizzServerHandshake::buildAead(ByteRange secret) { kQuicIVLabel)); } -folly::Expected, QuicError> +quic::Expected, QuicError> FizzServerHandshake::buildHeaderCipher(ByteRange secret) { return cryptoFactory_->makePacketNumberCipher(secret); } diff --git a/quic/fizz/server/handshake/FizzServerHandshake.h b/quic/fizz/server/handshake/FizzServerHandshake.h index 2638849ef..5fcf83954 100644 --- a/quic/fizz/server/handshake/FizzServerHandshake.h +++ b/quic/fizz/server/handshake/FizzServerHandshake.h @@ -40,7 +40,7 @@ class FizzServerHandshake : public ServerHandshake { EncryptionLevel getReadRecordLayerEncryptionLevel() override; void processSocketData(folly::IOBufQueue& queue) override; std::unique_ptr buildAead(ByteRange secret) override; - [[nodiscard]] folly::Expected, QuicError> + [[nodiscard]] quic::Expected, QuicError> buildHeaderCipher(ByteRange secret) override; BufPtr getNextTrafficSecret(ByteRange secret) const override; diff --git a/quic/flowcontrol/BUCK b/quic/flowcontrol/BUCK index 1bbd4af1d..2450674da 100644 --- a/quic/flowcontrol/BUCK +++ b/quic/flowcontrol/BUCK @@ -15,6 +15,7 @@ mvfst_cpp_library( ], exported_deps = [ "//quic/codec:types", + "//quic/common:expected", "//quic/state:quic_state_machine", ], ) diff --git a/quic/flowcontrol/QuicFlowController.cpp b/quic/flowcontrol/QuicFlowController.cpp index ac6d20646..21c5ef48b 100644 --- a/quic/flowcontrol/QuicFlowController.cpp +++ b/quic/flowcontrol/QuicFlowController.cpp @@ -57,27 +57,29 @@ Optional calculateNewWindowUpdate( } template -[[nodiscard]] inline folly::Expected -incrementWithOverFlowCheck(T& num, T diff) { +[[nodiscard]] inline quic::Expected incrementWithOverFlowCheck( + T& num, + T diff) { if (num > std::numeric_limits::max() - diff) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(LocalErrorCode::INTERNAL_ERROR), "flow control state overflow")); } num += diff; - return folly::unit; + return {}; } template -[[nodiscard]] inline folly::Expected -decrementWithOverFlowCheck(T& num, T diff) { +[[nodiscard]] inline quic::Expected decrementWithOverFlowCheck( + T& num, + T diff) { if (num < std::numeric_limits::min() + diff) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(LocalErrorCode::INTERNAL_ERROR), "flow control state overflow")); } num -= diff; - return folly::unit; + return {}; } inline uint64_t calculateMaximumData(const QuicStreamState& stream) { @@ -186,12 +188,12 @@ bool maybeSendStreamWindowUpdate( return false; } -folly::Expected updateFlowControlOnStreamData( +quic::Expected updateFlowControlOnStreamData( QuicStreamState& stream, uint64_t previousMaxOffsetObserved, uint64_t bufferEndOffset) { if (stream.flowControlState.advertisedMaxOffset < bufferEndOffset) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::FLOW_CONTROL_ERROR, fmt::format("Stream flow control violation on stream {}", stream.id))); } @@ -201,11 +203,11 @@ folly::Expected updateFlowControlOnStreamData( uint64_t connMaxObservedOffset = connFlowControlState.sumMaxObservedOffset; auto incrementResult = incrementWithOverFlowCheck( connMaxObservedOffset, curMaxOffsetObserved - previousMaxOffsetObserved); - if (incrementResult.hasError()) { + if (!incrementResult.has_value()) { return incrementResult; } if (connMaxObservedOffset > connFlowControlState.advertisedMaxOffset) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::FLOW_CONTROL_ERROR, "Connection flow control violation")); } @@ -214,7 +216,7 @@ folly::Expected updateFlowControlOnStreamData( curMaxOffsetObserved - previousMaxOffsetObserved); } -folly::Expected updateFlowControlOnRead( +quic::Expected updateFlowControlOnRead( QuicStreamState& stream, uint64_t lastReadOffset, TimePoint readTime) { @@ -233,7 +235,7 @@ folly::Expected updateFlowControlOnRead( } auto incrementResult = incrementWithOverFlowCheck( stream.conn.flowControlState.sumCurReadOffset, diff); - if (incrementResult.hasError()) { + if (!incrementResult.has_value()) { return incrementResult; } if (maybeSendConnWindowUpdate(stream.conn, readTime)) { @@ -248,10 +250,10 @@ folly::Expected updateFlowControlOnRead( << " maxOffset=" << stream.flowControlState.advertisedMaxOffset << " window=" << stream.flowControlState.windowSize; } - return folly::unit; + return {}; } -folly::Expected updateFlowControlOnReceiveReset( +quic::Expected updateFlowControlOnReceiveReset( QuicStreamState& stream, TimePoint resetTime) { CHECK(stream.reliableSizeFromPeer.has_value()) @@ -268,7 +270,7 @@ folly::Expected updateFlowControlOnReceiveReset( stream.currentReadOffset = *stream.finalReadOffset; auto incrementResult = incrementWithOverFlowCheck( stream.conn.flowControlState.sumCurReadOffset, diff); - if (incrementResult.hasError()) { + if (!incrementResult.has_value()) { return incrementResult; } if (maybeSendConnWindowUpdate(stream.conn, resetTime)) { @@ -279,15 +281,15 @@ folly::Expected updateFlowControlOnReceiveReset( << " window=" << stream.conn.flowControlState.windowSize; } } - return folly::unit; + return {}; } -folly::Expected updateFlowControlOnWriteToSocket( +quic::Expected updateFlowControlOnWriteToSocket( QuicStreamState& stream, uint64_t length) { auto incrementResult = incrementWithOverFlowCheck( stream.conn.flowControlState.sumCurWriteOffset, length); - if (incrementResult.hasError()) { + if (!incrementResult.has_value()) { return incrementResult; } DCHECK_GE(stream.conn.flowControlState.sumCurStreamBufferLen, length); @@ -300,17 +302,17 @@ folly::Expected updateFlowControlOnWriteToSocket( } QUIC_STATS(stream.conn.statsCallback, onConnFlowControlBlocked); } - return folly::unit; + return {}; } -folly::Expected updateFlowControlOnWriteToStream( +quic::Expected updateFlowControlOnWriteToStream( QuicStreamState& stream, uint64_t length) { return incrementWithOverFlowCheck( stream.conn.flowControlState.sumCurStreamBufferLen, length); } -folly::Expected updateFlowControlOnResetStream( +quic::Expected updateFlowControlOnResetStream( QuicStreamState& stream, Optional reliableSize) { uint64_t decrementAmount = 0; diff --git a/quic/flowcontrol/QuicFlowController.h b/quic/flowcontrol/QuicFlowController.h index 91eab7269..5b1c886ca 100644 --- a/quic/flowcontrol/QuicFlowController.h +++ b/quic/flowcontrol/QuicFlowController.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include namespace quic { @@ -38,28 +39,29 @@ bool maybeSendStreamWindowUpdate(QuicStreamState& stream, TimePoint updateTime); * before receiving the data. bufferEndOffset is the end offset of the current * buffer. */ -[[nodiscard]] folly::Expected -updateFlowControlOnStreamData( +[[nodiscard]] quic::Expected updateFlowControlOnStreamData( QuicStreamState& stream, uint64_t previousMaxOffsetObserved, uint64_t bufferEndOffset); -[[nodiscard]] folly::Expected updateFlowControlOnRead( +[[nodiscard]] quic::Expected updateFlowControlOnRead( QuicStreamState& stream, uint64_t lastReadOffset, TimePoint readTime); -[[nodiscard]] folly::Expected -updateFlowControlOnReceiveReset(QuicStreamState& stream, TimePoint resetTime); +[[nodiscard]] quic::Expected updateFlowControlOnReceiveReset( + QuicStreamState& stream, + TimePoint resetTime); -[[nodiscard]] folly::Expected -updateFlowControlOnWriteToSocket(QuicStreamState& stream, uint64_t length); +[[nodiscard]] quic::Expected updateFlowControlOnWriteToSocket( + QuicStreamState& stream, + uint64_t length); -[[nodiscard]] folly::Expected -updateFlowControlOnWriteToStream(QuicStreamState& stream, uint64_t length); +[[nodiscard]] quic::Expected updateFlowControlOnWriteToStream( + QuicStreamState& stream, + uint64_t length); -[[nodiscard]] folly::Expected -updateFlowControlOnResetStream( +[[nodiscard]] quic::Expected updateFlowControlOnResetStream( QuicStreamState& stream, Optional reliableSize = std::nullopt); diff --git a/quic/handshake/Aead.h b/quic/handshake/Aead.h index 4477db478..7270a0b0d 100644 --- a/quic/handshake/Aead.h +++ b/quic/handshake/Aead.h @@ -7,9 +7,9 @@ #pragma once -#include #include #include +#include #include namespace quic { @@ -29,15 +29,14 @@ class Aead { virtual Optional getKey() const = 0; /** - * Encrypts plaintext inplace. Returns folly::Expected with the encrypted + * Encrypts plaintext inplace. Returns quic::Expected with the encrypted * buffer or an error. */ - [[nodiscard]] virtual folly:: - Expected, QuicError> - inplaceEncrypt( - std::unique_ptr&& plaintext, - const folly::IOBuf* associatedData, - uint64_t seqNum) const = 0; + [[nodiscard]] virtual quic::Expected, QuicError> + inplaceEncrypt( + std::unique_ptr&& plaintext, + const folly::IOBuf* associatedData, + uint64_t seqNum) const = 0; /** * Decrypt ciphertext. Will throw if the ciphertext does not decrypt diff --git a/quic/handshake/BUCK b/quic/handshake/BUCK index 7291850b6..0497162e6 100644 --- a/quic/handshake/BUCK +++ b/quic/handshake/BUCK @@ -8,9 +8,9 @@ mvfst_cpp_library( "Aead.h", ], exported_deps = [ - "//folly:expected", "//folly/io:iobuf", "//quic:exception", + "//quic/common:expected", "//quic/common:optional", ], ) @@ -27,11 +27,11 @@ mvfst_cpp_library( ], exported_deps = [ ":aead", - "//folly:expected", "//quic:constants", "//quic:exception", "//quic/codec:packet_number_cipher", "//quic/codec:types", + "//quic/common:expected", ], ) @@ -48,10 +48,10 @@ mvfst_cpp_library( "//quic/state:quic_state_machine", ], exported_deps = [ - "//folly:expected", "//quic:constants", "//quic:exception", "//quic/codec:types", + "//quic/common:expected", ], ) diff --git a/quic/handshake/CryptoFactory.cpp b/quic/handshake/CryptoFactory.cpp index d1b018f82..07ed324d6 100644 --- a/quic/handshake/CryptoFactory.cpp +++ b/quic/handshake/CryptoFactory.cpp @@ -11,60 +11,68 @@ namespace quic { -folly::Expected, QuicError> +quic::Expected, QuicError> CryptoFactory::getClientInitialCipher( const ConnectionId& clientDestinationConnId, QuicVersion version) const { return makeInitialAead(kClientInitialLabel, clientDestinationConnId, version); } -folly::Expected, QuicError> +quic::Expected, QuicError> CryptoFactory::getServerInitialCipher( const ConnectionId& clientDestinationConnId, QuicVersion version) const { return makeInitialAead(kServerInitialLabel, clientDestinationConnId, version); } -folly::Expected -CryptoFactory::makeServerInitialTrafficSecret( +quic::Expected CryptoFactory::makeServerInitialTrafficSecret( const ConnectionId& clientDestinationConnId, QuicVersion version) const { return makeInitialTrafficSecret( kServerInitialLabel, clientDestinationConnId, version); } -folly::Expected -CryptoFactory::makeClientInitialTrafficSecret( +quic::Expected CryptoFactory::makeClientInitialTrafficSecret( const ConnectionId& clientDestinationConnId, QuicVersion version) const { return makeInitialTrafficSecret( kClientInitialLabel, clientDestinationConnId, version); } -folly::Expected, QuicError> +quic::Expected, QuicError> CryptoFactory::makeClientInitialHeaderCipher( const ConnectionId& initialDestinationConnectionId, QuicVersion version) const { auto clientInitialTrafficSecretResult = makeClientInitialTrafficSecret(initialDestinationConnectionId, version); - if (clientInitialTrafficSecretResult.hasError()) { - return folly::makeUnexpected(clientInitialTrafficSecretResult.error()); + if (!clientInitialTrafficSecretResult.has_value()) { + return quic::make_unexpected(clientInitialTrafficSecretResult.error()); } auto& clientInitialTrafficSecret = clientInitialTrafficSecretResult.value(); - return makePacketNumberCipher(clientInitialTrafficSecret->coalesce()); + auto packetNumberCipherResult = + makePacketNumberCipher(clientInitialTrafficSecret->coalesce()); + if (!packetNumberCipherResult.has_value()) { + return quic::make_unexpected(packetNumberCipherResult.error()); + } + return std::move(packetNumberCipherResult.value()); } -folly::Expected, QuicError> +quic::Expected, QuicError> CryptoFactory::makeServerInitialHeaderCipher( const ConnectionId& initialDestinationConnectionId, QuicVersion version) const { auto serverInitialTrafficSecretResult = makeServerInitialTrafficSecret(initialDestinationConnectionId, version); - if (serverInitialTrafficSecretResult.hasError()) { - return folly::makeUnexpected(serverInitialTrafficSecretResult.error()); + if (!serverInitialTrafficSecretResult.has_value()) { + return quic::make_unexpected(serverInitialTrafficSecretResult.error()); } auto& serverInitialTrafficSecret = serverInitialTrafficSecretResult.value(); - return makePacketNumberCipher(serverInitialTrafficSecret->coalesce()); + auto packetNumberCipherResult = + makePacketNumberCipher(serverInitialTrafficSecret->coalesce()); + if (!packetNumberCipherResult.has_value()) { + return quic::make_unexpected(packetNumberCipherResult.error()); + } + return std::move(packetNumberCipherResult.value()); } } // namespace quic diff --git a/quic/handshake/CryptoFactory.h b/quic/handshake/CryptoFactory.h index 6317188c2..ca74da635 100644 --- a/quic/handshake/CryptoFactory.h +++ b/quic/handshake/CryptoFactory.h @@ -7,12 +7,12 @@ #pragma once -#include #include #include #include #include #include +#include #include #include @@ -21,21 +21,21 @@ namespace quic { class CryptoFactory { public: - [[nodiscard]] folly::Expected, QuicError> + [[nodiscard]] quic::Expected, QuicError> getClientInitialCipher( const ConnectionId& clientDestinationConnId, QuicVersion version) const; - [[nodiscard]] folly::Expected, QuicError> + [[nodiscard]] quic::Expected, QuicError> getServerInitialCipher( const ConnectionId& clientDestinationConnId, QuicVersion version) const; - [[nodiscard]] folly::Expected + [[nodiscard]] quic::Expected makeServerInitialTrafficSecret( const ConnectionId& clientDestinationConnId, QuicVersion version) const; - [[nodiscard]] folly::Expected + [[nodiscard]] quic::Expected makeClientInitialTrafficSecret( const ConnectionId& clientDestinationConnId, QuicVersion version) const; @@ -43,7 +43,7 @@ class CryptoFactory { /** * Makes the header cipher for writing client initial packets. */ - [[nodiscard]] folly::Expected, QuicError> + [[nodiscard]] quic::Expected, QuicError> makeClientInitialHeaderCipher( const ConnectionId& initialDestinationConnectionId, QuicVersion version) const; @@ -51,7 +51,7 @@ class CryptoFactory { /** * Makes the header cipher for writing server initial packets. */ - [[nodiscard]] folly::Expected, QuicError> + [[nodiscard]] quic::Expected, QuicError> makeServerInitialHeaderCipher( const ConnectionId& initialDestinationConnectionId, QuicVersion version) const; @@ -59,19 +59,19 @@ class CryptoFactory { /** * Crypto layer specific methods. */ - [[nodiscard]] virtual folly::Expected + [[nodiscard]] virtual quic::Expected makeInitialTrafficSecret( folly::StringPiece label, const ConnectionId& clientDestinationConnId, QuicVersion version) const = 0; - [[nodiscard]] virtual folly::Expected, QuicError> + [[nodiscard]] virtual quic::Expected, QuicError> makeInitialAead( folly::StringPiece label, const ConnectionId& clientDestinationConnId, QuicVersion version) const = 0; - [[nodiscard]] virtual folly:: + [[nodiscard]] virtual quic:: Expected, QuicError> makePacketNumberCipher(ByteRange baseSecret) const = 0; diff --git a/quic/handshake/HandshakeLayer.h b/quic/handshake/HandshakeLayer.h index 1ee335d35..3497d15a9 100644 --- a/quic/handshake/HandshakeLayer.h +++ b/quic/handshake/HandshakeLayer.h @@ -29,7 +29,7 @@ class Handshake { * one rtt read cipher using the current traffic secret and advance the * traffic secret. */ - [[nodiscard]] virtual folly::Expected, QuicError> + [[nodiscard]] virtual quic::Expected, QuicError> getNextOneRttReadCipher() = 0; /** @@ -37,7 +37,7 @@ class Handshake { * one rtt write cipher using the current traffic secret and advance the * traffic secret. */ - [[nodiscard]] virtual folly::Expected, QuicError> + [[nodiscard]] virtual quic::Expected, QuicError> getNextOneRttWriteCipher() = 0; /* diff --git a/quic/handshake/TransportParameters.cpp b/quic/handshake/TransportParameters.cpp index 1639cdaa1..05d7a1ff5 100644 --- a/quic/handshake/TransportParameters.cpp +++ b/quic/handshake/TransportParameters.cpp @@ -12,7 +12,7 @@ namespace quic { -folly::Expected, QuicError> getIntegerParameter( +quic::Expected, QuicError> getIntegerParameter( TransportParameterId id, const std::vector& parameters) { auto it = findParameter(parameters, id); @@ -22,7 +22,7 @@ folly::Expected, QuicError> getIntegerParameter( auto parameterCursor = Cursor(it->value.get()); auto parameter = decodeQuicInteger(parameterCursor); if (!parameter) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::TRANSPORT_PARAMETER_ERROR, fmt::format( "Failed to decode integer from TransportParameterId: {}", @@ -31,7 +31,7 @@ folly::Expected, QuicError> getIntegerParameter( return Optional(parameter->first); } -folly::Expected, QuicError> getConnIdParameter( +quic::Expected, QuicError> getConnIdParameter( TransportParameterId id, const std::vector& parameters) { auto it = findParameter(parameters, id); @@ -44,15 +44,15 @@ folly::Expected, QuicError> getConnIdParameter( // Use the factory function instead of constructor auto connIdResult = ConnectionId::create(cursor, value->length()); - if (connIdResult.hasError()) { - return folly::makeUnexpected(QuicError( + if (!connIdResult.has_value()) { + return quic::make_unexpected(QuicError( TransportErrorCode::TRANSPORT_PARAMETER_ERROR, "Invalid connection ID parameter")); } return Optional(connIdResult.value()); } -folly::Expected, QuicError> +quic::Expected, QuicError> getStatelessResetTokenParameter( const std::vector& parameters) { auto it = @@ -64,7 +64,7 @@ getStatelessResetTokenParameter( auto value = it->value->clone(); auto range = value->coalesce(); if (range.size() != sizeof(StatelessResetToken)) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::TRANSPORT_PARAMETER_ERROR, "Invalid reset token")); } StatelessResetToken token; @@ -72,7 +72,7 @@ getStatelessResetTokenParameter( return Optional(token); } -folly::Expected encodeIntegerParameter( +quic::Expected encodeIntegerParameter( TransportParameterId id, uint64_t value) { BufPtr data = BufHelpers::create(8); @@ -82,7 +82,7 @@ folly::Expected encodeIntegerParameter( appender.writeBE(val); }); if (!encoded) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::TRANSPORT_PARAMETER_ERROR, "Invalid integer parameter")); } @@ -107,7 +107,7 @@ std::vector getSupportedExtTransportParams( auto result = encodeIntegerParameter( TransportParameterId::max_datagram_frame_size, conn.datagramState.maxReadFrameSize); - if (!result.hasError()) { + if (result.has_value()) { customTps.push_back(result.value()); } } @@ -115,7 +115,7 @@ std::vector getSupportedExtTransportParams( if (ts.advertisedMaxStreamGroups > 0) { auto result = encodeIntegerParameter( TpId::stream_groups_enabled, ts.advertisedMaxStreamGroups); - if (!result.hasError()) { + if (result.has_value()) { customTps.push_back(result.value()); } } @@ -123,7 +123,7 @@ std::vector getSupportedExtTransportParams( auto ackTimestampsResult = encodeIntegerParameter( TpId::ack_receive_timestamps_enabled, ts.maybeAckReceiveTimestampsConfigSentToPeer.has_value() ? 1 : 0); - if (!ackTimestampsResult.hasError()) { + if (ackTimestampsResult.has_value()) { customTps.push_back(ackTimestampsResult.value()); } @@ -132,7 +132,7 @@ std::vector getSupportedExtTransportParams( TpId::max_receive_timestamps_per_ack, ts.maybeAckReceiveTimestampsConfigSentToPeer ->maxReceiveTimestampsPerAck); - if (!maxTimestampsResult.hasError()) { + if (maxTimestampsResult.has_value()) { customTps.push_back(maxTimestampsResult.value()); } @@ -140,7 +140,7 @@ std::vector getSupportedExtTransportParams( TpId::receive_timestamps_exponent, ts.maybeAckReceiveTimestampsConfigSentToPeer ->receiveTimestampsExponent); - if (!exponentResult.hasError()) { + if (exponentResult.has_value()) { customTps.push_back(exponentResult.value()); } } @@ -148,7 +148,7 @@ std::vector getSupportedExtTransportParams( if (ts.minAckDelay) { auto minAckDelayResult = encodeIntegerParameter( TpId::min_ack_delay, ts.minAckDelay.value().count()); - if (!minAckDelayResult.hasError()) { + if (minAckDelayResult.has_value()) { customTps.push_back(minAckDelayResult.value()); } } @@ -156,7 +156,7 @@ std::vector getSupportedExtTransportParams( if (ts.advertisedKnobFrameSupport) { auto knobFrameResult = encodeIntegerParameter(TpId::knob_frames_supported, 1); - if (!knobFrameResult.hasError()) { + if (knobFrameResult.has_value()) { customTps.push_back(knobFrameResult.value()); } } @@ -168,7 +168,7 @@ std::vector getSupportedExtTransportParams( if (ts.advertisedExtendedAckFeatures) { auto extendedAckResult = encodeIntegerParameter( TpId::extended_ack_features, ts.advertisedExtendedAckFeatures); - if (!extendedAckResult.hasError()) { + if (extendedAckResult.has_value()) { customTps.push_back(extendedAckResult.value()); } } diff --git a/quic/handshake/TransportParameters.h b/quic/handshake/TransportParameters.h index b42255113..0c56294ac 100644 --- a/quic/handshake/TransportParameters.h +++ b/quic/handshake/TransportParameters.h @@ -7,10 +7,10 @@ #pragma once -#include #include #include #include +#include namespace quic { @@ -132,19 +132,19 @@ inline auto findParameter( }); } -folly::Expected, QuicError> getIntegerParameter( +quic::Expected, QuicError> getIntegerParameter( TransportParameterId id, const std::vector& parameters); -folly::Expected, QuicError> getConnIdParameter( +quic::Expected, QuicError> getConnIdParameter( TransportParameterId id, const std::vector& parameters); -folly::Expected, QuicError> +quic::Expected, QuicError> getStatelessResetTokenParameter( const std::vector& parameters); -folly::Expected encodeIntegerParameter( +quic::Expected encodeIntegerParameter( TransportParameterId id, uint64_t value); diff --git a/quic/handshake/test/BUCK b/quic/handshake/test/BUCK index 4a0f2d49d..9a35b71fc 100644 --- a/quic/handshake/test/BUCK +++ b/quic/handshake/test/BUCK @@ -8,11 +8,11 @@ mvfst_cpp_library( "Mocks.h", ], exported_deps = [ - "//folly:expected", "//folly:unit", "//folly/portability:gmock", "//quic:exception", "//quic/codec:packet_number_cipher", + "//quic/common:expected", "//quic/fizz/handshake:fizz_handshake", "//quic/handshake:aead", "//quic/handshake:handshake", diff --git a/quic/handshake/test/Mocks.h b/quic/handshake/test/Mocks.h index afbab79e9..e5a8c7699 100644 --- a/quic/handshake/test/Mocks.h +++ b/quic/handshake/test/Mocks.h @@ -7,11 +7,11 @@ #pragma once -#include #include #include #include #include +#include #include #include #include @@ -26,12 +26,9 @@ class MockPacketNumberCipher : public PacketNumberCipher { public: virtual ~MockPacketNumberCipher() = default; + MOCK_METHOD((quic::Expected), setKey, (ByteRange key)); MOCK_METHOD( - (folly::Expected), - setKey, - (ByteRange key)); - MOCK_METHOD( - (folly::Expected), + (quic::Expected), mask, (ByteRange), (const)); @@ -54,14 +51,14 @@ class MockAead : public Aead { MOCK_METHOD(Optional, getKey, (), (const)); MOCK_METHOD( - (folly::Expected, QuicError>), + (quic::Expected, QuicError>), _inplaceEncrypt, (std::unique_ptr & plaintext, const folly::IOBuf* associatedData, uint64_t seqNum), (const)); - folly::Expected, QuicError> inplaceEncrypt( + quic::Expected, QuicError> inplaceEncrypt( std::unique_ptr&& plaintext, const folly::IOBuf* associatedData, uint64_t seqNum) const override { @@ -102,7 +99,7 @@ class MockAead : public Aead { using namespace testing; ON_CALL(*this, _inplaceEncrypt(_, _, _)) .WillByDefault(InvokeWithoutArgs( - []() -> folly::Expected, QuicError> { + []() -> quic::Expected, QuicError> { return folly::IOBuf::copyBuffer("ciphertext"); })); ON_CALL(*this, _decrypt(_, _, _)).WillByDefault(InvokeWithoutArgs([]() { diff --git a/quic/happyeyeballs/QuicHappyEyeballsFunctions.cpp b/quic/happyeyeballs/QuicHappyEyeballsFunctions.cpp index 140c678c8..f0d59f312 100644 --- a/quic/happyeyeballs/QuicHappyEyeballsFunctions.cpp +++ b/quic/happyeyeballs/QuicHappyEyeballsFunctions.cpp @@ -118,7 +118,7 @@ void startHappyEyeballs( } } -folly::Expected happyEyeballsSetUpSocket( +quic::Expected happyEyeballsSetUpSocket( QuicAsyncUDPSocket& socket, Optional localAddress, const folly::SocketAddress& peerAddress, @@ -130,19 +130,19 @@ folly::Expected happyEyeballsSetUpSocket( auto sockFamily = localAddress.value_or(peerAddress).getFamily(); auto result = socket.setReuseAddr(false); if (!result) { - return folly::makeUnexpected(result.error()); + return quic::make_unexpected(result.error()); } if (transportSettings.readEcnOnIngress) { result = socket.setRecvTos(true); if (!result) { - return folly::makeUnexpected(result.error()); + return quic::make_unexpected(result.error()); } } - auto initSockAndApplyOpts = [&]() -> folly::Expected { + auto initSockAndApplyOpts = [&]() -> quic::Expected { auto initResult = socket.init(sockFamily); if (!initResult) { - return folly::makeUnexpected(initResult.error()); + return quic::make_unexpected(initResult.error()); } auto applyResult = applySocketOptions( socket, @@ -150,29 +150,29 @@ folly::Expected happyEyeballsSetUpSocket( sockFamily, folly::SocketOptionKey::ApplyPos::PRE_BIND); if (!applyResult) { - return folly::makeUnexpected(applyResult.error()); + return quic::make_unexpected(applyResult.error()); } - return folly::unit; + return {}; }; if (localAddress.has_value()) { auto initResult = initSockAndApplyOpts(); if (!initResult) { - return folly::makeUnexpected(initResult.error()); + return quic::make_unexpected(initResult.error()); } result = socket.bind(*localAddress); if (!result) { - return folly::makeUnexpected(result.error()); + return quic::make_unexpected(result.error()); } } if (transportSettings.connectUDP) { auto initResult = initSockAndApplyOpts(); if (!initResult) { - return folly::makeUnexpected(initResult.error()); + return quic::make_unexpected(initResult.error()); } result = socket.connect(peerAddress); if (!result) { - return folly::makeUnexpected(result.error()); + return quic::make_unexpected(result.error()); } } if (!socket.isBound()) { @@ -180,11 +180,11 @@ folly::Expected happyEyeballsSetUpSocket( peerAddress.getFamily() == AF_INET ? "0.0.0.0" : "::", 0); auto initResult = initSockAndApplyOpts(); if (!initResult) { - return folly::makeUnexpected(initResult.error()); + return quic::make_unexpected(initResult.error()); } result = socket.bind(addr); if (!result) { - return folly::makeUnexpected(result.error()); + return quic::make_unexpected(result.error()); } } // This is called before applySocketOptions to allow the configured socket @@ -193,13 +193,13 @@ folly::Expected happyEyeballsSetUpSocket( // socket options directly. result = socket.setTosOrTrafficClass(socketTos); if (!result) { - return folly::makeUnexpected(result.error()); + return quic::make_unexpected(result.error()); } auto applyResult = applySocketOptions( socket, options, sockFamily, folly::SocketOptionKey::ApplyPos::POST_BIND); if (!applyResult) { - return folly::makeUnexpected(applyResult.error()); + return quic::make_unexpected(applyResult.error()); } #ifdef SO_NOSIGPIPE @@ -208,7 +208,7 @@ folly::Expected happyEyeballsSetUpSocket( result = socket.applyOptions( {{nopipeKey, 1}}, folly::SocketOptionKey::ApplyPos::POST_BIND); if (!result) { - return folly::makeUnexpected(result.error()); + return quic::make_unexpected(result.error()); } } #endif @@ -220,18 +220,18 @@ folly::Expected happyEyeballsSetUpSocket( // never fragment, always turn off PMTU result = socket.setDFAndTurnOffPMTU(); if (!result) { - return folly::makeUnexpected(result.error()); + return quic::make_unexpected(result.error()); } if (transportSettings.enableSocketErrMsgCallback) { result = socket.setErrMessageCallback(errMsgCallback); if (!result) { - return folly::makeUnexpected(result.error()); + return quic::make_unexpected(result.error()); } } socket.resumeRead(readCallback); - return folly::unit; + return {}; } void happyEyeballsStartSecondSocket( diff --git a/quic/happyeyeballs/QuicHappyEyeballsFunctions.h b/quic/happyeyeballs/QuicHappyEyeballsFunctions.h index caca5993e..ea6bed18a 100644 --- a/quic/happyeyeballs/QuicHappyEyeballsFunctions.h +++ b/quic/happyeyeballs/QuicHappyEyeballsFunctions.h @@ -43,7 +43,7 @@ void startHappyEyeballs( QuicAsyncUDPSocket::ReadCallback* readCallback, const folly::SocketOptionMap& options); -[[nodiscard]] folly::Expected happyEyeballsSetUpSocket( +[[nodiscard]] quic::Expected happyEyeballsSetUpSocket( QuicAsyncUDPSocket& socket, Optional localAddress, const folly::SocketAddress& peerAddress, diff --git a/quic/logging/test/QLoggerTest.cpp b/quic/logging/test/QLoggerTest.cpp index 9a16b0bd1..126b764ac 100644 --- a/quic/logging/test/QLoggerTest.cpp +++ b/quic/logging/test/QLoggerTest.cpp @@ -1652,7 +1652,7 @@ TEST_F(QLoggerTest, NoThrowOnStreamingWithNonExistentDirectory) { true /* compress */); auto dcid = ConnectionId::createRandom(8); - ASSERT_TRUE(dcid.hasValue()); + ASSERT_TRUE(dcid.has_value()); q->setDcid(dcid.value()); q->addPacket(regularQuicPacket, 10); EXPECT_EQ( diff --git a/quic/loss/BUCK b/quic/loss/BUCK index 125751120..db353045b 100644 --- a/quic/loss/BUCK +++ b/quic/loss/BUCK @@ -15,9 +15,9 @@ mvfst_cpp_library( ], exported_deps = [ "//folly:chrono", - "//folly:expected", "//quic:constants", "//quic/codec:types", + "//quic/common:expected", "//quic/common:optional", "//quic/common:time_util", "//quic/congestion_control:congestion_controller", diff --git a/quic/loss/QuicLossFunctions.cpp b/quic/loss/QuicLossFunctions.cpp index 0cf02de16..cabe487d9 100644 --- a/quic/loss/QuicLossFunctions.cpp +++ b/quic/loss/QuicLossFunctions.cpp @@ -43,12 +43,11 @@ bool isPersistentCongestion( return it == ack.ackedPackets.cend(); } -folly::Expected onPTOAlarm( - QuicConnectionStateBase& conn) { +quic::Expected onPTOAlarm(QuicConnectionStateBase& conn) { VLOG(10) << __func__ << " " << conn; if (conn.transportSettings.isPriming) { // No retransmits in Priming mode - return folly::unit; + return {}; } QUIC_STATS(conn.statsCallback, onPTO); conn.lossState.ptoCount++; @@ -61,7 +60,7 @@ folly::Expected onPTOAlarm( kPtoAlarm); } if (conn.lossState.ptoCount >= conn.transportSettings.maxNumPTOs) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(LocalErrorCode::CONNECTION_ABANDONED), "Exceeded max PTO")); } @@ -72,7 +71,7 @@ folly::Expected onPTOAlarm( !conn.lossState.attemptedEarlyRetransmit0Rtt && conn.oneRttWriteCipher) { conn.lossState.attemptedEarlyRetransmit0Rtt = true; auto markResult = markZeroRttPacketsLost(conn, markPacketLoss); - if (markResult.hasError()) { + if (!markResult.has_value()) { VLOG(3) << "Closing connection due to error marking 0-RTT packets lost: " << markResult.error().message; return markResult; @@ -110,17 +109,17 @@ folly::Expected onPTOAlarm( packetCount[PacketNumberSpace::AppData]; } } - return folly::unit; + return {}; } -folly::Expected markPacketLoss( +quic::Expected markPacketLoss( QuicConnectionStateBase& conn, RegularQuicWritePacket& packet, bool processed) { QUIC_STATS(conn.statsCallback, onPacketLoss); InlineSet streamsWithAddedStreamLossForPacket; for (auto& packetFrame : packet.frames) { - folly::Expected streamResult = nullptr; + quic::Expected streamResult = nullptr; switch (packetFrame.type()) { case QuicWriteFrame::Type::MaxStreamDataFrame: { @@ -130,11 +129,11 @@ folly::Expected markPacketLoss( // But for both MaxData and MaxStreamData, we opportunistically send // an update to avoid stalling the peer. streamResult = conn.streamManager->getStream(frame.streamId); - if (streamResult.hasError()) { + if (!streamResult.has_value()) { VLOG(4) << "Failed to get stream " << frame.streamId << " in markPacketLoss (MaxStreamDataFrame): " << streamResult.error().message; - return folly::makeUnexpected(streamResult.error()); + return quic::make_unexpected(streamResult.error()); } auto* stream = streamResult.value(); if (!stream) { @@ -164,11 +163,11 @@ folly::Expected markPacketLoss( break; } streamResult = conn.streamManager->getStream(frame.streamId); - if (streamResult.hasError()) { + if (!streamResult.has_value()) { VLOG(4) << "Failed to get stream " << frame.streamId << " in markPacketLoss (WriteStreamFrame): " << streamResult.error().message; - return folly::makeUnexpected(streamResult.error()); + return quic::make_unexpected(streamResult.error()); } auto* stream = streamResult.value(); if (!stream) { @@ -232,11 +231,11 @@ folly::Expected markPacketLoss( break; } streamResult = conn.streamManager->getStream(frame.streamId); - if (streamResult.hasError()) { + if (!streamResult.has_value()) { VLOG(4) << "Failed to get stream " << frame.streamId << " in markPacketLoss (RstStreamFrame): " << streamResult.error().message; - return folly::makeUnexpected(streamResult.error()); + return quic::make_unexpected(streamResult.error()); } auto* stream = streamResult.value(); if (!stream) { @@ -251,11 +250,11 @@ folly::Expected markPacketLoss( break; } streamResult = conn.streamManager->getStream(frame.streamId); - if (streamResult.hasError()) { + if (!streamResult.has_value()) { VLOG(4) << "Failed to get stream " << frame.streamId << " in markPacketLoss (StreamDataBlockedFrame): " << streamResult.error().message; - return folly::makeUnexpected(streamResult.error()); + return quic::make_unexpected(streamResult.error()); } auto* stream = streamResult.value(); if (!stream) { @@ -276,14 +275,14 @@ folly::Expected markPacketLoss( break; } } - return folly::unit; + return {}; } /** * Processes outstandings for loss and returns true if the loss timer should be * set. False otherwise. */ -folly::Expected processOutstandingsForLoss( +quic::Expected processOutstandingsForLoss( QuicConnectionStateBase& conn, PacketNum largestAcked, const PacketNumberSpace& pnSpace, @@ -399,8 +398,8 @@ folly::Expected processOutstandingsForLoss( *pkt.maybeClonedPacketIdentifier); auto visitorResult = lossVisitor(conn, pkt.packet, processed); - if (visitorResult.hasError()) { - return folly::makeUnexpected(visitorResult.error()); + if (!visitorResult.has_value()) { + return quic::make_unexpected(visitorResult.error()); } if (pkt.maybeClonedPacketIdentifier) { @@ -443,7 +442,7 @@ folly::Expected processOutstandingsForLoss( * This function should be invoked after some event that is possible to * trigger loss detection, for example: packets are acked */ -folly::Expected, QuicError> +quic::Expected, QuicError> detectLossPackets( QuicConnectionStateBase& conn, const AckState& ackState, @@ -527,8 +526,8 @@ detectLossPackets( lossEvent, observerLossEvent); - if (processResult.hasError()) { - return folly::makeUnexpected(processResult.error()); + if (!processResult.has_value()) { + return quic::make_unexpected(processResult.error()); } shouldSetTimer = processResult.value(); } @@ -586,7 +585,7 @@ detectLossPackets( return std::nullopt; } -folly::Expected, QuicError> +quic::Expected, QuicError> handleAckForLoss( QuicConnectionStateBase& conn, const LossVisitor& lossVisitor, @@ -613,8 +612,8 @@ handleAckForLoss( auto lossEventResult = detectLossPackets( conn, ackState, lossVisitor, ack.ackTime, pnSpace, &ack); - if (lossEventResult.hasError()) { - return folly::makeUnexpected(lossEventResult.error()); + if (!lossEventResult.has_value()) { + return quic::make_unexpected(lossEventResult.error()); } conn.pendingEvents.setLossDetectionAlarm = diff --git a/quic/loss/QuicLossFunctions.h b/quic/loss/QuicLossFunctions.h index b883480a6..469045d45 100644 --- a/quic/loss/QuicLossFunctions.h +++ b/quic/loss/QuicLossFunctions.h @@ -8,9 +8,9 @@ #pragma once #include -#include #include #include +#include #include #include #include @@ -189,7 +189,7 @@ void setLossDetectionAlarm(QuicConnectionStateBase& conn, Timeout& timeout) { * Returns true if the loss timer should be set, false otherwise. * Returns QuicError if the LossVisitor fails. */ -[[nodiscard]] folly::Expected processOutstandingsForLoss( +[[nodiscard]] quic::Expected processOutstandingsForLoss( QuicConnectionStateBase& conn, PacketNum largestAcked, const PacketNumberSpace& pnSpace, @@ -207,7 +207,7 @@ void setLossDetectionAlarm(QuicConnectionStateBase& conn, Timeout& timeout) { * Returns a LossEvent on success (possibly empty), or a QuicError if * processing encountered an error (e.g., from the lossVisitor). */ -[[nodiscard]] folly:: +[[nodiscard]] quic:: Expected, QuicError> detectLossPackets( QuicConnectionStateBase& conn, @@ -220,20 +220,20 @@ void setLossDetectionAlarm(QuicConnectionStateBase& conn, Timeout& timeout) { /* * Function invoked when PTO alarm fires. Handles errors internally. */ -[[nodiscard]] folly::Expected onPTOAlarm( +[[nodiscard]] quic::Expected onPTOAlarm( QuicConnectionStateBase& conn); /* * Function invoked when loss detection timer fires */ template -[[nodiscard]] folly::Expected onLossDetectionAlarm( +[[nodiscard]] quic::Expected onLossDetectionAlarm( QuicConnectionStateBase& conn, const LossVisitor& lossVisitor) { auto now = ClockType::now(); if (conn.outstandings.packets.empty()) { VLOG(10) << "Transmission alarm fired with no outstanding packets " << conn; - return folly::unit; + return {}; } if (conn.lossState.currentAlarmMethod == LossState::AlarmMethod::EarlyRetransmitOrReordering) { @@ -245,8 +245,8 @@ template lossVisitor, now, lossTimeAndSpace.second); - if (lossEventResult.hasError()) { - return folly::makeUnexpected(lossEventResult.error()); + if (!lossEventResult.has_value()) { + return quic::make_unexpected(lossEventResult.error()); } auto& lossEvent = lossEventResult.value(); if (conn.congestionController && lossEvent) { @@ -256,8 +256,8 @@ template } } else { auto result = onPTOAlarm(conn); - if (result.hasError()) { - return folly::makeUnexpected(result.error()); + if (!result.has_value()) { + return quic::make_unexpected(result.error()); } } conn.pendingEvents.setLossDetectionAlarm = @@ -270,7 +270,7 @@ template << " handshakePackets=" << conn.outstandings.packetCount[PacketNumberSpace::Handshake] << " " << conn; - return folly::unit; + return {}; } /* @@ -278,7 +278,7 @@ template * This is the canonical implementation often used *by* the LossVisitor. * Returns folly::unit on success, or QuicError if accessing stream state fails. */ -[[nodiscard]] folly::Expected markPacketLoss( +[[nodiscard]] quic::Expected markPacketLoss( QuicConnectionStateBase& conn, RegularQuicWritePacket& packet, bool processed); @@ -288,7 +288,7 @@ template * Returns a LossEvent on success (possibly empty), or QuicError if processing * failed. */ -[[nodiscard]] folly:: +[[nodiscard]] quic:: Expected, QuicError> handleAckForLoss( QuicConnectionStateBase& conn, @@ -301,7 +301,7 @@ template * Returns folly::unit on success, or QuicError if marking fails. */ template -[[nodiscard]] folly::Expected markZeroRttPacketsLost( +[[nodiscard]] quic::Expected markZeroRttPacketsLost( QuicConnectionStateBase& conn, const LossVisitor& lossVisitor) { CongestionController::LossEvent lossEvent(ClockType::now()); @@ -319,8 +319,8 @@ template *pkt.maybeClonedPacketIdentifier); auto visitorResult = lossVisitor(conn, pkt.packet, processed); - if (visitorResult.hasError()) { - return folly::makeUnexpected(visitorResult.error()); + if (!visitorResult.has_value()) { + return quic::make_unexpected(visitorResult.error()); } if (pkt.maybeClonedPacketIdentifier) { @@ -347,7 +347,7 @@ template conn.congestionController->onRemoveBytesFromInflight(lossEvent.lostBytes); } VLOG(10) << __func__ << " marked=" << lossEvent.lostPackets; - return folly::unit; + return {}; } } // namespace quic diff --git a/quic/loss/test/QuicLossFunctionsTest.cpp b/quic/loss/test/QuicLossFunctionsTest.cpp index 42df34e6f..9ce271432 100644 --- a/quic/loss/test/QuicLossFunctionsTest.cpp +++ b/quic/loss/test/QuicLossFunctionsTest.cpp @@ -190,12 +190,12 @@ class QuicLossFunctionsTest : public TestWithParam { LossVisitor testingLossMarkFunc(std::vector& lostPackets) { return [&lostPackets](auto& /* conn */, auto& packet, bool processed) - -> folly::Expected { + -> quic::Expected { if (!processed) { auto packetNum = packet.header.getPacketSequenceNum(); lostPackets.push_back(packetNum); } - return folly::unit; + return {}; }; } @@ -374,10 +374,9 @@ TEST_F(QuicLossFunctionsTest, ClearEarlyRetranTimer) { ASSERT_GT(secondPacketNum, firstPacketNum); ASSERT_EQ(2, conn->outstandings.packets.size()); // detectLossPackets will set lossTime on Initial space. - auto lossVisitor = - [](auto&, auto&, bool) -> folly::Expected { + auto lossVisitor = [](auto&, auto&, bool) -> quic::Expected { EXPECT_FALSE(true) << "Shouldn't call lossVisitor"; - return folly::unit; + return {}; }; auto& ackState = getAckState(*conn, PacketNumberSpace::Initial); ackState.largestAckedByPeer = @@ -408,15 +407,18 @@ TEST_F(QuicLossFunctionsTest, ClearEarlyRetranTimer) { ackFrame.ackBlocks.emplace_back(firstPacketNum, secondPacketNum); // Ack won't cancel loss timer EXPECT_CALL(timeout, cancelLossTimeout()).Times(0); - ASSERT_FALSE(processAckFrame( - *conn, - PacketNumberSpace::Initial, - ackFrame, - [](auto&) { return folly::unit; }, - [&](auto&, auto&) { return folly::unit; }, - lossVisitor, - Clock::now()) - .hasError()); + ASSERT_FALSE( + processAckFrame( + *conn, + PacketNumberSpace::Initial, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [&](auto&, auto&) -> quic::Expected { + return {}; + }, + lossVisitor, + Clock::now()) + .hasError()); // Send out a AppData packet that isn't retransmittable sendPacket(*conn, Clock::now(), std::nullopt, PacketType::OneRtt); @@ -806,10 +808,11 @@ TEST_F(QuicLossFunctionsTest, TestReorderingThreshold) { EXPECT_CALL(*rawCongestionController, onPacketSent(_)) .WillRepeatedly(Return()); - auto testingLossMarkFunc = [&lostPacket](auto& /*conn*/, auto& packet, bool) { + auto testingLossMarkFunc = [&lostPacket](auto& /*conn*/, auto& packet, bool) + -> quic::Expected { auto packetNum = packet.header.getPacketSequenceNum(); lostPacket.push_back(packetNum); - return folly::unit; + return {}; }; for (int i = 0; i < 6; ++i) { sendPacket(*conn, Clock::now(), std::nullopt, PacketType::Handshake); @@ -870,10 +873,11 @@ TEST_F(QuicLossFunctionsTest, TestReorderingThresholdWithSkippedPacket) { EXPECT_CALL(*rawCongestionController, onPacketSent(_)) .WillRepeatedly(Return()); - auto testingLossMarkFunc = [&lostPacket](auto& /*conn*/, auto& packet, bool) { + auto testingLossMarkFunc = [&lostPacket](auto& /*conn*/, auto& packet, bool) + -> quic::Expected { auto packetNum = packet.header.getPacketSequenceNum(); lostPacket.push_back(packetNum); - return folly::unit; + return {}; }; // Send 7 packets, with numbers 1,2,3,4,6,7,8 @@ -940,9 +944,11 @@ TEST_F(QuicLossFunctionsTest, TestHandleAckForLoss) { conn->outstandings.packetCount[PacketNumberSpace::Handshake]++; bool testLossMarkFuncCalled = false; - auto testLossMarkFunc = [&](auto& /* conn */, auto&, bool) { + auto testLossMarkFunc = [&](auto& /* conn */, + auto&, + bool) -> quic::Expected { testLossMarkFuncCalled = true; - return folly::unit; + return {}; }; EXPECT_CALL(*mockQLogger, addPacketsLost(1, 0, 1)); @@ -987,13 +993,18 @@ TEST_F(QuicLossFunctionsTest, TestHandleAckedPacket) { conn->lossState.largestSent.value_or(0)); bool testLossMarkFuncCalled = false; - auto testLossMarkFunc = [&](auto& /* conn */, auto&, bool) { + auto testLossMarkFunc = [&](auto& /* conn */, + auto&, + bool) -> quic::Expected { testLossMarkFuncCalled = true; - return folly::unit; + return {}; }; - auto ackPacketVisitor = [](auto&) { return folly::unit; }; - auto ackFrameVisitor = [&](auto&, auto&) { return folly::unit; }; + auto ackPacketVisitor = [](auto&) -> quic::Expected { + return {}; + }; + auto ackFrameVisitor = + [&](auto&, auto&) -> quic::Expected { return {}; }; // process and remove the acked packet. ASSERT_FALSE(processAckFrame( @@ -1084,12 +1095,14 @@ TEST_F(QuicLossFunctionsTest, ReorderingThresholdChecksSamePacketNumberSpace) { auto conn = createConn(); uint16_t lossVisitorCount = 0; auto countingLossVisitor = - [&](auto& /* conn */, auto& /* packet */, bool processed) { - if (!processed) { - lossVisitorCount++; - } - return folly::unit; - }; + [&](auto& /* conn */, + auto& /* packet */, + bool processed) -> quic::Expected { + if (!processed) { + lossVisitorCount++; + } + return {}; + }; PacketNum latestSent = 0; for (size_t i = 0; i < conn->lossState.reorderingThreshold + 1; i++) { latestSent = @@ -1516,12 +1529,14 @@ TEST_F(QuicLossFunctionsTest, NoSkipLossVisitor) { conn->lossState.srtt = 1000000000us; uint16_t lossVisitorCount = 0; auto countingLossVisitor = - [&](auto& /* conn */, auto& /* packet */, bool processed) { - if (!processed) { - lossVisitorCount++; - } - return folly::unit; - }; + [&](auto& /* conn */, + auto& /* packet */, + bool processed) -> quic::Expected { + if (!processed) { + lossVisitorCount++; + } + return {}; + }; // Send 5 packets, so when we ack the last one, we mark the first one loss PacketNum lastSent; for (size_t i = 0; i < 5; i++) { @@ -1549,12 +1564,14 @@ TEST_F(QuicLossFunctionsTest, SkipLossVisitor) { conn->lossState.srtt = 1000000000us; uint16_t lossVisitorCount = 0; auto countingLossVisitor = - [&](auto& /* conn */, auto& /* packet */, bool processed) { - if (!processed) { - lossVisitorCount++; - } - return folly::unit; - }; + [&](auto& /* conn */, + auto& /* packet */, + bool processed) -> quic::Expected { + if (!processed) { + lossVisitorCount++; + } + return {}; + }; // Send 5 packets, so when we ack the last one, we mark the first one loss PacketNum lastSent; for (size_t i = 0; i < 5; i++) { @@ -1585,12 +1602,14 @@ TEST_F(QuicLossFunctionsTest, NoDoubleProcess) { uint16_t lossVisitorCount = 0; auto countingLossVisitor = - [&](auto& /* conn */, auto& /* packet */, bool processed) { - if (!processed) { - lossVisitorCount++; - } - return folly::unit; - }; + [&](auto& /* conn */, + auto& /* packet */, + bool processed) -> quic::Expected { + if (!processed) { + lossVisitorCount++; + } + return {}; + }; // Send 6 packets, so when we ack the last one, we mark the first two loss EXPECT_EQ(1, conn->ackStates.appDataAckState.nextPacketNum); PacketNum lastSent; @@ -1640,7 +1659,10 @@ TEST_F(QuicLossFunctionsTest, DetectPacketLossClonedPacketsCounter) { sendPacket(*conn, Clock::now(), std::nullopt, PacketType::OneRtt); auto ackedPacket = sendPacket(*conn, Clock::now(), std::nullopt, PacketType::OneRtt); - auto noopLossMarker = [](auto&, auto&, bool) { return folly::unit; }; + auto noopLossMarker = + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }; auto& ackState = getAckState(*conn, PacketNumberSpace::AppData); ackState.largestAckedByPeer = @@ -1757,12 +1779,14 @@ TEST_F(QuicLossFunctionsTest, TotalLossCount) { EXPECT_EQ(10, conn->outstandings.packets.size()); uint32_t lostPackets = 0; auto countingLossVisitor = - [&](auto& /* conn */, auto& /* packet */, bool processed) { - if (!processed) { - lostPackets++; - } - return folly::unit; - }; + [&](auto& /* conn */, + auto& /* packet */, + bool processed) -> quic::Expected { + if (!processed) { + lostPackets++; + } + return {}; + }; conn->lossState.rtxCount = 135; @@ -1799,9 +1823,11 @@ TEST_F(QuicLossFunctionsTest, TestZeroRttRejected) { // onRemoveBytesFromInflight should still happen EXPECT_CALL(*rawCongestionController, onRemoveBytesFromInflight(_)).Times(1); auto result = markZeroRttPacketsLost( - *conn, [&lostPackets](auto&, auto&, bool processed) { + *conn, + [&lostPackets](auto&, auto&, bool processed) + -> quic::Expected { lostPackets.emplace_back(processed); - return folly::unit; + return {}; }); ASSERT_FALSE(result.hasError()); EXPECT_EQ(2, conn->outstandings.packets.size()); @@ -1854,9 +1880,11 @@ TEST_F(QuicLossFunctionsTest, TestZeroRttRejectedWithClones) { // onRemoveBytesFromInflight should still happen EXPECT_CALL(*rawCongestionController, onRemoveBytesFromInflight(_)).Times(1); auto result = markZeroRttPacketsLost( - *conn, [&lostPackets](auto&, auto&, bool processed) { + *conn, + [&lostPackets](auto&, auto&, bool processed) + -> quic::Expected { lostPackets.emplace_back(processed); - return folly::unit; + return {}; }); ASSERT_FALSE(result.hasError()); ASSERT_EQ(conn->outstandings.clonedPacketIdentifiers.size(), 0); @@ -1900,9 +1928,11 @@ TEST_F(QuicLossFunctionsTest, TimeThreshold) { referenceTime + conn->lossState.srtt / 2, std::nullopt, PacketType::OneRtt); - auto lossVisitor = [&](const auto& /*conn*/, const auto& packet, bool) { + auto lossVisitor = [&](const auto& /*conn*/, + const auto& packet, + bool) -> quic::Expected { EXPECT_EQ(packet1, packet.header.getPacketSequenceNum()); - return folly::unit; + return {}; }; auto& ackState = getAckState(*conn, PacketNumberSpace::AppData); @@ -1929,7 +1959,7 @@ TEST_F(QuicLossFunctionsTest, OutstandingInitialCounting) { EXPECT_EQ(10, conn->outstandings.packetCount[PacketNumberSpace::Initial]); auto noopLossVisitor = [&](auto& /* conn */, auto& /* packet */, bool /* processed */ - ) { return folly::unit; }; + ) -> quic::Expected { return {}; }; auto& ackState = getAckState(*conn, PacketNumberSpace::Initial); ackState.largestAckedByPeer = @@ -1957,7 +1987,7 @@ TEST_F(QuicLossFunctionsTest, OutstandingHandshakeCounting) { EXPECT_EQ(10, conn->outstandings.packetCount[PacketNumberSpace::Handshake]); auto noopLossVisitor = [&](auto& /* conn */, auto& /* packet */, bool /* processed */ - ) { return folly::unit; }; + ) -> quic::Expected { return {}; }; auto& ackState = getAckState(*conn, PacketNumberSpace::Handshake); ackState.largestAckedByPeer = ackState.largestNonDsrSequenceNumberAckedByPeer = largestSent; @@ -2183,13 +2213,16 @@ TEST_F(QuicLossFunctionsTest, ObserverLossEventReorder) { auto& ackState = getAckState(*conn, PacketNumberSpace::AppData); ackState.largestAckedByPeer = ackState.largestNonDsrSequenceNumberAckedByPeer = largestSent + 1; - ASSERT_FALSE(detectLossPackets( - *conn, - ackState, - [](auto&, auto&, bool) { return folly::unit; }, - checkTime, - PacketNumberSpace::AppData) - .hasError()); + ASSERT_FALSE( + detectLossPackets( + *conn, + ackState, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + checkTime, + PacketNumberSpace::AppData) + .hasError()); EXPECT_THAT( conn->outstandings.packets, UnorderedElementsAre( @@ -2278,13 +2311,16 @@ TEST_F(QuicLossFunctionsTest, ObserverLossEventTimeout) { auto& ackState = getAckState(*conn, PacketNumberSpace::AppData); ackState.largestAckedByPeer = ackState.largestNonDsrSequenceNumberAckedByPeer = largestSent + 1; - ASSERT_FALSE(detectLossPackets( - *conn, - ackState, - [](auto&, auto&, bool) { return folly::unit; }, - checkTime, - PacketNumberSpace::AppData) - .hasError()); + ASSERT_FALSE( + detectLossPackets( + *conn, + ackState, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + checkTime, + PacketNumberSpace::AppData) + .hasError()); EXPECT_THAT( conn->outstandings.packets, UnorderedElementsAre( @@ -2381,13 +2417,16 @@ TEST_F(QuicLossFunctionsTest, ObserverLossEventTimeoutAndReorder) { auto& ackState = getAckState(*conn, PacketNumberSpace::AppData); ackState.largestAckedByPeer = ackState.largestNonDsrSequenceNumberAckedByPeer = largestSent + 1; - ASSERT_FALSE(detectLossPackets( - *conn, - ackState, - [](auto&, auto&, bool) { return folly::unit; }, - checkTime, - PacketNumberSpace::AppData) - .hasError()); + ASSERT_FALSE( + detectLossPackets( + *conn, + ackState, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + checkTime, + PacketNumberSpace::AppData) + .hasError()); EXPECT_THAT( conn->outstandings.packets, UnorderedElementsAre( @@ -2413,7 +2452,10 @@ TEST_F(QuicLossFunctionsTest, ObserverLossEventTimeoutAndReorder) { TEST_F(QuicLossFunctionsTest, TotalPacketsMarkedLostByReordering) { auto conn = createConn(); - auto noopLossVisitor = [](auto&, auto&, bool) { return folly::unit; }; + auto noopLossVisitor = + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }; // send 7 packets PacketNum largestSent = 0; @@ -2458,7 +2500,10 @@ TEST_F(QuicLossFunctionsTest, TotalPacketsMarkedLostByReordering) { TEST_F(QuicLossFunctionsTest, TotalPacketsMarkedLostByTimeout) { auto conn = createConn(); - auto noopLossVisitor = [](auto&, auto&, bool) { return folly::unit; }; + auto noopLossVisitor = + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }; // send 7 packets PacketNum largestSent = 0; @@ -2496,7 +2541,10 @@ TEST_F(QuicLossFunctionsTest, TotalPacketsMarkedLostByTimeout) { TEST_F(QuicLossFunctionsTest, TotalPacketsMarkedLostByTimeoutPartial) { auto conn = createConn(); - auto noopLossVisitor = [](auto&, auto&, bool) { return folly::unit; }; + auto noopLossVisitor = + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }; // send 7 packets PacketNum largestSent = 0; @@ -2541,7 +2589,10 @@ TEST_F(QuicLossFunctionsTest, TotalPacketsMarkedLostByTimeoutPartial) { TEST_F(QuicLossFunctionsTest, TotalPacketsMarkedLostByTimeoutAndReordering) { auto conn = createConn(); - auto noopLossVisitor = [](auto&, auto&, bool) { return folly::unit; }; + auto noopLossVisitor = + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }; // send 7 packets PacketNum largestSent = 0; @@ -2755,10 +2806,11 @@ TEST_F(QuicLossFunctionsTest, TestReorderingThresholdDSRNormal) { EXPECT_CALL(*rawCongestionController, onPacketSent(_)) .WillRepeatedly(Return()); - auto testingLossMarkFunc = [&lostPacket](auto& /*conn*/, auto& packet, bool) { + auto testingLossMarkFunc = [&lostPacket](auto& /*conn*/, auto& packet, bool) + -> quic::Expected { auto packetNum = packet.header.getPacketSequenceNum(); lostPacket.push_back(packetNum); - return folly::unit; + return {}; }; for (int i = 0; i < 6; ++i) { sendPacket( @@ -2859,10 +2911,11 @@ TEST_F(QuicLossFunctionsTest, TestReorderingThresholdDSRNormalOverflow) { EXPECT_CALL(*rawCongestionController, onPacketSent(_)) .WillRepeatedly(Return()); - auto testingLossMarkFunc = [&lostPacket](auto& /*conn*/, auto& packet, bool) { + auto testingLossMarkFunc = [&lostPacket](auto& /*conn*/, auto& packet, bool) + -> quic::Expected { auto packetNum = packet.header.getPacketSequenceNum(); lostPacket.push_back(packetNum); - return folly::unit; + return {}; }; for (int i = 0; i < 6; ++i) { sendPacket( @@ -2944,10 +2997,11 @@ TEST_F(QuicLossFunctionsTest, TestReorderingThresholdDSRIgnoreReorder) { EXPECT_CALL(*rawCongestionController, onPacketSent(_)) .WillRepeatedly(Return()); - auto testingLossMarkFunc = [&lostPacket](auto& /*conn*/, auto& packet, bool) { + auto testingLossMarkFunc = [&lostPacket](auto& /*conn*/, auto& packet, bool) + -> quic::Expected { auto packetNum = packet.header.getPacketSequenceNum(); lostPacket.push_back(packetNum); - return folly::unit; + return {}; }; for (int i = 0; i < 6; ++i) { sendPacket( @@ -3050,10 +3104,11 @@ TEST_F(QuicLossFunctionsTest, TestReorderingThresholdNonDSRIgnoreReorder) { EXPECT_CALL(*rawCongestionController, onPacketSent(_)) .WillRepeatedly(Return()); - auto testingLossMarkFunc = [&lostPacket](auto& /*conn*/, auto& packet, bool) { + auto testingLossMarkFunc = [&lostPacket](auto& /*conn*/, auto& packet, bool) + -> quic::Expected { auto packetNum = packet.header.getPacketSequenceNum(); lostPacket.push_back(packetNum); - return folly::unit; + return {}; }; for (int i = 0; i < 6; ++i) { sendPacket(*conn, Clock::now(), std::nullopt, PacketType::OneRtt); @@ -3129,10 +3184,11 @@ TEST_F( EXPECT_CALL(*rawCongestionController, onPacketSent(_)) .WillRepeatedly(Return()); - auto testingLossMarkFunc = [&lostPacket](auto& /*conn*/, auto& packet, bool) { + auto testingLossMarkFunc = [&lostPacket](auto& /*conn*/, auto& packet, bool) + -> quic::Expected { auto packetNum = packet.header.getPacketSequenceNum(); lostPacket.push_back(packetNum); - return folly::unit; + return {}; }; for (int i = 0; i < 6; ++i) { sendPacket(*conn, Clock::now(), std::nullopt, PacketType::OneRtt); @@ -3214,10 +3270,11 @@ TEST_F(QuicLossFunctionsTest, TestReorderingThresholdDSRIgnoreReorderBurst) { EXPECT_CALL(*rawCongestionController, onPacketSent(_)) .WillRepeatedly(Return()); - auto testingLossMarkFunc = [&lostPacket](auto& /*conn*/, auto& packet, bool) { + auto testingLossMarkFunc = [&lostPacket](auto& /*conn*/, auto& packet, bool) + -> quic::Expected { auto packetNum = packet.header.getPacketSequenceNum(); lostPacket.push_back(packetNum); - return folly::unit; + return {}; }; for (int i = 0; i < 4; ++i) { sendPacket( @@ -3346,10 +3403,11 @@ TEST_F(QuicLossFunctionsTest, TestReorderingThresholdNonDSRIgnoreReorderBurst) { EXPECT_CALL(*rawCongestionController, onPacketSent(_)) .WillRepeatedly(Return()); - auto testingLossMarkFunc = [&lostPacket](auto& /*conn*/, auto& packet, bool) { + auto testingLossMarkFunc = [&lostPacket](auto& /*conn*/, auto& packet, bool) + -> quic::Expected { auto packetNum = packet.header.getPacketSequenceNum(); lostPacket.push_back(packetNum); - return folly::unit; + return {}; }; for (int i = 0; i < 4; ++i) { sendPacket( diff --git a/quic/samples/echo/EchoClient.h b/quic/samples/echo/EchoClient.h index 6ad3141ae..d30acf763 100644 --- a/quic/samples/echo/EchoClient.h +++ b/quic/samples/echo/EchoClient.h @@ -219,7 +219,7 @@ class EchoClient : public quic::QuicSocket::ConnectionSetupCallback, connectionBaton_.post(); } - folly::Expected start(std::string token) { + quic::Expected start(std::string token) { folly::ScopedEventBaseThread networkThread("EchoClientThread"); auto evb = networkThread.getEventBase(); auto qEvb = std::make_shared(evb); @@ -242,7 +242,7 @@ class EchoClient : public quic::QuicSocket::ConnectionSetupCallback, } if (useDatagrams_) { auto res = quicClient_->setDatagramCallback(this); - CHECK(res.hasValue()) << res.error(); + CHECK(res.has_value()) << res.error(); } TransportSettings settings; @@ -266,13 +266,13 @@ class EchoClient : public quic::QuicSocket::ConnectionSetupCallback, connectionBaton_.reset(); if (connectionError_.has_value()) { - return folly::makeUnexpected(connectionError_.value()); + return quic::make_unexpected(connectionError_.value()); } if (connectOnly_) { evb->runInEventBaseThreadAndWait( [this] { quicClient_->closeNow(std::nullopt); }); - return folly::unit; + return quic::Expected{}; } std::string message; @@ -283,7 +283,7 @@ class EchoClient : public quic::QuicSocket::ConnectionSetupCallback, // Generate two groups. for (size_t i = 0; i < kNumTestStreamGroups; ++i) { auto groupId = quicClient_->createBidirectionalStreamGroup(); - CHECK(groupId.hasValue()) + CHECK(groupId.has_value()) << "Failed to generate a stream group: " << groupId.error(); streamGroups_[i] = *groupId; } @@ -307,7 +307,7 @@ class EchoClient : public quic::QuicSocket::ConnectionSetupCallback, // create new stream for each message auto streamId = client->createBidirectionalStreamInGroup(getNextGroupId()); - CHECK(streamId.hasValue()) + CHECK(streamId.has_value()) << "Failed to generate stream id in group: " << streamId.error(); client->setReadCallback(*streamId, this); pendingOutput_[*streamId].append(BufHelpers::copyBuffer(message)); @@ -336,8 +336,8 @@ class EchoClient : public quic::QuicSocket::ConnectionSetupCallback, LOG(INFO) << "EchoClient stopping client"; return connectionError_.has_value() - ? folly::makeUnexpected(connectionError_.value()) - : folly::Expected(folly::unit); + ? quic::make_unexpected(connectionError_.value()) + : quic::Expected{}; } ~EchoClient() override = default; diff --git a/quic/samples/echo/EchoHandler.h b/quic/samples/echo/EchoHandler.h index fe7ff3fee..7173d33fb 100644 --- a/quic/samples/echo/EchoHandler.h +++ b/quic/samples/echo/EchoHandler.h @@ -30,13 +30,13 @@ class EchoHandler : public quic::QuicSocket::ConnectionSetupCallback, sock = socket; if (useDatagrams_) { auto res = sock->setDatagramCallback(this); - CHECK(res.hasValue()) << res.error(); + CHECK(res.has_value()) << res.error(); } } void onNewBidirectionalStream(quic::StreamId id) noexcept override { LOG(INFO) << "Got bidirectional stream id=" << id; - sock->setReadCallback(id, this); + CHECK(sock->setReadCallback(id, this).has_value()); } void onNewBidirectionalStreamGroup( @@ -47,7 +47,8 @@ class EchoHandler : public quic::QuicSocket::ConnectionSetupCallback, if (disableRtx_) { QuicStreamGroupRetransmissionPolicy policy; policy.disableRetransmission = true; - sock->setStreamGroupRetransmissionPolicy(groupId, policy); + CHECK(sock->setStreamGroupRetransmissionPolicy(groupId, policy) + .has_value()); } } @@ -56,12 +57,12 @@ class EchoHandler : public quic::QuicSocket::ConnectionSetupCallback, quic::StreamGroupId groupId) noexcept override { LOG(INFO) << "Got bidirectional stream id=" << id << " in group=" << groupId; - sock->setReadCallback(id, this); + CHECK(sock->setReadCallback(id, this).has_value()); } void onNewUnidirectionalStream(quic::StreamId id) noexcept override { LOG(INFO) << "Got unidirectional stream id=" << id; - sock->setReadCallback(id, this); + CHECK(sock->setReadCallback(id, this).has_value()); } void onNewUnidirectionalStreamGroup( @@ -76,7 +77,7 @@ class EchoHandler : public quic::QuicSocket::ConnectionSetupCallback, quic::StreamGroupId groupId) noexcept override { LOG(INFO) << "Got unidirectional stream id=" << id << " in group=" << groupId; - sock->setReadCallback(id, this); + CHECK(sock->setReadCallback(id, this).has_value()); } void onStopSending( @@ -104,7 +105,7 @@ class EchoHandler : public quic::QuicSocket::ConnectionSetupCallback, auto res = sock->read(id, 0); if (res.hasError()) { LOG(ERROR) << "Got error=" << toString(res.error()); - sock->setReadCallback(id, nullptr); + CHECK(sock->setReadCallback(id, nullptr).has_value()); return; } if (input_.find(id) == input_.end()) { @@ -122,7 +123,7 @@ class EchoHandler : public quic::QuicSocket::ConnectionSetupCallback, if (eof) { echo(id, input_[id]); LOG(INFO) << "uninstalling read callback"; - sock->setReadCallback(id, nullptr); + CHECK(sock->setReadCallback(id, nullptr).has_value()); } } diff --git a/quic/server/QuicServer.cpp b/quic/server/QuicServer.cpp index 6ed387a7d..aa314b2da 100644 --- a/quic/server/QuicServer.cpp +++ b/quic/server/QuicServer.cpp @@ -604,7 +604,7 @@ void QuicServer::setHealthCheckToken(const std::string& healthCheckToken) { // Make sure the token satisfies the required properties, i.e. it is not a // valid quic header. auto parsed = parseHeader(*BufHelpers::copyBuffer(healthCheckToken)); - CHECK(!parsed.hasValue()); + CHECK(!parsed.has_value()); CHECK_GT(healthCheckToken.size(), kMinHealthCheckTokenSize); healthCheckToken_ = healthCheckToken; runOnAllWorkers([healthCheckToken](auto worker) mutable { diff --git a/quic/server/QuicServerTransport.cpp b/quic/server/QuicServerTransport.cpp index 504a13e0b..c33e567ee 100644 --- a/quic/server/QuicServerTransport.cpp +++ b/quic/server/QuicServerTransport.cpp @@ -69,7 +69,7 @@ QuicServerTransport::QuicServerTransport( .setCryptoFactory(std::move(cryptoFactory)) .build()); auto addrResult = socket_->address(); - CHECK(addrResult.hasValue()); + CHECK(addrResult.has_value()); tempConn->serverAddr = addrResult.value(); serverConn_ = tempConn.get(); conn_.reset(tempConn.release()); @@ -158,7 +158,7 @@ void QuicServerTransport::setServerConnectionIdRejector( } } -folly::Expected QuicServerTransport::onReadData( +quic::Expected QuicServerTransport::onReadData( const folly::SocketAddress& peer, ReceivedUdpPacket&& udpPacket) { ServerEvents::ReadData readData; @@ -170,12 +170,12 @@ folly::Expected QuicServerTransport::onReadData( : std::numeric_limits::max(); auto readDataResult = onServerReadData(*serverConn_, readData); if (readDataResult.hasError()) { - return folly::makeUnexpected(readDataResult.error()); + return quic::make_unexpected(readDataResult.error()); } processPendingData(true); if (closeState_ == CloseState::CLOSED) { - return folly::unit; + return {}; } if (!notifiedRouting_ && routingCb_ && conn_->serverConnectionId) { notifiedRouting_ = true; @@ -213,7 +213,7 @@ folly::Expected QuicServerTransport::onReadData( maybeIssueConnectionIds(); maybeNotifyTransportReady(); - return folly::unit; + return {}; } void QuicServerTransport::accept() { @@ -226,9 +226,9 @@ void QuicServerTransport::accept() { std::make_unique(serverConn_)); } -folly::Expected QuicServerTransport::writeData() { +quic::Expected QuicServerTransport::writeData() { if (!conn_->clientConnectionId || !conn_->serverConnectionId) { - return folly::unit; + return {}; } auto version = conn_->version.value_or(*(conn_->originalVersion)); const ConnectionId& srcConnId = *conn_->serverConnectionId; @@ -237,12 +237,12 @@ folly::Expected QuicServerTransport::writeData() { if (conn_->peerConnectionError && hasReceivedUdpPacketsAtLastCloseSent(*conn_)) { // The peer sent us an error, we are in draining state now. - return folly::unit; + return {}; } if (hasReceivedUdpPacketsAtLastCloseSent(*conn_) && hasNotReceivedNewPacketsSinceLastCloseSent(*conn_)) { // We did not receive any new packets, do not sent a new close frame. - return folly::unit; + return {}; } updateLargestReceivedUdpPacketsAtLastCloseSent(*conn_); if (conn_->oneRttWriteCipher) { @@ -281,7 +281,7 @@ folly::Expected QuicServerTransport::writeData() { *conn_->initialHeaderCipher, version); } - return folly::unit; + return {}; } uint64_t packetLimit = (isConnectionPaced(*conn_) @@ -295,31 +295,31 @@ folly::Expected QuicServerTransport::writeData() { if (conn_->initialWriteCipher) { auto res = handleInitialWriteDataCommon(srcConnId, destConnId, packetLimit); if (res.hasError()) { - return folly::makeUnexpected(res.error()); + return quic::make_unexpected(res.error()); } packetLimit -= res->packetsWritten; serverConn_->numHandshakeBytesSent += res->bytesWritten; if (!packetLimit && !conn_->pendingEvents.anyProbePackets()) { - return folly::unit; + return {}; } } if (conn_->handshakeWriteCipher) { auto res = handleHandshakeWriteDataCommon(srcConnId, destConnId, packetLimit); if (res.hasError()) { - return folly::makeUnexpected(res.error()); + return quic::make_unexpected(res.error()); } packetLimit -= res->packetsWritten; serverConn_->numHandshakeBytesSent += res->bytesWritten; if (!packetLimit && !conn_->pendingEvents.anyProbePackets()) { - return folly::unit; + return {}; } } if (conn_->oneRttWriteCipher) { CHECK(conn_->oneRttWriteHeaderCipher); auto writeLoopBeginTime = Clock::now(); auto nonDsrPath = - [&](auto limit) -> folly::Expected { + [&](auto limit) -> quic::Expected { auto result = writeQuicDataToSocket( *socket_, *conn_, @@ -331,12 +331,12 @@ folly::Expected QuicServerTransport::writeData() { limit, writeLoopBeginTime); if (result.hasError()) { - return folly::makeUnexpected(result.error()); + return quic::make_unexpected(result.error()); } return result.value(); }; auto dsrPath = - [&](auto limit) -> folly::Expected { + [&](auto limit) -> quic::Expected { auto bytesBefore = conn_->lossState.totalBytesSent; // The DSR path can't write probes. // This is packetsWritte, probesWritten, bytesWritten. @@ -347,7 +347,7 @@ folly::Expected QuicServerTransport::writeData() { *conn_->oneRttWriteCipher, writeLoopBeginTime); if (dsrResult.hasError()) { - return folly::makeUnexpected(dsrResult.error()); + return quic::make_unexpected(dsrResult.error()); } auto result = WriteQuicDataResult{ dsrResult.value(), 0, conn_->lossState.totalBytesSent - bytesBefore}; @@ -361,7 +361,7 @@ folly::Expected QuicServerTransport::writeData() { // control. auto written = nonDsrPath(packetLimit); if (written.hasError()) { - return folly::makeUnexpected(written.error()); + return quic::make_unexpected(written.error()); } // For both paths we only consider full packets against the packet // limit. While this is slightly more aggressive than the intended @@ -371,7 +371,7 @@ folly::Expected QuicServerTransport::writeData() { if (packetLimit && congestionControlWritableBytes(*serverConn_)) { auto dsrWritten = dsrPath(packetLimit); if (dsrWritten.hasError()) { - return folly::makeUnexpected(dsrWritten.error()); + return quic::make_unexpected(dsrWritten.error()); } packetLimit -= dsrWritten->bytesWritten / conn_->udpSendPacketLen; } @@ -499,7 +499,7 @@ void QuicServerTransport::handleTransportKnobParams( } if (maybeParamHandler != transportKnobParamHandlers_.end()) { auto result = (maybeParamHandler->second)(this, param.val); - if (result.hasValue()) { + if (result.has_value()) { QUIC_STATS(conn_->statsCallback, onTransportKnobApplied, knobParamId); } else { QUIC_STATS(conn_->statsCallback, onTransportKnobError, knobParamId); @@ -583,7 +583,7 @@ bool QuicServerTransport::shouldWriteNewSessionTicket() { return false; } -folly::Expected +quic::Expected QuicServerTransport::maybeWriteNewSessionTicket() { if (shouldWriteNewSessionTicket() && serverConn_->serverHandshakeLayer->isHandshakeDone()) { @@ -614,7 +614,7 @@ QuicServerTransport::maybeWriteNewSessionTicket() { conn_->transportSettings.advertisedExtendedAckFeatures, cwndHint); if (transportParamsResult.hasError()) { - return folly::makeUnexpected(transportParamsResult.error()); + return quic::make_unexpected(transportParamsResult.error()); } appToken.transportParams = std::move(transportParamsResult.value()); appToken.sourceAddresses = serverConn_->tokenSourceAddresses; @@ -634,10 +634,10 @@ QuicServerTransport::maybeWriteNewSessionTicket() { auto result = serverConn_->serverHandshakeLayer->writeNewSessionTicket(appToken); if (result.hasError()) { - return folly::makeUnexpected(result.error()); + return quic::make_unexpected(result.error()); } } - return folly::unit; + return {}; } void QuicServerTransport::maybeNotifyConnectionIdRetired() { @@ -721,7 +721,7 @@ void QuicServerTransport::maybeNotifyTransportReady() { void QuicServerTransport::registerTransportKnobParamHandler( uint64_t paramId, - std::function( + std::function( QuicServerTransport*, TransportKnobParam::Val)>&& handler) { transportKnobParamHandlers_.emplace(paramId, std::move(handler)); @@ -778,8 +778,8 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { registerTransportKnobParamHandler( static_cast( TransportKnobParamId::FORCIBLY_SET_UDP_PAYLOAD_SIZE), - [](QuicServerTransport* serverTransport, TransportKnobParam::Val val) - -> folly::Expected { + [](QuicServerTransport* serverTransport, + TransportKnobParam::Val val) -> quic::Expected { CHECK(serverTransport); auto server_conn = serverTransport->serverConn_; if (static_cast(std::get(val))) { @@ -787,13 +787,13 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { VLOG(3) << "Knob param received, udpSendPacketLen is forcibly set to max UDP payload size advertised by peer"; } - return folly::unit; + return {}; }); registerTransportKnobParamHandler( static_cast(TransportKnobParamId::CC_ALGORITHM_KNOB), - [](QuicServerTransport* serverTransport, TransportKnobParam::Val val) - -> folly::Expected { + [](QuicServerTransport* serverTransport, + TransportKnobParam::Val val) -> quic::Expected { CHECK(serverTransport); auto server_conn = serverTransport->serverConn_; auto cctype = @@ -801,15 +801,15 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { VLOG(3) << "Knob param received, set congestion control type to " << congestionControlTypeToString(cctype); if (cctype == server_conn->congestionController->type()) { - return folly::unit; + return {}; } serverTransport->setCongestionControl(cctype); - return folly::unit; + return {}; }); registerTransportKnobParamHandler( static_cast(TransportKnobParamId::STARTUP_RTT_FACTOR_KNOB), - [](QuicServerTransport* serverTransport, TransportKnobParam::Val value) - -> folly::Expected { + [](QuicServerTransport* serverTransport, + TransportKnobParam::Val value) -> quic::Expected { CHECK(serverTransport); auto server_conn = serverTransport->serverConn_; auto val = std::get(value); @@ -819,13 +819,13 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { << unsigned(numerator) << "," << unsigned(denominator) << ")"; server_conn->transportSettings.startupRttFactor = std::make_pair(numerator, denominator); - return folly::unit; + return {}; }); registerTransportKnobParamHandler( static_cast(TransportKnobParamId::DEFAULT_RTT_FACTOR_KNOB), - [](QuicServerTransport* serverTransport, TransportKnobParam::Val value) - -> folly::Expected { + [](QuicServerTransport* serverTransport, + TransportKnobParam::Val value) -> quic::Expected { CHECK(serverTransport); auto server_conn = serverTransport->serverConn_; auto val = std::get(value); @@ -835,13 +835,13 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { << unsigned(numerator) << "," << unsigned(denominator) << ")"; server_conn->transportSettings.defaultRttFactor = std::make_pair(numerator, denominator); - return folly::unit; + return {}; }); registerTransportKnobParamHandler( static_cast(TransportKnobParamId::MAX_PACING_RATE_KNOB), - [](QuicServerTransport* serverTransport, TransportKnobParam::Val value) - -> folly::Expected { + [](QuicServerTransport* serverTransport, + TransportKnobParam::Val value) -> quic::Expected { CHECK(serverTransport); // Safely check if value is a uint64_t @@ -850,7 +850,7 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { auto errMsg = "Received invalid type for MAX_PACING_RATE_KNOB KnobParam: expected uint64_t"; VLOG(3) << errMsg; - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(TransportErrorCode::INTERNAL_ERROR, errMsg)); } @@ -859,7 +859,7 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { auto& maxPacingRateKnobState = serverTransport->serverConn_->maxPacingRateKnobState; if (maxPacingRateKnobState.frameOutOfOrderDetected) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::INTERNAL_ERROR, "MAX_PACING_RATE_KNOB frame out of order detected")); } @@ -872,23 +872,23 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { serverTransport->serverConn_->statsCallback, onTransportKnobOutOfOrder, TransportKnobParamId::MAX_PACING_RATE_KNOB); - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::INTERNAL_ERROR, "MAX_PACING_RATE_KNOB frame out of order detected")); } VLOG(3) << "Knob param received, set max pacing rate to (" << unsigned(val) << " bytes per second)"; - serverTransport->setMaxPacingRate(val); + (void)serverTransport->setMaxPacingRate(val); maxPacingRateKnobState.lastMaxRateBytesPerSec = val; - return folly::unit; + return {}; }); registerTransportKnobParamHandler( static_cast( TransportKnobParamId::MAX_PACING_RATE_KNOB_SEQUENCED), - [](QuicServerTransport* serverTransport, TransportKnobParam::Val value) - -> folly::Expected { + [](QuicServerTransport* serverTransport, + TransportKnobParam::Val value) -> quic::Expected { CHECK(serverTransport); // Safely check if value is a string @@ -897,7 +897,7 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { auto errMsg = "Received invalid type for MAX_PACING_RATE_KNOB_SEQUENCED KnobParam: expected string"; VLOG(3) << errMsg; - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(TransportErrorCode::INTERNAL_ERROR, errMsg)); } @@ -908,7 +908,7 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { "MAX_PACING_RATE_KNOB_SEQUENCED frame value {} is not in expected format: " "{{rate}},{{sequenceNumber}}", val); - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(TransportErrorCode::INTERNAL_ERROR, std::move(errMsg))); } @@ -917,7 +917,7 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { std::string errMsg = fmt::format( "MAX_PACING_RATE_KNOB_SEQUENCED frame received with invalid rate {}", rateBytesPerSecStr); - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(TransportErrorCode::INTERNAL_ERROR, std::move(errMsg))); } @@ -926,7 +926,7 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { std::string errMsg = fmt::format( "MAX_PACING_RATE_KNOB_SEQUENCED frame received with invalid sequence number {}", seqNumStr); - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(TransportErrorCode::INTERNAL_ERROR, std::move(errMsg))); } @@ -936,7 +936,7 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { serverTransport->serverConn_->statsCallback, onTransportKnobOutOfOrder, TransportKnobParamId::MAX_PACING_RATE_KNOB_SEQUENCED); - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::INTERNAL_ERROR, "MAX_PACING_RATE_KNOB_SEQUENCED frame received out of order")); } @@ -946,15 +946,15 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { "and sequence number {}", maybeRateBytesPerSec.value(), expectedSeqNum.value()); - serverTransport->setMaxPacingRate(maybeRateBytesPerSec.value()); + (void)serverTransport->setMaxPacingRate(maybeRateBytesPerSec.value()); serverTransport->serverConn_->maybeLastMaxPacingRateKnobSeqNum = expectedSeqNum.value(); - return folly::unit; + return {}; }); registerTransportKnobParamHandler( static_cast(TransportKnobParamId::CC_EXPERIMENTAL), - [](QuicServerTransport* serverTransport, TransportKnobParam::Val val) - -> folly::Expected { + [](QuicServerTransport* serverTransport, + TransportKnobParam::Val val) -> quic::Expected { CHECK(serverTransport); auto server_conn = serverTransport->serverConn_; if (server_conn->congestionController) { @@ -968,26 +968,26 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { congestionControlTypeToString( server_conn->congestionController->type())); } - return folly::unit; + return {}; }); registerTransportKnobParamHandler( static_cast(TransportKnobParamId::SHORT_HEADER_PADDING_KNOB), - [](QuicServerTransport* serverTransport, TransportKnobParam::Val value) - -> folly::Expected { + [](QuicServerTransport* serverTransport, + TransportKnobParam::Val value) -> quic::Expected { CHECK(serverTransport); auto val = std::get(value); serverTransport->serverConn_->transportSettings.paddingModulo = val; VLOG(3) << fmt::format( "SHORT_HEADER_PADDING_KNOB KnobParam received, setting paddingModulo={}", val); - return folly::unit; + return {}; }); registerTransportKnobParamHandler( static_cast( TransportKnobParamId::FIXED_SHORT_HEADER_PADDING_KNOB), - [](QuicServerTransport* serverTransport, TransportKnobParam::Val value) - -> folly::Expected { + [](QuicServerTransport* serverTransport, + TransportKnobParam::Val value) -> quic::Expected { CHECK(serverTransport); auto val = std::get(value); serverTransport->serverConn_->transportSettings @@ -995,13 +995,13 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { VLOG(3) << fmt::format( "FIXED_SHORT_HEADER_PADDING_KNOB KnobParam received, setting fixedShortHeaderPadding={}", val); - return folly::unit; + return {}; }); registerTransportKnobParamHandler( static_cast(TransportKnobParamId::ADAPTIVE_LOSS_DETECTION), - [](QuicServerTransport* serverTransport, TransportKnobParam::Val val) - -> folly::Expected { + [](QuicServerTransport* serverTransport, + TransportKnobParam::Val val) -> quic::Expected { CHECK(serverTransport); auto server_conn = serverTransport->serverConn_; auto useAdaptiveLossReorderingThresholds = @@ -1011,13 +1011,13 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { VLOG(3) << fmt::format( "ADAPTIVE_LOSS_DETECTION KnobParam received, UseAdaptiveLossReorderingThresholds is now set to {}", useAdaptiveLossReorderingThresholds); - return folly::unit; + return {}; }); registerTransportKnobParamHandler( static_cast(TransportKnobParamId::PACER_EXPERIMENTAL), - [](QuicServerTransport* serverTransport, TransportKnobParam::Val val) - -> folly::Expected { + [](QuicServerTransport* serverTransport, + TransportKnobParam::Val val) -> quic::Expected { CHECK(serverTransport); auto server_conn = serverTransport->serverConn_; if (server_conn->pacer) { @@ -1028,35 +1028,35 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { "setting experimental={} for pacer", enableExperimental); } - return folly::unit; + return {}; }); registerTransportKnobParamHandler( static_cast(TransportKnobParamId::KEEPALIVE_ENABLED), - [](QuicServerTransport* serverTransport, TransportKnobParam::Val value) - -> folly::Expected { + [](QuicServerTransport* serverTransport, + TransportKnobParam::Val value) -> quic::Expected { CHECK(serverTransport); auto val = std::get(value); auto server_conn = serverTransport->serverConn_; server_conn->transportSettings.enableKeepalive = static_cast(val); VLOG(3) << "KEEPALIVE_ENABLED KnobParam received: " << static_cast(val); - return folly::unit; + return {}; }); registerTransportKnobParamHandler( static_cast(TransportKnobParamId::REMOVE_FROM_LOSS_BUFFER), - [](QuicServerTransport* serverTransport, TransportKnobParam::Val value) - -> folly::Expected { + [](QuicServerTransport* serverTransport, + TransportKnobParam::Val value) -> quic::Expected { CHECK(serverTransport); auto val = std::get(value); // Temporarily disabled while we investigate some related bugs. VLOG(3) << "REMOVE_FROM_LOSS_BUFFER KnobParam received: " << static_cast(val); - return folly::unit; + return {}; }); registerTransportKnobParamHandler( static_cast(TransportKnobParamId::ACK_FREQUENCY_POLICY), - [](QuicServerTransport* serverTransport, TransportKnobParam::Val value) - -> folly::Expected { + [](QuicServerTransport* serverTransport, + TransportKnobParam::Val value) -> quic::Expected { CHECK(serverTransport); const std::string* valPtr = std::get_if(&value); @@ -1064,7 +1064,7 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { auto errMsg = "Received invalid type for ACK_FREQUENCY_POLICY KnobParam: expected string"; VLOG(3) << errMsg; - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(TransportErrorCode::INTERNAL_ERROR, errMsg)); } @@ -1106,38 +1106,38 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { auto errMsg = fmt::format( "Received invalid KnobParam for ACK_FREQUENCY_POLICY: {}", val); VLOG(3) << errMsg; - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(TransportErrorCode::INTERNAL_ERROR, std::move(errMsg))); } - return folly::unit; + return {}; }); registerTransportKnobParamHandler( static_cast(TransportKnobParamId::FIRE_LOOP_EARLY), - [](QuicServerTransport* serverTransport, TransportKnobParam::Val value) - -> folly::Expected { + [](QuicServerTransport* serverTransport, + TransportKnobParam::Val value) -> quic::Expected { CHECK(serverTransport); auto val = std::get(value); serverTransport->writeLooper_->setFireLoopEarly(static_cast(val)); VLOG(3) << "FIRE_LOOP_EARLY KnobParam received: " << static_cast(val); - return folly::unit; + return {}; }); registerTransportKnobParamHandler( static_cast(TransportKnobParamId::PACING_TIMER_TICK), - [](QuicServerTransport* serverTransport, TransportKnobParam::Val value) - -> folly::Expected { + [](QuicServerTransport* serverTransport, + TransportKnobParam::Val value) -> quic::Expected { CHECK(serverTransport); auto val = std::get(value); auto serverConn = serverTransport->serverConn_; serverConn->transportSettings.pacingTickInterval = std::chrono::microseconds(val); VLOG(3) << "PACING_TIMER_TICK KnobParam received: " << val; - return folly::unit; + return {}; }); registerTransportKnobParamHandler( static_cast(TransportKnobParamId::DEFAULT_STREAM_PRIORITY), - [](QuicServerTransport* serverTransport, TransportKnobParam::Val value) - -> folly::Expected { + [](QuicServerTransport* serverTransport, + TransportKnobParam::Val value) -> quic::Expected { CHECK(serverTransport); auto val = std::get(value); auto serverConn = serverTransport->serverConn_; @@ -1154,29 +1154,29 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { "Received invalid KnobParam for DEFAULT_STREAM_PRIORITY: {}", val); VLOG(3) << errMsg; - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(TransportErrorCode::INTERNAL_ERROR, std::move(errMsg))); } serverConn->transportSettings.defaultPriority = HTTPPriorityQueue::Priority(level, incremental); VLOG(3) << "DEFAULT_STREAM_PRIORITY KnobParam received: " << val; - return folly::unit; + return {}; }); registerTransportKnobParamHandler( static_cast(TransportKnobParamId::WRITE_LOOP_TIME_FRACTION), - [](QuicServerTransport* serverTransport, TransportKnobParam::Val value) - -> folly::Expected { + [](QuicServerTransport* serverTransport, + TransportKnobParam::Val value) -> quic::Expected { CHECK(serverTransport); auto val = std::get(value); auto serverConn = serverTransport->serverConn_; serverConn->transportSettings.writeLimitRttFraction = val; VLOG(3) << "WRITE_LOOP_TIME_FRACTION KnobParam received: " << val; - return folly::unit; + return {}; }); registerTransportKnobParamHandler( static_cast(TransportKnobParamId::WRITES_PER_STREAM), - [](QuicServerTransport* serverTransport, TransportKnobParam::Val value) - -> folly::Expected { + [](QuicServerTransport* serverTransport, + TransportKnobParam::Val value) -> quic::Expected { CHECK(serverTransport); auto val = std::get(value); auto serverConn = serverTransport->serverConn_; @@ -1184,30 +1184,30 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { serverConn->streamManager->setWriteQueueMaxNextsPerStream( serverConn->transportSettings.priorityQueueWritesPerStream); VLOG(3) << "WRITES_PER_STREAM KnobParam received: " << val; - return folly::unit; + return {}; }); registerTransportKnobParamHandler( static_cast(TransportKnobParamId::CC_CONFIG), - [](QuicServerTransport* serverTransport, TransportKnobParam::Val value) - -> folly::Expected { + [](QuicServerTransport* serverTransport, + TransportKnobParam::Val value) -> quic::Expected { CHECK(serverTransport); auto val = std::get(value); try { serverTransport->conn_->transportSettings.ccaConfig = parseCongestionControlConfig(val); VLOG(3) << "CC_CONFIG KnobParam received: " << val; - return folly::unit; + return {}; } catch (const std::exception& ex) { std::string errorMsg = fmt::format( "Failed to parse congestion control config: {}", ex.what()); - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::INTERNAL_ERROR, std::move(errorMsg))); } }); registerTransportKnobParamHandler( static_cast(TransportKnobParamId::CONNECTION_MIGRATION), - [](QuicServerTransport* serverTransport, TransportKnobParam::Val value) - -> folly::Expected { + [](QuicServerTransport* serverTransport, + TransportKnobParam::Val value) -> quic::Expected { CHECK(serverTransport); auto val = std::get(value); auto server_conn = serverTransport->serverConn_; @@ -1215,32 +1215,32 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { !static_cast(val); VLOG(3) << "CONNECTION_MIGRATION KnobParam received: " << static_cast(val); - return folly::unit; + return {}; }); registerTransportKnobParamHandler( static_cast(TransportKnobParamId::KEY_UPDATE_INTERVAL), - [](QuicServerTransport* serverTransport, TransportKnobParam::Val value) - -> folly::Expected { + [](QuicServerTransport* serverTransport, + TransportKnobParam::Val value) -> quic::Expected { CHECK(serverTransport); auto val = std::get(value); if (val < 1000 || val > 8ul * 1000 * 1000) { std::string errMsg = fmt::format( "KEY_UPDATE_INTERVAL KnobParam received with invalid value: {}", val); - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(TransportErrorCode::INTERNAL_ERROR, std::move(errMsg))); } auto server_conn = serverTransport->serverConn_; server_conn->transportSettings.initiateKeyUpdate = val > 0; server_conn->transportSettings.keyUpdatePacketCountInterval = val; VLOG(3) << "KEY_UPDATE_INTERVAL KnobParam received: " << val; - return folly::unit; + return {}; }); registerTransportKnobParamHandler( static_cast( TransportKnobParamId::USE_NEW_STREAM_BLOCKED_CONDITION), - [](QuicServerTransport* serverTransport, TransportKnobParam::Val value) - -> folly::Expected { + [](QuicServerTransport* serverTransport, + TransportKnobParam::Val value) -> quic::Expected { CHECK(serverTransport); bool useNewStreamBlockedCondition = static_cast(std::get(value)); @@ -1249,13 +1249,13 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { useNewStreamBlockedCondition; VLOG(3) << "USE_NEW_STREAM_BLOCKED_CONDITION KnobParam received: " << useNewStreamBlockedCondition; - return folly::unit; + return {}; }); registerTransportKnobParamHandler( static_cast( TransportKnobParamId::AUTOTUNE_RECV_STREAM_FLOW_CONTROL), - [](QuicServerTransport* serverTransport, TransportKnobParam::Val value) - -> folly::Expected { + [](QuicServerTransport* serverTransport, + TransportKnobParam::Val value) -> quic::Expected { CHECK(serverTransport); bool autotuneReceiveStreamFlowControl = static_cast(std::get(value)); @@ -1264,13 +1264,13 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { autotuneReceiveStreamFlowControl; VLOG(3) << "AUTOTUNE_RECV_STREAM_FLOW_CONTROL KnobParam received: " << autotuneReceiveStreamFlowControl; - return folly::unit; + return {}; }); registerTransportKnobParamHandler( static_cast( TransportKnobParamId::INFLIGHT_REORDERING_THRESHOLD), - [](QuicServerTransport* serverTransport, TransportKnobParam::Val value) - -> folly::Expected { + [](QuicServerTransport* serverTransport, + TransportKnobParam::Val value) -> quic::Expected { CHECK(serverTransport); bool inflightReorderingThreshold = static_cast(std::get(value)); @@ -1279,23 +1279,23 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { inflightReorderingThreshold; VLOG(3) << "INFLIGHT_REORDERING_THRESHOLD KnobParam received: " << inflightReorderingThreshold; - return folly::unit; + return {}; }); registerTransportKnobParamHandler( static_cast(TransportKnobParamId::PACER_MIN_BURST_PACKETS), - [](QuicServerTransport* serverTransport, TransportKnobParam::Val value) - -> folly::Expected { + [](QuicServerTransport* serverTransport, + TransportKnobParam::Val value) -> quic::Expected { CHECK(serverTransport); auto val = std::get(value); auto serverConn = serverTransport->serverConn_; serverConn->transportSettings.minBurstPackets = val; VLOG(3) << "PACER_MIN_BURST_PACKETS KnobParam received: " << val; - return folly::unit; + return {}; }); registerTransportKnobParamHandler( static_cast(TransportKnobParamId::MAX_BATCH_PACKETS), - [](QuicServerTransport* serverTransport, TransportKnobParam::Val value) - -> folly::Expected { + [](QuicServerTransport* serverTransport, + TransportKnobParam::Val value) -> quic::Expected { CHECK(serverTransport); auto val = std::get(value); auto serverConn = serverTransport->serverConn_; @@ -1304,12 +1304,12 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { ? val : kMaxWriteConnectionDataPacketLimit; VLOG(3) << "MAX_BATCH_PACKETS KnobParam received: " << val; - return folly::unit; + return {}; }); registerTransportKnobParamHandler( static_cast(TransportKnobParamId::USE_NEW_PRIORITY_QUEUE), - [](QuicServerTransport* serverTransport, TransportKnobParam::Val value) - -> folly::Expected { + [](QuicServerTransport* serverTransport, + TransportKnobParam::Val value) -> quic::Expected { CHECK(serverTransport); bool useNewPriorityQueue = static_cast(std::get(value)); auto serverConn = serverTransport->serverConn_; @@ -1319,7 +1319,7 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { useNewPriorityQueue); if (refreshResult.hasError()) { LOG_EVERY_N(ERROR, 1000) << "Refresh transport settings failed"; - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::INTERNAL_ERROR, "Refresh transport settings failed")); } else { @@ -1327,7 +1327,7 @@ void QuicServerTransport::registerAllTransportKnobParamHandlers() { useNewPriorityQueue, serverConn->transportSettings.useNewPriorityQueue); } - return folly::unit; + return {}; }); } @@ -1345,37 +1345,46 @@ QuicSocket::WriteResult QuicServerTransport::writeBufMeta( bool eof, ByteEventCallback* cb) { if (isReceivingStream(conn_->nodeType, id)) { - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } if (closeState_ != CloseState::OPEN) { - return folly::makeUnexpected(LocalErrorCode::CONNECTION_CLOSED); + return quic::make_unexpected(LocalErrorCode::CONNECTION_CLOSED); } [[maybe_unused]] auto self = sharedGuard(); try { // Check whether stream exists before calling getStream to avoid // creating a peer stream if it does not exist yet. if (!conn_->streamManager->streamExists(id)) { - return folly::makeUnexpected(LocalErrorCode::STREAM_NOT_EXISTS); + return quic::make_unexpected(LocalErrorCode::STREAM_NOT_EXISTS); } auto stream = CHECK_NOTNULL(conn_->streamManager->getStream(id).value_or(nullptr)); if (!stream->writable()) { - return folly::makeUnexpected(LocalErrorCode::STREAM_CLOSED); + return quic::make_unexpected(LocalErrorCode::STREAM_CLOSED); } if (!stream->dsrSender) { - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } if (stream->currentWriteOffset == 0 && stream->pendingWrites.empty()) { // If nothing has been written ever, meta writing isn't allowed. - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } // Register DeliveryCallback for the data + eof offset. if (cb) { auto dataLength = data.length + (eof ? 1 : 0); if (dataLength) { auto currentLargestWriteOffset = getLargestWriteOffsetSeen(*stream); - registerDeliveryCallback( + auto deliveryResult = registerDeliveryCallback( id, currentLargestWriteOffset + dataLength - 1, cb); + if (!deliveryResult.has_value()) { + VLOG(4) << "Failed to register delivery callback: " + << toString(deliveryResult.error()); + exceptionCloseWhat_ = "Failed to register delivery callback"; + closeImpl(QuicError( + deliveryResult.error(), + std::string("registerDeliveryCallback() error"))); + return quic::make_unexpected(LocalErrorCode::TRANSPORT_ERROR); + } } } bool wasAppLimitedOrIdle = false; @@ -1384,14 +1393,14 @@ QuicSocket::WriteResult QuicServerTransport::writeBufMeta( wasAppLimitedOrIdle |= conn_->streamManager->isAppIdle(); } auto writeResult = writeBufMetaToQuicStream(*stream, data, eof); - if (writeResult.hasError()) { + if (!writeResult.has_value()) { VLOG(4) << __func__ << " streamId=" << id << " " << writeResult.error().message << " " << *this; exceptionCloseWhat_ = writeResult.error().message; closeImpl(QuicError( QuicErrorCode(*writeResult.error().code.asTransportErrorCode()), std::string("writeChain() error"))); - return folly::makeUnexpected(LocalErrorCode::TRANSPORT_ERROR); + return quic::make_unexpected(LocalErrorCode::TRANSPORT_ERROR); } // If we were previously app limited restart pacing with the current rate. if (wasAppLimitedOrIdle && conn_->pacer) { @@ -1404,14 +1413,14 @@ QuicSocket::WriteResult QuicServerTransport::writeBufMeta( exceptionCloseWhat_ = ex.what(); closeImpl(QuicError( QuicErrorCode(ex.errorCode()), std::string("writeChain() error"))); - return folly::makeUnexpected(LocalErrorCode::TRANSPORT_ERROR); + return quic::make_unexpected(LocalErrorCode::TRANSPORT_ERROR); } catch (const QuicInternalException& ex) { VLOG(4) << __func__ << " streamId=" << id << " " << ex.what() << " " << *this; exceptionCloseWhat_ = ex.what(); closeImpl(QuicError( QuicErrorCode(ex.errorCode()), std::string("writeChain() error"))); - return folly::makeUnexpected(ex.errorCode()); + return quic::make_unexpected(ex.errorCode()); } catch (const std::exception& ex) { VLOG(4) << __func__ << " streamId=" << id << " " << ex.what() << " " << *this; @@ -1419,32 +1428,32 @@ QuicSocket::WriteResult QuicServerTransport::writeBufMeta( closeImpl(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::string("writeChain() error"))); - return folly::makeUnexpected(LocalErrorCode::INTERNAL_ERROR); + return quic::make_unexpected(LocalErrorCode::INTERNAL_ERROR); } - return folly::unit; + return {}; } QuicSocket::WriteResult QuicServerTransport::setDSRPacketizationRequestSender( StreamId id, std::unique_ptr sender) { if (closeState_ != CloseState::OPEN) { - return folly::makeUnexpected(LocalErrorCode::CONNECTION_CLOSED); + return quic::make_unexpected(LocalErrorCode::CONNECTION_CLOSED); } if (isReceivingStream(conn_->nodeType, id)) { - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } [[maybe_unused]] auto self = sharedGuard(); try { // Check whether stream exists before calling getStream to avoid // creating a peer stream if it does not exist yet. if (!conn_->streamManager->streamExists(id)) { - return folly::makeUnexpected(LocalErrorCode::STREAM_NOT_EXISTS); + return quic::make_unexpected(LocalErrorCode::STREAM_NOT_EXISTS); } auto stream = CHECK_NOTNULL(conn_->streamManager->getStream(id).value_or(nullptr)); // Only allow resetting it back to nullptr once set. if (stream->dsrSender && sender != nullptr) { - return folly::makeUnexpected(LocalErrorCode::INVALID_OPERATION); + return quic::make_unexpected(LocalErrorCode::INVALID_OPERATION); } if (stream->dsrSender != nullptr) { // If any of these aren't true then we are abandoning stream data. @@ -1453,10 +1462,10 @@ QuicSocket::WriteResult QuicServerTransport::setDSRPacketizationRequestSender( CHECK_EQ(stream->retransmissionBufMetas.size(), 0) << stream; stream->dsrSender->release(); stream->dsrSender = nullptr; - return folly::unit; + return {}; } if (!stream->writable()) { - return folly::makeUnexpected(LocalErrorCode::STREAM_CLOSED); + return quic::make_unexpected(LocalErrorCode::STREAM_CLOSED); } stream->dsrSender = std::move(sender); // Default to disabling opportunistic ACKing for DSR since it causes extra @@ -1477,14 +1486,14 @@ QuicSocket::WriteResult QuicServerTransport::setDSRPacketizationRequestSender( exceptionCloseWhat_ = ex.what(); closeImpl(QuicError( QuicErrorCode(ex.errorCode()), std::string("writeChain() error"))); - return folly::makeUnexpected(LocalErrorCode::TRANSPORT_ERROR); + return quic::make_unexpected(LocalErrorCode::TRANSPORT_ERROR); } catch (const QuicInternalException& ex) { VLOG(4) << __func__ << " streamId=" << id << " " << ex.what() << " " << *this; exceptionCloseWhat_ = ex.what(); closeImpl(QuicError( QuicErrorCode(ex.errorCode()), std::string("writeChain() error"))); - return folly::makeUnexpected(ex.errorCode()); + return quic::make_unexpected(ex.errorCode()); } catch (const std::exception& ex) { VLOG(4) << __func__ << " streamId=" << id << " " << ex.what() << " " << *this; @@ -1492,9 +1501,9 @@ QuicSocket::WriteResult QuicServerTransport::setDSRPacketizationRequestSender( closeImpl(QuicError( QuicErrorCode(TransportErrorCode::INTERNAL_ERROR), std::string("writeChain() error"))); - return folly::makeUnexpected(LocalErrorCode::INTERNAL_ERROR); + return quic::make_unexpected(LocalErrorCode::INTERNAL_ERROR); } - return folly::unit; + return {}; } CipherInfo QuicServerTransport::getOneRttCipherInfo() const { diff --git a/quic/server/QuicServerTransport.h b/quic/server/QuicServerTransport.h index 291ce7c76..14709e93f 100644 --- a/quic/server/QuicServerTransport.h +++ b/quic/server/QuicServerTransport.h @@ -137,10 +137,10 @@ class QuicServerTransport void verifiedClientAddress(); // From QuicTransportBase - folly::Expected onReadData( + quic::Expected onReadData( const folly::SocketAddress& peer, ReceivedUdpPacket&& udpPacket) override; - folly::Expected writeData() override; + quic::Expected writeData() override; void closeTransport() override; void unbindConnection() override; bool hasWriteCipher() const override; @@ -215,7 +215,7 @@ class QuicServerTransport // Made it protected for testing purpose void registerTransportKnobParamHandler( uint64_t paramId, - std::function( + std::function( QuicServerTransport*, TransportKnobParam::Val)>&& handler); @@ -237,8 +237,7 @@ class QuicServerTransport void maybeNotifyTransportReady(); void maybeNotifyConnectionIdRetired(); void maybeNotifyConnectionIdBound(); - [[nodiscard]] folly::Expected - maybeWriteNewSessionTicket(); + [[nodiscard]] quic::Expected maybeWriteNewSessionTicket(); void maybeIssueConnectionIds(); void maybeNotifyHandshakeFinished(); bool hasReadCipher() const; @@ -269,7 +268,7 @@ class QuicServerTransport QuicServerConnectionState* serverConn_; folly::F14FastMap< uint64_t, - std::function( + std::function( QuicServerTransport*, TransportKnobParam::Val)>> transportKnobParamHandlers_; diff --git a/quic/server/QuicServerWorker.cpp b/quic/server/QuicServerWorker.cpp index f20a58cfa..b79a8e6ea 100644 --- a/quic/server/QuicServerWorker.cpp +++ b/quic/server/QuicServerWorker.cpp @@ -108,7 +108,7 @@ void QuicServerWorker::bind( // TODO this totally doesn't work, we can't apply socket options before // bind, since bind creates the fd. if (socketOptions_) { - applySocketOptions( + (void)applySocketOptions( tmpSock, *socketOptions_, address.getFamily(), @@ -119,7 +119,7 @@ void QuicServerWorker::bind( } socket_->bind(address, bindOptions); if (socketOptions_) { - applySocketOptions( + (void)applySocketOptions( tmpSock, *socketOptions_, address.getFamily(), @@ -151,12 +151,12 @@ void QuicServerWorker::applyAllSocketOptions() { FollyQuicAsyncUDPSocket tmpSock( std::make_shared(evb_.get()), *socket_); if (socketOptions_) { - applySocketOptions( + (void)applySocketOptions( tmpSock, *socketOptions_, getAddress().getFamily(), folly::SocketOptionKey::ApplyPos::PRE_BIND); - applySocketOptions( + (void)applySocketOptions( tmpSock, *socketOptions_, getAddress().getFamily(), @@ -1503,7 +1503,7 @@ std::string QuicServerWorker::logRoutingInfo(const ConnectionId& connId) const { if (connIdAlgo_->canParse(connId)) { auto maybeParsedConnIdParam = connIdAlgo_->parseConnectionId(connId); - if (maybeParsedConnIdParam.hasValue()) { + if (maybeParsedConnIdParam.has_value()) { const auto& connIdParam = maybeParsedConnIdParam.value(); return base + fmt::format( diff --git a/quic/server/handshake/AppToken.cpp b/quic/server/handshake/AppToken.cpp index d502043a2..da7814cac 100644 --- a/quic/server/handshake/AppToken.cpp +++ b/quic/server/handshake/AppToken.cpp @@ -9,7 +9,7 @@ namespace quic { -folly::Expected +quic::Expected createTicketTransportParameters( uint64_t idleTimeout, uint64_t maxRecvPacketSize, @@ -25,21 +25,21 @@ createTicketTransportParameters( auto idleTimeoutResult = encodeIntegerParameter(TransportParameterId::idle_timeout, idleTimeout); if (idleTimeoutResult.hasError()) { - return folly::makeUnexpected(idleTimeoutResult.error()); + return quic::make_unexpected(idleTimeoutResult.error()); } params.parameters.push_back(idleTimeoutResult.value()); auto maxRecvPacketSizeResult = encodeIntegerParameter( TransportParameterId::max_packet_size, maxRecvPacketSize); if (maxRecvPacketSizeResult.hasError()) { - return folly::makeUnexpected(maxRecvPacketSizeResult.error()); + return quic::make_unexpected(maxRecvPacketSizeResult.error()); } params.parameters.push_back(maxRecvPacketSizeResult.value()); auto initialMaxDataResult = encodeIntegerParameter( TransportParameterId::initial_max_data, initialMaxData); if (initialMaxDataResult.hasError()) { - return folly::makeUnexpected(initialMaxDataResult.error()); + return quic::make_unexpected(initialMaxDataResult.error()); } params.parameters.push_back(initialMaxDataResult.value()); @@ -47,7 +47,7 @@ createTicketTransportParameters( TransportParameterId::initial_max_stream_data_bidi_local, initialMaxStreamDataBidiLocal); if (initialMaxStreamDataBidiLocalResult.hasError()) { - return folly::makeUnexpected(initialMaxStreamDataBidiLocalResult.error()); + return quic::make_unexpected(initialMaxStreamDataBidiLocalResult.error()); } params.parameters.push_back(initialMaxStreamDataBidiLocalResult.value()); @@ -55,7 +55,7 @@ createTicketTransportParameters( TransportParameterId::initial_max_stream_data_bidi_remote, initialMaxStreamDataBidiRemote); if (initialMaxStreamDataBidiRemoteResult.hasError()) { - return folly::makeUnexpected(initialMaxStreamDataBidiRemoteResult.error()); + return quic::make_unexpected(initialMaxStreamDataBidiRemoteResult.error()); } params.parameters.push_back(initialMaxStreamDataBidiRemoteResult.value()); @@ -63,28 +63,28 @@ createTicketTransportParameters( TransportParameterId::initial_max_stream_data_uni, initialMaxStreamDataUni); if (initialMaxStreamDataUniResult.hasError()) { - return folly::makeUnexpected(initialMaxStreamDataUniResult.error()); + return quic::make_unexpected(initialMaxStreamDataUniResult.error()); } params.parameters.push_back(initialMaxStreamDataUniResult.value()); auto initialMaxStreamsBidiResult = encodeIntegerParameter( TransportParameterId::initial_max_streams_bidi, initialMaxStreamsBidi); if (initialMaxStreamsBidiResult.hasError()) { - return folly::makeUnexpected(initialMaxStreamsBidiResult.error()); + return quic::make_unexpected(initialMaxStreamsBidiResult.error()); } params.parameters.push_back(initialMaxStreamsBidiResult.value()); auto initialMaxStreamsUniResult = encodeIntegerParameter( TransportParameterId::initial_max_streams_uni, initialMaxStreamsUni); if (initialMaxStreamsUniResult.hasError()) { - return folly::makeUnexpected(initialMaxStreamsUniResult.error()); + return quic::make_unexpected(initialMaxStreamsUniResult.error()); } params.parameters.push_back(initialMaxStreamsUniResult.value()); auto extendedAckFeaturesResult = encodeIntegerParameter( TransportParameterId::extended_ack_features, extendedAckFeatures); if (extendedAckFeaturesResult.hasError()) { - return folly::makeUnexpected(extendedAckFeaturesResult.error()); + return quic::make_unexpected(extendedAckFeaturesResult.error()); } params.parameters.push_back(extendedAckFeaturesResult.value()); @@ -92,7 +92,7 @@ createTicketTransportParameters( auto cwndHintBytesResult = encodeIntegerParameter( TransportParameterId::cwnd_hint_bytes, *cwndHintBytes); if (cwndHintBytesResult.hasError()) { - return folly::makeUnexpected(cwndHintBytesResult.error()); + return quic::make_unexpected(cwndHintBytesResult.error()); } params.parameters.push_back(cwndHintBytesResult.value()); } diff --git a/quic/server/handshake/AppToken.h b/quic/server/handshake/AppToken.h index 5a3376e05..0797ceeb5 100644 --- a/quic/server/handshake/AppToken.h +++ b/quic/server/handshake/AppToken.h @@ -7,9 +7,9 @@ #pragma once -#include #include #include +#include #include #include @@ -29,7 +29,7 @@ struct AppToken { std::unique_ptr appParams; }; -folly::Expected +quic::Expected createTicketTransportParameters( uint64_t idleTimeout, uint64_t maxRecvPacketSize, diff --git a/quic/server/handshake/BUCK b/quic/server/handshake/BUCK index 83577e262..7ba73b46d 100644 --- a/quic/server/handshake/BUCK +++ b/quic/server/handshake/BUCK @@ -52,9 +52,9 @@ mvfst_cpp_library( "AppToken.h", ], exported_deps = [ - "//folly:expected", "//quic:constants", "//quic:exception", + "//quic/common:expected", "//quic/handshake:transport_parameters", ], ) diff --git a/quic/server/handshake/ServerHandshake.cpp b/quic/server/handshake/ServerHandshake.cpp index b0ed781af..5e8818326 100644 --- a/quic/server/handshake/ServerHandshake.cpp +++ b/quic/server/handshake/ServerHandshake.cpp @@ -33,7 +33,7 @@ void ServerHandshake::initialize( initializeImpl(callback, std::move(validator)); } -folly::Expected ServerHandshake::doHandshake( +quic::Expected ServerHandshake::doHandshake( BufPtr data, EncryptionLevel encryptionLevel) { SCOPE_EXIT { @@ -57,13 +57,13 @@ folly::Expected ServerHandshake::doHandshake( } processPendingEvents(); if (error_) { - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(error_->second, std::move(error_->first))); } - return folly::unit; + return {}; } -folly::Expected ServerHandshake::writeNewSessionTicket( +quic::Expected ServerHandshake::writeNewSessionTicket( const AppToken& appToken) { SCOPE_EXIT { inHandshakeStack_ = false; @@ -72,34 +72,34 @@ folly::Expected ServerHandshake::writeNewSessionTicket( writeNewSessionTicketToCrypto(appToken); processPendingEvents(); if (error_) { - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(error_->second, std::move(error_->first))); } - return folly::unit; + return {}; } -folly::Expected, QuicError> +quic::Expected, QuicError> ServerHandshake::getHandshakeReadCipher() { if (error_) { - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(error_->second, std::move(error_->first))); } return std::move(handshakeReadCipher_); } -folly::Expected, QuicError> +quic::Expected, QuicError> ServerHandshake::getFirstOneRttWriteCipher() { if (error_) { - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(error_->second, std::move(error_->first))); } return std::move(oneRttWriteCipher_); } -folly::Expected, QuicError> +quic::Expected, QuicError> ServerHandshake::getNextOneRttWriteCipher() { if (error_) { - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(error_->second, std::move(error_->first))); } CHECK(writeTrafficSecret_); @@ -111,19 +111,19 @@ ServerHandshake::getNextOneRttWriteCipher() { return cipher; } -folly::Expected, QuicError> +quic::Expected, QuicError> ServerHandshake::getFirstOneRttReadCipher() { if (error_) { - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(error_->second, std::move(error_->first))); } return std::move(oneRttReadCipher_); } -folly::Expected, QuicError> +quic::Expected, QuicError> ServerHandshake::getNextOneRttReadCipher() { if (error_) { - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(error_->second, std::move(error_->first))); } CHECK(readTrafficSecret_); @@ -135,46 +135,46 @@ ServerHandshake::getNextOneRttReadCipher() { return cipher; } -folly::Expected, QuicError> +quic::Expected, QuicError> ServerHandshake::getZeroRttReadCipher() { if (error_) { - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(error_->second, std::move(error_->first))); } return std::move(zeroRttReadCipher_); } -folly::Expected, QuicError> +quic::Expected, QuicError> ServerHandshake::getOneRttReadHeaderCipher() { if (error_) { - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(error_->second, std::move(error_->first))); } return std::move(oneRttReadHeaderCipher_); } -folly::Expected, QuicError> +quic::Expected, QuicError> ServerHandshake::getOneRttWriteHeaderCipher() { if (error_) { - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(error_->second, std::move(error_->first))); } return std::move(oneRttWriteHeaderCipher_); } -folly::Expected, QuicError> +quic::Expected, QuicError> ServerHandshake::getHandshakeReadHeaderCipher() { if (error_) { - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(error_->second, std::move(error_->first))); } return std::move(handshakeReadHeaderCipher_); } -folly::Expected, QuicError> +quic::Expected, QuicError> ServerHandshake::getZeroRttReadHeaderCipher() { if (error_) { - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(error_->second, std::move(error_->first))); } return std::move(zeroRttReadHeaderCipher_); diff --git a/quic/server/handshake/ServerHandshake.h b/quic/server/handshake/ServerHandshake.h index cb1ddb290..2f972cd72 100644 --- a/quic/server/handshake/ServerHandshake.h +++ b/quic/server/handshake/ServerHandshake.h @@ -91,15 +91,15 @@ class ServerHandshake : public Handshake { * Performs the handshake, after a handshake you should check whether or * not an event is available. */ - [[nodiscard]] virtual folly::Expected doHandshake( + [[nodiscard]] virtual quic::Expected doHandshake( BufPtr data, EncryptionLevel encryptionLevel); /** * Writes a session ticket on the connection. */ - [[nodiscard]] virtual folly::Expected - writeNewSessionTicket(const AppToken& appToken); + [[nodiscard]] virtual quic::Expected writeNewSessionTicket( + const AppToken& appToken); /** * Returns a reference to the CryptoFactory used internally. @@ -110,14 +110,14 @@ class ServerHandshake : public Handshake { * An edge triggered API to get the handshakeReadCipher. Once you receive the * write cipher subsequent calls will return null. */ - [[nodiscard]] folly::Expected, QuicError> + [[nodiscard]] quic::Expected, QuicError> getHandshakeReadCipher(); /** * An edge triggered API to get the first oneRttWriteCipher. Once you receive * the write cipher subsequent calls will return null. */ - [[nodiscard]] folly::Expected, QuicError> + [[nodiscard]] quic::Expected, QuicError> getFirstOneRttWriteCipher(); /** @@ -125,7 +125,7 @@ class ServerHandshake : public Handshake { * one rtt write cipher using the current traffic secret and advance the * traffic secret. */ - [[nodiscard]] folly::Expected, QuicError> + [[nodiscard]] quic::Expected, QuicError> getNextOneRttWriteCipher() override; /** @@ -133,7 +133,7 @@ class ServerHandshake : public Handshake { * read cipher using the current traffic secret and advance the traffic * secret. */ - [[nodiscard]] folly::Expected, QuicError> + [[nodiscard]] quic::Expected, QuicError> getFirstOneRttReadCipher(); /** @@ -141,42 +141,42 @@ class ServerHandshake : public Handshake { * one rtt read cipher using the current traffic secret and advance the * traffic secret. */ - [[nodiscard]] folly::Expected, QuicError> + [[nodiscard]] quic::Expected, QuicError> getNextOneRttReadCipher() override; /** * An edge triggered API to get the zeroRttReadCipher. Once you receive the * zero rtt read cipher subsequent calls will return null. */ - [[nodiscard]] folly::Expected, QuicError> + [[nodiscard]] quic::Expected, QuicError> getZeroRttReadCipher(); /** * An edge triggered API to get the one rtt read header cpher. Once you * receive the header cipher subsequent calls will return null. */ - [[nodiscard]] folly::Expected, QuicError> + [[nodiscard]] quic::Expected, QuicError> getOneRttReadHeaderCipher(); /** * An edge triggered API to get the one rtt write header cpher. Once you * receive the header cipher subsequent calls will return null. */ - [[nodiscard]] folly::Expected, QuicError> + [[nodiscard]] quic::Expected, QuicError> getOneRttWriteHeaderCipher(); /** * An edge triggered API to get the handshake rtt read header cpher. Once you * receive the header cipher subsequent calls will return null. */ - [[nodiscard]] folly::Expected, QuicError> + [[nodiscard]] quic::Expected, QuicError> getHandshakeReadHeaderCipher(); /** * An edge triggered API to get the zero rtt header cpher. Once you * receive the header cipher subsequent calls will return null. */ - [[nodiscard]] folly::Expected, QuicError> + [[nodiscard]] quic::Expected, QuicError> getZeroRttReadHeaderCipher(); /** @@ -322,7 +322,7 @@ class ServerHandshake : public Handshake { virtual EncryptionLevel getReadRecordLayerEncryptionLevel() = 0; virtual void processSocketData(folly::IOBufQueue& queue) = 0; virtual std::unique_ptr buildAead(ByteRange secret) = 0; - [[nodiscard]] virtual folly:: + [[nodiscard]] virtual quic:: Expected, QuicError> buildHeaderCipher(ByteRange secret) = 0; diff --git a/quic/server/handshake/test/ServerHandshakeTest.cpp b/quic/server/handshake/test/ServerHandshakeTest.cpp index 9ca14185d..100bcb0d5 100644 --- a/quic/server/handshake/test/ServerHandshakeTest.cpp +++ b/quic/server/handshake/test/ServerHandshakeTest.cpp @@ -146,7 +146,7 @@ class ServerHandshakeTest : public Test { auto handshakeStateResult = setHandshakeState(); if (handshakeStateResult.hasError()) { VLOG(1) << "server exception " << handshakeStateResult.error().message; - ex = folly::makeUnexpected(handshakeStateResult.error()); + ex = quic::make_unexpected(handshakeStateResult.error()); if (!inRoundScope_ && !handshakeCv.ready()) { VLOG(1) << "Posting handshake cv"; handshakeCv.post(); @@ -185,7 +185,7 @@ class ServerHandshakeTest : public Test { auto result = handshake->doHandshake(std::move(content.data), encryptionLevel); if (result.hasError()) { - ex = folly::makeUnexpected(result.error()); + ex = quic::make_unexpected(result.error()); } } } @@ -213,23 +213,23 @@ class ServerHandshakeTest : public Test { evb.loop(); } - [[nodiscard]] folly::Expected setHandshakeState() { + [[nodiscard]] quic::Expected setHandshakeState() { auto oneRttWriteCipherTmp = handshake->getFirstOneRttWriteCipher(); if (oneRttWriteCipherTmp.hasError()) { - return folly::makeUnexpected(oneRttWriteCipherTmp.error()); + return quic::make_unexpected(oneRttWriteCipherTmp.error()); } auto oneRttReadCipherTmp = handshake->getFirstOneRttReadCipher(); if (oneRttReadCipherTmp.hasError()) { - return folly::makeUnexpected(oneRttReadCipherTmp.error()); + return quic::make_unexpected(oneRttReadCipherTmp.error()); } auto zeroRttReadCipherTmp = handshake->getZeroRttReadCipher(); if (zeroRttReadCipherTmp.hasError()) { - return folly::makeUnexpected(zeroRttReadCipherTmp.error()); + return quic::make_unexpected(zeroRttReadCipherTmp.error()); } auto handshakeWriteCipherTmp = std::move(conn->handshakeWriteCipher); auto handshakeReadCipherTmp = handshake->getHandshakeReadCipher(); if (handshakeReadCipherTmp.hasError()) { - return folly::makeUnexpected(handshakeReadCipherTmp.error()); + return quic::make_unexpected(handshakeReadCipherTmp.error()); } if (oneRttWriteCipherTmp.value()) { oneRttWriteCipher = std::move(oneRttWriteCipherTmp.value()); @@ -246,7 +246,7 @@ class ServerHandshakeTest : public Test { if (handshakeWriteCipherTmp) { handshakeWriteCipher = std::move(handshakeWriteCipherTmp); } - return folly::unit; + return {}; } void expectOneRttReadCipher(bool expected) { @@ -380,7 +380,7 @@ class ServerHandshakeTest : public Test { std::unique_ptr handshakeWriteCipher; std::unique_ptr handshakeReadCipher; - folly::Expected ex{folly::unit}; + quic::Expected ex{}; std::string hostname; std::shared_ptr verifier; std::shared_ptr clientCtx; diff --git a/quic/server/state/ServerStateMachine.cpp b/quic/server/state/ServerStateMachine.cpp index 4a464f364..d6eb2a64b 100644 --- a/quic/server/state/ServerStateMachine.cpp +++ b/quic/server/state/ServerStateMachine.cpp @@ -174,13 +174,13 @@ bool isZeroRttPacketFrameInvalid(const QuicFrame& quicFrame) { } } // namespace -folly::Expected processClientInitialParams( +quic::Expected processClientInitialParams( QuicServerConnectionState& conn, const ClientTransportParameters& clientParams) { auto preferredAddressResult = getIntegerParameter( TransportParameterId::preferred_address, clientParams.parameters); if (preferredAddressResult.hasError()) { - return folly::makeUnexpected(preferredAddressResult.error()); + return quic::make_unexpected(preferredAddressResult.error()); } auto preferredAddress = preferredAddressResult.value(); @@ -188,14 +188,14 @@ folly::Expected processClientInitialParams( TransportParameterId::original_destination_connection_id, clientParams.parameters); if (origConnIdResult.hasError()) { - return folly::makeUnexpected(origConnIdResult.error()); + return quic::make_unexpected(origConnIdResult.error()); } auto origConnId = origConnIdResult.value(); auto statelessResetTokenResult = getIntegerParameter( TransportParameterId::stateless_reset_token, clientParams.parameters); if (statelessResetTokenResult.hasError()) { - return folly::makeUnexpected(statelessResetTokenResult.error()); + return quic::make_unexpected(statelessResetTokenResult.error()); } auto statelessResetToken = statelessResetTokenResult.value(); @@ -203,14 +203,14 @@ folly::Expected processClientInitialParams( TransportParameterId::retry_source_connection_id, clientParams.parameters); if (retrySourceConnIdResult.hasError()) { - return folly::makeUnexpected(retrySourceConnIdResult.error()); + return quic::make_unexpected(retrySourceConnIdResult.error()); } auto retrySourceConnId = retrySourceConnIdResult.value(); auto maxDataResult = getIntegerParameter( TransportParameterId::initial_max_data, clientParams.parameters); if (maxDataResult.hasError()) { - return folly::makeUnexpected(maxDataResult.error()); + return quic::make_unexpected(maxDataResult.error()); } auto maxData = maxDataResult.value(); @@ -218,7 +218,7 @@ folly::Expected processClientInitialParams( TransportParameterId::initial_max_stream_data_bidi_local, clientParams.parameters); if (maxStreamDataBidiLocalResult.hasError()) { - return folly::makeUnexpected(maxStreamDataBidiLocalResult.error()); + return quic::make_unexpected(maxStreamDataBidiLocalResult.error()); } auto maxStreamDataBidiLocal = maxStreamDataBidiLocalResult.value(); @@ -226,7 +226,7 @@ folly::Expected processClientInitialParams( TransportParameterId::initial_max_stream_data_bidi_remote, clientParams.parameters); if (maxStreamDataBidiRemoteResult.hasError()) { - return folly::makeUnexpected(maxStreamDataBidiRemoteResult.error()); + return quic::make_unexpected(maxStreamDataBidiRemoteResult.error()); } auto maxStreamDataBidiRemote = maxStreamDataBidiRemoteResult.value(); @@ -234,42 +234,42 @@ folly::Expected processClientInitialParams( TransportParameterId::initial_max_stream_data_uni, clientParams.parameters); if (maxStreamDataUniResult.hasError()) { - return folly::makeUnexpected(maxStreamDataUniResult.error()); + return quic::make_unexpected(maxStreamDataUniResult.error()); } auto maxStreamDataUni = maxStreamDataUniResult.value(); auto maxStreamsBidiResult = getIntegerParameter( TransportParameterId::initial_max_streams_bidi, clientParams.parameters); if (maxStreamsBidiResult.hasError()) { - return folly::makeUnexpected(maxStreamsBidiResult.error()); + return quic::make_unexpected(maxStreamsBidiResult.error()); } auto maxStreamsBidi = maxStreamsBidiResult.value(); auto maxStreamsUniResult = getIntegerParameter( TransportParameterId::initial_max_streams_uni, clientParams.parameters); if (maxStreamsUniResult.hasError()) { - return folly::makeUnexpected(maxStreamsUniResult.error()); + return quic::make_unexpected(maxStreamsUniResult.error()); } auto maxStreamsUni = maxStreamsUniResult.value(); auto idleTimeoutResult = getIntegerParameter( TransportParameterId::idle_timeout, clientParams.parameters); if (idleTimeoutResult.hasError()) { - return folly::makeUnexpected(idleTimeoutResult.error()); + return quic::make_unexpected(idleTimeoutResult.error()); } auto idleTimeout = idleTimeoutResult.value(); auto ackDelayExponentResult = getIntegerParameter( TransportParameterId::ack_delay_exponent, clientParams.parameters); if (ackDelayExponentResult.hasError()) { - return folly::makeUnexpected(ackDelayExponentResult.error()); + return quic::make_unexpected(ackDelayExponentResult.error()); } auto ackDelayExponent = ackDelayExponentResult.value(); auto packetSizeResult = getIntegerParameter( TransportParameterId::max_packet_size, clientParams.parameters); if (packetSizeResult.hasError()) { - return folly::makeUnexpected(packetSizeResult.error()); + return quic::make_unexpected(packetSizeResult.error()); } auto packetSize = packetSizeResult.value(); @@ -277,28 +277,28 @@ folly::Expected processClientInitialParams( TransportParameterId::active_connection_id_limit, clientParams.parameters); if (activeConnectionIdLimitResult.hasError()) { - return folly::makeUnexpected(activeConnectionIdLimitResult.error()); + return quic::make_unexpected(activeConnectionIdLimitResult.error()); } auto activeConnectionIdLimit = activeConnectionIdLimitResult.value(); auto minAckDelayResult = getIntegerParameter( TransportParameterId::min_ack_delay, clientParams.parameters); if (minAckDelayResult.hasError()) { - return folly::makeUnexpected(minAckDelayResult.error()); + return quic::make_unexpected(minAckDelayResult.error()); } auto minAckDelay = minAckDelayResult.value(); auto maxAckDelayResult = getIntegerParameter( TransportParameterId::max_ack_delay, clientParams.parameters); if (maxAckDelayResult.hasError()) { - return folly::makeUnexpected(maxAckDelayResult.error()); + return quic::make_unexpected(maxAckDelayResult.error()); } auto maxAckDelay = maxAckDelayResult.value(); auto maxDatagramFrameSizeResult = getIntegerParameter( TransportParameterId::max_datagram_frame_size, clientParams.parameters); if (maxDatagramFrameSizeResult.hasError()) { - return folly::makeUnexpected(maxDatagramFrameSizeResult.error()); + return quic::make_unexpected(maxDatagramFrameSizeResult.error()); } auto maxDatagramFrameSize = maxDatagramFrameSizeResult.value(); @@ -307,7 +307,7 @@ folly::Expected processClientInitialParams( TransportParameterId::stream_groups_enabled), clientParams.parameters); if (peerAdvertisedMaxStreamGroupsResult.hasError()) { - return folly::makeUnexpected(peerAdvertisedMaxStreamGroupsResult.error()); + return quic::make_unexpected(peerAdvertisedMaxStreamGroupsResult.error()); } auto peerAdvertisedMaxStreamGroups = peerAdvertisedMaxStreamGroupsResult.value(); @@ -316,7 +316,7 @@ folly::Expected processClientInitialParams( TransportParameterId::ack_receive_timestamps_enabled, clientParams.parameters); if (isAckReceiveTimestampsEnabledResult.hasError()) { - return folly::makeUnexpected(isAckReceiveTimestampsEnabledResult.error()); + return quic::make_unexpected(isAckReceiveTimestampsEnabledResult.error()); } auto isAckReceiveTimestampsEnabled = isAckReceiveTimestampsEnabledResult.value(); @@ -325,7 +325,7 @@ folly::Expected processClientInitialParams( TransportParameterId::max_receive_timestamps_per_ack, clientParams.parameters); if (maxReceiveTimestampsPerAckResult.hasError()) { - return folly::makeUnexpected(maxReceiveTimestampsPerAckResult.error()); + return quic::make_unexpected(maxReceiveTimestampsPerAckResult.error()); } auto maxReceiveTimestampsPerAck = maxReceiveTimestampsPerAckResult.value(); @@ -333,7 +333,7 @@ folly::Expected processClientInitialParams( TransportParameterId::receive_timestamps_exponent, clientParams.parameters); if (receiveTimestampsExponentResult.hasError()) { - return folly::makeUnexpected(receiveTimestampsExponentResult.error()); + return quic::make_unexpected(receiveTimestampsExponentResult.error()); } auto receiveTimestampsExponent = receiveTimestampsExponentResult.value(); @@ -345,13 +345,13 @@ folly::Expected processClientInitialParams( TransportParameterId::initial_source_connection_id, clientParams.parameters); if (initialSourceConnIdResult.hasError()) { - return folly::makeUnexpected(initialSourceConnIdResult.error()); + return quic::make_unexpected(initialSourceConnIdResult.error()); } auto initialSourceConnId = initialSourceConnIdResult.value(); if (!initialSourceConnId || initialSourceConnId.value() != conn.readCodec->getClientConnectionId()) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::TRANSPORT_PARAMETER_ERROR, "Initial CID does not match.")); } @@ -361,7 +361,7 @@ folly::Expected processClientInitialParams( TransportParameterId::knob_frames_supported), clientParams.parameters); if (knobFrameSupportedResult.hasError()) { - return folly::makeUnexpected(knobFrameSupportedResult.error()); + return quic::make_unexpected(knobFrameSupportedResult.error()); } auto knobFrameSupported = knobFrameSupportedResult.value(); @@ -370,7 +370,7 @@ folly::Expected processClientInitialParams( TransportParameterId::extended_ack_features), clientParams.parameters); if (extendedAckFeaturesResult.hasError()) { - return folly::makeUnexpected(extendedAckFeaturesResult.error()); + return quic::make_unexpected(extendedAckFeaturesResult.error()); } auto extendedAckFeatures = extendedAckFeaturesResult.value(); @@ -380,7 +380,7 @@ folly::Expected processClientInitialParams( TransportParameterId::reliable_stream_reset)); if (reliableResetTpIter != clientParams.parameters.end()) { if (!reliableResetTpIter->value->empty()) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::TRANSPORT_PARAMETER_ERROR, "Reliable reset transport parameter must be empty")); } @@ -392,37 +392,37 @@ folly::Expected processClientInitialParams( // validate that we didn't receive original connection ID, stateless // reset token, or preferred address. if (preferredAddress && *preferredAddress != 0) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::TRANSPORT_PARAMETER_ERROR, "Preferred Address is received by server")); } if (origConnId && *origConnId != 0) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::TRANSPORT_PARAMETER_ERROR, "OriginalDestinationConnectionId is received by server")); } if (statelessResetToken && statelessResetToken.value() != 0) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::TRANSPORT_PARAMETER_ERROR, "Stateless Reset Token is received by server")); } if (retrySourceConnId && retrySourceConnId.value() != 0) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::TRANSPORT_PARAMETER_ERROR, "Retry Source Connection ID is received by server")); } if (maxAckDelay && *maxAckDelay >= kMaxAckDelay) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::TRANSPORT_PARAMETER_ERROR, "Max Ack Delay is greater than 2^14 ")); } // TODO Validate active_connection_id_limit if (packetSize && *packetSize < kMinMaxUDPPayload) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::TRANSPORT_PARAMETER_ERROR, fmt::format( "Max packet size too small. received max_packetSize = {}", @@ -449,7 +449,7 @@ folly::Expected processClientInitialParams( conn.streamManager->setMaxLocalBidirectionalStreams( maxStreamsBidi.value_or(0)); if (!maxBidiStreamsResult) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::TRANSPORT_PARAMETER_ERROR, "Failed to set max local bidirectional streams")); } @@ -458,7 +458,7 @@ folly::Expected processClientInitialParams( conn.streamManager->setMaxLocalUnidirectionalStreams( maxStreamsUni.value_or(0)); if (!maxUniStreamsResult) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::TRANSPORT_PARAMETER_ERROR, "Failed to set max local unidirectional streams")); } @@ -466,7 +466,7 @@ folly::Expected processClientInitialParams( conn.peerIdleTimeout = std::chrono::milliseconds(idleTimeout.value_or(0)); conn.peerIdleTimeout = timeMin(conn.peerIdleTimeout, kMaxIdleTimeout); if (ackDelayExponent && *ackDelayExponent > kMaxAckDelayExponent) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::TRANSPORT_PARAMETER_ERROR, "ack_delay_exponent too large")); } @@ -478,7 +478,7 @@ folly::Expected processClientInitialParams( if (maxDatagramFrameSize.has_value()) { if (maxDatagramFrameSize.value() > 0 && maxDatagramFrameSize.value() <= kMaxDatagramPacketOverhead) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::TRANSPORT_PARAMETER_ERROR, "max_datagram_frame_size too small")); } @@ -521,23 +521,23 @@ folly::Expected processClientInitialParams( conn.peerAdvertisedKnobFrameSupport = knobFrameSupported.value_or(0) > 0; conn.peerAdvertisedExtendedAckFeatures = extendedAckFeatures.value_or(0); - return folly::unit; + return {}; } -folly::Expected updateHandshakeState( +quic::Expected updateHandshakeState( QuicServerConnectionState& conn) { // Zero RTT read cipher is available after chlo is processed with the // condition that early data attempt is accepted. auto handshakeLayer = conn.serverHandshakeLayer; auto zeroRttReadCipherResult = handshakeLayer->getZeroRttReadCipher(); if (zeroRttReadCipherResult.hasError()) { - return folly::makeUnexpected(zeroRttReadCipherResult.error()); + return quic::make_unexpected(zeroRttReadCipherResult.error()); } auto zeroRttReadCipher = std::move(zeroRttReadCipherResult.value()); auto zeroRttHeaderCipherResult = handshakeLayer->getZeroRttReadHeaderCipher(); if (zeroRttHeaderCipherResult.hasError()) { - return folly::makeUnexpected(zeroRttHeaderCipherResult.error()); + return quic::make_unexpected(zeroRttHeaderCipherResult.error()); } auto zeroRttHeaderCipher = std::move(zeroRttHeaderCipherResult.value()); @@ -547,21 +547,21 @@ folly::Expected updateHandshakeState( // processed. auto oneRttWriteCipherResult = handshakeLayer->getFirstOneRttWriteCipher(); if (oneRttWriteCipherResult.hasError()) { - return folly::makeUnexpected(oneRttWriteCipherResult.error()); + return quic::make_unexpected(oneRttWriteCipherResult.error()); } auto oneRttWriteCipher = std::move(oneRttWriteCipherResult.value()); // One RTT read cipher is available after cfin is processed. auto oneRttReadCipherResult = handshakeLayer->getFirstOneRttReadCipher(); if (oneRttReadCipherResult.hasError()) { - return folly::makeUnexpected(oneRttReadCipherResult.error()); + return quic::make_unexpected(oneRttReadCipherResult.error()); } auto oneRttReadCipher = std::move(oneRttReadCipherResult.value()); auto oneRttWriteHeaderCipherResult = handshakeLayer->getOneRttWriteHeaderCipher(); if (oneRttWriteHeaderCipherResult.hasError()) { - return folly::makeUnexpected(oneRttWriteHeaderCipherResult.error()); + return quic::make_unexpected(oneRttWriteHeaderCipherResult.error()); } auto oneRttWriteHeaderCipher = std::move(oneRttWriteHeaderCipherResult.value()); @@ -569,7 +569,7 @@ folly::Expected updateHandshakeState( auto oneRttReadHeaderCipherResult = handshakeLayer->getOneRttReadHeaderCipher(); if (oneRttReadHeaderCipherResult.hasError()) { - return folly::makeUnexpected(oneRttReadHeaderCipherResult.error()); + return quic::make_unexpected(oneRttReadHeaderCipherResult.error()); } auto oneRttReadHeaderCipher = std::move(oneRttReadHeaderCipherResult.value()); @@ -595,7 +595,7 @@ folly::Expected updateHandshakeState( conn.qLogger->addTransportStateUpdate(kDerivedOneRttWriteCipher); } if (conn.oneRttWriteCipher) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::CRYPTO_ERROR, "Duplicate 1-rtt write cipher")); } conn.oneRttWriteCipher = std::move(oneRttWriteCipher); @@ -607,7 +607,7 @@ folly::Expected updateHandshakeState( // keys available. auto clientParams = handshakeLayer->getClientTransportParams(); if (!clientParams) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::TRANSPORT_PARAMETER_ERROR, "No client transport params")); } @@ -627,21 +627,21 @@ folly::Expected updateHandshakeState( conn.readCodec->setOneRttReadCipher(std::move(oneRttReadCipher)); auto nextOneRttReadCipherResult = handshakeLayer->getNextOneRttReadCipher(); if (nextOneRttReadCipherResult.hasError()) { - return folly::makeUnexpected(nextOneRttReadCipherResult.error()); + return quic::make_unexpected(nextOneRttReadCipherResult.error()); } conn.readCodec->setNextOneRttReadCipher( std::move(nextOneRttReadCipherResult.value())); } auto handshakeReadCipherResult = handshakeLayer->getHandshakeReadCipher(); if (handshakeReadCipherResult.hasError()) { - return folly::makeUnexpected(handshakeReadCipherResult.error()); + return quic::make_unexpected(handshakeReadCipherResult.error()); } auto handshakeReadCipher = std::move(handshakeReadCipherResult.value()); auto handshakeReadHeaderCipherResult = handshakeLayer->getHandshakeReadHeaderCipher(); if (handshakeReadHeaderCipherResult.hasError()) { - return folly::makeUnexpected(handshakeReadHeaderCipherResult.error()); + return quic::make_unexpected(handshakeReadHeaderCipherResult.error()); } auto handshakeReadHeaderCipher = std::move(handshakeReadHeaderCipherResult.value()); @@ -677,7 +677,7 @@ folly::Expected updateHandshakeState( conn.sentNewTokenFrame = true; } } - return folly::unit; + return {}; } bool validateAndUpdateSourceToken( @@ -775,7 +775,7 @@ void maybeUpdateTransportFromAppToken( } } -folly::Expected onConnectionMigration( +quic::Expected onConnectionMigration( QuicServerConnectionState& conn, const folly::SocketAddress& newPeerAddress, bool isIntentional) { @@ -790,7 +790,7 @@ folly::Expected onConnectionMigration( conn.statsCallback, onPacketDropped, PacketDropReason::PEER_ADDRESS_CHANGE); - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::INVALID_MIGRATION, "Too many migrations")); } @@ -848,10 +848,10 @@ folly::Expected onConnectionMigration( conn.qLogger->addConnectionMigrationUpdate(isIntentional); } conn.peerAddress = newPeerAddress; - return folly::unit; + return {}; } -folly::Expected onServerReadData( +quic::Expected onServerReadData( QuicServerConnectionState& conn, ServerEvents::ReadData& readData) { switch (conn.state) { @@ -938,13 +938,13 @@ static void handleCipherUnavailable( } } -folly::Expected onServerReadDataFromOpen( +quic::Expected onServerReadDataFromOpen( QuicServerConnectionState& conn, ServerEvents::ReadData& readData) { CHECK_EQ(conn.state, ServerState::Open); if (readData.udpPacket.buf.empty()) { - return folly::unit; + return {}; } bool firstPacketFromPeer = false; if (!conn.readCodec) { @@ -964,7 +964,7 @@ folly::Expected onServerReadDataFromOpen( conn.statsCallback, onPacketDropped, PacketDropReason::PARSE_ERROR_LONG_HEADER_INITIAL); - return folly::unit; + return {}; } QuicVersion version = parsedLongHeader->invariant.version; if (version == QuicVersion::VERSION_NEGOTIATION) { @@ -978,7 +978,7 @@ folly::Expected onServerReadDataFromOpen( conn.statsCallback, onPacketDropped, PacketDropReason::INVALID_PACKET_VN); - return folly::unit; + return {}; } const auto& clientConnectionId = parsedLongHeader->invariant.srcConnId; @@ -997,7 +997,7 @@ folly::Expected onServerReadDataFromOpen( conn.statsCallback, onPacketDropped, PacketDropReason::INITIAL_CONNID_SMALL); - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::PROTOCOL_VIOLATION, "Initial destination connectionid too small")); } @@ -1041,7 +1041,7 @@ folly::Expected onServerReadDataFromOpen( auto clientInitialCipherResult = cryptoFactory.getClientInitialCipher( initialDestinationConnectionId, version); if (clientInitialCipherResult.hasError()) { - return folly::makeUnexpected(clientInitialCipherResult.error()); + return quic::make_unexpected(clientInitialCipherResult.error()); } conn.readCodec->setInitialReadCipher( std::move(clientInitialCipherResult.value())); @@ -1059,7 +1059,7 @@ folly::Expected onServerReadDataFromOpen( auto serverInitialCipherResult = cryptoFactory.getServerInitialCipher( initialDestinationConnectionId, version); if (serverInitialCipherResult.hasError()) { - return folly::makeUnexpected(serverInitialCipherResult.error()); + return quic::make_unexpected(serverInitialCipherResult.error()); } conn.initialWriteCipher = std::move(serverInitialCipherResult.value()); @@ -1067,7 +1067,7 @@ folly::Expected onServerReadDataFromOpen( cryptoFactory.makeClientInitialHeaderCipher( initialDestinationConnectionId, version); if (clientInitialHeaderCipherResult.hasError()) { - return folly::makeUnexpected(clientInitialHeaderCipherResult.error()); + return quic::make_unexpected(clientInitialHeaderCipherResult.error()); } conn.readCodec->setInitialHeaderCipher( std::move(clientInitialHeaderCipherResult.value())); @@ -1076,7 +1076,7 @@ folly::Expected onServerReadDataFromOpen( cryptoFactory.makeServerInitialHeaderCipher( initialDestinationConnectionId, version); if (serverInitialHeaderCipherResult.hasError()) { - return folly::makeUnexpected(serverInitialHeaderCipherResult.error()); + return quic::make_unexpected(serverInitialHeaderCipherResult.error()); } conn.initialHeaderCipher = std::move(serverInitialHeaderCipherResult.value()); @@ -1118,7 +1118,7 @@ folly::Expected onServerReadDataFromOpen( conn.statsCallback, onPacketDropped, PacketDropReason::UNEXPECTED_RESET); - return folly::unit; + return {}; } case CodecResult::Type::NOTHING: { VLOG(10) << "drop no data, reason: " @@ -1132,14 +1132,14 @@ folly::Expected onServerReadDataFromOpen( onPacketDropped, parsedPacket.nothing()->reason); if (firstPacketFromPeer) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( LocalErrorCode::CONNECTION_ABANDONED, "Failed to decrypt first packet from peer")); } break; } case CodecResult::Type::CODEC_ERROR: { - return folly::makeUnexpected(parsedPacket.codecError()->error); + return quic::make_unexpected(parsedPacket.codecError()->error); } case CodecResult::Type::REGULAR_PACKET: break; @@ -1168,7 +1168,7 @@ folly::Expected onServerReadDataFromOpen( conn.statsCallback, onPacketDropped, PacketDropReason::PROTOCOL_VIOLATION); - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::PROTOCOL_VIOLATION, "Packet has no frames")); } @@ -1212,7 +1212,7 @@ folly::Expected onServerReadDataFromOpen( PacketDropReason(PacketDropReason::PROTOCOL_VIOLATION) ._to_string()); } - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::PROTOCOL_VIOLATION, "Invalid frame received")); } @@ -1227,7 +1227,7 @@ folly::Expected onServerReadDataFromOpen( if (!conn.version) { LongHeader* longHeader = regularPacket.header.asLong(); if (!longHeader) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::PROTOCOL_VIOLATION, "Invalid packet type (expected LongHeader)")); } @@ -1256,7 +1256,7 @@ folly::Expected onServerReadDataFromOpen( const char* errMsg = encryptionLevel != EncryptionLevel::AppData ? "Migration not allowed during handshake" : "Migration disabled"; - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(TransportErrorCode::INVALID_MIGRATION, errMsg)); } } @@ -1281,7 +1281,7 @@ folly::Expected onServerReadDataFromOpen( }; AckedFrameVisitor ackedFrameVisitor = [&](const OutstandingPacketWrapper&, const QuicWriteFrame& packetFrame) - -> folly::Expected { + -> quic::Expected { switch (packetFrame.type()) { case QuicWriteFrame::Type::WriteStreamFrame: { const WriteStreamFrame& frame = *packetFrame.asWriteStreamFrame(); @@ -1293,7 +1293,7 @@ folly::Expected onServerReadDataFromOpen( if (ackedStream) { auto result = sendAckSMHandler(*ackedStream, frame); if (result.hasError()) { - return folly::makeUnexpected(result.error()); + return quic::make_unexpected(result.error()); } } break; @@ -1314,7 +1314,7 @@ folly::Expected onServerReadDataFromOpen( if (stream) { auto result = sendRstAckSMHandler(*stream, frame.reliableSize); if (result.hasError()) { - return folly::makeUnexpected(result.error()); + return quic::make_unexpected(result.error()); } } break; @@ -1344,7 +1344,7 @@ folly::Expected onServerReadDataFromOpen( break; } } - return folly::unit; + return {}; }; for (auto& quicFrame : regularPacket.frames) { @@ -1357,14 +1357,14 @@ folly::Expected onServerReadDataFromOpen( if (ackFrame.frameType == FrameType::ACK_EXTENDED && !conn.transportSettings.advertisedExtendedAckFeatures) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::PROTOCOL_VIOLATION, "Received unexpected ACK_EXTENDED frame")); } else if ( ackFrame.frameType == FrameType::ACK_RECEIVE_TIMESTAMPS && !conn.transportSettings .maybeAckReceiveTimestampsConfigSentToPeer) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::PROTOCOL_VIOLATION, "Received unexpected ACK_RECEIVE_TIMESTAMPS frame")); } @@ -1378,7 +1378,7 @@ folly::Expected onServerReadDataFromOpen( readData.udpPacket.timings.receiveTimePoint); if (result.hasError()) { - return folly::makeUnexpected(result.error()); + return quic::make_unexpected(result.error()); } conn.lastProcessedAckEvents.emplace_back(std::move(result.value())); break; @@ -1386,7 +1386,7 @@ folly::Expected onServerReadDataFromOpen( case QuicFrame::Type::RstStreamFrame: { RstStreamFrame& frame = *quicFrame.asRstStreamFrame(); if (frame.reliableSize.has_value()) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::PROTOCOL_VIOLATION, "Reliable resets not supported")); } @@ -1396,7 +1396,7 @@ folly::Expected onServerReadDataFromOpen( isNonProbingPacket = true; auto streamResult = conn.streamManager->getStream(frame.streamId); if (streamResult.hasError()) { - return folly::makeUnexpected(streamResult.error()); + return quic::make_unexpected(streamResult.error()); } auto& stream = streamResult.value(); @@ -1405,7 +1405,7 @@ folly::Expected onServerReadDataFromOpen( } auto result = receiveRstStreamSMHandler(*stream, frame); if (result.hasError()) { - return folly::makeUnexpected(result.error()); + return quic::make_unexpected(result.error()); } break; } @@ -1427,7 +1427,7 @@ folly::Expected onServerReadDataFromOpen( StreamBuffer( std::move(cryptoFrame.data), cryptoFrame.offset, false)); if (result.hasError()) { - return folly::makeUnexpected(result.error()); + return quic::make_unexpected(result.error()); } if (isQuicInitialPacket && readBufferSize != cryptoStream->readBuffer.size()) { @@ -1448,7 +1448,7 @@ folly::Expected onServerReadDataFromOpen( auto streamResult = conn.streamManager->getStream( frame.streamId, frame.streamGroupId); if (streamResult.hasError()) { - return folly::makeUnexpected(streamResult.error()); + return quic::make_unexpected(streamResult.error()); } auto& stream = streamResult.value(); @@ -1456,7 +1456,7 @@ folly::Expected onServerReadDataFromOpen( auto result = receiveReadStreamFrameSMHandler(*stream, std::move(frame)); if (result.hasError()) { - return folly::makeUnexpected(result.error()); + return quic::make_unexpected(result.error()); } } break; @@ -1478,7 +1478,7 @@ folly::Expected onServerReadDataFromOpen( << " offset=" << streamWindowUpdate.maximumData << " " << conn; if (isReceivingStream(conn.nodeType, streamWindowUpdate.streamId)) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_STATE_ERROR, "Received MaxStreamDataFrame for receiving stream.")); } @@ -1487,7 +1487,7 @@ folly::Expected onServerReadDataFromOpen( auto streamResult = conn.streamManager->getStream(streamWindowUpdate.streamId); if (streamResult.hasError()) { - return folly::makeUnexpected(streamResult.error()); + return quic::make_unexpected(streamResult.error()); } auto& stream = streamResult.value(); if (stream) { @@ -1512,7 +1512,7 @@ folly::Expected onServerReadDataFromOpen( isNonProbingPacket = true; auto streamResult = conn.streamManager->getStream(blocked.streamId); if (streamResult.hasError()) { - return folly::makeUnexpected(streamResult.error()); + return quic::make_unexpected(streamResult.error()); } auto& stream = streamResult.value(); if (stream) { @@ -1548,7 +1548,7 @@ folly::Expected onServerReadDataFromOpen( conn.flowControlState.sumCurStreamBufferLen) { VLOG(2) << "Client gives up a flow control blocked connection"; } - return folly::unit; + return {}; } case QuicFrame::Type::PingFrame: isNonProbingPacket = true; @@ -1569,7 +1569,7 @@ folly::Expected onServerReadDataFromOpen( auto simpleResult = updateSimpleFrameOnPacketReceived( conn, simpleFrame, dstConnId, readData.peer != conn.peerAddress); if (simpleResult.hasError()) { - return folly::makeUnexpected(simpleResult.error()); + return quic::make_unexpected(simpleResult.error()); } isNonProbingPacket |= simpleResult.value(); break; @@ -1587,7 +1587,7 @@ folly::Expected onServerReadDataFromOpen( } case QuicFrame::Type::ImmediateAckFrame: { if (!conn.transportSettings.minAckDelay.has_value()) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::PROTOCOL_VIOLATION, "Received IMMEDIATE_ACK frame without announcing min_ack_delay")); } @@ -1612,7 +1612,10 @@ folly::Expected onServerReadDataFromOpen( } maybeScheduleAckForCongestionFeedback(readData.udpPacket, ackState); - maybeHandleIncomingKeyUpdate(conn); + auto keyUpdateResult = maybeHandleIncomingKeyUpdate(conn); + if (keyUpdateResult.hasError()) { + return quic::make_unexpected(keyUpdateResult.error()); + } // Update writable limit before processing the handshake data. This is so // that if we haven't decided whether or not to validate the peer, we @@ -1632,7 +1635,7 @@ folly::Expected onServerReadDataFromOpen( auto migrationResult = onConnectionMigration(conn, readData.peer, intentionalMigration); if (migrationResult.hasError()) { - return folly::makeUnexpected(migrationResult.error()); + return quic::make_unexpected(migrationResult.error()); } } } else { @@ -1648,7 +1651,7 @@ folly::Expected onServerReadDataFromOpen( conn.statsCallback, onPacketDropped, PacketDropReason::PEER_ADDRESS_CHANGE); - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::INVALID_MIGRATION, "Probing not supported yet")); } @@ -1660,7 +1663,7 @@ folly::Expected onServerReadDataFromOpen( auto handshakeResult = conn.serverHandshakeLayer->doHandshake( std::move(data), encryptionLevel); if (handshakeResult.hasError()) { - return folly::makeUnexpected(handshakeResult.error()); + return quic::make_unexpected(handshakeResult.error()); } auto handshakeStateResult = updateHandshakeState(conn); if (handshakeStateResult.hasError()) { @@ -1674,7 +1677,7 @@ folly::Expected onServerReadDataFromOpen( conn.statsCallback, onPacketDropped, PacketDropReason::TRANSPORT_PARAMETER_ERROR); - return folly::makeUnexpected(handshakeStateResult.error()); + return quic::make_unexpected(handshakeStateResult.error()); } } updateAckSendStateOnRecvPacket( @@ -1702,10 +1705,10 @@ folly::Expected onServerReadDataFromOpen( << " bytes unprocessed after attempting to process " << kMaxNumCoalescedPackets << " packets."; - return folly::unit; + return {}; } -folly::Expected onServerReadDataFromClosed( +quic::Expected onServerReadDataFromClosed( QuicServerConnectionState& conn, ServerEvents::ReadData& readData) { CHECK_EQ(conn.state, ServerState::Closed); @@ -1723,7 +1726,7 @@ folly::Expected onServerReadDataFromClosed( conn.statsCallback, onPacketDropped, PacketDropReason::SERVER_STATE_CLOSED); - return folly::unit; + return {}; } if (conn.peerConnectionError) { @@ -1737,7 +1740,7 @@ folly::Expected onServerReadDataFromClosed( conn.statsCallback, onPacketDropped, PacketDropReason::SERVER_STATE_CLOSED); - return folly::unit; + return {}; } auto parsedPacket = conn.readCodec->parsePacket(udpData, conn.ackStates); switch (parsedPacket.type()) { @@ -1787,7 +1790,7 @@ folly::Expected onServerReadDataFromClosed( break; } case CodecResult::Type::CODEC_ERROR: { - return folly::makeUnexpected(parsedPacket.codecError()->error); + return quic::make_unexpected(parsedPacket.codecError()->error); } case CodecResult::Type::REGULAR_PACKET: break; @@ -1797,7 +1800,7 @@ folly::Expected onServerReadDataFromClosed( // We were unable to parse the packet, drop for now. // Packet drop has already been added to qlog and stats VLOG(10) << "Not able to parse QUIC packet " << conn; - return folly::unit; + return {}; } if (regularOptional->frames.empty()) { // This packet had a pareseable header (most probably short header) @@ -1813,7 +1816,7 @@ folly::Expected onServerReadDataFromClosed( conn.statsCallback, onPacketDropped, PacketDropReason::PROTOCOL_VIOLATION); - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::PROTOCOL_VIOLATION, "Packet has no frames")); } @@ -1854,7 +1857,7 @@ folly::Expected onServerReadDataFromClosed( getAckState(conn, pnSpace).largestRecvdPacketNum; largestRecvdPacketNum = std::max(largestRecvdPacketNum.value_or(packetNum), packetNum); - return folly::unit; + return {}; } void onServerClose(QuicServerConnectionState& conn) { diff --git a/quic/server/state/ServerStateMachine.h b/quic/server/state/ServerStateMachine.h index 0a756f52a..a1096a93c 100644 --- a/quic/server/state/ServerStateMachine.h +++ b/quic/server/state/ServerStateMachine.h @@ -196,16 +196,15 @@ struct QuicServerConnectionState : public QuicConnectionStateBase { // Transition to error state on invalid state transition. void ServerInvalidStateHandler(QuicServerConnectionState& state); -[[nodiscard]] folly::Expected onServerReadData( +[[nodiscard]] quic::Expected onServerReadData( QuicServerConnectionState& conn, ServerEvents::ReadData& readData); -[[nodiscard]] folly::Expected onServerReadDataFromOpen( +[[nodiscard]] quic::Expected onServerReadDataFromOpen( QuicServerConnectionState& conn, ServerEvents::ReadData& readData); -[[nodiscard]] folly::Expected -onServerReadDataFromClosed( +[[nodiscard]] quic::Expected onServerReadDataFromClosed( QuicServerConnectionState& conn, ServerEvents::ReadData& readData); @@ -213,12 +212,11 @@ void onServerClose(QuicServerConnectionState& conn); void onServerCloseOpenState(QuicServerConnectionState& conn); -[[nodiscard]] folly::Expected -processClientInitialParams( +[[nodiscard]] quic::Expected processClientInitialParams( QuicServerConnectionState& conn, const ClientTransportParameters& clientParams); -[[nodiscard]] folly::Expected updateHandshakeState( +[[nodiscard]] quic::Expected updateHandshakeState( QuicServerConnectionState& conn); bool validateAndUpdateSourceToken( @@ -231,7 +229,7 @@ void maybeUpdateTransportFromAppToken( QuicServerConnectionState& conn, const Optional& appToken); -[[nodiscard]] folly::Expected onConnectionMigration( +[[nodiscard]] quic::Expected onConnectionMigration( QuicServerConnectionState& conn, const folly::SocketAddress& newPeerAddress, bool isIntentional = false); diff --git a/quic/server/test/QuicClientServerIntegrationTest.cpp b/quic/server/test/QuicClientServerIntegrationTest.cpp index 7c9d76562..62f80ec2d 100644 --- a/quic/server/test/QuicClientServerIntegrationTest.cpp +++ b/quic/server/test/QuicClientServerIntegrationTest.cpp @@ -174,7 +174,7 @@ TEST_F(ServerTransportParameters, DatagramTestDisabled) { auto param = getIntegerParameter( TransportParameterId::max_datagram_frame_size, serverTransportParams->parameters); - ASSERT_TRUE(param.hasValue()); + ASSERT_TRUE(param.has_value()); EXPECT_FALSE(param.value().has_value()); } @@ -197,7 +197,7 @@ TEST_F(ServerTransportParameters, DatagramTestEnabled) { auto param = getIntegerParameter( TransportParameterId::max_datagram_frame_size, serverTransportParams->parameters); - ASSERT_TRUE(param.hasValue()); + ASSERT_TRUE(param.has_value()); CHECK(param.value().has_value()); // also validate value because why not EXPECT_EQ(param.value(), kMaxDatagramFrameSize); diff --git a/quic/server/test/QuicServerTest.cpp b/quic/server/test/QuicServerTest.cpp index 5fb0d2f28..287f36ef9 100644 --- a/quic/server/test/QuicServerTest.cpp +++ b/quic/server/test/QuicServerTest.cpp @@ -1114,7 +1114,7 @@ TEST_F(QuicServerWorkerTest, FailToParseConnectionId) { EXPECT_CALL(*rawConnIdAlgo, canParseNonConst(_)).WillOnce(Return(true)); EXPECT_CALL(*rawConnIdAlgo, parseConnectionId(dstConnId)) - .WillOnce(Return(folly::makeUnexpected(QuicError( + .WillOnce(Return(quic::make_unexpected(QuicError( TransportErrorCode::INTERNAL_ERROR, "This CID has COVID-19")))); EXPECT_CALL(*quicStats_, onPacketDropped(_)).Times(1); EXPECT_CALL(*quicStats_, onPacketProcessed()).Times(0); @@ -1480,7 +1480,7 @@ auto createInitialStream( streamData->computeChainDataLength(), true, std::nullopt /* skipLenHint */); - EXPECT_TRUE(res.hasValue()); + EXPECT_TRUE(res.has_value()); auto dataLen = *res; EXPECT_TRUE(dataLen); writeStreamFrameData(builder, std::move(streamData), *dataLen); diff --git a/quic/server/test/QuicServerTransportTest.cpp b/quic/server/test/QuicServerTransportTest.cpp index f89a28cc6..ed0822882 100644 --- a/quic/server/test/QuicServerTransportTest.cpp +++ b/quic/server/test/QuicServerTransportTest.cpp @@ -97,7 +97,7 @@ TEST_F(QuicServerTransportTest, TestReadMultipleStreams) { buf1->computeChainDataLength(), true, std::nullopt /* skipLenHint */); - ASSERT_TRUE(res.hasValue()); + ASSERT_TRUE(res.has_value()); auto dataLen = *res; ASSERT_TRUE(dataLen); ASSERT_EQ(*dataLen, buf1->computeChainDataLength()); @@ -111,7 +111,7 @@ TEST_F(QuicServerTransportTest, TestReadMultipleStreams) { buf1->computeChainDataLength(), true, std::nullopt /* skipLenHint */); - ASSERT_TRUE(res.hasValue()); + ASSERT_TRUE(res.has_value()); dataLen = *res; ASSERT_TRUE(dataLen); ASSERT_EQ(*dataLen, buf1->computeChainDataLength()); @@ -251,7 +251,7 @@ TEST_F(QuicServerTransportTest, IdleTimerNotResetWhenDataOutstanding) { server->idleTimeout().cancelTimerCallback(); server->keepaliveTimeout().cancelTimerCallback(); ASSERT_FALSE(server->idleTimeout().isTimerCallbackScheduled()); - server->writeChain( + auto serverWriteChain1 = server->writeChain( streamId, IOBuf::copyBuffer("And if the darkness is to keep us apart"), false); @@ -264,7 +264,7 @@ TEST_F(QuicServerTransportTest, IdleTimerNotResetWhenDataOutstanding) { server->idleTimeout().cancelTimerCallback(); server->keepaliveTimeout().cancelTimerCallback(); EXPECT_FALSE(server->idleTimeout().isTimerCallbackScheduled()); - server->writeChain( + auto serverWriteChain2 = server->writeChain( streamId, IOBuf::copyBuffer("And if the daylight feels like it's a long way off"), false); @@ -423,7 +423,8 @@ TEST_F(QuicServerTransportTest, TestClientAddressChanges) { TEST_F(QuicServerTransportTest, TestCloseConnectionWithNoErrorPendingStreams) { auto streamId = server->createBidirectionalStream().value(); - server->writeChain(streamId, IOBuf::copyBuffer("hello"), true); + auto serverWriteChain3 = + server->writeChain(streamId, IOBuf::copyBuffer("hello"), true); loopForWrites(); AckBlocks acks; @@ -631,10 +632,10 @@ TEST_F(QuicServerTransportTest, TestOpenAckStreamFrame) { // Remove any packets that might have been queued. server->getNonConstConn().outstandings.reset(); - server->writeChain(streamId, data->clone(), false); + auto serverWriteChain4 = server->writeChain(streamId, data->clone(), false); loopForWrites(); - server->writeChain(streamId, data->clone(), false); - server->writeChain(streamId, data->clone(), false); + auto serverWriteChain5 = server->writeChain(streamId, data->clone(), false); + auto serverWriteChain6 = server->writeChain(streamId, data->clone(), false); loopForWrites(); auto streamResult = @@ -720,7 +721,7 @@ TEST_F(QuicServerTransportTest, TestOpenAckStreamFrame) { EXPECT_EQ(stream->recvState, StreamRecvState::Open); auto empty = IOBuf::create(0); - server->writeChain(streamId, std::move(empty), true); + auto serverWriteChain7 = server->writeChain(streamId, std::move(empty), true); loopForWrites(); ASSERT_FALSE(server->getConn().outstandings.packets.empty()); @@ -814,7 +815,7 @@ TEST_F(QuicServerTransportTest, ReceiveRstStreamNonExistentAndOtherFrame) { deliverData(std::move(packet2)); auto readData = server->read(streamId, 0); - ASSERT_TRUE(readData.hasValue()); + ASSERT_TRUE(readData.has_value()); ASSERT_NE(readData.value().first, nullptr); EXPECT_TRUE(folly::IOBufEqualTo()(*readData.value().first, *data)); } @@ -1024,7 +1025,8 @@ TEST_F(QuicServerTransportTest, RecvStopSendingFrameAfterCloseStream) { ASSERT_FALSE( writeFrame(QuicSimpleFrame(stopSendingFrame), builder).hasError()); auto packet = std::move(builder).buildPacket(); - server->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN); + auto serverResetStream1 = + server->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN); EXPECT_CALL(connCallback, onStopSending(_, _)).Times(0); deliverData(packetToBuf(packet)); } @@ -1124,7 +1126,7 @@ TEST_F(QuicServerTransportTest, RecvStopSendingFrameAfterHalfCloseRemote) { 10, true, std::nullopt /* skipLenHint */); - ASSERT_TRUE(res.hasValue()); + ASSERT_TRUE(res.has_value()); auto dataLen = *res; ASSERT_TRUE(dataLen.has_value()); ASSERT_EQ(*dataLen, 0); @@ -1311,7 +1313,8 @@ TEST_F(QuicServerTransportTest, TestCloneStopSending) { t.reset(); } - server->stopSending(streamId, GenericApplicationErrorCode::UNKNOWN); + auto serverStopSending1 = + server->stopSending(streamId, GenericApplicationErrorCode::UNKNOWN); loopForWrites(); // Find the outstanding StopSending. auto packetItr = std::find_if( @@ -1344,7 +1347,8 @@ TEST_F(QuicServerTransportTest, TestAckStopSending) { auto streamResult = server->getNonConstConn().streamManager->getStream(streamId); ASSERT_FALSE(streamResult.hasError()); - server->stopSending(streamId, GenericApplicationErrorCode::UNKNOWN); + auto serverStopSending2 = + server->stopSending(streamId, GenericApplicationErrorCode::UNKNOWN); loopForWrites(); auto match = findFrameInPacketFunc(); @@ -1690,13 +1694,14 @@ TEST_F(QuicServerTransportTest, DestroyWithoutClosing) { StreamId streamId = server->createBidirectionalStream().value(); MockReadCallback readCb; - server->setReadCallback(streamId, &readCb); + auto serverSetReadCallback1 = server->setReadCallback(streamId, &readCb); EXPECT_CALL(connCallback, onConnectionError(_)).Times(0); EXPECT_CALL(connCallback, onConnectionEnd()).Times(0); MockDeliveryCallback deliveryCallback; auto write = IOBuf::copyBuffer("no"); - server->writeChain(streamId, write->clone(), true, &deliveryCallback); + auto serverWriteChain8 = + server->writeChain(streamId, write->clone(), true, &deliveryCallback); EXPECT_CALL(deliveryCallback, onCanceled(_, _)); EXPECT_CALL(readCb, readError(_, _)); @@ -1708,19 +1713,19 @@ TEST_F(QuicServerTransportTest, DestroyWithoutClosingCancelByteEvents) { StreamId streamId = server->createBidirectionalStream().value(); MockReadCallback readCb; - server->setReadCallback(streamId, &readCb); + auto serverSetReadCallback2 = server->setReadCallback(streamId, &readCb); EXPECT_CALL(connCallback, onConnectionError(_)).Times(0); EXPECT_CALL(connCallback, onConnectionEnd()).Times(0); auto write = IOBuf::copyBuffer("no"); - server->writeChain(streamId, write->clone(), true); + auto serverWriteChain9 = server->writeChain(streamId, write->clone(), true); MockByteEventCallback txCallback; MockByteEventCallback deliveryCallback; - server->registerByteEventCallback( + auto serverRegisterByteEvent1 = server->registerByteEventCallback( ByteEvent::Type::TX, streamId, 0, &txCallback); - server->registerByteEventCallback( + auto serverRegisterByteEvent2 = server->registerByteEventCallback( ByteEvent::Type::ACK, streamId, 0, &deliveryCallback); EXPECT_CALL(txCallback, onByteEventCanceled(_)); @@ -1949,7 +1954,7 @@ class QuicServerTransportAllowMigrationTest false, GetParam().clientSentActiveConnIdTransportParam); ON_CALL(*fakeHandshake, writeNewSessionTicket) - .WillByDefault(Return(folly::unit)); + .WillByDefault(Return(quic::Expected{})); } }; @@ -3012,7 +3017,7 @@ TEST_F(QuicServerTransportTest, ClientPortChangeNATRebinding) { StreamId streamId = server->createBidirectionalStream().value(); auto data1 = IOBuf::copyBuffer("Aloha"); - server->writeChain(streamId, data1->clone(), false); + auto serverWriteChain10 = server->writeChain(streamId, data1->clone(), false); loopForWrites(); PacketNum packetNum1 = getFirstOutstandingPacket( @@ -3059,7 +3064,7 @@ TEST_F(QuicServerTransportTest, ClientAddressChangeNATRebinding) { server->getNonConstConn().transportSettings.disableMigration = false; StreamId streamId = server->createBidirectionalStream().value(); auto data1 = IOBuf::copyBuffer("Aloha"); - server->writeChain(streamId, data1->clone(), false); + auto serverWriteChain11 = server->writeChain(streamId, data1->clone(), false); loopForWrites(); PacketNum packetNum1 = getFirstOutstandingPacket( @@ -3429,17 +3434,19 @@ TEST_F(QuicServerTransportTest, ResetDSRStream) { auto buf = buildRandomInputData(200); auto dsrSender = std::make_unique(); EXPECT_CALL(*dsrSender, release()).Times(1); - server->setDSRPacketizationRequestSender(streamId, std::move(dsrSender)); - EXPECT_TRUE(server->writeChain(streamId, std::move(buf), false).hasValue()); + auto serverSetDSRSender1 = + server->setDSRPacketizationRequestSender(streamId, std::move(dsrSender)); + EXPECT_TRUE(server->writeChain(streamId, std::move(buf), false).has_value()); auto streamResult = conn.streamManager->getStream(streamId); ASSERT_FALSE(streamResult.hasError()); auto stream = streamResult.value(); - EXPECT_TRUE(server->writeBufMeta(streamId, meta, false).hasValue()); + EXPECT_TRUE(server->writeBufMeta(streamId, meta, false).has_value()); loopForWrites(); ASSERT_NE(stream, nullptr); stream->writeBufMeta.split(conn.udpSendPacketLen - 200); - server->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN); + auto serverResetStream2 = + server->resetStream(streamId, GenericApplicationErrorCode::UNKNOWN); loopForWrites(); auto packet = getLastOutstandingPacket( server->getConnectionState(), PacketNumberSpace::AppData) @@ -3466,10 +3473,11 @@ TEST_F(QuicServerTransportTest, SetDSRSenderAndWriteBufMetaIntoStream) { BufferMeta meta(bufferLength); auto buf = buildRandomInputData(20); auto dsrSender = std::make_unique(); - server->setDSRPacketizationRequestSender(streamId, std::move(dsrSender)); + auto serverSetDSRSender2 = + server->setDSRPacketizationRequestSender(streamId, std::move(dsrSender)); // Some amount of real data needs to be written first: - server->writeChain(streamId, std::move(buf), false); - server->writeBufMeta(streamId, meta, true); + auto serverWriteChain12 = server->writeChain(streamId, std::move(buf), false); + auto serverWriteBufMeta1 = server->writeBufMeta(streamId, meta, true); auto& stream = *server->getConnectionState().streamManager->findStream(streamId); EXPECT_GE(stream.writeBufMeta.offset, 20); @@ -3487,11 +3495,13 @@ TEST_F(QuicServerTransportTest, InvokeTxCallbacksSingleByteDSR) { StrictMock pastlastByteTxCb; auto stream = server->createBidirectionalStream().value(); auto dsrSender = std::make_unique(); - server->setDSRPacketizationRequestSender(stream, std::move(dsrSender)); + auto serverSetDSRSender3 = + server->setDSRPacketizationRequestSender(stream, std::move(dsrSender)); auto buf = buildRandomInputData(1); - server->writeChain(stream, buf->clone(), false /* eof */); - server->writeBufMeta(stream, BufferMeta(1), false); + auto serverWriteChain13 = + server->writeChain(stream, buf->clone(), false /* eof */); + auto serverWriteBufMeta2 = server->writeBufMeta(stream, BufferMeta(1), false); EXPECT_CALL(firstByteTxCb, onByteEventRegistered(getTxMatcher(stream, 0))) .Times(1); EXPECT_CALL(dsrByteTxCb, onByteEventRegistered(getTxMatcher(stream, 1))) @@ -3500,10 +3510,14 @@ TEST_F(QuicServerTransportTest, InvokeTxCallbacksSingleByteDSR) { .Times(1); EXPECT_CALL(pastlastByteTxCb, onByteEventRegistered(getTxMatcher(stream, 2))) .Times(1); - server->registerTxCallback(stream, 0, &firstByteTxCb); - server->registerTxCallback(stream, 1, &dsrByteTxCb); - server->registerTxCallback(stream, 1, &lastByteTxCb); - server->registerTxCallback(stream, 2, &pastlastByteTxCb); + auto serverRegisterTxCallback1 = + server->registerTxCallback(stream, 0, &firstByteTxCb); + auto serverRegisterTxCallback2 = + server->registerTxCallback(stream, 1, &dsrByteTxCb); + auto serverRegisterTxCallback3 = + server->registerTxCallback(stream, 1, &lastByteTxCb); + auto serverRegisterTxCallback4 = + server->registerTxCallback(stream, 2, &pastlastByteTxCb); Mock::VerifyAndClearExpectations(&firstByteTxCb); Mock::VerifyAndClearExpectations(&dsrByteTxCb); Mock::VerifyAndClearExpectations(&lastByteTxCb); @@ -3532,9 +3546,12 @@ TEST_F(QuicServerTransportTest, InvokeTxCallbacksSingleByteDSR) { .Times(1); EXPECT_CALL(lastByteTxCb, onByteEventRegistered(getTxMatcher(stream, 1))) .Times(1); - server->registerTxCallback(stream, 0, &firstByteTxCb); - server->registerTxCallback(stream, 1, &dsrByteTxCb); - server->registerTxCallback(stream, 1, &lastByteTxCb); + auto serverRegisterTxCallback5 = + server->registerTxCallback(stream, 0, &firstByteTxCb); + auto serverRegisterTxCallback6 = + server->registerTxCallback(stream, 1, &dsrByteTxCb); + auto serverRegisterTxCallback7 = + server->registerTxCallback(stream, 1, &lastByteTxCb); Mock::VerifyAndClearExpectations(&firstByteTxCb); Mock::VerifyAndClearExpectations(&dsrByteTxCb); Mock::VerifyAndClearExpectations(&lastByteTxCb); @@ -3576,15 +3593,20 @@ TEST_F(QuicServerTransportTest, InvokeDeliveryCallbacksSingleByteWithDSR) { StrictMock unsentByteDeliveryCb; auto stream = server->createBidirectionalStream().value(); auto dsrSender = std::make_unique(); - server->setDSRPacketizationRequestSender(stream, std::move(dsrSender)); + auto serverSetDSRSender4 = + server->setDSRPacketizationRequestSender(stream, std::move(dsrSender)); auto buf = buildRandomInputData(1); - server->writeChain( + auto serverWriteChain14 = server->writeChain( stream, buf->clone(), false /* eof */, &writeChainDeliveryCb); - server->writeBufMeta(stream, BufferMeta(1), false, &writeBufMetaDeliveryCb); - server->registerDeliveryCallback(stream, 0, &firstByteDeliveryCb); - server->registerDeliveryCallback(stream, 1, &lastByteDeliveryCb); - server->registerDeliveryCallback(stream, 2, &unsentByteDeliveryCb); + auto serverWriteBufMeta3 = server->writeBufMeta( + stream, BufferMeta(1), false, &writeBufMetaDeliveryCb); + auto serverRegisterDelivery1 = + server->registerDeliveryCallback(stream, 0, &firstByteDeliveryCb); + auto serverRegisterDelivery2 = + server->registerDeliveryCallback(stream, 1, &lastByteDeliveryCb); + auto serverRegisterDelivery3 = + server->registerDeliveryCallback(stream, 2, &unsentByteDeliveryCb); // writeChain, first, last byte callbacks triggered after delivery auto& conn = server->getConnectionState(); @@ -3609,8 +3631,10 @@ TEST_F(QuicServerTransportTest, InvokeDeliveryCallbacksSingleByteWithDSR) { // callbacks should be triggered immediately EXPECT_CALL(firstByteDeliveryCb, onDeliveryAck(stream, 0, _)).Times(1); EXPECT_CALL(lastByteDeliveryCb, onDeliveryAck(stream, 1, _)).Times(1); - server->registerDeliveryCallback(stream, 0, &firstByteDeliveryCb); - server->registerDeliveryCallback(stream, 1, &lastByteDeliveryCb); + auto serverRegisterDelivery4 = + server->registerDeliveryCallback(stream, 0, &firstByteDeliveryCb); + auto serverRegisterDelivery5 = + server->registerDeliveryCallback(stream, 1, &lastByteDeliveryCb); loopForWrites(); Mock::VerifyAndClearExpectations(&firstByteDeliveryCb); Mock::VerifyAndClearExpectations(&lastByteDeliveryCb); @@ -4432,7 +4456,8 @@ TEST_F(QuicUnencryptedServerTransportTest, TestWriteHandshakeAndZeroRtt) { recvClientHello(); auto streamId = server->createBidirectionalStream().value(); - server->writeChain(streamId, IOBuf::copyBuffer("hello"), true); + auto serverWriteChain15 = + server->writeChain(streamId, IOBuf::copyBuffer("hello"), true); loopForWrites(); auto clientCodec = makeClientEncryptedCodec(true); @@ -4818,7 +4843,7 @@ class QuicServerTransportPendingDataTest GetParam().chloSync, GetParam().cfinSync); ON_CALL(*fakeHandshake, writeNewSessionTicket) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); if (GetParam().acceptZeroRtt) { fakeHandshake->allowZeroRttKeys(); } @@ -4999,86 +5024,89 @@ class QuicServerTransportHandshakeTest [](const Optional&, const BufPtr&) { return false; }, [=]() -> BufPtr { return folly::IOBuf::copyBuffer(appParams); }); EXPECT_CALL(*getFakeHandshakeLayer(), writeNewSessionTicket(_)) - .WillOnce(Invoke([=](const AppToken& appToken) { - auto& params = appToken.transportParams.parameters; + .WillOnce(Invoke( + [=](const AppToken& appToken) -> quic::Expected { + auto& params = appToken.transportParams.parameters; - auto initialMaxDataResult = getIntegerParameter( - TransportParameterId::initial_max_data, params); - EXPECT_FALSE(initialMaxDataResult.hasError()); - auto initialMaxData = *initialMaxDataResult.value(); - EXPECT_EQ( - initialMaxData, - server->getConn() - .transportSettings - .advertisedInitialConnectionFlowControlWindow); + auto initialMaxDataResult = getIntegerParameter( + TransportParameterId::initial_max_data, params); + EXPECT_FALSE(initialMaxDataResult.hasError()); + auto initialMaxData = *initialMaxDataResult.value(); + EXPECT_EQ( + initialMaxData, + server->getConn() + .transportSettings + .advertisedInitialConnectionFlowControlWindow); - auto initialMaxStreamDataBidiLocalResult = getIntegerParameter( - TransportParameterId::initial_max_stream_data_bidi_local, params); - EXPECT_FALSE(initialMaxStreamDataBidiLocalResult.hasError()); - auto initialMaxStreamDataBidiLocal = - *initialMaxStreamDataBidiLocalResult.value(); + auto initialMaxStreamDataBidiLocalResult = getIntegerParameter( + TransportParameterId::initial_max_stream_data_bidi_local, + params); + EXPECT_FALSE(initialMaxStreamDataBidiLocalResult.hasError()); + auto initialMaxStreamDataBidiLocal = + *initialMaxStreamDataBidiLocalResult.value(); - auto initialMaxStreamDataBidiRemoteResult = getIntegerParameter( - TransportParameterId::initial_max_stream_data_bidi_remote, - params); - EXPECT_FALSE(initialMaxStreamDataBidiRemoteResult.hasError()); - auto initialMaxStreamDataBidiRemote = - *initialMaxStreamDataBidiRemoteResult.value(); + auto initialMaxStreamDataBidiRemoteResult = getIntegerParameter( + TransportParameterId::initial_max_stream_data_bidi_remote, + params); + EXPECT_FALSE(initialMaxStreamDataBidiRemoteResult.hasError()); + auto initialMaxStreamDataBidiRemote = + *initialMaxStreamDataBidiRemoteResult.value(); - auto initialMaxStreamDataUniResult = getIntegerParameter( - TransportParameterId::initial_max_stream_data_bidi_remote, - params); - EXPECT_FALSE(initialMaxStreamDataUniResult.hasError()); - auto initialMaxStreamDataUni = *initialMaxStreamDataUniResult.value(); - EXPECT_EQ( - initialMaxStreamDataBidiLocal, - server->getConn() - .transportSettings - .advertisedInitialBidiLocalStreamFlowControlWindow); - EXPECT_EQ( - initialMaxStreamDataBidiRemote, - server->getConn() - .transportSettings - .advertisedInitialBidiRemoteStreamFlowControlWindow); - EXPECT_EQ( - initialMaxStreamDataUni, - server->getConn() - .transportSettings - .advertisedInitialUniStreamFlowControlWindow); + auto initialMaxStreamDataUniResult = getIntegerParameter( + TransportParameterId::initial_max_stream_data_bidi_remote, + params); + EXPECT_FALSE(initialMaxStreamDataUniResult.hasError()); + auto initialMaxStreamDataUni = + *initialMaxStreamDataUniResult.value(); + EXPECT_EQ( + initialMaxStreamDataBidiLocal, + server->getConn() + .transportSettings + .advertisedInitialBidiLocalStreamFlowControlWindow); + EXPECT_EQ( + initialMaxStreamDataBidiRemote, + server->getConn() + .transportSettings + .advertisedInitialBidiRemoteStreamFlowControlWindow); + EXPECT_EQ( + initialMaxStreamDataUni, + server->getConn() + .transportSettings + .advertisedInitialUniStreamFlowControlWindow); - auto initialMaxStreamsBidiResult = getIntegerParameter( - TransportParameterId::initial_max_streams_bidi, params); - EXPECT_FALSE(initialMaxStreamsBidiResult.hasError()); - auto initialMaxStreamsBidi = *initialMaxStreamsBidiResult.value(); + auto initialMaxStreamsBidiResult = getIntegerParameter( + TransportParameterId::initial_max_streams_bidi, params); + EXPECT_FALSE(initialMaxStreamsBidiResult.hasError()); + auto initialMaxStreamsBidi = *initialMaxStreamsBidiResult.value(); - auto initialMaxStreamsUniResult = getIntegerParameter( - TransportParameterId::initial_max_streams_uni, params); - EXPECT_FALSE(initialMaxStreamsUniResult.hasError()); - auto initialMaxStreamsUni = *initialMaxStreamsUniResult.value(); - EXPECT_EQ( - initialMaxStreamsBidi, - server->getConn() - .transportSettings.advertisedInitialMaxStreamsBidi); - EXPECT_EQ( - initialMaxStreamsUni, - server->getConn() - .transportSettings.advertisedInitialMaxStreamsUni); + auto initialMaxStreamsUniResult = getIntegerParameter( + TransportParameterId::initial_max_streams_uni, params); + EXPECT_FALSE(initialMaxStreamsUniResult.hasError()); + auto initialMaxStreamsUni = *initialMaxStreamsUniResult.value(); + EXPECT_EQ( + initialMaxStreamsBidi, + server->getConn() + .transportSettings.advertisedInitialMaxStreamsBidi); + EXPECT_EQ( + initialMaxStreamsUni, + server->getConn() + .transportSettings.advertisedInitialMaxStreamsUni); - auto maxRecvPacketSizeResult = getIntegerParameter( - TransportParameterId::max_packet_size, params); - EXPECT_FALSE(maxRecvPacketSizeResult.hasError()); - auto maxRecvPacketSize = *maxRecvPacketSizeResult.value(); - EXPECT_EQ( - maxRecvPacketSize, - server->getConn().transportSettings.maxRecvPacketSize); + auto maxRecvPacketSizeResult = getIntegerParameter( + TransportParameterId::max_packet_size, params); + EXPECT_FALSE(maxRecvPacketSizeResult.hasError()); + auto maxRecvPacketSize = *maxRecvPacketSizeResult.value(); + EXPECT_EQ( + maxRecvPacketSize, + server->getConn().transportSettings.maxRecvPacketSize); - EXPECT_THAT( - appToken.sourceAddresses, ContainerEq(expectedSourceToken_)); + EXPECT_THAT( + appToken.sourceAddresses, ContainerEq(expectedSourceToken_)); - EXPECT_TRUE(folly::IOBufEqualTo()( - appToken.appParams, folly::IOBuf::copyBuffer(appParams))); - return folly::unit; - })); + EXPECT_TRUE(folly::IOBufEqualTo()( + appToken.appParams, folly::IOBuf::copyBuffer(appParams))); + return {}; + })); } void testSetupConnection() { @@ -5166,17 +5194,19 @@ TEST_F(QuicServerTransportTest, TestRegisterAndHandleTransportKnobParams) { int flag = 0; server->registerKnobParamHandler( 199, - [&](QuicServerTransport* /* server_conn */, TransportKnobParam::Val val) { + [&](QuicServerTransport* /* server_conn */, + TransportKnobParam::Val val) -> quic::Expected { EXPECT_EQ(std::get(val), 10); flag = 1; - return folly::unit; + return {}; }); server->registerKnobParamHandler( 200, [&](QuicServerTransport* /* server_conn */, - const TransportKnobParam::Val& /* val */) { + const TransportKnobParam::Val& /* val */) + -> quic::Expected { flag = 2; - return folly::unit; + return {}; }); server->handleKnobParams({ {199, uint64_t{10}}, @@ -5188,10 +5218,11 @@ TEST_F(QuicServerTransportTest, TestRegisterAndHandleTransportKnobParams) { // overwrite will fail, the new handler won't be called server->registerKnobParamHandler( 199, - [&](QuicServerTransport* /* server_conn */, TransportKnobParam::Val val) { + [&](QuicServerTransport* /* server_conn */, + TransportKnobParam::Val val) -> quic::Expected { EXPECT_EQ(std::get(val), 30); flag = 3; - return folly::unit; + return {}; }); server->handleKnobParams({ @@ -5846,7 +5877,7 @@ TEST_F(QuicServerTransportTest, TestUseNewPriorityQueueKnobHandler) { auto buf = folly::IOBuf::create(1100); buf->append(1100); - server->writeChain(streamId, std::move(buf), false); + auto serverWriteChain16 = server->writeChain(streamId, std::move(buf), false); server->handleKnobParams( {{static_cast(TransportKnobParamId::USE_NEW_PRIORITY_QUEUE), @@ -5881,7 +5912,7 @@ TEST_F(QuicServerTransportTest, WriteDSR) { // Make sure we are post-handshake ASSERT_NE(nullptr, server->getConn().oneRttWriteCipher); // Rinse anything pending - server->writeData(); + auto serverWriteData1 = server->writeData(); loopForWrites(); server->getNonConstConn().outstandings.reset(); getFakeHandshakeLayer()->setCipherSuite( @@ -5890,17 +5921,18 @@ TEST_F(QuicServerTransportTest, WriteDSR) { // Large-ish non-DSR data but not a full packet's worth. auto buf = folly::IOBuf::create(1100); buf->append(1100); - server->writeChain(streamId, std::move(buf), false); + auto serverWriteChain17 = server->writeChain(streamId, std::move(buf), false); auto mockDSRSender = std::make_unique(); auto rawDSRSender = mockDSRSender.get(); - server->setDSRPacketizationRequestSender(streamId, std::move(mockDSRSender)); + auto serverSetDSRSender5 = server->setDSRPacketizationRequestSender( + streamId, std::move(mockDSRSender)); // Explicitly control how many packets we expect. server->getNonConstConn().transportSettings.writeConnectionDataPacketsLimit = 6; // Ensure we have plenty of data. BufferMeta bufMeta(server->getConn().udpSendPacketLen * 50); - server->writeBufMeta(streamId, bufMeta, true); - server->writeData(); + auto serverWriteBufMeta4 = server->writeBufMeta(streamId, bufMeta, true); + auto serverWriteData2 = server->writeData(); int numDsr = 0; int numNonDsr = 0; for (auto& p : server->getConn().outstandings.packets) { @@ -5916,7 +5948,8 @@ TEST_F(QuicServerTransportTest, WriteDSR) { EXPECT_EQ(numDsr, 6); EXPECT_EQ(numNonDsr, 1); EXPECT_CALL(*rawDSRSender, release()).Times(1); - server->resetStream(streamId, GenericApplicationErrorCode::NO_ERROR); + auto serverResetStream3 = + server->resetStream(streamId, GenericApplicationErrorCode::NO_ERROR); EXPECT_EQ(server->getConn().dsrPacketCount, 6); } diff --git a/quic/server/test/QuicServerTransportTestUtil.h b/quic/server/test/QuicServerTransportTestUtil.h index c2d8059db..c2904a2f6 100644 --- a/quic/server/test/QuicServerTransportTestUtil.h +++ b/quic/server/test/QuicServerTransportTestUtil.h @@ -112,7 +112,7 @@ class TestingQuicServerTransport : public QuicServerTransport { void registerKnobParamHandler( uint64_t paramId, - std::function( + std::function( QuicServerTransport*, TransportKnobParam::Val)>&& handler) { registerTransportKnobParamHandler(paramId, std::move(handler)); @@ -159,46 +159,47 @@ class QuicServerTransportTestBase : public virtual testing::Test { })); ON_CALL(*sock, address()).WillByDefault(testing::Return(serverAddr)); ON_CALL(*sock, setAdditionalCmsgsFunc(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, getGSO).WillByDefault(testing::Return(0)); ON_CALL(*sock, getGRO).WillByDefault(testing::Return(0)); ON_CALL(*sock, init(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, bind(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, connect(testing::_)) - .WillByDefault(testing::Return(folly::unit)); - ON_CALL(*sock, close()).WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); + ON_CALL(*sock, close()) + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, resumeWrite(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, setGRO(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, setRecvTos(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, getRecvTos()).WillByDefault(testing::Return(false)); ON_CALL(*sock, setTosOrTrafficClass(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, setCmsgs(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, appendCmsgs(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, getTimestamping()).WillByDefault(testing::Return(0)); ON_CALL(*sock, setReuseAddr(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, setDFAndTurnOffPMTU()) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, setErrMessageCallback(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, applyOptions(testing::_, testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, setReusePort(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, setRcvBuf(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, setSndBuf(testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); ON_CALL(*sock, setFD(testing::_, testing::_)) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); supportedVersions = {QuicVersion::MVFST}; serverCtx = createServerCtx(); connIdAlgo_ = std::make_unique(); @@ -290,7 +291,7 @@ class QuicServerTransportTestBase : public virtual testing::Test { fakeHandshake = new FakeServerHandshake( server->getNonConstConn(), getFizzServerContext()); ON_CALL(*fakeHandshake, writeNewSessionTicket) - .WillByDefault(testing::Return(folly::unit)); + .WillByDefault(testing::Return(quic::Expected{})); } virtual bool getDisableMigration() { diff --git a/quic/server/test/QuicSocketTest.cpp b/quic/server/test/QuicSocketTest.cpp index 8f846bda2..e9e7e3733 100644 --- a/quic/server/test/QuicSocketTest.cpp +++ b/quic/server/test/QuicSocketTest.cpp @@ -44,7 +44,7 @@ TEST_F(QuicSocketTest, simple) { EXPECT_CALL(*socket_, readNaked(3, _)) .WillOnce(Return(readResult("hello world", true))); EXPECT_CALL(*socket_, writeChain(3, _, true, nullptr)) - .WillOnce(Return(folly::unit)); + .WillOnce(Return(quic::Expected())); EXPECT_CALL(*socket_, setReadCallback(3, nullptr, _)); handler_.readAvailable(3); @@ -62,7 +62,7 @@ TEST_F(QuicSocketTest, multiple_reads) { EXPECT_CALL(*socket_, readNaked(3, _)) .WillOnce(Return(readResult("world", true))); EXPECT_CALL(*socket_, writeChain(3, _, true, nullptr)) - .WillOnce(Return(folly::unit)); + .WillOnce(Return(quic::Expected())); EXPECT_CALL(*socket_, setReadCallback(3, nullptr, _)); handler_.readAvailable(3); diff --git a/quic/server/test/ServerStateMachineTest.cpp b/quic/server/test/ServerStateMachineTest.cpp index c851d4974..08d32969c 100644 --- a/quic/server/test/ServerStateMachineTest.cpp +++ b/quic/server/test/ServerStateMachineTest.cpp @@ -141,7 +141,7 @@ TEST(ServerStateMachineTest, TestCidRejectedThenFail) { auto firstCid = getTestConnectionId(0); EXPECT_CALL(mockCidAlgo, encodeConnectionId(serverCidParams)) .WillOnce(Return(firstCid)) - .WillOnce(Return(folly::makeUnexpected( + .WillOnce(Return(quic::make_unexpected( QuicError(quic::TransportErrorCode::INTERNAL_ERROR, "Tumbledown")))); EXPECT_CALL(mockRejector, rejectConnectionIdNonConst(_)) .WillOnce(Invoke([&](const ConnectionId& inputCid) { diff --git a/quic/state/AckHandlers.cpp b/quic/state/AckHandlers.cpp index 88875652e..15dcdd57e 100644 --- a/quic/state/AckHandlers.cpp +++ b/quic/state/AckHandlers.cpp @@ -110,7 +110,7 @@ void removeOutstandingsForAck( * */ -folly::Expected processAckFrame( +quic::Expected processAckFrame( QuicConnectionStateBase& conn, PacketNumberSpace pnSpace, const ReadAckFrame& frame, @@ -132,7 +132,7 @@ folly::Expected processAckFrame( .build(); if (frame.largestAcked >= getAckState(conn, pnSpace).nextPacketNum) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::PROTOCOL_VIOLATION, "Future packet number acked")); } @@ -146,7 +146,7 @@ folly::Expected processAckFrame( return block.startPacket <= skippedPacketNum.value() && block.endPacket >= skippedPacketNum.value(); }) != frame.ackBlocks.end()) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::PROTOCOL_VIOLATION, "Skipped packet number acked")); } else if ( @@ -314,8 +314,8 @@ folly::Expected processAckFrame( // run the ACKed packet visitor auto ackedPacketResult = ackedPacketVisitor(*outstandingPacket); - if (ackedPacketResult.hasError()) { - return folly::makeUnexpected(ackedPacketResult.error()); + if (!ackedPacketResult.has_value()) { + return quic::make_unexpected(ackedPacketResult.error()); } // Update ecn counts @@ -351,8 +351,8 @@ folly::Expected processAckFrame( // run the ACKed frame visitor auto result = ackedFrameVisitor(*outstandingPacket, packetFrame); - if (result.hasError()) { - return folly::makeUnexpected(result.error()); + if (!result.has_value()) { + return quic::make_unexpected(result.error()); } if (maybePreAckIntervalSetVersion.has_value()) { @@ -420,8 +420,8 @@ folly::Expected processAckFrame( << originalPacketCount[PacketNumberSpace::AppData] << "}"; CHECK_GE(updatedOustandingPacketsCount, conn.outstandings.numClonedPackets()); auto lossEventExpected = handleAckForLoss(conn, lossVisitor, ack, pnSpace); - if (lossEventExpected.hasError()) { - return folly::makeUnexpected(lossEventExpected.error()); + if (!lossEventExpected.has_value()) { + return quic::make_unexpected(lossEventExpected.error()); } auto& lossEvent = lossEventExpected.value(); updateCongestionControllerForAck(conn, ack, lossEvent); diff --git a/quic/state/AckHandlers.h b/quic/state/AckHandlers.h index 1068df587..70532e6fa 100644 --- a/quic/state/AckHandlers.h +++ b/quic/state/AckHandlers.h @@ -9,6 +9,7 @@ #include #include +#include #include #include @@ -19,11 +20,10 @@ using AckVisitor = std::function; -using AckedPacketVisitor = - std::function( - const OutstandingPacketWrapper&)>; // outstanding packet acked +using AckedPacketVisitor = std::function( + const OutstandingPacketWrapper&)>; // outstanding packet acked -using AckedFrameVisitor = std::function( +using AckedFrameVisitor = std::function( const OutstandingPacketWrapper&, // outstanding packet acked const QuicWriteFrame&)>; // outstanding frame acked @@ -41,7 +41,7 @@ void removeOutstandingsForAck( * * Returns AckEvent with information about what was observed during processing */ -[[nodiscard]] folly::Expected processAckFrame( +[[nodiscard]] quic::Expected processAckFrame( QuicConnectionStateBase& conn, PacketNumberSpace pnSpace, const ReadAckFrame& ackFrame, diff --git a/quic/state/BUCK b/quic/state/BUCK index c0a891288..4ecb97c73 100644 --- a/quic/state/BUCK +++ b/quic/state/BUCK @@ -131,6 +131,7 @@ mvfst_cpp_library( "//quic/codec:types", "//quic/common:buf_accessor", "//quic/common:circular_deque", + "//quic/common:expected", "//quic/common:optional", "//quic/congestion_control:congestion_controller", "//quic/congestion_control:packet_processor", @@ -161,12 +162,13 @@ mvfst_cpp_library( "//quic/loss:loss", ], exported_deps = [ - "fbcode//quic:constants", - "fbcode//quic/codec:types", - "fbcode//quic/common:optional", - "fbcode//quic/congestion_control:congestion_controller", - "fbcode//quic/state:outstanding_packet", - "fbcode//quic/state:quic_state_machine", + ":outstanding_packet", + ":quic_state_machine", + "//quic:constants", + "//quic/codec:types", + "//quic/common:expected", + "//quic/common:optional", + "//quic/congestion_control:congestion_controller", ], ) @@ -184,6 +186,7 @@ mvfst_cpp_library( ], exported_deps = [ ":quic_state_machine", + "//quic/common:expected", ], ) @@ -251,6 +254,7 @@ mvfst_cpp_library( exported_deps = [ ":quic_state_machine", "//quic/codec:types", + "//quic/common:expected", ], ) diff --git a/quic/state/QuicStreamFunctions.cpp b/quic/state/QuicStreamFunctions.cpp index ddf800236..68659e3fb 100644 --- a/quic/state/QuicStreamFunctions.cpp +++ b/quic/state/QuicStreamFunctions.cpp @@ -23,7 +23,7 @@ void prependToBuf(quic::BufPtr& buf, quic::BufPtr toAppend) { } // namespace namespace quic { -folly::Expected +quic::Expected writeDataToQuicStream(QuicStreamState& stream, BufPtr data, bool eof) { auto neverWrittenBufMeta = (0 == stream.writeBufMeta.offset); uint64_t len = 0; @@ -48,14 +48,14 @@ writeDataToQuicStream(QuicStreamState& stream, BufPtr data, bool eof) { stream.finalWriteOffset = stream.currentWriteOffset + bufferSize; } auto result = updateFlowControlOnWriteToStream(stream, len); - if (result.hasError()) { - return folly::makeUnexpected(result.error()); + if (!result.has_value()) { + return quic::make_unexpected(result.error()); } stream.conn.streamManager->updateWritableStreams(stream); - return folly::unit; + return {}; } -folly::Expected writeBufMetaToQuicStream( +quic::Expected writeBufMetaToQuicStream( QuicStreamState& stream, const BufferMeta& data, bool eof) { @@ -80,11 +80,11 @@ folly::Expected writeBufMetaToQuicStream( stream.writeBufMeta.eof = true; } auto result = updateFlowControlOnWriteToStream(stream, data.length); - if (result.hasError()) { - return folly::makeUnexpected(result.error()); + if (!result.has_value()) { + return quic::make_unexpected(result.error()); } stream.conn.streamManager->updateWritableStreams(stream); - return folly::unit; + return {}; } void writeDataToQuicStream(QuicCryptoStream& stream, BufPtr data) { @@ -124,7 +124,7 @@ static void pushToTail(Buf* dst, BufPtr src, size_t allocSize) { } } -folly::Expected appendDataToReadBufferCommon( +quic::Expected appendDataToReadBufferCommon( QuicStreamLike& stream, StreamBuffer buffer, uint32_t coalescingSize, @@ -139,18 +139,18 @@ folly::Expected appendDataToReadBufferCommon( bufferEofOffset = bufferEndOffset; } else if (buffer.data.chainLength() == 0) { VLOG(10) << "Empty stream without EOF"; - return folly::unit; + return {}; } if (stream.finalReadOffset && bufferEofOffset && *stream.finalReadOffset != *bufferEofOffset) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::FINAL_SIZE_ERROR), std::string("Invalid EOF"))); } else if (bufferEofOffset) { // Do some consistency checks on the stream. if (stream.maxOffsetObserved > *bufferEofOffset) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::FINAL_SIZE_ERROR), std::string("EOF in middle of stream"))); } @@ -158,7 +158,7 @@ folly::Expected appendDataToReadBufferCommon( } else if (stream.finalReadOffset) { // We did not receive a segment with an EOF set. if (buffer.offset + buffer.data.chainLength() > *stream.finalReadOffset) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(TransportErrorCode::FINAL_SIZE_ERROR), std::string("Invalid data after EOF"))); } @@ -172,7 +172,7 @@ folly::Expected appendDataToReadBufferCommon( if (buffer.data.chainLength() == 0) { // Nothing more to do since we already processed the EOF // case. - return folly::unit; + return {}; } if (buffer.offset < stream.currentReadOffset) { @@ -180,14 +180,14 @@ folly::Expected appendDataToReadBufferCommon( buffer.data.trimStartAtMost(stream.currentReadOffset - buffer.offset); buffer.offset = stream.currentReadOffset; if (buffer.data.chainLength() == 0) { - return folly::unit; + return {}; } } // Nothing in the buffer, just append it. if (it == readBuffer.end()) { readBuffer.emplace_back(std::move(buffer)); - return folly::unit; + return {}; } // Start overlap will point to the first buffer that overlaps with the @@ -280,23 +280,23 @@ folly::Expected appendDataToReadBufferCommon( *startOverlap != readBuffer.end() || *endOverlap == readBuffer.end()); auto insertIt = readBuffer.erase(*startOverlap, *endOverlap); readBuffer.emplace(insertIt, std::move(*current)); - return folly::unit; + return {}; } else if (currentAlreadyInserted) { DCHECK(startOverlap); DCHECK(endOverlap); DCHECK( *startOverlap != readBuffer.end() || *endOverlap == readBuffer.end()); readBuffer.erase(*startOverlap, *endOverlap); - return folly::unit; + return {}; } auto last = readBuffer.end() - 1; if (current->offset > last->offset + last->data.chainLength()) { readBuffer.emplace_back(std::move(*current)); } - return folly::unit; + return {}; } -folly::Expected appendDataToReadBuffer( +quic::Expected appendDataToReadBuffer( QuicStreamState& stream, StreamBuffer buffer) { return appendDataToReadBufferCommon( @@ -309,7 +309,7 @@ folly::Expected appendDataToReadBuffer( }); } -folly::Expected appendDataToReadBuffer( +quic::Expected appendDataToReadBuffer( QuicCryptoStream& stream, StreamBuffer buffer) { return appendDataToReadBufferCommon( @@ -367,7 +367,7 @@ BufPtr readDataFromCryptoStream(QuicCryptoStream& stream, uint64_t amount) { return readDataInOrderFromReadBuffer(stream, amount).first; } -folly::Expected, QuicError> readDataFromQuicStream( +quic::Expected, QuicError> readDataFromQuicStream( QuicStreamState& stream, uint64_t amount) { auto eof = stream.finalReadOffset && @@ -389,8 +389,8 @@ folly::Expected, QuicError> readDataFromQuicStream( // control auto flowControlResult = updateFlowControlOnRead(stream, lastReadOffset, Clock::now()); - if (flowControlResult.hasError()) { - return folly::makeUnexpected(flowControlResult.error()); + if (!flowControlResult.has_value()) { + return quic::make_unexpected(flowControlResult.error()); } eof = stream.finalReadOffset && stream.currentReadOffset == *stream.finalReadOffset; @@ -418,7 +418,7 @@ void peekDataFromQuicStream( * Same as readDataFromQuicStream(), * only releases existing data instead of returning it. */ -folly::Expected consumeDataFromQuicStream( +quic::Expected consumeDataFromQuicStream( QuicStreamState& stream, uint64_t amount) { bool eof = stream.finalReadOffset && @@ -429,7 +429,7 @@ folly::Expected consumeDataFromQuicStream( } stream.conn.streamManager->updateReadableStreams(stream); stream.conn.streamManager->updatePeekableStreams(stream); - return folly::unit; + return {}; } uint64_t lastReadOffset = stream.currentReadOffset; @@ -439,8 +439,8 @@ folly::Expected consumeDataFromQuicStream( // control auto flowControlResult = updateFlowControlOnRead(stream, lastReadOffset, Clock::now()); - if (flowControlResult.hasError()) { - return folly::makeUnexpected(flowControlResult.error()); + if (!flowControlResult.has_value()) { + return quic::make_unexpected(flowControlResult.error()); } eof = stream.finalReadOffset && stream.currentReadOffset == *stream.finalReadOffset; @@ -449,7 +449,7 @@ folly::Expected consumeDataFromQuicStream( } stream.conn.streamManager->updateReadableStreams(stream); stream.conn.streamManager->updatePeekableStreams(stream); - return folly::unit; + return {}; } bool allBytesTillFinAcked(const QuicStreamState& stream) { diff --git a/quic/state/QuicStreamFunctions.h b/quic/state/QuicStreamFunctions.h index 445c03c46..460d61410 100644 --- a/quic/state/QuicStreamFunctions.h +++ b/quic/state/QuicStreamFunctions.h @@ -7,6 +7,7 @@ #pragma once +#include #include namespace quic { @@ -17,7 +18,7 @@ namespace quic { * * @throws QuicTransportException on error. */ -[[nodiscard]] folly::Expected +[[nodiscard]] quic::Expected writeDataToQuicStream(QuicStreamState& stream, BufPtr data, bool eof); /** @@ -26,7 +27,7 @@ writeDataToQuicStream(QuicStreamState& stream, BufPtr data, bool eof); * * TODO: move to dsr directory. */ -[[nodiscard]] folly::Expected writeBufMetaToQuicStream( +[[nodiscard]] quic::Expected writeBufMetaToQuicStream( QuicStreamState& stream, const BufferMeta& data, bool eof); @@ -43,7 +44,7 @@ void writeDataToQuicStream(QuicCryptoStream& stream, BufPtr data); * * @throws QuicTransportException on error. */ -[[nodiscard]] folly::Expected appendDataToReadBuffer( +[[nodiscard]] quic::Expected appendDataToReadBuffer( QuicStreamState& stream, StreamBuffer buffer); @@ -53,7 +54,7 @@ void writeDataToQuicStream(QuicCryptoStream& stream, BufPtr data); * * @throws QuicTransportException on error. */ -[[nodiscard]] folly::Expected appendDataToReadBuffer( +[[nodiscard]] quic::Expected appendDataToReadBuffer( QuicCryptoStream& stream, StreamBuffer buffer); @@ -62,7 +63,7 @@ void writeDataToQuicStream(QuicCryptoStream& stream, BufPtr data); * Returns a pair of data and whether or not EOF was reached on the stream. * amount == 0 reads all the pending data in the stream. */ -folly::Expected, QuicError> readDataFromQuicStream( +quic::Expected, QuicError> readDataFromQuicStream( QuicStreamState& state, uint64_t amount = 0); @@ -88,7 +89,7 @@ void peekDataFromQuicStream( * Same as readDataFromQuicStream, * releases data instead of returning it. */ -folly::Expected consumeDataFromQuicStream( +quic::Expected consumeDataFromQuicStream( QuicStreamState& stream, uint64_t amount); @@ -140,8 +141,7 @@ uint64_t getNumPacketsTxWithNewData(const QuicStreamState& stream); * object. Callers should provide a connFlowControlVisitor which will be invoked * when flow control operations need to be performed. */ -[[nodiscard]] folly::Expected -appendDataToReadBufferCommon( +[[nodiscard]] quic::Expected appendDataToReadBufferCommon( QuicStreamLike& stream, StreamBuffer buffer, uint32_t coalescingSize, diff --git a/quic/state/QuicStreamManager.cpp b/quic/state/QuicStreamManager.cpp index cbbb8e16e..17c89b8e2 100644 --- a/quic/state/QuicStreamManager.cpp +++ b/quic/state/QuicStreamManager.cpp @@ -140,12 +140,12 @@ QuicStreamState* QuicStreamManager::findStream(StreamId streamId) { } } -folly::Expected +quic::Expected QuicStreamManager::setMaxLocalBidirectionalStreams( uint64_t maxStreams, bool force) { if (maxStreams > kMaxMaxStreams) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_LIMIT_ERROR, "Attempt to set maxStreams beyond the max allowed.")); } @@ -155,15 +155,15 @@ QuicStreamManager::setMaxLocalBidirectionalStreams( maxLocalBidirectionalStreamId_ = maxStreamId; maxLocalBidirectionalStreamIdIncreased_ = true; } - return folly::unit; + return {}; } -folly::Expected +quic::Expected QuicStreamManager::setMaxLocalUnidirectionalStreams( uint64_t maxStreams, bool force) { if (maxStreams > kMaxMaxStreams) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_LIMIT_ERROR, "Attempt to set maxStreams beyond the max allowed.")); } @@ -173,27 +173,27 @@ QuicStreamManager::setMaxLocalUnidirectionalStreams( maxLocalUnidirectionalStreamId_ = maxStreamId; maxLocalUnidirectionalStreamIdIncreased_ = true; } - return folly::unit; + return {}; } // Public API now returns Expected to propagate internal errors -folly::Expected +quic::Expected QuicStreamManager::setMaxRemoteBidirectionalStreams(uint64_t maxStreams) { return setMaxRemoteBidirectionalStreamsInternal(maxStreams, false); } // Public API now returns Expected to propagate internal errors -folly::Expected +quic::Expected QuicStreamManager::setMaxRemoteUnidirectionalStreams(uint64_t maxStreams) { return setMaxRemoteUnidirectionalStreamsInternal(maxStreams, false); } -folly::Expected +quic::Expected QuicStreamManager::setMaxRemoteBidirectionalStreamsInternal( uint64_t maxStreams, bool force) { if (maxStreams > kMaxMaxStreams) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_LIMIT_ERROR, "Attempt to set maxStreams beyond the max allowed.")); } @@ -202,15 +202,15 @@ QuicStreamManager::setMaxRemoteBidirectionalStreamsInternal( if (force || maxStreamId > maxRemoteBidirectionalStreamId_) { maxRemoteBidirectionalStreamId_ = maxStreamId; } - return folly::unit; + return {}; } -folly::Expected +quic::Expected QuicStreamManager::setMaxRemoteUnidirectionalStreamsInternal( uint64_t maxStreams, bool force) { if (maxStreams > kMaxMaxStreams) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_LIMIT_ERROR, "Attempt to set maxStreams beyond the max allowed.")); } @@ -219,7 +219,7 @@ QuicStreamManager::setMaxRemoteUnidirectionalStreamsInternal( if (force || maxStreamId > maxRemoteUnidirectionalStreamId_) { maxRemoteUnidirectionalStreamId_ = maxStreamId; } - return folly::unit; + return {}; } bool QuicStreamManager::consumeMaxLocalBidirectionalStreamIdIncreased() { @@ -234,18 +234,18 @@ bool QuicStreamManager::consumeMaxLocalUnidirectionalStreamIdIncreased() { return res; } -folly::Expected -QuicStreamManager::setPriorityQueue(std::unique_ptr queue) { +quic::Expected QuicStreamManager::setPriorityQueue( + std::unique_ptr queue) { if (oldWriteQueue_) { LOG(ERROR) << "Cannot change priority queue when the old queue is in use"; - return folly::makeUnexpected(LocalErrorCode::INTERNAL_ERROR); + return quic::make_unexpected(LocalErrorCode::INTERNAL_ERROR); } if (!writeQueue().empty()) { LOG(ERROR) << "Cannot change priority queue when the queue is not empty"; - return folly::makeUnexpected(LocalErrorCode::INTERNAL_ERROR); + return quic::make_unexpected(LocalErrorCode::INTERNAL_ERROR); } writeQueue_ = std::move(queue); - return folly::unit; + return {}; } bool QuicStreamManager::setStreamPriority( @@ -269,20 +269,20 @@ bool QuicStreamManager::setStreamPriority( return false; } -folly::Expected -QuicStreamManager::refreshTransportSettings(const TransportSettings& settings) { +quic::Expected QuicStreamManager::refreshTransportSettings( + const TransportSettings& settings) { transportSettings_ = &settings; auto resultBidi = setMaxRemoteBidirectionalStreamsInternal( transportSettings_->advertisedInitialMaxStreamsBidi, true); - if (resultBidi.hasError()) { + if (!resultBidi.has_value()) { // Propagate the error - return folly::makeUnexpected(resultBidi.error()); + return quic::make_unexpected(resultBidi.error()); } auto resultUni = setMaxRemoteUnidirectionalStreamsInternal( transportSettings_->advertisedInitialMaxStreamsUni, true); - if (resultUni.hasError()) { + if (!resultUni.has_value()) { // Propagate the error - return folly::makeUnexpected(resultUni.error()); + return quic::make_unexpected(resultUni.error()); } // TODO: The dependency on HTTPPriorityQueue here seems out of place in @@ -293,13 +293,13 @@ QuicStreamManager::refreshTransportSettings(const TransportSettings& settings) { return updatePriorityQueueImpl(transportSettings_->useNewPriorityQueue); } -folly::Expected -QuicStreamManager::updatePriorityQueueImpl(bool useNewPriorityQueue) { +quic::Expected QuicStreamManager::updatePriorityQueueImpl( + bool useNewPriorityQueue) { if (!useNewPriorityQueue && !oldWriteQueue_) { if (writeQueue_->empty() && connFlowControlBlocked_.empty()) { oldWriteQueue_ = std::make_unique(); } else { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(LocalErrorCode::INTERNAL_ERROR), "Cannot change priority queue when the queue is not empty")); } @@ -307,16 +307,16 @@ QuicStreamManager::updatePriorityQueueImpl(bool useNewPriorityQueue) { if (oldWriteQueue_->empty()) { oldWriteQueue_.reset(); } else { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( QuicErrorCode(LocalErrorCode::INTERNAL_ERROR), "Cannot change to new priority queue when the queue is not empty")); } } // else no change - return folly::unit; + return {}; } -folly::Expected +quic::Expected QuicStreamManager::getOrCreateOpenedLocalStream(StreamId streamId) { auto& openLocalStreams = isUnidirectionalStream(streamId) ? openUnidirectionalLocalStreams_ @@ -327,7 +327,7 @@ QuicStreamManager::getOrCreateOpenedLocalStream(StreamId streamId) { std::forward_as_tuple(streamId), std::forward_as_tuple(streamId, conn_)); if (!it.second) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_STATE_ERROR, "Creating an active stream")); } QUIC_STATS(conn_.statsCallback, onNewQuicStream); @@ -336,7 +336,7 @@ QuicStreamManager::getOrCreateOpenedLocalStream(StreamId streamId) { return nullptr; } -folly::Expected QuicStreamManager::getStream( +quic::Expected QuicStreamManager::getStream( StreamId streamId, OptionalIntegral streamGroupId) { if (isRemoteStream(nodeType_, streamId)) { @@ -344,7 +344,7 @@ folly::Expected QuicStreamManager::getStream( getOrCreatePeerStream(streamId, std::move(streamGroupId)); // If successful (has value, which could be nullptr or a valid ptr), update // state. - if (streamResult.hasValue()) { + if (streamResult.has_value()) { updateAppIdleState(); } // Propagate error, or return the contained value (ptr or nullptr) @@ -362,10 +362,10 @@ folly::Expected QuicStreamManager::getStream( // Try to get/create state for an already opened (but not instantiated) local // stream auto streamResult = getOrCreateOpenedLocalStream(streamId); - if (streamResult.hasError()) { + if (!streamResult.has_value()) { // This indicates an internal error during lazy creation // Propagate as QuicError - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::INTERNAL_ERROR, "Failed to create local stream state")); } @@ -378,7 +378,7 @@ folly::Expected QuicStreamManager::getStream( if (!stream && isStreamUnopened(streamId, nextAcceptableStreamId)) { // The stream ID is higher than the next acceptable one, meaning it hasn't // been opened yet. This was previously a throw -> return error. - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_STATE_ERROR, "Trying to get unopened local stream")); } @@ -396,12 +396,12 @@ folly::Expected QuicStreamManager::getStream( // internally or by APIs that expect local errors for stream creation failures. // However, the underlying call to createStream returns QuicError, which we must // handle. -folly::Expected +quic::Expected QuicStreamManager::createNextBidirectionalStream( OptionalIntegral streamGroupId) { auto streamResult = createStream(nextBidirectionalStreamId_, std::move(streamGroupId)); - if (streamResult.hasValue()) { + if (streamResult.has_value()) { nextBidirectionalStreamId_ += detail::kStreamIncrement; return streamResult.value(); } else { @@ -413,17 +413,17 @@ QuicStreamManager::createNextBidirectionalStream( LOG(WARNING) << "createStream failed: " << error.message; // Log the original error if (error.code == TransportErrorCode::STREAM_LIMIT_ERROR) { - return folly::makeUnexpected(LocalErrorCode::STREAM_LIMIT_EXCEEDED); + return quic::make_unexpected(LocalErrorCode::STREAM_LIMIT_EXCEEDED); } else if (error.code == TransportErrorCode::STREAM_STATE_ERROR) { - return folly::makeUnexpected( + return quic::make_unexpected( LocalErrorCode::CREATING_EXISTING_STREAM); // Or other state error? } else { - return folly::makeUnexpected(LocalErrorCode::INTERNAL_ERROR); + return quic::make_unexpected(LocalErrorCode::INTERNAL_ERROR); } } } -folly::Expected +quic::Expected QuicStreamManager::createNextBidirectionalStreamGroup() { return createNextStreamGroup( nextBidirectionalStreamGroupId_, openBidirectionalLocalStreamGroups_); @@ -431,12 +431,12 @@ QuicStreamManager::createNextBidirectionalStreamGroup() { // Note: Similar to createNextBidirectionalStream regarding LocalErrorCode // return. -folly::Expected +quic::Expected QuicStreamManager::createNextUnidirectionalStream( OptionalIntegral streamGroupId) { auto streamResult = createStream(nextUnidirectionalStreamId_, std::move(streamGroupId)); - if (streamResult.hasValue()) { + if (streamResult.has_value()) { nextUnidirectionalStreamId_ += detail::kStreamIncrement; return streamResult.value(); } else { @@ -444,11 +444,11 @@ QuicStreamManager::createNextUnidirectionalStream( auto& error = streamResult.error(); LOG(WARNING) << "createStream failed: " << error.message; if (error.code == TransportErrorCode::STREAM_LIMIT_ERROR) { - return folly::makeUnexpected(LocalErrorCode::STREAM_LIMIT_EXCEEDED); + return quic::make_unexpected(LocalErrorCode::STREAM_LIMIT_EXCEEDED); } else if (error.code == TransportErrorCode::STREAM_STATE_ERROR) { - return folly::makeUnexpected(LocalErrorCode::CREATING_EXISTING_STREAM); + return quic::make_unexpected(LocalErrorCode::CREATING_EXISTING_STREAM); } else { - return folly::makeUnexpected(LocalErrorCode::INTERNAL_ERROR); + return quic::make_unexpected(LocalErrorCode::INTERNAL_ERROR); } } } @@ -489,13 +489,13 @@ QuicStreamState* FOLLY_NULLABLE QuicStreamManager::instantiatePeerStream( return &it->second; } -folly::Expected +quic::Expected QuicStreamManager::createNextUnidirectionalStreamGroup() { return createNextStreamGroup( nextUnidirectionalStreamGroupId_, openUnidirectionalLocalStreamGroups_); } -folly::Expected +quic::Expected QuicStreamManager::createNextStreamGroup( StreamGroupId& groupId, StreamIdSet& streamGroups) { @@ -504,7 +504,7 @@ QuicStreamManager::createNextStreamGroup( detail::kStreamGroupIncrement, detail::kMaxStreamGroupId); if (groupId >= maxLocalStreamGroupId) { - return folly::makeUnexpected(LocalErrorCode::STREAM_LIMIT_EXCEEDED); + return quic::make_unexpected(LocalErrorCode::STREAM_LIMIT_EXCEEDED); } auto id = groupId; @@ -516,22 +516,22 @@ QuicStreamManager::createNextStreamGroup( // Returns QuicError for transport-level issues (limits, state), nullptr if // closed. -folly::Expected +quic::Expected QuicStreamManager::getOrCreatePeerStream( StreamId streamId, OptionalIntegral streamGroupId) { // Validate stream direction based on node type if (nodeType_ == QuicNodeType::Client && isClientStream(streamId)) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_STATE_ERROR, "Attempted getting client peer stream on client")); } else if (nodeType_ == QuicNodeType::Server && isServerStream(streamId)) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_STATE_ERROR, "Attempted getting server peer stream on server")); } else if (!isClientStream(streamId) && !isServerStream(streamId)) { // Validate stream ID format itself - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_STATE_ERROR, "Invalid stream ID format")); } @@ -539,13 +539,13 @@ QuicStreamManager::getOrCreatePeerStream( if (streamGroupId) { if (nodeType_ == QuicNodeType::Client && isClientStreamGroup(*streamGroupId)) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_STATE_ERROR, "Received a client stream group id on client")); } else if ( nodeType_ == QuicNodeType::Server && isServerStreamGroup(*streamGroupId)) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_STATE_ERROR, "Received a server stream group id on server")); } @@ -558,7 +558,7 @@ QuicStreamManager::getOrCreatePeerStream( detail::kMaxStreamGroupId); if (*streamGroupId >= maxPeerStreamGroupId) { // Peer used a group ID we didn't advertise support for - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_LIMIT_ERROR, // Or // FEATURE_NEGOTIATION_ERROR? // Limit seems better. @@ -584,7 +584,7 @@ QuicStreamManager::getOrCreatePeerStream( auto* streamPtr = instantiatePeerStream(streamId, streamGroupId); if (!streamPtr) { // Propagate internal inconsistency as QuicError - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::INTERNAL_ERROR, "Failed to instantiate known open peer stream")); } @@ -616,7 +616,7 @@ QuicStreamManager::getOrCreatePeerStream( // Check if the peer exceeded the stream limit if (openedResult == LocalErrorCode::STREAM_LIMIT_EXCEEDED) { // This was previously a throw -> return error - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_LIMIT_ERROR, "Peer exceeded stream limit.")); } @@ -643,7 +643,7 @@ QuicStreamManager::getOrCreatePeerStream( auto* streamPtr = instantiatePeerStream(streamId, streamGroupId); if (!streamPtr) { // Propagate internal inconsistency as QuicError - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::INTERNAL_ERROR, "Failed to instantiate newly opened peer stream")); } @@ -651,18 +651,18 @@ QuicStreamManager::getOrCreatePeerStream( } // Returns QuicError for transport-level issues (limits, state, internal) -folly::Expected QuicStreamManager::createStream( +quic::Expected QuicStreamManager::createStream( StreamId streamId, OptionalIntegral streamGroupId) { // Validate stream direction based on node type if (nodeType_ == QuicNodeType::Client && !isClientStream(streamId)) { // Previously threw -> return error - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_STATE_ERROR, "Attempted creating non-client stream on client")); } else if (nodeType_ == QuicNodeType::Server && !isServerStream(streamId)) { // Previously threw -> return error - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_STATE_ERROR, "Attempted creating non-server stream on server")); } @@ -674,7 +674,7 @@ folly::Expected QuicStreamManager::createStream( : openBidirectionalLocalStreamGroups_; if (!openGroups.contains(*streamGroupId)) { // Previously threw -> return error - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_STATE_ERROR, "Attempted creating a stream in non-existent local group")); } @@ -683,14 +683,14 @@ folly::Expected QuicStreamManager::createStream( if (nodeType_ == QuicNodeType::Client && !isClientStreamGroup(*streamGroupId)) { // Previously threw -> return error - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_STATE_ERROR, "Attempted creating a stream in non-client stream group on client")); } else if ( nodeType_ == QuicNodeType::Server && !isServerStreamGroup(*streamGroupId)) { // Previously threw -> return error - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_STATE_ERROR, "Attempted creating a stream in non-server stream group on server")); } @@ -698,7 +698,7 @@ folly::Expected QuicStreamManager::createStream( // Check if stream was already implicitly opened but not yet instantiated auto openedStreamResult = getOrCreateOpenedLocalStream(streamId); - if (openedStreamResult.hasError()) { + if (!openedStreamResult.has_value()) { // Propagate internal error as QuicError return openedStreamResult; } @@ -708,7 +708,7 @@ folly::Expected QuicStreamManager::createStream( openedStreamResult.value()->groupId != streamGroupId) { if (openedStreamResult.value()->groupId.has_value()) { // Previously threw -> return error - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_STATE_ERROR, "Stream exists lazily with different group ID")); } @@ -731,14 +731,12 @@ folly::Expected QuicStreamManager::createStream( streamId, openLocalStreams, nextAcceptableStreamId, maxStreamId); if (openedResultCode == LocalErrorCode::STREAM_LIMIT_EXCEEDED) { - // Previously threw -> return error - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_LIMIT_ERROR, "Cannot create stream: limit exceeded")); } if (openedResultCode == LocalErrorCode::CREATING_EXISTING_STREAM) { - // Previously threw -> return error - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_STATE_ERROR, "Cannot create stream: already exists or closed")); } @@ -752,7 +750,7 @@ folly::Expected QuicStreamManager::createStream( // Propagate internal error as QuicError LOG(ERROR) << "Failed to emplace stream " << streamId << " after opening check"; - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::INTERNAL_ERROR, "Failed to emplace stream state after opening")); } @@ -762,12 +760,12 @@ folly::Expected QuicStreamManager::createStream( return &it->second; } -folly::Expected QuicStreamManager::removeClosedStream( +quic::Expected QuicStreamManager::removeClosedStream( StreamId streamId) { auto it = streams_.find(streamId); if (it == streams_.end()) { VLOG(10) << "Trying to remove already closed stream=" << streamId; - return folly::unit; + return {}; } VLOG(10) << "Removing closed stream=" << streamId; DCHECK(it->second.inTerminalStates()); @@ -829,8 +827,8 @@ folly::Expected QuicStreamManager::removeClosedStream( detail::kStreamIncrement; auto result = setMaxRemoteUnidirectionalStreams(maxStreams + streamCredit); - if (result.hasError()) { - return folly::makeUnexpected(result.error()); + if (!result.has_value()) { + return quic::make_unexpected(result.error()); } remoteUnidirectionalStreamLimitUpdate_ = maxStreams + streamCredit; @@ -840,8 +838,8 @@ folly::Expected QuicStreamManager::removeClosedStream( detail::kStreamIncrement; auto result = setMaxRemoteBidirectionalStreams(maxStreams + streamCredit); - if (result.hasError()) { - return folly::makeUnexpected(result.error()); + if (!result.has_value()) { + return quic::make_unexpected(result.error()); } remoteBidirectionalStreamLimitUpdate_ = maxStreams + streamCredit; } @@ -855,7 +853,7 @@ folly::Expected QuicStreamManager::removeClosedStream( } updateAppIdleState(); - return folly::unit; + return {}; } void QuicStreamManager::addToReadableStreams(const QuicStreamState& stream) { diff --git a/quic/state/QuicStreamManager.h b/quic/state/QuicStreamManager.h index 682444ffe..874b54d7b 100644 --- a/quic/state/QuicStreamManager.h +++ b/quic/state/QuicStreamManager.h @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -255,47 +256,47 @@ class QuicStreamManager { /* * Create the state for a stream if it does not exist and return it. */ - [[nodiscard]] folly::Expected createStream( + [[nodiscard]] quic::Expected createStream( StreamId streamId, OptionalIntegral streamGroupId = std::nullopt); /* * Create a new bidirectional stream group. */ - [[nodiscard]] folly::Expected + [[nodiscard]] quic::Expected createNextBidirectionalStreamGroup(); /* * Create and return the state for the next available bidirectional stream. */ - [[nodiscard]] folly::Expected + [[nodiscard]] quic::Expected createNextBidirectionalStream( OptionalIntegral streamGroupId = std::nullopt); /* * Create a new unidirectional stream group. */ - [[nodiscard]] folly::Expected + [[nodiscard]] quic::Expected createNextUnidirectionalStreamGroup(); /* * Create and return the state for the next available unidirectional stream. */ - [[nodiscard]] folly::Expected + [[nodiscard]] quic::Expected createNextUnidirectionalStream( OptionalIntegral streamGroupId = std::nullopt); /* * Return the stream state or create it if the state has not yet been created. */ - [[nodiscard]] folly::Expected getStream( + [[nodiscard]] quic::Expected getStream( StreamId streamId, OptionalIntegral streamGroupId = std::nullopt); /* * Remove all the state for a stream that is being closed. */ - [[nodiscard]] folly::Expected removeClosedStream( + [[nodiscard]] quic::Expected removeClosedStream( StreamId streamId); /* @@ -445,7 +446,7 @@ class QuicStreamManager { lossStreams_.insert(id); } - folly::Expected setPriorityQueue( + quic::Expected setPriorityQueue( std::unique_ptr queue); /** @@ -532,25 +533,26 @@ class QuicStreamManager { /* * Set the max number of local bidirectional streams. */ - [[nodiscard]] folly::Expected - setMaxLocalBidirectionalStreams(uint64_t maxStreams, bool force = false); + [[nodiscard]] quic::Expected setMaxLocalBidirectionalStreams( + uint64_t maxStreams, + bool force = false); /* * Set the max number of local unidirectional streams. */ - [[nodiscard]] folly::Expected + [[nodiscard]] quic::Expected setMaxLocalUnidirectionalStreams(uint64_t maxStreams, bool force = false); /* * Set the max number of remote bidirectional streams. */ - [[nodiscard]] folly::Expected + [[nodiscard]] quic::Expected setMaxRemoteBidirectionalStreams(uint64_t maxStreams); /* * Set the max number of remote unidirectional streams. */ - [[nodiscard]] folly::Expected + [[nodiscard]] quic::Expected setMaxRemoteUnidirectionalStreams(uint64_t maxStreams); bool consumeMaxLocalBidirectionalStreamIdIncreased(); @@ -558,10 +560,10 @@ class QuicStreamManager { // This function messes with the connection state and you should think very // hard before calling it - [[nodiscard]] folly::Expected - refreshTransportSettings(const TransportSettings& settings); + [[nodiscard]] quic::Expected refreshTransportSettings( + const TransportSettings& settings); - [[nodiscard]] folly::Expected updatePriorityQueueImpl( + [[nodiscard]] quic::Expected updatePriorityQueueImpl( bool useNewPriorityQueue); void setStreamLimitWindowingFraction(uint64_t fraction) { @@ -841,24 +843,24 @@ class QuicStreamManager { private: void updateAppIdleState(); - [[nodiscard]] folly::Expected + [[nodiscard]] quic::Expected getOrCreateOpenedLocalStream(StreamId streamId); - [[nodiscard]] folly::Expected + [[nodiscard]] quic::Expected getOrCreatePeerStream( StreamId streamId, OptionalIntegral streamGroupId = std::nullopt); - [[nodiscard]] folly::Expected + [[nodiscard]] quic::Expected setMaxRemoteBidirectionalStreamsInternal(uint64_t maxStreams, bool force); - [[nodiscard]] folly::Expected + [[nodiscard]] quic::Expected setMaxRemoteUnidirectionalStreamsInternal(uint64_t maxStreams, bool force); QuicStreamState* FOLLY_NULLABLE instantiatePeerStream( StreamId streamId, OptionalIntegral groupId); - [[nodiscard]] folly::Expected + [[nodiscard]] quic::Expected createNextStreamGroup(StreamGroupId& groupId, StreamIdSet& streamGroups); void addToReadableStreams(const QuicStreamState& stream); diff --git a/quic/state/SimpleFrameFunctions.cpp b/quic/state/SimpleFrameFunctions.cpp index a036b48e4..18a73072f 100644 --- a/quic/state/SimpleFrameFunctions.cpp +++ b/quic/state/SimpleFrameFunctions.cpp @@ -109,7 +109,7 @@ void updateSimpleFrameOnPacketLoss( } } -folly::Expected updateSimpleFrameOnPacketReceived( +quic::Expected updateSimpleFrameOnPacketReceived( QuicConnectionStateBase& conn, const QuicSimpleFrame& frame, const ConnectionId& dstConnId, @@ -118,14 +118,14 @@ folly::Expected updateSimpleFrameOnPacketReceived( case QuicSimpleFrame::Type::StopSendingFrame: { const StopSendingFrame& stopSending = *frame.asStopSendingFrame(); auto streamResult = conn.streamManager->getStream(stopSending.streamId); - if (streamResult.hasError()) { - return folly::makeUnexpected(streamResult.error()); + if (!streamResult.has_value()) { + return quic::make_unexpected(streamResult.error()); } auto& stream = streamResult.value(); if (stream) { auto result = sendStopSendingSMHandler(*stream, stopSending); - if (result.hasError()) { - return folly::makeUnexpected(result.error()); + if (!result.has_value()) { + return quic::make_unexpected(result.error()); } } return true; @@ -133,7 +133,7 @@ folly::Expected updateSimpleFrameOnPacketReceived( case QuicSimpleFrame::Type::PathChallengeFrame: { bool rotatedId = conn.retireAndSwitchPeerConnectionIds(); if (!rotatedId) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::INVALID_MIGRATION, "No more connection ids to use for new path.")); } @@ -173,7 +173,7 @@ folly::Expected updateSimpleFrameOnPacketReceived( // TODO vchynaro Ensure we ignore smaller subsequent retirePriorTos // than the largest seen so far. if (newConnectionId.retirePriorTo > newConnectionId.sequenceNumber) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::PROTOCOL_VIOLATION, "Retire prior to greater than sequence number")); } @@ -182,7 +182,7 @@ folly::Expected updateSimpleFrameOnPacketReceived( if (existingPeerConnIdData.connId == newConnectionId.connectionId) { if (existingPeerConnIdData.sequenceNumber != newConnectionId.sequenceNumber) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::PROTOCOL_VIOLATION, "Repeated connection id with different sequence number.")); } else { @@ -199,7 +199,7 @@ folly::Expected updateSimpleFrameOnPacketReceived( (conn.nodeType == QuicNodeType::Client ? conn.serverConnectionId : conn.clientConnectionId); if (!peerConnId || peerConnId->size() == 0) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::PROTOCOL_VIOLATION, "Endpoint is already using 0-len connection ids.")); } @@ -226,14 +226,14 @@ folly::Expected updateSimpleFrameOnPacketReceived( if (maxStreamsFrame.isForBidirectionalStream()) { auto result = conn.streamManager->setMaxLocalBidirectionalStreams( maxStreamsFrame.maxStreams); - if (result.hasError()) { - return folly::makeUnexpected(result.error()); + if (!result.has_value()) { + return quic::make_unexpected(result.error()); } } else { auto result = conn.streamManager->setMaxLocalUnidirectionalStreams( maxStreamsFrame.maxStreams); - if (result.hasError()) { - return folly::makeUnexpected(result.error()); + if (!result.has_value()) { + return quic::make_unexpected(result.error()); } } return true; @@ -243,7 +243,7 @@ folly::Expected updateSimpleFrameOnPacketReceived( ? conn.serverConnectionId : conn.clientConnectionId; if (!curNodeConnId || curNodeConnId->size() == 0) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::PROTOCOL_VIOLATION, "Peer issued RETIRE_CONNECTION_ID_FRAME to endpoint using 0-len connection ids.")); } @@ -263,7 +263,7 @@ folly::Expected updateSimpleFrameOnPacketReceived( } if (dstConnId == it->connId) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::PROTOCOL_VIOLATION, "Peer issued RETIRE_CONNECTION_ID_FRAME refers to dst conn id field of containing packet.")); } @@ -278,7 +278,7 @@ folly::Expected updateSimpleFrameOnPacketReceived( } case QuicSimpleFrame::Type::HandshakeDoneFrame: { if (conn.nodeType == QuicNodeType::Server) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::PROTOCOL_VIOLATION, "Received HANDSHAKE_DONE from client.")); } @@ -298,7 +298,7 @@ folly::Expected updateSimpleFrameOnPacketReceived( if (!conn.transportSettings.minAckDelay.has_value()) { // We do not accept ACK_FREQUENCY frames. This is a protocol // violation. - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::PROTOCOL_VIOLATION, "Received ACK_FREQUENCY frame without announcing min_ack_delay")); } @@ -322,7 +322,7 @@ folly::Expected updateSimpleFrameOnPacketReceived( return true; } } - return folly::makeUnexpected( + return quic::make_unexpected( QuicError(TransportErrorCode::INTERNAL_ERROR, "Unknown frame type")); } diff --git a/quic/state/SimpleFrameFunctions.h b/quic/state/SimpleFrameFunctions.h index 0571a173f..347c6b7a1 100644 --- a/quic/state/SimpleFrameFunctions.h +++ b/quic/state/SimpleFrameFunctions.h @@ -8,6 +8,7 @@ #pragma once #include +#include #include namespace quic { @@ -44,8 +45,7 @@ void updateSimpleFrameOnPacketLoss( * Update the connection state on receipt of the given simple frame. * Returns true if the frame is NOT a probing frame */ -[[nodiscard]] folly::Expected -updateSimpleFrameOnPacketReceived( +[[nodiscard]] quic::Expected updateSimpleFrameOnPacketReceived( QuicConnectionStateBase& conn, const QuicSimpleFrame& frameIn, const ConnectionId& dstConnId, diff --git a/quic/state/StateData.h b/quic/state/StateData.h index c7d4b8913..1b931c265 100644 --- a/quic/state/StateData.h +++ b/quic/state/StateData.h @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -768,7 +769,7 @@ struct AckStateVersion { bool operator!=(const AckStateVersion& other) const; }; -using LossVisitor = std::function( +using LossVisitor = std::function( QuicConnectionStateBase& conn, RegularQuicWritePacket& packet, bool processed)>; diff --git a/quic/state/stream/StreamReceiveHandlers.cpp b/quic/state/stream/StreamReceiveHandlers.cpp index a44ec63b4..2b4b6830f 100644 --- a/quic/state/stream/StreamReceiveHandlers.cpp +++ b/quic/state/stream/StreamReceiveHandlers.cpp @@ -34,7 +34,7 @@ namespace quic { * Receive::Closed <---------+ * */ -folly::Expected receiveReadStreamFrameSMHandler( +quic::Expected receiveReadStreamFrameSMHandler( QuicStreamState& stream, ReadStreamFrame&& frame) { switch (stream.recvState) { @@ -43,7 +43,7 @@ folly::Expected receiveReadStreamFrameSMHandler( << " stream=" << stream.id << " " << stream.conn; auto appendResult = appendDataToReadBuffer( stream, StreamBuffer(std::move(frame.data), frame.offset, frame.fin)); - if (appendResult.hasError()) { + if (!appendResult.has_value()) { return appendResult; } bool allDataTillReliableSizeReceived = stream.reliableSizeFromPeer && @@ -69,17 +69,17 @@ folly::Expected receiveReadStreamFrameSMHandler( break; } case StreamRecvState::Invalid: { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_STATE_ERROR, fmt::format( "Invalid transition from state={}", streamStateToString(stream.recvState)))); } } - return folly::unit; + return {}; } -folly::Expected receiveRstStreamSMHandler( +quic::Expected receiveRstStreamSMHandler( QuicStreamState& stream, const RstStreamFrame& rst) { switch (stream.recvState) { @@ -87,7 +87,7 @@ folly::Expected receiveRstStreamSMHandler( // This will check whether the reset is still consistent with the // stream. auto resetResult = onResetQuicStream(stream, rst); - if (resetResult.hasError()) { + if (!resetResult.has_value()) { return resetResult; } break; @@ -107,20 +107,20 @@ folly::Expected receiveRstStreamSMHandler( } } auto resetResult = onResetQuicStream(stream, rst); - if (resetResult.hasError()) { + if (!resetResult.has_value()) { return resetResult; } break; } case StreamRecvState::Invalid: { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_STATE_ERROR, fmt::format( "Invalid transition from state={}", streamStateToString(stream.recvState)))); } } - return folly::unit; + return {}; } } // namespace quic diff --git a/quic/state/stream/StreamReceiveHandlers.h b/quic/state/stream/StreamReceiveHandlers.h index 32d379f06..9ae2c17de 100644 --- a/quic/state/stream/StreamReceiveHandlers.h +++ b/quic/state/stream/StreamReceiveHandlers.h @@ -11,12 +11,11 @@ #include namespace quic { -[[nodiscard]] folly::Expected -receiveReadStreamFrameSMHandler( +[[nodiscard]] quic::Expected receiveReadStreamFrameSMHandler( QuicStreamState& stream, ReadStreamFrame&& frame); -[[nodiscard]] folly::Expected receiveRstStreamSMHandler( +[[nodiscard]] quic::Expected receiveRstStreamSMHandler( QuicStreamState& stream, const RstStreamFrame& rst); diff --git a/quic/state/stream/StreamSendHandlers.cpp b/quic/state/stream/StreamSendHandlers.cpp index 048cdfef2..c744c12da 100644 --- a/quic/state/stream/StreamSendHandlers.cpp +++ b/quic/state/stream/StreamSendHandlers.cpp @@ -41,7 +41,7 @@ namespace quic { * ACKed. * */ -folly::Expected sendStopSendingSMHandler( +quic::Expected sendStopSendingSMHandler( QuicStreamState& stream, const StopSendingFrame& frame) { switch (stream.sendState) { @@ -65,17 +65,17 @@ folly::Expected sendStopSendingSMHandler( break; } case StreamSendState::Invalid: { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_STATE_ERROR, fmt::format( "Invalid transition from state={}", streamStateToString(stream.sendState)))); } } - return folly::unit; + return {}; } -folly::Expected sendRstSMHandler( +quic::Expected sendRstSMHandler( QuicStreamState& stream, ApplicationErrorCode errorCode, const Optional& reliableSize) { @@ -102,7 +102,7 @@ folly::Expected sendRstSMHandler( } stream.appErrorCodeToPeer = errorCode; auto resetResult = resetQuicStream(stream, errorCode, reliableSize); - if (resetResult.hasError()) { + if (!resetResult.has_value()) { return resetResult; } appendPendingStreamReset(stream.conn, stream, errorCode, reliableSize); @@ -118,17 +118,17 @@ folly::Expected sendRstSMHandler( break; } case StreamSendState::Invalid: { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_STATE_ERROR, fmt::format( "Invalid transition from state={}", streamStateToString(stream.sendState)))); } } - return folly::unit; + return {}; } -folly::Expected sendAckSMHandler( +quic::Expected sendAckSMHandler( QuicStreamState& stream, const WriteStreamFrame& ackedFrame) { switch (stream.sendState) { @@ -194,17 +194,17 @@ folly::Expected sendAckSMHandler( break; } case StreamSendState::Invalid: { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_STATE_ERROR, fmt::format( "Invalid transition from state={}", streamStateToString(stream.sendState)))); } } - return folly::unit; + return {}; } -folly::Expected sendRstAckSMHandler( +quic::Expected sendRstAckSMHandler( QuicStreamState& stream, Optional reliableSize) { switch (stream.sendState) { @@ -236,14 +236,14 @@ folly::Expected sendRstAckSMHandler( } case StreamSendState::Open: case StreamSendState::Invalid: { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_STATE_ERROR, fmt::format( "Invalid transition from state={}", streamStateToString(stream.sendState)))); } } - return folly::unit; + return {}; } } // namespace quic diff --git a/quic/state/stream/StreamSendHandlers.h b/quic/state/stream/StreamSendHandlers.h index 41fb1ab65..b191cdbf6 100644 --- a/quic/state/stream/StreamSendHandlers.h +++ b/quic/state/stream/StreamSendHandlers.h @@ -11,20 +11,20 @@ #include namespace quic { -[[nodiscard]] folly::Expected sendStopSendingSMHandler( +[[nodiscard]] quic::Expected sendStopSendingSMHandler( QuicStreamState& stream, const StopSendingFrame& frame); -[[nodiscard]] folly::Expected sendRstSMHandler( +[[nodiscard]] quic::Expected sendRstSMHandler( QuicStreamState& stream, ApplicationErrorCode errorCode, const Optional& reliableSize = std::nullopt); -[[nodiscard]] folly::Expected sendAckSMHandler( +[[nodiscard]] quic::Expected sendAckSMHandler( QuicStreamState& stream, const WriteStreamFrame& ackedFrame); -[[nodiscard]] folly::Expected sendRstAckSMHandler( +[[nodiscard]] quic::Expected sendRstAckSMHandler( QuicStreamState& stream, Optional reliableSize); diff --git a/quic/state/stream/StreamStateFunctions.cpp b/quic/state/stream/StreamStateFunctions.cpp index 2a7ed0d17..036ba6dfa 100644 --- a/quic/state/stream/StreamStateFunctions.cpp +++ b/quic/state/stream/StreamStateFunctions.cpp @@ -10,13 +10,13 @@ #include namespace quic { -folly::Expected resetQuicStream( +quic::Expected resetQuicStream( QuicStreamState& stream, ApplicationErrorCode error, Optional reliableSize) { auto updateResult = updateFlowControlOnResetStream(stream, reliableSize); if (!updateResult) { - return folly::makeUnexpected(updateResult.error()); + return quic::make_unexpected(updateResult.error()); } if (reliableSize && *reliableSize > 0) { @@ -46,16 +46,17 @@ folly::Expected resetQuicStream( } stream.conn.streamManager->updateReadableStreams(stream); stream.conn.streamManager->updateWritableStreams(stream); + stream.conn.streamManager->removeLoss(stream.id); - return folly::unit; + return {}; } -folly::Expected onResetQuicStream( +quic::Expected onResetQuicStream( QuicStreamState& stream, const RstStreamFrame& frame) { if (stream.finalReadOffset && stream.finalReadOffset.value() != frame.finalSize) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_STATE_ERROR, "Read offset mismatch, " + fmt::format( @@ -65,7 +66,7 @@ folly::Expected onResetQuicStream( stream.streamReadError.value().asApplicationErrorCode() && *stream.streamReadError.value().asApplicationErrorCode() != frame.errorCode) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::STREAM_STATE_ERROR, "Reset error code mismatch, " + toString(stream.streamReadError.value()) + @@ -77,14 +78,14 @@ folly::Expected onResetQuicStream( // than before, but not to send one with a higher offset than before. Due // to reordering, we may receive a RESET_STREAM_AT frame with a higher // offset than before. In this case, we should ignore the frame. - return folly::unit; + return {}; } stream.reliableSizeFromPeer = frame.reliableSize.has_value() ? *frame.reliableSize : 0; // Mark eofoffset: if (stream.maxOffsetObserved > frame.finalSize) { - return folly::makeUnexpected(QuicError( + return quic::make_unexpected(QuicError( TransportErrorCode::FINAL_SIZE_ERROR, "Reset in middle of stream")); } // Drop non-reliable data: @@ -104,18 +105,18 @@ folly::Expected onResetQuicStream( auto flowControlResult = updateFlowControlOnStreamData( stream, stream.maxOffsetObserved, frame.finalSize); if (!flowControlResult) { - return folly::makeUnexpected(flowControlResult.error()); + return quic::make_unexpected(flowControlResult.error()); } stream.maxOffsetObserved = frame.finalSize; auto result = updateFlowControlOnReceiveReset(stream, Clock::now()); if (!result) { - return folly::makeUnexpected(result.error()); + return quic::make_unexpected(result.error()); } } stream.conn.streamManager->updateReadableStreams(stream); stream.conn.streamManager->updateWritableStreams(stream); QUIC_STATS(stream.conn.statsCallback, onQuicStreamReset, frame.errorCode); - return folly::unit; + return {}; } bool isAllDataReceived(const QuicStreamState& stream) { diff --git a/quic/state/stream/StreamStateFunctions.h b/quic/state/stream/StreamStateFunctions.h index 6f43017b7..c5d11258d 100644 --- a/quic/state/stream/StreamStateFunctions.h +++ b/quic/state/stream/StreamStateFunctions.h @@ -12,13 +12,13 @@ namespace quic { // Common operations to conduct on QuicStreamState when send reset on it -[[nodiscard]] folly::Expected resetQuicStream( +[[nodiscard]] quic::Expected resetQuicStream( QuicStreamState& stream, ApplicationErrorCode error, Optional reliableSize = std::nullopt); // Common operations to conduct on QuicStreamState when receive reset on it -[[nodiscard]] folly::Expected onResetQuicStream( +[[nodiscard]] quic::Expected onResetQuicStream( QuicStreamState& stream, const RstStreamFrame& frame); diff --git a/quic/state/test/AckHandlersTest.cpp b/quic/state/test/AckHandlersTest.cpp index f2812e12f..f8df07d6f 100644 --- a/quic/state/test/AckHandlersTest.cpp +++ b/quic/state/test/AckHandlersTest.cpp @@ -42,10 +42,11 @@ uint64_t ul(T val) { } auto testLossHandler(std::vector& lostPackets) -> decltype(auto) { - return [&lostPackets](QuicConnectionStateBase&, auto& packet, bool) { + return [&lostPackets](QuicConnectionStateBase&, auto& packet, bool) + -> quic::Expected { auto packetNum = packet.header.getPacketSequenceNum(); lostPackets.push_back(packetNum); - return folly::unit; + return {}; }; } @@ -224,20 +225,21 @@ TEST_P(AckHandlersTest, TestAckMultipleSequentialBlocks) { })); EXPECT_CALL(*rawPacketProcessor, onPacketAck(_)).Times(1); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [&](const auto&, const auto& packetFrame) - -> folly::Expected { - auto& stream = *packetFrame.asWriteStreamFrame(); - streams.emplace_back(stream); - return folly::unit; - }, - testLossHandler(lostPackets), - Clock::now()) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [&](const auto&, + const auto& packetFrame) -> quic::Expected { + auto& stream = *packetFrame.asWriteStreamFrame(); + streams.emplace_back(stream); + return {}; + }, + testLossHandler(lostPackets), + Clock::now()) + .hasError()); EXPECT_EQ(lostPacketsCounter, lostPackets.empty() ? 0 : 1); StreamId nextExpectedStream = 21; // packets (streams) 21 - 101 are ACKed @@ -291,9 +293,13 @@ TEST_P(AckHandlersTest, TestAckWithECN) { conn, GetParam().pnSpace, ackFrame, - [](auto&) { return folly::unit; }, - [](const auto&, const auto&) { return folly::unit; }, - [](auto&, auto&, bool) { return folly::unit; }, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) -> quic::Expected { + return {}; + }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, ackReceiveTime); ASSERT_FALSE(ackEvent.hasError()); auto ackEventValue = ackEvent.value(); @@ -320,7 +326,10 @@ TEST_P(AckHandlersTest, TestSpuriousLossFullRemoval) { conn.streamManager->setMaxLocalBidirectionalStreams(100).hasError()); conn.transportSettings.removeFromLossBufferOnSpurious = true; - auto noopLossVisitor = [](auto&, auto&, bool) { return folly::unit; }; + auto noopLossVisitor = + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }; StreamId streamId = 1; auto streamState = conn.streamManager->createStream(streamId).value(); @@ -383,9 +392,13 @@ TEST_P(AckHandlersTest, TestSpuriousLossFullRemoval) { conn, GetParam().pnSpace, ackFrame, - [](auto&) { return folly::unit; }, - [](const auto&, const auto&) { return folly::unit; }, - [](auto&, auto&, bool) { return folly::unit; }, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) -> quic::Expected { + return {}; + }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, startTime + 30ms); ASSERT_FALSE(ackResult.hasError()); @@ -404,7 +417,10 @@ TEST_P(AckHandlersTest, TestSpuriousLossSplitMiddleRemoval) { conn.streamManager->setMaxLocalBidirectionalStreams(100).hasError()); conn.transportSettings.removeFromLossBufferOnSpurious = true; - auto noopLossVisitor = [](auto&, auto&, bool) { return folly::unit; }; + auto noopLossVisitor = + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }; StreamId streamId = 1; auto streamState = conn.streamManager->createStream(streamId).value(); @@ -467,9 +483,13 @@ TEST_P(AckHandlersTest, TestSpuriousLossSplitMiddleRemoval) { conn, GetParam().pnSpace, ackFrame, - [](auto&) { return folly::unit; }, - [](const auto&, const auto&) { return folly::unit; }, - [](auto&, auto&, bool) { return folly::unit; }, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) -> quic::Expected { + return {}; + }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, startTime + 30ms); ASSERT_FALSE(ackResult.hasError()); @@ -494,7 +514,10 @@ TEST_P(AckHandlersTest, TestSpuriousLossTrimFrontRemoval) { conn.streamManager->setMaxLocalBidirectionalStreams(100).hasError()); conn.transportSettings.removeFromLossBufferOnSpurious = true; - auto noopLossVisitor = [](auto&, auto&, bool) { return folly::unit; }; + auto noopLossVisitor = + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }; StreamId streamId = 1; auto streamState = conn.streamManager->createStream(streamId).value(); @@ -553,15 +576,19 @@ TEST_P(AckHandlersTest, TestSpuriousLossTrimFrontRemoval) { ackFrame.largestAcked = 2; ackFrame.ackBlocks.emplace_back(0, 2); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [](const auto&, const auto&) { return folly::unit; }, - [](auto&, auto&, bool) { return folly::unit; }, - startTime + 30ms) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) + -> quic::Expected { return {}; }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + startTime + 30ms) + .hasError()); ASSERT_EQ(streamState->lossBuffer.size(), 1); EXPECT_EQ(streamState->lossBuffer[0].offset, 50); @@ -581,7 +608,10 @@ TEST_P(AckHandlersTest, TestSpuriousLossSplitFrontRemoval) { conn.streamManager->setMaxLocalBidirectionalStreams(100).hasError()); conn.transportSettings.removeFromLossBufferOnSpurious = true; - auto noopLossVisitor = [](auto&, auto&, bool) { return folly::unit; }; + auto noopLossVisitor = + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }; StreamId streamId = 1; auto streamState = conn.streamManager->createStream(streamId).value(); @@ -640,15 +670,19 @@ TEST_P(AckHandlersTest, TestSpuriousLossSplitFrontRemoval) { ackFrame.largestAcked = 2; ackFrame.ackBlocks.emplace_back(0, 2); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [](const auto&, const auto&) { return folly::unit; }, - [](auto&, auto&, bool) { return folly::unit; }, - startTime + 30ms) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) + -> quic::Expected { return {}; }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + startTime + 30ms) + .hasError()); ASSERT_EQ(streamState->lossBuffer.size(), 1); EXPECT_EQ(streamState->lossBuffer[0].offset, 0); @@ -718,15 +752,19 @@ TEST_P(AckHandlersTest, TestPacketDestructionAcks) { outstandingPacket.packet.header.getPacketSequenceNum()); })); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [](const auto&, const auto&) { return folly::unit; }, - [](auto&, auto&, bool) { return folly::unit; }, - Clock::now()) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) + -> quic::Expected { return {}; }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + Clock::now()) + .hasError()); EXPECT_THAT(packetNumsDestroyed, UnorderedElementsAre(1, 2, 3)); EXPECT_EQ(conn.outstandings.packets.size(), 0); @@ -790,13 +828,16 @@ TEST_P(AckHandlersTest, TestPacketDestructionSpuriousLoss) { auto& ackState = getAckState(conn, GetParam().pnSpace); ackState.largestNonDsrSequenceNumberAckedByPeer = 3; ackState.largestAckedByPeer = 3; - ASSERT_FALSE(detectLossPackets( - conn, - ackState, - [](auto&, auto&, bool) { return folly::unit; }, - startTime + 250ms, - GetParam().pnSpace) - .hasError()); + ASSERT_FALSE( + detectLossPackets( + conn, + ackState, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + startTime + 250ms, + GetParam().pnSpace) + .hasError()); // now we get late acks for #2 and #3, triggering #1 to be marked lost. ReadAckFrame ackFrame; @@ -812,15 +853,19 @@ TEST_P(AckHandlersTest, TestPacketDestructionSpuriousLoss) { outstandingPacket.packet.header.getPacketSequenceNum()); })); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [](const auto&, const auto&) { return folly::unit; }, - [](auto&, auto&, bool) { return folly::unit; }, - startTime + 260ms) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) + -> quic::Expected { return {}; }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + startTime + 260ms) + .hasError()); EXPECT_THAT(packetsDestroyed, UnorderedElementsAre(2, 3)); @@ -865,15 +910,19 @@ TEST_P(AckHandlersTest, TestPacketDestructionSpuriousLoss) { packetNumToDeclaredLost[packetNum] = declatedLost; })); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame1, - [](auto&) { return folly::unit; }, - [](const auto&, const auto&) { return folly::unit; }, - [](auto&, auto&, bool) { return folly::unit; }, - startTime + 600ms) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame1, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) + -> quic::Expected { return {}; }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + startTime + 600ms) + .hasError()); EXPECT_THAT( packetNumToDeclaredLost, @@ -940,15 +989,19 @@ TEST_P(AckHandlersTest, TestPacketDestructionBigDeque) { &OutstandingPacket::getPacketSequenceNum, AllOf(Lt(1000), Gt(1))))) .Times(998); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [](const auto&, const auto&) { return folly::unit; }, - [](auto&, auto&, bool) { return folly::unit; }, - Clock::now()) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) + -> quic::Expected { return {}; }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + Clock::now()) + .hasError()); // Shrink the deque to the remaining packets. conn.outstandings.packets.shrink_to_fit(); @@ -964,15 +1017,19 @@ TEST_P(AckHandlersTest, TestPacketDestructionBigDeque) { EXPECT_EQ(true, outstandingPacket.declaredLost); })); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame1, - [](auto&) { return folly::unit; }, - [](const auto&, const auto&) { return folly::unit; }, - [](auto&, auto&, bool) { return folly::unit; }, - Clock::now()) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame1, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) + -> quic::Expected { return {}; }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + Clock::now()) + .hasError()); ReadAckFrame ackFrame2; ackFrame2.largestAcked = 1000; @@ -985,15 +1042,19 @@ TEST_P(AckHandlersTest, TestPacketDestructionBigDeque) { EXPECT_EQ(1000, outstandingPacket.packet.header.getPacketSequenceNum()); })); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame2, - [](auto&) { return folly::unit; }, - [](const auto&, const auto&) { return folly::unit; }, - [](auto&, auto&, bool) { return folly::unit; }, - Clock::now()) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame2, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) + -> quic::Expected { return {}; }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + Clock::now()) + .hasError()); EXPECT_EQ(conn.outstandings.packets.size(), 0); } @@ -1061,19 +1122,21 @@ TEST_P(AckHandlersTest, TestAckMultipleSequentialBlocksLoss) { })) .WillRepeatedly(Invoke([](auto, auto) {})); EXPECT_CALL(*rawPacketProcessor, onPacketAck(_)).Times(3); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [&](const auto&, const auto& packetFrame) { - auto& stream = *packetFrame.asWriteStreamFrame(); - streams.emplace_back(stream); - return folly::unit; - }, - testLossHandler(lostPackets), - Clock::now()) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [&](const auto&, const auto& packetFrame) + -> quic::Expected { + auto& stream = *packetFrame.asWriteStreamFrame(); + streams.emplace_back(stream); + return {}; + }, + testLossHandler(lostPackets), + Clock::now()) + .hasError()); EXPECT_EQ(lostPacketsCounter, lostPackets.empty() ? 0 : 1); StreamId nextExpectedStream = 21; // packets (streams) 21 - 101 are ACKed @@ -1123,15 +1186,20 @@ TEST_P(AckHandlersTest, TestAckMultipleSequentialBlocksLoss) { EXPECT_EQ(itr->packet.header.getPacketSequenceNum(), 16); EXPECT_EQ(conn.lossState.totalPacketsSpuriouslyMarkedLost, 0); ackFrame.ackBlocks.emplace_back(15, 16); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [](auto&, auto) { return folly::unit; }, - [](auto&, auto&, auto) { return folly::unit; }, - Clock::now()) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [](auto&, auto) -> quic::Expected { + return {}; + }, + [](auto&, auto&, auto) -> quic::Expected { + return {}; + }, + Clock::now()) + .hasError()); itr = std::find_if( conn.outstandings.packets.begin(), conn.outstandings.packets.end(), @@ -1142,15 +1210,20 @@ TEST_P(AckHandlersTest, TestAckMultipleSequentialBlocksLoss) { EXPECT_TRUE(itr == conn.outstandings.packets.end()); // Duplicate ACK much later, should clear out declared lost. - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [](auto&, auto) { return folly::unit; }, - [](auto&, auto&, auto) { return folly::unit; }, - Clock::now() + 2 * calculatePTO(conn)) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [](auto&, auto) -> quic::Expected { + return {}; + }, + [](auto&, auto&, auto) -> quic::Expected { + return {}; + }, + Clock::now() + 2 * calculatePTO(conn)) + .hasError()); numDeclaredLost = std::count_if( conn.outstandings.packets.begin(), @@ -1220,19 +1293,21 @@ TEST_P(AckHandlersTest, TestAckBlocksWithGaps) { } })); EXPECT_CALL(*rawPacketProcessor, onPacketAck(_)).Times(1); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [&](const auto&, const auto& packetFrame) { - auto& stream = *packetFrame.asWriteStreamFrame(); - streams.emplace_back(stream); - return folly::unit; - }, - testLossHandler(lostPackets), - Clock::now()) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [&](const auto&, const auto& packetFrame) + -> quic::Expected { + auto& stream = *packetFrame.asWriteStreamFrame(); + streams.emplace_back(stream); + return {}; + }, + testLossHandler(lostPackets), + Clock::now()) + .hasError()); EXPECT_EQ(lostPacketsCounter, lostPackets.empty() ? 0 : 1); StreamId start = 45; @@ -1357,20 +1432,21 @@ TEST_P(AckHandlersTest, TestNonSequentialPacketNumbers) { EXPECT_EQ(expectedAckedPackets, ackEvent->ackedPackets.size()); })); EXPECT_CALL(*rawPacketProcessor, onPacketAck(_)).Times(1); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [&](const auto&, const auto& packetFrame) - -> folly::Expected { - auto& stream = *packetFrame.asWriteStreamFrame(); - streams.emplace_back(stream); - return folly::unit; - }, - testLossHandler(lostPackets), - Clock::now()) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [&](const auto&, + const auto& packetFrame) -> quic::Expected { + auto& stream = *packetFrame.asWriteStreamFrame(); + streams.emplace_back(stream); + return {}; + }, + testLossHandler(lostPackets), + Clock::now()) + .hasError()); EXPECT_EQ(26, streams.rbegin()->streamId); @@ -1461,9 +1537,11 @@ TEST_P(AckHandlersTest, AckVisitorForAckTest) { conn, GetParam().pnSpace, firstReceivedAck, - [](const auto&) { return folly::unit; }, + [](const auto&) -> quic::Expected { + return {}; + }, [&](const auto& outstandingPacket, const auto& packetFrame) - -> folly::Expected { + -> quic::Expected { auto ackedPacketNum = outstandingPacket.packet.header.getPacketSequenceNum(); EXPECT_EQ(ackedPacketNum, firstReceivedAck.largestAcked); @@ -1472,10 +1550,10 @@ TEST_P(AckHandlersTest, AckVisitorForAckTest) { commonAckVisitorForAckFrame( conn.ackStates.appDataAckState, *frame); } - return folly::unit; + return {}; }, [](auto& /* conn */, auto& /* packet */, bool /* processed */ - ) { return folly::unit; }, + ) -> quic::Expected { return {}; }, Clock::now()) .hasError()); EXPECT_EQ(2, conn.ackStates.appDataAckState.acks.size()); @@ -1493,18 +1571,20 @@ TEST_P(AckHandlersTest, AckVisitorForAckTest) { conn, GetParam().pnSpace, secondReceivedAck, - [](const auto&) { return folly::unit; }, + [](const auto&) -> quic::Expected { + return {}; + }, [&](const auto&, const auto& packetFrame) - -> folly::Expected { + -> quic::Expected { const WriteAckFrame* frame = packetFrame.asWriteAckFrame(); if (frame) { commonAckVisitorForAckFrame( conn.ackStates.appDataAckState, *frame); } - return folly::unit; + return {}; }, [](auto& /* conn */, auto& /* packet */, bool /* processed */ - ) { return folly::unit; }, + ) -> quic::Expected { return {}; }, Clock::now()) .hasError()); EXPECT_TRUE(conn.ackStates.appDataAckState.acks.empty()); @@ -1537,18 +1617,20 @@ TEST_P(AckHandlersTest, NoNewAckedPacket) { ReadAckFrame ackFrame; ackFrame.largestAcked = 5; EXPECT_CALL(*rawController, onPacketAckOrLoss(_, _)).Times(0); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [](const auto&, - const auto&) -> folly::Expected { - return folly::unit; - }, - [](auto&, auto&, bool) { return folly::unit; }, - Clock::now()) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) -> quic::Expected { + return {}; + }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + Clock::now()) + .hasError()); EXPECT_TRUE(conn.pendingEvents.setLossDetectionAlarm); EXPECT_EQ(conn.lossState.ptoCount, 1); EXPECT_TRUE(!conn.ackStates.appDataAckState.largestAckedByPeer.has_value()); @@ -1563,18 +1645,20 @@ TEST_P(AckHandlersTest, LossByAckedRecovered) { ReadAckFrame ackFrame; ackFrame.largestAcked = 10; ackFrame.ackBlocks.emplace_back(5, 10); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [](const auto&, - const auto&) -> folly::Expected { - return folly::unit; - }, - [](auto&, auto&, bool) { return folly::unit; }, - Clock::now()) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) -> quic::Expected { + return {}; + }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + Clock::now()) + .hasError()); } TEST_P(AckHandlersTest, AckPacketNumDoesNotExist) { @@ -1623,18 +1707,20 @@ TEST_P(AckHandlersTest, AckPacketNumDoesNotExist) { ackFrame.largestAcked = 1000; ackFrame.ackBlocks.emplace_back(1000, 1000); ackFrame.ackBlocks.emplace_back(10, 10); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [](const auto&, - const auto&) -> folly::Expected { - return folly::unit; - }, - [](auto&, auto&, bool) { return folly::unit; }, - Clock::now()) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) -> quic::Expected { + return {}; + }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + Clock::now()) + .hasError()); EXPECT_EQ(1, conn.outstandings.packets.size()); } @@ -1670,18 +1756,18 @@ TEST_P(AckHandlersTest, TestHandshakeCounterUpdate) { ackFrame.ackBlocks.emplace_back(3, 7); std::vector lostPackets; - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [&](const auto&, - const auto&) -> folly::Expected { - return folly::unit; - }, - testLossHandler(lostPackets), - Clock::now()) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [&](const auto&, const auto&) -> quic::Expected { + return {}; + }, + testLossHandler(lostPackets), + Clock::now()) + .hasError()); // When [3, 7] are acked, [0, 2] may also be marked loss if they are in the // same packet number space, due to reordering threshold auto numDeclaredLost = std::count_if( @@ -1885,20 +1971,22 @@ TEST_P(AckHandlersTest, NoSkipAckVisitor) { uint16_t ackVisitorCounter = 0; // A counting ack visitor auto countingAckVisitor = [&](const auto& /* outstandingPacket */, - const auto& /* packetFrame */) { + const auto& /* packetFrame */) + -> quic::Expected { ackVisitorCounter++; - return folly::unit; + return {}; }; - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - countingAckVisitor, - [](auto& /* conn */, auto& /* packet */, bool /* processed */ - ) { return folly::unit; }, - Clock::now()) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + countingAckVisitor, + [](auto& /* conn */, auto& /* packet */, bool /* processed */ + ) -> quic::Expected { return {}; }, + Clock::now()) + .hasError()); EXPECT_EQ(1, ackVisitorCounter); } @@ -1953,20 +2041,22 @@ TEST_P(AckHandlersTest, SkipAckVisitor) { uint16_t ackVisitorCounter = 0; // A counting ack visitor auto countingAckVisitor = [&](const auto& /* outstandingPacket */, - const auto& /* packetFrame */) { + const auto& /* packetFrame */) + -> quic::Expected { ackVisitorCounter++; - return folly::unit; + return {}; }; - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - countingAckVisitor, - [](auto& /* conn */, auto& /* packet */, bool /* processed */ - ) { return folly::unit; }, - Clock::now()) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + countingAckVisitor, + [](auto& /* conn */, auto& /* packet */, bool /* processed */ + ) -> quic::Expected { return {}; }, + Clock::now()) + .hasError()); EXPECT_EQ(0, ackVisitorCounter); } @@ -2032,15 +2122,19 @@ TEST_P(AckHandlersTest, MultiplePacketProcessors) { checkAck(*ack); })); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [&](const auto&, const auto&) { return folly::unit; }, - [&](auto&, auto&, bool) { return folly::unit; }, - Clock::now()) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [&](const auto&, const auto&) + -> quic::Expected { return {}; }, + [&](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + Clock::now()) + .hasError()); } TEST_P(AckHandlersTest, NoDoubleProcess) { @@ -2092,40 +2186,45 @@ TEST_P(AckHandlersTest, NoDoubleProcess) { // A counting ack visitor uint16_t ackVisitorCounter = 0; auto countingAckVisitor = [&](const auto& /* outstandingPacket */, - const auto& /* packetFrame */) { + const auto& /* packetFrame */) + -> quic::Expected { ackVisitorCounter++; - return folly::unit; + return {}; }; // First ack. This will ack first packet, and trigger a ack visiting. ReadAckFrame ackFrame1; ackFrame1.largestAcked = 0; ackFrame1.ackBlocks.emplace_back(0, 0); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame1, - [](auto&) { return folly::unit; }, - countingAckVisitor, - [](auto& /* conn */, auto& /* packet */, bool /* processed */ - ) { return folly::unit; }, - Clock::now()) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame1, + [](auto&) -> quic::Expected { return {}; }, + countingAckVisitor, + [](auto& /* conn */, auto& /* packet */, bool /* processed */ + ) -> quic::Expected { return {}; }, + Clock::now()) + .hasError()); EXPECT_EQ(1, ackVisitorCounter); // Second ack that acks the second packet. This won't trigger a visit. ReadAckFrame ackFrame2; ackFrame2.largestAcked = 1; ackFrame2.ackBlocks.emplace_back(1, 1); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame2, - [](auto&) { return folly::unit; }, - countingAckVisitor, - [&](auto&, auto&, bool) { return folly::unit; }, - Clock::now()) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame2, + [](auto&) -> quic::Expected { return {}; }, + countingAckVisitor, + [&](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + Clock::now()) + .hasError()); EXPECT_EQ(1, ackVisitorCounter); } @@ -2181,19 +2280,23 @@ TEST_P(AckHandlersTest, ClonedPacketsCounter) { uint16_t ackVisitorCounter = 0; auto countingAckVisitor = [&](const auto& /* outstandingPacket */, - const auto& /* packetFrame */) { + const auto& /* packetFrame */) + -> quic::Expected { ackVisitorCounter++; - return folly::unit; + return {}; }; - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - countingAckVisitor, - [&](auto&, auto&, bool) { return folly::unit; }, - Clock::now()) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + countingAckVisitor, + [&](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + Clock::now()) + .hasError()); EXPECT_EQ(2, ackVisitorCounter); EXPECT_EQ(0, conn.outstandings.numClonedPackets()); } @@ -2227,15 +2330,19 @@ TEST_P(AckHandlersTest, UpdateMaxAckDelay) { ackFrame.ackBlocks.emplace_back(0, 0); auto receiveTime = sentTime + 10us; - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [&](const auto&, const auto&) { return folly::unit; }, - [&](auto&, auto&, bool) { return folly::unit; }, - receiveTime) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [&](const auto&, const auto&) + -> quic::Expected { return {}; }, + [&](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + receiveTime) + .hasError()); EXPECT_EQ(10us, conn.lossState.mrtt); } @@ -2306,20 +2413,22 @@ TEST_P(AckHandlersTest, AckNotOutstandingButLoss) { conn.lossState.largestSent = 2; // A counting ack visitor auto countingAckVisitor = [&](const auto& /* outstandingPacket */, - const auto& /* packetFrame */) { + const auto& /* packetFrame */) + -> quic::Expected { ackVisitorCounter++; - return folly::unit; + return {}; }; - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - countingAckVisitor, - [](auto& /* conn */, auto& /* packet */, bool /* processed */ - ) { return folly::unit; }, - Clock::now()) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + countingAckVisitor, + [](auto& /* conn */, auto& /* packet */, bool /* processed */ + ) -> quic::Expected { return {}; }, + Clock::now()) + .hasError()); EXPECT_EQ(0, ackVisitorCounter); } @@ -2356,15 +2465,19 @@ TEST_P(AckHandlersTest, UpdatePendingAckStates) { ackFrame.ackBlocks.emplace_back(0, 0); auto receiveTime = Clock::now() - 200ms; - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [&](auto&, auto) { return folly::unit; }, - [&](auto&, auto&, auto) { return folly::unit; }, - receiveTime) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [&](const auto&, const auto&) + -> quic::Expected { return {}; }, + [&](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + receiveTime) + .hasError()); EXPECT_EQ(2468 + 111, conn.lossState.totalBytesSentAtLastAck); EXPECT_EQ(1357 + 111, conn.lossState.totalBytesAckedAtLastAck); EXPECT_EQ(sentTime, *conn.lossState.lastAckedPacketSentTime); @@ -2490,9 +2603,13 @@ TEST_P(AckHandlersTest, AckEventCreation) { conn, GetParam().pnSpace, ackFrame, - [](auto&) { return folly::unit; }, - [](const auto&, const auto&) { return folly::unit; }, - [](auto&, auto&, bool) { return folly::unit; }, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) -> quic::Expected { + return {}; + }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, ackTime); ASSERT_FALSE(ackEventResult.hasError()); auto ackEvent = ackEventResult.value(); @@ -2617,9 +2734,13 @@ TEST_P(AckHandlersTest, AckEventCreationSingleWrite) { conn, GetParam().pnSpace, ackFrame, - [](auto&) { return folly::unit; }, - [](const auto&, const auto&) { return folly::unit; }, - [](auto&, auto&, bool) { return folly::unit; }, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) -> quic::Expected { + return {}; + }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, ackTime); ASSERT_FALSE(ackEventResult.hasError()); auto ackEvent = ackEventResult.value(); @@ -2723,9 +2844,13 @@ TEST_P(AckHandlersTest, AckEventCreationNoCongestionController) { conn, GetParam().pnSpace, ackFrame, - [](auto&) { return folly::unit; }, - [](const auto&, const auto&) { return folly::unit; }, - [](auto&, auto&, bool) { return folly::unit; }, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) -> quic::Expected { + return {}; + }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, ackTime); ASSERT_FALSE(ackEventResult.hasError()); auto ackEvent = ackEventResult.value(); @@ -2781,11 +2906,12 @@ TEST_P(AckHandlersTest, AckEventReceiveTimestamps) { conn, GetParam().pnSpace, ackFrame, - [](auto&) { return folly::unit; }, - [](const auto& /*outstandingPacket*/, const auto& /*frame*/) { - return folly::unit; + [](auto&) -> quic::Expected { return {}; }, + [](const auto& /*outstandingPacket*/, const auto& /*frame*/) + -> quic::Expected { return {}; }, + [&](auto&, auto&, bool) -> quic::Expected { + return {}; }, - [&](auto&, auto&, bool) { return folly::unit; }, ackTime); ASSERT_FALSE(ackEventResult.hasError()); auto ackEvent = ackEventResult.value(); @@ -2878,11 +3004,12 @@ TEST_P(AckHandlersTest, AckEventReceiveTimestampsGaps) { conn, GetParam().pnSpace, ackFrame, - [](auto&) { return folly::unit; }, - [](const auto& /*outstandingPacket*/, const auto& /*frame*/) { - return folly::unit; + [](auto&) -> quic::Expected { return {}; }, + [](const auto& /*outstandingPacket*/, const auto& /*frame*/) + -> quic::Expected { return {}; }, + [&](auto&, auto&, bool) -> quic::Expected { + return {}; }, - [&](auto&, auto&, bool) { return folly::unit; }, ackTime); ASSERT_FALSE(ackEventResult.hasError()); auto ackEvent = ackEventResult.value(); @@ -2940,11 +3067,12 @@ TEST_P(AckHandlersTest, AckEventReceiveTimestampsDuplicatesAll) { conn, GetParam().pnSpace, ackFrame, - [](auto&) { return folly::unit; }, - [](const auto& /*outstandingPacket*/, const auto& /*frame*/) { - return folly::unit; + [](auto&) -> quic::Expected { return {}; }, + [](const auto& /*outstandingPacket*/, const auto& /*frame*/) + -> quic::Expected { return {}; }, + [&](auto&, auto&, bool) -> quic::Expected { + return {}; }, - [&](auto&, auto&, bool) { return folly::unit; }, ackTime); ASSERT_FALSE(ackEventResult.hasError()); auto ackEvent = ackEventResult.value(); @@ -2970,11 +3098,12 @@ TEST_P(AckHandlersTest, AckEventReceiveTimestampsDuplicatesAll) { conn, GetParam().pnSpace, ackFrame, - [](auto&) { return folly::unit; }, - [](const auto& /*outstandingPacket*/, const auto& /*frame*/) { - return folly::unit; + [](auto&) -> quic::Expected { return {}; }, + [](const auto& /*outstandingPacket*/, const auto& /*frame*/) + -> quic::Expected { return {}; }, + [&](auto&, auto&, bool) -> quic::Expected { + return {}; }, - [&](auto&, auto&, bool) { return folly::unit; }, ackTime); ASSERT_FALSE(ackEventResult2.hasError()); auto ackEvent2 = ackEventResult2.value(); @@ -3036,11 +3165,12 @@ TEST_P(AckHandlersTest, AckEventReceiveTimestampsPartialDuplicates) { conn, GetParam().pnSpace, ackFrame, - [](auto&) { return folly::unit; }, - [](const auto& /*outstandingPacket*/, const auto& /*frame*/) { - return folly::unit; + [](auto&) -> quic::Expected { return {}; }, + [](const auto& /*outstandingPacket*/, const auto& /*frame*/) + -> quic::Expected { return {}; }, + [&](auto&, auto&, bool) -> quic::Expected { + return {}; }, - [&](auto&, auto&, bool) { return folly::unit; }, ackTime); ASSERT_FALSE(ackEventResult.hasError()); auto ackEvent = ackEventResult.value(); @@ -3153,11 +3283,12 @@ TEST_P(AckHandlersTest, AckEventReceiveTimestampsOutOfOrderAcks) { conn, GetParam().pnSpace, ackFrame, - [](auto&) { return folly::unit; }, - [](const auto& /*outstandingPacket*/, const auto& /*frame*/) { - return folly::unit; + [](auto&) -> quic::Expected { return {}; }, + [](const auto& /*outstandingPacket*/, const auto& /*frame*/) + -> quic::Expected { return {}; }, + [&](auto&, auto&, bool) -> quic::Expected { + return {}; }, - [&](auto&, auto&, bool) { return folly::unit; }, ackTime); ASSERT_FALSE(ackEventResult.hasError()); auto ackEvent = ackEventResult.value(); @@ -3209,11 +3340,12 @@ TEST_P(AckHandlersTest, AckEventReceiveTimestampsOutOfOrderAcks) { conn, GetParam().pnSpace, ackFrame2, - [](auto&) { return folly::unit; }, - [](const auto& /*outstandingPacket*/, const auto& /*frame*/) { - return folly::unit; + [](auto&) -> quic::Expected { return {}; }, + [](const auto& /*outstandingPacket*/, const auto& /*frame*/) + -> quic::Expected { return {}; }, + [&](auto&, auto&, bool) -> quic::Expected { + return {}; }, - [&](auto&, auto&, bool) { return folly::unit; }, ackTime); ASSERT_FALSE(ackEventResult2.hasError()); auto ackEvent2 = ackEventResult2.value(); @@ -3284,11 +3416,12 @@ TEST_P(AckHandlersTest, AckEventReceiveTimestampsMaxCheck) { conn, GetParam().pnSpace, ackFrame, - [](auto&) { return folly::unit; }, - [](const auto& /*outstandingPacket*/, const auto& /*frame*/) { - return folly::unit; + [](auto&) -> quic::Expected { return {}; }, + [](const auto& /*outstandingPacket*/, const auto& /*frame*/) + -> quic::Expected { return {}; }, + [&](auto&, auto&, bool) -> quic::Expected { + return {}; }, - [&](auto&, auto&, bool) { return folly::unit; }, ackTime); ASSERT_FALSE(ackEventResult.hasError()); @@ -3466,15 +3599,19 @@ TEST_P(AckHandlersTest, AckEventCreationInvalidAckDelay) { .WillOnce(Return(std::nullopt)); EXPECT_CALL(*rawPacketProcessor, onPacketAck(_)).Times(1); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [](const auto&, const auto&) { return folly::unit; }, - [](auto&, auto&, bool) { return folly::unit; }, - ackTime) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) + -> quic::Expected { return {}; }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + ackTime) + .hasError()); } TEST_P(AckHandlersTest, AckEventCreationRttMinusAckDelayIsZero) { @@ -3568,15 +3705,19 @@ TEST_P(AckHandlersTest, AckEventCreationRttMinusAckDelayIsZero) { .WillOnce(Return(std::nullopt)); EXPECT_CALL(*rawPacketProcessor, onPacketAck(_)).Times(1); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [](const auto&, const auto&) { return folly::unit; }, - [](auto&, auto&, bool) { return folly::unit; }, - ackTime) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) + -> quic::Expected { return {}; }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + ackTime) + .hasError()); } TEST_P(AckHandlersTest, AckEventCreationReorderingLargestPacketAcked) { @@ -3696,15 +3837,19 @@ TEST_P(AckHandlersTest, AckEventCreationReorderingLargestPacketAcked) { .WillOnce(Return(std::nullopt)); EXPECT_CALL(*rawPacketProcessor, onPacketAck(_)).Times(1); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [](const auto&, const auto&) { return folly::unit; }, - [](auto&, auto&, bool) { return folly::unit; }, - ackTime) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) + -> quic::Expected { return {}; }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + ackTime) + .hasError()); } // AckFrame acking packets (0 -> 4, 7 -> 9) @@ -3753,15 +3898,19 @@ TEST_P(AckHandlersTest, AckEventCreationReorderingLargestPacketAcked) { .WillOnce(Return(std::nullopt)); EXPECT_CALL(*rawPacketProcessor, onPacketAck(_)).Times(1); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [](const auto&, const auto&) { return folly::unit; }, - [](auto&, auto&, bool) { return folly::unit; }, - ackTime) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) + -> quic::Expected { return {}; }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + ackTime) + .hasError()); } // AckFrame acking packets (0 -> 9) @@ -3810,15 +3959,19 @@ TEST_P(AckHandlersTest, AckEventCreationReorderingLargestPacketAcked) { .WillOnce(Return(std::nullopt)); EXPECT_CALL(*rawPacketProcessor, onPacketAck(_)).Times(1); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [](const auto&, const auto&) { return folly::unit; }, - [](auto&, auto&, bool) { return folly::unit; }, - ackTime) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) + -> quic::Expected { return {}; }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + ackTime) + .hasError()); } } @@ -3930,15 +4083,19 @@ TEST_P(AckHandlersTest, AckEventCreationNoMatchingPacketDueToLoss) { .WillOnce(Return(std::nullopt)); EXPECT_CALL(*rawPacketProcessor, onPacketAck(_)).Times(1); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [](const auto&, const auto&) { return folly::unit; }, - [](auto&, auto&, bool) { return folly::unit; }, - ackTime) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) + -> quic::Expected { return {}; }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + ackTime) + .hasError()); } // should have zero outstanding at this point @@ -3956,15 +4113,19 @@ TEST_P(AckHandlersTest, AckEventCreationNoMatchingPacketDueToLoss) { ackFrame.ackDelay = 10ms; const auto ackTime = getSentTime(3) + propDelay + ackFrame.ackDelay + 5ms; EXPECT_CALL(*rawCongestionController, onPacketAckOrLoss(_, _)).Times(0); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [](const auto&, const auto&) { return folly::unit; }, - [](auto&, auto&, bool) { return folly::unit; }, - ackTime) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) + -> quic::Expected { return {}; }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + ackTime) + .hasError()); } } @@ -4057,15 +4218,19 @@ TEST_P(AckHandlersTest, ImplictAckEventCreation) { .WillOnce(Return(std::nullopt)); EXPECT_CALL(*rawPacketProcessor, onPacketAck(_)).Times(1); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [](const auto&, const auto&) { return folly::unit; }, - [](auto&, auto&, bool) { return folly::unit; }, - ackTime) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) + -> quic::Expected { return {}; }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + ackTime) + .hasError()); } TEST_P(AckHandlersTest, ObserverRttSample) { @@ -4170,15 +4335,19 @@ TEST_P(AckHandlersTest, ObserverRttSample) { ackData.endSeq + 1))))); } for (const auto& ackData : ackVec) { - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackData.ackFrame, - [](auto&) { return folly::unit; }, - [](const auto&, const auto&) { return folly::unit; }, - [](auto&, auto&, bool) { return folly::unit; }, - ackData.ackTime) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackData.ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) + -> quic::Expected { return {}; }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + ackData.ackTime) + .hasError()); } observerContainer->removeObserver(obs1.get()); @@ -4240,13 +4409,16 @@ TEST_P(AckHandlersTest, ObserverSpuriousLostEventReorderThreshold) { auto& ackState = getAckState(conn, GetParam().pnSpace); ackState.largestNonDsrSequenceNumberAckedByPeer = 4; ackState.largestAckedByPeer = 4; - ASSERT_FALSE(detectLossPackets( - conn, - ackState, - [](auto&, auto&, bool) { return folly::unit; }, - checkTime, - GetParam().pnSpace) - .hasError()); + ASSERT_FALSE( + detectLossPackets( + conn, + ackState, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + checkTime, + GetParam().pnSpace) + .hasError()); // now we get acks for packets marked lost, triggering spuriousLossDetected EXPECT_CALL( @@ -4265,15 +4437,19 @@ TEST_P(AckHandlersTest, ObserverSpuriousLostEventReorderThreshold) { ackFrame.largestAcked = 2; ackFrame.ackBlocks.emplace_back(0, 2); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [](const auto&, const auto&) { return folly::unit; }, - [](auto&, auto&, bool) { return folly::unit; }, - startTime + 30ms) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) + -> quic::Expected { return {}; }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + startTime + 30ms) + .hasError()); } observerContainer->removeObserver(obs1.get()); @@ -4338,13 +4514,16 @@ TEST_P(AckHandlersTest, ObserverSpuriousLostEventTimeout) { auto& ackState = getAckState(conn, GetParam().pnSpace); ackState.largestNonDsrSequenceNumberAckedByPeer = 10; ackState.largestAckedByPeer = 10; - ASSERT_FALSE(detectLossPackets( - conn, - ackState, - [](auto&, auto&, bool) { return folly::unit; }, - checkTime, - GetParam().pnSpace) - .hasError()); + ASSERT_FALSE( + detectLossPackets( + conn, + ackState, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + checkTime, + GetParam().pnSpace) + .hasError()); // now we get acks for packets marked lost, triggering spuriousLossDetected EXPECT_CALL( @@ -4365,15 +4544,19 @@ TEST_P(AckHandlersTest, ObserverSpuriousLostEventTimeout) { ackFrame.largestAcked = 9; ackFrame.ackBlocks.emplace_back(5, 9); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [](const auto&, const auto&) { return folly::unit; }, - [](auto&, auto&, bool) { return folly::unit; }, - startTime + 510ms) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) + -> quic::Expected { return {}; }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + startTime + 510ms) + .hasError()); } observerContainer->removeObserver(obs1.get()); @@ -4410,15 +4593,19 @@ TEST_P(AckHandlersTest, SubMicrosecondRTT) { auto ackReceiveTime = packetSendTime + 400ns; ackFrame.largestAcked = 5; ackFrame.ackBlocks.emplace_back(5, 5); - ASSERT_FALSE(processAckFrame( - conn, - GetParam().pnSpace, - ackFrame, - [](auto&) { return folly::unit; }, - [](const auto&, const auto&) { return folly::unit; }, - [](auto&, auto&, bool) { return folly::unit; }, - ackReceiveTime) - .hasError()); + ASSERT_FALSE( + processAckFrame( + conn, + GetParam().pnSpace, + ackFrame, + [](auto&) -> quic::Expected { return {}; }, + [](const auto&, const auto&) + -> quic::Expected { return {}; }, + [](auto&, auto&, bool) -> quic::Expected { + return {}; + }, + ackReceiveTime) + .hasError()); EXPECT_EQ(conn.lossState.lrtt, 1us); } @@ -4580,10 +4767,10 @@ class AckEventForAppDataTest : public Test { *conn_, PacketNumberSpace::AppData, ackFrame, - [](auto&) { return folly::unit; }, + [](auto&) -> quic::Expected { return {}; }, [&](const OutstandingPacketWrapper& /* packet */, const QuicWriteFrame& packetFrame) - -> folly::Expected { + -> quic::Expected { switch (packetFrame.type()) { case QuicWriteFrame::Type::WriteStreamFrame: { const WriteStreamFrame& frame = *packetFrame.asWriteStreamFrame(); @@ -4601,9 +4788,11 @@ class AckEventForAppDataTest : public Test { default: CHECK(false); } - return folly::unit; + return {}; + }, + [&](auto&, auto&, bool) -> quic::Expected { + return {}; }, - [&](auto&, auto&, auto) { return folly::unit; }, timepoint); CHECK(!result.hasError()); return result.value(); @@ -7509,9 +7698,13 @@ TEST_P(AckHandlersTest, SkippedPacketAckedProtocolViolation) { conn, GetParam().pnSpace, ackFrame, - [](auto&) { return folly::unit; }, - [](auto&, auto&) { return folly::unit; }, - [&](auto&, auto&, bool) { return folly::unit; }, + [](auto&) -> quic::Expected { return {}; }, + [&](const auto&, const auto&) -> quic::Expected { + return {}; + }, + [&](auto&, auto&, bool) -> quic::Expected { + return {}; + }, Clock::now()); ASSERT_TRUE(result.hasError()); EXPECT_EQ(result.error().code, TransportErrorCode::PROTOCOL_VIOLATION); @@ -7534,9 +7727,13 @@ TEST_P(AckHandlersTest, FuturePacketAckedProtocolViolation) { conn, GetParam().pnSpace, ackFrame, - [](auto&) { return folly::unit; }, - [](auto&, auto&) { return folly::unit; }, - [&](auto&, auto&, bool) { return folly::unit; }, + [](auto&) -> quic::Expected { return {}; }, + [&](const auto&, const auto&) -> quic::Expected { + return {}; + }, + [&](auto&, auto&, bool) -> quic::Expected { + return {}; + }, Clock::now()); ASSERT_TRUE(result.hasError()); EXPECT_EQ(result.error().code, TransportErrorCode::PROTOCOL_VIOLATION); @@ -7583,9 +7780,13 @@ TEST_P(AckHandlersTest, SkippedPacketNumberClearedAfterDistance) { conn, GetParam().pnSpace, ackFrame, - [](auto&) { return folly::unit; }, - [](auto&, auto&) { return folly::unit; }, - [&](auto&, auto&, bool) { return folly::unit; }, + [](auto&) -> quic::Expected { return {}; }, + [&](const auto&, const auto&) -> quic::Expected { + return {}; + }, + [&](auto&, auto&, bool) -> quic::Expected { + return {}; + }, Clock::now()); ASSERT_FALSE(result.hasError()); // Acking a genuine packet at sufficient distance from the skipped packet diff --git a/quic/state/test/QuicStateFunctionsTest.cpp b/quic/state/test/QuicStateFunctionsTest.cpp index c304635a4..874fcfef2 100644 --- a/quic/state/test/QuicStateFunctionsTest.cpp +++ b/quic/state/test/QuicStateFunctionsTest.cpp @@ -1061,7 +1061,7 @@ TEST_F(QuicStateFunctionsTest, InvokeResetDoesNotSendFlowControl) { conn.flowControlState.advertisedMaxOffset = 100; conn.flowControlState.windowSize = 100; auto result = receiveRstStreamSMHandler(stream, std::move(rst)); - EXPECT_TRUE(result.hasValue()); + EXPECT_TRUE(result.has_value()); bool matches = (stream.recvState == StreamRecvState::Closed); EXPECT_TRUE(matches); EXPECT_FALSE(conn.streamManager->hasWindowUpdates()); diff --git a/quic/state/test/QuicStreamFunctionsTest.cpp b/quic/state/test/QuicStreamFunctionsTest.cpp index 4502bca66..76f8ea57c 100644 --- a/quic/state/test/QuicStreamFunctionsTest.cpp +++ b/quic/state/test/QuicStreamFunctionsTest.cpp @@ -220,7 +220,7 @@ TEST_P(QuicStreamFunctionsTestBase, TestPeekAndConsumeContiguousData) { peekDataFromQuicStream(*stream, peekCallback); EXPECT_TRUE(peekCbCalled); - EXPECT_NO_THROW(consumeDataFromQuicStream(*stream, 81)); + EXPECT_NO_THROW(((void)consumeDataFromQuicStream(*stream, 81))); peekCbCalled = false; auto peekCallback2 = [&](StreamId /* unused */, @@ -271,7 +271,7 @@ TEST_P(QuicStreamFunctionsTestBase, TestPeekAndConsumeNonContiguousData) { EXPECT_TRUE(cbCalled); // Consume left side. - EXPECT_NO_THROW(consumeDataFromQuicStream(*stream, 81)); + EXPECT_NO_THROW(((void)consumeDataFromQuicStream(*stream, 81))); cbCalled = false; auto peekCallback2 = [&](StreamId /* unused */, @@ -287,7 +287,7 @@ TEST_P(QuicStreamFunctionsTestBase, TestPeekAndConsumeNonContiguousData) { // Try consuming again. // Nothing has changed since we're missing data in the middle. - EXPECT_NO_THROW(consumeDataFromQuicStream(*stream, 81)); + EXPECT_NO_THROW(((void)consumeDataFromQuicStream(*stream, 81))); cbCalled = false; peekDataFromQuicStream(*stream, peekCallback2); EXPECT_TRUE(cbCalled); @@ -315,7 +315,7 @@ TEST_P(QuicStreamFunctionsTestBase, TestPeekAndConsumeNonContiguousData) { EXPECT_TRUE(cbCalled); // Consume the rest of the buffer. - EXPECT_NO_THROW(consumeDataFromQuicStream(*stream, 81)); + EXPECT_NO_THROW(((void)consumeDataFromQuicStream(*stream, 81))); cbCalled = false; peekDataFromQuicStream( @@ -340,7 +340,7 @@ TEST_P(QuicStreamFunctionsTestBase, TestPeekAndConsumeEmptyData) { peekDataFromQuicStream(*stream, peekCallback); EXPECT_TRUE(cbCalled); - EXPECT_NO_THROW(consumeDataFromQuicStream(*stream, 81)); + EXPECT_NO_THROW(((void)consumeDataFromQuicStream(*stream, 81))); cbCalled = false; peekDataFromQuicStream(*stream, peekCallback); @@ -363,7 +363,7 @@ TEST_P(QuicStreamFunctionsTestBase, TestPeekAndConsumeEmptyDataEof) { peekDataFromQuicStream(*stream, peekCallback); EXPECT_TRUE(cbCalled); - EXPECT_NO_THROW(consumeDataFromQuicStream(*stream, 42)); + EXPECT_NO_THROW(((void)consumeDataFromQuicStream(*stream, 42))); cbCalled = false; peekDataFromQuicStream(*stream, peekCallback); @@ -1599,16 +1599,16 @@ TEST_P(QuicStreamFunctionsTestBase, HasReadableData) { .hasError()); EXPECT_TRUE(stream->hasReadableData()); - readDataFromQuicStream(*stream); + (void)readDataFromQuicStream(*stream); EXPECT_FALSE(stream->hasReadableData()); auto buf3 = IOBuf::copyBuffer("just "); ASSERT_FALSE(appendDataToReadBuffer(*stream, StreamBuffer(buf3->clone(), 2)) .hasError()); EXPECT_TRUE(stream->hasReadableData()); - readDataFromQuicStream(*stream, 5); + (void)readDataFromQuicStream(*stream, 5); EXPECT_TRUE(stream->hasReadableData()); - readDataFromQuicStream(*stream); + (void)readDataFromQuicStream(*stream); EXPECT_FALSE(stream->hasReadableData()); } @@ -1674,16 +1674,16 @@ TEST_P(QuicStreamFunctionsTestBase, HasPeekableData) { .hasError()); EXPECT_TRUE(stream->hasPeekableData()); - readDataFromQuicStream(*stream); + (void)readDataFromQuicStream(*stream); EXPECT_TRUE(stream->hasPeekableData()); auto buf3 = IOBuf::copyBuffer("just "); ASSERT_FALSE(appendDataToReadBuffer(*stream, StreamBuffer(buf3->clone(), 2)) .hasError()); EXPECT_TRUE(stream->hasPeekableData()); - readDataFromQuicStream(*stream, 5); + (void)readDataFromQuicStream(*stream, 5); EXPECT_TRUE(stream->hasPeekableData()); - readDataFromQuicStream(*stream); + (void)readDataFromQuicStream(*stream); EXPECT_FALSE(stream->hasPeekableData()); } @@ -1696,7 +1696,7 @@ TEST_P(QuicStreamFunctionsTestBase, UpdatesLastHolbTime) { .hasError()); // Should not be HOL blocked before data has arrived EXPECT_FALSE(stream->lastHolbTime); - readDataFromQuicStream(*stream); + (void)readDataFromQuicStream(*stream); // Should be HOL blocked EXPECT_TRUE(stream->lastHolbTime); } @@ -1773,7 +1773,7 @@ TEST_P( // !HOLB && totalTime == totalTimeMark // => HOLB && holbCount == 2 // && totalHolbTime == totalTimeMark - readDataFromQuicStream(*stream); + (void)readDataFromQuicStream(*stream); EXPECT_TRUE(stream->lastHolbTime); EXPECT_EQ(2, stream->holbCount); EXPECT_EQ(totalHolbTimeMark, stream->totalHolbTime); @@ -1798,7 +1798,7 @@ TEST_P( // uRL 4.1 - read the entire stream - expected state transition: // !HOLB && holbCount == 2 // => !HOLB && holbCount == 2 - readDataFromQuicStream(*stream); + (void)readDataFromQuicStream(*stream); EXPECT_FALSE(stream->lastHolbTime); EXPECT_EQ(2, stream->holbCount); @@ -1825,7 +1825,7 @@ TEST_P(QuicStreamFunctionsTestBase, HolbTimingFirstBufferHOLBlocked) { EXPECT_EQ(0us, stream->totalHolbTime); auto lastHolbTimeMark = stream->lastHolbTime; - readDataFromQuicStream(*stream); + (void)readDataFromQuicStream(*stream); // Read data should fail since there is no data available at // the reading cursor EXPECT_EQ(lastHolbTimeMark, stream->lastHolbTime); @@ -1860,7 +1860,7 @@ TEST_P(QuicStreamFunctionsTestBase, HolbTimingReadingEntireStream) { EXPECT_EQ(1, stream->holbCount); // Consume the entire stream. This should not change the holb status - readDataFromQuicStream(*stream); + (void)readDataFromQuicStream(*stream); EXPECT_FALSE(stream->lastHolbTime); EXPECT_EQ(1, stream->holbCount); } @@ -1877,7 +1877,7 @@ TEST_P(QuicStreamFunctionsTestBase, HolbTimingLockstepScenario) { // Should not be HOL blocked before data has arrived EXPECT_FALSE(stream->lastHolbTime); - readDataFromQuicStream(*stream); + (void)readDataFromQuicStream(*stream); // Should be HOL blocked now EXPECT_TRUE(stream->lastHolbTime); EXPECT_EQ(1, stream->holbCount); @@ -1906,7 +1906,7 @@ TEST_P(QuicStreamFunctionsTestBase, HolbTimingLockstepScenario) { auto snapshotHolbTime = stream->totalHolbTime; // Consume all available data from the stream - readDataFromQuicStream(*stream); + (void)readDataFromQuicStream(*stream); // Should be HOL blocked at missing buf3. EXPECT_TRUE(stream->lastHolbTime); @@ -1930,14 +1930,14 @@ TEST_P(QuicStreamFunctionsTestBase, HolbTimingReadDataCallsUpdateRL) { ASSERT_FALSE(appendDataToReadBuffer(*stream, StreamBuffer(buf1->clone(), 2)) .hasError()); - readDataFromQuicStream(*stream); + (void)readDataFromQuicStream(*stream); // Should be HOL blocked EXPECT_TRUE(stream->lastHolbTime); EXPECT_EQ(1, stream->holbCount); ASSERT_FALSE(appendDataToReadBuffer(*stream, StreamBuffer(buf2->clone(), 0)) .hasError()); - readDataFromQuicStream(*stream); + (void)readDataFromQuicStream(*stream); EXPECT_FALSE(stream->lastHolbTime); EXPECT_EQ(1, stream->holbCount); } diff --git a/quic/state/test/QuicStreamManagerTest.cpp b/quic/state/test/QuicStreamManagerTest.cpp index d9156ff22..ec4db5d20 100644 --- a/quic/state/test/QuicStreamManagerTest.cpp +++ b/quic/state/test/QuicStreamManagerTest.cpp @@ -46,11 +46,11 @@ class QuicStreamManagerTest ASSERT_TRUE( conn.streamManager ->setMaxLocalBidirectionalStreams(kDefaultMaxStreamsBidirectional) - .hasValue()); + .has_value()); ASSERT_TRUE( conn.streamManager ->setMaxLocalUnidirectionalStreams(kDefaultMaxStreamsUnidirectional) - .hasValue()); + .has_value()); auto congestionController = std::make_unique>(); @@ -61,7 +61,7 @@ class QuicStreamManagerTest GetParam().notifyOnNewStreamsExplicitly; ASSERT_TRUE( conn.streamManager->refreshTransportSettings(conn.transportSettings) - .hasValue()); + .has_value()); } QuicServerConnectionState conn; @@ -71,7 +71,7 @@ class QuicStreamManagerTest TEST_P(QuicStreamManagerTest, SkipRedundantPriorityUpdate) { auto& manager = *conn.streamManager; auto streamResult = manager.createNextBidirectionalStream(); - ASSERT_TRUE(streamResult.hasValue()); + ASSERT_TRUE(streamResult.has_value()); auto* stream = streamResult.value(); auto streamId = stream->id; HTTPPriorityQueue::Priority currentPriority(stream->priority); @@ -95,7 +95,7 @@ TEST_P(QuicStreamManagerTest, TestAppIdleCreateBidiStream) { EXPECT_CALL(*mockController, setAppIdle(false, _)).Times(0); auto streamResult = manager.createNextBidirectionalStream(); ASSERT_FALSE(streamResult.hasError()); - ASSERT_TRUE(streamResult.hasValue()); + ASSERT_TRUE(streamResult.has_value()); auto* stream = streamResult.value(); StreamId id = stream->id; EXPECT_FALSE(manager.isAppIdle()); @@ -109,7 +109,7 @@ TEST_P(QuicStreamManagerTest, TestAppIdleCreateBidiStream) { auto getResult = manager.getStream(id); ASSERT_FALSE(getResult.hasError()); - ASSERT_TRUE(getResult.hasValue()); + ASSERT_TRUE(getResult.has_value()); EXPECT_EQ(getResult.value(), nullptr); // Check stream is gone (nullptr) } @@ -119,7 +119,7 @@ TEST_P(QuicStreamManagerTest, TestAppIdleCreateUnidiStream) { EXPECT_CALL(*mockController, setAppIdle(false, _)).Times(0); auto streamResult = manager.createNextUnidirectionalStream(); ASSERT_FALSE(streamResult.hasError()); - ASSERT_TRUE(streamResult.hasValue()); + ASSERT_TRUE(streamResult.has_value()); auto* stream = streamResult.value(); EXPECT_FALSE(manager.isAppIdle()); @@ -137,7 +137,7 @@ TEST_P(QuicStreamManagerTest, TestAppIdleExistingLocalStream) { EXPECT_CALL(*mockController, setAppIdle(false, _)).Times(0); auto streamResult = manager.createNextUnidirectionalStream(); - ASSERT_TRUE(streamResult.hasValue()); + ASSERT_TRUE(streamResult.has_value()); auto* stream = streamResult.value(); EXPECT_FALSE(manager.isAppIdle()); @@ -146,7 +146,7 @@ TEST_P(QuicStreamManagerTest, TestAppIdleExistingLocalStream) { EXPECT_TRUE(manager.isAppIdle()); auto getResult = manager.getStream(stream->id); - ASSERT_TRUE(getResult.hasValue()); + ASSERT_TRUE(getResult.has_value()); EXPECT_NE(getResult.value(), nullptr); // Stream should still exist EXPECT_TRUE(manager.isAppIdle()); } @@ -156,7 +156,7 @@ TEST_P(QuicStreamManagerTest, TestAppIdleStreamAsControl) { EXPECT_FALSE(manager.isAppIdle()); auto streamResult = manager.createNextUnidirectionalStream(); - ASSERT_TRUE(streamResult.hasValue()); + ASSERT_TRUE(streamResult.has_value()); auto* stream = streamResult.value(); EXPECT_FALSE(manager.isAppIdle()); @@ -166,7 +166,7 @@ TEST_P(QuicStreamManagerTest, TestAppIdleStreamAsControl) { EXPECT_CALL(*mockController, setAppIdle(false, _)); auto streamResult2 = manager.createNextUnidirectionalStream(); - ASSERT_TRUE(streamResult2.hasValue()); + ASSERT_TRUE(streamResult2.has_value()); EXPECT_FALSE(manager.isAppIdle()); } @@ -175,7 +175,7 @@ TEST_P(QuicStreamManagerTest, TestAppIdleCreatePeerStream) { EXPECT_FALSE(manager.isAppIdle()); StreamId id = 0; auto streamResult = manager.getStream(id); - ASSERT_TRUE(streamResult.hasValue()); + ASSERT_TRUE(streamResult.has_value()); auto* stream = streamResult.value(); ASSERT_NE(stream, nullptr); EXPECT_FALSE(manager.isAppIdle()); @@ -187,7 +187,7 @@ TEST_P(QuicStreamManagerTest, TestAppIdleCreatePeerStream) { EXPECT_CALL(*mockController, setAppIdle(false, _)); StreamId id2 = 4; auto streamResult2 = manager.getStream(id2); - ASSERT_TRUE(streamResult2.hasValue()); + ASSERT_TRUE(streamResult2.has_value()); ASSERT_NE(streamResult2.value(), nullptr); EXPECT_FALSE(manager.isAppIdle()); } @@ -199,7 +199,7 @@ TEST_P(QuicStreamManagerTest, TestAppIdleExistingPeerStream) { StreamId id = 0; auto streamResult = manager.getStream(id); - ASSERT_TRUE(streamResult.hasValue()); + ASSERT_TRUE(streamResult.has_value()); auto* stream = streamResult.value(); ASSERT_NE(stream, nullptr); EXPECT_FALSE(manager.isAppIdle()); @@ -209,7 +209,7 @@ TEST_P(QuicStreamManagerTest, TestAppIdleExistingPeerStream) { EXPECT_TRUE(manager.isAppIdle()); auto getResult = manager.getStream(id); - ASSERT_TRUE(getResult.hasValue()); + ASSERT_TRUE(getResult.has_value()); EXPECT_NE(getResult.value(), nullptr); EXPECT_TRUE(manager.isAppIdle()); } @@ -220,7 +220,7 @@ TEST_P(QuicStreamManagerTest, TestAppIdleClosePeerStream) { StreamId id = 0; auto streamResult = manager.getStream(id); ASSERT_FALSE(streamResult.hasError()); - ASSERT_TRUE(streamResult.hasValue()); + ASSERT_TRUE(streamResult.has_value()); auto* stream = streamResult.value(); ASSERT_NE(stream, nullptr); EXPECT_FALSE(manager.isAppIdle()); @@ -234,7 +234,7 @@ TEST_P(QuicStreamManagerTest, TestAppIdleClosePeerStream) { auto getResult = manager.getStream(id); ASSERT_FALSE(getResult.hasError()); - ASSERT_TRUE(getResult.hasValue()); + ASSERT_TRUE(getResult.has_value()); EXPECT_EQ(getResult.value(), nullptr); // Check stream is gone } @@ -246,7 +246,7 @@ TEST_P(QuicStreamManagerTest, TestAppIdleCloseControlStream) { StreamId id = 0; auto streamResult = manager.getStream(id); ASSERT_FALSE(streamResult.hasError()); - ASSERT_TRUE(streamResult.hasValue()); + ASSERT_TRUE(streamResult.has_value()); auto* stream = streamResult.value(); ASSERT_NE(stream, nullptr); EXPECT_FALSE(manager.isAppIdle()); @@ -293,7 +293,7 @@ TEST_P(QuicStreamManagerTest, PeerMaxStreamsLimitSaturated) { for (idx = 0; idx < 10; idx++) { auto streamResult1 = manager.getStream(idx * detail::kStreamIncrement); ASSERT_FALSE(streamResult1.hasError()); - ASSERT_TRUE(streamResult1.hasValue()); + ASSERT_TRUE(streamResult1.has_value()); auto* stream1 = streamResult1.value(); ASSERT_NE(stream1, nullptr); stream1->sendState = StreamSendState::Closed; @@ -302,7 +302,7 @@ TEST_P(QuicStreamManagerTest, PeerMaxStreamsLimitSaturated) { auto streamResult2 = manager.getStream(2 + idx * detail::kStreamIncrement); ASSERT_FALSE(streamResult2.hasError()); - ASSERT_TRUE(streamResult2.hasValue()); + ASSERT_TRUE(streamResult2.has_value()); auto* stream2 = streamResult2.value(); ASSERT_NE(stream2, nullptr); stream2->sendState = StreamSendState::Closed; @@ -338,7 +338,7 @@ TEST_P(QuicStreamManagerTest, StreamLimitWindowedUpdate) { for (int i = 0; i < 25; i++) { auto streamResult1 = manager.getStream(i * detail::kStreamIncrement); ASSERT_FALSE(streamResult1.hasError()); - ASSERT_TRUE(streamResult1.hasValue()); + ASSERT_TRUE(streamResult1.has_value()); auto* stream1 = streamResult1.value(); ASSERT_NE(stream1, nullptr); stream1->sendState = StreamSendState::Closed; @@ -347,7 +347,7 @@ TEST_P(QuicStreamManagerTest, StreamLimitWindowedUpdate) { auto streamResult2 = manager.getStream(2 + i * detail::kStreamIncrement); ASSERT_FALSE(streamResult2.hasError()); - ASSERT_TRUE(streamResult2.hasValue()); + ASSERT_TRUE(streamResult2.has_value()); auto* stream2 = streamResult2.value(); ASSERT_NE(stream2, nullptr); stream2->sendState = StreamSendState::Closed; @@ -377,7 +377,7 @@ TEST_P(QuicStreamManagerTest, StreamLimitNoWindowedUpdate) { for (int i = 0; i < 24; i++) { auto streamResult = manager.getStream(i * detail::kStreamIncrement); ASSERT_FALSE(streamResult.hasError()); - ASSERT_TRUE(streamResult.hasValue()); + ASSERT_TRUE(streamResult.has_value()); auto* stream = streamResult.value(); ASSERT_NE(stream, nullptr); stream->sendState = StreamSendState::Closed; @@ -400,7 +400,7 @@ TEST_P(QuicStreamManagerTest, StreamLimitManyWindowedUpdate) { for (int i = 0; i < 50; i++) { auto streamResult = manager.getStream(i * detail::kStreamIncrement); ASSERT_FALSE(streamResult.hasError()); - ASSERT_TRUE(streamResult.hasValue()); + ASSERT_TRUE(streamResult.has_value()); auto* stream = streamResult.value(); ASSERT_NE(stream, nullptr); stream->sendState = StreamSendState::Closed; @@ -416,22 +416,22 @@ TEST_P(QuicStreamManagerTest, StreamLimitManyWindowedUpdate) { TEST_P(QuicStreamManagerTest, StreamLimitIncrementBidi) { auto& manager = *conn.streamManager; - ASSERT_TRUE(manager.setMaxLocalBidirectionalStreams(100, true).hasValue()); + ASSERT_TRUE(manager.setMaxLocalBidirectionalStreams(100, true).has_value()); ASSERT_TRUE( - manager.refreshTransportSettings(conn.transportSettings).hasValue()); + manager.refreshTransportSettings(conn.transportSettings).has_value()); StreamId max; for (int i = 0; i < 100; i++) { auto result = manager.createNextBidirectionalStream(); - ASSERT_TRUE(result.hasValue()); + ASSERT_TRUE(result.has_value()); max = result.value()->id; } auto errorResult = manager.createNextBidirectionalStream(); EXPECT_TRUE(errorResult.hasError()); EXPECT_EQ(errorResult.error(), LocalErrorCode::STREAM_LIMIT_EXCEEDED); - ASSERT_TRUE(manager.setMaxLocalBidirectionalStreams(200).hasValue()); + ASSERT_TRUE(manager.setMaxLocalBidirectionalStreams(200).has_value()); auto s = manager.createNextBidirectionalStream(); - EXPECT_TRUE(s.hasValue()); + EXPECT_TRUE(s.has_value()); EXPECT_EQ(s.value()->id, max + detail::kStreamIncrement); } @@ -448,22 +448,22 @@ TEST_P(QuicStreamManagerTest, ConsumeStopSending) { TEST_P(QuicStreamManagerTest, StreamLimitIncrementUni) { auto& manager = *conn.streamManager; - ASSERT_TRUE(manager.setMaxLocalUnidirectionalStreams(100, true).hasValue()); + ASSERT_TRUE(manager.setMaxLocalUnidirectionalStreams(100, true).has_value()); ASSERT_TRUE( - manager.refreshTransportSettings(conn.transportSettings).hasValue()); + manager.refreshTransportSettings(conn.transportSettings).has_value()); StreamId max; for (int i = 0; i < 100; i++) { auto result = manager.createNextUnidirectionalStream(); - ASSERT_TRUE(result.hasValue()); + ASSERT_TRUE(result.has_value()); max = result.value()->id; } auto errorResult = manager.createNextUnidirectionalStream(); EXPECT_TRUE(errorResult.hasError()); EXPECT_EQ(errorResult.error(), LocalErrorCode::STREAM_LIMIT_EXCEEDED); - ASSERT_TRUE(manager.setMaxLocalUnidirectionalStreams(200).hasValue()); + ASSERT_TRUE(manager.setMaxLocalUnidirectionalStreams(200).has_value()); auto s = manager.createNextUnidirectionalStream(); - EXPECT_TRUE(s.hasValue()); + EXPECT_TRUE(s.has_value()); EXPECT_EQ(s.value()->id, max + detail::kStreamIncrement); } @@ -478,11 +478,11 @@ TEST_P(QuicStreamManagerTest, NextAcceptableLocalUnidirectionalStreamId) { EXPECT_EQ( serverStreamId1, manager.nextAcceptableLocalUnidirectionalStreamId()); - ASSERT_TRUE(manager.createStream(serverStreamId1).hasValue()); + ASSERT_TRUE(manager.createStream(serverStreamId1).has_value()); EXPECT_EQ( serverStreamId2, manager.nextAcceptableLocalUnidirectionalStreamId()); - ASSERT_TRUE(manager.createStream(serverStreamId2).hasValue()); + ASSERT_TRUE(manager.createStream(serverStreamId2).has_value()); EXPECT_EQ( serverStreamId3, manager.nextAcceptableLocalUnidirectionalStreamId()); } @@ -498,18 +498,18 @@ TEST_P(QuicStreamManagerTest, NextAcceptableLocalBidirectionalStreamId) { EXPECT_EQ( serverStreamId1, manager.nextAcceptableLocalBidirectionalStreamId()); - ASSERT_TRUE(manager.createStream(serverStreamId1).hasValue()); + ASSERT_TRUE(manager.createStream(serverStreamId1).has_value()); EXPECT_EQ( serverStreamId2, manager.nextAcceptableLocalBidirectionalStreamId()); - ASSERT_TRUE(manager.createStream(serverStreamId2).hasValue()); + ASSERT_TRUE(manager.createStream(serverStreamId2).has_value()); EXPECT_EQ( serverStreamId3, manager.nextAcceptableLocalBidirectionalStreamId()); } TEST_P(QuicStreamManagerTest, NextAcceptableLocalUnidirectionalStreamIdLimit) { auto& manager = *conn.streamManager; - ASSERT_TRUE(manager.setMaxLocalUnidirectionalStreams(2, true).hasValue()); + ASSERT_TRUE(manager.setMaxLocalUnidirectionalStreams(2, true).has_value()); const StreamId serverStreamId1 = 0x03; const StreamId serverStreamId2 = serverStreamId1 + detail::kStreamIncrement; @@ -517,17 +517,17 @@ TEST_P(QuicStreamManagerTest, NextAcceptableLocalUnidirectionalStreamIdLimit) { EXPECT_EQ( serverStreamId1, manager.nextAcceptableLocalUnidirectionalStreamId()); - ASSERT_TRUE(manager.createStream(serverStreamId1).hasValue()); + ASSERT_TRUE(manager.createStream(serverStreamId1).has_value()); EXPECT_EQ( serverStreamId2, manager.nextAcceptableLocalUnidirectionalStreamId()); - ASSERT_TRUE(manager.createStream(serverStreamId2).hasValue()); + ASSERT_TRUE(manager.createStream(serverStreamId2).has_value()); EXPECT_EQ(std::nullopt, manager.nextAcceptableLocalUnidirectionalStreamId()); } TEST_P(QuicStreamManagerTest, NextAcceptableLocalBidirectionalStreamIdLimit) { auto& manager = *conn.streamManager; - ASSERT_TRUE(manager.setMaxLocalBidirectionalStreams(2, true).hasValue()); + ASSERT_TRUE(manager.setMaxLocalBidirectionalStreams(2, true).has_value()); const StreamId serverStreamId1 = 0x01; const StreamId serverStreamId2 = serverStreamId1 + detail::kStreamIncrement; @@ -535,11 +535,11 @@ TEST_P(QuicStreamManagerTest, NextAcceptableLocalBidirectionalStreamIdLimit) { EXPECT_EQ( serverStreamId1, manager.nextAcceptableLocalBidirectionalStreamId()); - ASSERT_TRUE(manager.createStream(serverStreamId1).hasValue()); + ASSERT_TRUE(manager.createStream(serverStreamId1).has_value()); EXPECT_EQ( serverStreamId2, manager.nextAcceptableLocalBidirectionalStreamId()); - ASSERT_TRUE(manager.createStream(serverStreamId2).hasValue()); + ASSERT_TRUE(manager.createStream(serverStreamId2).has_value()); EXPECT_EQ(std::nullopt, manager.nextAcceptableLocalBidirectionalStreamId()); } @@ -554,11 +554,11 @@ TEST_P(QuicStreamManagerTest, NextAcceptablePeerUnidirectionalStreamId) { EXPECT_EQ( clientStreamId1, manager.nextAcceptablePeerUnidirectionalStreamId()); - ASSERT_TRUE(manager.getStream(clientStreamId1).hasValue()); + ASSERT_TRUE(manager.getStream(clientStreamId1).has_value()); EXPECT_EQ( clientStreamId2, manager.nextAcceptablePeerUnidirectionalStreamId()); - ASSERT_TRUE(manager.getStream(clientStreamId2).hasValue()); + ASSERT_TRUE(manager.getStream(clientStreamId2).has_value()); EXPECT_EQ( clientStreamId3, manager.nextAcceptablePeerUnidirectionalStreamId()); } @@ -573,10 +573,10 @@ TEST_P(QuicStreamManagerTest, NextAcceptablePeerBidirectionalStreamId) { EXPECT_EQ(clientStreamId1, manager.nextAcceptablePeerBidirectionalStreamId()); - ASSERT_TRUE(manager.getStream(clientStreamId1).hasValue()); + ASSERT_TRUE(manager.getStream(clientStreamId1).has_value()); EXPECT_EQ(clientStreamId2, manager.nextAcceptablePeerBidirectionalStreamId()); - ASSERT_TRUE(manager.getStream(clientStreamId2).hasValue()); + ASSERT_TRUE(manager.getStream(clientStreamId2).has_value()); EXPECT_EQ(clientStreamId3, manager.nextAcceptablePeerBidirectionalStreamId()); } @@ -584,7 +584,7 @@ TEST_P(QuicStreamManagerTest, NextAcceptablePeerUnidirectionalStreamIdLimit) { auto& manager = *conn.streamManager; conn.transportSettings.advertisedInitialMaxStreamsUni = 2; ASSERT_TRUE( - manager.refreshTransportSettings(conn.transportSettings).hasValue()); + manager.refreshTransportSettings(conn.transportSettings).has_value()); const StreamId clientStreamId1 = 0x02; const StreamId clientStreamId2 = clientStreamId1 + detail::kStreamIncrement; @@ -592,11 +592,11 @@ TEST_P(QuicStreamManagerTest, NextAcceptablePeerUnidirectionalStreamIdLimit) { EXPECT_EQ( clientStreamId1, manager.nextAcceptablePeerUnidirectionalStreamId()); - ASSERT_TRUE(manager.getStream(clientStreamId1).hasValue()); + ASSERT_TRUE(manager.getStream(clientStreamId1).has_value()); EXPECT_EQ( clientStreamId2, manager.nextAcceptablePeerUnidirectionalStreamId()); - ASSERT_TRUE(manager.getStream(clientStreamId2).hasValue()); + ASSERT_TRUE(manager.getStream(clientStreamId2).has_value()); EXPECT_EQ(std::nullopt, manager.nextAcceptablePeerUnidirectionalStreamId()); } @@ -604,17 +604,17 @@ TEST_P(QuicStreamManagerTest, NextAcceptablePeerBidirectionalStreamIdLimit) { auto& manager = *conn.streamManager; conn.transportSettings.advertisedInitialMaxStreamsBidi = 2; ASSERT_TRUE( - manager.refreshTransportSettings(conn.transportSettings).hasValue()); + manager.refreshTransportSettings(conn.transportSettings).has_value()); const StreamId clientStreamId1 = 0x00; const StreamId clientStreamId2 = clientStreamId1 + detail::kStreamIncrement; EXPECT_EQ(clientStreamId1, manager.nextAcceptablePeerBidirectionalStreamId()); - ASSERT_TRUE(manager.getStream(clientStreamId1).hasValue()); + ASSERT_TRUE(manager.getStream(clientStreamId1).has_value()); EXPECT_EQ(clientStreamId2, manager.nextAcceptablePeerBidirectionalStreamId()); - ASSERT_TRUE(manager.getStream(clientStreamId2).hasValue()); + ASSERT_TRUE(manager.getStream(clientStreamId2).has_value()); EXPECT_EQ(std::nullopt, manager.nextAcceptablePeerBidirectionalStreamId()); } @@ -647,7 +647,7 @@ TEST_P(QuicStreamManagerTest, TestUnidirectionalStreamsSeparateSet) { auto& manager = *conn.streamManager; auto streamResult = manager.createNextUnidirectionalStream(); - ASSERT_TRUE(streamResult.hasValue()); + ASSERT_TRUE(streamResult.has_value()); auto* stream = streamResult.value(); StreamId id = stream->id; // Use the actual stream ID @@ -678,7 +678,7 @@ TEST_P( auto& manager = *conn.streamManager; auto streamResult = manager.createNextUnidirectionalStream(); - ASSERT_TRUE(streamResult.hasValue()); + ASSERT_TRUE(streamResult.has_value()); auto* stream = streamResult.value(); stream->readBuffer.emplace_back(folly::IOBuf::copyBuffer("blah blah"), 0); @@ -702,7 +702,7 @@ TEST_P(QuicStreamManagerTest, TestUnidirectionalStreamsSeparateSetTwoStreams) { auto& manager = *conn.streamManager; auto streamResult = manager.createNextBidirectionalStream(); - ASSERT_TRUE(streamResult.hasValue()); + ASSERT_TRUE(streamResult.has_value()); auto* stream = streamResult.value(); stream->readBuffer.emplace_back( @@ -715,7 +715,7 @@ TEST_P(QuicStreamManagerTest, TestUnidirectionalStreamsSeparateSetTwoStreams) { EXPECT_EQ(manager.readableUnidirectionalStreams().size(), 0); auto streamResult2 = manager.createNextUnidirectionalStream(); - ASSERT_TRUE(streamResult2.hasValue()); + ASSERT_TRUE(streamResult2.has_value()); auto* stream2 = streamResult2.value(); stream2->readBuffer.emplace_back( @@ -731,7 +731,7 @@ TEST_P(QuicStreamManagerTest, TestUnidirectionalStreamsSeparateSetTwoStreams) { TEST_P(QuicStreamManagerTest, WriteBufferMeta) { auto& manager = *conn.streamManager; auto streamResult = manager.createNextUnidirectionalStream(); - ASSERT_TRUE(streamResult.hasValue()); + ASSERT_TRUE(streamResult.has_value()); auto* stream = streamResult.value(); // Add some real data into write buffer @@ -756,7 +756,7 @@ TEST_P(QuicStreamManagerTest, WriteBufferMeta) { TEST_P(QuicStreamManagerTest, RemoveResetsUponClosure) { auto& manager = *conn.streamManager; auto streamResult = manager.createNextBidirectionalStream(); - ASSERT_TRUE(streamResult.hasValue()); + ASSERT_TRUE(streamResult.has_value()); auto* stream = streamResult.value(); auto streamId = stream->id; @@ -781,7 +781,7 @@ TEST_P(QuicStreamManagerTest, TestReliableResetBasic) { auto& manager = *conn.streamManager; auto maybeQuicStreamState = manager.createNextBidirectionalStream(); - ASSERT_TRUE(maybeQuicStreamState.hasValue()); + ASSERT_TRUE(maybeQuicStreamState.has_value()); auto* quicStreamState = maybeQuicStreamState.value(); // Assume we've written out 5 bytes to the wire already, and have @@ -899,9 +899,9 @@ TEST_P(QuicStreamManagerGroupsTest, TestStreamGroupLimits) { // Bump group limits. conn.transportSettings.advertisedMaxStreamGroups = 1; ASSERT_TRUE( - manager.refreshTransportSettings(conn.transportSettings).hasValue()); + manager.refreshTransportSettings(conn.transportSettings).has_value()); groupIdResult = createNextStreamGroup(); - EXPECT_TRUE(groupIdResult.hasValue()); + EXPECT_TRUE(groupIdResult.has_value()); EXPECT_EQ(getNumGroups(), 1); // Try again and it should fail running over the limit. @@ -915,7 +915,7 @@ TEST_P(QuicStreamManagerGroupsTest, TestStreamsCreationInGroupsNoGroup) { auto& manager = *conn.streamManager; conn.transportSettings.advertisedMaxStreamGroups = 16; ASSERT_TRUE( - manager.refreshTransportSettings(conn.transportSettings).hasValue()); + manager.refreshTransportSettings(conn.transportSettings).has_value()); StreamGroupId nonExistentGroupId = GetParam().isUnidirectional ? 3 : 1; auto streamResult = createNextStreamInGroup(nonExistentGroupId); @@ -928,11 +928,11 @@ TEST_P(QuicStreamManagerGroupsTest, TestStreamsCreationInGroupsWrongNodeType) { auto& manager = *conn.streamManager; conn.transportSettings.advertisedMaxStreamGroups = 16; ASSERT_TRUE( - manager.refreshTransportSettings(conn.transportSettings).hasValue()); + manager.refreshTransportSettings(conn.transportSettings).has_value()); // Create a valid group first auto groupResult = createNextStreamGroup(); - ASSERT_TRUE(groupResult.hasValue()); + ASSERT_TRUE(groupResult.has_value()); // Try to create stream with wrong type of group ID (Client ID on Server) StreamGroupId wrongTypeGroupId = GetParam().isUnidirectional ? 2 : 0; @@ -945,14 +945,14 @@ TEST_P(QuicStreamManagerGroupsTest, TestStreamsCreationInGroupsSuccess) { auto& manager = *conn.streamManager; conn.transportSettings.advertisedMaxStreamGroups = 16; ASSERT_TRUE( - manager.refreshTransportSettings(conn.transportSettings).hasValue()); + manager.refreshTransportSettings(conn.transportSettings).has_value()); auto groupIdResult = createNextStreamGroup(); - ASSERT_TRUE(groupIdResult.hasValue()); + ASSERT_TRUE(groupIdResult.has_value()); EXPECT_EQ(getNumGroups(), 1); auto streamResult = createNextStreamInGroup(*groupIdResult); - EXPECT_TRUE(streamResult.hasValue()); + EXPECT_TRUE(streamResult.has_value()); } TEST_P(QuicStreamManagerGroupsTest, TestPeerStreamsWithGroupDisabled) { @@ -972,12 +972,12 @@ TEST_P(QuicStreamManagerGroupsTest, TestPeerStreamsWithGroup) { auto& manager = *conn.streamManager; conn.transportSettings.advertisedMaxStreamGroups = 16; ASSERT_TRUE( - manager.refreshTransportSettings(conn.transportSettings).hasValue()); + manager.refreshTransportSettings(conn.transportSettings).has_value()); const StreamId peerStreamId = GetParam().isUnidirectional ? 2 : 0; const StreamGroupId peerGroupId = GetParam().isUnidirectional ? 2 : 0; auto streamResult = manager.getStream(peerStreamId, peerGroupId); - ASSERT_TRUE(streamResult.hasValue()); + ASSERT_TRUE(streamResult.has_value()); auto* stream = streamResult.value(); EXPECT_NE(stream, nullptr); ASSERT_TRUE(stream->groupId.has_value()); @@ -988,7 +988,7 @@ TEST_P(QuicStreamManagerGroupsTest, TestPeerStreamsWithGroupBadGroupId) { auto& manager = *conn.streamManager; conn.transportSettings.advertisedMaxStreamGroups = 16; ASSERT_TRUE( - manager.refreshTransportSettings(conn.transportSettings).hasValue()); + manager.refreshTransportSettings(conn.transportSettings).has_value()); const StreamId peerStreamId = GetParam().isUnidirectional ? 2 : 0; // Server group ID when peer is Client (or vice versa) @@ -1003,12 +1003,12 @@ TEST_P(QuicStreamManagerGroupsTest, TestPeerStreamsWithGroupAccounting) { auto& manager = *conn.streamManager; conn.transportSettings.advertisedMaxStreamGroups = 16; ASSERT_TRUE( - manager.refreshTransportSettings(conn.transportSettings).hasValue()); + manager.refreshTransportSettings(conn.transportSettings).has_value()); StreamId peerStreamId = GetParam().isUnidirectional ? 2 : 0; StreamGroupId peerGroupId = GetParam().isUnidirectional ? 2 : 0; auto streamResult = manager.getStream(peerStreamId, peerGroupId); - ASSERT_TRUE(streamResult.hasValue()); + ASSERT_TRUE(streamResult.has_value()); auto* stream = streamResult.value(); EXPECT_NE(stream, nullptr); ASSERT_TRUE(stream->groupId.has_value()); @@ -1019,7 +1019,7 @@ TEST_P(QuicStreamManagerGroupsTest, TestPeerStreamsWithGroupAccounting) { // Another stream, same group. peerStreamId += detail::kStreamIncrement; streamResult = manager.getStream(peerStreamId, peerGroupId); - ASSERT_TRUE(streamResult.hasValue()); + ASSERT_TRUE(streamResult.has_value()); stream = streamResult.value(); EXPECT_NE(stream, nullptr); ASSERT_TRUE(stream->groupId.has_value()); @@ -1031,7 +1031,7 @@ TEST_P(QuicStreamManagerGroupsTest, TestPeerStreamsWithGroupAccounting) { peerStreamId += detail::kStreamIncrement; peerGroupId += detail::kStreamGroupIncrement; streamResult = manager.getStream(peerStreamId, peerGroupId); - ASSERT_TRUE(streamResult.hasValue()); + ASSERT_TRUE(streamResult.has_value()); stream = streamResult.value(); EXPECT_NE(stream, nullptr); ASSERT_TRUE(stream->groupId.has_value()); @@ -1043,7 +1043,7 @@ TEST_P(QuicStreamManagerGroupsTest, TestPeerStreamsWithGroupAccounting) { peerStreamId += detail::kStreamIncrement; peerGroupId = GetParam().isUnidirectional ? 2 : 0; // Go back to first group streamResult = manager.getStream(peerStreamId, peerGroupId); - ASSERT_TRUE(streamResult.hasValue()); + ASSERT_TRUE(streamResult.has_value()); stream = streamResult.value(); EXPECT_NE(stream, nullptr); ASSERT_TRUE(stream->groupId.has_value()); @@ -1058,7 +1058,7 @@ TEST_P(QuicStreamManagerGroupsTest, TestPeerStreamsWithGroupAccounting) { peerStreamId += detail::kStreamIncrement; peerGroupId = GetParam().isUnidirectional ? 6 : 4; // Go back to second group streamResult = manager.getStream(peerStreamId, peerGroupId); - ASSERT_TRUE(streamResult.hasValue()); + ASSERT_TRUE(streamResult.has_value()); stream = streamResult.value(); EXPECT_NE(stream, nullptr); ASSERT_TRUE(stream->groupId.has_value()); diff --git a/quic/tools/tperf/TperfServer.cpp b/quic/tools/tperf/TperfServer.cpp index 0dd8cff35..ce9918e15 100644 --- a/quic/tools/tperf/TperfServer.cpp +++ b/quic/tools/tperf/TperfServer.cpp @@ -147,7 +147,7 @@ class ServerStreamHandler : public quic::QuicSocket::ConnectionSetupCallback, } auto stream = sock_->createUnidirectionalStream(); VLOG(5) << "New Stream with id = " << stream.value(); - CHECK(stream.hasValue()); + CHECK(stream.has_value()); bytesPerStream_[stream.value()] = 0; notifyDataForStream(stream.value()); } @@ -259,7 +259,7 @@ class ServerStreamHandler : public quic::QuicSocket::ConnectionSetupCallback, auto stream = sock_->createUnidirectionalStream(); VLOG(5) << "New Stream with id = " << stream.value(); - CHECK(stream.hasValue()); + CHECK(stream.has_value()); streamBurstSendResult_.streamId = *stream; streamBurstSendResult_.acked = false; streamBurstSendResult_.startTs = Clock::now(); diff --git a/quic/xsk/BUCK b/quic/xsk/BUCK index 9069ef8df..c20735c25 100644 --- a/quic/xsk/BUCK +++ b/quic/xsk/BUCK @@ -56,10 +56,10 @@ mvfst_cpp_library( ], exported_deps = [ ":xsk_lib", - "//folly:expected", "//folly:network_address", "//folly/container:f14_hash", "//folly/io:iobuf", + "//quic/common:expected", "//quic/common:optional", ], ) diff --git a/quic/xsk/BaseXskContainer.cpp b/quic/xsk/BaseXskContainer.cpp index 6fcb3bd84..ddb5c528e 100644 --- a/quic/xsk/BaseXskContainer.cpp +++ b/quic/xsk/BaseXskContainer.cpp @@ -16,7 +16,7 @@ namespace facebook::xdpsocket { -folly::Expected, std::runtime_error> +quic::Expected, std::runtime_error> BaseXskContainer::createXskSender( int queueId, const XskSenderConfig& xskSenderConfig) { @@ -24,12 +24,12 @@ BaseXskContainer::createXskSender( auto initResult = xskSender->init(); if (initResult.hasError()) { - return folly::makeUnexpected(initResult.error()); + return quic::make_unexpected(initResult.error()); } auto bindResult = xskSender->bind(queueId); if (bindResult.hasError()) { - return folly::makeUnexpected(bindResult.error()); + return quic::make_unexpected(bindResult.error()); } return xskSender; diff --git a/quic/xsk/BaseXskContainer.h b/quic/xsk/BaseXskContainer.h index b60fb1ea1..a7a959766 100644 --- a/quic/xsk/BaseXskContainer.h +++ b/quic/xsk/BaseXskContainer.h @@ -31,7 +31,7 @@ class BaseXskContainer { virtual ~BaseXskContainer() = default; - virtual folly::Expected init( + virtual quic::Expected init( const XskContainerConfig& xskContainerConfig) = 0; virtual XskSender* pickXsk( @@ -39,7 +39,7 @@ class BaseXskContainer { const folly::SocketAddress& dst) = 0; protected: - folly::Expected, std::runtime_error> + quic::Expected, std::runtime_error> createXskSender(int queueId, const XskSenderConfig& xskSenderConfig); void initializeQueueParams(const std::string& interfaceName); diff --git a/quic/xsk/HashingXskContainer.cpp b/quic/xsk/HashingXskContainer.cpp index 26f9cb200..efdad869d 100644 --- a/quic/xsk/HashingXskContainer.cpp +++ b/quic/xsk/HashingXskContainer.cpp @@ -11,7 +11,7 @@ namespace facebook::xdpsocket { -folly::Expected HashingXskContainer::init( +quic::Expected HashingXskContainer::init( const XskContainerConfig& xskContainerConfig) { initializeQueueParams(xskContainerConfig.interfaceName); for (uint32_t queueId = startQueue_; queueId < startQueue_ + numQueues_; @@ -32,12 +32,12 @@ folly::Expected HashingXskContainer::init( if (createResult.hasError()) { // TODO: Clean up the already-created XDP sockets if we fail at this // point. - return folly::makeUnexpected(createResult.error()); + return quic::make_unexpected(createResult.error()); } else { queueIdToXsk_.emplace(queueId, std::move(createResult.value())); } } - return folly::Unit(); + return {}; } XskSender* HashingXskContainer::pickXsk( diff --git a/quic/xsk/HashingXskContainer.h b/quic/xsk/HashingXskContainer.h index 0e37fdee3..e1da77373 100644 --- a/quic/xsk/HashingXskContainer.h +++ b/quic/xsk/HashingXskContainer.h @@ -29,7 +29,7 @@ class HashingXskContainer : public BaseXskContainer { ~HashingXskContainer() override = default; - folly::Expected init( + quic::Expected init( const XskContainerConfig& xskContainerConfig) override; XskSender* pickXsk( diff --git a/quic/xsk/ThreadLocalXskContainer.cpp b/quic/xsk/ThreadLocalXskContainer.cpp index 23babcb5f..6a855d786 100644 --- a/quic/xsk/ThreadLocalXskContainer.cpp +++ b/quic/xsk/ThreadLocalXskContainer.cpp @@ -11,7 +11,7 @@ namespace facebook::xdpsocket { -folly::Expected ThreadLocalXskContainer::init( +quic::Expected ThreadLocalXskContainer::init( const XskContainerConfig& xskContainerConfig) { initializeQueueParams(xskContainerConfig.interfaceName); @@ -53,7 +53,7 @@ folly::Expected ThreadLocalXskContainer::init( socketId += groupSize; qid++; } - return folly::Unit(); + return {}; } XskSender* ThreadLocalXskContainer::pickXsk( diff --git a/quic/xsk/ThreadLocalXskContainer.h b/quic/xsk/ThreadLocalXskContainer.h index 6cb31835b..d560fdc15 100644 --- a/quic/xsk/ThreadLocalXskContainer.h +++ b/quic/xsk/ThreadLocalXskContainer.h @@ -23,7 +23,7 @@ class ThreadLocalXskContainer : public BaseXskContainer { ~ThreadLocalXskContainer() override = default; - folly::Expected init( + quic::Expected init( const XskContainerConfig& xskContainerConfig) override; XskSender* pickXsk( diff --git a/quic/xsk/XskSender.cpp b/quic/xsk/XskSender.cpp index 81315f331..047d67c3c 100644 --- a/quic/xsk/XskSender.cpp +++ b/quic/xsk/XskSender.cpp @@ -192,18 +192,18 @@ SendResult XskSender::writeUdpPacket( return writeUdpPacket(peer, src, data->data(), len); } -folly::Expected XskSender::init() { +quic::Expected XskSender::init() { auto xdpSocketInitResult = initXdpSocket(); if (xdpSocketInitResult.hasError()) { - return folly::makeUnexpected(xdpSocketInitResult.error()); + return quic::make_unexpected(xdpSocketInitResult.error()); } initAddresses(xskSenderConfig_.localMac, xskSenderConfig_.gatewayMac); - return folly::Unit(); + return {}; } -folly::Expected XskSender::bind(int queueId) { +quic::Expected XskSender::bind(int queueId) { int bind_result = 0; if (isPrimaryOwner()) { bind_result = bind_xsk( @@ -218,10 +218,10 @@ folly::Expected XskSender::bind(int queueId) { if (bind_result < 0) { std::string errorMsg = fmt::format("Failed to bind xdp socket: {}", folly::errnoStr(errno)); - return folly::makeUnexpected(std::runtime_error(errorMsg)); + return quic::make_unexpected(std::runtime_error(errorMsg)); } - return folly::Unit(); + return {}; } FlushResult XskSender::flush() { @@ -282,11 +282,11 @@ void XskSender::writeUdpPacketToBuffer( len + sizeof(udphdr)); } -folly::Expected XskSender::initXdpSocket() { +quic::Expected XskSender::initXdpSocket() { // Create xdp socket xskFd_ = create_xsk(); if (xskFd_ < 0) { - return folly::makeUnexpected( + return quic::make_unexpected( std::runtime_error("Failed to create xdp socket")); } @@ -304,7 +304,7 @@ folly::Expected XskSender::initXdpSocket() { } if (!umemArea_) { - return folly::makeUnexpected(std::runtime_error("Failed to create umem")); + return quic::make_unexpected(std::runtime_error("Failed to create umem")); } // The guard takes care of cleanup in case something goes wrong during @@ -326,14 +326,14 @@ folly::Expected XskSender::initXdpSocket() { int completion_ring_set_result = set_completion_ring(xskFd_, xskSenderConfig_.numFrames); if (completion_ring_set_result < 0) { - return folly::makeUnexpected( + return quic::make_unexpected( std::runtime_error("Failed to set completion ring")); } // Set fill ring int fill_ring_set_result = set_fill_ring(xskFd_); if (fill_ring_set_result < 0) { - return folly::makeUnexpected( + return quic::make_unexpected( std::runtime_error("Failed to set fill ring")); } } @@ -341,13 +341,13 @@ folly::Expected XskSender::initXdpSocket() { // Set tx ring int tx_ring_set_result = set_tx_ring(xskFd_, xskSenderConfig_.numFrames); if (tx_ring_set_result < 0) { - return folly::makeUnexpected(std::runtime_error("Failed to set tx ring")); + return quic::make_unexpected(std::runtime_error("Failed to set tx ring")); } // Get mmap offsets int xsk_map_offsets_get_result = xsk_get_mmap_offsets(xskFd_, &xskOffsets_); if (xsk_map_offsets_get_result < 0) { - return folly::makeUnexpected( + return quic::make_unexpected( std::runtime_error("Failed to get mmap offsets")); } @@ -361,18 +361,18 @@ folly::Expected XskSender::initXdpSocket() { } if (!cxMap_) { - return folly::makeUnexpected( + return quic::make_unexpected( std::runtime_error("Failed to map completion ring")); } // Map tx ring txMap_ = map_tx_ring(xskFd_, &xskOffsets_, xskSenderConfig_.numFrames); if (!txMap_) { - return folly::makeUnexpected(std::runtime_error("Failed to map tx ring")); + return quic::make_unexpected(std::runtime_error("Failed to map tx ring")); } g.dismiss(); - return folly::Unit(); + return {}; } void XskSender::initAddresses( diff --git a/quic/xsk/XskSender.h b/quic/xsk/XskSender.h index 5ec1eee32..d6ee1b54c 100644 --- a/quic/xsk/XskSender.h +++ b/quic/xsk/XskSender.h @@ -9,7 +9,6 @@ #if defined(__linux__) && !defined(ANDROID) -#include #include #include #include @@ -18,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -135,9 +135,9 @@ class XskSender { std::unique_ptr& data, uint16_t len); - folly::Expected init(); + quic::Expected init(); - folly::Expected bind(int queueId); + quic::Expected bind(int queueId); FlushResult flush(); @@ -159,7 +159,7 @@ class XskSender { const void* data, uint16_t len); - folly::Expected initXdpSocket(); + quic::Expected initXdpSocket(); xdp_desc* getTxDescriptor();