1
0
mirror of https://github.com/facebookincubator/mvfst.git synced 2025-11-25 15:43:13 +03:00
Commit Graph

51 Commits

Author SHA1 Message Date
Xiaoting Tang
03e3bb6547 make largestAckedByPeer and largestSent optional
Summary: 0 is now a valid packet number, so we should make these optional. In cases where they are needed to construct packet builder, it should be safe to use 0 as default since it's only used for computing `twiceDistance` in PacketNumber.cpp.

Reviewed By: yangchi

Differential Revision: D21948454

fbshipit-source-id: af9fdc3e28ff85f1594296c4d436f24685a0acd6
2020-06-10 10:30:10 -07:00
Yang Chi
69a9e94252 StatelessReset parsing fix
Summary:
(1) Only read out the token if the parsing host is a client and the
token matches client's token
(2) More fallbacks to Stateless reset when parsing short header packet. The
only exception would be when we don't have 1-rtt cipher.

Reviewed By: mjoras

Differential Revision: D21868631

fbshipit-source-id: 159edf7ab21061ddd5a5ef17f6b18209c3de24e7
2020-06-03 17:44:58 -07:00
Yang Chi
cd7339e454 Give caller some control over if writeStreamFrameHeader should write length
Summary:
Becuase when we clone an existing packet, the logic inside the current
writetStreamFrameHeader is no longer correct.

Reviewed By: mjoras

Differential Revision: D21383828

fbshipit-source-id: 8e6bbb048eefd97ca7cf17b89edc2f395f274a73
2020-05-07 10:56:26 -07:00
Yang Chi
2a1529068d Move Quic packet header encoding out of builder constructor
Summary:
Currently the packet builder contructor will encode the packet
builder. This is fine when the builder creates its own output buffer. If later
on we decides not to use this builder, or it fails to build packet, the buffer
will be thrown away. But once the builder uses a buffer provided by caller, and
will be reused, we can no longer just throw it away if we decide not to use
this builder. So we have to delay the header encoding until we know we will use
the builder.

This is still not enough to solve the case where we want to use this builder,
it builds, then it fails . For that, we will need to retreat the tail position
of the IOBuf.

Reviewed By: mjoras

Differential Revision: D21000658

fbshipit-source-id: 4d758b3e260463b17c870618ba68bd4b898a7d4c
2020-04-28 22:14:21 -07:00
Matt Joras
524bf84c44 Implement an explicit inplace encrypt in Aead.
Summary: This is useful when you want to ensure that the IOBuf you pass in is encrypted inplace, as opposed to potentially creating a new one.

Reviewed By: yangchi

Differential Revision: D21135253

fbshipit-source-id: 89b6e718fc8da1324685c390c721a564bb77d01d
2020-04-21 21:43:59 -07:00
Yang Chi
726da8cbf7 Use BufQueue for Quic crypto frame writing as well
Summary:
Other frames have been using the BufQueue version of frame writing.
Change this for Crypto streams as well

Reviewed By: mjoras

Differential Revision: D20947921

fbshipit-source-id: 1cfa0f3806e8d74e8c8a4864498e1c06b55d5292
2020-04-10 09:16:16 -07:00
Yang Chi
826031a8f2 New Quic packet builder that builds into user provided IOBuf
Summary:
As title.

For now the buildPacket() api will still build out separate IOBufs for header and body even though they are just two separate IOBuf wrapping continuous memory. This is so that API in other layers don't have to change for now, and I can reuse all the existing packet builder unit tests for the new builder.

Reviewed By: mjoras

Differential Revision: D20781977

fbshipit-source-id: 64e5ed9fbcff102ca20d3730511b02e6e7426b40
2020-04-07 08:46:14 -07:00
Matt Joras
2b3b76cc4d Remove support for MVFST_OLD.
Summary:
This eliminatees some tech debt by completely removing the notion of version from the core transport parameters structure and the app token for zero rtt.

Note that for the draft-27 changes we will need to temporarily re-introduce it, but to a different layer (the extension encoding itself).

Reviewed By: JunqiWang

Differential Revision: D20073578

