1*83ee113eSDavid van Moolenbroek /* $NetBSD: dhcpd.h,v 1.6 2014/07/12 12:09:37 spz Exp $ */ 2*83ee113eSDavid van Moolenbroek /* dhcpd.h 3*83ee113eSDavid van Moolenbroek 4*83ee113eSDavid van Moolenbroek Definitions for dhcpd... */ 5*83ee113eSDavid van Moolenbroek 6*83ee113eSDavid van Moolenbroek /* 7*83ee113eSDavid van Moolenbroek * Copyright (c) 2004-2014 by Internet Systems Consortium, Inc. ("ISC") 8*83ee113eSDavid van Moolenbroek * Copyright (c) 1996-2003 by Internet Software Consortium 9*83ee113eSDavid van Moolenbroek * 10*83ee113eSDavid van Moolenbroek * Permission to use, copy, modify, and distribute this software for any 11*83ee113eSDavid van Moolenbroek * purpose with or without fee is hereby granted, provided that the above 12*83ee113eSDavid van Moolenbroek * copyright notice and this permission notice appear in all copies. 13*83ee113eSDavid van Moolenbroek * 14*83ee113eSDavid van Moolenbroek * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES 15*83ee113eSDavid van Moolenbroek * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 16*83ee113eSDavid van Moolenbroek * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR 17*83ee113eSDavid van Moolenbroek * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 18*83ee113eSDavid van Moolenbroek * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 19*83ee113eSDavid van Moolenbroek * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 20*83ee113eSDavid van Moolenbroek * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 21*83ee113eSDavid van Moolenbroek * 22*83ee113eSDavid van Moolenbroek * Internet Systems Consortium, Inc. 23*83ee113eSDavid van Moolenbroek * 950 Charter Street 24*83ee113eSDavid van Moolenbroek * Redwood City, CA 94063 25*83ee113eSDavid van Moolenbroek * <info@isc.org> 26*83ee113eSDavid van Moolenbroek * https://www.isc.org/ 27*83ee113eSDavid van Moolenbroek * 28*83ee113eSDavid van Moolenbroek */ 29*83ee113eSDavid van Moolenbroek 30*83ee113eSDavid van Moolenbroek /*! \file includes/dhcpd.h */ 31*83ee113eSDavid van Moolenbroek 32*83ee113eSDavid van Moolenbroek #include "config.h" 33*83ee113eSDavid van Moolenbroek 34*83ee113eSDavid van Moolenbroek #ifndef __CYGWIN32__ 35*83ee113eSDavid van Moolenbroek #include <sys/types.h> 36*83ee113eSDavid van Moolenbroek #include <netinet/in.h> 37*83ee113eSDavid van Moolenbroek #include <sys/socket.h> 38*83ee113eSDavid van Moolenbroek #include <sys/un.h> 39*83ee113eSDavid van Moolenbroek #include <arpa/inet.h> 40*83ee113eSDavid van Moolenbroek #include <errno.h> 41*83ee113eSDavid van Moolenbroek 42*83ee113eSDavid van Moolenbroek #include <netdb.h> 43*83ee113eSDavid van Moolenbroek #else 44*83ee113eSDavid van Moolenbroek #define fd_set cygwin_fd_set 45*83ee113eSDavid van Moolenbroek #include <sys/types.h> 46*83ee113eSDavid van Moolenbroek #endif 47*83ee113eSDavid van Moolenbroek #include <stddef.h> 48*83ee113eSDavid van Moolenbroek #include <fcntl.h> 49*83ee113eSDavid van Moolenbroek #include <stdio.h> 50*83ee113eSDavid van Moolenbroek #include <unistd.h> 51*83ee113eSDavid van Moolenbroek #include <string.h> 52*83ee113eSDavid van Moolenbroek #include <stdlib.h> 53*83ee113eSDavid van Moolenbroek #include <sys/stat.h> 54*83ee113eSDavid van Moolenbroek #include <sys/mman.h> 55*83ee113eSDavid van Moolenbroek #include <ctype.h> 56*83ee113eSDavid van Moolenbroek #include <time.h> 57*83ee113eSDavid van Moolenbroek 58*83ee113eSDavid van Moolenbroek #include <net/if.h> 59*83ee113eSDavid van Moolenbroek #undef FDDI 60*83ee113eSDavid van Moolenbroek #include <net/route.h> 61*83ee113eSDavid van Moolenbroek #include <net/if_arp.h> 62*83ee113eSDavid van Moolenbroek #if HAVE_NET_IF_DL_H 63*83ee113eSDavid van Moolenbroek # include <net/if_dl.h> 64*83ee113eSDavid van Moolenbroek #endif 65*83ee113eSDavid van Moolenbroek 66*83ee113eSDavid van Moolenbroek #include <setjmp.h> 67*83ee113eSDavid van Moolenbroek 68*83ee113eSDavid van Moolenbroek #include "cdefs.h" 69*83ee113eSDavid van Moolenbroek #include "osdep.h" 70*83ee113eSDavid van Moolenbroek 71*83ee113eSDavid van Moolenbroek #include "arpa/nameser.h" 72*83ee113eSDavid van Moolenbroek 73*83ee113eSDavid van Moolenbroek #include "minires.h" 74*83ee113eSDavid van Moolenbroek 75*83ee113eSDavid van Moolenbroek struct hash_table; 76*83ee113eSDavid van Moolenbroek typedef struct hash_table group_hash_t; 77*83ee113eSDavid van Moolenbroek typedef struct hash_table universe_hash_t; 78*83ee113eSDavid van Moolenbroek typedef struct hash_table option_name_hash_t; 79*83ee113eSDavid van Moolenbroek typedef struct hash_table option_code_hash_t; 80*83ee113eSDavid van Moolenbroek typedef struct hash_table dns_zone_hash_t; 81*83ee113eSDavid van Moolenbroek typedef struct hash_table lease_ip_hash_t; 82*83ee113eSDavid van Moolenbroek typedef struct hash_table lease_id_hash_t; 83*83ee113eSDavid van Moolenbroek typedef struct hash_table host_hash_t; 84*83ee113eSDavid van Moolenbroek typedef struct hash_table class_hash_t; 85*83ee113eSDavid van Moolenbroek 86*83ee113eSDavid van Moolenbroek typedef time_t TIME; 87*83ee113eSDavid van Moolenbroek 88*83ee113eSDavid van Moolenbroek #ifndef EOL 89*83ee113eSDavid van Moolenbroek #define EOL '\n' 90*83ee113eSDavid van Moolenbroek #endif 91*83ee113eSDavid van Moolenbroek 92*83ee113eSDavid van Moolenbroek #include <omapip/isclib.h> 93*83ee113eSDavid van Moolenbroek #include <omapip/result.h> 94*83ee113eSDavid van Moolenbroek 95*83ee113eSDavid van Moolenbroek #include "dhcp.h" 96*83ee113eSDavid van Moolenbroek #include "dhcp6.h" 97*83ee113eSDavid van Moolenbroek #include "statement.h" 98*83ee113eSDavid van Moolenbroek #include "tree.h" 99*83ee113eSDavid van Moolenbroek #include "inet.h" 100*83ee113eSDavid van Moolenbroek #include "dhctoken.h" 101*83ee113eSDavid van Moolenbroek 102*83ee113eSDavid van Moolenbroek #include <omapip/omapip_p.h> 103*83ee113eSDavid van Moolenbroek 104*83ee113eSDavid van Moolenbroek #if defined(LDAP_CONFIGURATION) 105*83ee113eSDavid van Moolenbroek # include <ldap.h> 106*83ee113eSDavid van Moolenbroek # include <sys/utsname.h> /* for uname() */ 107*83ee113eSDavid van Moolenbroek #endif 108*83ee113eSDavid van Moolenbroek 109*83ee113eSDavid van Moolenbroek #if !defined (BYTE_NAME_HASH_SIZE) 110*83ee113eSDavid van Moolenbroek # define BYTE_NAME_HASH_SIZE 401 /* Default would be ridiculous. */ 111*83ee113eSDavid van Moolenbroek #endif 112*83ee113eSDavid van Moolenbroek #if !defined (BYTE_CODE_HASH_SIZE) 113*83ee113eSDavid van Moolenbroek # define BYTE_CODE_HASH_SIZE 254 /* Default would be ridiculous. */ 114*83ee113eSDavid van Moolenbroek #endif 115*83ee113eSDavid van Moolenbroek 116*83ee113eSDavid van Moolenbroek /* Although it is highly improbable that a 16-bit option space might 117*83ee113eSDavid van Moolenbroek * actually use 2^16 actual defined options, it is the worst case 118*83ee113eSDavid van Moolenbroek * scenario we must prepare for. Having 4 options per bucket in this 119*83ee113eSDavid van Moolenbroek * case is pretty reasonable. 120*83ee113eSDavid van Moolenbroek */ 121*83ee113eSDavid van Moolenbroek #if !defined (WORD_NAME_HASH_SIZE) 122*83ee113eSDavid van Moolenbroek # define WORD_NAME_HASH_SIZE 20479 123*83ee113eSDavid van Moolenbroek #endif 124*83ee113eSDavid van Moolenbroek #if !defined (WORD_CODE_HASH_SIZE) 125*83ee113eSDavid van Moolenbroek # define WORD_CODE_HASH_SIZE 16384 126*83ee113eSDavid van Moolenbroek #endif 127*83ee113eSDavid van Moolenbroek 128*83ee113eSDavid van Moolenbroek /* Not only is it improbable that the 32-bit spaces might actually use 2^32 129*83ee113eSDavid van Moolenbroek * defined options, it is infeasible. It would be best for this kind of 130*83ee113eSDavid van Moolenbroek * space to be dynamically sized. Instead we size it at the word hash's 131*83ee113eSDavid van Moolenbroek * level. 132*83ee113eSDavid van Moolenbroek */ 133*83ee113eSDavid van Moolenbroek #if !defined (QUAD_NAME_HASH_SIZE) 134*83ee113eSDavid van Moolenbroek # define QUAD_NAME_HASH_SIZE WORD_NAME_HASH_SIZE 135*83ee113eSDavid van Moolenbroek #endif 136*83ee113eSDavid van Moolenbroek #if !defined (QUAD_CODE_HASH_SIZE) 137*83ee113eSDavid van Moolenbroek # define QUAD_CODE_HASH_SIZE WORD_CODE_HASH_SIZE 138*83ee113eSDavid van Moolenbroek #endif 139*83ee113eSDavid van Moolenbroek 140*83ee113eSDavid van Moolenbroek #if !defined (DNS_HASH_SIZE) 141*83ee113eSDavid van Moolenbroek # define DNS_HASH_SIZE 0 /* Default. */ 142*83ee113eSDavid van Moolenbroek #endif 143*83ee113eSDavid van Moolenbroek 144*83ee113eSDavid van Moolenbroek /* Default size to use for name/code hashes on user-defined option spaces. */ 145*83ee113eSDavid van Moolenbroek #if !defined (DEFAULT_SPACE_HASH_SIZE) 146*83ee113eSDavid van Moolenbroek # define DEFAULT_SPACE_HASH_SIZE 11 147*83ee113eSDavid van Moolenbroek #endif 148*83ee113eSDavid van Moolenbroek 149*83ee113eSDavid van Moolenbroek #if !defined (NWIP_HASH_SIZE) 150*83ee113eSDavid van Moolenbroek # define NWIP_HASH_SIZE 17 /* A really small table. */ 151*83ee113eSDavid van Moolenbroek #endif 152*83ee113eSDavid van Moolenbroek 153*83ee113eSDavid van Moolenbroek #if !defined (FQDN_HASH_SIZE) 154*83ee113eSDavid van Moolenbroek # define FQDN_HASH_SIZE 13 /* A ridiculously small table. */ 155*83ee113eSDavid van Moolenbroek #endif 156*83ee113eSDavid van Moolenbroek 157*83ee113eSDavid van Moolenbroek /* I really doubt a given installation is going to have more than a few 158*83ee113eSDavid van Moolenbroek * hundred vendors involved. 159*83ee113eSDavid van Moolenbroek */ 160*83ee113eSDavid van Moolenbroek #if !defined (VIVCO_HASH_SIZE) 161*83ee113eSDavid van Moolenbroek # define VIVCO_HASH_SIZE 127 162*83ee113eSDavid van Moolenbroek #endif 163*83ee113eSDavid van Moolenbroek 164*83ee113eSDavid van Moolenbroek #if !defined (VIVSO_HASH_SIZE) 165*83ee113eSDavid van Moolenbroek # define VIVSO_HASH_SIZE VIVCO_HASH_SIZE 166*83ee113eSDavid van Moolenbroek #endif 167*83ee113eSDavid van Moolenbroek 168*83ee113eSDavid van Moolenbroek #if !defined (VSIO_HASH_SIZE) 169*83ee113eSDavid van Moolenbroek # define VSIO_HASH_SIZE VIVCO_HASH_SIZE 170*83ee113eSDavid van Moolenbroek #endif 171*83ee113eSDavid van Moolenbroek 172*83ee113eSDavid van Moolenbroek #if !defined (VIV_ISC_HASH_SIZE) 173*83ee113eSDavid van Moolenbroek # define VIV_ISC_HASH_SIZE 3 /* An incredulously small table. */ 174*83ee113eSDavid van Moolenbroek #endif 175*83ee113eSDavid van Moolenbroek 176*83ee113eSDavid van Moolenbroek #if !defined (UNIVERSE_HASH_SIZE) 177*83ee113eSDavid van Moolenbroek # define UNIVERSE_HASH_SIZE 13 /* A really small table. */ 178*83ee113eSDavid van Moolenbroek #endif 179*83ee113eSDavid van Moolenbroek 180*83ee113eSDavid van Moolenbroek #if !defined (GROUP_HASH_SIZE) 181*83ee113eSDavid van Moolenbroek # define GROUP_HASH_SIZE 0 /* Default. */ 182*83ee113eSDavid van Moolenbroek #endif 183*83ee113eSDavid van Moolenbroek 184*83ee113eSDavid van Moolenbroek /* At least one person has indicated they use ~20k host records. 185*83ee113eSDavid van Moolenbroek */ 186*83ee113eSDavid van Moolenbroek #if !defined (HOST_HASH_SIZE) 187*83ee113eSDavid van Moolenbroek # define HOST_HASH_SIZE 22501 188*83ee113eSDavid van Moolenbroek #endif 189*83ee113eSDavid van Moolenbroek 190*83ee113eSDavid van Moolenbroek /* We have user reports of use of ISC DHCP numbering leases in the 200k's. 191*83ee113eSDavid van Moolenbroek * 192*83ee113eSDavid van Moolenbroek * We also have reports of folks using 10.0/8 as a dynamic range. The 193*83ee113eSDavid van Moolenbroek * following is something of a compromise between the two. At the ~2-3 194*83ee113eSDavid van Moolenbroek * hundred thousand leases, there's ~2-3 leases to search in each bucket. 195*83ee113eSDavid van Moolenbroek */ 196*83ee113eSDavid van Moolenbroek #if !defined (LEASE_HASH_SIZE) 197*83ee113eSDavid van Moolenbroek # define LEASE_HASH_SIZE 100003 198*83ee113eSDavid van Moolenbroek #endif 199*83ee113eSDavid van Moolenbroek 200*83ee113eSDavid van Moolenbroek /* It is not known what the worst case subclass hash size is. We estimate 201*83ee113eSDavid van Moolenbroek * high, I think. 202*83ee113eSDavid van Moolenbroek */ 203*83ee113eSDavid van Moolenbroek #if !defined (SCLASS_HASH_SIZE) 204*83ee113eSDavid van Moolenbroek # define SCLASS_HASH_SIZE 12007 205*83ee113eSDavid van Moolenbroek #endif 206*83ee113eSDavid van Moolenbroek 207*83ee113eSDavid van Moolenbroek #if !defined (AGENT_HASH_SIZE) 208*83ee113eSDavid van Moolenbroek # define AGENT_HASH_SIZE 11 /* A really small table. */ 209*83ee113eSDavid van Moolenbroek #endif 210*83ee113eSDavid van Moolenbroek 211*83ee113eSDavid van Moolenbroek /* The server hash size is used for both names and codes. There aren't 212*83ee113eSDavid van Moolenbroek * many (roughly 50 at the moment), so we use a smaller table. If we 213*83ee113eSDavid van Moolenbroek * use a 1:1 table size, then we get name collisions due to poor name 214*83ee113eSDavid van Moolenbroek * hashing. So we use double the space we need, which drastically 215*83ee113eSDavid van Moolenbroek * reduces collisions. 216*83ee113eSDavid van Moolenbroek */ 217*83ee113eSDavid van Moolenbroek #if !defined (SERVER_HASH_SIZE) 218*83ee113eSDavid van Moolenbroek # define SERVER_HASH_SIZE (2*(sizeof(server_options) / sizeof(struct option))) 219*83ee113eSDavid van Moolenbroek #endif 220*83ee113eSDavid van Moolenbroek 221*83ee113eSDavid van Moolenbroek 222*83ee113eSDavid van Moolenbroek /* How many options are likely to appear in a single packet? */ 223*83ee113eSDavid van Moolenbroek #if !defined (OPTION_HASH_SIZE) 224*83ee113eSDavid van Moolenbroek # define OPTION_HASH_SIZE 17 225*83ee113eSDavid van Moolenbroek # define OPTION_HASH_PTWO 32 /* Next power of two above option hash. */ 226*83ee113eSDavid van Moolenbroek # define OPTION_HASH_EXP 5 /* The exponent for that power of two. */ 227*83ee113eSDavid van Moolenbroek #endif 228*83ee113eSDavid van Moolenbroek 229*83ee113eSDavid van Moolenbroek #define compute_option_hash(x) \ 230*83ee113eSDavid van Moolenbroek (((x) & (OPTION_HASH_PTWO - 1)) + \ 231*83ee113eSDavid van Moolenbroek (((x) >> OPTION_HASH_EXP) & \ 232*83ee113eSDavid van Moolenbroek (OPTION_HASH_PTWO - 1))) % OPTION_HASH_SIZE; 233*83ee113eSDavid van Moolenbroek 234*83ee113eSDavid van Moolenbroek enum dhcp_shutdown_state { 235*83ee113eSDavid van Moolenbroek shutdown_listeners, 236*83ee113eSDavid van Moolenbroek shutdown_omapi_connections, 237*83ee113eSDavid van Moolenbroek shutdown_drop_omapi_connections, 238*83ee113eSDavid van Moolenbroek shutdown_dhcp, 239*83ee113eSDavid van Moolenbroek shutdown_done 240*83ee113eSDavid van Moolenbroek }; 241*83ee113eSDavid van Moolenbroek 242*83ee113eSDavid van Moolenbroek /* Client FQDN option, failover FQDN option, etc. */ 243*83ee113eSDavid van Moolenbroek typedef struct { 244*83ee113eSDavid van Moolenbroek u_int8_t codes [2]; 245*83ee113eSDavid van Moolenbroek unsigned length; 246*83ee113eSDavid van Moolenbroek u_int8_t *data; 247*83ee113eSDavid van Moolenbroek } ddns_fqdn_t; 248*83ee113eSDavid van Moolenbroek 249*83ee113eSDavid van Moolenbroek #include "failover.h" 250*83ee113eSDavid van Moolenbroek 251*83ee113eSDavid van Moolenbroek /* A parsing context. */ 252*83ee113eSDavid van Moolenbroek 253*83ee113eSDavid van Moolenbroek struct parse { 254*83ee113eSDavid van Moolenbroek int lexline; 255*83ee113eSDavid van Moolenbroek int lexchar; 256*83ee113eSDavid van Moolenbroek char *token_line; 257*83ee113eSDavid van Moolenbroek char *prev_line; 258*83ee113eSDavid van Moolenbroek char *cur_line; 259*83ee113eSDavid van Moolenbroek const char *tlname; 260*83ee113eSDavid van Moolenbroek int eol_token; 261*83ee113eSDavid van Moolenbroek 262*83ee113eSDavid van Moolenbroek /* 263*83ee113eSDavid van Moolenbroek * In order to give nice output when we have a parsing error 264*83ee113eSDavid van Moolenbroek * in our file, we keep track of where we are in the line so 265*83ee113eSDavid van Moolenbroek * that we can show the user. 266*83ee113eSDavid van Moolenbroek * 267*83ee113eSDavid van Moolenbroek * We need to keep track of two lines, because we can look 268*83ee113eSDavid van Moolenbroek * ahead, via the "peek" function, to the next line sometimes. 269*83ee113eSDavid van Moolenbroek * 270*83ee113eSDavid van Moolenbroek * The "line1" and "line2" variables act as buffers for this 271*83ee113eSDavid van Moolenbroek * information. The "lpos" variable tells us where we are in the 272*83ee113eSDavid van Moolenbroek * line. 273*83ee113eSDavid van Moolenbroek * 274*83ee113eSDavid van Moolenbroek * When we "put back" a character from the parsing context, we 275*83ee113eSDavid van Moolenbroek * do not want to have the character appear twice in the error 276*83ee113eSDavid van Moolenbroek * output. So, we set a flag, the "ugflag", which the 277*83ee113eSDavid van Moolenbroek * get_char() function uses to check for this condition. 278*83ee113eSDavid van Moolenbroek */ 279*83ee113eSDavid van Moolenbroek char line1 [81]; 280*83ee113eSDavid van Moolenbroek char line2 [81]; 281*83ee113eSDavid van Moolenbroek int lpos; 282*83ee113eSDavid van Moolenbroek int line; 283*83ee113eSDavid van Moolenbroek int tlpos; 284*83ee113eSDavid van Moolenbroek int tline; 285*83ee113eSDavid van Moolenbroek enum dhcp_token token; 286*83ee113eSDavid van Moolenbroek int ugflag; 287*83ee113eSDavid van Moolenbroek char *tval; 288*83ee113eSDavid van Moolenbroek int tlen; 289*83ee113eSDavid van Moolenbroek char tokbuf [1500]; 290*83ee113eSDavid van Moolenbroek 291*83ee113eSDavid van Moolenbroek int warnings_occurred; 292*83ee113eSDavid van Moolenbroek int file; 293*83ee113eSDavid van Moolenbroek char *inbuf; 294*83ee113eSDavid van Moolenbroek size_t bufix, buflen; 295*83ee113eSDavid van Moolenbroek size_t bufsiz; 296*83ee113eSDavid van Moolenbroek 297*83ee113eSDavid van Moolenbroek struct parse *saved_state; 298*83ee113eSDavid van Moolenbroek 299*83ee113eSDavid van Moolenbroek #if defined(LDAP_CONFIGURATION) 300*83ee113eSDavid van Moolenbroek /* 301*83ee113eSDavid van Moolenbroek * LDAP configuration uses a call-back to iteratively read config 302*83ee113eSDavid van Moolenbroek * off of the LDAP repository. 303*83ee113eSDavid van Moolenbroek * XXX: The token stream can not be rewound reliably, so this must 304*83ee113eSDavid van Moolenbroek * be addressed for DHCPv6 support. 305*83ee113eSDavid van Moolenbroek */ 306*83ee113eSDavid van Moolenbroek int (*read_function)(struct parse *); 307*83ee113eSDavid van Moolenbroek #endif 308*83ee113eSDavid van Moolenbroek }; 309*83ee113eSDavid van Moolenbroek 310*83ee113eSDavid van Moolenbroek /* Variable-length array of data. */ 311*83ee113eSDavid van Moolenbroek 312*83ee113eSDavid van Moolenbroek struct string_list { 313*83ee113eSDavid van Moolenbroek struct string_list *next; 314*83ee113eSDavid van Moolenbroek char string [1]; 315*83ee113eSDavid van Moolenbroek }; 316*83ee113eSDavid van Moolenbroek 317*83ee113eSDavid van Moolenbroek /* A name server, from /etc/resolv.conf. */ 318*83ee113eSDavid van Moolenbroek struct name_server { 319*83ee113eSDavid van Moolenbroek struct name_server *next; 320*83ee113eSDavid van Moolenbroek struct sockaddr_in addr; 321*83ee113eSDavid van Moolenbroek TIME rcdate; 322*83ee113eSDavid van Moolenbroek }; 323*83ee113eSDavid van Moolenbroek 324*83ee113eSDavid van Moolenbroek /* A domain search list element. */ 325*83ee113eSDavid van Moolenbroek struct domain_search_list { 326*83ee113eSDavid van Moolenbroek struct domain_search_list *next; 327*83ee113eSDavid van Moolenbroek char *domain; 328*83ee113eSDavid van Moolenbroek TIME rcdate; 329*83ee113eSDavid van Moolenbroek }; 330*83ee113eSDavid van Moolenbroek 331*83ee113eSDavid van Moolenbroek /* Option tag structures are used to build chains of option tags, for 332*83ee113eSDavid van Moolenbroek when we're sure we're not going to have enough of them to justify 333*83ee113eSDavid van Moolenbroek maintaining an array. */ 334*83ee113eSDavid van Moolenbroek 335*83ee113eSDavid van Moolenbroek struct option_tag { 336*83ee113eSDavid van Moolenbroek struct option_tag *next; 337*83ee113eSDavid van Moolenbroek u_int8_t data [1]; 338*83ee113eSDavid van Moolenbroek }; 339*83ee113eSDavid van Moolenbroek 340*83ee113eSDavid van Moolenbroek /* An agent option structure. We need a special structure for the 341*83ee113eSDavid van Moolenbroek Relay Agent Information option because if more than one appears in 342*83ee113eSDavid van Moolenbroek a message, we have to keep them separate. */ 343*83ee113eSDavid van Moolenbroek 344*83ee113eSDavid van Moolenbroek struct agent_options { 345*83ee113eSDavid van Moolenbroek struct agent_options *next; 346*83ee113eSDavid van Moolenbroek int length; 347*83ee113eSDavid van Moolenbroek struct option_tag *first; 348*83ee113eSDavid van Moolenbroek }; 349*83ee113eSDavid van Moolenbroek 350*83ee113eSDavid van Moolenbroek struct option_cache { 351*83ee113eSDavid van Moolenbroek int refcnt; 352*83ee113eSDavid van Moolenbroek struct option_cache *next; 353*83ee113eSDavid van Moolenbroek struct expression *expression; 354*83ee113eSDavid van Moolenbroek struct option *option; 355*83ee113eSDavid van Moolenbroek struct data_string data; 356*83ee113eSDavid van Moolenbroek 357*83ee113eSDavid van Moolenbroek #define OPTION_HAD_NULLS 0x00000001 358*83ee113eSDavid van Moolenbroek u_int32_t flags; 359*83ee113eSDavid van Moolenbroek }; 360*83ee113eSDavid van Moolenbroek 361*83ee113eSDavid van Moolenbroek struct option_state { 362*83ee113eSDavid van Moolenbroek int refcnt; 363*83ee113eSDavid van Moolenbroek int universe_count; 364*83ee113eSDavid van Moolenbroek int site_universe; 365*83ee113eSDavid van Moolenbroek int site_code_min; 366*83ee113eSDavid van Moolenbroek void *universes [1]; 367*83ee113eSDavid van Moolenbroek }; 368*83ee113eSDavid van Moolenbroek 369*83ee113eSDavid van Moolenbroek /* A dhcp packet and the pointers to its option values. */ 370*83ee113eSDavid van Moolenbroek struct packet { 371*83ee113eSDavid van Moolenbroek struct dhcp_packet *raw; 372*83ee113eSDavid van Moolenbroek int refcnt; 373*83ee113eSDavid van Moolenbroek unsigned packet_length; 374*83ee113eSDavid van Moolenbroek int packet_type; 375*83ee113eSDavid van Moolenbroek 376*83ee113eSDavid van Moolenbroek unsigned char dhcpv6_msg_type; /* DHCPv6 message type */ 377*83ee113eSDavid van Moolenbroek 378*83ee113eSDavid van Moolenbroek /* DHCPv6 transaction ID */ 379*83ee113eSDavid van Moolenbroek unsigned char dhcpv6_transaction_id[3]; 380*83ee113eSDavid van Moolenbroek 381*83ee113eSDavid van Moolenbroek /* DHCPv6 relay information */ 382*83ee113eSDavid van Moolenbroek unsigned char dhcpv6_hop_count; 383*83ee113eSDavid van Moolenbroek struct in6_addr dhcpv6_link_address; 384*83ee113eSDavid van Moolenbroek struct in6_addr dhcpv6_peer_address; 385*83ee113eSDavid van Moolenbroek 386*83ee113eSDavid van Moolenbroek /* DHCPv6 packet containing this one, or NULL if none */ 387*83ee113eSDavid van Moolenbroek struct packet *dhcpv6_container_packet; 388*83ee113eSDavid van Moolenbroek 389*83ee113eSDavid van Moolenbroek int options_valid; 390*83ee113eSDavid van Moolenbroek int client_port; 391*83ee113eSDavid van Moolenbroek struct iaddr client_addr; 392*83ee113eSDavid van Moolenbroek struct interface_info *interface; /* Interface on which packet 393*83ee113eSDavid van Moolenbroek was received. */ 394*83ee113eSDavid van Moolenbroek struct hardware *haddr; /* Physical link address 395*83ee113eSDavid van Moolenbroek of local sender (maybe gateway). */ 396*83ee113eSDavid van Moolenbroek 397*83ee113eSDavid van Moolenbroek /* Information for relay agent options (see 398*83ee113eSDavid van Moolenbroek draft-ietf-dhc-agent-options-xx.txt). */ 399*83ee113eSDavid van Moolenbroek u_int8_t *circuit_id; /* Circuit ID of client connection. */ 400*83ee113eSDavid van Moolenbroek int circuit_id_len; 401*83ee113eSDavid van Moolenbroek u_int8_t *remote_id; /* Remote ID of client. */ 402*83ee113eSDavid van Moolenbroek int remote_id_len; 403*83ee113eSDavid van Moolenbroek 404*83ee113eSDavid van Moolenbroek int got_requested_address; /* True if client sent the 405*83ee113eSDavid van Moolenbroek dhcp-requested-address option. */ 406*83ee113eSDavid van Moolenbroek 407*83ee113eSDavid van Moolenbroek struct shared_network *shared_network; 408*83ee113eSDavid van Moolenbroek struct option_state *options; 409*83ee113eSDavid van Moolenbroek 410*83ee113eSDavid van Moolenbroek #if !defined (PACKET_MAX_CLASSES) 411*83ee113eSDavid van Moolenbroek # define PACKET_MAX_CLASSES 5 412*83ee113eSDavid van Moolenbroek #endif 413*83ee113eSDavid van Moolenbroek int class_count; 414*83ee113eSDavid van Moolenbroek struct class *classes [PACKET_MAX_CLASSES]; 415*83ee113eSDavid van Moolenbroek 416*83ee113eSDavid van Moolenbroek int known; 417*83ee113eSDavid van Moolenbroek int authenticated; 418*83ee113eSDavid van Moolenbroek 419*83ee113eSDavid van Moolenbroek /* If we stash agent options onto the packet option state, to pretend 420*83ee113eSDavid van Moolenbroek * options we got in a previous exchange were still there, we need 421*83ee113eSDavid van Moolenbroek * to signal this in a reliable way. 422*83ee113eSDavid van Moolenbroek */ 423*83ee113eSDavid van Moolenbroek isc_boolean_t agent_options_stashed; 424*83ee113eSDavid van Moolenbroek 425*83ee113eSDavid van Moolenbroek /* 426*83ee113eSDavid van Moolenbroek * ISC_TRUE if packet received unicast (as opposed to multicast). 427*83ee113eSDavid van Moolenbroek * Only used in DHCPv6. 428*83ee113eSDavid van Moolenbroek */ 429*83ee113eSDavid van Moolenbroek isc_boolean_t unicast; 430*83ee113eSDavid van Moolenbroek }; 431*83ee113eSDavid van Moolenbroek 432*83ee113eSDavid van Moolenbroek /* 433*83ee113eSDavid van Moolenbroek * A network interface's MAC address. 434*83ee113eSDavid van Moolenbroek * 20 bytes for the hardware address 435*83ee113eSDavid van Moolenbroek * and 1 byte for the type tag 436*83ee113eSDavid van Moolenbroek */ 437*83ee113eSDavid van Moolenbroek 438*83ee113eSDavid van Moolenbroek #define HARDWARE_ADDR_LEN 20 439*83ee113eSDavid van Moolenbroek 440*83ee113eSDavid van Moolenbroek struct hardware { 441*83ee113eSDavid van Moolenbroek u_int8_t hlen; 442*83ee113eSDavid van Moolenbroek u_int8_t hbuf[HARDWARE_ADDR_LEN + 1]; 443*83ee113eSDavid van Moolenbroek }; 444*83ee113eSDavid van Moolenbroek 445*83ee113eSDavid van Moolenbroek #if defined(LDAP_CONFIGURATION) 446*83ee113eSDavid van Moolenbroek # define LDAP_BUFFER_SIZE 8192 447*83ee113eSDavid van Moolenbroek # define LDAP_METHOD_STATIC 0 448*83ee113eSDavid van Moolenbroek # define LDAP_METHOD_DYNAMIC 1 449*83ee113eSDavid van Moolenbroek #if defined (LDAP_USE_SSL) 450*83ee113eSDavid van Moolenbroek # define LDAP_SSL_OFF 0 451*83ee113eSDavid van Moolenbroek # define LDAP_SSL_ON 1 452*83ee113eSDavid van Moolenbroek # define LDAP_SSL_TLS 2 453*83ee113eSDavid van Moolenbroek # define LDAP_SSL_LDAPS 3 454*83ee113eSDavid van Moolenbroek #endif 455*83ee113eSDavid van Moolenbroek 456*83ee113eSDavid van Moolenbroek /* This is a tree of the current configuration we are building from LDAP */ 457*83ee113eSDavid van Moolenbroek struct ldap_config_stack { 458*83ee113eSDavid van Moolenbroek LDAPMessage * res; /* Pointer returned from ldap_search */ 459*83ee113eSDavid van Moolenbroek LDAPMessage * ldent; /* Current item in LDAP that we're processing. 460*83ee113eSDavid van Moolenbroek in res */ 461*83ee113eSDavid van Moolenbroek int close_brace; /* Put a closing } after we're through with 462*83ee113eSDavid van Moolenbroek this item */ 463*83ee113eSDavid van Moolenbroek int processed; /* We set this flag if this base item has been 464*83ee113eSDavid van Moolenbroek processed. After this base item is processed, 465*83ee113eSDavid van Moolenbroek we can start processing the children */ 466*83ee113eSDavid van Moolenbroek struct ldap_config_stack *children; 467*83ee113eSDavid van Moolenbroek struct ldap_config_stack *next; 468*83ee113eSDavid van Moolenbroek }; 469*83ee113eSDavid van Moolenbroek #endif 470*83ee113eSDavid van Moolenbroek 471*83ee113eSDavid van Moolenbroek typedef enum { 472*83ee113eSDavid van Moolenbroek server_startup = 0, 473*83ee113eSDavid van Moolenbroek server_running = 1, 474*83ee113eSDavid van Moolenbroek server_shutdown = 2, 475*83ee113eSDavid van Moolenbroek server_hibernate = 3, 476*83ee113eSDavid van Moolenbroek server_awaken = 4 477*83ee113eSDavid van Moolenbroek } control_object_state_t; 478*83ee113eSDavid van Moolenbroek 479*83ee113eSDavid van Moolenbroek typedef struct { 480*83ee113eSDavid van Moolenbroek OMAPI_OBJECT_PREAMBLE; 481*83ee113eSDavid van Moolenbroek control_object_state_t state; 482*83ee113eSDavid van Moolenbroek } dhcp_control_object_t; 483*83ee113eSDavid van Moolenbroek 484*83ee113eSDavid van Moolenbroek /* Lease states: */ 485*83ee113eSDavid van Moolenbroek #define FTS_FREE 1 486*83ee113eSDavid van Moolenbroek #define FTS_ACTIVE 2 487*83ee113eSDavid van Moolenbroek #define FTS_EXPIRED 3 488*83ee113eSDavid van Moolenbroek #define FTS_RELEASED 4 489*83ee113eSDavid van Moolenbroek #define FTS_ABANDONED 5 490*83ee113eSDavid van Moolenbroek #define FTS_RESET 6 491*83ee113eSDavid van Moolenbroek #define FTS_BACKUP 7 492*83ee113eSDavid van Moolenbroek typedef u_int8_t binding_state_t; 493*83ee113eSDavid van Moolenbroek 494*83ee113eSDavid van Moolenbroek /* FTS_LAST is the highest value that is valid for a lease binding state. */ 495*83ee113eSDavid van Moolenbroek #define FTS_LAST FTS_BACKUP 496*83ee113eSDavid van Moolenbroek 497*83ee113eSDavid van Moolenbroek /* 498*83ee113eSDavid van Moolenbroek * A block for the on statements so we can share the structure 499*83ee113eSDavid van Moolenbroek * between v4 and v6 500*83ee113eSDavid van Moolenbroek */ 501*83ee113eSDavid van Moolenbroek struct on_star { 502*83ee113eSDavid van Moolenbroek struct executable_statement *on_expiry; 503*83ee113eSDavid van Moolenbroek struct executable_statement *on_commit; 504*83ee113eSDavid van Moolenbroek struct executable_statement *on_release; 505*83ee113eSDavid van Moolenbroek }; 506*83ee113eSDavid van Moolenbroek 507*83ee113eSDavid van Moolenbroek /* A dhcp lease declaration structure. */ 508*83ee113eSDavid van Moolenbroek struct lease { 509*83ee113eSDavid van Moolenbroek OMAPI_OBJECT_PREAMBLE; 510*83ee113eSDavid van Moolenbroek struct lease *next; 511*83ee113eSDavid van Moolenbroek struct lease *n_uid, *n_hw; 512*83ee113eSDavid van Moolenbroek 513*83ee113eSDavid van Moolenbroek struct iaddr ip_addr; 514*83ee113eSDavid van Moolenbroek TIME starts, ends, sort_time; 515*83ee113eSDavid van Moolenbroek char *client_hostname; 516*83ee113eSDavid van Moolenbroek struct binding_scope *scope; 517*83ee113eSDavid van Moolenbroek struct host_decl *host; 518*83ee113eSDavid van Moolenbroek struct subnet *subnet; 519*83ee113eSDavid van Moolenbroek struct pool *pool; 520*83ee113eSDavid van Moolenbroek struct class *billing_class; 521*83ee113eSDavid van Moolenbroek struct option_chain_head *agent_options; 522*83ee113eSDavid van Moolenbroek 523*83ee113eSDavid van Moolenbroek /* insert the structure directly */ 524*83ee113eSDavid van Moolenbroek struct on_star on_star; 525*83ee113eSDavid van Moolenbroek 526*83ee113eSDavid van Moolenbroek unsigned char *uid; 527*83ee113eSDavid van Moolenbroek unsigned short uid_len; 528*83ee113eSDavid van Moolenbroek unsigned short uid_max; 529*83ee113eSDavid van Moolenbroek unsigned char uid_buf [7]; 530*83ee113eSDavid van Moolenbroek struct hardware hardware_addr; 531*83ee113eSDavid van Moolenbroek 532*83ee113eSDavid van Moolenbroek u_int8_t flags; 533*83ee113eSDavid van Moolenbroek # define STATIC_LEASE 1 534*83ee113eSDavid van Moolenbroek # define BOOTP_LEASE 2 535*83ee113eSDavid van Moolenbroek # define RESERVED_LEASE 4 536*83ee113eSDavid van Moolenbroek # define MS_NULL_TERMINATION 8 537*83ee113eSDavid van Moolenbroek # define ON_UPDATE_QUEUE 16 538*83ee113eSDavid van Moolenbroek # define ON_ACK_QUEUE 32 539*83ee113eSDavid van Moolenbroek # define ON_QUEUE (ON_UPDATE_QUEUE | ON_ACK_QUEUE) 540*83ee113eSDavid van Moolenbroek # define UNICAST_BROADCAST_HACK 64 541*83ee113eSDavid van Moolenbroek # define ON_DEFERRED_QUEUE 128 542*83ee113eSDavid van Moolenbroek 543*83ee113eSDavid van Moolenbroek /* Persistent flags are to be preserved on a given lease structure. */ 544*83ee113eSDavid van Moolenbroek # define PERSISTENT_FLAGS (ON_ACK_QUEUE | ON_UPDATE_QUEUE) 545*83ee113eSDavid van Moolenbroek /* Ephemeral flags are to be preserved on a given lease (copied etc). */ 546*83ee113eSDavid van Moolenbroek # define EPHEMERAL_FLAGS (MS_NULL_TERMINATION | \ 547*83ee113eSDavid van Moolenbroek UNICAST_BROADCAST_HACK | \ 548*83ee113eSDavid van Moolenbroek RESERVED_LEASE | \ 549*83ee113eSDavid van Moolenbroek BOOTP_LEASE) 550*83ee113eSDavid van Moolenbroek 551*83ee113eSDavid van Moolenbroek /* 552*83ee113eSDavid van Moolenbroek * The lease's binding state is its current state. The next binding 553*83ee113eSDavid van Moolenbroek * state is the next state this lease will move into by expiration, 554*83ee113eSDavid van Moolenbroek * or timers in general. The desired binding state is used on lease 555*83ee113eSDavid van Moolenbroek * updates; the caller is attempting to move the lease to the desired 556*83ee113eSDavid van Moolenbroek * binding state (and this may either succeed or fail, so the binding 557*83ee113eSDavid van Moolenbroek * state must be preserved). 558*83ee113eSDavid van Moolenbroek * 559*83ee113eSDavid van Moolenbroek * The 'rewind' binding state is used in failover processing. It 560*83ee113eSDavid van Moolenbroek * is used for an optimization when out of communications; it allows 561*83ee113eSDavid van Moolenbroek * the server to "rewind" a lease to the previous state acknowledged 562*83ee113eSDavid van Moolenbroek * by the peer, and progress forward from that point. 563*83ee113eSDavid van Moolenbroek */ 564*83ee113eSDavid van Moolenbroek binding_state_t binding_state; 565*83ee113eSDavid van Moolenbroek binding_state_t next_binding_state; 566*83ee113eSDavid van Moolenbroek binding_state_t desired_binding_state; 567*83ee113eSDavid van Moolenbroek binding_state_t rewind_binding_state; 568*83ee113eSDavid van Moolenbroek 569*83ee113eSDavid van Moolenbroek struct lease_state *state; 570*83ee113eSDavid van Moolenbroek 571*83ee113eSDavid van Moolenbroek /* 572*83ee113eSDavid van Moolenbroek * 'tsfp' is more of an 'effective' tsfp. It may be calculated from 573*83ee113eSDavid van Moolenbroek * stos+mclt for example if it's an expired lease and the server is 574*83ee113eSDavid van Moolenbroek * in partner-down state. 'atsfp' is zeroed whenever a lease is 575*83ee113eSDavid van Moolenbroek * updated - and only set when the peer acknowledges it. This 576*83ee113eSDavid van Moolenbroek * ensures every state change is transmitted. 577*83ee113eSDavid van Moolenbroek */ 578*83ee113eSDavid van Moolenbroek TIME tstp; /* Time sent to partner. */ 579*83ee113eSDavid van Moolenbroek TIME tsfp; /* Time sent from partner. */ 580*83ee113eSDavid van Moolenbroek TIME atsfp; /* Actual time sent from partner. */ 581*83ee113eSDavid van Moolenbroek TIME cltt; /* Client last transaction time. */ 582*83ee113eSDavid van Moolenbroek u_int32_t last_xid; /* XID we sent in this lease's BNDUPD */ 583*83ee113eSDavid van Moolenbroek struct lease *next_pending; 584*83ee113eSDavid van Moolenbroek 585*83ee113eSDavid van Moolenbroek /* 586*83ee113eSDavid van Moolenbroek * A pointer to the state of the ddns update for this lease. 587*83ee113eSDavid van Moolenbroek * It should be set while the update is in progress and cleared 588*83ee113eSDavid van Moolenbroek * when the update finishes. It can be used to cancel the 589*83ee113eSDavid van Moolenbroek * update if we want to do a different update. 590*83ee113eSDavid van Moolenbroek */ 591*83ee113eSDavid van Moolenbroek struct dhcp_ddns_cb *ddns_cb; 592*83ee113eSDavid van Moolenbroek }; 593*83ee113eSDavid van Moolenbroek 594*83ee113eSDavid van Moolenbroek struct lease_state { 595*83ee113eSDavid van Moolenbroek struct lease_state *next; 596*83ee113eSDavid van Moolenbroek 597*83ee113eSDavid van Moolenbroek struct interface_info *ip; 598*83ee113eSDavid van Moolenbroek 599*83ee113eSDavid van Moolenbroek struct packet *packet; /* The incoming packet. */ 600*83ee113eSDavid van Moolenbroek 601*83ee113eSDavid van Moolenbroek TIME offered_expiry; 602*83ee113eSDavid van Moolenbroek 603*83ee113eSDavid van Moolenbroek struct option_state *options; 604*83ee113eSDavid van Moolenbroek struct data_string parameter_request_list; 605*83ee113eSDavid van Moolenbroek int max_message_size; 606*83ee113eSDavid van Moolenbroek unsigned char expiry[4], renewal[4], rebind[4]; 607*83ee113eSDavid van Moolenbroek struct data_string filename, server_name; 608*83ee113eSDavid van Moolenbroek int got_requested_address; 609*83ee113eSDavid van Moolenbroek int got_server_identifier; 610*83ee113eSDavid van Moolenbroek struct shared_network *shared_network; /* Shared network of interface 611*83ee113eSDavid van Moolenbroek on which request arrived. */ 612*83ee113eSDavid van Moolenbroek 613*83ee113eSDavid van Moolenbroek u_int32_t xid; 614*83ee113eSDavid van Moolenbroek u_int16_t secs; 615*83ee113eSDavid van Moolenbroek u_int16_t bootp_flags; 616*83ee113eSDavid van Moolenbroek struct in_addr ciaddr; 617*83ee113eSDavid van Moolenbroek struct in_addr siaddr; 618*83ee113eSDavid van Moolenbroek struct in_addr giaddr; 619*83ee113eSDavid van Moolenbroek u_int8_t hops; 620*83ee113eSDavid van Moolenbroek u_int8_t offer; 621*83ee113eSDavid van Moolenbroek struct iaddr from; 622*83ee113eSDavid van Moolenbroek }; 623*83ee113eSDavid van Moolenbroek 624*83ee113eSDavid van Moolenbroek #define ROOT_GROUP 0 625*83ee113eSDavid van Moolenbroek #define HOST_DECL 1 626*83ee113eSDavid van Moolenbroek #define SHARED_NET_DECL 2 627*83ee113eSDavid van Moolenbroek #define SUBNET_DECL 3 628*83ee113eSDavid van Moolenbroek #define CLASS_DECL 4 629*83ee113eSDavid van Moolenbroek #define GROUP_DECL 5 630*83ee113eSDavid van Moolenbroek #define POOL_DECL 6 631*83ee113eSDavid van Moolenbroek 632*83ee113eSDavid van Moolenbroek /* Possible modes in which discover_interfaces can run. */ 633*83ee113eSDavid van Moolenbroek 634*83ee113eSDavid van Moolenbroek #define DISCOVER_RUNNING 0 635*83ee113eSDavid van Moolenbroek #define DISCOVER_SERVER 1 636*83ee113eSDavid van Moolenbroek #define DISCOVER_UNCONFIGURED 2 637*83ee113eSDavid van Moolenbroek #define DISCOVER_RELAY 3 638*83ee113eSDavid van Moolenbroek #define DISCOVER_REQUESTED 4 639*83ee113eSDavid van Moolenbroek 640*83ee113eSDavid van Moolenbroek /* DDNS_UPDATE_STYLE enumerations. */ 641*83ee113eSDavid van Moolenbroek #define DDNS_UPDATE_STYLE_NONE 0 642*83ee113eSDavid van Moolenbroek #define DDNS_UPDATE_STYLE_AD_HOC 1 643*83ee113eSDavid van Moolenbroek #define DDNS_UPDATE_STYLE_INTERIM 2 644*83ee113eSDavid van Moolenbroek #define DDNS_UPDATE_STYLE_STANDARD 3 645*83ee113eSDavid van Moolenbroek 646*83ee113eSDavid van Moolenbroek /* Server option names. */ 647*83ee113eSDavid van Moolenbroek 648*83ee113eSDavid van Moolenbroek #define SV_DEFAULT_LEASE_TIME 1 649*83ee113eSDavid van Moolenbroek #define SV_MAX_LEASE_TIME 2 650*83ee113eSDavid van Moolenbroek #define SV_MIN_LEASE_TIME 3 651*83ee113eSDavid van Moolenbroek #define SV_BOOTP_LEASE_CUTOFF 4 652*83ee113eSDavid van Moolenbroek #define SV_BOOTP_LEASE_LENGTH 5 653*83ee113eSDavid van Moolenbroek #define SV_BOOT_UNKNOWN_CLIENTS 6 654*83ee113eSDavid van Moolenbroek #define SV_DYNAMIC_BOOTP 7 655*83ee113eSDavid van Moolenbroek #define SV_ALLOW_BOOTP 8 656*83ee113eSDavid van Moolenbroek #define SV_ALLOW_BOOTING 9 657*83ee113eSDavid van Moolenbroek #define SV_ONE_LEASE_PER_CLIENT 10 658*83ee113eSDavid van Moolenbroek #define SV_GET_LEASE_HOSTNAMES 11 659*83ee113eSDavid van Moolenbroek #define SV_USE_HOST_DECL_NAMES 12 660*83ee113eSDavid van Moolenbroek #define SV_USE_LEASE_ADDR_FOR_DEFAULT_ROUTE 13 661*83ee113eSDavid van Moolenbroek #define SV_MIN_SECS 14 662*83ee113eSDavid van Moolenbroek #define SV_FILENAME 15 663*83ee113eSDavid van Moolenbroek #define SV_SERVER_NAME 16 664*83ee113eSDavid van Moolenbroek #define SV_NEXT_SERVER 17 665*83ee113eSDavid van Moolenbroek #define SV_AUTHORITATIVE 18 666*83ee113eSDavid van Moolenbroek #define SV_VENDOR_OPTION_SPACE 19 667*83ee113eSDavid van Moolenbroek #define SV_ALWAYS_REPLY_RFC1048 20 668*83ee113eSDavid van Moolenbroek #define SV_SITE_OPTION_SPACE 21 669*83ee113eSDavid van Moolenbroek #define SV_ALWAYS_BROADCAST 22 670*83ee113eSDavid van Moolenbroek #define SV_DDNS_DOMAIN_NAME 23 671*83ee113eSDavid van Moolenbroek #define SV_DDNS_HOST_NAME 24 672*83ee113eSDavid van Moolenbroek #define SV_DDNS_REV_DOMAIN_NAME 25 673*83ee113eSDavid van Moolenbroek #define SV_LEASE_FILE_NAME 26 674*83ee113eSDavid van Moolenbroek #define SV_PID_FILE_NAME 27 675*83ee113eSDavid van Moolenbroek #define SV_DUPLICATES 28 676*83ee113eSDavid van Moolenbroek #define SV_DECLINES 29 677*83ee113eSDavid van Moolenbroek #define SV_DDNS_UPDATES 30 678*83ee113eSDavid van Moolenbroek #define SV_OMAPI_PORT 31 679*83ee113eSDavid van Moolenbroek #define SV_LOCAL_PORT 32 680*83ee113eSDavid van Moolenbroek #define SV_LIMITED_BROADCAST_ADDRESS 33 681*83ee113eSDavid van Moolenbroek #define SV_REMOTE_PORT 34 682*83ee113eSDavid van Moolenbroek #define SV_LOCAL_ADDRESS 35 683*83ee113eSDavid van Moolenbroek #define SV_OMAPI_KEY 36 684*83ee113eSDavid van Moolenbroek #define SV_STASH_AGENT_OPTIONS 37 685*83ee113eSDavid van Moolenbroek #define SV_DDNS_TTL 38 686*83ee113eSDavid van Moolenbroek #define SV_DDNS_UPDATE_STYLE 39 687*83ee113eSDavid van Moolenbroek #define SV_CLIENT_UPDATES 40 688*83ee113eSDavid van Moolenbroek #define SV_UPDATE_OPTIMIZATION 41 689*83ee113eSDavid van Moolenbroek #define SV_PING_CHECKS 42 690*83ee113eSDavid van Moolenbroek #define SV_UPDATE_STATIC_LEASES 43 691*83ee113eSDavid van Moolenbroek #define SV_LOG_FACILITY 44 692*83ee113eSDavid van Moolenbroek #define SV_DO_FORWARD_UPDATES 45 693*83ee113eSDavid van Moolenbroek #define SV_PING_TIMEOUT 46 694*83ee113eSDavid van Moolenbroek #define SV_RESERVE_INFINITE 47 695*83ee113eSDavid van Moolenbroek #define SV_DDNS_CONFLICT_DETECT 48 696*83ee113eSDavid van Moolenbroek #define SV_LEASEQUERY 49 697*83ee113eSDavid van Moolenbroek #define SV_ADAPTIVE_LEASE_TIME_THRESHOLD 50 698*83ee113eSDavid van Moolenbroek #define SV_DO_REVERSE_UPDATES 51 699*83ee113eSDavid van Moolenbroek #define SV_FQDN_REPLY 52 700*83ee113eSDavid van Moolenbroek #define SV_PREFER_LIFETIME 53 701*83ee113eSDavid van Moolenbroek #define SV_DHCPV6_LEASE_FILE_NAME 54 702*83ee113eSDavid van Moolenbroek #define SV_DHCPV6_PID_FILE_NAME 55 703*83ee113eSDavid van Moolenbroek #define SV_LIMIT_ADDRS_PER_IA 56 704*83ee113eSDavid van Moolenbroek #define SV_LIMIT_PREFS_PER_IA 57 705*83ee113eSDavid van Moolenbroek #define SV_DELAYED_ACK 58 706*83ee113eSDavid van Moolenbroek #define SV_MAX_ACK_DELAY 59 707*83ee113eSDavid van Moolenbroek #if defined(LDAP_CONFIGURATION) 708*83ee113eSDavid van Moolenbroek # define SV_LDAP_SERVER 60 709*83ee113eSDavid van Moolenbroek # define SV_LDAP_PORT 61 710*83ee113eSDavid van Moolenbroek # define SV_LDAP_USERNAME 62 711*83ee113eSDavid van Moolenbroek # define SV_LDAP_PASSWORD 63 712*83ee113eSDavid van Moolenbroek # define SV_LDAP_BASE_DN 64 713*83ee113eSDavid van Moolenbroek # define SV_LDAP_METHOD 65 714*83ee113eSDavid van Moolenbroek # define SV_LDAP_DEBUG_FILE 66 715*83ee113eSDavid van Moolenbroek # define SV_LDAP_DHCP_SERVER_CN 67 716*83ee113eSDavid van Moolenbroek # define SV_LDAP_REFERRALS 68 717*83ee113eSDavid van Moolenbroek #if defined (LDAP_USE_SSL) 718*83ee113eSDavid van Moolenbroek # define SV_LDAP_SSL 69 719*83ee113eSDavid van Moolenbroek # define SV_LDAP_TLS_REQCERT 70 720*83ee113eSDavid van Moolenbroek # define SV_LDAP_TLS_CA_FILE 71 721*83ee113eSDavid van Moolenbroek # define SV_LDAP_TLS_CA_DIR 72 722*83ee113eSDavid van Moolenbroek # define SV_LDAP_TLS_CERT 73 723*83ee113eSDavid van Moolenbroek # define SV_LDAP_TLS_KEY 74 724*83ee113eSDavid van Moolenbroek # define SV_LDAP_TLS_CRLCHECK 75 725*83ee113eSDavid van Moolenbroek # define SV_LDAP_TLS_CIPHERS 76 726*83ee113eSDavid van Moolenbroek # define SV_LDAP_TLS_RANDFILE 77 727*83ee113eSDavid van Moolenbroek #endif 728*83ee113eSDavid van Moolenbroek #endif 729*83ee113eSDavid van Moolenbroek #define SV_CACHE_THRESHOLD 78 730*83ee113eSDavid van Moolenbroek #define SV_DONT_USE_FSYNC 79 731*83ee113eSDavid van Moolenbroek #define SV_DDNS_LOCAL_ADDRESS4 80 732*83ee113eSDavid van Moolenbroek #define SV_DDNS_LOCAL_ADDRESS6 81 733*83ee113eSDavid van Moolenbroek #define SV_IGNORE_CLIENT_UIDS 82 734*83ee113eSDavid van Moolenbroek 735*83ee113eSDavid van Moolenbroek #if !defined (DEFAULT_PING_TIMEOUT) 736*83ee113eSDavid van Moolenbroek # define DEFAULT_PING_TIMEOUT 1 737*83ee113eSDavid van Moolenbroek #endif 738*83ee113eSDavid van Moolenbroek 739*83ee113eSDavid van Moolenbroek #if !defined (DEFAULT_DELAYED_ACK) 740*83ee113eSDavid van Moolenbroek # define DEFAULT_DELAYED_ACK 28 /* default SO_SNDBUF size / 576 bytes */ 741*83ee113eSDavid van Moolenbroek #endif 742*83ee113eSDavid van Moolenbroek 743*83ee113eSDavid van Moolenbroek #if !defined (DEFAULT_ACK_DELAY_SECS) 744*83ee113eSDavid van Moolenbroek # define DEFAULT_ACK_DELAY_SECS 0 745*83ee113eSDavid van Moolenbroek #endif 746*83ee113eSDavid van Moolenbroek 747*83ee113eSDavid van Moolenbroek #if !defined (DEFAULT_ACK_DELAY_USECS) 748*83ee113eSDavid van Moolenbroek # define DEFAULT_ACK_DELAY_USECS 250000 /* 1/4 of a second */ 749*83ee113eSDavid van Moolenbroek #endif 750*83ee113eSDavid van Moolenbroek 751*83ee113eSDavid van Moolenbroek #if !defined (DEFAULT_MIN_ACK_DELAY_USECS) 752*83ee113eSDavid van Moolenbroek # define DEFAULT_MIN_ACK_DELAY_USECS 10000 /* 1/100 second */ 753*83ee113eSDavid van Moolenbroek #endif 754*83ee113eSDavid van Moolenbroek 755*83ee113eSDavid van Moolenbroek #if !defined (DEFAULT_CACHE_THRESHOLD) 756*83ee113eSDavid van Moolenbroek # define DEFAULT_CACHE_THRESHOLD 25 757*83ee113eSDavid van Moolenbroek #endif 758*83ee113eSDavid van Moolenbroek 759*83ee113eSDavid van Moolenbroek #if !defined (DEFAULT_DEFAULT_LEASE_TIME) 760*83ee113eSDavid van Moolenbroek # define DEFAULT_DEFAULT_LEASE_TIME 43200 761*83ee113eSDavid van Moolenbroek #endif 762*83ee113eSDavid van Moolenbroek 763*83ee113eSDavid van Moolenbroek #if !defined (DEFAULT_MIN_LEASE_TIME) 764*83ee113eSDavid van Moolenbroek # define DEFAULT_MIN_LEASE_TIME 300 765*83ee113eSDavid van Moolenbroek #endif 766*83ee113eSDavid van Moolenbroek 767*83ee113eSDavid van Moolenbroek #if !defined (DEFAULT_MAX_LEASE_TIME) 768*83ee113eSDavid van Moolenbroek # define DEFAULT_MAX_LEASE_TIME 86400 769*83ee113eSDavid van Moolenbroek #endif 770*83ee113eSDavid van Moolenbroek 771*83ee113eSDavid van Moolenbroek #if !defined (DEFAULT_DDNS_TTL) 772*83ee113eSDavid van Moolenbroek # define DEFAULT_DDNS_TTL 3600 773*83ee113eSDavid van Moolenbroek #endif 774*83ee113eSDavid van Moolenbroek #if !defined (MAX_DEFAULT_DDNS_TTL) 775*83ee113eSDavid van Moolenbroek # define MAX_DEFAULT_DDNS_TTL 3600 776*83ee113eSDavid van Moolenbroek #endif 777*83ee113eSDavid van Moolenbroek 778*83ee113eSDavid van Moolenbroek #if !defined (MIN_LEASE_WRITE) 779*83ee113eSDavid van Moolenbroek # define MIN_LEASE_WRITE 15 780*83ee113eSDavid van Moolenbroek #endif 781*83ee113eSDavid van Moolenbroek 782*83ee113eSDavid van Moolenbroek /* Client option names */ 783*83ee113eSDavid van Moolenbroek 784*83ee113eSDavid van Moolenbroek #define CL_TIMEOUT 1 785*83ee113eSDavid van Moolenbroek #define CL_SELECT_INTERVAL 2 786*83ee113eSDavid van Moolenbroek #define CL_REBOOT_TIMEOUT 3 787*83ee113eSDavid van Moolenbroek #define CL_RETRY_INTERVAL 4 788*83ee113eSDavid van Moolenbroek #define CL_BACKOFF_CUTOFF 5 789*83ee113eSDavid van Moolenbroek #define CL_INITIAL_INTERVAL 6 790*83ee113eSDavid van Moolenbroek #define CL_BOOTP_POLICY 7 791*83ee113eSDavid van Moolenbroek #define CL_SCRIPT_NAME 8 792*83ee113eSDavid van Moolenbroek #define CL_REQUESTED_OPTIONS 9 793*83ee113eSDavid van Moolenbroek #define CL_REQUESTED_LEASE_TIME 10 794*83ee113eSDavid van Moolenbroek #define CL_SEND_OPTIONS 11 795*83ee113eSDavid van Moolenbroek #define CL_MEDIA 12 796*83ee113eSDavid van Moolenbroek #define CL_REJECT_LIST 13 797*83ee113eSDavid van Moolenbroek 798*83ee113eSDavid van Moolenbroek #ifndef CL_DEFAULT_TIMEOUT 799*83ee113eSDavid van Moolenbroek # define CL_DEFAULT_TIMEOUT 60 800*83ee113eSDavid van Moolenbroek #endif 801*83ee113eSDavid van Moolenbroek 802*83ee113eSDavid van Moolenbroek #ifndef CL_DEFAULT_SELECT_INTERVAL 803*83ee113eSDavid van Moolenbroek # define CL_DEFAULT_SELECT_INTERVAL 0 804*83ee113eSDavid van Moolenbroek #endif 805*83ee113eSDavid van Moolenbroek 806*83ee113eSDavid van Moolenbroek #ifndef CL_DEFAULT_REBOOT_TIMEOUT 807*83ee113eSDavid van Moolenbroek # define CL_DEFAULT_REBOOT_TIMEOUT 10 808*83ee113eSDavid van Moolenbroek #endif 809*83ee113eSDavid van Moolenbroek 810*83ee113eSDavid van Moolenbroek #ifndef CL_DEFAULT_RETRY_INTERVAL 811*83ee113eSDavid van Moolenbroek # define CL_DEFAULT_RETRY_INTERVAL 300 812*83ee113eSDavid van Moolenbroek #endif 813*83ee113eSDavid van Moolenbroek 814*83ee113eSDavid van Moolenbroek #ifndef CL_DEFAULT_BACKOFF_CUTOFF 815*83ee113eSDavid van Moolenbroek # define CL_DEFAULT_BACKOFF_CUTOFF 120 816*83ee113eSDavid van Moolenbroek #endif 817*83ee113eSDavid van Moolenbroek 818*83ee113eSDavid van Moolenbroek #ifndef CL_DEFAULT_INITIAL_INTERVAL 819*83ee113eSDavid van Moolenbroek # define CL_DEFAULT_INITIAL_INTERVAL 10 820*83ee113eSDavid van Moolenbroek #endif 821*83ee113eSDavid van Moolenbroek 822*83ee113eSDavid van Moolenbroek #ifndef CL_DEFAULT_BOOTP_POLICY 823*83ee113eSDavid van Moolenbroek # define CL_DEFAULT_BOOTP_POLICY P_ACCEPT 824*83ee113eSDavid van Moolenbroek #endif 825*83ee113eSDavid van Moolenbroek 826*83ee113eSDavid van Moolenbroek #ifndef CL_DEFAULT_REQUESTED_OPTIONS 827*83ee113eSDavid van Moolenbroek # define CL_DEFAULT_REQUESTED_OPTIONS \ 828*83ee113eSDavid van Moolenbroek { DHO_SUBNET_MASK, \ 829*83ee113eSDavid van Moolenbroek DHO_BROADCAST_ADDRESS, \ 830*83ee113eSDavid van Moolenbroek DHO_TIME_OFFSET, \ 831*83ee113eSDavid van Moolenbroek DHO_ROUTERS, \ 832*83ee113eSDavid van Moolenbroek DHO_DOMAIN_NAME, \ 833*83ee113eSDavid van Moolenbroek DHO_DOMAIN_NAME_SERVERS, \ 834*83ee113eSDavid van Moolenbroek DHO_HOST_NAME } 835*83ee113eSDavid van Moolenbroek #endif 836*83ee113eSDavid van Moolenbroek 837*83ee113eSDavid van Moolenbroek struct group_object { 838*83ee113eSDavid van Moolenbroek OMAPI_OBJECT_PREAMBLE; 839*83ee113eSDavid van Moolenbroek 840*83ee113eSDavid van Moolenbroek struct group_object *n_dynamic; 841*83ee113eSDavid van Moolenbroek struct group *group; 842*83ee113eSDavid van Moolenbroek char *name; 843*83ee113eSDavid van Moolenbroek int flags; 844*83ee113eSDavid van Moolenbroek #define GROUP_OBJECT_DELETED 1 845*83ee113eSDavid van Moolenbroek #define GROUP_OBJECT_DYNAMIC 2 846*83ee113eSDavid van Moolenbroek #define GROUP_OBJECT_STATIC 4 847*83ee113eSDavid van Moolenbroek }; 848*83ee113eSDavid van Moolenbroek 849*83ee113eSDavid van Moolenbroek /* Group of declarations that share common parameters. */ 850*83ee113eSDavid van Moolenbroek struct group { 851*83ee113eSDavid van Moolenbroek struct group *next; 852*83ee113eSDavid van Moolenbroek 853*83ee113eSDavid van Moolenbroek int refcnt; 854*83ee113eSDavid van Moolenbroek struct group_object *object; 855*83ee113eSDavid van Moolenbroek struct subnet *subnet; 856*83ee113eSDavid van Moolenbroek struct shared_network *shared_network; 857*83ee113eSDavid van Moolenbroek int authoritative; 858*83ee113eSDavid van Moolenbroek struct executable_statement *statements; 859*83ee113eSDavid van Moolenbroek }; 860*83ee113eSDavid van Moolenbroek 861*83ee113eSDavid van Moolenbroek /* A dhcp host declaration structure. */ 862*83ee113eSDavid van Moolenbroek struct host_decl { 863*83ee113eSDavid van Moolenbroek OMAPI_OBJECT_PREAMBLE; 864*83ee113eSDavid van Moolenbroek struct host_decl *n_ipaddr; 865*83ee113eSDavid van Moolenbroek struct host_decl *n_dynamic; 866*83ee113eSDavid van Moolenbroek char *name; 867*83ee113eSDavid van Moolenbroek struct hardware interface; 868*83ee113eSDavid van Moolenbroek struct data_string client_identifier; 869*83ee113eSDavid van Moolenbroek struct option *host_id_option; 870*83ee113eSDavid van Moolenbroek struct data_string host_id; 871*83ee113eSDavid van Moolenbroek /* XXXSK: fixed_addr should be an array of iaddr values, 872*83ee113eSDavid van Moolenbroek not an option_cache, but it's referenced in a lot of 873*83ee113eSDavid van Moolenbroek places, so we'll leave it for now. */ 874*83ee113eSDavid van Moolenbroek struct option_cache *fixed_addr; 875*83ee113eSDavid van Moolenbroek struct iaddrcidrnetlist *fixed_prefix; 876*83ee113eSDavid van Moolenbroek struct group *group; 877*83ee113eSDavid van Moolenbroek struct group_object *named_group; 878*83ee113eSDavid van Moolenbroek struct data_string auth_key_id; 879*83ee113eSDavid van Moolenbroek int flags; 880*83ee113eSDavid van Moolenbroek #define HOST_DECL_DELETED 1 881*83ee113eSDavid van Moolenbroek #define HOST_DECL_DYNAMIC 2 882*83ee113eSDavid van Moolenbroek #define HOST_DECL_STATIC 4 883*83ee113eSDavid van Moolenbroek /* For v6 the host-identifer option can specify which relay 884*83ee113eSDavid van Moolenbroek to use when trying to look up an option. We store the 885*83ee113eSDavid van Moolenbroek value here. */ 886*83ee113eSDavid van Moolenbroek int relays; 887*83ee113eSDavid van Moolenbroek }; 888*83ee113eSDavid van Moolenbroek 889*83ee113eSDavid van Moolenbroek struct permit { 890*83ee113eSDavid van Moolenbroek struct permit *next; 891*83ee113eSDavid van Moolenbroek enum { 892*83ee113eSDavid van Moolenbroek permit_unknown_clients, 893*83ee113eSDavid van Moolenbroek permit_known_clients, 894*83ee113eSDavid van Moolenbroek permit_authenticated_clients, 895*83ee113eSDavid van Moolenbroek permit_unauthenticated_clients, 896*83ee113eSDavid van Moolenbroek permit_all_clients, 897*83ee113eSDavid van Moolenbroek permit_dynamic_bootp_clients, 898*83ee113eSDavid van Moolenbroek permit_class, 899*83ee113eSDavid van Moolenbroek permit_after 900*83ee113eSDavid van Moolenbroek } type; 901*83ee113eSDavid van Moolenbroek struct class *class; 902*83ee113eSDavid van Moolenbroek TIME after; /* date after which this clause applies */ 903*83ee113eSDavid van Moolenbroek }; 904*83ee113eSDavid van Moolenbroek 905*83ee113eSDavid van Moolenbroek struct pool { 906*83ee113eSDavid van Moolenbroek OMAPI_OBJECT_PREAMBLE; 907*83ee113eSDavid van Moolenbroek struct pool *next; 908*83ee113eSDavid van Moolenbroek struct group *group; 909*83ee113eSDavid van Moolenbroek struct shared_network *shared_network; 910*83ee113eSDavid van Moolenbroek struct permit *permit_list; 911*83ee113eSDavid van Moolenbroek struct permit *prohibit_list; 912*83ee113eSDavid van Moolenbroek struct lease *active; 913*83ee113eSDavid van Moolenbroek struct lease *expired; 914*83ee113eSDavid van Moolenbroek struct lease *free; 915*83ee113eSDavid van Moolenbroek struct lease *backup; 916*83ee113eSDavid van Moolenbroek struct lease *abandoned; 917*83ee113eSDavid van Moolenbroek struct lease *reserved; 918*83ee113eSDavid van Moolenbroek TIME next_event_time; 919*83ee113eSDavid van Moolenbroek int lease_count; 920*83ee113eSDavid van Moolenbroek int free_leases; 921*83ee113eSDavid van Moolenbroek int backup_leases; 922*83ee113eSDavid van Moolenbroek int index; 923*83ee113eSDavid van Moolenbroek TIME valid_from; /* deny pool use before this date */ 924*83ee113eSDavid van Moolenbroek TIME valid_until; /* deny pool use after this date */ 925*83ee113eSDavid van Moolenbroek 926*83ee113eSDavid van Moolenbroek #if defined (FAILOVER_PROTOCOL) 927*83ee113eSDavid van Moolenbroek dhcp_failover_state_t *failover_peer; 928*83ee113eSDavid van Moolenbroek #endif 929*83ee113eSDavid van Moolenbroek }; 930*83ee113eSDavid van Moolenbroek 931*83ee113eSDavid van Moolenbroek struct shared_network { 932*83ee113eSDavid van Moolenbroek OMAPI_OBJECT_PREAMBLE; 933*83ee113eSDavid van Moolenbroek struct shared_network *next; 934*83ee113eSDavid van Moolenbroek char *name; 935*83ee113eSDavid van Moolenbroek 936*83ee113eSDavid van Moolenbroek #define SHARED_IMPLICIT 1 /* This network was synthesized. */ 937*83ee113eSDavid van Moolenbroek int flags; 938*83ee113eSDavid van Moolenbroek 939*83ee113eSDavid van Moolenbroek struct subnet *subnets; 940*83ee113eSDavid van Moolenbroek struct interface_info *interface; 941*83ee113eSDavid van Moolenbroek struct pool *pools; 942*83ee113eSDavid van Moolenbroek struct ipv6_pond *ipv6_pond; 943*83ee113eSDavid van Moolenbroek struct group *group; 944*83ee113eSDavid van Moolenbroek #if defined (FAILOVER_PROTOCOL) 945*83ee113eSDavid van Moolenbroek dhcp_failover_state_t *failover_peer; 946*83ee113eSDavid van Moolenbroek #endif 947*83ee113eSDavid van Moolenbroek }; 948*83ee113eSDavid van Moolenbroek 949*83ee113eSDavid van Moolenbroek struct subnet { 950*83ee113eSDavid van Moolenbroek OMAPI_OBJECT_PREAMBLE; 951*83ee113eSDavid van Moolenbroek struct subnet *next_subnet; 952*83ee113eSDavid van Moolenbroek struct subnet *next_sibling; 953*83ee113eSDavid van Moolenbroek struct shared_network *shared_network; 954*83ee113eSDavid van Moolenbroek struct interface_info *interface; 955*83ee113eSDavid van Moolenbroek struct iaddr interface_address; 956*83ee113eSDavid van Moolenbroek struct iaddr net; 957*83ee113eSDavid van Moolenbroek struct iaddr netmask; 958*83ee113eSDavid van Moolenbroek int prefix_len; /* XXX: currently for IPv6 only */ 959*83ee113eSDavid van Moolenbroek struct group *group; 960*83ee113eSDavid van Moolenbroek }; 961*83ee113eSDavid van Moolenbroek 962*83ee113eSDavid van Moolenbroek struct collection { 963*83ee113eSDavid van Moolenbroek struct collection *next; 964*83ee113eSDavid van Moolenbroek 965*83ee113eSDavid van Moolenbroek const char *name; 966*83ee113eSDavid van Moolenbroek struct class *classes; 967*83ee113eSDavid van Moolenbroek }; 968*83ee113eSDavid van Moolenbroek 969*83ee113eSDavid van Moolenbroek /* Used as an argument to parse_clasS_decl() */ 970*83ee113eSDavid van Moolenbroek #define CLASS_TYPE_VENDOR 0 971*83ee113eSDavid van Moolenbroek #define CLASS_TYPE_USER 1 972*83ee113eSDavid van Moolenbroek #define CLASS_TYPE_CLASS 2 973*83ee113eSDavid van Moolenbroek #define CLASS_TYPE_SUBCLASS 3 974*83ee113eSDavid van Moolenbroek 975*83ee113eSDavid van Moolenbroek /* XXX classes must be reference-counted. */ 976*83ee113eSDavid van Moolenbroek struct class { 977*83ee113eSDavid van Moolenbroek OMAPI_OBJECT_PREAMBLE; 978*83ee113eSDavid van Moolenbroek struct class *nic; /* Next in collection. */ 979*83ee113eSDavid van Moolenbroek struct class *superclass; /* Set for spawned classes only. */ 980*83ee113eSDavid van Moolenbroek char *name; /* Not set for spawned classes. */ 981*83ee113eSDavid van Moolenbroek 982*83ee113eSDavid van Moolenbroek /* A class may be configured to permit a limited number of leases. */ 983*83ee113eSDavid van Moolenbroek int lease_limit; 984*83ee113eSDavid van Moolenbroek int leases_consumed; 985*83ee113eSDavid van Moolenbroek struct lease **billed_leases; 986*83ee113eSDavid van Moolenbroek 987*83ee113eSDavid van Moolenbroek /* If nonzero, class has not been saved since it was last 988*83ee113eSDavid van Moolenbroek modified. */ 989*83ee113eSDavid van Moolenbroek int dirty; 990*83ee113eSDavid van Moolenbroek 991*83ee113eSDavid van Moolenbroek /* Hash table containing subclasses. */ 992*83ee113eSDavid van Moolenbroek class_hash_t *hash; 993*83ee113eSDavid van Moolenbroek struct data_string hash_string; 994*83ee113eSDavid van Moolenbroek 995*83ee113eSDavid van Moolenbroek /* Expression used to match class. */ 996*83ee113eSDavid van Moolenbroek struct expression *expr; 997*83ee113eSDavid van Moolenbroek 998*83ee113eSDavid van Moolenbroek /* Expression used to compute subclass identifiers for spawning 999*83ee113eSDavid van Moolenbroek and to do subclass matching. */ 1000*83ee113eSDavid van Moolenbroek struct expression *submatch; 1001*83ee113eSDavid van Moolenbroek int spawning; 1002*83ee113eSDavid van Moolenbroek 1003*83ee113eSDavid van Moolenbroek struct group *group; 1004*83ee113eSDavid van Moolenbroek 1005*83ee113eSDavid van Moolenbroek /* Statements to execute if class matches. */ 1006*83ee113eSDavid van Moolenbroek struct executable_statement *statements; 1007*83ee113eSDavid van Moolenbroek 1008*83ee113eSDavid van Moolenbroek #define CLASS_DECL_DELETED 1 1009*83ee113eSDavid van Moolenbroek #define CLASS_DECL_DYNAMIC 2 1010*83ee113eSDavid van Moolenbroek #define CLASS_DECL_STATIC 4 1011*83ee113eSDavid van Moolenbroek #define CLASS_DECL_SUBCLASS 8 1012*83ee113eSDavid van Moolenbroek 1013*83ee113eSDavid van Moolenbroek int flags; 1014*83ee113eSDavid van Moolenbroek }; 1015*83ee113eSDavid van Moolenbroek 1016*83ee113eSDavid van Moolenbroek /* DHCP client lease structure... */ 1017*83ee113eSDavid van Moolenbroek struct client_lease { 1018*83ee113eSDavid van Moolenbroek struct client_lease *next; /* Next lease in list. */ 1019*83ee113eSDavid van Moolenbroek TIME expiry, renewal, rebind; /* Lease timeouts. */ 1020*83ee113eSDavid van Moolenbroek struct iaddr address; /* Address being leased. */ 1021*83ee113eSDavid van Moolenbroek char *server_name; /* Name of boot server. */ 1022*83ee113eSDavid van Moolenbroek char *filename; /* Name of file we're supposed to boot. */ 1023*83ee113eSDavid van Moolenbroek struct string_list *medium; /* Network medium. */ 1024*83ee113eSDavid van Moolenbroek struct auth_key *key; /* Key used in basic DHCP authentication. */ 1025*83ee113eSDavid van Moolenbroek 1026*83ee113eSDavid van Moolenbroek unsigned int is_static : 1; /* If set, lease is from config file. */ 1027*83ee113eSDavid van Moolenbroek unsigned int is_bootp: 1; /* If set, lease was acquired with BOOTP. */ 1028*83ee113eSDavid van Moolenbroek 1029*83ee113eSDavid van Moolenbroek struct option_state *options; /* Options supplied with lease. */ 1030*83ee113eSDavid van Moolenbroek }; 1031*83ee113eSDavid van Moolenbroek 1032*83ee113eSDavid van Moolenbroek /* DHCPv6 lease structures */ 1033*83ee113eSDavid van Moolenbroek struct dhc6_addr { 1034*83ee113eSDavid van Moolenbroek struct dhc6_addr *next; 1035*83ee113eSDavid van Moolenbroek struct iaddr address; 1036*83ee113eSDavid van Moolenbroek u_int8_t plen; 1037*83ee113eSDavid van Moolenbroek 1038*83ee113eSDavid van Moolenbroek /* Address state flags. */ 1039*83ee113eSDavid van Moolenbroek #define DHC6_ADDR_DEPREFFED 0x01 1040*83ee113eSDavid van Moolenbroek #define DHC6_ADDR_EXPIRED 0x02 1041*83ee113eSDavid van Moolenbroek u_int8_t flags; 1042*83ee113eSDavid van Moolenbroek 1043*83ee113eSDavid van Moolenbroek TIME starts; 1044*83ee113eSDavid van Moolenbroek u_int32_t preferred_life; 1045*83ee113eSDavid van Moolenbroek u_int32_t max_life; 1046*83ee113eSDavid van Moolenbroek 1047*83ee113eSDavid van Moolenbroek struct option_state *options; 1048*83ee113eSDavid van Moolenbroek }; 1049*83ee113eSDavid van Moolenbroek 1050*83ee113eSDavid van Moolenbroek struct dhc6_ia { 1051*83ee113eSDavid van Moolenbroek struct dhc6_ia *next; 1052*83ee113eSDavid van Moolenbroek unsigned char iaid[4]; 1053*83ee113eSDavid van Moolenbroek u_int16_t ia_type; 1054*83ee113eSDavid van Moolenbroek 1055*83ee113eSDavid van Moolenbroek TIME starts; 1056*83ee113eSDavid van Moolenbroek u_int32_t renew; 1057*83ee113eSDavid van Moolenbroek u_int32_t rebind; 1058*83ee113eSDavid van Moolenbroek struct dhc6_addr *addrs; 1059*83ee113eSDavid van Moolenbroek 1060*83ee113eSDavid van Moolenbroek struct option_state *options; 1061*83ee113eSDavid van Moolenbroek }; 1062*83ee113eSDavid van Moolenbroek 1063*83ee113eSDavid van Moolenbroek struct dhc6_lease { 1064*83ee113eSDavid van Moolenbroek struct dhc6_lease *next; 1065*83ee113eSDavid van Moolenbroek struct data_string server_id; 1066*83ee113eSDavid van Moolenbroek 1067*83ee113eSDavid van Moolenbroek isc_boolean_t released; 1068*83ee113eSDavid van Moolenbroek int score; 1069*83ee113eSDavid van Moolenbroek u_int8_t pref; 1070*83ee113eSDavid van Moolenbroek 1071*83ee113eSDavid van Moolenbroek unsigned char dhcpv6_transaction_id[3]; 1072*83ee113eSDavid van Moolenbroek struct dhc6_ia *bindings; 1073*83ee113eSDavid van Moolenbroek 1074*83ee113eSDavid van Moolenbroek struct option_state *options; 1075*83ee113eSDavid van Moolenbroek }; 1076*83ee113eSDavid van Moolenbroek 1077*83ee113eSDavid van Moolenbroek /* Possible states in which the client can be. */ 1078*83ee113eSDavid van Moolenbroek enum dhcp_state { 1079*83ee113eSDavid van Moolenbroek S_REBOOTING = 1, 1080*83ee113eSDavid van Moolenbroek S_INIT = 2, 1081*83ee113eSDavid van Moolenbroek S_SELECTING = 3, 1082*83ee113eSDavid van Moolenbroek S_REQUESTING = 4, 1083*83ee113eSDavid van Moolenbroek S_BOUND = 5, 1084*83ee113eSDavid van Moolenbroek S_RENEWING = 6, 1085*83ee113eSDavid van Moolenbroek S_REBINDING = 7, 1086*83ee113eSDavid van Moolenbroek S_STOPPED = 8 1087*83ee113eSDavid van Moolenbroek }; 1088*83ee113eSDavid van Moolenbroek 1089*83ee113eSDavid van Moolenbroek /* Authentication and BOOTP policy possibilities (not all values work 1090*83ee113eSDavid van Moolenbroek for each). */ 1091*83ee113eSDavid van Moolenbroek enum policy { P_IGNORE, P_ACCEPT, P_PREFER, P_REQUIRE, P_DONT }; 1092*83ee113eSDavid van Moolenbroek 1093*83ee113eSDavid van Moolenbroek /* Configuration information from the config file... */ 1094*83ee113eSDavid van Moolenbroek struct client_config { 1095*83ee113eSDavid van Moolenbroek /* 1096*83ee113eSDavid van Moolenbroek * When a message has been received, run these statements 1097*83ee113eSDavid van Moolenbroek * over it. 1098*83ee113eSDavid van Moolenbroek */ 1099*83ee113eSDavid van Moolenbroek struct group *on_receipt; 1100*83ee113eSDavid van Moolenbroek 1101*83ee113eSDavid van Moolenbroek /* 1102*83ee113eSDavid van Moolenbroek * When a message is sent, run these statements. 1103*83ee113eSDavid van Moolenbroek */ 1104*83ee113eSDavid van Moolenbroek struct group *on_transmission; 1105*83ee113eSDavid van Moolenbroek 1106*83ee113eSDavid van Moolenbroek struct option **required_options; /* Options that MUST be present. */ 1107*83ee113eSDavid van Moolenbroek struct option **requested_options; /* Options to request (ORO/PRL). */ 1108*83ee113eSDavid van Moolenbroek 1109*83ee113eSDavid van Moolenbroek TIME timeout; /* Start to panic if we don't get a 1110*83ee113eSDavid van Moolenbroek lease in this time period when 1111*83ee113eSDavid van Moolenbroek SELECTING. */ 1112*83ee113eSDavid van Moolenbroek TIME initial_delay; /* Set initial delay before first 1113*83ee113eSDavid van Moolenbroek transmission. */ 1114*83ee113eSDavid van Moolenbroek TIME initial_interval; /* All exponential backoff intervals 1115*83ee113eSDavid van Moolenbroek start here. */ 1116*83ee113eSDavid van Moolenbroek TIME retry_interval; /* If the protocol failed to produce 1117*83ee113eSDavid van Moolenbroek an address before the timeout, 1118*83ee113eSDavid van Moolenbroek try the protocol again after this 1119*83ee113eSDavid van Moolenbroek many seconds. */ 1120*83ee113eSDavid van Moolenbroek TIME select_interval; /* Wait this many seconds from the 1121*83ee113eSDavid van Moolenbroek first DHCPDISCOVER before 1122*83ee113eSDavid van Moolenbroek picking an offered lease. */ 1123*83ee113eSDavid van Moolenbroek TIME reboot_timeout; /* When in INIT-REBOOT, wait this 1124*83ee113eSDavid van Moolenbroek long before giving up and going 1125*83ee113eSDavid van Moolenbroek to INIT. */ 1126*83ee113eSDavid van Moolenbroek TIME backoff_cutoff; /* When doing exponential backoff, 1127*83ee113eSDavid van Moolenbroek never back off to an interval 1128*83ee113eSDavid van Moolenbroek longer than this amount. */ 1129*83ee113eSDavid van Moolenbroek u_int32_t requested_lease; /* Requested lease time, if user 1130*83ee113eSDavid van Moolenbroek doesn't configure one. */ 1131*83ee113eSDavid van Moolenbroek struct string_list *media; /* Possible network media values. */ 1132*83ee113eSDavid van Moolenbroek char *script_name; /* Name of config script. */ 1133*83ee113eSDavid van Moolenbroek char *vendor_space_name; /* Name of config script. */ 1134*83ee113eSDavid van Moolenbroek enum policy bootp_policy; 1135*83ee113eSDavid van Moolenbroek /* Ignore, accept or prefer BOOTP 1136*83ee113eSDavid van Moolenbroek responses. */ 1137*83ee113eSDavid van Moolenbroek enum policy auth_policy; 1138*83ee113eSDavid van Moolenbroek /* Require authentication, prefer 1139*83ee113eSDavid van Moolenbroek authentication, or don't try to 1140*83ee113eSDavid van Moolenbroek authenticate. */ 1141*83ee113eSDavid van Moolenbroek struct string_list *medium; /* Current network medium. */ 1142*83ee113eSDavid van Moolenbroek 1143*83ee113eSDavid van Moolenbroek struct iaddrmatchlist *reject_list; /* Servers to reject. */ 1144*83ee113eSDavid van Moolenbroek 1145*83ee113eSDavid van Moolenbroek int omapi_port; /* port on which to accept OMAPI 1146*83ee113eSDavid van Moolenbroek connections, or -1 for no 1147*83ee113eSDavid van Moolenbroek listener. */ 1148*83ee113eSDavid van Moolenbroek int do_forward_update; /* If nonzero, and if we have the 1149*83ee113eSDavid van Moolenbroek information we need, update the 1150*83ee113eSDavid van Moolenbroek A record for the address we get. */ 1151*83ee113eSDavid van Moolenbroek }; 1152*83ee113eSDavid van Moolenbroek 1153*83ee113eSDavid van Moolenbroek /* Per-interface state used in the dhcp client... */ 1154*83ee113eSDavid van Moolenbroek /* XXX: consider union {}'ing this for v4/v6. */ 1155*83ee113eSDavid van Moolenbroek struct client_state { 1156*83ee113eSDavid van Moolenbroek struct client_state *next; 1157*83ee113eSDavid van Moolenbroek struct interface_info *interface; 1158*83ee113eSDavid van Moolenbroek char *name; 1159*83ee113eSDavid van Moolenbroek 1160*83ee113eSDavid van Moolenbroek /* Common values. */ 1161*83ee113eSDavid van Moolenbroek struct client_config *config; /* Client configuration. */ 1162*83ee113eSDavid van Moolenbroek struct string_list *env; /* Client script environment. */ 1163*83ee113eSDavid van Moolenbroek int envc; /* Number of entries in environment. */ 1164*83ee113eSDavid van Moolenbroek struct option_state *sent_options; /* Options we sent. */ 1165*83ee113eSDavid van Moolenbroek enum dhcp_state state; /* Current state for this interface. */ 1166*83ee113eSDavid van Moolenbroek TIME last_write; /* Last time this state was written. */ 1167*83ee113eSDavid van Moolenbroek 1168*83ee113eSDavid van Moolenbroek /* DHCPv4 values. */ 1169*83ee113eSDavid van Moolenbroek struct client_lease *active; /* Currently active lease. */ 1170*83ee113eSDavid van Moolenbroek struct client_lease *new; /* New lease. */ 1171*83ee113eSDavid van Moolenbroek struct client_lease *offered_leases; /* Leases offered to us. */ 1172*83ee113eSDavid van Moolenbroek struct client_lease *leases; /* Leases we currently hold. */ 1173*83ee113eSDavid van Moolenbroek struct client_lease *alias; /* Alias lease. */ 1174*83ee113eSDavid van Moolenbroek 1175*83ee113eSDavid van Moolenbroek struct iaddr destination; /* Where to send packet. */ 1176*83ee113eSDavid van Moolenbroek u_int32_t xid; /* Transaction ID. */ 1177*83ee113eSDavid van Moolenbroek u_int16_t secs; /* secs value from DHCPDISCOVER. */ 1178*83ee113eSDavid van Moolenbroek TIME first_sending; /* When was first copy sent? */ 1179*83ee113eSDavid van Moolenbroek TIME interval; /* What's the current resend interval? */ 1180*83ee113eSDavid van Moolenbroek struct string_list *medium; /* Last media type tried. */ 1181*83ee113eSDavid van Moolenbroek struct dhcp_packet packet; /* Outgoing DHCP packet. */ 1182*83ee113eSDavid van Moolenbroek unsigned packet_length; /* Actual length of generated packet. */ 1183*83ee113eSDavid van Moolenbroek 1184*83ee113eSDavid van Moolenbroek struct iaddr requested_address; /* Address we would like to get. */ 1185*83ee113eSDavid van Moolenbroek 1186*83ee113eSDavid van Moolenbroek /* DHCPv6 values. */ 1187*83ee113eSDavid van Moolenbroek unsigned char dhcpv6_transaction_id[3]; 1188*83ee113eSDavid van Moolenbroek u_int8_t refresh_type; 1189*83ee113eSDavid van Moolenbroek 1190*83ee113eSDavid van Moolenbroek struct dhc6_lease *active_lease; 1191*83ee113eSDavid van Moolenbroek struct dhc6_lease *old_lease; 1192*83ee113eSDavid van Moolenbroek struct dhc6_lease *advertised_leases; 1193*83ee113eSDavid van Moolenbroek struct dhc6_lease *selected_lease; 1194*83ee113eSDavid van Moolenbroek struct dhc6_lease *held_leases; 1195*83ee113eSDavid van Moolenbroek 1196*83ee113eSDavid van Moolenbroek struct timeval start_time; 1197*83ee113eSDavid van Moolenbroek u_int16_t elapsed; 1198*83ee113eSDavid van Moolenbroek int txcount; 1199*83ee113eSDavid van Moolenbroek 1200*83ee113eSDavid van Moolenbroek /* See RFC3315 section 14. */ 1201*83ee113eSDavid van Moolenbroek TIME RT; /* In hundredths of seconds. */ 1202*83ee113eSDavid van Moolenbroek TIME IRT; /* In hundredths of seconds. */ 1203*83ee113eSDavid van Moolenbroek TIME MRC; /* Count. */ 1204*83ee113eSDavid van Moolenbroek TIME MRT; /* In hundredths of seconds. */ 1205*83ee113eSDavid van Moolenbroek TIME MRD; /* In seconds, relative. */ 1206*83ee113eSDavid van Moolenbroek TIME next_MRD; /* In seconds, absolute. */ 1207*83ee113eSDavid van Moolenbroek 1208*83ee113eSDavid van Moolenbroek /* Rather than a state, we use a function that shifts around 1209*83ee113eSDavid van Moolenbroek * depending what stage of life the v6 state machine is in. 1210*83ee113eSDavid van Moolenbroek * This is where incoming packets are dispatched to (sometimes 1211*83ee113eSDavid van Moolenbroek * a no-op). 1212*83ee113eSDavid van Moolenbroek */ 1213*83ee113eSDavid van Moolenbroek void (*v6_handler)(struct packet *, struct client_state *); 1214*83ee113eSDavid van Moolenbroek 1215*83ee113eSDavid van Moolenbroek /* 1216*83ee113eSDavid van Moolenbroek * A pointer to the state of the ddns update for this lease. 1217*83ee113eSDavid van Moolenbroek * It should be set while the update is in progress and cleared 1218*83ee113eSDavid van Moolenbroek * when the update finishes. It can be used to cancel the 1219*83ee113eSDavid van Moolenbroek * update if we want to do a different update. 1220*83ee113eSDavid van Moolenbroek */ 1221*83ee113eSDavid van Moolenbroek struct dhcp_ddns_cb *ddns_cb; 1222*83ee113eSDavid van Moolenbroek }; 1223*83ee113eSDavid van Moolenbroek 1224*83ee113eSDavid van Moolenbroek struct envadd_state { 1225*83ee113eSDavid van Moolenbroek struct client_state *client; 1226*83ee113eSDavid van Moolenbroek const char *prefix; 1227*83ee113eSDavid van Moolenbroek }; 1228*83ee113eSDavid van Moolenbroek 1229*83ee113eSDavid van Moolenbroek struct dns_update_state { 1230*83ee113eSDavid van Moolenbroek struct client_state *client; 1231*83ee113eSDavid van Moolenbroek struct iaddr address; 1232*83ee113eSDavid van Moolenbroek int dns_update_timeout; 1233*83ee113eSDavid van Moolenbroek }; 1234*83ee113eSDavid van Moolenbroek 1235*83ee113eSDavid van Moolenbroek /* Information about each network interface. */ 1236*83ee113eSDavid van Moolenbroek 1237*83ee113eSDavid van Moolenbroek struct interface_info { 1238*83ee113eSDavid van Moolenbroek OMAPI_OBJECT_PREAMBLE; 1239*83ee113eSDavid van Moolenbroek struct interface_info *next; /* Next interface in list... */ 1240*83ee113eSDavid van Moolenbroek struct shared_network *shared_network; 1241*83ee113eSDavid van Moolenbroek /* Networks connected to this interface. */ 1242*83ee113eSDavid van Moolenbroek struct hardware hw_address; /* Its physical address. */ 1243*83ee113eSDavid van Moolenbroek struct in_addr *addresses; /* Addresses associated with this 1244*83ee113eSDavid van Moolenbroek * interface. 1245*83ee113eSDavid van Moolenbroek */ 1246*83ee113eSDavid van Moolenbroek int address_count; /* Number of addresses stored. */ 1247*83ee113eSDavid van Moolenbroek int address_max; /* Size of addresses buffer. */ 1248*83ee113eSDavid van Moolenbroek struct in6_addr *v6addresses; /* IPv6 addresses associated with 1249*83ee113eSDavid van Moolenbroek this interface. */ 1250*83ee113eSDavid van Moolenbroek int v6address_count; /* Number of IPv6 addresses associated 1251*83ee113eSDavid van Moolenbroek with this interface. */ 1252*83ee113eSDavid van Moolenbroek int v6address_max; /* Maximum number of IPv6 addresses 1253*83ee113eSDavid van Moolenbroek we can store in current buffer. */ 1254*83ee113eSDavid van Moolenbroek 1255*83ee113eSDavid van Moolenbroek u_int8_t *circuit_id; /* Circuit ID associated with this 1256*83ee113eSDavid van Moolenbroek interface. */ 1257*83ee113eSDavid van Moolenbroek unsigned circuit_id_len; /* Length of Circuit ID, if there 1258*83ee113eSDavid van Moolenbroek is one. */ 1259*83ee113eSDavid van Moolenbroek u_int8_t *remote_id; /* Remote ID associated with this 1260*83ee113eSDavid van Moolenbroek interface (if any). */ 1261*83ee113eSDavid van Moolenbroek unsigned remote_id_len; /* Length of Remote ID. */ 1262*83ee113eSDavid van Moolenbroek 1263*83ee113eSDavid van Moolenbroek char name [IFNAMSIZ]; /* Its name... */ 1264*83ee113eSDavid van Moolenbroek int index; /* Its if_nametoindex(). */ 1265*83ee113eSDavid van Moolenbroek int rfdesc; /* Its read file descriptor. */ 1266*83ee113eSDavid van Moolenbroek int wfdesc; /* Its write file descriptor, if 1267*83ee113eSDavid van Moolenbroek different. */ 1268*83ee113eSDavid van Moolenbroek unsigned char *rbuf; /* Read buffer, if required. */ 1269*83ee113eSDavid van Moolenbroek unsigned int rbuf_max; /* Size of read buffer. */ 1270*83ee113eSDavid van Moolenbroek size_t rbuf_offset; /* Current offset into buffer. */ 1271*83ee113eSDavid van Moolenbroek size_t rbuf_len; /* Length of data in buffer. */ 1272*83ee113eSDavid van Moolenbroek 1273*83ee113eSDavid van Moolenbroek struct ifreq *ifp; /* Pointer to ifreq struct. */ 1274*83ee113eSDavid van Moolenbroek int configured; /* If set to 1, interface has at least 1275*83ee113eSDavid van Moolenbroek * one valid IP address. 1276*83ee113eSDavid van Moolenbroek */ 1277*83ee113eSDavid van Moolenbroek u_int32_t flags; /* Control flags... */ 1278*83ee113eSDavid van Moolenbroek #define INTERFACE_REQUESTED 1 1279*83ee113eSDavid van Moolenbroek #define INTERFACE_AUTOMATIC 2 1280*83ee113eSDavid van Moolenbroek #define INTERFACE_RUNNING 4 1281*83ee113eSDavid van Moolenbroek #define INTERFACE_DOWNSTREAM 8 1282*83ee113eSDavid van Moolenbroek #define INTERFACE_UPSTREAM 16 1283*83ee113eSDavid van Moolenbroek #define INTERFACE_STREAMS (INTERFACE_DOWNSTREAM | INTERFACE_UPSTREAM) 1284*83ee113eSDavid van Moolenbroek 1285*83ee113eSDavid van Moolenbroek /* Only used by DHCP client code. */ 1286*83ee113eSDavid van Moolenbroek struct client_state *client; 1287*83ee113eSDavid van Moolenbroek # if defined(USE_DLPI_SEND) || defined(USE_DLPI_RECEIVE) || \ 1288*83ee113eSDavid van Moolenbroek defined(USE_DLPI_HWADDR) 1289*83ee113eSDavid van Moolenbroek int dlpi_sap_length; 1290*83ee113eSDavid van Moolenbroek struct hardware dlpi_broadcast_addr; 1291*83ee113eSDavid van Moolenbroek # endif /* DLPI_SEND || DLPI_RECEIVE */ 1292*83ee113eSDavid van Moolenbroek struct hardware anycast_mac_addr; 1293*83ee113eSDavid van Moolenbroek }; 1294*83ee113eSDavid van Moolenbroek 1295*83ee113eSDavid van Moolenbroek struct hardware_link { 1296*83ee113eSDavid van Moolenbroek struct hardware_link *next; 1297*83ee113eSDavid van Moolenbroek char name [IFNAMSIZ]; 1298*83ee113eSDavid van Moolenbroek struct hardware address; 1299*83ee113eSDavid van Moolenbroek }; 1300*83ee113eSDavid van Moolenbroek 1301*83ee113eSDavid van Moolenbroek struct leasequeue { 1302*83ee113eSDavid van Moolenbroek struct leasequeue *prev; 1303*83ee113eSDavid van Moolenbroek struct leasequeue *next; 1304*83ee113eSDavid van Moolenbroek struct lease *lease; 1305*83ee113eSDavid van Moolenbroek }; 1306*83ee113eSDavid van Moolenbroek 1307*83ee113eSDavid van Moolenbroek typedef void (*tvref_t)(void *, void *, const char *, int); 1308*83ee113eSDavid van Moolenbroek typedef void (*tvunref_t)(void *, const char *, int); 1309*83ee113eSDavid van Moolenbroek struct timeout { 1310*83ee113eSDavid van Moolenbroek struct timeout *next; 1311*83ee113eSDavid van Moolenbroek struct timeval when; 1312*83ee113eSDavid van Moolenbroek void (*func) (void *); 1313*83ee113eSDavid van Moolenbroek void *what; 1314*83ee113eSDavid van Moolenbroek tvref_t ref; 1315*83ee113eSDavid van Moolenbroek tvunref_t unref; 1316*83ee113eSDavid van Moolenbroek isc_timer_t *isc_timeout; 1317*83ee113eSDavid van Moolenbroek }; 1318*83ee113eSDavid van Moolenbroek 1319*83ee113eSDavid van Moolenbroek struct eventqueue { 1320*83ee113eSDavid van Moolenbroek struct eventqueue *next; 1321*83ee113eSDavid van Moolenbroek void (*handler)(void *); 1322*83ee113eSDavid van Moolenbroek }; 1323*83ee113eSDavid van Moolenbroek 1324*83ee113eSDavid van Moolenbroek struct protocol { 1325*83ee113eSDavid van Moolenbroek struct protocol *next; 1326*83ee113eSDavid van Moolenbroek int fd; 1327*83ee113eSDavid van Moolenbroek void (*handler) (struct protocol *); 1328*83ee113eSDavid van Moolenbroek void *local; 1329*83ee113eSDavid van Moolenbroek }; 1330*83ee113eSDavid van Moolenbroek 1331*83ee113eSDavid van Moolenbroek struct dns_query; /* forward */ 1332*83ee113eSDavid van Moolenbroek 1333*83ee113eSDavid van Moolenbroek struct dns_wakeup { 1334*83ee113eSDavid van Moolenbroek struct dns_wakeup *next; /* Next wakeup in chain. */ 1335*83ee113eSDavid van Moolenbroek void (*func) (struct dns_query *); 1336*83ee113eSDavid van Moolenbroek }; 1337*83ee113eSDavid van Moolenbroek 1338*83ee113eSDavid van Moolenbroek struct dns_question { 1339*83ee113eSDavid van Moolenbroek u_int16_t type; /* Type of query. */ 1340*83ee113eSDavid van Moolenbroek u_int16_t class; /* Class of query. */ 1341*83ee113eSDavid van Moolenbroek unsigned char data [1]; /* Query data. */ 1342*83ee113eSDavid van Moolenbroek }; 1343*83ee113eSDavid van Moolenbroek 1344*83ee113eSDavid van Moolenbroek struct dns_answer { 1345*83ee113eSDavid van Moolenbroek u_int16_t type; /* Type of answer. */ 1346*83ee113eSDavid van Moolenbroek u_int16_t class; /* Class of answer. */ 1347*83ee113eSDavid van Moolenbroek int count; /* Number of answers. */ 1348*83ee113eSDavid van Moolenbroek unsigned char *answers[1]; /* Pointers to answers. */ 1349*83ee113eSDavid van Moolenbroek }; 1350*83ee113eSDavid van Moolenbroek 1351*83ee113eSDavid van Moolenbroek struct dns_query { 1352*83ee113eSDavid van Moolenbroek struct dns_query *next; /* Next query in hash bucket. */ 1353*83ee113eSDavid van Moolenbroek u_int32_t hash; /* Hash bucket index. */ 1354*83ee113eSDavid van Moolenbroek TIME expiry; /* Query expiry time (zero if not yet 1355*83ee113eSDavid van Moolenbroek answered. */ 1356*83ee113eSDavid van Moolenbroek u_int16_t id; /* Query ID (also hash table index) */ 1357*83ee113eSDavid van Moolenbroek caddr_t waiters; /* Pointer to list of things waiting 1358*83ee113eSDavid van Moolenbroek on this query. */ 1359*83ee113eSDavid van Moolenbroek 1360*83ee113eSDavid van Moolenbroek struct dns_question *question; /* Question, internal format. */ 1361*83ee113eSDavid van Moolenbroek struct dns_answer *answer; /* Answer, internal format. */ 1362*83ee113eSDavid van Moolenbroek 1363*83ee113eSDavid van Moolenbroek unsigned char *query; /* Query formatted for DNS server. */ 1364*83ee113eSDavid van Moolenbroek unsigned len; /* Length of entire query. */ 1365*83ee113eSDavid van Moolenbroek int sent; /* The query has been sent. */ 1366*83ee113eSDavid van Moolenbroek struct dns_wakeup *wakeups; /* Wakeups to call if this query is 1367*83ee113eSDavid van Moolenbroek answered. */ 1368*83ee113eSDavid van Moolenbroek struct name_server *next_server; /* Next server to try. */ 1369*83ee113eSDavid van Moolenbroek int backoff; /* Current backoff, in seconds. */ 1370*83ee113eSDavid van Moolenbroek }; 1371*83ee113eSDavid van Moolenbroek 1372*83ee113eSDavid van Moolenbroek #define DNS_ZONE_ACTIVE 0 1373*83ee113eSDavid van Moolenbroek #define DNS_ZONE_INACTIVE 1 1374*83ee113eSDavid van Moolenbroek struct dns_zone { 1375*83ee113eSDavid van Moolenbroek int refcnt; 1376*83ee113eSDavid van Moolenbroek TIME timeout; 1377*83ee113eSDavid van Moolenbroek char *name; 1378*83ee113eSDavid van Moolenbroek struct option_cache *primary; 1379*83ee113eSDavid van Moolenbroek struct option_cache *secondary; 1380*83ee113eSDavid van Moolenbroek struct option_cache *primary6; 1381*83ee113eSDavid van Moolenbroek struct option_cache *secondary6; 1382*83ee113eSDavid van Moolenbroek struct auth_key *key; 1383*83ee113eSDavid van Moolenbroek u_int16_t flags; 1384*83ee113eSDavid van Moolenbroek }; 1385*83ee113eSDavid van Moolenbroek 1386*83ee113eSDavid van Moolenbroek struct icmp_state { 1387*83ee113eSDavid van Moolenbroek OMAPI_OBJECT_PREAMBLE; 1388*83ee113eSDavid van Moolenbroek int socket; 1389*83ee113eSDavid van Moolenbroek void (*icmp_handler) (struct iaddr, u_int8_t *, int); 1390*83ee113eSDavid van Moolenbroek }; 1391*83ee113eSDavid van Moolenbroek 1392*83ee113eSDavid van Moolenbroek #include "ctrace.h" 1393*83ee113eSDavid van Moolenbroek 1394*83ee113eSDavid van Moolenbroek /* Bitmask of dhcp option codes. */ 1395*83ee113eSDavid van Moolenbroek typedef unsigned char option_mask [16]; 1396*83ee113eSDavid van Moolenbroek 1397*83ee113eSDavid van Moolenbroek /* DHCP Option mask manipulation macros... */ 1398*83ee113eSDavid van Moolenbroek #define OPTION_ZERO(mask) (memset (mask, 0, 16)) 1399*83ee113eSDavid van Moolenbroek #define OPTION_SET(mask, bit) (mask [bit >> 8] |= (1 << (bit & 7))) 1400*83ee113eSDavid van Moolenbroek #define OPTION_CLR(mask, bit) (mask [bit >> 8] &= ~(1 << (bit & 7))) 1401*83ee113eSDavid van Moolenbroek #define OPTION_ISSET(mask, bit) (mask [bit >> 8] & (1 << (bit & 7))) 1402*83ee113eSDavid van Moolenbroek #define OPTION_ISCLR(mask, bit) (!OPTION_ISSET (mask, bit)) 1403*83ee113eSDavid van Moolenbroek 1404*83ee113eSDavid van Moolenbroek /* An option occupies its length plus two header bytes (code and 1405*83ee113eSDavid van Moolenbroek length) for every 255 bytes that must be stored. */ 1406*83ee113eSDavid van Moolenbroek #define OPTION_SPACE(x) ((x) + 2 * ((x) / 255 + 1)) 1407*83ee113eSDavid van Moolenbroek 1408*83ee113eSDavid van Moolenbroek /* Default path to dhcpd config file. */ 1409*83ee113eSDavid van Moolenbroek #ifdef DEBUG 1410*83ee113eSDavid van Moolenbroek #undef _PATH_DHCPD_CONF 1411*83ee113eSDavid van Moolenbroek #define _PATH_DHCPD_CONF "dhcpd.conf" 1412*83ee113eSDavid van Moolenbroek #undef _PATH_DHCPD_DB 1413*83ee113eSDavid van Moolenbroek #define _PATH_DHCPD_DB "dhcpd.leases" 1414*83ee113eSDavid van Moolenbroek #undef _PATH_DHCPD6_DB 1415*83ee113eSDavid van Moolenbroek #define _PATH_DHCPD6_DB "dhcpd6.leases" 1416*83ee113eSDavid van Moolenbroek #undef _PATH_DHCPD_PID 1417*83ee113eSDavid van Moolenbroek #define _PATH_DHCPD_PID "dhcpd.pid" 1418*83ee113eSDavid van Moolenbroek #undef _PATH_DHCPD6_PID 1419*83ee113eSDavid van Moolenbroek #define _PATH_DHCPD6_PID "dhcpd6.pid" 1420*83ee113eSDavid van Moolenbroek #else /* !DEBUG */ 1421*83ee113eSDavid van Moolenbroek 1422*83ee113eSDavid van Moolenbroek #ifndef _PATH_DHCPD_CONF 1423*83ee113eSDavid van Moolenbroek #define _PATH_DHCPD_CONF "/etc/dhcpd.conf" 1424*83ee113eSDavid van Moolenbroek #endif /* DEBUG */ 1425*83ee113eSDavid van Moolenbroek 1426*83ee113eSDavid van Moolenbroek #ifndef _PATH_DHCPD_DB 1427*83ee113eSDavid van Moolenbroek #define _PATH_DHCPD_DB LOCALSTATEDIR"/db/dhcpd.leases" 1428*83ee113eSDavid van Moolenbroek #endif 1429*83ee113eSDavid van Moolenbroek 1430*83ee113eSDavid van Moolenbroek #ifndef _PATH_DHCPD6_DB 1431*83ee113eSDavid van Moolenbroek #define _PATH_DHCPD6_DB LOCALSTATEDIR"/db/dhcpd6.leases" 1432*83ee113eSDavid van Moolenbroek #endif 1433*83ee113eSDavid van Moolenbroek 1434*83ee113eSDavid van Moolenbroek #ifndef _PATH_DHCPD_PID 1435*83ee113eSDavid van Moolenbroek #define _PATH_DHCPD_PID LOCALSTATEDIR"/run/dhcpd.pid" 1436*83ee113eSDavid van Moolenbroek #endif 1437*83ee113eSDavid van Moolenbroek 1438*83ee113eSDavid van Moolenbroek #ifndef _PATH_DHCPD6_PID 1439*83ee113eSDavid van Moolenbroek #define _PATH_DHCPD6_PID LOCALSTATEDIR"/run/dhcpd6.pid" 1440*83ee113eSDavid van Moolenbroek #endif 1441*83ee113eSDavid van Moolenbroek 1442*83ee113eSDavid van Moolenbroek #endif /* DEBUG */ 1443*83ee113eSDavid van Moolenbroek 1444*83ee113eSDavid van Moolenbroek #ifndef _PATH_DHCLIENT_CONF 1445*83ee113eSDavid van Moolenbroek #define _PATH_DHCLIENT_CONF "/etc/dhclient.conf" 1446*83ee113eSDavid van Moolenbroek #endif 1447*83ee113eSDavid van Moolenbroek 1448*83ee113eSDavid van Moolenbroek #ifndef _PATH_DHCLIENT_SCRIPT 1449*83ee113eSDavid van Moolenbroek #define _PATH_DHCLIENT_SCRIPT "/sbin/dhclient-script" 1450*83ee113eSDavid van Moolenbroek #endif 1451*83ee113eSDavid van Moolenbroek 1452*83ee113eSDavid van Moolenbroek #ifndef _PATH_DHCLIENT_PID 1453*83ee113eSDavid van Moolenbroek #define _PATH_DHCLIENT_PID LOCALSTATEDIR"/run/dhclient.pid" 1454*83ee113eSDavid van Moolenbroek #endif 1455*83ee113eSDavid van Moolenbroek 1456*83ee113eSDavid van Moolenbroek #ifndef _PATH_DHCLIENT6_PID 1457*83ee113eSDavid van Moolenbroek #define _PATH_DHCLIENT6_PID LOCALSTATEDIR"/run/dhclient6.pid" 1458*83ee113eSDavid van Moolenbroek #endif 1459*83ee113eSDavid van Moolenbroek 1460*83ee113eSDavid van Moolenbroek #ifndef _PATH_DHCLIENT_DB 1461*83ee113eSDavid van Moolenbroek #define _PATH_DHCLIENT_DB LOCALSTATEDIR"/db/dhclient.leases" 1462*83ee113eSDavid van Moolenbroek #endif 1463*83ee113eSDavid van Moolenbroek 1464*83ee113eSDavid van Moolenbroek #ifndef _PATH_DHCLIENT6_DB 1465*83ee113eSDavid van Moolenbroek #define _PATH_DHCLIENT6_DB LOCALSTATEDIR"/db/dhclient6.leases" 1466*83ee113eSDavid van Moolenbroek #endif 1467*83ee113eSDavid van Moolenbroek 1468*83ee113eSDavid van Moolenbroek #ifndef _PATH_RESOLV_CONF 1469*83ee113eSDavid van Moolenbroek #define _PATH_RESOLV_CONF "/etc/resolv.conf" 1470*83ee113eSDavid van Moolenbroek #endif 1471*83ee113eSDavid van Moolenbroek 1472*83ee113eSDavid van Moolenbroek #ifndef _PATH_DHCRELAY_PID 1473*83ee113eSDavid van Moolenbroek #define _PATH_DHCRELAY_PID LOCALSTATEDIR"/run/dhcrelay.pid" 1474*83ee113eSDavid van Moolenbroek #endif 1475*83ee113eSDavid van Moolenbroek 1476*83ee113eSDavid van Moolenbroek #ifndef _PATH_DHCRELAY6_PID 1477*83ee113eSDavid van Moolenbroek #define _PATH_DHCRELAY6_PID LOCALSTATEDIR"/run/dhcrelay6.pid" 1478*83ee113eSDavid van Moolenbroek #endif 1479*83ee113eSDavid van Moolenbroek 1480*83ee113eSDavid van Moolenbroek #ifndef DHCPD_LOG_FACILITY 1481*83ee113eSDavid van Moolenbroek #define DHCPD_LOG_FACILITY LOG_DAEMON 1482*83ee113eSDavid van Moolenbroek #endif 1483*83ee113eSDavid van Moolenbroek 1484*83ee113eSDavid van Moolenbroek #define MAX_TIME 0x7fffffff 1485*83ee113eSDavid van Moolenbroek #define MIN_TIME 0 1486*83ee113eSDavid van Moolenbroek 1487*83ee113eSDavid van Moolenbroek /* these are referenced */ 1488*83ee113eSDavid van Moolenbroek typedef struct hash_table ia_hash_t; 1489*83ee113eSDavid van Moolenbroek typedef struct hash_table iasubopt_hash_t; 1490*83ee113eSDavid van Moolenbroek 1491*83ee113eSDavid van Moolenbroek /* IAADDR/IAPREFIX lease */ 1492*83ee113eSDavid van Moolenbroek 1493*83ee113eSDavid van Moolenbroek struct iasubopt { 1494*83ee113eSDavid van Moolenbroek int refcnt; /* reference count */ 1495*83ee113eSDavid van Moolenbroek struct in6_addr addr; /* IPv6 address/prefix */ 1496*83ee113eSDavid van Moolenbroek u_int8_t plen; /* iaprefix prefix length */ 1497*83ee113eSDavid van Moolenbroek binding_state_t state; /* state */ 1498*83ee113eSDavid van Moolenbroek struct binding_scope *scope; /* "set var = value;" */ 1499*83ee113eSDavid van Moolenbroek time_t hard_lifetime_end_time; /* time address expires */ 1500*83ee113eSDavid van Moolenbroek time_t soft_lifetime_end_time; /* time ephemeral expires */ 1501*83ee113eSDavid van Moolenbroek u_int32_t prefer; /* cached preferred lifetime */ 1502*83ee113eSDavid van Moolenbroek u_int32_t valid; /* cached valid lifetime */ 1503*83ee113eSDavid van Moolenbroek struct ia_xx *ia; /* IA for this lease */ 1504*83ee113eSDavid van Moolenbroek struct ipv6_pool *ipv6_pool; /* pool for this lease */ 1505*83ee113eSDavid van Moolenbroek /* 1506*83ee113eSDavid van Moolenbroek * For now, just pick an arbitrary time to keep old hard leases 1507*83ee113eSDavid van Moolenbroek * around (value in seconds). 1508*83ee113eSDavid van Moolenbroek */ 1509*83ee113eSDavid van Moolenbroek #define EXPIRED_IPV6_CLEANUP_TIME (60*60) 1510*83ee113eSDavid van Moolenbroek 1511*83ee113eSDavid van Moolenbroek int heap_index; /* index into heap, or -1 1512*83ee113eSDavid van Moolenbroek (internal use only) */ 1513*83ee113eSDavid van Moolenbroek 1514*83ee113eSDavid van Moolenbroek /* 1515*83ee113eSDavid van Moolenbroek * A pointer to the state of the ddns update for this lease. 1516*83ee113eSDavid van Moolenbroek * It should be set while the update is in progress and cleared 1517*83ee113eSDavid van Moolenbroek * when the update finishes. It can be used to cancel the 1518*83ee113eSDavid van Moolenbroek * update if we want to do a different update. 1519*83ee113eSDavid van Moolenbroek */ 1520*83ee113eSDavid van Moolenbroek struct dhcp_ddns_cb *ddns_cb; 1521*83ee113eSDavid van Moolenbroek 1522*83ee113eSDavid van Moolenbroek /* space for the on * executable statements */ 1523*83ee113eSDavid van Moolenbroek struct on_star on_star; 1524*83ee113eSDavid van Moolenbroek }; 1525*83ee113eSDavid van Moolenbroek 1526*83ee113eSDavid van Moolenbroek struct ia_xx { 1527*83ee113eSDavid van Moolenbroek int refcnt; /* reference count */ 1528*83ee113eSDavid van Moolenbroek struct data_string iaid_duid; /* from the client */ 1529*83ee113eSDavid van Moolenbroek u_int16_t ia_type; /* IA_XX */ 1530*83ee113eSDavid van Moolenbroek int num_iasubopt; /* number of IAADDR/PREFIX */ 1531*83ee113eSDavid van Moolenbroek int max_iasubopt; /* space available for IAADDR/PREFIX */ 1532*83ee113eSDavid van Moolenbroek time_t cltt; /* client last transaction time */ 1533*83ee113eSDavid van Moolenbroek struct iasubopt **iasubopt; /* pointers to the IAADDR/IAPREFIXs */ 1534*83ee113eSDavid van Moolenbroek }; 1535*83ee113eSDavid van Moolenbroek 1536*83ee113eSDavid van Moolenbroek extern ia_hash_t *ia_na_active; 1537*83ee113eSDavid van Moolenbroek extern ia_hash_t *ia_ta_active; 1538*83ee113eSDavid van Moolenbroek extern ia_hash_t *ia_pd_active; 1539*83ee113eSDavid van Moolenbroek 1540*83ee113eSDavid van Moolenbroek /*! 1541*83ee113eSDavid van Moolenbroek * 1542*83ee113eSDavid van Moolenbroek * \brief ipv6_pool structure 1543*83ee113eSDavid van Moolenbroek * 1544*83ee113eSDavid van Moolenbroek * This structure is part of a range of addresses or prefixes. 1545*83ee113eSDavid van Moolenbroek * A range6 or prefix6 statement will map to one or more of these 1546*83ee113eSDavid van Moolenbroek * with each pool being a simple block of the form xxxx/yyy and 1547*83ee113eSDavid van Moolenbroek * all the pools adding up to comprise the entire range. When 1548*83ee113eSDavid van Moolenbroek * choosing an address or prefix the code will walk through the 1549*83ee113eSDavid van Moolenbroek * pools until it finds one that is available. 1550*83ee113eSDavid van Moolenbroek * 1551*83ee113eSDavid van Moolenbroek * The naming for this structure is unfortunate as there is also 1552*83ee113eSDavid van Moolenbroek * a v4 pool structure and the two are not equivalent. The v4 1553*83ee113eSDavid van Moolenbroek * pool matches the ipv6_pond structure. I considered changing the 1554*83ee113eSDavid van Moolenbroek * name of this structure but concluded that doing so would be worse 1555*83ee113eSDavid van Moolenbroek * than leaving it as is. Changing it adds some risk and makes for 1556*83ee113eSDavid van Moolenbroek * larger differences between the 4.1 & 4.2 code and the 4.3 code. 1557*83ee113eSDavid van Moolenbroek * 1558*83ee113eSDavid van Moolenbroek */ 1559*83ee113eSDavid van Moolenbroek 1560*83ee113eSDavid van Moolenbroek struct ipv6_pool { 1561*83ee113eSDavid van Moolenbroek int refcnt; /* reference count */ 1562*83ee113eSDavid van Moolenbroek u_int16_t pool_type; /* IA_xx */ 1563*83ee113eSDavid van Moolenbroek struct in6_addr start_addr; /* first IPv6 address */ 1564*83ee113eSDavid van Moolenbroek int bits; /* number of bits, CIDR style */ 1565*83ee113eSDavid van Moolenbroek int units; /* allocation unit in bits */ 1566*83ee113eSDavid van Moolenbroek iasubopt_hash_t *leases; /* non-free leases */ 1567*83ee113eSDavid van Moolenbroek int num_active; /* count of active leases */ 1568*83ee113eSDavid van Moolenbroek isc_heap_t *active_timeouts; /* timeouts for active leases */ 1569*83ee113eSDavid van Moolenbroek int num_inactive; /* count of inactive leases */ 1570*83ee113eSDavid van Moolenbroek isc_heap_t *inactive_timeouts; /* timeouts for expired or 1571*83ee113eSDavid van Moolenbroek released leases */ 1572*83ee113eSDavid van Moolenbroek struct shared_network *shared_network; /* shared_network for 1573*83ee113eSDavid van Moolenbroek this pool */ 1574*83ee113eSDavid van Moolenbroek struct subnet *subnet; /* subnet for this pool */ 1575*83ee113eSDavid van Moolenbroek struct ipv6_pond *ipv6_pond; /* pond for this pool */ 1576*83ee113eSDavid van Moolenbroek }; 1577*83ee113eSDavid van Moolenbroek 1578*83ee113eSDavid van Moolenbroek /*! 1579*83ee113eSDavid van Moolenbroek * 1580*83ee113eSDavid van Moolenbroek * \brief ipv6_pond structure 1581*83ee113eSDavid van Moolenbroek * 1582*83ee113eSDavid van Moolenbroek * This structure is the ipv6 version of the v4 pool structure. 1583*83ee113eSDavid van Moolenbroek * It contains the address and prefix information via the pointers 1584*83ee113eSDavid van Moolenbroek * to the ipv6_pools and the allowability of this pool for a given 1585*83ee113eSDavid van Moolenbroek * client via the permit lists and the valid TIMEs. 1586*83ee113eSDavid van Moolenbroek * 1587*83ee113eSDavid van Moolenbroek */ 1588*83ee113eSDavid van Moolenbroek 1589*83ee113eSDavid van Moolenbroek struct ipv6_pond { 1590*83ee113eSDavid van Moolenbroek int refcnt; 1591*83ee113eSDavid van Moolenbroek struct ipv6_pond *next; 1592*83ee113eSDavid van Moolenbroek struct group *group; 1593*83ee113eSDavid van Moolenbroek struct shared_network *shared_network; /* backpointer to the enclosing 1594*83ee113eSDavid van Moolenbroek shared network */ 1595*83ee113eSDavid van Moolenbroek struct permit *permit_list; /* allow clients from this list */ 1596*83ee113eSDavid van Moolenbroek struct permit *prohibit_list; /* deny clients from this list */ 1597*83ee113eSDavid van Moolenbroek TIME valid_from; /* deny pool use before this date */ 1598*83ee113eSDavid van Moolenbroek TIME valid_until; /* deny pool use after this date */ 1599*83ee113eSDavid van Moolenbroek 1600*83ee113eSDavid van Moolenbroek struct ipv6_pool **ipv6_pools; /* NULL-terminated array */ 1601*83ee113eSDavid van Moolenbroek int last_ipv6_pool; /* offset of last IPv6 pool 1602*83ee113eSDavid van Moolenbroek used to issue a lease */ 1603*83ee113eSDavid van Moolenbroek }; 1604*83ee113eSDavid van Moolenbroek 1605*83ee113eSDavid van Moolenbroek /* Flags and state for dhcp_ddns_cb_t */ 1606*83ee113eSDavid van Moolenbroek #define DDNS_UPDATE_ADDR 0x01 1607*83ee113eSDavid van Moolenbroek #define DDNS_UPDATE_PTR 0x02 1608*83ee113eSDavid van Moolenbroek #define DDNS_INCLUDE_RRSET 0x04 1609*83ee113eSDavid van Moolenbroek #define DDNS_CONFLICT_OVERRIDE 0x08 1610*83ee113eSDavid van Moolenbroek #define DDNS_CLIENT_DID_UPDATE 0x10 1611*83ee113eSDavid van Moolenbroek #define DDNS_EXECUTE_NEXT 0x20 1612*83ee113eSDavid van Moolenbroek #define DDNS_ABORT 0x40 1613*83ee113eSDavid van Moolenbroek #define DDNS_STATIC_LEASE 0x80 1614*83ee113eSDavid van Moolenbroek #define DDNS_ACTIVE_LEASE 0x100 1615*83ee113eSDavid van Moolenbroek /* 1616*83ee113eSDavid van Moolenbroek * The following two groups are separate and we could reuse 1617*83ee113eSDavid van Moolenbroek * values but not reusing them may be useful in the future. 1618*83ee113eSDavid van Moolenbroek */ 1619*83ee113eSDavid van Moolenbroek #define DDNS_STATE_CLEANUP 0 // The previous step failed, cleanup 1620*83ee113eSDavid van Moolenbroek 1621*83ee113eSDavid van Moolenbroek #define DDNS_STATE_ADD_FW_NXDOMAIN 1 1622*83ee113eSDavid van Moolenbroek #define DDNS_STATE_ADD_FW_YXDHCID 2 1623*83ee113eSDavid van Moolenbroek #define DDNS_STATE_ADD_PTR 3 1624*83ee113eSDavid van Moolenbroek 1625*83ee113eSDavid van Moolenbroek #define DDNS_STATE_REM_FW_YXDHCID 17 1626*83ee113eSDavid van Moolenbroek #define DDNS_STATE_REM_FW_NXRR 18 1627*83ee113eSDavid van Moolenbroek #define DDNS_STATE_REM_PTR 19 1628*83ee113eSDavid van Moolenbroek 1629*83ee113eSDavid van Moolenbroek /* 1630*83ee113eSDavid van Moolenbroek * Flags for the dns print function 1631*83ee113eSDavid van Moolenbroek */ 1632*83ee113eSDavid van Moolenbroek #define DDNS_PRINT_INBOUND 1 1633*83ee113eSDavid van Moolenbroek #define DDNS_PRINT_OUTBOUND 0 1634*83ee113eSDavid van Moolenbroek 1635*83ee113eSDavid van Moolenbroek struct dhcp_ddns_cb; 1636*83ee113eSDavid van Moolenbroek 1637*83ee113eSDavid van Moolenbroek typedef void (*ddns_action_t)(struct dhcp_ddns_cb *ddns_cb, 1638*83ee113eSDavid van Moolenbroek isc_result_t result); 1639*83ee113eSDavid van Moolenbroek 1640*83ee113eSDavid van Moolenbroek typedef struct dhcp_ddns_cb { 1641*83ee113eSDavid van Moolenbroek struct data_string fwd_name; 1642*83ee113eSDavid van Moolenbroek struct data_string rev_name; 1643*83ee113eSDavid van Moolenbroek struct data_string dhcid; 1644*83ee113eSDavid van Moolenbroek struct iaddr address; 1645*83ee113eSDavid van Moolenbroek int address_type; 1646*83ee113eSDavid van Moolenbroek 1647*83ee113eSDavid van Moolenbroek unsigned long ttl; 1648*83ee113eSDavid van Moolenbroek 1649*83ee113eSDavid van Moolenbroek unsigned char zone_name[DHCP_MAXDNS_WIRE]; 1650*83ee113eSDavid van Moolenbroek isc_sockaddrlist_t zone_server_list; 1651*83ee113eSDavid van Moolenbroek isc_sockaddr_t zone_addrs[DHCP_MAXNS]; 1652*83ee113eSDavid van Moolenbroek int zone_addr_count; 1653*83ee113eSDavid van Moolenbroek struct dns_zone *zone; 1654*83ee113eSDavid van Moolenbroek 1655*83ee113eSDavid van Moolenbroek u_int16_t flags; 1656*83ee113eSDavid van Moolenbroek TIME timeout; 1657*83ee113eSDavid van Moolenbroek int state; 1658*83ee113eSDavid van Moolenbroek ddns_action_t cur_func; 1659*83ee113eSDavid van Moolenbroek 1660*83ee113eSDavid van Moolenbroek struct dhcp_ddns_cb * next_op; 1661*83ee113eSDavid van Moolenbroek 1662*83ee113eSDavid van Moolenbroek /* Lease or client state that triggered the ddns operation */ 1663*83ee113eSDavid van Moolenbroek void *lease; 1664*83ee113eSDavid van Moolenbroek struct binding_scope **scope; 1665*83ee113eSDavid van Moolenbroek 1666*83ee113eSDavid van Moolenbroek void *transaction; 1667*83ee113eSDavid van Moolenbroek void *dataspace; 1668*83ee113eSDavid van Moolenbroek 1669*83ee113eSDavid van Moolenbroek dns_rdataclass_t dhcid_class; 1670*83ee113eSDavid van Moolenbroek char *lease_tag; 1671*83ee113eSDavid van Moolenbroek } dhcp_ddns_cb_t; 1672*83ee113eSDavid van Moolenbroek 1673*83ee113eSDavid van Moolenbroek extern struct ipv6_pool **pools; 1674*83ee113eSDavid van Moolenbroek extern int num_pools; 1675*83ee113eSDavid van Moolenbroek 1676*83ee113eSDavid van Moolenbroek /* External definitions... */ 1677*83ee113eSDavid van Moolenbroek 1678*83ee113eSDavid van Moolenbroek HASH_FUNCTIONS_DECL (group, const char *, struct group_object, group_hash_t) 1679*83ee113eSDavid van Moolenbroek HASH_FUNCTIONS_DECL (universe, const char *, struct universe, universe_hash_t) 1680*83ee113eSDavid van Moolenbroek HASH_FUNCTIONS_DECL (option_name, const char *, struct option, 1681*83ee113eSDavid van Moolenbroek option_name_hash_t) 1682*83ee113eSDavid van Moolenbroek HASH_FUNCTIONS_DECL (option_code, const unsigned *, struct option, 1683*83ee113eSDavid van Moolenbroek option_code_hash_t) 1684*83ee113eSDavid van Moolenbroek HASH_FUNCTIONS_DECL (dns_zone, const char *, struct dns_zone, dns_zone_hash_t) 1685*83ee113eSDavid van Moolenbroek HASH_FUNCTIONS_DECL(lease_ip, const unsigned char *, struct lease, 1686*83ee113eSDavid van Moolenbroek lease_ip_hash_t) 1687*83ee113eSDavid van Moolenbroek HASH_FUNCTIONS_DECL(lease_id, const unsigned char *, struct lease, 1688*83ee113eSDavid van Moolenbroek lease_id_hash_t) 1689*83ee113eSDavid van Moolenbroek HASH_FUNCTIONS_DECL (host, const unsigned char *, struct host_decl, host_hash_t) 1690*83ee113eSDavid van Moolenbroek HASH_FUNCTIONS_DECL (class, const char *, struct class, class_hash_t) 1691*83ee113eSDavid van Moolenbroek 1692*83ee113eSDavid van Moolenbroek /* options.c */ 1693*83ee113eSDavid van Moolenbroek 1694*83ee113eSDavid van Moolenbroek extern struct option *vendor_cfg_option; 1695*83ee113eSDavid van Moolenbroek int parse_options (struct packet *); 1696*83ee113eSDavid van Moolenbroek int parse_option_buffer (struct option_state *, const unsigned char *, 1697*83ee113eSDavid van Moolenbroek unsigned, struct universe *); 1698*83ee113eSDavid van Moolenbroek struct universe *find_option_universe (struct option *, const char *); 1699*83ee113eSDavid van Moolenbroek int parse_encapsulated_suboptions (struct option_state *, struct option *, 1700*83ee113eSDavid van Moolenbroek const unsigned char *, unsigned, 1701*83ee113eSDavid van Moolenbroek struct universe *, const char *); 1702*83ee113eSDavid van Moolenbroek int cons_options (struct packet *, struct dhcp_packet *, struct lease *, 1703*83ee113eSDavid van Moolenbroek struct client_state *, 1704*83ee113eSDavid van Moolenbroek int, struct option_state *, struct option_state *, 1705*83ee113eSDavid van Moolenbroek struct binding_scope **, 1706*83ee113eSDavid van Moolenbroek int, int, int, struct data_string *, const char *); 1707*83ee113eSDavid van Moolenbroek int fqdn_universe_decode (struct option_state *, 1708*83ee113eSDavid van Moolenbroek const unsigned char *, unsigned, struct universe *); 1709*83ee113eSDavid van Moolenbroek struct option_cache * 1710*83ee113eSDavid van Moolenbroek lookup_fqdn6_option(struct universe *universe, struct option_state *options, 1711*83ee113eSDavid van Moolenbroek unsigned code); 1712*83ee113eSDavid van Moolenbroek void 1713*83ee113eSDavid van Moolenbroek save_fqdn6_option(struct universe *universe, struct option_state *options, 1714*83ee113eSDavid van Moolenbroek struct option_cache *oc, isc_boolean_t appendp); 1715*83ee113eSDavid van Moolenbroek void 1716*83ee113eSDavid van Moolenbroek delete_fqdn6_option(struct universe *universe, struct option_state *options, 1717*83ee113eSDavid van Moolenbroek int code); 1718*83ee113eSDavid van Moolenbroek void 1719*83ee113eSDavid van Moolenbroek fqdn6_option_space_foreach(struct packet *packet, struct lease *lease, 1720*83ee113eSDavid van Moolenbroek struct client_state *client_state, 1721*83ee113eSDavid van Moolenbroek struct option_state *in_options, 1722*83ee113eSDavid van Moolenbroek struct option_state *cfg_options, 1723*83ee113eSDavid van Moolenbroek struct binding_scope **scope, 1724*83ee113eSDavid van Moolenbroek struct universe *u, void *stuff, 1725*83ee113eSDavid van Moolenbroek void (*func)(struct option_cache *, 1726*83ee113eSDavid van Moolenbroek struct packet *, 1727*83ee113eSDavid van Moolenbroek struct lease *, 1728*83ee113eSDavid van Moolenbroek struct client_state *, 1729*83ee113eSDavid van Moolenbroek struct option_state *, 1730*83ee113eSDavid van Moolenbroek struct option_state *, 1731*83ee113eSDavid van Moolenbroek struct binding_scope **, 1732*83ee113eSDavid van Moolenbroek struct universe *, void *)); 1733*83ee113eSDavid van Moolenbroek int 1734*83ee113eSDavid van Moolenbroek fqdn6_option_space_encapsulate(struct data_string *result, 1735*83ee113eSDavid van Moolenbroek struct packet *packet, struct lease *lease, 1736*83ee113eSDavid van Moolenbroek struct client_state *client_state, 1737*83ee113eSDavid van Moolenbroek struct option_state *in_options, 1738*83ee113eSDavid van Moolenbroek struct option_state *cfg_options, 1739*83ee113eSDavid van Moolenbroek struct binding_scope **scope, 1740*83ee113eSDavid van Moolenbroek struct universe *universe); 1741*83ee113eSDavid van Moolenbroek int 1742*83ee113eSDavid van Moolenbroek fqdn6_universe_decode(struct option_state *options, 1743*83ee113eSDavid van Moolenbroek const unsigned char *buffer, unsigned length, 1744*83ee113eSDavid van Moolenbroek struct universe *u); 1745*83ee113eSDavid van Moolenbroek int append_option(struct data_string *dst, struct universe *universe, 1746*83ee113eSDavid van Moolenbroek struct option *option, struct data_string *src); 1747*83ee113eSDavid van Moolenbroek int 1748*83ee113eSDavid van Moolenbroek store_options(int *ocount, 1749*83ee113eSDavid van Moolenbroek unsigned char *buffer, unsigned buflen, unsigned index, 1750*83ee113eSDavid van Moolenbroek struct packet *packet, struct lease *lease, 1751*83ee113eSDavid van Moolenbroek struct client_state *client_state, 1752*83ee113eSDavid van Moolenbroek struct option_state *in_options, 1753*83ee113eSDavid van Moolenbroek struct option_state *cfg_options, 1754*83ee113eSDavid van Moolenbroek struct binding_scope **scope, 1755*83ee113eSDavid van Moolenbroek unsigned *priority_list, int priority_len, 1756*83ee113eSDavid van Moolenbroek unsigned first_cutoff, int second_cutoff, int terminate, 1757*83ee113eSDavid van Moolenbroek const char *vuname); 1758*83ee113eSDavid van Moolenbroek int store_options6(char *, int, struct option_state *, struct packet *, 1759*83ee113eSDavid van Moolenbroek const int *, struct data_string *); 1760*83ee113eSDavid van Moolenbroek int format_has_text(const char *); 1761*83ee113eSDavid van Moolenbroek int format_min_length(const char *, struct option_cache *); 1762*83ee113eSDavid van Moolenbroek const char *pretty_print_option (struct option *, const unsigned char *, 1763*83ee113eSDavid van Moolenbroek unsigned, int, int); 1764*83ee113eSDavid van Moolenbroek int pretty_escape(char **, char *, const unsigned char **, 1765*83ee113eSDavid van Moolenbroek const unsigned char *); 1766*83ee113eSDavid van Moolenbroek int get_option (struct data_string *, struct universe *, 1767*83ee113eSDavid van Moolenbroek struct packet *, struct lease *, struct client_state *, 1768*83ee113eSDavid van Moolenbroek struct option_state *, struct option_state *, 1769*83ee113eSDavid van Moolenbroek struct option_state *, struct binding_scope **, unsigned, 1770*83ee113eSDavid van Moolenbroek const char *, int); 1771*83ee113eSDavid van Moolenbroek void set_option (struct universe *, struct option_state *, 1772*83ee113eSDavid van Moolenbroek struct option_cache *, enum statement_op); 1773*83ee113eSDavid van Moolenbroek struct option_cache *lookup_option (struct universe *, 1774*83ee113eSDavid van Moolenbroek struct option_state *, unsigned); 1775*83ee113eSDavid van Moolenbroek struct option_cache *lookup_hashed_option (struct universe *, 1776*83ee113eSDavid van Moolenbroek struct option_state *, 1777*83ee113eSDavid van Moolenbroek unsigned); 1778*83ee113eSDavid van Moolenbroek struct option_cache *next_hashed_option(struct universe *, 1779*83ee113eSDavid van Moolenbroek struct option_state *, 1780*83ee113eSDavid van Moolenbroek struct option_cache *); 1781*83ee113eSDavid van Moolenbroek int save_option_buffer (struct universe *, struct option_state *, 1782*83ee113eSDavid van Moolenbroek struct buffer *, unsigned char *, unsigned, 1783*83ee113eSDavid van Moolenbroek unsigned, int); 1784*83ee113eSDavid van Moolenbroek int append_option_buffer(struct universe *, struct option_state *, 1785*83ee113eSDavid van Moolenbroek struct buffer *, unsigned char *, unsigned, 1786*83ee113eSDavid van Moolenbroek unsigned, int); 1787*83ee113eSDavid van Moolenbroek void build_server_oro(struct data_string *, struct option_state *, 1788*83ee113eSDavid van Moolenbroek const char *, int); 1789*83ee113eSDavid van Moolenbroek void save_option(struct universe *, struct option_state *, 1790*83ee113eSDavid van Moolenbroek struct option_cache *); 1791*83ee113eSDavid van Moolenbroek void also_save_option(struct universe *, struct option_state *, 1792*83ee113eSDavid van Moolenbroek struct option_cache *); 1793*83ee113eSDavid van Moolenbroek void save_hashed_option(struct universe *, struct option_state *, 1794*83ee113eSDavid van Moolenbroek struct option_cache *, isc_boolean_t appendp); 1795*83ee113eSDavid van Moolenbroek void delete_option (struct universe *, struct option_state *, int); 1796*83ee113eSDavid van Moolenbroek void delete_hashed_option (struct universe *, 1797*83ee113eSDavid van Moolenbroek struct option_state *, int); 1798*83ee113eSDavid van Moolenbroek int option_cache_dereference (struct option_cache **, 1799*83ee113eSDavid van Moolenbroek const char *, int); 1800*83ee113eSDavid van Moolenbroek int hashed_option_state_dereference (struct universe *, 1801*83ee113eSDavid van Moolenbroek struct option_state *, 1802*83ee113eSDavid van Moolenbroek const char *, int); 1803*83ee113eSDavid van Moolenbroek int store_option (struct data_string *, 1804*83ee113eSDavid van Moolenbroek struct universe *, struct packet *, struct lease *, 1805*83ee113eSDavid van Moolenbroek struct client_state *, 1806*83ee113eSDavid van Moolenbroek struct option_state *, struct option_state *, 1807*83ee113eSDavid van Moolenbroek struct binding_scope **, struct option_cache *); 1808*83ee113eSDavid van Moolenbroek int option_space_encapsulate (struct data_string *, 1809*83ee113eSDavid van Moolenbroek struct packet *, struct lease *, 1810*83ee113eSDavid van Moolenbroek struct client_state *, 1811*83ee113eSDavid van Moolenbroek struct option_state *, 1812*83ee113eSDavid van Moolenbroek struct option_state *, 1813*83ee113eSDavid van Moolenbroek struct binding_scope **, 1814*83ee113eSDavid van Moolenbroek struct data_string *); 1815*83ee113eSDavid van Moolenbroek int hashed_option_space_encapsulate (struct data_string *, 1816*83ee113eSDavid van Moolenbroek struct packet *, struct lease *, 1817*83ee113eSDavid van Moolenbroek struct client_state *, 1818*83ee113eSDavid van Moolenbroek struct option_state *, 1819*83ee113eSDavid van Moolenbroek struct option_state *, 1820*83ee113eSDavid van Moolenbroek struct binding_scope **, 1821*83ee113eSDavid van Moolenbroek struct universe *); 1822*83ee113eSDavid van Moolenbroek int nwip_option_space_encapsulate (struct data_string *, 1823*83ee113eSDavid van Moolenbroek struct packet *, struct lease *, 1824*83ee113eSDavid van Moolenbroek struct client_state *, 1825*83ee113eSDavid van Moolenbroek struct option_state *, 1826*83ee113eSDavid van Moolenbroek struct option_state *, 1827*83ee113eSDavid van Moolenbroek struct binding_scope **, 1828*83ee113eSDavid van Moolenbroek struct universe *); 1829*83ee113eSDavid van Moolenbroek int fqdn_option_space_encapsulate (struct data_string *, 1830*83ee113eSDavid van Moolenbroek struct packet *, struct lease *, 1831*83ee113eSDavid van Moolenbroek struct client_state *, 1832*83ee113eSDavid van Moolenbroek struct option_state *, 1833*83ee113eSDavid van Moolenbroek struct option_state *, 1834*83ee113eSDavid van Moolenbroek struct binding_scope **, 1835*83ee113eSDavid van Moolenbroek struct universe *); 1836*83ee113eSDavid van Moolenbroek void suboption_foreach (struct packet *, struct lease *, struct client_state *, 1837*83ee113eSDavid van Moolenbroek struct option_state *, struct option_state *, 1838*83ee113eSDavid van Moolenbroek struct binding_scope **, struct universe *, void *, 1839*83ee113eSDavid van Moolenbroek void (*) (struct option_cache *, struct packet *, 1840*83ee113eSDavid van Moolenbroek struct lease *, struct client_state *, 1841*83ee113eSDavid van Moolenbroek struct option_state *, struct option_state *, 1842*83ee113eSDavid van Moolenbroek struct binding_scope **, 1843*83ee113eSDavid van Moolenbroek struct universe *, void *), 1844*83ee113eSDavid van Moolenbroek struct option_cache *, const char *); 1845*83ee113eSDavid van Moolenbroek void option_space_foreach (struct packet *, struct lease *, 1846*83ee113eSDavid van Moolenbroek struct client_state *, 1847*83ee113eSDavid van Moolenbroek struct option_state *, 1848*83ee113eSDavid van Moolenbroek struct option_state *, 1849*83ee113eSDavid van Moolenbroek struct binding_scope **, 1850*83ee113eSDavid van Moolenbroek struct universe *, void *, 1851*83ee113eSDavid van Moolenbroek void (*) (struct option_cache *, 1852*83ee113eSDavid van Moolenbroek struct packet *, 1853*83ee113eSDavid van Moolenbroek struct lease *, struct client_state *, 1854*83ee113eSDavid van Moolenbroek struct option_state *, 1855*83ee113eSDavid van Moolenbroek struct option_state *, 1856*83ee113eSDavid van Moolenbroek struct binding_scope **, 1857*83ee113eSDavid van Moolenbroek struct universe *, void *)); 1858*83ee113eSDavid van Moolenbroek void hashed_option_space_foreach (struct packet *, struct lease *, 1859*83ee113eSDavid van Moolenbroek struct client_state *, 1860*83ee113eSDavid van Moolenbroek struct option_state *, 1861*83ee113eSDavid van Moolenbroek struct option_state *, 1862*83ee113eSDavid van Moolenbroek struct binding_scope **, 1863*83ee113eSDavid van Moolenbroek struct universe *, void *, 1864*83ee113eSDavid van Moolenbroek void (*) (struct option_cache *, 1865*83ee113eSDavid van Moolenbroek struct packet *, 1866*83ee113eSDavid van Moolenbroek struct lease *, 1867*83ee113eSDavid van Moolenbroek struct client_state *, 1868*83ee113eSDavid van Moolenbroek struct option_state *, 1869*83ee113eSDavid van Moolenbroek struct option_state *, 1870*83ee113eSDavid van Moolenbroek struct binding_scope **, 1871*83ee113eSDavid van Moolenbroek struct universe *, void *)); 1872*83ee113eSDavid van Moolenbroek int linked_option_get (struct data_string *, struct universe *, 1873*83ee113eSDavid van Moolenbroek struct packet *, struct lease *, 1874*83ee113eSDavid van Moolenbroek struct client_state *, 1875*83ee113eSDavid van Moolenbroek struct option_state *, struct option_state *, 1876*83ee113eSDavid van Moolenbroek struct option_state *, struct binding_scope **, 1877*83ee113eSDavid van Moolenbroek unsigned); 1878*83ee113eSDavid van Moolenbroek int linked_option_state_dereference (struct universe *, 1879*83ee113eSDavid van Moolenbroek struct option_state *, 1880*83ee113eSDavid van Moolenbroek const char *, int); 1881*83ee113eSDavid van Moolenbroek void save_linked_option(struct universe *, struct option_state *, 1882*83ee113eSDavid van Moolenbroek struct option_cache *, isc_boolean_t appendp); 1883*83ee113eSDavid van Moolenbroek void linked_option_space_foreach (struct packet *, struct lease *, 1884*83ee113eSDavid van Moolenbroek struct client_state *, 1885*83ee113eSDavid van Moolenbroek struct option_state *, 1886*83ee113eSDavid van Moolenbroek struct option_state *, 1887*83ee113eSDavid van Moolenbroek struct binding_scope **, 1888*83ee113eSDavid van Moolenbroek struct universe *, void *, 1889*83ee113eSDavid van Moolenbroek void (*) (struct option_cache *, 1890*83ee113eSDavid van Moolenbroek struct packet *, 1891*83ee113eSDavid van Moolenbroek struct lease *, 1892*83ee113eSDavid van Moolenbroek struct client_state *, 1893*83ee113eSDavid van Moolenbroek struct option_state *, 1894*83ee113eSDavid van Moolenbroek struct option_state *, 1895*83ee113eSDavid van Moolenbroek struct binding_scope **, 1896*83ee113eSDavid van Moolenbroek struct universe *, void *)); 1897*83ee113eSDavid van Moolenbroek int linked_option_space_encapsulate (struct data_string *, struct packet *, 1898*83ee113eSDavid van Moolenbroek struct lease *, struct client_state *, 1899*83ee113eSDavid van Moolenbroek struct option_state *, 1900*83ee113eSDavid van Moolenbroek struct option_state *, 1901*83ee113eSDavid van Moolenbroek struct binding_scope **, 1902*83ee113eSDavid van Moolenbroek struct universe *); 1903*83ee113eSDavid van Moolenbroek void delete_linked_option (struct universe *, struct option_state *, int); 1904*83ee113eSDavid van Moolenbroek struct option_cache *lookup_linked_option (struct universe *, 1905*83ee113eSDavid van Moolenbroek struct option_state *, unsigned); 1906*83ee113eSDavid van Moolenbroek void do_packet (struct interface_info *, 1907*83ee113eSDavid van Moolenbroek struct dhcp_packet *, unsigned, 1908*83ee113eSDavid van Moolenbroek unsigned int, struct iaddr, struct hardware *); 1909*83ee113eSDavid van Moolenbroek void do_packet6(struct interface_info *, const char *, 1910*83ee113eSDavid van Moolenbroek int, int, const struct iaddr *, isc_boolean_t); 1911*83ee113eSDavid van Moolenbroek int packet6_len_okay(const char *, int); 1912*83ee113eSDavid van Moolenbroek 1913*83ee113eSDavid van Moolenbroek int validate_packet(struct packet *); 1914*83ee113eSDavid van Moolenbroek 1915*83ee113eSDavid van Moolenbroek int add_option(struct option_state *options, 1916*83ee113eSDavid van Moolenbroek unsigned int option_num, 1917*83ee113eSDavid van Moolenbroek void *data, 1918*83ee113eSDavid van Moolenbroek unsigned int data_len); 1919*83ee113eSDavid van Moolenbroek 1920*83ee113eSDavid van Moolenbroek /* dhcpd.c */ 1921*83ee113eSDavid van Moolenbroek extern struct timeval cur_tv; 1922*83ee113eSDavid van Moolenbroek #define cur_time cur_tv.tv_sec 1923*83ee113eSDavid van Moolenbroek 1924*83ee113eSDavid van Moolenbroek extern int ddns_update_style; 1925*83ee113eSDavid van Moolenbroek extern int dont_use_fsync; 1926*83ee113eSDavid van Moolenbroek 1927*83ee113eSDavid van Moolenbroek extern const char *path_dhcpd_conf; 1928*83ee113eSDavid van Moolenbroek extern const char *path_dhcpd_db; 1929*83ee113eSDavid van Moolenbroek extern const char *path_dhcpd_pid; 1930*83ee113eSDavid van Moolenbroek 1931*83ee113eSDavid van Moolenbroek extern int dhcp_max_agent_option_packet_length; 1932*83ee113eSDavid van Moolenbroek extern struct eventqueue *rw_queue_empty; 1933*83ee113eSDavid van Moolenbroek 1934*83ee113eSDavid van Moolenbroek int main(int, char **); 1935*83ee113eSDavid van Moolenbroek void postconf_initialization(int); 1936*83ee113eSDavid van Moolenbroek void postdb_startup(void); 1937*83ee113eSDavid van Moolenbroek void cleanup (void); 1938*83ee113eSDavid van Moolenbroek void lease_pinged (struct iaddr, u_int8_t *, int); 1939*83ee113eSDavid van Moolenbroek void lease_ping_timeout (void *); 1940*83ee113eSDavid van Moolenbroek int dhcpd_interface_setup_hook (struct interface_info *ip, struct iaddr *ia); 1941*83ee113eSDavid van Moolenbroek extern enum dhcp_shutdown_state shutdown_state; 1942*83ee113eSDavid van Moolenbroek isc_result_t dhcp_io_shutdown (omapi_object_t *, void *); 1943*83ee113eSDavid van Moolenbroek isc_result_t dhcp_set_control_state (control_object_state_t oldstate, 1944*83ee113eSDavid van Moolenbroek control_object_state_t newstate); 1945*83ee113eSDavid van Moolenbroek #if defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT) 1946*83ee113eSDavid van Moolenbroek void relinquish_ackqueue(void); 1947*83ee113eSDavid van Moolenbroek #endif 1948*83ee113eSDavid van Moolenbroek 1949*83ee113eSDavid van Moolenbroek /* conflex.c */ 1950*83ee113eSDavid van Moolenbroek isc_result_t new_parse (struct parse **, int, 1951*83ee113eSDavid van Moolenbroek char *, unsigned, const char *, int); 1952*83ee113eSDavid van Moolenbroek isc_result_t end_parse (struct parse **); 1953*83ee113eSDavid van Moolenbroek isc_result_t save_parse_state(struct parse *cfile); 1954*83ee113eSDavid van Moolenbroek isc_result_t restore_parse_state(struct parse *cfile); 1955*83ee113eSDavid van Moolenbroek enum dhcp_token next_token (const char **, unsigned *, struct parse *); 1956*83ee113eSDavid van Moolenbroek enum dhcp_token peek_token (const char **, unsigned *, struct parse *); 1957*83ee113eSDavid van Moolenbroek enum dhcp_token next_raw_token(const char **rval, unsigned *rlen, 1958*83ee113eSDavid van Moolenbroek struct parse *cfile); 1959*83ee113eSDavid van Moolenbroek enum dhcp_token peek_raw_token(const char **rval, unsigned *rlen, 1960*83ee113eSDavid van Moolenbroek struct parse *cfile); 1961*83ee113eSDavid van Moolenbroek /* 1962*83ee113eSDavid van Moolenbroek * Use skip_token when we are skipping a token we have previously 1963*83ee113eSDavid van Moolenbroek * used peek_token on as we know what the result will be in this case. 1964*83ee113eSDavid van Moolenbroek */ 1965*83ee113eSDavid van Moolenbroek #define skip_token(a,b,c) ((void) next_token((a),(b),(c))) 1966*83ee113eSDavid van Moolenbroek 1967*83ee113eSDavid van Moolenbroek 1968*83ee113eSDavid van Moolenbroek /* confpars.c */ 1969*83ee113eSDavid van Moolenbroek void parse_trace_setup (void); 1970*83ee113eSDavid van Moolenbroek isc_result_t readconf (void); 1971*83ee113eSDavid van Moolenbroek isc_result_t read_conf_file (const char *, struct group *, int, int); 1972*83ee113eSDavid van Moolenbroek #if defined (TRACING) 1973*83ee113eSDavid van Moolenbroek void trace_conf_input (trace_type_t *, unsigned, char *); 1974*83ee113eSDavid van Moolenbroek void trace_conf_stop (trace_type_t *ttype); 1975*83ee113eSDavid van Moolenbroek #endif 1976*83ee113eSDavid van Moolenbroek isc_result_t conf_file_subparse (struct parse *, struct group *, int); 1977*83ee113eSDavid van Moolenbroek isc_result_t lease_file_subparse (struct parse *); 1978*83ee113eSDavid van Moolenbroek int parse_statement (struct parse *, struct group *, int, 1979*83ee113eSDavid van Moolenbroek struct host_decl *, int); 1980*83ee113eSDavid van Moolenbroek #if defined (FAILOVER_PROTOCOL) 1981*83ee113eSDavid van Moolenbroek void parse_failover_peer (struct parse *, struct group *, int); 1982*83ee113eSDavid van Moolenbroek void parse_failover_state_declaration (struct parse *, 1983*83ee113eSDavid van Moolenbroek dhcp_failover_state_t *); 1984*83ee113eSDavid van Moolenbroek void parse_failover_state (struct parse *, 1985*83ee113eSDavid van Moolenbroek enum failover_state *, TIME *); 1986*83ee113eSDavid van Moolenbroek #endif 1987*83ee113eSDavid van Moolenbroek int permit_list_match (struct permit *, struct permit *); 1988*83ee113eSDavid van Moolenbroek void parse_pool_statement (struct parse *, struct group *, int); 1989*83ee113eSDavid van Moolenbroek int parse_lbrace (struct parse *); 1990*83ee113eSDavid van Moolenbroek void parse_host_declaration (struct parse *, struct group *); 1991*83ee113eSDavid van Moolenbroek int parse_class_declaration (struct class **, struct parse *, 1992*83ee113eSDavid van Moolenbroek struct group *, int); 1993*83ee113eSDavid van Moolenbroek void parse_shared_net_declaration (struct parse *, struct group *); 1994*83ee113eSDavid van Moolenbroek void parse_subnet_declaration (struct parse *, 1995*83ee113eSDavid van Moolenbroek struct shared_network *); 1996*83ee113eSDavid van Moolenbroek void parse_subnet6_declaration (struct parse *, 1997*83ee113eSDavid van Moolenbroek struct shared_network *); 1998*83ee113eSDavid van Moolenbroek void parse_group_declaration (struct parse *, struct group *); 1999*83ee113eSDavid van Moolenbroek int parse_fixed_addr_param (struct option_cache **, 2000*83ee113eSDavid van Moolenbroek struct parse *, enum dhcp_token); 2001*83ee113eSDavid van Moolenbroek int parse_lease_declaration (struct lease **, struct parse *); 2002*83ee113eSDavid van Moolenbroek int parse_ip6_addr(struct parse *, struct iaddr *); 2003*83ee113eSDavid van Moolenbroek int parse_ip6_addr_expr(struct expression **, struct parse *); 2004*83ee113eSDavid van Moolenbroek int parse_ip6_prefix(struct parse *, struct iaddr *, u_int8_t *); 2005*83ee113eSDavid van Moolenbroek void parse_address_range (struct parse *, struct group *, int, 2006*83ee113eSDavid van Moolenbroek struct pool *, struct lease **); 2007*83ee113eSDavid van Moolenbroek void parse_address_range6(struct parse *cfile, struct group *group, 2008*83ee113eSDavid van Moolenbroek struct ipv6_pond *); 2009*83ee113eSDavid van Moolenbroek void parse_prefix6(struct parse *cfile, struct group *group, 2010*83ee113eSDavid van Moolenbroek struct ipv6_pond *); 2011*83ee113eSDavid van Moolenbroek void parse_fixed_prefix6(struct parse *cfile, struct host_decl *host_decl); 2012*83ee113eSDavid van Moolenbroek void parse_ia_na_declaration(struct parse *); 2013*83ee113eSDavid van Moolenbroek void parse_ia_ta_declaration(struct parse *); 2014*83ee113eSDavid van Moolenbroek void parse_ia_pd_declaration(struct parse *); 2015*83ee113eSDavid van Moolenbroek void parse_server_duid(struct parse *cfile); 2016*83ee113eSDavid van Moolenbroek void parse_server_duid_conf(struct parse *cfile); 2017*83ee113eSDavid van Moolenbroek void parse_pool6_statement (struct parse *, struct group *, int); 2018*83ee113eSDavid van Moolenbroek 2019*83ee113eSDavid van Moolenbroek /* ddns.c */ 2020*83ee113eSDavid van Moolenbroek int ddns_updates(struct packet *, struct lease *, struct lease *, 2021*83ee113eSDavid van Moolenbroek struct iasubopt *, struct iasubopt *, struct option_state *); 2022*83ee113eSDavid van Moolenbroek isc_result_t ddns_removals(struct lease *, struct iasubopt *, 2023*83ee113eSDavid van Moolenbroek struct dhcp_ddns_cb *, isc_boolean_t); 2024*83ee113eSDavid van Moolenbroek #if defined (TRACING) 2025*83ee113eSDavid van Moolenbroek void trace_ddns_init(void); 2026*83ee113eSDavid van Moolenbroek #endif 2027*83ee113eSDavid van Moolenbroek 2028*83ee113eSDavid van Moolenbroek /* parse.c */ 2029*83ee113eSDavid van Moolenbroek void add_enumeration (struct enumeration *); 2030*83ee113eSDavid van Moolenbroek struct enumeration *find_enumeration (const char *, int); 2031*83ee113eSDavid van Moolenbroek struct enumeration_value *find_enumeration_value (const char *, int, 2032*83ee113eSDavid van Moolenbroek unsigned *, 2033*83ee113eSDavid van Moolenbroek const char *); 2034*83ee113eSDavid van Moolenbroek void skip_to_semi (struct parse *); 2035*83ee113eSDavid van Moolenbroek void skip_to_rbrace (struct parse *, int); 2036*83ee113eSDavid van Moolenbroek int parse_semi (struct parse *); 2037*83ee113eSDavid van Moolenbroek int parse_string (struct parse *, char **, unsigned *); 2038*83ee113eSDavid van Moolenbroek char *parse_host_name (struct parse *); 2039*83ee113eSDavid van Moolenbroek int parse_ip_addr_or_hostname (struct expression **, 2040*83ee113eSDavid van Moolenbroek struct parse *, int); 2041*83ee113eSDavid van Moolenbroek void parse_hardware_param (struct parse *, struct hardware *); 2042*83ee113eSDavid van Moolenbroek void parse_lease_time (struct parse *, TIME *); 2043*83ee113eSDavid van Moolenbroek unsigned char *parse_numeric_aggregate (struct parse *, 2044*83ee113eSDavid van Moolenbroek unsigned char *, unsigned *, 2045*83ee113eSDavid van Moolenbroek int, int, unsigned); 2046*83ee113eSDavid van Moolenbroek void convert_num (struct parse *, unsigned char *, const char *, 2047*83ee113eSDavid van Moolenbroek int, unsigned); 2048*83ee113eSDavid van Moolenbroek TIME parse_date (struct parse *); 2049*83ee113eSDavid van Moolenbroek TIME parse_date_core(struct parse *); 2050*83ee113eSDavid van Moolenbroek isc_result_t parse_option_name (struct parse *, int, int *, 2051*83ee113eSDavid van Moolenbroek struct option **); 2052*83ee113eSDavid van Moolenbroek void parse_option_space_decl (struct parse *); 2053*83ee113eSDavid van Moolenbroek int parse_option_code_definition (struct parse *, struct option *); 2054*83ee113eSDavid van Moolenbroek int parse_base64 (struct data_string *, struct parse *); 2055*83ee113eSDavid van Moolenbroek int parse_cshl (struct data_string *, struct parse *); 2056*83ee113eSDavid van Moolenbroek int parse_executable_statement (struct executable_statement **, 2057*83ee113eSDavid van Moolenbroek struct parse *, int *, 2058*83ee113eSDavid van Moolenbroek enum expression_context); 2059*83ee113eSDavid van Moolenbroek int parse_executable_statements (struct executable_statement **, 2060*83ee113eSDavid van Moolenbroek struct parse *, int *, 2061*83ee113eSDavid van Moolenbroek enum expression_context); 2062*83ee113eSDavid van Moolenbroek int parse_zone (struct dns_zone *, struct parse *); 2063*83ee113eSDavid van Moolenbroek int parse_key (struct parse *); 2064*83ee113eSDavid van Moolenbroek int parse_on_statement (struct executable_statement **, 2065*83ee113eSDavid van Moolenbroek struct parse *, int *); 2066*83ee113eSDavid van Moolenbroek int parse_switch_statement (struct executable_statement **, 2067*83ee113eSDavid van Moolenbroek struct parse *, int *); 2068*83ee113eSDavid van Moolenbroek int parse_case_statement (struct executable_statement **, 2069*83ee113eSDavid van Moolenbroek struct parse *, int *, 2070*83ee113eSDavid van Moolenbroek enum expression_context); 2071*83ee113eSDavid van Moolenbroek int parse_if_statement (struct executable_statement **, 2072*83ee113eSDavid van Moolenbroek struct parse *, int *); 2073*83ee113eSDavid van Moolenbroek int parse_boolean_expression (struct expression **, 2074*83ee113eSDavid van Moolenbroek struct parse *, int *); 2075*83ee113eSDavid van Moolenbroek int parse_boolean (struct parse *); 2076*83ee113eSDavid van Moolenbroek int parse_data_expression (struct expression **, 2077*83ee113eSDavid van Moolenbroek struct parse *, int *); 2078*83ee113eSDavid van Moolenbroek int parse_numeric_expression (struct expression **, 2079*83ee113eSDavid van Moolenbroek struct parse *, int *); 2080*83ee113eSDavid van Moolenbroek int parse_dns_expression (struct expression **, struct parse *, int *); 2081*83ee113eSDavid van Moolenbroek int parse_non_binary (struct expression **, struct parse *, int *, 2082*83ee113eSDavid van Moolenbroek enum expression_context); 2083*83ee113eSDavid van Moolenbroek int parse_expression (struct expression **, struct parse *, int *, 2084*83ee113eSDavid van Moolenbroek enum expression_context, 2085*83ee113eSDavid van Moolenbroek struct expression **, enum expr_op); 2086*83ee113eSDavid van Moolenbroek int parse_option_data(struct expression **expr, struct parse *cfile, 2087*83ee113eSDavid van Moolenbroek int lookups, struct option *option); 2088*83ee113eSDavid van Moolenbroek int parse_option_statement (struct executable_statement **, 2089*83ee113eSDavid van Moolenbroek struct parse *, int, 2090*83ee113eSDavid van Moolenbroek struct option *, enum statement_op); 2091*83ee113eSDavid van Moolenbroek int parse_option_token (struct expression **, struct parse *, 2092*83ee113eSDavid van Moolenbroek const char **, struct expression *, int, int); 2093*83ee113eSDavid van Moolenbroek int parse_allow_deny (struct option_cache **, struct parse *, int); 2094*83ee113eSDavid van Moolenbroek int parse_auth_key (struct data_string *, struct parse *); 2095*83ee113eSDavid van Moolenbroek int parse_warn (struct parse *, const char *, ...) 2096*83ee113eSDavid van Moolenbroek __attribute__((__format__(__printf__,2,3))); 2097*83ee113eSDavid van Moolenbroek struct expression *parse_domain_list(struct parse *cfile, int); 2098*83ee113eSDavid van Moolenbroek 2099*83ee113eSDavid van Moolenbroek 2100*83ee113eSDavid van Moolenbroek /* tree.c */ 2101*83ee113eSDavid van Moolenbroek extern struct binding_scope *global_scope; 2102*83ee113eSDavid van Moolenbroek pair cons (caddr_t, pair); 2103*83ee113eSDavid van Moolenbroek int make_const_option_cache (struct option_cache **, struct buffer **, 2104*83ee113eSDavid van Moolenbroek u_int8_t *, unsigned, struct option *, 2105*83ee113eSDavid van Moolenbroek const char *, int); 2106*83ee113eSDavid van Moolenbroek int make_host_lookup (struct expression **, const char *); 2107*83ee113eSDavid van Moolenbroek int enter_dns_host (struct dns_host_entry **, const char *); 2108*83ee113eSDavid van Moolenbroek int make_const_data (struct expression **, 2109*83ee113eSDavid van Moolenbroek const unsigned char *, unsigned, int, int, 2110*83ee113eSDavid van Moolenbroek const char *, int); 2111*83ee113eSDavid van Moolenbroek int make_const_int (struct expression **, unsigned long); 2112*83ee113eSDavid van Moolenbroek int make_concat (struct expression **, 2113*83ee113eSDavid van Moolenbroek struct expression *, struct expression *); 2114*83ee113eSDavid van Moolenbroek int make_encapsulation (struct expression **, struct data_string *); 2115*83ee113eSDavid van Moolenbroek int make_substring (struct expression **, struct expression *, 2116*83ee113eSDavid van Moolenbroek struct expression *, struct expression *); 2117*83ee113eSDavid van Moolenbroek int make_limit (struct expression **, struct expression *, int); 2118*83ee113eSDavid van Moolenbroek int make_let (struct executable_statement **, const char *); 2119*83ee113eSDavid van Moolenbroek int option_cache (struct option_cache **, struct data_string *, 2120*83ee113eSDavid van Moolenbroek struct expression *, struct option *, 2121*83ee113eSDavid van Moolenbroek const char *, int); 2122*83ee113eSDavid van Moolenbroek int evaluate_expression (struct binding_value **, struct packet *, 2123*83ee113eSDavid van Moolenbroek struct lease *, struct client_state *, 2124*83ee113eSDavid van Moolenbroek struct option_state *, struct option_state *, 2125*83ee113eSDavid van Moolenbroek struct binding_scope **, struct expression *, 2126*83ee113eSDavid van Moolenbroek const char *, int); 2127*83ee113eSDavid van Moolenbroek int binding_value_dereference (struct binding_value **, const char *, int); 2128*83ee113eSDavid van Moolenbroek int evaluate_boolean_expression (int *, 2129*83ee113eSDavid van Moolenbroek struct packet *, struct lease *, 2130*83ee113eSDavid van Moolenbroek struct client_state *, 2131*83ee113eSDavid van Moolenbroek struct option_state *, 2132*83ee113eSDavid van Moolenbroek struct option_state *, 2133*83ee113eSDavid van Moolenbroek struct binding_scope **, 2134*83ee113eSDavid van Moolenbroek struct expression *); 2135*83ee113eSDavid van Moolenbroek int evaluate_data_expression (struct data_string *, 2136*83ee113eSDavid van Moolenbroek struct packet *, struct lease *, 2137*83ee113eSDavid van Moolenbroek struct client_state *, 2138*83ee113eSDavid van Moolenbroek struct option_state *, 2139*83ee113eSDavid van Moolenbroek struct option_state *, 2140*83ee113eSDavid van Moolenbroek struct binding_scope **, 2141*83ee113eSDavid van Moolenbroek struct expression *, 2142*83ee113eSDavid van Moolenbroek const char *, int); 2143*83ee113eSDavid van Moolenbroek int evaluate_numeric_expression (unsigned long *, struct packet *, 2144*83ee113eSDavid van Moolenbroek struct lease *, struct client_state *, 2145*83ee113eSDavid van Moolenbroek struct option_state *, struct option_state *, 2146*83ee113eSDavid van Moolenbroek struct binding_scope **, 2147*83ee113eSDavid van Moolenbroek struct expression *); 2148*83ee113eSDavid van Moolenbroek int evaluate_option_cache (struct data_string *, 2149*83ee113eSDavid van Moolenbroek struct packet *, struct lease *, 2150*83ee113eSDavid van Moolenbroek struct client_state *, 2151*83ee113eSDavid van Moolenbroek struct option_state *, struct option_state *, 2152*83ee113eSDavid van Moolenbroek struct binding_scope **, 2153*83ee113eSDavid van Moolenbroek struct option_cache *, 2154*83ee113eSDavid van Moolenbroek const char *, int); 2155*83ee113eSDavid van Moolenbroek int evaluate_boolean_option_cache (int *, 2156*83ee113eSDavid van Moolenbroek struct packet *, struct lease *, 2157*83ee113eSDavid van Moolenbroek struct client_state *, 2158*83ee113eSDavid van Moolenbroek struct option_state *, 2159*83ee113eSDavid van Moolenbroek struct option_state *, 2160*83ee113eSDavid van Moolenbroek struct binding_scope **, 2161*83ee113eSDavid van Moolenbroek struct option_cache *, 2162*83ee113eSDavid van Moolenbroek const char *, int); 2163*83ee113eSDavid van Moolenbroek int evaluate_boolean_expression_result (int *, 2164*83ee113eSDavid van Moolenbroek struct packet *, struct lease *, 2165*83ee113eSDavid van Moolenbroek struct client_state *, 2166*83ee113eSDavid van Moolenbroek struct option_state *, 2167*83ee113eSDavid van Moolenbroek struct option_state *, 2168*83ee113eSDavid van Moolenbroek struct binding_scope **, 2169*83ee113eSDavid van Moolenbroek struct expression *); 2170*83ee113eSDavid van Moolenbroek void expression_dereference (struct expression **, const char *, int); 2171*83ee113eSDavid van Moolenbroek int is_dns_expression (struct expression *); 2172*83ee113eSDavid van Moolenbroek int is_boolean_expression (struct expression *); 2173*83ee113eSDavid van Moolenbroek int is_data_expression (struct expression *); 2174*83ee113eSDavid van Moolenbroek int is_numeric_expression (struct expression *); 2175*83ee113eSDavid van Moolenbroek int is_compound_expression (struct expression *); 2176*83ee113eSDavid van Moolenbroek int op_precedence (enum expr_op, enum expr_op); 2177*83ee113eSDavid van Moolenbroek enum expression_context expression_context (struct expression *); 2178*83ee113eSDavid van Moolenbroek enum expression_context op_context (enum expr_op); 2179*83ee113eSDavid van Moolenbroek int write_expression (FILE *, struct expression *, int, int, int); 2180*83ee113eSDavid van Moolenbroek struct binding *find_binding (struct binding_scope *, const char *); 2181*83ee113eSDavid van Moolenbroek int free_bindings (struct binding_scope *, const char *, int); 2182*83ee113eSDavid van Moolenbroek int binding_scope_dereference (struct binding_scope **, 2183*83ee113eSDavid van Moolenbroek const char *, int); 2184*83ee113eSDavid van Moolenbroek int fundef_dereference (struct fundef **, const char *, int); 2185*83ee113eSDavid van Moolenbroek int data_subexpression_length (int *, struct expression *); 2186*83ee113eSDavid van Moolenbroek int expr_valid_for_context (struct expression *, enum expression_context); 2187*83ee113eSDavid van Moolenbroek struct binding *create_binding (struct binding_scope **, const char *); 2188*83ee113eSDavid van Moolenbroek int bind_ds_value (struct binding_scope **, 2189*83ee113eSDavid van Moolenbroek const char *, struct data_string *); 2190*83ee113eSDavid van Moolenbroek int find_bound_string (struct data_string *, 2191*83ee113eSDavid van Moolenbroek struct binding_scope *, const char *); 2192*83ee113eSDavid van Moolenbroek int unset (struct binding_scope *, const char *); 2193*83ee113eSDavid van Moolenbroek int data_string_sprintfa(struct data_string *ds, const char *fmt, ...); 2194*83ee113eSDavid van Moolenbroek 2195*83ee113eSDavid van Moolenbroek /* dhcp.c */ 2196*83ee113eSDavid van Moolenbroek extern int outstanding_pings; 2197*83ee113eSDavid van Moolenbroek extern int max_outstanding_acks; 2198*83ee113eSDavid van Moolenbroek extern int max_ack_delay_secs; 2199*83ee113eSDavid van Moolenbroek extern int max_ack_delay_usecs; 2200*83ee113eSDavid van Moolenbroek 2201*83ee113eSDavid van Moolenbroek void dhcp (struct packet *); 2202*83ee113eSDavid van Moolenbroek void dhcpdiscover (struct packet *, int); 2203*83ee113eSDavid van Moolenbroek void dhcprequest (struct packet *, int, struct lease *); 2204*83ee113eSDavid van Moolenbroek void dhcprelease (struct packet *, int); 2205*83ee113eSDavid van Moolenbroek void dhcpdecline (struct packet *, int); 2206*83ee113eSDavid van Moolenbroek void dhcpinform (struct packet *, int); 2207*83ee113eSDavid van Moolenbroek void nak_lease (struct packet *, struct iaddr *cip); 2208*83ee113eSDavid van Moolenbroek void ack_lease (struct packet *, struct lease *, 2209*83ee113eSDavid van Moolenbroek unsigned int, TIME, char *, int, struct host_decl *); 2210*83ee113eSDavid van Moolenbroek void delayed_ack_enqueue(struct lease *); 2211*83ee113eSDavid van Moolenbroek void commit_leases_readerdry(void *); 2212*83ee113eSDavid van Moolenbroek void flush_ackqueue(void *); 2213*83ee113eSDavid van Moolenbroek void dhcp_reply (struct lease *); 2214*83ee113eSDavid van Moolenbroek int find_lease (struct lease **, struct packet *, 2215*83ee113eSDavid van Moolenbroek struct shared_network *, int *, int *, struct lease *, 2216*83ee113eSDavid van Moolenbroek const char *, int); 2217*83ee113eSDavid van Moolenbroek int mockup_lease (struct lease **, struct packet *, 2218*83ee113eSDavid van Moolenbroek struct shared_network *, 2219*83ee113eSDavid van Moolenbroek struct host_decl *); 2220*83ee113eSDavid van Moolenbroek void static_lease_dereference (struct lease *, const char *, int); 2221*83ee113eSDavid van Moolenbroek 2222*83ee113eSDavid van Moolenbroek int allocate_lease (struct lease **, struct packet *, 2223*83ee113eSDavid van Moolenbroek struct pool *, int *); 2224*83ee113eSDavid van Moolenbroek int permitted (struct packet *, struct permit *); 2225*83ee113eSDavid van Moolenbroek int locate_network (struct packet *); 2226*83ee113eSDavid van Moolenbroek int parse_agent_information_option (struct packet *, int, u_int8_t *); 2227*83ee113eSDavid van Moolenbroek unsigned cons_agent_information_options (struct option_state *, 2228*83ee113eSDavid van Moolenbroek struct dhcp_packet *, 2229*83ee113eSDavid van Moolenbroek unsigned, unsigned); 2230*83ee113eSDavid van Moolenbroek void get_server_source_address(struct in_addr *from, 2231*83ee113eSDavid van Moolenbroek struct option_state *options, 2232*83ee113eSDavid van Moolenbroek struct option_state *out_options, 2233*83ee113eSDavid van Moolenbroek struct packet *packet); 2234*83ee113eSDavid van Moolenbroek void setup_server_source_address(struct in_addr *from, 2235*83ee113eSDavid van Moolenbroek struct option_state *options, 2236*83ee113eSDavid van Moolenbroek struct packet *packet); 2237*83ee113eSDavid van Moolenbroek 2238*83ee113eSDavid van Moolenbroek /* dhcpleasequery.c */ 2239*83ee113eSDavid van Moolenbroek void dhcpleasequery (struct packet *, int); 2240*83ee113eSDavid van Moolenbroek void dhcpv6_leasequery (struct data_string *, struct packet *); 2241*83ee113eSDavid van Moolenbroek 2242*83ee113eSDavid van Moolenbroek /* dhcpv6.c */ 2243*83ee113eSDavid van Moolenbroek isc_boolean_t server_duid_isset(void); 2244*83ee113eSDavid van Moolenbroek void copy_server_duid(struct data_string *ds, const char *file, int line); 2245*83ee113eSDavid van Moolenbroek void set_server_duid(struct data_string *new_duid); 2246*83ee113eSDavid van Moolenbroek isc_result_t set_server_duid_from_option(void); 2247*83ee113eSDavid van Moolenbroek void set_server_duid_type(int type); 2248*83ee113eSDavid van Moolenbroek isc_result_t generate_new_server_duid(void); 2249*83ee113eSDavid van Moolenbroek isc_result_t get_client_id(struct packet *, struct data_string *); 2250*83ee113eSDavid van Moolenbroek void dhcpv6(struct packet *); 2251*83ee113eSDavid van Moolenbroek 2252*83ee113eSDavid van Moolenbroek /* bootp.c */ 2253*83ee113eSDavid van Moolenbroek void bootp (struct packet *); 2254*83ee113eSDavid van Moolenbroek 2255*83ee113eSDavid van Moolenbroek /* memory.c */ 2256*83ee113eSDavid van Moolenbroek extern int (*group_write_hook) (struct group_object *); 2257*83ee113eSDavid van Moolenbroek extern struct group *root_group; 2258*83ee113eSDavid van Moolenbroek extern group_hash_t *group_name_hash; 2259*83ee113eSDavid van Moolenbroek isc_result_t delete_group (struct group_object *, int); 2260*83ee113eSDavid van Moolenbroek isc_result_t supersede_group (struct group_object *, int); 2261*83ee113eSDavid van Moolenbroek int clone_group (struct group **, struct group *, const char *, int); 2262*83ee113eSDavid van Moolenbroek int write_group (struct group_object *); 2263*83ee113eSDavid van Moolenbroek 2264*83ee113eSDavid van Moolenbroek /* salloc.c */ 2265*83ee113eSDavid van Moolenbroek void relinquish_lease_hunks (void); 2266*83ee113eSDavid van Moolenbroek struct lease *new_leases (unsigned, const char *, int); 2267*83ee113eSDavid van Moolenbroek #if defined (DEBUG_MEMORY_LEAKAGE) || \ 2268*83ee113eSDavid van Moolenbroek defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT) 2269*83ee113eSDavid van Moolenbroek void relinquish_free_lease_states (void); 2270*83ee113eSDavid van Moolenbroek #endif 2271*83ee113eSDavid van Moolenbroek OMAPI_OBJECT_ALLOC_DECL (lease, struct lease, dhcp_type_lease) 2272*83ee113eSDavid van Moolenbroek OMAPI_OBJECT_ALLOC_DECL (class, struct class, dhcp_type_class) 2273*83ee113eSDavid van Moolenbroek OMAPI_OBJECT_ALLOC_DECL (subclass, struct class, dhcp_type_subclass) 2274*83ee113eSDavid van Moolenbroek OMAPI_OBJECT_ALLOC_DECL (pool, struct pool, dhcp_type_pool) 2275*83ee113eSDavid van Moolenbroek OMAPI_OBJECT_ALLOC_DECL (host, struct host_decl, dhcp_type_host) 2276*83ee113eSDavid van Moolenbroek 2277*83ee113eSDavid van Moolenbroek /* alloc.c */ 2278*83ee113eSDavid van Moolenbroek OMAPI_OBJECT_ALLOC_DECL (subnet, struct subnet, dhcp_type_subnet) 2279*83ee113eSDavid van Moolenbroek OMAPI_OBJECT_ALLOC_DECL (shared_network, struct shared_network, 2280*83ee113eSDavid van Moolenbroek dhcp_type_shared_network) 2281*83ee113eSDavid van Moolenbroek OMAPI_OBJECT_ALLOC_DECL (group_object, struct group_object, dhcp_type_group) 2282*83ee113eSDavid van Moolenbroek OMAPI_OBJECT_ALLOC_DECL (dhcp_control, 2283*83ee113eSDavid van Moolenbroek dhcp_control_object_t, dhcp_type_control) 2284*83ee113eSDavid van Moolenbroek 2285*83ee113eSDavid van Moolenbroek #if defined (DEBUG_MEMORY_LEAKAGE) || \ 2286*83ee113eSDavid van Moolenbroek defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT) 2287*83ee113eSDavid van Moolenbroek void relinquish_free_pairs (void); 2288*83ee113eSDavid van Moolenbroek void relinquish_free_expressions (void); 2289*83ee113eSDavid van Moolenbroek void relinquish_free_binding_values (void); 2290*83ee113eSDavid van Moolenbroek void relinquish_free_option_caches (void); 2291*83ee113eSDavid van Moolenbroek void relinquish_free_packets (void); 2292*83ee113eSDavid van Moolenbroek #endif 2293*83ee113eSDavid van Moolenbroek 2294*83ee113eSDavid van Moolenbroek int option_chain_head_allocate (struct option_chain_head **, 2295*83ee113eSDavid van Moolenbroek const char *, int); 2296*83ee113eSDavid van Moolenbroek int option_chain_head_reference (struct option_chain_head **, 2297*83ee113eSDavid van Moolenbroek struct option_chain_head *, 2298*83ee113eSDavid van Moolenbroek const char *, int); 2299*83ee113eSDavid van Moolenbroek int option_chain_head_dereference (struct option_chain_head **, 2300*83ee113eSDavid van Moolenbroek const char *, int); 2301*83ee113eSDavid van Moolenbroek int group_allocate (struct group **, const char *, int); 2302*83ee113eSDavid van Moolenbroek int group_reference (struct group **, struct group *, const char *, int); 2303*83ee113eSDavid van Moolenbroek int group_dereference (struct group **, const char *, int); 2304*83ee113eSDavid van Moolenbroek struct dhcp_packet *new_dhcp_packet (const char *, int); 2305*83ee113eSDavid van Moolenbroek struct protocol *new_protocol (const char *, int); 2306*83ee113eSDavid van Moolenbroek struct lease_state *new_lease_state (const char *, int); 2307*83ee113eSDavid van Moolenbroek struct domain_search_list *new_domain_search_list (const char *, int); 2308*83ee113eSDavid van Moolenbroek struct name_server *new_name_server (const char *, int); 2309*83ee113eSDavid van Moolenbroek void free_name_server (struct name_server *, const char *, int); 2310*83ee113eSDavid van Moolenbroek struct option *new_option (const char *, const char *, int); 2311*83ee113eSDavid van Moolenbroek int option_reference(struct option **dest, struct option *src, 2312*83ee113eSDavid van Moolenbroek const char * file, int line); 2313*83ee113eSDavid van Moolenbroek int option_dereference(struct option **dest, const char *file, int line); 2314*83ee113eSDavid van Moolenbroek struct universe *new_universe (const char *, int); 2315*83ee113eSDavid van Moolenbroek void free_universe (struct universe *, const char *, int); 2316*83ee113eSDavid van Moolenbroek void free_domain_search_list (struct domain_search_list *, 2317*83ee113eSDavid van Moolenbroek const char *, int); 2318*83ee113eSDavid van Moolenbroek void free_lease_state (struct lease_state *, const char *, int); 2319*83ee113eSDavid van Moolenbroek void free_protocol (struct protocol *, const char *, int); 2320*83ee113eSDavid van Moolenbroek void free_dhcp_packet (struct dhcp_packet *, const char *, int); 2321*83ee113eSDavid van Moolenbroek struct client_lease *new_client_lease (const char *, int); 2322*83ee113eSDavid van Moolenbroek void free_client_lease (struct client_lease *, const char *, int); 2323*83ee113eSDavid van Moolenbroek struct permit *new_permit (const char *, int); 2324*83ee113eSDavid van Moolenbroek void free_permit (struct permit *, const char *, int); 2325*83ee113eSDavid van Moolenbroek pair new_pair (const char *, int); 2326*83ee113eSDavid van Moolenbroek void free_pair (pair, const char *, int); 2327*83ee113eSDavid van Moolenbroek int expression_allocate (struct expression **, const char *, int); 2328*83ee113eSDavid van Moolenbroek int expression_reference (struct expression **, 2329*83ee113eSDavid van Moolenbroek struct expression *, const char *, int); 2330*83ee113eSDavid van Moolenbroek void free_expression (struct expression *, const char *, int); 2331*83ee113eSDavid van Moolenbroek int binding_value_allocate (struct binding_value **, 2332*83ee113eSDavid van Moolenbroek const char *, int); 2333*83ee113eSDavid van Moolenbroek int binding_value_reference (struct binding_value **, 2334*83ee113eSDavid van Moolenbroek struct binding_value *, 2335*83ee113eSDavid van Moolenbroek const char *, int); 2336*83ee113eSDavid van Moolenbroek void free_binding_value (struct binding_value *, const char *, int); 2337*83ee113eSDavid van Moolenbroek int fundef_allocate (struct fundef **, const char *, int); 2338*83ee113eSDavid van Moolenbroek int fundef_reference (struct fundef **, 2339*83ee113eSDavid van Moolenbroek struct fundef *, const char *, int); 2340*83ee113eSDavid van Moolenbroek int option_cache_allocate (struct option_cache **, const char *, int); 2341*83ee113eSDavid van Moolenbroek int option_cache_reference (struct option_cache **, 2342*83ee113eSDavid van Moolenbroek struct option_cache *, const char *, int); 2343*83ee113eSDavid van Moolenbroek int buffer_allocate (struct buffer **, unsigned, const char *, int); 2344*83ee113eSDavid van Moolenbroek int buffer_reference (struct buffer **, struct buffer *, 2345*83ee113eSDavid van Moolenbroek const char *, int); 2346*83ee113eSDavid van Moolenbroek int buffer_dereference (struct buffer **, const char *, int); 2347*83ee113eSDavid van Moolenbroek int dns_host_entry_allocate (struct dns_host_entry **, 2348*83ee113eSDavid van Moolenbroek const char *, const char *, int); 2349*83ee113eSDavid van Moolenbroek int dns_host_entry_reference (struct dns_host_entry **, 2350*83ee113eSDavid van Moolenbroek struct dns_host_entry *, 2351*83ee113eSDavid van Moolenbroek const char *, int); 2352*83ee113eSDavid van Moolenbroek int dns_host_entry_dereference (struct dns_host_entry **, 2353*83ee113eSDavid van Moolenbroek const char *, int); 2354*83ee113eSDavid van Moolenbroek int option_state_allocate (struct option_state **, const char *, int); 2355*83ee113eSDavid van Moolenbroek int option_state_reference (struct option_state **, 2356*83ee113eSDavid van Moolenbroek struct option_state *, const char *, int); 2357*83ee113eSDavid van Moolenbroek int option_state_dereference (struct option_state **, 2358*83ee113eSDavid van Moolenbroek const char *, int); 2359*83ee113eSDavid van Moolenbroek void data_string_copy(struct data_string *, const struct data_string *, 2360*83ee113eSDavid van Moolenbroek const char *, int); 2361*83ee113eSDavid van Moolenbroek void data_string_forget (struct data_string *, const char *, int); 2362*83ee113eSDavid van Moolenbroek void data_string_truncate (struct data_string *, int); 2363*83ee113eSDavid van Moolenbroek int executable_statement_allocate (struct executable_statement **, 2364*83ee113eSDavid van Moolenbroek const char *, int); 2365*83ee113eSDavid van Moolenbroek int executable_statement_reference (struct executable_statement **, 2366*83ee113eSDavid van Moolenbroek struct executable_statement *, 2367*83ee113eSDavid van Moolenbroek const char *, int); 2368*83ee113eSDavid van Moolenbroek int packet_allocate (struct packet **, const char *, int); 2369*83ee113eSDavid van Moolenbroek int packet_reference (struct packet **, 2370*83ee113eSDavid van Moolenbroek struct packet *, const char *, int); 2371*83ee113eSDavid van Moolenbroek int packet_dereference (struct packet **, const char *, int); 2372*83ee113eSDavid van Moolenbroek int binding_scope_allocate (struct binding_scope **, 2373*83ee113eSDavid van Moolenbroek const char *, int); 2374*83ee113eSDavid van Moolenbroek int binding_scope_reference (struct binding_scope **, 2375*83ee113eSDavid van Moolenbroek struct binding_scope *, 2376*83ee113eSDavid van Moolenbroek const char *, int); 2377*83ee113eSDavid van Moolenbroek int dns_zone_allocate (struct dns_zone **, const char *, int); 2378*83ee113eSDavid van Moolenbroek int dns_zone_reference (struct dns_zone **, 2379*83ee113eSDavid van Moolenbroek struct dns_zone *, const char *, int); 2380*83ee113eSDavid van Moolenbroek 2381*83ee113eSDavid van Moolenbroek /* print.c */ 2382*83ee113eSDavid van Moolenbroek #define DEFAULT_TIME_FORMAT 0 2383*83ee113eSDavid van Moolenbroek #define LOCAL_TIME_FORMAT 1 2384*83ee113eSDavid van Moolenbroek extern int db_time_format; 2385*83ee113eSDavid van Moolenbroek char *quotify_string (const char *, const char *, int); 2386*83ee113eSDavid van Moolenbroek char *quotify_buf (const unsigned char *, unsigned, const char *, int); 2387*83ee113eSDavid van Moolenbroek char *print_base64 (const unsigned char *, unsigned, const char *, int); 2388*83ee113eSDavid van Moolenbroek char *print_hw_addr (const int, const int, const unsigned char *); 2389*83ee113eSDavid van Moolenbroek void print_lease (struct lease *); 2390*83ee113eSDavid van Moolenbroek void dump_raw (const unsigned char *, unsigned); 2391*83ee113eSDavid van Moolenbroek void dump_packet_option (struct option_cache *, struct packet *, 2392*83ee113eSDavid van Moolenbroek struct lease *, struct client_state *, 2393*83ee113eSDavid van Moolenbroek struct option_state *, struct option_state *, 2394*83ee113eSDavid van Moolenbroek struct binding_scope **, struct universe *, void *); 2395*83ee113eSDavid van Moolenbroek void dump_packet (struct packet *); 2396*83ee113eSDavid van Moolenbroek void hash_dump (struct hash_table *); 2397*83ee113eSDavid van Moolenbroek char *print_hex (unsigned, const u_int8_t *, unsigned, unsigned); 2398*83ee113eSDavid van Moolenbroek void print_hex_only (unsigned, const u_int8_t *, unsigned, char *); 2399*83ee113eSDavid van Moolenbroek void print_hex_or_string (unsigned, const u_int8_t *, unsigned, char *); 2400*83ee113eSDavid van Moolenbroek #define print_hex_1(len, data, limit) print_hex(len, data, limit, 0) 2401*83ee113eSDavid van Moolenbroek #define print_hex_2(len, data, limit) print_hex(len, data, limit, 1) 2402*83ee113eSDavid van Moolenbroek #define print_hex_3(len, data, limit) print_hex(len, data, limit, 2) 2403*83ee113eSDavid van Moolenbroek char *print_dotted_quads (unsigned, const u_int8_t *); 2404*83ee113eSDavid van Moolenbroek char *print_dec_1 (unsigned long); 2405*83ee113eSDavid van Moolenbroek char *print_dec_2 (unsigned long); 2406*83ee113eSDavid van Moolenbroek void print_expression (const char *, struct expression *); 2407*83ee113eSDavid van Moolenbroek int token_print_indent_concat (FILE *, int, int, 2408*83ee113eSDavid van Moolenbroek const char *, const char *, ...); 2409*83ee113eSDavid van Moolenbroek int token_indent_data_string (FILE *, int, int, const char *, const char *, 2410*83ee113eSDavid van Moolenbroek struct data_string *); 2411*83ee113eSDavid van Moolenbroek int token_print_indent (FILE *, int, int, 2412*83ee113eSDavid van Moolenbroek const char *, const char *, const char *); 2413*83ee113eSDavid van Moolenbroek void indent_spaces (FILE *, int); 2414*83ee113eSDavid van Moolenbroek #if defined (NSUPDATE) 2415*83ee113eSDavid van Moolenbroek void print_dns_status (int, struct dhcp_ddns_cb *, isc_result_t); 2416*83ee113eSDavid van Moolenbroek #endif 2417*83ee113eSDavid van Moolenbroek const char *print_time(TIME); 2418*83ee113eSDavid van Moolenbroek 2419*83ee113eSDavid van Moolenbroek void get_hw_addr(const char *name, struct hardware *hw); 2420*83ee113eSDavid van Moolenbroek 2421*83ee113eSDavid van Moolenbroek /* socket.c */ 2422*83ee113eSDavid van Moolenbroek #if defined (USE_SOCKET_SEND) || defined (USE_SOCKET_RECEIVE) \ 2423*83ee113eSDavid van Moolenbroek || defined (USE_SOCKET_FALLBACK) 2424*83ee113eSDavid van Moolenbroek int if_register_socket(struct interface_info *, int, int *, struct in6_addr *); 2425*83ee113eSDavid van Moolenbroek #endif 2426*83ee113eSDavid van Moolenbroek 2427*83ee113eSDavid van Moolenbroek #if defined (USE_SOCKET_FALLBACK) && !defined (USE_SOCKET_SEND) 2428*83ee113eSDavid van Moolenbroek void if_reinitialize_fallback (struct interface_info *); 2429*83ee113eSDavid van Moolenbroek void if_register_fallback (struct interface_info *); 2430*83ee113eSDavid van Moolenbroek ssize_t send_fallback (struct interface_info *, 2431*83ee113eSDavid van Moolenbroek struct packet *, struct dhcp_packet *, size_t, 2432*83ee113eSDavid van Moolenbroek struct in_addr, 2433*83ee113eSDavid van Moolenbroek struct sockaddr_in *, struct hardware *); 2434*83ee113eSDavid van Moolenbroek ssize_t send_fallback6(struct interface_info *, struct packet *, 2435*83ee113eSDavid van Moolenbroek struct dhcp_packet *, size_t, struct in6_addr *, 2436*83ee113eSDavid van Moolenbroek struct sockaddr_in6 *, struct hardware *); 2437*83ee113eSDavid van Moolenbroek #endif 2438*83ee113eSDavid van Moolenbroek 2439*83ee113eSDavid van Moolenbroek #ifdef USE_SOCKET_SEND 2440*83ee113eSDavid van Moolenbroek void if_reinitialize_send (struct interface_info *); 2441*83ee113eSDavid van Moolenbroek void if_register_send (struct interface_info *); 2442*83ee113eSDavid van Moolenbroek void if_deregister_send (struct interface_info *); 2443*83ee113eSDavid van Moolenbroek ssize_t send_packet (struct interface_info *, 2444*83ee113eSDavid van Moolenbroek struct packet *, struct dhcp_packet *, size_t, 2445*83ee113eSDavid van Moolenbroek struct in_addr, 2446*83ee113eSDavid van Moolenbroek struct sockaddr_in *, struct hardware *); 2447*83ee113eSDavid van Moolenbroek #endif 2448*83ee113eSDavid van Moolenbroek ssize_t send_packet6(struct interface_info *, const unsigned char *, size_t, 2449*83ee113eSDavid van Moolenbroek struct sockaddr_in6 *); 2450*83ee113eSDavid van Moolenbroek #ifdef USE_SOCKET_RECEIVE 2451*83ee113eSDavid van Moolenbroek void if_reinitialize_receive (struct interface_info *); 2452*83ee113eSDavid van Moolenbroek void if_register_receive (struct interface_info *); 2453*83ee113eSDavid van Moolenbroek void if_deregister_receive (struct interface_info *); 2454*83ee113eSDavid van Moolenbroek ssize_t receive_packet (struct interface_info *, 2455*83ee113eSDavid van Moolenbroek unsigned char *, size_t, 2456*83ee113eSDavid van Moolenbroek struct sockaddr_in *, struct hardware *); 2457*83ee113eSDavid van Moolenbroek #endif 2458*83ee113eSDavid van Moolenbroek 2459*83ee113eSDavid van Moolenbroek #if defined (USE_SOCKET_FALLBACK) 2460*83ee113eSDavid van Moolenbroek isc_result_t fallback_discard (omapi_object_t *); 2461*83ee113eSDavid van Moolenbroek #endif 2462*83ee113eSDavid van Moolenbroek 2463*83ee113eSDavid van Moolenbroek #if defined (USE_SOCKET_SEND) 2464*83ee113eSDavid van Moolenbroek int can_unicast_without_arp (struct interface_info *); 2465*83ee113eSDavid van Moolenbroek int can_receive_unicast_unconfigured (struct interface_info *); 2466*83ee113eSDavid van Moolenbroek int supports_multiple_interfaces (struct interface_info *); 2467*83ee113eSDavid van Moolenbroek void maybe_setup_fallback (void); 2468*83ee113eSDavid van Moolenbroek #endif 2469*83ee113eSDavid van Moolenbroek 2470*83ee113eSDavid van Moolenbroek void if_register6(struct interface_info *info, int do_multicast); 2471*83ee113eSDavid van Moolenbroek void if_register_linklocal6(struct interface_info *info); 2472*83ee113eSDavid van Moolenbroek ssize_t receive_packet6(struct interface_info *interface, 2473*83ee113eSDavid van Moolenbroek unsigned char *buf, size_t len, 2474*83ee113eSDavid van Moolenbroek struct sockaddr_in6 *from, struct in6_addr *to_addr, 2475*83ee113eSDavid van Moolenbroek unsigned int *if_index); 2476*83ee113eSDavid van Moolenbroek void if_deregister6(struct interface_info *info); 2477*83ee113eSDavid van Moolenbroek 2478*83ee113eSDavid van Moolenbroek 2479*83ee113eSDavid van Moolenbroek /* bpf.c */ 2480*83ee113eSDavid van Moolenbroek #if defined (USE_BPF_SEND) || defined (USE_BPF_RECEIVE) 2481*83ee113eSDavid van Moolenbroek int if_register_bpf (struct interface_info *); 2482*83ee113eSDavid van Moolenbroek #endif 2483*83ee113eSDavid van Moolenbroek #ifdef USE_BPF_SEND 2484*83ee113eSDavid van Moolenbroek void if_reinitialize_send (struct interface_info *); 2485*83ee113eSDavid van Moolenbroek void if_register_send (struct interface_info *); 2486*83ee113eSDavid van Moolenbroek void if_deregister_send (struct interface_info *); 2487*83ee113eSDavid van Moolenbroek ssize_t send_packet (struct interface_info *, 2488*83ee113eSDavid van Moolenbroek struct packet *, struct dhcp_packet *, size_t, 2489*83ee113eSDavid van Moolenbroek struct in_addr, 2490*83ee113eSDavid van Moolenbroek struct sockaddr_in *, struct hardware *); 2491*83ee113eSDavid van Moolenbroek #endif 2492*83ee113eSDavid van Moolenbroek #ifdef USE_BPF_RECEIVE 2493*83ee113eSDavid van Moolenbroek void if_reinitialize_receive (struct interface_info *); 2494*83ee113eSDavid van Moolenbroek void if_register_receive (struct interface_info *); 2495*83ee113eSDavid van Moolenbroek void if_deregister_receive (struct interface_info *); 2496*83ee113eSDavid van Moolenbroek ssize_t receive_packet (struct interface_info *, 2497*83ee113eSDavid van Moolenbroek unsigned char *, size_t, 2498*83ee113eSDavid van Moolenbroek struct sockaddr_in *, struct hardware *); 2499*83ee113eSDavid van Moolenbroek #endif 2500*83ee113eSDavid van Moolenbroek #if defined (USE_BPF_SEND) 2501*83ee113eSDavid van Moolenbroek int can_unicast_without_arp (struct interface_info *); 2502*83ee113eSDavid van Moolenbroek int can_receive_unicast_unconfigured (struct interface_info *); 2503*83ee113eSDavid van Moolenbroek int supports_multiple_interfaces (struct interface_info *); 2504*83ee113eSDavid van Moolenbroek void maybe_setup_fallback (void); 2505*83ee113eSDavid van Moolenbroek #endif 2506*83ee113eSDavid van Moolenbroek 2507*83ee113eSDavid van Moolenbroek /* lpf.c */ 2508*83ee113eSDavid van Moolenbroek #if defined (USE_LPF_SEND) || defined (USE_LPF_RECEIVE) 2509*83ee113eSDavid van Moolenbroek int if_register_lpf (struct interface_info *); 2510*83ee113eSDavid van Moolenbroek #endif 2511*83ee113eSDavid van Moolenbroek #ifdef USE_LPF_SEND 2512*83ee113eSDavid van Moolenbroek void if_reinitialize_send (struct interface_info *); 2513*83ee113eSDavid van Moolenbroek void if_register_send (struct interface_info *); 2514*83ee113eSDavid van Moolenbroek void if_deregister_send (struct interface_info *); 2515*83ee113eSDavid van Moolenbroek ssize_t send_packet (struct interface_info *, 2516*83ee113eSDavid van Moolenbroek struct packet *, struct dhcp_packet *, size_t, 2517*83ee113eSDavid van Moolenbroek struct in_addr, 2518*83ee113eSDavid van Moolenbroek struct sockaddr_in *, struct hardware *); 2519*83ee113eSDavid van Moolenbroek #endif 2520*83ee113eSDavid van Moolenbroek #ifdef USE_LPF_RECEIVE 2521*83ee113eSDavid van Moolenbroek void if_reinitialize_receive (struct interface_info *); 2522*83ee113eSDavid van Moolenbroek void if_register_receive (struct interface_info *); 2523*83ee113eSDavid van Moolenbroek void if_deregister_receive (struct interface_info *); 2524*83ee113eSDavid van Moolenbroek ssize_t receive_packet (struct interface_info *, 2525*83ee113eSDavid van Moolenbroek unsigned char *, size_t, 2526*83ee113eSDavid van Moolenbroek struct sockaddr_in *, struct hardware *); 2527*83ee113eSDavid van Moolenbroek #endif 2528*83ee113eSDavid van Moolenbroek #if defined (USE_LPF_SEND) 2529*83ee113eSDavid van Moolenbroek int can_unicast_without_arp (struct interface_info *); 2530*83ee113eSDavid van Moolenbroek int can_receive_unicast_unconfigured (struct interface_info *); 2531*83ee113eSDavid van Moolenbroek int supports_multiple_interfaces (struct interface_info *); 2532*83ee113eSDavid van Moolenbroek void maybe_setup_fallback (void); 2533*83ee113eSDavid van Moolenbroek #endif 2534*83ee113eSDavid van Moolenbroek 2535*83ee113eSDavid van Moolenbroek /* nit.c */ 2536*83ee113eSDavid van Moolenbroek #if defined (USE_NIT_SEND) || defined (USE_NIT_RECEIVE) 2537*83ee113eSDavid van Moolenbroek int if_register_nit (struct interface_info *); 2538*83ee113eSDavid van Moolenbroek #endif 2539*83ee113eSDavid van Moolenbroek 2540*83ee113eSDavid van Moolenbroek #ifdef USE_NIT_SEND 2541*83ee113eSDavid van Moolenbroek void if_reinitialize_send (struct interface_info *); 2542*83ee113eSDavid van Moolenbroek void if_register_send (struct interface_info *); 2543*83ee113eSDavid van Moolenbroek void if_deregister_send (struct interface_info *); 2544*83ee113eSDavid van Moolenbroek ssize_t send_packet (struct interface_info *, 2545*83ee113eSDavid van Moolenbroek struct packet *, struct dhcp_packet *, size_t, 2546*83ee113eSDavid van Moolenbroek struct in_addr, 2547*83ee113eSDavid van Moolenbroek struct sockaddr_in *, struct hardware *); 2548*83ee113eSDavid van Moolenbroek #endif 2549*83ee113eSDavid van Moolenbroek #ifdef USE_NIT_RECEIVE 2550*83ee113eSDavid van Moolenbroek void if_reinitialize_receive (struct interface_info *); 2551*83ee113eSDavid van Moolenbroek void if_register_receive (struct interface_info *); 2552*83ee113eSDavid van Moolenbroek void if_deregister_receive (struct interface_info *); 2553*83ee113eSDavid van Moolenbroek ssize_t receive_packet (struct interface_info *, 2554*83ee113eSDavid van Moolenbroek unsigned char *, size_t, 2555*83ee113eSDavid van Moolenbroek struct sockaddr_in *, struct hardware *); 2556*83ee113eSDavid van Moolenbroek #endif 2557*83ee113eSDavid van Moolenbroek #if defined (USE_NIT_SEND) 2558*83ee113eSDavid van Moolenbroek int can_unicast_without_arp (struct interface_info *); 2559*83ee113eSDavid van Moolenbroek int can_receive_unicast_unconfigured (struct interface_info *); 2560*83ee113eSDavid van Moolenbroek int supports_multiple_interfaces (struct interface_info *); 2561*83ee113eSDavid van Moolenbroek void maybe_setup_fallback (void); 2562*83ee113eSDavid van Moolenbroek #endif 2563*83ee113eSDavid van Moolenbroek 2564*83ee113eSDavid van Moolenbroek /* dlpi.c */ 2565*83ee113eSDavid van Moolenbroek #if defined (USE_DLPI_SEND) || defined (USE_DLPI_RECEIVE) 2566*83ee113eSDavid van Moolenbroek int if_register_dlpi (struct interface_info *); 2567*83ee113eSDavid van Moolenbroek #endif 2568*83ee113eSDavid van Moolenbroek 2569*83ee113eSDavid van Moolenbroek #ifdef USE_DLPI_SEND 2570*83ee113eSDavid van Moolenbroek int can_unicast_without_arp (struct interface_info *); 2571*83ee113eSDavid van Moolenbroek int can_receive_unicast_unconfigured (struct interface_info *); 2572*83ee113eSDavid van Moolenbroek void if_reinitialize_send (struct interface_info *); 2573*83ee113eSDavid van Moolenbroek void if_register_send (struct interface_info *); 2574*83ee113eSDavid van Moolenbroek void if_deregister_send (struct interface_info *); 2575*83ee113eSDavid van Moolenbroek ssize_t send_packet (struct interface_info *, 2576*83ee113eSDavid van Moolenbroek struct packet *, struct dhcp_packet *, size_t, 2577*83ee113eSDavid van Moolenbroek struct in_addr, 2578*83ee113eSDavid van Moolenbroek struct sockaddr_in *, struct hardware *); 2579*83ee113eSDavid van Moolenbroek int supports_multiple_interfaces (struct interface_info *); 2580*83ee113eSDavid van Moolenbroek void maybe_setup_fallback (void); 2581*83ee113eSDavid van Moolenbroek #endif 2582*83ee113eSDavid van Moolenbroek #ifdef USE_DLPI_RECEIVE 2583*83ee113eSDavid van Moolenbroek void if_reinitialize_receive (struct interface_info *); 2584*83ee113eSDavid van Moolenbroek void if_register_receive (struct interface_info *); 2585*83ee113eSDavid van Moolenbroek void if_deregister_receive (struct interface_info *); 2586*83ee113eSDavid van Moolenbroek ssize_t receive_packet (struct interface_info *, 2587*83ee113eSDavid van Moolenbroek unsigned char *, size_t, 2588*83ee113eSDavid van Moolenbroek struct sockaddr_in *, struct hardware *); 2589*83ee113eSDavid van Moolenbroek #endif 2590*83ee113eSDavid van Moolenbroek 2591*83ee113eSDavid van Moolenbroek 2592*83ee113eSDavid van Moolenbroek /* raw.c */ 2593*83ee113eSDavid van Moolenbroek #ifdef USE_RAW_SEND 2594*83ee113eSDavid van Moolenbroek void if_reinitialize_send (struct interface_info *); 2595*83ee113eSDavid van Moolenbroek void if_register_send (struct interface_info *); 2596*83ee113eSDavid van Moolenbroek void if_deregister_send (struct interface_info *); 2597*83ee113eSDavid van Moolenbroek ssize_t send_packet (struct interface_info *, struct packet *, 2598*83ee113eSDavid van Moolenbroek struct dhcp_packet *, size_t, struct in_addr, 2599*83ee113eSDavid van Moolenbroek struct sockaddr_in *, struct hardware *); 2600*83ee113eSDavid van Moolenbroek int can_unicast_without_arp (struct interface_info *); 2601*83ee113eSDavid van Moolenbroek int can_receive_unicast_unconfigured (struct interface_info *); 2602*83ee113eSDavid van Moolenbroek int supports_multiple_interfaces (struct interface_info *); 2603*83ee113eSDavid van Moolenbroek void maybe_setup_fallback (void); 2604*83ee113eSDavid van Moolenbroek #endif 2605*83ee113eSDavid van Moolenbroek 2606*83ee113eSDavid van Moolenbroek /* discover.c */ 2607*83ee113eSDavid van Moolenbroek extern struct interface_info *interfaces, 2608*83ee113eSDavid van Moolenbroek *dummy_interfaces, *fallback_interface; 2609*83ee113eSDavid van Moolenbroek extern struct protocol *protocols; 2610*83ee113eSDavid van Moolenbroek extern int quiet_interface_discovery; 2611*83ee113eSDavid van Moolenbroek isc_result_t interface_setup (void); 2612*83ee113eSDavid van Moolenbroek void interface_trace_setup (void); 2613*83ee113eSDavid van Moolenbroek 2614*83ee113eSDavid van Moolenbroek extern struct in_addr limited_broadcast; 2615*83ee113eSDavid van Moolenbroek extern int local_family; 2616*83ee113eSDavid van Moolenbroek extern struct in_addr local_address; 2617*83ee113eSDavid van Moolenbroek 2618*83ee113eSDavid van Moolenbroek extern u_int16_t local_port; 2619*83ee113eSDavid van Moolenbroek extern u_int16_t remote_port; 2620*83ee113eSDavid van Moolenbroek extern int (*dhcp_interface_setup_hook) (struct interface_info *, 2621*83ee113eSDavid van Moolenbroek struct iaddr *); 2622*83ee113eSDavid van Moolenbroek extern int (*dhcp_interface_discovery_hook) (struct interface_info *); 2623*83ee113eSDavid van Moolenbroek extern isc_result_t (*dhcp_interface_startup_hook) (struct interface_info *); 2624*83ee113eSDavid van Moolenbroek 2625*83ee113eSDavid van Moolenbroek extern void (*bootp_packet_handler) (struct interface_info *, 2626*83ee113eSDavid van Moolenbroek struct dhcp_packet *, unsigned, 2627*83ee113eSDavid van Moolenbroek unsigned int, 2628*83ee113eSDavid van Moolenbroek struct iaddr, struct hardware *); 2629*83ee113eSDavid van Moolenbroek extern void (*dhcpv6_packet_handler)(struct interface_info *, 2630*83ee113eSDavid van Moolenbroek const char *, int, 2631*83ee113eSDavid van Moolenbroek int, const struct iaddr *, isc_boolean_t); 2632*83ee113eSDavid van Moolenbroek extern struct timeout *timeouts; 2633*83ee113eSDavid van Moolenbroek extern omapi_object_type_t *dhcp_type_interface; 2634*83ee113eSDavid van Moolenbroek #if defined (TRACING) 2635*83ee113eSDavid van Moolenbroek extern trace_type_t *interface_trace; 2636*83ee113eSDavid van Moolenbroek extern trace_type_t *inpacket_trace; 2637*83ee113eSDavid van Moolenbroek extern trace_type_t *outpacket_trace; 2638*83ee113eSDavid van Moolenbroek #endif 2639*83ee113eSDavid van Moolenbroek extern struct interface_info **interface_vector; 2640*83ee113eSDavid van Moolenbroek extern int interface_count; 2641*83ee113eSDavid van Moolenbroek extern int interface_max; 2642*83ee113eSDavid van Moolenbroek isc_result_t interface_initialize(omapi_object_t *, const char *, int); 2643*83ee113eSDavid van Moolenbroek void discover_interfaces(int); 2644*83ee113eSDavid van Moolenbroek int setup_fallback (struct interface_info **, const char *, int); 2645*83ee113eSDavid van Moolenbroek int if_readsocket (omapi_object_t *); 2646*83ee113eSDavid van Moolenbroek void reinitialize_interfaces (void); 2647*83ee113eSDavid van Moolenbroek 2648*83ee113eSDavid van Moolenbroek /* dispatch.c */ 2649*83ee113eSDavid van Moolenbroek void set_time(TIME); 2650*83ee113eSDavid van Moolenbroek struct timeval *process_outstanding_timeouts (struct timeval *); 2651*83ee113eSDavid van Moolenbroek void dispatch (void); 2652*83ee113eSDavid van Moolenbroek isc_result_t got_one(omapi_object_t *); 2653*83ee113eSDavid van Moolenbroek isc_result_t got_one_v6(omapi_object_t *); 2654*83ee113eSDavid van Moolenbroek isc_result_t interface_set_value (omapi_object_t *, omapi_object_t *, 2655*83ee113eSDavid van Moolenbroek omapi_data_string_t *, omapi_typed_data_t *); 2656*83ee113eSDavid van Moolenbroek isc_result_t interface_get_value (omapi_object_t *, omapi_object_t *, 2657*83ee113eSDavid van Moolenbroek omapi_data_string_t *, omapi_value_t **); 2658*83ee113eSDavid van Moolenbroek isc_result_t interface_destroy (omapi_object_t *, const char *, int); 2659*83ee113eSDavid van Moolenbroek isc_result_t interface_signal_handler (omapi_object_t *, 2660*83ee113eSDavid van Moolenbroek const char *, va_list); 2661*83ee113eSDavid van Moolenbroek isc_result_t interface_stuff_values (omapi_object_t *, 2662*83ee113eSDavid van Moolenbroek omapi_object_t *, 2663*83ee113eSDavid van Moolenbroek omapi_object_t *); 2664*83ee113eSDavid van Moolenbroek 2665*83ee113eSDavid van Moolenbroek void add_timeout (struct timeval *, void (*) (void *), void *, 2666*83ee113eSDavid van Moolenbroek tvref_t, tvunref_t); 2667*83ee113eSDavid van Moolenbroek void cancel_timeout (void (*) (void *), void *); 2668*83ee113eSDavid van Moolenbroek void cancel_all_timeouts (void); 2669*83ee113eSDavid van Moolenbroek void relinquish_timeouts (void); 2670*83ee113eSDavid van Moolenbroek 2671*83ee113eSDavid van Moolenbroek OMAPI_OBJECT_ALLOC_DECL (interface, 2672*83ee113eSDavid van Moolenbroek struct interface_info, dhcp_type_interface) 2673*83ee113eSDavid van Moolenbroek 2674*83ee113eSDavid van Moolenbroek /* tables.c */ 2675*83ee113eSDavid van Moolenbroek extern char *default_option_format; 2676*83ee113eSDavid van Moolenbroek extern struct universe dhcp_universe; 2677*83ee113eSDavid van Moolenbroek extern struct universe dhcpv6_universe; 2678*83ee113eSDavid van Moolenbroek extern struct universe nwip_universe; 2679*83ee113eSDavid van Moolenbroek extern struct universe fqdn_universe; 2680*83ee113eSDavid van Moolenbroek extern struct universe vsio_universe; 2681*83ee113eSDavid van Moolenbroek extern int dhcp_option_default_priority_list []; 2682*83ee113eSDavid van Moolenbroek extern int dhcp_option_default_priority_list_count; 2683*83ee113eSDavid van Moolenbroek extern const char *hardware_types [256]; 2684*83ee113eSDavid van Moolenbroek extern int universe_count, universe_max; 2685*83ee113eSDavid van Moolenbroek extern struct universe **universes; 2686*83ee113eSDavid van Moolenbroek extern universe_hash_t *universe_hash; 2687*83ee113eSDavid van Moolenbroek void initialize_common_option_spaces (void); 2688*83ee113eSDavid van Moolenbroek extern struct universe *config_universe; 2689*83ee113eSDavid van Moolenbroek 2690*83ee113eSDavid van Moolenbroek /* stables.c */ 2691*83ee113eSDavid van Moolenbroek #if defined (FAILOVER_PROTOCOL) 2692*83ee113eSDavid van Moolenbroek extern failover_option_t null_failover_option; 2693*83ee113eSDavid van Moolenbroek extern failover_option_t skip_failover_option; 2694*83ee113eSDavid van Moolenbroek extern struct failover_option_info ft_options []; 2695*83ee113eSDavid van Moolenbroek extern u_int32_t fto_allowed []; 2696*83ee113eSDavid van Moolenbroek extern int ft_sizes []; 2697*83ee113eSDavid van Moolenbroek extern const char *dhcp_flink_state_names []; 2698*83ee113eSDavid van Moolenbroek #endif 2699*83ee113eSDavid van Moolenbroek extern const char *binding_state_names []; 2700*83ee113eSDavid van Moolenbroek 2701*83ee113eSDavid van Moolenbroek extern struct universe agent_universe; 2702*83ee113eSDavid van Moolenbroek extern struct universe server_universe; 2703*83ee113eSDavid van Moolenbroek 2704*83ee113eSDavid van Moolenbroek extern struct enumeration ddns_styles; 2705*83ee113eSDavid van Moolenbroek extern struct enumeration syslog_enum; 2706*83ee113eSDavid van Moolenbroek void initialize_server_option_spaces (void); 2707*83ee113eSDavid van Moolenbroek 2708*83ee113eSDavid van Moolenbroek /* inet.c */ 2709*83ee113eSDavid van Moolenbroek struct iaddr subnet_number (struct iaddr, struct iaddr); 2710*83ee113eSDavid van Moolenbroek struct iaddr ip_addr (struct iaddr, struct iaddr, u_int32_t); 2711*83ee113eSDavid van Moolenbroek struct iaddr broadcast_addr (struct iaddr, struct iaddr); 2712*83ee113eSDavid van Moolenbroek u_int32_t host_addr (struct iaddr, struct iaddr); 2713*83ee113eSDavid van Moolenbroek int addr_eq (struct iaddr, struct iaddr); 2714*83ee113eSDavid van Moolenbroek int addr_match(struct iaddr *, struct iaddrmatch *); 2715*83ee113eSDavid van Moolenbroek int addr_cmp(const struct iaddr *a1, const struct iaddr *a2); 2716*83ee113eSDavid van Moolenbroek int addr_or(struct iaddr *result, 2717*83ee113eSDavid van Moolenbroek const struct iaddr *a1, const struct iaddr *a2); 2718*83ee113eSDavid van Moolenbroek int addr_and(struct iaddr *result, 2719*83ee113eSDavid van Moolenbroek const struct iaddr *a1, const struct iaddr *a2); 2720*83ee113eSDavid van Moolenbroek isc_boolean_t is_cidr_mask_valid(const struct iaddr *addr, int bits); 2721*83ee113eSDavid van Moolenbroek isc_result_t range2cidr(struct iaddrcidrnetlist **result, 2722*83ee113eSDavid van Moolenbroek const struct iaddr *lo, const struct iaddr *hi); 2723*83ee113eSDavid van Moolenbroek isc_result_t free_iaddrcidrnetlist(struct iaddrcidrnetlist **result); 2724*83ee113eSDavid van Moolenbroek const char *piaddr (struct iaddr); 2725*83ee113eSDavid van Moolenbroek char *piaddrmask(struct iaddr *, struct iaddr *); 2726*83ee113eSDavid van Moolenbroek char *piaddrcidr(const struct iaddr *, unsigned int); 2727*83ee113eSDavid van Moolenbroek u_int16_t validate_port(char *); 2728*83ee113eSDavid van Moolenbroek 2729*83ee113eSDavid van Moolenbroek /* dhclient.c */ 2730*83ee113eSDavid van Moolenbroek extern int nowait; 2731*83ee113eSDavid van Moolenbroek 2732*83ee113eSDavid van Moolenbroek extern int wanted_ia_na; 2733*83ee113eSDavid van Moolenbroek extern int wanted_ia_ta; 2734*83ee113eSDavid van Moolenbroek extern int wanted_ia_pd; 2735*83ee113eSDavid van Moolenbroek 2736*83ee113eSDavid van Moolenbroek extern const char *path_dhclient_conf; 2737*83ee113eSDavid van Moolenbroek extern const char *path_dhclient_db; 2738*83ee113eSDavid van Moolenbroek extern const char *path_dhclient_pid; 2739*83ee113eSDavid van Moolenbroek extern char *path_dhclient_script; 2740*83ee113eSDavid van Moolenbroek extern int interfaces_requested; 2741*83ee113eSDavid van Moolenbroek extern struct data_string default_duid; 2742*83ee113eSDavid van Moolenbroek extern int duid_type; 2743*83ee113eSDavid van Moolenbroek 2744*83ee113eSDavid van Moolenbroek extern struct client_config top_level_config; 2745*83ee113eSDavid van Moolenbroek 2746*83ee113eSDavid van Moolenbroek void dhcpoffer (struct packet *); 2747*83ee113eSDavid van Moolenbroek void dhcpack (struct packet *); 2748*83ee113eSDavid van Moolenbroek void dhcpnak (struct packet *); 2749*83ee113eSDavid van Moolenbroek 2750*83ee113eSDavid van Moolenbroek void send_discover (void *); 2751*83ee113eSDavid van Moolenbroek void send_request (void *); 2752*83ee113eSDavid van Moolenbroek void send_release (void *); 2753*83ee113eSDavid van Moolenbroek void send_decline (void *); 2754*83ee113eSDavid van Moolenbroek 2755*83ee113eSDavid van Moolenbroek void state_reboot (void *); 2756*83ee113eSDavid van Moolenbroek void state_init (void *); 2757*83ee113eSDavid van Moolenbroek void state_selecting (void *); 2758*83ee113eSDavid van Moolenbroek void state_requesting (void *); 2759*83ee113eSDavid van Moolenbroek void state_bound (void *); 2760*83ee113eSDavid van Moolenbroek void state_stop (void *); 2761*83ee113eSDavid van Moolenbroek void state_panic (void *); 2762*83ee113eSDavid van Moolenbroek 2763*83ee113eSDavid van Moolenbroek void bind_lease (struct client_state *); 2764*83ee113eSDavid van Moolenbroek 2765*83ee113eSDavid van Moolenbroek void make_client_options (struct client_state *, 2766*83ee113eSDavid van Moolenbroek struct client_lease *, u_int8_t *, 2767*83ee113eSDavid van Moolenbroek struct option_cache *, struct iaddr *, 2768*83ee113eSDavid van Moolenbroek struct option **, struct option_state **); 2769*83ee113eSDavid van Moolenbroek void make_discover (struct client_state *, struct client_lease *); 2770*83ee113eSDavid van Moolenbroek void make_request (struct client_state *, struct client_lease *); 2771*83ee113eSDavid van Moolenbroek void make_decline (struct client_state *, struct client_lease *); 2772*83ee113eSDavid van Moolenbroek void make_release (struct client_state *, struct client_lease *); 2773*83ee113eSDavid van Moolenbroek 2774*83ee113eSDavid van Moolenbroek void destroy_client_lease (struct client_lease *); 2775*83ee113eSDavid van Moolenbroek void rewrite_client_leases (void); 2776*83ee113eSDavid van Moolenbroek void write_lease_option (struct option_cache *, struct packet *, 2777*83ee113eSDavid van Moolenbroek struct lease *, struct client_state *, 2778*83ee113eSDavid van Moolenbroek struct option_state *, struct option_state *, 2779*83ee113eSDavid van Moolenbroek struct binding_scope **, struct universe *, void *); 2780*83ee113eSDavid van Moolenbroek int write_client_lease (struct client_state *, struct client_lease *, int, int); 2781*83ee113eSDavid van Moolenbroek isc_result_t write_client6_lease(struct client_state *client, 2782*83ee113eSDavid van Moolenbroek struct dhc6_lease *lease, 2783*83ee113eSDavid van Moolenbroek int rewrite, int sync); 2784*83ee113eSDavid van Moolenbroek int dhcp_option_ev_name (char *, size_t, struct option *); 2785*83ee113eSDavid van Moolenbroek 2786*83ee113eSDavid van Moolenbroek void script_init (struct client_state *, const char *, 2787*83ee113eSDavid van Moolenbroek struct string_list *); 2788*83ee113eSDavid van Moolenbroek void client_option_envadd (struct option_cache *, struct packet *, 2789*83ee113eSDavid van Moolenbroek struct lease *, struct client_state *, 2790*83ee113eSDavid van Moolenbroek struct option_state *, struct option_state *, 2791*83ee113eSDavid van Moolenbroek struct binding_scope **, struct universe *, void *); 2792*83ee113eSDavid van Moolenbroek void script_write_params (struct client_state *, const char *, 2793*83ee113eSDavid van Moolenbroek struct client_lease *); 2794*83ee113eSDavid van Moolenbroek void script_write_requested (struct client_state *); 2795*83ee113eSDavid van Moolenbroek int script_go (struct client_state *); 2796*83ee113eSDavid van Moolenbroek void client_envadd (struct client_state *, 2797*83ee113eSDavid van Moolenbroek const char *, const char *, const char *, ...) 2798*83ee113eSDavid van Moolenbroek __attribute__((__format__(__printf__,4,5))); 2799*83ee113eSDavid van Moolenbroek 2800*83ee113eSDavid van Moolenbroek struct client_lease *packet_to_lease (struct packet *, struct client_state *); 2801*83ee113eSDavid van Moolenbroek void go_daemon (void); 2802*83ee113eSDavid van Moolenbroek void finish_daemon (void); 2803*83ee113eSDavid van Moolenbroek void write_client_pid_file (void); 2804*83ee113eSDavid van Moolenbroek void client_location_changed (void); 2805*83ee113eSDavid van Moolenbroek void do_release (struct client_state *); 2806*83ee113eSDavid van Moolenbroek int dhclient_interface_shutdown_hook (struct interface_info *); 2807*83ee113eSDavid van Moolenbroek int dhclient_interface_discovery_hook (struct interface_info *); 2808*83ee113eSDavid van Moolenbroek isc_result_t dhclient_interface_startup_hook (struct interface_info *); 2809*83ee113eSDavid van Moolenbroek void dhclient_schedule_updates(struct client_state *client, 2810*83ee113eSDavid van Moolenbroek struct iaddr *addr, int offset); 2811*83ee113eSDavid van Moolenbroek void client_dns_update_timeout (void *cp); 2812*83ee113eSDavid van Moolenbroek isc_result_t client_dns_update(struct client_state *client, 2813*83ee113eSDavid van Moolenbroek dhcp_ddns_cb_t *ddns_cb); 2814*83ee113eSDavid van Moolenbroek void client_dns_remove(struct client_state *client, struct iaddr *addr); 2815*83ee113eSDavid van Moolenbroek 2816*83ee113eSDavid van Moolenbroek void dhcpv4_client_assignments(void); 2817*83ee113eSDavid van Moolenbroek void dhcpv6_client_assignments(void); 2818*83ee113eSDavid van Moolenbroek void form_duid(struct data_string *duid, const char *file, int line); 2819*83ee113eSDavid van Moolenbroek 2820*83ee113eSDavid van Moolenbroek /* dhc6.c */ 2821*83ee113eSDavid van Moolenbroek void dhc6_lease_destroy(struct dhc6_lease **src, const char *file, int line); 2822*83ee113eSDavid van Moolenbroek void start_init6(struct client_state *client); 2823*83ee113eSDavid van Moolenbroek void start_info_request6(struct client_state *client); 2824*83ee113eSDavid van Moolenbroek void start_confirm6(struct client_state *client); 2825*83ee113eSDavid van Moolenbroek void start_release6(struct client_state *client); 2826*83ee113eSDavid van Moolenbroek void start_selecting6(struct client_state *client); 2827*83ee113eSDavid van Moolenbroek void unconfigure6(struct client_state *client, const char *reason); 2828*83ee113eSDavid van Moolenbroek 2829*83ee113eSDavid van Moolenbroek /* db.c */ 2830*83ee113eSDavid van Moolenbroek int write_lease (struct lease *); 2831*83ee113eSDavid van Moolenbroek int write_host (struct host_decl *); 2832*83ee113eSDavid van Moolenbroek int write_server_duid(void); 2833*83ee113eSDavid van Moolenbroek #if defined (FAILOVER_PROTOCOL) 2834*83ee113eSDavid van Moolenbroek int write_failover_state (dhcp_failover_state_t *); 2835*83ee113eSDavid van Moolenbroek #endif 2836*83ee113eSDavid van Moolenbroek int db_printable (const unsigned char *); 2837*83ee113eSDavid van Moolenbroek int db_printable_len (const unsigned char *, unsigned); 2838*83ee113eSDavid van Moolenbroek isc_result_t write_named_billing_class(const void *, unsigned, void *); 2839*83ee113eSDavid van Moolenbroek void write_billing_classes (void); 2840*83ee113eSDavid van Moolenbroek int write_billing_class (struct class *); 2841*83ee113eSDavid van Moolenbroek void commit_leases_timeout (void *); 2842*83ee113eSDavid van Moolenbroek void commit_leases_readerdry(void *); 2843*83ee113eSDavid van Moolenbroek int commit_leases (void); 2844*83ee113eSDavid van Moolenbroek int commit_leases_timed (void); 2845*83ee113eSDavid van Moolenbroek void db_startup (int); 2846*83ee113eSDavid van Moolenbroek int new_lease_file (void); 2847*83ee113eSDavid van Moolenbroek int group_writer (struct group_object *); 2848*83ee113eSDavid van Moolenbroek int write_ia(const struct ia_xx *); 2849*83ee113eSDavid van Moolenbroek 2850*83ee113eSDavid van Moolenbroek /* packet.c */ 2851*83ee113eSDavid van Moolenbroek u_int32_t checksum (unsigned char *, unsigned, u_int32_t); 2852*83ee113eSDavid van Moolenbroek u_int32_t wrapsum (u_int32_t); 2853*83ee113eSDavid van Moolenbroek void assemble_hw_header (struct interface_info *, unsigned char *, 2854*83ee113eSDavid van Moolenbroek unsigned *, struct hardware *); 2855*83ee113eSDavid van Moolenbroek void assemble_udp_ip_header (struct interface_info *, unsigned char *, 2856*83ee113eSDavid van Moolenbroek unsigned *, u_int32_t, u_int32_t, 2857*83ee113eSDavid van Moolenbroek u_int32_t, unsigned char *, unsigned); 2858*83ee113eSDavid van Moolenbroek ssize_t decode_hw_header (struct interface_info *, unsigned char *, 2859*83ee113eSDavid van Moolenbroek unsigned, struct hardware *); 2860*83ee113eSDavid van Moolenbroek ssize_t decode_udp_ip_header (struct interface_info *, unsigned char *, 2861*83ee113eSDavid van Moolenbroek unsigned, struct sockaddr_in *, 2862*83ee113eSDavid van Moolenbroek unsigned, unsigned *); 2863*83ee113eSDavid van Moolenbroek 2864*83ee113eSDavid van Moolenbroek /* ethernet.c */ 2865*83ee113eSDavid van Moolenbroek void assemble_ethernet_header (struct interface_info *, unsigned char *, 2866*83ee113eSDavid van Moolenbroek unsigned *, struct hardware *); 2867*83ee113eSDavid van Moolenbroek ssize_t decode_ethernet_header (struct interface_info *, 2868*83ee113eSDavid van Moolenbroek unsigned char *, 2869*83ee113eSDavid van Moolenbroek unsigned, struct hardware *); 2870*83ee113eSDavid van Moolenbroek 2871*83ee113eSDavid van Moolenbroek /* tr.c */ 2872*83ee113eSDavid van Moolenbroek void assemble_tr_header (struct interface_info *, unsigned char *, 2873*83ee113eSDavid van Moolenbroek unsigned *, struct hardware *); 2874*83ee113eSDavid van Moolenbroek ssize_t decode_tr_header (struct interface_info *, 2875*83ee113eSDavid van Moolenbroek unsigned char *, 2876*83ee113eSDavid van Moolenbroek unsigned, struct hardware *); 2877*83ee113eSDavid van Moolenbroek 2878*83ee113eSDavid van Moolenbroek /* dhxpxlt.c */ 2879*83ee113eSDavid van Moolenbroek void convert_statement (struct parse *); 2880*83ee113eSDavid van Moolenbroek void convert_host_statement (struct parse *, jrefproto); 2881*83ee113eSDavid van Moolenbroek void convert_host_name (struct parse *, jrefproto); 2882*83ee113eSDavid van Moolenbroek void convert_class_statement (struct parse *, jrefproto, int); 2883*83ee113eSDavid van Moolenbroek void convert_class_decl (struct parse *, jrefproto); 2884*83ee113eSDavid van Moolenbroek void convert_lease_time (struct parse *, jrefproto, char *); 2885*83ee113eSDavid van Moolenbroek void convert_shared_net_statement (struct parse *, jrefproto); 2886*83ee113eSDavid van Moolenbroek void convert_subnet_statement (struct parse *, jrefproto); 2887*83ee113eSDavid van Moolenbroek void convert_subnet_decl (struct parse *, jrefproto); 2888*83ee113eSDavid van Moolenbroek void convert_host_decl (struct parse *, jrefproto); 2889*83ee113eSDavid van Moolenbroek void convert_hardware_decl (struct parse *, jrefproto); 2890*83ee113eSDavid van Moolenbroek void convert_hardware_addr (struct parse *, jrefproto); 2891*83ee113eSDavid van Moolenbroek void convert_filename_decl (struct parse *, jrefproto); 2892*83ee113eSDavid van Moolenbroek void convert_servername_decl (struct parse *, jrefproto); 2893*83ee113eSDavid van Moolenbroek void convert_ip_addr_or_hostname (struct parse *, jrefproto, int); 2894*83ee113eSDavid van Moolenbroek void convert_fixed_addr_decl (struct parse *, jrefproto); 2895*83ee113eSDavid van Moolenbroek void convert_option_decl (struct parse *, jrefproto); 2896*83ee113eSDavid van Moolenbroek void convert_lease_statement (struct parse *, jrefproto); 2897*83ee113eSDavid van Moolenbroek void convert_address_range (struct parse *, jrefproto); 2898*83ee113eSDavid van Moolenbroek void convert_date (struct parse *, jrefproto, char *); 2899*83ee113eSDavid van Moolenbroek void convert_numeric_aggregate (struct parse *, jrefproto, int, int, int, int); 2900*83ee113eSDavid van Moolenbroek void indent (int); 2901*83ee113eSDavid van Moolenbroek 2902*83ee113eSDavid van Moolenbroek /* route.c */ 2903*83ee113eSDavid van Moolenbroek void add_route_direct (struct interface_info *, struct in_addr); 2904*83ee113eSDavid van Moolenbroek void add_route_net (struct interface_info *, struct in_addr, struct in_addr); 2905*83ee113eSDavid van Moolenbroek void add_route_default_gateway (struct interface_info *, struct in_addr); 2906*83ee113eSDavid van Moolenbroek void remove_routes (struct in_addr); 2907*83ee113eSDavid van Moolenbroek void remove_if_route (struct interface_info *, struct in_addr); 2908*83ee113eSDavid van Moolenbroek void remove_all_if_routes (struct interface_info *); 2909*83ee113eSDavid van Moolenbroek void set_netmask (struct interface_info *, struct in_addr); 2910*83ee113eSDavid van Moolenbroek void set_broadcast_addr (struct interface_info *, struct in_addr); 2911*83ee113eSDavid van Moolenbroek void set_ip_address (struct interface_info *, struct in_addr); 2912*83ee113eSDavid van Moolenbroek 2913*83ee113eSDavid van Moolenbroek /* clparse.c */ 2914*83ee113eSDavid van Moolenbroek isc_result_t read_client_conf (void); 2915*83ee113eSDavid van Moolenbroek int read_client_conf_file (const char *, 2916*83ee113eSDavid van Moolenbroek struct interface_info *, struct client_config *); 2917*83ee113eSDavid van Moolenbroek void read_client_leases (void); 2918*83ee113eSDavid van Moolenbroek void parse_client_statement (struct parse *, struct interface_info *, 2919*83ee113eSDavid van Moolenbroek struct client_config *); 2920*83ee113eSDavid van Moolenbroek int parse_X (struct parse *, u_int8_t *, unsigned); 2921*83ee113eSDavid van Moolenbroek int parse_option_list (struct parse *, struct option ***); 2922*83ee113eSDavid van Moolenbroek void parse_interface_declaration (struct parse *, 2923*83ee113eSDavid van Moolenbroek struct client_config *, char *); 2924*83ee113eSDavid van Moolenbroek int interface_or_dummy (struct interface_info **, const char *); 2925*83ee113eSDavid van Moolenbroek void make_client_state (struct client_state **); 2926*83ee113eSDavid van Moolenbroek void make_client_config (struct client_state *, struct client_config *); 2927*83ee113eSDavid van Moolenbroek void parse_client_lease_statement (struct parse *, int); 2928*83ee113eSDavid van Moolenbroek void parse_client_lease_declaration (struct parse *, 2929*83ee113eSDavid van Moolenbroek struct client_lease *, 2930*83ee113eSDavid van Moolenbroek struct interface_info **, 2931*83ee113eSDavid van Moolenbroek struct client_state **); 2932*83ee113eSDavid van Moolenbroek int parse_option_decl (struct option_cache **, struct parse *); 2933*83ee113eSDavid van Moolenbroek void parse_string_list (struct parse *, struct string_list **, int); 2934*83ee113eSDavid van Moolenbroek int parse_ip_addr (struct parse *, struct iaddr *); 2935*83ee113eSDavid van Moolenbroek int parse_ip_addr_with_subnet(struct parse *, struct iaddrmatch *); 2936*83ee113eSDavid van Moolenbroek void parse_reject_statement (struct parse *, struct client_config *); 2937*83ee113eSDavid van Moolenbroek 2938*83ee113eSDavid van Moolenbroek /* icmp.c */ 2939*83ee113eSDavid van Moolenbroek OMAPI_OBJECT_ALLOC_DECL (icmp_state, struct icmp_state, dhcp_type_icmp) 2940*83ee113eSDavid van Moolenbroek extern struct icmp_state *icmp_state; 2941*83ee113eSDavid van Moolenbroek void icmp_startup (int, void (*) (struct iaddr, u_int8_t *, int)); 2942*83ee113eSDavid van Moolenbroek int icmp_readsocket (omapi_object_t *); 2943*83ee113eSDavid van Moolenbroek int icmp_echorequest (struct iaddr *); 2944*83ee113eSDavid van Moolenbroek isc_result_t icmp_echoreply (omapi_object_t *); 2945*83ee113eSDavid van Moolenbroek 2946*83ee113eSDavid van Moolenbroek /* dns.c */ 2947*83ee113eSDavid van Moolenbroek isc_result_t enter_dns_zone (struct dns_zone *); 2948*83ee113eSDavid van Moolenbroek isc_result_t dns_zone_lookup (struct dns_zone **, const char *); 2949*83ee113eSDavid van Moolenbroek int dns_zone_dereference (struct dns_zone **, const char *, int); 2950*83ee113eSDavid van Moolenbroek #if defined (NSUPDATE) 2951*83ee113eSDavid van Moolenbroek #define FIND_FORWARD 0 2952*83ee113eSDavid van Moolenbroek #define FIND_REVERSE 1 2953*83ee113eSDavid van Moolenbroek isc_result_t find_tsig_key (ns_tsig_key **, const char *, struct dns_zone *); 2954*83ee113eSDavid van Moolenbroek void tkey_free (ns_tsig_key **); 2955*83ee113eSDavid van Moolenbroek isc_result_t find_cached_zone (dhcp_ddns_cb_t *, int); 2956*83ee113eSDavid van Moolenbroek void forget_zone (struct dns_zone **); 2957*83ee113eSDavid van Moolenbroek void repudiate_zone (struct dns_zone **); 2958*83ee113eSDavid van Moolenbroek int get_dhcid (dhcp_ddns_cb_t *, int, const u_int8_t *, unsigned); 2959*83ee113eSDavid van Moolenbroek void dhcid_tolease (struct data_string *, struct data_string *); 2960*83ee113eSDavid van Moolenbroek isc_result_t dhcid_fromlease (struct data_string *, struct data_string *); 2961*83ee113eSDavid van Moolenbroek isc_result_t ddns_update_fwd(struct data_string *, struct iaddr, 2962*83ee113eSDavid van Moolenbroek struct data_string *, unsigned long, unsigned, 2963*83ee113eSDavid van Moolenbroek unsigned); 2964*83ee113eSDavid van Moolenbroek isc_result_t ddns_remove_fwd(struct data_string *, 2965*83ee113eSDavid van Moolenbroek struct iaddr, struct data_string *); 2966*83ee113eSDavid van Moolenbroek #endif /* NSUPDATE */ 2967*83ee113eSDavid van Moolenbroek 2968*83ee113eSDavid van Moolenbroek dhcp_ddns_cb_t *ddns_cb_alloc(const char *file, int line); 2969*83ee113eSDavid van Moolenbroek void ddns_cb_free (dhcp_ddns_cb_t *ddns_cb, const char *file, int line); 2970*83ee113eSDavid van Moolenbroek void ddns_cb_forget_zone (dhcp_ddns_cb_t *ddns_cb); 2971*83ee113eSDavid van Moolenbroek isc_result_t 2972*83ee113eSDavid van Moolenbroek ddns_modify_fwd(dhcp_ddns_cb_t *ddns_cb, const char *file, int line); 2973*83ee113eSDavid van Moolenbroek isc_result_t 2974*83ee113eSDavid van Moolenbroek ddns_modify_ptr(dhcp_ddns_cb_t *ddns_cb, const char *file, int line); 2975*83ee113eSDavid van Moolenbroek void 2976*83ee113eSDavid van Moolenbroek ddns_cancel(dhcp_ddns_cb_t *ddns_cb, const char *file, int line); 2977*83ee113eSDavid van Moolenbroek 2978*83ee113eSDavid van Moolenbroek /* resolv.c */ 2979*83ee113eSDavid van Moolenbroek extern char path_resolv_conf []; 2980*83ee113eSDavid van Moolenbroek extern struct name_server *name_servers; 2981*83ee113eSDavid van Moolenbroek extern struct domain_search_list *domains; 2982*83ee113eSDavid van Moolenbroek 2983*83ee113eSDavid van Moolenbroek void read_resolv_conf (TIME); 2984*83ee113eSDavid van Moolenbroek struct name_server *first_name_server (void); 2985*83ee113eSDavid van Moolenbroek 2986*83ee113eSDavid van Moolenbroek /* inet_addr.c */ 2987*83ee113eSDavid van Moolenbroek #ifdef NEED_INET_ATON 2988*83ee113eSDavid van Moolenbroek int inet_aton (const char *, struct in_addr *); 2989*83ee113eSDavid van Moolenbroek #endif 2990*83ee113eSDavid van Moolenbroek 2991*83ee113eSDavid van Moolenbroek /* class.c */ 2992*83ee113eSDavid van Moolenbroek extern int have_billing_classes; 2993*83ee113eSDavid van Moolenbroek struct class unknown_class; 2994*83ee113eSDavid van Moolenbroek struct class known_class; 2995*83ee113eSDavid van Moolenbroek struct collection default_collection; 2996*83ee113eSDavid van Moolenbroek struct collection *collections; 2997*83ee113eSDavid van Moolenbroek extern struct executable_statement *default_classification_rules; 2998*83ee113eSDavid van Moolenbroek 2999*83ee113eSDavid van Moolenbroek void classification_setup (void); 3000*83ee113eSDavid van Moolenbroek void classify_client (struct packet *); 3001*83ee113eSDavid van Moolenbroek int check_collection (struct packet *, struct lease *, struct collection *); 3002*83ee113eSDavid van Moolenbroek void classify (struct packet *, struct class *); 3003*83ee113eSDavid van Moolenbroek isc_result_t unlink_class (struct class **class); 3004*83ee113eSDavid van Moolenbroek isc_result_t find_class (struct class **, const char *, 3005*83ee113eSDavid van Moolenbroek const char *, int); 3006*83ee113eSDavid van Moolenbroek int unbill_class (struct lease *, struct class *); 3007*83ee113eSDavid van Moolenbroek int bill_class (struct lease *, struct class *); 3008*83ee113eSDavid van Moolenbroek 3009*83ee113eSDavid van Moolenbroek /* execute.c */ 3010*83ee113eSDavid van Moolenbroek int execute_statements (struct binding_value **result, 3011*83ee113eSDavid van Moolenbroek struct packet *, struct lease *, 3012*83ee113eSDavid van Moolenbroek struct client_state *, 3013*83ee113eSDavid van Moolenbroek struct option_state *, struct option_state *, 3014*83ee113eSDavid van Moolenbroek struct binding_scope **, 3015*83ee113eSDavid van Moolenbroek struct executable_statement *, 3016*83ee113eSDavid van Moolenbroek struct on_star *); 3017*83ee113eSDavid van Moolenbroek void execute_statements_in_scope (struct binding_value **result, 3018*83ee113eSDavid van Moolenbroek struct packet *, struct lease *, 3019*83ee113eSDavid van Moolenbroek struct client_state *, 3020*83ee113eSDavid van Moolenbroek struct option_state *, 3021*83ee113eSDavid van Moolenbroek struct option_state *, 3022*83ee113eSDavid van Moolenbroek struct binding_scope **, 3023*83ee113eSDavid van Moolenbroek struct group *, struct group *, 3024*83ee113eSDavid van Moolenbroek struct on_star *); 3025*83ee113eSDavid van Moolenbroek int executable_statement_dereference (struct executable_statement **, 3026*83ee113eSDavid van Moolenbroek const char *, int); 3027*83ee113eSDavid van Moolenbroek void write_statements (FILE *, struct executable_statement *, int); 3028*83ee113eSDavid van Moolenbroek int find_matching_case (struct executable_statement **, 3029*83ee113eSDavid van Moolenbroek struct packet *, struct lease *, struct client_state *, 3030*83ee113eSDavid van Moolenbroek struct option_state *, struct option_state *, 3031*83ee113eSDavid van Moolenbroek struct binding_scope **, 3032*83ee113eSDavid van Moolenbroek struct expression *, struct executable_statement *); 3033*83ee113eSDavid van Moolenbroek int executable_statement_foreach (struct executable_statement *, 3034*83ee113eSDavid van Moolenbroek int (*) (struct executable_statement *, 3035*83ee113eSDavid van Moolenbroek void *, int), void *, int); 3036*83ee113eSDavid van Moolenbroek 3037*83ee113eSDavid van Moolenbroek /* comapi.c */ 3038*83ee113eSDavid van Moolenbroek extern omapi_object_type_t *dhcp_type_group; 3039*83ee113eSDavid van Moolenbroek extern omapi_object_type_t *dhcp_type_shared_network; 3040*83ee113eSDavid van Moolenbroek extern omapi_object_type_t *dhcp_type_subnet; 3041*83ee113eSDavid van Moolenbroek extern omapi_object_type_t *dhcp_type_control; 3042*83ee113eSDavid van Moolenbroek extern dhcp_control_object_t *dhcp_control_object; 3043*83ee113eSDavid van Moolenbroek 3044*83ee113eSDavid van Moolenbroek void dhcp_common_objects_setup (void); 3045*83ee113eSDavid van Moolenbroek 3046*83ee113eSDavid van Moolenbroek isc_result_t dhcp_group_set_value (omapi_object_t *, omapi_object_t *, 3047*83ee113eSDavid van Moolenbroek omapi_data_string_t *, 3048*83ee113eSDavid van Moolenbroek omapi_typed_data_t *); 3049*83ee113eSDavid van Moolenbroek isc_result_t dhcp_group_get_value (omapi_object_t *, omapi_object_t *, 3050*83ee113eSDavid van Moolenbroek omapi_data_string_t *, 3051*83ee113eSDavid van Moolenbroek omapi_value_t **); 3052*83ee113eSDavid van Moolenbroek isc_result_t dhcp_group_destroy (omapi_object_t *, const char *, int); 3053*83ee113eSDavid van Moolenbroek isc_result_t dhcp_group_signal_handler (omapi_object_t *, 3054*83ee113eSDavid van Moolenbroek const char *, va_list); 3055*83ee113eSDavid van Moolenbroek isc_result_t dhcp_group_stuff_values (omapi_object_t *, 3056*83ee113eSDavid van Moolenbroek omapi_object_t *, 3057*83ee113eSDavid van Moolenbroek omapi_object_t *); 3058*83ee113eSDavid van Moolenbroek isc_result_t dhcp_group_lookup (omapi_object_t **, 3059*83ee113eSDavid van Moolenbroek omapi_object_t *, omapi_object_t *); 3060*83ee113eSDavid van Moolenbroek isc_result_t dhcp_group_create (omapi_object_t **, 3061*83ee113eSDavid van Moolenbroek omapi_object_t *); 3062*83ee113eSDavid van Moolenbroek isc_result_t dhcp_group_remove (omapi_object_t *, 3063*83ee113eSDavid van Moolenbroek omapi_object_t *); 3064*83ee113eSDavid van Moolenbroek 3065*83ee113eSDavid van Moolenbroek isc_result_t dhcp_control_set_value (omapi_object_t *, omapi_object_t *, 3066*83ee113eSDavid van Moolenbroek omapi_data_string_t *, 3067*83ee113eSDavid van Moolenbroek omapi_typed_data_t *); 3068*83ee113eSDavid van Moolenbroek isc_result_t dhcp_control_get_value (omapi_object_t *, omapi_object_t *, 3069*83ee113eSDavid van Moolenbroek omapi_data_string_t *, 3070*83ee113eSDavid van Moolenbroek omapi_value_t **); 3071*83ee113eSDavid van Moolenbroek isc_result_t dhcp_control_destroy (omapi_object_t *, const char *, int); 3072*83ee113eSDavid van Moolenbroek isc_result_t dhcp_control_signal_handler (omapi_object_t *, 3073*83ee113eSDavid van Moolenbroek const char *, va_list); 3074*83ee113eSDavid van Moolenbroek isc_result_t dhcp_control_stuff_values (omapi_object_t *, 3075*83ee113eSDavid van Moolenbroek omapi_object_t *, 3076*83ee113eSDavid van Moolenbroek omapi_object_t *); 3077*83ee113eSDavid van Moolenbroek isc_result_t dhcp_control_lookup (omapi_object_t **, 3078*83ee113eSDavid van Moolenbroek omapi_object_t *, omapi_object_t *); 3079*83ee113eSDavid van Moolenbroek isc_result_t dhcp_control_create (omapi_object_t **, 3080*83ee113eSDavid van Moolenbroek omapi_object_t *); 3081*83ee113eSDavid van Moolenbroek isc_result_t dhcp_control_remove (omapi_object_t *, 3082*83ee113eSDavid van Moolenbroek omapi_object_t *); 3083*83ee113eSDavid van Moolenbroek 3084*83ee113eSDavid van Moolenbroek isc_result_t dhcp_subnet_set_value (omapi_object_t *, omapi_object_t *, 3085*83ee113eSDavid van Moolenbroek omapi_data_string_t *, 3086*83ee113eSDavid van Moolenbroek omapi_typed_data_t *); 3087*83ee113eSDavid van Moolenbroek isc_result_t dhcp_subnet_get_value (omapi_object_t *, omapi_object_t *, 3088*83ee113eSDavid van Moolenbroek omapi_data_string_t *, 3089*83ee113eSDavid van Moolenbroek omapi_value_t **); 3090*83ee113eSDavid van Moolenbroek isc_result_t dhcp_subnet_destroy (omapi_object_t *, const char *, int); 3091*83ee113eSDavid van Moolenbroek isc_result_t dhcp_subnet_signal_handler (omapi_object_t *, 3092*83ee113eSDavid van Moolenbroek const char *, va_list); 3093*83ee113eSDavid van Moolenbroek isc_result_t dhcp_subnet_stuff_values (omapi_object_t *, 3094*83ee113eSDavid van Moolenbroek omapi_object_t *, 3095*83ee113eSDavid van Moolenbroek omapi_object_t *); 3096*83ee113eSDavid van Moolenbroek isc_result_t dhcp_subnet_lookup (omapi_object_t **, 3097*83ee113eSDavid van Moolenbroek omapi_object_t *, omapi_object_t *); 3098*83ee113eSDavid van Moolenbroek isc_result_t dhcp_subnet_create (omapi_object_t **, 3099*83ee113eSDavid van Moolenbroek omapi_object_t *); 3100*83ee113eSDavid van Moolenbroek isc_result_t dhcp_subnet_remove (omapi_object_t *, 3101*83ee113eSDavid van Moolenbroek omapi_object_t *); 3102*83ee113eSDavid van Moolenbroek 3103*83ee113eSDavid van Moolenbroek isc_result_t dhcp_shared_network_set_value (omapi_object_t *, 3104*83ee113eSDavid van Moolenbroek omapi_object_t *, 3105*83ee113eSDavid van Moolenbroek omapi_data_string_t *, 3106*83ee113eSDavid van Moolenbroek omapi_typed_data_t *); 3107*83ee113eSDavid van Moolenbroek isc_result_t dhcp_shared_network_get_value (omapi_object_t *, 3108*83ee113eSDavid van Moolenbroek omapi_object_t *, 3109*83ee113eSDavid van Moolenbroek omapi_data_string_t *, 3110*83ee113eSDavid van Moolenbroek omapi_value_t **); 3111*83ee113eSDavid van Moolenbroek isc_result_t dhcp_shared_network_destroy (omapi_object_t *, const char *, int); 3112*83ee113eSDavid van Moolenbroek isc_result_t dhcp_shared_network_signal_handler (omapi_object_t *, 3113*83ee113eSDavid van Moolenbroek const char *, va_list); 3114*83ee113eSDavid van Moolenbroek isc_result_t dhcp_shared_network_stuff_values (omapi_object_t *, 3115*83ee113eSDavid van Moolenbroek omapi_object_t *, 3116*83ee113eSDavid van Moolenbroek omapi_object_t *); 3117*83ee113eSDavid van Moolenbroek isc_result_t dhcp_shared_network_lookup (omapi_object_t **, 3118*83ee113eSDavid van Moolenbroek omapi_object_t *, omapi_object_t *); 3119*83ee113eSDavid van Moolenbroek isc_result_t dhcp_shared_network_create (omapi_object_t **, 3120*83ee113eSDavid van Moolenbroek omapi_object_t *); 3121*83ee113eSDavid van Moolenbroek isc_result_t dhcp_shared_network_remove (omapi_object_t *, 3122*83ee113eSDavid van Moolenbroek omapi_object_t *); 3123*83ee113eSDavid van Moolenbroek 3124*83ee113eSDavid van Moolenbroek /* omapi.c */ 3125*83ee113eSDavid van Moolenbroek extern int (*dhcp_interface_shutdown_hook) (struct interface_info *); 3126*83ee113eSDavid van Moolenbroek 3127*83ee113eSDavid van Moolenbroek extern omapi_object_type_t *dhcp_type_lease; 3128*83ee113eSDavid van Moolenbroek extern omapi_object_type_t *dhcp_type_pool; 3129*83ee113eSDavid van Moolenbroek extern omapi_object_type_t *dhcp_type_class; 3130*83ee113eSDavid van Moolenbroek extern omapi_object_type_t *dhcp_type_subclass; 3131*83ee113eSDavid van Moolenbroek 3132*83ee113eSDavid van Moolenbroek #if defined (FAILOVER_PROTOCOL) 3133*83ee113eSDavid van Moolenbroek extern omapi_object_type_t *dhcp_type_failover_state; 3134*83ee113eSDavid van Moolenbroek extern omapi_object_type_t *dhcp_type_failover_link; 3135*83ee113eSDavid van Moolenbroek extern omapi_object_type_t *dhcp_type_failover_listener; 3136*83ee113eSDavid van Moolenbroek #endif 3137*83ee113eSDavid van Moolenbroek 3138*83ee113eSDavid van Moolenbroek void dhcp_db_objects_setup (void); 3139*83ee113eSDavid van Moolenbroek 3140*83ee113eSDavid van Moolenbroek isc_result_t dhcp_lease_set_value (omapi_object_t *, omapi_object_t *, 3141*83ee113eSDavid van Moolenbroek omapi_data_string_t *, 3142*83ee113eSDavid van Moolenbroek omapi_typed_data_t *); 3143*83ee113eSDavid van Moolenbroek isc_result_t dhcp_lease_get_value (omapi_object_t *, omapi_object_t *, 3144*83ee113eSDavid van Moolenbroek omapi_data_string_t *, 3145*83ee113eSDavid van Moolenbroek omapi_value_t **); 3146*83ee113eSDavid van Moolenbroek isc_result_t dhcp_lease_destroy (omapi_object_t *, const char *, int); 3147*83ee113eSDavid van Moolenbroek isc_result_t dhcp_lease_signal_handler (omapi_object_t *, 3148*83ee113eSDavid van Moolenbroek const char *, va_list); 3149*83ee113eSDavid van Moolenbroek isc_result_t dhcp_lease_stuff_values (omapi_object_t *, 3150*83ee113eSDavid van Moolenbroek omapi_object_t *, 3151*83ee113eSDavid van Moolenbroek omapi_object_t *); 3152*83ee113eSDavid van Moolenbroek isc_result_t dhcp_lease_lookup (omapi_object_t **, 3153*83ee113eSDavid van Moolenbroek omapi_object_t *, omapi_object_t *); 3154*83ee113eSDavid van Moolenbroek isc_result_t dhcp_lease_create (omapi_object_t **, 3155*83ee113eSDavid van Moolenbroek omapi_object_t *); 3156*83ee113eSDavid van Moolenbroek isc_result_t dhcp_lease_remove (omapi_object_t *, 3157*83ee113eSDavid van Moolenbroek omapi_object_t *); 3158*83ee113eSDavid van Moolenbroek isc_result_t dhcp_host_set_value (omapi_object_t *, omapi_object_t *, 3159*83ee113eSDavid van Moolenbroek omapi_data_string_t *, 3160*83ee113eSDavid van Moolenbroek omapi_typed_data_t *); 3161*83ee113eSDavid van Moolenbroek isc_result_t dhcp_host_get_value (omapi_object_t *, omapi_object_t *, 3162*83ee113eSDavid van Moolenbroek omapi_data_string_t *, 3163*83ee113eSDavid van Moolenbroek omapi_value_t **); 3164*83ee113eSDavid van Moolenbroek isc_result_t dhcp_host_destroy (omapi_object_t *, const char *, int); 3165*83ee113eSDavid van Moolenbroek isc_result_t dhcp_host_signal_handler (omapi_object_t *, 3166*83ee113eSDavid van Moolenbroek const char *, va_list); 3167*83ee113eSDavid van Moolenbroek isc_result_t dhcp_host_stuff_values (omapi_object_t *, 3168*83ee113eSDavid van Moolenbroek omapi_object_t *, 3169*83ee113eSDavid van Moolenbroek omapi_object_t *); 3170*83ee113eSDavid van Moolenbroek isc_result_t dhcp_host_lookup (omapi_object_t **, 3171*83ee113eSDavid van Moolenbroek omapi_object_t *, omapi_object_t *); 3172*83ee113eSDavid van Moolenbroek isc_result_t dhcp_host_create (omapi_object_t **, 3173*83ee113eSDavid van Moolenbroek omapi_object_t *); 3174*83ee113eSDavid van Moolenbroek isc_result_t dhcp_host_remove (omapi_object_t *, 3175*83ee113eSDavid van Moolenbroek omapi_object_t *); 3176*83ee113eSDavid van Moolenbroek isc_result_t dhcp_pool_set_value (omapi_object_t *, omapi_object_t *, 3177*83ee113eSDavid van Moolenbroek omapi_data_string_t *, 3178*83ee113eSDavid van Moolenbroek omapi_typed_data_t *); 3179*83ee113eSDavid van Moolenbroek isc_result_t dhcp_pool_get_value (omapi_object_t *, omapi_object_t *, 3180*83ee113eSDavid van Moolenbroek omapi_data_string_t *, 3181*83ee113eSDavid van Moolenbroek omapi_value_t **); 3182*83ee113eSDavid van Moolenbroek isc_result_t dhcp_pool_destroy (omapi_object_t *, const char *, int); 3183*83ee113eSDavid van Moolenbroek isc_result_t dhcp_pool_signal_handler (omapi_object_t *, 3184*83ee113eSDavid van Moolenbroek const char *, va_list); 3185*83ee113eSDavid van Moolenbroek isc_result_t dhcp_pool_stuff_values (omapi_object_t *, 3186*83ee113eSDavid van Moolenbroek omapi_object_t *, 3187*83ee113eSDavid van Moolenbroek omapi_object_t *); 3188*83ee113eSDavid van Moolenbroek isc_result_t dhcp_pool_lookup (omapi_object_t **, 3189*83ee113eSDavid van Moolenbroek omapi_object_t *, omapi_object_t *); 3190*83ee113eSDavid van Moolenbroek isc_result_t dhcp_pool_create (omapi_object_t **, 3191*83ee113eSDavid van Moolenbroek omapi_object_t *); 3192*83ee113eSDavid van Moolenbroek isc_result_t dhcp_pool_remove (omapi_object_t *, 3193*83ee113eSDavid van Moolenbroek omapi_object_t *); 3194*83ee113eSDavid van Moolenbroek isc_result_t dhcp_class_set_value (omapi_object_t *, omapi_object_t *, 3195*83ee113eSDavid van Moolenbroek omapi_data_string_t *, 3196*83ee113eSDavid van Moolenbroek omapi_typed_data_t *); 3197*83ee113eSDavid van Moolenbroek isc_result_t dhcp_class_get_value (omapi_object_t *, omapi_object_t *, 3198*83ee113eSDavid van Moolenbroek omapi_data_string_t *, 3199*83ee113eSDavid van Moolenbroek omapi_value_t **); 3200*83ee113eSDavid van Moolenbroek isc_result_t dhcp_class_destroy (omapi_object_t *, const char *, int); 3201*83ee113eSDavid van Moolenbroek isc_result_t dhcp_class_signal_handler (omapi_object_t *, 3202*83ee113eSDavid van Moolenbroek const char *, va_list); 3203*83ee113eSDavid van Moolenbroek isc_result_t dhcp_class_stuff_values (omapi_object_t *, 3204*83ee113eSDavid van Moolenbroek omapi_object_t *, 3205*83ee113eSDavid van Moolenbroek omapi_object_t *); 3206*83ee113eSDavid van Moolenbroek isc_result_t dhcp_class_lookup (omapi_object_t **, 3207*83ee113eSDavid van Moolenbroek omapi_object_t *, omapi_object_t *); 3208*83ee113eSDavid van Moolenbroek isc_result_t dhcp_class_create (omapi_object_t **, 3209*83ee113eSDavid van Moolenbroek omapi_object_t *); 3210*83ee113eSDavid van Moolenbroek isc_result_t dhcp_class_remove (omapi_object_t *, 3211*83ee113eSDavid van Moolenbroek omapi_object_t *); 3212*83ee113eSDavid van Moolenbroek isc_result_t dhcp_subclass_set_value (omapi_object_t *, omapi_object_t *, 3213*83ee113eSDavid van Moolenbroek omapi_data_string_t *, 3214*83ee113eSDavid van Moolenbroek omapi_typed_data_t *); 3215*83ee113eSDavid van Moolenbroek isc_result_t dhcp_subclass_get_value (omapi_object_t *, omapi_object_t *, 3216*83ee113eSDavid van Moolenbroek omapi_data_string_t *, 3217*83ee113eSDavid van Moolenbroek omapi_value_t **); 3218*83ee113eSDavid van Moolenbroek isc_result_t dhcp_subclass_destroy (omapi_object_t *, const char *, int); 3219*83ee113eSDavid van Moolenbroek isc_result_t dhcp_subclass_signal_handler (omapi_object_t *, 3220*83ee113eSDavid van Moolenbroek const char *, va_list); 3221*83ee113eSDavid van Moolenbroek isc_result_t dhcp_subclass_stuff_values (omapi_object_t *, 3222*83ee113eSDavid van Moolenbroek omapi_object_t *, 3223*83ee113eSDavid van Moolenbroek omapi_object_t *); 3224*83ee113eSDavid van Moolenbroek isc_result_t dhcp_subclass_lookup (omapi_object_t **, 3225*83ee113eSDavid van Moolenbroek omapi_object_t *, omapi_object_t *); 3226*83ee113eSDavid van Moolenbroek isc_result_t dhcp_subclass_create (omapi_object_t **, 3227*83ee113eSDavid van Moolenbroek omapi_object_t *); 3228*83ee113eSDavid van Moolenbroek isc_result_t dhcp_subclass_remove (omapi_object_t *, 3229*83ee113eSDavid van Moolenbroek omapi_object_t *); 3230*83ee113eSDavid van Moolenbroek isc_result_t dhcp_interface_set_value (omapi_object_t *, 3231*83ee113eSDavid van Moolenbroek omapi_object_t *, 3232*83ee113eSDavid van Moolenbroek omapi_data_string_t *, 3233*83ee113eSDavid van Moolenbroek omapi_typed_data_t *); 3234*83ee113eSDavid van Moolenbroek isc_result_t dhcp_interface_get_value (omapi_object_t *, 3235*83ee113eSDavid van Moolenbroek omapi_object_t *, 3236*83ee113eSDavid van Moolenbroek omapi_data_string_t *, 3237*83ee113eSDavid van Moolenbroek omapi_value_t **); 3238*83ee113eSDavid van Moolenbroek isc_result_t dhcp_interface_destroy (omapi_object_t *, 3239*83ee113eSDavid van Moolenbroek const char *, int); 3240*83ee113eSDavid van Moolenbroek isc_result_t dhcp_interface_signal_handler (omapi_object_t *, 3241*83ee113eSDavid van Moolenbroek const char *, 3242*83ee113eSDavid van Moolenbroek va_list ap); 3243*83ee113eSDavid van Moolenbroek isc_result_t dhcp_interface_stuff_values (omapi_object_t *, 3244*83ee113eSDavid van Moolenbroek omapi_object_t *, 3245*83ee113eSDavid van Moolenbroek omapi_object_t *); 3246*83ee113eSDavid van Moolenbroek isc_result_t dhcp_interface_lookup (omapi_object_t **, 3247*83ee113eSDavid van Moolenbroek omapi_object_t *, 3248*83ee113eSDavid van Moolenbroek omapi_object_t *); 3249*83ee113eSDavid van Moolenbroek isc_result_t dhcp_interface_create (omapi_object_t **, 3250*83ee113eSDavid van Moolenbroek omapi_object_t *); 3251*83ee113eSDavid van Moolenbroek isc_result_t dhcp_interface_remove (omapi_object_t *, 3252*83ee113eSDavid van Moolenbroek omapi_object_t *); 3253*83ee113eSDavid van Moolenbroek void interface_stash (struct interface_info *); 3254*83ee113eSDavid van Moolenbroek void interface_snorf (struct interface_info *, int); 3255*83ee113eSDavid van Moolenbroek 3256*83ee113eSDavid van Moolenbroek isc_result_t binding_scope_set_value (struct binding_scope *, int, 3257*83ee113eSDavid van Moolenbroek omapi_data_string_t *, 3258*83ee113eSDavid van Moolenbroek omapi_typed_data_t *); 3259*83ee113eSDavid van Moolenbroek isc_result_t binding_scope_get_value (omapi_value_t **, 3260*83ee113eSDavid van Moolenbroek struct binding_scope *, 3261*83ee113eSDavid van Moolenbroek omapi_data_string_t *); 3262*83ee113eSDavid van Moolenbroek isc_result_t binding_scope_stuff_values (omapi_object_t *, 3263*83ee113eSDavid van Moolenbroek struct binding_scope *); 3264*83ee113eSDavid van Moolenbroek 3265*83ee113eSDavid van Moolenbroek void register_eventhandler(struct eventqueue **, void (*handler)(void *)); 3266*83ee113eSDavid van Moolenbroek void unregister_eventhandler(struct eventqueue **, void (*handler)(void *)); 3267*83ee113eSDavid van Moolenbroek void trigger_event(struct eventqueue **); 3268*83ee113eSDavid van Moolenbroek 3269*83ee113eSDavid van Moolenbroek /* mdb.c */ 3270*83ee113eSDavid van Moolenbroek 3271*83ee113eSDavid van Moolenbroek extern struct subnet *subnets; 3272*83ee113eSDavid van Moolenbroek extern struct shared_network *shared_networks; 3273*83ee113eSDavid van Moolenbroek extern host_hash_t *host_hw_addr_hash; 3274*83ee113eSDavid van Moolenbroek extern host_hash_t *host_uid_hash; 3275*83ee113eSDavid van Moolenbroek extern host_hash_t *host_name_hash; 3276*83ee113eSDavid van Moolenbroek extern lease_id_hash_t *lease_uid_hash; 3277*83ee113eSDavid van Moolenbroek extern lease_ip_hash_t *lease_ip_addr_hash; 3278*83ee113eSDavid van Moolenbroek extern lease_id_hash_t *lease_hw_addr_hash; 3279*83ee113eSDavid van Moolenbroek 3280*83ee113eSDavid van Moolenbroek extern omapi_object_type_t *dhcp_type_host; 3281*83ee113eSDavid van Moolenbroek 3282*83ee113eSDavid van Moolenbroek extern int numclasseswritten; 3283*83ee113eSDavid van Moolenbroek 3284*83ee113eSDavid van Moolenbroek 3285*83ee113eSDavid van Moolenbroek isc_result_t enter_class (struct class *, int, int); 3286*83ee113eSDavid van Moolenbroek isc_result_t delete_class (struct class *, int); 3287*83ee113eSDavid van Moolenbroek isc_result_t enter_host (struct host_decl *, int, int); 3288*83ee113eSDavid van Moolenbroek isc_result_t delete_host (struct host_decl *, int); 3289*83ee113eSDavid van Moolenbroek void change_host_uid(struct host_decl *host, const char *data, int len); 3290*83ee113eSDavid van Moolenbroek int find_hosts_by_haddr (struct host_decl **, int, 3291*83ee113eSDavid van Moolenbroek const unsigned char *, unsigned, 3292*83ee113eSDavid van Moolenbroek const char *, int); 3293*83ee113eSDavid van Moolenbroek int find_hosts_by_uid (struct host_decl **, const unsigned char *, 3294*83ee113eSDavid van Moolenbroek unsigned, const char *, int); 3295*83ee113eSDavid van Moolenbroek int find_hosts_by_option(struct host_decl **, struct packet *, 3296*83ee113eSDavid van Moolenbroek struct option_state *, const char *, int); 3297*83ee113eSDavid van Moolenbroek int find_host_for_network (struct subnet **, struct host_decl **, 3298*83ee113eSDavid van Moolenbroek struct iaddr *, struct shared_network *); 3299*83ee113eSDavid van Moolenbroek void new_address_range (struct parse *, struct iaddr, struct iaddr, 3300*83ee113eSDavid van Moolenbroek struct subnet *, struct pool *, 3301*83ee113eSDavid van Moolenbroek struct lease **); 3302*83ee113eSDavid van Moolenbroek isc_result_t dhcp_lease_free (omapi_object_t *, const char *, int); 3303*83ee113eSDavid van Moolenbroek isc_result_t dhcp_lease_get (omapi_object_t **, const char *, int); 3304*83ee113eSDavid van Moolenbroek int find_grouped_subnet (struct subnet **, struct shared_network *, 3305*83ee113eSDavid van Moolenbroek struct iaddr, const char *, int); 3306*83ee113eSDavid van Moolenbroek int find_subnet(struct subnet **, struct iaddr, const char *, int); 3307*83ee113eSDavid van Moolenbroek void enter_shared_network (struct shared_network *); 3308*83ee113eSDavid van Moolenbroek void new_shared_network_interface (struct parse *, 3309*83ee113eSDavid van Moolenbroek struct shared_network *, 3310*83ee113eSDavid van Moolenbroek const char *); 3311*83ee113eSDavid van Moolenbroek int subnet_inner_than(const struct subnet *, const struct subnet *, int); 3312*83ee113eSDavid van Moolenbroek void enter_subnet (struct subnet *); 3313*83ee113eSDavid van Moolenbroek void enter_lease (struct lease *); 3314*83ee113eSDavid van Moolenbroek int supersede_lease (struct lease *, struct lease *, int, int, int); 3315*83ee113eSDavid van Moolenbroek void make_binding_state_transition (struct lease *); 3316*83ee113eSDavid van Moolenbroek int lease_copy (struct lease **, struct lease *, const char *, int); 3317*83ee113eSDavid van Moolenbroek void release_lease (struct lease *, struct packet *); 3318*83ee113eSDavid van Moolenbroek void abandon_lease (struct lease *, const char *); 3319*83ee113eSDavid van Moolenbroek #if 0 3320*83ee113eSDavid van Moolenbroek /* this appears to be unused and I plan to remove it SAR */ 3321*83ee113eSDavid van Moolenbroek void dissociate_lease (struct lease *); 3322*83ee113eSDavid van Moolenbroek #endif 3323*83ee113eSDavid van Moolenbroek void pool_timer (void *); 3324*83ee113eSDavid van Moolenbroek int find_lease_by_uid (struct lease **, const unsigned char *, 3325*83ee113eSDavid van Moolenbroek unsigned, const char *, int); 3326*83ee113eSDavid van Moolenbroek int find_lease_by_hw_addr (struct lease **, const unsigned char *, 3327*83ee113eSDavid van Moolenbroek unsigned, const char *, int); 3328*83ee113eSDavid van Moolenbroek int find_lease_by_ip_addr (struct lease **, struct iaddr, 3329*83ee113eSDavid van Moolenbroek const char *, int); 3330*83ee113eSDavid van Moolenbroek void uid_hash_add (struct lease *); 3331*83ee113eSDavid van Moolenbroek void uid_hash_delete (struct lease *); 3332*83ee113eSDavid van Moolenbroek void hw_hash_add (struct lease *); 3333*83ee113eSDavid van Moolenbroek void hw_hash_delete (struct lease *); 3334*83ee113eSDavid van Moolenbroek int write_leases (void); 3335*83ee113eSDavid van Moolenbroek int write_leases6(void); 3336*83ee113eSDavid van Moolenbroek int lease_enqueue (struct lease *); 3337*83ee113eSDavid van Moolenbroek isc_result_t lease_instantiate(const void *, unsigned, void *); 3338*83ee113eSDavid van Moolenbroek void expire_all_pools (void); 3339*83ee113eSDavid van Moolenbroek void dump_subnets (void); 3340*83ee113eSDavid van Moolenbroek #if defined (DEBUG_MEMORY_LEAKAGE) || \ 3341*83ee113eSDavid van Moolenbroek defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT) 3342*83ee113eSDavid van Moolenbroek void free_everything (void); 3343*83ee113eSDavid van Moolenbroek #endif 3344*83ee113eSDavid van Moolenbroek 3345*83ee113eSDavid van Moolenbroek /* failover.c */ 3346*83ee113eSDavid van Moolenbroek #if defined (FAILOVER_PROTOCOL) 3347*83ee113eSDavid van Moolenbroek extern dhcp_failover_state_t *failover_states; 3348*83ee113eSDavid van Moolenbroek void dhcp_failover_startup (void); 3349*83ee113eSDavid van Moolenbroek int dhcp_failover_write_all_states (void); 3350*83ee113eSDavid van Moolenbroek isc_result_t enter_failover_peer (dhcp_failover_state_t *); 3351*83ee113eSDavid van Moolenbroek isc_result_t find_failover_peer (dhcp_failover_state_t **, 3352*83ee113eSDavid van Moolenbroek const char *, const char *, int); 3353*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_link_initiate (omapi_object_t *); 3354*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_link_signal (omapi_object_t *, 3355*83ee113eSDavid van Moolenbroek const char *, va_list); 3356*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_link_set_value (omapi_object_t *, 3357*83ee113eSDavid van Moolenbroek omapi_object_t *, 3358*83ee113eSDavid van Moolenbroek omapi_data_string_t *, 3359*83ee113eSDavid van Moolenbroek omapi_typed_data_t *); 3360*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_link_get_value (omapi_object_t *, 3361*83ee113eSDavid van Moolenbroek omapi_object_t *, 3362*83ee113eSDavid van Moolenbroek omapi_data_string_t *, 3363*83ee113eSDavid van Moolenbroek omapi_value_t **); 3364*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_link_destroy (omapi_object_t *, 3365*83ee113eSDavid van Moolenbroek const char *, int); 3366*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_link_stuff_values (omapi_object_t *, 3367*83ee113eSDavid van Moolenbroek omapi_object_t *, 3368*83ee113eSDavid van Moolenbroek omapi_object_t *); 3369*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_listen (omapi_object_t *); 3370*83ee113eSDavid van Moolenbroek 3371*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_listener_signal (omapi_object_t *, 3372*83ee113eSDavid van Moolenbroek const char *, 3373*83ee113eSDavid van Moolenbroek va_list); 3374*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_listener_set_value (omapi_object_t *, 3375*83ee113eSDavid van Moolenbroek omapi_object_t *, 3376*83ee113eSDavid van Moolenbroek omapi_data_string_t *, 3377*83ee113eSDavid van Moolenbroek omapi_typed_data_t *); 3378*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_listener_get_value (omapi_object_t *, 3379*83ee113eSDavid van Moolenbroek omapi_object_t *, 3380*83ee113eSDavid van Moolenbroek omapi_data_string_t *, 3381*83ee113eSDavid van Moolenbroek omapi_value_t **); 3382*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_listener_destroy (omapi_object_t *, 3383*83ee113eSDavid van Moolenbroek const char *, int); 3384*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_listener_stuff (omapi_object_t *, 3385*83ee113eSDavid van Moolenbroek omapi_object_t *, 3386*83ee113eSDavid van Moolenbroek omapi_object_t *); 3387*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_register (omapi_object_t *); 3388*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_state_signal (omapi_object_t *, 3389*83ee113eSDavid van Moolenbroek const char *, va_list); 3390*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_state_transition (dhcp_failover_state_t *, 3391*83ee113eSDavid van Moolenbroek const char *); 3392*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_set_service_state (dhcp_failover_state_t *state); 3393*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_set_state (dhcp_failover_state_t *, 3394*83ee113eSDavid van Moolenbroek enum failover_state); 3395*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_peer_state_changed (dhcp_failover_state_t *, 3396*83ee113eSDavid van Moolenbroek failover_message_t *); 3397*83ee113eSDavid van Moolenbroek void dhcp_failover_pool_rebalance (void *); 3398*83ee113eSDavid van Moolenbroek void dhcp_failover_pool_check (struct pool *); 3399*83ee113eSDavid van Moolenbroek int dhcp_failover_state_pool_check (dhcp_failover_state_t *); 3400*83ee113eSDavid van Moolenbroek void dhcp_failover_timeout (void *); 3401*83ee113eSDavid van Moolenbroek void dhcp_failover_send_contact (void *); 3402*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_send_state (dhcp_failover_state_t *); 3403*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_send_updates (dhcp_failover_state_t *); 3404*83ee113eSDavid van Moolenbroek int dhcp_failover_queue_update (struct lease *, int); 3405*83ee113eSDavid van Moolenbroek int dhcp_failover_send_acks (dhcp_failover_state_t *); 3406*83ee113eSDavid van Moolenbroek void dhcp_failover_toack_queue_timeout (void *); 3407*83ee113eSDavid van Moolenbroek int dhcp_failover_queue_ack (dhcp_failover_state_t *, failover_message_t *msg); 3408*83ee113eSDavid van Moolenbroek void dhcp_failover_ack_queue_remove (dhcp_failover_state_t *, struct lease *); 3409*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_state_set_value (omapi_object_t *, 3410*83ee113eSDavid van Moolenbroek omapi_object_t *, 3411*83ee113eSDavid van Moolenbroek omapi_data_string_t *, 3412*83ee113eSDavid van Moolenbroek omapi_typed_data_t *); 3413*83ee113eSDavid van Moolenbroek void dhcp_failover_keepalive (void *); 3414*83ee113eSDavid van Moolenbroek void dhcp_failover_reconnect (void *); 3415*83ee113eSDavid van Moolenbroek void dhcp_failover_startup_timeout (void *); 3416*83ee113eSDavid van Moolenbroek void dhcp_failover_link_startup_timeout (void *); 3417*83ee113eSDavid van Moolenbroek void dhcp_failover_listener_restart (void *); 3418*83ee113eSDavid van Moolenbroek void dhcp_failover_auto_partner_down(void *vs); 3419*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_state_get_value (omapi_object_t *, 3420*83ee113eSDavid van Moolenbroek omapi_object_t *, 3421*83ee113eSDavid van Moolenbroek omapi_data_string_t *, 3422*83ee113eSDavid van Moolenbroek omapi_value_t **); 3423*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_state_destroy (omapi_object_t *, 3424*83ee113eSDavid van Moolenbroek const char *, int); 3425*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_state_stuff (omapi_object_t *, 3426*83ee113eSDavid van Moolenbroek omapi_object_t *, 3427*83ee113eSDavid van Moolenbroek omapi_object_t *); 3428*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_state_lookup (omapi_object_t **, 3429*83ee113eSDavid van Moolenbroek omapi_object_t *, 3430*83ee113eSDavid van Moolenbroek omapi_object_t *); 3431*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_state_create (omapi_object_t **, 3432*83ee113eSDavid van Moolenbroek omapi_object_t *); 3433*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_state_remove (omapi_object_t *, 3434*83ee113eSDavid van Moolenbroek omapi_object_t *); 3435*83ee113eSDavid van Moolenbroek int dhcp_failover_state_match (dhcp_failover_state_t *, u_int8_t *, unsigned); 3436*83ee113eSDavid van Moolenbroek int dhcp_failover_state_match_by_name(dhcp_failover_state_t *, 3437*83ee113eSDavid van Moolenbroek failover_option_t *); 3438*83ee113eSDavid van Moolenbroek const char *dhcp_failover_reject_reason_print (int); 3439*83ee113eSDavid van Moolenbroek const char *dhcp_failover_state_name_print (enum failover_state); 3440*83ee113eSDavid van Moolenbroek const char *dhcp_failover_message_name (unsigned); 3441*83ee113eSDavid van Moolenbroek const char *dhcp_failover_option_name (unsigned); 3442*83ee113eSDavid van Moolenbroek failover_option_t *dhcp_failover_option_printf (unsigned, char *, 3443*83ee113eSDavid van Moolenbroek unsigned *, 3444*83ee113eSDavid van Moolenbroek unsigned, 3445*83ee113eSDavid van Moolenbroek const char *, ...) 3446*83ee113eSDavid van Moolenbroek __attribute__((__format__(__printf__,5,6))); 3447*83ee113eSDavid van Moolenbroek failover_option_t *dhcp_failover_make_option (unsigned, char *, 3448*83ee113eSDavid van Moolenbroek unsigned *, unsigned, ...); 3449*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_put_message (dhcp_failover_link_t *, 3450*83ee113eSDavid van Moolenbroek omapi_object_t *, int, u_int32_t, ...); 3451*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_send_connect (omapi_object_t *); 3452*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_send_connectack (omapi_object_t *, 3453*83ee113eSDavid van Moolenbroek dhcp_failover_state_t *, 3454*83ee113eSDavid van Moolenbroek int, const char *); 3455*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_send_disconnect (omapi_object_t *, 3456*83ee113eSDavid van Moolenbroek int, const char *); 3457*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_send_bind_update (dhcp_failover_state_t *, 3458*83ee113eSDavid van Moolenbroek struct lease *); 3459*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_send_bind_ack (dhcp_failover_state_t *, 3460*83ee113eSDavid van Moolenbroek failover_message_t *, 3461*83ee113eSDavid van Moolenbroek int, const char *); 3462*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_send_poolreq (dhcp_failover_state_t *); 3463*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_send_poolresp (dhcp_failover_state_t *, int); 3464*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_send_update_request (dhcp_failover_state_t *); 3465*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_send_update_request_all (dhcp_failover_state_t *); 3466*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_send_update_done (dhcp_failover_state_t *); 3467*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_process_bind_update (dhcp_failover_state_t *, 3468*83ee113eSDavid van Moolenbroek failover_message_t *); 3469*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_process_bind_ack (dhcp_failover_state_t *, 3470*83ee113eSDavid van Moolenbroek failover_message_t *); 3471*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_generate_update_queue (dhcp_failover_state_t *, 3472*83ee113eSDavid van Moolenbroek int); 3473*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_process_update_request (dhcp_failover_state_t *, 3474*83ee113eSDavid van Moolenbroek failover_message_t *); 3475*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_process_update_request_all (dhcp_failover_state_t *, 3476*83ee113eSDavid van Moolenbroek failover_message_t *); 3477*83ee113eSDavid van Moolenbroek isc_result_t dhcp_failover_process_update_done (dhcp_failover_state_t *, 3478*83ee113eSDavid van Moolenbroek failover_message_t *); 3479*83ee113eSDavid van Moolenbroek void ia_remove_all_lease(struct ia_xx *ia, const char *file, int line); 3480*83ee113eSDavid van Moolenbroek void dhcp_failover_recover_done (void *); 3481*83ee113eSDavid van Moolenbroek void failover_print (char *, unsigned *, unsigned, const char *); 3482*83ee113eSDavid van Moolenbroek void update_partner (struct lease *); 3483*83ee113eSDavid van Moolenbroek int load_balance_mine (struct packet *, dhcp_failover_state_t *); 3484*83ee113eSDavid van Moolenbroek int peer_wants_lease (struct lease *); 3485*83ee113eSDavid van Moolenbroek binding_state_t normal_binding_state_transition_check (struct lease *, 3486*83ee113eSDavid van Moolenbroek dhcp_failover_state_t *, 3487*83ee113eSDavid van Moolenbroek binding_state_t, 3488*83ee113eSDavid van Moolenbroek u_int32_t); 3489*83ee113eSDavid van Moolenbroek binding_state_t 3490*83ee113eSDavid van Moolenbroek conflict_binding_state_transition_check (struct lease *, 3491*83ee113eSDavid van Moolenbroek dhcp_failover_state_t *, 3492*83ee113eSDavid van Moolenbroek binding_state_t, u_int32_t); 3493*83ee113eSDavid van Moolenbroek int lease_mine_to_reallocate (struct lease *); 3494*83ee113eSDavid van Moolenbroek 3495*83ee113eSDavid van Moolenbroek OMAPI_OBJECT_ALLOC_DECL (dhcp_failover_state, dhcp_failover_state_t, 3496*83ee113eSDavid van Moolenbroek dhcp_type_failover_state) 3497*83ee113eSDavid van Moolenbroek OMAPI_OBJECT_ALLOC_DECL (dhcp_failover_listener, dhcp_failover_listener_t, 3498*83ee113eSDavid van Moolenbroek dhcp_type_failover_listener) 3499*83ee113eSDavid van Moolenbroek OMAPI_OBJECT_ALLOC_DECL (dhcp_failover_link, dhcp_failover_link_t, 3500*83ee113eSDavid van Moolenbroek dhcp_type_failover_link) 3501*83ee113eSDavid van Moolenbroek #endif /* FAILOVER_PROTOCOL */ 3502*83ee113eSDavid van Moolenbroek 3503*83ee113eSDavid van Moolenbroek const char *binding_state_print (enum failover_state); 3504*83ee113eSDavid van Moolenbroek 3505*83ee113eSDavid van Moolenbroek /* ldap.c */ 3506*83ee113eSDavid van Moolenbroek #if defined(LDAP_CONFIGURATION) 3507*83ee113eSDavid van Moolenbroek extern struct enumeration ldap_methods; 3508*83ee113eSDavid van Moolenbroek #if defined (LDAP_USE_SSL) 3509*83ee113eSDavid van Moolenbroek extern struct enumeration ldap_ssl_usage_enum; 3510*83ee113eSDavid van Moolenbroek extern struct enumeration ldap_tls_reqcert_enum; 3511*83ee113eSDavid van Moolenbroek extern struct enumeration ldap_tls_crlcheck_enum; 3512*83ee113eSDavid van Moolenbroek #endif 3513*83ee113eSDavid van Moolenbroek isc_result_t ldap_read_config (void); 3514*83ee113eSDavid van Moolenbroek int find_haddr_in_ldap (struct host_decl **, int, unsigned, 3515*83ee113eSDavid van Moolenbroek const unsigned char *, const char *, int); 3516*83ee113eSDavid van Moolenbroek int find_subclass_in_ldap (struct class *, struct class **, 3517*83ee113eSDavid van Moolenbroek struct data_string *); 3518*83ee113eSDavid van Moolenbroek #endif 3519*83ee113eSDavid van Moolenbroek 3520*83ee113eSDavid van Moolenbroek /* mdb6.c */ 3521*83ee113eSDavid van Moolenbroek HASH_FUNCTIONS_DECL(ia, unsigned char *, struct ia_xx, ia_hash_t) 3522*83ee113eSDavid van Moolenbroek HASH_FUNCTIONS_DECL(iasubopt, struct in6_addr *, struct iasubopt, 3523*83ee113eSDavid van Moolenbroek iasubopt_hash_t) 3524*83ee113eSDavid van Moolenbroek 3525*83ee113eSDavid van Moolenbroek isc_result_t iasubopt_allocate(struct iasubopt **iasubopt, 3526*83ee113eSDavid van Moolenbroek const char *file, int line); 3527*83ee113eSDavid van Moolenbroek isc_result_t iasubopt_reference(struct iasubopt **iasubopt, 3528*83ee113eSDavid van Moolenbroek struct iasubopt *src, 3529*83ee113eSDavid van Moolenbroek const char *file, int line); 3530*83ee113eSDavid van Moolenbroek isc_result_t iasubopt_dereference(struct iasubopt **iasubopt, 3531*83ee113eSDavid van Moolenbroek const char *file, int line); 3532*83ee113eSDavid van Moolenbroek 3533*83ee113eSDavid van Moolenbroek isc_result_t ia_make_key(struct data_string *key, u_int32_t iaid, 3534*83ee113eSDavid van Moolenbroek const char *duid, unsigned int duid_len, 3535*83ee113eSDavid van Moolenbroek const char *file, int line); 3536*83ee113eSDavid van Moolenbroek isc_result_t ia_allocate(struct ia_xx **ia, u_int32_t iaid, 3537*83ee113eSDavid van Moolenbroek const char *duid, unsigned int duid_len, 3538*83ee113eSDavid van Moolenbroek const char *file, int line); 3539*83ee113eSDavid van Moolenbroek isc_result_t ia_reference(struct ia_xx **ia, struct ia_xx *src, 3540*83ee113eSDavid van Moolenbroek const char *file, int line); 3541*83ee113eSDavid van Moolenbroek isc_result_t ia_dereference(struct ia_xx **ia, 3542*83ee113eSDavid van Moolenbroek const char *file, int line); 3543*83ee113eSDavid van Moolenbroek isc_result_t ia_add_iasubopt(struct ia_xx *ia, struct iasubopt *iasubopt, 3544*83ee113eSDavid van Moolenbroek const char *file, int line); 3545*83ee113eSDavid van Moolenbroek void ia_remove_iasubopt(struct ia_xx *ia, struct iasubopt *iasubopt, 3546*83ee113eSDavid van Moolenbroek const char *file, int line); 3547*83ee113eSDavid van Moolenbroek isc_boolean_t ia_equal(const struct ia_xx *a, const struct ia_xx *b); 3548*83ee113eSDavid van Moolenbroek 3549*83ee113eSDavid van Moolenbroek isc_result_t ipv6_pool_allocate(struct ipv6_pool **pool, u_int16_t type, 3550*83ee113eSDavid van Moolenbroek const struct in6_addr *start_addr, 3551*83ee113eSDavid van Moolenbroek int bits, int units, 3552*83ee113eSDavid van Moolenbroek const char *file, int line); 3553*83ee113eSDavid van Moolenbroek isc_result_t ipv6_pool_reference(struct ipv6_pool **pool, 3554*83ee113eSDavid van Moolenbroek struct ipv6_pool *src, 3555*83ee113eSDavid van Moolenbroek const char *file, int line); 3556*83ee113eSDavid van Moolenbroek isc_result_t ipv6_pool_dereference(struct ipv6_pool **pool, 3557*83ee113eSDavid van Moolenbroek const char *file, int line); 3558*83ee113eSDavid van Moolenbroek isc_result_t create_lease6(struct ipv6_pool *pool, 3559*83ee113eSDavid van Moolenbroek struct iasubopt **addr, 3560*83ee113eSDavid van Moolenbroek unsigned int *attempts, 3561*83ee113eSDavid van Moolenbroek const struct data_string *uid, 3562*83ee113eSDavid van Moolenbroek time_t soft_lifetime_end_time); 3563*83ee113eSDavid van Moolenbroek isc_result_t add_lease6(struct ipv6_pool *pool, 3564*83ee113eSDavid van Moolenbroek struct iasubopt *lease, 3565*83ee113eSDavid van Moolenbroek time_t valid_lifetime_end_time); 3566*83ee113eSDavid van Moolenbroek isc_result_t renew_lease6(struct ipv6_pool *pool, struct iasubopt *lease); 3567*83ee113eSDavid van Moolenbroek isc_result_t expire_lease6(struct iasubopt **leasep, 3568*83ee113eSDavid van Moolenbroek struct ipv6_pool *pool, time_t now); 3569*83ee113eSDavid van Moolenbroek isc_result_t release_lease6(struct ipv6_pool *pool, struct iasubopt *lease); 3570*83ee113eSDavid van Moolenbroek isc_result_t decline_lease6(struct ipv6_pool *pool, struct iasubopt *lease); 3571*83ee113eSDavid van Moolenbroek isc_boolean_t lease6_exists(const struct ipv6_pool *pool, 3572*83ee113eSDavid van Moolenbroek const struct in6_addr *addr); 3573*83ee113eSDavid van Moolenbroek isc_boolean_t lease6_usable(struct iasubopt *lease); 3574*83ee113eSDavid van Moolenbroek isc_result_t cleanup_lease6(ia_hash_t *ia_table, 3575*83ee113eSDavid van Moolenbroek struct ipv6_pool *pool, 3576*83ee113eSDavid van Moolenbroek struct iasubopt *lease, 3577*83ee113eSDavid van Moolenbroek struct ia_xx *ia); 3578*83ee113eSDavid van Moolenbroek isc_result_t mark_lease_unavailble(struct ipv6_pool *pool, 3579*83ee113eSDavid van Moolenbroek const struct in6_addr *addr); 3580*83ee113eSDavid van Moolenbroek isc_result_t create_prefix6(struct ipv6_pool *pool, 3581*83ee113eSDavid van Moolenbroek struct iasubopt **pref, 3582*83ee113eSDavid van Moolenbroek unsigned int *attempts, 3583*83ee113eSDavid van Moolenbroek const struct data_string *uid, 3584*83ee113eSDavid van Moolenbroek time_t soft_lifetime_end_time); 3585*83ee113eSDavid van Moolenbroek isc_boolean_t prefix6_exists(const struct ipv6_pool *pool, 3586*83ee113eSDavid van Moolenbroek const struct in6_addr *pref, u_int8_t plen); 3587*83ee113eSDavid van Moolenbroek 3588*83ee113eSDavid van Moolenbroek isc_result_t add_ipv6_pool(struct ipv6_pool *pool); 3589*83ee113eSDavid van Moolenbroek isc_result_t find_ipv6_pool(struct ipv6_pool **pool, u_int16_t type, 3590*83ee113eSDavid van Moolenbroek const struct in6_addr *addr); 3591*83ee113eSDavid van Moolenbroek isc_boolean_t ipv6_in_pool(const struct in6_addr *addr, 3592*83ee113eSDavid van Moolenbroek const struct ipv6_pool *pool); 3593*83ee113eSDavid van Moolenbroek isc_result_t ipv6_pond_allocate(struct ipv6_pond **pond, 3594*83ee113eSDavid van Moolenbroek const char *file, int line); 3595*83ee113eSDavid van Moolenbroek isc_result_t ipv6_pond_reference(struct ipv6_pond **pond, 3596*83ee113eSDavid van Moolenbroek struct ipv6_pond *src, 3597*83ee113eSDavid van Moolenbroek const char *file, int line); 3598*83ee113eSDavid van Moolenbroek isc_result_t ipv6_pond_dereference(struct ipv6_pond **pond, 3599*83ee113eSDavid van Moolenbroek const char *file, int line); 3600*83ee113eSDavid van Moolenbroek 3601*83ee113eSDavid van Moolenbroek isc_result_t renew_leases(struct ia_xx *ia); 3602*83ee113eSDavid van Moolenbroek isc_result_t release_leases(struct ia_xx *ia); 3603*83ee113eSDavid van Moolenbroek isc_result_t decline_leases(struct ia_xx *ia); 3604*83ee113eSDavid van Moolenbroek void schedule_lease_timeout(struct ipv6_pool *pool); 3605*83ee113eSDavid van Moolenbroek void schedule_all_ipv6_lease_timeouts(void); 3606*83ee113eSDavid van Moolenbroek 3607*83ee113eSDavid van Moolenbroek void mark_hosts_unavailable(void); 3608*83ee113eSDavid van Moolenbroek void mark_phosts_unavailable(void); 3609*83ee113eSDavid van Moolenbroek void mark_interfaces_unavailable(void); 3610*83ee113eSDavid van Moolenbroek 3611*83ee113eSDavid van Moolenbroek #define MAX_ADDRESS_STRING_LEN \ 3612*83ee113eSDavid van Moolenbroek (sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")) 3613