1
0
mirror of https://github.com/facebookincubator/mvfst.git synced 2025-11-24 04:01:07 +03:00
Commit Graph

66 Commits

Author SHA1 Message Date
Joseph Beshay
b45c82b884 ACK_EXTENDED frame support
Summary:
This introduces a new frame type for acks (ACK_EXTENDED) that can carry optional fields depending on the features supported by the peer. The currently supported features set will include ECN count fields, and Receive Timstamp fields. This enables a quic connection to report both ECN counts and receive timestamps, which is not possible otherwise because they use different frame types.

Support for the extended ack as well as the set of features that can be included in it is negotiated through a new transport parameter (extended_ack_supported = 0xff0a004). Its value indicates which features are supported by the local transport. The value is an integer which is evaluated against the following bitmasks:
```
  ECN_COUNTS = 0x01,
  RECEIVE_TIMESTAMPS = 0x02,
```

This diff introduces the transport parameter and negotiates the supported features between the peers of the connection. The parameter is cached in the psk cache so the client can remember the server config. It is also encoded inside the 0-rtt ticket so the server can reject it if its local config has changed.

The following diffs add reading and writing the frame itself.

The ACK_EXTENDED frame itself will have the following format
```
ACK_EXTENDED Frame {
  Type (i) = 0xB1
  // Fields of the existing ACK (type=0x02) frame:
  Largest Acknowledged (i),
  ACK Delay (i),
  ACK Range Count (i),
  First ACK Range (i),
  ACK Range (..) ...,
  Extended Ack Features (i),
  // Optional ECN counts (if bit 0 is set in Features)
  [ECN Counts (..)],
  // Optional Receive Timestamps (if bit 1 is set in Features)
  [Receive Timestamps (..)]
}

// Fields from the existing ACK_ECN frame
ECN Counts {
  ECT0 Count (i),
  ECT1 Count (i),
  ECN-CE Count (i),
}

// Fields from the existing ACK_RECEIVE_TIMESTAMPS frame
Receive Timestamps {
  Timestamp Range Count (i),
  Timestamp Ranges (..) ...,
}

Timestamp Range {
  Gap (i),
  Timestamp Delta Count (i),
  Timestamp Delta (i) ...,
}
```

Reviewed By: sharmafb

Differential Revision: D68931151

fbshipit-source-id: 44c8c83d2f434abca97c4e85f0fa7502736cddc1
2025-02-24 12:32:50 -08:00
Aman Sharma
568f19c17d Add reliable reset functionality to QuicWriteCodec
Summary: In this diff, I'm writing functionality to enable us to write RESET_STREAM_AT frames. You can find the format of the RST_STREAM_AT frame in the [RFC](https://datatracker.ietf.org/doc/html/draft-ietf-quic-reliable-stream-reset-06#name-reset_stream_at-frame).

Reviewed By: jbeshay

Differential Revision: D64907958

fbshipit-source-id: 55e82278ebd0649dc33c82b472be80893af02509
2024-11-18 13:06:34 -08:00
Matt Joras
65bc1417f3 Add alpn to transport summary event
Summary: As in title, useful.

Reviewed By: kvtsoy

Differential Revision: D65508296

fbshipit-source-id: f068611399797df4dd422828373b1ddbbceec7df
2024-11-05 18:12:45 -08:00
Riten Gupta
5f74df10b6 Add network path model update events to qlog
Summary: Several "Network Path Model" parameters are described in Sec. 2.9 of the BBRv2 IETF draft. These quantities evolve throughout the connection and they are useful to analyze BBRv2 performance. This diff adds inflight_hi, inflight_lo, bandwidth_hi, and bandwidth_lo to the qlog.

Reviewed By: mjoras

Differential Revision: D61414936

fbshipit-source-id: 2862db2a6aab336fd8a60e4ae5b358e9ab5588b4
2024-08-26 14:07:23 -07:00
Matt Joras
aefc9e369b Introduce quic::Optional
Summary:
The idea here is to make it so we can swap out the type we are using for optionality. In the near term we are going to try swapping towards one that more aggressively tries to save size.

For now there is no functional change and this is just a big aliasing diff.

Reviewed By: sharmafb

Differential Revision: D57633896

fbshipit-source-id: 6eae5953d47395b390016e59cf9d639f3b6c8cfe
2024-06-11 11:02:02 -07:00
Joseph Beshay
1ad1b0789b Add new qlog type for l4s weight updates
Summary:
This helps with tuning l4s reaction in Cubic and debugging l4s in general.

