162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * ipv6 in net namespaces
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <net/inet_frag.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef __NETNS_IPV6_H__
962306a36Sopenharmony_ci#define __NETNS_IPV6_H__
1062306a36Sopenharmony_ci#include <net/dst_ops.h>
1162306a36Sopenharmony_ci#include <uapi/linux/icmpv6.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_cistruct ctl_table_header;
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistruct netns_sysctl_ipv6 {
1662306a36Sopenharmony_ci#ifdef CONFIG_SYSCTL
1762306a36Sopenharmony_ci	struct ctl_table_header *hdr;
1862306a36Sopenharmony_ci	struct ctl_table_header *route_hdr;
1962306a36Sopenharmony_ci	struct ctl_table_header *icmp_hdr;
2062306a36Sopenharmony_ci	struct ctl_table_header *frags_hdr;
2162306a36Sopenharmony_ci	struct ctl_table_header *xfrm6_hdr;
2262306a36Sopenharmony_ci#endif
2362306a36Sopenharmony_ci	int flush_delay;
2462306a36Sopenharmony_ci	int ip6_rt_max_size;
2562306a36Sopenharmony_ci	int ip6_rt_gc_min_interval;
2662306a36Sopenharmony_ci	int ip6_rt_gc_timeout;
2762306a36Sopenharmony_ci	int ip6_rt_gc_interval;
2862306a36Sopenharmony_ci	int ip6_rt_gc_elasticity;
2962306a36Sopenharmony_ci	int ip6_rt_mtu_expires;
3062306a36Sopenharmony_ci	int ip6_rt_min_advmss;
3162306a36Sopenharmony_ci	u32 multipath_hash_fields;
3262306a36Sopenharmony_ci	u8 multipath_hash_policy;
3362306a36Sopenharmony_ci	u8 bindv6only;
3462306a36Sopenharmony_ci	u8 flowlabel_consistency;
3562306a36Sopenharmony_ci	u8 auto_flowlabels;
3662306a36Sopenharmony_ci	int icmpv6_time;
3762306a36Sopenharmony_ci	u8 icmpv6_echo_ignore_all;
3862306a36Sopenharmony_ci	u8 icmpv6_echo_ignore_multicast;
3962306a36Sopenharmony_ci	u8 icmpv6_echo_ignore_anycast;
4062306a36Sopenharmony_ci	DECLARE_BITMAP(icmpv6_ratemask, ICMPV6_MSG_MAX + 1);
4162306a36Sopenharmony_ci	unsigned long *icmpv6_ratemask_ptr;
4262306a36Sopenharmony_ci	u8 anycast_src_echo_reply;
4362306a36Sopenharmony_ci	u8 ip_nonlocal_bind;
4462306a36Sopenharmony_ci	u8 fwmark_reflect;
4562306a36Sopenharmony_ci	u8 flowlabel_state_ranges;
4662306a36Sopenharmony_ci	int idgen_retries;
4762306a36Sopenharmony_ci	int idgen_delay;
4862306a36Sopenharmony_ci	int flowlabel_reflect;
4962306a36Sopenharmony_ci	int max_dst_opts_cnt;
5062306a36Sopenharmony_ci	int max_hbh_opts_cnt;
5162306a36Sopenharmony_ci	int max_dst_opts_len;
5262306a36Sopenharmony_ci	int max_hbh_opts_len;
5362306a36Sopenharmony_ci	int seg6_flowlabel;
5462306a36Sopenharmony_ci	u32 ioam6_id;
5562306a36Sopenharmony_ci	u64 ioam6_id_wide;
5662306a36Sopenharmony_ci	u8 skip_notify_on_dev_down;
5762306a36Sopenharmony_ci	u8 fib_notify_on_flag_change;
5862306a36Sopenharmony_ci	u8 icmpv6_error_anycast_as_unicast;
5962306a36Sopenharmony_ci};
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_cistruct netns_ipv6 {
6262306a36Sopenharmony_ci	/* Keep ip6_dst_ops at the beginning of netns_sysctl_ipv6 */
6362306a36Sopenharmony_ci	struct dst_ops		ip6_dst_ops;
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci	struct netns_sysctl_ipv6 sysctl;
6662306a36Sopenharmony_ci	struct ipv6_devconf	*devconf_all;
6762306a36Sopenharmony_ci	struct ipv6_devconf	*devconf_dflt;
6862306a36Sopenharmony_ci	struct inet_peer_base	*peers;
6962306a36Sopenharmony_ci	struct fqdir		*fqdir;
7062306a36Sopenharmony_ci	struct fib6_info	*fib6_null_entry;
7162306a36Sopenharmony_ci	struct rt6_info		*ip6_null_entry;
7262306a36Sopenharmony_ci	struct rt6_statistics   *rt6_stats;
7362306a36Sopenharmony_ci	struct timer_list       ip6_fib_timer;
7462306a36Sopenharmony_ci	struct hlist_head       *fib_table_hash;
7562306a36Sopenharmony_ci	struct fib6_table       *fib6_main_tbl;
7662306a36Sopenharmony_ci	struct list_head	fib6_walkers;
7762306a36Sopenharmony_ci	rwlock_t		fib6_walker_lock;
7862306a36Sopenharmony_ci	spinlock_t		fib6_gc_lock;
7962306a36Sopenharmony_ci	atomic_t		ip6_rt_gc_expire;
8062306a36Sopenharmony_ci	unsigned long		ip6_rt_last_gc;
8162306a36Sopenharmony_ci	unsigned char		flowlabel_has_excl;
8262306a36Sopenharmony_ci#ifdef CONFIG_IPV6_MULTIPLE_TABLES
8362306a36Sopenharmony_ci	bool			fib6_has_custom_rules;
8462306a36Sopenharmony_ci	unsigned int		fib6_rules_require_fldissect;
8562306a36Sopenharmony_ci#ifdef CONFIG_IPV6_SUBTREES
8662306a36Sopenharmony_ci	unsigned int		fib6_routes_require_src;
8762306a36Sopenharmony_ci#endif
8862306a36Sopenharmony_ci	struct rt6_info         *ip6_prohibit_entry;
8962306a36Sopenharmony_ci	struct rt6_info         *ip6_blk_hole_entry;
9062306a36Sopenharmony_ci	struct fib6_table       *fib6_local_tbl;
9162306a36Sopenharmony_ci	struct fib_rules_ops    *fib6_rules_ops;
9262306a36Sopenharmony_ci#endif
9362306a36Sopenharmony_ci	struct sock             *ndisc_sk;
9462306a36Sopenharmony_ci	struct sock             *tcp_sk;
9562306a36Sopenharmony_ci	struct sock             *igmp_sk;
9662306a36Sopenharmony_ci	struct sock		*mc_autojoin_sk;
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci	struct hlist_head	*inet6_addr_lst;
9962306a36Sopenharmony_ci	spinlock_t		addrconf_hash_lock;
10062306a36Sopenharmony_ci	struct delayed_work	addr_chk_work;
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci#ifdef CONFIG_IPV6_MROUTE
10362306a36Sopenharmony_ci#ifndef CONFIG_IPV6_MROUTE_MULTIPLE_TABLES
10462306a36Sopenharmony_ci	struct mr_table		*mrt6;
10562306a36Sopenharmony_ci#else
10662306a36Sopenharmony_ci	struct list_head	mr6_tables;
10762306a36Sopenharmony_ci	struct fib_rules_ops	*mr6_rules_ops;
10862306a36Sopenharmony_ci#endif
10962306a36Sopenharmony_ci#endif
11062306a36Sopenharmony_ci	atomic_t		dev_addr_genid;
11162306a36Sopenharmony_ci	atomic_t		fib6_sernum;
11262306a36Sopenharmony_ci	struct seg6_pernet_data *seg6_data;
11362306a36Sopenharmony_ci	struct fib_notifier_ops	*notifier_ops;
11462306a36Sopenharmony_ci	struct fib_notifier_ops	*ip6mr_notifier_ops;
11562306a36Sopenharmony_ci	unsigned int ipmr_seq; /* protected by rtnl_mutex */
11662306a36Sopenharmony_ci	struct {
11762306a36Sopenharmony_ci		struct hlist_head head;
11862306a36Sopenharmony_ci		spinlock_t	lock;
11962306a36Sopenharmony_ci		u32		seq;
12062306a36Sopenharmony_ci	} ip6addrlbl_table;
12162306a36Sopenharmony_ci	struct ioam6_pernet_data *ioam6_data;
12262306a36Sopenharmony_ci};
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_NF_DEFRAG_IPV6)
12562306a36Sopenharmony_cistruct netns_nf_frag {
12662306a36Sopenharmony_ci	struct fqdir	*fqdir;
12762306a36Sopenharmony_ci};
12862306a36Sopenharmony_ci#endif
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ci#endif
131