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 | |
30 | * @cf: align to the following CAN frame at skb->data | |
31 | */ | |
32 | struct can_skb_priv { | |
33 | int ifindex; | |
34 | struct can_frame cf[0]; | |
35 | }; | |
36 | ||
2bf3440d OH |
37 | static inline struct can_skb_priv *can_skb_prv(struct sk_buff *skb) |
38 | { | |
39 | return (struct can_skb_priv *)(skb->head); | |
40 | } | |
41 | ||
42 | static inline void can_skb_reserve(struct sk_buff *skb) | |
43 | { | |
44 | skb_reserve(skb, sizeof(struct can_skb_priv)); | |
45 | } | |
46 | ||
0ae89beb OH |
47 | static inline void can_skb_destructor(struct sk_buff *skb) |
48 | { | |
49 | sock_put(skb->sk); | |
50 | } | |
51 | ||
52 | static inline void can_skb_set_owner(struct sk_buff *skb, struct sock *sk) | |
53 | { | |
54 | if (sk) { | |
55 | sock_hold(sk); | |
56 | skb->destructor = can_skb_destructor; | |
57 | skb->sk = sk; | |
58 | } | |
59 | } | |
60 | ||
61 | /* | |
62 | * returns an unshared skb owned by the original sock to be echo'ed back | |
63 | */ | |
64 | static inline struct sk_buff *can_create_echo_skb(struct sk_buff *skb) | |
65 | { | |
66 | if (skb_shared(skb)) { | |
67 | struct sk_buff *nskb = skb_clone(skb, GFP_ATOMIC); | |
68 | ||
69 | if (likely(nskb)) { | |
70 | can_skb_set_owner(nskb, skb->sk); | |
71 | consume_skb(skb); | |
72 | return nskb; | |
73 | } else { | |
74 | kfree_skb(skb); | |
75 | return NULL; | |
76 | } | |
77 | } | |
78 | ||
79 | /* we can assume to have an unshared skb with proper owner */ | |
80 | return skb; | |
81 | } | |
82 | ||
42193e3e | 83 | #endif /* !_CAN_SKB_H */ |