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 BIT(0) 15 #define LWTUNNEL_STATE_INPUT_REDIRECT BIT(1) 16 17 struct lwtunnel_state { 18 __u16 type; 19 __u16 flags; 20 atomic_t refcnt; 21 int (*orig_output)(struct net *net, struct sock *sk, struct sk_buff *skb); 22 int (*orig_input)(struct sk_buff *); 23 int len; 24 __u8 data[0]; 25 }; 26 27 struct lwtunnel_encap_ops { 28 int (*build_state)(struct net_device *dev, struct nlattr *encap, 29 unsigned int family, const void *cfg, 30 struct lwtunnel_state **ts); 31 int (*output)(struct net *net, struct sock *sk, struct sk_buff *skb); 32 int (*input)(struct sk_buff *skb); 33 int (*fill_encap)(struct sk_buff *skb, 34 struct lwtunnel_state *lwtstate); 35 int (*get_encap_size)(struct lwtunnel_state *lwtstate); 36 int (*cmp_encap)(struct lwtunnel_state *a, struct lwtunnel_state *b); 37 }; 38 39 #ifdef CONFIG_LWTUNNEL 40 static inline void lwtstate_free(struct lwtunnel_state *lws) 41 { 42 kfree(lws); 43 } 44 45 static inline struct lwtunnel_state * 46 lwtstate_get(struct lwtunnel_state *lws) 47 { 48 if (lws) 49 atomic_inc(&lws->refcnt); 50 51 return lws; 52 } 53 54 static inline void lwtstate_put(struct lwtunnel_state *lws) 55 { 56 if (!lws) 57 return; 58 59 if (atomic_dec_and_test(&lws->refcnt)) 60 lwtstate_free(lws); 61 } 62 63 static inline bool lwtunnel_output_redirect(struct lwtunnel_state *lwtstate) 64 { 65 if (lwtstate && (lwtstate->flags & LWTUNNEL_STATE_OUTPUT_REDIRECT)) 66 return true; 67 68 return false; 69 } 70 71 static inline bool lwtunnel_input_redirect(struct lwtunnel_state *lwtstate) 72 { 73 if (lwtstate && (lwtstate->flags & LWTUNNEL_STATE_INPUT_REDIRECT)) 74 return true; 75 76 return false; 77 } 78 int lwtunnel_encap_add_ops(const struct lwtunnel_encap_ops *op, 79 unsigned int num); 80 int lwtunnel_encap_del_ops(const struct lwtunnel_encap_ops *op, 81 unsigned int num); 82 int lwtunnel_build_state(struct net_device *dev, u16 encap_type, 83 struct nlattr *encap, 84 unsigned int family, const void *cfg, 85 struct lwtunnel_state **lws); 86 int lwtunnel_fill_encap(struct sk_buff *skb, 87 struct lwtunnel_state *lwtstate); 88 int lwtunnel_get_encap_size(struct lwtunnel_state *lwtstate); 89 struct lwtunnel_state *lwtunnel_state_alloc(int hdr_len); 90 int lwtunnel_cmp_encap(struct lwtunnel_state *a, struct lwtunnel_state *b); 91 int lwtunnel_output(struct net *net, struct sock *sk, struct sk_buff *skb); 92 int lwtunnel_input(struct sk_buff *skb); 93 94 #else 95 96 static inline void lwtstate_free(struct lwtunnel_state *lws) 97 { 98 } 99 100 static inline struct lwtunnel_state * 101 lwtstate_get(struct lwtunnel_state *lws) 102 { 103 return lws; 104 } 105 106 static inline void lwtstate_put(struct lwtunnel_state *lws) 107 { 108 } 109 110 static inline bool lwtunnel_output_redirect(struct lwtunnel_state *lwtstate) 111 { 112 return false; 113 } 114 115 static inline bool lwtunnel_input_redirect(struct lwtunnel_state *lwtstate) 116 { 117 return false; 118 } 119 120 static inline int lwtunnel_encap_add_ops(const struct lwtunnel_encap_ops *op, 121 unsigned int num) 122 { 123 return -EOPNOTSUPP; 124 125 } 126 127 static inline int lwtunnel_encap_del_ops(const struct lwtunnel_encap_ops *op, 128 unsigned int num) 129 { 130 return -EOPNOTSUPP; 131 } 132 133 static inline int lwtunnel_build_state(struct net_device *dev, u16 encap_type, 134 struct nlattr *encap, 135 unsigned int family, const void *cfg, 136 struct lwtunnel_state **lws) 137 { 138 return -EOPNOTSUPP; 139 } 140 141 static inline int lwtunnel_fill_encap(struct sk_buff *skb, 142 struct lwtunnel_state *lwtstate) 143 { 144 return 0; 145 } 146 147 static inline int lwtunnel_get_encap_size(struct lwtunnel_state *lwtstate) 148 { 149 return 0; 150 } 151 152 static inline struct lwtunnel_state *lwtunnel_state_alloc(int hdr_len) 153 { 154 return NULL; 155 } 156 157 static inline int lwtunnel_cmp_encap(struct lwtunnel_state *a, 158 struct lwtunnel_state *b) 159 { 160 return 0; 161 } 162 163 static inline int lwtunnel_output(struct net *net, struct sock *sk, struct sk_buff *skb) 164 { 165 return -EOPNOTSUPP; 166 } 167 168 static inline int lwtunnel_input(struct sk_buff *skb) 169 { 170 return -EOPNOTSUPP; 171 } 172 173 #endif /* CONFIG_LWTUNNEL */ 174 175 #define MODULE_ALIAS_RTNL_LWT(encap_type) MODULE_ALIAS("rtnl-lwt-" __stringify(encap_type)) 176 177 #endif /* __NET_LWTUNNEL_H */ 178