diff options
Diffstat (limited to 'include/net/seg6.h')
| -rw-r--r-- | include/net/seg6.h | 62 | 
1 files changed, 62 insertions, 0 deletions
| diff --git a/include/net/seg6.h b/include/net/seg6.h new file mode 100644 index 000000000000..4e0357517d79 --- /dev/null +++ b/include/net/seg6.h @@ -0,0 +1,62 @@ +/* + *  SR-IPv6 implementation + * + *  Author: + *  David Lebrun <david.lebrun@uclouvain.be> + * + * + *  This program is free software; you can redistribute it and/or + *      modify it under the terms of the GNU General Public License + *      as published by the Free Software Foundation; either version + *      2 of the License, or (at your option) any later version. + */ + +#ifndef _NET_SEG6_H +#define _NET_SEG6_H + +#include <linux/net.h> +#include <linux/ipv6.h> +#include <net/lwtunnel.h> +#include <linux/seg6.h> +#include <linux/rhashtable.h> + +static inline void update_csum_diff4(struct sk_buff *skb, __be32 from, +				     __be32 to) +{ +	__be32 diff[] = { ~from, to }; + +	skb->csum = ~csum_partial((char *)diff, sizeof(diff), ~skb->csum); +} + +static inline void update_csum_diff16(struct sk_buff *skb, __be32 *from, +				      __be32 *to) +{ +	__be32 diff[] = { +		~from[0], ~from[1], ~from[2], ~from[3], +		to[0], to[1], to[2], to[3], +	}; + +	skb->csum = ~csum_partial((char *)diff, sizeof(diff), ~skb->csum); +} + +struct seg6_pernet_data { +	struct mutex lock; +	struct in6_addr __rcu *tun_src; +#ifdef CONFIG_IPV6_SEG6_HMAC +	struct rhashtable hmac_infos; +#endif +}; + +static inline struct seg6_pernet_data *seg6_pernet(struct net *net) +{ +	return net->ipv6.seg6_data; +} + +extern int seg6_init(void); +extern void seg6_exit(void); +extern int seg6_iptunnel_init(void); +extern void seg6_iptunnel_exit(void); + +extern bool seg6_validate_srh(struct ipv6_sr_hdr *srh, int len); + +#endif | 
