From nobody Mon Feb 9 23:00:21 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