fbshipit-source-id: 2b55af621566bf1c20e21dd17251116de1788fa0
2020-02-28 09:52:34 -08:00
Matt Joras
6827637d45 Use NiceMock in more tests
Summary: When we don't use NiceMock we end up with a ton of spam in failing tests for every callback that we didn't EXPECT. This makes failed test output extremely noisy.

Reviewed By: sharmafb

Differential Revision: D19977113

fbshipit-source-id: 1a083fba13308cd3f2859da364c8106e349775bb
2020-02-19 21:46:46 -08:00
Yang Chi
5f51f4436f Exception-free Quic ConnIdAlgo
Summary: no more surprises in upper layer

Reviewed By: mjoras

Differential Revision: D19976510

fbshipit-source-id: 3487e9aa2cb28d7bc748f13bc2bbc393216b4a8a
2020-02-19 15:54:11 -08:00
Luca Niccolini
90f0aa9665 add advertisedInitialMaxStreamsBidi and advertisedInitialMaxStreamsUni to transport params
Reviewed By: JunqiWang

Differential Revision: D19718461

fbshipit-source-id: 2a51f8e6c88663deb3a0d85402b53a9e3c1ffe61
2020-02-04 09:24:34 -08:00
Matt Joras
46e9228420 Use inplace encryption from fizz.
Summary:
The fizz `encrypt` API will opportunistically use inplace encryption if the `IOBuf` you pass it is correctly sized. If it is not it will manually create the output buffer.

It turns out doing inplace versus encrypting with a given target output is a bit faster in microbenchmarks, and it will also allow experimenting with caching `IOBuf`s on the send path.

Reviewed By: knekritz

Differential Revision: D19506291

fbshipit-source-id: 3ef41290538ceac34a344114badbd167e2c25a50
2020-01-29 15:07:26 -08:00
Matt Joras
431acc838f Optimize ACK frame writing
Summary:
Previously we stored an `IntervalSet` in each `WriteAckFrame`. We don't need to do this, as by the time we are writing an `ACK` the `IntervalSet` is complete. Instead of bothering with the `IntervalSet` operations, we can simply serialize it to a reverse-sorted `vector.`

Additionally this has some micro-optimizations for filling the ACK frame, with a new function for getting varint size.

Reviewed By: yangchi

Differential Revision: D19397728

fbshipit-source-id: ba6958fb36a4681edaa8394b1bcbbec3472e177d
2020-01-16 10:40:40 -08:00
Udip Pant
74f98d4604 Move the fizz code into its own package
Summary:
This moves the fizz specific part of the handshake into its own folder and library.

There is a bit of smurf naming going on as a result, not sure it is worth fixing or not at this stage. Maybe this code should be a in namespace named quic::fizz .

This should be doable with the client as well as soon as the key cache situation is figured out.
 ---
## Proxygen Canary

Reviewed By: yangchi

Differential Revision: D19290919

fbshipit-source-id: 48d7f7c70db42c65f7dffe3256805c268a481198
2020-01-09 20:59:54 -08:00
Samuel Miller
f2dc903e30 Removing state param to ticket decrypt calls
Summary: We'd like to remove this param from our decrypt() api, as it's no longer needed.

Reviewed By: reanimus

Differential Revision: D18855369

fbshipit-source-id: cfe5b3d847918a9ef4a4834df716b79baf0e804a
2020-01-06 15:45:27 -08:00
Yang Chi
d7d19c74b5 Stop tracking pure ack packets in Quic
Summary:
Previously we track them since we thought we can get some additional
RTT samples. But these are bad RTT samples since peer can delays the acking of
pure acks. Now we no longer trust such RTT samples, there is no reason to keep
tracking pure ack packets.

Reviewed By: mjoras

Differential Revision: D18946081

fbshipit-source-id: 0a92d88e709edf8475d67791ba064c3e8b7f627a
2019-12-12 13:20:09 -08:00
Matt Joras
f041ec17ef Use folly::small_vector for ack blocks
Summary: By modifying `IntervalSet` a bit we can make it so it takes a `folly::small_vector` as the container. We expect that for real traffic there will not generally be a lot of ACK blocks per frame, so optimize for that.

Reviewed By: siyengar

Differential Revision: D18919975

