2019-05-27 09:55:01 +03:00
/* SPDX-License-Identifier: GPL-2.0-or-later */
2016-11-08 16:57:39 +03:00
/*
* SR - IPv6 implementation
*
* Author :
* David Lebrun < david . lebrun @ uclouvain . be >
*/
# 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 <linux/seg6.h>
2018-06-18 05:52:50 +03:00
# include <linux/rhashtable-types.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 )
{
2018-05-20 16:58:12 +03:00
# if IS_ENABLED(CONFIG_IPV6)
2016-11-08 16:57:40 +03:00
return net - > ipv6 . seg6_data ;
2018-05-20 16:58:12 +03:00
# else
return NULL ;
# endif
2016-11-08 16:57:40 +03:00
}
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 ) ;
2018-05-20 16:58:13 +03:00
extern int seg6_lookup_nexthop ( struct sk_buff * skb , struct in6_addr * nhaddr ,
u32 tbl_id ) ;
2016-11-08 16:57:39 +03:00
# endif