All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: [PATCH net-next v15 10/15] quic: add packet number space
@ 2026-09-15 19:50 netdev-bot+sashiko
  0 siblings, 0 replies; 2+ messages in thread
From: netdev-bot+sashiko @ 2026-09-15 19:50 UTC (permalink / raw)
  To: lucien.xin
  Cc: netdev, quic, davem, kuba, edumazet, pabeni, horms, metze, mbuhl,
	tfanelli, hepengtao, dreibh, linux-cifs, pc, linkinjeon, tom,
	kernel-tls-handshake, chuck.lever, jlayton, steved, hare,
	aahringo, dhowells, matttbe, mail, xiyou.wangcong, alibuda,
	jbaron, illiliti, sd, marcelo.leitner, daniel, andrew.gospodarek,
	mef, paul

Thank you for your contribution! Sashiko AI review found 4 potential
issue(s) to consider:

Critical: 0 · High: 0 · Medium: 0 · Low: 4

- [Low] Commit message does not describe the ECN accounting/validation
  API that the patch introduces.
- [Low] Kernel-doc of `quic_pnspace_num_gabs()` (net/quic/pnspace.c line
  228) claims that on overflow "the oldest gaps are merged into a single…
- [Low] The field comment for `struct quic_pnspace::min_pn_seen`
  (net/quic/pnspace.h line 73) says "Smallest PN received", but…
- [Low] The pn_map layout comment in net/quic/pnspace.h documents the
  packet-count advance trigger as "(max_pn_seen - last_max_pn_seen) >…

--

quic: add packet number space

This patch adds struct quic_pnspace to track per packet number space state,
including the next packet number to send, bytes in flight, loss timing and
largest acknowledged packet number. It also adds the received packet number
bitmap plus quic_pnspace_check(), quic_pnspace_mark() and
quic_pnspace_num_gabs() for ACK frame generation.

A few questions about the new code and its comments below.

> diff --git a/net/quic/pnspace.c b/net/quic/pnspace.c
> new file mode 100644
> index 0000000000000..c7c4d0be2d980
> --- /dev/null
> +++ b/net/quic/pnspace.c
> @@ -0,0 +1,273 @@

[ ... ]

> +int quic_pnspace_mark(struct quic_pnspace *space, s64 pn, gfp_t gfp)
> +{

[ ... ]

> +	/* Check if enough time has elapsed or enough packets have been
> +	 * received to update tracking.
> +	 */
> +	last_max_pn_seen = min_t(s64, space->last_max_pn_seen, space->base_pn);
> +	last_max_pn_time = space->last_max_pn_time;
> +	if (space->max_pn_time < last_max_pn_time + space->max_time_limit &&
> +	    space->max_pn_seen <= last_max_pn_seen + QUIC_PN_MAP_LIMIT)
> +		return 0;

[Severity: Low]
Does the advance condition documented in the pn_map layout comment in
net/quic/pnspace.h match what quic_pnspace_mark() actually evaluates?

The header says:

 * Conditions to Advance pn_map:
 *   - (max_pn_time - last_max_pn_time) >= max_time_limit, or
 *   - (max_pn_seen - last_max_pn_seen) > QUIC_PN_MAP_LIMIT

but the code clamps the reference point to base_pn first:

	last_max_pn_seen = min_t(s64, space->last_max_pn_seen, space->base_pn);

So whenever base_pn is below space->last_max_pn_seen, the effective packet
count threshold is base_pn + QUIC_PN_MAP_LIMIT rather than the documented
last_max_pn_seen + QUIC_PN_MAP_LIMIT, and the map advances earlier than the
comment states.

base_pn below last_max_pn_seen is easy for a peer to arrange: receive
packet numbers 0..10 and 12, giving base_pn = 11 and max_pn_seen = 12; after
a time based advance last_max_pn_seen becomes 12 while base_pn stays 11.

Could the comment be updated to mention the base_pn clamp?

> +
> +	/* Advance base_pn if last_max_pn_seen is ahead of current base_pn.
> +	 * This is needed because QUIC doesn't retransmit packets;
> +	 * retransmitted frames are carried in new packets, so we move forward.
> +	 */
> +	if (space->last_max_pn_seen + 1 > space->base_pn)
> +		quic_pnspace_move(space, space->last_max_pn_seen);
> +
> +	space->min_pn_seen = space->last_max_pn_seen;
> +	space->last_max_pn_seen = space->max_pn_seen;
> +	space->last_max_pn_time = space->max_pn_time;
> +	return 0;
> +}

[ ... ]

> +/* Generate gap acknowledgment blocks (GABs). GABs describe ranges of
> + * unacknowledged packets between received ones, and are used in ACK frames.
> + *
> + * This function uses a sliding window approach to ensure the most recent gaps
> + * are preserved when the total number exceeds QUIC_PN_MAP_MAX_GABS. If there
> + * are more gaps than the limit, the oldest gaps are merged into a single gap,
> + * and the newest (QUIC_PN_MAP_MAX_GABS) gaps are preserved individually.
> + *
> + * Returns: Number of generated GABs (up to QUIC_PN_MAP_MAX_GABS).
> + */

[Severity: Low]
Is this description of quic_pnspace_num_gabs() consistent with itself and
with the code?  It says one merged gap plus QUIC_PN_MAP_MAX_GABS individual
gaps are produced, which is QUIC_PN_MAP_MAX_GABS + 1 blocks, while the next
line says the return value is at most QUIC_PN_MAP_MAX_GABS.

The ring loop never stores more than QUIC_PN_MAP_MAX_GABS entries:

	if (ngaps < QUIC_PN_MAP_MAX_GABS) {
		...
		ngaps++;
		continue;
	}
	gabs[i].start = start;
	gabs[i].end = end;
	i = (i + 1) % QUIC_PN_MAP_MAX_GABS;

and the merged range reuses the slot of the oldest surviving gap, so only
QUIC_PN_MAP_MAX_GABS - 1 newest gaps stay individual.

For 33 gaps, gaps 0..31 fill gabs[0..31] with mstart = gap0.start, gap 32
overwrites gabs[0] and i becomes 1; then gabs[1].start = mstart turns the
gap at index 1 into the merged block covering gap 0 and gap 1, and the
rotation returns 32 blocks of which 31 are individual.

Should the wording say QUIC_PN_MAP_MAX_GABS - 1 newest gaps are preserved
individually, with the merged gap occupying the remaining slot?

> +u16 quic_pnspace_num_gabs(struct quic_pnspace *space,
> +			  struct quic_gap_ack_block *gabs)
> +{

[ ... ]

> +	/* Overflow occurred: merge all discarded gaps with the gap at
> +	 * position i (which hasn't been overwritten yet) into one.
> +	 */
> +	gabs[i].start = mstart;
> +	memcpy(tmp, gabs, ngaps * sizeof(*gabs));
> +	memcpy(gabs, &tmp[i], (ngaps - i) * sizeof(*gabs));
> +	memcpy(gabs + (ngaps - i), tmp, i * sizeof(*gabs));
> +
> +	return ngaps;
> +}
> diff --git a/net/quic/pnspace.h b/net/quic/pnspace.h
> new file mode 100644
> index 0000000000000..15ce6d2ef7269
> --- /dev/null
> +++ b/net/quic/pnspace.h
> @@ -0,0 +1,201 @@

[ ... ]

> +enum {
> +	QUIC_ECN_ECT1,
> +	QUIC_ECN_ECT0,
> +	QUIC_ECN_CE,
> +	QUIC_ECN_MAX
> +};
> +
> +enum {
> +	QUIC_ECN_LOCAL, /* ECN bits from incoming IP headers */
> +	QUIC_ECN_PEER,  /* ECN bits reported by peer in ACK frames */
> +	QUIC_ECN_ACKED, /* ECN bits from packets newly ACKed */
> +	QUIC_ECN_DIR_MAX
> +};

[Severity: Low]
Could the commit message mention the ECN accounting and validation added
here?  The changelog body describes only the packet number bookkeeping and
the three ACK map helpers:

    "To support ACK frame generation, quic_pnspace includes a packet number
    acknowledgment map (pn_ack_map) that tracks received packet numbers.
    Supporting functions are provided to validate and mark received packet
    numbers and compute the number of gap blocks needed during ACK frame
    construction."

but the patch also adds the ecn_count matrix, the QUIC_ECN_* enums above,
and six inline helpers: quic_pnspace_inc_ecn_acked(),
quic_pnspace_reset_ecn_acked(), quic_pnspace_inc_ecn_local(),
quic_pnspace_has_ecn_local(), quic_pnspace_validate_ecn() and
quic_pnspace_set_ecn_peer(), the last two encoding the RFC 9000 section
13.4.2.1 validation policy.  The need_sack, sack_path and sack_pending
fields are also new and unmentioned.

