Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v6.15-rc4 273 lines 6.9 kB view raw
1/* SPDX-License-Identifier: GPL-2.0 */ 2#ifndef __NET_LWTUNNEL_H 3#define __NET_LWTUNNEL_H 1 4 5#include <linux/lwtunnel.h> 6#include <linux/netdevice.h> 7#include <linux/skbuff.h> 8#include <linux/types.h> 9#include <net/route.h> 10 11#define LWTUNNEL_HASH_BITS 7 12#define LWTUNNEL_HASH_SIZE (1 << LWTUNNEL_HASH_BITS) 13 14/* lw tunnel state flags */ 15#define LWTUNNEL_STATE_OUTPUT_REDIRECT BIT(0) 16#define LWTUNNEL_STATE_INPUT_REDIRECT BIT(1) 17#define LWTUNNEL_STATE_XMIT_REDIRECT BIT(2) 18 19/* LWTUNNEL_XMIT_CONTINUE should be distinguishable from dst_output return 20 * values (NET_XMIT_xxx and NETDEV_TX_xxx in linux/netdevice.h) for safety. 21 */ 22enum { 23 LWTUNNEL_XMIT_DONE, 24 LWTUNNEL_XMIT_CONTINUE = 0x100, 25}; 26 27 28struct lwtunnel_state { 29 __u16 type; 30 __u16 flags; 31 __u16 headroom; 32 atomic_t refcnt; 33 int (*orig_output)(struct net *net, struct sock *sk, struct sk_buff *skb); 34 int (*orig_input)(struct sk_buff *); 35 struct rcu_head rcu; 36 __u8 data[]; 37}; 38 39struct lwtunnel_encap_ops { 40 int (*build_state)(struct net *net, struct nlattr *encap, 41 unsigned int family, const void *cfg, 42 struct lwtunnel_state **ts, 43 struct netlink_ext_ack *extack); 44 void (*destroy_state)(struct lwtunnel_state *lws); 45 int (*output)(struct net *net, struct sock *sk, struct sk_buff *skb); 46 int (*input)(struct sk_buff *skb); 47 int (*fill_encap)(struct sk_buff *skb, 48 struct lwtunnel_state *lwtstate); 49 int (*get_encap_size)(struct lwtunnel_state *lwtstate); 50 int (*cmp_encap)(struct lwtunnel_state *a, struct lwtunnel_state *b); 51 int (*xmit)(struct sk_buff *skb); 52 53 struct module *owner; 54}; 55 56#ifdef CONFIG_LWTUNNEL 57 58DECLARE_STATIC_KEY_FALSE(nf_hooks_lwtunnel_enabled); 59 60void lwtstate_free(struct lwtunnel_state *lws); 61 62static inline struct lwtunnel_state * 63lwtstate_get(struct lwtunnel_state *lws) 64{ 65 if (lws) 66 atomic_inc(&lws->refcnt); 67 68 return lws; 69} 70 71static inline void lwtstate_put(struct lwtunnel_state *lws) 72{ 73 if (!lws) 74 return; 75 76 if (atomic_dec_and_test(&lws->refcnt)) 77 lwtstate_free(lws); 78} 79 80static inline bool lwtunnel_output_redirect(struct lwtunnel_state *lwtstate) 81{ 82 if (lwtstate && (lwtstate->flags & LWTUNNEL_STATE_OUTPUT_REDIRECT)) 83 return true; 84 85 return false; 86} 87 88static inline bool lwtunnel_input_redirect(struct lwtunnel_state *lwtstate) 89{ 90 if (lwtstate && (lwtstate->flags & LWTUNNEL_STATE_INPUT_REDIRECT)) 91 return true; 92 93 return false; 94} 95 96static inline bool lwtunnel_xmit_redirect(struct lwtunnel_state *lwtstate) 97{ 98 if (lwtstate && (lwtstate->flags & LWTUNNEL_STATE_XMIT_REDIRECT)) 99 return true; 100 101 return false; 102} 103 104static inline unsigned int lwtunnel_headroom(struct lwtunnel_state *lwtstate, 105 unsigned int mtu) 106{ 107 if ((lwtunnel_xmit_redirect(lwtstate) || 108 lwtunnel_output_redirect(lwtstate)) && lwtstate->headroom < mtu) 109 return lwtstate->headroom; 110 111 return 0; 112} 113 114int lwtunnel_encap_add_ops(const struct lwtunnel_encap_ops *op, 115 unsigned int num); 116int lwtunnel_encap_del_ops(const struct lwtunnel_encap_ops *op, 117 unsigned int num); 118int lwtunnel_valid_encap_type(u16 encap_type, 119 struct netlink_ext_ack *extack, 120 bool rtnl_is_held); 121int lwtunnel_valid_encap_type_attr(struct nlattr *attr, int len, 122 struct netlink_ext_ack *extack, 123 bool rtnl_is_held); 124int lwtunnel_build_state(struct net *net, u16 encap_type, 125 struct nlattr *encap, 126 unsigned int family, const void *cfg, 127 struct lwtunnel_state **lws, 128 struct netlink_ext_ack *extack); 129int lwtunnel_fill_encap(struct sk_buff *skb, struct lwtunnel_state *lwtstate, 130 int encap_attr, int encap_type_attr); 131int lwtunnel_get_encap_size(struct lwtunnel_state *lwtstate); 132struct lwtunnel_state *lwtunnel_state_alloc(int hdr_len); 133int lwtunnel_cmp_encap(struct lwtunnel_state *a, struct lwtunnel_state *b); 134int lwtunnel_output(struct net *net, struct sock *sk, struct sk_buff *skb); 135int lwtunnel_input(struct sk_buff *skb); 136int lwtunnel_xmit(struct sk_buff *skb); 137int bpf_lwt_push_ip_encap(struct sk_buff *skb, void *hdr, u32 len, 138 bool ingress); 139 140static inline void lwtunnel_set_redirect(struct dst_entry *dst) 141{ 142 if (lwtunnel_output_redirect(dst->lwtstate)) { 143 dst->lwtstate->orig_output = dst->output; 144 dst->output = lwtunnel_output; 145 } 146 if (lwtunnel_input_redirect(dst->lwtstate)) { 147 dst->lwtstate->orig_input = dst->input; 148 dst->input = lwtunnel_input; 149 } 150} 151#else 152 153static inline void lwtstate_free(struct lwtunnel_state *lws) 154{ 155} 156 157static inline struct lwtunnel_state * 158lwtstate_get(struct lwtunnel_state *lws) 159{ 160 return lws; 161} 162 163static inline void lwtstate_put(struct lwtunnel_state *lws) 164{ 165} 166 167static inline bool lwtunnel_output_redirect(struct lwtunnel_state *lwtstate) 168{ 169 return false; 170} 171 172static inline bool lwtunnel_input_redirect(struct lwtunnel_state *lwtstate) 173{ 174 return false; 175} 176 177static inline bool lwtunnel_xmit_redirect(struct lwtunnel_state *lwtstate) 178{ 179 return false; 180} 181 182static inline void lwtunnel_set_redirect(struct dst_entry *dst) 183{ 184} 185 186static inline unsigned int lwtunnel_headroom(struct lwtunnel_state *lwtstate, 187 unsigned int mtu) 188{ 189 return 0; 190} 191 192static inline int lwtunnel_encap_add_ops(const struct lwtunnel_encap_ops *op, 193 unsigned int num) 194{ 195 return -EOPNOTSUPP; 196 197} 198 199static inline int lwtunnel_encap_del_ops(const struct lwtunnel_encap_ops *op, 200 unsigned int num) 201{ 202 return -EOPNOTSUPP; 203} 204 205static inline int lwtunnel_valid_encap_type(u16 encap_type, 206 struct netlink_ext_ack *extack, 207 bool rtnl_is_held) 208{ 209 NL_SET_ERR_MSG(extack, "CONFIG_LWTUNNEL is not enabled in this kernel"); 210 return -EOPNOTSUPP; 211} 212static inline int lwtunnel_valid_encap_type_attr(struct nlattr *attr, int len, 213 struct netlink_ext_ack *extack, 214 bool rtnl_is_held) 215{ 216 /* return 0 since we are not walking attr looking for 217 * RTA_ENCAP_TYPE attribute on nexthops. 218 */ 219 return 0; 220} 221 222static inline int lwtunnel_build_state(struct net *net, u16 encap_type, 223 struct nlattr *encap, 224 unsigned int family, const void *cfg, 225 struct lwtunnel_state **lws, 226 struct netlink_ext_ack *extack) 227{ 228 return -EOPNOTSUPP; 229} 230 231static inline int lwtunnel_fill_encap(struct sk_buff *skb, 232 struct lwtunnel_state *lwtstate, 233 int encap_attr, int encap_type_attr) 234{ 235 return 0; 236} 237 238static inline int lwtunnel_get_encap_size(struct lwtunnel_state *lwtstate) 239{ 240 return 0; 241} 242 243static inline struct lwtunnel_state *lwtunnel_state_alloc(int hdr_len) 244{ 245 return NULL; 246} 247 248static inline int lwtunnel_cmp_encap(struct lwtunnel_state *a, 249 struct lwtunnel_state *b) 250{ 251 return 0; 252} 253 254static inline int lwtunnel_output(struct net *net, struct sock *sk, struct sk_buff *skb) 255{ 256 return -EOPNOTSUPP; 257} 258 259static inline int lwtunnel_input(struct sk_buff *skb) 260{ 261 return -EOPNOTSUPP; 262} 263 264static inline int lwtunnel_xmit(struct sk_buff *skb) 265{ 266 return -EOPNOTSUPP; 267} 268 269#endif /* CONFIG_LWTUNNEL */ 270 271#define MODULE_ALIAS_RTNL_LWT(encap_type) MODULE_ALIAS("rtnl-lwt-" __stringify(encap_type)) 272 273#endif /* __NET_LWTUNNEL_H */