ip6_input.c revision 244272
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: ip6_input.c,v 1.259 2002/01/21 04:58:09 jinmei Exp $
30 */
31
32/*-
33 * Copyright (c) 1982, 1986, 1988, 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 *	@(#)ip_input.c	8.2 (Berkeley) 1/4/94
61 */
62
63#include <sys/cdefs.h>
64__FBSDID("$FreeBSD: head/sys/netinet6/ip6_input.c 244272 2012-12-15 20:04:24Z ae $");
65
66#include "opt_inet.h"
67#include "opt_inet6.h"
68#include "opt_ipfw.h"
69#include "opt_ipsec.h"
70#include "opt_route.h"
71
72#include <sys/param.h>
73#include <sys/systm.h>
74#include <sys/malloc.h>
75#include <sys/mbuf.h>
76#include <sys/proc.h>
77#include <sys/domain.h>
78#include <sys/protosw.h>
79#include <sys/socket.h>
80#include <sys/socketvar.h>
81#include <sys/errno.h>
82#include <sys/time.h>
83#include <sys/kernel.h>
84#include <sys/syslog.h>
85
86#include <net/if.h>
87#include <net/if_types.h>
88#include <net/if_dl.h>
89#include <net/route.h>
90#include <net/netisr.h>
91#include <net/pfil.h>
92#include <net/vnet.h>
93
94#include <netinet/in.h>
95#include <netinet/ip_var.h>
96#include <netinet/in_systm.h>
97#include <net/if_llatbl.h>
98#ifdef INET
99#include <netinet/ip.h>
100#include <netinet/ip_icmp.h>
101#endif /* INET */
102#include <netinet/ip6.h>
103#include <netinet6/in6_var.h>
104#include <netinet6/ip6_var.h>
105#include <netinet/in_pcb.h>
106#include <netinet/icmp6.h>
107#include <netinet6/scope6_var.h>
108#include <netinet6/in6_ifattach.h>
109#include <netinet6/nd6.h>
110
111#ifdef IPSEC
112#include <netipsec/ipsec.h>
113#include <netinet6/ip6_ipsec.h>
114#include <netipsec/ipsec6.h>
115#endif /* IPSEC */
116
117#include <netinet6/ip6protosw.h>
118
119#ifdef FLOWTABLE
120#include <net/flowtable.h>
121VNET_DECLARE(int, ip6_output_flowtable_size);
122#define	V_ip6_output_flowtable_size	VNET(ip6_output_flowtable_size)
123#endif
124
125extern struct domain inet6domain;
126
127u_char ip6_protox[IPPROTO_MAX];
128VNET_DEFINE(struct in6_ifaddrhead, in6_ifaddrhead);
129VNET_DEFINE(struct in6_ifaddrlisthead *, in6_ifaddrhashtbl);
130VNET_DEFINE(u_long, in6_ifaddrhmask);
131
132static struct netisr_handler ip6_nh = {
133	.nh_name = "ip6",
134	.nh_handler = ip6_input,
135	.nh_proto = NETISR_IPV6,
136	.nh_policy = NETISR_POLICY_FLOW,
137};
138
139VNET_DECLARE(struct callout, in6_tmpaddrtimer_ch);
140#define	V_in6_tmpaddrtimer_ch		VNET(in6_tmpaddrtimer_ch)
141
142VNET_DEFINE(struct pfil_head, inet6_pfil_hook);
143
144VNET_DEFINE(struct ip6stat, ip6stat);
145
146struct rwlock in6_ifaddr_lock;
147RW_SYSINIT(in6_ifaddr_lock, &in6_ifaddr_lock, "in6_ifaddr_lock");
148
149static void ip6_init2(void *);
150static struct ip6aux *ip6_setdstifaddr(struct mbuf *, struct in6_ifaddr *);
151static struct ip6aux *ip6_addaux(struct mbuf *);
152static struct ip6aux *ip6_findaux(struct mbuf *m);
153static void ip6_delaux (struct mbuf *);
154static int ip6_hopopts_input(u_int32_t *, u_int32_t *, struct mbuf **, int *);
155#ifdef PULLDOWN_TEST
156static struct mbuf *ip6_pullexthdr(struct mbuf *, size_t, int);
157#endif
158
159/*
160 * IP6 initialization: fill in IP6 protocol switch table.
161 * All protocols not implemented in kernel go to raw IP6 protocol handler.
162 */
163void
164ip6_init(void)
165{
166	struct ip6protosw *pr;
167	int i;
168
169	TUNABLE_INT_FETCH("net.inet6.ip6.auto_linklocal",
170	    &V_ip6_auto_linklocal);
171	TUNABLE_INT_FETCH("net.inet6.ip6.accept_rtadv", &V_ip6_accept_rtadv);
172	TUNABLE_INT_FETCH("net.inet6.ip6.no_radr", &V_ip6_no_radr);
173
174	TAILQ_INIT(&V_in6_ifaddrhead);
175	V_in6_ifaddrhashtbl = hashinit(IN6ADDR_NHASH, M_IFADDR,
176	    &V_in6_ifaddrhmask);
177
178	/* Initialize packet filter hooks. */
179	V_inet6_pfil_hook.ph_type = PFIL_TYPE_AF;
180	V_inet6_pfil_hook.ph_af = AF_INET6;
181	if ((i = pfil_head_register(&V_inet6_pfil_hook)) != 0)
182		printf("%s: WARNING: unable to register pfil hook, "
183			"error %d\n", __func__, i);
184
185	scope6_init();
186	addrsel_policy_init();
187	nd6_init();
188	frag6_init();
189
190#ifdef FLOWTABLE
191	if (TUNABLE_INT_FETCH("net.inet6.ip6.output_flowtable_size",
192		&V_ip6_output_flowtable_size)) {
193		if (V_ip6_output_flowtable_size < 256)
194			V_ip6_output_flowtable_size = 256;
195		if (!powerof2(V_ip6_output_flowtable_size)) {
196			printf("flowtable must be power of 2 size\n");
197			V_ip6_output_flowtable_size = 2048;
198		}
199	} else {
200		/*
201		 * round up to the next power of 2
202		 */
203		V_ip6_output_flowtable_size = 1 << fls((1024 + maxusers * 64)-1);
204	}
205	V_ip6_ft = flowtable_alloc("ipv6", V_ip6_output_flowtable_size, FL_IPV6|FL_PCPU);
206#endif
207
208	V_ip6_desync_factor = arc4random() % MAX_TEMP_DESYNC_FACTOR;
209
210	/* Skip global initialization stuff for non-default instances. */
211	if (!IS_DEFAULT_VNET(curvnet))
212		return;
213
214#ifdef DIAGNOSTIC
215	if (sizeof(struct protosw) != sizeof(struct ip6protosw))
216		panic("sizeof(protosw) != sizeof(ip6protosw)");
217#endif
218	pr = (struct ip6protosw *)pffindproto(PF_INET6, IPPROTO_RAW, SOCK_RAW);
219	if (pr == NULL)
220		panic("ip6_init");
221
222	/* Initialize the entire ip6_protox[] array to IPPROTO_RAW. */
223	for (i = 0; i < IPPROTO_MAX; i++)
224		ip6_protox[i] = pr - inet6sw;
225	/*
226	 * Cycle through IP protocols and put them into the appropriate place
227	 * in ip6_protox[].
228	 */
229	for (pr = (struct ip6protosw *)inet6domain.dom_protosw;
230	    pr < (struct ip6protosw *)inet6domain.dom_protoswNPROTOSW; pr++)
231		if (pr->pr_domain->dom_family == PF_INET6 &&
232		    pr->pr_protocol && pr->pr_protocol != IPPROTO_RAW) {
233			/* Be careful to only index valid IP protocols. */
234			if (pr->pr_protocol < IPPROTO_MAX)
235				ip6_protox[pr->pr_protocol] = pr - inet6sw;
236		}
237
238	netisr_register(&ip6_nh);
239}
240
241/*
242 * The protocol to be inserted into ip6_protox[] must be already registered
243 * in inet6sw[], either statically or through pf_proto_register().
244 */
245int
246ip6proto_register(short ip6proto)
247{
248	struct ip6protosw *pr;
249
250	/* Sanity checks. */
251	if (ip6proto <= 0 || ip6proto >= IPPROTO_MAX)
252		return (EPROTONOSUPPORT);
253
254	/*
255	 * The protocol slot must not be occupied by another protocol
256	 * already.  An index pointing to IPPROTO_RAW is unused.
257	 */
258	pr = (struct ip6protosw *)pffindproto(PF_INET6, IPPROTO_RAW, SOCK_RAW);
259	if (pr == NULL)
260		return (EPFNOSUPPORT);
261	if (ip6_protox[ip6proto] != pr - inet6sw)	/* IPPROTO_RAW */
262		return (EEXIST);
263
264	/*
265	 * Find the protocol position in inet6sw[] and set the index.
266	 */
267	for (pr = (struct ip6protosw *)inet6domain.dom_protosw;
268	    pr < (struct ip6protosw *)inet6domain.dom_protoswNPROTOSW; pr++) {
269		if (pr->pr_domain->dom_family == PF_INET6 &&
270		    pr->pr_protocol && pr->pr_protocol == ip6proto) {
271			ip6_protox[pr->pr_protocol] = pr - inet6sw;
272			return (0);
273		}
274	}
275	return (EPROTONOSUPPORT);
276}
277
278int
279ip6proto_unregister(short ip6proto)
280{
281	struct ip6protosw *pr;
282
283	/* Sanity checks. */
284	if (ip6proto <= 0 || ip6proto >= IPPROTO_MAX)
285		return (EPROTONOSUPPORT);
286
287	/* Check if the protocol was indeed registered. */
288	pr = (struct ip6protosw *)pffindproto(PF_INET6, IPPROTO_RAW, SOCK_RAW);
289	if (pr == NULL)
290		return (EPFNOSUPPORT);
291	if (ip6_protox[ip6proto] == pr - inet6sw)	/* IPPROTO_RAW */
292		return (ENOENT);
293
294	/* Reset the protocol slot to IPPROTO_RAW. */
295	ip6_protox[ip6proto] = pr - inet6sw;
296	return (0);
297}
298
299#ifdef VIMAGE
300void
301ip6_destroy()
302{
303
304	hashdestroy(V_in6_ifaddrhashtbl, M_IFADDR, V_in6_ifaddrhmask);
305	nd6_destroy();
306	callout_drain(&V_in6_tmpaddrtimer_ch);
307}
308#endif
309
310static int
311ip6_init2_vnet(const void *unused __unused)
312{
313
314	/* nd6_timer_init */
315	callout_init(&V_nd6_timer_ch, 0);
316	callout_reset(&V_nd6_timer_ch, hz, nd6_timer, curvnet);
317
318	/* timer for regeneranation of temporary addresses randomize ID */
319	callout_init(&V_in6_tmpaddrtimer_ch, 0);
320	callout_reset(&V_in6_tmpaddrtimer_ch,
321		      (V_ip6_temp_preferred_lifetime - V_ip6_desync_factor -
322		       V_ip6_temp_regen_advance) * hz,
323		      in6_tmpaddrtimer, curvnet);
324
325	return (0);
326}
327
328static void
329ip6_init2(void *dummy)
330{
331
332	ip6_init2_vnet(NULL);
333}
334
335/* cheat */
336/* This must be after route_init(), which is now SI_ORDER_THIRD */
337SYSINIT(netinet6init2, SI_SUB_PROTO_DOMAIN, SI_ORDER_MIDDLE, ip6_init2, NULL);
338
339static int
340ip6_input_hbh(struct mbuf *m, uint32_t *plen, uint32_t *rtalert, int *off,
341    int *nxt, int *ours)
342{
343	struct ip6_hdr *ip6;
344	struct ip6_hbh *hbh;
345
346	if (ip6_hopopts_input(plen, rtalert, &m, off)) {
347#if 0	/*touches NULL pointer*/
348		in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_discard);
349#endif
350		goto out;	/* m have already been freed */
351	}
352
353	/* adjust pointer */
354	ip6 = mtod(m, struct ip6_hdr *);
355
356	/*
357	 * if the payload length field is 0 and the next header field
358	 * indicates Hop-by-Hop Options header, then a Jumbo Payload
359	 * option MUST be included.
360	 */
361	if (ip6->ip6_plen == 0 && *plen == 0) {
362		/*
363		 * Note that if a valid jumbo payload option is
364		 * contained, ip6_hopopts_input() must set a valid
365		 * (non-zero) payload length to the variable plen.
366		 */
367		V_ip6stat.ip6s_badoptions++;
368		in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_discard);
369		in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_hdrerr);
370		icmp6_error(m, ICMP6_PARAM_PROB,
371			    ICMP6_PARAMPROB_HEADER,
372			    (caddr_t)&ip6->ip6_plen - (caddr_t)ip6);
373		goto out;
374	}
375#ifndef PULLDOWN_TEST
376	/* ip6_hopopts_input() ensures that mbuf is contiguous */
377	hbh = (struct ip6_hbh *)(ip6 + 1);
378#else
379	IP6_EXTHDR_GET(hbh, struct ip6_hbh *, m, sizeof(struct ip6_hdr),
380		sizeof(struct ip6_hbh));
381	if (hbh == NULL) {
382		V_ip6stat.ip6s_tooshort++;
383		goto out;
384	}
385#endif
386	*nxt = hbh->ip6h_nxt;
387
388	/*
389	 * If we are acting as a router and the packet contains a
390	 * router alert option, see if we know the option value.
391	 * Currently, we only support the option value for MLD, in which
392	 * case we should pass the packet to the multicast routing
393	 * daemon.
394	 */
395	if (*rtalert != ~0) {
396		switch (*rtalert) {
397		case IP6OPT_RTALERT_MLD:
398			if (V_ip6_forwarding)
399				*ours = 1;
400			break;
401		default:
402			/*
403			 * RFC2711 requires unrecognized values must be
404			 * silently ignored.
405			 */
406			break;
407		}
408	}
409
410	return (0);
411
412out:
413	return (1);
414}
415
416void
417ip6_input(struct mbuf *m)
418{
419	struct ip6_hdr *ip6;
420	int off = sizeof(struct ip6_hdr), nest;
421	u_int32_t plen;
422	u_int32_t rtalert = ~0;
423	int nxt, ours = 0;
424	struct ifnet *deliverifp = NULL, *ifp = NULL;
425	struct in6_addr odst;
426	struct route_in6 rin6;
427	int srcrt = 0;
428	struct llentry *lle = NULL;
429	struct sockaddr_in6 dst6, *dst;
430
431	bzero(&rin6, sizeof(struct route_in6));
432#ifdef IPSEC
433	/*
434	 * should the inner packet be considered authentic?
435	 * see comment in ah4_input().
436	 * NB: m cannot be NULL when passed to the input routine
437	 */
438
439	m->m_flags &= ~M_AUTHIPHDR;
440	m->m_flags &= ~M_AUTHIPDGM;
441
442#endif /* IPSEC */
443
444	/*
445	 * make sure we don't have onion peering information into m_tag.
446	 */
447	ip6_delaux(m);
448
449	if (m->m_flags & M_FASTFWD_OURS) {
450		/*
451		 * Firewall changed destination to local.
452		 */
453		m->m_flags &= ~M_FASTFWD_OURS;
454		ours = 1;
455		deliverifp = m->m_pkthdr.rcvif;
456		ip6 = mtod(m, struct ip6_hdr *);
457		goto hbhcheck;
458	}
459
460	/*
461	 * mbuf statistics
462	 */
463	if (m->m_flags & M_EXT) {
464		if (m->m_next)
465			V_ip6stat.ip6s_mext2m++;
466		else
467			V_ip6stat.ip6s_mext1++;
468	} else {
469#define M2MMAX	(sizeof(V_ip6stat.ip6s_m2m)/sizeof(V_ip6stat.ip6s_m2m[0]))
470		if (m->m_next) {
471			if (m->m_flags & M_LOOP) {
472				V_ip6stat.ip6s_m2m[V_loif->if_index]++;
473			} else if (m->m_pkthdr.rcvif->if_index < M2MMAX)
474				V_ip6stat.ip6s_m2m[m->m_pkthdr.rcvif->if_index]++;
475			else
476				V_ip6stat.ip6s_m2m[0]++;
477		} else
478			V_ip6stat.ip6s_m1++;
479#undef M2MMAX
480	}
481
482	/* drop the packet if IPv6 operation is disabled on the IF */
483	if ((ND_IFINFO(m->m_pkthdr.rcvif)->flags & ND6_IFF_IFDISABLED)) {
484		m_freem(m);
485		return;
486	}
487
488	in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_receive);
489	V_ip6stat.ip6s_total++;
490
491#ifndef PULLDOWN_TEST
492	/*
493	 * L2 bridge code and some other code can return mbuf chain
494	 * that does not conform to KAME requirement.  too bad.
495	 * XXX: fails to join if interface MTU > MCLBYTES.  jumbogram?
496	 */
497	if (m && m->m_next != NULL && m->m_pkthdr.len < MCLBYTES) {
498		struct mbuf *n;
499
500		MGETHDR(n, M_NOWAIT, MT_HEADER);
501		if (n)
502			M_MOVE_PKTHDR(n, m);
503		if (n && n->m_pkthdr.len > MHLEN) {
504			MCLGET(n, M_NOWAIT);
505			if ((n->m_flags & M_EXT) == 0) {
506				m_freem(n);
507				n = NULL;
508			}
509		}
510		if (n == NULL) {
511			m_freem(m);
512			return;	/* ENOBUFS */
513		}
514
515		m_copydata(m, 0, n->m_pkthdr.len, mtod(n, caddr_t));
516		n->m_len = n->m_pkthdr.len;
517		m_freem(m);
518		m = n;
519	}
520	IP6_EXTHDR_CHECK(m, 0, sizeof(struct ip6_hdr), /* nothing */);
521#endif
522
523	if (m->m_len < sizeof(struct ip6_hdr)) {
524		struct ifnet *inifp;
525		inifp = m->m_pkthdr.rcvif;
526		if ((m = m_pullup(m, sizeof(struct ip6_hdr))) == NULL) {
527			V_ip6stat.ip6s_toosmall++;
528			in6_ifstat_inc(inifp, ifs6_in_hdrerr);
529			return;
530		}
531	}
532
533	ip6 = mtod(m, struct ip6_hdr *);
534
535	if ((ip6->ip6_vfc & IPV6_VERSION_MASK) != IPV6_VERSION) {
536		V_ip6stat.ip6s_badvers++;
537		in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_hdrerr);
538		goto bad;
539	}
540
541	V_ip6stat.ip6s_nxthist[ip6->ip6_nxt]++;
542
543	/*
544	 * Check against address spoofing/corruption.
545	 */
546	if (IN6_IS_ADDR_MULTICAST(&ip6->ip6_src) ||
547	    IN6_IS_ADDR_UNSPECIFIED(&ip6->ip6_dst)) {
548		/*
549		 * XXX: "badscope" is not very suitable for a multicast source.
550		 */
551		V_ip6stat.ip6s_badscope++;
552		in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_addrerr);
553		goto bad;
554	}
555	if (IN6_IS_ADDR_MC_INTFACELOCAL(&ip6->ip6_dst) &&
556	    !(m->m_flags & M_LOOP)) {
557		/*
558		 * In this case, the packet should come from the loopback
559		 * interface.  However, we cannot just check the if_flags,
560		 * because ip6_mloopback() passes the "actual" interface
561		 * as the outgoing/incoming interface.
562		 */
563		V_ip6stat.ip6s_badscope++;
564		in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_addrerr);
565		goto bad;
566	}
567
568#ifdef ALTQ
569	if (altq_input != NULL && (*altq_input)(m, AF_INET6) == 0) {
570		/* packet is dropped by traffic conditioner */
571		return;
572	}
573#endif
574	/*
575	 * The following check is not documented in specs.  A malicious
576	 * party may be able to use IPv4 mapped addr to confuse tcp/udp stack
577	 * and bypass security checks (act as if it was from 127.0.0.1 by using
578	 * IPv6 src ::ffff:127.0.0.1).  Be cautious.
579	 *
580	 * This check chokes if we are in an SIIT cloud.  As none of BSDs
581	 * support IPv4-less kernel compilation, we cannot support SIIT
582	 * environment at all.  So, it makes more sense for us to reject any
583	 * malicious packets for non-SIIT environment, than try to do a
584	 * partial support for SIIT environment.
585	 */
586	if (IN6_IS_ADDR_V4MAPPED(&ip6->ip6_src) ||
587	    IN6_IS_ADDR_V4MAPPED(&ip6->ip6_dst)) {
588		V_ip6stat.ip6s_badscope++;
589		in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_addrerr);
590		goto bad;
591	}
592#if 0
593	/*
594	 * Reject packets with IPv4 compatible addresses (auto tunnel).
595	 *
596	 * The code forbids auto tunnel relay case in RFC1933 (the check is
597	 * stronger than RFC1933).  We may want to re-enable it if mech-xx
598	 * is revised to forbid relaying case.
599	 */
600	if (IN6_IS_ADDR_V4COMPAT(&ip6->ip6_src) ||
601	    IN6_IS_ADDR_V4COMPAT(&ip6->ip6_dst)) {
602		V_ip6stat.ip6s_badscope++;
603		in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_addrerr);
604		goto bad;
605	}
606#endif
607#ifdef IPSEC
608	/*
609	 * Bypass packet filtering for packets previously handled by IPsec.
610	 */
611	if (ip6_ipsec_filtertunnel(m))
612		goto passin;
613#endif /* IPSEC */
614
615	/*
616	 * Run through list of hooks for input packets.
617	 *
618	 * NB: Beware of the destination address changing
619	 *     (e.g. by NAT rewriting).  When this happens,
620	 *     tell ip6_forward to do the right thing.
621	 */
622	odst = ip6->ip6_dst;
623
624	/* Jump over all PFIL processing if hooks are not active. */
625	if (!PFIL_HOOKED(&V_inet6_pfil_hook))
626		goto passin;
627
628	if (pfil_run_hooks(&V_inet6_pfil_hook, &m,
629	    m->m_pkthdr.rcvif, PFIL_IN, NULL))
630		return;
631	if (m == NULL)			/* consumed by filter */
632		return;
633	ip6 = mtod(m, struct ip6_hdr *);
634	srcrt = !IN6_ARE_ADDR_EQUAL(&odst, &ip6->ip6_dst);
635
636	if (m->m_flags & M_FASTFWD_OURS) {
637		m->m_flags &= ~M_FASTFWD_OURS;
638		ours = 1;
639		deliverifp = m->m_pkthdr.rcvif;
640		goto hbhcheck;
641	}
642	if ((m->m_flags & M_IP6_NEXTHOP) &&
643	    m_tag_find(m, PACKET_TAG_IPFORWARD, NULL) != NULL) {
644		/*
645		 * Directly ship the packet on.  This allows forwarding
646		 * packets originally destined to us to some other directly
647		 * connected host.
648		 */
649		ip6_forward(m, 1);
650		goto out;
651	}
652
653passin:
654	/*
655	 * Disambiguate address scope zones (if there is ambiguity).
656	 * We first make sure that the original source or destination address
657	 * is not in our internal form for scoped addresses.  Such addresses
658	 * are not necessarily invalid spec-wise, but we cannot accept them due
659	 * to the usage conflict.
660	 * in6_setscope() then also checks and rejects the cases where src or
661	 * dst are the loopback address and the receiving interface
662	 * is not loopback.
663	 */
664	if (in6_clearscope(&ip6->ip6_src) || in6_clearscope(&ip6->ip6_dst)) {
665		V_ip6stat.ip6s_badscope++; /* XXX */
666		goto bad;
667	}
668	if (in6_setscope(&ip6->ip6_src, m->m_pkthdr.rcvif, NULL) ||
669	    in6_setscope(&ip6->ip6_dst, m->m_pkthdr.rcvif, NULL)) {
670		V_ip6stat.ip6s_badscope++;
671		goto bad;
672	}
673
674	/*
675	 * Multicast check. Assume packet is for us to avoid
676	 * prematurely taking locks.
677	 */
678	if (IN6_IS_ADDR_MULTICAST(&ip6->ip6_dst)) {
679		ours = 1;
680		in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_mcast);
681		deliverifp = m->m_pkthdr.rcvif;
682		goto hbhcheck;
683	}
684
685	/*
686	 *  Unicast check
687	 */
688
689	bzero(&dst6, sizeof(dst6));
690	dst6.sin6_family = AF_INET6;
691	dst6.sin6_len = sizeof(struct sockaddr_in6);
692	dst6.sin6_addr = ip6->ip6_dst;
693	ifp = m->m_pkthdr.rcvif;
694	IF_AFDATA_RLOCK(ifp);
695	lle = lla_lookup(LLTABLE6(ifp), 0,
696	     (struct sockaddr *)&dst6);
697	IF_AFDATA_RUNLOCK(ifp);
698	if ((lle != NULL) && (lle->la_flags & LLE_IFADDR)) {
699		struct ifaddr *ifa;
700		struct in6_ifaddr *ia6;
701		int bad;
702
703		bad = 1;
704#define	sa_equal(a1, a2)						\
705	(bcmp((a1), (a2), ((a1))->sin6_len) == 0)
706		IF_ADDR_RLOCK(ifp);
707		TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
708			if (ifa->ifa_addr->sa_family != dst6.sin6_family)
709				continue;
710			if (sa_equal(&dst6, ifa->ifa_addr))
711				break;
712		}
713		KASSERT(ifa != NULL, ("%s: ifa not found for lle %p",
714		    __func__, lle));
715#undef sa_equal
716
717		ia6 = (struct in6_ifaddr *)ifa;
718		if (!(ia6->ia6_flags & IN6_IFF_NOTREADY)) {
719			/* Count the packet in the ip address stats */
720			ia6->ia_ifa.if_ipackets++;
721			ia6->ia_ifa.if_ibytes += m->m_pkthdr.len;
722
723			/*
724			 * record address information into m_tag.
725			 */
726			(void)ip6_setdstifaddr(m, ia6);
727
728			bad = 0;
729		} else {
730			char ip6bufs[INET6_ADDRSTRLEN];
731			char ip6bufd[INET6_ADDRSTRLEN];
732			/* address is not ready, so discard the packet. */
733			nd6log((LOG_INFO,
734			    "ip6_input: packet to an unready address %s->%s\n",
735			    ip6_sprintf(ip6bufs, &ip6->ip6_src),
736			    ip6_sprintf(ip6bufd, &ip6->ip6_dst)));
737		}
738		IF_ADDR_RUNLOCK(ifp);
739		LLE_RUNLOCK(lle);
740		if (bad)
741			goto bad;
742		else {
743			ours = 1;
744			deliverifp = ifp;
745			goto hbhcheck;
746		}
747	}
748	if (lle != NULL)
749		LLE_RUNLOCK(lle);
750
751	dst = &rin6.ro_dst;
752	dst->sin6_len = sizeof(struct sockaddr_in6);
753	dst->sin6_family = AF_INET6;
754	dst->sin6_addr = ip6->ip6_dst;
755	rin6.ro_rt = in6_rtalloc1((struct sockaddr *)dst, 0, 0, M_GETFIB(m));
756	if (rin6.ro_rt)
757		RT_UNLOCK(rin6.ro_rt);
758
759#define rt6_key(r) ((struct sockaddr_in6 *)((r)->rt_nodes->rn_key))
760
761	/*
762	 * Accept the packet if the forwarding interface to the destination
763	 * according to the routing table is the loopback interface,
764	 * unless the associated route has a gateway.
765	 * Note that this approach causes to accept a packet if there is a
766	 * route to the loopback interface for the destination of the packet.
767	 * But we think it's even useful in some situations, e.g. when using
768	 * a special daemon which wants to intercept the packet.
769	 *
770	 * XXX: some OSes automatically make a cloned route for the destination
771	 * of an outgoing packet.  If the outgoing interface of the packet
772	 * is a loopback one, the kernel would consider the packet to be
773	 * accepted, even if we have no such address assinged on the interface.
774	 * We check the cloned flag of the route entry to reject such cases,
775	 * assuming that route entries for our own addresses are not made by
776	 * cloning (it should be true because in6_addloop explicitly installs
777	 * the host route).  However, we might have to do an explicit check
778	 * while it would be less efficient.  Or, should we rather install a
779	 * reject route for such a case?
780	 */
781	if (rin6.ro_rt &&
782	    (rin6.ro_rt->rt_flags &
783	     (RTF_HOST|RTF_GATEWAY)) == RTF_HOST &&
784#ifdef RTF_WASCLONED
785	    !(rin6.ro_rt->rt_flags & RTF_WASCLONED) &&
786#endif
787#ifdef RTF_CLONED
788	    !(rin6.ro_rt->rt_flags & RTF_CLONED) &&
789#endif
790#if 0
791	    /*
792	     * The check below is redundant since the comparison of
793	     * the destination and the key of the rtentry has
794	     * already done through looking up the routing table.
795	     */
796	    IN6_ARE_ADDR_EQUAL(&ip6->ip6_dst,
797	    &rt6_key(rin6.ro_rt)->sin6_addr)
798#endif
799	    rin6.ro_rt->rt_ifp->if_type == IFT_LOOP) {
800		int free_ia6 = 0;
801		struct in6_ifaddr *ia6;
802
803		/*
804		 * found the loopback route to the interface address
805		 */
806		if (rin6.ro_rt->rt_gateway->sa_family == AF_LINK) {
807			struct sockaddr_in6 dest6;
808
809			bzero(&dest6, sizeof(dest6));
810			dest6.sin6_family = AF_INET6;
811			dest6.sin6_len = sizeof(dest6);
812			dest6.sin6_addr = ip6->ip6_dst;
813			ia6 = (struct in6_ifaddr *)
814			    ifa_ifwithaddr((struct sockaddr *)&dest6);
815			if (ia6 == NULL)
816				goto bad;
817			free_ia6 = 1;
818		}
819		else
820			ia6 = (struct in6_ifaddr *)rin6.ro_rt->rt_ifa;
821
822		/*
823		 * record address information into m_tag.
824		 */
825		(void)ip6_setdstifaddr(m, ia6);
826
827		/*
828		 * packets to a tentative, duplicated, or somehow invalid
829		 * address must not be accepted.
830		 */
831		if (!(ia6->ia6_flags & IN6_IFF_NOTREADY)) {
832			/* this address is ready */
833			ours = 1;
834			deliverifp = ia6->ia_ifp;	/* correct? */
835			/* Count the packet in the ip address stats */
836			ia6->ia_ifa.if_ipackets++;
837			ia6->ia_ifa.if_ibytes += m->m_pkthdr.len;
838			if (ia6 != NULL && free_ia6 != 0)
839				ifa_free(&ia6->ia_ifa);
840			goto hbhcheck;
841		} else {
842			char ip6bufs[INET6_ADDRSTRLEN];
843			char ip6bufd[INET6_ADDRSTRLEN];
844			/* address is not ready, so discard the packet. */
845			nd6log((LOG_INFO,
846			    "ip6_input: packet to an unready address %s->%s\n",
847			    ip6_sprintf(ip6bufs, &ip6->ip6_src),
848			    ip6_sprintf(ip6bufd, &ip6->ip6_dst)));
849
850			if (ia6 != NULL && free_ia6 != 0)
851				ifa_free(&ia6->ia_ifa);
852			goto bad;
853		}
854	}
855
856	/*
857	 * FAITH (Firewall Aided Internet Translator)
858	 */
859	if (V_ip6_keepfaith) {
860		if (rin6.ro_rt && rin6.ro_rt->rt_ifp &&
861		    rin6.ro_rt->rt_ifp->if_type == IFT_FAITH) {
862			/* XXX do we need more sanity checks? */
863			ours = 1;
864			deliverifp = rin6.ro_rt->rt_ifp; /* faith */
865			goto hbhcheck;
866		}
867	}
868
869	/*
870	 * Now there is no reason to process the packet if it's not our own
871	 * and we're not a router.
872	 */
873	if (!V_ip6_forwarding) {
874		V_ip6stat.ip6s_cantforward++;
875		in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_discard);
876		goto bad;
877	}
878
879  hbhcheck:
880	/*
881	 * record address information into m_tag, if we don't have one yet.
882	 * note that we are unable to record it, if the address is not listed
883	 * as our interface address (e.g. multicast addresses, addresses
884	 * within FAITH prefixes and such).
885	 */
886	if (deliverifp) {
887		struct in6_ifaddr *ia6;
888
889 		if ((ia6 = ip6_getdstifaddr(m)) != NULL) {
890			ifa_free(&ia6->ia_ifa);
891		} else {
892			ia6 = in6_ifawithifp(deliverifp, &ip6->ip6_dst);
893			if (ia6) {
894				if (!ip6_setdstifaddr(m, ia6)) {
895					/*
896					 * XXX maybe we should drop the packet here,
897					 * as we could not provide enough information
898					 * to the upper layers.
899					 */
900				}
901				ifa_free(&ia6->ia_ifa);
902			}
903		}
904	}
905
906	/*
907	 * Process Hop-by-Hop options header if it's contained.
908	 * m may be modified in ip6_hopopts_input().
909	 * If a JumboPayload option is included, plen will also be modified.
910	 */
911	plen = (u_int32_t)ntohs(ip6->ip6_plen);
912	if (ip6->ip6_nxt == IPPROTO_HOPOPTS) {
913		int error;
914
915		error = ip6_input_hbh(m, &plen, &rtalert, &off, &nxt, &ours);
916		if (error != 0)
917			goto out;
918	} else
919		nxt = ip6->ip6_nxt;
920
921	/*
922	 * Check that the amount of data in the buffers
923	 * is as at least much as the IPv6 header would have us expect.
924	 * Trim mbufs if longer than we expect.
925	 * Drop packet if shorter than we expect.
926	 */
927	if (m->m_pkthdr.len - sizeof(struct ip6_hdr) < plen) {
928		V_ip6stat.ip6s_tooshort++;
929		in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_truncated);
930		goto bad;
931	}
932	if (m->m_pkthdr.len > sizeof(struct ip6_hdr) + plen) {
933		if (m->m_len == m->m_pkthdr.len) {
934			m->m_len = sizeof(struct ip6_hdr) + plen;
935			m->m_pkthdr.len = sizeof(struct ip6_hdr) + plen;
936		} else
937			m_adj(m, sizeof(struct ip6_hdr) + plen - m->m_pkthdr.len);
938	}
939
940	/*
941	 * Forward if desirable.
942	 */
943	if (V_ip6_mrouter &&
944	    IN6_IS_ADDR_MULTICAST(&ip6->ip6_dst)) {
945		/*
946		 * If we are acting as a multicast router, all
947		 * incoming multicast packets are passed to the
948		 * kernel-level multicast forwarding function.
949		 * The packet is returned (relatively) intact; if
950		 * ip6_mforward() returns a non-zero value, the packet
951		 * must be discarded, else it may be accepted below.
952		 *
953		 * XXX TODO: Check hlim and multicast scope here to avoid
954		 * unnecessarily calling into ip6_mforward().
955		 */
956		if (ip6_mforward &&
957		    ip6_mforward(ip6, m->m_pkthdr.rcvif, m)) {
958			IP6STAT_INC(ip6s_cantforward);
959			in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_discard);
960			goto bad;
961		}
962	} else if (!ours) {
963		ip6_forward(m, srcrt);
964		goto out;
965	}
966
967	ip6 = mtod(m, struct ip6_hdr *);
968
969	/*
970	 * Malicious party may be able to use IPv4 mapped addr to confuse
971	 * tcp/udp stack and bypass security checks (act as if it was from
972	 * 127.0.0.1 by using IPv6 src ::ffff:127.0.0.1).  Be cautious.
973	 *
974	 * For SIIT end node behavior, you may want to disable the check.
975	 * However, you will  become vulnerable to attacks using IPv4 mapped
976	 * source.
977	 */
978	if (IN6_IS_ADDR_V4MAPPED(&ip6->ip6_src) ||
979	    IN6_IS_ADDR_V4MAPPED(&ip6->ip6_dst)) {
980		V_ip6stat.ip6s_badscope++;
981		in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_addrerr);
982		goto bad;
983	}
984
985	/*
986	 * Tell launch routine the next header
987	 */
988	V_ip6stat.ip6s_delivered++;
989	in6_ifstat_inc(deliverifp, ifs6_in_deliver);
990	nest = 0;
991
992	while (nxt != IPPROTO_DONE) {
993		if (V_ip6_hdrnestlimit && (++nest > V_ip6_hdrnestlimit)) {
994			V_ip6stat.ip6s_toomanyhdr++;
995			goto bad;
996		}
997
998		/*
999		 * protection against faulty packet - there should be
1000		 * more sanity checks in header chain processing.
1001		 */
1002		if (m->m_pkthdr.len < off) {
1003			V_ip6stat.ip6s_tooshort++;
1004			in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_truncated);
1005			goto bad;
1006		}
1007
1008#ifdef IPSEC
1009		/*
1010		 * enforce IPsec policy checking if we are seeing last header.
1011		 * note that we do not visit this with protocols with pcb layer
1012		 * code - like udp/tcp/raw ip.
1013		 */
1014		if (ip6_ipsec_input(m, nxt))
1015			goto bad;
1016#endif /* IPSEC */
1017
1018		/*
1019		 * Use mbuf flags to propagate Router Alert option to
1020		 * ICMPv6 layer, as hop-by-hop options have been stripped.
1021		 */
1022		if (nxt == IPPROTO_ICMPV6 && rtalert != ~0)
1023			m->m_flags |= M_RTALERT_MLD;
1024
1025		nxt = (*inet6sw[ip6_protox[nxt]].pr_input)(&m, &off, nxt);
1026	}
1027	goto out;
1028bad:
1029	m_freem(m);
1030out:
1031	if (rin6.ro_rt)
1032		RTFREE(rin6.ro_rt);
1033}
1034
1035/*
1036 * set/grab in6_ifaddr correspond to IPv6 destination address.
1037 * XXX backward compatibility wrapper
1038 *
1039 * XXXRW: We should bump the refcount on ia6 before sticking it in the m_tag,
1040 * and then bump it when the tag is copied, and release it when the tag is
1041 * freed.  Unfortunately, m_tags don't support deep copies (yet), so instead
1042 * we just bump the ia refcount when we receive it.  This should be fixed.
1043 */
1044static struct ip6aux *
1045ip6_setdstifaddr(struct mbuf *m, struct in6_ifaddr *ia6)
1046{
1047	struct ip6aux *ip6a;
1048
1049	ip6a = ip6_addaux(m);
1050	if (ip6a)
1051		ip6a->ip6a_dstia6 = ia6;
1052	return ip6a;	/* NULL if failed to set */
1053}
1054
1055struct in6_ifaddr *
1056ip6_getdstifaddr(struct mbuf *m)
1057{
1058	struct ip6aux *ip6a;
1059	struct in6_ifaddr *ia;
1060
1061	ip6a = ip6_findaux(m);
1062	if (ip6a) {
1063		ia = ip6a->ip6a_dstia6;
1064		ifa_ref(&ia->ia_ifa);
1065		return ia;
1066	} else
1067		return NULL;
1068}
1069
1070/*
1071 * Hop-by-Hop options header processing. If a valid jumbo payload option is
1072 * included, the real payload length will be stored in plenp.
1073 *
1074 * rtalertp - XXX: should be stored more smart way
1075 */
1076static int
1077ip6_hopopts_input(u_int32_t *plenp, u_int32_t *rtalertp,
1078    struct mbuf **mp, int *offp)
1079{
1080	struct mbuf *m = *mp;
1081	int off = *offp, hbhlen;
1082	struct ip6_hbh *hbh;
1083	u_int8_t *opt;
1084
1085	/* validation of the length of the header */
1086#ifndef PULLDOWN_TEST
1087	IP6_EXTHDR_CHECK(m, off, sizeof(*hbh), -1);
1088	hbh = (struct ip6_hbh *)(mtod(m, caddr_t) + off);
1089	hbhlen = (hbh->ip6h_len + 1) << 3;
1090
1091	IP6_EXTHDR_CHECK(m, off, hbhlen, -1);
1092	hbh = (struct ip6_hbh *)(mtod(m, caddr_t) + off);
1093#else
1094	IP6_EXTHDR_GET(hbh, struct ip6_hbh *, m,
1095		sizeof(struct ip6_hdr), sizeof(struct ip6_hbh));
1096	if (hbh == NULL) {
1097		V_ip6stat.ip6s_tooshort++;
1098		return -1;
1099	}
1100	hbhlen = (hbh->ip6h_len + 1) << 3;
1101	IP6_EXTHDR_GET(hbh, struct ip6_hbh *, m, sizeof(struct ip6_hdr),
1102		hbhlen);
1103	if (hbh == NULL) {
1104		V_ip6stat.ip6s_tooshort++;
1105		return -1;
1106	}
1107#endif
1108	off += hbhlen;
1109	hbhlen -= sizeof(struct ip6_hbh);
1110	opt = (u_int8_t *)hbh + sizeof(struct ip6_hbh);
1111
1112	if (ip6_process_hopopts(m, (u_int8_t *)hbh + sizeof(struct ip6_hbh),
1113				hbhlen, rtalertp, plenp) < 0)
1114		return (-1);
1115
1116	*offp = off;
1117	*mp = m;
1118	return (0);
1119}
1120
1121/*
1122 * Search header for all Hop-by-hop options and process each option.
1123 * This function is separate from ip6_hopopts_input() in order to
1124 * handle a case where the sending node itself process its hop-by-hop
1125 * options header. In such a case, the function is called from ip6_output().
1126 *
1127 * The function assumes that hbh header is located right after the IPv6 header
1128 * (RFC2460 p7), opthead is pointer into data content in m, and opthead to
1129 * opthead + hbhlen is located in contiguous memory region.
1130 */
1131int
1132ip6_process_hopopts(struct mbuf *m, u_int8_t *opthead, int hbhlen,
1133    u_int32_t *rtalertp, u_int32_t *plenp)
1134{
1135	struct ip6_hdr *ip6;
1136	int optlen = 0;
1137	u_int8_t *opt = opthead;
1138	u_int16_t rtalert_val;
1139	u_int32_t jumboplen;
1140	const int erroff = sizeof(struct ip6_hdr) + sizeof(struct ip6_hbh);
1141
1142	for (; hbhlen > 0; hbhlen -= optlen, opt += optlen) {
1143		switch (*opt) {
1144		case IP6OPT_PAD1:
1145			optlen = 1;
1146			break;
1147		case IP6OPT_PADN:
1148			if (hbhlen < IP6OPT_MINLEN) {
1149				V_ip6stat.ip6s_toosmall++;
1150				goto bad;
1151			}
1152			optlen = *(opt + 1) + 2;
1153			break;
1154		case IP6OPT_ROUTER_ALERT:
1155			/* XXX may need check for alignment */
1156			if (hbhlen < IP6OPT_RTALERT_LEN) {
1157				V_ip6stat.ip6s_toosmall++;
1158				goto bad;
1159			}
1160			if (*(opt + 1) != IP6OPT_RTALERT_LEN - 2) {
1161				/* XXX stat */
1162				icmp6_error(m, ICMP6_PARAM_PROB,
1163				    ICMP6_PARAMPROB_HEADER,
1164				    erroff + opt + 1 - opthead);
1165				return (-1);
1166			}
1167			optlen = IP6OPT_RTALERT_LEN;
1168			bcopy((caddr_t)(opt + 2), (caddr_t)&rtalert_val, 2);
1169			*rtalertp = ntohs(rtalert_val);
1170			break;
1171		case IP6OPT_JUMBO:
1172			/* XXX may need check for alignment */
1173			if (hbhlen < IP6OPT_JUMBO_LEN) {
1174				V_ip6stat.ip6s_toosmall++;
1175				goto bad;
1176			}
1177			if (*(opt + 1) != IP6OPT_JUMBO_LEN - 2) {
1178				/* XXX stat */
1179				icmp6_error(m, ICMP6_PARAM_PROB,
1180				    ICMP6_PARAMPROB_HEADER,
1181				    erroff + opt + 1 - opthead);
1182				return (-1);
1183			}
1184			optlen = IP6OPT_JUMBO_LEN;
1185
1186			/*
1187			 * IPv6 packets that have non 0 payload length
1188			 * must not contain a jumbo payload option.
1189			 */
1190			ip6 = mtod(m, struct ip6_hdr *);
1191			if (ip6->ip6_plen) {
1192				V_ip6stat.ip6s_badoptions++;
1193				icmp6_error(m, ICMP6_PARAM_PROB,
1194				    ICMP6_PARAMPROB_HEADER,
1195				    erroff + opt - opthead);
1196				return (-1);
1197			}
1198
1199			/*
1200			 * We may see jumbolen in unaligned location, so
1201			 * we'd need to perform bcopy().
1202			 */
1203			bcopy(opt + 2, &jumboplen, sizeof(jumboplen));
1204			jumboplen = (u_int32_t)htonl(jumboplen);
1205
1206#if 1
1207			/*
1208			 * if there are multiple jumbo payload options,
1209			 * *plenp will be non-zero and the packet will be
1210			 * rejected.
1211			 * the behavior may need some debate in ipngwg -
1212			 * multiple options does not make sense, however,
1213			 * there's no explicit mention in specification.
1214			 */
1215			if (*plenp != 0) {
1216				V_ip6stat.ip6s_badoptions++;
1217				icmp6_error(m, ICMP6_PARAM_PROB,
1218				    ICMP6_PARAMPROB_HEADER,
1219				    erroff + opt + 2 - opthead);
1220				return (-1);
1221			}
1222#endif
1223
1224			/*
1225			 * jumbo payload length must be larger than 65535.
1226			 */
1227			if (jumboplen <= IPV6_MAXPACKET) {
1228				V_ip6stat.ip6s_badoptions++;
1229				icmp6_error(m, ICMP6_PARAM_PROB,
1230				    ICMP6_PARAMPROB_HEADER,
1231				    erroff + opt + 2 - opthead);
1232				return (-1);
1233			}
1234			*plenp = jumboplen;
1235
1236			break;
1237		default:		/* unknown option */
1238			if (hbhlen < IP6OPT_MINLEN) {
1239				V_ip6stat.ip6s_toosmall++;
1240				goto bad;
1241			}
1242			optlen = ip6_unknown_opt(opt, m,
1243			    erroff + opt - opthead);
1244			if (optlen == -1)
1245				return (-1);
1246			optlen += 2;
1247			break;
1248		}
1249	}
1250
1251	return (0);
1252
1253  bad:
1254	m_freem(m);
1255	return (-1);
1256}
1257
1258/*
1259 * Unknown option processing.
1260 * The third argument `off' is the offset from the IPv6 header to the option,
1261 * which is necessary if the IPv6 header the and option header and IPv6 header
1262 * is not contiguous in order to return an ICMPv6 error.
1263 */
1264int
1265ip6_unknown_opt(u_int8_t *optp, struct mbuf *m, int off)
1266{
1267	struct ip6_hdr *ip6;
1268
1269	switch (IP6OPT_TYPE(*optp)) {
1270	case IP6OPT_TYPE_SKIP: /* ignore the option */
1271		return ((int)*(optp + 1));
1272	case IP6OPT_TYPE_DISCARD:	/* silently discard */
1273		m_freem(m);
1274		return (-1);
1275	case IP6OPT_TYPE_FORCEICMP: /* send ICMP even if multicasted */
1276		V_ip6stat.ip6s_badoptions++;
1277		icmp6_error(m, ICMP6_PARAM_PROB, ICMP6_PARAMPROB_OPTION, off);
1278		return (-1);
1279	case IP6OPT_TYPE_ICMP: /* send ICMP if not multicasted */
1280		V_ip6stat.ip6s_badoptions++;
1281		ip6 = mtod(m, struct ip6_hdr *);
1282		if (IN6_IS_ADDR_MULTICAST(&ip6->ip6_dst) ||
1283		    (m->m_flags & (M_BCAST|M_MCAST)))
1284			m_freem(m);
1285		else
1286			icmp6_error(m, ICMP6_PARAM_PROB,
1287				    ICMP6_PARAMPROB_OPTION, off);
1288		return (-1);
1289	}
1290
1291	m_freem(m);		/* XXX: NOTREACHED */
1292	return (-1);
1293}
1294
1295/*
1296 * Create the "control" list for this pcb.
1297 * These functions will not modify mbuf chain at all.
1298 *
1299 * With KAME mbuf chain restriction:
1300 * The routine will be called from upper layer handlers like tcp6_input().
1301 * Thus the routine assumes that the caller (tcp6_input) have already
1302 * called IP6_EXTHDR_CHECK() and all the extension headers are located in the
1303 * very first mbuf on the mbuf chain.
1304 *
1305 * ip6_savecontrol_v4 will handle those options that are possible to be
1306 * set on a v4-mapped socket.
1307 * ip6_savecontrol will directly call ip6_savecontrol_v4 to handle those
1308 * options and handle the v6-only ones itself.
1309 */
1310struct mbuf **
1311ip6_savecontrol_v4(struct inpcb *inp, struct mbuf *m, struct mbuf **mp,
1312    int *v4only)
1313{
1314	struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *);
1315
1316#ifdef SO_TIMESTAMP
1317	if ((inp->inp_socket->so_options & SO_TIMESTAMP) != 0) {
1318		struct timeval tv;
1319
1320		microtime(&tv);
1321		*mp = sbcreatecontrol((caddr_t) &tv, sizeof(tv),
1322		    SCM_TIMESTAMP, SOL_SOCKET);
1323		if (*mp)
1324			mp = &(*mp)->m_next;
1325	}
1326#endif
1327
1328#define IS2292(inp, x, y)	(((inp)->inp_flags & IN6P_RFC2292) ? (x) : (y))
1329	/* RFC 2292 sec. 5 */
1330	if ((inp->inp_flags & IN6P_PKTINFO) != 0) {
1331		struct in6_pktinfo pi6;
1332
1333		if ((ip6->ip6_vfc & IPV6_VERSION_MASK) != IPV6_VERSION) {
1334#ifdef INET
1335			struct ip *ip;
1336
1337			ip = mtod(m, struct ip *);
1338			pi6.ipi6_addr.s6_addr32[0] = 0;
1339			pi6.ipi6_addr.s6_addr32[1] = 0;
1340			pi6.ipi6_addr.s6_addr32[2] = IPV6_ADDR_INT32_SMP;
1341			pi6.ipi6_addr.s6_addr32[3] = ip->ip_dst.s_addr;
1342#else
1343			/* We won't hit this code */
1344			bzero(&pi6.ipi6_addr, sizeof(struct in6_addr));
1345#endif
1346		} else {
1347			bcopy(&ip6->ip6_dst, &pi6.ipi6_addr, sizeof(struct in6_addr));
1348			in6_clearscope(&pi6.ipi6_addr);	/* XXX */
1349		}
1350		pi6.ipi6_ifindex =
1351		    (m && m->m_pkthdr.rcvif) ? m->m_pkthdr.rcvif->if_index : 0;
1352
1353		*mp = sbcreatecontrol((caddr_t) &pi6,
1354		    sizeof(struct in6_pktinfo),
1355		    IS2292(inp, IPV6_2292PKTINFO, IPV6_PKTINFO), IPPROTO_IPV6);
1356		if (*mp)
1357			mp = &(*mp)->m_next;
1358	}
1359
1360	if ((inp->inp_flags & IN6P_HOPLIMIT) != 0) {
1361		int hlim;
1362
1363		if ((ip6->ip6_vfc & IPV6_VERSION_MASK) != IPV6_VERSION) {
1364#ifdef INET
1365			struct ip *ip;
1366
1367			ip = mtod(m, struct ip *);
1368			hlim = ip->ip_ttl;
1369#else
1370			/* We won't hit this code */
1371			hlim = 0;
1372#endif
1373		} else {
1374			hlim = ip6->ip6_hlim & 0xff;
1375		}
1376		*mp = sbcreatecontrol((caddr_t) &hlim, sizeof(int),
1377		    IS2292(inp, IPV6_2292HOPLIMIT, IPV6_HOPLIMIT),
1378		    IPPROTO_IPV6);
1379		if (*mp)
1380			mp = &(*mp)->m_next;
1381	}
1382
1383	if ((inp->inp_flags & IN6P_TCLASS) != 0) {
1384		int tclass;
1385
1386		if ((ip6->ip6_vfc & IPV6_VERSION_MASK) != IPV6_VERSION) {
1387#ifdef INET
1388			struct ip *ip;
1389
1390			ip = mtod(m, struct ip *);
1391			tclass = ip->ip_tos;
1392#else
1393			/* We won't hit this code */
1394			tclass = 0;
1395#endif
1396		} else {
1397			u_int32_t flowinfo;
1398
1399			flowinfo = (u_int32_t)ntohl(ip6->ip6_flow & IPV6_FLOWINFO_MASK);
1400			flowinfo >>= 20;
1401			tclass = flowinfo & 0xff;
1402		}
1403		*mp = sbcreatecontrol((caddr_t) &tclass, sizeof(int),
1404		    IPV6_TCLASS, IPPROTO_IPV6);
1405		if (*mp)
1406			mp = &(*mp)->m_next;
1407	}
1408
1409	if (v4only != NULL) {
1410		if ((ip6->ip6_vfc & IPV6_VERSION_MASK) != IPV6_VERSION) {
1411			*v4only = 1;
1412		} else {
1413			*v4only = 0;
1414		}
1415	}
1416
1417	return (mp);
1418}
1419
1420void
1421ip6_savecontrol(struct inpcb *in6p, struct mbuf *m, struct mbuf **mp)
1422{
1423	struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *);
1424	int v4only = 0;
1425
1426	mp = ip6_savecontrol_v4(in6p, m, mp, &v4only);
1427	if (v4only)
1428		return;
1429
1430	/*
1431	 * IPV6_HOPOPTS socket option.  Recall that we required super-user
1432	 * privilege for the option (see ip6_ctloutput), but it might be too
1433	 * strict, since there might be some hop-by-hop options which can be
1434	 * returned to normal user.
1435	 * See also RFC 2292 section 6 (or RFC 3542 section 8).
1436	 */
1437	if ((in6p->inp_flags & IN6P_HOPOPTS) != 0) {
1438		/*
1439		 * Check if a hop-by-hop options header is contatined in the
1440		 * received packet, and if so, store the options as ancillary
1441		 * data. Note that a hop-by-hop options header must be
1442		 * just after the IPv6 header, which is assured through the
1443		 * IPv6 input processing.
1444		 */
1445		if (ip6->ip6_nxt == IPPROTO_HOPOPTS) {
1446			struct ip6_hbh *hbh;
1447			int hbhlen = 0;
1448#ifdef PULLDOWN_TEST
1449			struct mbuf *ext;
1450#endif
1451
1452#ifndef PULLDOWN_TEST
1453			hbh = (struct ip6_hbh *)(ip6 + 1);
1454			hbhlen = (hbh->ip6h_len + 1) << 3;
1455#else
1456			ext = ip6_pullexthdr(m, sizeof(struct ip6_hdr),
1457			    ip6->ip6_nxt);
1458			if (ext == NULL) {
1459				V_ip6stat.ip6s_tooshort++;
1460				return;
1461			}
1462			hbh = mtod(ext, struct ip6_hbh *);
1463			hbhlen = (hbh->ip6h_len + 1) << 3;
1464			if (hbhlen != ext->m_len) {
1465				m_freem(ext);
1466				V_ip6stat.ip6s_tooshort++;
1467				return;
1468			}
1469#endif
1470
1471			/*
1472			 * XXX: We copy the whole header even if a
1473			 * jumbo payload option is included, the option which
1474			 * is to be removed before returning according to
1475			 * RFC2292.
1476			 * Note: this constraint is removed in RFC3542
1477			 */
1478			*mp = sbcreatecontrol((caddr_t)hbh, hbhlen,
1479			    IS2292(in6p, IPV6_2292HOPOPTS, IPV6_HOPOPTS),
1480			    IPPROTO_IPV6);
1481			if (*mp)
1482				mp = &(*mp)->m_next;
1483#ifdef PULLDOWN_TEST
1484			m_freem(ext);
1485#endif
1486		}
1487	}
1488
1489	if ((in6p->inp_flags & (IN6P_RTHDR | IN6P_DSTOPTS)) != 0) {
1490		int nxt = ip6->ip6_nxt, off = sizeof(struct ip6_hdr);
1491
1492		/*
1493		 * Search for destination options headers or routing
1494		 * header(s) through the header chain, and stores each
1495		 * header as ancillary data.
1496		 * Note that the order of the headers remains in
1497		 * the chain of ancillary data.
1498		 */
1499		while (1) {	/* is explicit loop prevention necessary? */
1500			struct ip6_ext *ip6e = NULL;
1501			int elen;
1502#ifdef PULLDOWN_TEST
1503			struct mbuf *ext = NULL;
1504#endif
1505
1506			/*
1507			 * if it is not an extension header, don't try to
1508			 * pull it from the chain.
1509			 */
1510			switch (nxt) {
1511			case IPPROTO_DSTOPTS:
1512			case IPPROTO_ROUTING:
1513			case IPPROTO_HOPOPTS:
1514			case IPPROTO_AH: /* is it possible? */
1515				break;
1516			default:
1517				goto loopend;
1518			}
1519
1520#ifndef PULLDOWN_TEST
1521			if (off + sizeof(*ip6e) > m->m_len)
1522				goto loopend;
1523			ip6e = (struct ip6_ext *)(mtod(m, caddr_t) + off);
1524			if (nxt == IPPROTO_AH)
1525				elen = (ip6e->ip6e_len + 2) << 2;
1526			else
1527				elen = (ip6e->ip6e_len + 1) << 3;
1528			if (off + elen > m->m_len)
1529				goto loopend;
1530#else
1531			ext = ip6_pullexthdr(m, off, nxt);
1532			if (ext == NULL) {
1533				V_ip6stat.ip6s_tooshort++;
1534				return;
1535			}
1536			ip6e = mtod(ext, struct ip6_ext *);
1537			if (nxt == IPPROTO_AH)
1538				elen = (ip6e->ip6e_len + 2) << 2;
1539			else
1540				elen = (ip6e->ip6e_len + 1) << 3;
1541			if (elen != ext->m_len) {
1542				m_freem(ext);
1543				V_ip6stat.ip6s_tooshort++;
1544				return;
1545			}
1546#endif
1547
1548			switch (nxt) {
1549			case IPPROTO_DSTOPTS:
1550				if (!(in6p->inp_flags & IN6P_DSTOPTS))
1551					break;
1552
1553				*mp = sbcreatecontrol((caddr_t)ip6e, elen,
1554				    IS2292(in6p,
1555					IPV6_2292DSTOPTS, IPV6_DSTOPTS),
1556				    IPPROTO_IPV6);
1557				if (*mp)
1558					mp = &(*mp)->m_next;
1559				break;
1560			case IPPROTO_ROUTING:
1561				if (!(in6p->inp_flags & IN6P_RTHDR))
1562					break;
1563
1564				*mp = sbcreatecontrol((caddr_t)ip6e, elen,
1565				    IS2292(in6p, IPV6_2292RTHDR, IPV6_RTHDR),
1566				    IPPROTO_IPV6);
1567				if (*mp)
1568					mp = &(*mp)->m_next;
1569				break;
1570			case IPPROTO_HOPOPTS:
1571			case IPPROTO_AH: /* is it possible? */
1572				break;
1573
1574			default:
1575				/*
1576				 * other cases have been filtered in the above.
1577				 * none will visit this case.  here we supply
1578				 * the code just in case (nxt overwritten or
1579				 * other cases).
1580				 */
1581#ifdef PULLDOWN_TEST
1582				m_freem(ext);
1583#endif
1584				goto loopend;
1585
1586			}
1587
1588			/* proceed with the next header. */
1589			off += elen;
1590			nxt = ip6e->ip6e_nxt;
1591			ip6e = NULL;
1592#ifdef PULLDOWN_TEST
1593			m_freem(ext);
1594			ext = NULL;
1595#endif
1596		}
1597	  loopend:
1598		;
1599	}
1600}
1601#undef IS2292
1602
1603void
1604ip6_notify_pmtu(struct inpcb *in6p, struct sockaddr_in6 *dst, u_int32_t *mtu)
1605{
1606	struct socket *so;
1607	struct mbuf *m_mtu;
1608	struct ip6_mtuinfo mtuctl;
1609
1610	so =  in6p->inp_socket;
1611
1612	if (mtu == NULL)
1613		return;
1614
1615#ifdef DIAGNOSTIC
1616	if (so == NULL)		/* I believe this is impossible */
1617		panic("ip6_notify_pmtu: socket is NULL");
1618#endif
1619
1620	bzero(&mtuctl, sizeof(mtuctl));	/* zero-clear for safety */
1621	mtuctl.ip6m_mtu = *mtu;
1622	mtuctl.ip6m_addr = *dst;
1623	if (sa6_recoverscope(&mtuctl.ip6m_addr))
1624		return;
1625
1626	if ((m_mtu = sbcreatecontrol((caddr_t)&mtuctl, sizeof(mtuctl),
1627	    IPV6_PATHMTU, IPPROTO_IPV6)) == NULL)
1628		return;
1629
1630	if (sbappendaddr(&so->so_rcv, (struct sockaddr *)dst, NULL, m_mtu)
1631	    == 0) {
1632		m_freem(m_mtu);
1633		/* XXX: should count statistics */
1634	} else
1635		sorwakeup(so);
1636
1637	return;
1638}
1639
1640#ifdef PULLDOWN_TEST
1641/*
1642 * pull single extension header from mbuf chain.  returns single mbuf that
1643 * contains the result, or NULL on error.
1644 */
1645static struct mbuf *
1646ip6_pullexthdr(struct mbuf *m, size_t off, int nxt)
1647{
1648	struct ip6_ext ip6e;
1649	size_t elen;
1650	struct mbuf *n;
1651
1652#ifdef DIAGNOSTIC
1653	switch (nxt) {
1654	case IPPROTO_DSTOPTS:
1655	case IPPROTO_ROUTING:
1656	case IPPROTO_HOPOPTS:
1657	case IPPROTO_AH: /* is it possible? */
1658		break;
1659	default:
1660		printf("ip6_pullexthdr: invalid nxt=%d\n", nxt);
1661	}
1662#endif
1663
1664	m_copydata(m, off, sizeof(ip6e), (caddr_t)&ip6e);
1665	if (nxt == IPPROTO_AH)
1666		elen = (ip6e.ip6e_len + 2) << 2;
1667	else
1668		elen = (ip6e.ip6e_len + 1) << 3;
1669
1670	MGET(n, M_NOWAIT, MT_DATA);
1671	if (n && elen >= MLEN) {
1672		MCLGET(n, M_NOWAIT);
1673		if ((n->m_flags & M_EXT) == 0) {
1674			m_free(n);
1675			n = NULL;
1676		}
1677	}
1678	if (!n)
1679		return NULL;
1680
1681	n->m_len = 0;
1682	if (elen >= M_TRAILINGSPACE(n)) {
1683		m_free(n);
1684		return NULL;
1685	}
1686
1687	m_copydata(m, off, elen, mtod(n, caddr_t));
1688	n->m_len = elen;
1689	return n;
1690}
1691#endif
1692
1693/*
1694 * Get pointer to the previous header followed by the header
1695 * currently processed.
1696 * XXX: This function supposes that
1697 *	M includes all headers,
1698 *	the next header field and the header length field of each header
1699 *	are valid, and
1700 *	the sum of each header length equals to OFF.
1701 * Because of these assumptions, this function must be called very
1702 * carefully. Moreover, it will not be used in the near future when
1703 * we develop `neater' mechanism to process extension headers.
1704 */
1705char *
1706ip6_get_prevhdr(struct mbuf *m, int off)
1707{
1708	struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *);
1709
1710	if (off == sizeof(struct ip6_hdr))
1711		return (&ip6->ip6_nxt);
1712	else {
1713		int len, nxt;
1714		struct ip6_ext *ip6e = NULL;
1715
1716		nxt = ip6->ip6_nxt;
1717		len = sizeof(struct ip6_hdr);
1718		while (len < off) {
1719			ip6e = (struct ip6_ext *)(mtod(m, caddr_t) + len);
1720
1721			switch (nxt) {
1722			case IPPROTO_FRAGMENT:
1723				len += sizeof(struct ip6_frag);
1724				break;
1725			case IPPROTO_AH:
1726				len += (ip6e->ip6e_len + 2) << 2;
1727				break;
1728			default:
1729				len += (ip6e->ip6e_len + 1) << 3;
1730				break;
1731			}
1732			nxt = ip6e->ip6e_nxt;
1733		}
1734		if (ip6e)
1735			return (&ip6e->ip6e_nxt);
1736		else
1737			return NULL;
1738	}
1739}
1740
1741/*
1742 * get next header offset.  m will be retained.
1743 */
1744int
1745ip6_nexthdr(struct mbuf *m, int off, int proto, int *nxtp)
1746{
1747	struct ip6_hdr ip6;
1748	struct ip6_ext ip6e;
1749	struct ip6_frag fh;
1750
1751	/* just in case */
1752	if (m == NULL)
1753		panic("ip6_nexthdr: m == NULL");
1754	if ((m->m_flags & M_PKTHDR) == 0 || m->m_pkthdr.len < off)
1755		return -1;
1756
1757	switch (proto) {
1758	case IPPROTO_IPV6:
1759		if (m->m_pkthdr.len < off + sizeof(ip6))
1760			return -1;
1761		m_copydata(m, off, sizeof(ip6), (caddr_t)&ip6);
1762		if (nxtp)
1763			*nxtp = ip6.ip6_nxt;
1764		off += sizeof(ip6);
1765		return off;
1766
1767	case IPPROTO_FRAGMENT:
1768		/*
1769		 * terminate parsing if it is not the first fragment,
1770		 * it does not make sense to parse through it.
1771		 */
1772		if (m->m_pkthdr.len < off + sizeof(fh))
1773			return -1;
1774		m_copydata(m, off, sizeof(fh), (caddr_t)&fh);
1775		/* IP6F_OFF_MASK = 0xfff8(BigEndian), 0xf8ff(LittleEndian) */
1776		if (fh.ip6f_offlg & IP6F_OFF_MASK)
1777			return -1;
1778		if (nxtp)
1779			*nxtp = fh.ip6f_nxt;
1780		off += sizeof(struct ip6_frag);
1781		return off;
1782
1783	case IPPROTO_AH:
1784		if (m->m_pkthdr.len < off + sizeof(ip6e))
1785			return -1;
1786		m_copydata(m, off, sizeof(ip6e), (caddr_t)&ip6e);
1787		if (nxtp)
1788			*nxtp = ip6e.ip6e_nxt;
1789		off += (ip6e.ip6e_len + 2) << 2;
1790		return off;
1791
1792	case IPPROTO_HOPOPTS:
1793	case IPPROTO_ROUTING:
1794	case IPPROTO_DSTOPTS:
1795		if (m->m_pkthdr.len < off + sizeof(ip6e))
1796			return -1;
1797		m_copydata(m, off, sizeof(ip6e), (caddr_t)&ip6e);
1798		if (nxtp)
1799			*nxtp = ip6e.ip6e_nxt;
1800		off += (ip6e.ip6e_len + 1) << 3;
1801		return off;
1802
1803	case IPPROTO_NONE:
1804	case IPPROTO_ESP:
1805	case IPPROTO_IPCOMP:
1806		/* give up */
1807		return -1;
1808
1809	default:
1810		return -1;
1811	}
1812
1813	return -1;
1814}
1815
1816/*
1817 * get offset for the last header in the chain.  m will be kept untainted.
1818 */
1819int
1820ip6_lasthdr(struct mbuf *m, int off, int proto, int *nxtp)
1821{
1822	int newoff;
1823	int nxt;
1824
1825	if (!nxtp) {
1826		nxt = -1;
1827		nxtp = &nxt;
1828	}
1829	while (1) {
1830		newoff = ip6_nexthdr(m, off, proto, nxtp);
1831		if (newoff < 0)
1832			return off;
1833		else if (newoff < off)
1834			return -1;	/* invalid */
1835		else if (newoff == off)
1836			return newoff;
1837
1838		off = newoff;
1839		proto = *nxtp;
1840	}
1841}
1842
1843static struct ip6aux *
1844ip6_addaux(struct mbuf *m)
1845{
1846	struct m_tag *mtag;
1847
1848	mtag = m_tag_find(m, PACKET_TAG_IPV6_INPUT, NULL);
1849	if (!mtag) {
1850		mtag = m_tag_get(PACKET_TAG_IPV6_INPUT, sizeof(struct ip6aux),
1851		    M_NOWAIT);
1852		if (mtag) {
1853			m_tag_prepend(m, mtag);
1854			bzero(mtag + 1, sizeof(struct ip6aux));
1855		}
1856	}
1857	return mtag ? (struct ip6aux *)(mtag + 1) : NULL;
1858}
1859
1860static struct ip6aux *
1861ip6_findaux(struct mbuf *m)
1862{
1863	struct m_tag *mtag;
1864
1865	mtag = m_tag_find(m, PACKET_TAG_IPV6_INPUT, NULL);
1866	return mtag ? (struct ip6aux *)(mtag + 1) : NULL;
1867}
1868
1869static void
1870ip6_delaux(struct mbuf *m)
1871{
1872	struct m_tag *mtag;
1873
1874	mtag = m_tag_find(m, PACKET_TAG_IPV6_INPUT, NULL);
1875	if (mtag)
1876		m_tag_delete(m, mtag);
1877}
1878
1879/*
1880 * System control for IP6
1881 */
1882
1883u_char	inet6ctlerrmap[PRC_NCMDS] = {
1884	0,		0,		0,		0,
1885	0,		EMSGSIZE,	EHOSTDOWN,	EHOSTUNREACH,
1886	EHOSTUNREACH,	EHOSTUNREACH,	ECONNREFUSED,	ECONNREFUSED,
1887	EMSGSIZE,	EHOSTUNREACH,	0,		0,
1888	0,		0,		0,		0,
1889	ENOPROTOOPT
1890};
1891