1/*-
2 * SPDX-License-Identifier: BSD-3-Clause
3 *
4 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the project nor the names of its contributors
16 *    may be used to endorse or promote products derived from this software
17 *    without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 *
31 *	$KAME: in6_rmx.c,v 1.11 2001/07/26 06:53:16 jinmei Exp $
32 */
33
34/*-
35 * Copyright 1994, 1995 Massachusetts Institute of Technology
36 *
37 * Permission to use, copy, modify, and distribute this software and
38 * its documentation for any purpose and without fee is hereby
39 * granted, provided that both the above copyright notice and this
40 * permission notice appear in all copies, that both the above
41 * copyright notice and this permission notice appear in all
42 * supporting documentation, and that the name of M.I.T. not be used
43 * in advertising or publicity pertaining to distribution of the
44 * software without specific, written prior permission.  M.I.T. makes
45 * no representations about the suitability of this software for any
46 * purpose.  It is provided "as is" without express or implied
47 * warranty.
48 *
49 * THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''.  M.I.T. DISCLAIMS
50 * ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE,
51 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
52 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT
53 * SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
54 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
55 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
56 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
57 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
58 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
59 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
60 * SUCH DAMAGE.
61 *
62 */
63
64#include <sys/cdefs.h>
65__FBSDID("$FreeBSD$");
66
67#include <sys/param.h>
68#include <sys/systm.h>
69#include <sys/kernel.h>
70#include <sys/lock.h>
71#include <sys/queue.h>
72#include <sys/socket.h>
73#include <sys/socketvar.h>
74#include <sys/mbuf.h>
75#include <sys/rwlock.h>
76#include <sys/syslog.h>
77#include <sys/callout.h>
78
79#include <net/if.h>
80#include <net/if_var.h>
81#include <net/route.h>
82#include <net/route_var.h>
83
84#include <netinet/in.h>
85#include <netinet/ip_var.h>
86#include <netinet/in_var.h>
87
88#include <netinet/ip6.h>
89#include <netinet6/ip6_var.h>
90
91#include <netinet/icmp6.h>
92#include <netinet6/nd6.h>
93
94#include <netinet/tcp.h>
95#include <netinet/tcp_seq.h>
96#include <netinet/tcp_timer.h>
97#include <netinet/tcp_var.h>
98
99extern int	in6_inithead(void **head, int off, u_int fibnum);
100#ifdef VIMAGE
101extern int	in6_detachhead(void **head, int off);
102#endif
103
104/*
105 * Do what we need to do when inserting a route.
106 */
107static struct radix_node *
108in6_addroute(void *v_arg, void *n_arg, struct radix_head *head,
109    struct radix_node *treenodes)
110{
111	struct rtentry *rt = (struct rtentry *)treenodes;
112	struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)rt_key(rt);
113
114	if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr))
115		rt->rt_flags |= RTF_MULTICAST;
116
117	/*
118	 * A little bit of help for both IPv6 output and input:
119	 *   For local addresses, we make sure that RTF_LOCAL is set,
120	 *   with the thought that this might one day be used to speed up
121	 *   ip_input().
122	 *
123	 * We also mark routes to multicast addresses as such, because
124	 * it's easy to do and might be useful (but this is much more
125	 * dubious since it's so easy to inspect the address).  (This
126	 * is done above.)
127	 *
128	 * XXX
129	 * should elaborate the code.
130	 */
131	if (rt->rt_flags & RTF_HOST) {
132		if (IN6_ARE_ADDR_EQUAL(&satosin6(rt->rt_ifa->ifa_addr)
133					->sin6_addr,
134				       &sin6->sin6_addr)) {
135			rt->rt_flags |= RTF_LOCAL;
136		}
137	}
138
139	if (rt->rt_ifp != NULL) {
140
141		/*
142		 * Check route MTU:
143		 * inherit interface MTU if not set or
144		 * check if MTU is too large.
145		 */
146		if (rt->rt_mtu == 0) {
147			rt->rt_mtu = IN6_LINKMTU(rt->rt_ifp);
148		} else if (rt->rt_mtu > IN6_LINKMTU(rt->rt_ifp))
149			rt->rt_mtu = IN6_LINKMTU(rt->rt_ifp);
150	}
151
152	return (rn_addroute(v_arg, n_arg, head, treenodes));
153}
154
155/*
156 * Initialize our routing tree.
157 */
158
159int
160in6_inithead(void **head, int off, u_int fibnum)
161{
162	struct rib_head *rh;
163
164	rh = rt_table_init(offsetof(struct sockaddr_in6, sin6_addr) << 3,
165	    AF_INET6, fibnum);
166	if (rh == NULL)
167		return (0);
168
169	rh->rnh_addaddr = in6_addroute;
170	*head = (void *)rh;
171
172	return (1);
173}
174
175#ifdef VIMAGE
176int
177in6_detachhead(void **head, int off)
178{
179
180	rt_table_destroy((struct rib_head *)(*head));
181
182	return (1);
183}
184#endif
185
186/*
187 * Extended API for IPv6 FIB support.
188 */
189int
190in6_rtrequest(int req, struct sockaddr *dst, struct sockaddr *gw,
191    struct sockaddr *mask, int flags, struct rtentry **ret_nrt, u_int fibnum)
192{
193
194	return (rtrequest_fib(req, dst, gw, mask, flags, ret_nrt, fibnum));
195}
196
197void
198in6_rtalloc(struct route_in6 *ro, u_int fibnum)
199{
200
201	rtalloc_ign_fib((struct route *)ro, 0ul, fibnum);
202}
203
204void
205in6_rtalloc_ign(struct route_in6 *ro, u_long ignflags, u_int fibnum)
206{
207
208	rtalloc_ign_fib((struct route *)ro, ignflags, fibnum);
209}
210
211struct rtentry *
212in6_rtalloc1(struct sockaddr *dst, int report, u_long ignflags, u_int fibnum)
213{
214
215	return (rtalloc1_fib(dst, report, ignflags, fibnum));
216}
217