To avoid spamming the qlog, an l4s weights update is only logged if new CE marks are echoed from the peer.

Reviewed By: sharmafb

Differential Revision: D57874704

fbshipit-source-id: 9c3f139aec73fc0dbd8d38e2237d6a6478cf1e3d
2024-05-29 19:17:38 -07:00
Joseph Beshay
f0924b01a6 Fix typo in qlog bandwidth estimate type
Summary: This is not used in the parsing tools so should not have side effects. Also changed to lower case for consistency.

Reviewed By: kvtsoy

Differential Revision: D57797450

fbshipit-source-id: cd129a93f48ad2ec146cddd88ec024ce1b581bee
2024-05-28 14:53:32 -07:00
Joseph Beshay
9f5d8c333a Read/write ECN counts in ACK_ECN frame
Summary:
Read echoed ECN counts from incoming ACK_ECN frames.
Write ECN counts from AckState into outgoing ACK_ECN frames.

This also logs both the ECN counts in the read/writter packets in qlog.

Reviewed By: kvtsoy

Differential Revision: D54967248

fbshipit-source-id: 68b910865515271abfd1fa61fc43ce1cb12f30a7
2024-05-15 11:51:15 -07:00
Ilango Purushothaman
65f550c86b Record all Ack Receive timestamps in qlog
Summary: For Congestion Detection work, there is a need to record all received timestamps from the `ACK_RECEIVE_TIMESTAMPS` frame. Previously, only the first and last timestamp deltas were logged.

Reviewed By: jbeshay

Differential Revision: D45295321

fbshipit-source-id: b493f31564394c4376c30f0c46eed2c7b591490a
2023-04-26 12:23:48 -07:00
Sharad Jaiswal (Eng)
b605e9b689 QLog changes to support ack receive timestamps
Summary: Add additional ACK_RECEIVE_TIMESTAMP fields in Read and Write AckFrame logs.

Reviewed By: bschlinker

Differential Revision: D37799091

fbshipit-source-id: fb1d6fbe9b3bcb5c0f8f8786a787730eaa699d1c
2022-11-16 18:18:26 -08:00
Joseph Beshay
abee1d8387 Add IMMEDIATE_ACK frame
Summary: Add the new IMMEDIATE_ACK frame from the ack frequency draft.

Reviewed By: mjoras

Differential Revision: D38523438

fbshipit-source-id: 79f4a26160ccf4333fb79897ab4ace2ed262fa01
2022-08-24 11:11:33 -07:00
Joseph Beshay
1e594fe1ba Update ACK_FREQUENCY frame
Summary:
- Use varint reordering threshold (this is still being discussed, using varint until a decision is made)
- Track server's minAckDelay on client
- Track ack frequency frame sequence number
- Improve frame parsing error logs
- Add some unit tests

Reviewed By: hanidamlaj

Differential Revision: D38289108

fbshipit-source-id: 274e45115022ffd4e15b60dc57f77f1cce69bd82
2022-08-24 11:11:33 -07:00
Hani Damlaj
00e67c1bf9 mvfst License Header Update
Reviewed By: lnicco

Differential Revision: D33587012

fbshipit-source-id: 972eb440f0156c9c04aa6e8787561b18295c1a97
2022-01-18 13:56:12 -08:00
Hani Damlaj
2660a288b3 Update Company Name
Summary: - as title

Reviewed By: lnicco

Differential Revision: D33513410

fbshipit-source-id: 282b6f512cf83b9abb7990402661135b658f7bd1
2022-01-13 12:07:48 -08:00
Joseph Beshay
a73eade468 Add more fields to Qlog Transport Summary to track spurious retransmissions
Summary:
Add three new fields to the qlog transport summary to help analyze spurious transmissions and how they are affected by using adaptive loss thresholds.

Sample transport summary with added fields:
```
          "transport_summary",
          {
            "current_conn_flow_control": 1068498609,
            "current_writable_bytes": 106330,
            "dsr_packet_count": 0,
            "final_packet_loss_reordering_threshold": 77,
            "final_packet_loss_time_reordering_threshold_dividend": 29,
            "quic_version": 4207849474,
            "sum_cur_stream_buffer_len": 0,
            "sum_cur_write_offset": 5243215,
            "sum_max_observed_offset": 67,
            "total_bytes_cloned": 0,
            "total_bytes_recvd": 38157,
            "total_bytes_retransmitted": 244982,
            "total_bytes_sent": 5605121,
            "total_crypto_data_recvd": 342,
            "total_crypto_data_written": 1548,
            "total_packets_spuriously_marked_lost": 203,
            "total_stream_bytes_cloned": 0,
            "used_zero_rtt": false
          }
```

