Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

can: move ifindex to CAN skb extensions

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: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
Link: https://patch.msgid.link/20260201-can_skb_ext-v8-3-3635d790fe8b@hartkopp.net
Signed-off-by: Paolo Abeni <pabeni@redhat.com>

authored by

Oliver Hartkopp and committed by
Paolo Abeni
5a9229db 96ea3a1e

+14 -15
+4 -5
drivers/net/can/dev/skb.c
··· 223 223 224 224 skb->protocol = htons(ETH_P_CAN); 225 225 init_can_skb_reserve(skb); 226 - can_skb_prv(skb)->ifindex = dev->ifindex; 226 + csx->can_iif = dev->ifindex; 227 227 228 228 *cf = skb_put_zero(skb, sizeof(struct can_frame)); 229 229 ··· 255 255 256 256 skb->protocol = htons(ETH_P_CANFD); 257 257 init_can_skb_reserve(skb); 258 - can_skb_prv(skb)->ifindex = dev->ifindex; 258 + csx->can_iif = dev->ifindex; 259 259 260 260 *cfd = skb_put_zero(skb, sizeof(struct canfd_frame)); 261 261 ··· 294 294 295 295 skb->protocol = htons(ETH_P_CANXL); 296 296 init_can_skb_reserve(skb); 297 - can_skb_prv(skb)->ifindex = dev->ifindex; 297 + csx->can_iif = dev->ifindex; 298 298 299 299 *cxl = skb_put_zero(skb, CANXL_HDR_SIZE + data_len); 300 300 ··· 344 344 return false; 345 345 } 346 346 347 - can_skb_prv(skb)->ifindex = dev->ifindex; 348 - 347 + csx->can_iif = dev->ifindex; 349 348 skb->ip_summed = CHECKSUM_UNNECESSARY; 350 349 351 350 /* perform proper loopback on capable devices */
+2 -2
net/can/bcm.c
··· 323 323 } 324 324 325 325 can_skb_reserve(skb); 326 - can_skb_prv(skb)->ifindex = dev->ifindex; 326 + csx->can_iif = dev->ifindex; 327 327 328 328 skb_put_data(skb, cf, op->cfsiz); 329 329 ··· 1357 1357 return -ENODEV; 1358 1358 } 1359 1359 1360 - can_skb_prv(skb)->ifindex = dev->ifindex; 1360 + csx->can_iif = dev->ifindex; 1361 1361 skb->dev = dev; 1362 1362 can_skb_set_owner(skb, sk); 1363 1363 err = can_send(skb, 1); /* send with loopback */
+1 -1
net/can/gw.c
··· 505 505 506 506 /* is sending the skb back to the incoming interface not allowed? */ 507 507 if (!(gwj->flags & CGW_FLAGS_CAN_IIF_TX_OK) && 508 - can_skb_prv(skb)->ifindex == gwj->dst.dev->ifindex) 508 + csx->can_iif == gwj->dst.dev->ifindex) 509 509 return; 510 510 511 511 /* clone the given skb, which has not been done in can_rcv()
+3 -3
net/can/isotp.c
··· 237 237 } 238 238 239 239 can_skb_reserve(nskb); 240 - can_skb_prv(nskb)->ifindex = dev->ifindex; 240 + csx->can_iif = dev->ifindex; 241 241 242 242 nskb->dev = dev; 243 243 can_skb_set_owner(nskb, sk); ··· 794 794 } 795 795 796 796 can_skb_reserve(skb); 797 - can_skb_prv(skb)->ifindex = dev->ifindex; 797 + csx->can_iif = dev->ifindex; 798 798 799 799 cf = (struct canfd_frame *)skb->data; 800 800 skb_put_zero(skb, so->ll.mtu); ··· 1031 1031 } 1032 1032 1033 1033 can_skb_reserve(skb); 1034 - can_skb_prv(skb)->ifindex = dev->ifindex; 1034 + csx->can_iif = dev->ifindex; 1035 1035 1036 1036 so->tx.len = size; 1037 1037 so->tx.idx = 0;
+1 -1
net/can/j1939/socket.c
··· 905 905 } 906 906 907 907 can_skb_reserve(skb); 908 - can_skb_prv(skb)->ifindex = ndev->ifindex; 908 + csx->can_iif = ndev->ifindex; 909 909 skb_reserve(skb, offsetof(struct can_frame, data)); 910 910 911 911 ret = memcpy_from_msg(skb_put(skb, size), msg, size);
+2 -2
net/can/j1939/transport.c
··· 608 608 609 609 skb->dev = priv->ndev; 610 610 can_skb_reserve(skb); 611 - can_skb_prv(skb)->ifindex = priv->ndev->ifindex; 611 + csx->can_iif = priv->ndev->ifindex; 612 612 /* reserve CAN header */ 613 613 skb_reserve(skb, offsetof(struct can_frame, data)); 614 614 ··· 1560 1560 1561 1561 skb->dev = priv->ndev; 1562 1562 can_skb_reserve(skb); 1563 - can_skb_prv(skb)->ifindex = priv->ndev->ifindex; 1563 + csx->can_iif = priv->ndev->ifindex; 1564 1564 skcb = j1939_skb_to_cb(skb); 1565 1565 memcpy(skcb, rel_skcb, sizeof(*skcb)); 1566 1566
+1 -1
net/can/raw.c
··· 966 966 } 967 967 968 968 can_skb_reserve(skb); 969 - can_skb_prv(skb)->ifindex = dev->ifindex; 969 + csx->can_iif = dev->ifindex; 970 970 971 971 /* fill the skb before testing for valid CAN frames */ 972 972 err = memcpy_from_msg(skb_put(skb, size), msg, size);