Commit | Line | Data |
---|---|---|
156c2bb9 OH |
1 | /* |
2 | * linux/can/skb.h | |
3 | * | |
4 | * Definitions for the CAN network socket buffer | |
5 | * | |
6 | * Copyright (C) 2012 Oliver Hartkopp <socketcan@hartkopp.net> | |
7 | * | |
8 | */ | |
9 | ||
42193e3e OH |
10 | #ifndef _CAN_SKB_H |
11 | #define _CAN_SKB_H | |
156c2bb9 OH |
12 | |
13 | #include <linux/types.h> | |
0ae89beb | 14 | #include <linux/skbuff.h> |
156c2bb9 | 15 | #include <linux/can.h> |
0ae89beb | 16 | #include <net/sock.h> |
156c2bb9 OH |
17 | |
18 | /* | |
19 | * The struct can_skb_priv is used to transport additional information along | |
20 | * with the stored struct can(fd)_frame that can not be contained in existing | |
21 | * struct sk_buff elements. | |
22 | * N.B. that this information must not be modified in cloned CAN sk_buffs. | |
23 | * To modify the CAN frame content or the struct can_skb_priv content | |
24 | * skb_copy() needs to be used instead of skb_clone(). | |
25 | */ | |
26 | ||
27 | /** | |
28 | * struct can_skb_priv - private additional data inside CAN sk_buffs | |
29 | * @ifindex: ifindex of the first interface the CAN frame appeared on | |
d3b58c47 | 30 | * @skbcnt: atomic counter to have an unique id together with skb pointer |
156c2bb9 OH |
31 | * @cf: align to the following CAN frame at skb->data |
32 | */ | |
33 | struct can_skb_priv { | |
34 | int ifindex; | |
d3b58c47 | 35 | int skbcnt; |
156c2bb9 OH |
36 | struct can_frame cf[0]; |
37 | }; | |
38 | ||
2bf3440d OH |
39 | static inline struct can_skb_priv *can_skb_prv(struct sk_buff *skb) |
40 | { | |
41 | return (struct can_skb_priv *)(skb->head); | |
42 | } | |
43 | ||
44 | static inline void can_skb_reserve(struct sk_buff *skb) | |
45 | { | |
46 | skb_reserve(skb, sizeof(struct can_skb_priv)); | |
47 | } | |
48 | ||
0ae89beb OH |
49 | static inline void can_skb_set_owner(struct sk_buff *skb, struct sock *sk) |
50 | { | |
51 | if (sk) { | |
52 | sock_hold(sk); | |
2b290bbb | 53 | skb->destructor = sock_efree; |
0ae89beb OH |
54 | skb->sk = sk; |
55 | } | |
56 | } | |
57 | ||
58 | /* | |
59 | * returns an unshared skb owned by the original sock to be echo'ed back | |
60 | */ | |
61 | static inline struct sk_buff *can_create_echo_skb(struct sk_buff *skb) | |
62 | { | |
63 | if (skb_shared(skb)) { | |
64 | struct sk_buff *nskb = skb_clone(skb, GFP_ATOMIC); | |
65 | ||
66 | if (likely(nskb)) { | |
67 | can_skb_set_owner(nskb, skb->sk); | |
68 | consume_skb(skb); | |
69 | return nskb; | |
70 | } else { | |
71 | kfree_skb(skb); | |
72 | return NULL; | |
73 | } | |
74 | } | |
75 | ||
76 | /* we can assume to have an unshared skb with proper owner */ | |
77 | return skb; | |
78 | } | |
79 | ||
42193e3e | 80 | #endif /* !_CAN_SKB_H */ |