xref: /openbmc/linux/include/net/ioam6.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
19ee11f0fSJustin Iurman /* SPDX-License-Identifier: GPL-2.0+ */
29ee11f0fSJustin Iurman /*
39ee11f0fSJustin Iurman  *  IPv6 IOAM implementation
49ee11f0fSJustin Iurman  *
59ee11f0fSJustin Iurman  *  Author:
69ee11f0fSJustin Iurman  *  Justin Iurman <justin.iurman@uliege.be>
79ee11f0fSJustin Iurman  */
89ee11f0fSJustin Iurman 
99ee11f0fSJustin Iurman #ifndef _NET_IOAM6_H
109ee11f0fSJustin Iurman #define _NET_IOAM6_H
119ee11f0fSJustin Iurman 
129ee11f0fSJustin Iurman #include <linux/net.h>
139ee11f0fSJustin Iurman #include <linux/ipv6.h>
149ee11f0fSJustin Iurman #include <linux/ioam6.h>
159ee11f0fSJustin Iurman #include <linux/rhashtable-types.h>
169ee11f0fSJustin Iurman 
179ee11f0fSJustin Iurman struct ioam6_namespace {
189ee11f0fSJustin Iurman 	struct rhash_head head;
199ee11f0fSJustin Iurman 	struct rcu_head rcu;
209ee11f0fSJustin Iurman 
219ee11f0fSJustin Iurman 	struct ioam6_schema __rcu *schema;
229ee11f0fSJustin Iurman 
239ee11f0fSJustin Iurman 	__be16 id;
249ee11f0fSJustin Iurman 	__be32 data;
259ee11f0fSJustin Iurman 	__be64 data_wide;
269ee11f0fSJustin Iurman };
279ee11f0fSJustin Iurman 
289ee11f0fSJustin Iurman struct ioam6_schema {
299ee11f0fSJustin Iurman 	struct rhash_head head;
309ee11f0fSJustin Iurman 	struct rcu_head rcu;
319ee11f0fSJustin Iurman 
329ee11f0fSJustin Iurman 	struct ioam6_namespace __rcu *ns;
339ee11f0fSJustin Iurman 
349ee11f0fSJustin Iurman 	u32 id;
359ee11f0fSJustin Iurman 	int len;
369ee11f0fSJustin Iurman 	__be32 hdr;
379ee11f0fSJustin Iurman 
38*5224f790SGustavo A. R. Silva 	u8 data[];
399ee11f0fSJustin Iurman };
409ee11f0fSJustin Iurman 
419ee11f0fSJustin Iurman struct ioam6_pernet_data {
429ee11f0fSJustin Iurman 	struct mutex lock;
439ee11f0fSJustin Iurman 	struct rhashtable namespaces;
449ee11f0fSJustin Iurman 	struct rhashtable schemas;
459ee11f0fSJustin Iurman };
469ee11f0fSJustin Iurman 
ioam6_pernet(struct net * net)479ee11f0fSJustin Iurman static inline struct ioam6_pernet_data *ioam6_pernet(struct net *net)
489ee11f0fSJustin Iurman {
499ee11f0fSJustin Iurman #if IS_ENABLED(CONFIG_IPV6)
509ee11f0fSJustin Iurman 	return net->ipv6.ioam6_data;
519ee11f0fSJustin Iurman #else
529ee11f0fSJustin Iurman 	return NULL;
539ee11f0fSJustin Iurman #endif
549ee11f0fSJustin Iurman }
559ee11f0fSJustin Iurman 
569ee11f0fSJustin Iurman struct ioam6_namespace *ioam6_namespace(struct net *net, __be16 id);
579ee11f0fSJustin Iurman void ioam6_fill_trace_data(struct sk_buff *skb,
589ee11f0fSJustin Iurman 			   struct ioam6_namespace *ns,
5952d03786SJustin Iurman 			   struct ioam6_trace_hdr *trace,
6052d03786SJustin Iurman 			   bool is_input);
619ee11f0fSJustin Iurman 
629ee11f0fSJustin Iurman int ioam6_init(void);
639ee11f0fSJustin Iurman void ioam6_exit(void);
649ee11f0fSJustin Iurman 
653edede08SJustin Iurman int ioam6_iptunnel_init(void);
663edede08SJustin Iurman void ioam6_iptunnel_exit(void);
673edede08SJustin Iurman 
689ee11f0fSJustin Iurman #endif /* _NET_IOAM6_H */
69