xref: /freebsd/sys/netinet/in.c (revision e52655a939099402bab7e603ced58b17af106e23)
1 /*-
2  * SPDX-License-Identifier: BSD-3-Clause
3  *
4  * Copyright (c) 1982, 1986, 1991, 1993
5  *	The Regents of the University of California.  All rights reserved.
6  * Copyright (C) 2001 WIDE Project.  All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. Neither the name of the University nor the names of its contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  */
32 
33 #include "opt_inet.h"
34 
35 #define IN_HISTORICAL_NETS		/* include class masks */
36 
37 #include <sys/param.h>
38 #include <sys/eventhandler.h>
39 #include <sys/systm.h>
40 #include <sys/sockio.h>
41 #include <sys/malloc.h>
42 #include <sys/priv.h>
43 #include <sys/socket.h>
44 #include <sys/jail.h>
45 #include <sys/kernel.h>
46 #include <sys/lock.h>
47 #include <sys/proc.h>
48 #include <sys/sysctl.h>
49 #include <sys/syslog.h>
50 #include <sys/sx.h>
51 
52 #include <net/if.h>
53 #include <net/if_var.h>
54 #include <net/if_arp.h>
55 #include <net/if_dl.h>
56 #include <net/if_llatbl.h>
57 #include <net/if_private.h>
58 #include <net/if_types.h>
59 #include <net/if_bridgevar.h>
60 #include <net/route.h>
61 #include <net/route/nhop.h>
62 #include <net/route/route_ctl.h>
63 #include <net/vnet.h>
64 
65 #include <netinet/if_ether.h>
66 #include <netinet/in.h>
67 #include <netinet/in_fib.h>
68 #include <netinet/in_var.h>
69 #include <netinet/in_pcb.h>
70 #include <netinet/ip_var.h>
71 #include <netinet/ip_carp.h>
72 #include <netinet/igmp_var.h>
73 #include <netinet/udp.h>
74 #include <netinet/udp_var.h>
75 
76 #ifdef MAC
77 #include <security/mac/mac_framework.h>
78 #endif
79 
80 static int in_aifaddr_ioctl(u_long, caddr_t, struct ifnet *, struct ucred *);
81 static int in_difaddr_ioctl(u_long, caddr_t, struct ifnet *, struct ucred *);
82 static int in_gifaddr_ioctl(u_long, caddr_t, struct ifnet *, struct ucred *);
83 
84 static void	in_socktrim(struct sockaddr_in *);
85 static void	in_purgemaddrs(struct ifnet *);
86 
87 static bool	ia_need_loopback_route(const struct in_ifaddr *);
88 
89 VNET_DEFINE_STATIC(int, nosameprefix);
90 #define	V_nosameprefix			VNET(nosameprefix)
91 SYSCTL_INT(_net_inet_ip, OID_AUTO, no_same_prefix, CTLFLAG_VNET | CTLFLAG_RW,
92 	&VNET_NAME(nosameprefix), 0,
93 	"Refuse to create same prefixes on different interfaces");
94 
95 VNET_DEFINE_STATIC(bool, broadcast_lowest);
96 #define	V_broadcast_lowest		VNET(broadcast_lowest)
97 SYSCTL_BOOL(_net_inet_ip, OID_AUTO, broadcast_lowest, CTLFLAG_VNET | CTLFLAG_RW,
98 	&VNET_NAME(broadcast_lowest), 0,
99 	"Treat lowest address on a subnet (host 0) as broadcast");
100 
101 VNET_DEFINE(bool, ip_allow_net240) = false;
102 #define	V_ip_allow_net240		VNET(ip_allow_net240)
103 SYSCTL_BOOL(_net_inet_ip, OID_AUTO, allow_net240,
104 	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip_allow_net240), 0,
105 	"Allow forwarding of and ICMP response to Experimental addresses, aka Class E (240/4)");
106 /* see https://datatracker.ietf.org/doc/draft-schoen-intarea-unicast-240 */
107 
108 VNET_DEFINE(bool, ip_allow_net0) = false;
109 SYSCTL_BOOL(_net_inet_ip, OID_AUTO, allow_net0,
110 	CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(ip_allow_net0), 0,
111 	"Allow forwarding of and ICMP response to addresses in network 0/8");
112 /* see https://datatracker.ietf.org/doc/draft-schoen-intarea-unicast-0 */
113 
114 VNET_DEFINE(uint32_t, in_loopback_mask) = IN_LOOPBACK_MASK_DFLT;
115 #define	V_in_loopback_mask	VNET(in_loopback_mask)
116 static int sysctl_loopback_prefixlen(SYSCTL_HANDLER_ARGS);
117 SYSCTL_PROC(_net_inet_ip, OID_AUTO, loopback_prefixlen,
118 	CTLFLAG_VNET | CTLTYPE_INT | CTLFLAG_RW,
119 	NULL, 0, sysctl_loopback_prefixlen, "I",
120 	"Prefix length of address space reserved for loopback");
121 /* see https://datatracker.ietf.org/doc/draft-schoen-intarea-unicast-127 */
122 
123 VNET_DECLARE(struct inpcbinfo, ripcbinfo);
124 #define	V_ripcbinfo			VNET(ripcbinfo)
125 
126 static struct sx in_control_sx;
127 SX_SYSINIT(in_control_sx, &in_control_sx, "in_control");
128 
129 /*
130  * Return true if an internet address is for a ``local'' host
131  * (one to which we have a connection).
132  */
133 bool
in_localaddr(struct in_addr in)134 in_localaddr(struct in_addr in)
135 {
136 	u_long i = ntohl(in.s_addr);
137 	struct in_ifaddr *ia;
138 
139 	NET_EPOCH_ASSERT();
140 
141 	CK_STAILQ_FOREACH(ia, &V_in_ifaddrhead, ia_link) {
142 		if ((i & ia->ia_subnetmask) == ia->ia_subnet)
143 			return (true);
144 	}
145 
146 	return (false);
147 }
148 
149 /*
150  * Return true if an internet address is for the local host and configured
151  * on one of its interfaces.
152  */
153 bool
in_localip(struct in_addr in)154 in_localip(struct in_addr in)
155 {
156 	struct in_ifaddr *ia;
157 
158 	NET_EPOCH_ASSERT();
159 
160 	CK_LIST_FOREACH(ia, INADDR_HASH(in.s_addr), ia_hash)
161 		if (IA_SIN(ia)->sin_addr.s_addr == in.s_addr)
162 			return (true);
163 
164 	return (false);
165 }
166 
167 /*
168  * Like in_localip(), but FIB-aware and carp(4)-aware.
169  */
170 bool
in_localip_fib(struct in_addr in,uint16_t fib)171 in_localip_fib(struct in_addr in, uint16_t fib)
172 {
173 	struct in_ifaddr *ia;
174 
175 	NET_EPOCH_ASSERT();
176 
177 	CK_LIST_FOREACH(ia, INADDR_HASH(in.s_addr), ia_hash)
178 		if (IA_SIN(ia)->sin_addr.s_addr == in.s_addr &&
179 		    (ia->ia_ifa.ifa_carp == NULL ||
180 		    carp_master_p(&ia->ia_ifa)) &&
181 		    ia->ia_ifa.ifa_ifp->if_fib == fib)
182 			return (true);
183 
184 	return (false);
185 }
186 
187 /*
188  * Return true if an internet address is configured on an interface.
189  */
190 bool
in_ifhasaddr(struct ifnet * ifp,struct in_addr in)191 in_ifhasaddr(struct ifnet *ifp, struct in_addr in)
192 {
193 	struct ifaddr *ifa;
194 	struct in_ifaddr *ia;
195 
196 	NET_EPOCH_ASSERT();
197 
198 	CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
199 		if (ifa->ifa_addr->sa_family != AF_INET)
200 			continue;
201 		ia = (struct in_ifaddr *)ifa;
202 		if (ia->ia_addr.sin_addr.s_addr == in.s_addr)
203 			return (true);
204 	}
205 
206 	return (false);
207 }
208 
209 /*
210  * Return the first configured IPv4 address on the given ifnet.
211  * Replaces deprecated IFP_TO_IA() from 4.3BSD.
212  * Used only by IPv4 multicast, where source-address selection
213  * has not yet been introduced.
214  *
215  * Returns ifa or NULL.
216  */
217 struct in_ifaddr *
in_ifprimaryaddr(struct ifnet * ifp)218 in_ifprimaryaddr(struct ifnet *ifp)
219 {
220 	struct ifaddr *ifa;
221 
222 	NET_EPOCH_ASSERT();
223 
224 	CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link)
225 		if (ifa->ifa_addr->sa_family == AF_INET)
226 			break;
227 
228 	return ((struct in_ifaddr *)ifa);
229 }
230 
231 /*
232  * Return a reference to the interface address which is different to
233  * the supplied one but with same IP address value.
234  */
235 static struct in_ifaddr *
in_localip_more(struct in_ifaddr * original_ia)236 in_localip_more(struct in_ifaddr *original_ia)
237 {
238 	struct epoch_tracker et;
239 	in_addr_t original_addr = IA_SIN(original_ia)->sin_addr.s_addr;
240 	uint32_t original_fib = original_ia->ia_ifa.ifa_ifp->if_fib;
241 	struct in_ifaddr *ia;
242 
243 	NET_EPOCH_ENTER(et);
244 	CK_LIST_FOREACH(ia, INADDR_HASH(original_addr), ia_hash) {
245 		in_addr_t addr = IA_SIN(ia)->sin_addr.s_addr;
246 		uint32_t fib = ia->ia_ifa.ifa_ifp->if_fib;
247 		if (!V_rt_add_addr_allfibs && (original_fib != fib))
248 			continue;
249 		if ((original_ia != ia) && (original_addr == addr)) {
250 			ifa_ref(&ia->ia_ifa);
251 			NET_EPOCH_EXIT(et);
252 			return (ia);
253 		}
254 	}
255 	NET_EPOCH_EXIT(et);
256 
257 	return (NULL);
258 }
259 
260 /*
261  * Tries to find first IPv4 address in the provided fib.
262  * Prefers non-loopback addresses and return loopback IFF
263  * @loopback_ok is set.
264  *
265  * Returns ifa or NULL.
266  */
267 struct in_ifaddr *
in_findlocal(uint32_t fibnum,bool loopback_ok)268 in_findlocal(uint32_t fibnum, bool loopback_ok)
269 {
270 	struct in_ifaddr *ia = NULL, *ia_lo = NULL;
271 
272 	NET_EPOCH_ASSERT();
273 
274 	CK_STAILQ_FOREACH(ia, &V_in_ifaddrhead, ia_link) {
275 		uint32_t ia_fib = ia->ia_ifa.ifa_ifp->if_fib;
276 		if (!V_rt_add_addr_allfibs && (fibnum != ia_fib))
277 			continue;
278 
279 		if (!IN_LOOPBACK(ntohl(IA_SIN(ia)->sin_addr.s_addr)))
280 			break;
281 		if (loopback_ok)
282 			ia_lo = ia;
283 	}
284 
285 	if (ia == NULL)
286 		ia = ia_lo;
287 
288 	return (ia);
289 }
290 
291 /*
292  * Determine whether an IP address is in a reserved set of addresses
293  * that may not be forwarded, or whether datagrams to that destination
294  * may be forwarded.
295  */
296 bool
in_canforward(struct in_addr in)297 in_canforward(struct in_addr in)
298 {
299 	u_long i = ntohl(in.s_addr);
300 
301 	if (IN_MULTICAST(i) || IN_LINKLOCAL(i) || IN_LOOPBACK(i) ||
302 	    in_nullhost(in))
303 		return (false);
304 	if (IN_EXPERIMENTAL(i) && !V_ip_allow_net240)
305 		return (false);
306 	if (IN_ZERONET(i) && !V_ip_allow_net0)
307 		return (false);
308 	return (true);
309 }
310 
311 /*
312  * Sysctl to manage prefix of reserved loopback network; translate
313  * to/from mask.  The mask is always contiguous high-order 1 bits
314  * followed by all 0 bits.
315  */
316 static int
sysctl_loopback_prefixlen(SYSCTL_HANDLER_ARGS)317 sysctl_loopback_prefixlen(SYSCTL_HANDLER_ARGS)
318 {
319 	int error, preflen;
320 
321 	/* ffs is 1-based; compensate. */
322 	preflen = 33 - ffs(V_in_loopback_mask);
323 	error = sysctl_handle_int(oidp, &preflen, 0, req);
324 	if (error || !req->newptr)
325 		return (error);
326 	if (preflen < 8 || preflen > 31)
327 		return (EINVAL);
328 	V_in_loopback_mask = 0xffffffff << (32 - preflen);
329 	return (0);
330 }
331 
332 /*
333  * Trim a mask in a sockaddr
334  */
335 static void
in_socktrim(struct sockaddr_in * ap)336 in_socktrim(struct sockaddr_in *ap)
337 {
338     char *cplim = (char *) &ap->sin_addr;
339     char *cp = (char *) (&ap->sin_addr + 1);
340 
341     ap->sin_len = 0;
342     while (--cp >= cplim)
343 	if (*cp) {
344 	    (ap)->sin_len = cp - (char *) (ap) + 1;
345 	    break;
346 	}
347 }
348 
349 /*
350  * Generic internet control operations (ioctl's).
351  */
352 int
in_control_ioctl(u_long cmd,void * data,struct ifnet * ifp,struct ucred * cred)353 in_control_ioctl(u_long cmd, void *data, struct ifnet *ifp,
354     struct ucred *cred)
355 {
356 	struct ifreq *ifr = (struct ifreq *)data;
357 	struct sockaddr_in *addr = (struct sockaddr_in *)&ifr->ifr_addr;
358 	struct epoch_tracker et;
359 	struct ifaddr *ifa;
360 	struct in_ifaddr *ia;
361 	int error;
362 
363 	if (ifp == NULL)
364 		return (EADDRNOTAVAIL);
365 
366 	/*
367 	 * Filter out 4 ioctls we implement directly.  Forward the rest
368 	 * to specific functions and ifp->if_ioctl().
369 	 */
370 	switch (cmd) {
371 	case SIOCGIFADDR:
372 	case SIOCGIFBRDADDR:
373 	case SIOCGIFDSTADDR:
374 	case SIOCGIFNETMASK:
375 		break;
376 	case SIOCGIFALIAS:
377 		sx_xlock(&in_control_sx);
378 		error = in_gifaddr_ioctl(cmd, data, ifp, cred);
379 		sx_xunlock(&in_control_sx);
380 		return (error);
381 	case SIOCDIFADDR:
382 		sx_xlock(&in_control_sx);
383 		error = in_difaddr_ioctl(cmd, data, ifp, cred);
384 		sx_xunlock(&in_control_sx);
385 		return (error);
386 	case OSIOCAIFADDR:	/* 9.x compat */
387 	case SIOCAIFADDR:
388 		sx_xlock(&in_control_sx);
389 		error = in_aifaddr_ioctl(cmd, data, ifp, cred);
390 		sx_xunlock(&in_control_sx);
391 		return (error);
392 	case SIOCSIFADDR:
393 	case SIOCSIFBRDADDR:
394 	case SIOCSIFDSTADDR:
395 	case SIOCSIFNETMASK:
396 		/* We no longer support that old commands. */
397 		return (EINVAL);
398 	default:
399 		if (ifp->if_ioctl == NULL)
400 			return (EOPNOTSUPP);
401 		return ((*ifp->if_ioctl)(ifp, cmd, data));
402 	}
403 
404 	if (addr->sin_addr.s_addr != INADDR_ANY &&
405 	    prison_check_ip4(cred, &addr->sin_addr) != 0)
406 		return (EADDRNOTAVAIL);
407 
408 	/*
409 	 * Find address for this interface, if it exists.  If an
410 	 * address was specified, find that one instead of the
411 	 * first one on the interface, if possible.
412 	 */
413 	NET_EPOCH_ENTER(et);
414 	CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
415 		if (ifa->ifa_addr->sa_family != AF_INET)
416 			continue;
417 		ia = (struct in_ifaddr *)ifa;
418 		if (ia->ia_addr.sin_addr.s_addr == addr->sin_addr.s_addr)
419 			break;
420 	}
421 	if (ifa == NULL)
422 		CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link)
423 			if (ifa->ifa_addr->sa_family == AF_INET) {
424 				ia = (struct in_ifaddr *)ifa;
425 				if (prison_check_ip4(cred,
426 				    &ia->ia_addr.sin_addr) == 0)
427 					break;
428 			}
429 
430 	if (ifa == NULL) {
431 		NET_EPOCH_EXIT(et);
432 		return (EADDRNOTAVAIL);
433 	}
434 
435 	error = 0;
436 	switch (cmd) {
437 	case SIOCGIFADDR:
438 		*addr = ia->ia_addr;
439 		break;
440 
441 	case SIOCGIFBRDADDR:
442 		if ((ifp->if_flags & IFF_BROADCAST) == 0) {
443 			error = EINVAL;
444 			break;
445 		}
446 		*addr = ia->ia_broadaddr;
447 		break;
448 
449 	case SIOCGIFDSTADDR:
450 		if ((ifp->if_flags & IFF_POINTOPOINT) == 0) {
451 			error = EINVAL;
452 			break;
453 		}
454 		*addr = ia->ia_dstaddr;
455 		break;
456 
457 	case SIOCGIFNETMASK:
458 		*addr = ia->ia_sockmask;
459 		break;
460 	}
461 
462 	NET_EPOCH_EXIT(et);
463 
464 	return (error);
465 }
466 
467 int
in_mask2len(struct in_addr * mask)468 in_mask2len(struct in_addr *mask)
469 {
470 	int x, y;
471 	u_char *p;
472 
473 	p = (u_char *)mask;
474 	for (x = 0; x < sizeof(*mask); x++) {
475 		if (p[x] != 0xff)
476 			break;
477 	}
478 	y = 0;
479 	if (x < sizeof(*mask)) {
480 		for (y = 0; y < 8; y++) {
481 			if ((p[x] & (0x80 >> y)) == 0)
482 				break;
483 		}
484 	}
485 	return (x * 8 + y);
486 }
487 
488 int
in_control(struct socket * so,u_long cmd,void * data,struct ifnet * ifp,struct thread * td)489 in_control(struct socket *so, u_long cmd, void *data, struct ifnet *ifp,
490     struct thread *td)
491 {
492 	return (in_control_ioctl(cmd, data, ifp, td ? td->td_ucred : NULL));
493 }
494 
495 static int
in_aifaddr_ioctl(u_long cmd,caddr_t data,struct ifnet * ifp,struct ucred * cred)496 in_aifaddr_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp, struct ucred *cred)
497 {
498 	const struct in_aliasreq *ifra = (struct in_aliasreq *)data;
499 	const struct sockaddr_in *addr = &ifra->ifra_addr;
500 	const struct sockaddr_in *broadaddr = &ifra->ifra_broadaddr;
501 	const struct sockaddr_in *mask = &ifra->ifra_mask;
502 	const struct sockaddr_in *dstaddr = &ifra->ifra_dstaddr;
503 	const int vhid = (cmd == SIOCAIFADDR) ? ifra->ifra_vhid : 0;
504 	struct epoch_tracker et;
505 	struct ifaddr *ifa;
506 	struct in_ifaddr *ia;
507 	bool iaIsFirst;
508 	int error = 0;
509 
510 	error = priv_check_cred(cred, PRIV_NET_ADDIFADDR);
511 	if (error)
512 		return (error);
513 
514 	/*
515 	 * ifra_addr must be present and be of INET family.
516 	 * ifra_broadaddr/ifra_dstaddr and ifra_mask are optional.
517 	 */
518 	if (addr->sin_len != sizeof(struct sockaddr_in) ||
519 	    addr->sin_family != AF_INET)
520 		return (EINVAL);
521 	if (broadaddr->sin_len != 0 &&
522 	    (broadaddr->sin_len != sizeof(struct sockaddr_in) ||
523 	    broadaddr->sin_family != AF_INET))
524 		return (EINVAL);
525 	if (mask->sin_len != 0 &&
526 	    (mask->sin_len != sizeof(struct sockaddr_in) ||
527 	    mask->sin_family != AF_INET))
528 		return (EINVAL);
529 	if ((ifp->if_flags & IFF_POINTOPOINT) &&
530 	    (dstaddr->sin_len != sizeof(struct sockaddr_in) ||
531 	     dstaddr->sin_addr.s_addr == INADDR_ANY))
532 		return (EDESTADDRREQ);
533 	if (vhid != 0 && carp_attach_p == NULL)
534 		return (EPROTONOSUPPORT);
535 
536 #ifdef MAC
537 	/* Check if a MAC policy disallows setting the IPv4 address. */
538 	error = mac_inet_check_add_addr(cred, &addr->sin_addr, ifp);
539 	if (error != 0)
540 		return (error);
541 #endif
542 
543 	/*
544 	 * Check if bridge wants to allow adding addrs to member interfaces.
545 	 */
546 	if (ifp->if_bridge != NULL && ifp->if_type != IFT_GIF &&
547 	    bridge_member_ifaddrs_p != NULL) {
548 		if (bridge_member_ifaddrs_p())
549 			if_printf(ifp, "WARNING: Assigning an IP address to "
550 			    "an interface which is also a bridge member is "
551 			    "deprecated and will be unsupported in a future "
552 			    "release.\n");
553 		else
554 			return (EINVAL);
555 	}
556 
557 	/*
558 	 * See whether address already exist.
559 	 */
560 	iaIsFirst = true;
561 	ia = NULL;
562 	NET_EPOCH_ENTER(et);
563 	CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
564 		struct in_ifaddr *it;
565 
566 		if (ifa->ifa_addr->sa_family != AF_INET)
567 			continue;
568 
569 		it = (struct in_ifaddr *)ifa;
570 		if (it->ia_addr.sin_addr.s_addr == addr->sin_addr.s_addr &&
571 		    prison_check_ip4(cred, &addr->sin_addr) == 0)
572 			ia = it;
573 		else
574 			iaIsFirst = false;
575 	}
576 	NET_EPOCH_EXIT(et);
577 
578 	if (ia != NULL)
579 		(void )in_difaddr_ioctl(cmd, data, ifp, cred);
580 
581 	ifa = ifa_alloc(sizeof(struct in_ifaddr), M_WAITOK);
582 	ia = (struct in_ifaddr *)ifa;
583 	ifa->ifa_addr = (struct sockaddr *)&ia->ia_addr;
584 	ifa->ifa_dstaddr = (struct sockaddr *)&ia->ia_dstaddr;
585 	ifa->ifa_netmask = (struct sockaddr *)&ia->ia_sockmask;
586 	callout_init_rw(&ia->ia_garp_timer, &ifp->if_addr_lock,
587 	    CALLOUT_RETURNUNLOCKED);
588 
589 	ia->ia_ifp = ifp;
590 	ia->ia_addr = *addr;
591 	if (mask->sin_len != 0) {
592 		ia->ia_sockmask = *mask;
593 		ia->ia_subnetmask = ntohl(ia->ia_sockmask.sin_addr.s_addr);
594 	} else {
595 		in_addr_t i = ntohl(addr->sin_addr.s_addr);
596 
597 		/*
598 	 	 * If netmask isn't supplied, use historical default.
599 		 * This is deprecated for interfaces other than loopback
600 		 * or point-to-point; warn in other cases.  In the future
601 		 * we should return an error rather than warning.
602 	 	 */
603 		if ((ifp->if_flags & (IFF_POINTOPOINT | IFF_LOOPBACK)) == 0)
604 			printf("%s: set address: WARNING: network mask "
605 			     "should be specified; using historical default\n",
606 			     ifp->if_xname);
607 		if (IN_CLASSA(i))
608 			ia->ia_subnetmask = IN_CLASSA_NET;
609 		else if (IN_CLASSB(i))
610 			ia->ia_subnetmask = IN_CLASSB_NET;
611 		else
612 			ia->ia_subnetmask = IN_CLASSC_NET;
613 		ia->ia_sockmask.sin_addr.s_addr = htonl(ia->ia_subnetmask);
614 	}
615 	ia->ia_subnet = ntohl(addr->sin_addr.s_addr) & ia->ia_subnetmask;
616 	in_socktrim(&ia->ia_sockmask);
617 
618 	if (ifp->if_flags & IFF_BROADCAST) {
619 		if (broadaddr->sin_len != 0) {
620 			ia->ia_broadaddr = *broadaddr;
621 		} else if (ia->ia_subnetmask == IN_RFC3021_MASK) {
622 			ia->ia_broadaddr.sin_addr.s_addr = INADDR_BROADCAST;
623 			ia->ia_broadaddr.sin_len = sizeof(struct sockaddr_in);
624 			ia->ia_broadaddr.sin_family = AF_INET;
625 		} else {
626 			ia->ia_broadaddr.sin_addr.s_addr =
627 			    htonl(ia->ia_subnet | ~ia->ia_subnetmask);
628 			ia->ia_broadaddr.sin_len = sizeof(struct sockaddr_in);
629 			ia->ia_broadaddr.sin_family = AF_INET;
630 		}
631 	}
632 
633 	if (ifp->if_flags & IFF_POINTOPOINT)
634 		ia->ia_dstaddr = *dstaddr;
635 
636 	if (vhid != 0) {
637 		error = (*carp_attach_p)(&ia->ia_ifa, vhid);
638 		if (error)
639 			return (error);
640 	}
641 
642 	/* if_addrhead is already referenced by ifa_alloc() */
643 	IF_ADDR_WLOCK(ifp);
644 	CK_STAILQ_INSERT_TAIL(&ifp->if_addrhead, ifa, ifa_link);
645 	IF_ADDR_WUNLOCK(ifp);
646 
647 	ifa_ref(ifa);			/* in_ifaddrhead */
648 	sx_assert(&in_control_sx, SA_XLOCKED);
649 	CK_STAILQ_INSERT_TAIL(&V_in_ifaddrhead, ia, ia_link);
650 	CK_LIST_INSERT_HEAD(INADDR_HASH(ia->ia_addr.sin_addr.s_addr), ia,
651 	    ia_hash);
652 
653 	/*
654 	 * Give the interface a chance to initialize
655 	 * if this is its first address,
656 	 * and to validate the address if necessary.
657 	 */
658 	if (ifp->if_ioctl != NULL) {
659 		error = (*ifp->if_ioctl)(ifp, SIOCSIFADDR, (caddr_t)ia);
660 		if (error)
661 			goto fail1;
662 	}
663 
664 	/*
665 	 * Add route for the network.
666 	 */
667 	if (vhid == 0) {
668 		error = in_addprefix(ia);
669 		if (error)
670 			goto fail1;
671 	}
672 
673 	/*
674 	 * Add a loopback route to self.
675 	 */
676 	if (vhid == 0 && ia_need_loopback_route(ia)) {
677 		struct in_ifaddr *eia;
678 
679 		eia = in_localip_more(ia);
680 
681 		if (eia == NULL) {
682 			error = ifa_add_loopback_route((struct ifaddr *)ia,
683 			    (struct sockaddr *)&ia->ia_addr);
684 			if (error)
685 				goto fail2;
686 		} else
687 			ifa_free(&eia->ia_ifa);
688 	}
689 
690 	if (iaIsFirst && (ifp->if_flags & IFF_MULTICAST)) {
691 		struct in_addr allhosts_addr;
692 		struct in_ifinfo *ii;
693 
694 		ii = (struct in_ifinfo *)ifp->if_inet;
695 		allhosts_addr.s_addr = htonl(INADDR_ALLHOSTS_GROUP);
696 
697 		error = in_joingroup(ifp, &allhosts_addr, NULL,
698 			&ii->ii_allhosts);
699 	}
700 
701 	/*
702 	 * Note: we don't need extra reference for ifa, since we called
703 	 * with sx lock held, and ifaddr can not be deleted in concurrent
704 	 * thread.
705 	 */
706 	EVENTHANDLER_INVOKE(ifaddr_event_ext, ifp, ifa, IFADDR_EVENT_ADD);
707 
708 	return (error);
709 
710 fail2:
711 	if (vhid == 0)
712 		(void )in_scrubprefix(ia, LLE_STATIC);
713 
714 fail1:
715 	if (ia->ia_ifa.ifa_carp)
716 		(*carp_detach_p)(&ia->ia_ifa, false);
717 
718 	IF_ADDR_WLOCK(ifp);
719 	CK_STAILQ_REMOVE(&ifp->if_addrhead, &ia->ia_ifa, ifaddr, ifa_link);
720 	IF_ADDR_WUNLOCK(ifp);
721 	ifa_free(&ia->ia_ifa);		/* if_addrhead */
722 
723 	sx_assert(&in_control_sx, SA_XLOCKED);
724 	CK_STAILQ_REMOVE(&V_in_ifaddrhead, ia, in_ifaddr, ia_link);
725 	CK_LIST_REMOVE(ia, ia_hash);
726 	ifa_free(&ia->ia_ifa);		/* in_ifaddrhead */
727 
728 	return (error);
729 }
730 
731 static int
in_difaddr_ioctl(u_long cmd,caddr_t data,struct ifnet * ifp,struct ucred * cred)732 in_difaddr_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp, struct ucred *cred)
733 {
734 	const struct ifreq *ifr = (struct ifreq *)data;
735 	const struct sockaddr_in *addr = (const struct sockaddr_in *)
736 	    &ifr->ifr_addr;
737 	struct ifaddr *ifa;
738 	struct in_ifaddr *ia;
739 	bool deleteAny, iaIsLast;
740 	int error;
741 
742 	if (cred != NULL) {
743 		error = priv_check_cred(cred, PRIV_NET_DELIFADDR);
744 		if (error)
745 			return (error);
746 	}
747 
748 	if (addr->sin_len != sizeof(struct sockaddr_in) ||
749 	    addr->sin_family != AF_INET)
750 		deleteAny = true;
751 	else
752 		deleteAny = false;
753 
754 	iaIsLast = true;
755 	ia = NULL;
756 	IF_ADDR_WLOCK(ifp);
757 	CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
758 		struct in_ifaddr *it;
759 
760 		if (ifa->ifa_addr->sa_family != AF_INET)
761 			continue;
762 
763 		it = (struct in_ifaddr *)ifa;
764 		if (deleteAny && ia == NULL && (cred == NULL ||
765 		    prison_check_ip4(cred, &it->ia_addr.sin_addr) == 0))
766 			ia = it;
767 
768 		if (it->ia_addr.sin_addr.s_addr == addr->sin_addr.s_addr &&
769 		    (cred == NULL || prison_check_ip4(cred,
770 		    &addr->sin_addr) == 0))
771 			ia = it;
772 
773 		if (it != ia)
774 			iaIsLast = false;
775 	}
776 
777 	if (ia == NULL) {
778 		IF_ADDR_WUNLOCK(ifp);
779 		return (EADDRNOTAVAIL);
780 	}
781 
782 	CK_STAILQ_REMOVE(&ifp->if_addrhead, &ia->ia_ifa, ifaddr, ifa_link);
783 	IF_ADDR_WUNLOCK(ifp);
784 	ifa_free(&ia->ia_ifa);		/* if_addrhead */
785 
786 	sx_assert(&in_control_sx, SA_XLOCKED);
787 	CK_STAILQ_REMOVE(&V_in_ifaddrhead, ia, in_ifaddr, ia_link);
788 	CK_LIST_REMOVE(ia, ia_hash);
789 
790 	/*
791 	 * in_scrubprefix() kills the interface route.
792 	 */
793 	in_scrubprefix(ia, LLE_STATIC);
794 
795 	/*
796 	 * in_ifadown gets rid of all the rest of
797 	 * the routes.  This is not quite the right
798 	 * thing to do, but at least if we are running
799 	 * a routing process they will come back.
800 	 */
801 	in_ifadown(&ia->ia_ifa, 1);
802 
803 	if (ia->ia_ifa.ifa_carp)
804 		(*carp_detach_p)(&ia->ia_ifa, cmd == SIOCAIFADDR);
805 
806 	/*
807 	 * If this is the last IPv4 address configured on this
808 	 * interface, leave the all-hosts group.
809 	 * No state-change report need be transmitted.
810 	 */
811 	if (iaIsLast && (ifp->if_flags & IFF_MULTICAST)) {
812 		struct in_ifinfo *ii;
813 
814 		ii = (struct in_ifinfo *)ifp->if_inet;
815 		if (ii->ii_allhosts) {
816 			(void)in_leavegroup(ii->ii_allhosts, NULL);
817 			ii->ii_allhosts = NULL;
818 		}
819 	}
820 
821 	IF_ADDR_WLOCK(ifp);
822 	if (callout_stop(&ia->ia_garp_timer) == 1) {
823 		ifa_free(&ia->ia_ifa);
824 	}
825 	IF_ADDR_WUNLOCK(ifp);
826 
827 	EVENTHANDLER_INVOKE(ifaddr_event_ext, ifp, &ia->ia_ifa,
828 	    IFADDR_EVENT_DEL);
829 	ifa_free(&ia->ia_ifa);		/* in_ifaddrhead */
830 
831 	return (0);
832 }
833 
834 static int
in_gifaddr_ioctl(u_long cmd,caddr_t data,struct ifnet * ifp,struct ucred * cred)835 in_gifaddr_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp, struct ucred *cred)
836 {
837 	struct in_aliasreq *ifra = (struct in_aliasreq *)data;
838 	const struct sockaddr_in *addr = &ifra->ifra_addr;
839 	struct epoch_tracker et;
840 	struct ifaddr *ifa;
841 	struct in_ifaddr *ia;
842 
843 	/*
844 	 * ifra_addr must be present and be of INET family.
845 	 */
846 	if (addr->sin_len != sizeof(struct sockaddr_in) ||
847 	    addr->sin_family != AF_INET)
848 		return (EINVAL);
849 
850 	/*
851 	 * See whether address exist.
852 	 */
853 	ia = NULL;
854 	NET_EPOCH_ENTER(et);
855 	CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
856 		struct in_ifaddr *it;
857 
858 		if (ifa->ifa_addr->sa_family != AF_INET)
859 			continue;
860 
861 		it = (struct in_ifaddr *)ifa;
862 		if (it->ia_addr.sin_addr.s_addr == addr->sin_addr.s_addr &&
863 		    prison_check_ip4(cred, &addr->sin_addr) == 0) {
864 			ia = it;
865 			break;
866 		}
867 	}
868 	if (ia == NULL) {
869 		NET_EPOCH_EXIT(et);
870 		return (EADDRNOTAVAIL);
871 	}
872 
873 	ifra->ifra_mask = ia->ia_sockmask;
874 	if ((ifp->if_flags & IFF_POINTOPOINT) &&
875 	    ia->ia_dstaddr.sin_family == AF_INET)
876 		ifra->ifra_dstaddr = ia->ia_dstaddr;
877 	else if ((ifp->if_flags & IFF_BROADCAST) &&
878 	    ia->ia_broadaddr.sin_family == AF_INET)
879 		ifra->ifra_broadaddr = ia->ia_broadaddr;
880 	else
881 		memset(&ifra->ifra_broadaddr, 0,
882 		    sizeof(ifra->ifra_broadaddr));
883 
884 	NET_EPOCH_EXIT(et);
885 	return (0);
886 }
887 
888 static int
in_match_ifaddr(const struct rtentry * rt,const struct nhop_object * nh,void * arg)889 in_match_ifaddr(const struct rtentry *rt, const struct nhop_object *nh, void *arg)
890 {
891 
892 	if (nh->nh_ifa == (struct ifaddr *)arg)
893 		return (1);
894 
895 	return (0);
896 }
897 
898 static int
in_handle_prefix_route(uint32_t fibnum,int cmd,struct sockaddr_in * dst,struct sockaddr_in * netmask,struct ifaddr * ifa,struct ifnet * ifp)899 in_handle_prefix_route(uint32_t fibnum, int cmd,
900     struct sockaddr_in *dst, struct sockaddr_in *netmask, struct ifaddr *ifa,
901     struct ifnet *ifp)
902 {
903 
904 	NET_EPOCH_ASSERT();
905 
906 	/* Prepare gateway */
907 	struct sockaddr_dl_short sdl = {
908 		.sdl_family = AF_LINK,
909 		.sdl_len = sizeof(struct sockaddr_dl_short),
910 		.sdl_type = ifa->ifa_ifp->if_type,
911 		.sdl_index = ifa->ifa_ifp->if_index,
912 	};
913 
914 	struct rt_addrinfo info = {
915 		.rti_ifa = ifa,
916 		.rti_ifp = ifp,
917 		.rti_flags = RTF_PINNED | ((netmask != NULL) ? 0 : RTF_HOST),
918 		.rti_info = {
919 			[RTAX_DST] = (struct sockaddr *)dst,
920 			[RTAX_NETMASK] = (struct sockaddr *)netmask,
921 			[RTAX_GATEWAY] = (struct sockaddr *)&sdl,
922 		},
923 		/* Ensure we delete the prefix IFF prefix ifa matches */
924 		.rti_filter = in_match_ifaddr,
925 		.rti_filterdata = ifa,
926 	};
927 
928 	return (rib_handle_ifaddr_info(fibnum, cmd, &info));
929 }
930 
931 /*
932  * Routing table interaction with interface addresses.
933  *
934  * In general, two types of routes needs to be installed:
935  * a) "interface" or "prefix" route, telling user that the addresses
936  *   behind the ifa prefix are reached directly.
937  * b) "loopback" route installed for the ifa address, telling user that
938  *   the address belongs to local system.
939  *
940  * Handling for (a) and (b) differs in multi-fib aspects, hence they
941  *  are implemented in different functions below.
942  *
943  * The cases above may intersect - /32 interface aliases results in
944  *  the same prefix produced by (a) and (b). This blurs the definition
945  *  of the "loopback" route and complicate interactions. The interaction
946  *  table is defined below. The case numbers are used in the multiple
947  *  functions below to refer to the particular test case.
948  *
949  * There can be multiple options:
950  * 1) Adding address with prefix on non-p2p/non-loopback interface.
951  *  Example: 192.0.2.1/24. Action:
952  *  * add "prefix" route towards 192.0.2.0/24 via @ia interface,
953  *    using @ia as an address source.
954  *  * add "loopback" route towards 192.0.2.1 via V_loif, saving
955  *   @ia ifp in the gateway and using @ia as an address source.
956  *
957  * 2) Adding address with /32 mask to non-p2p/non-loopback interface.
958  *  Example: 192.0.2.2/32. Action:
959  *  * add "prefix" host route via V_loif, using @ia as an address source.
960  *
961  * 3) Adding address with or without prefix to p2p interface.
962  *  Example: 10.0.0.1/24->10.0.0.2. Action:
963  *  * add "prefix" host route towards 10.0.0.2 via this interface, using @ia
964  *    as an address source. Note: no sense in installing full /24 as the interface
965  *    is point-to-point.
966  *  * add "loopback" route towards 10.0.9.1 via V_loif, saving
967  *   @ia ifp in the gateway and using @ia as an address source.
968  *
969  * 4) Adding address with or without prefix to loopback interface.
970  *  Example: 192.0.2.1/24. Action:
971  *  * add "prefix" host route via @ia interface, using @ia as an address source.
972  *    Note: Skip installing /24 prefix as it would introduce TTL loop
973  *    for the traffic destined to these addresses.
974  */
975 
976 /*
977  * Checks if @ia needs to install loopback route to @ia address via
978  *  ifa_maintain_loopback_route().
979  *
980  * Return true on success.
981  */
982 static bool
ia_need_loopback_route(const struct in_ifaddr * ia)983 ia_need_loopback_route(const struct in_ifaddr *ia)
984 {
985 	struct ifnet *ifp = ia->ia_ifp;
986 
987 	/* Case 4: Skip loopback interfaces */
988 	if ((ifp->if_flags & IFF_LOOPBACK) ||
989 	    (ia->ia_addr.sin_addr.s_addr == INADDR_ANY))
990 		return (false);
991 
992 	/* Clash avoidance: Skip p2p interfaces with both addresses are equal */
993 	if ((ifp->if_flags & IFF_POINTOPOINT) &&
994 	    ia->ia_dstaddr.sin_addr.s_addr == ia->ia_addr.sin_addr.s_addr)
995 		return (false);
996 
997 	/* Case 2: skip /32 prefixes */
998 	if (!(ifp->if_flags & IFF_POINTOPOINT) &&
999 	    (ia->ia_sockmask.sin_addr.s_addr == INADDR_BROADCAST))
1000 		return (false);
1001 
1002 	return (true);
1003 }
1004 
1005 /*
1006  * Calculate "prefix" route corresponding to @ia.
1007  */
1008 static void
ia_getrtprefix(const struct in_ifaddr * ia,struct in_addr * prefix,struct in_addr * mask)1009 ia_getrtprefix(const struct in_ifaddr *ia, struct in_addr *prefix, struct in_addr *mask)
1010 {
1011 
1012 	if (ia->ia_ifp->if_flags & IFF_POINTOPOINT) {
1013 		/* Case 3: return host route for dstaddr */
1014 		*prefix = ia->ia_dstaddr.sin_addr;
1015 		mask->s_addr = INADDR_BROADCAST;
1016 	} else if (ia->ia_ifp->if_flags & IFF_LOOPBACK) {
1017 		/* Case 4: return host route for ifaddr */
1018 		*prefix = ia->ia_addr.sin_addr;
1019 		mask->s_addr = INADDR_BROADCAST;
1020 	} else {
1021 		/* Cases 1,2: return actual ia prefix */
1022 		*prefix = ia->ia_addr.sin_addr;
1023 		*mask = ia->ia_sockmask.sin_addr;
1024 		prefix->s_addr &= mask->s_addr;
1025 	}
1026 }
1027 
1028 /*
1029  * Adds or delete interface "prefix" route corresponding to @ifa.
1030  *  Returns 0 on success or errno.
1031  */
1032 static int
in_handle_ifaddr_route(int cmd,struct in_ifaddr * ia)1033 in_handle_ifaddr_route(int cmd, struct in_ifaddr *ia)
1034 {
1035 	struct ifaddr *ifa = &ia->ia_ifa;
1036 	struct in_addr daddr, maddr;
1037 	struct sockaddr_in *pmask;
1038 	struct epoch_tracker et;
1039 	int error;
1040 
1041 	ia_getrtprefix(ia, &daddr, &maddr);
1042 
1043 	struct sockaddr_in mask = {
1044 		.sin_family = AF_INET,
1045 		.sin_len = sizeof(struct sockaddr_in),
1046 		.sin_addr = maddr,
1047 	};
1048 
1049 	pmask = (maddr.s_addr != INADDR_BROADCAST) ? &mask : NULL;
1050 
1051 	struct sockaddr_in dst = {
1052 		.sin_family = AF_INET,
1053 		.sin_len = sizeof(struct sockaddr_in),
1054 		.sin_addr.s_addr = daddr.s_addr & maddr.s_addr,
1055 	};
1056 
1057 	struct ifnet *ifp = ia->ia_ifp;
1058 
1059 	if ((maddr.s_addr == INADDR_BROADCAST) &&
1060 	    (!(ia->ia_ifp->if_flags & (IFF_POINTOPOINT|IFF_LOOPBACK)))) {
1061 		/* Case 2: host route on broadcast interface */
1062 		ifp = V_loif;
1063 	}
1064 
1065 	uint32_t fibnum = ifa->ifa_ifp->if_fib;
1066 	NET_EPOCH_ENTER(et);
1067 	error = in_handle_prefix_route(fibnum, cmd, &dst, pmask, ifa, ifp);
1068 	NET_EPOCH_EXIT(et);
1069 
1070 	return (error);
1071 }
1072 
1073 /*
1074  * Check if we have a route for the given prefix already.
1075  */
1076 static bool
in_hasrtprefix(struct in_ifaddr * target)1077 in_hasrtprefix(struct in_ifaddr *target)
1078 {
1079 	struct epoch_tracker et;
1080 	struct in_ifaddr *ia;
1081 	struct in_addr prefix, mask, p, m;
1082 	bool result = false;
1083 
1084 	ia_getrtprefix(target, &prefix, &mask);
1085 
1086 	/* Look for an existing address with the same prefix, mask, and fib */
1087 	NET_EPOCH_ENTER(et);
1088 	CK_STAILQ_FOREACH(ia, &V_in_ifaddrhead, ia_link) {
1089 		ia_getrtprefix(ia, &p, &m);
1090 
1091 		if (prefix.s_addr != p.s_addr ||
1092 		    mask.s_addr != m.s_addr)
1093 			continue;
1094 
1095 		if (target->ia_ifp->if_fib != ia->ia_ifp->if_fib)
1096 			continue;
1097 
1098 		/*
1099 		 * If we got a matching prefix route inserted by other
1100 		 * interface address, we are done here.
1101 		 */
1102 		if (ia->ia_flags & IFA_ROUTE) {
1103 			result = true;
1104 			break;
1105 		}
1106 	}
1107 	NET_EPOCH_EXIT(et);
1108 
1109 	return (result);
1110 }
1111 
1112 int
in_addprefix(struct in_ifaddr * target)1113 in_addprefix(struct in_ifaddr *target)
1114 {
1115 	int error;
1116 
1117 	if (in_hasrtprefix(target)) {
1118 		if (V_nosameprefix)
1119 			return (EEXIST);
1120 		else {
1121 			rt_addrmsg(RTM_ADD, &target->ia_ifa,
1122 			    target->ia_ifp->if_fib);
1123 			return (0);
1124 		}
1125 	}
1126 
1127 	/*
1128 	 * No-one seem to have this prefix route, so we try to insert it.
1129 	 */
1130 	rt_addrmsg(RTM_ADD, &target->ia_ifa, target->ia_ifp->if_fib);
1131 	error = in_handle_ifaddr_route(RTM_ADD, target);
1132 	if (!error)
1133 		target->ia_flags |= IFA_ROUTE;
1134 	return (error);
1135 }
1136 
1137 /*
1138  * Removes either all lle entries for given @ia, or lle
1139  * corresponding to @ia address.
1140  */
1141 static void
in_scrubprefixlle(struct in_ifaddr * ia,int all,u_int flags)1142 in_scrubprefixlle(struct in_ifaddr *ia, int all, u_int flags)
1143 {
1144 	struct sockaddr_in addr, mask;
1145 	struct sockaddr *saddr, *smask;
1146 	struct ifnet *ifp;
1147 
1148 	saddr = (struct sockaddr *)&addr;
1149 	bzero(&addr, sizeof(addr));
1150 	addr.sin_len = sizeof(addr);
1151 	addr.sin_family = AF_INET;
1152 	smask = (struct sockaddr *)&mask;
1153 	bzero(&mask, sizeof(mask));
1154 	mask.sin_len = sizeof(mask);
1155 	mask.sin_family = AF_INET;
1156 	mask.sin_addr.s_addr = ia->ia_subnetmask;
1157 	ifp = ia->ia_ifp;
1158 
1159 	if (all) {
1160 		/*
1161 		 * Remove all L2 entries matching given prefix.
1162 		 * Convert address to host representation to avoid
1163 		 * doing this on every callback. ia_subnetmask is already
1164 		 * stored in host representation.
1165 		 */
1166 		addr.sin_addr.s_addr = ntohl(ia->ia_addr.sin_addr.s_addr);
1167 		lltable_prefix_free(AF_INET, saddr, smask, flags);
1168 	} else {
1169 		/* Remove interface address only */
1170 		addr.sin_addr.s_addr = ia->ia_addr.sin_addr.s_addr;
1171 		lltable_delete_addr(LLTABLE(ifp), LLE_IFADDR, saddr);
1172 	}
1173 }
1174 
1175 /*
1176  * If there is no other address in the system that can serve a route to the
1177  * same prefix, remove the route.  Hand over the route to the new address
1178  * otherwise.
1179  */
1180 int
in_scrubprefix(struct in_ifaddr * target,u_int flags)1181 in_scrubprefix(struct in_ifaddr *target, u_int flags)
1182 {
1183 	struct epoch_tracker et;
1184 	struct in_ifaddr *ia;
1185 	struct in_addr prefix, mask, p, m;
1186 	int error = 0;
1187 
1188 	/*
1189 	 * Remove the loopback route to the interface address.
1190 	 */
1191 	if (ia_need_loopback_route(target) && (flags & LLE_STATIC)) {
1192 		struct in_ifaddr *eia;
1193 
1194 		eia = in_localip_more(target);
1195 
1196 		if (eia != NULL) {
1197 			error = ifa_switch_loopback_route((struct ifaddr *)eia,
1198 			    (struct sockaddr *)&target->ia_addr);
1199 			ifa_free(&eia->ia_ifa);
1200 		} else {
1201 			error = ifa_del_loopback_route((struct ifaddr *)target,
1202 			    (struct sockaddr *)&target->ia_addr);
1203 		}
1204 	}
1205 
1206 	ia_getrtprefix(target, &prefix, &mask);
1207 
1208 	if ((target->ia_flags & IFA_ROUTE) == 0) {
1209 		rt_addrmsg(RTM_DELETE, &target->ia_ifa, target->ia_ifp->if_fib);
1210 
1211 		/*
1212 		 * Removing address from !IFF_UP interface or
1213 		 * prefix which exists on other interface (along with route).
1214 		 * No entries should exist here except target addr.
1215 		 * Given that, delete this entry only.
1216 		 */
1217 		in_scrubprefixlle(target, 0, flags);
1218 		return (0);
1219 	}
1220 
1221 	NET_EPOCH_ENTER(et);
1222 	CK_STAILQ_FOREACH(ia, &V_in_ifaddrhead, ia_link) {
1223 		ia_getrtprefix(ia, &p, &m);
1224 
1225 		if (prefix.s_addr != p.s_addr ||
1226 		    mask.s_addr != m.s_addr)
1227 			continue;
1228 
1229 		if ((ia->ia_ifp->if_flags & IFF_UP) == 0)
1230 			continue;
1231 
1232 		/*
1233 		 * If we got a matching prefix address, move IFA_ROUTE and
1234 		 * the route itself to it.  Make sure that routing daemons
1235 		 * get a heads-up.
1236 		 */
1237 		if ((ia->ia_flags & IFA_ROUTE) == 0) {
1238 			ifa_ref(&ia->ia_ifa);
1239 			NET_EPOCH_EXIT(et);
1240 			error = in_handle_ifaddr_route(RTM_DELETE, target);
1241 			if (error == 0)
1242 				target->ia_flags &= ~IFA_ROUTE;
1243 			else
1244 				log(LOG_INFO, "in_scrubprefix: err=%d, old prefix delete failed\n",
1245 					error);
1246 			/* Scrub all entries IFF interface is different */
1247 			in_scrubprefixlle(target, target->ia_ifp != ia->ia_ifp,
1248 			    flags);
1249 			error = in_handle_ifaddr_route(RTM_ADD, ia);
1250 			if (error == 0)
1251 				ia->ia_flags |= IFA_ROUTE;
1252 			else
1253 				log(LOG_INFO, "in_scrubprefix: err=%d, new prefix add failed\n",
1254 					error);
1255 			ifa_free(&ia->ia_ifa);
1256 			return (error);
1257 		}
1258 	}
1259 	NET_EPOCH_EXIT(et);
1260 
1261 	/*
1262 	 * remove all L2 entries on the given prefix
1263 	 */
1264 	in_scrubprefixlle(target, 1, flags);
1265 
1266 	/*
1267 	 * As no-one seem to have this prefix, we can remove the route.
1268 	 */
1269 	rt_addrmsg(RTM_DELETE, &target->ia_ifa, target->ia_ifp->if_fib);
1270 	error = in_handle_ifaddr_route(RTM_DELETE, target);
1271 	if (error == 0)
1272 		target->ia_flags &= ~IFA_ROUTE;
1273 	else
1274 		log(LOG_INFO, "in_scrubprefix: err=%d, prefix delete failed\n", error);
1275 	return (error);
1276 }
1277 
1278 void
in_ifscrub_all(void)1279 in_ifscrub_all(void)
1280 {
1281 	struct ifnet *ifp;
1282 	struct ifaddr *ifa, *nifa;
1283 	struct ifreq ifr;
1284 
1285 	IFNET_RLOCK();
1286 	CK_STAILQ_FOREACH(ifp, &V_ifnet, if_link) {
1287 		/* Cannot lock here - lock recursion. */
1288 		/* NET_EPOCH_ENTER(et); */
1289 		CK_STAILQ_FOREACH_SAFE(ifa, &ifp->if_addrhead, ifa_link, nifa) {
1290 			if (ifa->ifa_addr->sa_family != AF_INET)
1291 				continue;
1292 
1293 			/*
1294 			 * This is ugly but the only way for legacy IP to
1295 			 * cleanly remove addresses and everything attached.
1296 			 */
1297 			bzero(&ifr, sizeof(ifr));
1298 			ifr.ifr_addr = *ifa->ifa_addr;
1299 			(void)in_control(NULL, SIOCDIFADDR, (caddr_t)&ifr,
1300 			    ifp, NULL);
1301 		}
1302 		/* NET_EPOCH_EXIT(et); */
1303 		in_purgemaddrs(ifp);
1304 		igmp_domifdetach(ifp);
1305 	}
1306 	IFNET_RUNLOCK();
1307 }
1308 
1309 bool
in_ifaddr_broadcast(struct in_addr in,struct in_ifaddr * ia)1310 in_ifaddr_broadcast(struct in_addr in, struct in_ifaddr *ia)
1311 {
1312 
1313 	return ((in.s_addr == ia->ia_broadaddr.sin_addr.s_addr ||
1314 	     /*
1315 	      * Optionally check for old-style (host 0) broadcast, but
1316 	      * taking into account that RFC 3021 obsoletes it.
1317 	      */
1318 	    __predict_false(V_broadcast_lowest &&
1319 	    ia->ia_subnetmask != IN_RFC3021_MASK &&
1320 	    ntohl(in.s_addr) == ia->ia_subnet)) &&
1321 	     /*
1322 	      * Check for an all one subnetmask. These
1323 	      * only exist when an interface gets a secondary
1324 	      * address.
1325 	      */
1326 	    ia->ia_subnetmask != (u_long)0xffffffff);
1327 }
1328 
1329 /*
1330  * Return true if the address might be a local broadcast address.
1331  */
1332 bool
in_ifnet_broadcast(struct in_addr in,struct ifnet * ifp)1333 in_ifnet_broadcast(struct in_addr in, struct ifnet *ifp)
1334 {
1335 	struct ifaddr *ifa;
1336 
1337 	NET_EPOCH_ASSERT();
1338 
1339 	if (in_broadcast(in))
1340 		return (true);
1341 	if ((ifp->if_flags & IFF_BROADCAST) == 0)
1342 		return (false);
1343 	/*
1344 	 * Look through the list of addresses for a match
1345 	 * with a broadcast address.
1346 	 */
1347 	CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link)
1348 		if (ifa->ifa_addr->sa_family == AF_INET &&
1349 		    in_ifaddr_broadcast(in, (struct in_ifaddr *)ifa))
1350 			return (true);
1351 	return (false);
1352 }
1353 
1354 
1355 static struct lltable *in_lltattach(struct ifnet *);
1356 void
in_ifattach(void * arg __unused,struct ifnet * ifp)1357 in_ifattach(void *arg __unused, struct ifnet *ifp)
1358 {
1359 	struct in_ifinfo *ii;
1360 
1361 	ii = malloc(sizeof(struct in_ifinfo), M_IFADDR, M_WAITOK|M_ZERO);
1362 	ii->ii_llt = in_lltattach(ifp);
1363 	ii->ii_igmp = igmp_domifattach(ifp);
1364 	ifp->if_inet = ii;
1365 }
1366 EVENTHANDLER_DEFINE(ifnet_arrival_event, in_ifattach, NULL,
1367     EVENTHANDLER_PRI_ANY);
1368 
1369 /*
1370  * On interface removal, clean up IPv4 data structures hung off of the ifnet.
1371  */
1372 static void
in_ifdetach(void * arg __unused,struct ifnet * ifp)1373 in_ifdetach(void *arg __unused, struct ifnet *ifp)
1374 {
1375 	struct in_ifinfo *ii = ifp->if_inet;
1376 
1377 #ifdef VIMAGE
1378 	/*
1379 	 * On VNET shutdown abort here as the stack teardown will do all
1380 	 * the work top-down for us.  XXXGL: this logic is copied from
1381 	 * if_detach() before dom_ifattach removal.  Ideally we'd like to have
1382 	 * same logic for VNET shutdown and normal detach.  This means that
1383 	 * interfaces should be detach before protocols destroyed during VNET
1384 	 * shutdown.
1385 	 */
1386 	if (!VNET_IS_SHUTTING_DOWN(ifp->if_vnet))
1387 #endif
1388 	{
1389 		IN_MULTI_LOCK();
1390 		in_pcbpurgeif0(&V_ripcbinfo, ifp);
1391 		in_pcbpurgeif0(&V_udbinfo, ifp);
1392 		in_pcbpurgeif0(&V_ulitecbinfo, ifp);
1393 		in_purgemaddrs(ifp);
1394 		IN_MULTI_UNLOCK();
1395 
1396 		/*
1397 		 * Make sure all multicast deletions invoking if_ioctl() are
1398 		 * completed before returning. Else we risk accessing a freed
1399 		 * ifnet structure pointer.
1400 		 */
1401 		inm_release_wait(NULL);
1402 	}
1403 
1404 	igmp_domifdetach(ifp);
1405 	lltable_free(ii->ii_llt);
1406 	free(ii, M_IFADDR);
1407 }
1408 EVENTHANDLER_DEFINE(ifnet_departure_event, in_ifdetach, NULL,
1409     EVENTHANDLER_PRI_ANY);
1410 
1411 static void
in_ifnet_event(void * arg __unused,struct ifnet * ifp,int event)1412 in_ifnet_event(void *arg __unused, struct ifnet *ifp, int event)
1413 {
1414 	struct epoch_tracker et;
1415 	struct ifaddr *ifa;
1416 	struct in_ifaddr *ia;
1417 	int error;
1418 
1419 	NET_EPOCH_ENTER(et);
1420 	switch (event) {
1421 	case IFNET_EVENT_DOWN:
1422 		CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
1423 			if (ifa->ifa_addr->sa_family != AF_INET)
1424 				continue;
1425 			ia = (struct in_ifaddr *)ifa;
1426 			if ((ia->ia_flags & IFA_ROUTE) == 0)
1427 				continue;
1428 			ifa_ref(ifa);
1429 			/*
1430 			 * in_scrubprefix() kills the interface route.
1431 			 */
1432 			in_scrubprefix(ia, 0);
1433 			/*
1434 			 * in_ifadown gets rid of all the rest of the
1435 			 * routes.  This is not quite the right thing
1436 			 * to do, but at least if we are running a
1437 			 * routing process they will come back.
1438 			 */
1439 			in_ifadown(ifa, 0);
1440 			ifa_free(ifa);
1441 		}
1442 		break;
1443 
1444 	case IFNET_EVENT_UP:
1445 		CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
1446 			if (ifa->ifa_addr->sa_family != AF_INET)
1447 				continue;
1448 			ia = (struct in_ifaddr *)ifa;
1449 			if (ia->ia_flags & IFA_ROUTE)
1450 				continue;
1451 			ifa_ref(ifa);
1452 			error = ifa_del_loopback_route(ifa, ifa->ifa_addr);
1453 			rt_addrmsg(RTM_ADD, ifa, ifa->ifa_ifp->if_fib);
1454 			error = in_handle_ifaddr_route(RTM_ADD, ia);
1455 			if (error == 0)
1456 				ia->ia_flags |= IFA_ROUTE;
1457 			error = ifa_add_loopback_route(ifa, ifa->ifa_addr);
1458 			ifa_free(ifa);
1459 		}
1460 		break;
1461 	}
1462 	NET_EPOCH_EXIT(et);
1463 }
1464 EVENTHANDLER_DEFINE(ifnet_event, in_ifnet_event, NULL, EVENTHANDLER_PRI_ANY);
1465 
1466 /*
1467  * Delete all IPv4 multicast address records, and associated link-layer
1468  * multicast address records, associated with ifp.
1469  * XXX It looks like domifdetach runs AFTER the link layer cleanup.
1470  * XXX This should not race with ifma_protospec being set during
1471  * a new allocation, if it does, we have bigger problems.
1472  */
1473 static void
in_purgemaddrs(struct ifnet * ifp)1474 in_purgemaddrs(struct ifnet *ifp)
1475 {
1476 	struct epoch_tracker	 et;
1477 	struct in_multi_head purgeinms;
1478 	struct in_multi		*inm;
1479 	struct ifmultiaddr	*ifma;
1480 
1481 	SLIST_INIT(&purgeinms);
1482 	IN_MULTI_LIST_LOCK();
1483 
1484 	/*
1485 	 * Extract list of in_multi associated with the detaching ifp
1486 	 * which the PF_INET layer is about to release.
1487 	 * We need to do this as IF_ADDR_LOCK() may be re-acquired
1488 	 * by code further down.
1489 	 */
1490 	IF_ADDR_WLOCK(ifp);
1491 	NET_EPOCH_ENTER(et);
1492 	CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
1493 		inm = inm_ifmultiaddr_get_inm(ifma);
1494 		if (inm == NULL)
1495 			continue;
1496 		inm_rele_locked(&purgeinms, inm);
1497 	}
1498 	NET_EPOCH_EXIT(et);
1499 	IF_ADDR_WUNLOCK(ifp);
1500 
1501 	inm_release_list_deferred(&purgeinms);
1502 	igmp_ifdetach(ifp);
1503 	IN_MULTI_LIST_UNLOCK();
1504 }
1505 
1506 struct in_llentry {
1507 	struct llentry		base;
1508 };
1509 
1510 #define	IN_LLTBL_DEFAULT_HSIZE	32
1511 #define	IN_LLTBL_HASH(k, h) \
1512 	(((((((k >> 8) ^ k) >> 8) ^ k) >> 8) ^ k) & ((h) - 1))
1513 
1514 /*
1515  * Do actual deallocation of @lle.
1516  */
1517 static void
in_lltable_destroy_lle_unlocked(epoch_context_t ctx)1518 in_lltable_destroy_lle_unlocked(epoch_context_t ctx)
1519 {
1520 	struct llentry *lle;
1521 
1522 	lle = __containerof(ctx, struct llentry, lle_epoch_ctx);
1523 	LLE_LOCK_DESTROY(lle);
1524 	LLE_REQ_DESTROY(lle);
1525 	free(lle, M_LLTABLE);
1526 }
1527 
1528 /*
1529  * Called by LLE_FREE_LOCKED when number of references
1530  * drops to zero.
1531  */
1532 static void
in_lltable_destroy_lle(struct llentry * lle)1533 in_lltable_destroy_lle(struct llentry *lle)
1534 {
1535 
1536 	LLE_WUNLOCK(lle);
1537 	NET_EPOCH_CALL(in_lltable_destroy_lle_unlocked, &lle->lle_epoch_ctx);
1538 }
1539 
1540 static struct llentry *
in_lltable_new(struct in_addr addr4,u_int flags)1541 in_lltable_new(struct in_addr addr4, u_int flags)
1542 {
1543 	struct in_llentry *lle;
1544 
1545 	lle = malloc(sizeof(struct in_llentry), M_LLTABLE, M_NOWAIT | M_ZERO);
1546 	if (lle == NULL)		/* NB: caller generates msg */
1547 		return NULL;
1548 
1549 	/*
1550 	 * For IPv4 this will trigger "arpresolve" to generate
1551 	 * an ARP request.
1552 	 */
1553 	lle->base.la_expire = time_uptime; /* mark expired */
1554 	lle->base.r_l3addr.addr4 = addr4;
1555 	lle->base.lle_refcnt = 1;
1556 	lle->base.lle_free = in_lltable_destroy_lle;
1557 	LLE_LOCK_INIT(&lle->base);
1558 	LLE_REQ_INIT(&lle->base);
1559 	callout_init(&lle->base.lle_timer, 1);
1560 
1561 	return (&lle->base);
1562 }
1563 
1564 static int
in_lltable_match_prefix(const struct sockaddr * saddr,const struct sockaddr * smask,u_int flags,struct llentry * lle)1565 in_lltable_match_prefix(const struct sockaddr *saddr,
1566     const struct sockaddr *smask, u_int flags, struct llentry *lle)
1567 {
1568 	struct in_addr addr, mask, lle_addr;
1569 
1570 	addr = ((const struct sockaddr_in *)saddr)->sin_addr;
1571 	mask = ((const struct sockaddr_in *)smask)->sin_addr;
1572 	lle_addr.s_addr = ntohl(lle->r_l3addr.addr4.s_addr);
1573 
1574 	if (IN_ARE_MASKED_ADDR_EQUAL(lle_addr, addr, mask) == 0)
1575 		return (0);
1576 
1577 	if (lle->la_flags & LLE_IFADDR) {
1578 		/*
1579 		 * Delete LLE_IFADDR records IFF address & flag matches.
1580 		 * Note that addr is the interface address within prefix
1581 		 * being matched.
1582 		 * Note also we should handle 'ifdown' cases without removing
1583 		 * ifaddr macs.
1584 		 */
1585 		if (addr.s_addr == lle_addr.s_addr && (flags & LLE_STATIC) != 0)
1586 			return (1);
1587 		return (0);
1588 	}
1589 
1590 	/* flags & LLE_STATIC means deleting both dynamic and static entries */
1591 	if ((flags & LLE_STATIC) || !(lle->la_flags & LLE_STATIC))
1592 		return (1);
1593 
1594 	return (0);
1595 }
1596 
1597 static void
in_lltable_free_entry(struct lltable * llt,struct llentry * lle)1598 in_lltable_free_entry(struct lltable *llt, struct llentry *lle)
1599 {
1600 	size_t pkts_dropped;
1601 
1602 	LLE_WLOCK_ASSERT(lle);
1603 	KASSERT(llt != NULL, ("lltable is NULL"));
1604 
1605 	/* Unlink entry from table if not already */
1606 	if ((lle->la_flags & LLE_LINKED) != 0) {
1607 		LLTABLE_LOCK_ASSERT(llt);
1608 		lltable_unlink_entry(llt, lle);
1609 	}
1610 
1611 	/* Drop hold queue */
1612 	pkts_dropped = llentry_free(lle);
1613 	ARPSTAT_ADD(dropped, pkts_dropped);
1614 }
1615 
1616 static int
in_lltable_rtcheck(struct ifnet * ifp,u_int flags,const struct sockaddr * l3addr)1617 in_lltable_rtcheck(struct ifnet *ifp, u_int flags, const struct sockaddr *l3addr)
1618 {
1619 	struct nhop_object *nh;
1620 	struct in_addr addr;
1621 
1622 	KASSERT(l3addr->sa_family == AF_INET,
1623 	    ("sin_family %d", l3addr->sa_family));
1624 
1625 	addr = ((const struct sockaddr_in *)l3addr)->sin_addr;
1626 
1627 	nh = fib4_lookup(ifp->if_fib, addr, 0, NHR_NONE, 0);
1628 	if (nh == NULL)
1629 		return (EINVAL);
1630 
1631 	/*
1632 	 * If the gateway for an existing host route matches the target L3
1633 	 * address, which is a special route inserted by some implementation
1634 	 * such as MANET, and the interface is of the correct type, then
1635 	 * allow for ARP to proceed.
1636 	 */
1637 	if (nh->nh_flags & NHF_GATEWAY) {
1638 		if (!(nh->nh_flags & NHF_HOST) || nh->nh_ifp->if_type != IFT_ETHER ||
1639 		    (nh->nh_ifp->if_flags & (IFF_NOARP | IFF_STATICARP)) != 0 ||
1640 		    memcmp(nh->gw_sa.sa_data, l3addr->sa_data,
1641 		    sizeof(in_addr_t)) != 0) {
1642 			return (EINVAL);
1643 		}
1644 	}
1645 
1646 	/*
1647 	 * Make sure that at least the destination address is covered
1648 	 * by the route. This is for handling the case where 2 or more
1649 	 * interfaces have the same prefix. An incoming packet arrives
1650 	 * on one interface and the corresponding outgoing packet leaves
1651 	 * another interface.
1652 	 */
1653 	if ((nh->nh_ifp != ifp) && (nh->nh_flags & NHF_HOST) == 0) {
1654 		struct in_ifaddr *ia = (struct in_ifaddr *)ifaof_ifpforaddr(l3addr, ifp);
1655 		struct in_addr dst_addr, mask_addr;
1656 
1657 		if (ia == NULL)
1658 			return (EINVAL);
1659 
1660 		/*
1661 		 * ifaof_ifpforaddr() returns _best matching_ IFA.
1662 		 * It is possible that ifa prefix does not cover our address.
1663 		 * Explicitly verify and fail if that's the case.
1664 		 */
1665 		dst_addr = IA_SIN(ia)->sin_addr;
1666 		mask_addr.s_addr = htonl(ia->ia_subnetmask);
1667 
1668 		if (!IN_ARE_MASKED_ADDR_EQUAL(dst_addr, addr, mask_addr))
1669 			return (EINVAL);
1670 	}
1671 
1672 	return (0);
1673 }
1674 
1675 static inline uint32_t
in_lltable_hash_dst(const struct in_addr dst,uint32_t hsize)1676 in_lltable_hash_dst(const struct in_addr dst, uint32_t hsize)
1677 {
1678 
1679 	return (IN_LLTBL_HASH(dst.s_addr, hsize));
1680 }
1681 
1682 static uint32_t
in_lltable_hash(const struct llentry * lle,uint32_t hsize)1683 in_lltable_hash(const struct llentry *lle, uint32_t hsize)
1684 {
1685 
1686 	return (in_lltable_hash_dst(lle->r_l3addr.addr4, hsize));
1687 }
1688 
1689 static void
in_lltable_fill_sa_entry(const struct llentry * lle,struct sockaddr * sa)1690 in_lltable_fill_sa_entry(const struct llentry *lle, struct sockaddr *sa)
1691 {
1692 	struct sockaddr_in *sin;
1693 
1694 	sin = (struct sockaddr_in *)sa;
1695 	bzero(sin, sizeof(*sin));
1696 	sin->sin_family = AF_INET;
1697 	sin->sin_len = sizeof(*sin);
1698 	sin->sin_addr = lle->r_l3addr.addr4;
1699 }
1700 
1701 static inline struct llentry *
in_lltable_find_dst(struct lltable * llt,struct in_addr dst)1702 in_lltable_find_dst(struct lltable *llt, struct in_addr dst)
1703 {
1704 	struct llentry *lle;
1705 	struct llentries *lleh;
1706 	u_int hashidx;
1707 
1708 	hashidx = in_lltable_hash_dst(dst, llt->llt_hsize);
1709 	lleh = &llt->lle_head[hashidx];
1710 	CK_LIST_FOREACH(lle, lleh, lle_next) {
1711 		if (lle->la_flags & LLE_DELETED)
1712 			continue;
1713 		if (lle->r_l3addr.addr4.s_addr == dst.s_addr)
1714 			break;
1715 	}
1716 
1717 	return (lle);
1718 }
1719 
1720 static void
in_lltable_delete_entry(struct lltable * llt,struct llentry * lle)1721 in_lltable_delete_entry(struct lltable *llt, struct llentry *lle)
1722 {
1723 
1724 	lle->la_flags |= LLE_DELETED;
1725 	EVENTHANDLER_INVOKE(lle_event, lle, LLENTRY_DELETED);
1726 #ifdef DIAGNOSTIC
1727 	log(LOG_INFO, "ifaddr cache = %p is deleted\n", lle);
1728 #endif
1729 	llentry_free(lle);
1730 }
1731 
1732 static struct llentry *
in_lltable_alloc(struct lltable * llt,u_int flags,const struct sockaddr * l3addr)1733 in_lltable_alloc(struct lltable *llt, u_int flags, const struct sockaddr *l3addr)
1734 {
1735 	const struct sockaddr_in *sin = (const struct sockaddr_in *)l3addr;
1736 	struct ifnet *ifp = llt->llt_ifp;
1737 	struct llentry *lle;
1738 	char linkhdr[LLE_MAX_LINKHDR];
1739 	size_t linkhdrsize;
1740 	int lladdr_off;
1741 
1742 	KASSERT(l3addr->sa_family == AF_INET,
1743 	    ("sin_family %d", l3addr->sa_family));
1744 
1745 	/*
1746 	 * A route that covers the given address must have
1747 	 * been installed 1st because we are doing a resolution,
1748 	 * verify this.
1749 	 */
1750 	if (!(flags & LLE_IFADDR) &&
1751 	    in_lltable_rtcheck(ifp, flags, l3addr) != 0)
1752 		return (NULL);
1753 
1754 	lle = in_lltable_new(sin->sin_addr, flags);
1755 	if (lle == NULL) {
1756 		log(LOG_INFO, "lla_lookup: new lle malloc failed\n");
1757 		return (NULL);
1758 	}
1759 	lle->la_flags = flags;
1760 	if (flags & LLE_STATIC)
1761 		lle->r_flags |= RLLE_VALID;
1762 	if ((flags & LLE_IFADDR) == LLE_IFADDR) {
1763 		linkhdrsize = LLE_MAX_LINKHDR;
1764 		if (lltable_calc_llheader(ifp, AF_INET, IF_LLADDR(ifp),
1765 		    linkhdr, &linkhdrsize, &lladdr_off) != 0) {
1766 			in_lltable_free_entry(llt, lle);
1767 			return (NULL);
1768 		}
1769 		lltable_set_entry_addr(ifp, lle, linkhdr, linkhdrsize,
1770 		    lladdr_off);
1771 		lle->la_flags |= LLE_STATIC;
1772 		lle->r_flags |= (RLLE_VALID | RLLE_IFADDR);
1773 		lle->la_expire = 0;
1774 	}
1775 
1776 	return (lle);
1777 }
1778 
1779 /*
1780  * Return NULL if not found or marked for deletion.
1781  * If found return lle read locked.
1782  */
1783 static struct llentry *
in_lltable_lookup(struct lltable * llt,u_int flags,const struct sockaddr * l3addr)1784 in_lltable_lookup(struct lltable *llt, u_int flags, const struct sockaddr *l3addr)
1785 {
1786 	const struct sockaddr_in *sin = (const struct sockaddr_in *)l3addr;
1787 	struct llentry *lle;
1788 
1789 	LLTABLE_RLOCK_ASSERT(llt);
1790 	KASSERT(l3addr->sa_family == AF_INET,
1791 	    ("sin_family %d", l3addr->sa_family));
1792 	KASSERT((flags & (LLE_UNLOCKED | LLE_EXCLUSIVE)) !=
1793 	    (LLE_UNLOCKED | LLE_EXCLUSIVE),
1794 	    ("wrong lle request flags: %#x", flags));
1795 
1796 	lle = in_lltable_find_dst(llt, sin->sin_addr);
1797 	if (lle == NULL)
1798 		return (NULL);
1799 	if (flags & LLE_UNLOCKED)
1800 		return (lle);
1801 
1802 	if (flags & LLE_EXCLUSIVE)
1803 		LLE_WLOCK(lle);
1804 	else
1805 		LLE_RLOCK(lle);
1806 
1807 	/*
1808 	 * If the afdata lock is not held, the LLE may have been unlinked while
1809 	 * we were blocked on the LLE lock.  Check for this case.
1810 	 */
1811 	if (__predict_false((lle->la_flags & LLE_LINKED) == 0)) {
1812 		if (flags & LLE_EXCLUSIVE)
1813 			LLE_WUNLOCK(lle);
1814 		else
1815 			LLE_RUNLOCK(lle);
1816 		return (NULL);
1817 	}
1818 	return (lle);
1819 }
1820 
1821 static int
in_lltable_dump_entry(struct lltable * llt,struct llentry * lle,struct sysctl_req * wr)1822 in_lltable_dump_entry(struct lltable *llt, struct llentry *lle,
1823     struct sysctl_req *wr)
1824 {
1825 	struct ifnet *ifp = llt->llt_ifp;
1826 	/* XXX stack use */
1827 	struct {
1828 		struct rt_msghdr	rtm;
1829 		struct sockaddr_in	sin;
1830 		struct sockaddr_dl	sdl;
1831 	} arpc;
1832 	struct sockaddr_dl *sdl;
1833 	int error;
1834 
1835 	bzero(&arpc, sizeof(arpc));
1836 	/* skip deleted entries */
1837 	if ((lle->la_flags & LLE_DELETED) == LLE_DELETED)
1838 		return (0);
1839 	/* Skip if jailed and not a valid IP of the prison. */
1840 	lltable_fill_sa_entry(lle,(struct sockaddr *)&arpc.sin);
1841 	if (prison_if(wr->td->td_ucred, (struct sockaddr *)&arpc.sin) != 0)
1842 		return (0);
1843 	/*
1844 	 * produce a msg made of:
1845 	 *  struct rt_msghdr;
1846 	 *  struct sockaddr_in; (IPv4)
1847 	 *  struct sockaddr_dl;
1848 	 */
1849 	arpc.rtm.rtm_msglen = sizeof(arpc);
1850 	arpc.rtm.rtm_version = RTM_VERSION;
1851 	arpc.rtm.rtm_type = RTM_GET;
1852 	arpc.rtm.rtm_flags = RTF_UP;
1853 	arpc.rtm.rtm_addrs = RTA_DST | RTA_GATEWAY;
1854 
1855 	/* publish */
1856 	if (lle->la_flags & LLE_PUB)
1857 		arpc.rtm.rtm_flags |= RTF_ANNOUNCE;
1858 
1859 	sdl = &arpc.sdl;
1860 	sdl->sdl_family = AF_LINK;
1861 	sdl->sdl_len = sizeof(*sdl);
1862 	sdl->sdl_index = ifp->if_index;
1863 	sdl->sdl_type = ifp->if_type;
1864 	if ((lle->la_flags & LLE_VALID) == LLE_VALID) {
1865 		sdl->sdl_alen = ifp->if_addrlen;
1866 		bcopy(lle->ll_addr, LLADDR(sdl), ifp->if_addrlen);
1867 	} else {
1868 		sdl->sdl_alen = 0;
1869 		bzero(LLADDR(sdl), ifp->if_addrlen);
1870 	}
1871 
1872 	arpc.rtm.rtm_rmx.rmx_expire =
1873 	    lle->la_flags & LLE_STATIC ? 0 : lle->la_expire;
1874 	arpc.rtm.rtm_flags |= (RTF_HOST | RTF_LLDATA);
1875 	if (lle->la_flags & LLE_STATIC)
1876 		arpc.rtm.rtm_flags |= RTF_STATIC;
1877 	if (lle->la_flags & LLE_IFADDR)
1878 		arpc.rtm.rtm_flags |= RTF_PINNED;
1879 	arpc.rtm.rtm_index = ifp->if_index;
1880 	error = SYSCTL_OUT(wr, &arpc, sizeof(arpc));
1881 
1882 	return (error);
1883 }
1884 
1885 static void
in_lltable_post_resolved(struct lltable * llt,struct llentry * lle)1886 in_lltable_post_resolved(struct lltable *llt, struct llentry *lle)
1887 {
1888 	struct ifnet *ifp = llt->llt_ifp;
1889 
1890 	/* gratuitous ARP */
1891 	if ((lle->la_flags & LLE_PUB) != 0)
1892 		arprequest(ifp, &lle->r_l3addr.addr4, &lle->r_l3addr.addr4,
1893 		    lle->ll_addr);
1894 }
1895 
1896 static struct lltable *
in_lltattach(struct ifnet * ifp)1897 in_lltattach(struct ifnet *ifp)
1898 {
1899 	struct lltable *llt;
1900 
1901 	llt = lltable_allocate_htbl(IN_LLTBL_DEFAULT_HSIZE);
1902  	llt->llt_af = AF_INET;
1903  	llt->llt_ifp = ifp;
1904 
1905 	llt->llt_lookup = in_lltable_lookup;
1906 	llt->llt_alloc_entry = in_lltable_alloc;
1907 	llt->llt_delete_entry = in_lltable_delete_entry;
1908 	llt->llt_dump_entry = in_lltable_dump_entry;
1909 	llt->llt_hash = in_lltable_hash;
1910 	llt->llt_fill_sa_entry = in_lltable_fill_sa_entry;
1911 	llt->llt_free_entry = in_lltable_free_entry;
1912 	llt->llt_match_prefix = in_lltable_match_prefix;
1913 	llt->llt_mark_used = llentry_mark_used;
1914 	llt->llt_post_resolved = in_lltable_post_resolved;
1915  	lltable_link(llt);
1916 
1917 	return (llt);
1918 }
1919 
1920 struct lltable *
in_lltable_get(struct ifnet * ifp)1921 in_lltable_get(struct ifnet *ifp)
1922 {
1923 	/* XXXGL: ??? */
1924 	if (ifp->if_inet == NULL)
1925 		return (NULL);
1926 
1927 	return (((struct in_ifinfo *)ifp->if_inet)->ii_llt);
1928 }
1929