1 /* SPDX-License-Identifier: BSD-2-Clause */
3 * dhcpcd - DHCP client daemon
4 * Copyright (c) 2006-2020 Roy Marples <roy@marples.name>
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
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.
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
29 #include <sys/param.h>
30 #include <sys/socket.h>
32 #include <arpa/inet.h>
34 #include <net/route.h>
35 #include <netinet/if_ether.h>
36 #include <netinet/in_systm.h>
37 #include <netinet/in.h>
38 #include <netinet/ip.h>
39 #define __FAVOR_BSD /* Nasty glibc hack so we can use BSD semantics for UDP */
40 #include <netinet/udp.h>
44 # include <net/if_dl.h>
60 #define ELOOP_QUEUE ELOOP_DHCP
67 #include "dhcp-common.h"
78 #define DAD "Duplicate address detected"
79 #define DHCP_MIN_LEASE 20
81 #define IPV4A ADDRIPV4 | ARRAY
82 #define IPV4R ADDRIPV4 | REQUEST
84 /* We should define a maximum for the NAK exponential backoff */
87 /* Wait N nanoseconds between sending a RELEASE and dropping the address.
88 * This gives the kernel enough time to actually send it. */
89 #define RELEASE_DELAY_S 0
90 #define RELEASE_DELAY_NS 10000000
93 #define IPDEFTTL 64 /* RFC1340 */
96 /* Support older systems with different defines */
97 #if !defined(IP_RECVPKTINFO) && defined(IP_PKTINFO)
98 #define IP_RECVPKTINFO IP_PKTINFO
101 /* Assert the correct structure size for on wire */
102 __CTASSERT(sizeof(struct ip
) == 20);
103 __CTASSERT(sizeof(struct udphdr
) == 8);
104 __CTASSERT(sizeof(struct bootp
) == 300);
111 static const struct dhcp_op dhcp_ops
[] = {
112 { DHCP_DISCOVER
, "DISCOVER" },
113 { DHCP_OFFER
, "OFFER" },
114 { DHCP_REQUEST
, "REQUEST" },
115 { DHCP_DECLINE
, "DECLINE" },
118 { DHCP_RELEASE
, "RELEASE" },
119 { DHCP_INFORM
, "INFORM" },
120 { DHCP_FORCERENEW
, "FORCERENEW"},
124 static const char * const dhcp_params
[] = {
133 static int dhcp_openbpf(struct interface
*);
134 static void dhcp_start1(void *);
135 #if defined(ARP) && (!defined(KERNEL_RFC5227) || defined(ARPING))
136 static void dhcp_arp_found(struct arp_state
*, const struct arp_msg
*);
138 static void dhcp_handledhcp(struct interface
*, struct bootp
*, size_t,
139 const struct in_addr
*);
140 static void dhcp_handleifudp(void *);
141 static int dhcp_initstate(struct interface
*);
144 dhcp_printoptions(const struct dhcpcd_ctx
*ctx
,
145 const struct dhcp_opt
*opts
, size_t opts_len
)
147 const char * const *p
;
149 const struct dhcp_opt
*opt
, *opt2
;
152 for (p
= dhcp_params
; *p
; p
++)
155 for (i
= 0, opt
= ctx
->dhcp_opts
; i
< ctx
->dhcp_opts_len
; i
++, opt
++) {
156 for (j
= 0, opt2
= opts
; j
< opts_len
; j
++, opt2
++)
157 if (opt
->option
== opt2
->option
)
160 cols
= printf("%03d %s", opt
->option
, opt
->var
);
161 dhcp_print_option_encoding(opt
, cols
);
164 for (i
= 0, opt
= opts
; i
< opts_len
; i
++, opt
++) {
165 cols
= printf("%03d %s", opt
->option
, opt
->var
);
166 dhcp_print_option_encoding(opt
, cols
);
170 static const uint8_t *
171 get_option(struct dhcpcd_ctx
*ctx
,
172 const struct bootp
*bootp
, size_t bootp_len
,
173 unsigned int opt
, size_t *opt_len
)
175 const uint8_t *p
, *e
;
176 uint8_t l
, o
, ol
, overl
, *bp
;
180 if (bootp
== NULL
|| bootp_len
< DHCP_MIN_LEN
) {
185 /* Check we have the magic cookie */
186 if (!IS_DHCP(bootp
)) {
191 p
= bootp
->vend
+ 4; /* options after the 4 byte cookie */
192 e
= (const uint8_t *)bootp
+ bootp_len
;
201 /* No length to read */
205 /* bit 1 set means parse boot file */
206 overl
= (uint8_t)(overl
& ~1);
208 e
= p
+ sizeof(bootp
->file
);
209 } else if (overl
& 2) {
210 /* bit 2 set means parse server name */
211 overl
= (uint8_t)(overl
& ~2);
213 e
= p
+ sizeof(bootp
->sname
);
216 /* No length to read */
220 /* Check we can read the length */
227 /* Check we can read the option data, if present */
233 if (o
== DHO_OPTSOVERLOADED
) {
234 /* Ensure we only get this option once by setting
235 * the last bit as well as the value.
236 * This is valid because only the first two bits
237 * actually mean anything in RFC2132 Section 9.3 */
238 if (l
== 1 && !overl
)
244 /* We must concatonate the options. */
245 if (bl
+ l
> ctx
->opt_buffer_len
) {
251 (bp
- ctx
->opt_buffer
);
254 nb
= realloc(ctx
->opt_buffer
, bl
+ l
);
257 ctx
->opt_buffer
= nb
;
258 ctx
->opt_buffer_len
= bl
+ l
;
259 bp
= ctx
->opt_buffer
+ pos
;
262 bp
= ctx
->opt_buffer
;
278 return (const uint8_t *)ctx
->opt_buffer
;
287 get_option_addr(struct dhcpcd_ctx
*ctx
,
288 struct in_addr
*a
, const struct bootp
*bootp
, size_t bootp_len
,
294 p
= get_option(ctx
, bootp
, bootp_len
, option
, &len
);
295 if (!p
|| len
< (ssize_t
)sizeof(a
->s_addr
))
297 memcpy(&a
->s_addr
, p
, sizeof(a
->s_addr
));
302 get_option_uint32(struct dhcpcd_ctx
*ctx
,
303 uint32_t *i
, const struct bootp
*bootp
, size_t bootp_len
, uint8_t option
)
309 p
= get_option(ctx
, bootp
, bootp_len
, option
, &len
);
310 if (!p
|| len
< (ssize_t
)sizeof(d
))
312 memcpy(&d
, p
, sizeof(d
));
319 get_option_uint16(struct dhcpcd_ctx
*ctx
,
320 uint16_t *i
, const struct bootp
*bootp
, size_t bootp_len
, uint8_t option
)
326 p
= get_option(ctx
, bootp
, bootp_len
, option
, &len
);
327 if (!p
|| len
< (ssize_t
)sizeof(d
))
329 memcpy(&d
, p
, sizeof(d
));
336 get_option_uint8(struct dhcpcd_ctx
*ctx
,
337 uint8_t *i
, const struct bootp
*bootp
, size_t bootp_len
, uint8_t option
)
342 p
= get_option(ctx
, bootp
, bootp_len
, option
, &len
);
343 if (!p
|| len
< (ssize_t
)sizeof(*p
))
351 print_rfc3442(FILE *fp
, const uint8_t *data
, size_t data_len
)
353 const uint8_t *p
= data
, *e
;
358 /* Minimum is 5 -first is CIDR and a router length of 4 */
367 if (fputc(' ', fp
) == EOF
)
375 ocets
= (size_t)(cidr
+ 7) / NBBY
;
376 if (p
+ 4 + ocets
> e
) {
380 /* If we have ocets then we have a destination and netmask */
383 memcpy(&addr
.s_addr
, p
, ocets
);
386 if (fprintf(fp
, "%s/%d", inet_ntoa(addr
), cidr
) == -1)
389 /* Finally, snag the router */
390 memcpy(&addr
.s_addr
, p
, 4);
392 if (fprintf(fp
, " %s", inet_ntoa(addr
)) == -1)
396 if (fputc('\0', fp
) == EOF
)
402 decode_rfc3442_rt(rb_tree_t
*routes
, struct interface
*ifp
,
403 const uint8_t *data
, size_t dl
, const struct bootp
*bootp
)
405 const uint8_t *p
= data
;
409 struct rt
*rt
= NULL
;
410 struct in_addr dest
, netmask
, gateway
;
413 /* Minimum is 5 -first is CIDR and a router length of 4 */
428 ocets
= (size_t)(cidr
+ 7) / NBBY
;
429 if (p
+ 4 + ocets
> e
) {
434 if ((rt
= rt_new(ifp
)) == NULL
)
437 /* If we have ocets then we have a destination and netmask */
440 memcpy(&dest
.s_addr
, p
, ocets
);
442 netmask
.s_addr
= htonl(~0U << (32 - cidr
));
446 /* Finally, snag the router */
447 memcpy(&gateway
.s_addr
, p
, 4);
450 /* An on-link host route is normally set by having the
451 * gateway match the destination or assigned address */
452 if (gateway
.s_addr
== dest
.s_addr
||
453 (gateway
.s_addr
== bootp
->yiaddr
||
454 gateway
.s_addr
== bootp
->ciaddr
))
456 gateway
.s_addr
= INADDR_ANY
;
457 netmask
.s_addr
= INADDR_BROADCAST
;
459 if (netmask
.s_addr
== INADDR_BROADCAST
)
460 rt
->rt_flags
= RTF_HOST
;
462 sa_in_init(&rt
->rt_dest
, &dest
);
463 sa_in_init(&rt
->rt_netmask
, &netmask
);
464 sa_in_init(&rt
->rt_gateway
, &gateway
);
465 if (rt_proto_add(routes
, rt
))
472 print_rfc3361(FILE *fp
, const uint8_t *data
, size_t dl
)
475 char sip
[NS_MAXDNAME
];
487 if (decode_rfc1035(sip
, sizeof(sip
), data
, dl
) == -1)
489 if (efprintf(fp
, "%s", sip
) == -1)
497 addr
.s_addr
= INADDR_BROADCAST
;
500 data
+= sizeof(addr
.s_addr
), dl
-= sizeof(addr
.s_addr
))
502 memcpy(&addr
.s_addr
, data
, sizeof(addr
.s_addr
));
503 if (fprintf(fp
, "%s", inet_ntoa(addr
)) == -1)
505 if (dl
!= sizeof(addr
.s_addr
)) {
506 if (fputc(' ', fp
) == EOF
)
510 if (fputc('\0', fp
) == EOF
)
522 get_option_string(struct dhcpcd_ctx
*ctx
,
523 const struct bootp
*bootp
, size_t bootp_len
, uint8_t option
)
529 p
= get_option(ctx
, bootp
, bootp_len
, option
, &len
);
530 if (!p
|| len
== 0 || *p
== '\0')
533 s
= malloc(sizeof(char) * (len
+ 1));
541 /* This calculates the netmask that we should use for static routes.
542 * This IS different from the calculation used to calculate the netmask
543 * for an interface address. */
545 route_netmask(uint32_t ip_in
)
547 /* used to be unsigned long - check if error */
548 uint32_t p
= ntohl(ip_in
);
570 /* We need to obey routing options.
571 * If we have a CSR then we only use that.
572 * Otherwise we add static routes and then routers. */
574 get_option_routes(rb_tree_t
*routes
, struct interface
*ifp
,
575 const struct bootp
*bootp
, size_t bootp_len
)
577 struct if_options
*ifo
= ifp
->options
;
580 struct rt
*rt
= NULL
;
581 struct in_addr dest
, netmask
, gateway
;
583 const char *csr
= "";
586 /* If we have CSR's then we MUST use these only */
587 if (!has_option_mask(ifo
->nomask
, DHO_CSR
))
588 p
= get_option(ifp
->ctx
, bootp
, bootp_len
, DHO_CSR
, &len
);
591 /* Check for crappy MS option */
592 if (!p
&& !has_option_mask(ifo
->nomask
, DHO_MSCSR
)) {
593 p
= get_option(ifp
->ctx
, bootp
, bootp_len
, DHO_MSCSR
, &len
);
597 if (p
&& (n
= decode_rfc3442_rt(routes
, ifp
, p
, len
, bootp
)) != -1) {
598 const struct dhcp_state
*state
;
600 state
= D_CSTATE(ifp
);
601 if (!(ifo
->options
& DHCPCD_CSR_WARNED
) &&
602 !(state
->added
& STATE_FAKE
))
604 logdebugx("%s: using %sClassless Static Routes",
606 ifo
->options
|= DHCPCD_CSR_WARNED
;
612 /* OK, get our static routes first. */
613 if (!has_option_mask(ifo
->nomask
, DHO_STATICROUTE
))
614 p
= get_option(ifp
->ctx
, bootp
, bootp_len
,
615 DHO_STATICROUTE
, &len
);
618 /* RFC 2131 Section 5.8 states length MUST be in multiples of 8 */
619 if (p
&& len
% 8 == 0) {
622 memcpy(&dest
.s_addr
, p
, sizeof(dest
.s_addr
));
624 memcpy(&gateway
.s_addr
, p
, sizeof(gateway
.s_addr
));
626 /* RFC 2131 Section 5.8 states default route is
628 if (gateway
.s_addr
== INADDR_ANY
)
630 if ((rt
= rt_new(ifp
)) == NULL
)
633 /* A on-link host route is normally set by having the
634 * gateway match the destination or assigned address */
635 if (gateway
.s_addr
== dest
.s_addr
||
636 (gateway
.s_addr
== bootp
->yiaddr
||
637 gateway
.s_addr
== bootp
->ciaddr
))
639 gateway
.s_addr
= INADDR_ANY
;
640 netmask
.s_addr
= INADDR_BROADCAST
;
642 netmask
.s_addr
= route_netmask(dest
.s_addr
);
643 if (netmask
.s_addr
== INADDR_BROADCAST
)
644 rt
->rt_flags
= RTF_HOST
;
646 sa_in_init(&rt
->rt_dest
, &dest
);
647 sa_in_init(&rt
->rt_netmask
, &netmask
);
648 sa_in_init(&rt
->rt_gateway
, &gateway
);
649 if (rt_proto_add(routes
, rt
))
654 /* Now grab our routers */
655 if (!has_option_mask(ifo
->nomask
, DHO_ROUTER
))
656 p
= get_option(ifp
->ctx
, bootp
, bootp_len
, DHO_ROUTER
, &len
);
659 if (p
&& len
% 4 == 0) {
661 dest
.s_addr
= INADDR_ANY
;
662 netmask
.s_addr
= INADDR_ANY
;
664 if ((rt
= rt_new(ifp
)) == NULL
)
666 memcpy(&gateway
.s_addr
, p
, sizeof(gateway
.s_addr
));
668 sa_in_init(&rt
->rt_dest
, &dest
);
669 sa_in_init(&rt
->rt_netmask
, &netmask
);
670 sa_in_init(&rt
->rt_gateway
, &gateway
);
671 if (rt_proto_add(routes
, rt
))
680 dhcp_get_mtu(const struct interface
*ifp
)
682 const struct dhcp_state
*state
;
685 if (ifp
->options
->mtu
)
686 return (uint16_t)ifp
->options
->mtu
;
687 mtu
= 0; /* bogus gcc warning */
688 if ((state
= D_CSTATE(ifp
)) == NULL
||
689 has_option_mask(ifp
->options
->nomask
, DHO_MTU
) ||
690 get_option_uint16(ifp
->ctx
, &mtu
,
691 state
->new, state
->new_len
, DHO_MTU
) == -1)
696 /* Grab our routers from the DHCP message and apply any MTU value
697 * the message contains */
699 dhcp_get_routes(rb_tree_t
*routes
, struct interface
*ifp
)
701 const struct dhcp_state
*state
;
703 if ((state
= D_CSTATE(ifp
)) == NULL
|| !(state
->added
& STATE_ADDED
))
705 return get_option_routes(routes
, ifp
, state
->new, state
->new_len
);
708 /* Assumes DHCP options */
710 dhcp_message_add_addr(struct bootp
*bootp
,
711 uint8_t type
, struct in_addr addr
)
717 while (*p
!= DHO_END
) {
722 len
= (size_t)(p
- bootp
->vend
);
723 if (len
+ 6 > sizeof(bootp
->vend
)) {
730 memcpy(p
, &addr
.s_addr
, 4);
737 make_message(struct bootp
**bootpm
, const struct interface
*ifp
, uint8_t type
)
741 uint8_t *n_params
= NULL
;
745 const struct dhcp_opt
*opt
;
746 struct if_options
*ifo
= ifp
->options
;
747 const struct dhcp_state
*state
= D_CSTATE(ifp
);
748 const struct dhcp_lease
*lease
= &state
->lease
;
749 char hbuf
[HOSTNAME_MAX_LEN
+ 1];
750 const char *hostname
;
751 const struct vivco
*vivco
;
754 uint8_t *auth
, auth_len
;
757 if ((mtu
= if_getmtu(ifp
)) == -1)
758 logerr("%s: if_getmtu", ifp
->name
);
759 else if (mtu
< MTU_MIN
) {
760 if (if_setmtu(ifp
, MTU_MIN
) == -1)
761 logerr("%s: if_setmtu", ifp
->name
);
765 if (ifo
->options
& DHCPCD_BOOTP
)
766 bootp
= calloc(1, sizeof (*bootp
));
768 /* Make the maximal message we could send */
769 bootp
= calloc(1, (size_t)(mtu
- IP_UDP_SIZE
));
775 if (state
->addr
!= NULL
&&
776 (type
== DHCP_INFORM
|| type
== DHCP_RELEASE
||
777 (type
== DHCP_REQUEST
&&
778 state
->addr
->mask
.s_addr
== lease
->mask
.s_addr
&&
779 (state
->new == NULL
|| IS_DHCP(state
->new)) &&
780 !(state
->added
& (STATE_FAKE
| STATE_EXPIRED
)))))
781 bootp
->ciaddr
= state
->addr
->addr
.s_addr
;
783 bootp
->op
= BOOTREQUEST
;
784 bootp
->htype
= (uint8_t)ifp
->hwtype
;
785 if (ifp
->hwlen
!= 0 && ifp
->hwlen
< sizeof(bootp
->chaddr
)) {
786 bootp
->hlen
= (uint8_t)ifp
->hwlen
;
787 memcpy(&bootp
->chaddr
, &ifp
->hwaddr
, ifp
->hwlen
);
790 if (ifo
->options
& DHCPCD_BROADCAST
&&
791 bootp
->ciaddr
== 0 &&
792 type
!= DHCP_DECLINE
&&
793 type
!= DHCP_RELEASE
)
794 bootp
->flags
= htons(BROADCAST_FLAG
);
796 if (type
!= DHCP_DECLINE
&& type
!= DHCP_RELEASE
) {
798 unsigned long long secs
;
800 clock_gettime(CLOCK_MONOTONIC
, &tv
);
801 secs
= eloop_timespec_diff(&tv
, &state
->started
, NULL
);
802 if (secs
> UINT16_MAX
)
803 bootp
->secs
= htons((uint16_t)UINT16_MAX
);
805 bootp
->secs
= htons((uint16_t)secs
);
808 bootp
->xid
= htonl(state
->xid
);
810 if (ifo
->options
& DHCPCD_BOOTP
)
811 return sizeof(*bootp
);
814 e
= (uint8_t *)bootp
+ (mtu
- IP_UDP_SIZE
) - 1; /* -1 for DHO_END */
816 ul
= htonl(MAGIC_COOKIE
);
817 memcpy(p
, &ul
, sizeof(ul
));
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 { \
827 memcpy(p, &(a)->s_addr, 4); \
829 } while (0 /* CONSTCOND */)
831 /* Options are listed in numerical order as per RFC 7844 Section 3.1
832 * XXX: They should be randomised. */
835 if (lease
->addr
.s_addr
&& lease
->cookie
== htonl(MAGIC_COOKIE
)) {
836 if (type
== DHCP_DECLINE
||
837 (type
== DHCP_REQUEST
&&
838 (state
->addr
== NULL
||
839 state
->added
& (STATE_FAKE
| STATE_EXPIRED
) ||
840 lease
->addr
.s_addr
!= state
->addr
->addr
.s_addr
)))
843 PUT_ADDR(DHO_IPADDRESS
, &lease
->addr
);
848 *p
++ = DHO_MESSAGETYPE
;
852 if (lease
->addr
.s_addr
&& lease
->cookie
== htonl(MAGIC_COOKIE
)) {
853 if (type
== DHCP_RELEASE
|| putip
) {
854 if (lease
->server
.s_addr
)
855 PUT_ADDR(DHO_SERVERID
, &lease
->server
);
859 if (type
== DHCP_DECLINE
) {
861 if (len
> AREA_LEFT
) {
869 #define DHCP_DIR(type) ((type) == DHCP_DISCOVER || (type) == DHCP_INFORM || \
870 (type) == DHCP_REQUEST)
872 if (DHCP_DIR(type
)) {
873 /* vendor is already encoded correctly, so just add it */
874 if (ifo
->vendor
[0]) {
875 AREA_CHECK(ifo
->vendor
[0]);
877 memcpy(p
, ifo
->vendor
, (size_t)ifo
->vendor
[0] + 1);
878 p
+= ifo
->vendor
[0] + 1;
882 if (type
== DHCP_DISCOVER
&& ifo
->options
& DHCPCD_REQUEST
)
883 PUT_ADDR(DHO_IPADDRESS
, &ifo
->req_addr
);
885 if (DHCP_DIR(type
)) {
886 if (type
!= DHCP_INFORM
) {
887 if (ifo
->leasetime
!= 0) {
889 *p
++ = DHO_LEASETIME
;
891 ul
= htonl(ifo
->leasetime
);
898 *p
++ = DHO_PARAMETERREQUESTLIST
;
901 for (i
= 0, opt
= ifp
->ctx
->dhcp_opts
;
902 i
< ifp
->ctx
->dhcp_opts_len
;
905 if (!DHC_REQOPT(opt
, ifo
->requestmask
, ifo
->nomask
))
907 if (type
== DHCP_INFORM
&&
908 (opt
->option
== DHO_RENEWALTIME
||
909 opt
->option
== DHO_REBINDTIME
))
912 *p
++ = (uint8_t)opt
->option
;
914 for (i
= 0, opt
= ifo
->dhcp_override
;
915 i
< ifo
->dhcp_override_len
;
918 /* Check if added above */
919 for (lp
= n_params
+ 1; lp
< p
; lp
++)
920 if (*lp
== (uint8_t)opt
->option
)
924 if (!DHC_REQOPT(opt
, ifo
->requestmask
, ifo
->nomask
))
926 if (type
== DHCP_INFORM
&&
927 (opt
->option
== DHO_RENEWALTIME
||
928 opt
->option
== DHO_REBINDTIME
))
931 *p
++ = (uint8_t)opt
->option
;
933 *n_params
= (uint8_t)(p
- n_params
- 1);
936 !(has_option_mask(ifo
->nomask
, DHO_MAXMESSAGESIZE
)))
939 *p
++ = DHO_MAXMESSAGESIZE
;
941 sz
= htons((uint16_t)(mtu
- IP_UDP_SIZE
));
946 if (ifo
->userclass
[0] &&
947 !has_option_mask(ifo
->nomask
, DHO_USERCLASS
))
949 AREA_CHECK(ifo
->userclass
[0]);
950 *p
++ = DHO_USERCLASS
;
951 memcpy(p
, ifo
->userclass
,
952 (size_t)ifo
->userclass
[0] + 1);
953 p
+= ifo
->userclass
[0] + 1;
957 if (state
->clientid
) {
958 AREA_CHECK(state
->clientid
[0]);
960 memcpy(p
, state
->clientid
, (size_t)state
->clientid
[0] + 1);
961 p
+= state
->clientid
[0] + 1;
964 if (DHCP_DIR(type
) &&
965 !has_option_mask(ifo
->nomask
, DHO_VENDORCLASSID
) &&
966 ifo
->vendorclassid
[0])
968 AREA_CHECK(ifo
->vendorclassid
[0]);
969 *p
++ = DHO_VENDORCLASSID
;
970 memcpy(p
, ifo
->vendorclassid
, (size_t)ifo
->vendorclassid
[0]+1);
971 p
+= ifo
->vendorclassid
[0] + 1;
974 if (type
== DHCP_DISCOVER
&&
975 !(ifp
->ctx
->options
& DHCPCD_TEST
) &&
976 DHC_REQ(ifo
->requestmask
, ifo
->nomask
, DHO_RAPIDCOMMIT
))
978 /* RFC 4039 Section 3 */
980 *p
++ = DHO_RAPIDCOMMIT
;
984 if (DHCP_DIR(type
)) {
985 hostname
= dhcp_get_hostname(hbuf
, sizeof(hbuf
), ifo
);
988 * RFC4702 3.1 States that if we send the Client FQDN option
989 * then we MUST NOT also send the Host Name option.
990 * Technically we could, but that is not RFC conformant and
991 * also seems to break some DHCP server implemetations such as
992 * Windows. On the other hand, ISC dhcpd is just as non RFC
993 * conformant by not accepting a partially qualified FQDN.
995 if (ifo
->fqdn
!= FQDN_DISABLE
) {
996 /* IETF DHC-FQDN option (81), RFC4702 */
999 i
+= encode_rfc1035(hostname
, NULL
);
1005 * S: 1 => Client requests Server to update
1006 * a RR in DNS as well as PTR
1007 * O: 1 => Server indicates to client that
1008 * DNS has been updated
1009 * E: 1 => Name data is DNS format
1010 * N: 1 => Client requests Server to not
1014 *p
++ = (uint8_t)((ifo
->fqdn
& 0x09) | 0x04);
1016 *p
++ = (FQDN_NONE
& 0x09) | 0x04;
1017 *p
++ = 0; /* from server for PTR RR */
1018 *p
++ = 0; /* from server for A RR if S=1 */
1020 i
= encode_rfc1035(hostname
, p
);
1023 } else if (ifo
->options
& DHCPCD_HOSTNAME
&& hostname
) {
1024 len
= strlen(hostname
);
1026 *p
++ = DHO_HOSTNAME
;
1027 *p
++ = (uint8_t)len
;
1028 memcpy(p
, hostname
, len
);
1034 auth
= NULL
; /* appease GCC */
1036 if (ifo
->auth
.options
& DHCPCD_AUTH_SEND
) {
1037 ssize_t alen
= dhcp_auth_encode(ifp
->ctx
, &ifo
->auth
,
1039 NULL
, 0, 4, type
, NULL
, 0);
1040 if (alen
!= -1 && alen
> UINT8_MAX
) {
1045 logerr("%s: dhcp_auth_encode", ifp
->name
);
1046 else if (alen
!= 0) {
1047 auth_len
= (uint8_t)alen
;
1048 AREA_CHECK(auth_len
);
1049 *p
++ = DHO_AUTHENTICATION
;
1057 /* RFC 2563 Auto Configure */
1058 if (type
== DHCP_DISCOVER
&& ifo
->options
& DHCPCD_IPV4LL
&&
1059 !(has_option_mask(ifo
->nomask
, DHO_AUTOCONFIGURE
)))
1062 *p
++ = DHO_AUTOCONFIGURE
;
1067 if (DHCP_DIR(type
)) {
1068 if (ifo
->mudurl
[0]) {
1069 AREA_CHECK(ifo
->mudurl
[0]);
1071 memcpy(p
, ifo
->mudurl
, (size_t)ifo
->mudurl
[0] + 1);
1072 p
+= ifo
->mudurl
[0] + 1;
1075 if (ifo
->vivco_len
&&
1076 !has_option_mask(ifo
->nomask
, DHO_VIVCO
))
1078 AREA_CHECK(sizeof(ul
));
1082 ul
= htonl(ifo
->vivco_en
);
1083 memcpy(p
, &ul
, sizeof(ul
));
1085 for (i
= 0, vivco
= ifo
->vivco
;
1089 AREA_FIT(vivco
->len
);
1090 if (vivco
->len
+ 2 + *lp
> 255) {
1091 logerrx("%s: VIVCO option too big",
1096 *p
++ = (uint8_t)vivco
->len
;
1097 memcpy(p
, vivco
->data
, vivco
->len
);
1099 *lp
= (uint8_t)(*lp
+ vivco
->len
+ 1);
1104 if ((ifo
->auth
.options
& DHCPCD_AUTH_SENDREQUIRE
) !=
1105 DHCPCD_AUTH_SENDREQUIRE
&&
1106 !has_option_mask(ifo
->nomask
, DHO_FORCERENEW_NONCE
))
1108 /* We support HMAC-MD5 */
1110 *p
++ = DHO_FORCERENEW_NONCE
;
1112 *p
++ = AUTH_ALG_HMAC_MD5
;
1118 len
= (size_t)(p
- (uint8_t *)bootp
);
1120 /* Pad out to the BOOTP message length.
1121 * Even if we send a DHCP packet with a variable length vendor area,
1122 * some servers / relay agents don't like packets smaller than
1123 * a BOOTP message which is fine because that's stipulated
1124 * in RFC1542 section 2.1. */
1125 while (len
< sizeof(*bootp
)) {
1131 if (ifo
->auth
.options
& DHCPCD_AUTH_SEND
&& auth_len
!= 0)
1132 dhcp_auth_encode(ifp
->ctx
, &ifo
->auth
, state
->auth
.token
,
1133 (uint8_t *)bootp
, len
, 4, type
, auth
, auth_len
);
1136 return (ssize_t
)len
;
1139 logerrx("%s: DHCP message too big", ifp
->name
);
1145 read_lease(struct interface
*ifp
, struct bootp
**bootp
)
1149 uint8_t buf
[FRAMELEN_MAX
];
1151 struct dhcp_state
*state
= D_STATE(ifp
);
1156 const uint8_t *auth
;
1163 if (state
->leasefile
[0] == '\0') {
1164 logdebugx("reading standard input");
1165 sbytes
= read(fileno(stdin
), buf
.buf
, sizeof(buf
.buf
));
1167 logdebugx("%s: reading lease `%s'",
1168 ifp
->name
, state
->leasefile
);
1169 sbytes
= dhcp_readfile(ifp
->ctx
, state
->leasefile
,
1170 buf
.buf
, sizeof(buf
.buf
));
1173 if (errno
!= ENOENT
)
1174 logerr("%s: %s", ifp
->name
, state
->leasefile
);
1177 bytes
= (size_t)sbytes
;
1179 /* Ensure the packet is at lease BOOTP sized
1180 * with a vendor area of 4 octets
1181 * (it should be more, and our read packet enforces this so this
1182 * code should not be needed, but of course people could
1183 * scribble whatever in the stored lease file. */
1184 if (bytes
< DHCP_MIN_LEN
) {
1185 logerrx("%s: %s: truncated lease", ifp
->name
, __func__
);
1189 if (ifp
->ctx
->options
& DHCPCD_DUMPLEASE
)
1192 /* We may have found a BOOTP server */
1193 if (get_option_uint8(ifp
->ctx
, &type
, &buf
.bootp
, bytes
,
1194 DHO_MESSAGETYPE
) == -1)
1198 /* Authenticate the message */
1199 auth
= get_option(ifp
->ctx
, &buf
.bootp
, bytes
,
1200 DHO_AUTHENTICATION
, &auth_len
);
1202 if (dhcp_auth_validate(&state
->auth
, &ifp
->options
->auth
,
1203 &buf
.bootp
, bytes
, 4, type
, auth
, auth_len
) == NULL
)
1205 logerr("%s: authentication failed", ifp
->name
);
1208 if (state
->auth
.token
)
1209 logdebugx("%s: validated using 0x%08" PRIu32
,
1210 ifp
->name
, state
->auth
.token
->secretid
);
1212 logdebugx("%s: accepted reconfigure key", ifp
->name
);
1213 } else if ((ifp
->options
->auth
.options
& DHCPCD_AUTH_SENDREQUIRE
) ==
1214 DHCPCD_AUTH_SENDREQUIRE
)
1216 logerrx("%s: authentication now required", ifp
->name
);
1222 *bootp
= malloc(bytes
);
1223 if (*bootp
== NULL
) {
1227 memcpy(*bootp
, buf
.buf
, bytes
);
1231 static const struct dhcp_opt
*
1232 dhcp_getoverride(const struct if_options
*ifo
, unsigned int o
)
1235 const struct dhcp_opt
*opt
;
1237 for (i
= 0, opt
= ifo
->dhcp_override
;
1238 i
< ifo
->dhcp_override_len
;
1241 if (opt
->option
== o
)
1247 static const uint8_t *
1248 dhcp_getoption(struct dhcpcd_ctx
*ctx
,
1249 size_t *os
, unsigned int *code
, size_t *len
,
1250 const uint8_t *od
, size_t ol
, struct dhcp_opt
**oopt
)
1253 struct dhcp_opt
*opt
;
1260 *os
= 2; /* code + len */
1261 *code
= (unsigned int)*od
++;
1262 *len
= (size_t)*od
++;
1263 if (*len
> ol
- *os
) {
1270 for (i
= 0, opt
= ctx
->dhcp_opts
; i
< ctx
->dhcp_opts_len
; i
++, opt
++) {
1271 if (opt
->option
== *code
) {
1281 dhcp_env(FILE *fenv
, const char *prefix
, const struct interface
*ifp
,
1282 const struct bootp
*bootp
, size_t bootp_len
)
1284 const struct if_options
*ifo
;
1286 struct in_addr addr
;
1289 struct dhcp_opt
*opt
, *vo
;
1291 char safe
[(BOOTP_FILE_LEN
* 4) + 1];
1296 if (get_option_uint8(ifp
->ctx
, &overl
, bootp
, bootp_len
,
1297 DHO_OPTSOVERLOADED
) == -1)
1300 if (bootp
->yiaddr
|| bootp
->ciaddr
) {
1301 /* Set some useful variables that we derive from the DHCP
1302 * message but are not necessarily in the options */
1303 addr
.s_addr
= bootp
->yiaddr
? bootp
->yiaddr
: bootp
->ciaddr
;
1304 if (efprintf(fenv
, "%s_ip_address=%s",
1305 prefix
, inet_ntoa(addr
)) == -1)
1307 if (get_option_addr(ifp
->ctx
, &net
,
1308 bootp
, bootp_len
, DHO_SUBNETMASK
) == -1) {
1309 net
.s_addr
= ipv4_getnetmask(addr
.s_addr
);
1310 if (efprintf(fenv
, "%s_subnet_mask=%s",
1311 prefix
, inet_ntoa(net
)) == -1)
1314 if (efprintf(fenv
, "%s_subnet_cidr=%d",
1315 prefix
, inet_ntocidr(net
))== -1)
1317 if (get_option_addr(ifp
->ctx
, &brd
,
1318 bootp
, bootp_len
, DHO_BROADCAST
) == -1)
1320 brd
.s_addr
= addr
.s_addr
| ~net
.s_addr
;
1321 if (efprintf(fenv
, "%s_broadcast_address=%s",
1322 prefix
, inet_ntoa(brd
)) == -1)
1325 addr
.s_addr
= bootp
->yiaddr
& net
.s_addr
;
1326 if (efprintf(fenv
, "%s_network_number=%s",
1327 prefix
, inet_ntoa(addr
)) == -1)
1331 if (*bootp
->file
&& !(overl
& 1)) {
1332 print_string(safe
, sizeof(safe
), OT_STRING
,
1333 bootp
->file
, sizeof(bootp
->file
));
1334 if (efprintf(fenv
, "%s_filename=%s", prefix
, safe
) == -1)
1337 if (*bootp
->sname
&& !(overl
& 2)) {
1338 print_string(safe
, sizeof(safe
), OT_STRING
| OT_DOMAIN
,
1339 bootp
->sname
, sizeof(bootp
->sname
));
1340 if (efprintf(fenv
, "%s_server_name=%s", prefix
, safe
) == -1)
1344 /* Zero our indexes */
1345 for (i
= 0, opt
= ifp
->ctx
->dhcp_opts
;
1346 i
< ifp
->ctx
->dhcp_opts_len
;
1348 dhcp_zero_index(opt
);
1349 for (i
= 0, opt
= ifp
->options
->dhcp_override
;
1350 i
< ifp
->options
->dhcp_override_len
;
1352 dhcp_zero_index(opt
);
1353 for (i
= 0, opt
= ifp
->ctx
->vivso
;
1354 i
< ifp
->ctx
->vivso_len
;
1356 dhcp_zero_index(opt
);
1358 for (i
= 0, opt
= ifp
->ctx
->dhcp_opts
;
1359 i
< ifp
->ctx
->dhcp_opts_len
;
1362 if (has_option_mask(ifo
->nomask
, opt
->option
))
1364 if (dhcp_getoverride(ifo
, opt
->option
))
1366 p
= get_option(ifp
->ctx
, bootp
, bootp_len
, opt
->option
, &pl
);
1369 dhcp_envoption(ifp
->ctx
, fenv
, prefix
, ifp
->name
,
1370 opt
, dhcp_getoption
, p
, pl
);
1372 if (opt
->option
!= DHO_VIVSO
|| pl
<= (int)sizeof(uint32_t))
1374 memcpy(&en
, p
, sizeof(en
));
1376 vo
= vivso_find(en
, ifp
);
1379 /* Skip over en + total size */
1380 p
+= sizeof(en
) + 1;
1381 pl
-= sizeof(en
) + 1;
1382 dhcp_envoption(ifp
->ctx
, fenv
, prefix
, ifp
->name
,
1383 vo
, dhcp_getoption
, p
, pl
);
1386 for (i
= 0, opt
= ifo
->dhcp_override
;
1387 i
< ifo
->dhcp_override_len
;
1390 if (has_option_mask(ifo
->nomask
, opt
->option
))
1392 p
= get_option(ifp
->ctx
, bootp
, bootp_len
, opt
->option
, &pl
);
1395 dhcp_envoption(ifp
->ctx
, fenv
, prefix
, ifp
->name
,
1396 opt
, dhcp_getoption
, p
, pl
);
1403 get_lease(struct interface
*ifp
,
1404 struct dhcp_lease
*lease
, const struct bootp
*bootp
, size_t len
)
1406 struct dhcpcd_ctx
*ctx
;
1408 assert(bootp
!= NULL
);
1410 memcpy(&lease
->cookie
, bootp
->vend
, sizeof(lease
->cookie
));
1411 /* BOOTP does not set yiaddr for replies when ciaddr is set. */
1412 lease
->addr
.s_addr
= bootp
->yiaddr
? bootp
->yiaddr
: bootp
->ciaddr
;
1414 if (ifp
->options
->options
& (DHCPCD_STATIC
| DHCPCD_INFORM
)) {
1415 if (ifp
->options
->req_addr
.s_addr
!= INADDR_ANY
) {
1416 lease
->mask
= ifp
->options
->req_mask
;
1417 if (ifp
->options
->req_brd
.s_addr
!= INADDR_ANY
)
1418 lease
->brd
= ifp
->options
->req_brd
;
1421 lease
->addr
.s_addr
| ~lease
->mask
.s_addr
;
1423 const struct ipv4_addr
*ia
;
1425 ia
= ipv4_iffindaddr(ifp
, &lease
->addr
, NULL
);
1427 lease
->mask
= ia
->mask
;
1428 lease
->brd
= ia
->brd
;
1431 if (get_option_addr(ctx
, &lease
->mask
, bootp
, len
,
1432 DHO_SUBNETMASK
) == -1)
1433 lease
->mask
.s_addr
=
1434 ipv4_getnetmask(lease
->addr
.s_addr
);
1435 if (get_option_addr(ctx
, &lease
->brd
, bootp
, len
,
1436 DHO_BROADCAST
) == -1)
1438 lease
->addr
.s_addr
| ~lease
->mask
.s_addr
;
1440 if (get_option_uint32(ctx
, &lease
->leasetime
,
1441 bootp
, len
, DHO_LEASETIME
) != 0)
1442 lease
->leasetime
= DHCP_INFINITE_LIFETIME
;
1443 if (get_option_uint32(ctx
, &lease
->renewaltime
,
1444 bootp
, len
, DHO_RENEWALTIME
) != 0)
1445 lease
->renewaltime
= 0;
1446 if (get_option_uint32(ctx
, &lease
->rebindtime
,
1447 bootp
, len
, DHO_REBINDTIME
) != 0)
1448 lease
->rebindtime
= 0;
1449 if (get_option_addr(ctx
, &lease
->server
, bootp
, len
, DHO_SERVERID
) != 0)
1450 lease
->server
.s_addr
= INADDR_ANY
;
1454 get_dhcp_op(uint8_t type
)
1456 const struct dhcp_op
*d
;
1458 for (d
= dhcp_ops
; d
->name
; d
++)
1459 if (d
->value
== type
)
1465 dhcp_fallback(void *arg
)
1467 struct interface
*iface
;
1469 iface
= (struct interface
*)arg
;
1470 dhcpcd_selectprofile(iface
, iface
->options
->fallback
);
1471 dhcpcd_startinterface(iface
);
1475 dhcp_new_xid(struct interface
*ifp
)
1477 struct dhcp_state
*state
;
1478 const struct interface
*ifp1
;
1479 const struct dhcp_state
*state1
;
1481 state
= D_STATE(ifp
);
1482 if (ifp
->options
->options
& DHCPCD_XID_HWADDR
&&
1483 ifp
->hwlen
>= sizeof(state
->xid
))
1484 /* The lower bits are probably more unique on the network */
1486 (ifp
->hwaddr
+ ifp
->hwlen
) - sizeof(state
->xid
),
1487 sizeof(state
->xid
));
1490 state
->xid
= arc4random();
1493 /* Ensure it's unique */
1494 TAILQ_FOREACH(ifp1
, ifp
->ctx
->ifaces
, next
) {
1497 if ((state1
= D_CSTATE(ifp1
)) == NULL
)
1499 if (state1
->xid
== state
->xid
)
1503 if (ifp
->options
->options
& DHCPCD_XID_HWADDR
&&
1504 ifp
->hwlen
>= sizeof(state
->xid
))
1506 logerrx("%s: duplicate xid on %s",
1507 ifp
->name
, ifp1
->name
);
1513 /* We can't do this when sharing leases across interfaes */
1515 /* As the XID changes, re-apply the filter. */
1516 if (state
->bpf_fd
!= -1) {
1517 if (bpf_bootp(ifp
, state
->bpf_fd
) == -1)
1518 logerr(__func__
); /* try to continue */
1524 dhcp_close(struct interface
*ifp
)
1526 struct dhcpcd_ctx
*ctx
= ifp
->ctx
;
1527 struct dhcp_state
*state
= D_STATE(ifp
);
1533 if (IN_PRIVSEP_SE(ctx
)) {
1534 ps_bpf_closebootp(ifp
);
1535 if (state
->addr
!= NULL
)
1536 ps_inet_closebootp(state
->addr
);
1540 if (state
->bpf
!= NULL
) {
1541 eloop_event_delete(ctx
->eloop
, state
->bpf
->bpf_fd
);
1542 bpf_close(state
->bpf
);
1545 if (state
->udp_rfd
!= -1) {
1546 eloop_event_delete(ctx
->eloop
, state
->udp_rfd
);
1547 close(state
->udp_rfd
);
1548 state
->udp_rfd
= -1;
1551 state
->interval
= 0;
1555 dhcp_openudp(struct in_addr
*ia
)
1558 struct sockaddr_in sin
;
1561 if ((s
= xsocket(PF_INET
, SOCK_DGRAM
| SOCK_CXNB
, IPPROTO_UDP
)) == -1)
1565 if (setsockopt(s
, SOL_SOCKET
, SO_REUSEADDR
, &n
, sizeof(n
)) == -1)
1568 if (setsockopt(s
, IPPROTO_IP
, IP_RECVIF
, &n
, sizeof(n
)) == -1)
1571 if (setsockopt(s
, IPPROTO_IP
, IP_RECVPKTINFO
, &n
, sizeof(n
)) == -1)
1575 if (setsockopt(s
, SOL_SOCKET
, SO_RERROR
, &n
, sizeof(n
)) == -1)
1579 memset(&sin
, 0, sizeof(sin
));
1580 sin
.sin_family
= AF_INET
;
1581 sin
.sin_port
= htons(BOOTPC
);
1584 if (bind(s
, (struct sockaddr
*)&sin
, sizeof(sin
)) == -1)
1595 in_cksum(const void *data
, size_t len
, uint32_t *isum
)
1597 const uint16_t *word
= data
;
1598 uint32_t sum
= isum
!= NULL
? *isum
: 0;
1600 for (; len
> 1; len
-= sizeof(*word
))
1604 sum
+= htons((uint16_t)(*(const uint8_t *)word
<< 8));
1609 sum
= (sum
>> 16) + (sum
& 0xffff);
1612 return (uint16_t)~sum
;
1615 static struct bootp_pkt
*
1616 dhcp_makeudppacket(size_t *sz
, const uint8_t *data
, size_t length
,
1617 struct in_addr source
, struct in_addr dest
)
1619 struct bootp_pkt
*udpp
;
1623 if ((udpp
= calloc(1, sizeof(*ip
) + sizeof(*udp
) + length
)) == NULL
)
1628 /* OK, this is important :)
1629 * We copy the data to our packet and then create a small part of the
1630 * ip structure and an invalid ip_len (basically udp length).
1631 * We then fill the udp structure and put the checksum
1632 * of the whole packet into the udp checksum.
1633 * Finally we complete the ip structure and ip checksum.
1634 * If we don't do the ordering like so then the udp checksum will be
1635 * broken, so find another way of doing it! */
1637 memcpy(&udpp
->bootp
, data
, length
);
1639 ip
->ip_p
= IPPROTO_UDP
;
1640 ip
->ip_src
.s_addr
= source
.s_addr
;
1641 if (dest
.s_addr
== 0)
1642 ip
->ip_dst
.s_addr
= INADDR_BROADCAST
;
1644 ip
->ip_dst
.s_addr
= dest
.s_addr
;
1646 udp
->uh_sport
= htons(BOOTPC
);
1647 udp
->uh_dport
= htons(BOOTPS
);
1648 udp
->uh_ulen
= htons((uint16_t)(sizeof(*udp
) + length
));
1649 ip
->ip_len
= udp
->uh_ulen
;
1650 udp
->uh_sum
= in_cksum(udpp
, sizeof(*ip
) + sizeof(*udp
) + length
, NULL
);
1652 ip
->ip_v
= IPVERSION
;
1653 ip
->ip_hl
= sizeof(*ip
) >> 2;
1654 ip
->ip_id
= (uint16_t)arc4random_uniform(UINT16_MAX
);
1655 ip
->ip_ttl
= IPDEFTTL
;
1656 ip
->ip_len
= htons((uint16_t)(sizeof(*ip
) + sizeof(*udp
) + length
));
1657 ip
->ip_sum
= in_cksum(ip
, sizeof(*ip
), NULL
);
1658 if (ip
->ip_sum
== 0)
1659 ip
->ip_sum
= 0xffff; /* RFC 768 */
1661 *sz
= sizeof(*ip
) + sizeof(*udp
) + length
;
1666 dhcp_sendudp(struct interface
*ifp
, struct in_addr
*to
, void *data
, size_t len
)
1668 struct sockaddr_in sin
= {
1669 .sin_family
= AF_INET
,
1671 .sin_port
= htons(BOOTPS
),
1673 .sin_len
= sizeof(sin
),
1676 struct udphdr udp
= {
1677 .uh_sport
= htons(BOOTPC
),
1678 .uh_dport
= htons(BOOTPS
),
1679 .uh_ulen
= htons((uint16_t)(sizeof(udp
) + len
)),
1681 struct iovec iov
[] = {
1682 { .iov_base
= &udp
, .iov_len
= sizeof(udp
), },
1683 { .iov_base
= data
, .iov_len
= len
, },
1685 struct msghdr msg
= {
1686 .msg_name
= (void *)&sin
,
1687 .msg_namelen
= sizeof(sin
),
1689 .msg_iovlen
= __arraycount(iov
),
1691 struct dhcpcd_ctx
*ctx
= ifp
->ctx
;
1694 if (ctx
->options
& DHCPCD_PRIVSEP
)
1695 return ps_inet_sendbootp(ifp
, &msg
);
1697 return sendmsg(ctx
->udp_wfd
, &msg
, 0);
1701 send_message(struct interface
*ifp
, uint8_t type
,
1702 void (*callback
)(void *))
1704 struct dhcp_state
*state
= D_STATE(ifp
);
1705 struct if_options
*ifo
= ifp
->options
;
1706 struct bootp
*bootp
;
1707 struct bootp_pkt
*udp
;
1710 struct in_addr from
, to
;
1713 if (callback
== NULL
) {
1714 /* No carrier? Don't bother sending the packet. */
1715 if (ifp
->carrier
<= LINK_DOWN
)
1717 logdebugx("%s: sending %s with xid 0x%x",
1719 ifo
->options
& DHCPCD_BOOTP
? "BOOTP" : get_dhcp_op(type
),
1721 RT
= 0; /* bogus gcc warning */
1723 if (state
->interval
== 0)
1724 state
->interval
= 4;
1726 state
->interval
*= 2;
1727 if (state
->interval
> 64)
1728 state
->interval
= 64;
1730 RT
= (state
->interval
* MSEC_PER_SEC
) +
1731 (arc4random_uniform(MSEC_PER_SEC
* 2) - MSEC_PER_SEC
);
1732 /* No carrier? Don't bother sending the packet.
1733 * However, we do need to advance the timeout. */
1734 if (ifp
->carrier
<= LINK_DOWN
)
1736 logdebugx("%s: sending %s (xid 0x%x), next in %0.1f seconds",
1738 ifo
->options
& DHCPCD_BOOTP
? "BOOTP" : get_dhcp_op(type
),
1740 (float)RT
/ MSEC_PER_SEC
);
1743 r
= make_message(&bootp
, ifp
, type
);
1748 if (!(state
->added
& (STATE_FAKE
| STATE_EXPIRED
)) &&
1749 state
->addr
!= NULL
&&
1750 ipv4_iffindaddr(ifp
, &state
->lease
.addr
, NULL
) != NULL
)
1751 from
.s_addr
= state
->lease
.addr
.s_addr
;
1753 from
.s_addr
= INADDR_ANY
;
1754 if (from
.s_addr
!= INADDR_ANY
&&
1755 state
->lease
.server
.s_addr
!= INADDR_ANY
)
1756 to
.s_addr
= state
->lease
.server
.s_addr
;
1758 to
.s_addr
= INADDR_BROADCAST
;
1761 * If not listening on the unspecified address we can
1762 * only receive broadcast messages via BPF.
1763 * Sockets bound to an address cannot receive broadcast messages
1764 * even if they are setup to send them.
1765 * Broadcasting from UDP is only an optimisation for rebinding
1766 * and on BSD, at least, is reliant on the subnet route being
1767 * correctly configured to receive the unicast reply.
1768 * As such, we always broadcast and receive the reply to it via BPF.
1769 * This also guarantees we have a DHCP server attached to the
1770 * interface we want to configure because we can't dictate the
1771 * interface via IP_PKTINFO unlike for IPv6.
1773 if (to
.s_addr
!= INADDR_BROADCAST
) {
1774 if (dhcp_sendudp(ifp
, &to
, bootp
, len
) != -1)
1776 logerr("%s: dhcp_sendudp", ifp
->name
);
1779 if (dhcp_openbpf(ifp
) == -1)
1782 udp
= dhcp_makeudppacket(&ulen
, (uint8_t *)bootp
, len
, from
, to
);
1784 logerr("%s: dhcp_makeudppacket", ifp
->name
);
1787 } else if (ifp
->ctx
->options
& DHCPCD_PRIVSEP
) {
1788 r
= ps_bpf_sendbootp(ifp
, udp
, ulen
);
1792 r
= bpf_send(state
->bpf
, ETHERTYPE_IP
, udp
, ulen
);
1795 /* If we failed to send a raw packet this normally means
1796 * we don't have the ability to work beneath the IP layer
1797 * for this interface.
1798 * As such we remove it from consideration without actually
1799 * stopping the interface. */
1801 logerr("%s: bpf_send", ifp
->name
);
1809 if (!(ifp
->ctx
->options
& DHCPCD_TEST
))
1810 dhcp_drop(ifp
, "FAIL");
1811 eloop_timeout_delete(ifp
->ctx
->eloop
,
1821 /* Even if we fail to send a packet we should continue as we are
1822 * as our failure timeouts will change out codepath when needed. */
1823 if (callback
!= NULL
)
1824 eloop_timeout_add_msec(ifp
->ctx
->eloop
, RT
, callback
, ifp
);
1828 send_inform(void *arg
)
1831 send_message((struct interface
*)arg
, DHCP_INFORM
, send_inform
);
1835 send_discover(void *arg
)
1838 send_message((struct interface
*)arg
, DHCP_DISCOVER
, send_discover
);
1842 send_request(void *arg
)
1845 send_message((struct interface
*)arg
, DHCP_REQUEST
, send_request
);
1849 send_renew(void *arg
)
1852 send_message((struct interface
*)arg
, DHCP_REQUEST
, send_renew
);
1856 send_rebind(void *arg
)
1859 send_message((struct interface
*)arg
, DHCP_REQUEST
, send_rebind
);
1863 dhcp_discover(void *arg
)
1865 struct interface
*ifp
= arg
;
1866 struct dhcp_state
*state
= D_STATE(ifp
);
1867 struct if_options
*ifo
= ifp
->options
;
1869 state
->state
= DHS_DISCOVER
;
1871 eloop_timeout_delete(ifp
->ctx
->eloop
, NULL
, ifp
);
1872 if (!(state
->added
& STATE_EXPIRED
)) {
1874 eloop_timeout_add_sec(ifp
->ctx
->eloop
,
1875 ifo
->reboot
, dhcp_fallback
, ifp
);
1877 else if (ifo
->options
& DHCPCD_IPV4LL
)
1878 eloop_timeout_add_sec(ifp
->ctx
->eloop
,
1879 ifo
->reboot
, ipv4ll_start
, ifp
);
1882 if (ifo
->options
& DHCPCD_REQUEST
)
1883 loginfox("%s: soliciting a DHCP lease (requesting %s)",
1884 ifp
->name
, inet_ntoa(ifo
->req_addr
));
1886 loginfox("%s: soliciting a %s lease",
1887 ifp
->name
, ifo
->options
& DHCPCD_BOOTP
? "BOOTP" : "DHCP");
1892 dhcp_request(void *arg
)
1894 struct interface
*ifp
= arg
;
1895 struct dhcp_state
*state
= D_STATE(ifp
);
1897 state
->state
= DHS_REQUEST
;
1902 dhcp_expire(void *arg
)
1904 struct interface
*ifp
= arg
;
1905 struct dhcp_state
*state
= D_STATE(ifp
);
1907 if (ifp
->options
->options
& DHCPCD_LASTLEASE_EXTEND
) {
1908 logwarnx("%s: DHCP lease expired, extending lease", ifp
->name
);
1909 state
->added
|= STATE_EXPIRED
;
1911 logerrx("%s: DHCP lease expired", ifp
->name
);
1912 dhcp_drop(ifp
, "EXPIRE");
1913 dhcp_unlink(ifp
->ctx
, state
->leasefile
);
1915 state
->interval
= 0;
1919 #if defined(ARP) || defined(IN_IFF_DUPLICATED)
1921 dhcp_decline(struct interface
*ifp
)
1924 send_message(ifp
, DHCP_DECLINE
, NULL
);
1929 dhcp_startrenew(void *arg
)
1931 struct interface
*ifp
= arg
;
1932 struct dhcp_state
*state
;
1933 struct dhcp_lease
*lease
;
1935 if ((state
= D_STATE(ifp
)) == NULL
)
1938 /* Only renew in the bound or renew states */
1939 if (state
->state
!= DHS_BOUND
&&
1940 state
->state
!= DHS_RENEW
)
1943 /* Remove the timeout as the renew may have been forced. */
1944 eloop_timeout_delete(ifp
->ctx
->eloop
, dhcp_startrenew
, ifp
);
1946 lease
= &state
->lease
;
1947 logdebugx("%s: renewing lease of %s", ifp
->name
,
1948 inet_ntoa(lease
->addr
));
1949 state
->state
= DHS_RENEW
;
1951 state
->interval
= 0;
1956 dhcp_renew(struct interface
*ifp
)
1959 dhcp_startrenew(ifp
);
1963 dhcp_rebind(void *arg
)
1965 struct interface
*ifp
= arg
;
1966 struct dhcp_state
*state
= D_STATE(ifp
);
1967 struct dhcp_lease
*lease
= &state
->lease
;
1969 logwarnx("%s: failed to renew DHCP, rebinding", ifp
->name
);
1970 logdebugx("%s: expire in %"PRIu32
" seconds",
1971 ifp
->name
, lease
->leasetime
- lease
->rebindtime
);
1972 state
->state
= DHS_REBIND
;
1973 eloop_timeout_delete(ifp
->ctx
->eloop
, send_renew
, ifp
);
1974 state
->lease
.server
.s_addr
= INADDR_ANY
;
1975 state
->interval
= 0;
1976 ifp
->options
->options
&= ~(DHCPCD_CSR_WARNED
|
1977 DHCPCD_ROUTER_HOST_ROUTE_WARNED
);
1981 #if defined(ARP) || defined(IN_IFF_DUPLICATED)
1983 dhcp_finish_dad(struct interface
*ifp
, struct in_addr
*ia
)
1985 struct dhcp_state
*state
= D_STATE(ifp
);
1987 if (state
->state
!= DHS_PROBE
)
1989 if (state
->offer
== NULL
|| state
->offer
->yiaddr
!= ia
->s_addr
)
1992 logdebugx("%s: DAD completed for %s", ifp
->name
, inet_ntoa(*ia
));
1993 if (!(ifp
->options
->options
& DHCPCD_INFORM
))
1995 #ifndef IN_IFF_DUPLICATED
1997 struct bootp
*bootp
;
2001 len
= state
->new_len
;
2002 state
->new = state
->offer
;
2003 state
->new_len
= state
->offer_len
;
2004 get_lease(ifp
, &state
->lease
, state
->new, state
->new_len
);
2005 ipv4_applyaddr(ifp
);
2007 state
->new_len
= len
;
2012 /* Stop IPv4LL now we have a working DHCP address */
2016 if (ifp
->options
->options
& DHCPCD_INFORM
)
2022 dhcp_addr_duplicated(struct interface
*ifp
, struct in_addr
*ia
)
2024 struct dhcp_state
*state
= D_STATE(ifp
);
2025 unsigned long long opts
= ifp
->options
->options
;
2026 struct dhcpcd_ctx
*ctx
= ifp
->ctx
;
2027 bool deleted
= false;
2028 #ifdef IN_IFF_DUPLICATED
2029 struct ipv4_addr
*iap
;
2032 if ((state
->offer
== NULL
|| state
->offer
->yiaddr
!= ia
->s_addr
) &&
2033 !IN_ARE_ADDR_EQUAL(ia
, &state
->lease
.addr
))
2036 /* RFC 2131 3.1.5, Client-server interaction */
2037 logerrx("%s: DAD detected %s", ifp
->name
, inet_ntoa(*ia
));
2038 dhcp_unlink(ifp
->ctx
, state
->leasefile
);
2039 if (!(opts
& DHCPCD_STATIC
) && !state
->lease
.frominfo
)
2041 #ifdef IN_IFF_DUPLICATED
2042 if ((iap
= ipv4_iffindaddr(ifp
, ia
, NULL
)) != NULL
) {
2043 ipv4_deladdr(iap
, 0);
2047 eloop_timeout_delete(ctx
->eloop
, NULL
, ifp
);
2048 if (opts
& (DHCPCD_STATIC
| DHCPCD_INFORM
)) {
2049 state
->reason
= "EXPIRE";
2050 script_runreason(ifp
, state
->reason
);
2051 #define NOT_ONLY_SELF (DHCPCD_MASTER | DHCPCD_IPV6RS | DHCPCD_DHCP6)
2052 if (!(ctx
->options
& NOT_ONLY_SELF
))
2053 eloop_exit(ifp
->ctx
->eloop
, EXIT_FAILURE
);
2056 eloop_timeout_add_sec(ifp
->ctx
->eloop
,
2057 DHCP_RAND_MAX
, dhcp_discover
, ifp
);
2063 #ifdef KERNEL_RFC5227
2065 dhcp_arp_announced(struct arp_state
*state
)
2072 dhcp_arp_defend_failed(struct arp_state
*astate
)
2074 struct interface
*ifp
= astate
->iface
;
2076 dhcp_drop(ifp
, "EXPIRED");
2081 #if !defined(KERNEL_RFC5227) || defined(ARPING)
2082 static void dhcp_arp_not_found(struct arp_state
*);
2084 static struct arp_state
*
2085 dhcp_arp_new(struct interface
*ifp
, struct in_addr
*addr
)
2087 struct arp_state
*astate
;
2089 astate
= arp_new(ifp
, addr
);
2093 astate
->found_cb
= dhcp_arp_found
;
2094 astate
->not_found_cb
= dhcp_arp_not_found
;
2095 #ifdef KERNEL_RFC5227
2096 astate
->announced_cb
= dhcp_arp_announced
;
2098 astate
->announced_cb
= NULL
;
2099 astate
->defend_failed_cb
= dhcp_arp_defend_failed
;
2107 dhcp_arping(struct interface
*ifp
)
2109 struct dhcp_state
*state
;
2110 struct if_options
*ifo
;
2111 struct arp_state
*astate
;
2112 struct in_addr addr
;
2114 state
= D_STATE(ifp
);
2117 if (ifo
->arping_len
== 0 || state
->arping_index
> ifo
->arping_len
)
2120 if (state
->arping_index
+ 1 == ifo
->arping_len
) {
2121 state
->arping_index
++;
2122 dhcpcd_startinterface(ifp
);
2126 addr
.s_addr
= ifo
->arping
[++state
->arping_index
];
2127 astate
= dhcp_arp_new(ifp
, &addr
);
2128 if (astate
== NULL
) {
2137 #if !defined(KERNEL_RFC5227) || defined(ARPING)
2139 dhcp_arp_not_found(struct arp_state
*astate
)
2141 struct interface
*ifp
;
2143 ifp
= astate
->iface
;
2145 if (dhcp_arping(ifp
) == 1) {
2151 dhcp_finish_dad(ifp
, &astate
->addr
);
2155 dhcp_arp_found(struct arp_state
*astate
, const struct arp_msg
*amsg
)
2157 struct in_addr addr
;
2158 struct interface
*ifp
= astate
->iface
;
2160 struct dhcp_state
*state
;
2161 struct if_options
*ifo
;
2163 state
= D_STATE(ifp
);
2166 if (state
->arping_index
!= -1 &&
2167 state
->arping_index
< ifo
->arping_len
&&
2169 amsg
->sip
.s_addr
== ifo
->arping
[state
->arping_index
])
2171 char buf
[HWADDR_LEN
* 3];
2173 hwaddr_ntoa(amsg
->sha
, ifp
->hwlen
, buf
, sizeof(buf
));
2174 if (dhcpcd_selectprofile(ifp
, buf
) == -1 &&
2175 dhcpcd_selectprofile(ifp
, inet_ntoa(amsg
->sip
)) == -1)
2177 /* We didn't find a profile for this
2178 * address or hwaddr, so move to the next
2180 dhcp_arp_not_found(astate
);
2184 eloop_timeout_delete(ifp
->ctx
->eloop
, NULL
, ifp
);
2185 dhcpcd_startinterface(ifp
);
2192 addr
= astate
->addr
;
2194 dhcp_addr_duplicated(ifp
, &addr
);
2201 dhcp_bind(struct interface
*ifp
)
2203 struct dhcpcd_ctx
*ctx
= ifp
->ctx
;
2204 struct dhcp_state
*state
= D_STATE(ifp
);
2205 struct if_options
*ifo
= ifp
->options
;
2206 struct dhcp_lease
*lease
= &state
->lease
;
2209 state
->reason
= NULL
;
2210 /* If we don't have an offer, we are re-binding a lease on preference,
2211 * normally when two interfaces have a lease matching IP addresses. */
2214 state
->old
= state
->new;
2215 state
->old_len
= state
->new_len
;
2216 state
->new = state
->offer
;
2217 state
->new_len
= state
->offer_len
;
2218 state
->offer
= NULL
;
2219 state
->offer_len
= 0;
2221 get_lease(ifp
, lease
, state
->new, state
->new_len
);
2222 if (ifo
->options
& DHCPCD_STATIC
) {
2223 loginfox("%s: using static address %s/%d",
2224 ifp
->name
, inet_ntoa(lease
->addr
),
2225 inet_ntocidr(lease
->mask
));
2226 lease
->leasetime
= DHCP_INFINITE_LIFETIME
;
2227 state
->reason
= "STATIC";
2228 } else if (ifo
->options
& DHCPCD_INFORM
) {
2229 loginfox("%s: received approval for %s",
2230 ifp
->name
, inet_ntoa(lease
->addr
));
2231 lease
->leasetime
= DHCP_INFINITE_LIFETIME
;
2232 state
->reason
= "INFORM";
2234 if (lease
->frominfo
)
2235 state
->reason
= "TIMEOUT";
2236 if (lease
->leasetime
== DHCP_INFINITE_LIFETIME
) {
2237 lease
->renewaltime
=
2240 loginfox("%s: leased %s for infinity",
2241 ifp
->name
, inet_ntoa(lease
->addr
));
2243 if (lease
->leasetime
< DHCP_MIN_LEASE
) {
2244 logwarnx("%s: minimum lease is %d seconds",
2245 ifp
->name
, DHCP_MIN_LEASE
);
2246 lease
->leasetime
= DHCP_MIN_LEASE
;
2248 if (lease
->rebindtime
== 0)
2250 (uint32_t)(lease
->leasetime
* T2
);
2251 else if (lease
->rebindtime
>= lease
->leasetime
) {
2253 (uint32_t)(lease
->leasetime
* T2
);
2254 logwarnx("%s: rebind time greater than lease "
2255 "time, forcing to %"PRIu32
" seconds",
2256 ifp
->name
, lease
->rebindtime
);
2258 if (lease
->renewaltime
== 0)
2259 lease
->renewaltime
=
2260 (uint32_t)(lease
->leasetime
* T1
);
2261 else if (lease
->renewaltime
> lease
->rebindtime
) {
2262 lease
->renewaltime
=
2263 (uint32_t)(lease
->leasetime
* T1
);
2264 logwarnx("%s: renewal time greater than "
2265 "rebind time, forcing to %"PRIu32
" seconds",
2266 ifp
->name
, lease
->renewaltime
);
2268 if (state
->state
== DHS_RENEW
&& state
->addr
&&
2269 lease
->addr
.s_addr
== state
->addr
->addr
.s_addr
&&
2270 !(state
->added
& STATE_FAKE
))
2271 logdebugx("%s: leased %s for %"PRIu32
" seconds",
2272 ifp
->name
, inet_ntoa(lease
->addr
),
2275 loginfox("%s: leased %s for %"PRIu32
" seconds",
2276 ifp
->name
, inet_ntoa(lease
->addr
),
2280 if (ctx
->options
& DHCPCD_TEST
) {
2281 state
->reason
= "TEST";
2282 script_runreason(ifp
, state
->reason
);
2283 eloop_exit(ctx
->eloop
, EXIT_SUCCESS
);
2286 if (state
->reason
== NULL
) {
2288 !(state
->added
& (STATE_FAKE
| STATE_EXPIRED
)))
2290 if (state
->old
->yiaddr
== state
->new->yiaddr
&&
2291 lease
->server
.s_addr
&&
2292 state
->state
!= DHS_REBIND
)
2293 state
->reason
= "RENEW";
2295 state
->reason
= "REBIND";
2296 } else if (state
->state
== DHS_REBOOT
)
2297 state
->reason
= "REBOOT";
2299 state
->reason
= "BOUND";
2301 if (lease
->leasetime
== DHCP_INFINITE_LIFETIME
)
2302 lease
->renewaltime
= lease
->rebindtime
= lease
->leasetime
;
2304 eloop_timeout_add_sec(ctx
->eloop
,
2305 lease
->renewaltime
, dhcp_startrenew
, ifp
);
2306 eloop_timeout_add_sec(ctx
->eloop
,
2307 lease
->rebindtime
, dhcp_rebind
, ifp
);
2308 eloop_timeout_add_sec(ctx
->eloop
,
2309 lease
->leasetime
, dhcp_expire
, ifp
);
2310 logdebugx("%s: renew in %"PRIu32
" seconds, rebind in %"PRIu32
2312 ifp
->name
, lease
->renewaltime
, lease
->rebindtime
);
2314 state
->state
= DHS_BOUND
;
2315 if (!state
->lease
.frominfo
&&
2316 !(ifo
->options
& (DHCPCD_INFORM
| DHCPCD_STATIC
))) {
2317 logdebugx("%s: writing lease `%s'",
2318 ifp
->name
, state
->leasefile
);
2319 if (dhcp_writefile(ifp
->ctx
, state
->leasefile
, 0640,
2320 state
->new, state
->new_len
) == -1)
2321 logerr("dhcp_writefile: %s", state
->leasefile
);
2324 /* Close the BPF filter as we can now receive DHCP messages
2325 * on a UDP socket. */
2326 old_state
= state
->added
;
2327 if (ctx
->options
& DHCPCD_MASTER
||
2328 state
->old
== NULL
||
2329 state
->old
->yiaddr
!= state
->new->yiaddr
|| old_state
& STATE_FAKE
)
2332 ipv4_applyaddr(ifp
);
2334 /* If not in master mode, open an address specific socket. */
2335 if (ctx
->options
& DHCPCD_MASTER
||
2336 (state
->old
!= NULL
&&
2337 state
->old
->yiaddr
== state
->new->yiaddr
&&
2338 old_state
& STATE_ADDED
&& !(old_state
& STATE_FAKE
)))
2342 if (IN_PRIVSEP_SE(ctx
)) {
2343 if (ps_inet_openbootp(state
->addr
) == -1)
2349 state
->udp_rfd
= dhcp_openudp(&state
->addr
->addr
);
2350 if (state
->udp_rfd
== -1) {
2352 /* Address sharing without master mode is not supported.
2353 * It's also possible another DHCP client could be running,
2354 * which is even worse.
2355 * We still need to work, so re-open BPF. */
2359 eloop_event_add(ctx
->eloop
, state
->udp_rfd
, dhcp_handleifudp
, ifp
);
2363 dhcp_message_new(struct bootp
**bootp
,
2364 const struct in_addr
*addr
, const struct in_addr
*mask
)
2369 if ((*bootp
= calloc(1, sizeof(**bootp
))) == NULL
)
2372 (*bootp
)->yiaddr
= addr
->s_addr
;
2375 cookie
= htonl(MAGIC_COOKIE
);
2376 memcpy(p
, &cookie
, sizeof(cookie
));
2377 p
+= sizeof(cookie
);
2379 if (mask
->s_addr
!= INADDR_ANY
) {
2380 *p
++ = DHO_SUBNETMASK
;
2381 *p
++ = sizeof(mask
->s_addr
);
2382 memcpy(p
, &mask
->s_addr
, sizeof(mask
->s_addr
));
2383 p
+= sizeof(mask
->s_addr
);
2387 return sizeof(**bootp
);
2390 #if defined(ARP) || defined(KERNEL_RFC5227)
2392 dhcp_arp_address(struct interface
*ifp
)
2394 struct dhcp_state
*state
;
2395 struct in_addr addr
;
2396 struct ipv4_addr
*ia
;
2398 eloop_timeout_delete(ifp
->ctx
->eloop
, NULL
, ifp
);
2400 state
= D_STATE(ifp
);
2401 addr
.s_addr
= state
->offer
->yiaddr
== INADDR_ANY
?
2402 state
->offer
->ciaddr
: state
->offer
->yiaddr
;
2403 /* If the interface already has the address configured
2404 * then we can't ARP for duplicate detection. */
2405 ia
= ipv4_iffindaddr(ifp
, &addr
, NULL
);
2406 #ifdef IN_IFF_NOTUSEABLE
2407 if (ia
== NULL
|| ia
->addr_flags
& IN_IFF_NOTUSEABLE
) {
2408 state
->state
= DHS_PROBE
;
2410 struct dhcp_lease l
;
2412 get_lease(ifp
, &l
, state
->offer
, state
->offer_len
);
2413 /* Add the address now, let the kernel handle DAD. */
2414 ipv4_addaddr(ifp
, &l
.addr
, &l
.mask
, &l
.brd
,
2415 l
.leasetime
, l
.rebindtime
);
2416 } else if (ia
->addr_flags
& IN_IFF_DUPLICATED
)
2417 dhcp_addr_duplicated(ifp
, &ia
->addr
);
2419 loginfox("%s: waiting for DAD on %s",
2420 ifp
->name
, inet_ntoa(addr
));
2424 if (!(ifp
->flags
& IFF_NOARP
) &&
2425 ifp
->options
->options
& DHCPCD_ARP
)
2427 struct arp_state
*astate
;
2428 struct dhcp_lease l
;
2430 /* Even if the address exists, we need to defend it. */
2431 astate
= dhcp_arp_new(ifp
, &addr
);
2436 state
->state
= DHS_PROBE
;
2437 get_lease(ifp
, &l
, state
->offer
, state
->offer_len
);
2438 loginfox("%s: probing address %s/%d",
2439 ifp
->name
, inet_ntoa(l
.addr
), inet_ntocidr(l
.mask
));
2440 /* We need to handle DAD. */
2451 dhcp_arp_bind(struct interface
*ifp
)
2454 if (ifp
->ctx
->options
& DHCPCD_TEST
||
2455 dhcp_arp_address(ifp
) == 1)
2461 dhcp_lastlease(void *arg
)
2463 struct interface
*ifp
= arg
;
2464 struct dhcp_state
*state
= D_STATE(ifp
);
2466 loginfox("%s: timed out contacting a DHCP server, using last lease",
2468 #if defined(ARP) || defined(KERNEL_RFC5227)
2473 /* Set expired here because dhcp_bind() -> ipv4_addaddr() will reset
2475 state
->added
|= STATE_EXPIRED
;
2476 state
->interval
= 0;
2481 dhcp_static(struct interface
*ifp
)
2483 struct if_options
*ifo
;
2484 struct dhcp_state
*state
;
2485 struct ipv4_addr
*ia
;
2487 state
= D_STATE(ifp
);
2491 if (ifo
->req_addr
.s_addr
== INADDR_ANY
&&
2492 (ia
= ipv4_iffindaddr(ifp
, NULL
, NULL
)) == NULL
)
2494 loginfox("%s: waiting for 3rd party to "
2495 "configure IP address", ifp
->name
);
2496 state
->reason
= "3RDPARTY";
2497 script_runreason(ifp
, state
->reason
);
2501 state
->offer_len
= dhcp_message_new(&state
->offer
,
2502 ia
? &ia
->addr
: &ifo
->req_addr
,
2503 ia
? &ia
->mask
: &ifo
->req_mask
);
2504 if (state
->offer_len
)
2505 #if defined(ARP) || defined(KERNEL_RFC5227)
2513 dhcp_inform(struct interface
*ifp
)
2515 struct dhcp_state
*state
;
2516 struct if_options
*ifo
;
2517 struct ipv4_addr
*ia
;
2519 state
= D_STATE(ifp
);
2522 state
->state
= DHS_INFORM
;
2524 state
->offer
= NULL
;
2525 state
->offer_len
= 0;
2527 if (ifo
->req_addr
.s_addr
== INADDR_ANY
) {
2528 ia
= ipv4_iffindaddr(ifp
, NULL
, NULL
);
2530 loginfox("%s: waiting for 3rd party to "
2531 "configure IP address",
2533 if (!(ifp
->ctx
->options
& DHCPCD_TEST
)) {
2534 state
->reason
= "3RDPARTY";
2535 script_runreason(ifp
, state
->reason
);
2540 ia
= ipv4_iffindaddr(ifp
, &ifo
->req_addr
, &ifo
->req_mask
);
2542 if (ifp
->ctx
->options
& DHCPCD_TEST
) {
2543 logerrx("%s: cannot add IP address in test mode",
2547 ia
= ipv4_iffindaddr(ifp
, &ifo
->req_addr
, NULL
);
2549 /* Netmask must be different, delete it. */
2550 ipv4_deladdr(ia
, 1);
2551 state
->offer_len
= dhcp_message_new(&state
->offer
,
2552 &ifo
->req_addr
, &ifo
->req_mask
);
2554 if (dhcp_arp_address(ifp
) != 1)
2557 ia
= ipv4_iffindaddr(ifp
,
2558 &ifo
->req_addr
, &ifo
->req_mask
);
2564 state
->offer_len
= dhcp_message_new(&state
->offer
,
2565 &ia
->addr
, &ia
->mask
);
2566 if (state
->offer_len
) {
2568 get_lease(ifp
, &state
->lease
, state
->offer
, state
->offer_len
);
2574 dhcp_reboot_newopts(struct interface
*ifp
, unsigned long long oldopts
)
2576 struct if_options
*ifo
;
2577 struct dhcp_state
*state
= D_STATE(ifp
);
2579 if (state
== NULL
|| state
->state
== DHS_NONE
)
2582 if ((ifo
->options
& (DHCPCD_INFORM
| DHCPCD_STATIC
) &&
2583 (state
->addr
== NULL
||
2584 state
->addr
->addr
.s_addr
!= ifo
->req_addr
.s_addr
)) ||
2585 (oldopts
& (DHCPCD_INFORM
| DHCPCD_STATIC
) &&
2586 !(ifo
->options
& (DHCPCD_INFORM
| DHCPCD_STATIC
))))
2588 dhcp_drop(ifp
, "EXPIRE");
2594 dhcp_activeaddr(const struct interface
*ifp
, const struct in_addr
*addr
)
2596 const struct interface
*ifp1
;
2597 const struct dhcp_state
*state
;
2599 TAILQ_FOREACH(ifp1
, ifp
->ctx
->ifaces
, next
) {
2602 if ((state
= D_CSTATE(ifp1
)) == NULL
)
2604 switch(state
->state
) {
2614 if (state
->lease
.addr
.s_addr
== addr
->s_addr
)
2622 dhcp_reboot(struct interface
*ifp
)
2624 struct if_options
*ifo
;
2625 struct dhcp_state
*state
= D_STATE(ifp
);
2627 struct ipv4_addr
*ia
;
2630 if (state
== NULL
|| state
->state
== DHS_NONE
)
2633 state
->state
= DHS_REBOOT
;
2634 state
->interval
= 0;
2636 if (ifo
->options
& DHCPCD_LINK
&& ifp
->carrier
<= LINK_DOWN
) {
2637 loginfox("%s: waiting for carrier", ifp
->name
);
2640 if (ifo
->options
& DHCPCD_STATIC
) {
2644 if (ifo
->options
& DHCPCD_INFORM
) {
2645 loginfox("%s: informing address of %s",
2646 ifp
->name
, inet_ntoa(state
->lease
.addr
));
2650 if (ifo
->reboot
== 0 || state
->offer
== NULL
) {
2654 if (!IS_DHCP(state
->offer
))
2657 loginfox("%s: rebinding lease of %s",
2658 ifp
->name
, inet_ntoa(state
->lease
.addr
));
2661 #ifndef KERNEL_RFC5227
2662 /* Create the DHCP ARP state so we can defend it. */
2663 (void)dhcp_arp_new(ifp
, &state
->lease
.addr
);
2666 /* If the address exists on the interface and no other interface
2667 * is currently using it then announce it to ensure this
2668 * interface gets the reply. */
2669 ia
= ipv4_iffindaddr(ifp
, &state
->lease
.addr
, NULL
);
2671 !(ifp
->ctx
->options
& DHCPCD_TEST
) &&
2672 #ifdef IN_IFF_NOTUSEABLE
2673 !(ia
->addr_flags
& IN_IFF_NOTUSEABLE
) &&
2675 dhcp_activeaddr(ifp
, &state
->lease
.addr
) == 0)
2676 arp_ifannounceaddr(ifp
, &state
->lease
.addr
);
2680 state
->lease
.server
.s_addr
= INADDR_ANY
;
2681 eloop_timeout_delete(ifp
->ctx
->eloop
, NULL
, ifp
);
2684 /* Need to add this before dhcp_expire and friends. */
2685 if (!ifo
->fallback
&& ifo
->options
& DHCPCD_IPV4LL
)
2686 eloop_timeout_add_sec(ifp
->ctx
->eloop
,
2687 ifo
->reboot
, ipv4ll_start
, ifp
);
2690 if (ifo
->options
& DHCPCD_LASTLEASE
&& state
->lease
.frominfo
)
2691 eloop_timeout_add_sec(ifp
->ctx
->eloop
,
2692 ifo
->reboot
, dhcp_lastlease
, ifp
);
2693 else if (!(ifo
->options
& DHCPCD_INFORM
))
2694 eloop_timeout_add_sec(ifp
->ctx
->eloop
,
2695 ifo
->reboot
, dhcp_expire
, ifp
);
2697 /* Don't bother ARP checking as the server could NAK us first.
2698 * Don't call dhcp_request as that would change the state */
2703 dhcp_drop(struct interface
*ifp
, const char *reason
)
2705 struct dhcp_state
*state
;
2710 state
= D_STATE(ifp
);
2711 /* dhcp_start may just have been called and we don't yet have a state
2712 * but we do have a timeout, so punt it. */
2713 if (state
== NULL
|| state
->state
== DHS_NONE
) {
2714 eloop_timeout_delete(ifp
->ctx
->eloop
, NULL
, ifp
);
2719 if (state
->addr
!= NULL
)
2720 arp_freeaddr(ifp
, &state
->addr
->addr
);
2723 state
->arping_index
= -1;
2726 if (ifp
->options
->options
& DHCPCD_RELEASE
&&
2727 !(ifp
->options
->options
& DHCPCD_INFORM
))
2729 /* Failure to send the release may cause this function to
2730 * re-enter so guard by setting the state. */
2731 if (state
->state
== DHS_RELEASE
)
2733 state
->state
= DHS_RELEASE
;
2735 dhcp_unlink(ifp
->ctx
, state
->leasefile
);
2736 if (ifp
->carrier
> LINK_DOWN
&&
2737 state
->new != NULL
&&
2738 state
->lease
.server
.s_addr
!= INADDR_ANY
)
2740 loginfox("%s: releasing lease of %s",
2741 ifp
->name
, inet_ntoa(state
->lease
.addr
));
2743 send_message(ifp
, DHCP_RELEASE
, NULL
);
2745 /* Give the packet a chance to go */
2746 ts
.tv_sec
= RELEASE_DELAY_S
;
2747 ts
.tv_nsec
= RELEASE_DELAY_NS
;
2748 nanosleep(&ts
, NULL
);
2753 else if (state
->auth
.reconf
!= NULL
) {
2755 * Drop the lease as the token may only be present
2756 * in the initial reply message and not subsequent
2758 * If dhcpcd is restarted, the token is lost.
2759 * XXX persist this in another file?
2761 dhcp_unlink(ifp
->ctx
, state
->leasefile
);
2765 eloop_timeout_delete(ifp
->ctx
->eloop
, NULL
, ifp
);
2767 dhcp_auth_reset(&state
->auth
);
2770 /* Close DHCP ports so a changed interface family is picked
2771 * up by a new BPF state. */
2774 state
->state
= DHS_NONE
;
2776 state
->offer
= NULL
;
2777 state
->offer_len
= 0;
2779 state
->old
= state
->new;
2780 state
->old_len
= state
->new_len
;
2783 state
->reason
= reason
;
2784 ipv4_applyaddr(ifp
);
2788 state
->lease
.addr
.s_addr
= 0;
2789 ifp
->options
->options
&= ~(DHCPCD_CSR_WARNED
|
2790 DHCPCD_ROUTER_HOST_ROUTE_WARNED
);
2794 blacklisted_ip(const struct if_options
*ifo
, in_addr_t addr
)
2798 for (i
= 0; i
< ifo
->blacklist_len
; i
+= 2)
2799 if (ifo
->blacklist
[i
] == (addr
& ifo
->blacklist
[i
+ 1]))
2804 #define WHTLST_NONE 0
2805 #define WHTLST_MATCH 1
2806 #define WHTLST_NOMATCH 2
2808 whitelisted_ip(const struct if_options
*ifo
, in_addr_t addr
)
2812 if (ifo
->whitelist_len
== 0)
2814 for (i
= 0; i
< ifo
->whitelist_len
; i
+= 2)
2815 if (ifo
->whitelist
[i
] == (addr
& ifo
->whitelist
[i
+ 1]))
2816 return WHTLST_MATCH
;
2817 return WHTLST_NOMATCH
;
2821 log_dhcp(int loglevel
, const char *msg
,
2822 const struct interface
*ifp
, const struct bootp
*bootp
, size_t bootp_len
,
2823 const struct in_addr
*from
, int ad
)
2826 char *a
, sname
[sizeof(bootp
->sname
) * 4];
2827 struct in_addr addr
;
2831 if (strcmp(msg
, "NAK:") == 0) {
2832 a
= get_option_string(ifp
->ctx
, bootp
, bootp_len
, DHO_MESSAGE
);
2838 tmpl
= (al
* 4) + 1;
2845 print_string(tmp
, tmpl
, OT_STRING
, (uint8_t *)a
, al
);
2849 } else if (ad
&& bootp
->yiaddr
!= 0) {
2850 addr
.s_addr
= bootp
->yiaddr
;
2851 a
= strdup(inet_ntoa(addr
));
2860 r
= get_option_addr(ifp
->ctx
, &addr
, bootp
, bootp_len
, DHO_SERVERID
);
2861 if (get_option_uint8(ifp
->ctx
, &overl
, bootp
, bootp_len
,
2862 DHO_OPTSOVERLOADED
) == -1)
2864 if (bootp
->sname
[0] && r
== 0 && !(overl
& 2)) {
2865 print_string(sname
, sizeof(sname
), OT_STRING
| OT_DOMAIN
,
2866 bootp
->sname
, sizeof(bootp
->sname
));
2868 logmessage(loglevel
, "%s: %s %s %s `%s'",
2869 ifp
->name
, msg
, tfrom
, inet_ntoa(addr
), sname
);
2871 logmessage(loglevel
, "%s: %s %s %s %s `%s'",
2872 ifp
->name
, msg
, a
, tfrom
, inet_ntoa(addr
), sname
);
2879 logmessage(loglevel
, "%s: %s %s %s",
2880 ifp
->name
, msg
, tfrom
, inet_ntoa(addr
));
2882 logmessage(loglevel
, "%s: %s %s %s %s",
2883 ifp
->name
, msg
, a
, tfrom
, inet_ntoa(addr
));
2888 /* If we're sharing the same IP address with another interface on the
2889 * same network, we may receive the DHCP reply on the wrong interface.
2890 * Try and re-direct it here. */
2892 dhcp_redirect_dhcp(struct interface
*ifp
, struct bootp
*bootp
, size_t bootp_len
,
2893 const struct in_addr
*from
)
2895 struct interface
*ifn
;
2896 const struct dhcp_state
*state
;
2899 xid
= ntohl(bootp
->xid
);
2900 TAILQ_FOREACH(ifn
, ifp
->ctx
->ifaces
, next
) {
2903 state
= D_CSTATE(ifn
);
2904 if (state
== NULL
|| state
->state
== DHS_NONE
)
2906 if (state
->xid
!= xid
)
2908 if (ifn
->hwlen
<= sizeof(bootp
->chaddr
) &&
2909 memcmp(bootp
->chaddr
, ifn
->hwaddr
, ifn
->hwlen
))
2911 logdebugx("%s: redirecting DHCP message to %s",
2912 ifp
->name
, ifn
->name
);
2913 dhcp_handledhcp(ifn
, bootp
, bootp_len
, from
);
2918 dhcp_handledhcp(struct interface
*ifp
, struct bootp
*bootp
, size_t bootp_len
,
2919 const struct in_addr
*from
)
2921 struct dhcp_state
*state
= D_STATE(ifp
);
2922 struct if_options
*ifo
= ifp
->options
;
2923 struct dhcp_lease
*lease
= &state
->lease
;
2925 struct in_addr addr
;
2930 const uint8_t *auth
;
2933 #ifdef IN_IFF_DUPLICATED
2934 struct ipv4_addr
*ia
;
2937 #define LOGDHCP0(l, m) \
2938 log_dhcp((l), (m), ifp, bootp, bootp_len, from, 0)
2939 #define LOGDHCP(l, m) \
2940 log_dhcp((l), (m), ifp, bootp, bootp_len, from, 1)
2942 #define IS_STATE_ACTIVE(s) ((s)-state != DHS_NONE && \
2943 (s)->state != DHS_INIT && (s)->state != DHS_BOUND)
2945 if (bootp
->op
!= BOOTREPLY
) {
2946 if (IS_STATE_ACTIVE(state
))
2947 logdebugx("%s: op (%d) is not BOOTREPLY",
2948 ifp
->name
, bootp
->op
);
2952 if (state
->xid
!= ntohl(bootp
->xid
)) {
2953 if (IS_STATE_ACTIVE(state
))
2954 logdebugx("%s: wrong xid 0x%x (expecting 0x%x) from %s",
2955 ifp
->name
, ntohl(bootp
->xid
), state
->xid
,
2957 dhcp_redirect_dhcp(ifp
, bootp
, bootp_len
, from
);
2961 if (ifp
->hwlen
<= sizeof(bootp
->chaddr
) &&
2962 memcmp(bootp
->chaddr
, ifp
->hwaddr
, ifp
->hwlen
))
2964 if (IS_STATE_ACTIVE(state
)) {
2965 char buf
[sizeof(bootp
->chaddr
) * 3];
2967 logdebugx("%s: xid 0x%x is for hwaddr %s",
2968 ifp
->name
, ntohl(bootp
->xid
),
2969 hwaddr_ntoa(bootp
->chaddr
, sizeof(bootp
->chaddr
),
2972 dhcp_redirect_dhcp(ifp
, bootp
, bootp_len
, from
);
2979 i
= whitelisted_ip(ifp
->options
, from
->s_addr
);
2981 case WHTLST_NOMATCH
:
2982 logwarnx("%s: non whitelisted DHCP packet from %s",
2983 ifp
->name
, inet_ntoa(*from
));
2988 if (blacklisted_ip(ifp
->options
, from
->s_addr
) == 1) {
2989 logwarnx("%s: blacklisted DHCP packet from %s",
2990 ifp
->name
, inet_ntoa(*from
));
2995 /* We may have found a BOOTP server */
2996 if (get_option_uint8(ifp
->ctx
, &type
,
2997 bootp
, bootp_len
, DHO_MESSAGETYPE
) == -1)
2999 else if (ifo
->options
& DHCPCD_BOOTP
) {
3000 logdebugx("%s: ignoring DHCP reply (expecting BOOTP)",
3006 /* Authenticate the message */
3007 auth
= get_option(ifp
->ctx
, bootp
, bootp_len
,
3008 DHO_AUTHENTICATION
, &auth_len
);
3010 if (dhcp_auth_validate(&state
->auth
, &ifo
->auth
,
3011 (uint8_t *)bootp
, bootp_len
, 4, type
,
3012 auth
, auth_len
) == NULL
)
3014 LOGDHCP0(LOG_ERR
, "authentication failed");
3017 if (state
->auth
.token
)
3018 logdebugx("%s: validated using 0x%08" PRIu32
,
3019 ifp
->name
, state
->auth
.token
->secretid
);
3021 loginfox("%s: accepted reconfigure key", ifp
->name
);
3022 } else if (ifo
->auth
.options
& DHCPCD_AUTH_SEND
) {
3023 if (ifo
->auth
.options
& DHCPCD_AUTH_REQUIRE
) {
3024 LOGDHCP0(LOG_ERR
, "no authentication");
3027 LOGDHCP0(LOG_WARNING
, "no authentication");
3032 if (type
== DHCP_FORCERENEW
) {
3033 if (from
->s_addr
== INADDR_ANY
||
3034 from
->s_addr
== INADDR_BROADCAST
)
3036 LOGDHCP(LOG_ERR
, "discarding Force Renew");
3041 LOGDHCP(LOG_ERR
, "unauthenticated Force Renew");
3042 if (ifo
->auth
.options
& DHCPCD_AUTH_REQUIRE
)
3045 if (state
->state
!= DHS_BOUND
&& state
->state
!= DHS_INFORM
) {
3046 LOGDHCP(LOG_DEBUG
, "not bound, ignoring Force Renew");
3049 LOGDHCP(LOG_INFO
, "Force Renew from");
3050 /* The rebind and expire timings are still the same, we just
3051 * enter the renew state early */
3052 if (state
->state
== DHS_BOUND
)
3055 eloop_timeout_delete(ifp
->ctx
->eloop
,
3060 LOGDHCP(LOG_ERR
, "unauthenticated Force Renew");
3065 if (state
->state
== DHS_BOUND
) {
3066 LOGDHCP(LOG_DEBUG
, "bound, ignoring");
3070 if (state
->state
== DHS_PROBE
) {
3071 /* Ignore any DHCP messages whilst probing a lease to bind. */
3072 LOGDHCP(LOG_DEBUG
, "probing, ignoring");
3076 /* reset the message counter */
3077 state
->interval
= 0;
3079 /* Ensure that no reject options are present */
3080 for (i
= 1; i
< 255; i
++) {
3081 if (has_option_mask(ifo
->rejectmask
, i
) &&
3082 get_option_uint8(ifp
->ctx
, &tmp
,
3083 bootp
, bootp_len
, (uint8_t)i
) == 0)
3085 LOGDHCP(LOG_WARNING
, "reject DHCP");
3090 if (type
== DHCP_NAK
) {
3091 /* For NAK, only check if we require the ServerID */
3092 if (has_option_mask(ifo
->requiremask
, DHO_SERVERID
) &&
3093 get_option_addr(ifp
->ctx
, &addr
,
3094 bootp
, bootp_len
, DHO_SERVERID
) == -1)
3096 LOGDHCP(LOG_WARNING
, "reject NAK");
3100 /* We should restart on a NAK */
3101 LOGDHCP(LOG_WARNING
, "NAK:");
3102 if ((msg
= get_option_string(ifp
->ctx
,
3103 bootp
, bootp_len
, DHO_MESSAGE
)))
3105 logwarnx("%s: message: %s", ifp
->name
, msg
);
3108 if (state
->state
== DHS_INFORM
) /* INFORM should not be NAKed */
3110 if (!(ifp
->ctx
->options
& DHCPCD_TEST
)) {
3111 dhcp_drop(ifp
, "NAK");
3112 dhcp_unlink(ifp
->ctx
, state
->leasefile
);
3115 /* If we constantly get NAKS then we should slowly back off */
3116 eloop_timeout_add_sec(ifp
->ctx
->eloop
,
3117 state
->nakoff
, dhcp_discover
, ifp
);
3118 if (state
->nakoff
== 0)
3122 if (state
->nakoff
> NAKOFF_MAX
)
3123 state
->nakoff
= NAKOFF_MAX
;
3128 /* Ensure that all required options are present */
3129 for (i
= 1; i
< 255; i
++) {
3130 if (has_option_mask(ifo
->requiremask
, i
) &&
3131 get_option_uint8(ifp
->ctx
, &tmp
,
3132 bootp
, bootp_len
, (uint8_t)i
) != 0)
3134 /* If we are BOOTP, then ignore the need for serverid.
3135 * To ignore BOOTP, require dhcp_message_type.
3136 * However, nothing really stops BOOTP from providing
3137 * DHCP style options as well so the above isn't
3139 if (type
== 0 && i
== DHO_SERVERID
)
3141 LOGDHCP(LOG_WARNING
, "reject DHCP");
3146 /* DHCP Auto-Configure, RFC 2563 */
3147 if (type
== DHCP_OFFER
&& bootp
->yiaddr
== 0) {
3148 LOGDHCP(LOG_WARNING
, "no address given");
3149 if ((msg
= get_option_string(ifp
->ctx
,
3150 bootp
, bootp_len
, DHO_MESSAGE
)))
3152 logwarnx("%s: message: %s", ifp
->name
, msg
);
3156 if (state
->state
== DHS_DISCOVER
&&
3157 get_option_uint8(ifp
->ctx
, &tmp
, bootp
, bootp_len
,
3158 DHO_AUTOCONFIGURE
) == 0)
3162 LOGDHCP(LOG_WARNING
, "IPv4LL disabled from");
3169 LOGDHCP(LOG_WARNING
, "IPv4LL enabled from");
3173 logerrx("%s: unknown auto configuration "
3178 eloop_timeout_delete(ifp
->ctx
->eloop
, NULL
, ifp
);
3179 eloop_timeout_add_sec(ifp
->ctx
->eloop
,
3180 DHCP_MAX
, dhcp_discover
, ifp
);
3186 /* Ensure that the address offered is valid */
3187 if ((type
== 0 || type
== DHCP_OFFER
|| type
== DHCP_ACK
) &&
3188 (bootp
->ciaddr
== INADDR_ANY
|| bootp
->ciaddr
== INADDR_BROADCAST
)
3190 (bootp
->yiaddr
== INADDR_ANY
|| bootp
->yiaddr
== INADDR_BROADCAST
))
3192 LOGDHCP(LOG_WARNING
, "reject invalid address");
3196 #ifdef IN_IFF_DUPLICATED
3197 ia
= ipv4_iffindaddr(ifp
, &lease
->addr
, NULL
);
3198 if (ia
&& ia
->addr_flags
& IN_IFF_DUPLICATED
) {
3199 LOGDHCP(LOG_WARNING
, "declined duplicate address");
3202 ipv4_deladdr(ia
, 0);
3203 eloop_timeout_delete(ifp
->ctx
->eloop
, NULL
, ifp
);
3204 eloop_timeout_add_sec(ifp
->ctx
->eloop
,
3205 DHCP_RAND_MAX
, dhcp_discover
, ifp
);
3210 bootp_copied
= false;
3211 if ((type
== 0 || type
== DHCP_OFFER
) && state
->state
== DHS_DISCOVER
) {
3212 lease
->frominfo
= 0;
3213 lease
->addr
.s_addr
= bootp
->yiaddr
;
3214 memcpy(&lease
->cookie
, bootp
->vend
, sizeof(lease
->cookie
));
3216 get_option_addr(ifp
->ctx
,
3217 &lease
->server
, bootp
, bootp_len
, DHO_SERVERID
) != 0)
3218 lease
->server
.s_addr
= INADDR_ANY
;
3220 /* Test for rapid commit in the OFFER */
3221 if (!(ifp
->ctx
->options
& DHCPCD_TEST
) &&
3222 has_option_mask(ifo
->requestmask
, DHO_RAPIDCOMMIT
) &&
3223 get_option(ifp
->ctx
, bootp
, bootp_len
,
3224 DHO_RAPIDCOMMIT
, NULL
))
3226 state
->state
= DHS_REQUEST
;
3230 LOGDHCP(LOG_INFO
, "offered");
3231 if (state
->offer_len
< bootp_len
) {
3233 if ((state
->offer
= malloc(bootp_len
)) == NULL
) {
3235 state
->offer_len
= 0;
3239 state
->offer_len
= bootp_len
;
3240 memcpy(state
->offer
, bootp
, bootp_len
);
3241 bootp_copied
= true;
3242 if (ifp
->ctx
->options
& DHCPCD_TEST
) {
3244 state
->old
= state
->new;
3245 state
->old_len
= state
->new_len
;
3246 state
->new = state
->offer
;
3247 state
->new_len
= state
->offer_len
;
3248 state
->offer
= NULL
;
3249 state
->offer_len
= 0;
3250 state
->reason
= "TEST";
3251 script_runreason(ifp
, state
->reason
);
3252 eloop_exit(ifp
->ctx
->eloop
, EXIT_SUCCESS
);
3253 state
->bpf
->bpf_flags
|= BPF_EOF
;
3256 eloop_timeout_delete(ifp
->ctx
->eloop
, send_discover
, ifp
);
3257 /* We don't request BOOTP addresses */
3259 /* We used to ARP check here, but that seems to be in
3260 * violation of RFC2131 where it only describes
3261 * DECLINE after REQUEST.
3262 * It also seems that some MS DHCP servers actually
3263 * ignore DECLINE if no REQUEST, ie we decline a
3271 if (type
== DHCP_OFFER
) {
3272 LOGDHCP(LOG_WARNING
, "ignoring offer of");
3276 /* We should only be dealing with acks */
3277 if (type
!= DHCP_ACK
) {
3278 LOGDHCP(LOG_ERR
, "not ACK or OFFER");
3282 if (state
->state
== DHS_DISCOVER
) {
3283 /* We only allow ACK of rapid commit DISCOVER. */
3284 if (has_option_mask(ifo
->requestmask
,
3286 get_option(ifp
->ctx
, bootp
, bootp_len
,
3287 DHO_RAPIDCOMMIT
, NULL
))
3288 state
->state
= DHS_REQUEST
;
3290 LOGDHCP(LOG_DEBUG
, "ignoring ack of");
3296 if (!(ifo
->options
& DHCPCD_INFORM
))
3297 LOGDHCP(LOG_DEBUG
, "acknowledged");
3299 ifo
->options
&= ~DHCPCD_STATIC
;
3302 /* No NAK, so reset the backoff
3303 * We don't reset on an OFFER message because the server could
3304 * potentially NAK the REQUEST. */
3307 /* BOOTP could have already assigned this above. */
3308 if (!bootp_copied
) {
3309 if (state
->offer_len
< bootp_len
) {
3311 if ((state
->offer
= malloc(bootp_len
)) == NULL
) {
3313 state
->offer_len
= 0;
3317 state
->offer_len
= bootp_len
;
3318 memcpy(state
->offer
, bootp
, bootp_len
);
3321 lease
->frominfo
= 0;
3322 eloop_timeout_delete(ifp
->ctx
->eloop
, NULL
, ifp
);
3324 #if defined(ARP) || defined(KERNEL_RFC5227)
3332 get_udp_data(void *packet
, size_t *len
)
3334 const struct ip
*ip
= packet
;
3335 size_t ip_hl
= (size_t)ip
->ip_hl
* 4;
3338 p
+= ip_hl
+ sizeof(struct udphdr
);
3339 *len
= (size_t)ntohs(ip
->ip_len
) - sizeof(struct udphdr
) - ip_hl
;
3344 is_packet_udp_bootp(void *packet
, size_t plen
)
3346 struct ip
*ip
= packet
;
3350 if (plen
< sizeof(*ip
))
3353 if (ip
->ip_v
!= IPVERSION
|| ip
->ip_p
!= IPPROTO_UDP
)
3357 if (ntohs(ip
->ip_len
) > plen
)
3360 ip_hlen
= (size_t)ip
->ip_hl
* 4;
3361 if (ip_hlen
< sizeof(*ip
))
3364 /* Check we have a UDP header and BOOTP. */
3365 if (ip_hlen
+ sizeof(udp
) + offsetof(struct bootp
, vend
) > plen
)
3369 memcpy(&udp
, (char *)ip
+ ip_hlen
, sizeof(udp
));
3370 if (ntohs(udp
.uh_ulen
) < sizeof(udp
))
3372 if (ip_hlen
+ ntohs(udp
.uh_ulen
) > plen
)
3375 /* Check it's to and from the right ports. */
3376 if (udp
.uh_dport
!= htons(BOOTPC
) || udp
.uh_sport
!= htons(BOOTPS
))
3382 /* Lengths have already been checked. */
3384 checksums_valid(void *packet
,
3385 struct in_addr
*from
, unsigned int flags
)
3387 struct ip
*ip
= packet
;
3390 uint16_t w
[sizeof(struct ip
) / 2];
3393 .ip_p
= IPPROTO_UDP
,
3394 .ip_src
= ip
->ip_src
,
3395 .ip_dst
= ip
->ip_dst
,
3400 char *udpp
, *uh_sump
;
3404 from
->s_addr
= ip
->ip_src
.s_addr
;
3406 ip_hlen
= (size_t)ip
->ip_hl
* 4;
3407 if (in_cksum(ip
, ip_hlen
, NULL
) != 0)
3410 if (flags
& BPF_PARTIALCSUM
)
3413 udpp
= (char *)ip
+ ip_hlen
;
3414 memcpy(&udp
, udpp
, sizeof(udp
));
3415 if (udp
.uh_sum
== 0)
3418 /* UDP checksum is based on a pseudo IP header alongside
3419 * the UDP header and payload. */
3420 pip
.ip
.ip_len
= udp
.uh_ulen
;
3423 /* Need to zero the UDP sum in the packet for the checksum to work. */
3424 uh_sump
= udpp
+ offsetof(struct udphdr
, uh_sum
);
3425 memset(uh_sump
, 0, sizeof(udp
.uh_sum
));
3427 /* Checksum pseudo header and then UDP + payload. */
3428 in_cksum(pip
.w
, sizeof(pip
.w
), &csum
);
3429 csum
= in_cksum(udpp
, ntohs(udp
.uh_ulen
), &csum
);
3431 #if 0 /* Not needed, just here for completeness. */
3432 /* Put the checksum back. */
3433 memcpy(uh_sump
, &udp
.uh_sum
, sizeof(udp
.uh_sum
));
3436 return csum
== udp
.uh_sum
;
3440 dhcp_handlebootp(struct interface
*ifp
, struct bootp
*bootp
, size_t len
,
3441 struct in_addr
*from
)
3445 if (len
< offsetof(struct bootp
, vend
)) {
3446 logerrx("%s: truncated packet (%zu) from %s",
3447 ifp
->name
, len
, inet_ntoa(*from
));
3451 /* Unlikely, but appeases sanitizers. */
3452 if (len
> FRAMELEN_MAX
) {
3453 logerrx("%s: packet exceeded frame length (%zu) from %s",
3454 ifp
->name
, len
, inet_ntoa(*from
));
3458 /* To make our IS_DHCP macro easy, ensure the vendor
3459 * area has at least 4 octets. */
3460 v
= len
- offsetof(struct bootp
, vend
);
3462 bootp
->vend
[v
++] = '\0';
3466 dhcp_handledhcp(ifp
, bootp
, len
, from
);
3470 dhcp_packet(struct interface
*ifp
, uint8_t *data
, size_t len
,
3471 unsigned int bpf_flags
)
3473 struct bootp
*bootp
;
3474 struct in_addr from
;
3476 size_t fl
= bpf_frame_header_len(ifp
);
3478 const struct dhcp_state
*state
= D_CSTATE(ifp
);
3480 /* Ignore double reads */
3481 if (IN_PRIVSEP(ifp
->ctx
)) {
3482 switch (state
->state
) {
3483 case DHS_BOUND
: /* FALLTHROUGH */
3492 /* Trim frame header */
3495 logerrx("%s: %s: short frame header %zu",
3496 __func__
, ifp
->name
, len
);
3500 /* Move the data to avoid alignment errors. */
3501 memmove(data
, data
+ fl
, len
);
3504 /* Validate filter. */
3505 if (!is_packet_udp_bootp(data
, len
)) {
3507 logerrx("%s: DHCP BPF validation failure", ifp
->name
);
3512 if (!checksums_valid(data
, &from
, bpf_flags
)) {
3513 logerrx("%s: checksum failure from %s",
3514 ifp
->name
, inet_ntoa(from
));
3519 * DHCP has a variable option area rather than a fixed vendor area.
3520 * Because DHCP uses the BOOTP protocol it should still send BOOTP
3521 * sized packets to be RFC compliant.
3522 * However some servers send a truncated vendor area.
3523 * dhcpcd can work fine without the vendor area being sent.
3525 bootp
= get_udp_data(data
, &udp_len
);
3526 dhcp_handlebootp(ifp
, bootp
, udp_len
, &from
);
3530 dhcp_readbpf(void *arg
)
3532 struct interface
*ifp
= arg
;
3533 uint8_t buf
[FRAMELEN_MAX
];
3535 struct dhcp_state
*state
= D_STATE(ifp
);
3536 struct bpf
*bpf
= state
->bpf
;
3538 bpf
->bpf_flags
&= ~BPF_EOF
;
3539 while (!(bpf
->bpf_flags
& BPF_EOF
)) {
3540 bytes
= bpf_read(bpf
, buf
, sizeof(buf
));
3542 if (state
->state
!= DHS_NONE
) {
3543 logerr("%s: %s", __func__
, ifp
->name
);
3548 dhcp_packet(ifp
, buf
, (size_t)bytes
, bpf
->bpf_flags
);
3549 /* Check we still have a state after processing. */
3550 if ((state
= D_STATE(ifp
)) == NULL
)
3552 if ((bpf
= state
->bpf
) == NULL
)
3558 dhcp_recvmsg(struct dhcpcd_ctx
*ctx
, struct msghdr
*msg
)
3560 struct sockaddr_in
*from
= (struct sockaddr_in
*)msg
->msg_name
;
3561 struct iovec
*iov
= &msg
->msg_iov
[0];
3562 struct interface
*ifp
;
3563 const struct dhcp_state
*state
;
3565 ifp
= if_findifpfromcmsg(ctx
, msg
, NULL
);
3570 state
= D_CSTATE(ifp
);
3571 if (state
== NULL
) {
3572 /* Try re-directing it to another interface. */
3573 dhcp_redirect_dhcp(ifp
, (struct bootp
*)iov
->iov_base
,
3574 iov
->iov_len
, &from
->sin_addr
);
3578 if (state
->bpf
!= NULL
) {
3579 /* Avoid a duplicate read if BPF is open for the interface. */
3583 if (IN_PRIVSEP(ctx
)) {
3584 switch (state
->state
) {
3585 case DHS_BOUND
: /* FALLTHROUGH */
3589 /* Any other state we ignore it or will receive
3596 dhcp_handlebootp(ifp
, iov
->iov_base
, iov
->iov_len
,
3601 dhcp_readudp(struct dhcpcd_ctx
*ctx
, struct interface
*ifp
)
3603 const struct dhcp_state
*state
;
3604 struct sockaddr_in from
;
3607 uint8_t buf
[10 * 1024]; /* Maximum MTU */
3609 struct iovec iov
= {
3610 .iov_base
= iovbuf
.buf
,
3611 .iov_len
= sizeof(iovbuf
.buf
),
3616 uint8_t buf
[CMSG_SPACE(sizeof(struct sockaddr_dl
))];
3618 uint8_t buf
[CMSG_SPACE(sizeof(struct in_pktinfo
))];
3620 } cmsgbuf
= { .buf
= { 0 } };
3621 struct msghdr msg
= {
3622 .msg_name
= &from
, .msg_namelen
= sizeof(from
),
3623 .msg_iov
= &iov
, .msg_iovlen
= 1,
3624 .msg_control
= cmsgbuf
.buf
, .msg_controllen
= sizeof(cmsgbuf
.buf
),
3630 state
= D_CSTATE(ifp
);
3635 bytes
= recvmsg(s
, &msg
, 0);
3641 iov
.iov_len
= (size_t)bytes
;
3642 dhcp_recvmsg(ctx
, &msg
);
3646 dhcp_handleudp(void *arg
)
3648 struct dhcpcd_ctx
*ctx
= arg
;
3650 dhcp_readudp(ctx
, NULL
);
3654 dhcp_handleifudp(void *arg
)
3656 struct interface
*ifp
= arg
;
3658 dhcp_readudp(ifp
->ctx
, ifp
);
3662 dhcp_openbpf(struct interface
*ifp
)
3664 struct dhcp_state
*state
;
3666 state
= D_STATE(ifp
);
3669 if (IN_PRIVSEP_SE(ifp
->ctx
)) {
3670 if (ps_bpf_openbootp(ifp
) == -1) {
3678 if (state
->bpf
!= NULL
)
3681 state
->bpf
= bpf_open(ifp
, bpf_bootp
, NULL
);
3682 if (state
->bpf
== NULL
) {
3683 if (errno
== ENOENT
) {
3684 logerrx("%s not found", bpf_name
);
3685 /* May as well disable IPv4 entirely at
3686 * this point as we really need it. */
3687 ifp
->options
->options
&= ~DHCPCD_IPV4
;
3689 logerr("%s: %s", __func__
, ifp
->name
);
3693 eloop_event_add(ifp
->ctx
->eloop
,
3694 state
->bpf
->bpf_fd
, dhcp_readbpf
, ifp
);
3699 dhcp_free(struct interface
*ifp
)
3701 struct dhcp_state
*state
= D_STATE(ifp
);
3702 struct dhcpcd_ctx
*ctx
;
3709 state
->state
= DHS_NONE
;
3713 free(state
->clientid
);
3718 /* If we don't have any more DHCP enabled interfaces,
3719 * close the global socket and release resources */
3721 TAILQ_FOREACH(ifp
, ctx
->ifaces
, next
) {
3722 state
= D_STATE(ifp
);
3723 if (state
!= NULL
&& state
->state
!= DHS_NONE
)
3728 if (ctx
->udp_rfd
!= -1) {
3729 eloop_event_delete(ctx
->eloop
, ctx
->udp_rfd
);
3730 close(ctx
->udp_rfd
);
3733 if (ctx
->udp_wfd
!= -1) {
3734 close(ctx
->udp_wfd
);
3738 free(ctx
->opt_buffer
);
3739 ctx
->opt_buffer
= NULL
;
3744 dhcp_initstate(struct interface
*ifp
)
3746 struct dhcp_state
*state
;
3748 state
= D_STATE(ifp
);
3752 ifp
->if_data
[IF_DATA_DHCP
] = calloc(1, sizeof(*state
));
3753 state
= D_STATE(ifp
);
3757 state
->state
= DHS_NONE
;
3758 /* 0 is a valid fd, so init to -1 */
3759 state
->udp_rfd
= -1;
3761 state
->arping_index
= -1;
3767 dhcp_init(struct interface
*ifp
)
3769 struct dhcp_state
*state
;
3770 struct if_options
*ifo
;
3772 char buf
[(sizeof(ifo
->clientid
) - 1) * 3];
3774 if (dhcp_initstate(ifp
) == -1)
3777 state
= D_STATE(ifp
);
3778 state
->state
= DHS_INIT
;
3779 state
->reason
= "PREINIT";
3781 dhcp_set_leasefile(state
->leasefile
, sizeof(state
->leasefile
),
3785 /* We need to drop the leasefile so that dhcp_start
3786 * doesn't load it. */
3787 if (ifo
->options
& DHCPCD_REQUEST
)
3788 dhcp_unlink(ifp
->ctx
, state
->leasefile
);
3790 free(state
->clientid
);
3791 state
->clientid
= NULL
;
3793 if (ifo
->options
& DHCPCD_ANONYMOUS
) {
3794 uint8_t duid
[DUID_LEN
];
3797 duid_len
= (uint8_t)duid_make(duid
, ifp
, DUID_LL
);
3798 if (duid_len
!= 0) {
3799 state
->clientid
= malloc((size_t)duid_len
+ 6);
3800 if (state
->clientid
== NULL
)
3802 state
->clientid
[0] =(uint8_t)(duid_len
+ 5);
3803 state
->clientid
[1] = 255; /* RFC 4361 */
3804 memcpy(state
->clientid
+ 2, ifo
->iaid
, 4);
3805 memset(state
->clientid
+ 2, 0, 4); /* IAID */
3806 memcpy(state
->clientid
+ 6, duid
, duid_len
);
3808 } else if (*ifo
->clientid
) {
3809 state
->clientid
= malloc((size_t)(ifo
->clientid
[0] + 1));
3810 if (state
->clientid
== NULL
)
3812 memcpy(state
->clientid
, ifo
->clientid
,
3813 (size_t)(ifo
->clientid
[0]) + 1);
3814 } else if (ifo
->options
& DHCPCD_CLIENTID
) {
3815 if (ifo
->options
& DHCPCD_DUID
) {
3816 state
->clientid
= malloc(ifp
->ctx
->duid_len
+ 6);
3817 if (state
->clientid
== NULL
)
3819 state
->clientid
[0] =(uint8_t)(ifp
->ctx
->duid_len
+ 5);
3820 state
->clientid
[1] = 255; /* RFC 4361 */
3821 memcpy(state
->clientid
+ 2, ifo
->iaid
, 4);
3822 memcpy(state
->clientid
+ 6, ifp
->ctx
->duid
,
3823 ifp
->ctx
->duid_len
);
3825 len
= (uint8_t)(ifp
->hwlen
+ 1);
3826 state
->clientid
= malloc((size_t)len
+ 1);
3827 if (state
->clientid
== NULL
)
3829 state
->clientid
[0] = len
;
3830 state
->clientid
[1] = (uint8_t)ifp
->hwtype
;
3831 memcpy(state
->clientid
+ 2, ifp
->hwaddr
,
3836 if (ifo
->options
& DHCPCD_DUID
)
3837 /* Don't bother logging as DUID and IAID are reported
3838 * at device start. */
3841 if (ifo
->options
& DHCPCD_CLIENTID
&& state
->clientid
!= NULL
)
3842 logdebugx("%s: using ClientID %s", ifp
->name
,
3843 hwaddr_ntoa(state
->clientid
+ 1, state
->clientid
[0],
3845 else if (ifp
->hwlen
)
3846 logdebugx("%s: using hwaddr %s", ifp
->name
,
3847 hwaddr_ntoa(ifp
->hwaddr
, ifp
->hwlen
, buf
, sizeof(buf
)));
3856 dhcp_start1(void *arg
)
3858 struct interface
*ifp
= arg
;
3859 struct dhcpcd_ctx
*ctx
= ifp
->ctx
;
3860 struct if_options
*ifo
= ifp
->options
;
3861 struct dhcp_state
*state
;
3865 if (!(ifo
->options
& DHCPCD_IPV4
))
3868 /* Listen on *.*.*.*:bootpc so that the kernel never sends an
3869 * ICMP port unreachable message back to the DHCP server.
3870 * Only do this in master mode so we don't swallow messages
3871 * for dhcpcd running on another interface. */
3872 if ((ctx
->options
& (DHCPCD_MASTER
|DHCPCD_PRIVSEP
)) == DHCPCD_MASTER
3873 && ctx
->udp_rfd
== -1)
3875 ctx
->udp_rfd
= dhcp_openudp(NULL
);
3876 if (ctx
->udp_rfd
== -1) {
3880 eloop_event_add(ctx
->eloop
, ctx
->udp_rfd
, dhcp_handleudp
, ctx
);
3882 if (!IN_PRIVSEP(ctx
) && ctx
->udp_wfd
== -1) {
3883 ctx
->udp_wfd
= xsocket(PF_INET
, SOCK_RAW
|SOCK_CXNB
,IPPROTO_UDP
);
3884 if (ctx
->udp_wfd
== -1) {
3890 if (dhcp_init(ifp
) == -1) {
3891 logerr("%s: dhcp_init", ifp
->name
);
3895 state
= D_STATE(ifp
);
3896 clock_gettime(CLOCK_MONOTONIC
, &state
->started
);
3897 state
->interval
= 0;
3899 state
->offer
= NULL
;
3900 state
->offer_len
= 0;
3903 if (ifo
->arping_len
&& state
->arping_index
< ifo
->arping_len
) {
3909 if (ifo
->options
& DHCPCD_STATIC
) {
3914 if (ifo
->options
& DHCPCD_INFORM
) {
3919 /* We don't want to read the old lease if we NAK an old test */
3920 nolease
= state
->offer
&& ifp
->ctx
->options
& DHCPCD_TEST
;
3921 if (!nolease
&& ifo
->options
& DHCPCD_DHCP
) {
3922 state
->offer_len
= read_lease(ifp
, &state
->offer
);
3923 /* Check the saved lease matches the type we want */
3925 #ifdef IN_IFF_DUPLICATED
3926 struct in_addr addr
;
3927 struct ipv4_addr
*ia
;
3929 addr
.s_addr
= state
->offer
->yiaddr
;
3930 ia
= ipv4_iffindaddr(ifp
, &addr
, NULL
);
3933 if ((!IS_DHCP(state
->offer
) &&
3934 !(ifo
->options
& DHCPCD_BOOTP
)) ||
3935 #ifdef IN_IFF_DUPLICATED
3936 (ia
&& ia
->addr_flags
& IN_IFF_DUPLICATED
) ||
3938 (IS_DHCP(state
->offer
) &&
3939 ifo
->options
& DHCPCD_BOOTP
))
3942 state
->offer
= NULL
;
3943 state
->offer_len
= 0;
3948 struct ipv4_addr
*ia
;
3951 get_lease(ifp
, &state
->lease
, state
->offer
, state
->offer_len
);
3952 state
->lease
.frominfo
= 1;
3953 if (state
->new == NULL
&&
3954 (ia
= ipv4_iffindaddr(ifp
,
3955 &state
->lease
.addr
, &state
->lease
.mask
)) != NULL
)
3957 /* We still have the IP address from the last lease.
3958 * Fake add the address and routes from it so the lease
3959 * can be cleaned up. */
3960 state
->new = malloc(state
->offer_len
);
3963 state
->offer
, state
->offer_len
);
3964 state
->new_len
= state
->offer_len
;
3966 state
->added
|= STATE_ADDED
| STATE_FAKE
;
3967 rt_build(ifp
->ctx
, AF_INET
);
3971 if (!IS_DHCP(state
->offer
)) {
3973 state
->offer
= NULL
;
3974 state
->offer_len
= 0;
3975 } else if (!(ifo
->options
& DHCPCD_LASTLEASE_EXTEND
) &&
3976 state
->lease
.leasetime
!= DHCP_INFINITE_LIFETIME
&&
3977 dhcp_filemtime(ifp
->ctx
, state
->leasefile
, &mtime
) == 0)
3981 /* Offset lease times and check expiry */
3984 (time_t)state
->lease
.leasetime
< now
- mtime
)
3986 logdebugx("%s: discarding expired lease",
3989 state
->offer
= NULL
;
3990 state
->offer_len
= 0;
3991 state
->lease
.addr
.s_addr
= 0;
3992 /* Technically we should discard the lease
3993 * as it's expired, just as DHCPv6 addresses
3994 * would be by the kernel.
3995 * However, this may violate POLA so
3996 * we currently leave it be.
3997 * If we get a totally different lease from
3998 * the DHCP server we'll drop it anyway, as
3999 * we will on any other event which would
4000 * trigger a lease drop.
4001 * This should only happen if dhcpcd stops
4002 * running and the lease expires before
4003 * dhcpcd starts again. */
4006 dhcp_drop(ifp
, "EXPIRE");
4009 l
= (uint32_t)(now
- mtime
);
4010 state
->lease
.leasetime
-= l
;
4011 state
->lease
.renewaltime
-= l
;
4012 state
->lease
.rebindtime
-= l
;
4018 if (!(ifo
->options
& DHCPCD_DHCP
)) {
4019 if (ifo
->options
& DHCPCD_IPV4LL
)
4025 if (state
->offer
== NULL
||
4026 !IS_DHCP(state
->offer
) ||
4027 ifo
->options
& DHCPCD_ANONYMOUS
)
4034 dhcp_start(struct interface
*ifp
)
4038 const struct dhcp_state
*state
;
4041 if (!(ifp
->options
->options
& DHCPCD_IPV4
))
4044 /* If we haven't been given a netmask for our requested address,
4046 if (ifp
->options
->req_addr
.s_addr
!= INADDR_ANY
&&
4047 ifp
->options
->req_mask
.s_addr
== INADDR_ANY
)
4048 ifp
->options
->req_mask
.s_addr
=
4049 ipv4_getnetmask(ifp
->options
->req_addr
.s_addr
);
4051 /* If we haven't specified a ClientID and our hardware address
4052 * length is greater than BOOTP CHADDR then we enforce a ClientID
4053 * of the hardware address type and the hardware address.
4054 * If there is no hardware address and no ClientID set,
4055 * force a DUID based ClientID. */
4056 if (ifp
->hwlen
> 16)
4057 ifp
->options
->options
|= DHCPCD_CLIENTID
;
4058 else if (ifp
->hwlen
== 0 && !(ifp
->options
->options
& DHCPCD_CLIENTID
))
4059 ifp
->options
->options
|= DHCPCD_CLIENTID
| DHCPCD_DUID
;
4061 /* Firewire and InfiniBand interfaces require ClientID and
4062 * the broadcast option being set. */
4063 switch (ifp
->hwtype
) {
4064 case ARPHRD_IEEE1394
: /* FALLTHROUGH */
4065 case ARPHRD_INFINIBAND
:
4066 ifp
->options
->options
|= DHCPCD_CLIENTID
| DHCPCD_BROADCAST
;
4070 /* If we violate RFC2131 section 3.7 then require ARP
4071 * to detect if any other client wants our address. */
4072 if (ifp
->options
->options
& DHCPCD_LASTLEASE_EXTEND
)
4073 ifp
->options
->options
|= DHCPCD_ARP
;
4075 /* No point in delaying a static configuration */
4076 if (ifp
->options
->options
& DHCPCD_STATIC
||
4077 !(ifp
->options
->options
& DHCPCD_INITIAL_DELAY
))
4084 /* If we have arpinged then we have already delayed. */
4085 state
= D_CSTATE(ifp
);
4086 if (state
!= NULL
&& state
->arping_index
!= -1) {
4091 delay
= MSEC_PER_SEC
+
4092 (arc4random_uniform(MSEC_PER_SEC
* 2) - MSEC_PER_SEC
);
4093 logdebugx("%s: delaying IPv4 for %0.1f seconds",
4094 ifp
->name
, (float)delay
/ MSEC_PER_SEC
);
4096 eloop_timeout_add_msec(ifp
->ctx
->eloop
, delay
, dhcp_start1
, ifp
);
4100 dhcp_abort(struct interface
*ifp
)
4102 struct dhcp_state
*state
;
4104 state
= D_STATE(ifp
);
4107 state
->arping_index
= -1;
4110 eloop_timeout_delete(ifp
->ctx
->eloop
, dhcp_start1
, ifp
);
4112 if (state
!= NULL
&& state
->added
) {
4113 rt_build(ifp
->ctx
, AF_INET
);
4115 if (ifp
->options
->options
& DHCPCD_ARP
)
4116 arp_announceaddr(ifp
->ctx
, &state
->addr
->addr
);
4122 dhcp_handleifa(int cmd
, struct ipv4_addr
*ia
, pid_t pid
)
4124 struct interface
*ifp
;
4125 struct dhcp_state
*state
;
4126 struct if_options
*ifo
;
4130 state
= D_STATE(ifp
);
4131 if (state
== NULL
|| state
->state
== DHS_NONE
)
4134 if (cmd
== RTM_DELADDR
) {
4135 if (state
->addr
== ia
) {
4136 loginfox("%s: pid %d deleted IP address %s",
4137 ifp
->name
, pid
, ia
->saddr
);
4140 /* Don't clear the added state as we need
4141 * to drop the lease. */
4142 dhcp_drop(ifp
, "EXPIRE");
4148 if (cmd
!= RTM_NEWADDR
)
4151 #ifdef IN_IFF_NOTUSEABLE
4152 if (!(ia
->addr_flags
& IN_IFF_NOTUSEABLE
))
4153 dhcp_finish_dad(ifp
, &ia
->addr
);
4154 else if (ia
->addr_flags
& IN_IFF_DUPLICATED
)
4155 return dhcp_addr_duplicated(ifp
, &ia
->addr
) ? NULL
: ia
;
4159 if (ifo
->options
& DHCPCD_INFORM
) {
4160 if (state
->state
!= DHS_INFORM
)
4165 if (!(ifo
->options
& DHCPCD_STATIC
))
4167 if (ifo
->req_addr
.s_addr
!= INADDR_ANY
)
4171 state
->old
= state
->new;
4172 state
->new_len
= dhcp_message_new(&state
->new, &ia
->addr
, &ia
->mask
);
4173 if (state
->new == NULL
)
4175 if (ifp
->flags
& IFF_POINTOPOINT
) {
4176 for (i
= 1; i
< 255; i
++)
4177 if (i
!= DHO_ROUTER
&& has_option_mask(ifo
->dstmask
,i
))
4178 dhcp_message_add_addr(state
->new, i
, ia
->brd
);
4180 state
->reason
= "STATIC";
4181 rt_build(ifp
->ctx
, AF_INET
);
4182 script_runreason(ifp
, state
->reason
);
4183 if (ifo
->options
& DHCPCD_INFORM
) {
4184 state
->state
= DHS_INFORM
;
4186 state
->lease
.server
.s_addr
= INADDR_ANY
;
4196 dhcp_dump(struct interface
*ifp
)
4198 struct dhcp_state
*state
;
4200 ifp
->if_data
[IF_DATA_DHCP
] = state
= calloc(1, sizeof(*state
));
4201 if (state
== NULL
) {
4205 state
->new_len
= read_lease(ifp
, &state
->new);
4206 if (state
->new == NULL
) {
4207 logerr("read_lease");
4210 state
->reason
= "DUMP";
4211 return script_runreason(ifp
, state
->reason
);