in6_proto.c revision 331722
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 331722 2018-03-29 02:50:57Z eadler $");
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_init =		encap_init,
284	.pr_usrreqs =		&rip6_usrreqs
285},
286#endif /* INET */
287{
288	.pr_type =		SOCK_RAW,
289	.pr_domain =		&inet6domain,
290	.pr_protocol =		IPPROTO_IPV6,
291	.pr_flags =		PR_ATOMIC|PR_ADDR|PR_LASTHDR,
292	.pr_input =		encap6_input,
293	.pr_output =		rip6_output,
294	.pr_ctloutput =		rip6_ctloutput,
295	.pr_init =		encap_init,
296	.pr_usrreqs =		&rip6_usrreqs
297},
298{
299	.pr_type =		SOCK_RAW,
300	.pr_domain =		&inet6domain,
301	.pr_protocol =		IPPROTO_GRE,
302	.pr_flags =		PR_ATOMIC|PR_ADDR|PR_LASTHDR,
303	.pr_input =		encap6_input,
304	.pr_output =		rip6_output,
305	.pr_ctloutput =		rip6_ctloutput,
306	.pr_init =		encap_init,
307	.pr_usrreqs =		&rip6_usrreqs
308},
309{
310	.pr_type =		SOCK_RAW,
311	.pr_domain =		&inet6domain,
312	.pr_protocol =		IPPROTO_PIM,
313	.pr_flags =		PR_ATOMIC|PR_ADDR|PR_LASTHDR,
314	.pr_input =		encap6_input,
315	.pr_output =		rip6_output,
316	.pr_ctloutput =		rip6_ctloutput,
317	.pr_usrreqs =		&rip6_usrreqs
318},
319/* Spacer n-times for loadable protocols. */
320IP6PROTOSPACER,
321IP6PROTOSPACER,
322IP6PROTOSPACER,
323IP6PROTOSPACER,
324IP6PROTOSPACER,
325IP6PROTOSPACER,
326IP6PROTOSPACER,
327IP6PROTOSPACER,
328/* raw wildcard */
329{
330	.pr_type =		SOCK_RAW,
331	.pr_domain =		&inet6domain,
332	.pr_flags =		PR_ATOMIC|PR_ADDR,
333	.pr_input =		rip6_input,
334	.pr_output =		rip6_output,
335	.pr_ctloutput =		rip6_ctloutput,
336	.pr_usrreqs =		&rip6_usrreqs
337},
338};
339
340extern int in6_inithead(void **, int);
341#ifdef VIMAGE
342extern int in6_detachhead(void **, int);
343#endif
344
345struct domain inet6domain = {
346	.dom_family =		AF_INET6,
347	.dom_name =		"internet6",
348	.dom_protosw =		(struct protosw *)inet6sw,
349	.dom_protoswNPROTOSW =	(struct protosw *)&inet6sw[nitems(inet6sw)],
350#ifdef RADIX_MPATH
351	.dom_rtattach =		rn6_mpath_inithead,
352#else
353	.dom_rtattach =		in6_inithead,
354#endif
355#ifdef VIMAGE
356	.dom_rtdetach =		in6_detachhead,
357#endif
358	.dom_ifattach =		in6_domifattach,
359	.dom_ifdetach =		in6_domifdetach,
360	.dom_ifmtu    =		in6_domifmtu
361};
362
363VNET_DOMAIN_SET(inet6);
364
365/*
366 * Internet configuration info
367 */
368#ifndef	IPV6FORWARDING
369#ifdef GATEWAY6
370#define	IPV6FORWARDING	1	/* forward IP6 packets not for us */
371#else
372#define	IPV6FORWARDING	0	/* don't forward IP6 packets not for us */
373#endif /* GATEWAY6 */
374#endif /* !IPV6FORWARDING */
375
376#ifndef	IPV6_SENDREDIRECTS
377#define	IPV6_SENDREDIRECTS	1
378#endif
379
380VNET_DEFINE(int, ip6_forwarding) = IPV6FORWARDING;	/* act as router? */
381VNET_DEFINE(int, ip6_sendredirects) = IPV6_SENDREDIRECTS;
382VNET_DEFINE(int, ip6_defhlim) = IPV6_DEFHLIM;
383VNET_DEFINE(int, ip6_defmcasthlim) = IPV6_DEFAULT_MULTICAST_HOPS;
384VNET_DEFINE(int, ip6_accept_rtadv) = 0;
385VNET_DEFINE(int, ip6_no_radr) = 0;
386VNET_DEFINE(int, ip6_norbit_raif) = 0;
387VNET_DEFINE(int, ip6_rfc6204w3) = 0;
388VNET_DEFINE(int, ip6_maxfragpackets);	/* initialized in frag6.c:frag6_init() */
389VNET_DEFINE(int, ip6_maxfrags);		/* initialized in frag6.c:frag6_init() */
390VNET_DEFINE(int, ip6_log_interval) = 5;
391VNET_DEFINE(int, ip6_hdrnestlimit) = 15;/* How many header options will we
392					 * process? */
393VNET_DEFINE(int, ip6_dad_count) = 1;	/* DupAddrDetectionTransmits */
394VNET_DEFINE(int, ip6_auto_flowlabel) = 1;
395VNET_DEFINE(int, ip6_use_deprecated) = 1;/* allow deprecated addr
396					 * (RFC2462 5.5.4) */
397VNET_DEFINE(int, ip6_rr_prune) = 5;	/* router renumbering prefix
398					 * walk list every 5 sec. */
399VNET_DEFINE(int, ip6_mcast_pmtu) = 0;	/* enable pMTU discovery for multicast? */
400VNET_DEFINE(int, ip6_v6only) = 1;
401
402VNET_DEFINE(time_t, ip6_log_time) = (time_t)0L;
403#ifdef IPSTEALTH
404VNET_DEFINE(int, ip6stealth) = 0;
405#endif
406VNET_DEFINE(int, nd6_onlink_ns_rfc4861) = 0;/* allow 'on-link' nd6 NS
407					     * (RFC 4861) */
408
409/* icmp6 */
410/*
411 * BSDI4 defines these variables in in_proto.c...
412 * XXX: what if we don't define INET? Should we define pmtu6_expire
413 * or so? (jinmei@kame.net 19990310)
414 */
415VNET_DEFINE(int, pmtu_expire) = 60*10;
416VNET_DEFINE(int, pmtu_probe) = 60*2;
417
418/* ICMPV6 parameters */
419VNET_DEFINE(int, icmp6_rediraccept) = 1;/* accept and process redirects */
420VNET_DEFINE(int, icmp6_redirtimeout) = 10 * 60;	/* 10 minutes */
421VNET_DEFINE(int, icmp6errppslim) = 100;		/* 100pps */
422/* control how to respond to NI queries */
423VNET_DEFINE(int, icmp6_nodeinfo) =
424    (ICMP6_NODEINFO_FQDNOK|ICMP6_NODEINFO_NODEADDROK);
425VNET_DEFINE(int, icmp6_nodeinfo_oldmcprefix) = 1;
426
427/*
428 * sysctl related items.
429 */
430SYSCTL_NODE(_net,	PF_INET6,	inet6,	CTLFLAG_RW,	0,
431	"Internet6 Family");
432
433/* net.inet6 */
434SYSCTL_NODE(_net_inet6,	IPPROTO_IPV6,	ip6,	CTLFLAG_RW, 0,	"IP6");
435SYSCTL_NODE(_net_inet6,	IPPROTO_ICMPV6,	icmp6,	CTLFLAG_RW, 0,	"ICMP6");
436SYSCTL_NODE(_net_inet6,	IPPROTO_UDP,	udp6,	CTLFLAG_RW, 0,	"UDP6");
437SYSCTL_NODE(_net_inet6,	IPPROTO_TCP,	tcp6,	CTLFLAG_RW, 0,	"TCP6");
438#ifdef SCTP
439SYSCTL_NODE(_net_inet6,	IPPROTO_SCTP,	sctp6,	CTLFLAG_RW, 0,	"SCTP6");
440#endif
441#if defined(IPSEC) || defined(IPSEC_SUPPORT)
442SYSCTL_NODE(_net_inet6,	IPPROTO_ESP,	ipsec6,	CTLFLAG_RW, 0,	"IPSEC6");
443#endif /* IPSEC */
444
445/* net.inet6.ip6 */
446static int
447sysctl_ip6_temppltime(SYSCTL_HANDLER_ARGS)
448{
449	int error, val;
450
451	val = V_ip6_temp_preferred_lifetime;
452	error = sysctl_handle_int(oidp, &val, 0, req);
453	if (error != 0 || !req->newptr)
454		return (error);
455	if (val < V_ip6_desync_factor + V_ip6_temp_regen_advance)
456		return (EINVAL);
457	V_ip6_temp_preferred_lifetime = val;
458	return (0);
459}
460
461static int
462sysctl_ip6_tempvltime(SYSCTL_HANDLER_ARGS)
463{
464	int error, val;
465
466	val = V_ip6_temp_valid_lifetime;
467	error = sysctl_handle_int(oidp, &val, 0, req);
468	if (error != 0 || !req->newptr)
469		return (error);
470	if (val < V_ip6_temp_preferred_lifetime)
471		return (EINVAL);
472	V_ip6_temp_valid_lifetime = val;
473	return (0);
474}
475
476SYSCTL_INT(_net_inet6_ip6, IPV6CTL_FORWARDING, forwarding,
477	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_forwarding), 0,
478	"Enable forwarding of IPv6 packets between interfaces");
479SYSCTL_INT(_net_inet6_ip6, IPV6CTL_SENDREDIRECTS, redirect,
480	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_sendredirects), 0,
481	"Send ICMPv6 redirects for unforwardable IPv6 packets");
482SYSCTL_INT(_net_inet6_ip6, IPV6CTL_DEFHLIM, hlim,
483	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_defhlim), 0,
484	"Default hop limit to use for outgoing IPv6 packets");
485SYSCTL_VNET_PCPUSTAT(_net_inet6_ip6, IPV6CTL_STATS, stats, struct ip6stat,
486	ip6stat,
487	"IP6 statistics (struct ip6stat, netinet6/ip6_var.h)");
488SYSCTL_INT(_net_inet6_ip6, IPV6CTL_MAXFRAGPACKETS, maxfragpackets,
489	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_maxfragpackets), 0,
490	"Default maximum number of outstanding fragmented IPv6 packets. "
491	"A value of 0 means no fragmented packets will be accepted, while a "
492	"a value of -1 means no limit");
493SYSCTL_INT(_net_inet6_ip6, IPV6CTL_ACCEPT_RTADV, accept_rtadv,
494	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_accept_rtadv), 0,
495	"Default value of per-interface flag for accepting ICMPv6 RA messages");
496SYSCTL_INT(_net_inet6_ip6, IPV6CTL_NO_RADR, no_radr,
497	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_no_radr), 0,
498	"Default value of per-interface flag to control whether routers "
499	"sending ICMPv6 RA messages on that interface are added into the "
500	"default router list");
501SYSCTL_INT(_net_inet6_ip6, IPV6CTL_NORBIT_RAIF, norbit_raif,
502	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_norbit_raif), 0,
503	"Always set clear the R flag in ICMPv6 NA messages when accepting RA "
504	"on the interface");
505SYSCTL_INT(_net_inet6_ip6, IPV6CTL_RFC6204W3, rfc6204w3,
506	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_rfc6204w3), 0,
507	"Accept the default router list from ICMPv6 RA messages even "
508	"when packet forwarding is enabled");
509SYSCTL_INT(_net_inet6_ip6, IPV6CTL_LOG_INTERVAL, log_interval,
510	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_log_interval), 0,
511	"Frequency in seconds at which to log IPv6 forwarding errors");
512SYSCTL_INT(_net_inet6_ip6, IPV6CTL_HDRNESTLIMIT, hdrnestlimit,
513	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_hdrnestlimit), 0,
514	"Default maximum number of IPv6 extension headers permitted on "
515	"incoming IPv6 packets, 0 for no artificial limit");
516SYSCTL_INT(_net_inet6_ip6, IPV6CTL_DAD_COUNT, dad_count,
517	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_dad_count), 0,
518	"Number of ICMPv6 NS messages sent during duplicate address detection");
519SYSCTL_INT(_net_inet6_ip6, IPV6CTL_AUTO_FLOWLABEL, auto_flowlabel,
520	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_auto_flowlabel), 0,
521	"Provide an IPv6 flowlabel in outbound packets");
522SYSCTL_INT(_net_inet6_ip6, IPV6CTL_DEFMCASTHLIM, defmcasthlim,
523	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_defmcasthlim), 0,
524	"Default hop limit for IPv6 multicast packets originating from this "
525	"node");
526SYSCTL_STRING(_net_inet6_ip6, IPV6CTL_KAME_VERSION, kame_version,
527	CTLFLAG_RD, __KAME_VERSION, 0,
528	"KAME version string");
529SYSCTL_INT(_net_inet6_ip6, IPV6CTL_USE_DEPRECATED, use_deprecated,
530	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_use_deprecated), 0,
531	"Allow the use of addresses whose preferred lifetimes have expired");
532SYSCTL_INT(_net_inet6_ip6, IPV6CTL_RR_PRUNE, rr_prune,
533	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_rr_prune), 0,
534	""); /* XXX unused */
535SYSCTL_INT(_net_inet6_ip6, IPV6CTL_USETEMPADDR, use_tempaddr,
536	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_use_tempaddr), 0,
537	"Create RFC3041 temporary addresses for autoconfigured addresses");
538SYSCTL_PROC(_net_inet6_ip6, IPV6CTL_TEMPPLTIME, temppltime,
539	CTLFLAG_VNET | CTLTYPE_INT | CTLFLAG_RW,
540	NULL, 0, sysctl_ip6_temppltime, "I",
541	"Maximum preferred lifetime for temporary addresses");
542SYSCTL_PROC(_net_inet6_ip6, IPV6CTL_TEMPVLTIME, tempvltime,
543	CTLFLAG_VNET | CTLTYPE_INT | CTLFLAG_RW,
544	NULL, 0, sysctl_ip6_tempvltime, "I",
545	"Maximum valid lifetime for temporary addresses");
546SYSCTL_INT(_net_inet6_ip6, IPV6CTL_V6ONLY, v6only,
547	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_v6only), 0,
548	"Restrict AF_INET6 sockets to IPv6 addresses only");
549SYSCTL_INT(_net_inet6_ip6, IPV6CTL_AUTO_LINKLOCAL, auto_linklocal,
550	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_auto_linklocal), 0,
551	"Default value of per-interface flag for automatically adding an IPv6 "
552	"link-local address to interfaces when attached");
553SYSCTL_VNET_PCPUSTAT(_net_inet6_ip6, IPV6CTL_RIP6STATS, rip6stats,
554	struct rip6stat, rip6stat,
555	"Raw IP6 statistics (struct rip6stat, netinet6/raw_ip6.h)");
556SYSCTL_INT(_net_inet6_ip6, IPV6CTL_PREFER_TEMPADDR, prefer_tempaddr,
557	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_prefer_tempaddr), 0,
558	"Prefer RFC3041 temporary addresses in source address selection");
559SYSCTL_INT(_net_inet6_ip6, IPV6CTL_USE_DEFAULTZONE, use_defaultzone,
560	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_use_defzone), 0,
561	"Use the default scope zone when none is specified");
562SYSCTL_INT(_net_inet6_ip6, IPV6CTL_MAXFRAGS, maxfrags,
563	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_maxfrags), 0,
564	"Maximum allowed number of outstanding IPv6 packet fragments");
565SYSCTL_INT(_net_inet6_ip6, IPV6CTL_MCAST_PMTU, mcast_pmtu,
566	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip6_mcast_pmtu), 0,
567	"Enable path MTU discovery for multicast packets");
568#ifdef IPSTEALTH
569SYSCTL_INT(_net_inet6_ip6, IPV6CTL_STEALTH, stealth, CTLFLAG_VNET | CTLFLAG_RW,
570	&VNET_NAME(ip6stealth), 0,
571	"Forward IPv6 packets without decrementing their TTL");
572#endif
573
574/* net.inet6.icmp6 */
575SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_REDIRACCEPT, rediraccept,
576	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(icmp6_rediraccept), 0,
577	"Accept ICMPv6 redirect messages");
578SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_REDIRTIMEOUT, redirtimeout,
579	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(icmp6_redirtimeout), 0,
580	""); /* XXX unused */
581SYSCTL_VNET_PCPUSTAT(_net_inet6_icmp6, ICMPV6CTL_STATS, stats,
582	struct icmp6stat, icmp6stat,
583	"ICMPv6 statistics (struct icmp6stat, netinet/icmp6.h)");
584SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_ND6_PRUNE, nd6_prune,
585	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(nd6_prune), 0,
586	"Frequency in seconds of checks for expired prefixes and routers");
587SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_ND6_DELAY, nd6_delay,
588	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(nd6_delay), 0,
589	"Delay in seconds before probing for reachability");
590SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_ND6_UMAXTRIES, nd6_umaxtries,
591	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(nd6_umaxtries), 0,
592	"Number of ICMPv6 NS messages sent during reachability detection");
593SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_ND6_MMAXTRIES, nd6_mmaxtries,
594	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(nd6_mmaxtries), 0,
595	"Number of ICMPv6 NS messages sent during address resolution");
596SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_ND6_USELOOPBACK, nd6_useloopback,
597	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(nd6_useloopback), 0,
598	"Create a loopback route when configuring an IPv6 address");
599SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_NODEINFO, nodeinfo,
600	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(icmp6_nodeinfo), 0,
601	"Mask of enabled RF4620 node information query types");
602SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_NODEINFO_OLDMCPREFIX,
603	nodeinfo_oldmcprefix, CTLFLAG_VNET | CTLFLAG_RW,
604	&VNET_NAME(icmp6_nodeinfo_oldmcprefix), 0,
605	"Join old IPv6 NI group address in draft-ietf-ipngwg-icmp-name-lookup "
606	"for compatibility with KAME implementation");
607SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_ERRPPSLIMIT, errppslimit,
608	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(icmp6errppslim), 0,
609	"Maximum number of ICMPv6 error messages per second");
610SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_ND6_MAXNUDHINT, nd6_maxnudhint,
611	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(nd6_maxnudhint), 0,
612	""); /* XXX unused */
613SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_ND6_DEBUG, nd6_debug,
614	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(nd6_debug), 0,
615	"Log NDP debug messages");
616SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_ND6_ONLINKNSRFC4861,
617	nd6_onlink_ns_rfc4861, CTLFLAG_VNET | CTLFLAG_RW,
618	&VNET_NAME(nd6_onlink_ns_rfc4861), 0,
619	"Accept 'on-link' ICMPv6 NS messages in compliance with RFC 4861");
620