Welcome to the Linux Foundation Forum!

How to implement callback for CAN Bus

The linux socket CAN interface provides a function to register a callback when a frame is received. I am implementing a driver that needs to use this interface. I have it implemented but I am getting multiple (duplicate) frames when the remote device sends a CAN message. I have snooped on the wire and there is only ONE can message being sent. Here are the two parts of code I am working with. My guess is that there is some post-processing of the socket kernel buffer (skb) that is not getting done but I don't see any concrete examples of such an action.

Here is the registration call:
result = can_rx_register(&init_net, dev, 10 | CAN_INV_FILTER, CAN_SFF_MASK, &sc_rcv, skb, "sercan", 0);
printk( KERN_NOTICE "%s: can_rx_register() returned %d\n", DEVICE, result );

Here is the callback:
static void sc_rcv(struct sk_buff *skbr, void *data)
{
const struct can_frame *rxframe = (struct can_frame *)skbr->data;
// printk( KERN_NOTICE "%s: received a CAN packet 0x%p\n", DEVICE, rxframe);

The callback is working but it is firing multiple times (2,3... or more). Sometimes 5.

Are there any examples out in the world that show how this is implemented?

Categories

Upcoming Training