34 static void maybe_return_agent_options(
struct packet *
packet,
39 #if defined(DHCPv6) && defined(DHCP4o6) 45 #if defined(DELAYED_ACK) 46 static void delayed_ack_enqueue(
struct lease *);
47 static void delayed_acks_timer(
void *);
50 struct leasequeue *ackqueue_head, *ackqueue_tail;
52 static struct timeval max_fsync;
61 static char dhcp_message [256];
62 static int site_code_min;
64 static int find_min_site_code(
struct universe *);
65 static isc_result_t lowest_site_code(
const void *,
unsigned,
void *);
67 static const char *dhcp_type_names [] = {
78 "DHCPLEASEUNASSIGNED",
85 # define send_packet trace_packet_send 88 static TIME leaseTimeCheck(
TIME calculated,
TIME alternate);
97 memset (&client_identifier, 0,
sizeof client_identifier);
112 return "\"no client id\"";
140 errmsg =
"unknown network segment";
152 #if defined(DHCPv6) && defined(DHCP4o6) 154 log_info(
"DHCP4o6 %s from %s via %s: %s", s,
159 :
"<no identifier>"),
166 log_info(
"%s from %s via %s: %s", s,
169 :
"<no identifier>"),
205 cip.
len =
sizeof packet -> raw -> ciaddr;
207 sizeof packet -> raw -> ciaddr);
222 if (
lease -> uid_len) {
232 memset (&data, 0,
sizeof data);
247 if ((
lease -> hardware_addr.hbuf [0] !=
248 packet -> raw -> htype) ||
249 (
lease -> hardware_addr.hlen - 1 !=
251 memcmp (&
lease -> hardware_addr.hbuf [1],
282 switch (
packet -> packet_type) {
316 errmsg =
"unknown packet type";
332 int peer_has_leases = 0;
333 #if defined (FAILOVER_PROTOCOL) 334 dhcp_failover_state_t *peer;
338 0, &peer_has_leases, (
struct lease *)0,
MDL);
345 s =
"Hostname Unsuitable for Printing";
352 #if defined(DHCPv6) && defined(DHCP4o6) 354 snprintf (msgbuf,
sizeof msgbuf,
355 "DHCP4o6 DHCPDISCOVER from %s %s%s%svia %s",
362 :
"<no identifier>")),
363 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
367 snprintf (msgbuf,
sizeof msgbuf,
"DHCPDISCOVER from %s %s%s%svia %s",
372 :
"<no identifier>")),
373 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
376 :
packet -> interface -> name);
380 #if defined(DHCPv6) && defined(DHCP4o6) 382 log_info (
"DHCP4o6 packet from unknown subnet: %s",
386 log_info (
"Packet from unknown subnet: %s",
391 #if defined (FAILOVER_PROTOCOL) 413 #if defined (DEBUG_FIND_LEASE) 429 log_error (
"%s: peer holds all free leases",
432 log_error (
"%s: network %s: no free leases",
439 #if defined (FAILOVER_PROTOCOL) 445 msgbuf, peer -> nrr);
449 peer = (dhcp_failover_state_t *)0;
454 if (peer_has_leases) {
455 log_debug (
"%s: load balance to peer %s",
456 msgbuf, peer -> name);
459 log_debug (
"%s: cancel load balance to peer %s - %s",
460 msgbuf, peer -> name,
"no free leases");
466 if (
lease -> ends < cur_time && lease ->
scope)
472 if (when < lease ->
ends)
485 struct lease *ip_lease;
497 #if defined (FAILOVER_PROTOCOL) 498 dhcp_failover_state_t *peer;
500 int have_requested_addr = 0;
513 have_requested_addr = 1;
517 memcpy (cip.
iabuf, &
packet -> raw -> ciaddr.s_addr, 4);
534 s =
"Hostname Unsuitable for Printing";
540 memset (&data, 0,
sizeof data);
552 sprintf (smbuf,
" (%s)",
piaddr (sip));
561 #if defined(DHCPv6) && defined(DHCP4o6) 563 snprintf (msgbuf,
sizeof msgbuf,
564 "DHCP4o6 DHCPREQUEST for %s%s from %s %s%s%svia %s",
572 :
"<no identifier>")),
573 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
577 snprintf (msgbuf,
sizeof msgbuf,
578 "DHCPREQUEST for %s%s from %s %s%s%svia %s",
584 :
"<no identifier>")),
585 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
588 :
packet -> interface -> name);
590 #if defined (FAILOVER_PROTOCOL) 596 msgbuf, peer -> nrr);
621 log_debug (
"%s: lease owned by peer", msgbuf);
635 log_debug(
"%s: lease in transition state %s", msgbuf,
637 ?
"released" :
"expired");
646 log_debug (
"%s: lease reset by administrator", msgbuf);
660 (memcmp(sip.
iabuf,
"\0\0\0\0", sip.
len) != 0)) {
668 if (memcmp(sip.
iabuf, &from, sip.
len) != 0) {
669 log_debug(
"%s: not our server id", msgbuf);
698 peer = (dhcp_failover_state_t *)0;
744 (
packet -> raw -> ciaddr.s_addr &&
746 (have_requested_addr && !
packet -> raw -> ciaddr.s_addr)) {
753 log_info (
"%s: wrong network.", msgbuf);
758 log_info (
"%s: ignored (%s).", msgbuf,
760 ?
"not authoritative" :
"unknown subnet"));
772 log_info (
"%s: wrong network.", msgbuf);
776 log_info (
"%s: ignored (not authoritative).", msgbuf);
783 if (!
lease && ours) {
813 char msgbuf [1024], cstr[16];
821 log_info (
"DHCPRELEASE from %s specified requested-address.",
843 lease_reference (&next,
lease -> n_uid,
MDL);
844 if (!memcmp (&
packet -> raw -> ciaddr,
850 lease_reference (&
lease, next,
MDL);
851 lease_dereference (&next,
MDL);
855 lease_dereference (&next,
MDL);
870 (
lease -> hardware_addr.hlen !=
packet -> raw -> hlen + 1 ||
871 lease -> hardware_addr.hbuf [0] !=
packet -> raw -> htype ||
872 memcmp (&
lease -> hardware_addr.hbuf [1],
877 if ((strlen (
lease -> client_hostname) <= 64) &&
879 s =
lease -> client_hostname;
881 s =
"Hostname Unsuitable for Printing";
889 strncpy(cstr, inet_ntoa (
packet -> raw -> ciaddr), 15);
895 #if defined(DHCPv6) && defined(DHCP4o6) 897 snprintf (msgbuf,
sizeof msgbuf,
898 "DHCP4o6 DHCPRELEASE of %s from %s %s%s%svia " 907 :
"<no identifier>")),
908 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
910 lease ?
"" :
"not ");
913 snprintf (msgbuf,
sizeof msgbuf,
914 "DHCPRELEASE of %s from %s %s%s%svia %s (%sfound)",
920 :
"<no identifier>")),
921 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
924 :
packet -> interface -> name,
925 lease ?
"" :
"not ");
927 #if defined (FAILOVER_PROTOCOL) 929 dhcp_failover_state_t *peer =
lease ->
pool -> failover_peer;
933 peer -> name, peer -> nrr);
951 #if defined(FAILOVER_PROTOCOL) 991 if ((strlen (
lease -> client_hostname) <= 64) &&
993 s =
lease -> client_hostname;
995 s =
"Hostname Unsuitable for Printing";
1002 #if defined(DHCPv6) && defined(DHCP4o6) 1004 snprintf (msgbuf,
sizeof msgbuf,
1005 "DHCP4o6 DHCPDECLINE of %s from %s %s%s%svia %s",
1013 :
"<no identifier>")),
1014 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
1018 snprintf (msgbuf,
sizeof msgbuf,
1019 "DHCPDECLINE of %s from %s %s%s%svia %s",
1025 :
"<no identifier>")),
1026 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
1029 :
packet -> interface -> name);
1042 for (i =
packet -> class_count; i > 0; i--) {
1054 packet -> options, options,
1058 #if defined (FAILOVER_PROTOCOL) 1060 dhcp_failover_state_t *peer =
1066 peer -> name, peer -> nrr);
1078 status =
"abandoned";
1080 status =
"not found";
1086 log_info (
"%s: %s", msgbuf, status);
1088 #if defined(FAILOVER_PROTOCOL) 1097 #if defined(RELAY_PORT) 1115 char msgbuf[1024], *addr_type;
1123 struct iaddr cip, gip, sip;
1126 struct sockaddr_in to;
1127 struct in_addr from;
1128 isc_boolean_t zeroed_ciaddr;
1130 int result, h_m_client_ip = 0;
1131 struct host_decl *host = NULL, *hp = NULL, *h;
1132 #if defined(RELAY_PORT) 1135 #if defined (DEBUG_INFORM_HOST) 1136 int h_w_fixed_addr = 0;
1143 zeroed_ciaddr = ISC_TRUE;
1149 addr_type =
"source";
1152 memset(cip.
iabuf, 0, 4);
1156 zeroed_ciaddr = ISC_FALSE;
1159 addr_type =
"client";
1167 if (zeroed_ciaddr == ISC_TRUE) {
1168 addr_type =
"relay";
1177 #if defined(DHCPv6) && defined(DHCP4o6) 1179 snprintf(msgbuf,
sizeof(msgbuf),
1180 "DHCP4o6 DHCPINFORM from %s via %s",
1185 snprintf(msgbuf,
sizeof(msgbuf),
"DHCPINFORM from %s via %s",
1192 if (!memcmp(cip.
iabuf,
"\0\0\0", 4)) {
1193 log_info(
"%s: ignored (null source address).", msgbuf);
1197 #if defined(RELAY_PORT) 1212 memset(&d1, 0,
sizeof d1);
1219 log_info(
"%s: ignored (invalid subnet selection option).", msgbuf);
1241 if ((zeroed_ciaddr == ISC_TRUE) && (gip.
len != 0))
1242 addr_type =
"relay link select";
1244 addr_type =
"selected";
1250 log_info(
"%s: unknown subnet for %s address %s",
1251 msgbuf, addr_type,
piaddr(sip));
1262 log_info(
"%s: not authoritative for subnet %s",
1265 log_info(
"If this DHCP server is authoritative for%s",
1267 log_info(
"please write an `authoritative;' directi%s",
1268 "ve either in the");
1269 log_info(
"subnet declaration or in some scope that%s",
1271 log_info(
"subnet declaration - for example, write %s",
1273 log_info(
"of the dhcpd.conf file.");
1282 memset(&outgoing, 0,
sizeof outgoing);
1283 memset(&raw, 0,
sizeof raw);
1284 outgoing.
raw = &raw;
1286 maybe_return_agent_options(
packet, options);
1295 if (zeroed_ciaddr == ISC_FALSE) {
1296 struct lease* cip_lease = NULL;
1304 NULL,
packet, NULL, NULL,
1312 lease_dereference (&cip_lease,
MDL);
1344 memset(&d1, 0,
sizeof(d1));
1352 #if defined (DEBUG_INFORM_HOST) 1354 log_debug (
"dhcpinform: found host by ID " 1355 "-- checking fixed-address match");
1359 for (h = hp; !h_m_client_ip && h; h = h->n_ipaddr) {
1363 memset(&fixed_addr, 0,
sizeof(fixed_addr));
1365 NULL, NULL, NULL, NULL,
1367 h->fixed_addr,
MDL))
1370 #if defined (DEBUG_INFORM_HOST) 1374 (i + cip.
len) <= fixed_addr.
len;
1376 if (memcmp(fixed_addr.
data + i,
1378 #if defined (DEBUG_INFORM_HOST) 1380 "host with matching " 1381 "fixed-address by ID");
1383 host_reference(&
host, h,
MDL);
1396 #if defined (DEBUG_INFORM_HOST) 1398 "without fixed-address by ID");
1400 host_reference(&
host, h,
MDL);
1404 host_dereference (&hp,
MDL);
1406 if (!
host || !h_m_client_ip) {
1411 #if defined (DEBUG_INFORM_HOST) 1413 log_debug (
"dhcpinform: found host by HW " 1414 "-- checking fixed-address match");
1419 for (h = hp; !h_m_client_ip && h; h = h->n_ipaddr) {
1423 memset (&fixed_addr, 0,
sizeof(fixed_addr));
1425 NULL, NULL, NULL, NULL,
1427 h->fixed_addr,
MDL))
1430 #if defined (DEBUG_INFORM_HOST) 1434 (i + cip.
len) <= fixed_addr.
len;
1436 if (memcmp(fixed_addr.
data + i,
1438 #if defined (DEBUG_INFORM_HOST) 1440 "host with matching " 1441 "fixed-address by HW");
1450 host_reference(&
host, h,
MDL);
1462 #if defined (DEBUG_INFORM_HOST) 1463 log_debug (
"dhcpinform: found host without " 1464 "fixed-address by HW");
1466 host_reference (&
host, h,
MDL);
1471 host_dereference (&hp,
MDL);
1474 #if defined (DEBUG_INFORM_HOST) 1479 if (h_w_fixed_addr && !h_m_client_ip) {
1480 log_info (
"dhcpinform: matching host with " 1481 "fixed-address different than " 1482 "client IP detected?!");
1490 #if defined (DEBUG_INFORM_HOST) 1491 log_info (
"dhcpinform: applying host (group) options");
1498 host_dereference (&
host,
MDL);
1504 memset (&d1, 0,
sizeof d1);
1512 if (i >=
sizeof(raw.
file)) {
1513 log_info(
"file name longer than packet field " 1514 "truncated - field: %lu name: %d %.*s",
1515 (
unsigned long)
sizeof(raw.
file), i,
1517 i =
sizeof(raw.
file);
1532 if (i >=
sizeof(raw.
sname)) {
1533 log_info(
"server name longer than packet field " 1534 "truncated - field: %lu name: %d %.*s",
1535 (
unsigned long)
sizeof(raw.
sname), i,
1537 i =
sizeof(raw.
sname);
1559 option_code_hash_lookup(&oc->
option,
1579 option_code_hash_lookup(&oc->
option,
1594 packet -> options, options,
1599 (
const char *)d1.
data, d1.
len,
1608 options -> site_universe = u ->
index;
1616 memset (&prl, 0,
sizeof prl);
1633 packet -> options, options,
1648 packet -> options, options,
1697 #if defined(DHCPv6) && defined(DHCP4o6) 1700 snprintf(msgbuf,
sizeof msgbuf,
1701 "DHCP4o6 DHCPACK to %s (%s) via",
piaddr(cip),
1705 "<no client hardware address>");
1713 log_fatal(
"No memory to store DHCP4o6 reply.");
1728 to.sin_family = AF_INET;
1730 to.sin_len =
sizeof to;
1732 memset (to.sin_zero, 0,
sizeof to.sin_zero);
1752 if (!raw.ciaddr.s_addr && gip.
len) {
1753 memcpy(&to.sin_addr, gip.
iabuf, 4);
1754 #if defined(RELAY_PORT) 1762 memcpy(&to.sin_addr, cip.
iabuf, 4);
1767 snprintf(msgbuf,
sizeof msgbuf,
"DHCPACK to %s (%s) via",
piaddr(cip),
1770 "<no client hardware address>");
1778 outgoing.packet_length, from, &to, NULL);
1780 log_error ("%s:%d: Failed to send %d byte long packet over %s "
1781 "interface.", MDL, outgoing.packet_length,
1787 subnet_dereference (&subnet, MDL);
1805 struct
group *network_group;
1807 struct sockaddr_in to;
1808 struct in_addr from;
1814 #if defined(RELAY_PORT) 1822 memset (&outgoing, 0,
sizeof outgoing);
1823 memset (&raw, 0,
sizeof raw);
1828 log_error (
"No memory for DHCPNAK message type.");
1834 log_error (
"No memory for expr_const expression.");
1845 #if defined(RELAY_PORT) 1851 log_error (
"No memory for DHCPNAK message type.");
1856 (
unsigned char *)dhcp_message,
1857 strlen (dhcp_message), 1, 0,
MDL)) {
1858 log_error (
"No memory for expr_const expression.");
1874 #if defined(SERVER_ID_FOR_NAK) 1942 #if defined(DHCPv6) && defined(DHCP4o6) 1944 log_info (
"DHCP4o6 DHCPNAK on %s to %s via %s",
1948 packet -> raw -> chaddr),
1952 log_info (
"DHCPNAK on %s to %s via %s",
1957 :
packet -> interface -> name);
1966 #if defined(DHCPv6) && defined(DHCP4o6) 1973 log_fatal(
"No memory to store DHCP4o6 reply.");
1984 to.sin_family = AF_INET;
1986 to.sin_len =
sizeof to;
1988 memset (to.sin_zero, 0,
sizeof to.sin_zero);
1992 if (raw.giaddr.s_addr) {
1993 to.sin_addr = raw.giaddr;
1994 if (raw.giaddr.s_addr != htonl (INADDR_LOOPBACK))
1995 #if defined(RELAY_PORT) 2008 log_error (
"%s:%d: Failed to send %d byte long " 2009 "packet over %s interface.",
MDL,
2025 log_error (
"%s:%d: Failed to send %d byte long packet over %s " 2074 memset(&client_id, 0,
sizeof client_id);
2087 option_code_hash_lookup(&oc->
option,
2109 int used, count, high_threshold, poolhigh = 0, poollow = 0;
2110 char *shared_name =
"no name";
2138 log_error(
"Pool threshold reset - shared subnet: %s; " 2139 "address: %s; low threshold %d/%d.",
2155 if ((poolhigh <= 0) || (poolhigh > 100)) {
2162 if (used < high_threshold) {
2168 log_error(
"Pool threshold exceeded - shared subnet: %s; " 2169 "address: %s; high threshold %d%% %d/%d.",
2171 poolhigh, used, count);
2187 if (poollow < poolhigh) {
2207 TIME offered_lease_time;
2209 TIME min_lease_time;
2213 isc_result_t result;
2216 struct in_addr from;
2217 TIME remaining_time;
2219 #if defined(DELAYED_ACK) 2221 isc_boolean_t enqueue = ISC_FALSE;
2223 int use_old_lease = 0;
2239 host_reference (&host, hp,
MDL);
2240 else if (
lease -> host)
2241 host_reference (&host,
lease -> host,
MDL);
2246 log_fatal (
"unable to allocate lease state!");
2247 state -> got_requested_address =
packet -> got_requested_address;
2254 state -> got_server_identifier = 1;
2294 for (i =
packet -> class_count; i > 0; i--) {
2320 state -> options, &
lease -> scope,
2325 seek = (
struct lease *)0;
2331 lease_dereference (&seek,
MDL);
2342 if (seek !=
lease &&
2349 lease_dereference (&seek,
MDL);
2351 lease_reference (&seek,
next,
MDL);
2352 lease_dereference (&
next,
MDL);
2356 lease_dereference (&
next,
MDL);
2359 lease_dereference (&seek,
MDL);
2366 !
host -> client_identifier.len &&
2376 seek = (
struct lease *)0;
2383 lease_dereference (&seek,
MDL);
2390 if (seek !=
lease &&
2397 lease_dereference (&seek,
MDL);
2399 lease_reference (&seek,
next,
MDL);
2400 lease_dereference (&
next,
MDL);
2404 lease_dereference (&
next,
MDL);
2407 lease_dereference (&seek,
MDL);
2417 memset (&d1, 0,
sizeof d1);
2426 ntohs (
packet -> raw -> secs) < d1.
data [0]) {
2427 log_info(
"%s: configured min-secs value (%d) " 2428 "is greater than secs field (%d). " 2429 "message dropped.", msg, d1.
data[0],
2434 host_dereference (&
host,
MDL);
2460 packet -> options, state -> options,
2464 for (h = hp; h; h = h ->
n_ipaddr) {
2469 host_reference (&host, h,
MDL);
2471 host_dereference(&hp,
MDL);
2479 for (h = hp; h; h = h ->
n_ipaddr) {
2484 host_reference (&host, h,
MDL);
2486 host_dereference(&hp,
MDL);
2491 for (h = hp; h; h = h ->
n_ipaddr) {
2496 host_reference (&host, h,
MDL);
2498 host_dereference(&hp,
MDL);
2525 log_info (
"%s: unknown client", msg);
2528 host_dereference (&host,
MDL);
2543 log_info (
"%s: bootp disallowed", msg);
2546 host_dereference (&host,
MDL);
2561 log_info (
"%s: booting disallowed", msg);
2564 host_dereference (&host,
MDL);
2573 if (
lease -> billing_class) {
2574 for (i = 0; i <
packet -> class_count; i++)
2575 if (
packet -> classes [i] ==
2576 lease -> billing_class)
2578 if (i ==
packet -> class_count) {
2594 struct class *billclass, *subclass;
2603 if (subclass == NULL)
2604 cname = subclass->
name;
2606 cname = billclass->
name;
2610 log_info(
"%s: no available billing: lease " 2611 "limit reached in all matching " 2612 "classes (last: '%s')", msg, cname);
2615 host_dereference(&host,
MDL);
2645 packet -> options, state -> options,
2654 packet -> options, state -> options,
2660 lt = (
struct lease *)0;
2661 result = lease_allocate (<,
MDL);
2662 if (result != ISC_R_SUCCESS) {
2663 log_info (
"%s: can't allocate temporary lease structure: %s",
2664 msg, isc_result_totext (result));
2667 host_dereference (&
host,
MDL);
2691 if (d1.
len == sizeof (u_int32_t))
2708 if (s1 && (d1.
len == 4)) {
2709 u_int32_t ones = 0xffffffff;
2735 if ((memcmp(d1.
data, &ones, 4) == 0) &&
2746 "reservation made on %s.",
2766 if (d1.
len == sizeof (u_int32_t))
2789 if (d1.
len == sizeof (u_int32_t))
2799 memset(&d1, 0,
sizeof(d1));
2806 if (d1.
len == 1 && d1.
data[0] > 0 &&
2809 int poolfilled, total, count;
2812 adaptive_time = min_lease_time;
2824 poolfilled = (total > (INT_MAX / 100)) ?
2825 total / (count / 100) :
2826 (total * 100) / count;
2828 log_debug(
"Adap-lease: Total: %d, Free: %d, " 2829 "Ends: %d, Adaptive: %d, Fill: %d, " 2834 (
int)adaptive_time, poolfilled,
2837 if (poolfilled >= d1.
data[0] &&
2838 lease_time > adaptive_time) {
2839 log_info(
"Pool over threshold, time " 2840 "for %s reduced from %d to " 2843 (
int)adaptive_time);
2845 lease_time = adaptive_time;
2867 lease_dereference (<,
MDL);
2869 host_dereference (&
host,
MDL);
2897 lease_dereference (<,
MDL);
2899 host_dereference (&
host,
MDL);
2903 if (lease_time > remaining_time)
2904 lease_time = remaining_time;
2907 if (lease_time < min_lease_time) {
2909 lease_time = min_lease_time;
2915 #if defined (FAILOVER_PROTOCOL) 2919 TIME new_lease_time = lease_time;
2920 dhcp_failover_state_t *peer =
2930 if (lease_time > peer->mclt) {
2938 new_lease_time = peer->mclt;
2940 (lt->
tsfp + peer->mclt))
2959 + (new_lease_time / 2)),
2974 lease_time = new_lease_time;
2984 = leaseTimeCheck(
cur_time + lease_time,
3011 if (d1.
len == sizeof (u_int32_t))
3024 if (d1.
len == sizeof (u_int32_t))
3062 unsigned char *tuid;
3079 host_dereference (&
host,
MDL);
3164 }
else if (oc && s1) {
3167 log_error (
"no memory for client hostname.");
3181 sizeof packet -> raw -> chaddr);
3189 log_debug (
"Cannot reuse: lease is changing to RESERVED");
3208 if ((!offer || offer ==
DHCPACK) &&
3228 sizeof packet -> raw -> chaddr);
3230 int commit = (!offer || (offer ==
DHCPACK));
3235 if (use_old_lease == 1) {
3239 #if !defined(DELAYED_ACK) 3248 if ((use_old_lease == 0) &&
3268 if ((use_old_lease == 0) &&
3270 !offer || offer ==
DHCPACK, 0, 0)) {
3272 log_info (
"%s: database update failed", msg);
3274 lease_dereference (<,
MDL);
3278 lease_dereference (<,
MDL);
3290 state -> offer = offer;
3311 if (d1.
len == sizeof (u_int16_t))
3322 if (d1.
len == sizeof (u_int16_t))
3323 state -> max_message_size =
3354 if (state -> offer) {
3359 &state -> offer, 1, 0, 0,
MDL)) {
3360 option_code_hash_lookup(&oc->
option,
3364 state -> options, oc);
3371 memcpy(state->
from.
iabuf, &from,
sizeof(from));
3372 state->
from.
len =
sizeof(from);
3374 offered_lease_time =
3375 state -> offered_expiry -
cur_time;
3383 option_code_hash_lookup(&oc->
option,
3387 state -> options, oc);
3405 if (rebind_time >= offered_lease_time)
3409 offered_lease_time = rebind_time;
3427 if (state ->
ip -> address_count) {
3429 sizeof state ->
ip -> addresses [0];
3430 memcpy (state -> from.iabuf,
3431 &state ->
ip -> addresses [0],
3437 memset (&state -> siaddr, 0,
sizeof state -> siaddr);
3443 packet -> options, state -> options,
3448 memcpy (&state -> siaddr, d1.
data, 4);
3463 option_code_hash_lookup(&oc->
option,
3467 state -> options, oc);
3495 h = gethostbyaddr ((
char *)&ia,
sizeof ia, AF_INET);
3497 log_error (
"No hostname for %s", inet_ntoa (ia));
3504 strlen (h -> h_name) + 1,
3506 option_code_hash_lookup(&oc->
option,
3510 state -> options, oc);
3523 packet -> options, state -> options, &
lease -> scope,
3535 option_code_hash_lookup(&oc->
option,
3539 state -> options, oc);
3552 packet -> options, state -> options,
3557 (
const char *)d1.
data, d1.
len,
3563 state -> options -> site_universe = u ->
index;
3585 packet -> options, state -> options,
3593 lease -> state = state;
3622 if (d1.
len == sizeof (u_int32_t))
3632 log_debug (
"Ping timeout: %ld", (
long)ping_timeout);
3641 tv.tv_sec =
cur_tv.tv_sec + ping_timeout;
3642 tv.tv_usec =
cur_tv.tv_usec;
3649 #if defined(DELAYED_ACK) 3651 delayed_ack_enqueue(
lease);
3658 #if defined(DELAYED_ACK) 3676 if (free_ackqueue) {
3678 free_ackqueue = q->
next;
3683 log_fatal(
"delayed_ack_enqueue: no memory!");
3685 memset(q, 0,
sizeof *q);
3688 q->
next = ackqueue_head;
3699 delayed_acks_timer(NULL);
3701 struct timeval next_fsync;
3703 if (max_fsync.tv_sec == 0 && max_fsync.tv_usec == 0) {
3706 max_fsync.tv_usec =
cur_tv.tv_usec +
3709 if (max_fsync.tv_usec >= 1000000) {
3711 max_fsync.tv_usec -= 1000000;
3716 next_fsync.tv_sec =
cur_tv.tv_sec;
3717 next_fsync.tv_usec =
cur_tv.tv_usec + min_ack_delay_usecs;
3718 if (next_fsync.tv_usec >= 1000000) {
3719 next_fsync.tv_sec++;
3720 next_fsync.tv_usec -= 1000000;
3723 if ((next_fsync.tv_sec > max_fsync.tv_sec) ||
3724 ((next_fsync.tv_sec == max_fsync.tv_sec) &&
3725 (next_fsync.tv_usec > max_fsync.tv_usec))) {
3726 next_fsync.tv_sec = max_fsync.tv_sec;
3727 next_fsync.tv_usec = max_fsync.tv_usec;
3730 add_timeout(&next_fsync, delayed_acks_timer, NULL,
3741 delayed_acks_timer(
void *foo)
3746 memset(&max_fsync, 0,
sizeof(max_fsync));
3748 if (!outstanding_acks) {
3763 for (ack = ackqueue_tail ; ack ; ack = p) {
3766 #if defined(FAILOVER_PROTOCOL) 3770 dhcp_failover_state_t *fpeer;
3773 if (fpeer && fpeer->link_to_peer) {
3781 log_error(
"delayed ack for %s has gone stale",
3787 lease_dereference(&ack->
lease,
MDL);
3788 ack->
next = free_ackqueue;
3789 free_ackqueue = ack;
3792 ackqueue_head = NULL;
3793 ackqueue_tail = NULL;
3794 outstanding_acks = 0;
3797 #if defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT) 3799 relinquish_ackqueue(
void)
3803 for (q = ackqueue_head ; q ; q = n) {
3807 for (q = free_ackqueue ; q ; q = n) {
3820 unsigned packet_length;
3822 struct sockaddr_in to;
3823 struct in_addr from;
3827 int nulltp, bootpp, unicastp = 1;
3828 #if defined(RELAY_PORT) 3835 log_fatal (
"dhcp_reply was supplied lease with no state!");
3838 memset (&raw, 0,
sizeof raw);
3839 memset (&d1, 0,
sizeof d1);
3843 if (state -> filename.len && state -> filename.data) {
3845 state -> filename.data,
3846 state -> filename.len >
sizeof raw.
file 3847 ?
sizeof raw.
file : state -> filename.len);
3848 if (
sizeof raw.
file > state -> filename.len)
3849 memset (&raw.
file [state -> filename.len], 0,
3850 (
sizeof raw.
file) - state -> filename.len);
3852 log_info(
"file name longer than packet field " 3853 "truncated - field: %lu name: %d %.*s",
3854 (
unsigned long)
sizeof(raw.
file),
3855 state->filename.len, (
int)state->filename.len,
3856 state->filename.data);
3862 if (state -> server_name.len && state -> server_name.data) {
3864 state -> server_name.data,
3865 state -> server_name.len >
sizeof raw.
sname 3866 ?
sizeof raw.
sname : state -> server_name.len);
3867 if (
sizeof raw.
sname > state -> server_name.len)
3868 memset (&raw.
sname [state -> server_name.len], 0,
3869 (
sizeof raw.
sname) - state -> server_name.len);
3871 log_info(
"server name longer than packet field " 3872 "truncated - field: %lu name: %d %.*s",
3873 (
unsigned long)
sizeof(raw.
sname),
3881 &
lease -> hardware_addr.hbuf [1],
sizeof raw.
chaddr);
3882 raw.
hlen =
lease -> hardware_addr.hlen - 1;
3901 state -> max_message_size,
3902 state ->
packet -> options,
3904 bufs, nulltp, bootpp,
3905 &state -> parameter_request_list,
3908 memcpy (&raw.
ciaddr, &state -> ciaddr,
sizeof raw.
ciaddr);
3910 raw.
siaddr = state -> siaddr;
3913 raw.
xid = state -> xid;
3914 raw.
secs = state -> secs;
3915 raw.
flags = state -> bootp_flags;
3916 raw.
hops = state -> hops;
3919 if (
lease -> client_hostname) {
3920 if ((strlen (
lease -> client_hostname) <= 64) &&
3922 s =
lease -> client_hostname;
3924 s =
"Hostname Unsuitable for Printing";
3933 #if defined(DHCPv6) && defined(DHCP4o6) 3936 log_info (
"DHCP4o6 %s on %s to %s %s%s%svia %s",
3939 ?
"DHCPACK" :
"DHCPOFFER")
3942 (
lease -> hardware_addr.hlen
3944 lease -> hardware_addr.hlen - 1,
3945 &
lease -> hardware_addr.hbuf [1])
3947 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
3954 packet_length,
MDL)) {
3955 log_fatal(
"No memory to store DHCP4o6 reply.");
3960 &raw, packet_length);
3971 log_info (
"%s on %s to %s %s%s%svia %s",
3973 ? (state ->
offer ==
DHCPACK ?
"DHCPACK" :
"DHCPOFFER")
3976 (
lease -> hardware_addr.hlen > 1
3978 lease -> hardware_addr.hlen - 1,
3979 &
lease -> hardware_addr.hbuf [1])
3981 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
3983 ? inet_ntoa (state ->
giaddr)
3984 : state ->
ip -> name));
3987 dump_raw ((
unsigned char *)&raw, packet_length);
3994 to.sin_family = AF_INET;
3996 to.sin_len =
sizeof to;
3998 memset (to.sin_zero, 0,
sizeof to.sin_zero);
4000 #if defined(RELAY_PORT) 4005 if (raw.giaddr.s_addr) {
4006 to.sin_addr = raw.giaddr;
4007 if (raw.giaddr.s_addr != htonl (INADDR_LOOPBACK))
4008 #if defined(RELAY_PORT) 4018 packet_length, raw.siaddr, &to,
4021 log_error (
"%s:%d: Failed to send %d byte long " 4022 "packet over %s interface.",
MDL,
4044 }
else if (raw.ciaddr.s_addr &&
4051 to.sin_addr = raw.
ciaddr;
4056 packet_length, raw.siaddr, &to,
4059 log_error(
"%s:%d: Failed to send %d byte long" 4060 " packet over %s interface.",
MDL,
4076 to.sin_addr = raw.yiaddr;
4090 from, &to, unicastp ? &hto : NULL);
4092 log_error (
"%s:%d: Failed to send %d byte long " 4093 "packet over %s interface.",
MDL,
4094 packet_length, state->
ip->
name);
4107 int *peer_has_leases,
struct lease *ip_lease_in,
4117 struct lease *fixed_lease = (
struct lease *)0;
4121 int have_client_identifier = 0;
4125 #if defined(FAILOVER_PROTOCOL) 4127 if (peer_has_leases) {
4136 *peer_has_leases = 1;
4143 if (
packet -> raw -> ciaddr.s_addr) {
4150 memset (&d1, 0,
sizeof d1);
4157 packet -> got_requested_address = 1;
4172 memset (&client_identifier, 0,
sizeof client_identifier);
4180 have_client_identifier = 1;
4185 client_identifier.
len,
MDL)) {
4191 #if defined (DEBUG_FIND_LEASE) 4193 log_info (
"Found host for client identifier: %s.",
4199 host_reference (&host, hp,
MDL);
4200 host_dereference (&hp,
MDL);
4204 client_identifier.
len,
MDL);
4209 if (!fixed_lease && !host) {
4216 host_dereference (&host,
MDL);
4217 host_reference (&host, hp,
MDL);
4218 host_dereference (&hp,
MDL);
4220 #if defined (DEBUG_FIND_LEASE) 4222 log_info (
"Found host for link address: %s.",
4231 if (!fixed_lease && !host) {
4236 host_dereference(&host,
MDL);
4237 host_reference(&host, hp,
MDL);
4238 host_dereference(&hp,
MDL);
4240 #if defined (DEBUG_FIND_LEASE) 4242 log_info (
"Found host via host-identifier");
4257 strcpy (dhcp_message,
"requested address is incorrect");
4258 #if defined (DEBUG_FIND_LEASE) 4259 log_info (
"Client's fixed-address %s doesn't match %s%s",
4278 #if defined (DEBUG_FIND_LEASE) 4279 log_info (
"trying next lease matching client id: %s",
4283 #if defined (FAILOVER_PROTOCOL) 4295 #if defined (DEBUG_FIND_LEASE) 4296 log_info(
"not active or not mine to allocate: %s",
4304 #if defined (DEBUG_FIND_LEASE) 4305 log_info (
"wrong network segment: %s",
4318 #if defined (DEBUG_FIND_LEASE) 4323 if (uid_lease -> n_uid)
4324 lease_reference (&
next,
4325 uid_lease -> n_uid,
MDL);
4328 lease_dereference (&uid_lease,
MDL);
4330 lease_reference (&uid_lease,
next,
MDL);
4331 lease_dereference (&
next,
MDL);
4337 #if defined (DEBUG_FIND_LEASE) 4339 log_info (
"Found lease for client id: %s.",
4355 #if defined (DEBUG_FIND_LEASE) 4356 log_info (
"trying next lease matching hw addr: %s",
4359 #if defined (FAILOVER_PROTOCOL) 4372 #if defined (DEBUG_FIND_LEASE) 4373 log_info(
"not active or not mine to allocate: %s",
4386 if (hw_lease -> binding_state !=
FTS_FREE &&
4389 (!have_client_identifier ||
4390 hw_lease -> uid_len != client_identifier.
len ||
4391 memcmp (hw_lease -> uid, client_identifier.
data,
4392 hw_lease -> uid_len))) {
4393 #if defined (DEBUG_FIND_LEASE) 4394 log_info (
"wrong client identifier: %s",
4400 #if defined (DEBUG_FIND_LEASE) 4401 log_info (
"wrong network segment: %s",
4410 #if defined (DEBUG_FIND_LEASE) 4414 if (!
packet -> raw -> ciaddr.s_addr)
4417 if (hw_lease -> n_hw)
4418 lease_reference (&
next, hw_lease -> n_hw,
MDL);
4419 lease_dereference (&hw_lease,
MDL);
4421 lease_reference (&hw_lease,
next,
MDL);
4422 lease_dereference (&
next,
MDL);
4428 #if defined (DEBUG_FIND_LEASE) 4430 log_info (
"Found lease for hardware address: %s.",
4437 lease_reference (&ip_lease, ip_lease_in,
MDL);
4441 #if defined (DEBUG_FIND_LEASE) 4443 log_info (
"Found lease for requested address: %s.",
4450 if (ip_lease && ours)
4463 #if defined (DEBUG_FIND_LEASE) 4464 log_info (
"...but it was on the wrong shared network.");
4466 strcpy (dhcp_message,
"requested address on bad subnet");
4467 lease_dereference (&ip_lease,
MDL);
4481 (!have_client_identifier ||
4482 ip_lease -> uid_len != client_identifier.
len ||
4483 memcmp (ip_lease -> uid, client_identifier.
data,
4484 ip_lease -> uid_len)) :
4485 (ip_lease -> hardware_addr.hbuf [0] !=
packet -> raw -> htype ||
4486 ip_lease -> hardware_addr.hlen !=
packet -> raw -> hlen + 1 ||
4487 memcmp (&ip_lease -> hardware_addr.hbuf [1],
4489 (
unsigned)(ip_lease -> hardware_addr.hlen - 1))))) {
4498 if (ip_lease -> binding_state !=
FTS_FREE &&
4500 #if defined (DEBUG_FIND_LEASE) 4501 log_info (
"rejecting lease for requested address.");
4505 if (ours && ip_lease -> binding_state !=
FTS_ACTIVE)
4507 lease_dereference (&ip_lease,
MDL);
4515 if (ip_lease && (uid_lease || hw_lease) &&
4522 #if defined (DEBUG_FIND_LEASE) 4523 log_info(
"ip lease not active or not ours to offer.");
4525 lease_dereference(&ip_lease,
MDL);
4532 ip_lease->
uid && ip_lease != uid_lease) {
4533 if (have_client_identifier &&
4534 (ip_lease -> uid_len == client_identifier.
len) &&
4535 !memcmp (client_identifier.
data,
4536 ip_lease -> uid, ip_lease -> uid_len)) {
4539 log_error (
"client %s has duplicate%s on %s",
4550 !
packet -> raw -> ciaddr.s_addr &&
4556 lease_dereference (&uid_lease,
MDL);
4557 lease_reference (&uid_lease, ip_lease,
MDL);
4565 lease_dereference (&fixed_lease,
MDL);
4567 log_error (
"Dynamic and static leases present for %s.",
4569 log_error (
"Remove host declaration %s or remove %s",
4570 (fixed_lease && fixed_lease -> host
4571 ? (fixed_lease -> host -> name
4572 ? fixed_lease -> host -> name
4576 log_error (
"from the dynamic address pool for %s",
4580 lease_dereference (&ip_lease,
MDL);
4581 strcpy (dhcp_message,
4582 "database conflict - call for help!");
4585 if (ip_lease && ip_lease != uid_lease) {
4586 #if defined (DEBUG_FIND_LEASE) 4587 log_info (
"requested address not available.");
4589 lease_dereference (&ip_lease,
MDL);
4599 if (hw_lease && hw_lease == uid_lease) {
4600 #if defined (DEBUG_FIND_LEASE) 4601 log_info (
"hardware lease and uid lease are identical.");
4603 lease_dereference (&hw_lease,
MDL);
4605 if (ip_lease && ip_lease == hw_lease) {
4606 lease_dereference (&hw_lease,
MDL);
4607 #if defined (DEBUG_FIND_LEASE) 4608 log_info (
"hardware lease and ip lease are identical.");
4611 if (ip_lease && ip_lease == uid_lease) {
4612 lease_dereference (&uid_lease,
MDL);
4613 #if defined (DEBUG_FIND_LEASE) 4614 log_info (
"uid lease and ip lease are identical.");
4628 lease_dereference (&ip_lease,
MDL);
4636 if (!
packet -> raw -> ciaddr.s_addr)
4638 lease_dereference (&uid_lease,
MDL);
4646 if (!
packet -> raw -> ciaddr.s_addr)
4648 lease_dereference (&hw_lease,
MDL);
4655 strcpy (dhcp_message,
"requested address not available");
4662 !ip_lease && !fixed_lease) {
4663 #if defined (DEBUG_FIND_LEASE) 4664 log_info (
"no applicable lease found for DHCPREQUEST.");
4672 lease_reference (&
lease, fixed_lease,
MDL);
4673 lease_dereference (&fixed_lease,
MDL);
4674 #if defined (DEBUG_FIND_LEASE) 4675 log_info (
"choosing fixed address.");
4683 if (!
packet -> raw -> ciaddr.s_addr)
4685 #if defined (DEBUG_FIND_LEASE) 4686 log_info (
"not choosing requested address (!).");
4688 lease_dereference (&ip_lease,
MDL);
4690 #if defined (DEBUG_FIND_LEASE) 4691 log_info (
"choosing lease on requested address.");
4693 lease_reference (&
lease, ip_lease,
MDL);
4695 host_dereference (&
lease -> host,
MDL);
4704 log_error(
"uid lease %s for client %s is duplicate " 4710 if (!
packet -> raw -> ciaddr.s_addr &&
4714 #if defined (DEBUG_FIND_LEASE) 4715 log_info (
"not choosing uid lease.");
4718 lease_reference (&
lease, uid_lease,
MDL);
4720 host_dereference (&
lease -> host,
MDL);
4721 #if defined (DEBUG_FIND_LEASE) 4725 lease_dereference (&uid_lease,
MDL);
4731 #if defined (DEBUG_FIND_LEASE) 4732 log_info (
"not choosing hardware lease.");
4739 if (!hw_lease -> uid_len ||
4740 (have_client_identifier
4741 ? (hw_lease -> uid_len ==
4742 client_identifier.
len &&
4743 !memcmp (hw_lease -> uid,
4744 client_identifier.
data,
4745 client_identifier.
len))
4746 :
packet -> packet_type == 0)) {
4747 lease_reference (&
lease, hw_lease,
MDL);
4749 host_dereference (&
lease -> host,
MDL);
4750 #if defined (DEBUG_FIND_LEASE) 4751 log_info (
"choosing hardware lease.");
4754 #if defined (DEBUG_FIND_LEASE) 4755 log_info (
"not choosing hardware lease: %s.",
4760 lease_dereference (&hw_lease,
MDL);
4773 host_reference(&p, host,
MDL);
4794 host_dereference(&p,
MDL);
4799 host_dereference(&p,
MDL);
4801 host_reference(&p, n,
MDL);
4802 host_dereference(&n,
MDL);
4813 lease == ip_lease &&
4815 log_error (
"Reclaiming REQUESTed abandoned IP address %s.",
4828 if (have_client_identifier)
4832 lease_dereference (&fixed_lease,
MDL);
4834 lease_dereference (&hw_lease,
MDL);
4836 lease_dereference (&uid_lease,
MDL);
4838 lease_dereference (&ip_lease,
MDL);
4840 host_dereference (&host,
MDL);
4843 #if defined (DEBUG_FIND_LEASE) 4851 #if defined (DEBUG_FIND_LEASE) 4852 log_info (
"Not returning a lease.");
4867 if (lease_allocate (&
lease,
MDL) != ISC_R_SUCCESS)
4869 if (host_reference (&rhp, hp,
MDL) != ISC_R_SUCCESS) {
4876 host_dereference (&rhp,
MDL);
4879 host_reference (&
lease -> host, rhp,
MDL);
4884 if (!
lease -> uid) {
4886 host_dereference (&rhp,
MDL);
4900 host_dereference (&rhp,
MDL);
4912 struct pool *
pool,
int *peer_has_leases)
4915 struct lease *candl = NULL;
4918 if ((
pool -> prohibit_list &&
4920 (
pool -> permit_list &&
4924 #if defined (FAILOVER_PROTOCOL) 4940 struct lease *peerl = NULL;
4951 if (peerl != NULL) {
4952 if (((candl == NULL) ||
4957 *peer_has_leases = 1;
4964 if (peerl != NULL) {
4965 if (((candl == NULL) ||
4970 *peer_has_leases = 1;
4977 if ((candl == NULL) && (peerl != NULL) &&
5023 (candl -> ends < lease ->
ends))) {
5031 (candl -> ends < lease ->
ends))) {
5037 if (candl -> ends < lease ->
ends)
5041 if (
lease != NULL) {
5043 log_error(
"Reclaiming abandoned lease %s.",
5052 log_debug(
"soft impossible condition (%s:%d): stale " 5053 "host \"%s\" found on lease %s",
MDL,
5072 struct permit *permit_list;
5077 for (p = permit_list; p; p = p ->
next) {
5078 switch (p ->
type) {
5090 if (
packet -> authenticated)
5095 if (!
packet -> authenticated)
5103 if (!
packet -> options_valid ||
5109 for (i = 0; i <
packet -> class_count; i++) {
5110 if (p ->
class ==
packet -> classes [i])
5112 if (
packet -> classes [i] &&
5113 packet -> classes [i] -> superclass &&
5114 (
packet -> classes [i] -> superclass ==
5129 #if defined(DHCPv6) && defined(DHCP4o6) 5130 static int locate_network6 (
packet)
5133 const struct packet *chk_packet;
5134 const struct in6_addr *link_addr, *first_link_addr;
5206 first_link_addr = NULL;
5208 while (chk_packet != NULL) {
5210 if (!IN6_IS_ADDR_UNSPECIFIED(link_addr) &&
5211 !IN6_IS_ADDR_LINKLOCAL(link_addr)) {
5212 first_link_addr = link_addr;
5221 if (first_link_addr != NULL) {
5222 ia.len =
sizeof(*first_link_addr);
5223 memcpy(ia.iabuf, first_link_addr,
sizeof(*first_link_addr));
5249 log_error(
"No interface and no link address " 5250 "can't determine DHCP4o6 shared network");
5264 #if defined(DHCPv6) && defined(DHCP4o6) 5266 return (locate_network6 (
packet));
5284 struct in_addr any_addr;
5285 any_addr.s_addr = INADDR_ANY;
5287 if (!
packet -> packet_type && memcmp(&
packet -> raw -> ciaddr, &any_addr, 4)) {
5308 memset (&data, 0,
sizeof data);
5316 if (data.
len == 0) {
5319 if (data.
len != 4) {
5384 unsigned option_num;
5387 struct in_addr *a = NULL;
5388 isc_boolean_t found = ISC_FALSE;
5391 memset(&d, 0,
sizeof(d));
5392 memset(from, 0,
sizeof(*from));
5400 if (d.
len ==
sizeof(*from)) {
5402 memcpy(from, d.
data,
sizeof(*from));
5408 if ((out_options != NULL) &&
5409 (options != out_options)) {
5419 if ((found == ISC_FALSE) &&
5423 if (out_options != NULL) {
5431 (
unsigned char *)a,
sizeof(*a),
5432 0, allocate,
MDL)) {
5433 option_code_hash_lookup(&oc->
option,
5435 &option_num, 0,
MDL);
5468 struct group *network_group) {
5470 if (*network_options == NULL) {
5506 }
else if (network_group != NULL) {
5530 find_min_site_code(
struct universe *u)
5540 site_code_min = 224;
5541 option_code_hash_foreach(u->
code_hash, lowest_site_code);
5543 if (site_code_min < 224) {
5544 log_error(
"WARNING: site-local option codes less than 224 have " 5545 "been deprecated by RFC3942. You have options " 5546 "listed in site local space %s that number as low as " 5547 "%d. Please investigate if these should be declared " 5548 "as regular options rather than site-local options, " 5549 "or migrated up past 224.",
5550 u->
name, site_code_min);
5557 if (site_code_min < 128)
5558 site_code_min = 128;
5567 return site_code_min;
5571 lowest_site_code(
const void *key,
unsigned len,
void *
object)
5578 return ISC_R_SUCCESS;
5644 option_code_hash_lookup(&oc->
option,
5691 struct lease* new_lease,
5706 (new_lease->
ddns_cb == NULL) &&
5725 if (d1.
len == 1 && (d1.
data[0] < 100))
5726 thresh = d1.
data[0];
5734 int lease_length = 0;
5739 if (lease_length <= (INT_MAX / thresh))
5740 limit = lease_length * thresh / 100;
5742 limit = lease_length / 100 * thresh;
5748 if (lease_age <= limit) {
5753 if (new_lease->
scope != NULL) {
5772 log_debug(
"reuse_lease: lease age %ld (secs)" 5773 " under %d%% threshold, reply with " 5774 "unaltered, existing lease for %s",
5811 return (calculated);
int supersede_lease(struct lease *, struct lease *, int, int, int, int)
int find_grouped_subnet(struct subnet **, struct shared_network *, struct iaddr, const char *, int)
char * print_dotted_quads(unsigned len, const u_int8_t *data)
void unbill_class(struct lease *lease)
char sname[DHCP_SNAME_LEN]
struct binding_scope * global_scope
#define DEFAULT_MIN_ACK_DELAY_USECS
#define SV_MAX_LEASE_TIME
#define SV_USE_HOST_DECL_NAMES
#define SV_MIN_LEASE_TIME
void dhcpleasequery(struct packet *, int)
void save_option(struct universe *universe, struct option_state *options, struct option_cache *oc)
int executable_statement_dereference(struct executable_statement **ptr, const char *file, int line)
int find_host_for_network(struct subnet **, struct host_decl **, struct iaddr *, struct shared_network *)
void do_release(struct client_state *client)
struct shared_network * shared_network
const char * piaddr(const struct iaddr addr)
struct dhcp_ddns_cb * ddns_cb
#define DHO_PXE_CLIENT_ID
struct lease_state * state
struct class * superclass
int option_cache_dereference(struct option_cache **ptr, const char *file, int line)
#define DEFAULT_MIN_LEASE_TIME
struct universe server_universe
int execute_statements(struct binding_value **result, struct packet *packet, struct lease *lease, struct client_state *client_state, struct option_state *in_options, struct option_state *out_options, struct binding_scope **scope, struct executable_statement *statements, struct on_star *on_star)
struct iaddr ip_addr(struct iaddr subnet, struct iaddr mask, u_int32_t host_address)
char * print_hw_addr(int htype, const int hlen, const unsigned char *data) const
#define SV_IGNORE_CLIENT_UIDS
void cancel_timeout(void(*)(void *) where, void *what)
int find_hosts_by_option(struct host_decl **, struct packet *, struct option_state *, const char *, int)
#define print_hex_1(len, data, limit)
#define DHO_DHCP_PARAMETER_REQUEST_LIST
#define DEFAULT_ACK_DELAY_USECS
int int int log_debug(const char *,...) __attribute__((__format__(__printf__
#define SV_BOOTP_LEASE_LENGTH
struct executable_statement * on_release
void lease_ping_timeout(void *)
#define DHO_DHCP_LEASE_TIME
struct in_addr * addresses
int option_reference(struct option **dest, struct option *src, const char *file, int line)
void dhcpack(struct packet *packet)
void dhcpdecline(struct packet *packet, int ms_nulltp)
struct universe dhcp_universe
struct interface_info * ip
#define SV_SITE_OPTION_SPACE
void data_string_forget(struct data_string *data, const char *file, int line)
#define FIND_PERCENT(count, percent)
struct option_cache * fixed_addr
struct class * billing_class
struct group * root_group
int mockup_lease(struct lease **lp, struct packet *packet, struct shared_network *share, struct host_decl *hp)
void delete_option(struct universe *universe, struct option_state *options, int code)
int log_error(const char *,...) __attribute__((__format__(__printf__
int binding_scope_dereference(struct binding_scope **ptr, const char *file, int line)
void add_timeout(struct timeval *when, void(*)(void *) where, void *what, tvref_t ref, tvunref_t unref)
void dump_packet(struct packet *)
void(* tvunref_t)(void *, const char *, int)
#define DHO_DHCP_REBINDING_TIME
dhcp_failover_state_t * failover_peer
void release_lease(struct lease *, struct packet *)
int find_hosts_by_haddr(struct host_decl **, int, const unsigned char *, unsigned, const char *, int)
void dhcprelease(struct packet *packet, int ms_nulltp)
struct expression * expression
struct data_string client_identifier
void(* tvref_t)(void *, void *, const char *, int)
const char * binding_state_print(enum failover_state state)
struct option_state * options
#define LEASE_NOT_EMPTY(LQ)
void nak_lease(struct packet *packet, struct iaddr *cip, struct group *network_group)
Constructs and sends a DHCP Nak.
#define DHO_DHCP_SERVER_IDENTIFIER
void log_fatal(const char *,...) __attribute__((__format__(__printf__
void dhcpdiscover(struct packet *packet, int ms_nulltp)
struct option_state * options
#define DEFAULT_DELAYED_ACK
int option_cache_allocate(struct option_cache **cptr, const char *file, int line)
#define SV_LOG_THRESHOLD_HIGH
#define DEFAULT_ACK_DELAY_SECS
int locate_network(struct packet *packet)
void free_lease_state(struct lease_state *, const char *, int)
universe_hash_t * universe_hash
void dhcp_reply(struct lease *lease)
struct hardware hardware_addr
#define SV_BOOTP_LEASE_CUTOFF
int find_subnet(struct subnet **sp, struct iaddr addr, const char *file, int line)
void execute_statements_in_scope(struct binding_value **result, struct packet *packet, struct lease *lease, struct client_state *client_state, struct option_state *in_options, struct option_state *out_options, struct binding_scope **scope, struct group *group, struct group *limiting_group, struct on_star *on_star)
struct interface_info * fallback_interface
#define FAILOVER_PROTOCOL
int option_state_allocate(struct option_state **ptr, const char *file, int line)
int evaluate_option_cache(struct data_string *result, struct packet *packet, struct lease *lease, struct client_state *client_state, struct option_state *in_options, struct option_state *cfg_options, struct binding_scope **scope, struct option_cache *oc, const char *file, int line)
struct permit * prohibit_list
int option_chain_head_dereference(struct option_chain_head **ptr, const char *file, int line)
void dhcp(struct packet *packet)
#define MS_NULL_TERMINATION
int packet_reference(struct packet **ptr, struct packet *bp, const char *file, int line)
#define SV_ALWAYS_BROADCAST
void abandon_lease(struct lease *, const char *)
binding_state_t binding_state
#define DEFAULT_MAX_LEASE_TIME
int buffer_allocate(struct buffer **ptr, unsigned len, const char *file, int line)
struct class * classes[PACKET_MAX_CLASSES]
char * print_hw_addr_or_client_id(struct packet *packet)
struct interface_info * interface
char * print_client_identifier_from_packet(struct packet *packet)
int write_lease(struct lease *lease)
void putULong(unsigned char *, u_int32_t)
#define SV_ECHO_CLIENT_ID
#define SV_USE_LEASE_ADDR_FOR_DEFAULT_ROUTE
#define DEFAULT_CACHE_THRESHOLD
int permitted(struct packet *packet, struct permit *permit_list)
int find_lease_by_hw_addr(struct lease **, const unsigned char *, unsigned, const char *, int)
void eval_network_statements(struct option_state **network_options, struct packet *packet, struct group *network_group)
Builds option set from statements at the global and network scope.
#define DEFAULT_DEFAULT_LEASE_TIME
void check_pool_threshold(struct packet *packet, struct lease *lease, struct lease_state *state)
#define SV_GET_LEASE_HOSTNAMES
ssize_t send_packet(struct interface_info *, struct packet *, struct dhcp_packet *, size_t, struct in_addr, struct sockaddr_in *, struct hardware *)
int cons_options(struct packet *inpacket, struct dhcp_packet *outpacket, struct lease *lease, struct client_state *client_state, int mms, struct option_state *in_options, struct option_state *cfg_options, struct binding_scope **scope, int overload_avail, int terminate, int bootpp, struct data_string *prl, const char *vuname)
void get_server_source_address(struct in_addr *from, struct option_state *options, struct option_state *out_options, struct packet *packet)
u_int32_t getUShort(const unsigned char *)
void dfree(void *, const char *, int)
struct host_decl * n_ipaddr
int option_chain_head_reference(struct option_chain_head **ptr, struct option_chain_head *bp, const char *file, int line)
int load_balance_mine(struct packet *, dhcp_failover_state_t *)
struct option_cache * lookup_option(struct universe *universe, struct option_state *options, unsigned code)
void echo_client_id(struct packet *packet, struct lease *lease, struct option_state *in_options, struct option_state *out_options)
Adds a dhcp-client-id option to a set of options Given a set of input options, it searches for echo-c...
struct in_addr limited_broadcast
int int log_info(const char *,...) __attribute__((__format__(__printf__
void * dmalloc(size_t, const char *, int)
unsigned short cannot_reuse
u_int16_t dhcp_check_relayport(struct packet *packet)
u_int32_t getULong(const unsigned char *)
struct shared_network * shared_network
#define DHO_SUBNET_SELECTION
int find_hosts_by_uid(struct host_decl **, const unsigned char *, unsigned, const char *, int)
int allocate_lease(struct lease **lp, struct packet *packet, struct pool *pool, int *peer_has_leases)
#define DHO_DHCP_MAX_MESSAGE_SIZE
struct universe ** universes
struct data_string * dhcp4o6_response
int option_state_dereference(struct option_state **ptr, const char *file, int line)
void ack_lease(struct packet *packet, struct lease *lease, unsigned int offer, TIME when, char *msg, int ms_nulltp, struct host_decl *hp)
struct shared_network * shared_network
int binding_scope_reference(struct binding_scope **ptr, struct binding_scope *bp, const char *file, int line)
int got_server_identifier
#define LEASE_GET_FIRST(LQ)
binding_state_t rewind_binding_state
int evaluate_boolean_option_cache(int *ignorep, struct packet *packet, struct lease *lease, struct client_state *client_state, struct option_state *in_options, struct option_state *cfg_options, struct binding_scope **scope, struct option_cache *oc, const char *file, int line)
int make_const_data(struct expression **expr, const unsigned char *data, unsigned len, int terminated, int allocate, const char *file, int line)
int ddns_updates(struct packet *, struct lease *, struct lease *, struct iasubopt *, struct iasubopt *, struct option_state *)
#define SV_BOOT_UNKNOWN_CLIENTS
#define DHCPLEASEUNASSIGNED
#define DEFAULT_PING_TIMEOUT
#define SV_LOG_THRESHOLD_LOW
int db_printable(const unsigned char *)
void use_host_decl_name(struct packet *packet, struct lease *lease, struct option_state *options)
Adds hostname option when use-host-decl-names is enabled.
isc_boolean_t agent_options_stashed
int find_lease(struct lease **lp, struct packet *packet, struct shared_network *share, int *ours, int *peer_has_leases, struct lease *ip_lease_in, const char *file, int line)
#define SV_CACHE_THRESHOLD
int find_lease_by_uid(struct lease **, const unsigned char *, unsigned, const char *, int)
void dhcpinform(struct packet *packet, int ms_nulltp)
int expression_reference(struct expression **ptr, struct expression *src, const char *file, int line)
#define SV_DEFAULT_LEASE_TIME
#define SV_ADAPTIVE_LEASE_TIME_THRESHOLD
#define SV_ONE_LEASE_PER_CLIENT
void dump_raw(unsigned char *buf, unsigned len) const
#define UNICAST_BROADCAST_HACK
u_int8_t hbuf[HARDWARE_ADDR_LEN+1]
int icmp_echorequest(struct iaddr *addr)
#define DHO_VENDOR_CLASS_IDENTIFIER
struct universe agent_universe
struct ipv6_pool ** pools
const int dhcp_type_name_max
option_code_hash_t * code_hash
#define DHO_DHCP_RENEWAL_TIME
struct executable_statement * on_expiry
struct shared_network * shared_network
#define DHO_DHCP_CLIENT_IDENTIFIER
struct permit * permit_list
struct data_string filename server_name
int can_unicast_without_arp(struct interface_info *)
struct lease_state * new_lease_state(const char *, int)
int bill_class(struct lease *, struct class *)
isc_result_t dhcp_failover_send_updates(dhcp_failover_state_t *)
struct executable_statement * on_commit
const unsigned char * data
int get_option_int(int *result, struct universe *universe, struct packet *packet, struct lease *lease, struct client_state *client_state, struct option_state *in_options, struct option_state *cfg_options, struct option_state *options, struct binding_scope **scope, unsigned code, const char *file, int line)
#define DHO_DHCP_MESSAGE_TYPE
int bind_ds_value(struct binding_scope **scope, const char *name, struct data_string *value)
struct binding_scope * scope
void data_string_copy(struct data_string *dest, const struct data_string *src, const char *file, int line)
struct hardware interface
int find_lease_by_ip_addr(struct lease **, struct iaddr, const char *, int)
void dhcprequest(struct packet *packet, int ms_nulltp, struct lease *ip_lease)
#define SV_STASH_AGENT_OPTIONS
struct in6_addr dhcpv6_link_address
binding_state_t next_binding_state
void classify_client(struct packet *)
int lease_mine_to_reallocate(struct lease *)
#define DHO_DHCP_REQUESTED_ADDRESS
struct packet * dhcpv6_container_packet
#define SV_RESERVE_INFINITE