1/*-
2 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the project nor the names of its contributors
14 *    may be used to endorse or promote products derived from this software
15 *    without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 *	$KAME: in6_proto.c,v 1.91 2001/05/27 13:28:35 itojun Exp $
30 */
31
32/*-
33 * Copyright (c) 1982, 1986, 1993
34 *	The Regents of the University of California.  All rights reserved.
35 *
36 * Redistribution and use in source and binary forms, with or without
37 * modification, are permitted provided that the following conditions
38 * are met:
39 * 1. Redistributions of source code must retain the above copyright
40 *    notice, this list of conditions and the following disclaimer.
41 * 2. Redistributions in binary form must reproduce the above copyright
42 *    notice, this list of conditions and the following disclaimer in the
43 *    documentation and/or other materials provided with the distribution.
44 * 4. Neither the name of the University nor the names of its contributors
45 *    may be used to endorse or promote products derived from this software
46 *    without specific prior written permission.
47 *
48 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
49 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
50 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
51 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
52 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
53 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
54 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
55 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
56 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
57 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
58 * SUCH DAMAGE.
59 *
60 *	@(#)in_proto.c	8.1 (Berkeley) 6/10/93
61 */
62
63#include <sys/cdefs.h>
64__FBSDID("$FreeBSD: stable/11/sys/netinet6/in6_proto.c 364161 2020-08-12 12:07:15Z ae $");
65
66#include "opt_inet.h"
67#include "opt_inet6.h"
68#include "opt_ipsec.h"
69#include "opt_ipstealth.h"
70#include "opt_sctp.h"
71#include "opt_mpath.h"
72#include "opt_route.h"
73
74#include <sys/param.h>
75#include <sys/socket.h>
76#include <sys/socketvar.h>
77#include <sys/proc.h>
78#include <sys/protosw.h>
79#include <sys/jail.h>
80#include <sys/kernel.h>
81#include <sys/malloc.h>
82#include <sys/domain.h>
83#include <sys/mbuf.h>
84#include <sys/systm.h>
85#include <sys/sysctl.h>
86
87#include <net/if.h>
88#include <net/if_var.h>
89#include <net/radix.h>
90#include <net/route.h>
91#ifdef RADIX_MPATH
92#include <net/radix_mpath.h>
93#endif
94
95#include <netinet/in.h>
96#include <netinet/in_systm.h>
97#include <netinet/in_var.h>
98#include <netinet/ip_encap.h>
99#include <netinet/ip.h>
100#include <netinet/ip_var.h>
101#include <netinet/ip6.h>
102#include <netinet6/ip6_var.h>
103#include <netinet/icmp6.h>
104
105#include <netinet/tcp.h>
106#include <netinet/tcp_timer.h>
107#include <netinet/tcp_var.h>
108#include <netinet/udp.h>
109#include <netinet/udp_var.h>
110#include <netinet6/tcp6_var.h>
111#include <netinet6/raw_ip6.h>
112#include <netinet6/udp6_var.h>
113#include <netinet6/pim6_var.h>
114#include <netinet6/nd6.h>
115
116#ifdef SCTP
117#include <netinet/in_pcb.h>
118#include <netinet/sctp_pcb.h>
119#include <netinet/sctp.h>
120#include <netinet/sctp_var.h>
121#include <netinet6/sctp6_var.h>
122#endif /* SCTP */
123
124#include <netinet6/ip6protosw.h>
125
126/*
127 * TCP/IP protocol family: IP6, ICMP6, UDP, TCP.
128 */
129FEATURE(inet6, "Internet Protocol version 6");
130
131extern	struct domain inet6domain;
132static	struct pr_usrreqs nousrreqs;
133
134#define PR_LISTEN	0
135#define PR_ABRTACPTDIS	0
136
137/* Spacer for loadable protocols. */
138#define IP6PROTOSPACER   			\
139{						\
140	.pr_domain =		&inet6domain,	\
141	.pr_protocol =		PROTO_SPACER,	\
142	.pr_usrreqs =		&nousrreqs	\
143}
144
145struct protosw inet6sw[] = {
146{
147	.pr_type =		0,
148	.pr_domain =		&inet6domain,
149	.pr_protocol =		IPPROTO_IPV6,
150	.pr_init =		ip6_init,
151	.pr_slowtimo =		frag6_slowtimo,
152	.pr_drain =		frag6_drain,
153	.pr_usrreqs =		&nousrreqs,
154},
155{
156	.pr_type =		SOCK_DGRAM,
157	.pr_domain =		&inet6domain,
158	.pr_protocol =		IPPROTO_UDP,
159	.pr_flags =		PR_ATOMIC|PR_ADDR,
160	.pr_input =		udp6_input,
161	.pr_ctlinput =		udp6_ctlinput,
162	.pr_ctloutput =		ip6_ctloutput,
163#ifndef INET	/* Do not call initialization twice. */
164	.pr_init =		udp_init,
165#endif
166	.pr_usrreqs =		&udp6_usrreqs,
167},
168{
169	.pr_type =		SOCK_STREAM,
170	.pr_domain =		&inet6domain,
171	.pr_protocol =		IPPROTO_TCP,
172	.pr_flags =		PR_CONNREQUIRED|PR_WANTRCVD|PR_LISTEN,
173	.pr_input =		tcp6_input,
174	.pr_ctlinput =		tcp6_ctlinput,
175	.pr_ctloutput =		tcp_ctloutput,
176#ifndef INET	/* don't call initialization and timeout routines twice */
177	.pr_init =		tcp_init,
178	.pr_slowtimo =		tcp_slowtimo,
179#endif
180	.pr_drain =		tcp_drain,
181	.pr_usrreqs =		&tcp6_usrreqs,
182},
183#ifdef SCTP
184{
185	.pr_type =		SOCK_SEQPACKET,
186	.pr_domain =		&inet6domain,
187	.pr_protocol =		IPPROTO_SCTP,
188	.pr_flags =		PR_WANTRCVD|PR_LASTHDR,
189	.pr_input =		sctp6_input,
190	.pr_ctlinput =		sctp6_ctlinput,
191	.pr_ctloutput =	sctp_ctloutput,
192	.pr_drain =		sctp_drain,
193#ifndef INET	/* Do not call initialization twice. */
194	.pr_init =		sctp_init,
195#endif
196	.pr_usrreqs =		&sctp6_usrreqs
197},
198{
199	.pr_type =		SOCK_STREAM,
200	.pr_domain =		&inet6domain,
201	.pr_protocol =		IPPROTO_SCTP,
202	.pr_flags =		PR_CONNREQUIRED|PR_WANTRCVD|PR_LASTHDR,
203	.pr_input =		sctp6_input,
204	.pr_ctlinput =		sctp6_ctlinput,
205	.pr_ctloutput =		sctp_ctloutput,
206	.pr_drain =		sctp_drain,
207	.pr_usrreqs =		&sctp6_usrreqs
208},
209#endif /* SCTP */
210{
211	.pr_type =		SOCK_DGRAM,
212	.pr_domain =		&inet6domain,
213	.pr_protocol =		IPPROTO_UDPLITE,
214	.pr_flags =		PR_ATOMIC|PR_ADDR,
215	.pr_input =		udp6_input,
216	.pr_ctlinput =		udplite6_ctlinput,
217	.pr_ctloutput =		udp_ctloutput,
218#ifndef INET	/* Do not call initialization twice. */
219	.pr_init =		udplite_init,
220#endif
221	.pr_usrreqs =		&udp6_usrreqs,
222},
223{
224	.pr_type =		SOCK_RAW,
225	.pr_domain =		&inet6domain,
226	.pr_protocol =		IPPROTO_RAW,
227	.pr_flags =		PR_ATOMIC|PR_ADDR,
228	.pr_input =		rip6_input,
229	.pr_output =		rip6_output,
230	.pr_ctlinput =		rip6_ctlinput,
231	.pr_ctloutput =		rip6_ctloutput,
232#ifndef INET	/* Do not call initialization twice. */
233	.pr_init =		rip_init,
234#endif
235	.pr_usrreqs =		&rip6_usrreqs
236},
237{
238	.pr_type =		SOCK_RAW,
239	.pr_domain =		&inet6domain,
240	.pr_protocol =		IPPROTO_ICMPV6,
241	.pr_flags =		PR_ATOMIC|PR_ADDR|PR_LASTHDR,
242	.pr_input =		icmp6_input,
243	.pr_output =		rip6_output,
244	.pr_ctlinput =		rip6_ctlinput,
245	.pr_ctloutput =		rip6_ctloutput,
246	.pr_fasttimo =		icmp6_fasttimo,
247	.pr_slowtimo =		icmp6_slowtimo,
248	.pr_usrreqs =		&rip6_usrreqs
249},
250{
251	.pr_type =		SOCK_RAW,
252	.pr_domain =		&inet6domain,
253	.pr_protocol =		IPPROTO_DSTOPTS,
254	.pr_flags =		PR_ATOMIC|PR_ADDR,
255	.pr_input =		dest6_input,
256	.pr_usrreqs =		&nousrreqs
257},
258{
259	.pr_type =		SOCK_RAW,
260	.pr_domain =		&inet6domain,
261	.pr_protocol =		IPPROTO_ROUTING,
262	.pr_flags =		PR_ATOMIC|PR_ADDR,
263	.pr_input =		route6_input,
264	.pr_usrreqs =		&nousrreqs
265},
266{
267	.pr_type =		SOCK_RAW,
268	.pr_domain =		&inet6domain,
269	.pr_protocol =		IPPROTO_FRAGMENT,
270	.pr_flags =		PR_ATOMIC|PR_ADDR,
271	.pr_input =		frag6_input,
272	.pr_usrreqs =		&nousrreqs
273},
274#ifdef INET
275{
276	.pr_type =		SOCK_RAW,
277	.pr_domain =		&inet6domain,
278	.pr_protocol =		IPPROTO_IPV4,
279	.pr_flags =		PR_ATOMIC|PR_ADDR|PR_LASTHDR,
280	.pr_input =		encap6_input,
281	.pr_output =		rip6_output,
282	.pr_ctloutput =		rip6_ctloutput,
283	.pr_usrreqs =		&rip6_usrreqs
284},
285#endif /* INET */
286{
287	.pr_type =		SOCK_RAW,
288	.pr_domain =		&inet6domain,
289	.pr_protocol =		IPPROTO_IPV6,
290	.pr_flags =		PR_ATOMIC|PR_ADDR|PR_LASTHDR,
291	.pr_input =		encap6_input,
292	.pr_output =		rip6_output,
293	.pr_ctloutput =		rip6_ctloutput,
294	.pr_usrreqs =		&rip6_usrreqs
295},
296{
297	.pr_type =		SOCK_RAW,
298	.pr_domain =		&inet6domain,
299	.pr_protocol =		IPPROTO_GRE,
300	.pr_flags =		PR_ATOMIC|PR_ADDR|PR_LASTHDR,
301	.pr_input =		encap6_input,
302	.pr_output =		rip6_output,
303	.pr_ctloutput =		rip6_ctloutput,
304	.pr_usrreqs =		&rip6_usrreqs
305},
306{
307	.pr_type =		SOCK_RAW,
308	.pr_domain =		&inet6domain,
309	.pr_protocol =		IPPROTO_PIM,
310	.pr_flags =		PR_ATOMIC|PR_ADDR|PR_LASTHDR,
311	.pr_input =		encap6_input,
312	.pr_output =		rip6_output,
313	.pr_ctloutput =		rip6_ctloutput,
314	.pr_usrreqs =		&rip6_usrreqs
315},
316/* Spacer n-times for loadable protocols. */
317IP6PROTOSPACER,
318IP6PROTOSPACER,
319IP6PROTOSPACER,
320IP6PROTOSPACER,
321IP6PROTOSPACER,
322IP6PROTOSPACER,
323IP6PROTOSPACER,
324IP6PROTOSPACER,
325/* raw wildcard */
326{
327	.pr_type =		SOCK_RAW,
328	.pr_domain =		&inet6domain,
329	.pr_flags =		PR_ATOMIC|PR_ADDR,
330	.pr_input =		rip6_input,
331	.pr_output =		rip6_output,
332	.pr_ctloutput =		rip6_ctloutput,
333	.pr_usrreqs =		&rip6_usrreqs
334},
335};
336
337extern int in6_inithead(void **, int);
338#ifdef VIMAGE
339extern int in6_detachhead(void **, int);
340#endif
341
342struct domain inet6domain = {
343	.dom_family =		AF_INET6,
344	.dom_name =		"internet6",
345	.dom_protosw =		(struct protosw *)inet6sw,
346	.dom_protoswNPROTOSW =	(struct protosw *)&inet6sw[nitems(inet6sw)],
347#ifdef RADIX_MPATH
348	.dom_rtattach =		rn6_mpath_inithead,
349#else
350	.dom_rtattach =		in6_inithead,
351#endif
352#ifdef VIMAGE
353	.dom_rtdetach =		in6_detachhead,
354#endif
355	.dom_ifattach =		in6_domifattach,
356	.dom_ifdetach =		in6_domifdetach,
357	.dom_ifmtu    =		in6_domifmtu
358};
359
360VNET_DOMAIN_SET(inet6);
361
362/*
363 * Internet configuration info
364 */
365#ifndef	IPV6FORWARDING
366#ifdef GATEWAY6
367#define	IPV6FORWARDING	1	/* forward IP6 packets not for us */
368#else
369#define	IPV6FORWARDING	0	/* don't forward IP6 packets not for us */
370#endif /* GATEWAY6 */
371#endif /* !IPV6FORWARDING */
372
373#ifndef	IPV6_SENDREDIRECTS
374#define	IPV6_SENDREDIRECTS	1
375#endif
376
377VNET_DEFINE(int, ip6_forwarding) = IPV6FORWARDING;	/* act as router? */
378VNET_DEFINE(int, ip6_sendredirects) = IPV6_SENDREDIRECTS;
379VNET_DEFINE(int, ip6_defhlim) = IPV6_DEFHLIM;
380VNET_DEFINE(int, ip6_defmcasthlim) = IPV6_DEFAULT_MULTICAST_HOPS;
381VNET_DEFINE(int, ip6_accept_rtadv) = 0;
382VNET_DEFINE(int, ip6_no_radr) = 0;
383VNET_DEFINE(int, ip6_norbit_raif) = 0;
384VNET_DEFINE(int, ip6_rfc6204w3) = 0;
385VNET_DEFINE(int, ip6_maxfragpackets);	/* initialized in frag6.c:frag6_init() */
386int ip6_maxfrags;		/* initialized in frag6.c:frag6_init() */
387VNET_DEFINE(int, ip6_maxfragbucketsize);/* initialized in frag6.c:frag6_init() */
388VNET_DEFINE(int, ip6_maxfragsperpacket); /* initialized in frag6.c:frag6_init() */
389VNET_DEFINE(int, ip6_log_interval) = 5;
390VNET_DEFINE(int, ip6_hdrnestlimit) = 15;/* How many header options will we
391					 * process? */
392VNET_DEFINE(int, ip6_dad_count) = 1;	/* DupAddrDetectionTransmits */
393VNET_DEFINE(int, ip6_auto_flowlabel) = 1;
394VNET_DEFINE(int, ip6_use_deprecated) = 1;/* allow deprecated addr
395					 * (RFC2462 5.5.4) */
396VNET_DEFINE(int, ip6_rr_prune) = 5;	/* router renumbering prefix
397					 * walk list every 5 sec. */
398VNET_DEFINE(int, ip6_mcast_pmtu) = 0;	/* enable pMTU discovery for multicast? */
399VNET_DEFINE(int, ip6_v6only) = 1;
400
401VNET_DEFINE(time_t, ip6_log_time) = (time_t)0L;
402#ifdef IPSTEALTH
403VNET_DEFINE(int, ip6stealth) = 0;
404#endif
405VNET_DEFINE(int, nd6_onlink_ns_rfc4861) = 0;/* allow 'on-link' nd6 NS
406					     * (RFC 4861) */
407
408/* icmp6 */
409/*
410 * BSDI4 defines these variables in in_proto.c...
411 * XXX: what if we don't define INET? Should we define pmtu6_expire
412 * or so? (jinmei@kame.net 19990310)
413 */
414VNET_DEFINE(int, pmtu_expire) = 60*10;
415VNET_DEFINE(int, pmtu_probe) = 60*2;
416
417/* ICMPV6 parameters */
418VNET_DEFINE(int, icmp6_rediraccept) = 1;/* accept and process redirects */
419VNET_DEFINE(int, icmp6_redirtimeout) = 10 * 60;	/* 10 minutes */
420VNET_DEFINE(int, icmp6errppslim) = 100;		/* 100pps */
421/* control how to respond to NI queries */
422VNET_DEFINE(int, icmp6_nodeinfo) =
423    (ICMP6_NODEINFO_FQDNOK|ICMP6_NODEINFO_NODEADDROK);
424VNET_DEFINE(int, icmp6_nodeinfo_oldmcprefix) = 1;
425
426/*
427 * sysctl related items.
428 */
429SYSCTL_NODE(_net,	PF_INET6,	inet6,	CTLFLAG_RW,	0,
430	"Internet6 Family");
431
432/* net.inet6 */
433SYSCTL_NODE(_net_inet6,	IPPROTO_IPV6,	ip6,	CTLFLAG_RW, 0,	"IP6");
434SYSCTL_NODE(_net_inet6,	IPPROTO_ICMPV6,	icmp6,	CTLFLAG_RW, 0,	"ICMP6");
435SYSCTL_NODE(_net_inet6,	IPPROTO_UDP,	udp6,	CTLFLAG_RW, 0,	"UDP6");
436SYSCTL_NODE(_net_inet6,	IPPROTO_TCP,	tcp6,	CTLFLAG_RW, 0,	"TCP6");
437#ifdef SCTP
438SYSCTL_NODE(_net_inet6,	IPPROTO_SCTP,	sctp6,	CTLFLAG_RW, 0,	"SCTP6");
439#endif
440#if defined(IPSEC) || defined(IPSEC_SUPPORT)
441SYSCTL_NODE(_net_inet6,	IPPROTO_ESP,	ipsec6,	CTLFLAG_RW, 0,	"IPSEC6");
442#endif /* IPSEC */
443
444/* net.inet6.ip6 */
445static int
446sysctl_ip6_temppltime(SYSCTL_HANDLER_ARGS)
447{
448	int error, val;
449
450	val = V_ip6_temp_preferred_lifetime;
451	error = sysctl_handle_int(oidp, &val, 0, req);
452	if (error != 0 || !req->newptr)
453		return (error);
454	if (val < V_ip6_desync_factor + V_ip6_temp_regen_advance)
455		return (EINVAL);
456	V_ip6_temp_preferred_lifetime = val;
457	return (0);
458}
459
460static int
461sysctl_ip6_tempvltime(SYSCTL_HANDLER_ARGS)
462{
463	int error, val;
464
465	val = V_ip6_temp_valid_lifetime;
466	error = sysctl_handle_int(oidp, &val, 0, req);
467	if (error != 0 || !req->newptr)
468		return (error);
469	if (val < V_ip6_temp_preferred_lifetime)
470		return (EINVAL);
471	V_ip6_temp_valid_lifetime = val;
472	return (0);
473}
474
475static int
476sysctl_ip6_maxfragpackets(SYSCTL_HANDLER_ARGS)
477{
478	int error, val;
479
480	val = V_ip6_maxfragpackets;
481	error = sysctl_handle_int(oidp, &val, 0, req);
482	if (error != 0 || !req->newptr)
483		return (error);
484	V_ip6_maxfragpackets = val;
485	frag6_set_bucketsize();
486	return (0);
487}
488
489SYSCTL_INT(_net_inet6_ip6, IPV6CTL_FORWARDING, forwarding,
490	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_forwarding), 0,
491	"Enable forwarding of IPv6 packets between interfaces");
492SYSCTL_INT(_net_inet6_ip6, IPV6CTL_SENDREDIRECTS, redirect,
493	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_sendredirects), 0,
494	"Send ICMPv6 redirects for unforwardable IPv6 packets");
495SYSCTL_INT(_net_inet6_ip6, IPV6CTL_DEFHLIM, hlim,
496	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_defhlim), 0,
497	"Default hop limit to use for outgoing IPv6 packets");
498SYSCTL_VNET_PCPUSTAT(_net_inet6_ip6, IPV6CTL_STATS, stats, struct ip6stat,
499	ip6stat,
500	"IP6 statistics (struct ip6stat, netinet6/ip6_var.h)");
501SYSCTL_PROC(_net_inet6_ip6, IPV6CTL_MAXFRAGPACKETS, maxfragpackets,
502	CTLFLAG_VNET | CTLTYPE_INT | CTLFLAG_RW, NULL, 0,
503	sysctl_ip6_maxfragpackets, "I",
504	"Default maximum number of outstanding fragmented IPv6 packets. "
505	"A value of 0 means no fragmented packets will be accepted, while a "
506	"a value of -1 means no limit");
507SYSCTL_INT(_net_inet6_ip6, IPV6CTL_ACCEPT_RTADV, accept_rtadv,
508	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_accept_rtadv), 0,
509	"Default value of per-interface flag for accepting ICMPv6 RA messages");
510SYSCTL_INT(_net_inet6_ip6, IPV6CTL_NO_RADR, no_radr,
511	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_no_radr), 0,
512	"Default value of per-interface flag to control whether routers "
513	"sending ICMPv6 RA messages on that interface are added into the "
514	"default router list");
515SYSCTL_INT(_net_inet6_ip6, IPV6CTL_NORBIT_RAIF, norbit_raif,
516	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_norbit_raif), 0,
517	"Always set clear the R flag in ICMPv6 NA messages when accepting RA "
518	"on the interface");
519SYSCTL_INT(_net_inet6_ip6, IPV6CTL_RFC6204W3, rfc6204w3,
520	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_rfc6204w3), 0,
521	"Accept the default router list from ICMPv6 RA messages even "
522	"when packet forwarding is enabled");
523SYSCTL_INT(_net_inet6_ip6, IPV6CTL_LOG_INTERVAL, log_interval,
524	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_log_interval), 0,
525	"Frequency in seconds at which to log IPv6 forwarding errors");
526SYSCTL_INT(_net_inet6_ip6, IPV6CTL_HDRNESTLIMIT, hdrnestlimit,
527	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_hdrnestlimit), 0,
528	"Default maximum number of IPv6 extension headers permitted on "
529	"incoming IPv6 packets, 0 for no artificial limit");
530SYSCTL_INT(_net_inet6_ip6, IPV6CTL_DAD_COUNT, dad_count,
531	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_dad_count), 0,
532	"Number of ICMPv6 NS messages sent during duplicate address detection");
533SYSCTL_INT(_net_inet6_ip6, IPV6CTL_AUTO_FLOWLABEL, auto_flowlabel,
534	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_auto_flowlabel), 0,
535	"Provide an IPv6 flowlabel in outbound packets");
536SYSCTL_INT(_net_inet6_ip6, IPV6CTL_DEFMCASTHLIM, defmcasthlim,
537	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_defmcasthlim), 0,
538	"Default hop limit for IPv6 multicast packets originating from this "
539	"node");
540SYSCTL_STRING(_net_inet6_ip6, IPV6CTL_KAME_VERSION, kame_version,
541	CTLFLAG_RD, __KAME_VERSION, 0,
542	"KAME version string");
543SYSCTL_INT(_net_inet6_ip6, IPV6CTL_USE_DEPRECATED, use_deprecated,
544	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_use_deprecated), 0,
545	"Allow the use of addresses whose preferred lifetimes have expired");
546SYSCTL_INT(_net_inet6_ip6, IPV6CTL_RR_PRUNE, rr_prune,
547	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_rr_prune), 0,
548	""); /* XXX unused */
549SYSCTL_INT(_net_inet6_ip6, IPV6CTL_USETEMPADDR, use_tempaddr,
550	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_use_tempaddr), 0,
551	"Create RFC3041 temporary addresses for autoconfigured addresses");
552SYSCTL_PROC(_net_inet6_ip6, IPV6CTL_TEMPPLTIME, temppltime,
553	CTLFLAG_VNET | CTLTYPE_INT | CTLFLAG_RW,
554	NULL, 0, sysctl_ip6_temppltime, "I",
555	"Maximum preferred lifetime for temporary addresses");
556SYSCTL_PROC(_net_inet6_ip6, IPV6CTL_TEMPVLTIME, tempvltime,
557	CTLFLAG_VNET | CTLTYPE_INT | CTLFLAG_RW,
558	NULL, 0, sysctl_ip6_tempvltime, "I",
559	"Maximum valid lifetime for temporary addresses");
560SYSCTL_INT(_net_inet6_ip6, IPV6CTL_V6ONLY, v6only,
561	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_v6only), 0,
562	"Restrict AF_INET6 sockets to IPv6 addresses only");
563SYSCTL_INT(_net_inet6_ip6, IPV6CTL_AUTO_LINKLOCAL, auto_linklocal,
564	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_auto_linklocal), 0,
565	"Default value of per-interface flag for automatically adding an IPv6 "
566	"link-local address to interfaces when attached");
567SYSCTL_VNET_PCPUSTAT(_net_inet6_ip6, IPV6CTL_RIP6STATS, rip6stats,
568	struct rip6stat, rip6stat,
569	"Raw IP6 statistics (struct rip6stat, netinet6/raw_ip6.h)");
570SYSCTL_INT(_net_inet6_ip6, IPV6CTL_PREFER_TEMPADDR, prefer_tempaddr,
571	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_prefer_tempaddr), 0,
572	"Prefer RFC3041 temporary addresses in source address selection");
573SYSCTL_INT(_net_inet6_ip6, IPV6CTL_USE_DEFAULTZONE, use_defaultzone,
574	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_use_defzone), 0,
575	"Use the default scope zone when none is specified");
576SYSCTL_INT(_net_inet6_ip6, IPV6CTL_MAXFRAGS, maxfrags,
577	CTLFLAG_RW, &ip6_maxfrags, 0,
578	"Maximum allowed number of outstanding IPv6 packet fragments. "
579	"A value of 0 means no fragmented packets will be accepted, while a "
580	"a value of -1 means no limit");
581SYSCTL_INT(_net_inet6_ip6, IPV6CTL_MAXFRAGBUCKETSIZE, maxfragbucketsize,
582	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_maxfragbucketsize), 0,
583	"Maximum number of reassembly queues per hash bucket");
584SYSCTL_INT(_net_inet6_ip6, IPV6CTL_MAXFRAGSPERPACKET, maxfragsperpacket,
585	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_maxfragsperpacket), 0,
586	"Maximum allowed number of fragments per packet");
587SYSCTL_INT(_net_inet6_ip6, IPV6CTL_MCAST_PMTU, mcast_pmtu,
588	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_mcast_pmtu), 0,
589	"Enable path MTU discovery for multicast packets");
590#ifdef IPSTEALTH
591SYSCTL_INT(_net_inet6_ip6, IPV6CTL_STEALTH, stealth, CTLFLAG_VNET | CTLFLAG_RW,
592	&VNET_NAME(ip6stealth), 0,
593	"Forward IPv6 packets without decrementing their TTL");
594#endif
595
596/* net.inet6.icmp6 */
597SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_REDIRACCEPT, rediraccept,
598	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(icmp6_rediraccept), 0,
599	"Accept ICMPv6 redirect messages");
600SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_REDIRTIMEOUT, redirtimeout,
601	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(icmp6_redirtimeout), 0,
602	""); /* XXX unused */
603SYSCTL_VNET_PCPUSTAT(_net_inet6_icmp6, ICMPV6CTL_STATS, stats,
604	struct icmp6stat, icmp6stat,
605	"ICMPv6 statistics (struct icmp6stat, netinet/icmp6.h)");
606SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_ND6_PRUNE, nd6_prune,
607	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(nd6_prune), 0,
608	"Frequency in seconds of checks for expired prefixes and routers");
609SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_ND6_DELAY, nd6_delay,
610	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(nd6_delay), 0,
611	"Delay in seconds before probing for reachability");
612SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_ND6_UMAXTRIES, nd6_umaxtries,
613	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(nd6_umaxtries), 0,
614	"Number of ICMPv6 NS messages sent during reachability detection");
615SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_ND6_MMAXTRIES, nd6_mmaxtries,
616	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(nd6_mmaxtries), 0,
617	"Number of ICMPv6 NS messages sent during address resolution");
618SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_ND6_USELOOPBACK, nd6_useloopback,
619	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(nd6_useloopback), 0,
620	"Create a loopback route when configuring an IPv6 address");
621SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_NODEINFO, nodeinfo,
622	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(icmp6_nodeinfo), 0,
623	"Mask of enabled RFC4620 node information query types");
624SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_NODEINFO_OLDMCPREFIX,
625	nodeinfo_oldmcprefix, CTLFLAG_VNET | CTLFLAG_RW,
626	&VNET_NAME(icmp6_nodeinfo_oldmcprefix), 0,
627	"Join old IPv6 NI group address in draft-ietf-ipngwg-icmp-name-lookup "
628	"for compatibility with KAME implementation");
629SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_ERRPPSLIMIT, errppslimit,
630	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(icmp6errppslim), 0,
631	"Maximum number of ICMPv6 error messages per second");
632SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_ND6_MAXNUDHINT, nd6_maxnudhint,
633	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(nd6_maxnudhint), 0,
634	""); /* XXX unused */
635SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_ND6_DEBUG, nd6_debug,
636	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(nd6_debug), 0,
637	"Log NDP debug messages");
638SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_ND6_ONLINKNSRFC4861,
639	nd6_onlink_ns_rfc4861, CTLFLAG_VNET | CTLFLAG_RW,
640	&VNET_NAME(nd6_onlink_ns_rfc4861), 0,
641	"Accept 'on-link' ICMPv6 NS messages in compliance with RFC 4861");
642