Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sbin/dhclient/dhcpd.h
39477 views
1
/* $OpenBSD: dhcpd.h,v 1.33 2004/05/06 22:29:15 deraadt Exp $ */
2
3
/*-
4
* SPDX-License-Identifier: BSD-3-Clause
5
*
6
* Copyright (c) 2004 Henning Brauer <[email protected]>
7
* Copyright (c) 1995, 1996, 1997, 1998, 1999
8
* The Internet Software Consortium. All rights reserved.
9
*
10
* Redistribution and use in source and binary forms, with or without
11
* modification, are permitted provided that the following conditions
12
* are met:
13
*
14
* 1. Redistributions of source code must retain the above copyright
15
* notice, this list of conditions and the following disclaimer.
16
* 2. Redistributions in binary form must reproduce the above copyright
17
* notice, this list of conditions and the following disclaimer in the
18
* documentation and/or other materials provided with the distribution.
19
* 3. Neither the name of The Internet Software Consortium nor the names
20
* of its contributors may be used to endorse or promote products derived
21
* from this software without specific prior written permission.
22
*
23
* THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
24
* CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
25
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
26
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27
* DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
28
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
31
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
32
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
33
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
34
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35
* SUCH DAMAGE.
36
*
37
* This software has been written for the Internet Software Consortium
38
* by Ted Lemon <[email protected]> in cooperation with Vixie
39
* Enterprises. To learn more about the Internet Software Consortium,
40
* see ``http://www.vix.com/isc''. To learn more about Vixie
41
* Enterprises, see ``http://www.vix.com''.
42
*/
43
44
#include <sys/param.h>
45
46
#include <sys/socket.h>
47
#include <sys/sockio.h>
48
#include <sys/stat.h>
49
#include <sys/time.h>
50
#include <sys/un.h>
51
#include <sys/wait.h>
52
53
#include <net/if.h>
54
#include <net/if_dl.h>
55
#include <net/route.h>
56
57
#include <netinet/in.h>
58
#include <arpa/inet.h>
59
60
#include <ctype.h>
61
#include <errno.h>
62
#include <fcntl.h>
63
#include <libutil.h>
64
#include <limits.h>
65
#include <netdb.h>
66
#include <paths.h>
67
#include <unistd.h>
68
#include <stdarg.h>
69
#include <stdio.h>
70
#include <stdlib.h>
71
#include <string.h>
72
#include <syslog.h>
73
#include <time.h>
74
#include <unistd.h>
75
76
#include <libcasper.h>
77
#include <casper/cap_syslog.h>
78
79
#include "dhcp.h"
80
#include "tree.h"
81
82
#define LOCAL_PORT 68
83
#define REMOTE_PORT 67
84
85
struct option_data {
86
size_t len;
87
u_int8_t *data;
88
};
89
90
struct string_list {
91
struct string_list *next;
92
char *string;
93
};
94
95
struct iaddr {
96
size_t len;
97
unsigned char iabuf[16];
98
};
99
100
struct iaddrlist {
101
struct iaddrlist *next;
102
struct iaddr addr;
103
};
104
105
struct packet {
106
struct dhcp_packet *raw;
107
int packet_length;
108
int packet_type;
109
int options_valid;
110
int client_port;
111
struct iaddr client_addr;
112
struct interface_info *interface;
113
struct hardware *haddr;
114
struct option_data options[256];
115
};
116
117
struct hardware {
118
u_int8_t htype;
119
u_int8_t hlen;
120
u_int8_t haddr[16];
121
};
122
123
struct client_lease {
124
struct client_lease *next;
125
time_t expiry, renewal, rebind;
126
struct iaddr address;
127
struct iaddr nextserver;
128
char *server_name;
129
char *filename;
130
struct string_list *medium;
131
unsigned int is_static : 1;
132
unsigned int is_bootp : 1;
133
struct option_data options[256];
134
};
135
136
/* Possible states in which the client can be. */
137
enum dhcp_state {
138
S_REBOOTING,
139
S_INIT,
140
S_SELECTING,
141
S_REQUESTING,
142
S_BOUND,
143
S_RENEWING,
144
S_REBINDING
145
};
146
147
struct client_config {
148
struct option_data defaults[256];
149
enum {
150
ACTION_DEFAULT,
151
ACTION_SUPERSEDE,
152
ACTION_PREPEND,
153
ACTION_APPEND
154
} default_actions[256];
155
156
struct option_data send_options[256];
157
u_int8_t required_options[256];
158
u_int8_t requested_options[256];
159
int requested_option_count;
160
u_int8_t ignored_options[256];
161
u_int vlan_pcp;
162
time_t timeout;
163
time_t initial_interval;
164
time_t retry_interval;
165
time_t select_interval;
166
time_t reboot_timeout;
167
time_t backoff_cutoff;
168
struct string_list *media;
169
char *script_name;
170
enum { IGNORE, ACCEPT, PREFER }
171
bootp_policy;
172
struct string_list *medium;
173
struct iaddrlist *reject_list;
174
};
175
176
struct client_state {
177
struct client_lease *active;
178
struct client_lease *new;
179
struct client_lease *offered_leases;
180
struct client_lease *leases;
181
struct client_lease *alias;
182
enum dhcp_state state;
183
struct iaddr destination;
184
u_int32_t xid;
185
u_int16_t secs;
186
time_t first_sending;
187
time_t interval;
188
struct string_list *medium;
189
struct dhcp_packet packet;
190
int packet_length;
191
struct iaddr requested_address;
192
struct client_config *config;
193
char **scriptEnv;
194
int scriptEnvsize;
195
struct string_list *env;
196
int envc;
197
};
198
199
struct interface_info {
200
struct interface_info *next;
201
struct hardware hw_address;
202
char name[IFNAMSIZ];
203
int rfdesc;
204
int wfdesc;
205
int ufdesc;
206
unsigned char *rbuf;
207
size_t rbuf_max;
208
size_t rbuf_offset;
209
size_t rbuf_len;
210
struct ifreq *ifp;
211
struct client_state *client;
212
int noifmedia;
213
int errors;
214
int dead;
215
u_int16_t index;
216
int linkstat;
217
};
218
219
struct timeout {
220
struct timeout *next;
221
struct timespec when;
222
void (*func)(void *);
223
void *what;
224
};
225
226
struct protocol {
227
struct protocol *next;
228
int fd;
229
void (*handler)(struct protocol *);
230
void *local;
231
};
232
233
#define DEFAULT_HASH_SIZE 97
234
235
struct hash_bucket {
236
struct hash_bucket *next;
237
const unsigned char *name;
238
int len;
239
unsigned char *value;
240
};
241
242
struct hash_table {
243
int hash_count;
244
struct hash_bucket *buckets[DEFAULT_HASH_SIZE];
245
};
246
247
/* Default path to dhcpd config file. */
248
#define _PATH_DHCLIENT_CONF "/etc/dhclient.conf"
249
#define _PATH_DHCLIENT_DB "/var/db/dhclient.leases"
250
#define DHCPD_LOG_FACILITY LOG_DAEMON
251
252
#define MAX_TIME 0x7fffffff
253
#define MIN_TIME 0
254
255
/* External definitions... */
256
257
/* options.c */
258
int cons_options(struct packet *, struct dhcp_packet *, int,
259
struct tree_cache **, int, int, int, u_int8_t *, int);
260
const char *pretty_print_option(unsigned int,
261
unsigned char *, int, int, int);
262
void do_packet(struct interface_info *, struct dhcp_packet *,
263
int, unsigned int, struct iaddr, struct hardware *);
264
265
/* errwarn.c */
266
extern int warnings_occurred;
267
void error(const char *, ...) __attribute__ ((__format__ (__printf__, 1, 2))) __dead2;
268
int warning(const char *, ...) __attribute__ ((__format__ (__printf__, 1, 2)));
269
int note(const char *, ...) __attribute__ ((__format__ (__printf__, 1, 2)));
270
int debug(const char *, ...) __attribute__ ((__format__ (__printf__, 1, 2)));
271
int parse_warn(const char *, ...) __attribute__ ((__format__ (__printf__, 1, 2)));
272
273
/* conflex.c */
274
extern int lexline, lexchar;
275
extern char *token_line;
276
extern const char *tlname;
277
extern char comments[4096];
278
extern int comment_index;
279
extern int eol_token;
280
void new_parse(const char *);
281
int next_token(char **, FILE *);
282
int peek_token(char **, FILE *);
283
284
/* parse.c */
285
void skip_to_semi(FILE *);
286
int parse_semi(FILE *);
287
char *parse_string(FILE *);
288
int parse_ip_addr(FILE *, struct iaddr *);
289
void parse_hardware_param(FILE *, struct hardware *);
290
void parse_lease_time(FILE *, time_t *);
291
unsigned char *parse_numeric_aggregate(FILE *, unsigned char *, size_t *,
292
int, unsigned, int);
293
void convert_num(unsigned char *, char *, unsigned, int);
294
time_t parse_date(FILE *);
295
296
/* tree.c */
297
pair cons(caddr_t, pair);
298
299
/* alloc.c */
300
struct string_list *new_string_list(size_t size);
301
struct hash_table *new_hash_table(int);
302
struct hash_bucket *new_hash_bucket(void);
303
304
/* bpf.c */
305
int if_register_bpf(struct interface_info *, int);
306
void if_register_send(struct interface_info *);
307
void if_register_receive(struct interface_info *);
308
void send_packet_unpriv(int, struct dhcp_packet *, size_t, struct in_addr,
309
struct in_addr);
310
struct imsg_hdr;
311
void send_packet_priv(struct interface_info *, struct imsg_hdr *, int);
312
ssize_t receive_packet(struct interface_info *, unsigned char *, size_t,
313
struct sockaddr_in *, struct hardware *);
314
315
/* dispatch.c */
316
extern void (*bootp_packet_handler)(struct interface_info *,
317
struct dhcp_packet *, int, unsigned int, struct iaddr, struct hardware *);
318
void discover_interfaces(struct interface_info *);
319
void reinitialize_interfaces(void);
320
void dispatch(void);
321
void got_one(struct protocol *);
322
void add_timeout(time_t, void (*)(void *), void *);
323
void add_timeout_timespec(struct timespec, void (*)(void *), void *);
324
void cancel_timeout(void (*)(void *), void *);
325
void add_protocol(const char *, int, void (*)(struct protocol *), void *);
326
void remove_protocol(struct protocol *);
327
int interface_link_status(char *);
328
void interface_set_mtu_unpriv(int, u_int16_t);
329
void interface_set_mtu_priv(char *, u_int16_t);
330
331
/* hash.c */
332
struct hash_table *new_hash(void);
333
void add_hash(struct hash_table *, const unsigned char *, int, unsigned char *);
334
void *hash_lookup(struct hash_table *, unsigned char *, int);
335
336
/* tables.c */
337
extern struct option dhcp_options[256];
338
extern unsigned char dhcp_option_default_priority_list[];
339
extern int sizeof_dhcp_option_default_priority_list;
340
extern struct hash_table universe_hash;
341
extern struct universe dhcp_universe;
342
void initialize_universes(void);
343
344
/* convert.c */
345
u_int32_t getULong(unsigned char *);
346
int32_t getLong(unsigned char *);
347
u_int16_t getUShort(unsigned char *);
348
int16_t getShort(unsigned char *);
349
void putULong(unsigned char *, u_int32_t);
350
void putLong(unsigned char *, int32_t);
351
void putUShort(unsigned char *, unsigned int);
352
void putShort(unsigned char *, int);
353
354
/* inet.c */
355
struct iaddr subnet_number(struct iaddr, struct iaddr);
356
struct iaddr broadcast_addr(struct iaddr, struct iaddr);
357
int addr_eq(struct iaddr, struct iaddr);
358
char *piaddr(struct iaddr);
359
360
/* dhclient.c */
361
extern cap_channel_t *capsyslog;
362
extern const char *path_dhclient_conf;
363
extern char *path_dhclient_db;
364
extern struct timespec time_now; /* CLOCK_MONOTONIC */
365
extern time_t cur_time; /* Seconds since epoch */
366
extern int log_priority;
367
extern int log_perror;
368
369
extern struct client_config top_level_config;
370
371
extern struct pidfh *pidfile;
372
373
extern struct interface_info *ifi;
374
375
void dhcpoffer(struct packet *);
376
void dhcpack(struct packet *);
377
void dhcpnak(struct packet *);
378
379
void send_discover(void *);
380
void send_request(void *);
381
void send_decline(void *);
382
383
void state_reboot(void *);
384
void state_init(void *);
385
void state_selecting(void *);
386
void state_requesting(void *);
387
void state_bound(void *);
388
void state_panic(void *);
389
390
void bind_lease(struct interface_info *);
391
392
void make_discover(struct interface_info *, struct client_lease *);
393
void make_request(struct interface_info *, struct client_lease *);
394
void make_decline(struct interface_info *, struct client_lease *);
395
396
void free_client_lease(struct client_lease *);
397
void rewrite_client_leases(void);
398
void write_client_lease(struct interface_info *, struct client_lease *, int);
399
400
void priv_script_init(const char *, char *);
401
void priv_script_write_params(const char *, struct client_lease *);
402
int priv_script_go(void);
403
404
void script_init(const char *, struct string_list *);
405
void script_write_params(const char *, struct client_lease *);
406
int script_go(void);
407
void client_envadd(struct client_state *,
408
const char *, const char *, const char *, ...);
409
void script_set_env(struct client_state *, const char *, const char *,
410
const char *);
411
void script_flush_env(struct client_state *);
412
int dhcp_option_ev_name(char *, size_t, struct option *);
413
414
struct client_lease *packet_to_lease(struct packet *);
415
void go_daemon(void);
416
void client_location_changed(void);
417
418
void bootp(struct packet *);
419
void dhcp(struct packet *);
420
421
/* packet.c */
422
void assemble_hw_header(struct interface_info *, unsigned char *, int *);
423
void assemble_udp_ip_header(unsigned char *, int *, u_int32_t, u_int32_t,
424
unsigned int, unsigned char *, int);
425
ssize_t decode_hw_header(unsigned char *, int, struct hardware *);
426
ssize_t decode_udp_ip_header(unsigned char *, int, struct sockaddr_in *,
427
unsigned char *, int);
428
429
/* clparse.c */
430
int read_client_conf(void);
431
void read_client_leases(void);
432
void parse_client_statement(FILE *, struct interface_info *,
433
struct client_config *);
434
unsigned parse_X(FILE *, u_int8_t *, unsigned);
435
int parse_option_list(FILE *, u_int8_t *);
436
void parse_interface_declaration(FILE *, struct client_config *);
437
struct interface_info *interface_or_dummy(char *);
438
void make_client_state(struct interface_info *);
439
void make_client_config(struct interface_info *, struct client_config *);
440
void parse_client_lease_statement(FILE *, int);
441
void parse_client_lease_declaration(FILE *, struct client_lease *,
442
struct interface_info **);
443
struct option *parse_option_decl(FILE *, struct option_data *);
444
void parse_string_list(FILE *, struct string_list **, int);
445
void parse_reject_statement(FILE *, struct client_config *);
446
447
/* privsep.c */
448
struct buf *buf_open(size_t);
449
int buf_add(struct buf *, const void *, size_t);
450
int buf_close(int, struct buf *);
451
ssize_t buf_read(int, void *, size_t);
452
void dispatch_imsg(struct interface_info *, int);
453
454