From nobody Mon Aug 24 00:17:38 2026 Received: from mail-wr1-f41.google.com (mail-wr1-f41.google.com [209.85.221.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EFF853B775A for ; Thu, 30 Jul 2026 07:12:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785395575; cv=none; b=gY5HUSiEhQZo7TCrj6+hCur9dyCB4USIgDS8S7WRwQr8mCApWfYA/retsz+j2rHGJfR0Lwo/F+chMqul9YOa4BMahsqC54ubxYO8TitGYdbYjhgxSeqqaj/51CVRBv8TIpqWbCqCw7DQ3mN/vjQp91yeuUR1zoyMqdFUjWn+ntg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785395575; c=relaxed/simple; bh=yr4oc3G5MSsrxA8IlYlgHqJ9tgTuIQuzJ2aXr6sgGDw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=u+R+QpY5IU6F65BmXNZYbzn+z2Ih0Btu8YGL8YW+LC1hHWYpldzYWcnvdCN50pjdPQKfS1bxOIT96ZQzifSztpPEzeocnBANF1psIVKHAHZnkdqbZEVNn/UHp6rWHFGnTaKWD8qDYc5QKASr/js7ERobmzgNbfTeS0UH2I4fjKg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=f2LA/TXZ; arc=none smtp.client-ip=209.85.221.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="f2LA/TXZ" Received: by mail-wr1-f41.google.com with SMTP id ffacd0b85a97d-47f7027ca11so1153952f8f.3 for ; Thu, 30 Jul 2026 00:12:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785395569; x=1786000369; darn=lists.linux.dev; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=pkFoVpfDNFpG3p2l5jnz74+X7txAaKO9hQI4sYfh4e4=; b=f2LA/TXZjJB4UqAqt+++ml+xTOf4241zi9NIrWy40FxPlJDsNS3ZHrFQT98IEz965x S0+kSRj8CxLlBM15Cq3Qb0CVsIbSVt3uQWl/6rBccRtVCoiUM5o2bu7/L6HkSQehuUzt T7g1Jsadgw1j1JdDPhLQiVIJQYCTnYfu+AJUxkyQRyF0eOQN7JkL3RzbsQsVXq5i2bEE z1BUPnTXmmgDvOSqYhLmeRXW+EmRCVssn3GCPrjkdFvp1JviQtLL3HwVhYEOBSmJAQF/ RuZ2zWYWxUZk4ws67A/jcYgiY7RJeGcP57fJi12GcGmgkpR/jt8pgOMqH+mGka23AeL6 RtqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785395569; x=1786000369; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=pkFoVpfDNFpG3p2l5jnz74+X7txAaKO9hQI4sYfh4e4=; b=VeKWYyqyp4zEnAvYihaoxG1yYAFfve7jDPqUabnXjS186iAqT2INiyKhGGsSfRZuJT ZUr+KdC+yJ44+36Y+KRf5GYwuKE2ZGvKQR6fACPITw/cpPmlT5+yJAYlbQ5wndEu969J 6f1y/OUNLfglo/H0LDoAW3+EOj1nEwkncfa4dXiRbY25wFAV2TKq7z6der+PUFByJLG4 14LaugcoxmF3K+mS9xR9J91MaNC1vDTA5bI/9u/5nIQFLbC+wmolzdxlmkn/4EIh2z5U iFUGwg6sXR1XN4zjTZQ0sI17sgzokb2Fvh7zAxALn41oM+siTSCZ6s51+NGyzNFmHRId /O4Q== X-Gm-Message-State: AOJu0YzP8HYDMR8kOp8XTQ9RK7+hh0hHKY9iRoZ9erx/NGsKsDBZLzn0 G5eJ0b2VwBKlGGkPTtzx1Cd/nNc7a3j4pONknhcSKoKiGxudDfc881muxifodQ== X-Gm-Gg: AR+sD12QAYx4f9xLp31g1btcrk271ZeeYAqo7qxLct+yscasAK6pmCExFU9CPJ5CESj YopdaZNLQfcQYrZZwrL40aMCyyZP9Gt86ZRa6LEF0aTr8ZxthctWeBgB8zUGvOB2sj25RuKuEqN QTWR0ivtPARBKtczT3YJy12eYRMDZUwGBC4VDZORxaMaVJdMbZ/7BPBgY1kI901aLqeKvLj3xDz +qJ1QoY8Fxor79Y0YiWISxVFCigHj6b4Bog1Ful2ZgoGzMgTNwv/x54CIltWo6znUbaYidFLEw9 phCKGbYD7Jx+DtA15lfVi99ARrevcZHQtAnICIhxecUIWsJfLTWXjgz4lO6fVoE7DltI09obWMZ b+BxpwsmGwl0fY8fZbHzA0unWYp+r9X88w3H1yZE5eMzptpcbUOCk6HRMfpxkzOeHXE2XjDs6Go IHayYXenvQ5+22sTjeL3LkEWYt/zwfg3wVE7+FlP/IXxKyk40TrPWXZrQVPUqeOXTlw3O3Phnee fcOQg2/LAqpvgFoDK8Urxt5vENIIOhPxiDHKuYrsKJLyd8NOp73LksPj/k= X-Received: by 2002:a05:6000:220b:b0:47f:6fbd:8a23 with SMTP id ffacd0b85a97d-47fc822ea58mr1358225f8f.9.1785395568373; Thu, 30 Jul 2026 00:12:48 -0700 (PDT) Received: from dohko.chello.ie (188-141-5-72.dynamic.upc.ie. [188.141.5.72]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-47fc88d6e5bsm3821717f8f.3.2026.07.30.00.12.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jul 2026 00:12:48 -0700 (PDT) From: David Carlier To: mptcp@lists.linux.dev Cc: matttbe@kernel.org, martineau@kernel.org, geliang@kernel.org, pabeni@redhat.com, David Carlier Subject: [PATCH mptcp-next v12 1/4] mptcp: support MSG_ERRQUEUE on the parent socket Date: Thu, 30 Jul 2026 08:12:41 +0100 Message-ID: <20260730071244.69473-2-devnexen@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260730071244.69473-1-devnexen@gmail.com> References: <20260730071244.69473-1-devnexen@gmail.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Splice pending err skbs from each subflow's error queue onto the parent msk's error queue at error-report time, so poll() and recvmsg(MSG_ERRQUEUE) on the parent socket observe TX timestamps through the standard inet ABI. The splice filters by SO_EE_ORIGIN: TIMESTAMPING events forward to the parent because they are tied to user-handed data, not to a specific path; subflow-level ICMP errors are dropped because the legacy RECVERR ABI cannot meaningfully convey their per-subflow peer identity to single-path-aware userspace. Such events will be carried by a future MPTCP_RECERR channel. Forwarded events all go through sock_queue_err_skb(), which re-homes skb->sk onto the parent and charges sk_rmem_alloc, so the parent's error queue stays bounded by sk_rcvbuf and is dropped under rmem pressure (sk_rmem_alloc + truesize >=3D sk_rcvbuf), matching tcp's sk_rcvbuf-gated tx-timestamp path and ip_icmp_error() / ipv6_icmp_error(). The MSG_ERRQUEUE branch of mptcp_recvmsg() forwards to inet_recv_error() directly, and poll() advertises EPOLLERR purely on the parent's sk_err / sk_error_queue, matching tcp_poll(). Signed-off-by: David Carlier --- net/mptcp/protocol.c | 54 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 45 insertions(+), 9 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 90dc894cb976..ade017f9ce5b 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -901,21 +902,52 @@ static bool __mptcp_ofo_queue(struct mptcp_sock *msk) return moved; } =20 +static bool mptcp_errqueue_skb_forwardable(const struct sk_buff *skb) +{ + /* Subflow-level ICMP errors are dropped: the legacy RECVERR ABI + * cannot convey their per-subflow peer identity. + */ + return SKB_EXT_ERR(skb)->ee.ee_origin =3D=3D SO_EE_ORIGIN_TIMESTAMPING; +} + +static bool __mptcp_subflow_splice_errqueue(struct sock *sk, struct sock *= ssk) +{ + struct sk_buff *skb; + bool moved =3D false; + + while ((skb =3D skb_dequeue(&ssk->sk_error_queue))) { + /* sock_queue_err_skb() re-homes skb->sk onto the parent and + * charges sk_rmem_alloc, bounding the queue by sk_rcvbuf. + */ + if (!mptcp_errqueue_skb_forwardable(skb) || + sock_queue_err_skb(sk, skb)) { + kfree_skb(skb); + continue; + } + moved =3D true; + } + + return moved; +} + static bool __mptcp_subflow_error_report(struct sock *sk, struct sock *ssk) { + bool propagated =3D false; int ssk_state; + bool report; int err; =20 + report =3D __mptcp_subflow_splice_errqueue(sk, ssk); + /* only propagate errors on fallen-back sockets or * on MPC connect */ if (sk->sk_state !=3D TCP_SYN_SENT && !__mptcp_check_fallback(mptcp_sk(sk= ))) - return false; + goto out; =20 err =3D sock_error(ssk); if (!err) - return false; - + goto out; /* We need to propagate only transition to CLOSE state. * Orphaned socket will see such state change via * subflow_sched_work_if_closed() and that path will properly @@ -925,11 +957,15 @@ static bool __mptcp_subflow_error_report(struct sock = *sk, struct sock *ssk) if (ssk_state =3D=3D TCP_CLOSE && !sock_flag(sk, SOCK_DEAD)) mptcp_set_state(sk, ssk_state); WRITE_ONCE(sk->sk_err, -err); + report =3D propagated =3D true; =20 - /* This barrier is coupled with smp_rmb() in mptcp_poll() */ - smp_wmb(); - sk_error_report(sk); - return true; +out: + if (report) { + /* This barrier is coupled with smp_rmb() in mptcp_poll() */ + smp_wmb(); + sk_error_report(sk); + } + return propagated; } =20 void __mptcp_error_report(struct sock *sk) @@ -2363,7 +2399,6 @@ static int mptcp_recvmsg(struct sock *sk, struct msgh= dr *msg, size_t len, int target; long timeo; =20 - /* MSG_ERRQUEUE is really a no-op till we support IP_RECVERR */ if (unlikely(flags & MSG_ERRQUEUE)) return inet_recv_error(sk, msg, len); =20 @@ -4493,7 +4528,8 @@ static __poll_t mptcp_poll(struct file *file, struct = socket *sock, =20 /* This barrier is coupled with smp_wmb() in __mptcp_error_report() */ smp_rmb(); - if (READ_ONCE(sk->sk_err)) + if (READ_ONCE(sk->sk_err) || + !skb_queue_empty_lockless(&sk->sk_error_queue)) mask |=3D EPOLLERR; =20 return mask; --=20 2.53.0 From nobody Mon Aug 24 00:17:38 2026 Received: from mail-wr1-f45.google.com (mail-wr1-f45.google.com [209.85.221.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3F9873BD64D for ; Thu, 30 Jul 2026 07:12:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785395576; cv=none; b=bnXgxY8kqOK367LPSpgkMgfPltdXY6kMCTsk8RuVWWdtfjFxb2IeR8J8DZgiqkKugR5mqRxe5l05Q4RmXe5oYgoxU/3fg1QXCQhMBJIwJfXOg0/x0QkvxWpjeugQS7zL5dgz5QN4L9w7uGhqNeYhy8Nc25bF4Qp++vFnZU+//YE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785395576; c=relaxed/simple; bh=Vdq51RVUF1oQq0L2xdAL1r37YbnTayVtpjjYKl9BPPI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lSzeCd2+wzi4Q0GS0PblU2yflfib0uWdZL7gmCR1I1MMl4vXFtrTZ/w0Us1ZLx7g4/xc4V5ibI19MazEO1Cd97aD//j7oG8m99FMpidmienTsepSFG6ue+m4MPY+aZZHKtnGvILgvEXqI0AvQcTc7+i4huX6PDhYJP6EX+Wt51c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=flQ/x1FV; arc=none smtp.client-ip=209.85.221.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="flQ/x1FV" Received: by mail-wr1-f45.google.com with SMTP id ffacd0b85a97d-47df43bfb07so671715f8f.1 for ; Thu, 30 Jul 2026 00:12:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785395569; x=1786000369; darn=lists.linux.dev; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=riAP+ewYVwhw0rJlj7JyI87rScGwTcKhqzJ8HeBg2uw=; b=flQ/x1FVOaqsr//fCAwFPpXc3xZFDqjxUVKILDsM/Poi44unaH3cDM0YoIUYQhLytf d9R+vLy5CfJqGchZhDciIjhN4F/WCOTMMCLJEzEv52TEhD4JANxq1VDFF51ccw4OLBeZ OgqMvst4LgfMmHh1NNDf6n2MAp4v03WhDXrWXaKU/u/9HQB/ZmK1EVG2ryyoz1xzB5Vk EsDo1T/FlbD9fFKUtKuiZAVgUL2sLaIy+jX9WXTDkEeJIQF2E6h+QxK9JWZSKbYIDl9/ vepM9rkgyDWU+fDGO6yS3mDs+iuE8hgiVQ1EGjnXT/ODnIz8W7/IsI3cYtR460fvfdm+ LjFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785395569; x=1786000369; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=riAP+ewYVwhw0rJlj7JyI87rScGwTcKhqzJ8HeBg2uw=; b=NzMtktZkGwktz8MSX3SnHe1uFMKMzDvwdOPu941rsdGKmaS0aEkragzTeDeRU74jhS DPf5cLojR2FopRtH6iZcpiDcaMIE/OWhSApNqFYEnSzaU7qIGmbkrwz+bDpzUeXwR85L 6Oc54R+fqVopDJpstoxQ3EUNeudMafkVufoSSBek9KW9JpUEA5M33WdhBpv7rul8xJKp uIkFBpgOW+VwP5EnyzSHVUX7E7VjS67IS1u9DbASp8A61uOk0sJJ/HiALhI52Lw9m52f B2UgUX2/GFRPBACBfympIRfmNRrf/yvEwZUUenfYkS2x0AyNibAZNzfwHWSgI2aqrHl8 FzFQ== X-Gm-Message-State: AOJu0YzVQ/yusz3SAVGuS+Q/FIqTFPeKHejpUpqnmgvPwHebw9Q+czEF gLHOITILrIBnM13D8IL6HZkXGAB6E4jzgWnzmVcTP3lk0OzmSz/47aCGVjshDQ== X-Gm-Gg: AR+sD12SKsFw7NafGO2S9JjIIzkQ1oqnVBa3XYN79Xd+LuxRg1mFfXqNa9UYLICrkh2 BbauJ7QOrrhHj0DPOjz9uiTNhK2JtbPcA0O9idA7vhcg+i5y2QFALrElE8sahwZnDjH2FTFYGAo /uRp72WTXoJrIjhGLCNMmgOwoWEi78vC+4XdEAK5C2QyI/avxSz/Fv6SNEUSdQ/PRJSk8YoM0De VTTPqZJignJJAW2UlBaZNy7zuI12he/oilqHfnr8gyQTM15dDdUCUGV+X/yP/mW9kbq2F0Ew+J1 r6q/G2qxNsisNbwlrk1MpTcwYHIXC3dSy/ORv4l3HDAUt3/ELtf3HdK0CXeWCfMFQqoQ3r9ge4J n6SA2PtipDtRaoby1+GHIwAFxPy99m38t269eU6xJFlD/3KQGbacFbiW4987v99Jxb+QxCp+wR5 n5df96ugtc40UAfMLI5M0fiz7NaZ54C9wGPwhJ90jSKzOMAV2cbLN8lN33YgVWbEP/92bvbjlcL bOqkpsTXd9RNfj9Bv6gk/Szz8AhDU/G5039hSxvxN+svZRw X-Received: by 2002:a5d:588a:0:b0:478:77c1:787c with SMTP id ffacd0b85a97d-47fc8212e7dmr1780819f8f.56.1785395569297; Thu, 30 Jul 2026 00:12:49 -0700 (PDT) Received: from dohko.chello.ie (188-141-5-72.dynamic.upc.ie. [188.141.5.72]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-47fc88d6e5bsm3821717f8f.3.2026.07.30.00.12.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jul 2026 00:12:48 -0700 (PDT) From: David Carlier To: mptcp@lists.linux.dev Cc: matttbe@kernel.org, martineau@kernel.org, geliang@kernel.org, pabeni@redhat.com, David Carlier Subject: [PATCH mptcp-next v12 2/4] mptcp: sockopt: factor inet_flags propagation into a mask Date: Thu, 30 Jul 2026 08:12:42 +0100 Message-ID: <20260730071244.69473-3-devnexen@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260730071244.69473-1-devnexen@gmail.com> References: <20260730071244.69473-1-devnexen@gmail.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Introduce MPTCP_INET_FLAGS_MASK and replace the per-flag inet_assign_bit() calls in sync_socket_options() with a loop driven by the mask that calls assign_bit() per set bit, preserving the per-bit atomicity of the original. Further flags propagated by MPTCP can be added by extending the mask rather than touching the call site. No functional change. Signed-off-by: David Carlier --- net/mptcp/sockopt.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index fcf6feb2a9eb..2ba56832587e 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -16,6 +16,10 @@ =20 #define MIN_INFO_OPTLEN_SIZE 16 #define MIN_FULL_INFO_OPTLEN_SIZE 40 +#define MPTCP_INET_FLAGS_MASK \ + (BIT(INET_FLAGS_TRANSPARENT) | \ + BIT(INET_FLAGS_FREEBIND) | \ + BIT(INET_FLAGS_BIND_ADDRESS_NO_PORT)) =20 static struct sock *__mptcp_tcp_fallback(struct mptcp_sock *msk) { @@ -1550,8 +1554,11 @@ int mptcp_getsockopt(struct sock *sk, int level, int= optname, static void sync_socket_options(struct mptcp_sock *msk, struct sock *ssk) { static const unsigned int tx_rx_locks =3D SOCK_RCVBUF_LOCK | SOCK_SNDBUF_= LOCK; + unsigned long mask =3D MPTCP_INET_FLAGS_MASK; struct sock *sk =3D (struct sock *)msk; + unsigned long src; bool keep_open; + int b; =20 keep_open =3D sock_flag(sk, SOCK_KEEPOPEN); if (ssk->sk_prot->keepalive) @@ -1597,9 +1604,11 @@ static void sync_socket_options(struct mptcp_sock *m= sk, struct sock *ssk) tcp_sock_set_keepcnt(ssk, msk->keepalive_cnt); tcp_sock_set_maxseg(ssk, msk->maxseg); =20 - inet_assign_bit(TRANSPARENT, ssk, inet_test_bit(TRANSPARENT, sk)); - inet_assign_bit(FREEBIND, ssk, inet_test_bit(FREEBIND, sk)); - inet_assign_bit(BIND_ADDRESS_NO_PORT, ssk, inet_test_bit(BIND_ADDRESS_NO_= PORT, sk)); + src =3D READ_ONCE(inet_sk(sk)->inet_flags); + + for_each_set_bit(b, &mask, BITS_PER_LONG) + assign_bit(b, &inet_sk(ssk)->inet_flags, src & BIT(b)); + WRITE_ONCE(inet_sk(ssk)->local_port_range, READ_ONCE(inet_sk(sk)->local_p= ort_range)); } =20 --=20 2.53.0 From nobody Mon Aug 24 00:17:38 2026 Received: from mail-wr1-f41.google.com (mail-wr1-f41.google.com [209.85.221.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C05783BB69A for ; Thu, 30 Jul 2026 07:12:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785395577; cv=none; b=t+1/prWXUC70A/fbxKy0NR1WnpBwdaavcfHP/XBgEVDCOepkXugUscWhD5pqG0HmT2lkL9uy23e0x0BIxclc/C/CE5YuZ/3N+bBzbadw2S2L8O21b5nUP3aZK91qKWMWbdNNDh5e4JYIKqwjQvbhNLHjBGUuWIVh7K15LFUtnFs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785395577; c=relaxed/simple; bh=K6l8M2ImgLWDN8CNAxnVhqrnL3ehaBwMea8ZVifFxn4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lLnmZpXKHms+4E1j1GI3+c56ujJKbVO449Euj1p/5kD2EVCaeOyZS6M/zN7LmZWZ1R+7at7QvN570Q0yyiu9CDofEWq+ApGtwstm5XG7chlZm9tVV/MmOL+qpD6ZWvIiZg9bhxwCVNRzgXHgjtS5PB4q4t9fKH+fW280IK66m2k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=q7iByrdg; arc=none smtp.client-ip=209.85.221.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="q7iByrdg" Received: by mail-wr1-f41.google.com with SMTP id ffacd0b85a97d-47f7872abb6so1067516f8f.3 for ; Thu, 30 Jul 2026 00:12:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785395570; x=1786000370; darn=lists.linux.dev; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=NFrk/CZh/9/ejNoVEbaW39y3qp7KGHiAW2542tNoiGQ=; b=q7iByrdg8czmr//ml80EacxtIs8DxO+NQY17ocKZc4jaDva9WvP3BXF8sduyKi6hEO 84l2TFtyTB2EUPd5zAhBu/yOoVyoi6o0FTwWq8mSHtOm6llfqdiaEizWEdGo3myIs8Wq yWjlgiZ9/JQ+ZjuqjT82W3ngu4mVP5wyEJ2+XHYtpLF0JsOiD1QsB9ygwkhz0oTrI1MT MvZ6oL16Kr3Me6ZtixWkLjM9iOxKY57Q0aD1dOyT+4gUz+DY3uVjNlZvlv5KkaZOlfWi Ml2toUBINIRJDWjslgQB7Za6xgt+Ty5wfMa13ZerLQvsQLMjFZN5Xa+bNmnOPnap4NWO 8EqA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785395570; x=1786000370; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=NFrk/CZh/9/ejNoVEbaW39y3qp7KGHiAW2542tNoiGQ=; b=m9yCh6IsYo2q6Yw20C7gZ8hQG/+7BxahpfQ3dESAwL4ZbwpS7e06xQ/7QSRrHhEzK5 kY6ht2iqWteWXjBgQSr2r8UugoNjgrGxHED9BtzPt9EuuRlqiXl2V/ol2vC+ZJ7Y5KeT mpmoi7Qj7X++n+s7ZSw2ZQw29xGhI9Du5A4azop+kPrx3o+CG55/n9OaHey6V1GiZi5Z //ioL6JMPm98SudINbHCwf16DVqZ9KS0cI3R3eRjHOTy4TtXlZ8OLsl/vvgkYCglpula aVq78BVKy2vb32P9PySP/hw7/vqiws1ZG5EX6o4lA7f5q/1vDQ3snqx0peBAg0Yql+qZ sB+Q== X-Gm-Message-State: AOJu0YxURI1Bwrc6FzTjtNOs2CUCmpiNs9zXrKtmccPnU2xWctOMZcX8 MqoCWIL3Cu41GaV8Y20p1C72Qlh0fmolpV+ysCktG8zXw+GhuT8qC91sfxhCiw== X-Gm-Gg: AR+sD10YjhglR7wv69AyIpdaTihQPawV/+d6UhQXZNaR/BeS/Sgub4qvIuGjt6IbeGS 4xdkxdi4bjxiSlZ0nSfGOcYXsffI9NuBoidMJCeAsDKV6RiME3deyeh3LYB8itlVdPOWbWXL55p yFPNABJe2+INtnSyS4xs1EhCjtHh+HQL8iC8V4rZHW062L3ZlftA0ShHFsI/x3hLMAf/paWjlNj eFggr5Y9LniqfToFpcX0iocipCZPbIzIfAhg7UYeRjb0sZK+KvBkODgIBkD3SyIcFR0HgXNU1as fomcgbG1NbIsHKQ5vm5yaXgWUi7AjRhiT4ou3pzgqxPKlioMyeynRjCern3mu3+SZpMZ/fJ0Ced IwOXMjL5Kxwhyl+4RfuhX9ulZ0TFRWGqL2n/HA6srykVrmmZHlHn/0AV+bAy/o5IUucHGtbHRhz kCJiVq5ygZdt/aMgmEmXFlANAU0dbpe2UOwqCW0aajgkf6JkDUJOR1J2obTAM0ih2V+ZIDsNDSi g37PtFgwHBVAD+MVDJnG2MkHibcP0m3Ezg42N1XNOJ6ditd X-Received: by 2002:a05:6000:381:b0:47f:762f:32a9 with SMTP id ffacd0b85a97d-47fc80c62admr1713288f8f.12.1785395570221; Thu, 30 Jul 2026 00:12:50 -0700 (PDT) Received: from dohko.chello.ie (188-141-5-72.dynamic.upc.ie. [188.141.5.72]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-47fc88d6e5bsm3821717f8f.3.2026.07.30.00.12.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jul 2026 00:12:49 -0700 (PDT) From: David Carlier To: mptcp@lists.linux.dev Cc: matttbe@kernel.org, martineau@kernel.org, geliang@kernel.org, pabeni@redhat.com, David Carlier Subject: [PATCH mptcp-next v12 3/4] mptcp: propagate RECVERR sockopts to subflows Date: Thu, 30 Jul 2026 08:12:43 +0100 Message-ID: <20260730071244.69473-4-devnexen@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260730071244.69473-1-devnexen@gmail.com> References: <20260730071244.69473-1-devnexen@gmail.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Propagate IP_RECVERR/IP_RECVERR_RFC4884 and IPV6_RECVERR/IPV6_RECVERR_RFC4884 from the MPTCP socket to existing and future subflows. mptcp_setsockopt_recverr() snapshots optval into a local int, applies it to the parent socket via ip_setsockopt() / ipv6_setsockopt(), bumps msk->setsockopt_seq, and forwards to every subflow via mptcp_setsockopt_all_sf(). Newly-joining subflows pick up the four RECVERR bits through sync_socket_options() now that MPTCP_INET_FLAGS_MASK covers them. mptcp_setsockopt_all_sf() skips IPv4 subflows when called with SOL_IPV6: ipv6_setsockopt() on a sock with sk_family !=3D AF_INET6 returns an error, which would abort the loop and leave the remaining subflows desynchronised. This branch was unreachable before this patch (the only caller was TCP_MAXSEG, family-agnostic); it becomes live with the new IPV6_RECVERR / IPV6_RECVERR_RFC4884 caller and the v4-subflow-on-AF_INET6-msk case (v4 MP_JOIN, or userspace PM grafting a v4 subflow onto a v6 msk). Assisted-by: Codex:gpt-5 Signed-off-by: David Carlier --- net/mptcp/sockopt.c | 140 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 117 insertions(+), 23 deletions(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 2ba56832587e..bc9d581a9744 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -8,6 +8,7 @@ =20 #include #include +#include #include #include #include @@ -19,7 +20,11 @@ #define MPTCP_INET_FLAGS_MASK \ (BIT(INET_FLAGS_TRANSPARENT) | \ BIT(INET_FLAGS_FREEBIND) | \ - BIT(INET_FLAGS_BIND_ADDRESS_NO_PORT)) + BIT(INET_FLAGS_BIND_ADDRESS_NO_PORT) | \ + BIT(INET_FLAGS_RECVERR) | \ + BIT(INET_FLAGS_RECVERR_RFC4884) | \ + BIT(INET_FLAGS_RECVERR6) | \ + BIT(INET_FLAGS_RECVERR6_RFC4884)) =20 static struct sock *__mptcp_tcp_fallback(struct mptcp_sock *msk) { @@ -398,6 +403,86 @@ static int mptcp_setsockopt_sol_socket(struct mptcp_so= ck *msk, int optname, return -EOPNOTSUPP; } =20 +static int mptcp_setsockopt_all_sf(struct mptcp_sock *msk, int level, + int optname, sockptr_t optval, + unsigned int optlen) +{ + struct mptcp_subflow_context *subflow; + int ret =3D 0; + + mptcp_for_each_subflow(msk, subflow) { + struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); + int err; + + /* SOL_IPV6 options on a v4 subflow (v4 MP_JOIN, or userspace PM + * grafting a v4 subflow onto an AF_INET6 msk) would otherwise + * abort the loop with -EAFNOSUPPORT from ipv6_setsockopt(). + */ + if (level =3D=3D SOL_IPV6 && ssk->sk_family !=3D AF_INET6) + continue; + + err =3D tcp_setsockopt(ssk, level, optname, optval, optlen); + if (err < 0 && ret =3D=3D 0) + ret =3D err; + } + + if (!ret) + sockopt_seq_inc(msk); + + return ret; +} + +static int mptcp_setsockopt_recverr(struct mptcp_sock *msk, int level, + int optname, sockptr_t optval, + unsigned int optlen) +{ + struct sock *sk =3D (struct sock *)msk; + int val =3D 0, ret; + + /* Let ip_setsockopt() / ipv6_setsockopt() validate optval and optlen + * (so 1-byte boolean writes keep the same ABI as plain TCP) and update + * the parent's RECVERR bit. Re-read that bit under lock_sock() and + * push it to the subflows: concurrent setsockopt callers cannot leave + * parent and subflows desynchronized this way. + */ + if (level =3D=3D SOL_IP) + ret =3D ip_setsockopt(sk, level, optname, optval, optlen); +#if IS_ENABLED(CONFIG_IPV6) + else if (level =3D=3D SOL_IPV6) { + if (sk->sk_family !=3D AF_INET6) + return -ENOPROTOOPT; + ret =3D ipv6_setsockopt(sk, level, optname, optval, optlen); + } +#endif + else + return -EOPNOTSUPP; + if (ret) + return ret; + + lock_sock(sk); + switch (optname) { + case IP_RECVERR: + val =3D inet_test_bit(RECVERR, sk); + break; + case IP_RECVERR_RFC4884: + val =3D inet_test_bit(RECVERR_RFC4884, sk); + break; +#if IS_ENABLED(CONFIG_IPV6) + case IPV6_RECVERR: + val =3D inet6_test_bit(RECVERR6, sk); + break; + case IPV6_RECVERR_RFC4884: + val =3D inet6_test_bit(RECVERR6_RFC4884, sk); + break; +#endif + } + + ret =3D mptcp_setsockopt_all_sf(msk, level, optname, + KERNEL_SOCKPTR(&val), sizeof(val)); + release_sock(sk); + return ret; +} + static int mptcp_setsockopt_v6(struct mptcp_sock *msk, int optname, sockptr_t optval, unsigned int optlen) { @@ -440,6 +525,10 @@ static int mptcp_setsockopt_v6(struct mptcp_sock *msk,= int optname, =20 release_sock(sk); break; + case IPV6_RECVERR: + case IPV6_RECVERR_RFC4884: + ret =3D mptcp_setsockopt_recverr(msk, SOL_IPV6, optname, optval, optlen); + break; } =20 return ret; @@ -785,6 +874,9 @@ static int mptcp_setsockopt_v4(struct mptcp_sock *msk, = int optname, return mptcp_setsockopt_sol_ip_set(msk, optname, optval, optlen); case IP_TOS: return mptcp_setsockopt_v4_set_tos(msk, optname, optval, optlen); + case IP_RECVERR: + case IP_RECVERR_RFC4884: + return mptcp_setsockopt_recverr(msk, SOL_IP, optname, optval, optlen); } =20 return -EOPNOTSUPP; @@ -812,28 +904,6 @@ static int mptcp_setsockopt_first_sf_only(struct mptcp= _sock *msk, int level, int return ret; } =20 -static int mptcp_setsockopt_all_sf(struct mptcp_sock *msk, int level, - int optname, sockptr_t optval, - unsigned int optlen) -{ - struct mptcp_subflow_context *subflow; - int ret =3D 0; - - mptcp_for_each_subflow(msk, subflow) { - struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); - int err; - - err =3D tcp_setsockopt(ssk, level, optname, optval, optlen); - if (err < 0 && ret =3D=3D 0) - ret =3D err; - } - - if (!ret) - sockopt_seq_inc(msk); - - return ret; -} - static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *msk, int optname, sockptr_t optval, unsigned int optlen) { @@ -1478,6 +1548,12 @@ static int mptcp_getsockopt_v4(struct mptcp_sock *ms= k, int optname, case IP_LOCAL_PORT_RANGE: return mptcp_put_int_option(msk, optval, optlen, READ_ONCE(inet_sk(sk)->local_port_range)); + case IP_RECVERR: + return mptcp_put_int_option(msk, optval, optlen, + inet_test_bit(RECVERR, sk)); + case IP_RECVERR_RFC4884: + return mptcp_put_int_option(msk, optval, optlen, + inet_test_bit(RECVERR_RFC4884, sk)); } =20 return -EOPNOTSUPP; @@ -1498,6 +1574,16 @@ static int mptcp_getsockopt_v6(struct mptcp_sock *ms= k, int optname, case IPV6_FREEBIND: return mptcp_put_int_option(msk, optval, optlen, inet_test_bit(FREEBIND, sk)); + case IPV6_RECVERR: + if (sk->sk_family !=3D AF_INET6) + return -ENOPROTOOPT; + return mptcp_put_int_option(msk, optval, optlen, + inet6_test_bit(RECVERR6, sk)); + case IPV6_RECVERR_RFC4884: + if (sk->sk_family !=3D AF_INET6) + return -ENOPROTOOPT; + return mptcp_put_int_option(msk, optval, optlen, + inet6_test_bit(RECVERR6_RFC4884, sk)); } =20 return -EOPNOTSUPP; @@ -1606,6 +1692,14 @@ static void sync_socket_options(struct mptcp_sock *m= sk, struct sock *ssk) =20 src =3D READ_ONCE(inet_sk(sk)->inet_flags); =20 + /* RECVERR6 bits are only read on AF_INET6 sockets; copying them onto a + * v4 subflow is dead state and diverges from the SOL_IPV6 skip in + * mptcp_setsockopt_all_sf(). + */ + if (ssk->sk_family !=3D AF_INET6) + mask &=3D ~(BIT(INET_FLAGS_RECVERR6) | + BIT(INET_FLAGS_RECVERR6_RFC4884)); + for_each_set_bit(b, &mask, BITS_PER_LONG) assign_bit(b, &inet_sk(ssk)->inet_flags, src & BIT(b)); =20 --=20 2.53.0 From nobody Mon Aug 24 00:17:38 2026 Received: from mail-wr1-f53.google.com (mail-wr1-f53.google.com [209.85.221.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6DE7E3BCD1A for ; Thu, 30 Jul 2026 07:12:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785395578; cv=none; b=Do14lNHxH0uOwk1O6isQDlLSvftOee5tHgIgc+WeiEwphN4qStBISnah1PCDtxAAcs9GZ5PnluOTQmxpAx9DwVW6MCBRASkcHtALddiBR0GeRTkhvvcDC0f40pC0jYe9J89KHkLeJvGiR1Z2LvJfxQV77yhvYSEDgWjJKytzefk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785395578; c=relaxed/simple; bh=QcNVzrHJDmzDhVBtHzMTu8HUGMD/QTYlMSpRK5EIoOU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kqNQk5LWqY9qEYl7U3K31THoOQ17LFFl8rHnQWkKa1nYMgybHpxqWOgNdeHHrJFPQfVsfmup+L+aDSlRIFEajKQV56N18cDXERN+TECBoyxrhr3t4xNmxEPmsb4MDNLSYN8ekj4XqW7oSvNNvEWNO/rLtJUWmIJnYUGYooHCC9k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=hiv1TQaO; arc=none smtp.client-ip=209.85.221.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="hiv1TQaO" Received: by mail-wr1-f53.google.com with SMTP id ffacd0b85a97d-47c2b362ee2so1486413f8f.1 for ; Thu, 30 Jul 2026 00:12:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785395571; x=1786000371; darn=lists.linux.dev; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=+lXcg061bbhFrI0v23H2NQAB6iGsZBPcokYpsEnhLcE=; b=hiv1TQaO2YlSKdjWrLa19Hy0ljJNFCQTVPLxsnc88ofLyYTuXK7eL1FVWio5QDRmQL Ft7HW7KDMqIQWkomlpZkVfnaBeX6hr1QqkwrUE/XrTR6hR5Qlpxf8NqWUPiHYe2cliNy UGzEP1jWw0+a9rUSViaOVcbnJFPxEEJeFDWllicIUEpen6n1hpLxlmnIfuz+7omKlI7E 2Oq0ZLeJEtpZEwx4futcACdHVx92U/6iF0VPnnNR4qiREpkT4+kG+Lzdm2qEx+nAsyyZ p43ZQOmYEfJLd7bTyI8zNtX8EouZu3gHwI+0JBYKNfsKZQ05Y3TF0vxrDAPu6Ou/hpeX Fnxw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785395571; x=1786000371; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=+lXcg061bbhFrI0v23H2NQAB6iGsZBPcokYpsEnhLcE=; b=IoA7Lbk0SO++hDqRUwiS1b7qj9g6cG+cMaGge9zdE3IUFMW04qZdCHjai44GOzaomH E42ly71NFwrSzqOJuUUnD7kRR0lG+RQpDCp2WFYLGp2CMMAD8YHLg3NgObYXT1LLKGuG jGCm6WME2nH+8EKMnIsMSAxLv7Rj+ojbaEJZU3DgtwoFXyqPD/ketuvfFXayQd1pprV1 Ew3/Mypf2o7tGWN+wm4FcIwCafH4URIphYoaNnlK7mGVV0F4tMoxmXGsDz4GfnXPvLPw UrZHnjD1wp0Pj5cE6YB+i6yRtz02ql/nTEB7fLaITpFlOVhKgUysK0U/uV0yUkyvTW4r PmiQ== X-Gm-Message-State: AOJu0Yyb7cO2jEtBt/USY/9OZE22DMjxeVMA5eCAWdGh5ejdocLwqHFf UstkR0cqW0l2xXR1NUacwUqVAKq4Z1OlrRmSz0i2Rg0Ixrb5WnpPoumJxmagxw== X-Gm-Gg: AR+sD11lAzmcYyoPwDuT1lm6R4gyBUUN1ld9bZImw1wG8N7qpSEANGEXrP2WlfyMiKZ xwxaNRsrp44H2NfjYV222KP3NItJI+f8/fxvy1wILrTTdtQP2Atdj1d6+o4MDTqCXTevA6V7emv q1prUF8J0pQxnDX1Nqp4i4i6y5ld107V31ytE0Uti5H4vDcGapCJrYewSsF16VSjwOC7vsBlrCV PsV184WknCmVxHv/5RWbR4XiofojYXXIkTU8s/WX3mRatwS18ybbgXY5nSM4kFsKam1f5U249CR 0eJogTgBABRbEOqZaL8aGle+E2gTpQItjtM4uFuPxjDNpGILGfsJ9N9gw8tmWBspjN3TRJsF2Ba acWzVqcKZ7cyoE/cjekZ3yz0Q56V0kWjICCejokLr/0UURGatPuNq+SmtKgzFYn+8vCjBC1mmBk GgfE7heZXKQa8HBK1bbhDvCpoYrLvoGpHwOhknKbM8wLyvylV+rfblKHcpyK4oyAEJv51rpLAh8 ESDqpeWRdjOrCqnG8IWo5yM3ybw8QSC3Q80MP9QnzrWmG5G X-Received: by 2002:a05:6000:2910:b0:47e:81aa:3822 with SMTP id ffacd0b85a97d-47fc8200038mr1809200f8f.42.1785395571167; Thu, 30 Jul 2026 00:12:51 -0700 (PDT) Received: from dohko.chello.ie (188-141-5-72.dynamic.upc.ie. [188.141.5.72]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-47fc88d6e5bsm3821717f8f.3.2026.07.30.00.12.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jul 2026 00:12:50 -0700 (PDT) From: David Carlier To: mptcp@lists.linux.dev Cc: matttbe@kernel.org, martineau@kernel.org, geliang@kernel.org, pabeni@redhat.com, David Carlier Subject: [PATCH mptcp-next v12 4/4] selftests: mptcp: cover IP_RECVERR sockopt propagation Date: Thu, 30 Jul 2026 08:12:44 +0100 Message-ID: <20260730071244.69473-5-devnexen@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260730071244.69473-1-devnexen@gmail.com> References: <20260730071244.69473-1-devnexen@gmail.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Exercise setsockopt/getsockopt of IP_RECVERR and IPV6_RECVERR on the MPTCP parent socket, including the empty-errqueue EAGAIN contract on MSG_ERRQUEUE|MSG_DONTWAIT. End-to-end errqueue delivery (ICMP, TX timestamps, zerocopy) depends on subflow-side producers that are out of scope for this series and will be covered by follow-up work. Assisted-by: Codex:gpt-5 Signed-off-by: David Carlier --- .../selftests/net/mptcp/mptcp_sockopt.c | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index b6e58d936ebe..95bb2cc8e2ff 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -769,6 +769,60 @@ static void test_ip_tos_sockopt(int fd) xerror("expect socklen_t =3D=3D -1"); } =20 +static void test_ip_recverr_sockopt(int fd) +{ + struct iovec iov =3D { + .iov_base =3D &(char){ 0 }, + .iov_len =3D 1, + }; + struct msghdr msg =3D { + .msg_iov =3D &iov, + .msg_iovlen =3D 1, + }; + int one =3D 1, zero =3D 0, val =3D -1; + socklen_t s =3D sizeof(val); + int level, optname, r; + + switch (pf) { + case AF_INET: + level =3D SOL_IP; + optname =3D IP_RECVERR; + break; + case AF_INET6: + level =3D SOL_IPV6; + optname =3D IPV6_RECVERR; + break; + default: + xerror("Unknown pf %d\n", pf); + } + + r =3D setsockopt(fd, level, optname, &one, sizeof(one)); + if (r) + die_perror("setsockopt recverr on"); + + r =3D getsockopt(fd, level, optname, &val, &s); + if (r) + die_perror("getsockopt recverr on"); + if (s !=3D sizeof(val) || val !=3D one) + xerror("recverr on mismatch val=3D%d len=3D%u", val, s); + + r =3D recvmsg(fd, &msg, MSG_ERRQUEUE | MSG_DONTWAIT); + if (r !=3D -1 || errno !=3D EAGAIN) + xerror("expected empty errqueue to return EAGAIN, ret=3D%d errno=3D%d", = r, errno); + + r =3D setsockopt(fd, level, optname, &zero, sizeof(zero)); + if (r) + die_perror("setsockopt recverr off"); + + val =3D -1; + s =3D sizeof(val); + r =3D getsockopt(fd, level, optname, &val, &s); + if (r) + die_perror("getsockopt recverr off"); + if (s !=3D sizeof(val) || val !=3D zero) + xerror("recverr off mismatch val=3D%d len=3D%u", val, s); +} + static int client(int pipefd) { int fd =3D -1; @@ -787,6 +841,7 @@ static int client(int pipefd) } =20 test_ip_tos_sockopt(fd); + test_ip_recverr_sockopt(fd); =20 connect_one_server(fd, pipefd); =20 --=20 2.53.0