The ECN work is described only in the v12 changelog below the --- line,
which is dropped when the patch is applied.

Also worth noting in the message: QUIC_ECN_ECT1 deliberately precedes
QUIC_ECN_ECT0 so that ecn - 1 indexes correctly from the IP header ECN
bits, while the ecn_count arrays passed in by callers are indexed with the
same enum.  A follow-up populating that array in RFC wire order (ECT0,
ECT1, CE) would silently swap the two counters.

[ ... ]

> +/* Packet Number Map (pn_map) Layout:
> + *
> + *     min_pn_seen -->++-----------------------+---------------------+---
> + *         base_pn -----^   last_max_pn_seen --^       max_pn_seen --^
> + *
> + * Map Advancement Logic:
> + *   - min_pn_seen = last_max_pn_seen;
> + *   - base_pn = first zero bit after last_max_pn_seen;
> + *   - last_max_pn_seen = max_pn_seen;
> + *   - last_max_pn_time = current time;

[ ... ]

> +	s64 last_max_pn_seen; /* Largest PN seen before pn_map advance */
> +	u64 last_max_pn_time; /* Timestamp last_max_pn_seen was received */
> +	s64 min_pn_seen;      /* Smallest PN received */

[Severity: Low]
Is "Smallest PN received" the right description for min_pn_seen?

quic_pnspace_mark() raises it to a former maximum on every window advance:

	space->min_pn_seen = space->last_max_pn_seen;
	space->last_max_pn_seen = space->max_pn_seen;

so after the first advance it is a monotonically growing lower bound of the
still trackable window, not the smallest packet number ever received.

The layout comment above ("min_pn_seen = last_max_pn_seen") and the
quic_pnspace_check() kernel-doc ("too old to track (below min_pn_seen)")
both describe the window meaning, so this field comment looks like the
outlier.  Would something like "Lower bound of the trackable PN window" be
more accurate?

[ ... ]

-- 
Sashiko AI review · https://netdev-ai.bots.linux.dev/sashiko/#/patchset/cover.1789393775.git.lucien.xin%40gmail.com

