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 Iurmanstatic 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