Reviewed By: afrind, mjoras

Differential Revision: D33354583

fbshipit-source-id: 55d9880ef02f6914b74c1b6508863bea7807950b
2022-01-07 18:42:12 -08:00
Hani Damlaj
7233c55d29 Issue NewTokenFrame To Clients
Summary:
- Issuing NewTokenFrames to clients, allowing them to verify their address in subsequent connections by including the token.
- add NewTokenFrame struct in the union type QuicSimpleFrame.
- Issued only once when the crypto handshake is complete.
- Testing includes validating token serialization & deserialization and asserting that the NewTokenFrame is only issued once on handshake completeness.

Reviewed By: mjoras

Differential Revision: D31673160

fbshipit-source-id: 9401ab1a4b878d8b4380d55afa531ec768f5f4cd
2021-12-10 20:35:49 -08:00
Luca Niccolini
15e53cbac3 add QLOG event for datagram frames
Summary: continuing to add stats and logs for datagrams

Reviewed By: mjoras

Differential Revision: D32713505

fbshipit-source-id: d7b589a048b3872aa4ed2159fe7bc04b3327054c
2021-12-02 10:34:53 -08:00
Matt Joras
40cc0ca93e Add DSR packet count to state and qlog.
Summary: It's useful at the end of a connection to know if we tried DSR.

Reviewed By: jbeshay

Differential Revision: D30545282

fbshipit-source-id: bbb2f3408f7a2d5666676c9e2583bf8fd9f18911
2021-08-26 14:06:57 -07:00
Hani Damlaj
da36437098 Remove packetNum From CipherUnavailable
Summary:
- Removed packetNum field from CipherUnavailable struct.

- Removed all instances referring to the field and fixed tests accordingly.

Reviewed By: mjoras

Differential Revision: D29968168

fbshipit-source-id: 9802b8cd66f43f2a8d54340f2d00639ee4679aaf
2021-08-04 12:13:21 -07:00
Matt Joras
19339ef38f Add quic version to transport summary.
Summary: The kitchen sink must grow. Nice to know when the conn ends what the version was.

Reviewed By: lnicco

Differential Revision: D27868680

fbshipit-source-id: 2770ed2c647d76affbb52597a5a2a6720eabfe66
2021-04-19 17:58:35 -07:00
Matt Joras
98298496a2 Add some more info to transport summary qlog
Summary: Same as before!

Reviewed By: lnicco

Differential Revision: D27785992

fbshipit-source-id: 0160fb1572c8afc3dbbcf1dac50fc73ddbfbad83
2021-04-14 20:05:53 -07:00
Chetan Ambekar
cd754c2499 Revert D27768829: Add some more info to transport summary qlog
Differential Revision:
D27768829 (3ed777d04f)

Original commit changeset: 43cbf88f38ce

fbshipit-source-id: 4c678ebccbb7c9c33b1c7ab9ed98f6bdbc9c7e49
2021-04-14 18:45:06 -07:00
Matt Joras
3ed777d04f Add some more info to transport summary qlog
Summary: Specifically interested in seeing whether 0RTT was used, writable bytes, and conn flow control.

Reviewed By: yangchi

Differential Revision: D27768829

fbshipit-source-id: 43cbf88f38ce56065cad785344dedc279a0af7d1
2021-04-14 18:08:13 -07:00
Matt Joras
382c1cdcc6 Remove partial reliability from mvfst.
Summary: As in title.

Reviewed By: yangchi

Differential Revision: D26701886

fbshipit-source-id: c7b36c616200b17fbf697eff4ba0d18695effb45
2021-03-03 15:30:21 -08:00
Matt Joras
21f190220e Implement basic ACK_FREQUENCY support.
Summary: As in title. This doesn't actually send any frames, but implements basic support for the transport parameter and responding to the frames.

Reviewed By: yangchi

Differential Revision: D26134787

fbshipit-source-id: 2c48e01084034317c8f36f89c69d172e3cb42278
2021-02-02 19:02:40 -08:00
Andres Suarez
05d07cbfd0 Apply clang-format update fixes
Reviewed By: igorsugak

Differential Revision: D25849213

fbshipit-source-id: a2a538230e769b2c328ae3dd0a19dfbfd693fe3b
2021-01-09 15:39:52 -08:00
Yang Chi
7c85871c3e HTTP Priority update logging in QLog
Summary: as title

Reviewed By: mjoras

Differential Revision: D24903759

