net/mlx4_en: Add support for hardware accelerated 802.1ad vlan
[firefly-linux-kernel-4.4.55.git] / include / net / lwtunnel.h
1 #ifndef __NET_LWTUNNEL_H
2 #define __NET_LWTUNNEL_H 1
3
4 #include <linux/lwtunnel.h>
5 #include <linux/netdevice.h>
6 #include <linux/skbuff.h>
7 #include <linux/types.h>
8 #include <net/route.h>
9
10 #define LWTUNNEL_HASH_BITS   7
11 #define LWTUNNEL_HASH_SIZE   (1 << LWTUNNEL_HASH_BITS)
12
13 /* lw tunnel state flags */
14 #define LWTUNNEL_STATE_OUTPUT_REDIRECT 0x1
15
16 struct lwtunnel_state {
17         __u16           type;
18         __u16           flags;
19         atomic_t        refcnt;
20         int             len;
21         __u8            data[0];
22 };
23
24 struct lwtunnel_encap_ops {
25         int (*build_state)(struct net_device *dev, struct nlattr *encap,
26                            struct lwtunnel_state **ts);
27         int (*output)(struct sock *sk, struct sk_buff *skb);
28         int (*fill_encap)(struct sk_buff *skb,
29                           struct lwtunnel_state *lwtstate);
30         int (*get_encap_size)(struct lwtunnel_state *lwtstate);
31         int (*cmp_encap)(struct lwtunnel_state *a, struct lwtunnel_state *b);
32 };
33
34 extern const struct lwtunnel_encap_ops __rcu *
35                 lwtun_encaps[LWTUNNEL_ENCAP_MAX+1];
36
37 #ifdef CONFIG_LWTUNNEL
38 static inline struct lwtunnel_state *
39 lwtstate_get(struct lwtunnel_state *lws)
40 {
41         if (lws)
42                 atomic_inc(&lws->refcnt);
43
44         return lws;
45 }
46
47 static inline void lwtstate_put(struct lwtunnel_state *lws)
48 {
49         if (!lws)
50                 return;
51
52         if (atomic_dec_and_test(&lws->refcnt))
53                 kfree(lws);
54 }
55
56 static inline bool lwtunnel_output_redirect(struct lwtunnel_state *lwtstate)
57 {
58         if (lwtstate && (lwtstate->flags & LWTUNNEL_STATE_OUTPUT_REDIRECT))
59                 return true;
60
61         return false;
62 }
63
64 int lwtunnel_encap_add_ops(const struct lwtunnel_encap_ops *op,
65                            unsigned int num);
66 int lwtunnel_encap_del_ops(const struct lwtunnel_encap_ops *op,
67                            unsigned int num);
68 int lwtunnel_build_state(struct net_device *dev, u16 encap_type,
69                          struct nlattr *encap,
70                          struct lwtunnel_state **lws);
71 int lwtunnel_fill_encap(struct sk_buff *skb,
72                         struct lwtunnel_state *lwtstate);
73 int lwtunnel_get_encap_size(struct lwtunnel_state *lwtstate);
74 struct lwtunnel_state *lwtunnel_state_alloc(int hdr_len);
75 int lwtunnel_cmp_encap(struct lwtunnel_state *a, struct lwtunnel_state *b);
76 int lwtunnel_output(struct sock *sk, struct sk_buff *skb);
77 int lwtunnel_output6(struct sock *sk, struct sk_buff *skb);
78
79 #else
80
81 static inline struct lwtunnel_state *
82 lwtstate_get(struct lwtunnel_state *lws)
83 {
84         return lws;
85 }
86
87 static inline void lwtstate_put(struct lwtunnel_state *lws)
88 {
89 }
90
91 static inline bool lwtunnel_output_redirect(struct lwtunnel_state *lwtstate)
92 {
93         return false;
94 }
95
96 static inline int lwtunnel_encap_add_ops(const struct lwtunnel_encap_ops *op,
97                                          unsigned int num)
98 {
99         return -EOPNOTSUPP;
100
101 }
102
103 static inline int lwtunnel_encap_del_ops(const struct lwtunnel_encap_ops *op,
104                                          unsigned int num)
105 {
106         return -EOPNOTSUPP;
107 }
108
109 static inline int lwtunnel_build_state(struct net_device *dev, u16 encap_type,
110                                        struct nlattr *encap,
111                                        struct lwtunnel_state **lws)
112 {
113         return -EOPNOTSUPP;
114 }
115
116 static inline int lwtunnel_fill_encap(struct sk_buff *skb,
117                                       struct lwtunnel_state *lwtstate)
118 {
119         return 0;
120 }
121
122 static inline int lwtunnel_get_encap_size(struct lwtunnel_state *lwtstate)
123 {
124         return 0;
125 }
126
127 static inline struct lwtunnel_state *lwtunnel_state_alloc(int hdr_len)
128 {
129         return NULL;
130 }
131
132 static inline int lwtunnel_cmp_encap(struct lwtunnel_state *a,
133                                      struct lwtunnel_state *b)
134 {
135         return 0;
136 }
137
138 static inline int lwtunnel_output(struct sock *sk, struct sk_buff *skb)
139 {
140         return -EOPNOTSUPP;
141 }
142
143 static inline int lwtunnel_output6(struct sock *sk, struct sk_buff *skb)
144 {
145         return -EOPNOTSUPP;
146 }
147
148 #endif
149
150 #endif /* __NET_LWTUNNEL_H */