mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-01-11 17:10:13 +00:00
can: add drop reasons in the receive path of AF_CAN
Besides the existing pr_warn_once(), use skb drop reasons in case AF_CAN
layer drops non-conformant CAN{,FD,XL} frames, or conformant frames
received by "wrong" devices, so that it's possible to debug (and count)
such events using existing tracepoints:
| # perf record -e skb:kfree_skb -aR -- ./drv/canfdtest -v -g -l 1 vcan0
| # perf script
| [...]
| canfdtest 1123 [000] 3893.271264: skb:kfree_skb: skbaddr=0xffff975703c9f700 rx_sk=(nil) protocol=12 location=can_rcv+0x4b reason: CAN_RX_INVALID_FRAME
Signed-off-by: Davide Caratti <dcaratti@redhat.com>
Link: https://patch.msgid.link/20250604160605.1005704-2-dcaratti@redhat.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
This commit is contained in:
parent
9e97db3c07
commit
127c49624a
@ -121,6 +121,9 @@
|
||||
FN(ARP_PVLAN_DISABLE) \
|
||||
FN(MAC_IEEE_MAC_CONTROL) \
|
||||
FN(BRIDGE_INGRESS_STP_STATE) \
|
||||
FN(CAN_RX_INVALID_FRAME) \
|
||||
FN(CANFD_RX_INVALID_FRAME) \
|
||||
FN(CANXL_RX_INVALID_FRAME) \
|
||||
FNe(MAX)
|
||||
|
||||
/**
|
||||
@ -573,6 +576,21 @@ enum skb_drop_reason {
|
||||
* ingress bridge port does not allow frames to be forwarded.
|
||||
*/
|
||||
SKB_DROP_REASON_BRIDGE_INGRESS_STP_STATE,
|
||||
/**
|
||||
* @SKB_DROP_REASON_CAN_RX_INVALID_FRAME: received
|
||||
* non conform CAN frame (or device is unable to receive CAN frames)
|
||||
*/
|
||||
SKB_DROP_REASON_CAN_RX_INVALID_FRAME,
|
||||
/**
|
||||
* @SKB_DROP_REASON_CANFD_RX_INVALID_FRAME: received
|
||||
* non conform CAN-FD frame (or device is unable to receive CAN frames)
|
||||
*/
|
||||
SKB_DROP_REASON_CANFD_RX_INVALID_FRAME,
|
||||
/**
|
||||
* @SKB_DROP_REASON_CANXL_RX_INVALID_FRAME: received
|
||||
* non conform CAN-XL frame (or device is unable to receive CAN frames)
|
||||
*/
|
||||
SKB_DROP_REASON_CANXL_RX_INVALID_FRAME,
|
||||
/**
|
||||
* @SKB_DROP_REASON_MAX: the maximum of core drop reasons, which
|
||||
* shouldn't be used as a real 'reason' - only for tracing code gen
|
||||
|
||||
@ -683,7 +683,7 @@ static int can_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
pr_warn_once("PF_CAN: dropped non conform CAN skbuff: dev type %d, len %d\n",
|
||||
dev->type, skb->len);
|
||||
|
||||
kfree_skb(skb);
|
||||
kfree_skb_reason(skb, SKB_DROP_REASON_CAN_RX_INVALID_FRAME);
|
||||
return NET_RX_DROP;
|
||||
}
|
||||
|
||||
@ -698,7 +698,7 @@ static int canfd_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
pr_warn_once("PF_CAN: dropped non conform CAN FD skbuff: dev type %d, len %d\n",
|
||||
dev->type, skb->len);
|
||||
|
||||
kfree_skb(skb);
|
||||
kfree_skb_reason(skb, SKB_DROP_REASON_CANFD_RX_INVALID_FRAME);
|
||||
return NET_RX_DROP;
|
||||
}
|
||||
|
||||
@ -713,7 +713,7 @@ static int canxl_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
pr_warn_once("PF_CAN: dropped non conform CAN XL skbuff: dev type %d, len %d\n",
|
||||
dev->type, skb->len);
|
||||
|
||||
kfree_skb(skb);
|
||||
kfree_skb_reason(skb, SKB_DROP_REASON_CANXL_RX_INVALID_FRAME);
|
||||
return NET_RX_DROP;
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user