fbshipit-source-id: 39127b658e6cb06025272c1c5ab0f7de2ae1a54a
2020-11-17 20:21:49 -08:00
Matt Joras
80c0b3185a Introducing the KnobFrame
Summary:
This introduces a new extension frame, the KnobFrame, and an implementation.

The idea with Knobs is that they are arbitrary key-values within a namespace that can be transmitted to the peer at any time. They provide an alternative to transport settings, by eschewing the standard transport setting space entirely.

The idea is simple, each knob has a "knobspace", "id", and value. The knobspace is a namespace in which the knob has semantic meaning (e.g. 0xfaceb00). The id and value are just that, arbitrary identifiers and values.

On receiving a knob it is the application's reponsibility to deal with it.

Reviewed By: mjoras

Differential Revision: D23601468

fbshipit-source-id: 63e5e4a7bdb76e11e8c952f1234f512a629ef348
2020-09-11 14:29:29 -07:00
Matt Joras
015ff4a808 Lowercase qlog strings.
Summary: In the spec these are now lowercase.

Reviewed By: avasylev

Differential Revision: D22104880

fbshipit-source-id: adc9bbcd7bd9e7babb1946648d2867ec7dc9336b
2020-07-14 16:12:25 -07:00
Matt Joras
a21f1c2f68 Remove trigger event field.
Summary: This is now an optional field on individual events.

Reviewed By: lnicco

Differential Revision: D22102853

fbshipit-source-id: ecfb4b4d9c2e594f10e93c8dfbff96b1dad4422d
2020-06-17 19:21:26 -07:00
Aman Sharma
4a7ddd92af Add "RetryPacket" QLogger event
Summary:
This adds a QLog event for Retry packets. There are three fields:
- packetType: This is always "RETRY"
- packetSize: The size of the entire packet
- tokenSize: The size of the retry token

Reviewed By: mjoras

Differential Revision: D20910017

fbshipit-source-id: feb4abbf0d15ff7b24fd11f00634e9da84bf8333
2020-04-21 13:40:53 -07:00
Matt Joras
3b2ba3fe8b Implement handshake done
Summary: This is without cipher dropping, but the frame is parseable and the server will send it at the correct time.

Reviewed By: yangchi, lnicco

Differential Revision: D20235013

fbshipit-source-id: 696c11ec573a530b3ed9f4185a2f6847ee08819f
2020-03-04 22:08:33 -08:00
Matt Joras
61cd1a7289 Back out "Implement handshake done and cipher dropping."
Summary: This caused an increase in client errors.

Reviewed By: yangchi, lnicco

Differential Revision: D20186386

fbshipit-source-id: 737122a94c97498efba61292a6c292cfe482925c
2020-03-01 18:31:40 -08:00
Matt Joras
472e40a902 Implement handshake done and cipher dropping.
Summary: This implements the handshake done signal and also cipher dropping.

Reviewed By: yangchi

Differential Revision: D19584922

fbshipit-source-id: a98bec8f1076393b051ff65a2d8aae7d572b42f5
2020-02-27 12:25:52 -08:00
Matt Joras
60c1f4a6f3 Fix qlog stream id
Summary: This is now "stream_id". The qvis tools rely on this.

Reviewed By: JunqiWang

Differential Revision: D19393624

fbshipit-source-id: 20d03aee6d6651507424b8749b30c57081c753ef
2020-01-14 11:43:14 -08:00
Mirko Andjic
3f419b2eb2 Add vantage point to qlog.
Summary: Landing an outstanding diff

Reviewed By: yangchi

Differential Revision: D19261395

fbshipit-source-id: 437461222ff04f5c3271567d3bb064bceaf80029
2020-01-07 11:19:13 -08:00
Viktor Chynarov
603238265c Fix RETIRE_CONNECTION_ID qlog json output
Summary:
The RETIRE_CONNECTION_ID serialization didn't actually log the name
of the frame type, so it didn't show up.

Changed sequenceNumber -> sequence.

Reviewed By: sharma95

Differential Revision: D19184626

fbshipit-source-id: 2cd4436c1ce1b22c9445b3179062c7926069414e
2020-01-02 15:54:20 -08:00
Yang Chi
3cadc8f326 Tperf cmdline param to change Pacing observer bucket type
Summary:
Make this configurable via cmdline param. Plus some small
fixes/refactors.

Reviewed By: mjoras

Differential Revision: D19231872

