From: Yohei Kojima <yk@y-koj.net>
To: Xin Long <lucien.xin@gmail.com>
Cc: network dev <netdev@vger.kernel.org>,
quic@lists.linux.dev, davem@davemloft.net, kuba@kernel.org,
Eric Dumazet <edumazet@google.com>,
Paolo Abeni <pabeni@redhat.com>, Simon Horman <horms@kernel.org>,
Stefan Metzmacher <metze@samba.org>,
Moritz Buhl <mbuhl@openbsd.org>,
Tyler Fanelli <tfanelli@redhat.com>,
Pengtao He <hepengtao@xiaomi.com>,
Thomas Dreibholz <dreibh@simula.no>,
linux-cifs@vger.kernel.org, Steve French <smfrench@gmail.com>,
Namjae Jeon <linkinjeon@kernel.org>,
Paulo Alcantara <pc@manguebit.com>, Tom Talpey <tom@talpey.com>,
kernel-tls-handshake@lists.linux.dev,
Chuck Lever <chuck.lever@oracle.com>,
Jeff Layton <jlayton@kernel.org>,
Steve Dickson <steved@redhat.com>, Hannes Reinecke <hare@suse.de>,
Alexander Aring <aahringo@redhat.com>,
David Howells <dhowells@redhat.com>,
Matthieu Baerts <matttbe@kernel.org>,
John Ericson <mail@johnericson.me>,
Cong Wang <xiyou.wangcong@gmail.com>,
"D . Wythe" <alibuda@linux.alibaba.com>,
Jason Baron <jbaron@akamai.com>,
illiliti <illiliti@protonmail.com>,
Sabrina Dubroca <sd@queasysnail.net>,
Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>,
Daniel Stenberg <daniel@haxx.se>,
Andy Gospodarek <andrew.gospodarek@broadcom.com>
Subject: Re: [PATCH net-next v6 05/16] quic: provide quic.h header files for kernel and userspace
Date: Thu, 8 Jan 2026 14:29:36 +0900 [thread overview]
Message-ID: <aV9AwNITeyL71INz@desktop.y-koj.net> (raw)
In-Reply-To: <127ed26fc7689a580c52316a2a82d8f418228b23.1767621882.git.lucien.xin@gmail.com>
On Mon, Jan 05, 2026 at 09:04:31AM -0500, Xin Long wrote:
> This commit adds quic.h to include/uapi/linux, providing the necessary
> definitions for the QUIC socket API. Exporting this header allows both
> user space applications and kernel subsystems to access QUIC-related
> control messages, socket options, and event/notification interfaces.
>
> Since kernel_get/setsockopt() is no longer available to kernel consumers,
> a corresponding internal header, include/linux/quic.h, is added. This
> provides kernel subsystems with the necessary declarations to handle
> QUIC socket options directly.
>
> Detailed descriptions of these structures are available in [1], and will
> be also provided when adding corresponding socket interfaces in the
> later patches.
>
> [1] https://datatracker.ietf.org/doc/html/draft-lxin-quic-socket-apis
>
> Signed-off-by: Tyler Fanelli <tfanelli@redhat.com>
> Signed-off-by: Stefan Metzmacher <metze@samba.org>
> Signed-off-by: Thomas Dreibholz <dreibh@simula.no>
> Signed-off-by: Xin Long <lucien.xin@gmail.com>
> ---
> v2:
> - Fix a kernel API description warning, found by Jakub.
> - Replace uintN_t with __uN, capitalize _UAPI_LINUX_QUIC_H, and
> assign explicit values for QUIC_TRANSPORT_ERROR_ enum in UAPI
> quic.h, suggested by David Howells.
> v4:
> - Use MSG_QUIC_ prefix for MSG_* flags to avoid conflicts with other
> protocols, such as MSG_NOTIFICATION in SCTP (reported by Thomas).
> - Remove QUIC_CONG_ALG_CUBIC; only NEW RENO congestion control is
> supported in this version.
> v5:
> - Add include/linux/quic.h and include/uapi/linux/quic.h to the
> QUIC PROTOCOL entry in MAINTAINERS.
> v6:
> - Fix the copy/pasted the uAPI path for SCTP to the QUIC entry (noted
> by Jakub).
> ---
> MAINTAINERS | 2 +
> include/linux/quic.h | 19 +++
> include/uapi/linux/quic.h | 235 ++++++++++++++++++++++++++++++++++++++
> net/quic/socket.c | 38 ++++++
> net/quic/socket.h | 7 ++
> 5 files changed, 301 insertions(+)
> create mode 100644 include/linux/quic.h
> create mode 100644 include/uapi/linux/quic.h
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 46c28f087fd8..8d6187187978 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -21387,6 +21387,8 @@ M: Xin Long <lucien.xin@gmail.com>
> L: quic@lists.linux.dev
> S: Maintained
> W: https://github.com/lxin/quic
> +F: include/linux/quic.h
> +F: include/uapi/linux/quic.h
> F: net/quic/
>
> RADEON and AMDGPU DRM DRIVERS
> diff --git a/include/linux/quic.h b/include/linux/quic.h
> new file mode 100644
> index 000000000000..d35ff40bb005
> --- /dev/null
> +++ b/include/linux/quic.h
> @@ -0,0 +1,19 @@
> +/* SPDX-License-Identifier: GPL-2.0-or-later */
> +/* QUIC kernel implementation
> + * (C) Copyright Red Hat Corp. 2023
> + *
> + * This file is part of the QUIC kernel implementation
> + *
> + * Written or modified by:
> + * Xin Long <lucien.xin@gmail.com>
> + */
> +
> +#ifndef _LINUX_QUIC_H
> +#define _LINUX_QUIC_H
> +
> +#include <uapi/linux/quic.h>
> +
> +int quic_kernel_setsockopt(struct sock *sk, int optname, void *optval, unsigned int optlen);
> +int quic_kernel_getsockopt(struct sock *sk, int optname, void *optval, unsigned int *optlen);
> +
> +#endif
> diff --git a/include/uapi/linux/quic.h b/include/uapi/linux/quic.h
> new file mode 100644
> index 000000000000..990b70c3afb0
> --- /dev/null
> +++ b/include/uapi/linux/quic.h
> @@ -0,0 +1,235 @@
> +/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
> +/* QUIC kernel implementation
> + * (C) Copyright Red Hat Corp. 2023
> + *
> + * This file is part of the QUIC kernel implementation
> + *
> + * Written or modified by:
> + * Xin Long <lucien.xin@gmail.com>
> + */
> +
> +#ifndef _UAPI_LINUX_QUIC_H
> +#define _UAPI_LINUX_QUIC_H
> +
> +#include <linux/types.h>
> +#ifdef __KERNEL__
> +#include <linux/socket.h>
> +#else
> +#include <sys/socket.h>
> +#endif
> +
> +/* NOTE: Structure descriptions are specified in:
> + * https://datatracker.ietf.org/doc/html/draft-lxin-quic-socket-apis
> + */
> +
> +/* Send or Receive Options APIs */
> +enum quic_cmsg_type {
> + QUIC_STREAM_INFO,
> + QUIC_HANDSHAKE_INFO,
> +};
> +
> +#define QUIC_STREAM_TYPE_SERVER_MASK 0x01
> +#define QUIC_STREAM_TYPE_UNI_MASK 0x02
> +#define QUIC_STREAM_TYPE_MASK 0x03
> +
> +enum quic_msg_flags {
> + /* flags for stream_flags */
> + MSG_QUIC_STREAM_NEW = MSG_SYN,
> + MSG_QUIC_STREAM_FIN = MSG_FIN,
> + MSG_QUIC_STREAM_UNI = MSG_CONFIRM,
> + MSG_QUIC_STREAM_DONTWAIT = MSG_WAITFORONE,
> + MSG_QUIC_STREAM_SNDBLOCK = MSG_ERRQUEUE,
> +
> + /* extented flags for msg_flags */
> + MSG_QUIC_DATAGRAM = MSG_RST,
> + MSG_QUIC_NOTIFICATION = MSG_MORE,
> +};
> +
> +enum quic_crypto_level {
> + QUIC_CRYPTO_APP,
> + QUIC_CRYPTO_INITIAL,
> + QUIC_CRYPTO_HANDSHAKE,
> + QUIC_CRYPTO_EARLY,
> + QUIC_CRYPTO_MAX,
> +};
> +
> +struct quic_handshake_info {
> + __u8 crypto_level;
> +};
> +
> +struct quic_stream_info {
> + __s64 stream_id;
> + __u32 stream_flags;
> +};
> +
> +/* Socket Options APIs */
> +#define QUIC_SOCKOPT_EVENT 0
> +#define QUIC_SOCKOPT_STREAM_OPEN 1
> +#define QUIC_SOCKOPT_STREAM_RESET 2
> +#define QUIC_SOCKOPT_STREAM_STOP_SENDING 3
> +#define QUIC_SOCKOPT_CONNECTION_ID 4
> +#define QUIC_SOCKOPT_CONNECTION_CLOSE 5
> +#define QUIC_SOCKOPT_CONNECTION_MIGRATION 6
> +#define QUIC_SOCKOPT_KEY_UPDATE 7
This is a trivial point, but it would be better to align the indentation
of the line above.
Thank you,
Yohei Kojima
> +#define QUIC_SOCKOPT_TRANSPORT_PARAM 8
> +#define QUIC_SOCKOPT_CONFIG 9
> +#define QUIC_SOCKOPT_TOKEN 10
> +#define QUIC_SOCKOPT_ALPN 11
> +#define QUIC_SOCKOPT_SESSION_TICKET 12
> +#define QUIC_SOCKOPT_CRYPTO_SECRET 13
> +#define QUIC_SOCKOPT_TRANSPORT_PARAM_EXT 14
> +
> +#define QUIC_VERSION_V1 0x1
> +#define QUIC_VERSION_V2 0x6b3343cf
> +
> +struct quic_transport_param {
> + __u8 remote;
> + __u8 disable_active_migration;
> + __u8 grease_quic_bit;
> + __u8 stateless_reset;
> + __u8 disable_1rtt_encryption;
> + __u8 disable_compatible_version;
> + __u8 active_connection_id_limit;
> + __u8 ack_delay_exponent;
> + __u16 max_datagram_frame_size;
> + __u16 max_udp_payload_size;
> + __u32 max_idle_timeout;
> + __u32 max_ack_delay;
> + __u16 max_streams_bidi;
> + __u16 max_streams_uni;
> + __u64 max_data;
> + __u64 max_stream_data_bidi_local;
> + __u64 max_stream_data_bidi_remote;
> + __u64 max_stream_data_uni;
> + __u64 reserved;
> +};
> +
> +struct quic_config {
> + __u32 version;
> + __u32 plpmtud_probe_interval;
> + __u32 initial_smoothed_rtt;
> + __u32 payload_cipher_type;
> + __u8 congestion_control_algo;
> + __u8 validate_peer_address;
> + __u8 stream_data_nodelay;
> + __u8 receive_session_ticket;
> + __u8 certificate_request;
> + __u8 reserved[3];
> +};
> +
> +struct quic_crypto_secret {
> + __u8 send; /* send or recv */
> + __u8 level; /* crypto level */
> + __u32 type; /* TLS_CIPHER_* */
> +#define QUIC_CRYPTO_SECRET_BUFFER_SIZE 48
> + __u8 secret[QUIC_CRYPTO_SECRET_BUFFER_SIZE];
> +};
> +
> +enum quic_cong_algo {
> + QUIC_CONG_ALG_RENO,
> + QUIC_CONG_ALG_MAX,
> +};
> +
> +struct quic_errinfo {
> + __s64 stream_id;
> + __u32 errcode;
> +};
> +
> +struct quic_connection_id_info {
> + __u8 dest;
> + __u32 active;
> + __u32 prior_to;
> +};
> +
> +struct quic_event_option {
> + __u8 type;
> + __u8 on;
> +};
> +
> +/* Event APIs */
> +enum quic_event_type {
> + QUIC_EVENT_NONE,
> + QUIC_EVENT_STREAM_UPDATE,
> + QUIC_EVENT_STREAM_MAX_DATA,
> + QUIC_EVENT_STREAM_MAX_STREAM,
> + QUIC_EVENT_CONNECTION_ID,
> + QUIC_EVENT_CONNECTION_CLOSE,
> + QUIC_EVENT_CONNECTION_MIGRATION,
> + QUIC_EVENT_KEY_UPDATE,
> + QUIC_EVENT_NEW_TOKEN,
> + QUIC_EVENT_NEW_SESSION_TICKET,
> + QUIC_EVENT_MAX,
> +};
> +
> +enum {
> + QUIC_STREAM_SEND_STATE_READY,
> + QUIC_STREAM_SEND_STATE_SEND,
> + QUIC_STREAM_SEND_STATE_SENT,
> + QUIC_STREAM_SEND_STATE_RECVD,
> + QUIC_STREAM_SEND_STATE_RESET_SENT,
> + QUIC_STREAM_SEND_STATE_RESET_RECVD,
> +
> + QUIC_STREAM_RECV_STATE_RECV,
> + QUIC_STREAM_RECV_STATE_SIZE_KNOWN,
> + QUIC_STREAM_RECV_STATE_RECVD,
> + QUIC_STREAM_RECV_STATE_READ,
> + QUIC_STREAM_RECV_STATE_RESET_RECVD,
> + QUIC_STREAM_RECV_STATE_RESET_READ,
> +};
> +
> +struct quic_stream_update {
> + __s64 id;
> + __u8 state;
> + __u32 errcode;
> + __u64 finalsz;
> +};
> +
> +struct quic_stream_max_data {
> + __s64 id;
> + __u64 max_data;
> +};
> +
> +struct quic_connection_close {
> + __u32 errcode;
> + __u8 frame;
> + __u8 phrase[];
> +};
> +
> +union quic_event {
> + struct quic_stream_update update;
> + struct quic_stream_max_data max_data;
> + struct quic_connection_close close;
> + struct quic_connection_id_info info;
> + __u64 max_stream;
> + __u8 local_migration;
> + __u8 key_update_phase;
> +};
> +
> +enum {
> + QUIC_TRANSPORT_ERROR_NONE = 0x00,
> + QUIC_TRANSPORT_ERROR_INTERNAL = 0x01,
> + QUIC_TRANSPORT_ERROR_CONNECTION_REFUSED = 0x02,
> + QUIC_TRANSPORT_ERROR_FLOW_CONTROL = 0x03,
> + QUIC_TRANSPORT_ERROR_STREAM_LIMIT = 0x04,
> + QUIC_TRANSPORT_ERROR_STREAM_STATE = 0x05,
> + QUIC_TRANSPORT_ERROR_FINAL_SIZE = 0x06,
> + QUIC_TRANSPORT_ERROR_FRAME_ENCODING = 0x07,
> + QUIC_TRANSPORT_ERROR_TRANSPORT_PARAM = 0x08,
> + QUIC_TRANSPORT_ERROR_CONNECTION_ID_LIMIT = 0x09,
> + QUIC_TRANSPORT_ERROR_PROTOCOL_VIOLATION = 0x0a,
> + QUIC_TRANSPORT_ERROR_INVALID_TOKEN = 0x0b,
> + QUIC_TRANSPORT_ERROR_APPLICATION = 0x0c,
> + QUIC_TRANSPORT_ERROR_CRYPTO_BUF_EXCEEDED = 0x0d,
> + QUIC_TRANSPORT_ERROR_KEY_UPDATE = 0x0e,
> + QUIC_TRANSPORT_ERROR_AEAD_LIMIT_REACHED = 0x0f,
> + QUIC_TRANSPORT_ERROR_NO_VIABLE_PATH = 0x10,
> +
> + /* The cryptographic handshake failed. A range of 256 values is reserved
> + * for carrying error codes specific to the cryptographic handshake that
> + * is used. Codes for errors occurring when TLS is used for the
> + * cryptographic handshake are described in Section 4.8 of [QUIC-TLS].
> + */
> + QUIC_TRANSPORT_ERROR_CRYPTO = 0x0100,
> +};
> +
> +#endif /* _UAPI_LINUX_QUIC_H */
> diff --git a/net/quic/socket.c b/net/quic/socket.c
> index a0eedf59545a..a0ebc6b56879 100644
> --- a/net/quic/socket.c
> +++ b/net/quic/socket.c
> @@ -121,6 +121,25 @@ static int quic_setsockopt(struct sock *sk, int level, int optname,
> return quic_do_setsockopt(sk, optname, optval, optlen);
> }
>
> +/**
> + * quic_kernel_setsockopt - set a QUIC socket option from within the kernel
> + * @sk: socket to configure
> + * @optname: option name (QUIC-level)
> + * @optval: pointer to the option value
> + * @optlen: size of the option value
> + *
> + * Sets a QUIC socket option on a kernel socket without involving user space.
> + *
> + * Return:
> + * - On success, 0 is returned.
> + * - On error, a negative error value is returned.
> + */
> +int quic_kernel_setsockopt(struct sock *sk, int optname, void *optval, unsigned int optlen)
> +{
> + return quic_do_setsockopt(sk, optname, KERNEL_SOCKPTR(optval), optlen);
> +}
> +EXPORT_SYMBOL_GPL(quic_kernel_setsockopt);
> +
> static int quic_do_getsockopt(struct sock *sk, int optname, sockptr_t optval, sockptr_t optlen)
> {
> return -EOPNOTSUPP;
> @@ -135,6 +154,25 @@ static int quic_getsockopt(struct sock *sk, int level, int optname,
> return quic_do_getsockopt(sk, optname, USER_SOCKPTR(optval), USER_SOCKPTR(optlen));
> }
>
> +/**
> + * quic_kernel_getsockopt - get a QUIC socket option from within the kernel
> + * @sk: socket to query
> + * @optname: option name (QUIC-level)
> + * @optval: pointer to the buffer to receive the option value
> + * @optlen: pointer to the size of the buffer; updated to actual length on return
> + *
> + * Gets a QUIC socket option from a kernel socket, bypassing user space.
> + *
> + * Return:
> + * - On success, 0 is returned.
> + * - On error, a negative error value is returned.
> + */
> +int quic_kernel_getsockopt(struct sock *sk, int optname, void *optval, unsigned int *optlen)
> +{
> + return quic_do_getsockopt(sk, optname, KERNEL_SOCKPTR(optval), KERNEL_SOCKPTR(optlen));
> +}
> +EXPORT_SYMBOL_GPL(quic_kernel_getsockopt);
> +
> static void quic_release_cb(struct sock *sk)
> {
> }
> diff --git a/net/quic/socket.h b/net/quic/socket.h
> index 0aa642e3b0ae..7ee190af4454 100644
> --- a/net/quic/socket.h
> +++ b/net/quic/socket.h
> @@ -9,6 +9,7 @@
> */
>
> #include <net/udp_tunnel.h>
> +#include <linux/quic.h>
>
> #include "common.h"
> #include "family.h"
> @@ -29,6 +30,7 @@ struct quic_sock {
> struct inet_sock inet;
> struct list_head reqs;
>
> + struct quic_config config;
> struct quic_data ticket;
> struct quic_data token;
> struct quic_data alpn;
> @@ -49,6 +51,11 @@ static inline struct list_head *quic_reqs(const struct sock *sk)
> return &quic_sk(sk)->reqs;
> }
>
> +static inline struct quic_config *quic_config(const struct sock *sk)
> +{
> + return &quic_sk(sk)->config;
> +}
> +
> static inline struct quic_data *quic_token(const struct sock *sk)
> {
> return &quic_sk(sk)->token;
> --
> 2.47.1
>
next prev parent reply other threads:[~2026-01-08 5:29 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-05 14:04 [PATCH net-next v6 00/16] net: introduce QUIC infrastructure and core subcomponents Xin Long
2026-01-05 14:04 ` [PATCH net-next v6 01/16] net: define IPPROTO_QUIC and SOL_QUIC constants Xin Long
2026-01-05 14:04 ` [PATCH net-next v6 02/16] net: build socket infrastructure for QUIC protocol Xin Long
2026-01-08 14:40 ` Paolo Abeni
2026-01-08 22:19 ` Xin Long
2026-01-05 14:04 ` [PATCH net-next v6 03/16] quic: provide common utilities and data structures Xin Long
2026-01-08 14:45 ` Paolo Abeni
2026-01-08 16:58 ` Xin Long
2026-01-05 14:04 ` [PATCH net-next v6 04/16] quic: provide family ops for address and protocol Xin Long
2026-01-08 14:51 ` Paolo Abeni
2026-01-05 14:04 ` [PATCH net-next v6 05/16] quic: provide quic.h header files for kernel and userspace Xin Long
2026-01-08 5:29 ` Yohei Kojima [this message]
2026-01-08 9:15 ` Stefan Metzmacher
2026-01-08 10:32 ` Yohei Kojima
2026-01-08 15:00 ` Paolo Abeni
2026-01-08 17:44 ` Xin Long
2026-01-05 14:04 ` [PATCH net-next v6 06/16] quic: add stream management Xin Long
2026-01-08 15:35 ` Paolo Abeni
2026-01-08 20:29 ` Xin Long
2026-01-08 20:53 ` Xin Long
2026-01-05 14:04 ` [PATCH net-next v6 07/16] quic: add connection id management Xin Long
2026-01-08 15:52 ` Paolo Abeni
2026-01-08 18:07 ` Xin Long
2026-01-05 14:04 ` [PATCH net-next v6 08/16] quic: add path management Xin Long
2026-01-05 14:04 ` [PATCH net-next v6 09/16] quic: add congestion control Xin Long
2026-01-05 14:04 ` [PATCH net-next v6 10/16] quic: add packet number space Xin Long
2026-01-05 14:04 ` [PATCH net-next v6 11/16] quic: add crypto key derivation and installation Xin Long
2026-01-05 14:04 ` [PATCH net-next v6 12/16] quic: add crypto packet encryption and decryption Xin Long
2026-01-05 14:04 ` [PATCH net-next v6 13/16] quic: add timer management Xin Long
2026-01-05 14:04 ` [PATCH net-next v6 14/16] quic: add frame encoder and decoder base Xin Long
2026-01-05 14:04 ` [PATCH net-next v6 15/16] quic: add packet builder base Xin Long
2026-01-05 14:04 ` [PATCH net-next v6 16/16] quic: add packet parser base Xin Long
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aV9AwNITeyL71INz@desktop.y-koj.net \
--to=yk@y-koj.net \
--cc=aahringo@redhat.com \
--cc=alibuda@linux.alibaba.com \
--cc=andrew.gospodarek@broadcom.com \
--cc=chuck.lever@oracle.com \
--cc=daniel@haxx.se \
--cc=davem@davemloft.net \
--cc=dhowells@redhat.com \
--cc=dreibh@simula.no \
--cc=edumazet@google.com \
--cc=hare@suse.de \
--cc=hepengtao@xiaomi.com \
--cc=horms@kernel.org \
--cc=illiliti@protonmail.com \
--cc=jbaron@akamai.com \
--cc=jlayton@kernel.org \
--cc=kernel-tls-handshake@lists.linux.dev \
--cc=kuba@kernel.org \
--cc=linkinjeon@kernel.org \
--cc=linux-cifs@vger.kernel.org \
--cc=lucien.xin@gmail.com \
--cc=mail@johnericson.me \
--cc=marcelo.leitner@gmail.com \
--cc=matttbe@kernel.org \
--cc=mbuhl@openbsd.org \
--cc=metze@samba.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=pc@manguebit.com \
--cc=quic@lists.linux.dev \
--cc=sd@queasysnail.net \
--cc=smfrench@gmail.com \
--cc=steved@redhat.com \
--cc=tfanelli@redhat.com \
--cc=tom@talpey.com \
--cc=xiyou.wangcong@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox