#include <linux/filter.h>
#include <linux/types.h>
#include <linux/skbuff.h>
#include <linux/net.h>
#include <linux/module.h>
#include <net/ip.h>
#include <net/lwtunnel.h>
#include <net/netevent.h>
#include <net/netns/generic.h>
#include <net/ip6_fib.h>
#include <net/route.h>
#include <net/seg6.h>
#include <linux/seg6.h>
#include <linux/seg6_local.h>
#include <net/addrconf.h>
#include <net/ip6_route.h>
#include <net/dst_cache.h>
#include <net/ip_tunnels.h>
#ifdef CONFIG_IPV6_SEG6_HMAC
#include <net/seg6_hmac.h>
#endif
#include <net/seg6_local.h>
#include <linux/etherdevice.h>
#include <linux/bpf.h>
#include <linux/netfilter.h>
#define SEG6_F_ATTR(i) …
struct seg6_local_lwt;
struct seg6_local_lwtunnel_ops { … };
struct seg6_action_desc { … };
struct bpf_lwt_prog { … };
#define SEG6_LOCAL_LCBLOCK_DBITS …
#define SEG6_LOCAL_LCNODE_FN_DBITS …
#define next_csid_chk_cntr_bits(blen, flen) …
#define next_csid_chk_lcblock_bits(blen) …
#define next_csid_chk_lcnode_fn_bits(flen) …
#define SEG6_F_LOCAL_FLAVORS …
#define SEG6_F_LOCAL_FLV_OP(flvname) …
#define SEG6_F_LOCAL_FLV_NEXT_CSID …
#define SEG6_F_LOCAL_FLV_PSP …
#define SEG6_LOCAL_FLV8986_SUPP_OPS …
#define SEG6_LOCAL_END_FLV_SUPP_OPS …
#define SEG6_LOCAL_END_X_FLV_SUPP_OPS …
struct seg6_flavors_info { … };
enum seg6_end_dt_mode { … };
struct seg6_end_dt_info { … };
struct pcpu_seg6_local_counters { … };
struct seg6_local_counters { … };
#define seg6_local_alloc_pcpu_counters(__gfp) …
#define SEG6_F_LOCAL_COUNTERS …
struct seg6_local_lwt { … };
static struct seg6_local_lwt *seg6_local_lwtunnel(struct lwtunnel_state *lwt)
{ … }
static struct ipv6_sr_hdr *get_and_validate_srh(struct sk_buff *skb)
{ … }
static bool decap_and_validate(struct sk_buff *skb, int proto)
{ … }
static void advance_nextseg(struct ipv6_sr_hdr *srh, struct in6_addr *daddr)
{ … }
static int
seg6_lookup_any_nexthop(struct sk_buff *skb, struct in6_addr *nhaddr,
u32 tbl_id, bool local_delivery)
{ … }
int seg6_lookup_nexthop(struct sk_buff *skb,
struct in6_addr *nhaddr, u32 tbl_id)
{ … }
static __u8 seg6_flv_lcblock_octects(const struct seg6_flavors_info *finfo)
{ … }
static __u8 seg6_flv_lcnode_func_octects(const struct seg6_flavors_info *finfo)
{ … }
static bool seg6_next_csid_is_arg_zero(const struct in6_addr *addr,
const struct seg6_flavors_info *finfo)
{ … }
static void seg6_next_csid_advance_arg(struct in6_addr *addr,
const struct seg6_flavors_info *finfo)
{ … }
static int input_action_end_finish(struct sk_buff *skb,
struct seg6_local_lwt *slwt)
{ … }
static int input_action_end_core(struct sk_buff *skb,
struct seg6_local_lwt *slwt)
{ … }
static int end_next_csid_core(struct sk_buff *skb, struct seg6_local_lwt *slwt)
{ … }
static int input_action_end_x_finish(struct sk_buff *skb,
struct seg6_local_lwt *slwt)
{ … }
static int input_action_end_x_core(struct sk_buff *skb,
struct seg6_local_lwt *slwt)
{ … }
static int end_x_next_csid_core(struct sk_buff *skb,
struct seg6_local_lwt *slwt)
{ … }
static bool seg6_next_csid_enabled(__u32 fops)
{ … }
static int seg6_flv_supp_ops_by_action(int action, __u32 *fops)
{ … }
enum seg6_local_pktinfo { … };
#define SEG6_LOCAL_PKTINFO_MAX …
static enum seg6_local_pktinfo seg6_get_srh_pktinfo(struct ipv6_sr_hdr *srh)
{ … }
enum seg6_local_flv_action { … };
#define SEG6_LOCAL_FLV_ACT_MAX …
#define flv8986_act_tbl_idx(pf, fm) …
#define FLV8986_ACT_TBL_SIZE …
#define tbl_cfg …
#define F_PSP …
static const u8 flv8986_act_tbl[FLV8986_ACT_TBL_SIZE] = …;
#undef F_PSP
#undef tbl_cfg
static enum seg6_local_flv_action
seg6_local_flv8986_act_lookup(enum seg6_local_pktinfo pinfo, __u32 flvmask)
{ … }
static bool seg6_pop_srh(struct sk_buff *skb, int srhoff)
{ … }
static int end_flv8986_core(struct sk_buff *skb, struct seg6_local_lwt *slwt)
{ … }
static int input_action_end(struct sk_buff *skb, struct seg6_local_lwt *slwt)
{ … }
static int input_action_end_x(struct sk_buff *skb, struct seg6_local_lwt *slwt)
{ … }
static int input_action_end_t(struct sk_buff *skb, struct seg6_local_lwt *slwt)
{ … }
static int input_action_end_dx2(struct sk_buff *skb,
struct seg6_local_lwt *slwt)
{ … }
static int input_action_end_dx6_finish(struct net *net, struct sock *sk,
struct sk_buff *skb)
{ … }
static int input_action_end_dx6(struct sk_buff *skb,
struct seg6_local_lwt *slwt)
{ … }
static int input_action_end_dx4_finish(struct net *net, struct sock *sk,
struct sk_buff *skb)
{ … }
static int input_action_end_dx4(struct sk_buff *skb,
struct seg6_local_lwt *slwt)
{ … }
#ifdef CONFIG_NET_L3_MASTER_DEV
static struct net *fib6_config_get_net(const struct fib6_config *fib6_cfg)
{ … }
static int __seg6_end_dt_vrf_build(struct seg6_local_lwt *slwt, const void *cfg,
u16 family, struct netlink_ext_ack *extack)
{ … }
static struct sk_buff *end_dt_vrf_rcv(struct sk_buff *skb, u16 family,
struct net_device *dev)
{ … }
static struct net_device *end_dt_get_vrf_rcu(struct sk_buff *skb,
struct seg6_end_dt_info *info)
{ … }
static struct sk_buff *end_dt_vrf_core(struct sk_buff *skb,
struct seg6_local_lwt *slwt, u16 family)
{ … }
static int input_action_end_dt4(struct sk_buff *skb,
struct seg6_local_lwt *slwt)
{ … }
static int seg6_end_dt4_build(struct seg6_local_lwt *slwt, const void *cfg,
struct netlink_ext_ack *extack)
{ … }
static enum
seg6_end_dt_mode seg6_end_dt6_parse_mode(struct seg6_local_lwt *slwt)
{ … }
static enum seg6_end_dt_mode seg6_end_dt6_get_mode(struct seg6_local_lwt *slwt)
{ … }
static int seg6_end_dt6_build(struct seg6_local_lwt *slwt, const void *cfg,
struct netlink_ext_ack *extack)
{ … }
#endif
static int input_action_end_dt6(struct sk_buff *skb,
struct seg6_local_lwt *slwt)
{ … }
#ifdef CONFIG_NET_L3_MASTER_DEV
static int seg6_end_dt46_build(struct seg6_local_lwt *slwt, const void *cfg,
struct netlink_ext_ack *extack)
{ … }
static int input_action_end_dt46(struct sk_buff *skb,
struct seg6_local_lwt *slwt)
{ … }
#endif
static int input_action_end_b6(struct sk_buff *skb, struct seg6_local_lwt *slwt)
{ … }
static int input_action_end_b6_encap(struct sk_buff *skb,
struct seg6_local_lwt *slwt)
{ … }
DEFINE_PER_CPU(struct seg6_bpf_srh_state, seg6_bpf_srh_states) = …;
bool seg6_bpf_has_valid_srh(struct sk_buff *skb)
{ … }
static int input_action_end_bpf(struct sk_buff *skb,
struct seg6_local_lwt *slwt)
{ … }
static struct seg6_action_desc seg6_action_table[] = …;
static struct seg6_action_desc *__get_action_desc(int action)
{ … }
static bool seg6_lwtunnel_counters_enabled(struct seg6_local_lwt *slwt)
{ … }
static void seg6_local_update_counters(struct seg6_local_lwt *slwt,
unsigned int len, int err)
{ … }
static int seg6_local_input_core(struct net *net, struct sock *sk,
struct sk_buff *skb)
{ … }
static int seg6_local_input(struct sk_buff *skb)
{ … }
static const struct nla_policy seg6_local_policy[SEG6_LOCAL_MAX + 1] = …;
static int parse_nla_srh(struct nlattr **attrs, struct seg6_local_lwt *slwt,
struct netlink_ext_ack *extack)
{ … }
static int put_nla_srh(struct sk_buff *skb, struct seg6_local_lwt *slwt)
{ … }
static int cmp_nla_srh(struct seg6_local_lwt *a, struct seg6_local_lwt *b)
{ … }
static void destroy_attr_srh(struct seg6_local_lwt *slwt)
{ … }
static int parse_nla_table(struct nlattr **attrs, struct seg6_local_lwt *slwt,
struct netlink_ext_ack *extack)
{ … }
static int put_nla_table(struct sk_buff *skb, struct seg6_local_lwt *slwt)
{ … }
static int cmp_nla_table(struct seg6_local_lwt *a, struct seg6_local_lwt *b)
{ … }
static struct
seg6_end_dt_info *seg6_possible_end_dt_info(struct seg6_local_lwt *slwt)
{ … }
static int parse_nla_vrftable(struct nlattr **attrs,
struct seg6_local_lwt *slwt,
struct netlink_ext_ack *extack)
{ … }
static int put_nla_vrftable(struct sk_buff *skb, struct seg6_local_lwt *slwt)
{ … }
static int cmp_nla_vrftable(struct seg6_local_lwt *a, struct seg6_local_lwt *b)
{ … }
static int parse_nla_nh4(struct nlattr **attrs, struct seg6_local_lwt *slwt,
struct netlink_ext_ack *extack)
{ … }
static int put_nla_nh4(struct sk_buff *skb, struct seg6_local_lwt *slwt)
{ … }
static int cmp_nla_nh4(struct seg6_local_lwt *a, struct seg6_local_lwt *b)
{ … }
static int parse_nla_nh6(struct nlattr **attrs, struct seg6_local_lwt *slwt,
struct netlink_ext_ack *extack)
{ … }
static int put_nla_nh6(struct sk_buff *skb, struct seg6_local_lwt *slwt)
{ … }
static int cmp_nla_nh6(struct seg6_local_lwt *a, struct seg6_local_lwt *b)
{ … }
static int parse_nla_iif(struct nlattr **attrs, struct seg6_local_lwt *slwt,
struct netlink_ext_ack *extack)
{ … }
static int put_nla_iif(struct sk_buff *skb, struct seg6_local_lwt *slwt)
{ … }
static int cmp_nla_iif(struct seg6_local_lwt *a, struct seg6_local_lwt *b)
{ … }
static int parse_nla_oif(struct nlattr **attrs, struct seg6_local_lwt *slwt,
struct netlink_ext_ack *extack)
{ … }
static int put_nla_oif(struct sk_buff *skb, struct seg6_local_lwt *slwt)
{ … }
static int cmp_nla_oif(struct seg6_local_lwt *a, struct seg6_local_lwt *b)
{ … }
#define MAX_PROG_NAME …
static const struct nla_policy bpf_prog_policy[SEG6_LOCAL_BPF_PROG_MAX + 1] = …;
static int parse_nla_bpf(struct nlattr **attrs, struct seg6_local_lwt *slwt,
struct netlink_ext_ack *extack)
{ … }
static int put_nla_bpf(struct sk_buff *skb, struct seg6_local_lwt *slwt)
{ … }
static int cmp_nla_bpf(struct seg6_local_lwt *a, struct seg6_local_lwt *b)
{ … }
static void destroy_attr_bpf(struct seg6_local_lwt *slwt)
{ … }
static const struct
nla_policy seg6_local_counters_policy[SEG6_LOCAL_CNT_MAX + 1] = …;
static int parse_nla_counters(struct nlattr **attrs,
struct seg6_local_lwt *slwt,
struct netlink_ext_ack *extack)
{ … }
static int seg6_local_fill_nla_counters(struct sk_buff *skb,
struct seg6_local_counters *counters)
{ … }
static int put_nla_counters(struct sk_buff *skb, struct seg6_local_lwt *slwt)
{ … }
static int cmp_nla_counters(struct seg6_local_lwt *a, struct seg6_local_lwt *b)
{ … }
static void destroy_attr_counters(struct seg6_local_lwt *slwt)
{ … }
static const
struct nla_policy seg6_local_flavors_policy[SEG6_LOCAL_FLV_MAX + 1] = …;
static int seg6_chk_next_csid_cfg(__u8 block_len, __u8 func_len)
{ … }
static int seg6_parse_nla_next_csid_cfg(struct nlattr **tb,
struct seg6_flavors_info *finfo,
struct netlink_ext_ack *extack)
{ … }
static int parse_nla_flavors(struct nlattr **attrs, struct seg6_local_lwt *slwt,
struct netlink_ext_ack *extack)
{ … }
static int seg6_fill_nla_next_csid_cfg(struct sk_buff *skb,
struct seg6_flavors_info *finfo)
{ … }
static int put_nla_flavors(struct sk_buff *skb, struct seg6_local_lwt *slwt)
{ … }
static int seg6_cmp_nla_next_csid_cfg(struct seg6_flavors_info *finfo_a,
struct seg6_flavors_info *finfo_b)
{ … }
static int cmp_nla_flavors(struct seg6_local_lwt *a, struct seg6_local_lwt *b)
{ … }
static int encap_size_flavors(struct seg6_local_lwt *slwt)
{ … }
struct seg6_action_param { … };
static struct seg6_action_param seg6_action_params[SEG6_LOCAL_MAX + 1] = …;
static void __destroy_attrs(unsigned long parsed_attrs, int max_parsed,
struct seg6_local_lwt *slwt)
{ … }
static void destroy_attrs(struct seg6_local_lwt *slwt)
{ … }
static int parse_nla_optional_attrs(struct nlattr **attrs,
struct seg6_local_lwt *slwt,
struct netlink_ext_ack *extack)
{ … }
static int
seg6_local_lwtunnel_build_state(struct seg6_local_lwt *slwt, const void *cfg,
struct netlink_ext_ack *extack)
{ … }
static void seg6_local_lwtunnel_destroy_state(struct seg6_local_lwt *slwt)
{ … }
static int parse_nla_action(struct nlattr **attrs, struct seg6_local_lwt *slwt,
struct netlink_ext_ack *extack)
{ … }
static int seg6_local_build_state(struct net *net, struct nlattr *nla,
unsigned int family, const void *cfg,
struct lwtunnel_state **ts,
struct netlink_ext_ack *extack)
{ … }
static void seg6_local_destroy_state(struct lwtunnel_state *lwt)
{ … }
static int seg6_local_fill_encap(struct sk_buff *skb,
struct lwtunnel_state *lwt)
{ … }
static int seg6_local_get_encap_size(struct lwtunnel_state *lwt)
{ … }
static int seg6_local_cmp_encap(struct lwtunnel_state *a,
struct lwtunnel_state *b)
{ … }
static const struct lwtunnel_encap_ops seg6_local_ops = …;
int __init seg6_local_init(void)
{ … }
void seg6_local_exit(void)
{ … }