2016-11-08 16:57:39 +03:00
/*
* 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
2016-11-08 16:57:40 +03:00
# include <linux/net.h>
# include <linux/ipv6.h>
2016-11-08 16:57:41 +03:00
# include <net/lwtunnel.h>
# include <linux/seg6.h>
2016-11-08 16:57:42 +03:00
# include <linux/rhashtable.h>
2016-11-08 16:57:40 +03:00
2016-11-08 16:57:39 +03:00
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 ) ;
}
2016-11-08 16:57:40 +03:00
struct seg6_pernet_data {
struct mutex lock ;
struct in6_addr __rcu * tun_src ;
2016-11-08 16:57:42 +03:00
# ifdef CONFIG_IPV6_SEG6_HMAC
struct rhashtable hmac_infos ;
# endif
2016-11-08 16:57:40 +03:00
} ;
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 ) ;
2016-11-08 16:57:41 +03:00
extern int seg6_iptunnel_init ( void ) ;
extern void seg6_iptunnel_exit ( void ) ;
2017-08-05 13:38:26 +03:00
extern int seg6_local_init ( void ) ;
extern void seg6_local_exit ( void ) ;
2016-11-08 16:57:41 +03:00
extern bool seg6_validate_srh ( struct ipv6_sr_hdr * srh , int len ) ;
2017-08-25 10:56:44 +03:00
extern int seg6_do_srh_encap ( struct sk_buff * skb , struct ipv6_sr_hdr * osrh ,
int proto ) ;
2017-08-05 13:38:25 +03:00
extern int seg6_do_srh_inline ( struct sk_buff * skb , struct ipv6_sr_hdr * osrh ) ;
2016-11-08 16:57:40 +03:00
2016-11-08 16:57:39 +03:00
# endif