1 /* SPDX-License-Identifier: GPL-2.0+ */ 2 /* 3 * IPv6 IOAM implementation 4 * 5 * Author: 6 * Justin Iurman <justin.iurman@uliege.be> 7 */ 8 9 #ifndef _NET_IOAM6_H 10 #define _NET_IOAM6_H 11 12 #include <linux/net.h> 13 #include <linux/ipv6.h> 14 #include <linux/ioam6.h> 15 #include <linux/ioam6_genl.h> 16 #include <linux/rhashtable-types.h> 17 18 struct ioam6_namespace { 19 struct rhash_head head; 20 struct rcu_head rcu; 21 22 struct ioam6_schema __rcu *schema; 23 24 __be16 id; 25 __be32 data; 26 __be64 data_wide; 27 }; 28 29 struct ioam6_schema { 30 struct rhash_head head; 31 struct rcu_head rcu; 32 33 struct ioam6_namespace __rcu *ns; 34 35 u32 id; 36 int len; 37 __be32 hdr; 38 39 u8 data[]; 40 }; 41 42 struct ioam6_pernet_data { 43 struct mutex lock; 44 struct rhashtable namespaces; 45 struct rhashtable schemas; 46 }; 47 48 static inline struct ioam6_pernet_data *ioam6_pernet(struct net *net) 49 { 50 #if IS_ENABLED(CONFIG_IPV6) 51 return net->ipv6.ioam6_data; 52 #else 53 return NULL; 54 #endif 55 } 56 57 struct ioam6_namespace *ioam6_namespace(struct net *net, __be16 id); 58 void ioam6_fill_trace_data(struct sk_buff *skb, 59 struct ioam6_namespace *ns, 60 struct ioam6_trace_hdr *trace, 61 bool is_input); 62 63 int ioam6_init(void); 64 void ioam6_exit(void); 65 66 int ioam6_iptunnel_init(void); 67 void ioam6_iptunnel_exit(void); 68 69 void ioam6_event(enum ioam6_event_type type, struct net *net, gfp_t gfp, 70 void *opt, unsigned int opt_len); 71 72 #endif /* _NET_IOAM6_H */ 73