
The struct can_skb_priv is used to transport additional information along with the stored struct can(fd)_frame that can not be contained in existing struct sk_buff elements. can_skb_priv is located in the skb headroom, which does not touch the existing CAN sk_buff usage with skb->data and skb->len, so that even out-of-tree CAN drivers can be used without changes. Btw. out-of-tree CAN drivers without can_skb_priv in the sk_buff headroom would not support features based on can_skb_priv. The can_skb_priv->ifindex contains the first interface where the CAN frame appeared on the local host. Unfortunately skb->skb_iif can not be used as this value is overwritten in every netif_receive_skb() call. Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net> Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
36 lines
915 B
C
36 lines
915 B
C
/*
|
|
* linux/can/skb.h
|
|
*
|
|
* Definitions for the CAN network socket buffer
|
|
*
|
|
* Copyright (C) 2012 Oliver Hartkopp <socketcan@hartkopp.net>
|
|
*
|
|
*/
|
|
|
|
#ifndef CAN_SKB_H
|
|
#define CAN_SKB_H
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/can.h>
|
|
|
|
/*
|
|
* The struct can_skb_priv is used to transport additional information along
|
|
* with the stored struct can(fd)_frame that can not be contained in existing
|
|
* 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
|
|
* @cf: align to the following CAN frame at skb->data
|
|
*/
|
|
struct can_skb_priv {
|
|
int ifindex;
|
|
struct can_frame cf[0];
|
|
};
|
|
|
|
#endif /* CAN_SKB_H */
|