0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #ifndef _CAN_SKB_H
0012 #define _CAN_SKB_H
0013
0014 #include <linux/types.h>
0015 #include <linux/skbuff.h>
0016 #include <linux/can.h>
0017 #include <net/sock.h>
0018
0019 void can_flush_echo_skb(struct net_device *dev);
0020 int can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,
0021 unsigned int idx, unsigned int frame_len);
0022 struct sk_buff *__can_get_echo_skb(struct net_device *dev, unsigned int idx,
0023 u8 *len_ptr, unsigned int *frame_len_ptr);
0024 unsigned int __must_check can_get_echo_skb(struct net_device *dev,
0025 unsigned int idx,
0026 unsigned int *frame_len_ptr);
0027 void can_free_echo_skb(struct net_device *dev, unsigned int idx,
0028 unsigned int *frame_len_ptr);
0029 struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf);
0030 struct sk_buff *alloc_canfd_skb(struct net_device *dev,
0031 struct canfd_frame **cfd);
0032 struct sk_buff *alloc_can_err_skb(struct net_device *dev,
0033 struct can_frame **cf);
0034 bool can_dropped_invalid_skb(struct net_device *dev, struct sk_buff *skb);
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052 struct can_skb_priv {
0053 int ifindex;
0054 int skbcnt;
0055 unsigned int frame_len;
0056 struct can_frame cf[];
0057 };
0058
0059 static inline struct can_skb_priv *can_skb_prv(struct sk_buff *skb)
0060 {
0061 return (struct can_skb_priv *)(skb->head);
0062 }
0063
0064 static inline void can_skb_reserve(struct sk_buff *skb)
0065 {
0066 skb_reserve(skb, sizeof(struct can_skb_priv));
0067 }
0068
0069 static inline void can_skb_set_owner(struct sk_buff *skb, struct sock *sk)
0070 {
0071
0072
0073
0074
0075
0076 if (sk && refcount_inc_not_zero(&sk->sk_refcnt)) {
0077 skb->destructor = sock_efree;
0078 skb->sk = sk;
0079 }
0080 }
0081
0082
0083
0084
0085 static inline struct sk_buff *can_create_echo_skb(struct sk_buff *skb)
0086 {
0087 struct sk_buff *nskb;
0088
0089 nskb = skb_clone(skb, GFP_ATOMIC);
0090 if (unlikely(!nskb)) {
0091 kfree_skb(skb);
0092 return NULL;
0093 }
0094
0095 can_skb_set_owner(nskb, skb->sk);
0096 consume_skb(skb);
0097 return nskb;
0098 }
0099
0100 static inline bool can_is_canfd_skb(const struct sk_buff *skb)
0101 {
0102
0103 return skb->len == CANFD_MTU;
0104 }
0105
0106 #endif