fbshipit-source-id: 199a2ea9ba5003382e2d7d99fc7a6de7e8aafdca
2019-12-12 12:06:31 -08:00
Subodh Iyengar
e524c0c069 iobufqueue diediedie
Summary:
Don't use IOBufQueue for most operations in mvfst and use BufQueue instead. Since BufQueue did not support a splitAtMost, added it in instead.

The only place that we still use IOBufQueue is in crypto because fizz still requires it

Reviewed By: mjoras

Differential Revision: D18846960

fbshipit-source-id: 4320b7f8614f8d2c75f6de0e6b786d33650e9656
2019-12-06 12:06:44 -08:00
Amaury Séchet
fd48df2e6b Ressurect QuicFizzFactory (#70)
Summary:
Now that we actually have a place to put it.
Pull Request resolved: https://github.com/facebookincubator/mvfst/pull/70

Test Plan:
Imported from GitHub, without a `Test Plan:` line.

 ---
## Proxygen Canary
Traffic Canary: https://our.intern.facebook.com/intern/traffic/canary?fbid=150012342925497
* elb.prod.bog1c01 - binary - 2019-11-25 14:44 - https://fburl.com/dyndash/e0a7ztjh
* flb.prod.fbed1c02 - binary - 2019-11-25 14:44 - https://fburl.com/dyndash/un5zlmj3
* olb.prod.rpnb0c01 - binary - 2019-11-25 14:44 - https://fburl.com/dyndash/ixxpou7h
* slb.prod_regional.rodn0c00 - binary - 2019-11-25 14:44 - https://fburl.com/dyndash/858m1x46
* slb.regional.ratn0c01 - binary - 2019-11-25 14:44 - https://fburl.com/dyndash/pqemf15m
 ---

Reviewed By: sharma95

Differential Revision: D18619927

Pulled By: mjoras

fbshipit-source-id: 6ef07db48ec91dad6571f383c9dbea28c3cdb951
2019-11-26 03:42:19 -08:00
Aman Sharma
69ac8aeb62 De-templatize stream state machine logic
Summary: The state machine logic is quite abstruse, this modifies it to make it more readable.

Reviewed By: siyengar

Differential Revision: D18488301

fbshipit-source-id: c6fd52973880931e34904713e8b147f56d0c4629
2019-11-19 20:18:11 -08:00
Yang Chi
dee913eabe Seperate data structure to carry acked packets info instead
Summary:
stop carrying OutstandingPacket around for congestion controller
states updating since OutstandingPackets also contains all the sent frames.

Reviewed By: siyengar

Differential Revision: D17914261

fbshipit-source-id: dd16934393bce5cb7be3bae2371e06cbb18e7f4a
2019-10-18 15:54:25 -07:00
Yang Chi
c9933dbb6a add largest acked packet sent time and appLimited into Quic AckEvent
Summary:
Bug fix. Since we changed the iteration order of ack processing to be
in reverse order of packet numbers, there has been a bug and both BBR and Cubic
has been using the earliest acked packet instead of the largest acked packet as
the largest acked packet.

Reviewed By: mjoras

Differential Revision: D17909490

fbshipit-source-id: 15310aad53b4a9e5190ed65c3b2df496db77b1ae
2019-10-16 10:48:40 -07:00
Subodh Iyengar
8ad7d05693 use custom variant type for errors
Summary: Use the custom variant type for errors.

Reviewed By: yangchi

Differential Revision: D17826935

fbshipit-source-id: 2bf0c3e1cc8ca84b504d201fd6c2a4266878b715
2019-10-09 22:37:40 -07:00
Amaury Séchet
a0ebc3995b Fusion QuicFizzFactory into FizzCryptoFactory (#44)
Summary:
They are strongly coupled, which indicate this is probably better to do it as one class.
Pull Request resolved: https://github.com/facebookincubator/mvfst/pull/44

Reviewed By: mjoras

Differential Revision: D17590918

Pulled By: yangchi

fbshipit-source-id: 2eaca079fd760107eefd2b74fa612d7a0c8b3001
2019-10-08 22:17:02 -07:00
Subodh Iyengar
68c332acb1 Use custom variant type for write frames
Summary:
Use the custom variant type for write frames as well, now that
we use them for read frames.

Reviewed By: mjoras

Differential Revision: D17776862

fbshipit-source-id: 47093146d0f1565c22e5393ed012c70e2e23d279
2019-10-07 22:43:31 -07:00
Yang Chi
405dde4fde Handling Acks in descending order of the packet number
Summary:
We erase packets from outstandingPackets list during ack handling.
Currently we handle acks in ascending order of the acked packet number, then
erase() the acked packet. Each erase() call only erase one packet, and it can
potentally make std::deque to move a few elements following the erased one.

This diff changes it to handle acks in descending order, and also erase acked
packets in continuous groups. This reduces erase() calls, and also reduces the
possibility that std::deque needs to move following elements in the erase().

Reviewed By: mjoras

Differential Revision: D17579683

fbshipit-source-id: 8bc11f6a7875beb70dc46c497857ab694df7b6a5
2019-10-07 16:44:43 -07:00
Samuel Miller
36043b390e Adding const State* arg to TicketCipher->decrypt()
Summary: Having access to the state when decrypting tickets gives us more control over ticket acceptance policies.

Reviewed By: knekritz

Differential Revision: D17528945

fbshipit-source-id: a3cb3d4c0917f2494f5669f283cda70776b608c6
2019-10-02 13:00:47 -07:00
Subodh Iyengar
04baa15a04 Custom variant type for packetheader
Summary:
Make a custom variant type for PacketHeader. By not relying on boost::variant
this reduces the code size of the implementation.

This uses a combination of a union type as well as a enum type to emulate a variant

Reviewed By: yangchi

Differential Revision: D17187589

fbshipit-source-id: 00c2b9b8dd3f3e73af766d84888b13b9d867165a
2019-09-19 17:31:47 -07:00
Matt Joras
049b512646 Write stream frame header and data separately.
Summary:
Prior to this diff we would clone out an entire flow control's worth of data from the writebuffer and then clone out a smaller portion of that to write into the packet builder. This is extremely wasteful when we have a large flow control window.

Additionally we would always write the stream data length field even when we are going to fill the remainder of the packet with the current stream frame. By first calculating the amount of data that needs to can be written and writing the header, we can now omit the data length field when we can fill the whole packet.

Reviewed By: yangchi

Differential Revision: D15769514

fbshipit-source-id: 95ac74eebcde87dd06de54405d7f69c42362e29c
2019-08-22 15:59:41 -07:00
Amaury Séchet
cbd77a3603 Extend CryptoFactory with makePacketNumberCipher (#40)
Summary:
The CryptoFactory is extended with makePacketNumberCipher . In order to support that feature, FizzCryptoFactory now explicitly takes a QuicFizzFactory as argument instead of a generic fizz::Factory, which is the only type that is used in practice anyways.

The cypher argument was removed because:
1/ Only one cypher is used at all. Fizz also supports ChaCha20, but using it in mvfst will throw an exception.
2/ it seems like the factory should know what cypher it is dealing with.

If a choice of cypher needs to be supported going forward, it can be done by adding state to FizzCryptoFactory.
Pull Request resolved: https://github.com/facebookincubator/mvfst/pull/40

Reviewed By: mjoras

Differential Revision: D16785274

Pulled By: yangchi

fbshipit-source-id: a1c490e34c5ddd107e8e068d8b127c1ed00a59ec
2019-08-16 08:52:43 -07:00
Amaury Séchet
8a927b4655 Cleanup support to create mock of fizz:Aead as it is not required anymore. (#39)
Summary:
After https://github.com/facebookincubator/mvfst/issues/35 , the facility to mock fizz::Aead is not required anymore. Either the test depends on fizz's behavior, in which case a mock was never appropriate, or it doesn, in which case a quic::Aead is more appropriate.
Pull Request resolved: https://github.com/facebookincubator/mvfst/pull/39

Reviewed By: mjoras

Differential Revision: D16785265

Pulled By: yangchi

fbshipit-source-id: ba74155ab7e8ed1c261c58569db0690781d85fe1
2019-08-16 08:52:43 -07:00
Amaury Séchet
dade592442 Remove warning in TestUtils.cpp by telling the compiler that some code is unrecheable.
Summary: Pull Request resolved: https://github.com/facebookincubator/mvfst/pull/37

Reviewed By: yangchi

Differential Revision: D16729459

Pulled By: lnicco

fbshipit-source-id: dd031d1798b8aa700fc9ed73ff5e90e77f99ff7f
2019-08-09 07:51:13 -07:00
Bonnie Xu
3203074c41 Reduce number of padding frames
Summary: Reduce the number of padding frames that are generated, to decrease overall qlog size.

Reviewed By: sharma95

Differential Revision: D16533449

fbshipit-source-id: 68f9c48e265576bff098dfeee87e576e86a32330
2019-07-29 10:16:30 -07:00
Matt Joras
2f528e68c0 Draft-22 invariants change
Summary:
Draft-22 onwards uses two one byte length fields to encode connection ID length instead of one one byte length field.

To support this without disrupting existing clients we need to make our parsing version dependent. This diff accomplishes it by special casing the existing Facebook client QUIC version (0xfaceb000), and changing the default Facebook client version going forward to 0xfaceb001.

Note that this diff also changes the behavior of the ticket transport parameters. When we changed from draft-18 to draft-19 transport parameters I apparently forgot to update the ticket transport parameters to the new format.

Reviewed By: yangchi

Differential Revision: D16205090

fbshipit-source-id: e74a92fa959d308f4bb43bad76e58d4b58d07322
2019-07-16 17:59:58 -07:00
Bonnie Xu
ff1c36c25a Added ConnectionClose event to Quic
Summary: Added ConnectionClose event to Quic.

Reviewed By: sharma95

Differential Revision: D16097522

fbshipit-source-id: c46d63ac75246ad93a3c617383f1b9a26d0e0b4f
2019-07-12 07:05:40 -07:00
Yang Chi
7548623843 Rename generate.*Packet.* functions in Quic test utils to create.*Packet.*
Summary:
There is already a createPacket util function in this file. Rename the
newly added generate* functions to make this consistent

Reviewed By: sharma95

Differential Revision: D15948954

fbshipit-source-id: 67e7addefc839226b98d81a3808d37519ce001af
2019-06-21 17:34:51 -07:00
Amaury Séchet
d83cfb6c30 Decouple fizz::Aead and quic::Aead . This makes a large chunk of the codebase fizz agnostic. (#16)
Summary:
This is based on top of https://github.com/facebookincubator/mvfst/issues/15 .

Now that the codebase have been refactored to use Aead/fizz:Aead and MockAead/fizz::test::MockAead in proper places, it is time to ensures the aren't aliases of each others anymore.

This introduces FizzAead as a wrapper for fizz::Aead that implements quic::Aead and forward all calls. Most of the codebase now uses quic::Aead, which a significant step toward being able to swap it for another implementation.
Pull Request resolved: https://github.com/facebookincubator/mvfst/pull/16

Reviewed By: yangchi

Differential Revision: D15474068

Pulled By: mjoras

fbshipit-source-id: 7cccc9909a45ea538409645644641e39a58bf81d
2019-06-18 16:29:29 -07:00
Bonnie Xu
141dffce6a Fix QLogger test
Summary:
Fixed failing QLogger test.

Addresses reports https://our.intern.facebook.com/intern/test/281474989481205?ref_report_id=1876540 and https://our.intern.facebook.com/intern/test/844424942913490?ref_report_id=1876793.

Reviewed By: mjoras

Differential Revision: D15877059

fbshipit-source-id: e071d4ce7f70ffbd0d021f4f0e3edca7bcc51228
2019-06-18 13:44:43 -07:00
Bonnie Xu
805029b648 Added functionality to construct toDynamic objects
Summary: Converting stored QLog events into a toDynamic object that aligns with QLog format.

Reviewed By: sharma95

Differential Revision: D15725495

fbshipit-source-id: 0721a2d6858cfd99e191e3dfdc5f25f544106c86
2019-06-17 19:29:43 -07:00
Bonnie Xu
1affb7e49d Interface for QLogger
Summary:
Interface for QLogger:
- Takes in a Quic packet (`VersionNegotiation`, `RegularQuicWritePacket`, `RegularQuicPacket`)
- Stores it in QLogger
  - each packet is an event
  - each frame becomes a log

Reviewed By: sharma95

Differential Revision: D15581299

fbshipit-source-id: dedf933f47e2e8769109aa1e45ff38c2bf013714
2019-06-14 11:48:34 -07:00
Bonnie Xu
2762cc1597 Setup stateless reset token
Summary: Replace hard coded stateless reset token with a token from the stateless reset token generator.

Reviewed By: yangchi

Differential Revision: D15481858

fbshipit-source-id: 30c96843c38c616600466b2fabb6defd5fcc5799
2019-06-13 08:44:53 -07:00
Alex Guzman
63d8271b4d Expire cached PSKs when initial handshake is stale
Summary: After a given amount of time, discards PSKs whose handshakes are too old.

Reviewed By: knekritz

Differential Revision: D14174662

fbshipit-source-id: ef505af91732c1030c6ce27835db49cf07d9c506
2019-06-10 13:56:00 -07:00
Yang Chi
bdd52cf52f change Quic congestion controller end of recovery to a time target
Summary:
given packet number space has been split to 3 spaces, using a single
PacketNum isn't enough to serve the end of recovery tracking. Instead, use a
TimePoint value.

Reviewed By: sharma95

Differential Revision: D15219240

fbshipit-source-id: baf05828279789eb0aa170b49a177510ea07836f
2019-05-31 15:41:05 -07:00
Amaury Séchet
d6c88ab4b0 Decouple fizz:test::MockAead from MockAead. Use the former for code that actually needs fizz. (#15)
Summary:
This is based on top of #12 .

It logically split MockAead and fizz::MockAead in preparation for separation of the two.
Pull Request resolved: https://github.com/facebookincubator/mvfst/pull/15

Reviewed By: yangchi

Differential Revision: D15474045

Pulled By: mjoras

fbshipit-source-id: b61a5cb08ddae0add66a6c37e156eddaef118e0c
2019-05-30 09:16:07 -07:00
Amaury Séchet
f26cd1f62d Add a bridge to fizz::Aead (#12)
Summary:
This introduce quic::Aead as a simple typedef to fizz::Aead and update the codebase to use quic::Aead . This should not impact the functionality of the code in any way.

This is a first step toward introducing an interface that is specific for mvfst so that mvfst can swap fizz for something else.
Pull Request resolved: https://github.com/facebookincubator/mvfst/pull/12

Reviewed By: JunqiWang

Differential Revision: D15335324

Pulled By: mjoras

fbshipit-source-id: fef166a9a5c2cbae08ad9511d0abd749f330c221
2019-05-29 11:54:08 -07:00
Bonnie Xu
f4ae0a1efd Updated files to change syntax.
Summary: Changed existing chrono syntax to chrono_literals syntax.

Reviewed By: mjoras, sharma95

Differential Revision: D15374649

fbshipit-source-id: 40033e90cca226266ef85e4fec629f290bc5dae6
2019-05-20 12:10:46 -07:00
Junqi Wang
d20ea53ec1 Update quic psk cache to d-20
Summary:
Fixed QuicClientTransportIntegrationTest:
SetUp() shouldn't set maxStreams manually. Instead, client should read serverTransportParams after 1 rtt.
The tests used to call createBidiStream right after client->start(), changed that to only sending data after onTransportReady.

Reviewed By: mjoras

Differential Revision: D15293209

fbshipit-source-id: 88e739d72f1fad76666af003d446d068e6d5fac7
2019-05-10 16:19:43 -07:00
Junqi Wang
92b8876ebf Update 0-rtt ticket transport params to d-20
Reviewed By: mjoras

Differential Revision: D15293208

fbshipit-source-id: 4ea5bf6c2c335a5c034341086f9348451bed827e
2019-05-10 16:19:43 -07:00
Alan Frindell
90e5e1b3f1 Split stream state machine into send and receive state machines
Summary: This is step 1 for removing reset on reset, since the send side may need to transition to waiting for a reset ack while the read side is an any state.

Reviewed By: lnicco

Differential Revision: D15075849

fbshipit-source-id: 1e094942a8a1ca9a01d4161cd6309b4136a9cfbf
2019-05-06 14:05:31 -07:00
udippant
79032c7b9b fbshipit-source-id: f498ac5e677b2931d937ba78edd4373ba04dca2a 2019-04-25 21:33:43 -07:00