"Fossies" - the Fresh Open Source Software Archive 
Member "dhcpcd-9.4.1/src/dhcp.h" (22 Oct 2021, 8387 Bytes) of package /linux/misc/dhcpcd-9.4.1.tar.xz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "dhcp.h" see the
Fossies "Dox" file reference documentation and the latest
Fossies "Diffs" side-by-side code changes report:
9.4.0_vs_9.4.1.
1 /* SPDX-License-Identifier: BSD-2-Clause */
2 /*
3 * dhcpcd - DHCP client daemon
4 * Copyright (c) 2006-2021 Roy Marples <roy@marples.name>
5 * All rights reserved
6
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29 #ifndef DHCP_H
30 #define DHCP_H
31
32 #include <arpa/inet.h>
33 #include <netinet/in.h>
34
35 #include <netinet/ip.h>
36 #define __FAVOR_BSD /* Nasty glibc hack so we can use BSD semantics for UDP */
37 #include <netinet/udp.h>
38 #undef __FAVOR_BSD
39
40 #include <limits.h>
41 #include <stdint.h>
42
43 #include "arp.h"
44 #include "bpf.h"
45 #include "auth.h"
46 #include "dhcp-common.h"
47
48 /* UDP port numbers for BOOTP */
49 #define BOOTPS 67
50 #define BOOTPC 68
51
52 #define MAGIC_COOKIE 0x63825363
53 #define BROADCAST_FLAG 0x8000
54
55 /* BOOTP message OP code */
56 #define BOOTREQUEST 1
57 #define BOOTREPLY 2
58
59 /* DHCP message type */
60 #define DHCP_DISCOVER 1
61 #define DHCP_OFFER 2
62 #define DHCP_REQUEST 3
63 #define DHCP_DECLINE 4
64 #define DHCP_ACK 5
65 #define DHCP_NAK 6
66 #define DHCP_RELEASE 7
67 #define DHCP_INFORM 8
68 #define DHCP_FORCERENEW 9
69
70 /* Constants taken from RFC 2131. */
71 #define T1 0.5
72 #define T2 0.875
73 #define DHCP_BASE 4
74 #define DHCP_MAX 64
75 #define DHCP_RAND_MIN -1
76 #define DHCP_RAND_MAX 1
77
78 #ifdef RFC2131_STRICT
79 /* Be strictly conformant for section 4.1.1 */
80 # define DHCP_MIN_DELAY 1
81 # define DHCP_MAX_DELAY 10
82 #else
83 /* or mirror the more modern IPv6RS and DHCPv6 delays */
84 # define DHCP_MIN_DELAY 0
85 # define DHCP_MAX_DELAY 1
86 #endif
87
88 /* DHCP options */
89 enum DHO {
90 DHO_PAD = 0,
91 DHO_SUBNETMASK = 1,
92 DHO_ROUTER = 3,
93 DHO_DNSSERVER = 6,
94 DHO_HOSTNAME = 12,
95 DHO_DNSDOMAIN = 15,
96 DHO_MTU = 26,
97 DHO_BROADCAST = 28,
98 DHO_STATICROUTE = 33,
99 DHO_NISDOMAIN = 40,
100 DHO_NISSERVER = 41,
101 DHO_NTPSERVER = 42,
102 DHO_VENDOR = 43,
103 DHO_IPADDRESS = 50,
104 DHO_LEASETIME = 51,
105 DHO_OPTSOVERLOADED = 52,
106 DHO_MESSAGETYPE = 53,
107 DHO_SERVERID = 54,
108 DHO_PARAMETERREQUESTLIST = 55,
109 DHO_MESSAGE = 56,
110 DHO_MAXMESSAGESIZE = 57,
111 DHO_RENEWALTIME = 58,
112 DHO_REBINDTIME = 59,
113 DHO_VENDORCLASSID = 60,
114 DHO_CLIENTID = 61,
115 DHO_USERCLASS = 77, /* RFC 3004 */
116 DHO_RAPIDCOMMIT = 80, /* RFC 4039 */
117 DHO_FQDN = 81,
118 DHO_AUTHENTICATION = 90, /* RFC 3118 */
119 DHO_IPV6_PREFERRED_ONLY = 108, /* RFC 8925 */
120 DHO_AUTOCONFIGURE = 116, /* RFC 2563 */
121 DHO_DNSSEARCH = 119, /* RFC 3397 */
122 DHO_CSR = 121, /* RFC 3442 */
123 DHO_VIVCO = 124, /* RFC 3925 */
124 DHO_VIVSO = 125, /* RFC 3925 */
125 DHO_FORCERENEW_NONCE = 145, /* RFC 6704 */
126 DHO_MUDURL = 161, /* draft-ietf-opsawg-mud */
127 DHO_SIXRD = 212, /* RFC 5969 */
128 DHO_MSCSR = 249, /* MS code for RFC 3442 */
129 DHO_END = 255
130 };
131
132 /* FQDN values - lsnybble used in flags
133 * hsnybble to create order
134 * and to allow 0x00 to mean disable
135 */
136 enum FQDN {
137 FQDN_DISABLE = 0x00,
138 FQDN_NONE = 0x18,
139 FQDN_PTR = 0x20,
140 FQDN_BOTH = 0x31
141 };
142
143 #define MIN_V6ONLY_WAIT 300 /* seconds, RFC 8925 */
144
145 /* Sizes for BOOTP options */
146 #define BOOTP_CHADDR_LEN 16
147 #define BOOTP_SNAME_LEN 64
148 #define BOOTP_FILE_LEN 128
149 #define BOOTP_VEND_LEN 64
150
151 /* DHCP is basically an extension to BOOTP */
152 struct bootp {
153 uint8_t op; /* message type */
154 uint8_t htype; /* hardware address type */
155 uint8_t hlen; /* hardware address length */
156 uint8_t hops; /* should be zero in client message */
157 uint32_t xid; /* transaction id */
158 uint16_t secs; /* elapsed time in sec. from boot */
159 uint16_t flags; /* such as broadcast flag */
160 uint32_t ciaddr; /* (previously allocated) client IP */
161 uint32_t yiaddr; /* 'your' client IP address */
162 uint32_t siaddr; /* should be zero in client's messages */
163 uint32_t giaddr; /* should be zero in client's messages */
164 uint8_t chaddr[BOOTP_CHADDR_LEN]; /* client's hardware address */
165 uint8_t sname[BOOTP_SNAME_LEN]; /* server host name */
166 uint8_t file[BOOTP_FILE_LEN]; /* boot file name */
167 uint8_t vend[BOOTP_VEND_LEN]; /* vendor specific area */
168 /* DHCP allows a variable length vendor area */
169 };
170
171 #define DHCP_MIN_LEN (offsetof(struct bootp, vend) + 4)
172
173 struct bootp_pkt
174 {
175 struct ip ip;
176 struct udphdr udp;
177 struct bootp bootp;
178 };
179
180 struct dhcp_lease {
181 struct in_addr addr;
182 struct in_addr mask;
183 struct in_addr brd;
184 uint32_t leasetime;
185 uint32_t renewaltime;
186 uint32_t rebindtime;
187 struct in_addr server;
188 uint8_t frominfo;
189 uint32_t cookie;
190 };
191
192 #ifndef DHCP_INFINITE_LIFETIME
193 # define DHCP_INFINITE_LIFETIME (~0U)
194 #endif
195
196 enum DHS {
197 DHS_NONE,
198 DHS_INIT,
199 DHS_DISCOVER,
200 DHS_REQUEST,
201 DHS_PROBE,
202 DHS_BOUND,
203 DHS_RENEW,
204 DHS_REBIND,
205 DHS_REBOOT,
206 DHS_INFORM,
207 DHS_RENEW_REQUESTED,
208 DHS_RELEASE
209 };
210
211 struct dhcp_state {
212 enum DHS state;
213 struct bootp *sent;
214 size_t sent_len;
215 struct bootp *offer;
216 size_t offer_len;
217 struct bootp *new;
218 size_t new_len;
219 struct bootp *old;
220 size_t old_len;
221 struct dhcp_lease lease;
222 const char *reason;
223 unsigned int interval;
224 unsigned int nakoff;
225 uint32_t xid;
226 int socket;
227
228 struct bpf *bpf;
229 int udp_rfd;
230 struct ipv4_addr *addr;
231 uint8_t added;
232
233 char leasefile[sizeof(LEASEFILE) + IF_NAMESIZE + (IF_SSIDLEN * 4)];
234 struct timespec started;
235 unsigned char *clientid;
236 struct authstate auth;
237 #ifdef ARPING
238 ssize_t arping_index;
239 #endif
240 };
241
242 #ifdef INET
243 #define D_STATE(ifp) \
244 ((struct dhcp_state *)(ifp)->if_data[IF_DATA_DHCP])
245 #define D_CSTATE(ifp) \
246 ((const struct dhcp_state *)(ifp)->if_data[IF_DATA_DHCP])
247 #define D_STATE_RUNNING(ifp) \
248 (D_CSTATE((ifp)) && D_CSTATE((ifp))->new && D_CSTATE((ifp))->reason)
249
250 #define IS_DHCP(b) ((b)->vend[0] == 0x63 && \
251 (b)->vend[1] == 0x82 && \
252 (b)->vend[2] == 0x53 && \
253 (b)->vend[3] == 0x63)
254
255 #include "dhcpcd.h"
256 #include "if-options.h"
257
258 ssize_t print_rfc3361(FILE *, const uint8_t *, size_t);
259 ssize_t print_rfc3442(FILE *, const uint8_t *, size_t);
260
261 int dhcp_openudp(struct in_addr *);
262 void dhcp_packet(struct interface *, uint8_t *, size_t, unsigned int);
263 void dhcp_recvmsg(struct dhcpcd_ctx *, struct msghdr *);
264 void dhcp_printoptions(const struct dhcpcd_ctx *,
265 const struct dhcp_opt *, size_t);
266 uint16_t dhcp_get_mtu(const struct interface *);
267 int dhcp_get_routes(rb_tree_t *, struct interface *);
268 ssize_t dhcp_env(FILE *, const char *, const struct interface *,
269 const struct bootp *, size_t);
270
271 struct ipv4_addr *dhcp_handleifa(int, struct ipv4_addr *, pid_t pid);
272 void dhcp_drop(struct interface *, const char *);
273 void dhcp_start(struct interface *);
274 void dhcp_abort(struct interface *);
275 void dhcp_discover(void *);
276 void dhcp_inform(struct interface *);
277 void dhcp_renew(struct interface *);
278 void dhcp_bind(struct interface *);
279 void dhcp_reboot_newopts(struct interface *, unsigned long long);
280 void dhcp_close(struct interface *);
281 void dhcp_free(struct interface *);
282 int dhcp_dump(struct interface *);
283 #endif /* INET */
284
285 #endif /* DHCP_H */