forked from luck/tmp_suning_uos_patched
d1df6fd8a1
This patch implements a new type of lightweight tunnel named seg6local. A seg6local lwt is defined by a type of action and a set of parameters. The action represents the operation to perform on the packets matching the lwt's route, and is not necessarily an encapsulation. The set of parameters are arguments for the processing function. Each action is defined in a struct seg6_action_desc within seg6_action_table[]. This structure contains the action, mandatory attributes, the processing function, and a static headroom size required by the action. The mandatory attributes are encoded as a bitmask field. The static headroom is set to a non-zero value when the processing function always add a constant number of bytes to the skb (e.g. the header size for encapsulations). To facilitate rtnetlink-related operations such as parsing, fill_encap, and cmp_encap, each type of action parameter is associated to three function pointers, in seg6_action_params[]. All actions defined in seg6_local.h are detailed in [1]. [1] https://tools.ietf.org/html/draft-filsfils-spring-srv6-network-programming-01 Signed-off-by: David Lebrun <david.lebrun@uclouvain.be> Signed-off-by: David S. Miller <davem@davemloft.net>
67 lines
1.6 KiB
C
67 lines
1.6 KiB
C
/*
|
|
* 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 int seg6_local_init(void);
|
|
extern void seg6_local_exit(void);
|
|
|
|
extern bool seg6_validate_srh(struct ipv6_sr_hdr *srh, int len);
|
|
extern int seg6_do_srh_encap(struct sk_buff *skb, struct ipv6_sr_hdr *osrh);
|
|
extern int seg6_do_srh_inline(struct sk_buff *skb, struct ipv6_sr_hdr *osrh);
|
|
|
|
#endif
|