^ permalink raw reply	[flat|nested] 2+ messages in thread
* [PATCH net-next v15 00/15] net: introduce QUIC infrastructure and core subcomponents
@ 2026-09-14 13:49 Xin Long
  2026-09-14 13:49 ` [PATCH net-next v15 10/15] quic: add packet number space Xin Long
  0 siblings, 1 reply; 2+ messages in thread
From: Xin Long @ 2026-09-14 13:49 UTC (permalink / raw)
  To: network dev, quic
  Cc: davem, kuba, Eric Dumazet, Paolo Abeni, Simon Horman,
	Stefan Metzmacher, Moritz Buhl, Tyler Fanelli, Pengtao He,
	Thomas Dreibholz, linux-cifs, Paulo Alcantara, Namjae Jeon,
	Tom Talpey, kernel-tls-handshake, Chuck Lever, Jeff Layton,
	Steve Dickson, Hannes Reinecke, Alexander Aring, David Howells,
	Matthieu Baerts, John Ericson, Cong Wang, D . Wythe, Jason Baron,
	illiliti, Sabrina Dubroca, Marcelo Ricardo Leitner,
	Daniel Stenberg, Andy Gospodarek, mef, paul

Introduction
============

The QUIC protocol, defined in RFC 9000, is a secure, multiplexed transport
built on top of UDP. It enables low-latency connection establishment,
stream-based communication with flow control, and supports connection
migration across network paths, while ensuring confidentiality, integrity,
and availability.

This implementation introduces QUIC support in Linux Kernel, offering
several key advantages:

- In-Kernel QUIC Support for Subsystems: Enables kernel subsystems
  such as SMB and NFS to operate over QUIC with minimal changes. Once the
  handshake is complete via the net/handshake APIs, data exchange proceeds
  over standard in-kernel transport interfaces.

- Standard Socket API Semantics: Implements core socket operations
  (listen(), accept(), connect(), sendmsg(), recvmsg(), close(),
  getsockopt(), setsockopt(), getsockname(), and getpeername()),
  allowing user space to interact with QUIC sockets in a familiar,
  POSIX-compliant way.

- ALPN-Based Connection Dispatching: Supports in-kernel ALPN
  (Application-Layer Protocol Negotiation) routing, allowing demultiplexing
  of QUIC connections across different user-space processes based
  on the ALPN identifiers.

- Performance Enhancements: Handles all control messages in-kernel
  to reduce syscall overhead, incorporates zero-copy mechanisms such as
  sendfile() to minimize data movement, and is also structured to support
  future crypto hardware offloads.

This implementation offers fundamental support for the following RFCs:

- RFC9000 - QUIC: A UDP-Based Multiplexed and Secure Transport
- RFC9001 - Using TLS to Secure QUIC
- RFC9002 - QUIC Loss Detection and Congestion Control
- RFC9221 - An Unreliable Datagram Extension to QUIC
- RFC9287 - Greasing the QUIC Bit
- RFC9368 - Compatible Version Negotiation for QUIC
- RFC9369 - QUIC Version 2

The socket APIs for QUIC follow the RFC draft [1]:

- The Sockets API Extensions for In-kernel QUIC Implementations

Implementation
==============

The central design is to implement QUIC within the kernel while delegating
the handshake to userspace.

Only the processing and creation of raw TLS Handshake Messages are handled
in userspace, facilitated by a TLS library like GnuTLS. These messages are
exchanged between kernel and userspace via sendmsg() and recvmsg(), with
cryptographic details conveyed through control messages (cmsg).

The entire QUIC protocol, aside from the TLS Handshake Messages processing
and creation, is managed in the kernel. Rather than using an Upper Layer
Protocol (ULP) layer, this implementation establishes a socket of type
IPPROTO_QUIC (similar to IPPROTO_MPTCP), operating over UDP tunnels.

For kernel consumers, they can initiate a handshake request from the kernel
to userspace using the existing net/handshake netlink. The userspace
component, such as tlshd service [2], then manages the processing
of the QUIC handshake request.

- Handshake Architecture:

  ┌──────┐  ┌──────┐
  │ APP1 │  │ APP2 │ ...
  └──────┘  └──────┘
  ┌──────────────────────────────────────────┐
  │     {quic_client/server_handshake()}     │<─────────────┐
  └──────────────────────────────────────────┘       ┌─────────────┐
   {send/recvmsg()}      {set/getsockopt()}          │    tlshd    │
   [CMSG handshake_info] [SOCKOPT_CRYPTO_SECRET]     └─────────────┘
                         [SOCKOPT_TRANSPORT_PARAM_EXT]    │   ^
                │ ^                  │ ^                  │   │
  Userspace     │ │                  │ │                  │   │
  ──────────────│─│──────────────────│─│──────────────────│───│───────
  Kernel        │ │                  │ │                  │   │
                v │                  v │                  v   │
  ┌──────────────────┬───────────────────────┐       ┌─────────────┐
  │ protocol, timer, │ socket (IPPROTO_QUIC) │<──┐   │ handshake   │
  │                  ├───────────────────────┤   │   │netlink APIs │
  │ common, family,  │ outqueue  |  inqueue  │   │   └─────────────┘
  │                  ├───────────────────────┤   │      │       │
  │ stream, connid,  │         frame         │   │   ┌─────┐ ┌─────┐
  │                  ├───────────────────────┤   │   │     │ │     │
  │ path, pnspace,   │         packet        │   │───│ SMB │ │ NFS │...
  │                  ├───────────────────────┤   │   │     │ │     │
  │ cong, crypto     │       UDP tunnels     │   │   └─────┘ └─────┘
  └──────────────────┴───────────────────────┘   └──────┴───────┘

- User Data Architecture:

  ┌──────┐  ┌──────┐
  │ APP1 │  │ APP2 │ ...
  └──────┘  └──────┘
   {send/recvmsg()}   {set/getsockopt()}              {recvmsg()}
   [CMSG stream_info] [SOCKOPT_KEY_UPDATE]            [EVENT conn update]
                      [SOCKOPT_CONNECTION_MIGRATION]  [EVENT stream update]
                      [SOCKOPT_STREAM_OPEN/RESET/STOP]
                │ ^               │ ^                     ^
  Userspace     │ │               │ │                     │
  ──────────────│─│───────────────│─│─────────────────────│───────────
  Kernel        │ │               │ │                     │
                v │               v │  ┌──────────────────┘
  ┌──────────────────┬───────────────────────┐
  │ protocol, timer, │ socket (IPPROTO_QUIC) │<──┐{kernel_send/recvmsg()}
  │                  ├───────────────────────┤   │{kernel_set/getsockopt()}
  │ common, family,  │ outqueue  |  inqueue  │   │{kernel_recvmsg()}
  │                  ├───────────────────────┤   │
  │ stream, connid,  │         frame         │   │   ┌─────┐ ┌─────┐
  │                  ├───────────────────────┤   │   │     │ │     │
  │ path, pnspace,   │         packet        │   │───│ SMB │ │ NFS │...
  │                  ├───────────────────────┤   │   │     │ │     │
  │ cong, crypto     │       UDP tunnels     │   │   └─────┘ └─────┘
  └──────────────────┴───────────────────────┘   └──────┴───────┘

Interface
=========

This implementation supports a mapping of QUIC into sockets APIs. Similar
to TCP and SCTP, a typical Server and Client use the following system call
sequence to communicate:

    Client                             Server
  ──────────────────────────────────────────────────────────────────────
  sockfd = socket(IPPROTO_QUIC)      listenfd = socket(IPPROTO_QUIC)
  bind(sockfd)                       bind(listenfd)
                                     listen(listenfd)
  connect(sockfd)
  quic_client_handshake(sockfd)
                                     sockfd = accept(listenfd)
                                     quic_server_handshake(sockfd, cert)

  sendmsg(sockfd)                    recvmsg(sockfd)
  close(sockfd)                      close(sockfd)
                                     close(listenfd)

Please note that quic_client_handshake() and quic_server_handshake()
functions are currently sourced from libquic [3]. These functions are
responsible for receiving and processing the raw TLS handshake messages
until the completion of the handshake process.

For utilization by kernel consumers, it is essential to have tlshd
service [2] installed and running in userspace. This service receives
and manages kernel handshake requests for kernel sockets. In the kernel,
the APIs closely resemble those used in userspace:

    Client                             Server
  ────────────────────────────────────────────────────────────────────────
  __sock_create(IPPROTO_QUIC, &sock)  __sock_create(IPPROTO_QUIC, &sock)
  kernel_bind(sock)                   kernel_bind(sock)
                                      kernel_listen(sock)
  kernel_connect(sock)
  tls_client_hello_x509(args:{sock})
                                      kernel_accept(sock, &newsock)
                                      tls_server_hello_x509(args:{newsock})

  kernel_sendmsg(sock)                kernel_recvmsg(newsock)
  sock_release(sock)                  sock_release(newsock)
                                      sock_release(sock)

Please be aware that tls_client_hello_x509() and tls_server_hello_x509()
are APIs from net/handshake/. They are used to dispatch the handshake
request to the userspace tlshd service and subsequently block until the
handshake process is completed.

Use Cases
=========

- Samba

  Stefan Metzmacher has integrated Linux QUIC into Samba for both client
  and server roles [4].

- tlshd

  The tlshd daemon [2] facilitates Linux QUIC handshake requests from
  kernel sockets. This is essential for enabling protocols like SMB
  and NFS over QUIC.

- curl

  Linux QUIC is being integrated into curl [5] for HTTP/3. Example usage:

  # curl --http3-only https://nghttp2.org:4433/
  # curl --http3-only https://www.google.com/
  # curl --http3-only https://facebook.com/
  # curl --http3-only https://outlook.office.com/
  # curl --http3-only https://cloudflare-quic.com/

- httpd-portable

  Moritz Buhl has deployed an HTTP/3 server over Linux QUIC [6] that is
  accessible via Firefox and curl:

  https://d.moritzbuhl.de/pub

- NetPerfMeter

  The latest NetPerfMeter release supports Linux QUIC and can be used to
  run performance evaluations [10].

Test Coverage
=============

The Coverage (gcov) of Functional and Interop Tests:

https://d.moritzbuhl.de/lcov

- Functional Tests

  The libquic self-tests (make check) pass on all major architectures:
  x86_64, i386, s390x, aarch64, ppc64le.

- Interop tests

  Interoperability was validated using the QUIC Interop Runner [7] against
  all major userland QUIC stacks. Results are available at:

  https://d.moritzbuhl.de/

- Fuzzing via Syzkaller

  Syzkaller has been running kernel fuzzing with QUIC for weeks using
  tests/syzkaller/ in libquic [3].

- Performance Testing

  Performance was benchmarked using iperf [8] over a 100G NIC using
  various MTUs and packet sizes:

  - QUIC vs. kTLS:

    UNIT        size:1024      size:4096      size:16384     size:65536
    Gbits/sec   QUIC | kTLS    QUIC | kTLS    QUIC | kTLS    QUIC | kTLS
    ────────────────────────────────────────────────────────────────────
    mtu:1500    2.27 | 3.26    3.02 | 6.97    3.36 | 9.74    3.48 | 10.8
    ────────────────────────────────────────────────────────────────────
    mtu:9000    3.66 | 3.72    5.87 | 8.92    7.03 | 11.2    8.04 | 11.4

  - QUIC(disable_1rtt_encryption) vs. TCP:

    UNIT        size:1024      size:4096      size:16384     size:65536
    Gbits/sec   QUIC | TCP     QUIC | TCP     QUIC | TCP     QUIC | TCP
    ────────────────────────────────────────────────────────────────────
    mtu:1500    3.09 | 4.59    4.46 | 14.2    5.07 | 21.3    5.18 | 23.9
    ────────────────────────────────────────────────────────────────────
    mtu:9000    4.60 | 4.65    8.41 | 14.0    11.3 | 28.9    13.5 | 39.2


  The performance gap between QUIC and kTLS may be attributed to:

  - The absence of Generic Segmentation Offload (GSO) for QUIC.
  - An additional data copy on the transmission (TX) path.
  - Extra encryption required for header protection in QUIC.
  - A longer header length for the stream data in QUIC.

Patches
=======

Note: This implementation is organized into five parts and submitted across
two patchsets for review. This patchset includes Parts 1–2, while Parts 3–5
will be submitted in a subsequent patchset. For complete series, see [9].

1. Infrastructure (2):

  net: define IPPROTO_QUIC and SOL_QUIC constants
  net: build socket infrastructure for QUIC protocol

2. Subcomponents (13):

  quic: provide common utilities and data structures
  quic: provide family ops for address and protocol
  quic: provide quic.h header files for kernel and userspace
  quic: add stream management
  quic: add connection id management
  quic: add path management
  quic: add congestion control
  quic: add packet number space
  quic: add crypto key derivation and installation
  quic: add crypto packet encryption and decryption
  quic: add timer management
  quic: add packet builder base
  quic: add packet parser base

3. Data Processing (8):

  quic: add frame encoder and decoder base
  quic: implement outqueue transmission and flow control
  quic: implement outqueue sack and retransmission
  quic: implement inqueue receiving and flow control
  quic: implement frame creation functions
  quic: implement frame processing functions
  quic: implement packet creation functions
  quic: implement packet processing functions

4. Socket APIs (6):

  quic: support bind/listen/connect/accept/close()
  quic: support sendmsg() and recvmsg()
  quic: support socket options related to interaction after handshake
  quic: support socket options related to settings prior to handshake
  quic: support socket options related to setup during handshake
  quic: support socket ioctls and socket dump via procfs

5. Documentation and Selftests (3):

  Documentation: describe QUIC protocol interface in quic.rst
  quic: create sample test using handshake APIs for kernel consumers
  selftests: net: add tests for QUIC protocol

Notice: The QUIC module is currently labeled as "EXPERIMENTAL".

All contributors are recognized in the respective patches with the tag of
'Signed-off-by:'. Special thanks to Moritz Buhl and Stefan Metzmacher whose
practical use cases and insightful feedback have been instrumental in
shaping the design and advancing the development.

References
==========

[1]  https://datatracker.ietf.org/doc/html/draft-lxin-quic-socket-apis
[2]  https://github.com/oracle/ktls-utils
[3]  https://github.com/lxin/quic
[4]  https://gitlab.com/samba-team/samba/-/merge_requests/4019
[5]  https://github.com/moritzbuhl/curl/tree/linux_curl
[6]  https://github.com/moritzbuhl/httpd-portable
[7]  https://github.com/quic-interop/quic-interop-runner
[8]  https://github.com/lxin/iperf
[9]  https://github.com/lxin/net-next/commits/quic/
[10] https://www.nntb.no/~dreibh/netperfmeter/

Changes in v2-v15: See individual patch changelogs for details.

Xin Long (15):
  net: define IPPROTO_QUIC and SOL_QUIC constants
  net: build socket infrastructure for QUIC protocol
  quic: provide common utilities and data structures
  quic: provide family ops for address and protocol
  quic: provide quic.h header files for kernel and userspace
  quic: add stream management
  quic: add connection id management
  quic: add path management
  quic: add congestion control
  quic: add packet number space
  quic: add crypto key derivation and installation
  quic: add crypto packet encryption and decryption
  quic: add timer management
  quic: add packet builder base
  quic: add packet parser base

 Documentation/networking/ip-sysctl.rst        |   39 +
 MAINTAINERS                                   |    9 +
 include/linux/quic.h                          |   38 +
 include/linux/socket.h                        |    1 +
 include/trace/events/sock.h                   |    3 +-
 include/uapi/linux/in.h                       |    2 +
 include/uapi/linux/quic.h                     |  241 ++++
 net/Kconfig                                   |    1 +
 net/Makefile                                  |    1 +
 net/quic/Kconfig                              |   35 +
 net/quic/Makefile                             |    9 +
 net/quic/common.c                             |  565 ++++++++
 net/quic/common.h                             |  220 +++
 net/quic/cong.c                               |  340 +++++
 net/quic/cong.h                               |  132 ++
 net/quic/connid.c                             |  283 ++++
 net/quic/connid.h                             |  183 +++
 net/quic/crypto.c                             | 1251 +++++++++++++++++
 net/quic/crypto.h                             |   88 ++
 net/quic/family.c                             |  446 ++++++
 net/quic/family.h                             |   44 +
 net/quic/packet.c                             | 1055 ++++++++++++++
 net/quic/packet.h                             |  123 ++
 net/quic/path.c                               |  589 ++++++++
 net/quic/path.h                               |  192 +++
 net/quic/pnspace.c                            |  273 ++++
 net/quic/pnspace.h                            |  201 +++
 net/quic/protocol.c                           |  403 ++++++
 net/quic/protocol.h                           |   57 +
 net/quic/socket.c                             |  654 +++++++++
 net/quic/socket.h                             |  242 ++++
 net/quic/stream.c                             |  416 ++++++
 net/quic/stream.h                             |  133 ++
 net/quic/timer.c                              |  154 ++
 net/quic/timer.h                              |   45 +
 tools/include/uapi/linux/in.h                 |    2 +
 .../perf/trace/beauty/include/linux/socket.h  |    1 +
 usr/include/Makefile                          |    1 +
 38 files changed, 8471 insertions(+), 1 deletion(-)
 create mode 100644 include/linux/quic.h
 create mode 100644 include/uapi/linux/quic.h
 create mode 100644 net/quic/Kconfig
 create mode 100644 net/quic/Makefile
 create mode 100644 net/quic/common.c
 create mode 100644 net/quic/common.h
 create mode 100644 net/quic/cong.c
 create mode 100644 net/quic/cong.h
 create mode 100644 net/quic/connid.c
 create mode 100644 net/quic/connid.h
 create mode 100644 net/quic/crypto.c
 create mode 100644 net/quic/crypto.h
 create mode 100644 net/quic/family.c
 create mode 100644 net/quic/family.h
 create mode 100644 net/quic/packet.c
 create mode 100644 net/quic/packet.h
 create mode 100644 net/quic/path.c
 create mode 100644 net/quic/path.h
 create mode 100644 net/quic/pnspace.c
 create mode 100644 net/quic/pnspace.h
 create mode 100644 net/quic/protocol.c
 create mode 100644 net/quic/protocol.h
 create mode 100644 net/quic/socket.c
 create mode 100644 net/quic/socket.h
 create mode 100644 net/quic/stream.c
 create mode 100644 net/quic/stream.h
 create mode 100644 net/quic/timer.c
 create mode 100644 net/quic/timer.h

-- 
2.47.1


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2026-09-15 19:50 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-15 19:50 [PATCH net-next v15 10/15] quic: add packet number space netdev-bot+sashiko
  -- strict thread matches above, loose matches on Subject: below --
2026-09-14 13:49 [PATCH net-next v15 00/15] net: introduce QUIC infrastructure and core subcomponents Xin Long
2026-09-14 13:49 ` [PATCH net-next v15 10/15] quic: add packet number space Xin Long

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.