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