]> git.ipfire.org Git - thirdparty/dhcpcd.git/blob - src/ipv4.c
control: Fix working with new eloop
[thirdparty/dhcpcd.git] / src / ipv4.c
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 }