xref: /dragonfly/contrib/dhcpcd/src/ipv4.c (revision 7d3e9a5b)
1 /* SPDX-License-Identifier: BSD-2-Clause */
2 /*
3  * dhcpcd - DHCP client daemon
4  * Copyright (c) 2006-2021 Roy Marples <roy@marples.name>
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  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  */
28 
29 #include <sys/socket.h>
30 #include <sys/types.h>
31 
32 #include <arpa/inet.h>
33 #include <net/if.h>
34 #include <net/route.h>
35 #include <netinet/if_ether.h>
36 #include <netinet/in.h>
37 
38 #include <assert.h>
39 #include <ctype.h>
40 #include <errno.h>
41 #include <stdbool.h>
42 #include <stdio.h>
43 #include <stdlib.h>
44 #include <string.h>
45 #include <unistd.h>
46 
47 #include "config.h"
48 #include "arp.h"
49 #include "common.h"
50 #include "dhcpcd.h"
51 #include "dhcp.h"
52 #include "eloop.h"
53 #include "if.h"
54 #include "if-options.h"
55 #include "ipv4.h"
56 #include "ipv4ll.h"
57 #include "logerr.h"
58 #include "route.h"
59 #include "script.h"
60 #include "sa.h"
61 
62 #define IPV4_LOOPBACK_ROUTE
63 #if defined(__linux__) || defined(__sun) || (defined(BSD) && defined(RTF_LOCAL))
64 /* Linux has had loopback routes in the local table since 2.2
65  * Solaris does not seem to support loopback routes. */
66 #undef IPV4_LOOPBACK_ROUTE
67 #endif
68 
69 uint8_t
70 inet_ntocidr(struct in_addr address)
71 {
72 	uint8_t cidr = 0;
73 	uint32_t mask = htonl(address.s_addr);
74 
75 	while (mask) {
76 		cidr++;
77 		mask <<= 1;
78 	}
79 	return cidr;
80 }
81 
82 int
83 inet_cidrtoaddr(int cidr, struct in_addr *addr)
84 {
85 	int ocets;
86 
87 	if (cidr < 1 || cidr > 32) {
88 		errno = EINVAL;
89 		return -1;
90 	}
91 	ocets = (cidr + 7) / NBBY;
92 
93 	addr->s_addr = 0;
94 	if (ocets > 0) {
95 		memset(&addr->s_addr, 255, (size_t)ocets - 1);
96 		memset((unsigned char *)&addr->s_addr + (ocets - 1),
97 		    (256 - (1 << (32 - cidr) % NBBY)), 1);
98 	}
99 
100 	return 0;
101 }
102 
103 uint32_t
104 ipv4_getnetmask(uint32_t addr)
105 {
106 	uint32_t dst;
107 
108 	if (addr == 0)
109 		return 0;
110 
111 	dst = htonl(addr);
112 	if (IN_CLASSA(dst))
113 		return ntohl(IN_CLASSA_NET);
114 	if (IN_CLASSB(dst))
115 		return ntohl(IN_CLASSB_NET);
116 	if (IN_CLASSC(dst))
117 		return ntohl(IN_CLASSC_NET);
118 
119 	return 0;
120 }
121 
122 struct ipv4_addr *
123 ipv4_iffindaddr(struct interface *ifp,
124     const struct in_addr *addr, const struct in_addr *mask)
125 {
126 	struct ipv4_state *state;
127 	struct ipv4_addr *ap;
128 
129 	state = IPV4_STATE(ifp);
130 	if (state) {
131 		TAILQ_FOREACH(ap, &state->addrs, next) {
132 			if ((addr == NULL || ap->addr.s_addr == addr->s_addr) &&
133 			    (mask == NULL || ap->mask.s_addr == mask->s_addr))
134 				return ap;
135 		}
136 	}
137 	return NULL;
138 }
139 
140 struct ipv4_addr *
141 ipv4_iffindlladdr(struct interface *ifp)
142 {
143 	struct ipv4_state *state;
144 	struct ipv4_addr *ap;
145 
146 	state = IPV4_STATE(ifp);
147 	if (state) {
148 		TAILQ_FOREACH(ap, &state->addrs, next) {
149 			if (IN_LINKLOCAL(ntohl(ap->addr.s_addr)))
150 				return ap;
151 		}
152 	}
153 	return NULL;
154 }
155 
156 static struct ipv4_addr *
157 ipv4_iffindmaskaddr(struct interface *ifp, const struct in_addr *addr)
158 {
159 	struct ipv4_state *state;
160 	struct ipv4_addr *ap;
161 
162 	state = IPV4_STATE(ifp);
163 	if (state) {
164 		TAILQ_FOREACH (ap, &state->addrs, next) {
165 			if ((ap->addr.s_addr & ap->mask.s_addr) ==
166 			    (addr->s_addr & ap->mask.s_addr))
167 				return ap;
168 		}
169 	}
170 	return NULL;
171 }
172 
173 static struct ipv4_addr *
174 ipv4_iffindmaskbrd(struct interface *ifp, const struct in_addr *addr)
175 {
176 	struct ipv4_state *state;
177 	struct ipv4_addr *ap;
178 
179 	state = IPV4_STATE(ifp);
180 	if (state) {
181 		TAILQ_FOREACH (ap, &state->addrs, next) {
182 			if ((ap->brd.s_addr & ap->mask.s_addr) ==
183 			    (addr->s_addr & ap->mask.s_addr))
184 				return ap;
185 		}
186 	}
187 	return NULL;
188 }
189 
190 struct ipv4_addr *
191 ipv4_findaddr(struct dhcpcd_ctx *ctx, const struct in_addr *addr)
192 {
193 	struct interface *ifp;
194 	struct ipv4_addr *ap;
195 
196 	TAILQ_FOREACH(ifp, ctx->ifaces, next) {
197 		ap = ipv4_iffindaddr(ifp, addr, NULL);
198 		if (ap)
199 			return ap;
200 	}
201 	return NULL;
202 }
203 
204 struct ipv4_addr *
205 ipv4_findmaskaddr(struct dhcpcd_ctx *ctx, const struct in_addr *addr)
206 {
207 	struct interface *ifp;
208 	struct ipv4_addr *ap;
209 
210 	TAILQ_FOREACH(ifp, ctx->ifaces, next) {
211 		ap = ipv4_iffindmaskaddr(ifp, addr);
212 		if (ap)
213 			return ap;
214 	}
215 	return NULL;
216 }
217 
218 struct ipv4_addr *
219 ipv4_findmaskbrd(struct dhcpcd_ctx *ctx, const struct in_addr *addr)
220 {
221 	struct interface *ifp;
222 	struct ipv4_addr *ap;
223 
224 	TAILQ_FOREACH(ifp, ctx->ifaces, next) {
225 		ap = ipv4_iffindmaskbrd(ifp, addr);
226 		if (ap)
227 			return ap;
228 	}
229 	return NULL;
230 }
231 
232 int
233 ipv4_hasaddr(const struct interface *ifp)
234 {
235 	const struct dhcp_state *dstate;
236 
237 #ifdef IPV4LL
238 	if (IPV4LL_STATE_RUNNING(ifp))
239 		return 1;
240 #endif
241 
242 	dstate = D_CSTATE(ifp);
243 	return (dstate &&
244 	    dstate->added == STATE_ADDED &&
245 	    dstate->addr != NULL);
246 }
247 
248 /* Interface comparer for working out ordering. */
249 int
250 ipv4_ifcmp(const struct interface *si, const struct interface *ti)
251 {
252 	const struct dhcp_state *sis, *tis;
253 
254 	sis = D_CSTATE(si);
255 	tis = D_CSTATE(ti);
256 	if (sis && !tis)
257 		return -1;
258 	if (!sis && tis)
259 		return 1;
260 	if (!sis && !tis)
261 		return 0;
262 	/* If one has a lease and the other not, it takes precedence. */
263 	if (sis->new && !tis->new)
264 		return -1;
265 	if (!sis->new && tis->new)
266 		return 1;
267 	/* Always prefer proper leases */
268 	if (!(sis->added & STATE_FAKE) && (tis->added & STATE_FAKE))
269 		return -1;
270 	if ((sis->added & STATE_FAKE) && !(tis->added & STATE_FAKE))
271 		return 1;
272 	/* If we are either, they neither have a lease, or they both have.
273 	 * We need to check for IPv4LL and make it non-preferred. */
274 	if (sis->new && tis->new) {
275 		if (IS_DHCP(sis->new) && !IS_DHCP(tis->new))
276 			return -1;
277 		if (!IS_DHCP(sis->new) && IS_DHCP(tis->new))
278 			return 1;
279 	}
280 	return 0;
281 }
282 
283 static int
284 inet_dhcproutes(rb_tree_t *routes, struct interface *ifp, bool *have_default)
285 {
286 	const struct dhcp_state *state;
287 	rb_tree_t nroutes;
288 	struct rt *rt, *r = NULL;
289 	struct in_addr in;
290 	uint16_t mtu;
291 	int n;
292 
293 	state = D_CSTATE(ifp);
294 	if (state == NULL || state->state != DHS_BOUND || !state->added)
295 		return 0;
296 
297 	/* An address does have to exist. */
298 	assert(state->addr);
299 
300 	rb_tree_init(&nroutes, &rt_compare_proto_ops);
301 
302 	/* First, add a subnet route. */
303 	if (state->addr->mask.s_addr != INADDR_ANY
304 #ifndef BSD
305 	    /* BSD adds a route in this instance */
306 	    && state->addr->mask.s_addr != INADDR_BROADCAST
307 #endif
308 	) {
309 		if ((rt = rt_new(ifp)) == NULL)
310 			return -1;
311 		rt->rt_dflags |= RTDF_IFA_ROUTE;
312 		in.s_addr = state->addr->addr.s_addr & state->addr->mask.s_addr;
313 		sa_in_init(&rt->rt_dest, &in);
314 		in.s_addr = state->addr->mask.s_addr;
315 		sa_in_init(&rt->rt_netmask, &in);
316 		//in.s_addr = INADDR_ANY;
317 		//sa_in_init(&rt->rt_gateway, &in);
318 		rt->rt_gateway.sa_family = AF_UNSPEC;
319 		rt_proto_add(&nroutes, rt);
320 	}
321 
322 	/* If any set routes, grab them, otherwise DHCP routes. */
323 	if (RB_TREE_MIN(&ifp->options->routes)) {
324 		RB_TREE_FOREACH(r, &ifp->options->routes) {
325 			if (sa_is_unspecified(&r->rt_gateway))
326 				break;
327 			if ((rt = rt_new0(ifp->ctx)) == NULL)
328 				return -1;
329 			memcpy(rt, r, sizeof(*rt));
330 			rt_setif(rt, ifp);
331 			rt->rt_dflags = RTDF_STATIC;
332 			rt_proto_add(&nroutes, rt);
333 		}
334 	} else {
335 		if (dhcp_get_routes(&nroutes, ifp) == -1)
336 			return -1;
337 	}
338 
339 	/* If configured, install a gateway to the desintion
340 	 * for P2P interfaces. */
341 	if (ifp->flags & IFF_POINTOPOINT &&
342 	    has_option_mask(ifp->options->dstmask, DHO_ROUTER))
343 	{
344 		if ((rt = rt_new(ifp)) == NULL)
345 			return -1;
346 		in.s_addr = INADDR_ANY;
347 		sa_in_init(&rt->rt_dest, &in);
348 		sa_in_init(&rt->rt_netmask, &in);
349 		sa_in_init(&rt->rt_gateway, &state->addr->brd);
350 		sa_in_init(&rt->rt_ifa, &state->addr->addr);
351 		rt_proto_add(&nroutes, rt);
352 	}
353 
354 	/* Copy our address as the source address and set mtu */
355 	mtu = dhcp_get_mtu(ifp);
356 	n = 0;
357 	while ((rt = RB_TREE_MIN(&nroutes)) != NULL) {
358 		rb_tree_remove_node(&nroutes, rt);
359 		rt->rt_mtu = mtu;
360 		if (!(rt->rt_dflags & RTDF_STATIC))
361 			rt->rt_dflags |= RTDF_DHCP;
362 		sa_in_init(&rt->rt_ifa, &state->addr->addr);
363 		if (rb_tree_insert_node(routes, rt) != rt) {
364 			rt_free(rt);
365 			continue;
366 		}
367 		if (rt_is_default(rt))
368 			*have_default = true;
369 		n = 1;
370 	}
371 
372 	return n;
373 }
374 
375 /* We should check to ensure the routers are on the same subnet
376  * OR supply a host route. If not, warn and add a host route. */
377 static int
378 inet_routerhostroute(rb_tree_t *routes, struct interface *ifp)
379 {
380 	struct rt *rt, *rth, *rtp;
381 	struct sockaddr_in *dest, *netmask, *gateway;
382 	const char *cp, *cp2, *cp3, *cplim;
383 	struct if_options *ifo;
384 	const struct dhcp_state *state;
385 	struct in_addr in;
386 	rb_tree_t troutes;
387 
388 	/* Don't add a host route for these interfaces. */
389 	if (ifp->flags & (IFF_LOOPBACK | IFF_POINTOPOINT))
390 		return 0;
391 
392 	rb_tree_init(&troutes, &rt_compare_proto_ops);
393 
394 	RB_TREE_FOREACH(rt, routes) {
395 		if (rt->rt_dest.sa_family != AF_INET)
396 			continue;
397 		if (!sa_is_unspecified(&rt->rt_dest) ||
398 		    sa_is_unspecified(&rt->rt_gateway))
399 			continue;
400 		gateway = satosin(&rt->rt_gateway);
401 		/* Scan for a route to match */
402 		RB_TREE_FOREACH(rth, routes) {
403 			if (rth == rt)
404 				break;
405 			/* match host */
406 			if (sa_cmp(&rth->rt_dest, &rt->rt_gateway) == 0)
407 				break;
408 			/* match subnet */
409 			/* XXX ADD TO RT_COMARE? XXX */
410 			cp = (const char *)&gateway->sin_addr.s_addr;
411 			dest = satosin(&rth->rt_dest);
412 			cp2 = (const char *)&dest->sin_addr.s_addr;
413 			netmask = satosin(&rth->rt_netmask);
414 			cp3 = (const char *)&netmask->sin_addr.s_addr;
415 			cplim = cp3 + sizeof(netmask->sin_addr.s_addr);
416 			while (cp3 < cplim) {
417 				if ((*cp++ ^ *cp2++) & *cp3++)
418 					break;
419 			}
420 			if (cp3 == cplim)
421 				break;
422 		}
423 		if (rth != rt)
424 			continue;
425 		if ((state = D_CSTATE(ifp)) == NULL)
426 			continue;
427 		ifo = ifp->options;
428 		if (ifp->flags & IFF_NOARP) {
429 			if (!(ifo->options & DHCPCD_ROUTER_HOST_ROUTE_WARNED) &&
430 			    !(state->added & STATE_FAKE))
431 			{
432 				char buf[INET_MAX_ADDRSTRLEN];
433 
434 				ifo->options |= DHCPCD_ROUTER_HOST_ROUTE_WARNED;
435 				logwarnx("%s: forcing router %s through "
436 				    "interface",
437 				    ifp->name,
438 				    sa_addrtop(&rt->rt_gateway,
439 				    buf, sizeof(buf)));
440 			}
441 			gateway->sin_addr.s_addr = INADDR_ANY;
442 			continue;
443 		}
444 		if (!(ifo->options & DHCPCD_ROUTER_HOST_ROUTE_WARNED) &&
445 		    !(state->added & STATE_FAKE))
446 		{
447 			char buf[INET_MAX_ADDRSTRLEN];
448 
449 			ifo->options |= DHCPCD_ROUTER_HOST_ROUTE_WARNED;
450 			logwarnx("%s: router %s requires a host route",
451 			    ifp->name,
452 			    sa_addrtop(&rt->rt_gateway, buf, sizeof(buf)));
453 		}
454 
455 		if ((rth = rt_new(ifp)) == NULL)
456 			return -1;
457 		rth->rt_flags |= RTF_HOST;
458 		sa_in_init(&rth->rt_dest, &gateway->sin_addr);
459 		in.s_addr = INADDR_BROADCAST;
460 		sa_in_init(&rth->rt_netmask, &in);
461 		in.s_addr = INADDR_ANY;
462 		sa_in_init(&rth->rt_gateway, &in);
463 		rth->rt_mtu = dhcp_get_mtu(ifp);
464 		if (state->addr != NULL)
465 			sa_in_init(&rth->rt_ifa, &state->addr->addr);
466 		else
467 			rth->rt_ifa.sa_family = AF_UNSPEC;
468 
469 		/* We need to insert the host route just before the router. */
470 		while ((rtp = RB_TREE_MAX(routes)) != NULL) {
471 			rb_tree_remove_node(routes, rtp);
472 			rt_proto_add(&troutes, rtp);
473 			if (rtp == rt)
474 				break;
475 		}
476 		rt_proto_add(routes, rth);
477 		/* troutes is now reversed, so add backwards again. */
478 		while ((rtp = RB_TREE_MAX(&troutes)) != NULL) {
479 			rb_tree_remove_node(&troutes, rtp);
480 			rt_proto_add(routes, rtp);
481 		}
482 	}
483 	return 0;
484 }
485 
486 bool
487 inet_getroutes(struct dhcpcd_ctx *ctx, rb_tree_t *routes)
488 {
489 	struct interface *ifp;
490 	bool have_default = false;
491 
492 	TAILQ_FOREACH(ifp, ctx->ifaces, next) {
493 		if (!ifp->active)
494 			continue;
495 		if (inet_dhcproutes(routes, ifp, &have_default) == -1)
496 			return false;
497 #ifdef IPV4LL
498 		if (ipv4ll_subnetroute(routes, ifp) == -1)
499 			return false;
500 #endif
501 		if (inet_routerhostroute(routes, ifp) == -1)
502 			return false;
503 	}
504 
505 #ifdef IPV4LL
506 	/* If there is no default route, see if we can use an IPv4LL one. */
507 	if (have_default)
508 		return true;
509 
510 	TAILQ_FOREACH(ifp, ctx->ifaces, next) {
511 		if (ifp->active &&
512 		    ipv4ll_defaultroute(routes, ifp) == 1)
513 			break;
514 	}
515 #endif
516 
517 	return true;
518 }
519 
520 int
521 ipv4_deladdr(struct ipv4_addr *addr, int keeparp)
522 {
523 	int r;
524 	struct ipv4_state *state;
525 	struct ipv4_addr *ap;
526 
527 	logdebugx("%s: deleting IP address %s",
528 	    addr->iface->name, addr->saddr);
529 
530 	r = if_address(RTM_DELADDR, addr);
531 	if (r == -1 &&
532 	    errno != EADDRNOTAVAIL && errno != ESRCH &&
533 	    errno != ENXIO && errno != ENODEV)
534 		logerr("%s: %s", addr->iface->name, __func__);
535 
536 #ifdef ARP
537 	if (!keeparp)
538 		arp_freeaddr(addr->iface, &addr->addr);
539 #else
540 	UNUSED(keeparp);
541 #endif
542 
543 	state = IPV4_STATE(addr->iface);
544 	TAILQ_FOREACH(ap, &state->addrs, next) {
545 		if (IPV4_MASK_EQ(ap, addr)) {
546 			struct dhcp_state *dstate;
547 
548 			dstate = D_STATE(ap->iface);
549 			TAILQ_REMOVE(&state->addrs, ap, next);
550 			free(ap);
551 
552 			if (dstate && dstate->addr == ap) {
553 				dstate->added = 0;
554 				dstate->addr = NULL;
555 			}
556 			break;
557 		}
558 	}
559 
560 	return r;
561 }
562 
563 static int
564 delete_address(struct interface *ifp)
565 {
566 	int r;
567 	struct if_options *ifo;
568 	struct dhcp_state *state;
569 
570 	state = D_STATE(ifp);
571 	ifo = ifp->options;
572 	/* The lease could have been added, but the address deleted
573 	 * by a 3rd party. */
574 	if (state->addr == NULL ||
575 	    ifo->options & DHCPCD_INFORM ||
576 	    (ifo->options & DHCPCD_STATIC && ifo->req_addr.s_addr == 0))
577 		return 0;
578 #ifdef ARP
579 	arp_freeaddr(ifp, &state->addr->addr);
580 #endif
581 	r = ipv4_deladdr(state->addr, 0);
582 	return r;
583 }
584 
585 struct ipv4_state *
586 ipv4_getstate(struct interface *ifp)
587 {
588 	struct ipv4_state *state;
589 
590 	state = IPV4_STATE(ifp);
591 	if (state == NULL) {
592 	        ifp->if_data[IF_DATA_IPV4] = malloc(sizeof(*state));
593 		state = IPV4_STATE(ifp);
594 		if (state == NULL) {
595 			logerr(__func__);
596 			return NULL;
597 		}
598 		TAILQ_INIT(&state->addrs);
599 	}
600 	return state;
601 }
602 
603 #ifdef ALIAS_ADDR
604 /* Find the next logical aliase address we can use. */
605 static int
606 ipv4_aliasaddr(struct ipv4_addr *ia, struct ipv4_addr **repl)
607 {
608 	struct ipv4_state *state;
609 	struct ipv4_addr *iap;
610 	unsigned int lun;
611 	char alias[IF_NAMESIZE];
612 
613 	if (ia->alias[0] != '\0')
614 		return 0;
615 
616 	lun = 0;
617 	state = IPV4_STATE(ia->iface);
618 find_lun:
619 	if (if_makealias(alias, IF_NAMESIZE, ia->iface->name, lun) >=
620 	    IF_NAMESIZE)
621 	{
622 		errno = ENOMEM;
623 		return -1;
624 	}
625 	TAILQ_FOREACH(iap, &state->addrs, next) {
626 		if (iap->alias[0] != '\0' && iap->addr.s_addr == INADDR_ANY) {
627 			/* No address assigned? Lets use it. */
628 			strlcpy(ia->alias, iap->alias, sizeof(ia->alias));
629 			if (repl)
630 				*repl = iap;
631 			return 1;
632 		}
633 		if (strcmp(iap->alias, alias) == 0)
634 			break;
635 	}
636 
637 	if (iap != NULL) {
638 		if (lun == UINT_MAX) {
639 			errno = ERANGE;
640 			return -1;
641 		}
642 		lun++;
643 		goto find_lun;
644 	}
645 
646 	strlcpy(ia->alias, alias, sizeof(ia->alias));
647 	return 0;
648 }
649 #endif
650 
651 struct ipv4_addr *
652 ipv4_addaddr(struct interface *ifp, const struct in_addr *addr,
653     const struct in_addr *mask, const struct in_addr *bcast,
654     uint32_t vltime, uint32_t pltime)
655 {
656 	struct ipv4_state *state;
657 	struct ipv4_addr *ia;
658 #ifdef ALIAS_ADDR
659 	int replaced, blank;
660 	struct ipv4_addr *replaced_ia;
661 #endif
662 
663 	if ((state = ipv4_getstate(ifp)) == NULL) {
664 		logerr(__func__);
665 		return NULL;
666 	}
667 	if (ifp->options->options & DHCPCD_NOALIAS) {
668 		struct ipv4_addr *ian;
669 
670 		TAILQ_FOREACH_SAFE(ia, &state->addrs, next, ian) {
671 			if (ia->addr.s_addr != addr->s_addr)
672 				ipv4_deladdr(ia, 0);
673 		}
674 	}
675 
676 	ia = ipv4_iffindaddr(ifp, addr, NULL);
677 	if (ia == NULL) {
678 		ia = malloc(sizeof(*ia));
679 		if (ia == NULL) {
680 			logerr(__func__);
681 			return NULL;
682 		}
683 		ia->iface = ifp;
684 		ia->addr = *addr;
685 #ifdef IN_IFF_TENTATIVE
686 		ia->addr_flags = IN_IFF_TENTATIVE;
687 #endif
688 		ia->flags = IPV4_AF_NEW;
689 	} else
690 		ia->flags &= ~IPV4_AF_NEW;
691 
692 	ia->mask = *mask;
693 	ia->brd = *bcast;
694 #ifdef IP_LIFETIME
695 	if (ifp->options->options & DHCPCD_LASTLEASE_EXTEND) {
696 		/* We don't want the kernel to expire the address. */
697 		ia->vltime = ia->pltime = DHCP_INFINITE_LIFETIME;
698 	} else {
699 		ia->vltime = vltime;
700 		ia->pltime = pltime;
701 	}
702 #else
703 	UNUSED(vltime);
704 	UNUSED(pltime);
705 #endif
706 	snprintf(ia->saddr, sizeof(ia->saddr), "%s/%d",
707 	    inet_ntoa(*addr), inet_ntocidr(*mask));
708 
709 #ifdef ALIAS_ADDR
710 	blank = (ia->alias[0] == '\0');
711 	if ((replaced = ipv4_aliasaddr(ia, &replaced_ia)) == -1) {
712 		logerr("%s: ipv4_aliasaddr", ifp->name);
713 		free(ia);
714 		return NULL;
715 	}
716 	if (blank)
717 		logdebugx("%s: aliased %s", ia->alias, ia->saddr);
718 #endif
719 
720 	logdebugx("%s: adding IP address %s %s %s",
721 	    ifp->name, ia->saddr,
722 	    ifp->flags & IFF_POINTOPOINT ? "destination" : "broadcast",
723 	    inet_ntoa(*bcast));
724 	if (if_address(RTM_NEWADDR, ia) == -1) {
725 		if (errno != EEXIST)
726 			logerr("%s: if_addaddress",
727 			    __func__);
728 		if (ia->flags & IPV4_AF_NEW)
729 			free(ia);
730 		return NULL;
731 	}
732 
733 #ifdef ALIAS_ADDR
734 	if (replaced) {
735 		TAILQ_REMOVE(&state->addrs, replaced_ia, next);
736 		free(replaced_ia);
737 	}
738 #endif
739 
740 	if (ia->flags & IPV4_AF_NEW)
741 		TAILQ_INSERT_TAIL(&state->addrs, ia, next);
742 	return ia;
743 }
744 
745 static int
746 ipv4_daddaddr(struct interface *ifp, const struct dhcp_lease *lease)
747 {
748 	struct dhcp_state *state;
749 	struct ipv4_addr *ia;
750 
751 	ia = ipv4_addaddr(ifp, &lease->addr, &lease->mask, &lease->brd,
752 	    lease->leasetime, lease->rebindtime);
753 	if (ia == NULL)
754 		return -1;
755 
756 	state = D_STATE(ifp);
757 	state->added = STATE_ADDED;
758 	state->addr = ia;
759 	return 0;
760 }
761 
762 struct ipv4_addr *
763 ipv4_applyaddr(void *arg)
764 {
765 	struct interface *ifp = arg;
766 	struct dhcp_state *state = D_STATE(ifp);
767 	struct dhcp_lease *lease;
768 	struct if_options *ifo = ifp->options;
769 	struct ipv4_addr *ia;
770 
771 	if (state == NULL)
772 		return NULL;
773 
774 	lease = &state->lease;
775 	if (state->new == NULL) {
776 		if ((ifo->options & (DHCPCD_EXITING | DHCPCD_PERSISTENT)) !=
777 		    (DHCPCD_EXITING | DHCPCD_PERSISTENT))
778 		{
779 			if (state->added) {
780 				delete_address(ifp);
781 				rt_build(ifp->ctx, AF_INET);
782 #ifdef ARP
783 				/* Announce the preferred address to
784 				 * kick ARP caches. */
785 				arp_announceaddr(ifp->ctx,&lease->addr);
786 #endif
787 			}
788 			script_runreason(ifp, state->reason);
789 		} else
790 			rt_build(ifp->ctx, AF_INET);
791 		return NULL;
792 	}
793 
794 	ia = ipv4_iffindaddr(ifp, &lease->addr, NULL);
795 	/* If the netmask or broadcast is different, re-add the addresss.
796 	 * If IP addresses do not have lifetimes, there is a very real chance
797 	 * that re-adding them will scrub the subnet route temporarily
798 	 * which is a bad thing, so avoid it. */
799 	if (ia != NULL &&
800 	    ia->mask.s_addr == lease->mask.s_addr &&
801 	    ia->brd.s_addr == lease->brd.s_addr)
802 	{
803 #ifndef IP_LIFETIME
804 		logdebugx("%s: IP address %s already exists",
805 		    ifp->name, ia->saddr);
806 #endif
807 	} else {
808 #ifdef __linux__
809 		/* Linux does not change netmask/broadcast address
810 		 * for re-added addresses, so we need to delete the old one
811 		 * first. */
812 		if (ia != NULL)
813 			ipv4_deladdr(ia, 0);
814 #endif
815 #ifndef IP_LIFETIME
816 		if (ipv4_daddaddr(ifp, lease) == -1 && errno != EEXIST)
817 			return NULL;
818 #endif
819 	}
820 #ifdef IP_LIFETIME
821 	if (ipv4_daddaddr(ifp, lease) == -1 && errno != EEXIST)
822 		return NULL;
823 #endif
824 
825 	ia = ipv4_iffindaddr(ifp, &lease->addr, NULL);
826 	if (ia == NULL) {
827 		logerrx("%s: added address vanished", ifp->name);
828 		return NULL;
829 	}
830 #if defined(ARP) && defined(IN_IFF_NOTUSEABLE)
831 	if (ia->addr_flags & IN_IFF_NOTUSEABLE)
832 		return NULL;
833 #endif
834 
835 	/* Delete the old address if different */
836 	if (state->addr &&
837 	    state->addr->addr.s_addr != lease->addr.s_addr &&
838 	    ipv4_iffindaddr(ifp, &lease->addr, NULL))
839 		delete_address(ifp);
840 
841 	state->addr = ia;
842 	state->added = STATE_ADDED;
843 
844 	rt_build(ifp->ctx, AF_INET);
845 
846 #ifdef ARP
847 	arp_announceaddr(ifp->ctx, &state->addr->addr);
848 #endif
849 
850 	if (state->state == DHS_BOUND) {
851 		script_runreason(ifp, state->reason);
852 		dhcpcd_daemonise(ifp->ctx);
853 	}
854 	return ia;
855 }
856 
857 void
858 ipv4_markaddrsstale(struct interface *ifp)
859 {
860 	struct ipv4_state *state;
861 	struct ipv4_addr *ia;
862 
863 	state = IPV4_STATE(ifp);
864 	if (state == NULL)
865 		return;
866 
867 	TAILQ_FOREACH(ia, &state->addrs, next) {
868 		ia->flags |= IPV4_AF_STALE;
869 	}
870 }
871 
872 void
873 ipv4_deletestaleaddrs(struct interface *ifp)
874 {
875 	struct ipv4_state *state;
876 	struct ipv4_addr *ia, *ia1;
877 
878 	state = IPV4_STATE(ifp);
879 	if (state == NULL)
880 		return;
881 
882 	TAILQ_FOREACH_SAFE(ia, &state->addrs, next, ia1) {
883 		if (!(ia->flags & IPV4_AF_STALE))
884 			continue;
885 		ipv4_handleifa(ifp->ctx, RTM_DELADDR,
886 		    ifp->ctx->ifaces, ifp->name,
887 		    &ia->addr, &ia->mask, &ia->brd, 0, getpid());
888 	}
889 }
890 
891 void
892 ipv4_handleifa(struct dhcpcd_ctx *ctx,
893     int cmd, struct if_head *ifs, const char *ifname,
894     const struct in_addr *addr, const struct in_addr *mask,
895     const struct in_addr *brd, int addrflags, pid_t pid)
896 {
897 	struct interface *ifp;
898 	struct ipv4_state *state;
899 	struct ipv4_addr *ia;
900 	bool ia_is_new;
901 
902 #if 0
903 	char sbrdbuf[INET_ADDRSTRLEN];
904 	const char *sbrd;
905 
906 	if (brd)
907 		sbrd = inet_ntop(AF_INET, brd, sbrdbuf, sizeof(sbrdbuf));
908 	else
909 		sbrd = NULL;
910 	logdebugx("%s: %s %s/%d %s %d", ifname,
911 	    cmd == RTM_NEWADDR ? "RTM_NEWADDR" :
912 	    cmd == RTM_DELADDR ? "RTM_DELADDR" : "???",
913 	    inet_ntoa(*addr), inet_ntocidr(*mask), sbrd, addrflags);
914 #endif
915 
916 	if (ifs == NULL)
917 		ifs = ctx->ifaces;
918 	if (ifs == NULL) {
919 		errno = ESRCH;
920 		return;
921 	}
922 	if ((ifp = if_find(ifs, ifname)) == NULL)
923 		return;
924 	if ((state = ipv4_getstate(ifp)) == NULL) {
925 		errno = ENOENT;
926 		return;
927 	}
928 
929 	ia = ipv4_iffindaddr(ifp, addr, NULL);
930 	switch (cmd) {
931 	case RTM_NEWADDR:
932 		if (ia == NULL) {
933 			if ((ia = malloc(sizeof(*ia))) == NULL) {
934 				logerr(__func__);
935 				return;
936 			}
937 			ia->iface = ifp;
938 			ia->addr = *addr;
939 			ia->mask = *mask;
940 			ia->flags = 0;
941 			ia_is_new = true;
942 #ifdef ALIAS_ADDR
943 			strlcpy(ia->alias, ifname, sizeof(ia->alias));
944 #endif
945 			TAILQ_INSERT_TAIL(&state->addrs, ia, next);
946 		} else
947 			ia_is_new = false;
948 		/* Mask could have changed */
949 		if (ia_is_new ||
950 		    (mask->s_addr != INADDR_ANY &&
951 		    mask->s_addr != ia->mask.s_addr))
952 		{
953 			ia->mask = *mask;
954 			snprintf(ia->saddr, sizeof(ia->saddr), "%s/%d",
955 			    inet_ntoa(*addr), inet_ntocidr(*mask));
956 		}
957 		if (brd != NULL)
958 			ia->brd = *brd;
959 		else
960 			ia->brd.s_addr = INADDR_ANY;
961 		ia->addr_flags = addrflags;
962 		ia->flags &= ~IPV4_AF_STALE;
963 		break;
964 	case RTM_DELADDR:
965 		if (ia == NULL)
966 			return;
967 		if (mask->s_addr != INADDR_ANY &&
968 		    mask->s_addr != ia->mask.s_addr)
969 			return;
970 		TAILQ_REMOVE(&state->addrs, ia, next);
971 		break;
972 	default:
973 		return;
974 	}
975 
976 	if (addr->s_addr != INADDR_ANY && addr->s_addr != INADDR_BROADCAST) {
977 		ia = dhcp_handleifa(cmd, ia, pid);
978 #ifdef IPV4LL
979 		if (ia != NULL)
980 			ipv4ll_handleifa(cmd, ia, pid);
981 #endif
982 	}
983 
984 	if (cmd == RTM_DELADDR)
985 		free(ia);
986 }
987 
988 void
989 ipv4_free(struct interface *ifp)
990 {
991 	struct ipv4_state *state;
992 	struct ipv4_addr *ia;
993 
994 	if (ifp == NULL || (state = IPV4_STATE(ifp)) == NULL)
995 		return;
996 
997 	while ((ia = TAILQ_FIRST(&state->addrs))) {
998 		TAILQ_REMOVE(&state->addrs, ia, next);
999 		free(ia);
1000 	}
1001 	free(state);
1002 }
1003