From nobody Sat Feb 7 08:13:40 2026 Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 81080345CA6 for ; Wed, 28 Jan 2026 09:29:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769592572; cv=none; b=St1CqN+Ev6cDO+XYTXYa3fJFt5wtWAaXQfTS/mV7Q7LwHUwczRKP6bD9r6yRSnyKA8waM4tocKa0fk1793uEpHiR9Ea8Yyt+4ajb49vyzdAUpUeStR0Argjrf8ilipIVXGgB7pT9SG9gf4VPjwQ/OUOv/XWSGaCl/kHit5SXPOQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769592572; c=relaxed/simple; bh=7CoeWa8oYypCob5zi+rtGEUygWFQEPsRRN1+F2cTtu8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lb14P58rNtKL5fbvuEK65d7JzwpZ8syZclHGNTI0AHJNgzl/HSVzmHol4Ma3JlCnHTwwSdMik4bTF9Ne2pBoWfb28pmEHsw7CJ4NSVh7Sy7JN2hTdFjF9GGhkruldfelellstyZEvf0HbzkqVwB+jXHkcxoUhf+zy4BsgKvHxEY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1vl1rN-0007xU-Mu; Wed, 28 Jan 2026 10:29:13 +0100 Received: from moin.white.stw.pengutronix.de ([2a0a:edc0:0:b01:1d::7b] helo=bjornoya.blackshift.org) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vl1rN-002tQC-0e; Wed, 28 Jan 2026 10:29:12 +0100 Received: from hardanger.blackshift.org (p54b15bf8.dip0.t-ipconnect.de [84.177.91.248]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: mkl-all@blackshift.org) by smtp.blackshift.org (Postfix) with ESMTPSA id 3C8584DA02C; Wed, 28 Jan 2026 09:29:12 +0000 (UTC) From: Marc Kleine-Budde Date: Wed, 28 Jan 2026 10:28:53 +0100 Subject: [PATCH can-next v2 1/6] can: use skb hash instead of private variable in headroom Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260128-can-skb-ext-v2-1-fe64aa152c8a@pengutronix.de> References: <20260128-can-skb-ext-v2-0-fe64aa152c8a@pengutronix.de> In-Reply-To: <20260128-can-skb-ext-v2-0-fe64aa152c8a@pengutronix.de> To: Marc Kleine-Budde , Vincent Mailhol , Oliver Hartkopp , Robin van der Gracht , Oleksij Rempel , kernel@pengutronix.de, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: linux-can@vger.kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org X-Mailer: b4 0.15-dev-47773 X-Developer-Signature: v=1; a=openpgp-sha256; l=7924; i=mkl@pengutronix.de; h=from:subject:message-id; bh=BvDTg1HN+JG/lCMuii/eyDlcJ3crtPEK1Ee+44YKxy0=; b=owEBbQGS/pANAwAKAQx0Zd/5kJGcAcsmYgBpedbcRy5O7g0NtCQ3QgOZeDedZ71yu3SYI4alQ hC3LCMK98SJATMEAAEKAB0WIQSf+wzYr2eoX/wVbPMMdGXf+ZCRnAUCaXnW3AAKCRAMdGXf+ZCR nCxqCACvlSE7H3zO2/+JoYSi70iSI06XPzzUYf6gaboD9k5KMIw2L0UHale0IU6nHEvHQGfi0w8 zPSgjUAtjP9T6imCFEabGq6z88oSPGj89Q64TXN8jb72otMT782uLr+4u/2X+5iFUWLu646ZElk 2J8TEdbMwFMwEHveltd4sRzTvDP8BsdnihfL7+nm9LvkTls21UL/EQyZVf6+xL2olvpxXLf6N/I i5NVxCZRMU+q7z/RFZhLSUjka3nbKfhLzXhyxgOuyprDexWYzEVoqAzKUhYn0jl9xWqKia9KcWX Rh+DFtJwIXkQ+GQoc/yYMIrxcavox3R2vESLqUJAVJ908kbV X-Developer-Key: i=mkl@pengutronix.de; a=openpgp; fpr=C1400BA0B3989E6FBC7D5B5C2B5EE211C58AEA54 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: mkl@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org From: Oliver Hartkopp The can_skb_priv::skbcnt variable is used to identify CAN skbs in the RX path analogue to the skb->hash. As the skb hash is not filled in CAN skbs move the private skbcnt value to skb->hash and set skb->sw_hash accordingly. The skb->hash is a value used for RPS to identify skbs. Use it as intended. Signed-off-by: Oliver Hartkopp Signed-off-by: Marc Kleine-Budde --- drivers/net/can/dev/skb.c | 2 -- include/linux/can/core.h | 1 + include/linux/can/skb.h | 2 -- net/can/af_can.c | 14 +++++++++++--- net/can/bcm.c | 2 -- net/can/isotp.c | 3 --- net/can/j1939/socket.c | 1 - net/can/j1939/transport.c | 2 -- net/can/raw.c | 7 +++---- 9 files changed, 15 insertions(+), 19 deletions(-) diff --git a/drivers/net/can/dev/skb.c b/drivers/net/can/dev/skb.c index 3ebd4f779b9b..0da615afa04d 100644 --- a/drivers/net/can/dev/skb.c +++ b/drivers/net/can/dev/skb.c @@ -202,7 +202,6 @@ static void init_can_skb_reserve(struct sk_buff *skb) skb_reset_transport_header(skb); =20 can_skb_reserve(skb); - can_skb_prv(skb)->skbcnt =3D 0; } =20 struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **c= f) @@ -312,7 +311,6 @@ static bool can_skb_headroom_valid(struct net_device *d= ev, struct sk_buff *skb) if (skb->ip_summed =3D=3D CHECKSUM_NONE) { /* init headroom */ can_skb_prv(skb)->ifindex =3D dev->ifindex; - can_skb_prv(skb)->skbcnt =3D 0; =20 skb->ip_summed =3D CHECKSUM_UNNECESSARY; =20 diff --git a/include/linux/can/core.h b/include/linux/can/core.h index 5fb8d0e3f9c1..5c382ed61755 100644 --- a/include/linux/can/core.h +++ b/include/linux/can/core.h @@ -58,6 +58,7 @@ extern void can_rx_unregister(struct net *net, struct net= _device *dev, void *data); =20 extern int can_send(struct sk_buff *skb, int loop); +extern void can_set_skb_uid(struct sk_buff *skb); void can_sock_destruct(struct sock *sk); =20 #endif /* !_CAN_CORE_H */ diff --git a/include/linux/can/skb.h b/include/linux/can/skb.h index 1abc25a8d144..869ea574a40a 100644 --- a/include/linux/can/skb.h +++ b/include/linux/can/skb.h @@ -49,13 +49,11 @@ bool can_dropped_invalid_skb(struct net_device *dev, st= ruct sk_buff *skb); /** * struct can_skb_priv - private additional data inside CAN sk_buffs * @ifindex: ifindex of the first interface the CAN frame appeared on - * @skbcnt: atomic counter to have an unique id together with skb pointer * @frame_len: length of CAN frame in data link layer * @cf: align to the following CAN frame at skb->data */ struct can_skb_priv { int ifindex; - int skbcnt; unsigned int frame_len; struct can_frame cf[]; }; diff --git a/net/can/af_can.c b/net/can/af_can.c index 770173d8db42..70659987ef4d 100644 --- a/net/can/af_can.c +++ b/net/can/af_can.c @@ -641,6 +641,16 @@ static int can_rcv_filter(struct can_dev_rcv_lists *de= v_rcv_lists, struct sk_buf return matches; } =20 +void can_set_skb_uid(struct sk_buff *skb) +{ + /* create non-zero unique skb identifier together with *skb */ + while (!(skb->hash)) + skb->hash =3D atomic_inc_return(&skbcounter); + + skb->sw_hash =3D 1; +} +EXPORT_SYMBOL(can_set_skb_uid); + static void can_receive(struct sk_buff *skb, struct net_device *dev) { struct can_dev_rcv_lists *dev_rcv_lists; @@ -652,9 +662,7 @@ static void can_receive(struct sk_buff *skb, struct net= _device *dev) atomic_long_inc(&pkg_stats->rx_frames); atomic_long_inc(&pkg_stats->rx_frames_delta); =20 - /* create non-zero unique skb identifier together with *skb */ - while (!(can_skb_prv(skb)->skbcnt)) - can_skb_prv(skb)->skbcnt =3D atomic_inc_return(&skbcounter); + can_set_skb_uid(skb); =20 rcu_read_lock(); =20 diff --git a/net/can/bcm.c b/net/can/bcm.c index 7eba8ae01a5b..8ed60f18c2ea 100644 --- a/net/can/bcm.c +++ b/net/can/bcm.c @@ -316,7 +316,6 @@ static void bcm_can_tx(struct bcm_op *op) =20 can_skb_reserve(skb); can_skb_prv(skb)->ifindex =3D dev->ifindex; - can_skb_prv(skb)->skbcnt =3D 0; =20 skb_put_data(skb, cf, op->cfsiz); =20 @@ -1344,7 +1343,6 @@ static int bcm_tx_send(struct msghdr *msg, int ifinde= x, struct sock *sk, } =20 can_skb_prv(skb)->ifindex =3D dev->ifindex; - can_skb_prv(skb)->skbcnt =3D 0; skb->dev =3D dev; can_skb_set_owner(skb, sk); err =3D can_send(skb, 1); /* send with loopback */ diff --git a/net/can/isotp.c b/net/can/isotp.c index ce588b85665a..4bb60b8f9b96 100644 --- a/net/can/isotp.c +++ b/net/can/isotp.c @@ -230,7 +230,6 @@ static int isotp_send_fc(struct sock *sk, int ae, u8 fl= owstatus) =20 can_skb_reserve(nskb); can_skb_prv(nskb)->ifindex =3D dev->ifindex; - can_skb_prv(nskb)->skbcnt =3D 0; =20 nskb->dev =3D dev; can_skb_set_owner(nskb, sk); @@ -780,7 +779,6 @@ static void isotp_send_cframe(struct isotp_sock *so) =20 can_skb_reserve(skb); can_skb_prv(skb)->ifindex =3D dev->ifindex; - can_skb_prv(skb)->skbcnt =3D 0; =20 cf =3D (struct canfd_frame *)skb->data; skb_put_zero(skb, so->ll.mtu); @@ -1009,7 +1007,6 @@ static int isotp_sendmsg(struct socket *sock, struct = msghdr *msg, size_t size) =20 can_skb_reserve(skb); can_skb_prv(skb)->ifindex =3D dev->ifindex; - can_skb_prv(skb)->skbcnt =3D 0; =20 so->tx.len =3D size; so->tx.idx =3D 0; diff --git a/net/can/j1939/socket.c b/net/can/j1939/socket.c index ff9c4fd7b433..1589e8ca634e 100644 --- a/net/can/j1939/socket.c +++ b/net/can/j1939/socket.c @@ -897,7 +897,6 @@ static struct sk_buff *j1939_sk_alloc_skb(struct net_de= vice *ndev, =20 can_skb_reserve(skb); can_skb_prv(skb)->ifindex =3D ndev->ifindex; - can_skb_prv(skb)->skbcnt =3D 0; skb_reserve(skb, offsetof(struct can_frame, data)); =20 ret =3D memcpy_from_msg(skb_put(skb, size), msg, size); diff --git a/net/can/j1939/transport.c b/net/can/j1939/transport.c index 8656ab388c83..d5d3e5320f7a 100644 --- a/net/can/j1939/transport.c +++ b/net/can/j1939/transport.c @@ -601,7 +601,6 @@ sk_buff *j1939_tp_tx_dat_new(struct j1939_priv *priv, skb->dev =3D priv->ndev; can_skb_reserve(skb); can_skb_prv(skb)->ifindex =3D priv->ndev->ifindex; - can_skb_prv(skb)->skbcnt =3D 0; /* reserve CAN header */ skb_reserve(skb, offsetof(struct can_frame, data)); =20 @@ -1536,7 +1535,6 @@ j1939_session *j1939_session_fresh_new(struct j1939_p= riv *priv, skb->dev =3D priv->ndev; can_skb_reserve(skb); can_skb_prv(skb)->ifindex =3D priv->ndev->ifindex; - can_skb_prv(skb)->skbcnt =3D 0; skcb =3D j1939_skb_to_cb(skb); memcpy(skcb, rel_skcb, sizeof(*skcb)); =20 diff --git a/net/can/raw.c b/net/can/raw.c index 12293363413c..fb4f9c854df0 100644 --- a/net/can/raw.c +++ b/net/can/raw.c @@ -76,7 +76,7 @@ MODULE_ALIAS("can-proto-1"); =20 struct uniqframe { const struct sk_buff *skb; - int skbcnt; + u32 hash; unsigned int join_rx_count; }; =20 @@ -164,7 +164,7 @@ static void raw_rcv(struct sk_buff *oskb, void *data) =20 /* eliminate multiple filter matches for the same skb */ if (this_cpu_ptr(ro->uniq)->skb =3D=3D oskb && - this_cpu_ptr(ro->uniq)->skbcnt =3D=3D can_skb_prv(oskb)->skbcnt) { + this_cpu_ptr(ro->uniq)->hash =3D=3D oskb->hash) { if (!ro->join_filters) return; =20 @@ -174,7 +174,7 @@ static void raw_rcv(struct sk_buff *oskb, void *data) return; } else { this_cpu_ptr(ro->uniq)->skb =3D oskb; - this_cpu_ptr(ro->uniq)->skbcnt =3D can_skb_prv(oskb)->skbcnt; + this_cpu_ptr(ro->uniq)->hash =3D oskb->hash; this_cpu_ptr(ro->uniq)->join_rx_count =3D 1; /* drop first frame to check all enabled filters? */ if (ro->join_filters && ro->count > 1) @@ -958,7 +958,6 @@ static int raw_sendmsg(struct socket *sock, struct msgh= dr *msg, size_t size) =20 can_skb_reserve(skb); can_skb_prv(skb)->ifindex =3D dev->ifindex; - can_skb_prv(skb)->skbcnt =3D 0; =20 /* fill the skb before testing for valid CAN frames */ err =3D memcpy_from_msg(skb_put(skb, size), msg, size); --=20 2.51.0 From nobody Sat Feb 7 08:13:40 2026 Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 779B7345751 for ; Wed, 28 Jan 2026 09:29:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769592574; cv=none; b=OioAaohb7G1JBYMffXcweFjlAd83WCnBRxhNmrHew9wJR5LkJlZrQ/Vh+85JvVY1zWyieFSxzAgpctfxWZlIhCsco1fU2K2eGrLwqvGTCsMB4M3R9Mc8FpE/wuv2Xk2eEtK8NlLCESGnqchLU2i8aPasA2hOMYhZoXJleHVsYPg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769592574; c=relaxed/simple; bh=M6qYArSwg/zM32lWCEWmVbctmOKve6707XcOz91s0J4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TNzIejOEVhvplVWhNKon2/ELpOOFvpyTfTgsB3eTDXQ16ZGBAMgslYEt7oSMOt1Z1CSSRJ48kzPYeuY8Veuf70P838NE8bHLIiwHm2q/qXgPZf7v5eiATqj+BzkmtsZU92zeEQMz9nOSPVrhC5Y8olNwEh+skHa2SGWFApVbTKw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1vl1rN-0007xW-Mu; Wed, 28 Jan 2026 10:29:13 +0100 Received: from moin.white.stw.pengutronix.de ([2a0a:edc0:0:b01:1d::7b] helo=bjornoya.blackshift.org) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vl1rN-002tQF-1K; Wed, 28 Jan 2026 10:29:12 +0100 Received: from hardanger.blackshift.org (p54b15bf8.dip0.t-ipconnect.de [84.177.91.248]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: mkl-all@blackshift.org) by smtp.blackshift.org (Postfix) with ESMTPSA id 4A8B94DA02D; Wed, 28 Jan 2026 09:29:12 +0000 (UTC) From: Marc Kleine-Budde Date: Wed, 28 Jan 2026 10:28:54 +0100 Subject: [PATCH can-next v2 2/6] can: add CAN skb extension infrastructure Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260128-can-skb-ext-v2-2-fe64aa152c8a@pengutronix.de> References: <20260128-can-skb-ext-v2-0-fe64aa152c8a@pengutronix.de> In-Reply-To: <20260128-can-skb-ext-v2-0-fe64aa152c8a@pengutronix.de> To: Marc Kleine-Budde , Vincent Mailhol , Oliver Hartkopp , Robin van der Gracht , Oleksij Rempel , kernel@pengutronix.de, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: linux-can@vger.kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org X-Mailer: b4 0.15-dev-47773 X-Developer-Signature: v=1; a=openpgp-sha256; l=18749; i=mkl@pengutronix.de; h=from:subject:message-id; bh=egTIrte9okHBnHo0mVWojeObZtqUgebbD4ASzpmqfxo=; b=owEBbQGS/pANAwAKAQx0Zd/5kJGcAcsmYgBpedbegAOp4s05jquVQK1on/jgQdhj684GhAf+3 v1JnWDEW4WJATMEAAEKAB0WIQSf+wzYr2eoX/wVbPMMdGXf+ZCRnAUCaXnW3gAKCRAMdGXf+ZCR nKk4B/4ooUICVGn7bJOUy2s1m1kWI7ePa8ZjveCEXae1/Gni5flmGu+76x/JeE7uBvkiN6A5FvN TMlhp+3auQxvQpbt8HixNT3wKAqi5Aaq73Bvt2gmRMCsEnggWKrIThd66FMQo9HEy6Jy9cwCRDH L8Ov9EAjDRECY/26IO8wFZSFCK53h6tlxYt5GFNPtLIGOpB7gJjzPoeNIqXK5r+b9lbGYExtw61 3/ItBZNGVN6lnOEG856ZdJ/fdfCaQYvN5Uj0mIBomqQFuOSNv9sxAiK7w56VbGNzeTMeALdphRf HJtoLUsvFfGD7jsAitAccLN3FSCi9muPGRCRhAsxvOE4wax2 X-Developer-Key: i=mkl@pengutronix.de; a=openpgp; fpr=C1400BA0B3989E6FBC7D5B5C2B5EE211C58AEA54 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: mkl@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org From: Oliver Hartkopp To remove the private CAN bus skb headroom infrastructure 8 bytes need to be stored in the skb. The skb extensions are a common pattern and an easy and efficient way to hold private data travelling along with the skb. We only need the skb_ext_add() and skb_ext_find() functions to allocate and access CAN specific content as the skb helpers to copy/clone/free skbs automatically take care of skb extensions and their final removal. This patch introduces the complete CAN skb extensions infrastructure: - add struct can_skb_ext in new file include/net/can.h - add include/net/can.h in MAINTAINERS - add SKB_EXT_CAN to skbuff.c and skbuff.h - select SKB_EXTENSIONS in Kconfig when CONFIG_CAN is enabled - check for existing CAN skb extensions in can_rcv() in af_can.c - add CAN skb extensions allocation at every skb_alloc() location - introduce can_skb_ext_add() and can_skb_ext_find() helpers Signed-off-by: Oliver Hartkopp Signed-off-by: Marc Kleine-Budde --- MAINTAINERS | 1 + drivers/net/can/dev/skb.c | 56 +++++++++++++++++++++++++++++++++++++------= ---- include/linux/can/skb.h | 11 ++++++++++ include/linux/skbuff.h | 3 +++ include/net/can.h | 28 ++++++++++++++++++++++++ net/can/Kconfig | 1 + net/can/af_can.c | 9 +++++--- net/can/bcm.c | 15 +++++++++++++ net/can/gw.c | 13 +++++++++++ net/can/isotp.c | 24 ++++++++++++++++++++ net/can/j1939/socket.c | 8 +++++++ net/can/j1939/transport.c | 15 +++++++++++++ net/can/raw.c | 8 +++++++ net/core/skbuff.c | 4 ++++ 14 files changed, 182 insertions(+), 14 deletions(-) diff --git a/MAINTAINERS b/MAINTAINERS index c3df85fd5acd..97f276375219 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -5634,6 +5634,7 @@ F: Documentation/networking/iso15765-2.rst F: include/linux/can/can-ml.h F: include/linux/can/core.h F: include/linux/can/skb.h +F: include/net/can.h F: include/net/netns/can.h F: include/uapi/linux/can.h F: include/uapi/linux/can/bcm.h diff --git a/drivers/net/can/dev/skb.c b/drivers/net/can/dev/skb.c index 0da615afa04d..c572745565f6 100644 --- a/drivers/net/can/dev/skb.c +++ b/drivers/net/can/dev/skb.c @@ -6,6 +6,7 @@ =20 #include #include +#include =20 #define MOD_DESC "CAN device driver interface" =20 @@ -207,13 +208,17 @@ static void init_can_skb_reserve(struct sk_buff *skb) struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **c= f) { struct sk_buff *skb; + struct can_skb_ext *csx; =20 skb =3D netdev_alloc_skb(dev, sizeof(struct can_skb_priv) + sizeof(struct can_frame)); - if (unlikely(!skb)) { - *cf =3D NULL; + if (unlikely(!skb)) + goto out_error_cc; =20 - return NULL; + csx =3D can_skb_ext_add(skb); + if (!csx) { + kfree_skb(skb); + goto out_error_cc; } =20 skb->protocol =3D htons(ETH_P_CAN); @@ -223,6 +228,11 @@ struct sk_buff *alloc_can_skb(struct net_device *dev, = struct can_frame **cf) *cf =3D skb_put_zero(skb, sizeof(struct can_frame)); =20 return skb; + +out_error_cc: + *cf =3D NULL; + + return NULL; } EXPORT_SYMBOL_GPL(alloc_can_skb); =20 @@ -230,13 +240,17 @@ struct sk_buff *alloc_canfd_skb(struct net_device *de= v, struct canfd_frame **cfd) { struct sk_buff *skb; + struct can_skb_ext *csx; =20 skb =3D netdev_alloc_skb(dev, sizeof(struct can_skb_priv) + sizeof(struct canfd_frame)); - if (unlikely(!skb)) { - *cfd =3D NULL; + if (unlikely(!skb)) + goto out_error_fd; =20 - return NULL; + csx =3D can_skb_ext_add(skb); + if (!csx) { + kfree_skb(skb); + goto out_error_fd; } =20 skb->protocol =3D htons(ETH_P_CANFD); @@ -249,6 +263,11 @@ struct sk_buff *alloc_canfd_skb(struct net_device *dev, (*cfd)->flags =3D CANFD_FDF; =20 return skb; + +out_error_fd: + *cfd =3D NULL; + + return NULL; } EXPORT_SYMBOL_GPL(alloc_canfd_skb); =20 @@ -257,14 +276,21 @@ struct sk_buff *alloc_canxl_skb(struct net_device *de= v, unsigned int data_len) { struct sk_buff *skb; + struct can_skb_ext *csx; =20 if (data_len < CANXL_MIN_DLEN || data_len > CANXL_MAX_DLEN) - goto out_error; + goto out_error_xl; =20 skb =3D netdev_alloc_skb(dev, sizeof(struct can_skb_priv) + CANXL_HDR_SIZE + data_len); if (unlikely(!skb)) - goto out_error; + goto out_error_xl; + + csx =3D can_skb_ext_add(skb); + if (!csx) { + kfree_skb(skb); + goto out_error_xl; + } =20 skb->protocol =3D htons(ETH_P_CANXL); init_can_skb_reserve(skb); @@ -278,7 +304,7 @@ struct sk_buff *alloc_canxl_skb(struct net_device *dev, =20 return skb; =20 -out_error: +out_error_xl: *cxl =3D NULL; =20 return NULL; @@ -303,13 +329,21 @@ EXPORT_SYMBOL_GPL(alloc_can_err_skb); /* Check for outgoing skbs that have not been created by the CAN subsystem= */ static bool can_skb_headroom_valid(struct net_device *dev, struct sk_buff = *skb) { + struct can_skb_ext *csx =3D can_skb_ext_find(skb); + /* af_packet creates a headroom of HH_DATA_MOD bytes which is fine */ if (WARN_ON_ONCE(skb_headroom(skb) < sizeof(struct can_skb_priv))) return false; =20 /* af_packet does not apply CAN skb specific settings */ - if (skb->ip_summed =3D=3D CHECKSUM_NONE) { - /* init headroom */ + if (skb->ip_summed =3D=3D CHECKSUM_NONE || !csx) { + /* init CAN skb content */ + if (!csx) { + csx =3D can_skb_ext_add(skb); + if (!csx) + return false; + } + can_skb_prv(skb)->ifindex =3D dev->ifindex; =20 skb->ip_summed =3D CHECKSUM_UNNECESSARY; diff --git a/include/linux/can/skb.h b/include/linux/can/skb.h index 869ea574a40a..aeb08f47de48 100644 --- a/include/linux/can/skb.h +++ b/include/linux/can/skb.h @@ -14,6 +14,7 @@ #include #include #include +#include #include =20 void can_flush_echo_skb(struct net_device *dev); @@ -68,6 +69,16 @@ static inline void can_skb_reserve(struct sk_buff *skb) skb_reserve(skb, sizeof(struct can_skb_priv)); } =20 +static inline struct can_skb_ext *can_skb_ext_add(struct sk_buff *skb) +{ + return skb_ext_add(skb, SKB_EXT_CAN); +} + +static inline struct can_skb_ext *can_skb_ext_find(struct sk_buff *skb) +{ + return skb_ext_find(skb, SKB_EXT_CAN); +} + static inline void can_skb_set_owner(struct sk_buff *skb, struct sock *sk) { /* If the socket has already been closed by user space, the diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index e6bfe5d0c525..b5beb28e5730 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -4988,6 +4988,9 @@ enum skb_ext_id { #endif #if IS_ENABLED(CONFIG_INET_PSP) SKB_EXT_PSP, +#endif +#if IS_ENABLED(CONFIG_CAN) + SKB_EXT_CAN, #endif SKB_EXT_NUM, /* must be last */ }; diff --git a/include/net/can.h b/include/net/can.h new file mode 100644 index 000000000000..6db9e826f0e0 --- /dev/null +++ b/include/net/can.h @@ -0,0 +1,28 @@ +/* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */ +/* + * net/can.h + * + * Definitions for the CAN network socket buffer extensions + * + * Copyright (C) 2026 Oliver Hartkopp + * + */ + +#ifndef _NET_CAN_H +#define _NET_CAN_H + +/** + * struct can_skb_ext - skb extensions for CAN specific content + * @can_iif: ifindex of the first interface the CAN frame appeared on + * @can_framelen: cached echo CAN frame length for bql + * @can_gw_hops: can-gw CAN frame time-to-live counter + * @can_ext_flags: CAN skb extensions flags + */ +struct can_skb_ext { + int can_iif; + u16 can_framelen; + u8 can_gw_hops; + u8 can_ext_flags; +}; + +#endif /* _NET_CAN_H */ diff --git a/net/can/Kconfig b/net/can/Kconfig index af64a6f76458..abbb4be7ad21 100644 --- a/net/can/Kconfig +++ b/net/can/Kconfig @@ -5,6 +5,7 @@ =20 menuconfig CAN tristate "CAN bus subsystem support" + select SKB_EXTENSIONS help Controller Area Network (CAN) is a slow (up to 1Mbit/s) serial communications protocol. Development of the CAN bus started in diff --git a/net/can/af_can.c b/net/can/af_can.c index 70659987ef4d..22c65a014861 100644 --- a/net/can/af_can.c +++ b/net/can/af_can.c @@ -687,7 +687,8 @@ static void can_receive(struct sk_buff *skb, struct net= _device *dev) static int can_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev) { - if (unlikely(dev->type !=3D ARPHRD_CAN || !can_get_ml_priv(dev) || !can_i= s_can_skb(skb))) { + if (unlikely(dev->type !=3D ARPHRD_CAN || !can_get_ml_priv(dev) || + !can_skb_ext_find(skb) || !can_is_can_skb(skb))) { pr_warn_once("PF_CAN: dropped non conform CAN skbuff: dev type %d, len %= d\n", dev->type, skb->len); =20 @@ -702,7 +703,8 @@ static int can_rcv(struct sk_buff *skb, struct net_devi= ce *dev, static int canfd_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev) { - if (unlikely(dev->type !=3D ARPHRD_CAN || !can_get_ml_priv(dev) || !can_i= s_canfd_skb(skb))) { + if (unlikely(dev->type !=3D ARPHRD_CAN || !can_get_ml_priv(dev) || + !can_skb_ext_find(skb) || !can_is_canfd_skb(skb))) { pr_warn_once("PF_CAN: dropped non conform CAN FD skbuff: dev type %d, le= n %d\n", dev->type, skb->len); =20 @@ -717,7 +719,8 @@ static int canfd_rcv(struct sk_buff *skb, struct net_de= vice *dev, static int canxl_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev) { - if (unlikely(dev->type !=3D ARPHRD_CAN || !can_get_ml_priv(dev) || !can_i= s_canxl_skb(skb))) { + if (unlikely(dev->type !=3D ARPHRD_CAN || !can_get_ml_priv(dev) || + !can_skb_ext_find(skb) || !can_is_canxl_skb(skb))) { pr_warn_once("PF_CAN: dropped non conform CAN XL skbuff: dev type %d, le= n %d\n", dev->type, skb->len); =20 diff --git a/net/can/bcm.c b/net/can/bcm.c index 8ed60f18c2ea..38452069dea8 100644 --- a/net/can/bcm.c +++ b/net/can/bcm.c @@ -59,6 +59,7 @@ #include #include #include +#include #include #include =20 @@ -291,6 +292,7 @@ static int bcm_proc_show(struct seq_file *m, void *v) static void bcm_can_tx(struct bcm_op *op) { struct sk_buff *skb; + struct can_skb_ext *csx; struct net_device *dev; struct canfd_frame *cf; int err; @@ -314,6 +316,12 @@ static void bcm_can_tx(struct bcm_op *op) if (!skb) goto out; =20 + csx =3D can_skb_ext_add(skb); + if (!csx) { + kfree_skb(skb); + goto out; + } + can_skb_reserve(skb); can_skb_prv(skb)->ifindex =3D dev->ifindex; =20 @@ -1317,6 +1325,7 @@ static int bcm_tx_send(struct msghdr *msg, int ifinde= x, struct sock *sk, int cfsiz) { struct sk_buff *skb; + struct can_skb_ext *csx; struct net_device *dev; int err; =20 @@ -1328,6 +1337,12 @@ static int bcm_tx_send(struct msghdr *msg, int ifind= ex, struct sock *sk, if (!skb) return -ENOMEM; =20 + csx =3D can_skb_ext_add(skb); + if (!csx) { + kfree_skb(skb); + return -ENOMEM; + } + can_skb_reserve(skb); =20 err =3D memcpy_from_msg(skb_put(skb, cfsiz), msg, cfsiz); diff --git a/net/can/gw.c b/net/can/gw.c index 55eccb1c7620..8894ab5d2087 100644 --- a/net/can/gw.c +++ b/net/can/gw.c @@ -55,6 +55,7 @@ #include #include #include +#include #include #include #include @@ -459,6 +460,7 @@ static void can_can_gw_rcv(struct sk_buff *skb, void *d= ata) struct cgw_job *gwj =3D (struct cgw_job *)data; struct canfd_frame *cf; struct sk_buff *nskb; + struct can_skb_ext *csx, *ncsx; struct cf_mod *mod; int modidx =3D 0; =20 @@ -471,6 +473,10 @@ static void can_can_gw_rcv(struct sk_buff *skb, void *= data) return; } =20 + csx =3D can_skb_ext_find(skb); + if (!csx) + return; + /* Do not handle CAN frames routed more than 'max_hops' times. * In general we should never catch this delimiter which is intended * to cover a misconfiguration protection (e.g. circular CAN routes). @@ -518,6 +524,13 @@ static void can_can_gw_rcv(struct sk_buff *skb, void *= data) return; } =20 + ncsx =3D can_skb_ext_find(nskb); + if (!ncsx) { + kfree_skb(nskb); + gwj->dropped_frames++; + return; + } + /* put the incremented hop counter in the cloned skb */ cgw_hops(nskb) =3D cgw_hops(skb) + 1; =20 diff --git a/net/can/isotp.c b/net/can/isotp.c index 4bb60b8f9b96..c4fb8afde165 100644 --- a/net/can/isotp.c +++ b/net/can/isotp.c @@ -69,6 +69,7 @@ #include #include #include +#include #include #include =20 @@ -214,6 +215,7 @@ static int isotp_send_fc(struct sock *sk, int ae, u8 fl= owstatus) { struct net_device *dev; struct sk_buff *nskb; + struct can_skb_ext *csx; struct canfd_frame *ncf; struct isotp_sock *so =3D isotp_sk(sk); int can_send_ret; @@ -222,6 +224,12 @@ static int isotp_send_fc(struct sock *sk, int ae, u8 f= lowstatus) if (!nskb) return 1; =20 + csx =3D can_skb_ext_add(nskb); + if (!csx) { + kfree_skb(nskb); + return 1; + } + dev =3D dev_get_by_index(sock_net(sk), so->ifindex); if (!dev) { kfree_skb(nskb); @@ -762,6 +770,7 @@ static void isotp_send_cframe(struct isotp_sock *so) { struct sock *sk =3D &so->sk; struct sk_buff *skb; + struct can_skb_ext *csx; struct net_device *dev; struct canfd_frame *cf; int can_send_ret; @@ -777,6 +786,13 @@ static void isotp_send_cframe(struct isotp_sock *so) return; } =20 + csx =3D can_skb_ext_add(skb); + if (!csx) { + kfree_skb(skb); + dev_put(dev); + return; + } + can_skb_reserve(skb); can_skb_prv(skb)->ifindex =3D dev->ifindex; =20 @@ -938,6 +954,7 @@ static int isotp_sendmsg(struct socket *sock, struct ms= ghdr *msg, size_t size) struct sock *sk =3D sock->sk; struct isotp_sock *so =3D isotp_sk(sk); struct sk_buff *skb; + struct can_skb_ext *csx; struct net_device *dev; struct canfd_frame *cf; int ae =3D (so->opt.flags & CAN_ISOTP_EXTEND_ADDR) ? 1 : 0; @@ -1005,6 +1022,13 @@ static int isotp_sendmsg(struct socket *sock, struct= msghdr *msg, size_t size) goto err_out_drop; } =20 + csx =3D can_skb_ext_add(skb); + if (!csx) { + kfree_skb(skb); + dev_put(dev); + goto err_out_drop; + } + can_skb_reserve(skb); can_skb_prv(skb)->ifindex =3D dev->ifindex; =20 diff --git a/net/can/j1939/socket.c b/net/can/j1939/socket.c index 1589e8ca634e..fc28a7677369 100644 --- a/net/can/j1939/socket.c +++ b/net/can/j1939/socket.c @@ -17,6 +17,7 @@ #include #include #include +#include =20 #include "j1939-priv.h" =20 @@ -884,6 +885,7 @@ static struct sk_buff *j1939_sk_alloc_skb(struct net_de= vice *ndev, struct j1939_sock *jsk =3D j1939_sk(sk); struct j1939_sk_buff_cb *skcb; struct sk_buff *skb; + struct can_skb_ext *csx; int ret; =20 skb =3D sock_alloc_send_skb(sk, @@ -895,6 +897,12 @@ static struct sk_buff *j1939_sk_alloc_skb(struct net_d= evice *ndev, if (!skb) goto failure; =20 + csx =3D can_skb_ext_add(skb); + if (!csx) { + kfree_skb(skb); + goto failure; + } + can_skb_reserve(skb); can_skb_prv(skb)->ifindex =3D ndev->ifindex; skb_reserve(skb, offsetof(struct can_frame, data)); diff --git a/net/can/j1939/transport.c b/net/can/j1939/transport.c index d5d3e5320f7a..0514f3504e39 100644 --- a/net/can/j1939/transport.c +++ b/net/can/j1939/transport.c @@ -9,6 +9,7 @@ // Oleksij Rempel =20 #include +#include =20 #include "j1939-priv.h" =20 @@ -591,6 +592,7 @@ sk_buff *j1939_tp_tx_dat_new(struct j1939_priv *priv, bool swap_src_dst) { struct sk_buff *skb; + struct can_skb_ext *csx; struct j1939_sk_buff_cb *skcb; =20 skb =3D alloc_skb(sizeof(struct can_frame) + sizeof(struct can_skb_priv), @@ -598,6 +600,12 @@ sk_buff *j1939_tp_tx_dat_new(struct j1939_priv *priv, if (unlikely(!skb)) return ERR_PTR(-ENOMEM); =20 + csx =3D can_skb_ext_add(skb); + if (!csx) { + kfree_skb(skb); + return ERR_PTR(-ENOMEM); + } + skb->dev =3D priv->ndev; can_skb_reserve(skb); can_skb_prv(skb)->ifindex =3D priv->ndev->ifindex; @@ -1525,6 +1533,7 @@ j1939_session *j1939_session_fresh_new(struct j1939_p= riv *priv, const struct j1939_sk_buff_cb *rel_skcb) { struct sk_buff *skb; + struct can_skb_ext *csx; struct j1939_sk_buff_cb *skcb; struct j1939_session *session; =20 @@ -1532,6 +1541,12 @@ j1939_session *j1939_session_fresh_new(struct j1939_= priv *priv, if (unlikely(!skb)) return NULL; =20 + csx =3D can_skb_ext_add(skb); + if (!csx) { + kfree_skb(skb); + return NULL; + } + skb->dev =3D priv->ndev; can_skb_reserve(skb); can_skb_prv(skb)->ifindex =3D priv->ndev->ifindex; diff --git a/net/can/raw.c b/net/can/raw.c index fb4f9c854df0..03438e9bc535 100644 --- a/net/can/raw.c +++ b/net/can/raw.c @@ -53,6 +53,7 @@ #include #include #include +#include #include #include =20 @@ -918,6 +919,7 @@ static int raw_sendmsg(struct socket *sock, struct msgh= dr *msg, size_t size) struct raw_sock *ro =3D raw_sk(sk); struct sockcm_cookie sockc; struct sk_buff *skb; + struct can_skb_ext *csx; struct net_device *dev; unsigned int txmtu; int ifindex; @@ -956,6 +958,12 @@ static int raw_sendmsg(struct socket *sock, struct msg= hdr *msg, size_t size) if (!skb) goto put_dev; =20 + csx =3D can_skb_ext_add(skb); + if (!csx) { + kfree_skb(skb); + goto put_dev; + } + can_skb_reserve(skb); can_skb_prv(skb)->ifindex =3D dev->ifindex; =20 diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 4d3920e5b141..648c20e19038 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -78,6 +78,7 @@ #include #include #include +#include #include #include #include @@ -5139,6 +5140,9 @@ static const u8 skb_ext_type_len[] =3D { #if IS_ENABLED(CONFIG_INET_PSP) [SKB_EXT_PSP] =3D SKB_EXT_CHUNKSIZEOF(struct psp_skb_ext), #endif +#if IS_ENABLED(CONFIG_CAN) + [SKB_EXT_CAN] =3D SKB_EXT_CHUNKSIZEOF(struct can_skb_ext), +#endif }; =20 static __always_inline unsigned int skb_ext_total_length(void) --=20 2.51.0 From nobody Sat Feb 7 08:13:40 2026 Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DC36E3451CE for ; Wed, 28 Jan 2026 09:29:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769592574; cv=none; b=FzCFrbguZbVK1dfOJ+jHWom36zJJwOijSzJ5orX4yUpS3MymwWo5/VqUSHp+Ffaqs3mNeQPn9+jf4bXwUrmR9H88hueHc+eolt1oLk0GQzVTPMTEHv+vAjWjOwdRc+rlWn2DEaZHJYMRZ4XTWIZB4H6gS6uPCYqn/CJbJAxj2Tk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769592574; c=relaxed/simple; bh=sd5gSgwK6/ivRpS5ofCo9++roj+1pAvKR7eAiOrWsgo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JixT1L8RZi/ZnkobVWNDGVih+xYRykZ7/r9CMQ4YqJtWLFxjpYgZvmDywo6dkT7Gprdozj+AdOirWK8buabzvs/OMK2uZlUYMpvizHxNqIzTcQPfyHcDRVsNvNK+gJWr0BeMkV4DgGDpymA0A1odMRIT+meCDeWzqRdJbM4m2yM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1vl1rN-0007xV-Mv; Wed, 28 Jan 2026 10:29:13 +0100 Received: from moin.white.stw.pengutronix.de ([2a0a:edc0:0:b01:1d::7b] helo=bjornoya.blackshift.org) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vl1rN-002tQG-1J; Wed, 28 Jan 2026 10:29:12 +0100 Received: from hardanger.blackshift.org (p54b15bf8.dip0.t-ipconnect.de [84.177.91.248]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: mkl-all@blackshift.org) by smtp.blackshift.org (Postfix) with ESMTPSA id 750BE4DA02E; Wed, 28 Jan 2026 09:29:12 +0000 (UTC) From: Marc Kleine-Budde Date: Wed, 28 Jan 2026 10:28:55 +0100 Subject: [PATCH can-next v2 3/6] can: move ifindex to CAN skb extensions Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260128-can-skb-ext-v2-3-fe64aa152c8a@pengutronix.de> References: <20260128-can-skb-ext-v2-0-fe64aa152c8a@pengutronix.de> In-Reply-To: <20260128-can-skb-ext-v2-0-fe64aa152c8a@pengutronix.de> To: Marc Kleine-Budde , Vincent Mailhol , Oliver Hartkopp , Robin van der Gracht , Oleksij Rempel , kernel@pengutronix.de, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: linux-can@vger.kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org X-Mailer: b4 0.15-dev-47773 X-Developer-Signature: v=1; a=openpgp-sha256; l=5905; i=mkl@pengutronix.de; h=from:subject:message-id; bh=+AObhdJZJ0TemPUqMAdgr2BqPWvBQHT3whbPf06BUaQ=; b=owEBbQGS/pANAwAKAQx0Zd/5kJGcAcsmYgBpedbg8A8LFQTHrG6TY6ZJKjNQcktuxuZyC2o/A eDPK8Nf0c+JATMEAAEKAB0WIQSf+wzYr2eoX/wVbPMMdGXf+ZCRnAUCaXnW4AAKCRAMdGXf+ZCR nBcWB/9sjHeo9jnFB0cYod8SVhhihjwD5e7et6dmrSGr4ADMWjEXIahMZVAQ/Z0NJdz2jMiQkF4 hrUAi9DkiOYJhTkZjv5cF1cmCJsP07Iu0zxJ5XFoLSzeQ7xdc45QsP/xpm/CdWe8C5EtCeWA9Fy 7ZfWICP8pYuqtNwxL6saA8wSZqO/dVDphiA40kIzwGlrgySbokW+S3k2BLsmbMAE36T/pol7maR S2lfj2Y1MdEb1iJjMVq2WCu+5zAbsbzpz1zbcUpangrEKmT7PRlNvHBhZqTXVUYBuoQ8P50MIxk KxVa3a9qmXhcsNpgUtIGcJEUaqhTheaMvszgTXxPtiw/jPU9 X-Developer-Key: i=mkl@pengutronix.de; a=openpgp; fpr=C1400BA0B3989E6FBC7D5B5C2B5EE211C58AEA54 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: mkl@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org From: Oliver Hartkopp When routing CAN frames over different CAN interfaces the interface index skb->iif is overwritten with every single hop. To prevent sending a CAN frame back to its originating (first) incoming CAN interface another ifindex variable is needed, which was stored in can_skb_priv::ifindex. Move the can_skb_priv::ifindex content to can_skb_ext::can_iif. Signed-off-by: Oliver Hartkopp --- drivers/net/can/dev/skb.c | 9 ++++----- net/can/bcm.c | 4 ++-- net/can/gw.c | 2 +- net/can/isotp.c | 6 +++--- net/can/j1939/socket.c | 2 +- net/can/j1939/transport.c | 4 ++-- net/can/raw.c | 2 +- 7 files changed, 14 insertions(+), 15 deletions(-) diff --git a/drivers/net/can/dev/skb.c b/drivers/net/can/dev/skb.c index c572745565f6..470255fe7367 100644 --- a/drivers/net/can/dev/skb.c +++ b/drivers/net/can/dev/skb.c @@ -223,7 +223,7 @@ struct sk_buff *alloc_can_skb(struct net_device *dev, s= truct can_frame **cf) =20 skb->protocol =3D htons(ETH_P_CAN); init_can_skb_reserve(skb); - can_skb_prv(skb)->ifindex =3D dev->ifindex; + csx->can_iif =3D dev->ifindex; =20 *cf =3D skb_put_zero(skb, sizeof(struct can_frame)); =20 @@ -255,7 +255,7 @@ struct sk_buff *alloc_canfd_skb(struct net_device *dev, =20 skb->protocol =3D htons(ETH_P_CANFD); init_can_skb_reserve(skb); - can_skb_prv(skb)->ifindex =3D dev->ifindex; + csx->can_iif =3D dev->ifindex; =20 *cfd =3D skb_put_zero(skb, sizeof(struct canfd_frame)); =20 @@ -294,7 +294,7 @@ struct sk_buff *alloc_canxl_skb(struct net_device *dev, =20 skb->protocol =3D htons(ETH_P_CANXL); init_can_skb_reserve(skb); - can_skb_prv(skb)->ifindex =3D dev->ifindex; + csx->can_iif =3D dev->ifindex; =20 *cxl =3D skb_put_zero(skb, CANXL_HDR_SIZE + data_len); =20 @@ -344,8 +344,7 @@ static bool can_skb_headroom_valid(struct net_device *d= ev, struct sk_buff *skb) return false; } =20 - can_skb_prv(skb)->ifindex =3D dev->ifindex; - + csx->can_iif =3D dev->ifindex; skb->ip_summed =3D CHECKSUM_UNNECESSARY; =20 /* perform proper loopback on capable devices */ diff --git a/net/can/bcm.c b/net/can/bcm.c index 38452069dea8..f102d17e8619 100644 --- a/net/can/bcm.c +++ b/net/can/bcm.c @@ -323,7 +323,7 @@ static void bcm_can_tx(struct bcm_op *op) } =20 can_skb_reserve(skb); - can_skb_prv(skb)->ifindex =3D dev->ifindex; + csx->can_iif =3D dev->ifindex; =20 skb_put_data(skb, cf, op->cfsiz); =20 @@ -1357,7 +1357,7 @@ static int bcm_tx_send(struct msghdr *msg, int ifinde= x, struct sock *sk, return -ENODEV; } =20 - can_skb_prv(skb)->ifindex =3D dev->ifindex; + csx->can_iif =3D dev->ifindex; skb->dev =3D dev; can_skb_set_owner(skb, sk); err =3D can_send(skb, 1); /* send with loopback */ diff --git a/net/can/gw.c b/net/can/gw.c index 8894ab5d2087..ad89a1913b34 100644 --- a/net/can/gw.c +++ b/net/can/gw.c @@ -505,7 +505,7 @@ static void can_can_gw_rcv(struct sk_buff *skb, void *d= ata) =20 /* is sending the skb back to the incoming interface not allowed? */ if (!(gwj->flags & CGW_FLAGS_CAN_IIF_TX_OK) && - can_skb_prv(skb)->ifindex =3D=3D gwj->dst.dev->ifindex) + csx->can_iif =3D=3D gwj->dst.dev->ifindex) return; =20 /* clone the given skb, which has not been done in can_rcv() diff --git a/net/can/isotp.c b/net/can/isotp.c index c4fb8afde165..01ceb3febbb7 100644 --- a/net/can/isotp.c +++ b/net/can/isotp.c @@ -237,7 +237,7 @@ static int isotp_send_fc(struct sock *sk, int ae, u8 fl= owstatus) } =20 can_skb_reserve(nskb); - can_skb_prv(nskb)->ifindex =3D dev->ifindex; + csx->can_iif =3D dev->ifindex; =20 nskb->dev =3D dev; can_skb_set_owner(nskb, sk); @@ -794,7 +794,7 @@ static void isotp_send_cframe(struct isotp_sock *so) } =20 can_skb_reserve(skb); - can_skb_prv(skb)->ifindex =3D dev->ifindex; + csx->can_iif =3D dev->ifindex; =20 cf =3D (struct canfd_frame *)skb->data; skb_put_zero(skb, so->ll.mtu); @@ -1030,7 +1030,7 @@ static int isotp_sendmsg(struct socket *sock, struct = msghdr *msg, size_t size) } =20 can_skb_reserve(skb); - can_skb_prv(skb)->ifindex =3D dev->ifindex; + csx->can_iif =3D dev->ifindex; =20 so->tx.len =3D size; so->tx.idx =3D 0; diff --git a/net/can/j1939/socket.c b/net/can/j1939/socket.c index fc28a7677369..f03bae79354e 100644 --- a/net/can/j1939/socket.c +++ b/net/can/j1939/socket.c @@ -904,7 +904,7 @@ static struct sk_buff *j1939_sk_alloc_skb(struct net_de= vice *ndev, } =20 can_skb_reserve(skb); - can_skb_prv(skb)->ifindex =3D ndev->ifindex; + csx->can_iif =3D ndev->ifindex; skb_reserve(skb, offsetof(struct can_frame, data)); =20 ret =3D memcpy_from_msg(skb_put(skb, size), msg, size); diff --git a/net/can/j1939/transport.c b/net/can/j1939/transport.c index 0514f3504e39..96e02ad4a726 100644 --- a/net/can/j1939/transport.c +++ b/net/can/j1939/transport.c @@ -608,7 +608,7 @@ sk_buff *j1939_tp_tx_dat_new(struct j1939_priv *priv, =20 skb->dev =3D priv->ndev; can_skb_reserve(skb); - can_skb_prv(skb)->ifindex =3D priv->ndev->ifindex; + csx->can_iif =3D priv->ndev->ifindex; /* reserve CAN header */ skb_reserve(skb, offsetof(struct can_frame, data)); =20 @@ -1549,7 +1549,7 @@ j1939_session *j1939_session_fresh_new(struct j1939_p= riv *priv, =20 skb->dev =3D priv->ndev; can_skb_reserve(skb); - can_skb_prv(skb)->ifindex =3D priv->ndev->ifindex; + csx->can_iif =3D priv->ndev->ifindex; skcb =3D j1939_skb_to_cb(skb); memcpy(skcb, rel_skcb, sizeof(*skcb)); =20 diff --git a/net/can/raw.c b/net/can/raw.c index 03438e9bc535..7c89962ec913 100644 --- a/net/can/raw.c +++ b/net/can/raw.c @@ -965,7 +965,7 @@ static int raw_sendmsg(struct socket *sock, struct msgh= dr *msg, size_t size) } =20 can_skb_reserve(skb); - can_skb_prv(skb)->ifindex =3D dev->ifindex; + csx->can_iif =3D dev->ifindex; =20 /* fill the skb before testing for valid CAN frames */ err =3D memcpy_from_msg(skb_put(skb, size), msg, size); --=20 2.51.0 From nobody Sat Feb 7 08:13:40 2026 Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D73BF345741 for ; Wed, 28 Jan 2026 09:29:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769592571; cv=none; b=RhJz6tHt6FO83HY9Pj+zTdcLo+XaY4uRJZq5xnlSyQPvIxOKD5WW60k6iQAoTBBzJjpjalyo/rW8eozoXiTiXW0dbSqBYc3fCfthZ639VzxADQ+zPvtKpnB61on27qlDhB2IZbpKwUFfWuhoatccvebqivpB1Gze6O4VWAhYcl8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769592571; c=relaxed/simple; bh=6QE6P2emKGdKilTZmin3/Ozf9IWg6pkT0Y+9AlYKLgQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=SfKSyn644XAgH7IBOBv6rlmb8ZOt37eAL3O8Hal4vDE7nhHESQxt3o4J+1xdIbGpIxFdu6AMHF7zSbZq0bt28tMusvZlECkkR6DR4aoxW8zoiryMaJPs9dIUeBeLnxEhKyn0BAanSLy4sk7hjCaDcAuxjbfeYieTvJG1aXa28WU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1vl1rN-0007xZ-Mw; Wed, 28 Jan 2026 10:29:13 +0100 Received: from moin.white.stw.pengutronix.de ([2a0a:edc0:0:b01:1d::7b] helo=bjornoya.blackshift.org) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vl1rN-002tQJ-1a; Wed, 28 Jan 2026 10:29:12 +0100 Received: from hardanger.blackshift.org (p54b15bf8.dip0.t-ipconnect.de [84.177.91.248]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: mkl-all@blackshift.org) by smtp.blackshift.org (Postfix) with ESMTPSA id 85B5A4DA02F; Wed, 28 Jan 2026 09:29:12 +0000 (UTC) From: Marc Kleine-Budde Date: Wed, 28 Jan 2026 10:28:56 +0100 Subject: [PATCH can-next v2 4/6] can: move frame_len to CAN skb extensions Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260128-can-skb-ext-v2-4-fe64aa152c8a@pengutronix.de> References: <20260128-can-skb-ext-v2-0-fe64aa152c8a@pengutronix.de> In-Reply-To: <20260128-can-skb-ext-v2-0-fe64aa152c8a@pengutronix.de> To: Marc Kleine-Budde , Vincent Mailhol , Oliver Hartkopp , Robin van der Gracht , Oleksij Rempel , kernel@pengutronix.de, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: linux-can@vger.kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org X-Mailer: b4 0.15-dev-47773 X-Developer-Signature: v=1; a=openpgp-sha256; l=2779; i=mkl@pengutronix.de; h=from:subject:message-id; bh=geY5hUgKqeV8IUfPzEuc6SQo1DjeohDhEAPDEaY406Q=; b=owEBbQGS/pANAwAKAQx0Zd/5kJGcAcsmYgBpedbiVdeZUaGPxfxPb8nFjGAoMfwE9lBc29Az0 803HoPP4CSJATMEAAEKAB0WIQSf+wzYr2eoX/wVbPMMdGXf+ZCRnAUCaXnW4gAKCRAMdGXf+ZCR nI9DB/4or5E4Dm//ft3Hok3SpDyzv+Ef2jXo5lHI4xKoUNhaiumScoEV9YgtHCVER9nVq6d691k NimfdyQBTjl40I3FjTIwyCZdUCxZc9CZWCducEoAhyr0hWaJXipj1GC8KpkRotOdmqjYbW7ajm8 heU5DIjZjCjDkBtl7BqPSkuI8+aMoLBs0Yto9VnqtxWVelxdHARK92YUqyMbt0iMFz1ooxQpB3K rUGTSV9Z5DEzb/IvzX6vMacLAfLeDNTZ74mpWvicwn++3Xk6eYXX5ieIo38vbxAEih0N4lS0a8s jCCOrtMUn1Mzn/hZQpJtHppNdByffj8Je3ghPWwOLEliiVPD X-Developer-Key: i=mkl@pengutronix.de; a=openpgp; fpr=C1400BA0B3989E6FBC7D5B5C2B5EE211C58AEA54 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: mkl@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org From: Oliver Hartkopp The can_skb_priv::frame_len variable is used to cache a previous calculated CAN frame length to be passed to BQL queueing disciplines. Move the can_skb_priv::frame_len content to can_skb_ext::can_framelen. Signed-off-by: Oliver Hartkopp Signed-off-by: Marc Kleine-Budde --- drivers/net/can/dev/skb.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/drivers/net/can/dev/skb.c b/drivers/net/can/dev/skb.c index 470255fe7367..408ee49abce1 100644 --- a/drivers/net/can/dev/skb.c +++ b/drivers/net/can/dev/skb.c @@ -49,6 +49,7 @@ int can_put_echo_skb(struct sk_buff *skb, struct net_devi= ce *dev, unsigned int idx, unsigned int frame_len) { struct can_priv *priv =3D netdev_priv(dev); + struct can_skb_ext *csx; =20 if (idx >=3D priv->echo_skb_max) { netdev_err(dev, "%s: BUG! Trying to access can_priv::echo_skb out of bou= nds (%u/max %u)\n", @@ -75,7 +76,9 @@ int can_put_echo_skb(struct sk_buff *skb, struct net_devi= ce *dev, skb->dev =3D dev; =20 /* save frame_len to reuse it when transmission is completed */ - can_skb_prv(skb)->frame_len =3D frame_len; + csx =3D can_skb_ext_find(skb); + if (csx) + csx->can_framelen =3D frame_len; =20 if (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) skb_shinfo(skb)->tx_flags |=3D SKBTX_IN_PROGRESS; @@ -112,7 +115,7 @@ __can_get_echo_skb(struct net_device *dev, unsigned int= idx, * length is supported on both CAN and CANFD frames. */ struct sk_buff *skb =3D priv->echo_skb[idx]; - struct can_skb_priv *can_skb_priv =3D can_skb_prv(skb); + struct can_skb_ext *csx; =20 if (skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS) skb_tstamp_tx(skb, skb_hwtstamps(skb)); @@ -120,8 +123,13 @@ __can_get_echo_skb(struct net_device *dev, unsigned in= t idx, /* get the real payload length for netdev statistics */ *len_ptr =3D can_skb_get_data_len(skb); =20 - if (frame_len_ptr) - *frame_len_ptr =3D can_skb_priv->frame_len; + if (frame_len_ptr) { + csx =3D can_skb_ext_find(skb); + if (csx) + *frame_len_ptr =3D csx->can_framelen; + else + *frame_len_ptr =3D 0; + } =20 priv->echo_skb[idx] =3D NULL; =20 @@ -181,10 +189,15 @@ void can_free_echo_skb(struct net_device *dev, unsign= ed int idx, =20 if (priv->echo_skb[idx]) { struct sk_buff *skb =3D priv->echo_skb[idx]; - struct can_skb_priv *can_skb_priv =3D can_skb_prv(skb); + struct can_skb_ext *csx; =20 - if (frame_len_ptr) - *frame_len_ptr =3D can_skb_priv->frame_len; + if (frame_len_ptr) { + csx =3D can_skb_ext_find(skb); + if (csx) + *frame_len_ptr =3D csx->can_framelen; + else + *frame_len_ptr =3D 0; + } =20 dev_kfree_skb_any(skb); priv->echo_skb[idx] =3D NULL; --=20 2.51.0 From nobody Sat Feb 7 08:13:40 2026 Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4573A33C51B for ; Wed, 28 Jan 2026 09:29:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769592573; cv=none; b=HB7XaPZxFmuXphjkr2TrwtVO/As2CZrczCSYjNy3IJ2VgMLhDxqQN0IScOFS0i3rzrpTKHxwBzkiARTBX7NY4Y5ytBCyXk8hRq3av/rw8dOxhHGtjNVR4ViOUCWLRBzDm901VqNL1J3qDEbUdvuwLnvLnxJwF/5LzDnjy/tiSec= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769592573; c=relaxed/simple; bh=MVGBS2HGkpqFld/gNx26JykaHXHQj0pXMnkLVFy1qT0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RXGwnhHN+NUyuqYLCh+lvtQ+BsyCpwuu6v/FihXNTXZ03qMxSQ0FgZNNuQXqrJN7L5xUtH2l21Dz+yHk5gqiJD31PBUvug+G43XH+06KqrjfDwrrH+I8A35S05EQMK1oDf7UigxPtPnZaKz8S5GdsU9xXxIORIhooEGR27E6xDI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1vl1rN-0007xa-Mu; Wed, 28 Jan 2026 10:29:13 +0100 Received: from moin.white.stw.pengutronix.de ([2a0a:edc0:0:b01:1d::7b] helo=bjornoya.blackshift.org) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vl1rN-002tQK-1z; Wed, 28 Jan 2026 10:29:12 +0100 Received: from hardanger.blackshift.org (p54b15bf8.dip0.t-ipconnect.de [84.177.91.248]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: mkl-all@blackshift.org) by smtp.blackshift.org (Postfix) with ESMTPSA id 93FA84DA030; Wed, 28 Jan 2026 09:29:12 +0000 (UTC) From: Marc Kleine-Budde Date: Wed, 28 Jan 2026 10:28:57 +0100 Subject: [PATCH can-next v2 5/6] can: remove private CAN skb headroom infrastructure Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260128-can-skb-ext-v2-5-fe64aa152c8a@pengutronix.de> References: <20260128-can-skb-ext-v2-0-fe64aa152c8a@pengutronix.de> In-Reply-To: <20260128-can-skb-ext-v2-0-fe64aa152c8a@pengutronix.de> To: Marc Kleine-Budde , Vincent Mailhol , Oliver Hartkopp , Robin van der Gracht , Oleksij Rempel , kernel@pengutronix.de, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: linux-can@vger.kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org X-Mailer: b4 0.15-dev-47773 X-Developer-Signature: v=1; a=openpgp-sha256; l=11487; i=mkl@pengutronix.de; h=from:subject:message-id; bh=NhDwP8zjUgjdSYsc+RdEt+DdCPnhXIqkUCmcZwvuwiw=; b=owEBbQGS/pANAwAKAQx0Zd/5kJGcAcsmYgBpedbk08R4cv7GQwnB0Ur1+rjSbop5n+wWR1bdn jY5GBpDVmCJATMEAAEKAB0WIQSf+wzYr2eoX/wVbPMMdGXf+ZCRnAUCaXnW5AAKCRAMdGXf+ZCR nHG1B/9zcz1d548wDJQt0PpvGAhgXlmPoY7Fa6YC8X7OmBzUdqUPcjIUsKYv07qwr/7SRhzjYCB 7vwqTRfuW6iDZTzjgVQxjnKfuVloSFKDxGGa87/MeLnl0n/WWRqivqCpD0WE9LmYMJ8VcOlzqrv w3R4E1ZKgD8ijuXWTGd55TkYVqPSgv2jXfmx9qoaNT/vr6q9IyaNBz/lzPbg1lVhk5GvvcmXj3Q xDz2jRhr3MUum3Ggikq8QiIkwXtAnqbkLsqOlLy52s26FjRC439pOa1wslptECe4+zx/TxvWxhW ddlRcEPJRD8AuFnCvPAkgWG+NC7quTmght396qOu+2GjQGpa X-Developer-Key: i=mkl@pengutronix.de; a=openpgp; fpr=C1400BA0B3989E6FBC7D5B5C2B5EE211C58AEA54 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: mkl@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org From: Oliver Hartkopp This patch removes struct can_skb_priv which was stored at skb->head and the can_skb_reserve() helper which was used to shift skb->head. Signed-off-by: Oliver Hartkopp Signed-off-by: Marc Kleine-Budde --- drivers/net/can/dev/skb.c | 31 +++++++++---------------------- include/linux/can/skb.h | 31 ------------------------------- net/can/bcm.c | 7 ++----- net/can/isotp.c | 12 ++++-------- net/can/j1939/socket.c | 4 +--- net/can/j1939/transport.c | 7 ++----- net/can/raw.c | 4 +--- 7 files changed, 19 insertions(+), 77 deletions(-) diff --git a/drivers/net/can/dev/skb.c b/drivers/net/can/dev/skb.c index 408ee49abce1..95fcdc1026f8 100644 --- a/drivers/net/can/dev/skb.c +++ b/drivers/net/can/dev/skb.c @@ -206,16 +206,10 @@ void can_free_echo_skb(struct net_device *dev, unsign= ed int idx, EXPORT_SYMBOL_GPL(can_free_echo_skb); =20 /* fill common values for CAN sk_buffs */ -static void init_can_skb_reserve(struct sk_buff *skb) +static void init_can_skb(struct sk_buff *skb) { skb->pkt_type =3D PACKET_BROADCAST; skb->ip_summed =3D CHECKSUM_UNNECESSARY; - - skb_reset_mac_header(skb); - skb_reset_network_header(skb); - skb_reset_transport_header(skb); - - can_skb_reserve(skb); } =20 struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **c= f) @@ -223,8 +217,7 @@ struct sk_buff *alloc_can_skb(struct net_device *dev, s= truct can_frame **cf) struct sk_buff *skb; struct can_skb_ext *csx; =20 - skb =3D netdev_alloc_skb(dev, sizeof(struct can_skb_priv) + - sizeof(struct can_frame)); + skb =3D netdev_alloc_skb(dev, sizeof(struct can_frame)); if (unlikely(!skb)) goto out_error_cc; =20 @@ -235,7 +228,7 @@ struct sk_buff *alloc_can_skb(struct net_device *dev, s= truct can_frame **cf) } =20 skb->protocol =3D htons(ETH_P_CAN); - init_can_skb_reserve(skb); + init_can_skb(skb); csx->can_iif =3D dev->ifindex; =20 *cf =3D skb_put_zero(skb, sizeof(struct can_frame)); @@ -255,8 +248,7 @@ struct sk_buff *alloc_canfd_skb(struct net_device *dev, struct sk_buff *skb; struct can_skb_ext *csx; =20 - skb =3D netdev_alloc_skb(dev, sizeof(struct can_skb_priv) + - sizeof(struct canfd_frame)); + skb =3D netdev_alloc_skb(dev, sizeof(struct canfd_frame)); if (unlikely(!skb)) goto out_error_fd; =20 @@ -267,7 +259,7 @@ struct sk_buff *alloc_canfd_skb(struct net_device *dev, } =20 skb->protocol =3D htons(ETH_P_CANFD); - init_can_skb_reserve(skb); + init_can_skb(skb); csx->can_iif =3D dev->ifindex; =20 *cfd =3D skb_put_zero(skb, sizeof(struct canfd_frame)); @@ -294,8 +286,7 @@ struct sk_buff *alloc_canxl_skb(struct net_device *dev, if (data_len < CANXL_MIN_DLEN || data_len > CANXL_MAX_DLEN) goto out_error_xl; =20 - skb =3D netdev_alloc_skb(dev, sizeof(struct can_skb_priv) + - CANXL_HDR_SIZE + data_len); + skb =3D netdev_alloc_skb(dev, CANXL_HDR_SIZE + data_len); if (unlikely(!skb)) goto out_error_xl; =20 @@ -306,7 +297,7 @@ struct sk_buff *alloc_canxl_skb(struct net_device *dev, } =20 skb->protocol =3D htons(ETH_P_CANXL); - init_can_skb_reserve(skb); + init_can_skb(skb); csx->can_iif =3D dev->ifindex; =20 *cxl =3D skb_put_zero(skb, CANXL_HDR_SIZE + data_len); @@ -340,14 +331,10 @@ struct sk_buff *alloc_can_err_skb(struct net_device *= dev, struct can_frame **cf) EXPORT_SYMBOL_GPL(alloc_can_err_skb); =20 /* Check for outgoing skbs that have not been created by the CAN subsystem= */ -static bool can_skb_headroom_valid(struct net_device *dev, struct sk_buff = *skb) +static bool can_skb_init_valid(struct net_device *dev, struct sk_buff *skb) { struct can_skb_ext *csx =3D can_skb_ext_find(skb); =20 - /* af_packet creates a headroom of HH_DATA_MOD bytes which is fine */ - if (WARN_ON_ONCE(skb_headroom(skb) < sizeof(struct can_skb_priv))) - return false; - /* af_packet does not apply CAN skb specific settings */ if (skb->ip_summed =3D=3D CHECKSUM_NONE || !csx) { /* init CAN skb content */ @@ -405,7 +392,7 @@ bool can_dropped_invalid_skb(struct net_device *dev, st= ruct sk_buff *skb) goto inval_skb; } =20 - if (!can_skb_headroom_valid(dev, skb)) + if (!can_skb_init_valid(dev, skb)) goto inval_skb; =20 return false; diff --git a/include/linux/can/skb.h b/include/linux/can/skb.h index aeb08f47de48..cacbbb185bb9 100644 --- a/include/linux/can/skb.h +++ b/include/linux/can/skb.h @@ -38,37 +38,6 @@ struct sk_buff *alloc_can_err_skb(struct net_device *dev, struct can_frame **cf); bool can_dropped_invalid_skb(struct net_device *dev, struct sk_buff *skb); =20 -/* - * The struct can_skb_priv is used to transport additional information alo= ng - * with the stored struct can(fd)_frame that can not be contained in exist= ing - * struct sk_buff elements. - * N.B. that this information must not be modified in cloned CAN sk_buffs. - * To modify the CAN frame content or the struct can_skb_priv content - * skb_copy() needs to be used instead of skb_clone(). - */ - -/** - * struct can_skb_priv - private additional data inside CAN sk_buffs - * @ifindex: ifindex of the first interface the CAN frame appeared on - * @frame_len: length of CAN frame in data link layer - * @cf: align to the following CAN frame at skb->data - */ -struct can_skb_priv { - int ifindex; - unsigned int frame_len; - struct can_frame cf[]; -}; - -static inline struct can_skb_priv *can_skb_prv(struct sk_buff *skb) -{ - return (struct can_skb_priv *)(skb->head); -} - -static inline void can_skb_reserve(struct sk_buff *skb) -{ - skb_reserve(skb, sizeof(struct can_skb_priv)); -} - static inline struct can_skb_ext *can_skb_ext_add(struct sk_buff *skb) { return skb_ext_add(skb, SKB_EXT_CAN); diff --git a/net/can/bcm.c b/net/can/bcm.c index f102d17e8619..b7324e9c955b 100644 --- a/net/can/bcm.c +++ b/net/can/bcm.c @@ -312,7 +312,7 @@ static void bcm_can_tx(struct bcm_op *op) return; } =20 - skb =3D alloc_skb(op->cfsiz + sizeof(struct can_skb_priv), gfp_any()); + skb =3D alloc_skb(op->cfsiz, gfp_any()); if (!skb) goto out; =20 @@ -322,7 +322,6 @@ static void bcm_can_tx(struct bcm_op *op) goto out; } =20 - can_skb_reserve(skb); csx->can_iif =3D dev->ifindex; =20 skb_put_data(skb, cf, op->cfsiz); @@ -1333,7 +1332,7 @@ static int bcm_tx_send(struct msghdr *msg, int ifinde= x, struct sock *sk, if (!ifindex) return -ENODEV; =20 - skb =3D alloc_skb(cfsiz + sizeof(struct can_skb_priv), GFP_KERNEL); + skb =3D alloc_skb(cfsiz, GFP_KERNEL); if (!skb) return -ENOMEM; =20 @@ -1343,8 +1342,6 @@ static int bcm_tx_send(struct msghdr *msg, int ifinde= x, struct sock *sk, return -ENOMEM; } =20 - can_skb_reserve(skb); - err =3D memcpy_from_msg(skb_put(skb, cfsiz), msg, cfsiz); if (err < 0) { kfree_skb(skb); diff --git a/net/can/isotp.c b/net/can/isotp.c index 01ceb3febbb7..434986cc8fe5 100644 --- a/net/can/isotp.c +++ b/net/can/isotp.c @@ -220,7 +220,7 @@ static int isotp_send_fc(struct sock *sk, int ae, u8 fl= owstatus) struct isotp_sock *so =3D isotp_sk(sk); int can_send_ret; =20 - nskb =3D alloc_skb(so->ll.mtu + sizeof(struct can_skb_priv), gfp_any()); + nskb =3D alloc_skb(so->ll.mtu, gfp_any()); if (!nskb) return 1; =20 @@ -236,9 +236,7 @@ static int isotp_send_fc(struct sock *sk, int ae, u8 fl= owstatus) return 1; } =20 - can_skb_reserve(nskb); csx->can_iif =3D dev->ifindex; - nskb->dev =3D dev; can_skb_set_owner(nskb, sk); ncf =3D (struct canfd_frame *)nskb->data; @@ -780,7 +778,7 @@ static void isotp_send_cframe(struct isotp_sock *so) if (!dev) return; =20 - skb =3D alloc_skb(so->ll.mtu + sizeof(struct can_skb_priv), GFP_ATOMIC); + skb =3D alloc_skb(so->ll.mtu, GFP_ATOMIC); if (!skb) { dev_put(dev); return; @@ -793,7 +791,6 @@ static void isotp_send_cframe(struct isotp_sock *so) return; } =20 - can_skb_reserve(skb); csx->can_iif =3D dev->ifindex; =20 cf =3D (struct canfd_frame *)skb->data; @@ -1015,8 +1012,8 @@ static int isotp_sendmsg(struct socket *sock, struct = msghdr *msg, size_t size) goto err_out_drop; } =20 - skb =3D sock_alloc_send_skb(sk, so->ll.mtu + sizeof(struct can_skb_priv), - msg->msg_flags & MSG_DONTWAIT, &err); + skb =3D sock_alloc_send_skb(sk, so->ll.mtu, msg->msg_flags & MSG_DONTWAIT, + &err); if (!skb) { dev_put(dev); goto err_out_drop; @@ -1029,7 +1026,6 @@ static int isotp_sendmsg(struct socket *sock, struct = msghdr *msg, size_t size) goto err_out_drop; } =20 - can_skb_reserve(skb); csx->can_iif =3D dev->ifindex; =20 so->tx.len =3D size; diff --git a/net/can/j1939/socket.c b/net/can/j1939/socket.c index f03bae79354e..10014d95c319 100644 --- a/net/can/j1939/socket.c +++ b/net/can/j1939/socket.c @@ -891,8 +891,7 @@ static struct sk_buff *j1939_sk_alloc_skb(struct net_de= vice *ndev, skb =3D sock_alloc_send_skb(sk, size + sizeof(struct can_frame) - - sizeof(((struct can_frame *)NULL)->data) + - sizeof(struct can_skb_priv), + sizeof(((struct can_frame *)NULL)->data), msg->msg_flags & MSG_DONTWAIT, &ret); if (!skb) goto failure; @@ -903,7 +902,6 @@ static struct sk_buff *j1939_sk_alloc_skb(struct net_de= vice *ndev, goto failure; } =20 - can_skb_reserve(skb); csx->can_iif =3D ndev->ifindex; skb_reserve(skb, offsetof(struct can_frame, data)); =20 diff --git a/net/can/j1939/transport.c b/net/can/j1939/transport.c index 96e02ad4a726..e63cf79af1c4 100644 --- a/net/can/j1939/transport.c +++ b/net/can/j1939/transport.c @@ -595,8 +595,7 @@ sk_buff *j1939_tp_tx_dat_new(struct j1939_priv *priv, struct can_skb_ext *csx; struct j1939_sk_buff_cb *skcb; =20 - skb =3D alloc_skb(sizeof(struct can_frame) + sizeof(struct can_skb_priv), - GFP_ATOMIC); + skb =3D alloc_skb(sizeof(struct can_frame), GFP_ATOMIC); if (unlikely(!skb)) return ERR_PTR(-ENOMEM); =20 @@ -607,7 +606,6 @@ sk_buff *j1939_tp_tx_dat_new(struct j1939_priv *priv, } =20 skb->dev =3D priv->ndev; - can_skb_reserve(skb); csx->can_iif =3D priv->ndev->ifindex; /* reserve CAN header */ skb_reserve(skb, offsetof(struct can_frame, data)); @@ -1537,7 +1535,7 @@ j1939_session *j1939_session_fresh_new(struct j1939_p= riv *priv, struct j1939_sk_buff_cb *skcb; struct j1939_session *session; =20 - skb =3D alloc_skb(size + sizeof(struct can_skb_priv), GFP_ATOMIC); + skb =3D alloc_skb(size, GFP_ATOMIC); if (unlikely(!skb)) return NULL; =20 @@ -1548,7 +1546,6 @@ j1939_session *j1939_session_fresh_new(struct j1939_p= riv *priv, } =20 skb->dev =3D priv->ndev; - can_skb_reserve(skb); csx->can_iif =3D priv->ndev->ifindex; skcb =3D j1939_skb_to_cb(skb); memcpy(skcb, rel_skcb, sizeof(*skcb)); diff --git a/net/can/raw.c b/net/can/raw.c index 7c89962ec913..d200b6f66fb9 100644 --- a/net/can/raw.c +++ b/net/can/raw.c @@ -953,8 +953,7 @@ static int raw_sendmsg(struct socket *sock, struct msgh= dr *msg, size_t size) goto put_dev; } =20 - skb =3D sock_alloc_send_skb(sk, size + sizeof(struct can_skb_priv), - msg->msg_flags & MSG_DONTWAIT, &err); + skb =3D sock_alloc_send_skb(sk, size, msg->msg_flags & MSG_DONTWAIT, &err= ); if (!skb) goto put_dev; =20 @@ -964,7 +963,6 @@ static int raw_sendmsg(struct socket *sock, struct msgh= dr *msg, size_t size) goto put_dev; } =20 - can_skb_reserve(skb); csx->can_iif =3D dev->ifindex; =20 /* fill the skb before testing for valid CAN frames */ --=20 2.51.0 From nobody Sat Feb 7 08:13:40 2026 Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3BBC6345745 for ; Wed, 28 Jan 2026 09:29:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769592571; cv=none; b=mXM0Xc66b+e1xbf1uIepAHaLN34tyQPd/QMQ8vO3q57CNcRojJezweS70mZBV/F3p0YMZZdGuh5Fm4nQ2petDdghw/CM8QoUlWki/CBQfN8Lpb6Z74Kpx3g3SkQx8ydpZNpnDK4IJf6HEG4X2kIWY7QiR82OMQPsR2nByoLmgkM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769592571; c=relaxed/simple; bh=WVu8/kqahlNbZGD8WK1R44jw+AVgtyIkl0iWAfZYO74=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Q2kZ66Ynb8B8dRAfKIKHv3fTIXFCeX6pOUI3DGFG8x0FWxJdSYZnoq9kRsdSprZr+/LbR2JBLYbBc+6QQ63OJ6h5MOYTzlTRZEj8H4R1myg93w8jomiZd9+HUy68MYrWj8v0oAtTUuQw2yllcW3Q9C12v303EjMi+cX0mzZyVTs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1vl1rN-0007xb-Mv; Wed, 28 Jan 2026 10:29:13 +0100 Received: from moin.white.stw.pengutronix.de ([2a0a:edc0:0:b01:1d::7b] helo=bjornoya.blackshift.org) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vl1rN-002tQM-24; Wed, 28 Jan 2026 10:29:13 +0100 Received: from hardanger.blackshift.org (p54b15bf8.dip0.t-ipconnect.de [84.177.91.248]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: mkl-all@blackshift.org) by smtp.blackshift.org (Postfix) with ESMTPSA id A32044DA031; Wed, 28 Jan 2026 09:29:12 +0000 (UTC) From: Marc Kleine-Budde Date: Wed, 28 Jan 2026 10:28:58 +0100 Subject: [PATCH can-next v2 6/6] can: gw: use can_gw_hops instead of sk_buff::csum_start Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260128-can-skb-ext-v2-6-fe64aa152c8a@pengutronix.de> References: <20260128-can-skb-ext-v2-0-fe64aa152c8a@pengutronix.de> In-Reply-To: <20260128-can-skb-ext-v2-0-fe64aa152c8a@pengutronix.de> To: Marc Kleine-Budde , Vincent Mailhol , Oliver Hartkopp , Robin van der Gracht , Oleksij Rempel , kernel@pengutronix.de, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: linux-can@vger.kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org X-Mailer: b4 0.15-dev-47773 X-Developer-Signature: v=1; a=openpgp-sha256; l=2771; i=mkl@pengutronix.de; h=from:subject:message-id; bh=PqxHagvAwkQO9Lf5q1TvpNsqgySOE9ALOyhaXCgYc/I=; b=owEBbQGS/pANAwAKAQx0Zd/5kJGcAcsmYgBpedbmnCmd7pg6V2J/gIHUMyhBfsh4BovVkjgIM c/w7R7QCEeJATMEAAEKAB0WIQSf+wzYr2eoX/wVbPMMdGXf+ZCRnAUCaXnW5gAKCRAMdGXf+ZCR nLujB/9ErsWjPCf6h2BvdnHuxENIVNerpNC5grQGH4jEUdKyaLtf4pqeGETqSSAXjg7EfbK70/E 5NrVIPek73IXsSXEmPZxB31kve9dgER6RBf+BYHy2qC8Wc0K6i1Dm8pQePA+YqXRpWu1oESAylS pqsuM6+ufe1IntqdbT0MV54azsqgWXj5tBA5ePAVC5RRut1W0BKB49nNK38NRsfLzPl48mK0Thn SQvzvuB/LcmY4Snj1wSzNw6w3vIpVDdIpf2vligwec6sWz/f3KwzBMSxPbNJrT+UbKJT+DNhLlz FcvKgpSyFDfPmS04Dcdtr86YjFg06MBxV7Mr1rJw62Kut5fk X-Developer-Key: i=mkl@pengutronix.de; a=openpgp; fpr=C1400BA0B3989E6FBC7D5B5C2B5EE211C58AEA54 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: mkl@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org From: Oliver Hartkopp As CAN skbs don't use IP checksums the skb->csum_start variable was used to store the can-gw CAN frame time-to-live counter together with skb->ip_summed set to CHECKSUM_UNNECESSARY. Remove the 'hack' using the skb->csum_start variable and move the content to can_skb_ext::can_gw_hops of the CAN skb extensions. The module parameter 'max_hops' has been reduced to a single byte to fit can_skb_ext::can_gw_hops as the maximum value to be stored is 6. Signed-off-by: Oliver Hartkopp Signed-off-by: Marc Kleine-Budde --- net/can/gw.c | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/net/can/gw.c b/net/can/gw.c index ad89a1913b34..2c134c9e5159 100644 --- a/net/can/gw.c +++ b/net/can/gw.c @@ -71,8 +71,8 @@ MODULE_ALIAS(CAN_GW_NAME); #define CGW_MAX_HOPS 6 #define CGW_DEFAULT_HOPS 1 =20 -static unsigned int max_hops __read_mostly =3D CGW_DEFAULT_HOPS; -module_param(max_hops, uint, 0444); +static unsigned char max_hops __read_mostly =3D CGW_DEFAULT_HOPS; +module_param(max_hops, byte, 0444); MODULE_PARM_DESC(max_hops, "maximum " CAN_GW_NAME " routing hops for CAN frames " "(valid values: " __stringify(CGW_MIN_HOPS) "-" @@ -480,19 +480,8 @@ static void can_can_gw_rcv(struct sk_buff *skb, void *= data) /* Do not handle CAN frames routed more than 'max_hops' times. * In general we should never catch this delimiter which is intended * to cover a misconfiguration protection (e.g. circular CAN routes). - * - * The Controller Area Network controllers only accept CAN frames with - * correct CRCs - which are not visible in the controller registers. - * According to skbuff.h documentation the csum_start element for IP - * checksums is undefined/unused when ip_summed =3D=3D CHECKSUM_UNNECESSA= RY. - * Only CAN skbs can be processed here which already have this property. */ - -#define cgw_hops(skb) ((skb)->csum_start) - - BUG_ON(skb->ip_summed !=3D CHECKSUM_UNNECESSARY); - - if (cgw_hops(skb) >=3D max_hops) { + if (csx->can_gw_hops >=3D max_hops) { /* indicate deleted frames due to misconfiguration */ gwj->deleted_frames++; return; @@ -532,11 +521,11 @@ static void can_can_gw_rcv(struct sk_buff *skb, void = *data) } =20 /* put the incremented hop counter in the cloned skb */ - cgw_hops(nskb) =3D cgw_hops(skb) + 1; + ncsx->can_gw_hops =3D csx->can_gw_hops + 1; =20 /* first processing of this CAN frame -> adjust to private hop limit */ - if (gwj->limit_hops && cgw_hops(nskb) =3D=3D 1) - cgw_hops(nskb) =3D max_hops - gwj->limit_hops + 1; + if (gwj->limit_hops && ncsx->can_gw_hops =3D=3D 1) + ncsx->can_gw_hops =3D max_hops - gwj->limit_hops + 1; =20 nskb->dev =3D gwj->dst.dev; =20 --=20 2.51.0