fbshipit-source-id: 793db28a078fddee223a4c1e6d3a431562f9a24f
2019-12-27 19:30:53 -08:00
Raghu Nallamothu
e06de27550 Merge Application Close Frame and Connection Close Frame
Summary: As a part of Draft 17, application close frame has been removed, we use connection close frame to represent both application close and connection close.

Reviewed By: mjoras

Differential Revision: D18580856

fbshipit-source-id: d274fa2d3dbc59b926bca5a2b8a20328ae582703
2019-12-03 15:02:06 -08:00
Viktor Chynarov
45e71f737a Add QLog events for ConnMigration, PathValidation
Summary:
QLogConnectionMigrationEvent:
Allow observing client-side ConnectionMigration attempts (replacing the
socket), and observing the server-side changing the peer address it
is writing to.

QLogPathValidationEvent:
Allow observing successful/failed path validation attempts.
Success is considered as a correct PathResponse being returned.
A Failure is only published on the timeout expiring, not an invalid
PathChallenge frame being returned (we do not cancel this).

There are already QlogEvents for PathChallenge/PathResponse that
can be observed.

Reviewed By: JunqiWang

Differential Revision: D18340999

fbshipit-source-id: 512108f82a6e082021c0bd3254f108c128b17ba3
2019-11-08 08:39:36 -08:00
Yang Chi
b0088bb4e2 Add time since stream creation into Stream level qlog events
Summary:
to make the log easier to parse. Otherwise i will need a script to
scan the whole log and calculate refTime differences.

Reviewed By: sharma95

Differential Revision: D18042798

fbshipit-source-id: 1573f60eacaedb361fc8cdc2332333ff8bee6a13
2019-10-24 09:53:21 -07:00
Yang Chi
e12fe5287a AppLimited and Bandwidth update QLog event in Quic BBR
Summary:
This diff adds a new event for bandwidth estimation update, and
changed the app limited/unlimited into its own events instead of piggybacking
onto the congestion update

Reviewed By: mjoras

Differential Revision: D17602684

fbshipit-source-id: 48b855c68b58992d07b8c9b872aea637c4267137
2019-10-15 21:19:05 -07:00
Yang Chi
faae04331c Quic pacing observer
Summary:
Add a pacing observer interface in QLogger . An implementation is
added for tperf.

Reviewed By: mjoras

Differential Revision: D17816559

fbshipit-source-id: c9079a24a6dab88df83f32fec35dc287c58989cf
2019-10-10 22:08:10 -07:00
Viktor Chynarov
fa98978d6d Back out "Revert D15264935: [quic] Make RetireConnectionIdFrame a QuicSimpleFrame (for now)"
Summary: Original commit changeset: aa2ccf4bb39e

Reviewed By: lnicco

Differential Revision: D17688496

fbshipit-source-id: e627784cdfe208994cbae3f71062d74d312d3600
2019-10-01 11:11:05 -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
Bonnie Xu
f72ab2cfd6 Implement HTTP3 event interface
Summary: Implement HTTP3 event interface for qlog.

Reviewed By: yangchi

Differential Revision: D16424215

fbshipit-source-id: 041cd0a999eea49fdf98218348bd2a62e467a0b0
2019-07-27 14:07:58 -07:00
Bonnie Xu
63a79f278b Implement metricUpdate interface
Summary: Implement metricUpdate interface as part of spec.

Reviewed By: mjoras

Differential Revision: D16447278

fbshipit-source-id: 662361f257a336066a9f7ffb4e31eea6012add3f
2019-07-25 22:49:24 -07:00
Bonnie Xu
ce7ff9c215 Implement packetAck interface
Summary: Implement packetAck interface as part of spec.

Reviewed By: sharma95

Differential Revision: D16422768

fbshipit-source-id: f053a3b89ec080603d6568e37ad9281cf4834186
2019-07-25 11:52:21 -07:00
Bonnie Xu
5d871f45e0 Implement packetBuffered interface
Summary: Implement packetBuffered interface, as part of spec.

Reviewed By: yangchi

Differential Revision: D16415617

fbshipit-source-id: ece8e9fcd05c3cb7b7c63f7d652ed8df4c1a355b
2019-07-25 11:52:19 -07:00
Bonnie Xu
3e14356c1c Fix qlogger to accomodate for retry
Summary:
Fixes include
1. Added packet_sent qlog event where it should be.
2. Reinitialize the qLogger after retry.
3. Fix issue where retry fails because packetNum can't be found.

Reviewed By: mjoras

Differential Revision: D16403221

fbshipit-source-id: 9288c1b24e98dc11e3b83575f58ca05445261ae3
2019-07-20 16:06:22 -07:00