Import dhcpcd-8.0.6 with the following changes:
[dragonfly.git] / contrib / dhcpcd / src / dhcp.c
1 /* SPDX-License-Identifier: BSD-2-Clause */
2 /*
3  * dhcpcd - DHCP client daemon
4  * Copyright (c) 2006-2019 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/param.h>
30 #include <sys/socket.h>
31 #include <sys/stat.h>
32
33 #include <arpa/inet.h>
34 #include <net/if.h>
35 #include <net/route.h>
36 #include <netinet/if_ether.h>
37 #include <netinet/in_systm.h>
38 #include <netinet/in.h>
39 #include <netinet/ip.h>
40 #define __FAVOR_BSD /* Nasty glibc hack so we can use BSD semantics for UDP */
41 #include <netinet/udp.h>
42 #undef __FAVOR_BSD
43
44 #include <assert.h>
45 #include <ctype.h>
46 #include <errno.h>
47 #include <fcntl.h>
48 #include <inttypes.h>
49 #include <stdbool.h>
50 #include <stddef.h>
51 #include <stdio.h>
52 #include <stdlib.h>
53 #include <string.h>
54 #include <unistd.h>
55
56 #define ELOOP_QUEUE 2
57 #include "config.h"
58 #include "arp.h"
59 #include "bpf.h"
60 #include "common.h"
61 #include "dhcp.h"
62 #include "dhcpcd.h"
63 #include "dhcp-common.h"
64 #include "duid.h"
65 #include "eloop.h"
66 #include "if.h"
67 #include "ipv4.h"
68 #include "ipv4ll.h"
69 #include "logerr.h"
70 #include "sa.h"
71 #include "script.h"
72
73 #define DAD             "Duplicate address detected"
74 #define DHCP_MIN_LEASE  20
75
76 #define IPV4A           ADDRIPV4 | ARRAY
77 #define IPV4R           ADDRIPV4 | REQUEST
78
79 /* We should define a maximum for the NAK exponential backoff */
80 #define NAKOFF_MAX              60
81
82 /* Wait N nanoseconds between sending a RELEASE and dropping the address.
83  * This gives the kernel enough time to actually send it. */
84 #define RELEASE_DELAY_S         0
85 #define RELEASE_DELAY_NS        10000000
86
87 #ifndef IPDEFTTL
88 #define IPDEFTTL 64 /* RFC1340 */
89 #endif
90
91 /* Support older systems with different defines */
92 #if !defined(IP_RECVPKTINFO) && defined(IP_PKTINFO)
93 #define IP_RECVPKTINFO IP_PKTINFO
94 #endif
95
96 /* Assert the correct structure size for on wire */
97 __CTASSERT(sizeof(struct ip)            == 20);
98 __CTASSERT(sizeof(struct udphdr)        == 8);
99 __CTASSERT(sizeof(struct bootp)         == 300);
100
101 struct dhcp_op {
102         uint8_t value;
103         const char *name;
104 };
105
106 static const struct dhcp_op dhcp_ops[] = {
107         { DHCP_DISCOVER,   "DISCOVER" },
108         { DHCP_OFFER,      "OFFER" },
109         { DHCP_REQUEST,    "REQUEST" },
110         { DHCP_DECLINE,    "DECLINE" },
111         { DHCP_ACK,        "ACK" },
112         { DHCP_NAK,        "NAK" },
113         { DHCP_RELEASE,    "RELEASE" },
114         { DHCP_INFORM,     "INFORM" },
115         { DHCP_FORCERENEW, "FORCERENEW"},
116         { 0, NULL }
117 };
118
119 static const char * const dhcp_params[] = {
120         "ip_address",
121         "subnet_cidr",
122         "network_number",
123         "filename",
124         "server_name",
125         NULL
126 };
127
128 static int dhcp_openbpf(struct interface *);
129 static void dhcp_start1(void *);
130 #if defined(ARP) && (!defined(KERNEL_RFC5227) || defined(ARPING))
131 static void dhcp_arp_found(struct arp_state *, const struct arp_msg *);
132 #endif
133 static void dhcp_handledhcp(struct interface *, struct bootp *, size_t,
134     const struct in_addr *);
135 #ifdef IP_PKTINFO
136 static void dhcp_handleifudp(void *);
137 #endif
138 static int dhcp_initstate(struct interface *);
139
140 void
141 dhcp_printoptions(const struct dhcpcd_ctx *ctx,
142     const struct dhcp_opt *opts, size_t opts_len)
143 {
144         const char * const *p;
145         size_t i, j;
146         const struct dhcp_opt *opt, *opt2;
147         int cols;
148
149         for (p = dhcp_params; *p; p++)
150                 printf("    %s\n", *p);
151
152         for (i = 0, opt = ctx->dhcp_opts; i < ctx->dhcp_opts_len; i++, opt++) {
153                 for (j = 0, opt2 = opts; j < opts_len; j++, opt2++)
154                         if (opt->option == opt2->option)
155                                 break;
156                 if (j == opts_len) {
157                         cols = printf("%03d %s", opt->option, opt->var);
158                         dhcp_print_option_encoding(opt, cols);
159                 }
160         }
161         for (i = 0, opt = opts; i < opts_len; i++, opt++) {
162                 cols = printf("%03d %s", opt->option, opt->var);
163                 dhcp_print_option_encoding(opt, cols);
164         }
165 }
166
167 #define get_option_raw(ctx, bootp, bootp_len, opt)      \
168         get_option((ctx), (bootp), (bootp_len), NULL)
169 static const uint8_t *
170 get_option(struct dhcpcd_ctx *ctx,
171     const struct bootp *bootp, size_t bootp_len,
172     unsigned int opt, size_t *opt_len)
173 {
174         const uint8_t *p, *e;
175         uint8_t l, o, ol, overl, *bp;
176         const uint8_t *op;
177         size_t bl;
178
179         /* Check we have the magic cookie */
180         if (!IS_DHCP(bootp)) {
181                 errno = ENOTSUP;
182                 return NULL;
183         }
184
185         p = bootp->vend + 4; /* options after the 4 byte cookie */
186         e = (const uint8_t *)bootp + bootp_len;
187         ol = o = overl = 0;
188         bp = NULL;
189         op = NULL;
190         bl = 0;
191         while (p < e) {
192                 o = *p++;
193                 switch (o) {
194                 case DHO_PAD:
195                         /* No length to read */
196                         continue;
197                 case DHO_END:
198                         if (overl & 1) {
199                                 /* bit 1 set means parse boot file */
200                                 overl = (uint8_t)(overl & ~1);
201                                 p = bootp->file;
202                                 e = p + sizeof(bootp->file);
203                         } else if (overl & 2) {
204                                 /* bit 2 set means parse server name */
205                                 overl = (uint8_t)(overl & ~2);
206                                 p = bootp->sname;
207                                 e = p + sizeof(bootp->sname);
208                         } else
209                                 goto exit;
210                         /* No length to read */
211                         continue;
212                 }
213
214                 /* Check we can read the length */
215                 if (p == e) {
216                         errno = EINVAL;
217                         return NULL;
218                 }
219                 l = *p++;
220
221                 /* Check we can read the option data, if present */
222                 if (p + l > e) {
223                         errno = EINVAL;
224                         return NULL;
225                 }
226
227                 if (o == DHO_OPTSOVERLOADED) {
228                         /* Ensure we only get this option once by setting
229                          * the last bit as well as the value.
230                          * This is valid because only the first two bits
231                          * actually mean anything in RFC2132 Section 9.3 */
232                         if (l == 1 && !overl)
233                                 overl = 0x80 | p[0];
234                 }
235
236                 if (o == opt) {
237                         if (op) {
238                                 /* We must concatonate the options. */
239                                 if (bl + l > ctx->opt_buffer_len) {
240                                         size_t pos;
241                                         uint8_t *nb;
242
243                                         if (bp)
244                                                 pos = (size_t)
245                                                     (bp - ctx->opt_buffer);
246                                         else
247                                                 pos = 0;
248                                         nb = realloc(ctx->opt_buffer, bl + l);
249                                         if (nb == NULL)
250                                                 return NULL;
251                                         ctx->opt_buffer = nb;
252                                         ctx->opt_buffer_len = bl + l;
253                                         bp = ctx->opt_buffer + pos;
254                                 }
255                                 if (bp == NULL)
256                                         bp = ctx->opt_buffer;
257                                 memcpy(bp, op, ol);
258                                 bp += ol;
259                         }
260                         ol = l;
261                         op = p;
262                         bl += ol;
263                 }
264                 p += l;
265         }
266
267 exit:
268         if (opt_len)
269                 *opt_len = bl;
270         if (bp) {
271                 memcpy(bp, op, ol);
272                 return (const uint8_t *)ctx->opt_buffer;
273         }
274         if (op)
275                 return op;
276         errno = ENOENT;
277         return NULL;
278 }
279
280 static int
281 get_option_addr(struct dhcpcd_ctx *ctx,
282     struct in_addr *a, const struct bootp *bootp, size_t bootp_len,
283     uint8_t option)
284 {
285         const uint8_t *p;
286         size_t len;
287
288         p = get_option(ctx, bootp, bootp_len, option, &len);
289         if (!p || len < (ssize_t)sizeof(a->s_addr))
290                 return -1;
291         memcpy(&a->s_addr, p, sizeof(a->s_addr));
292         return 0;
293 }
294
295 static int
296 get_option_uint32(struct dhcpcd_ctx *ctx,
297     uint32_t *i, const struct bootp *bootp, size_t bootp_len, uint8_t option)
298 {
299         const uint8_t *p;
300         size_t len;
301         uint32_t d;
302
303         p = get_option(ctx, bootp, bootp_len, option, &len);
304         if (!p || len < (ssize_t)sizeof(d))
305                 return -1;
306         memcpy(&d, p, sizeof(d));
307         if (i)
308                 *i = ntohl(d);
309         return 0;
310 }
311
312 static int
313 get_option_uint16(struct dhcpcd_ctx *ctx,
314     uint16_t *i, const struct bootp *bootp, size_t bootp_len, uint8_t option)
315 {
316         const uint8_t *p;
317         size_t len;
318         uint16_t d;
319
320         p = get_option(ctx, bootp, bootp_len, option, &len);
321         if (!p || len < (ssize_t)sizeof(d))
322                 return -1;
323         memcpy(&d, p, sizeof(d));
324         if (i)
325                 *i = ntohs(d);
326         return 0;
327 }
328
329 static int
330 get_option_uint8(struct dhcpcd_ctx *ctx,
331     uint8_t *i, const struct bootp *bootp, size_t bootp_len, uint8_t option)
332 {
333         const uint8_t *p;
334         size_t len;
335
336         p = get_option(ctx, bootp, bootp_len, option, &len);
337         if (!p || len < (ssize_t)sizeof(*p))
338                 return -1;
339         if (i)
340                 *i = *(p);
341         return 0;
342 }
343
344 ssize_t
345 print_rfc3442(FILE *fp, const uint8_t *data, size_t data_len)
346 {
347         const uint8_t *p = data, *e;
348         size_t ocets;
349         uint8_t cidr;
350         struct in_addr addr;
351
352         /* Minimum is 5 -first is CIDR and a router length of 4 */
353         if (data_len < 5) {
354                 errno = EINVAL;
355                 return -1;
356         }
357
358         e = p + data_len;
359         while (p < e) {
360                 if (p != data) {
361                         if (fputc(' ', fp) == EOF)
362                                 return -1;
363                 }
364                 cidr = *p++;
365                 if (cidr > 32) {
366                         errno = EINVAL;
367                         return -1;
368                 }
369                 ocets = (size_t)(cidr + 7) / NBBY;
370                 if (p + 4 + ocets > e) {
371                         errno = ERANGE;
372                         return -1;
373                 }
374                 /* If we have ocets then we have a destination and netmask */
375                 addr.s_addr = 0;
376                 if (ocets > 0) {
377                         memcpy(&addr.s_addr, p, ocets);
378                         p += ocets;
379                 }
380                 if (fprintf(fp, "%s/%d", inet_ntoa(addr), cidr) == -1)
381                         return -1;
382
383                 /* Finally, snag the router */
384                 memcpy(&addr.s_addr, p, 4);
385                 p += 4;
386                 if (fprintf(fp, " %s", inet_ntoa(addr)) == -1)
387                         return -1;
388         }
389
390         if (fputc('\0', fp) == EOF)
391                 return -1;
392         return 1;
393 }
394
395 static int
396 decode_rfc3442_rt(rb_tree_t *routes, struct interface *ifp,
397     const uint8_t *data, size_t dl, const struct bootp *bootp)
398 {
399         const uint8_t *p = data;
400         const uint8_t *e;
401         uint8_t cidr;
402         size_t ocets;
403         struct rt *rt = NULL;
404         struct in_addr dest, netmask, gateway;
405         int n;
406
407         /* Minimum is 5 -first is CIDR and a router length of 4 */
408         if (dl < 5) {
409                 errno = EINVAL;
410                 return -1;
411         }
412
413         n = 0;
414         e = p + dl;
415         while (p < e) {
416                 cidr = *p++;
417                 if (cidr > 32) {
418                         errno = EINVAL;
419                         return -1;
420                 }
421
422                 ocets = (size_t)(cidr + 7) / NBBY;
423                 if (p + 4 + ocets > e) {
424                         errno = ERANGE;
425                         return -1;
426                 }
427
428                 if ((rt = rt_new(ifp)) == NULL)
429                         return -1;
430
431                 /* If we have ocets then we have a destination and netmask */
432                 dest.s_addr = 0;
433                 if (ocets > 0) {
434                         memcpy(&dest.s_addr, p, ocets);
435                         p += ocets;
436                         netmask.s_addr = htonl(~0U << (32 - cidr));
437                 } else
438                         netmask.s_addr = 0;
439
440                 /* Finally, snag the router */
441                 memcpy(&gateway.s_addr, p, 4);
442                 p += 4;
443
444                 /* An on-link host route is normally set by having the
445                  * gateway match the destination or assigned address */
446                 if (gateway.s_addr == dest.s_addr ||
447                     (gateway.s_addr == bootp->yiaddr ||
448                     gateway.s_addr == bootp->ciaddr))
449                 {
450                         gateway.s_addr = INADDR_ANY;
451                         netmask.s_addr = INADDR_BROADCAST;
452                 }
453                 if (netmask.s_addr == INADDR_BROADCAST)
454                         rt->rt_flags = RTF_HOST;
455
456                 sa_in_init(&rt->rt_dest, &dest);
457                 sa_in_init(&rt->rt_netmask, &netmask);
458                 sa_in_init(&rt->rt_gateway, &gateway);
459                 if (rt_proto_add(routes, rt))
460                         n = 1;
461         }
462         return n;
463 }
464
465 ssize_t
466 print_rfc3361(FILE *fp, const uint8_t *data, size_t dl)
467 {
468         uint8_t enc;
469         char sip[NS_MAXDNAME];
470         struct in_addr addr;
471
472         if (dl < 2) {
473                 errno = EINVAL;
474                 return 0;
475         }
476
477         enc = *data++;
478         dl--;
479         switch (enc) {
480         case 0:
481                 if (decode_rfc1035(sip, sizeof(sip), data, dl) == -1)
482                         return -1;
483                 if (efprintf(fp, "%s", sip) == -1)
484                         return -1;
485                 break;
486         case 1:
487                 if (dl == 0 || dl % 4 != 0) {
488                         errno = EINVAL;
489                         break;
490                 }
491                 addr.s_addr = INADDR_BROADCAST;
492                 for (;
493                     dl != 0;
494                     data += sizeof(addr.s_addr), dl -= sizeof(addr.s_addr))
495                 {
496                         memcpy(&addr.s_addr, data, sizeof(addr.s_addr));
497                         if (fprintf(fp, "%s", inet_ntoa(addr)) == -1)
498                                 return -1;
499                         if (dl != 0) {
500                                 if (fputc(' ', fp) == EOF)
501                                         return -1;
502                         }
503                 }
504                 if (fputc('\0', fp) == EOF)
505                         return -1;
506                 break;
507         default:
508                 errno = EINVAL;
509                 return 0;
510         }
511
512         return 1;
513 }
514
515 static char *
516 get_option_string(struct dhcpcd_ctx *ctx,
517     const struct bootp *bootp, size_t bootp_len, uint8_t option)
518 {
519         size_t len;
520         const uint8_t *p;
521         char *s;
522
523         p = get_option(ctx, bootp, bootp_len, option, &len);
524         if (!p || len == 0 || *p == '\0')
525                 return NULL;
526
527         s = malloc(sizeof(char) * (len + 1));
528         if (s) {
529                 memcpy(s, p, len);
530                 s[len] = '\0';
531         }
532         return s;
533 }
534
535 /* This calculates the netmask that we should use for static routes.
536  * This IS different from the calculation used to calculate the netmask
537  * for an interface address. */
538 static uint32_t
539 route_netmask(uint32_t ip_in)
540 {
541         /* used to be unsigned long - check if error */
542         uint32_t p = ntohl(ip_in);
543         uint32_t t;
544
545         if (IN_CLASSA(p))
546                 t = ~IN_CLASSA_NET;
547         else {
548                 if (IN_CLASSB(p))
549                         t = ~IN_CLASSB_NET;
550                 else {
551                         if (IN_CLASSC(p))
552                                 t = ~IN_CLASSC_NET;
553                         else
554                                 t = 0;
555                 }
556         }
557
558         while (t & p)
559                 t >>= 1;
560
561         return (htonl(~t));
562 }
563
564 /* We need to obey routing options.
565  * If we have a CSR then we only use that.
566  * Otherwise we add static routes and then routers. */
567 static int
568 get_option_routes(rb_tree_t *routes, struct interface *ifp,
569     const struct bootp *bootp, size_t bootp_len)
570 {
571         struct if_options *ifo = ifp->options;
572         const uint8_t *p;
573         const uint8_t *e;
574         struct rt *rt = NULL;
575         struct in_addr dest, netmask, gateway;
576         size_t len;
577         const char *csr = "";
578         int n;
579
580         /* If we have CSR's then we MUST use these only */
581         if (!has_option_mask(ifo->nomask, DHO_CSR))
582                 p = get_option(ifp->ctx, bootp, bootp_len, DHO_CSR, &len);
583         else
584                 p = NULL;
585         /* Check for crappy MS option */
586         if (!p && !has_option_mask(ifo->nomask, DHO_MSCSR)) {
587                 p = get_option(ifp->ctx, bootp, bootp_len, DHO_MSCSR, &len);
588                 if (p)
589                         csr = "MS ";
590         }
591         if (p && (n = decode_rfc3442_rt(routes, ifp, p, len, bootp)) != -1) {
592                 const struct dhcp_state *state;
593
594                 state = D_CSTATE(ifp);
595                 if (!(ifo->options & DHCPCD_CSR_WARNED) &&
596                     !(state->added & STATE_FAKE))
597                 {
598                         logdebugx("%s: using %sClassless Static Routes",
599                             ifp->name, csr);
600                         ifo->options |= DHCPCD_CSR_WARNED;
601                 }
602                 return n;
603         }
604
605         n = 0;
606         /* OK, get our static routes first. */
607         if (!has_option_mask(ifo->nomask, DHO_STATICROUTE))
608                 p = get_option(ifp->ctx, bootp, bootp_len,
609                     DHO_STATICROUTE, &len);
610         else
611                 p = NULL;
612         /* RFC 2131 Section 5.8 states length MUST be in multiples of 8 */
613         if (p && len % 8 == 0) {
614                 e = p + len;
615                 while (p < e) {
616                         memcpy(&dest.s_addr, p, sizeof(dest.s_addr));
617                         p += 4;
618                         memcpy(&gateway.s_addr, p, sizeof(gateway.s_addr));
619                         p += 4;
620                         /* RFC 2131 Section 5.8 states default route is
621                          * illegal */
622                         if (gateway.s_addr == INADDR_ANY)
623                                 continue;
624                         if ((rt = rt_new(ifp)) == NULL)
625                                 return -1;
626
627                         /* A on-link host route is normally set by having the
628                          * gateway match the destination or assigned address */
629                         if (gateway.s_addr == dest.s_addr ||
630                              (gateway.s_addr == bootp->yiaddr ||
631                               gateway.s_addr == bootp->ciaddr))
632                         {
633                                 gateway.s_addr = INADDR_ANY;
634                                 netmask.s_addr = INADDR_BROADCAST;
635                         } else
636                                 netmask.s_addr = route_netmask(dest.s_addr);
637                         if (netmask.s_addr == INADDR_BROADCAST)
638                                 rt->rt_flags = RTF_HOST;
639
640                         sa_in_init(&rt->rt_dest, &dest);
641                         sa_in_init(&rt->rt_netmask, &netmask);
642                         sa_in_init(&rt->rt_gateway, &gateway);
643                         if (rt_proto_add(routes, rt))
644                                 n++;
645                 }
646         }
647
648         /* Now grab our routers */
649         if (!has_option_mask(ifo->nomask, DHO_ROUTER))
650                 p = get_option(ifp->ctx, bootp, bootp_len, DHO_ROUTER, &len);
651         else
652                 p = NULL;
653         if (p && len % 4 == 0) {
654                 e = p + len;
655                 dest.s_addr = INADDR_ANY;
656                 netmask.s_addr = INADDR_ANY;
657                 while (p < e) {
658                         if ((rt = rt_new(ifp)) == NULL)
659                                 return -1;
660                         memcpy(&gateway.s_addr, p, sizeof(gateway.s_addr));
661                         p += 4;
662                         sa_in_init(&rt->rt_dest, &dest);
663                         sa_in_init(&rt->rt_netmask, &netmask);
664                         sa_in_init(&rt->rt_gateway, &gateway);
665                         if (rt_proto_add(routes, rt))
666                                 n++;
667                 }
668         }
669
670         return n;
671 }
672
673 uint16_t
674 dhcp_get_mtu(const struct interface *ifp)
675 {
676         const struct dhcp_state *state;
677         uint16_t mtu;
678
679         if (ifp->options->mtu)
680                 return (uint16_t)ifp->options->mtu;
681         mtu = 0; /* bogus gcc warning */
682         if ((state = D_CSTATE(ifp)) == NULL ||
683             has_option_mask(ifp->options->nomask, DHO_MTU) ||
684             get_option_uint16(ifp->ctx, &mtu,
685                               state->new, state->new_len, DHO_MTU) == -1)
686                 return 0;
687         return mtu;
688 }
689
690 /* Grab our routers from the DHCP message and apply any MTU value
691  * the message contains */
692 int
693 dhcp_get_routes(rb_tree_t *routes, struct interface *ifp)
694 {
695         const struct dhcp_state *state;
696
697         if ((state = D_CSTATE(ifp)) == NULL || !(state->added & STATE_ADDED))
698                 return 0;
699         return get_option_routes(routes, ifp, state->new, state->new_len);
700 }
701
702 /* Assumes DHCP options */
703 static int
704 dhcp_message_add_addr(struct bootp *bootp,
705     uint8_t type, struct in_addr addr)
706 {
707         uint8_t *p;
708         size_t len;
709
710         p = bootp->vend;
711         while (*p != DHO_END) {
712                 p++;
713                 p += *p + 1;
714         }
715
716         len = (size_t)(p - bootp->vend);
717         if (len + 6 > sizeof(bootp->vend)) {
718                 errno = ENOMEM;
719                 return -1;
720         }
721
722         *p++ = type;
723         *p++ = 4;
724         memcpy(p, &addr.s_addr, 4);
725         p += 4;
726         *p = DHO_END;
727         return 0;
728 }
729
730 static ssize_t
731 make_message(struct bootp **bootpm, const struct interface *ifp, uint8_t type)
732 {
733         struct bootp *bootp;
734         uint8_t *lp, *p, *e;
735         uint8_t *n_params = NULL;
736         uint32_t ul;
737         uint16_t sz;
738         size_t len, i;
739         const struct dhcp_opt *opt;
740         struct if_options *ifo = ifp->options;
741         const struct dhcp_state *state = D_CSTATE(ifp);
742         const struct dhcp_lease *lease = &state->lease;
743         char hbuf[HOSTNAME_MAX_LEN + 1];
744         const char *hostname;
745         const struct vivco *vivco;
746         int mtu;
747 #ifdef AUTH
748         uint8_t *auth, auth_len;
749 #endif
750
751         if ((mtu = if_getmtu(ifp)) == -1)
752                 logerr("%s: if_getmtu", ifp->name);
753         else if (mtu < MTU_MIN) {
754                 if (if_setmtu(ifp, MTU_MIN) == -1)
755                         logerr("%s: if_setmtu", ifp->name);
756                 mtu = MTU_MIN;
757         }
758
759         if (ifo->options & DHCPCD_BOOTP)
760                 bootp = calloc(1, sizeof (*bootp));
761         else
762                 /* Make the maximal message we could send */
763                 bootp = calloc(1, (size_t)(mtu - IP_UDP_SIZE));
764
765         if (bootp == NULL)
766                 return -1;
767         *bootpm = bootp;
768
769         if (state->addr != NULL &&
770             (type == DHCP_INFORM || type == DHCP_RELEASE ||
771             (type == DHCP_REQUEST &&
772             state->addr->mask.s_addr == lease->mask.s_addr &&
773             (state->new == NULL || IS_DHCP(state->new)) &&
774             !(state->added & STATE_FAKE))))
775                 bootp->ciaddr = state->addr->addr.s_addr;
776
777         bootp->op = BOOTREQUEST;
778         bootp->htype = (uint8_t)ifp->family;
779         switch (ifp->family) {
780         case ARPHRD_ETHER:
781         case ARPHRD_IEEE802:
782                 bootp->hlen = (uint8_t)ifp->hwlen;
783                 memcpy(&bootp->chaddr, &ifp->hwaddr, ifp->hwlen);
784                 break;
785         }
786
787         if (ifo->options & DHCPCD_BROADCAST &&
788             bootp->ciaddr == 0 &&
789             type != DHCP_DECLINE &&
790             type != DHCP_RELEASE)
791                 bootp->flags = htons(BROADCAST_FLAG);
792
793         if (type != DHCP_DECLINE && type != DHCP_RELEASE) {
794                 struct timespec tv;
795
796                 clock_gettime(CLOCK_MONOTONIC, &tv);
797                 timespecsub(&tv, &state->started, &tv);
798                 if (tv.tv_sec < 0 || tv.tv_sec > (time_t)UINT16_MAX)
799                         bootp->secs = htons((uint16_t)UINT16_MAX);
800                 else
801                         bootp->secs = htons((uint16_t)tv.tv_sec);
802         }
803
804         bootp->xid = htonl(state->xid);
805
806         if (ifo->options & DHCPCD_BOOTP)
807                 return sizeof(*bootp);
808
809         p = bootp->vend;
810         e = (uint8_t *)bootp + (mtu - IP_UDP_SIZE) - 1; /* -1 for DHO_END */
811
812         ul = htonl(MAGIC_COOKIE);
813         memcpy(p, &ul, sizeof(ul));
814         p += sizeof(ul);
815
816         *p++ = DHO_MESSAGETYPE;
817         *p++ = 1;
818         *p++ = type;
819
820 #define AREA_LEFT       (size_t)(e - p)
821 #define AREA_FIT(s)     if ((s) > AREA_LEFT) goto toobig
822 #define AREA_CHECK(s)   if ((s) + 2UL > AREA_LEFT) goto toobig
823 #define PUT_ADDR(o, a)  do {            \
824         AREA_CHECK(4);                  \
825         *p++ = (o);                     \
826         *p++ = 4;                       \
827         memcpy(p, &(a)->s_addr, 4);     \
828         p += 4;                         \
829 } while (0 /* CONSTCOND */)
830
831         if (state->clientid) {
832                 AREA_CHECK(state->clientid[0]);
833                 *p++ = DHO_CLIENTID;
834                 memcpy(p, state->clientid, (size_t)state->clientid[0] + 1);
835                 p += state->clientid[0] + 1;
836         }
837
838         if (lease->addr.s_addr && lease->cookie == htonl(MAGIC_COOKIE)) {
839                 if (type == DHCP_DECLINE ||
840                     (type == DHCP_REQUEST &&
841                     (state->addr == NULL ||
842                     state->added & STATE_FAKE ||
843                     lease->addr.s_addr != state->addr->addr.s_addr)))
844                 {
845                         PUT_ADDR(DHO_IPADDRESS, &lease->addr);
846                         if (lease->server.s_addr)
847                                 PUT_ADDR(DHO_SERVERID, &lease->server);
848                 }
849
850                 if (type == DHCP_RELEASE) {
851                         if (lease->server.s_addr)
852                                 PUT_ADDR(DHO_SERVERID, &lease->server);
853                 }
854         }
855
856         if (type == DHCP_DECLINE) {
857                 len = strlen(DAD);
858                 if (len > AREA_LEFT) {
859                         *p++ = DHO_MESSAGE;
860                         *p++ = (uint8_t)len;
861                         memcpy(p, DAD, len);
862                         p += len;
863                 }
864         }
865
866         if (type == DHCP_DISCOVER &&
867             !(ifp->ctx->options & DHCPCD_TEST) &&
868             has_option_mask(ifo->requestmask, DHO_RAPIDCOMMIT))
869         {
870                 /* RFC 4039 Section 3 */
871                 AREA_CHECK(0);
872                 *p++ = DHO_RAPIDCOMMIT;
873                 *p++ = 0;
874         }
875
876         if (type == DHCP_DISCOVER && ifo->options & DHCPCD_REQUEST)
877                 PUT_ADDR(DHO_IPADDRESS, &ifo->req_addr);
878
879         /* RFC 2563 Auto Configure */
880         if (type == DHCP_DISCOVER && ifo->options & DHCPCD_IPV4LL) {
881                 AREA_CHECK(1);
882                 *p++ = DHO_AUTOCONFIGURE;
883                 *p++ = 1;
884                 *p++ = 1;
885         }
886
887         if (type == DHCP_DISCOVER ||
888             type == DHCP_INFORM ||
889             type == DHCP_REQUEST)
890         {
891                 if (mtu != -1) {
892                         AREA_CHECK(2);
893                         *p++ = DHO_MAXMESSAGESIZE;
894                         *p++ = 2;
895                         sz = htons((uint16_t)(mtu - IP_UDP_SIZE));
896                         memcpy(p, &sz, 2);
897                         p += 2;
898                 }
899
900                 if (ifo->userclass[0]) {
901                         AREA_CHECK(ifo->userclass[0]);
902                         *p++ = DHO_USERCLASS;
903                         memcpy(p, ifo->userclass,
904                             (size_t)ifo->userclass[0] + 1);
905                         p += ifo->userclass[0] + 1;
906                 }
907
908                 if (ifo->vendorclassid[0]) {
909                         AREA_CHECK(ifo->vendorclassid[0]);
910                         *p++ = DHO_VENDORCLASSID;
911                         memcpy(p, ifo->vendorclassid,
912                             (size_t)ifo->vendorclassid[0] + 1);
913                         p += ifo->vendorclassid[0] + 1;
914                 }
915
916                 if (ifo->mudurl[0]) {
917                        AREA_CHECK(ifo->mudurl[0]);
918                        *p++ = DHO_MUDURL;
919                        memcpy(p, ifo->mudurl, (size_t)ifo->mudurl[0] + 1);
920                        p += ifo->mudurl[0] + 1;
921                 }
922
923                 if (type != DHCP_INFORM) {
924                         if (ifo->leasetime != 0) {
925                                 AREA_CHECK(4);
926                                 *p++ = DHO_LEASETIME;
927                                 *p++ = 4;
928                                 ul = htonl(ifo->leasetime);
929                                 memcpy(p, &ul, 4);
930                                 p += 4;
931                         }
932                 }
933
934                 hostname = dhcp_get_hostname(hbuf, sizeof(hbuf), ifo);
935
936                 /*
937                  * RFC4702 3.1 States that if we send the Client FQDN option
938                  * then we MUST NOT also send the Host Name option.
939                  * Technically we could, but that is not RFC conformant and
940                  * also seems to break some DHCP server implemetations such as
941                  * Windows. On the other hand, ISC dhcpd is just as non RFC
942                  * conformant by not accepting a partially qualified FQDN.
943                  */
944                 if (ifo->fqdn != FQDN_DISABLE) {
945                         /* IETF DHC-FQDN option (81), RFC4702 */
946                         i = 3;
947                         if (hostname)
948                                 i += encode_rfc1035(hostname, NULL);
949                         AREA_CHECK(i);
950                         *p++ = DHO_FQDN;
951                         *p++ = (uint8_t)i;
952                         /*
953                          * Flags: 0000NEOS
954                          * S: 1 => Client requests Server to update
955                          *         a RR in DNS as well as PTR
956                          * O: 1 => Server indicates to client that
957                          *         DNS has been updated
958                          * E: 1 => Name data is DNS format
959                          * N: 1 => Client requests Server to not
960                          *         update DNS
961                          */
962                         if (hostname)
963                                 *p++ = (uint8_t)((ifo->fqdn & 0x09) | 0x04);
964                         else
965                                 *p++ = (FQDN_NONE & 0x09) | 0x04;
966                         *p++ = 0; /* from server for PTR RR */
967                         *p++ = 0; /* from server for A RR if S=1 */
968                         if (hostname) {
969                                 i = encode_rfc1035(hostname, p);
970                                 p += i;
971                         }
972                 } else if (ifo->options & DHCPCD_HOSTNAME && hostname) {
973                         len = strlen(hostname);
974                         AREA_CHECK(len);
975                         *p++ = DHO_HOSTNAME;
976                         *p++ = (uint8_t)len;
977                         memcpy(p, hostname, len);
978                         p += len;
979                 }
980
981                 /* vendor is already encoded correctly, so just add it */
982                 if (ifo->vendor[0]) {
983                         AREA_CHECK(ifo->vendor[0]);
984                         *p++ = DHO_VENDOR;
985                         memcpy(p, ifo->vendor, (size_t)ifo->vendor[0] + 1);
986                         p += ifo->vendor[0] + 1;
987                 }
988
989 #ifdef AUTH
990                 if ((ifo->auth.options & DHCPCD_AUTH_SENDREQUIRE) !=
991                     DHCPCD_AUTH_SENDREQUIRE)
992                 {
993                         /* We support HMAC-MD5 */
994                         AREA_CHECK(1);
995                         *p++ = DHO_FORCERENEW_NONCE;
996                         *p++ = 1;
997                         *p++ = AUTH_ALG_HMAC_MD5;
998                 }
999 #endif
1000
1001                 if (ifo->vivco_len) {
1002                         AREA_CHECK(sizeof(ul));
1003                         *p++ = DHO_VIVCO;
1004                         lp = p++;
1005                         *lp = sizeof(ul);
1006                         ul = htonl(ifo->vivco_en);
1007                         memcpy(p, &ul, sizeof(ul));
1008                         p += sizeof(ul);
1009                         for (i = 0, vivco = ifo->vivco;
1010                             i < ifo->vivco_len;
1011                             i++, vivco++)
1012                         {
1013                                 AREA_FIT(vivco->len);
1014                                 if (vivco->len + 2 + *lp > 255) {
1015                                         logerrx("%s: VIVCO option too big",
1016                                             ifp->name);
1017                                         free(bootp);
1018                                         return -1;
1019                                 }
1020                                 *p++ = (uint8_t)vivco->len;
1021                                 memcpy(p, vivco->data, vivco->len);
1022                                 p += vivco->len;
1023                                 *lp = (uint8_t)(*lp + vivco->len + 1);
1024                         }
1025                 }
1026
1027                 AREA_CHECK(0);
1028                 *p++ = DHO_PARAMETERREQUESTLIST;
1029                 n_params = p;
1030                 *p++ = 0;
1031                 for (i = 0, opt = ifp->ctx->dhcp_opts;
1032                     i < ifp->ctx->dhcp_opts_len;
1033                     i++, opt++)
1034                 {
1035                         if (!(opt->type & OT_REQUEST ||
1036                             has_option_mask(ifo->requestmask, opt->option)))
1037                                 continue;
1038                         if (opt->type & OT_NOREQ)
1039                                 continue;
1040                         if (type == DHCP_INFORM &&
1041                             (opt->option == DHO_RENEWALTIME ||
1042                                 opt->option == DHO_REBINDTIME))
1043                                 continue;
1044                         AREA_FIT(1);
1045                         *p++ = (uint8_t)opt->option;
1046                 }
1047                 for (i = 0, opt = ifo->dhcp_override;
1048                     i < ifo->dhcp_override_len;
1049                     i++, opt++)
1050                 {
1051                         /* Check if added above */
1052                         for (lp = n_params + 1; lp < p; lp++)
1053                                 if (*lp == (uint8_t)opt->option)
1054                                         break;
1055                         if (lp < p)
1056                                 continue;
1057                         if (!(opt->type & OT_REQUEST ||
1058                             has_option_mask(ifo->requestmask, opt->option)))
1059                                 continue;
1060                         if (opt->type & OT_NOREQ)
1061                                 continue;
1062                         if (type == DHCP_INFORM &&
1063                             (opt->option == DHO_RENEWALTIME ||
1064                                 opt->option == DHO_REBINDTIME))
1065                                 continue;
1066                         AREA_FIT(1);
1067                         *p++ = (uint8_t)opt->option;
1068                 }
1069                 *n_params = (uint8_t)(p - n_params - 1);
1070         }
1071
1072 #ifdef AUTH
1073         auth = NULL;    /* appease GCC */
1074         auth_len = 0;
1075         if (ifo->auth.options & DHCPCD_AUTH_SEND) {
1076                 ssize_t alen = dhcp_auth_encode(&ifo->auth,
1077                     state->auth.token,
1078                     NULL, 0, 4, type, NULL, 0);
1079                 if (alen != -1 && alen > UINT8_MAX) {
1080                         errno = ERANGE;
1081                         alen = -1;
1082                 }
1083                 if (alen == -1)
1084                         logerr("%s: dhcp_auth_encode", ifp->name);
1085                 else if (alen != 0) {
1086                         auth_len = (uint8_t)alen;
1087                         AREA_CHECK(auth_len);
1088                         *p++ = DHO_AUTHENTICATION;
1089                         *p++ = auth_len;
1090                         auth = p;
1091                         p += auth_len;
1092                 }
1093         }
1094 #endif
1095
1096         *p++ = DHO_END;
1097         len = (size_t)(p - (uint8_t *)bootp);
1098
1099         /* Pad out to the BOOTP message length.
1100          * Even if we send a DHCP packet with a variable length vendor area,
1101          * some servers / relay agents don't like packets smaller than
1102          * a BOOTP message which is fine because that's stipulated
1103          * in RFC1542 section 2.1. */
1104         while (len < sizeof(*bootp)) {
1105                 *p++ = DHO_PAD;
1106                 len++;
1107         }
1108
1109 #ifdef AUTH
1110         if (ifo->auth.options & DHCPCD_AUTH_SEND && auth_len != 0)
1111                 dhcp_auth_encode(&ifo->auth, state->auth.token,
1112                     (uint8_t *)bootp, len, 4, type, auth, auth_len);
1113 #endif
1114
1115         return (ssize_t)len;
1116
1117 toobig:
1118         logerrx("%s: DHCP message too big", ifp->name);
1119         free(bootp);
1120         return -1;
1121 }
1122
1123 static ssize_t
1124 write_lease(const struct interface *ifp, const struct bootp *bootp, size_t len)
1125 {
1126         int fd;
1127         ssize_t bytes;
1128         const struct dhcp_state *state = D_CSTATE(ifp);
1129
1130         logdebugx("%s: writing lease `%s'", ifp->name, state->leasefile);
1131
1132         fd = open(state->leasefile, O_WRONLY | O_CREAT | O_TRUNC, 0644);
1133         if (fd == -1)
1134                 return -1;
1135         bytes = write(fd, bootp, len);
1136         close(fd);
1137         return bytes;
1138 }
1139
1140 static size_t
1141 read_lease(struct interface *ifp, struct bootp **bootp)
1142 {
1143         int fd;
1144         bool fd_opened;
1145         struct dhcp_state *state = D_STATE(ifp);
1146         struct bootp *lease;
1147         size_t bytes;
1148         uint8_t type;
1149 #ifdef AUTH
1150         const uint8_t *auth;
1151         size_t auth_len;
1152 #endif
1153
1154         /* Safety */
1155         *bootp = NULL;
1156
1157         if (state->leasefile[0] == '\0') {
1158                 fd = fileno(stdin);
1159                 fd_opened = false;
1160         } else {
1161                 fd = open(state->leasefile, O_RDONLY);
1162                 fd_opened = true;
1163         }
1164         if (fd == -1) {
1165                 if (errno != ENOENT)
1166                         logerr("%s: open `%s'",
1167                             ifp->name, state->leasefile);
1168                 return 0;
1169         }
1170         if (state->leasefile[0] == '\0')
1171                 logdebugx("reading standard input");
1172         else
1173                 logdebugx("%s: reading lease `%s'",
1174                     ifp->name, state->leasefile);
1175
1176         bytes = dhcp_read_lease_fd(fd, (void **)&lease);
1177         if (fd_opened)
1178                 close(fd);
1179         if (bytes == 0)
1180                 return 0;
1181
1182         /* Ensure the packet is at lease BOOTP sized
1183          * with a vendor area of 4 octets
1184          * (it should be more, and our read packet enforces this so this
1185          * code should not be needed, but of course people could
1186          * scribble whatever in the stored lease file. */
1187         if (bytes < offsetof(struct bootp, vend) + 4) {
1188                 free(lease);
1189                 logerrx("%s: %s: truncated lease", ifp->name, __func__);
1190                 return 0;
1191         }
1192
1193         if (ifp->ctx->options & DHCPCD_DUMPLEASE)
1194                 goto out;
1195
1196         /* We may have found a BOOTP server */
1197         if (get_option_uint8(ifp->ctx, &type, (struct bootp *)lease, bytes,
1198             DHO_MESSAGETYPE) == -1)
1199                 type = 0;
1200
1201 #ifdef AUTH
1202         /* Authenticate the message */
1203         auth = get_option(ifp->ctx, (struct bootp *)lease, bytes,
1204             DHO_AUTHENTICATION, &auth_len);
1205         if (auth) {
1206                 if (dhcp_auth_validate(&state->auth, &ifp->options->auth,
1207                     lease, bytes, 4, type, auth, auth_len) == NULL)
1208                 {
1209                         logerr("%s: authentication failed", ifp->name);
1210                         free(lease);
1211                         return 0;
1212                 }
1213                 if (state->auth.token)
1214                         logdebugx("%s: validated using 0x%08" PRIu32,
1215                             ifp->name, state->auth.token->secretid);
1216                 else
1217                         logdebugx("%s: accepted reconfigure key", ifp->name);
1218         } else if ((ifp->options->auth.options & DHCPCD_AUTH_SENDREQUIRE) ==
1219             DHCPCD_AUTH_SENDREQUIRE)
1220         {
1221                 logerrx("%s: authentication now required", ifp->name);
1222                 free(lease);
1223                 return 0;
1224         }
1225 #endif
1226
1227 out:
1228         *bootp = (struct bootp *)lease;
1229         return bytes;
1230 }
1231
1232 static const struct dhcp_opt *
1233 dhcp_getoverride(const struct if_options *ifo, unsigned int o)
1234 {
1235         size_t i;
1236         const struct dhcp_opt *opt;
1237
1238         for (i = 0, opt = ifo->dhcp_override;
1239             i < ifo->dhcp_override_len;
1240             i++, opt++)
1241         {
1242                 if (opt->option == o)
1243                         return opt;
1244         }
1245         return NULL;
1246 }
1247
1248 static const uint8_t *
1249 dhcp_getoption(struct dhcpcd_ctx *ctx,
1250     size_t *os, unsigned int *code, size_t *len,
1251     const uint8_t *od, size_t ol, struct dhcp_opt **oopt)
1252 {
1253         size_t i;
1254         struct dhcp_opt *opt;
1255
1256         if (od) {
1257                 if (ol < 2) {
1258                         errno = EINVAL;
1259                         return NULL;
1260                 }
1261                 *os = 2; /* code + len */
1262                 *code = (unsigned int)*od++;
1263                 *len = (size_t)*od++;
1264                 if (*len > ol - *os) {
1265                         errno = ERANGE;
1266                         return NULL;
1267                 }
1268         }
1269
1270         *oopt = NULL;
1271         for (i = 0, opt = ctx->dhcp_opts; i < ctx->dhcp_opts_len; i++, opt++) {
1272                 if (opt->option == *code) {
1273                         *oopt = opt;
1274                         break;
1275                 }
1276         }
1277
1278         return od;
1279 }
1280
1281 ssize_t
1282 dhcp_env(FILE *fenv, const char *prefix, const struct interface *ifp,
1283     const struct bootp *bootp, size_t bootp_len)
1284 {
1285         const struct if_options *ifo;
1286         const uint8_t *p;
1287         struct in_addr addr;
1288         struct in_addr net;
1289         struct in_addr brd;
1290         struct dhcp_opt *opt, *vo;
1291         size_t i, pl;
1292         char safe[(BOOTP_FILE_LEN * 4) + 1];
1293         uint8_t overl = 0;
1294         uint32_t en;
1295
1296         ifo = ifp->options;
1297         if (get_option_uint8(ifp->ctx, &overl, bootp, bootp_len,
1298             DHO_OPTSOVERLOADED) == -1)
1299                 overl = 0;
1300
1301         if (bootp->yiaddr || bootp->ciaddr) {
1302                 /* Set some useful variables that we derive from the DHCP
1303                  * message but are not necessarily in the options */
1304                 addr.s_addr = bootp->yiaddr ? bootp->yiaddr : bootp->ciaddr;
1305                 if (efprintf(fenv, "%s_ip_address=%s",
1306                     prefix, inet_ntoa(addr)) == -1)
1307                         return -1;
1308                 if (get_option_addr(ifp->ctx, &net,
1309                     bootp, bootp_len, DHO_SUBNETMASK) == -1) {
1310                         net.s_addr = ipv4_getnetmask(addr.s_addr);
1311                         if (efprintf(fenv, "%s_subnet_mask=%s",
1312                             prefix, inet_ntoa(net)) == -1)
1313                                 return -1;
1314                 }
1315                 if (efprintf(fenv, "%s_subnet_cidr=%d",
1316                     prefix, inet_ntocidr(net))== -1)
1317                         return -1;
1318                 if (get_option_addr(ifp->ctx, &brd,
1319                     bootp, bootp_len, DHO_BROADCAST) == -1)
1320                 {
1321                         brd.s_addr = addr.s_addr | ~net.s_addr;
1322                         if (efprintf(fenv, "%s_broadcast_address=%s",
1323                             prefix, inet_ntoa(brd)) == -1)
1324                                 return -1;
1325                 }
1326                 addr.s_addr = bootp->yiaddr & net.s_addr;
1327                 if (efprintf(fenv, "%s_network_number=%s",
1328                     prefix, inet_ntoa(addr)) == -1)
1329                         return -1;
1330         }
1331
1332         if (*bootp->file && !(overl & 1)) {
1333                 print_string(safe, sizeof(safe), OT_STRING,
1334                     bootp->file, sizeof(bootp->file));
1335                 if (efprintf(fenv, "%s_filename=%s", prefix, safe) == -1)
1336                         return -1;
1337         }
1338         if (*bootp->sname && !(overl & 2)) {
1339                 print_string(safe, sizeof(safe), OT_STRING | OT_DOMAIN,
1340                     bootp->sname, sizeof(bootp->sname));
1341                 if (efprintf(fenv, "%s_server_name=%s", prefix, safe) == -1)
1342                         return -1;
1343         }
1344
1345         /* Zero our indexes */
1346         for (i = 0, opt = ifp->ctx->dhcp_opts;
1347             i < ifp->ctx->dhcp_opts_len;
1348             i++, opt++)
1349                 dhcp_zero_index(opt);
1350         for (i = 0, opt = ifp->options->dhcp_override;
1351             i < ifp->options->dhcp_override_len;
1352             i++, opt++)
1353                 dhcp_zero_index(opt);
1354         for (i = 0, opt = ifp->ctx->vivso;
1355             i < ifp->ctx->vivso_len;
1356             i++, opt++)
1357                 dhcp_zero_index(opt);
1358
1359         for (i = 0, opt = ifp->ctx->dhcp_opts;
1360             i < ifp->ctx->dhcp_opts_len;
1361             i++, opt++)
1362         {
1363                 if (has_option_mask(ifo->nomask, opt->option))
1364                         continue;
1365                 if (dhcp_getoverride(ifo, opt->option))
1366                         continue;
1367                 p = get_option(ifp->ctx, bootp, bootp_len, opt->option, &pl);
1368                 if (p == NULL)
1369                         continue;
1370                 dhcp_envoption(ifp->ctx, fenv, prefix, ifp->name,
1371                     opt, dhcp_getoption, p, pl);
1372
1373                 if (opt->option != DHO_VIVSO || pl <= (int)sizeof(uint32_t))
1374                         continue;
1375                 memcpy(&en, p, sizeof(en));
1376                 en = ntohl(en);
1377                 vo = vivso_find(en, ifp);
1378                 if (vo == NULL)
1379                         continue;
1380                 /* Skip over en + total size */
1381                 p += sizeof(en) + 1;
1382                 pl -= sizeof(en) + 1;
1383                 dhcp_envoption(ifp->ctx, fenv, prefix, ifp->name,
1384                     vo, dhcp_getoption, p, pl);
1385         }
1386
1387         for (i = 0, opt = ifo->dhcp_override;
1388             i < ifo->dhcp_override_len;
1389             i++, opt++)
1390         {
1391                 if (has_option_mask(ifo->nomask, opt->option))
1392                         continue;
1393                 p = get_option(ifp->ctx, bootp, bootp_len, opt->option, &pl);
1394                 if (p == NULL)
1395                         continue;
1396                 dhcp_envoption(ifp->ctx, fenv, prefix, ifp->name,
1397                     opt, dhcp_getoption, p, pl);
1398         }
1399
1400         return 1;
1401 }
1402
1403 static void
1404 get_lease(struct interface *ifp,
1405     struct dhcp_lease *lease, const struct bootp *bootp, size_t len)
1406 {
1407         struct dhcpcd_ctx *ctx;
1408
1409         assert(bootp != NULL);
1410
1411         memcpy(&lease->cookie, bootp->vend, sizeof(lease->cookie));
1412         /* BOOTP does not set yiaddr for replies when ciaddr is set. */
1413         lease->addr.s_addr = bootp->yiaddr ? bootp->yiaddr : bootp->ciaddr;
1414         ctx = ifp->ctx;
1415         if (ifp->options->options & (DHCPCD_STATIC | DHCPCD_INFORM)) {
1416                 if (ifp->options->req_addr.s_addr != INADDR_ANY) {
1417                         lease->mask = ifp->options->req_mask;
1418                         if (ifp->options->req_brd.s_addr != INADDR_ANY)
1419                                 lease->brd = ifp->options->req_brd;
1420                         else
1421                                 lease->brd.s_addr =
1422                                     lease->addr.s_addr | ~lease->mask.s_addr;
1423                 } else {
1424                         const struct ipv4_addr *ia;
1425
1426                         ia = ipv4_iffindaddr(ifp, &lease->addr, NULL);
1427                         assert(ia != NULL);
1428                         lease->mask = ia->mask;
1429                         lease->brd = ia->brd;
1430                 }
1431         } else {
1432                 if (get_option_addr(ctx, &lease->mask, bootp, len,
1433                     DHO_SUBNETMASK) == -1)
1434                         lease->mask.s_addr =
1435                             ipv4_getnetmask(lease->addr.s_addr);
1436                 if (get_option_addr(ctx, &lease->brd, bootp, len,
1437                     DHO_BROADCAST) == -1)
1438                         lease->brd.s_addr =
1439                             lease->addr.s_addr | ~lease->mask.s_addr;
1440         }
1441         if (get_option_uint32(ctx, &lease->leasetime,
1442             bootp, len, DHO_LEASETIME) != 0)
1443                 lease->leasetime = DHCP_INFINITE_LIFETIME;
1444         if (get_option_uint32(ctx, &lease->renewaltime,
1445             bootp, len, DHO_RENEWALTIME) != 0)
1446                 lease->renewaltime = 0;
1447         if (get_option_uint32(ctx, &lease->rebindtime,
1448             bootp, len, DHO_REBINDTIME) != 0)
1449                 lease->rebindtime = 0;
1450         if (get_option_addr(ctx, &lease->server, bootp, len, DHO_SERVERID) != 0)
1451                 lease->server.s_addr = INADDR_ANY;
1452 }
1453
1454 static const char *
1455 get_dhcp_op(uint8_t type)
1456 {
1457         const struct dhcp_op *d;
1458
1459         for (d = dhcp_ops; d->name; d++)
1460                 if (d->value == type)
1461                         return d->name;
1462         return NULL;
1463 }
1464
1465 static void
1466 dhcp_fallback(void *arg)
1467 {
1468         struct interface *iface;
1469
1470         iface = (struct interface *)arg;
1471         dhcpcd_selectprofile(iface, iface->options->fallback);
1472         dhcpcd_startinterface(iface);
1473 }
1474
1475 static void
1476 dhcp_new_xid(struct interface *ifp)
1477 {
1478         struct dhcp_state *state;
1479         const struct interface *ifp1;
1480         const struct dhcp_state *state1;
1481
1482         state = D_STATE(ifp);
1483         if (ifp->options->options & DHCPCD_XID_HWADDR &&
1484             ifp->hwlen >= sizeof(state->xid))
1485                 /* The lower bits are probably more unique on the network */
1486                 memcpy(&state->xid,
1487                     (ifp->hwaddr + ifp->hwlen) - sizeof(state->xid),
1488                     sizeof(state->xid));
1489         else {
1490 again:
1491                 state->xid = arc4random();
1492         }
1493
1494         /* Ensure it's unique */
1495         TAILQ_FOREACH(ifp1, ifp->ctx->ifaces, next) {
1496                 if (ifp == ifp1)
1497                         continue;
1498                 if ((state1 = D_CSTATE(ifp1)) == NULL)
1499                         continue;
1500                 if (state1->xid == state->xid)
1501                         break;
1502         }
1503         if (ifp1 != NULL) {
1504                 if (ifp->options->options & DHCPCD_XID_HWADDR &&
1505                     ifp->hwlen >= sizeof(state->xid))
1506                 {
1507                         logerrx("%s: duplicate xid on %s",
1508                             ifp->name, ifp1->name);
1509                             return;
1510                 }
1511                 goto again;
1512         }
1513
1514         /* We can't do this when sharing leases across interfaes */
1515 #if 0
1516         /* As the XID changes, re-apply the filter. */
1517         if (state->bpf_fd != -1) {
1518                 if (bpf_bootp(ifp, state->bpf_fd) == -1)
1519                         logerr(__func__); /* try to continue */
1520         }
1521 #endif
1522 }
1523
1524 void
1525 dhcp_close(struct interface *ifp)
1526 {
1527         struct dhcp_state *state = D_STATE(ifp);
1528
1529         if (state == NULL)
1530                 return;
1531
1532         if (state->bpf_fd != -1) {
1533                 eloop_event_delete(ifp->ctx->eloop, state->bpf_fd);
1534                 bpf_close(ifp, state->bpf_fd);
1535                 state->bpf_fd = -1;
1536                 state->bpf_flags |= BPF_EOF;
1537         }
1538         if (state->udp_fd != -1) {
1539                 eloop_event_delete(ifp->ctx->eloop, state->udp_fd);
1540                 close(state->udp_fd);
1541                 state->udp_fd = -1;
1542         }
1543
1544         state->interval = 0;
1545 }
1546
1547 static int
1548 dhcp_openudp(struct interface *ifp)
1549 {
1550         int s;
1551         struct sockaddr_in sin;
1552         int n;
1553
1554         if ((s = xsocket(PF_INET, SOCK_DGRAM|SOCK_CLOEXEC, IPPROTO_UDP)) == -1)
1555                 return -1;
1556
1557         n = 1;
1558         if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &n, sizeof(n)) == -1)
1559                 goto eexit;
1560 #ifdef IP_RECVPKTINFO
1561         if (setsockopt(s, IPPROTO_IP, IP_RECVPKTINFO, &n, sizeof(n)) == -1)
1562                 goto eexit;
1563 #endif
1564         memset(&sin, 0, sizeof(sin));
1565         sin.sin_family = AF_INET;
1566         sin.sin_port = htons(BOOTPC);
1567         if (ifp) {
1568                 const struct dhcp_state *state = D_CSTATE(ifp);
1569
1570                 if (state->addr)
1571                         sin.sin_addr.s_addr = state->addr->addr.s_addr;
1572         }
1573         if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) == -1)
1574                 goto eexit;
1575
1576         return s;
1577
1578 eexit:
1579         close(s);
1580         return -1;
1581 }
1582
1583 static uint16_t
1584 in_cksum(const void *data, size_t len, uint32_t *isum)
1585 {
1586         const uint16_t *word = data;
1587         uint32_t sum = isum != NULL ? *isum : 0;
1588
1589         for (; len > 1; len -= sizeof(*word))
1590                 sum += *word++;
1591
1592         if (len == 1)
1593                 sum += htons((uint16_t)(*(const uint8_t *)word << 8));
1594
1595         if (isum != NULL)
1596                 *isum = sum;
1597
1598         sum = (sum >> 16) + (sum & 0xffff);
1599         sum += (sum >> 16);
1600
1601         return (uint16_t)~sum;
1602 }
1603
1604 static struct bootp_pkt *
1605 dhcp_makeudppacket(size_t *sz, const uint8_t *data, size_t length,
1606         struct in_addr source, struct in_addr dest)
1607 {
1608         struct bootp_pkt *udpp;
1609         struct ip *ip;
1610         struct udphdr *udp;
1611
1612         if ((udpp = calloc(1, sizeof(*ip) + sizeof(*udp) + length)) == NULL)
1613                 return NULL;
1614         ip = &udpp->ip;
1615         udp = &udpp->udp;
1616
1617         /* OK, this is important :)
1618          * We copy the data to our packet and then create a small part of the
1619          * ip structure and an invalid ip_len (basically udp length).
1620          * We then fill the udp structure and put the checksum
1621          * of the whole packet into the udp checksum.
1622          * Finally we complete the ip structure and ip checksum.
1623          * If we don't do the ordering like so then the udp checksum will be
1624          * broken, so find another way of doing it! */
1625
1626         memcpy(&udpp->bootp, data, length);
1627
1628         ip->ip_p = IPPROTO_UDP;
1629         ip->ip_src.s_addr = source.s_addr;
1630         if (dest.s_addr == 0)
1631                 ip->ip_dst.s_addr = INADDR_BROADCAST;
1632         else
1633                 ip->ip_dst.s_addr = dest.s_addr;
1634
1635         udp->uh_sport = htons(BOOTPC);
1636         udp->uh_dport = htons(BOOTPS);
1637         udp->uh_ulen = htons((uint16_t)(sizeof(*udp) + length));
1638         ip->ip_len = udp->uh_ulen;
1639         udp->uh_sum = in_cksum(udpp, sizeof(*ip) + sizeof(*udp) + length, NULL);
1640
1641         ip->ip_v = IPVERSION;
1642         ip->ip_hl = sizeof(*ip) >> 2;
1643         ip->ip_id = (uint16_t)arc4random_uniform(UINT16_MAX);
1644         ip->ip_ttl = IPDEFTTL;
1645         ip->ip_len = htons((uint16_t)(sizeof(*ip) + sizeof(*udp) + length));
1646         ip->ip_sum = in_cksum(ip, sizeof(*ip), NULL);
1647         if (ip->ip_sum == 0)
1648                 ip->ip_sum = 0xffff; /* RFC 768 */
1649
1650         *sz = sizeof(*ip) + sizeof(*udp) + length;
1651         return udpp;
1652 }
1653
1654 static ssize_t
1655 dhcp_sendudp(struct interface *ifp, struct in_addr *to, void *data, size_t len)
1656 {
1657         int s;
1658         struct msghdr msg;
1659         struct sockaddr_in sin;
1660         struct iovec iov[1];
1661         struct dhcp_state *state = D_STATE(ifp);
1662         ssize_t r;
1663
1664         iov[0].iov_base = data;
1665         iov[0].iov_len = len;
1666
1667         memset(&sin, 0, sizeof(sin));
1668         sin.sin_family = AF_INET;
1669         sin.sin_addr = *to;
1670         sin.sin_port = htons(BOOTPS);
1671 #ifdef HAVE_SA_LEN
1672         sin.sin_len = sizeof(sin);
1673 #endif
1674
1675         memset(&msg, 0, sizeof(msg));
1676         msg.msg_name = (void *)&sin;
1677         msg.msg_namelen = sizeof(sin);
1678         msg.msg_iov = iov;
1679         msg.msg_iovlen = 1;
1680
1681         s = state->udp_fd;
1682         if (s == -1) {
1683                 s = dhcp_openudp(ifp);
1684                 if (s == -1)
1685                         return -1;
1686         }
1687         r = sendmsg(s, &msg, 0);
1688         if (state->udp_fd == -1)
1689                 close(s);
1690         return r;
1691 }
1692
1693 static void
1694 send_message(struct interface *ifp, uint8_t type,
1695     void (*callback)(void *))
1696 {
1697         struct dhcp_state *state = D_STATE(ifp);
1698         struct if_options *ifo = ifp->options;
1699         struct bootp *bootp;
1700         struct bootp_pkt *udp;
1701         size_t len, ulen;
1702         ssize_t r;
1703         struct in_addr from, to;
1704         struct timespec tv;
1705
1706         if (!callback) {
1707                 /* No carrier? Don't bother sending the packet. */
1708                 if (ifp->carrier <= LINK_DOWN)
1709                         return;
1710                 logdebugx("%s: sending %s with xid 0x%x",
1711                     ifp->name,
1712                     ifo->options & DHCPCD_BOOTP ? "BOOTP" : get_dhcp_op(type),
1713                     state->xid);
1714         } else {
1715                 if (state->interval == 0)
1716                         state->interval = 4;
1717                 else {
1718                         state->interval *= 2;
1719                         if (state->interval > 64)
1720                                 state->interval = 64;
1721                 }
1722                 tv.tv_sec = state->interval + DHCP_RAND_MIN;
1723                 tv.tv_nsec = (suseconds_t)arc4random_uniform(
1724                     (DHCP_RAND_MAX - DHCP_RAND_MIN) * NSEC_PER_SEC);
1725                 timespecnorm(&tv);
1726                 /* No carrier? Don't bother sending the packet.
1727                  * However, we do need to advance the timeout. */
1728                 if (ifp->carrier <= LINK_DOWN)
1729                         goto fail;
1730                 logdebugx("%s: sending %s (xid 0x%x), next in %0.1f seconds",
1731                     ifp->name,
1732                     ifo->options & DHCPCD_BOOTP ? "BOOTP" : get_dhcp_op(type),
1733                     state->xid,
1734                     timespec_to_double(&tv));
1735         }
1736
1737         r = make_message(&bootp, ifp, type);
1738         if (r == -1)
1739                 goto fail;
1740         len = (size_t)r;
1741         from.s_addr = bootp->ciaddr;
1742         if (from.s_addr != INADDR_ANY)
1743                 to.s_addr = state->lease.server.s_addr;
1744         else
1745                 to.s_addr = INADDR_ANY;
1746
1747         /* If unicasting, try and avoid sending by BPF so we don't
1748          * use a L2 broadcast. */
1749         if (to.s_addr != INADDR_ANY && to.s_addr != INADDR_BROADCAST) {
1750                 if (dhcp_sendudp(ifp, &to, bootp, len) != -1)
1751                         goto out;
1752                 logerr("%s: dhcp_sendudp", ifp->name);
1753         }
1754
1755         if (dhcp_openbpf(ifp) == -1)
1756                 goto out;
1757
1758         udp = dhcp_makeudppacket(&ulen, (uint8_t *)bootp, len, from, to);
1759         if (udp == NULL) {
1760                 logerr("%s: dhcp_makeudppacket", ifp->name);
1761                 r = 0;
1762         } else {
1763                 r = bpf_send(ifp, state->bpf_fd,
1764                     ETHERTYPE_IP, (uint8_t *)udp, ulen);
1765                 free(udp);
1766         }
1767         /* If we failed to send a raw packet this normally means
1768          * we don't have the ability to work beneath the IP layer
1769          * for this interface.
1770          * As such we remove it from consideration without actually
1771          * stopping the interface. */
1772         if (r == -1) {
1773                 logerr("%s: if_sendraw", ifp->name);
1774                 switch(errno) {
1775                 case ENETDOWN:
1776                 case ENETRESET:
1777                 case ENETUNREACH:
1778                 case ENOBUFS:
1779                         break;
1780                 default:
1781                         if (!(ifp->ctx->options & DHCPCD_TEST))
1782                                 dhcp_drop(ifp, "FAIL");
1783                         eloop_timeout_delete(ifp->ctx->eloop,
1784                             NULL, ifp);
1785                         callback = NULL;
1786                 }
1787         }
1788
1789 out:
1790         free(bootp);
1791
1792 fail:
1793         /* Even if we fail to send a packet we should continue as we are
1794          * as our failure timeouts will change out codepath when needed. */
1795         if (callback)
1796                 eloop_timeout_add_tv(ifp->ctx->eloop, &tv, callback, ifp);
1797 }
1798
1799 static void
1800 send_inform(void *arg)
1801 {
1802
1803         send_message((struct interface *)arg, DHCP_INFORM, send_inform);
1804 }
1805
1806 static void
1807 send_discover(void *arg)
1808 {
1809
1810         send_message((struct interface *)arg, DHCP_DISCOVER, send_discover);
1811 }
1812
1813 static void
1814 send_request(void *arg)
1815 {
1816
1817         send_message((struct interface *)arg, DHCP_REQUEST, send_request);
1818 }
1819
1820 static void
1821 send_renew(void *arg)
1822 {
1823
1824         send_message((struct interface *)arg, DHCP_REQUEST, send_renew);
1825 }
1826
1827 static void
1828 send_rebind(void *arg)
1829 {
1830
1831         send_message((struct interface *)arg, DHCP_REQUEST, send_rebind);
1832 }
1833
1834 void
1835 dhcp_discover(void *arg)
1836 {
1837         struct interface *ifp = arg;
1838         struct dhcp_state *state = D_STATE(ifp);
1839         struct if_options *ifo = ifp->options;
1840
1841         state->state = DHS_DISCOVER;
1842         dhcp_new_xid(ifp);
1843         eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp);
1844         if (ifo->fallback)
1845                 eloop_timeout_add_sec(ifp->ctx->eloop,
1846                     ifo->reboot, dhcp_fallback, ifp);
1847 #ifdef IPV4LL
1848         else if (ifo->options & DHCPCD_IPV4LL)
1849                 eloop_timeout_add_sec(ifp->ctx->eloop,
1850                     ifo->reboot, ipv4ll_start, ifp);
1851 #endif
1852         if (ifo->options & DHCPCD_REQUEST)
1853                 loginfox("%s: soliciting a DHCP lease (requesting %s)",
1854                     ifp->name, inet_ntoa(ifo->req_addr));
1855         else
1856                 loginfox("%s: soliciting a %s lease",
1857                     ifp->name, ifo->options & DHCPCD_BOOTP ? "BOOTP" : "DHCP");
1858         send_discover(ifp);
1859 }
1860
1861 static void
1862 dhcp_request(void *arg)
1863 {
1864         struct interface *ifp = arg;
1865         struct dhcp_state *state = D_STATE(ifp);
1866
1867         state->state = DHS_REQUEST;
1868         send_request(ifp);
1869 }
1870
1871 static void
1872 dhcp_expire1(struct interface *ifp)
1873 {
1874         struct dhcp_state *state = D_STATE(ifp);
1875
1876         eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp);
1877         dhcp_drop(ifp, "EXPIRE");
1878         unlink(state->leasefile);
1879         state->interval = 0;
1880         if (!(ifp->options->options & DHCPCD_LINK) || ifp->carrier > LINK_DOWN)
1881                 dhcp_discover(ifp);
1882 }
1883
1884 static void
1885 dhcp_expire(void *arg)
1886 {
1887         struct interface *ifp = arg;
1888
1889         if (ifp->options->options & DHCPCD_LASTLEASE_EXTEND) {
1890                 logwarnx("%s: DHCP lease expired, extending lease", ifp->name);
1891                 return;
1892         }
1893
1894         logerrx("%s: DHCP lease expired", ifp->name);
1895         dhcp_expire1(ifp);
1896 }
1897
1898 #if defined(ARP) || defined(IN_IFF_DUPLICATED)
1899 static void
1900 dhcp_decline(struct interface *ifp)
1901 {
1902
1903         send_message(ifp, DHCP_DECLINE, NULL);
1904 }
1905 #endif
1906
1907 static void
1908 dhcp_startrenew(void *arg)
1909 {
1910         struct interface *ifp = arg;
1911         struct dhcp_state *state;
1912         struct dhcp_lease *lease;
1913
1914         if ((state = D_STATE(ifp)) == NULL)
1915                 return;
1916
1917         /* Only renew in the bound or renew states */
1918         if (state->state != DHS_BOUND &&
1919             state->state != DHS_RENEW)
1920                 return;
1921
1922         /* Remove the timeout as the renew may have been forced. */
1923         eloop_timeout_delete(ifp->ctx->eloop, dhcp_startrenew, ifp);
1924
1925         lease = &state->lease;
1926         logdebugx("%s: renewing lease of %s", ifp->name,
1927             inet_ntoa(lease->addr));
1928         state->state = DHS_RENEW;
1929         dhcp_new_xid(ifp);
1930         state->interval = 0;
1931         send_renew(ifp);
1932 }
1933
1934 void
1935 dhcp_renew(struct interface *ifp)
1936 {
1937
1938         dhcp_startrenew(ifp);
1939 }
1940
1941 static void
1942 dhcp_rebind(void *arg)
1943 {
1944         struct interface *ifp = arg;
1945         struct dhcp_state *state = D_STATE(ifp);
1946         struct dhcp_lease *lease = &state->lease;
1947
1948         logwarnx("%s: failed to renew DHCP, rebinding", ifp->name);
1949         logdebugx("%s: expire in %"PRIu32" seconds",
1950             ifp->name, lease->leasetime - lease->rebindtime);
1951         state->state = DHS_REBIND;
1952         eloop_timeout_delete(ifp->ctx->eloop, send_renew, ifp);
1953         state->lease.server.s_addr = INADDR_ANY;
1954         state->interval = 0;
1955         ifp->options->options &= ~(DHCPCD_CSR_WARNED |
1956             DHCPCD_ROUTER_HOST_ROUTE_WARNED);
1957         send_rebind(ifp);
1958 }
1959
1960 #if defined(ARP) || defined(IN_IFF_DUPLICATED)
1961 static void
1962 dhcp_finish_dad(struct interface *ifp, struct in_addr *ia)
1963 {
1964         struct dhcp_state *state = D_STATE(ifp);
1965
1966         if (state->state != DHS_PROBE)
1967                 return;
1968         if (state->offer == NULL || state->offer->yiaddr != ia->s_addr)
1969                 return;
1970
1971         logdebugx("%s: DAD completed for %s", ifp->name, inet_ntoa(*ia));
1972         if (!(ifp->options->options & DHCPCD_INFORM))
1973                 dhcp_bind(ifp);
1974 #ifndef IN_IFF_DUPLICATED
1975         else {
1976                 struct bootp *bootp;
1977                 size_t len;
1978
1979                 bootp = state->new;
1980                 len = state->new_len;
1981                 state->new = state->offer;
1982                 state->new_len = state->offer_len;
1983                 get_lease(ifp, &state->lease, state->new, state->new_len);
1984                 ipv4_applyaddr(ifp);
1985                 state->new = bootp;
1986                 state->new_len = len;
1987         }
1988 #endif
1989
1990         /* If we forked, stop here. */
1991         if (ifp->ctx->options & DHCPCD_FORKED)
1992                 return;
1993
1994 #ifdef IPV4LL
1995         /* Stop IPv4LL now we have a working DHCP address */
1996         ipv4ll_drop(ifp);
1997 #endif
1998
1999         if (ifp->options->options & DHCPCD_INFORM)
2000                 dhcp_inform(ifp);
2001 }
2002
2003
2004 static void
2005 dhcp_addr_duplicated(struct interface *ifp, struct in_addr *ia)
2006 {
2007         struct dhcp_state *state = D_STATE(ifp);
2008 #ifdef IN_IFF_DUPLICATED
2009         struct ipv4_addr *iap;
2010 #endif
2011
2012         if ((state->offer == NULL || state->offer->yiaddr != ia->s_addr) &&
2013             !IN_ARE_ADDR_EQUAL(ia, &state->lease.addr))
2014                 return;
2015
2016         /* RFC 2131 3.1.5, Client-server interaction */
2017         logerrx("%s: DAD detected %s", ifp->name, inet_ntoa(*ia));
2018         unlink(state->leasefile);
2019         if (!(ifp->options->options & DHCPCD_STATIC) && !state->lease.frominfo)
2020                 dhcp_decline(ifp);
2021 #ifdef IN_IFF_DUPLICATED
2022         if ((iap = ipv4_iffindaddr(ifp, ia, NULL)) != NULL)
2023                 ipv4_deladdr(iap, 0);
2024 #endif
2025         eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp);
2026         eloop_timeout_add_sec(ifp->ctx->eloop,
2027             DHCP_RAND_MAX, dhcp_discover, ifp);
2028 }
2029 #endif
2030
2031 #if defined(ARP) && (!defined(KERNEL_RFC5227) || defined(ARPING))
2032 static void
2033 dhcp_arp_not_found(struct arp_state *astate)
2034 {
2035         struct interface *ifp;
2036 #ifdef ARPING
2037         struct dhcp_state *state;
2038         struct if_options *ifo;
2039 #endif
2040
2041         ifp = astate->iface;
2042 #ifdef ARPING
2043         state = D_STATE(ifp);
2044         ifo = ifp->options;
2045         if (ifo->arping_len && state->arping_index < ifo->arping_len) {
2046                 /* We didn't find a profile for this
2047                  * address or hwaddr, so move to the next
2048                  * arping profile */
2049                 if (++state->arping_index < ifo->arping_len) {
2050                         astate->addr.s_addr =
2051                             ifo->arping[state->arping_index];
2052                         arp_probe(astate);
2053                         return;
2054                 }
2055                 arp_free(astate);
2056                 dhcpcd_startinterface(ifp);
2057                 return;
2058         }
2059 #endif
2060
2061         dhcp_finish_dad(ifp, &astate->addr);
2062 }
2063
2064 static void
2065 dhcp_arp_found(struct arp_state *astate, const struct arp_msg *amsg)
2066 {
2067         struct in_addr addr;
2068         struct interface *ifp = astate->iface;
2069 #ifdef ARPING
2070         struct dhcp_state *state;
2071         struct if_options *ifo;
2072
2073         state = D_STATE(ifp);
2074
2075         ifo = ifp->options;
2076         if (state->arping_index != -1 &&
2077             state->arping_index < ifo->arping_len &&
2078             amsg &&
2079             amsg->sip.s_addr == ifo->arping[state->arping_index])
2080         {
2081                 char buf[HWADDR_LEN * 3];
2082
2083                 hwaddr_ntoa(amsg->sha, ifp->hwlen, buf, sizeof(buf));
2084                 if (dhcpcd_selectprofile(ifp, buf) == -1 &&
2085                     dhcpcd_selectprofile(ifp, inet_ntoa(amsg->sip)) == -1)
2086                 {
2087                         /* We didn't find a profile for this
2088                          * address or hwaddr, so move to the next
2089                          * arping profile */
2090                         dhcp_arp_not_found(astate);
2091                         return;
2092                 }
2093                 arp_free(astate);
2094                 eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp);
2095                 dhcpcd_startinterface(ifp);
2096                 return;
2097         }
2098 #else
2099         UNUSED(amsg);
2100 #endif
2101
2102         addr = astate->addr;
2103         arp_free(astate);
2104         dhcp_addr_duplicated(ifp, &addr);
2105 }
2106
2107 #ifdef KERNEL_RFC5227
2108 static void
2109 dhcp_arp_announced(struct arp_state *state)
2110 {
2111
2112         arp_free(state);
2113 }
2114 #endif /* KERNEL_RFC5227 */
2115 #endif /* ARP */
2116
2117 void
2118 dhcp_bind(struct interface *ifp)
2119 {
2120         struct dhcpcd_ctx *ctx = ifp->ctx;
2121         struct dhcp_state *state = D_STATE(ifp);
2122         struct if_options *ifo = ifp->options;
2123         struct dhcp_lease *lease = &state->lease;
2124
2125         state->reason = NULL;
2126         /* If we don't have an offer, we are re-binding a lease on preference,
2127          * normally when two interfaces have a lease matching IP addresses. */
2128         if (state->offer) {
2129                 free(state->old);
2130                 state->old = state->new;
2131                 state->old_len = state->new_len;
2132                 state->new = state->offer;
2133                 state->new_len = state->offer_len;
2134                 state->offer = NULL;
2135                 state->offer_len = 0;
2136         }
2137         get_lease(ifp, lease, state->new, state->new_len);
2138         if (ifo->options & DHCPCD_STATIC) {
2139                 loginfox("%s: using static address %s/%d",
2140                     ifp->name, inet_ntoa(lease->addr),
2141                     inet_ntocidr(lease->mask));
2142                 lease->leasetime = DHCP_INFINITE_LIFETIME;
2143                 state->reason = "STATIC";
2144         } else if (ifo->options & DHCPCD_INFORM) {
2145                 loginfox("%s: received approval for %s",
2146                     ifp->name, inet_ntoa(lease->addr));
2147                 lease->leasetime = DHCP_INFINITE_LIFETIME;
2148                 state->reason = "INFORM";
2149         } else {
2150                 if (lease->frominfo)
2151                         state->reason = "TIMEOUT";
2152                 if (lease->leasetime == DHCP_INFINITE_LIFETIME) {
2153                         lease->renewaltime =
2154                             lease->rebindtime =
2155                             lease->leasetime;
2156                         loginfox("%s: leased %s for infinity",
2157                            ifp->name, inet_ntoa(lease->addr));
2158                 } else {
2159                         if (lease->leasetime < DHCP_MIN_LEASE) {
2160                                 logwarnx("%s: minimum lease is %d seconds",
2161                                     ifp->name, DHCP_MIN_LEASE);
2162                                 lease->leasetime = DHCP_MIN_LEASE;
2163                         }
2164                         if (lease->rebindtime == 0)
2165                                 lease->rebindtime =
2166                                     (uint32_t)(lease->leasetime * T2);
2167                         else if (lease->rebindtime >= lease->leasetime) {
2168                                 lease->rebindtime =
2169                                     (uint32_t)(lease->leasetime * T2);
2170                                 logwarnx("%s: rebind time greater than lease "
2171                                     "time, forcing to %"PRIu32" seconds",
2172                                     ifp->name, lease->rebindtime);
2173                         }
2174                         if (lease->renewaltime == 0)
2175                                 lease->renewaltime =
2176                                     (uint32_t)(lease->leasetime * T1);
2177                         else if (lease->renewaltime > lease->rebindtime) {
2178                                 lease->renewaltime =
2179                                     (uint32_t)(lease->leasetime * T1);
2180                                 logwarnx("%s: renewal time greater than "
2181                                     "rebind time, forcing to %"PRIu32" seconds",
2182                                     ifp->name, lease->renewaltime);
2183                         }
2184                         if (state->addr &&
2185                             lease->addr.s_addr == state->addr->addr.s_addr &&
2186                             !(state->added & STATE_FAKE))
2187                                 logdebugx("%s: leased %s for %"PRIu32" seconds",
2188                                     ifp->name, inet_ntoa(lease->addr),
2189                                     lease->leasetime);
2190                         else
2191                                 loginfox("%s: leased %s for %"PRIu32" seconds",
2192                                     ifp->name, inet_ntoa(lease->addr),
2193                                     lease->leasetime);
2194                 }
2195         }
2196         if (ctx->options & DHCPCD_TEST) {
2197                 state->reason = "TEST";
2198                 script_runreason(ifp, state->reason);
2199                 eloop_exit(ctx->eloop, EXIT_SUCCESS);
2200                 return;
2201         }
2202         if (state->reason == NULL) {
2203                 if (state->old && !(state->added & STATE_FAKE)) {
2204                         if (state->old->yiaddr == state->new->yiaddr &&
2205                             lease->server.s_addr &&
2206                             state->state != DHS_REBIND)
2207                                 state->reason = "RENEW";
2208                         else
2209                                 state->reason = "REBIND";
2210                 } else if (state->state == DHS_REBOOT)
2211                         state->reason = "REBOOT";
2212                 else
2213                         state->reason = "BOUND";
2214         }
2215         if (lease->leasetime == DHCP_INFINITE_LIFETIME)
2216                 lease->renewaltime = lease->rebindtime = lease->leasetime;
2217         else {
2218                 eloop_timeout_add_sec(ctx->eloop,
2219                     (time_t)lease->renewaltime, dhcp_startrenew, ifp);
2220                 eloop_timeout_add_sec(ctx->eloop,
2221                     (time_t)lease->rebindtime, dhcp_rebind, ifp);
2222                 eloop_timeout_add_sec(ctx->eloop,
2223                     (time_t)lease->leasetime, dhcp_expire, ifp);
2224                 logdebugx("%s: renew in %"PRIu32" seconds, rebind in %"PRIu32
2225                     " seconds",
2226                     ifp->name, lease->renewaltime, lease->rebindtime);
2227         }
2228         state->state = DHS_BOUND;
2229         if (!state->lease.frominfo &&
2230             !(ifo->options & (DHCPCD_INFORM | DHCPCD_STATIC)))
2231                 if (write_lease(ifp, state->new, state->new_len) == -1)
2232                         logerr(__func__);
2233
2234         ipv4_applyaddr(ifp);
2235
2236 #ifdef IP_PKTINFO
2237         /* Close the BPF filter as we can now receive DHCP messages
2238          * on a UDP socket. */
2239         if (state->udp_fd == -1 ||
2240             (state->old != NULL && state->old->yiaddr != state->new->yiaddr))
2241         {
2242                 dhcp_close(ifp);
2243                 /* If not in master mode, open an address specific socket. */
2244                 if (ctx->udp_fd == -1) {
2245                         state->udp_fd = dhcp_openudp(ifp);
2246                         if (state->udp_fd == -1) {
2247                                 logerr(__func__);
2248                                 /* Address sharing without master mode is
2249                                  * not supported. It's also possible another
2250                                  * DHCP client could be running which is
2251                                  * even worse.
2252                                  * We still need to work, so re-open BPF. */
2253                                 dhcp_openbpf(ifp);
2254                         } else
2255                                 eloop_event_add(ctx->eloop,
2256                                     state->udp_fd, dhcp_handleifudp, ifp);
2257                 }
2258         }
2259 #endif
2260 }
2261
2262 static void
2263 dhcp_lastlease(void *arg)
2264 {
2265         struct interface *ifp = arg;
2266         struct dhcp_state *state = D_STATE(ifp);
2267
2268         loginfox("%s: timed out contacting a DHCP server, using last lease",
2269             ifp->name);
2270         dhcp_bind(ifp);
2271         /* If we forked, stop here. */
2272         if (ifp->ctx->options & DHCPCD_FORKED)
2273                 return;
2274         state->interval = 0;
2275         dhcp_discover(ifp);
2276 }
2277
2278 static size_t
2279 dhcp_message_new(struct bootp **bootp,
2280     const struct in_addr *addr, const struct in_addr *mask)
2281 {
2282         uint8_t *p;
2283         uint32_t cookie;
2284
2285         if ((*bootp = calloc(1, sizeof(**bootp))) == NULL)
2286                 return 0;
2287
2288         (*bootp)->yiaddr = addr->s_addr;
2289         p = (*bootp)->vend;
2290
2291         cookie = htonl(MAGIC_COOKIE);
2292         memcpy(p, &cookie, sizeof(cookie));
2293         p += sizeof(cookie);
2294
2295         if (mask->s_addr != INADDR_ANY) {
2296                 *p++ = DHO_SUBNETMASK;
2297                 *p++ = sizeof(mask->s_addr);
2298                 memcpy(p, &mask->s_addr, sizeof(mask->s_addr));
2299                 p+= sizeof(mask->s_addr);
2300         }
2301
2302         *p = DHO_END;
2303         return sizeof(**bootp);
2304 }
2305
2306 #ifdef ARP
2307 #ifndef KERNEL_RFC5227
2308 static void
2309 dhcp_arp_defend_failed(struct arp_state *astate)
2310 {
2311
2312         dhcp_drop(astate->iface, "EXPIRED");
2313         dhcp_start1(astate->iface);
2314 }
2315 #endif
2316
2317 #if !defined(KERNEL_RFC5227) || defined(ARPING)
2318 static struct arp_state *
2319 dhcp_arp_new(struct interface *ifp, struct in_addr *addr)
2320 {
2321         struct arp_state *astate;
2322
2323         astate = arp_new(ifp, addr);
2324         if (astate == NULL)
2325                 return NULL;
2326
2327         astate->found_cb = dhcp_arp_found;
2328         astate->not_found_cb = dhcp_arp_not_found;
2329 #ifdef KERNEL_RFC5227
2330         astate->announced_cb = dhcp_arp_announced;
2331 #else
2332         astate->defend_failed_cb = dhcp_arp_defend_failed;
2333 #endif
2334         return astate;
2335 }
2336 #endif
2337 #endif /* ARP */
2338
2339 #if defined(ARP) || defined(KERNEL_RFC5227)
2340 static int
2341 dhcp_arp_address(struct interface *ifp)
2342 {
2343         struct dhcp_state *state;
2344         struct in_addr addr;
2345         struct ipv4_addr *ia;
2346
2347         eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp);
2348
2349         state = D_STATE(ifp);
2350         addr.s_addr = state->offer->yiaddr == INADDR_ANY ?
2351             state->offer->ciaddr : state->offer->yiaddr;
2352         /* If the interface already has the address configured
2353          * then we can't ARP for duplicate detection. */
2354         ia = ipv4_iffindaddr(ifp, &addr, NULL);
2355 #ifdef IN_IFF_NOTUSEABLE
2356         if (ia == NULL || ia->addr_flags & IN_IFF_NOTUSEABLE) {
2357                 state->state = DHS_PROBE;
2358                 if (ia == NULL) {
2359                         struct dhcp_lease l;
2360
2361                         get_lease(ifp, &l, state->offer, state->offer_len);
2362                         /* Add the address now, let the kernel handle DAD. */
2363                         ipv4_addaddr(ifp, &l.addr, &l.mask, &l.brd,
2364                             l.leasetime, l.rebindtime);
2365                 } else
2366                         loginfox("%s: waiting for DAD on %s",
2367                             ifp->name, inet_ntoa(addr));
2368                 return 0;
2369         }
2370 #else
2371         if (!(ifp->flags & IFF_NOARP) &&
2372             ifp->options->options & DHCPCD_ARP &&
2373             ia == NULL)
2374         {
2375                 struct arp_state *astate;
2376                 struct dhcp_lease l;
2377
2378                 astate = dhcp_arp_new(ifp, &addr);
2379                 if (astate == NULL)
2380                         return -1;
2381
2382                 state->state = DHS_PROBE;
2383                 get_lease(ifp, &l, state->offer, state->offer_len);
2384                 loginfox("%s: probing address %s/%d",
2385                     ifp->name, inet_ntoa(l.addr), inet_ntocidr(l.mask));
2386                 /* We need to handle DAD. */
2387                 arp_probe(astate);
2388                 return 0;
2389         }
2390 #endif
2391
2392         return 1;
2393 }
2394
2395 static void
2396 dhcp_arp_bind(struct interface *ifp)
2397 {
2398
2399         if (ifp->ctx->options & DHCPCD_TEST ||
2400             dhcp_arp_address(ifp) == 1)
2401                 dhcp_bind(ifp);
2402 }
2403 #endif
2404
2405 static void
2406 dhcp_static(struct interface *ifp)
2407 {
2408         struct if_options *ifo;
2409         struct dhcp_state *state;
2410         struct ipv4_addr *ia;
2411
2412         state = D_STATE(ifp);
2413         ifo = ifp->options;
2414
2415         ia = NULL;
2416         if (ifo->req_addr.s_addr == INADDR_ANY &&
2417             (ia = ipv4_iffindaddr(ifp, NULL, NULL)) == NULL)
2418         {
2419                 loginfox("%s: waiting for 3rd party to "
2420                     "configure IP address", ifp->name);
2421                 state->reason = "3RDPARTY";
2422                 script_runreason(ifp, state->reason);
2423                 return;
2424         }
2425
2426         state->offer_len = dhcp_message_new(&state->offer,
2427             ia ? &ia->addr : &ifo->req_addr,
2428             ia ? &ia->mask : &ifo->req_mask);
2429         if (state->offer_len)
2430 #if defined(ARP) || defined(KERNEL_RFC5227)
2431                 dhcp_arp_bind(ifp);
2432 #else
2433                 dhcp_bind(ifp);
2434 #endif
2435 }
2436
2437 void
2438 dhcp_inform(struct interface *ifp)
2439 {
2440         struct dhcp_state *state;
2441         struct if_options *ifo;
2442         struct ipv4_addr *ia;
2443
2444         state = D_STATE(ifp);
2445         ifo = ifp->options;
2446
2447         state->state = DHS_INFORM;
2448         free(state->offer);
2449         state->offer = NULL;
2450         state->offer_len = 0;
2451
2452         if (ifo->req_addr.s_addr == INADDR_ANY) {
2453                 ia = ipv4_iffindaddr(ifp, NULL, NULL);
2454                 if (ia == NULL) {
2455                         loginfox("%s: waiting for 3rd party to "
2456                             "configure IP address",
2457                             ifp->name);
2458                         if (!(ifp->ctx->options & DHCPCD_TEST)) {
2459                                 state->reason = "3RDPARTY";
2460                                 script_runreason(ifp, state->reason);
2461                         }
2462                         return;
2463                 }
2464         } else {
2465                 ia = ipv4_iffindaddr(ifp, &ifo->req_addr, &ifo->req_mask);
2466                 if (ia == NULL) {
2467                         if (ifp->ctx->options & DHCPCD_TEST) {
2468                                 logerrx("%s: cannot add IP address in test mode",
2469                                     ifp->name);
2470                                 return;
2471                         }
2472                         ia = ipv4_iffindaddr(ifp, &ifo->req_addr, NULL);
2473                         if (ia != NULL)
2474                                 /* Netmask must be different, delete it. */
2475                                 ipv4_deladdr(ia, 1);
2476                         state->offer_len = dhcp_message_new(&state->offer,
2477                             &ifo->req_addr, &ifo->req_mask);
2478 #ifdef ARP
2479                         if (dhcp_arp_address(ifp) == 0)
2480                                 return;
2481 #endif
2482                         ia = ipv4_iffindaddr(ifp,
2483                             &ifo->req_addr, &ifo->req_mask);
2484                         assert(ia != NULL);
2485                 }
2486         }
2487
2488         state->addr = ia;
2489         state->offer_len = dhcp_message_new(&state->offer,
2490             &ia->addr, &ia->mask);
2491         if (state->offer_len) {
2492                 dhcp_new_xid(ifp);
2493                 get_lease(ifp, &state->lease, state->offer, state->offer_len);
2494                 send_inform(ifp);
2495         }
2496 }
2497
2498 void
2499 dhcp_reboot_newopts(struct interface *ifp, unsigned long long oldopts)
2500 {
2501         struct if_options *ifo;
2502         struct dhcp_state *state = D_STATE(ifp);
2503
2504         if (state == NULL || state->state == DHS_NONE)
2505                 return;
2506         ifo = ifp->options;
2507         if ((ifo->options & (DHCPCD_INFORM | DHCPCD_STATIC) &&
2508                 (state->addr == NULL ||
2509                 state->addr->addr.s_addr != ifo->req_addr.s_addr)) ||
2510             (oldopts & (DHCPCD_INFORM | DHCPCD_STATIC) &&
2511                 !(ifo->options & (DHCPCD_INFORM | DHCPCD_STATIC))))
2512         {
2513                 dhcp_drop(ifp, "EXPIRE");
2514         }
2515 }
2516
2517 #ifdef ARP
2518 static int
2519 dhcp_activeaddr(const struct interface *ifp, const struct in_addr *addr)
2520 {
2521         const struct interface *ifp1;
2522         const struct dhcp_state *state;
2523
2524         TAILQ_FOREACH(ifp1, ifp->ctx->ifaces, next) {
2525                 if (ifp1 == ifp)
2526                         continue;
2527                 if ((state = D_CSTATE(ifp1)) == NULL)
2528                         continue;
2529                 switch(state->state) {
2530                 case DHS_REBOOT:
2531                 case DHS_RENEW:
2532                 case DHS_REBIND:
2533                 case DHS_BOUND:
2534                 case DHS_INFORM:
2535                         break;
2536                 default:
2537                         continue;
2538                 }
2539                 if (state->lease.addr.s_addr == addr->s_addr)
2540                         return 1;
2541         }
2542         return 0;
2543 }
2544 #endif
2545
2546 static void
2547 dhcp_reboot(struct interface *ifp)
2548 {
2549         struct if_options *ifo;
2550         struct dhcp_state *state = D_STATE(ifp);
2551 #ifdef ARP
2552         struct ipv4_addr *ia;
2553 #endif
2554
2555         if (state == NULL || state->state == DHS_NONE)
2556                 return;
2557         ifo = ifp->options;
2558         state->state = DHS_REBOOT;
2559         state->interval = 0;
2560
2561         if (ifo->options & DHCPCD_LINK && ifp->carrier <= LINK_DOWN) {
2562                 loginfox("%s: waiting for carrier", ifp->name);
2563                 return;
2564         }
2565         if (ifo->options & DHCPCD_STATIC) {
2566                 dhcp_static(ifp);
2567                 return;
2568         }
2569         if (ifo->options & DHCPCD_INFORM) {
2570                 loginfox("%s: informing address of %s",
2571                     ifp->name, inet_ntoa(state->lease.addr));
2572                 dhcp_inform(ifp);
2573                 return;
2574         }
2575         if (ifo->reboot == 0 || state->offer == NULL) {
2576                 dhcp_discover(ifp);
2577                 return;
2578         }
2579         if (!IS_DHCP(state->offer))
2580                 return;
2581
2582         loginfox("%s: rebinding lease of %s",
2583             ifp->name, inet_ntoa(state->lease.addr));
2584
2585 #ifdef ARP
2586         /* If the address exists on the interface and no other interface
2587          * is currently using it then announce it to ensure this
2588          * interface gets the reply. */
2589         ia = ipv4_iffindaddr(ifp, &state->lease.addr, NULL);
2590         if (ia != NULL &&
2591             !(ifp->ctx->options & DHCPCD_TEST) &&
2592 #ifdef IN_IFF_NOTUSEABLE
2593             !(ia->addr_flags & IN_IFF_NOTUSEABLE) &&
2594 #endif
2595             dhcp_activeaddr(ifp, &state->lease.addr) == 0)
2596                 arp_ifannounceaddr(ifp, &state->lease.addr);
2597 #endif
2598
2599         dhcp_new_xid(ifp);
2600         state->lease.server.s_addr = INADDR_ANY;
2601         eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp);
2602
2603 #ifdef IPV4LL
2604         /* Need to add this before dhcp_expire and friends. */
2605         if (!ifo->fallback && ifo->options & DHCPCD_IPV4LL)
2606                 eloop_timeout_add_sec(ifp->ctx->eloop,
2607                     ifo->reboot, ipv4ll_start, ifp);
2608 #endif
2609
2610         if (ifo->options & DHCPCD_LASTLEASE && state->lease.frominfo)
2611                 eloop_timeout_add_sec(ifp->ctx->eloop,
2612                     ifo->reboot, dhcp_lastlease, ifp);
2613         else if (!(ifo->options & DHCPCD_INFORM))
2614                 eloop_timeout_add_sec(ifp->ctx->eloop,
2615                     ifo->reboot, dhcp_expire, ifp);
2616
2617         /* Don't bother ARP checking as the server could NAK us first.
2618          * Don't call dhcp_request as that would change the state */
2619         send_request(ifp);
2620 }
2621
2622 void
2623 dhcp_drop(struct interface *ifp, const char *reason)
2624 {
2625         struct dhcp_state *state;
2626 #ifdef RELEASE_SLOW
2627         struct timespec ts;
2628 #endif
2629
2630         state = D_STATE(ifp);
2631         /* dhcp_start may just have been called and we don't yet have a state
2632          * but we do have a timeout, so punt it. */
2633         if (state == NULL || state->state == DHS_NONE) {
2634                 eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp);
2635                 return;
2636         }
2637
2638 #ifdef ARP
2639         if (state->addr != NULL)
2640                 arp_freeaddr(ifp, &state->addr->addr);
2641 #endif
2642 #ifdef ARPING
2643         state->arping_index = -1;
2644 #endif
2645
2646         if (ifp->options->options & DHCPCD_RELEASE &&
2647             !(ifp->options->options & DHCPCD_INFORM))
2648         {
2649                 /* Failure to send the release may cause this function to
2650                  * re-enter so guard by setting the state. */
2651                 if (state->state == DHS_RELEASE)
2652                         return;
2653                 state->state = DHS_RELEASE;
2654
2655                 unlink(state->leasefile);
2656                 if (ifp->carrier > LINK_DOWN &&
2657                     state->new != NULL &&
2658                     state->lease.server.s_addr != INADDR_ANY)
2659                 {
2660                         loginfox("%s: releasing lease of %s",
2661                             ifp->name, inet_ntoa(state->lease.addr));
2662                         dhcp_new_xid(ifp);
2663                         send_message(ifp, DHCP_RELEASE, NULL);
2664 #ifdef RELEASE_SLOW
2665                         /* Give the packet a chance to go */
2666                         ts.tv_sec = RELEASE_DELAY_S;
2667                         ts.tv_nsec = RELEASE_DELAY_NS;
2668                         nanosleep(&ts, NULL);
2669 #endif
2670                 }
2671         }
2672
2673         eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp);
2674 #ifdef AUTH
2675         dhcp_auth_reset(&state->auth);
2676 #endif
2677
2678         state->state = DHS_NONE;
2679         free(state->offer);
2680         state->offer = NULL;
2681         state->offer_len = 0;
2682         free(state->old);
2683         state->old = state->new;
2684         state->old_len = state->new_len;
2685         state->new = NULL;
2686         state->new_len = 0;
2687         state->reason = reason;
2688         ipv4_applyaddr(ifp);
2689         free(state->old);
2690         state->old = NULL;
2691         state->old_len = 0;
2692         state->lease.addr.s_addr = 0;
2693         ifp->options->options &= ~(DHCPCD_CSR_WARNED |
2694             DHCPCD_ROUTER_HOST_ROUTE_WARNED);
2695 }
2696
2697 static int
2698 blacklisted_ip(const struct if_options *ifo, in_addr_t addr)
2699 {
2700         size_t i;
2701
2702         for (i = 0; i < ifo->blacklist_len; i += 2)
2703                 if (ifo->blacklist[i] == (addr & ifo->blacklist[i + 1]))
2704                         return 1;
2705         return 0;
2706 }
2707
2708 #define WHTLST_NONE     0
2709 #define WHTLST_MATCH    1
2710 #define WHTLST_NOMATCH  2
2711 static unsigned int
2712 whitelisted_ip(const struct if_options *ifo, in_addr_t addr)
2713 {
2714         size_t i;
2715
2716         if (ifo->whitelist_len == 0)
2717                 return WHTLST_NONE;
2718         for (i = 0; i < ifo->whitelist_len; i += 2)
2719                 if (ifo->whitelist[i] == (addr & ifo->whitelist[i + 1]))
2720                         return WHTLST_MATCH;
2721         return WHTLST_NOMATCH;
2722 }
2723
2724 static void
2725 log_dhcp(logfunc_t *logfunc, const char *msg,
2726     const struct interface *ifp, const struct bootp *bootp, size_t bootp_len,
2727     const struct in_addr *from, int ad)
2728 {
2729         const char *tfrom;
2730         char *a, sname[sizeof(bootp->sname) * 4];
2731         struct in_addr addr;
2732         int r;
2733         uint8_t overl;
2734
2735         if (strcmp(msg, "NAK:") == 0) {
2736                 a = get_option_string(ifp->ctx, bootp, bootp_len, DHO_MESSAGE);
2737                 if (a) {
2738                         char *tmp;
2739                         size_t al, tmpl;
2740
2741                         al = strlen(a);
2742                         tmpl = (al * 4) + 1;
2743                         tmp = malloc(tmpl);
2744                         if (tmp == NULL) {
2745                                 logerr(__func__);
2746                                 free(a);
2747                                 return;
2748                         }
2749                         print_string(tmp, tmpl, OT_STRING, (uint8_t *)a, al);
2750                         free(a);
2751                         a = tmp;
2752                 }
2753         } else if (ad && bootp->yiaddr != 0) {
2754                 addr.s_addr = bootp->yiaddr;
2755                 a = strdup(inet_ntoa(addr));
2756                 if (a == NULL) {
2757                         logerr(__func__);
2758                         return;
2759                 }
2760         } else
2761                 a = NULL;
2762
2763         tfrom = "from";
2764         r = get_option_addr(ifp->ctx, &addr, bootp, bootp_len, DHO_SERVERID);
2765         if (get_option_uint8(ifp->ctx, &overl, bootp, bootp_len,
2766             DHO_OPTSOVERLOADED) == -1)
2767                 overl = 0;
2768         if (bootp->sname[0] && r == 0 && !(overl & 2)) {
2769                 print_string(sname, sizeof(sname), OT_STRING | OT_DOMAIN,
2770                     bootp->sname, sizeof(bootp->sname));
2771                 if (a == NULL)
2772                         logfunc("%s: %s %s %s `%s'",
2773                             ifp->name, msg, tfrom, inet_ntoa(addr), sname);
2774                 else
2775                         logfunc("%s: %s %s %s %s `%s'",
2776                             ifp->name, msg, a, tfrom, inet_ntoa(addr), sname);
2777         } else {
2778                 if (r != 0) {
2779                         tfrom = "via";
2780                         addr = *from;
2781                 }
2782                 if (a == NULL)
2783                         logfunc("%s: %s %s %s",
2784                             ifp->name, msg, tfrom, inet_ntoa(addr));
2785                 else
2786                         logfunc("%s: %s %s %s %s",
2787                             ifp->name, msg, a, tfrom, inet_ntoa(addr));
2788         }
2789         free(a);
2790 }
2791
2792 /* If we're sharing the same IP address with another interface on the
2793  * same network, we may receive the DHCP reply on the wrong interface.
2794  * Try and re-direct it here. */
2795 static void
2796 dhcp_redirect_dhcp(struct interface *ifp, struct bootp *bootp, size_t bootp_len,
2797     const struct in_addr *from)
2798 {
2799         struct interface *ifn;
2800         const struct dhcp_state *state;
2801         uint32_t xid;
2802
2803         xid = ntohl(bootp->xid);
2804         TAILQ_FOREACH(ifn, ifp->ctx->ifaces, next) {
2805                 state = D_CSTATE(ifn);
2806                 if (state == NULL || state->state == DHS_NONE)
2807                         continue;
2808                 if (state->xid != xid)
2809                         continue;
2810                 if (ifn->hwlen <= sizeof(bootp->chaddr) &&
2811                     memcmp(bootp->chaddr, ifn->hwaddr, ifn->hwlen))
2812                         continue;
2813                 logdebugx("%s: redirecting DHCP message to %s",
2814                     ifp->name, ifn->name);
2815                 dhcp_handledhcp(ifn, bootp, bootp_len, from);
2816         }
2817 }
2818
2819 static void
2820 dhcp_handledhcp(struct interface *ifp, struct bootp *bootp, size_t bootp_len,
2821     const struct in_addr *from)
2822 {
2823         struct dhcp_state *state = D_STATE(ifp);
2824         struct if_options *ifo = ifp->options;
2825         struct dhcp_lease *lease = &state->lease;
2826         uint8_t type, tmp;
2827         struct in_addr addr;
2828         unsigned int i;
2829         char *msg;
2830         bool bootp_copied;
2831 #ifdef AUTH
2832         const uint8_t *auth;
2833         size_t auth_len;
2834 #endif
2835 #ifdef IN_IFF_DUPLICATED
2836         struct ipv4_addr *ia;
2837 #endif
2838
2839 #define LOGDHCP0(l, m) \
2840         log_dhcp((l), (m), ifp, bootp, bootp_len, from, 0)
2841 #define LOGDHCP(l, m) \
2842         log_dhcp((l), (m), ifp, bootp, bootp_len, from, 1)
2843
2844         if (bootp->op != BOOTREPLY) {
2845                 logdebugx("%s: op (%d) is not BOOTREPLY",
2846                     ifp->name, bootp->op);
2847                 return;
2848         }
2849
2850         if (state->xid != ntohl(bootp->xid)) {
2851                 if (state->state != DHS_BOUND && state->state != DHS_NONE)
2852                         logdebugx("%s: wrong xid 0x%x (expecting 0x%x) from %s",
2853                             ifp->name, ntohl(bootp->xid), state->xid,
2854                             inet_ntoa(*from));
2855                 dhcp_redirect_dhcp(ifp, bootp, bootp_len, from);
2856                 return;
2857         }
2858
2859         if (ifp->hwlen <= sizeof(bootp->chaddr) &&
2860             memcmp(bootp->chaddr, ifp->hwaddr, ifp->hwlen))
2861         {
2862                 char buf[sizeof(bootp->chaddr) * 3];
2863
2864                 logdebugx("%s: xid 0x%x is for hwaddr %s",
2865                     ifp->name, ntohl(bootp->xid),
2866                     hwaddr_ntoa(bootp->chaddr, sizeof(bootp->chaddr),
2867                     buf, sizeof(buf)));
2868                 dhcp_redirect_dhcp(ifp, bootp, bootp_len, from);
2869                 return;
2870         }
2871
2872         if (!ifp->active)
2873                 return;
2874
2875         i = whitelisted_ip(ifp->options, from->s_addr);
2876         switch (i) {
2877         case WHTLST_NOMATCH:
2878                 logwarnx("%s: non whitelisted DHCP packet from %s",
2879                     ifp->name, inet_ntoa(*from));
2880                 return;
2881         case WHTLST_MATCH:
2882                 break;
2883         case WHTLST_NONE:
2884                 if (blacklisted_ip(ifp->options, from->s_addr) == 1) {
2885                         logwarnx("%s: blacklisted DHCP packet from %s",
2886                             ifp->name, inet_ntoa(*from));
2887                         return;
2888                 }
2889         }
2890
2891         /* We may have found a BOOTP server */
2892         if (get_option_uint8(ifp->ctx, &type,
2893             bootp, bootp_len, DHO_MESSAGETYPE) == -1)
2894                 type = 0;
2895         else if (ifo->options & DHCPCD_BOOTP) {
2896                 logdebugx("%s: ignoring DHCP reply (expecting BOOTP)",
2897                     ifp->name);
2898                 return;
2899         }
2900
2901 #ifdef AUTH
2902         /* Authenticate the message */
2903         auth = get_option(ifp->ctx, bootp, bootp_len,
2904             DHO_AUTHENTICATION, &auth_len);
2905         if (auth) {
2906                 if (dhcp_auth_validate(&state->auth, &ifo->auth,
2907                     (uint8_t *)bootp, bootp_len, 4, type,
2908                     auth, auth_len) == NULL)
2909                 {
2910                         LOGDHCP0(logerrx, "authentication failed");
2911                         return;
2912                 }
2913                 if (state->auth.token)
2914                         logdebugx("%s: validated using 0x%08" PRIu32,
2915                             ifp->name, state->auth.token->secretid);
2916                 else
2917                         loginfox("%s: accepted reconfigure key", ifp->name);
2918         } else if (ifo->auth.options & DHCPCD_AUTH_SEND) {
2919                 if (ifo->auth.options & DHCPCD_AUTH_REQUIRE) {
2920                         LOGDHCP0(logerrx, "no authentication");
2921                         return;
2922                 }
2923                 LOGDHCP0(logwarnx, "no authentication");
2924         }
2925 #endif
2926
2927         /* RFC 3203 */
2928         if (type == DHCP_FORCERENEW) {
2929                 if (from->s_addr == INADDR_ANY ||
2930                     from->s_addr == INADDR_BROADCAST)
2931                 {
2932                         LOGDHCP(logerrx, "discarding Force Renew");
2933                         return;
2934                 }
2935 #ifdef AUTH
2936                 if (auth == NULL) {
2937                         LOGDHCP(logerrx, "unauthenticated Force Renew");
2938                         if (ifo->auth.options & DHCPCD_AUTH_REQUIRE)
2939                                 return;
2940                 }
2941                 if (state->state != DHS_BOUND && state->state != DHS_INFORM) {
2942                         LOGDHCP(logdebugx, "not bound, ignoring Force Renew");
2943                         return;
2944                 }
2945                 LOGDHCP(loginfox, "Force Renew from");
2946                 /* The rebind and expire timings are still the same, we just
2947                  * enter the renew state early */
2948                 if (state->state == DHS_BOUND)
2949                         dhcp_renew(ifp);
2950                 else {
2951                         eloop_timeout_delete(ifp->ctx->eloop,
2952                             send_inform, ifp);
2953                         dhcp_inform(ifp);
2954                 }
2955 #else
2956                 LOGDHCP(logerrx, "unauthenticated Force Renew");
2957 #endif
2958                 return;
2959         }
2960
2961         if (state->state == DHS_BOUND) {
2962                 /* Before we supported FORCERENEW we closed off the raw
2963                  * port so we effectively ignored all messages.
2964                  * As such we'll not log by default here. */
2965                 //LOGDHCP(logdebugx, "bound, ignoring");
2966                 return;
2967         }
2968
2969         if (state->state == DHS_PROBE) {
2970                 /* Ignore any DHCP messages whilst probing a lease to bind. */
2971                 LOGDHCP(logdebugx, "probing, ignoring");
2972                 return;
2973         }
2974
2975         /* reset the message counter */
2976         state->interval = 0;
2977
2978         /* Ensure that no reject options are present */
2979         for (i = 1; i < 255; i++) {
2980                 if (has_option_mask(ifo->rejectmask, i) &&
2981                     get_option_uint8(ifp->ctx, &tmp,
2982                     bootp, bootp_len, (uint8_t)i) == 0)
2983                 {
2984                         LOGDHCP(logwarnx, "reject DHCP");
2985                         return;
2986                 }
2987         }
2988
2989         if (type == DHCP_NAK) {
2990                 /* For NAK, only check if we require the ServerID */
2991                 if (has_option_mask(ifo->requiremask, DHO_SERVERID) &&
2992                     get_option_addr(ifp->ctx, &addr,
2993                     bootp, bootp_len, DHO_SERVERID) == -1)
2994                 {
2995                         LOGDHCP(logwarnx, "reject NAK");
2996                         return;
2997                 }
2998
2999                 /* We should restart on a NAK */
3000                 LOGDHCP(logwarnx, "NAK:");
3001                 if ((msg = get_option_string(ifp->ctx,
3002                     bootp, bootp_len, DHO_MESSAGE)))
3003                 {
3004                         logwarnx("%s: message: %s", ifp->name, msg);
3005                         free(msg);
3006                 }
3007                 if (state->state == DHS_INFORM) /* INFORM should not be NAKed */
3008                         return;
3009                 if (!(ifp->ctx->options & DHCPCD_TEST)) {
3010                         dhcp_drop(ifp, "NAK");
3011                         unlink(state->leasefile);
3012                 }
3013
3014                 /* If we constantly get NAKS then we should slowly back off */
3015                 eloop_timeout_add_sec(ifp->ctx->eloop,
3016                     state->nakoff, dhcp_discover, ifp);
3017                 if (state->nakoff == 0)
3018                         state->nakoff = 1;
3019                 else {
3020                         state->nakoff *= 2;
3021                         if (state->nakoff > NAKOFF_MAX)
3022                                 state->nakoff = NAKOFF_MAX;
3023                 }
3024                 return;
3025         }
3026
3027         /* Ensure that all required options are present */
3028         for (i = 1; i < 255; i++) {
3029                 if (has_option_mask(ifo->requiremask, i) &&
3030                     get_option_uint8(ifp->ctx, &tmp,
3031                     bootp, bootp_len, (uint8_t)i) != 0)
3032                 {
3033                         /* If we are BOOTP, then ignore the need for serverid.
3034                          * To ignore BOOTP, require dhcp_message_type.
3035                          * However, nothing really stops BOOTP from providing
3036                          * DHCP style options as well so the above isn't
3037                          * always true. */
3038                         if (type == 0 && i == DHO_SERVERID)
3039                                 continue;
3040                         LOGDHCP(logwarnx, "reject DHCP");
3041                         return;
3042                 }
3043         }
3044
3045         /* DHCP Auto-Configure, RFC 2563 */
3046         if (type == DHCP_OFFER && bootp->yiaddr == 0) {
3047                 LOGDHCP(logwarnx, "no address given");
3048                 if ((msg = get_option_string(ifp->ctx,
3049                     bootp, bootp_len, DHO_MESSAGE)))
3050                 {
3051                         logwarnx("%s: message: %s", ifp->name, msg);
3052                         free(msg);
3053                 }
3054 #ifdef IPV4LL
3055                 if (state->state == DHS_DISCOVER &&
3056                     get_option_uint8(ifp->ctx, &tmp, bootp, bootp_len,
3057                     DHO_AUTOCONFIGURE) == 0)
3058                 {
3059                         switch (tmp) {
3060                         case 0:
3061                                 LOGDHCP(logwarnx, "IPv4LL disabled from");
3062                                 ipv4ll_drop(ifp);
3063 #ifdef ARP
3064                                 arp_drop(ifp);
3065 #endif
3066                                 break;
3067                         case 1:
3068                                 LOGDHCP(logwarnx, "IPv4LL enabled from");
3069                                 ipv4ll_start(ifp);
3070                                 break;
3071                         default:
3072                                 logerrx("%s: unknown auto configuration "
3073                                     "option %d",
3074                                     ifp->name, tmp);
3075                                 break;
3076                         }
3077                         eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp);
3078                         eloop_timeout_add_sec(ifp->ctx->eloop,
3079                             DHCP_MAX, dhcp_discover, ifp);
3080                 }
3081 #endif
3082                 return;
3083         }
3084
3085         /* Ensure that the address offered is valid */
3086         if ((type == 0 || type == DHCP_OFFER || type == DHCP_ACK) &&
3087             (bootp->ciaddr == INADDR_ANY || bootp->ciaddr == INADDR_BROADCAST)
3088             &&
3089             (bootp->yiaddr == INADDR_ANY || bootp->yiaddr == INADDR_BROADCAST))
3090         {
3091                 LOGDHCP(logwarnx, "reject invalid address");
3092                 return;
3093         }
3094
3095 #ifdef IN_IFF_DUPLICATED
3096         ia = ipv4_iffindaddr(ifp, &lease->addr, NULL);
3097         if (ia && ia->addr_flags & IN_IFF_DUPLICATED) {
3098                 LOGDHCP(logwarnx, "declined duplicate address");
3099                 if (type)
3100                         dhcp_decline(ifp);
3101                 ipv4_deladdr(ia, 0);
3102                 eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp);
3103                 eloop_timeout_add_sec(ifp->ctx->eloop,
3104                     DHCP_RAND_MAX, dhcp_discover, ifp);
3105                 return;
3106         }
3107 #endif
3108
3109         bootp_copied = false;
3110         if ((type == 0 || type == DHCP_OFFER) && state->state == DHS_DISCOVER) {
3111                 lease->frominfo = 0;
3112                 lease->addr.s_addr = bootp->yiaddr;
3113                 memcpy(&lease->cookie, bootp->vend, sizeof(lease->cookie));
3114                 if (type == 0 ||
3115                     get_option_addr(ifp->ctx,
3116                     &lease->server, bootp, bootp_len, DHO_SERVERID) != 0)
3117                         lease->server.s_addr = INADDR_ANY;
3118
3119                 /* Test for rapid commit in the OFFER */
3120                 if (!(ifp->ctx->options & DHCPCD_TEST) &&
3121                     has_option_mask(ifo->requestmask, DHO_RAPIDCOMMIT) &&
3122                     get_option(ifp->ctx, bootp, bootp_len,
3123                     DHO_RAPIDCOMMIT, NULL))
3124                 {
3125                         state->state = DHS_REQUEST;
3126                         goto rapidcommit;
3127                 }
3128
3129                 LOGDHCP(loginfox, "offered");
3130                 if (state->offer_len < bootp_len) {
3131                         free(state->offer);
3132                         if ((state->offer = malloc(bootp_len)) == NULL) {
3133                                 logerr(__func__);
3134                                 state->offer_len = 0;
3135                                 return;
3136                         }
3137                 }
3138                 state->offer_len = bootp_len;
3139                 memcpy(state->offer, bootp, bootp_len);
3140                 bootp_copied = true;
3141                 if (ifp->ctx->options & DHCPCD_TEST) {
3142                         free(state->old);
3143                         state->old = state->new;
3144                         state->old_len = state->new_len;
3145                         state->new = state->offer;
3146                         state->new_len = state->offer_len;
3147                         state->offer = NULL;
3148                         state->offer_len = 0;
3149                         state->reason = "TEST";
3150                         script_runreason(ifp, state->reason);
3151                         eloop_exit(ifp->ctx->eloop, EXIT_SUCCESS);
3152                         state->bpf_flags |= BPF_EOF;
3153                         return;
3154                 }
3155                 eloop_timeout_delete(ifp->ctx->eloop, send_discover, ifp);
3156                 /* We don't request BOOTP addresses */
3157                 if (type) {
3158                         /* We used to ARP check here, but that seems to be in
3159                          * violation of RFC2131 where it only describes
3160                          * DECLINE after REQUEST.
3161                          * It also seems that some MS DHCP servers actually
3162                          * ignore DECLINE if no REQUEST, ie we decline a
3163                          * DISCOVER. */
3164                         dhcp_request(ifp);
3165                         return;
3166                 }
3167         }
3168
3169         if (type) {
3170                 if (type == DHCP_OFFER) {
3171                         LOGDHCP(logwarnx, "ignoring offer of");
3172                         return;
3173                 }
3174
3175                 /* We should only be dealing with acks */
3176                 if (type != DHCP_ACK) {
3177                         LOGDHCP(logerr, "not ACK or OFFER");
3178                         return;
3179                 }
3180
3181                 if (state->state == DHS_DISCOVER) {
3182                         /* We only allow ACK of rapid commit DISCOVER. */
3183                         if (has_option_mask(ifo->requestmask,
3184                             DHO_RAPIDCOMMIT) &&
3185                             get_option(ifp->ctx, bootp, bootp_len,
3186                             DHO_RAPIDCOMMIT, NULL))
3187                                 state->state = DHS_REQUEST;
3188                         else {
3189                                 LOGDHCP(logdebugx, "ignoring ack of");
3190                                 return;
3191                         }
3192                 }
3193
3194 rapidcommit:
3195                 if (!(ifo->options & DHCPCD_INFORM))
3196                         LOGDHCP(logdebugx, "acknowledged");
3197                 else
3198                     ifo->options &= ~DHCPCD_STATIC;
3199         }
3200
3201         /* No NAK, so reset the backoff
3202          * We don't reset on an OFFER message because the server could
3203          * potentially NAK the REQUEST. */
3204         state->nakoff = 0;
3205
3206         /* BOOTP could have already assigned this above. */
3207         if (!bootp_copied) {
3208                 if (state->offer_len < bootp_len) {
3209                         free(state->offer);
3210                         if ((state->offer = malloc(bootp_len)) == NULL) {
3211                                 logerr(__func__);
3212                                 state->offer_len = 0;
3213                                 return;
3214                         }
3215                 }
3216                 state->offer_len = bootp_len;
3217                 memcpy(state->offer, bootp, bootp_len);
3218         }
3219
3220         lease->frominfo = 0;
3221         eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp);
3222
3223 #if defined(ARP) || defined(KERNEL_RFC5227)
3224         dhcp_arp_bind(ifp);
3225 #else
3226         dhcp_bind(ifp);
3227 #endif
3228 }
3229
3230 static void *
3231 get_udp_data(void *packet, size_t *len)
3232 {
3233         const struct ip *ip = packet;
3234         size_t ip_hl = (size_t)ip->ip_hl * 4;
3235         char *p = packet;
3236
3237         p += ip_hl + sizeof(struct udphdr);
3238         *len = (size_t)ntohs(ip->ip_len) - sizeof(struct udphdr) - ip_hl;
3239         return p;
3240 }
3241
3242 static int
3243 valid_udp_packet(void *packet, size_t plen, struct in_addr *from,
3244         unsigned int flags)
3245 {
3246         struct ip *ip = packet;
3247         struct ip pseudo_ip = {
3248                 .ip_p = IPPROTO_UDP,
3249                 .ip_src = ip->ip_src,
3250                 .ip_dst = ip->ip_dst
3251         };
3252         size_t ip_hlen;
3253         uint16_t ip_len, udp_len, uh_sum;
3254         struct udphdr *udp;
3255         uint32_t csum;
3256
3257         if (plen < sizeof(*ip)) {
3258                 if (from != NULL)
3259                         from->s_addr = INADDR_ANY;
3260                 errno = ERANGE;
3261                 return -1;
3262         }
3263
3264         if (from != NULL)
3265                 from->s_addr = ip->ip_src.s_addr;
3266
3267         /* Check we have the IP header */
3268         ip_hlen = (size_t)ip->ip_hl * 4;
3269         if (ip_hlen > plen) {
3270                 errno = ENOBUFS;
3271                 return -1;
3272         }
3273
3274         if (in_cksum(ip, ip_hlen, NULL) != 0) {
3275                 errno = EINVAL;
3276                 return -1;
3277         }
3278
3279         /* Check we have a payload */
3280         ip_len = ntohs(ip->ip_len);
3281         if (ip_len <= ip_hlen + sizeof(*udp)) {
3282                 errno = ERANGE;
3283                 return -1;
3284         }
3285         /* Check IP doesn't go beyond the payload */
3286         if (ip_len > plen) {
3287                 errno = ENOBUFS;
3288                 return -1;
3289         }
3290
3291         /* Check UDP doesn't go beyond the payload */
3292         udp = (struct udphdr *)(void *)((char *)ip + ip_hlen);
3293         udp_len = ntohs(udp->uh_ulen);
3294         if (udp_len > plen - ip_hlen) {
3295                 errno =  ENOBUFS;
3296                 return -1;
3297         }
3298
3299         if (udp->uh_sum == 0 || flags & BPF_PARTIALCSUM)
3300                 return 0;
3301
3302         /* UDP checksum is based on a pseudo IP header alongside
3303          * the UDP header and payload. */
3304         uh_sum = udp->uh_sum;
3305         udp->uh_sum = 0;
3306         pseudo_ip.ip_len = udp->uh_ulen;
3307         csum = 0;
3308         in_cksum(&pseudo_ip, sizeof(pseudo_ip), &csum);
3309         csum = in_cksum(udp, udp_len, &csum);
3310         if (csum != uh_sum) {
3311                 errno = EINVAL;
3312                 return -1;
3313         }
3314
3315         return 0;
3316 }
3317
3318 static void
3319 dhcp_handlebootp(struct interface *ifp, struct bootp *bootp, size_t len,
3320     struct in_addr *from)
3321 {
3322         size_t v;
3323
3324         /* udp_len must be correct because the values are checked in
3325          * valid_udp_packet(). */
3326         if (len < offsetof(struct bootp, vend)) {
3327                 logerrx("%s: truncated packet (%zu) from %s",
3328                     ifp->name, len, inet_ntoa(*from));
3329                 return;
3330         }
3331         /* To make our IS_DHCP macro easy, ensure the vendor
3332          * area has at least 4 octets. */
3333         v = len - offsetof(struct bootp, vend);
3334         while (v < 4) {
3335                 bootp->vend[v++] = '\0';
3336                 len++;
3337         }
3338
3339         dhcp_handledhcp(ifp, bootp, len, from);
3340 }
3341
3342 static void
3343 dhcp_handlepacket(struct interface *ifp, uint8_t *data, size_t len)
3344 {
3345         struct bootp *bootp;
3346         struct in_addr from;
3347         size_t udp_len;
3348         const struct dhcp_state *state = D_CSTATE(ifp);
3349
3350         if (valid_udp_packet(data, len, &from, state->bpf_flags) == -1) {
3351                 const char *errstr;
3352
3353                 if (errno == EINVAL)
3354                         errstr = "checksum failure";
3355                 else
3356                         errstr = "invalid UDP packet";
3357                 logerrx("%s: %s from %s", errstr, ifp->name, inet_ntoa(from));
3358                 return;
3359         }
3360
3361         /*
3362          * DHCP has a variable option area rather than a fixed vendor area.
3363          * Because DHCP uses the BOOTP protocol it should still send BOOTP
3364          * sized packets to be RFC compliant.
3365          * However some servers send a truncated vendor area.
3366          * dhcpcd can work fine without the vendor area being sent.
3367          */
3368         bootp = get_udp_data(data, &udp_len);
3369         dhcp_handlebootp(ifp, bootp, udp_len, &from);
3370 }
3371
3372 static void
3373 dhcp_readpacket(void *arg)
3374 {
3375         struct interface *ifp = arg;
3376         uint8_t buf[MTU_MAX];
3377         ssize_t bytes;
3378         struct dhcp_state *state = D_STATE(ifp);
3379
3380         /* Some RAW mechanisms are generic file descriptors, not sockets.
3381          * This means we have no kernel call to just get one packet,
3382          * so we have to process the entire buffer. */
3383         state->bpf_flags &= ~BPF_EOF;
3384         state->bpf_flags |= BPF_READING;
3385         while (!(state->bpf_flags & BPF_EOF)) {
3386                 bytes = bpf_read(ifp, state->bpf_fd, buf, sizeof(buf),
3387                                  &state->bpf_flags);
3388                 if (bytes == -1) {
3389                         if (state->state != DHS_NONE) {
3390                                 logerr("%s: %s", __func__, ifp->name);
3391                                 dhcp_close(ifp);
3392                         }
3393                         break;
3394                 }
3395                 dhcp_handlepacket(ifp, buf, (size_t)bytes);
3396                 /* Check we still have a state after processing. */
3397                 if ((state = D_STATE(ifp)) == NULL)
3398                         break;
3399         }
3400         if (state != NULL)
3401                 state->bpf_flags &= ~BPF_READING;
3402 }
3403
3404 static void
3405 dhcp_readudp(struct dhcpcd_ctx *ctx, struct interface *ifp)
3406 {
3407         const struct dhcp_state *state;
3408         struct sockaddr_in from;
3409         unsigned char buf[10 * 1024]; /* Maximum MTU */
3410         struct iovec iov = {
3411                 .iov_base = buf,
3412                 .iov_len = sizeof(buf),
3413         };
3414 #ifdef IP_PKTINFO
3415         unsigned char ctl[CMSG_SPACE(sizeof(struct in_pktinfo))] = { 0 };
3416         char sfrom[INET_ADDRSTRLEN];
3417 #endif
3418         struct msghdr msg = {
3419             .msg_name = &from, .msg_namelen = sizeof(from),
3420             .msg_iov = &iov, .msg_iovlen = 1,
3421 #ifdef IP_PKTINFO
3422             .msg_control = ctl, .msg_controllen = sizeof(ctl),
3423 #endif
3424         };
3425         int s;
3426         ssize_t bytes;
3427
3428         if (ifp != NULL) {
3429                 state = D_CSTATE(ifp);
3430                 s = state->udp_fd;
3431         } else
3432                 s = ctx->udp_fd;
3433
3434         bytes = recvmsg(s, &msg, 0);
3435         if (bytes == -1) {
3436                 logerr(__func__);
3437                 return;
3438         }
3439
3440 #ifdef IP_PKTINFO
3441         inet_ntop(AF_INET, &from.sin_addr, sfrom, sizeof(sfrom));
3442
3443         if (ifp == NULL) {
3444                 ifp = if_findifpfromcmsg(ctx, &msg, NULL);
3445                 if (ifp == NULL) {
3446                         logerr(__func__);
3447                         return;
3448                 }
3449                 state = D_CSTATE(ifp);
3450                 if (state == NULL) {
3451                         logdebugx("%s: received BOOTP for inactive interface",
3452                             ifp->name);
3453                         return;
3454                 }
3455         }
3456
3457         if (state->bpf_fd != -1) {
3458                 /* Avoid a duplicate read if BPF is open for the interface. */
3459                 return;
3460         }
3461
3462         dhcp_handlebootp(ifp, (struct bootp *)(void *)buf, (size_t)bytes,
3463             &from.sin_addr);
3464 #endif
3465 }
3466
3467 static void
3468 dhcp_handleudp(void *arg)
3469 {
3470         struct dhcpcd_ctx *ctx = arg;
3471
3472         dhcp_readudp(ctx, NULL);
3473 }
3474
3475 #ifdef IP_PKTINFO
3476 static void
3477 dhcp_handleifudp(void *arg)
3478 {
3479         struct interface *ifp = arg;
3480
3481         dhcp_readudp(ifp->ctx, ifp);
3482
3483 }
3484 #endif
3485
3486 static int
3487 dhcp_openbpf(struct interface *ifp)
3488 {
3489         struct dhcp_state *state;
3490
3491         state = D_STATE(ifp);
3492         if (state->bpf_fd != -1)
3493                 return 0;
3494
3495         state->bpf_fd = bpf_open(ifp, bpf_bootp);
3496         if (state->bpf_fd == -1) {
3497                 if (errno == ENOENT) {
3498                         logerrx("%s not found", bpf_name);
3499                         /* May as well disable IPv4 entirely at
3500                          * this point as we really need it. */
3501                         ifp->options->options &= ~DHCPCD_IPV4;
3502                 } else
3503                         logerr("%s: %s", __func__, ifp->name);
3504                 return -1;
3505         }
3506
3507         eloop_event_add(ifp->ctx->eloop,
3508             state->bpf_fd, dhcp_readpacket, ifp);
3509         return 0;
3510 }
3511
3512 int
3513 dhcp_dump(struct interface *ifp)
3514 {
3515         struct dhcp_state *state;
3516
3517         ifp->if_data[IF_DATA_DHCP] = state = calloc(1, sizeof(*state));
3518         if (state == NULL)
3519                 goto eexit;
3520         state->bpf_fd = -1;
3521         dhcp_set_leasefile(state->leasefile, sizeof(state->leasefile),
3522             AF_INET, ifp);
3523         state->new_len = read_lease(ifp, &state->new);
3524         if (state->new == NULL) {
3525                 logerr("%s: %s",
3526                     *ifp->name ? ifp->name : state->leasefile, __func__);
3527                 return -1;
3528         }
3529         state->reason = "DUMP";
3530         return script_runreason(ifp, state->reason);
3531
3532 eexit:
3533         logerr(__func__);
3534         return -1;
3535 }
3536
3537 void
3538 dhcp_free(struct interface *ifp)
3539 {
3540         struct dhcp_state *state = D_STATE(ifp);
3541         struct dhcpcd_ctx *ctx;
3542
3543         dhcp_close(ifp);
3544 #ifdef ARP
3545         arp_drop(ifp);
3546 #endif
3547         if (state) {
3548                 state->state = DHS_NONE;
3549                 free(state->old);
3550                 free(state->new);
3551                 free(state->offer);
3552                 free(state->clientid);
3553                 free(state);
3554         }
3555
3556         ctx = ifp->ctx;
3557         /* If we don't have any more DHCP enabled interfaces,
3558          * close the global socket and release resources */
3559         if (ctx->ifaces) {
3560                 TAILQ_FOREACH(ifp, ctx->ifaces, next) {
3561                         state = D_STATE(ifp);
3562                         if (state != NULL && state->state != DHS_NONE)
3563                                 break;
3564                 }
3565         }
3566         if (ifp == NULL) {
3567                 if (ctx->udp_fd != -1) {
3568                         eloop_event_delete(ctx->eloop, ctx->udp_fd);
3569                         close(ctx->udp_fd);
3570                         ctx->udp_fd = -1;
3571                 }
3572
3573                 free(ctx->opt_buffer);
3574                 ctx->opt_buffer = NULL;
3575         }
3576 }
3577
3578 static int
3579 dhcp_initstate(struct interface *ifp)
3580 {
3581         struct dhcp_state *state;
3582
3583         state = D_STATE(ifp);
3584         if (state != NULL)
3585                 return 0;
3586
3587         ifp->if_data[IF_DATA_DHCP] = calloc(1, sizeof(*state));
3588         state = D_STATE(ifp);
3589         if (state == NULL)
3590                 return -1;
3591
3592         state->state = DHS_NONE;
3593         /* 0 is a valid fd, so init to -1 */
3594         state->bpf_fd = -1;
3595         state->udp_fd = -1;
3596 #ifdef ARPING
3597         state->arping_index = -1;
3598 #endif
3599         return 1;
3600 }
3601
3602 static int
3603 dhcp_init(struct interface *ifp)
3604 {
3605         struct dhcp_state *state;
3606         const struct if_options *ifo;
3607         uint8_t len;
3608         char buf[(sizeof(ifo->clientid) - 1) * 3];
3609
3610         if (dhcp_initstate(ifp) == -1)
3611                 return -1;
3612
3613         state = D_STATE(ifp);
3614         state->state = DHS_INIT;
3615         state->reason = "PREINIT";
3616         state->nakoff = 0;
3617         dhcp_set_leasefile(state->leasefile, sizeof(state->leasefile),
3618             AF_INET, ifp);
3619
3620         ifo = ifp->options;
3621         /* We need to drop the leasefile so that dhcp_start
3622          * doesn't load it. */
3623         if (ifo->options & DHCPCD_REQUEST)
3624                 unlink(state->leasefile);
3625
3626         free(state->clientid);
3627         state->clientid = NULL;
3628
3629         if (*ifo->clientid) {
3630                 state->clientid = malloc((size_t)(ifo->clientid[0] + 1));
3631                 if (state->clientid == NULL)
3632                         goto eexit;
3633                 memcpy(state->clientid, ifo->clientid,
3634                     (size_t)(ifo->clientid[0]) + 1);
3635         } else if (ifo->options & DHCPCD_CLIENTID) {
3636                 if (ifo->options & DHCPCD_DUID) {
3637                         state->clientid = malloc(ifp->ctx->duid_len + 6);
3638                         if (state->clientid == NULL)
3639                                 goto eexit;
3640                         state->clientid[0] =(uint8_t)(ifp->ctx->duid_len + 5);
3641                         state->clientid[1] = 255; /* RFC 4361 */
3642                         memcpy(state->clientid + 2, ifo->iaid, 4);
3643                         memcpy(state->clientid + 6, ifp->ctx->duid,
3644                             ifp->ctx->duid_len);
3645                 } else {
3646                         len = (uint8_t)(ifp->hwlen + 1);
3647                         state->clientid = malloc((size_t)len + 1);
3648                         if (state->clientid == NULL)
3649                                 goto eexit;
3650                         state->clientid[0] = len;
3651                         state->clientid[1] = (uint8_t)ifp->family;
3652                         memcpy(state->clientid + 2, ifp->hwaddr,
3653                             ifp->hwlen);
3654                 }
3655         }
3656
3657         if (ifo->options & DHCPCD_DUID)
3658                 /* Don't bother logging as DUID and IAID are reported
3659                  * at device start. */
3660                 return 0;
3661
3662         if (ifo->options & DHCPCD_CLIENTID)
3663                 logdebugx("%s: using ClientID %s", ifp->name,
3664                     hwaddr_ntoa(state->clientid + 1, state->clientid[0],
3665                         buf, sizeof(buf)));
3666         else if (ifp->hwlen)
3667                 logdebugx("%s: using hwaddr %s", ifp->name,
3668                     hwaddr_ntoa(ifp->hwaddr, ifp->hwlen, buf, sizeof(buf)));
3669         return 0;
3670
3671 eexit:
3672         logerr(__func__);
3673         return -1;
3674 }
3675
3676 static void
3677 dhcp_start1(void *arg)
3678 {
3679         struct interface *ifp = arg;
3680         struct dhcpcd_ctx *ctx = ifp->ctx;
3681         struct if_options *ifo = ifp->options;
3682         struct dhcp_state *state;
3683         struct stat st;
3684         uint32_t l;
3685         int nolease;
3686
3687         if (!(ifo->options & DHCPCD_IPV4))
3688                 return;
3689
3690         /* Listen on *.*.*.*:bootpc so that the kernel never sends an
3691          * ICMP port unreachable message back to the DHCP server.
3692          * Only do this in master mode so we don't swallow messages
3693          * for dhcpcd running on another interface. */
3694         if (ctx->udp_fd == -1 && ctx->options & DHCPCD_MASTER) {
3695                 ctx->udp_fd = dhcp_openudp(NULL);
3696                 if (ctx->udp_fd == -1) {
3697                         /* Don't log an error if some other process
3698                          * is handling this. */
3699                         if (errno != EADDRINUSE)
3700                                 logerr("%s: dhcp_openudp", __func__);
3701                 } else
3702                         eloop_event_add(ctx->eloop,
3703                             ctx->udp_fd, dhcp_handleudp, ctx);
3704         }
3705
3706         if (dhcp_init(ifp) == -1) {
3707                 logerr("%s: dhcp_init", ifp->name);
3708                 return;
3709         }
3710
3711         state = D_STATE(ifp);
3712         clock_gettime(CLOCK_MONOTONIC, &state->started);
3713         state->interval = 0;
3714         free(state->offer);
3715         state->offer = NULL;
3716         state->offer_len = 0;
3717
3718 #ifdef ARPING
3719         if (ifo->arping_len && state->arping_index < ifo->arping_len) {
3720                 struct arp_state *astate;
3721
3722                 astate = dhcp_arp_new(ifp, NULL);
3723                 if (astate)
3724                         dhcp_arp_not_found(astate);
3725                 return;
3726         }
3727 #endif
3728
3729         if (ifo->options & DHCPCD_STATIC) {
3730                 dhcp_static(ifp);
3731                 return;
3732         }
3733
3734         if (ifo->options & DHCPCD_INFORM) {
3735                 dhcp_inform(ifp);
3736                 return;
3737         }
3738
3739         /* We don't want to read the old lease if we NAK an old test */
3740         nolease = state->offer && ifp->ctx->options & DHCPCD_TEST;
3741         if (!nolease && ifo->options & DHCPCD_DHCP) {
3742                 state->offer_len = read_lease(ifp, &state->offer);
3743                 /* Check the saved lease matches the type we want */
3744                 if (state->offer) {
3745 #ifdef IN_IFF_DUPLICATED
3746                         struct in_addr addr;
3747                         struct ipv4_addr *ia;
3748
3749                         addr.s_addr = state->offer->yiaddr;
3750                         ia = ipv4_iffindaddr(ifp, &addr, NULL);
3751 #endif
3752
3753                         if ((!IS_DHCP(state->offer) &&
3754                             !(ifo->options & DHCPCD_BOOTP)) ||
3755 #ifdef IN_IFF_DUPLICATED
3756                             (ia && ia->addr_flags & IN_IFF_DUPLICATED) ||
3757 #endif
3758                             (IS_DHCP(state->offer) &&
3759                             ifo->options & DHCPCD_BOOTP))
3760                         {
3761                                 free(state->offer);
3762                                 state->offer = NULL;
3763                                 state->offer_len = 0;
3764                         }
3765                 }
3766         }
3767         if (state->offer) {
3768                 struct ipv4_addr *ia;
3769
3770                 get_lease(ifp, &state->lease, state->offer, state->offer_len);
3771                 state->lease.frominfo = 1;
3772                 if (state->new == NULL &&
3773                     (ia = ipv4_iffindaddr(ifp,
3774                     &state->lease.addr, &state->lease.mask)) != NULL)
3775                 {
3776                         /* We still have the IP address from the last lease.
3777                          * Fake add the address and routes from it so the lease
3778                          * can be cleaned up. */
3779                         state->new = malloc(state->offer_len);
3780                         if (state->new) {
3781                                 memcpy(state->new,
3782                                     state->offer, state->offer_len);
3783                                 state->new_len = state->offer_len;
3784                                 state->addr = ia;
3785                                 state->added |= STATE_ADDED | STATE_FAKE;
3786                                 rt_build(ifp->ctx, AF_INET);
3787                         } else
3788                                 logerr(__func__);
3789                 }
3790                 if (!IS_DHCP(state->offer)) {
3791                         free(state->offer);
3792                         state->offer = NULL;
3793                         state->offer_len = 0;
3794                 } else if (!(ifo->options & DHCPCD_LASTLEASE_EXTEND) &&
3795                     state->lease.leasetime != DHCP_INFINITE_LIFETIME &&
3796                     stat(state->leasefile, &st) == 0)
3797                 {
3798                         time_t now;
3799
3800                         /* Offset lease times and check expiry */
3801                         now = time(NULL);
3802                         if (now == -1 ||
3803                             (time_t)state->lease.leasetime < now - st.st_mtime)
3804                         {
3805                                 logdebugx("%s: discarding expired lease",
3806                                     ifp->name);
3807                                 free(state->offer);
3808                                 state->offer = NULL;
3809                                 state->offer_len = 0;
3810                                 state->lease.addr.s_addr = 0;
3811                                 /* Technically we should discard the lease
3812                                  * as it's expired, just as DHCPv6 addresses
3813                                  * would be by the kernel.
3814                                  * However, this may violate POLA so
3815                                  * we currently leave it be.
3816                                  * If we get a totally different lease from
3817                                  * the DHCP server we'll drop it anyway, as
3818                                  * we will on any other event which would
3819                                  * trigger a lease drop.
3820                                  * This should only happen if dhcpcd stops
3821                                  * running and the lease expires before
3822                                  * dhcpcd starts again. */
3823 #if 0
3824                                 if (state->new)
3825                                         dhcp_drop(ifp, "EXPIRE");
3826 #endif
3827                         } else {
3828                                 l = (uint32_t)(now - st.st_mtime);
3829                                 state->lease.leasetime -= l;
3830                                 state->lease.renewaltime -= l;
3831                                 state->lease.rebindtime -= l;
3832                         }
3833                 }
3834         }
3835
3836 #ifdef IPV4LL
3837         if (!(ifo->options & DHCPCD_DHCP)) {
3838                 if (ifo->options & DHCPCD_IPV4LL)
3839                         ipv4ll_start(ifp);
3840                 return;
3841         }
3842 #endif
3843
3844         if (state->offer == NULL || !IS_DHCP(state->offer))
3845                 dhcp_discover(ifp);
3846         else
3847                 dhcp_reboot(ifp);
3848 }
3849
3850 void
3851 dhcp_start(struct interface *ifp)
3852 {
3853         struct timespec tv;
3854 #ifdef ARPING
3855         const struct dhcp_state *state;
3856 #endif
3857
3858         if (!(ifp->options->options & DHCPCD_IPV4))
3859                 return;
3860
3861         /* If we haven't been given a netmask for our requested address,
3862          * set it now. */
3863         if (ifp->options->req_addr.s_addr != INADDR_ANY &&
3864             ifp->options->req_mask.s_addr == INADDR_ANY)
3865                 ifp->options->req_mask.s_addr =
3866                     ipv4_getnetmask(ifp->options->req_addr.s_addr);
3867
3868         /* If we haven't specified a ClientID and our hardware address
3869          * length is greater than BOOTP CHADDR then we enforce a ClientID
3870          * of the hardware address family and the hardware address.
3871          * If there is no hardware address and no ClientID set,
3872          * force a DUID based ClientID. */
3873         if (ifp->hwlen > 16)
3874                 ifp->options->options |= DHCPCD_CLIENTID;
3875         else if (ifp->hwlen == 0 && !(ifp->options->options & DHCPCD_CLIENTID))
3876                 ifp->options->options |= DHCPCD_CLIENTID | DHCPCD_DUID;
3877
3878         /* Firewire and InfiniBand interfaces require ClientID and
3879          * the broadcast option being set. */
3880         switch (ifp->family) {
3881         case ARPHRD_IEEE1394:   /* FALLTHROUGH */
3882         case ARPHRD_INFINIBAND:
3883                 ifp->options->options |= DHCPCD_CLIENTID | DHCPCD_BROADCAST;
3884                 break;
3885         }
3886
3887         /* If we violate RFC2131 section 3.7 then require ARP
3888          * to detect if any other client wants our address. */
3889         if (ifp->options->options & DHCPCD_LASTLEASE_EXTEND)
3890                 ifp->options->options |= DHCPCD_ARP;
3891
3892         /* No point in delaying a static configuration */
3893         if (ifp->options->options & DHCPCD_STATIC ||
3894             !(ifp->options->options & DHCPCD_INITIAL_DELAY))
3895         {
3896                 dhcp_start1(ifp);
3897                 return;
3898         }
3899
3900 #ifdef ARPING
3901         /* If we have arpinged then we have already delayed. */
3902         state = D_CSTATE(ifp);
3903         if (state != NULL && state->arping_index != -1) {
3904                 dhcp_start1(ifp);
3905                 return;
3906         }
3907 #endif
3908
3909         tv.tv_sec = DHCP_MIN_DELAY;
3910         tv.tv_nsec = (suseconds_t)arc4random_uniform(
3911             (DHCP_MAX_DELAY - DHCP_MIN_DELAY) * NSEC_PER_SEC);
3912         timespecnorm(&tv);
3913         logdebugx("%s: delaying IPv4 for %0.1f seconds",
3914             ifp->name, timespec_to_double(&tv));
3915
3916         eloop_timeout_add_tv(ifp->ctx->eloop, &tv, dhcp_start1, ifp);
3917 }
3918
3919 void
3920 dhcp_abort(struct interface *ifp)
3921 {
3922         struct dhcp_state *state;
3923
3924         state = D_STATE(ifp);
3925 #ifdef ARPING
3926         if (state != NULL)
3927                 state->arping_index = -1;
3928 #endif
3929
3930         eloop_timeout_delete(ifp->ctx->eloop, dhcp_start1, ifp);
3931
3932         if (state != NULL && state->added) {
3933                 rt_build(ifp->ctx, AF_INET);
3934 #ifdef ARP
3935                 arp_announceaddr(ifp->ctx, &state->addr->addr);
3936 #endif
3937         }
3938 }
3939
3940 void
3941 dhcp_handleifa(int cmd, struct ipv4_addr *ia, pid_t pid)
3942 {
3943         struct interface *ifp;
3944         struct dhcp_state *state;
3945         struct if_options *ifo;
3946         uint8_t i;
3947
3948         ifp = ia->iface;
3949         state = D_STATE(ifp);
3950         if (state == NULL || state->state == DHS_NONE)
3951                 return;
3952
3953         if (cmd == RTM_DELADDR) {
3954                 if (state->addr == ia) {
3955                         loginfox("%s: pid %d deleted IP address %s",
3956                             ifp->name, pid, ia->saddr);
3957                         state->addr = NULL;
3958                         /* Don't clear the added state as we need
3959                          * to drop the lease. */
3960                         dhcp_drop(ifp, "EXPIRE");
3961                         dhcp_start1(ifp);
3962                 }
3963                 return;
3964         }
3965
3966         if (cmd != RTM_NEWADDR)
3967                 return;
3968
3969 #ifdef IN_IFF_NOTUSEABLE
3970         if (!(ia->addr_flags & IN_IFF_NOTUSEABLE))
3971                 dhcp_finish_dad(ifp, &ia->addr);
3972         else if (ia->addr_flags & IN_IFF_DUPLICATED)
3973                 dhcp_addr_duplicated(ifp, &ia->addr);
3974 #endif
3975
3976         ifo = ifp->options;
3977         if (ifo->options & DHCPCD_INFORM) {
3978                 if (state->state != DHS_INFORM)
3979                         dhcp_inform(ifp);
3980                 return;
3981         }
3982
3983         if (!(ifo->options & DHCPCD_STATIC))
3984                 return;
3985         if (ifo->req_addr.s_addr != INADDR_ANY)
3986                 return;
3987
3988         free(state->old);
3989         state->old = state->new;
3990         state->new_len = dhcp_message_new(&state->new, &ia->addr, &ia->mask);
3991         if (state->new == NULL)
3992                 return;
3993         if (ifp->flags & IFF_POINTOPOINT) {
3994                 for (i = 1; i < 255; i++)
3995                         if (i != DHO_ROUTER && has_option_mask(ifo->dstmask,i))
3996                                 dhcp_message_add_addr(state->new, i, ia->brd);
3997         }
3998         state->reason = "STATIC";
3999         rt_build(ifp->ctx, AF_INET);
4000         script_runreason(ifp, state->reason);
4001         if (ifo->options & DHCPCD_INFORM) {
4002                 state->state = DHS_INFORM;
4003                 dhcp_new_xid(ifp);
4004                 state->lease.server.s_addr = INADDR_ANY;
4005                 state->addr = ia;
4006                 dhcp_inform(ifp);
4007         }
4008 }