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
95 memset (&client_identifier, 0,
sizeof client_identifier);
110 return "\"no client id\"";
138 errmsg =
"unknown network segment";
150 #if defined(DHCPv6) && defined(DHCP4o6)
152 log_info(
"DHCP4o6 %s from %s via %s: %s", s,
157 :
"<no identifier>"),
164 log_info(
"%s from %s via %s: %s", s,
167 :
"<no identifier>"),
203 cip.
len =
sizeof packet -> raw -> ciaddr;
205 sizeof packet -> raw -> ciaddr);
220 if (
lease -> uid_len) {
230 memset (&data, 0,
sizeof data);
245 if ((
lease -> hardware_addr.hbuf [0] !=
246 packet -> raw -> htype) ||
247 (
lease -> hardware_addr.hlen - 1 !=
249 memcmp (&
lease -> hardware_addr.hbuf [1],
280 switch (
packet -> packet_type) {
314 errmsg =
"unknown packet type";
330 int peer_has_leases = 0;
331 #if defined (FAILOVER_PROTOCOL)
332 dhcp_failover_state_t *peer;
336 0, &peer_has_leases, (
struct lease *)0,
MDL);
343 s =
"Hostname Unsuitable for Printing";
350 #if defined(DHCPv6) && defined(DHCP4o6)
352 snprintf (msgbuf,
sizeof msgbuf,
353 "DHCP4o6 DHCPDISCOVER from %s %s%s%svia %s",
360 :
"<no identifier>")),
361 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
365 snprintf (msgbuf,
sizeof msgbuf,
"DHCPDISCOVER from %s %s%s%svia %s",
370 :
"<no identifier>")),
371 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
374 :
packet -> interface -> name);
378 #if defined(DHCPv6) && defined(DHCP4o6)
380 log_info (
"DHCP4o6 packet from unknown subnet: %s",
384 log_info (
"Packet from unknown subnet: %s",
389 #if defined (FAILOVER_PROTOCOL)
411 #if defined (DEBUG_FIND_LEASE)
427 log_error (
"%s: peer holds all free leases",
430 log_error (
"%s: network %s: no free leases",
437 #if defined (FAILOVER_PROTOCOL)
443 msgbuf, peer -> nrr);
447 peer = (dhcp_failover_state_t *)0;
452 if (peer_has_leases) {
453 log_debug (
"%s: load balance to peer %s",
454 msgbuf, peer -> name);
457 log_debug (
"%s: cancel load balance to peer %s - %s",
458 msgbuf, peer -> name,
"no free leases");
464 if (
lease -> ends < cur_time && lease ->
scope)
470 if (when < lease ->
ends)
483 struct lease *ip_lease;
495 #if defined (FAILOVER_PROTOCOL)
496 dhcp_failover_state_t *peer;
498 int have_requested_addr = 0;
511 have_requested_addr = 1;
515 memcpy (cip.
iabuf, &
packet -> raw -> ciaddr.s_addr, 4);
532 s =
"Hostname Unsuitable for Printing";
538 memset (&data, 0,
sizeof data);
550 sprintf (smbuf,
" (%s)",
piaddr (sip));
559 #if defined(DHCPv6) && defined(DHCP4o6)
561 snprintf (msgbuf,
sizeof msgbuf,
562 "DHCP4o6 DHCPREQUEST for %s%s from %s %s%s%svia %s",
570 :
"<no identifier>")),
571 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
575 snprintf (msgbuf,
sizeof msgbuf,
576 "DHCPREQUEST for %s%s from %s %s%s%svia %s",
582 :
"<no identifier>")),
583 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
586 :
packet -> interface -> name);
588 #if defined (FAILOVER_PROTOCOL)
594 msgbuf, peer -> nrr);
619 log_debug (
"%s: lease owned by peer", msgbuf);
633 log_debug(
"%s: lease in transition state %s", msgbuf,
635 ?
"released" :
"expired");
644 log_debug (
"%s: lease reset by administrator", msgbuf);
658 (memcmp(sip.
iabuf,
"\0\0\0\0", sip.
len) != 0)) {
666 if (memcmp(sip.
iabuf, &from, sip.
len) != 0) {
667 log_debug(
"%s: not our server id", msgbuf);
696 peer = (dhcp_failover_state_t *)0;
742 (
packet -> raw -> ciaddr.s_addr &&
744 (have_requested_addr && !
packet -> raw -> ciaddr.s_addr)) {
751 log_info (
"%s: wrong network.", msgbuf);
756 log_info (
"%s: ignored (%s).", msgbuf,
758 ?
"not authoritative" :
"unknown subnet"));
770 log_info (
"%s: wrong network.", msgbuf);
774 log_info (
"%s: ignored (not authoritative).", msgbuf);
781 if (!
lease && ours) {
811 char msgbuf [1024], cstr[16];
819 log_info (
"DHCPRELEASE from %s specified requested-address.",
841 lease_reference (&next,
lease -> n_uid,
MDL);
842 if (!memcmp (&
packet -> raw -> ciaddr,
848 lease_reference (&
lease, next,
MDL);
849 lease_dereference (&next,
MDL);
853 lease_dereference (&next,
MDL);
868 (
lease -> hardware_addr.hlen !=
packet -> raw -> hlen + 1 ||
869 lease -> hardware_addr.hbuf [0] !=
packet -> raw -> htype ||
870 memcmp (&
lease -> hardware_addr.hbuf [1],
875 if ((strlen (
lease -> client_hostname) <= 64) &&
877 s =
lease -> client_hostname;
879 s =
"Hostname Unsuitable for Printing";
887 strncpy(cstr, inet_ntoa (
packet -> raw -> ciaddr), 15);
893 #if defined(DHCPv6) && defined(DHCP4o6)
895 snprintf (msgbuf,
sizeof msgbuf,
896 "DHCP4o6 DHCPRELEASE of %s from %s %s%s%svia "
905 :
"<no identifier>")),
906 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
908 lease ?
"" :
"not ");
911 snprintf (msgbuf,
sizeof msgbuf,
912 "DHCPRELEASE of %s from %s %s%s%svia %s (%sfound)",
918 :
"<no identifier>")),
919 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
922 :
packet -> interface -> name,
923 lease ?
"" :
"not ");
925 #if defined (FAILOVER_PROTOCOL)
927 dhcp_failover_state_t *peer =
lease ->
pool -> failover_peer;
931 peer -> name, peer -> nrr);
949 #if defined(FAILOVER_PROTOCOL)
989 if ((strlen (
lease -> client_hostname) <= 64) &&
991 s =
lease -> client_hostname;
993 s =
"Hostname Unsuitable for Printing";
1000 #if defined(DHCPv6) && defined(DHCP4o6)
1002 snprintf (msgbuf,
sizeof msgbuf,
1003 "DHCP4o6 DHCPDECLINE of %s from %s %s%s%svia %s",
1011 :
"<no identifier>")),
1012 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
1016 snprintf (msgbuf,
sizeof msgbuf,
1017 "DHCPDECLINE of %s from %s %s%s%svia %s",
1023 :
"<no identifier>")),
1024 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
1027 :
packet -> interface -> name);
1040 for (i =
packet -> class_count; i > 0; i--) {
1052 packet -> options, options,
1056 #if defined (FAILOVER_PROTOCOL)
1058 dhcp_failover_state_t *peer =
1064 peer -> name, peer -> nrr);
1076 status =
"abandoned";
1078 status =
"not found";
1084 log_info (
"%s: %s", msgbuf, status);
1086 #if defined(FAILOVER_PROTOCOL)
1099 char msgbuf[1024], *addr_type;
1107 struct iaddr cip, gip, sip;
1110 struct sockaddr_in to;
1111 struct in_addr from;
1112 isc_boolean_t zeroed_ciaddr;
1114 int result, h_m_client_ip = 0;
1115 struct host_decl *host = NULL, *hp = NULL, *h;
1116 #if defined (DEBUG_INFORM_HOST)
1117 int h_w_fixed_addr = 0;
1124 zeroed_ciaddr = ISC_TRUE;
1130 addr_type =
"source";
1133 memset(cip.
iabuf, 0, 4);
1137 zeroed_ciaddr = ISC_FALSE;
1140 addr_type =
"client";
1148 if (zeroed_ciaddr == ISC_TRUE) {
1149 addr_type =
"relay";
1158 #if defined(DHCPv6) && defined(DHCP4o6)
1160 snprintf(msgbuf,
sizeof(msgbuf),
1161 "DHCP4o6 DHCPINFORM from %s via %s",
1166 snprintf(msgbuf,
sizeof(msgbuf),
"DHCPINFORM from %s via %s",
1173 if (!memcmp(cip.
iabuf,
"\0\0\0", 4)) {
1174 log_info(
"%s: ignored (null source address).", msgbuf);
1189 memset(&d1, 0,
sizeof d1);
1196 log_info(
"%s: ignored (invalid subnet selection option).", msgbuf);
1218 if ((zeroed_ciaddr == ISC_TRUE) && (gip.
len != 0))
1219 addr_type =
"relay link select";
1221 addr_type =
"selected";
1227 log_info(
"%s: unknown subnet for %s address %s",
1228 msgbuf, addr_type,
piaddr(sip));
1239 log_info(
"%s: not authoritative for subnet %s",
1242 log_info(
"If this DHCP server is authoritative for%s",
1244 log_info(
"please write an `authoritative;' directi%s",
1245 "ve either in the");
1246 log_info(
"subnet declaration or in some scope that%s",
1248 log_info(
"subnet declaration - for example, write %s",
1250 log_info(
"of the dhcpd.conf file.");
1259 memset(&outgoing, 0,
sizeof outgoing);
1260 memset(&raw, 0,
sizeof raw);
1261 outgoing.
raw = &raw;
1263 maybe_return_agent_options(
packet, options);
1299 memset(&d1, 0,
sizeof(d1));
1307 #if defined (DEBUG_INFORM_HOST)
1309 log_debug (
"dhcpinform: found host by ID "
1310 "-- checking fixed-address match");
1314 for (h = hp; !h_m_client_ip && h; h = h->n_ipaddr) {
1318 memset(&fixed_addr, 0,
sizeof(fixed_addr));
1320 NULL, NULL, NULL, NULL,
1322 h->fixed_addr,
MDL))
1325 #if defined (DEBUG_INFORM_HOST)
1329 (i + cip.
len) <= fixed_addr.
len;
1331 if (memcmp(fixed_addr.
data + i,
1333 #if defined (DEBUG_INFORM_HOST)
1335 "host with matching "
1336 "fixed-address by ID");
1338 host_reference(&host, h,
MDL);
1347 for (h = hp; !host && h; h = h->
n_ipaddr) {
1351 #if defined (DEBUG_INFORM_HOST)
1353 "without fixed-address by ID");
1355 host_reference(&host, h,
MDL);
1359 host_dereference (&hp,
MDL);
1361 if (!host || !h_m_client_ip) {
1366 #if defined (DEBUG_INFORM_HOST)
1368 log_debug (
"dhcpinform: found host by HW "
1369 "-- checking fixed-address match");
1374 for (h = hp; !h_m_client_ip && h; h = h->n_ipaddr) {
1378 memset (&fixed_addr, 0,
sizeof(fixed_addr));
1380 NULL, NULL, NULL, NULL,
1382 h->fixed_addr,
MDL))
1385 #if defined (DEBUG_INFORM_HOST)
1389 (i + cip.
len) <= fixed_addr.
len;
1391 if (memcmp(fixed_addr.
data + i,
1393 #if defined (DEBUG_INFORM_HOST)
1395 "host with matching "
1396 "fixed-address by HW");
1404 host_dereference(&host,
MDL);
1405 host_reference(&host, h,
MDL);
1413 for (h = hp; !host && h; h = h->
n_ipaddr) {
1417 #if defined (DEBUG_INFORM_HOST)
1418 log_debug (
"dhcpinform: found host without "
1419 "fixed-address by HW");
1421 host_reference (&host, h,
MDL);
1426 host_dereference (&hp,
MDL);
1429 #if defined (DEBUG_INFORM_HOST)
1434 if (h_w_fixed_addr && !h_m_client_ip) {
1435 log_info (
"dhcpinform: matching host with "
1436 "fixed-address different than "
1437 "client IP detected?!");
1445 #if defined (DEBUG_INFORM_HOST)
1446 log_info (
"dhcpinform: applying host (group) options");
1453 host_dereference (&host,
MDL);
1459 memset (&d1, 0,
sizeof d1);
1467 if (i >=
sizeof(raw.
file)) {
1468 log_info(
"file name longer than packet field "
1469 "truncated - field: %lu name: %d %.*s",
1470 (
unsigned long)
sizeof(raw.
file), i,
1472 i =
sizeof(raw.
file);
1487 if (i >=
sizeof(raw.
sname)) {
1488 log_info(
"server name longer than packet field "
1489 "truncated - field: %lu name: %d %.*s",
1490 (
unsigned long)
sizeof(raw.
sname), i,
1492 i =
sizeof(raw.
sname);
1514 option_code_hash_lookup(&oc->
option,
1534 option_code_hash_lookup(&oc->
option,
1549 packet -> options, options,
1554 (
const char *)d1.
data, d1.
len,
1563 options -> site_universe = u ->
index;
1571 memset (&prl, 0,
sizeof prl);
1588 packet -> options, options,
1603 packet -> options, options,
1652 #if defined(DHCPv6) && defined(DHCP4o6)
1655 snprintf(msgbuf,
sizeof msgbuf,
1656 "DHCP4o6 DHCPACK to %s (%s) via",
piaddr(cip),
1660 "<no client hardware address>");
1668 log_fatal(
"No memory to store DHCP4o6 reply.");
1683 to.sin_family = AF_INET;
1685 to.sin_len =
sizeof to;
1687 memset (to.sin_zero, 0,
sizeof to.sin_zero);
1707 if (!raw.ciaddr.s_addr && gip.
len) {
1708 memcpy(&to.sin_addr, gip.
iabuf, 4);
1713 memcpy(&to.sin_addr, cip.
iabuf, 4);
1718 snprintf(msgbuf,
sizeof msgbuf,
"DHCPACK to %s (%s) via",
piaddr(cip),
1721 "<no client hardware address>");
1729 outgoing.packet_length, from, &to, NULL);
1731 log_error ("%s:%d: Failed to send %d byte long packet over %s "
1732 "interface.", MDL, outgoing.packet_length,
1738 subnet_dereference (&subnet, MDL);
1756 struct
group *network_group;
1758 struct sockaddr_in to;
1759 struct in_addr from;
1770 memset (&outgoing, 0,
sizeof outgoing);
1771 memset (&raw, 0,
sizeof raw);
1776 log_error (
"No memory for DHCPNAK message type.");
1782 log_error (
"No memory for expr_const expression.");
1795 log_error (
"No memory for DHCPNAK message type.");
1800 (
unsigned char *)dhcp_message,
1801 strlen (dhcp_message), 1, 0,
MDL)) {
1802 log_error (
"No memory for expr_const expression.");
1818 #if defined(SERVER_ID_FOR_NAK)
1886 #if defined(DHCPv6) && defined(DHCP4o6)
1888 log_info (
"DHCP4o6 DHCPNAK on %s to %s via %s",
1892 packet -> raw -> chaddr),
1896 log_info (
"DHCPNAK on %s to %s via %s",
1901 :
packet -> interface -> name);
1910 #if defined(DHCPv6) && defined(DHCP4o6)
1917 log_fatal(
"No memory to store DHCP4o6 reply.");
1928 to.sin_family = AF_INET;
1930 to.sin_len =
sizeof to;
1932 memset (to.sin_zero, 0,
sizeof to.sin_zero);
1936 if (raw.giaddr.s_addr) {
1937 to.sin_addr = raw.giaddr;
1938 if (raw.giaddr.s_addr != htonl (INADDR_LOOPBACK))
1948 log_error (
"%s:%d: Failed to send %d byte long "
1949 "packet over %s interface.",
MDL,
1965 log_error (
"%s:%d: Failed to send %d byte long packet over %s "
2014 memset(&client_id, 0,
sizeof client_id);
2027 option_code_hash_lookup(&oc->
option,
2049 int used, count, high_threshold, poolhigh = 0, poollow = 0;
2050 char *shared_name =
"no name";
2078 log_error(
"Pool threshold reset - shared subnet: %s; "
2079 "address: %s; low threshold %d/%d.",
2095 if ((poolhigh <= 0) || (poolhigh > 100)) {
2102 if (used < high_threshold) {
2108 log_error(
"Pool threshold exceeded - shared subnet: %s; "
2109 "address: %s; high threshold %d%% %d/%d.",
2111 poolhigh, used, count);
2127 if (poollow < poolhigh) {
2147 TIME offered_lease_time;
2149 TIME min_lease_time;
2153 isc_result_t result;
2156 struct in_addr from;
2157 TIME remaining_time;
2159 #if defined(DELAYED_ACK) && !defined(DHCP4o6)
2161 isc_boolean_t enqueue = ISC_FALSE;
2163 int use_old_lease = 0;
2179 host_reference (&host, hp,
MDL);
2180 else if (
lease -> host)
2181 host_reference (&host,
lease -> host,
MDL);
2186 log_fatal (
"unable to allocate lease state!");
2187 state -> got_requested_address =
packet -> got_requested_address;
2194 state -> got_server_identifier = 1;
2234 for (i =
packet -> class_count; i > 0; i--) {
2260 state -> options, &
lease -> scope,
2265 seek = (
struct lease *)0;
2271 lease_dereference (&seek,
MDL);
2282 if (seek !=
lease &&
2289 lease_dereference (&seek,
MDL);
2291 lease_reference (&seek,
next,
MDL);
2292 lease_dereference (&
next,
MDL);
2296 lease_dereference (&
next,
MDL);
2299 lease_dereference (&seek,
MDL);
2306 !
host -> client_identifier.len &&
2316 seek = (
struct lease *)0;
2323 lease_dereference (&seek,
MDL);
2330 if (seek !=
lease &&
2337 lease_dereference (&seek,
MDL);
2339 lease_reference (&seek,
next,
MDL);
2340 lease_dereference (&
next,
MDL);
2344 lease_dereference (&
next,
MDL);
2347 lease_dereference (&seek,
MDL);
2357 memset (&d1, 0,
sizeof d1);
2366 ntohs (
packet -> raw -> secs) < d1.
data [0]) {
2367 log_info(
"%s: configured min-secs value (%d) "
2368 "is greater than secs field (%d). "
2369 "message dropped.", msg, d1.
data[0],
2374 host_dereference (&
host,
MDL);
2400 packet -> options, state -> options,
2404 for (h = hp; h; h = h ->
n_ipaddr) {
2409 host_reference (&host, h,
MDL);
2411 host_dereference(&hp,
MDL);
2419 for (h = hp; h; h = h ->
n_ipaddr) {
2424 host_reference (&host, h,
MDL);
2426 host_dereference(&hp,
MDL);
2431 for (h = hp; h; h = h ->
n_ipaddr) {
2436 host_reference (&host, h,
MDL);
2438 host_dereference(&hp,
MDL);
2465 log_info (
"%s: unknown client", msg);
2468 host_dereference (&host,
MDL);
2483 log_info (
"%s: bootp disallowed", msg);
2486 host_dereference (&host,
MDL);
2501 log_info (
"%s: booting disallowed", msg);
2504 host_dereference (&host,
MDL);
2513 if (
lease -> billing_class) {
2514 for (i = 0; i <
packet -> class_count; i++)
2515 if (
packet -> classes [i] ==
2516 lease -> billing_class)
2518 if (i ==
packet -> class_count) {
2534 struct class *billclass, *subclass;
2543 if (subclass == NULL)
2544 cname = subclass->
name;
2546 cname = billclass->
name;
2550 log_info(
"%s: no available billing: lease "
2551 "limit reached in all matching "
2552 "classes (last: '%s')", msg, cname);
2555 host_dereference(&host,
MDL);
2585 packet -> options, state -> options,
2594 packet -> options, state -> options,
2600 lt = (
struct lease *)0;
2601 result = lease_allocate (<,
MDL);
2602 if (result != ISC_R_SUCCESS) {
2603 log_info (
"%s: can't allocate temporary lease structure: %s",
2604 msg, isc_result_totext (result));
2607 host_dereference (&
host,
MDL);
2631 if (d1.
len == sizeof (u_int32_t))
2648 if (s1 && (d1.
len == 4)) {
2649 u_int32_t ones = 0xffffffff;
2675 if ((memcmp(d1.
data, &ones, 4) == 0) &&
2686 "reservation made on %s.",
2706 if (d1.
len == sizeof (u_int32_t))
2729 if (d1.
len == sizeof (u_int32_t))
2739 memset(&d1, 0,
sizeof(d1));
2746 if (d1.
len == 1 && d1.
data[0] > 0 &&
2749 int poolfilled, total, count;
2752 adaptive_time = min_lease_time;
2764 poolfilled = (total > (INT_MAX / 100)) ?
2765 total / (count / 100) :
2766 (total * 100) / count;
2768 log_debug(
"Adap-lease: Total: %d, Free: %d, "
2769 "Ends: %d, Adaptive: %d, Fill: %d, "
2774 (
int)adaptive_time, poolfilled,
2777 if (poolfilled >= d1.
data[0] &&
2778 lease_time > adaptive_time) {
2779 log_info(
"Pool over threshold, time "
2780 "for %s reduced from %d to "
2783 (
int)adaptive_time);
2785 lease_time = adaptive_time;
2807 lease_dereference (<,
MDL);
2809 host_dereference (&
host,
MDL);
2837 lease_dereference (<,
MDL);
2839 host_dereference (&
host,
MDL);
2843 if (lease_time > remaining_time)
2844 lease_time = remaining_time;
2847 if (lease_time < min_lease_time) {
2849 lease_time = min_lease_time;
2855 #if defined (FAILOVER_PROTOCOL)
2859 TIME new_lease_time = lease_time;
2860 dhcp_failover_state_t *peer =
2870 if (lease_time > peer->mclt) {
2878 new_lease_time = peer->mclt;
2880 (lt->
tsfp + peer->mclt))
2894 (new_lease_time / 2);
2907 lease_time = new_lease_time;
2940 if (d1.
len == sizeof (u_int32_t))
2953 if (d1.
len == sizeof (u_int32_t))
2991 unsigned char *tuid;
3008 host_dereference (&
host,
MDL);
3093 }
else if (oc && s1) {
3096 log_error (
"no memory for client hostname.");
3110 sizeof packet -> raw -> chaddr);
3118 log_debug (
"Cannot reuse: lease is changing to RESERVED");
3137 if ((!offer || offer ==
DHCPACK) &&
3157 sizeof packet -> raw -> chaddr);
3159 int commit = (!offer || (offer ==
DHCPACK));
3164 if (use_old_lease == 1) {
3168 #if !defined(DELAYED_ACK) || defined(DHCP4o6)
3177 if ((use_old_lease == 0) &&
3197 if ((use_old_lease == 0) &&
3199 !offer || offer ==
DHCPACK, 0, 0)) {
3201 log_info (
"%s: database update failed", msg);
3203 lease_dereference (<,
MDL);
3207 lease_dereference (<,
MDL);
3219 state -> offer = offer;
3240 if (d1.
len == sizeof (u_int16_t))
3251 if (d1.
len == sizeof (u_int16_t))
3252 state -> max_message_size =
3283 if (state -> offer) {
3288 &state -> offer, 1, 0, 0,
MDL)) {
3289 option_code_hash_lookup(&oc->
option,
3293 state -> options, oc);
3300 memcpy(state->
from.
iabuf, &from,
sizeof(from));
3301 state->
from.
len =
sizeof(from);
3303 offered_lease_time =
3304 state -> offered_expiry -
cur_time;
3312 option_code_hash_lookup(&oc->
option,
3316 state -> options, oc);
3334 if (rebind_time >= offered_lease_time)
3338 offered_lease_time = rebind_time;
3356 if (state ->
ip -> address_count) {
3358 sizeof state ->
ip -> addresses [0];
3359 memcpy (state -> from.iabuf,
3360 &state ->
ip -> addresses [0],
3366 memset (&state -> siaddr, 0,
sizeof state -> siaddr);
3372 packet -> options, state -> options,
3377 memcpy (&state -> siaddr, d1.
data, 4);
3392 option_code_hash_lookup(&oc->
option,
3396 state -> options, oc);
3424 h = gethostbyaddr ((
char *)&ia,
sizeof ia, AF_INET);
3426 log_error (
"No hostname for %s", inet_ntoa (ia));
3433 strlen (h -> h_name) + 1,
3435 option_code_hash_lookup(&oc->
option,
3439 state -> options, oc);
3452 packet -> options, state -> options, &
lease -> scope,
3464 option_code_hash_lookup(&oc->
option,
3468 state -> options, oc);
3481 packet -> options, state -> options,
3486 (
const char *)d1.
data, d1.
len,
3492 state -> options -> site_universe = u ->
index;
3514 packet -> options, state -> options,
3522 lease -> state = state;
3551 if (d1.
len == sizeof (u_int32_t))
3561 log_debug (
"Ping timeout: %ld", (
long)ping_timeout);
3570 tv.tv_sec =
cur_tv.tv_sec + ping_timeout;
3571 tv.tv_usec =
cur_tv.tv_usec;
3578 #if defined(DELAYED_ACK) && !defined(DHCP4o6)
3580 delayed_ack_enqueue(
lease);
3587 #if defined(DELAYED_ACK)
3605 if (free_ackqueue) {
3607 free_ackqueue = q->
next;
3612 log_fatal(
"delayed_ack_enqueue: no memory!");
3614 memset(q, 0,
sizeof *q);
3617 q->
next = ackqueue_head;
3628 delayed_acks_timer(NULL);
3630 struct timeval next_fsync;
3632 if (max_fsync.tv_sec == 0 && max_fsync.tv_usec == 0) {
3635 max_fsync.tv_usec =
cur_tv.tv_usec +
3638 if (max_fsync.tv_usec >= 1000000) {
3640 max_fsync.tv_usec -= 1000000;
3645 next_fsync.tv_sec =
cur_tv.tv_sec;
3646 next_fsync.tv_usec =
cur_tv.tv_usec + min_ack_delay_usecs;
3647 if (next_fsync.tv_usec >= 1000000) {
3648 next_fsync.tv_sec++;
3649 next_fsync.tv_usec -= 1000000;
3652 if ((next_fsync.tv_sec > max_fsync.tv_sec) ||
3653 ((next_fsync.tv_sec == max_fsync.tv_sec) &&
3654 (next_fsync.tv_usec > max_fsync.tv_usec))) {
3655 next_fsync.tv_sec = max_fsync.tv_sec;
3656 next_fsync.tv_usec = max_fsync.tv_usec;
3659 add_timeout(&next_fsync, delayed_acks_timer, NULL,
3670 delayed_acks_timer(
void *foo)
3675 memset(&max_fsync, 0,
sizeof(max_fsync));
3677 if (!outstanding_acks) {
3692 for (ack = ackqueue_tail ; ack ; ack = p) {
3695 #if defined(FAILOVER_PROTOCOL)
3699 dhcp_failover_state_t *fpeer;
3702 if (fpeer && fpeer->link_to_peer) {
3710 log_error(
"delayed ack for %s has gone stale",
3716 lease_dereference(&ack->
lease,
MDL);
3717 ack->
next = free_ackqueue;
3718 free_ackqueue = ack;
3721 ackqueue_head = NULL;
3722 ackqueue_tail = NULL;
3723 outstanding_acks = 0;
3726 #if defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
3728 relinquish_ackqueue(
void)
3732 for (q = ackqueue_head ; q ; q = n) {
3736 for (q = free_ackqueue ; q ; q = n) {
3749 unsigned packet_length;
3751 struct sockaddr_in to;
3752 struct in_addr from;
3756 int nulltp, bootpp, unicastp = 1;
3761 log_fatal (
"dhcp_reply was supplied lease with no state!");
3764 memset (&raw, 0,
sizeof raw);
3765 memset (&d1, 0,
sizeof d1);
3769 if (state -> filename.len && state -> filename.data) {
3771 state -> filename.data,
3772 state -> filename.len >
sizeof raw.
file
3773 ?
sizeof raw.
file : state -> filename.len);
3774 if (
sizeof raw.
file > state -> filename.len)
3775 memset (&raw.
file [state -> filename.len], 0,
3776 (
sizeof raw.
file) - state -> filename.len);
3778 log_info(
"file name longer than packet field "
3779 "truncated - field: %lu name: %d %.*s",
3780 (
unsigned long)
sizeof(raw.
file),
3781 state->filename.len, (
int)state->filename.len,
3782 state->filename.data);
3788 if (state -> server_name.len && state -> server_name.data) {
3790 state -> server_name.data,
3791 state -> server_name.len >
sizeof raw.
sname
3792 ?
sizeof raw.
sname : state -> server_name.len);
3793 if (
sizeof raw.
sname > state -> server_name.len)
3794 memset (&raw.
sname [state -> server_name.len], 0,
3795 (
sizeof raw.
sname) - state -> server_name.len);
3797 log_info(
"server name longer than packet field "
3798 "truncated - field: %lu name: %d %.*s",
3799 (
unsigned long)
sizeof(raw.
sname),
3807 &
lease -> hardware_addr.hbuf [1],
sizeof raw.
chaddr);
3808 raw.
hlen =
lease -> hardware_addr.hlen - 1;
3827 state -> max_message_size,
3828 state ->
packet -> options,
3830 bufs, nulltp, bootpp,
3831 &state -> parameter_request_list,
3834 memcpy (&raw.
ciaddr, &state -> ciaddr,
sizeof raw.
ciaddr);
3836 raw.
siaddr = state -> siaddr;
3839 raw.
xid = state -> xid;
3840 raw.
secs = state -> secs;
3841 raw.
flags = state -> bootp_flags;
3842 raw.
hops = state -> hops;
3845 if (
lease -> client_hostname) {
3846 if ((strlen (
lease -> client_hostname) <= 64) &&
3848 s =
lease -> client_hostname;
3850 s =
"Hostname Unsuitable for Printing";
3859 #if defined(DHCPv6) && defined(DHCP4o6)
3862 log_info (
"DHCP4o6 %s on %s to %s %s%s%svia %s",
3865 ?
"DHCPACK" :
"DHCPOFFER")
3868 (
lease -> hardware_addr.hlen
3870 lease -> hardware_addr.hlen - 1,
3871 &
lease -> hardware_addr.hbuf [1])
3873 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
3880 packet_length,
MDL)) {
3881 log_fatal(
"No memory to store DHCP4o6 reply.");
3886 &raw, packet_length);
3897 log_info (
"%s on %s to %s %s%s%svia %s",
3899 ? (state ->
offer ==
DHCPACK ?
"DHCPACK" :
"DHCPOFFER")
3902 (
lease -> hardware_addr.hlen > 1
3904 lease -> hardware_addr.hlen - 1,
3905 &
lease -> hardware_addr.hbuf [1])
3907 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
3909 ? inet_ntoa (state ->
giaddr)
3910 : state ->
ip -> name));
3913 dump_raw ((
unsigned char *)&raw, packet_length);
3920 to.sin_family = AF_INET;
3922 to.sin_len =
sizeof to;
3924 memset (to.sin_zero, 0,
sizeof to.sin_zero);
3927 if (raw.giaddr.s_addr) {
3928 to.sin_addr = raw.giaddr;
3929 if (raw.giaddr.s_addr != htonl (INADDR_LOOPBACK))
3936 packet_length, raw.siaddr, &to,
3939 log_error (
"%s:%d: Failed to send %d byte long "
3940 "packet over %s interface.",
MDL,
3962 }
else if (raw.ciaddr.s_addr &&
3969 to.sin_addr = raw.
ciaddr;
3974 packet_length, raw.siaddr, &to,
3977 log_error(
"%s:%d: Failed to send %d byte long"
3978 " packet over %s interface.",
MDL,
3994 to.sin_addr = raw.yiaddr;
4008 from, &to, unicastp ? &hto : NULL);
4010 log_error (
"%s:%d: Failed to send %d byte long "
4011 "packet over %s interface.",
MDL,
4012 packet_length, state->
ip->
name);
4025 int *peer_has_leases,
struct lease *ip_lease_in,
4035 struct lease *fixed_lease = (
struct lease *)0;
4039 int have_client_identifier = 0;
4043 #if defined(FAILOVER_PROTOCOL)
4045 if (peer_has_leases) {
4054 *peer_has_leases = 1;
4061 if (
packet -> raw -> ciaddr.s_addr) {
4068 memset (&d1, 0,
sizeof d1);
4075 packet -> got_requested_address = 1;
4090 memset (&client_identifier, 0,
sizeof client_identifier);
4098 have_client_identifier = 1;
4103 client_identifier.
len,
MDL)) {
4109 #if defined (DEBUG_FIND_LEASE)
4111 log_info (
"Found host for client identifier: %s.",
4117 host_reference (&host, hp,
MDL);
4118 host_dereference (&hp,
MDL);
4122 client_identifier.
len,
MDL);
4127 if (!fixed_lease && !host) {
4134 host_dereference (&host,
MDL);
4135 host_reference (&host, hp,
MDL);
4136 host_dereference (&hp,
MDL);
4138 #if defined (DEBUG_FIND_LEASE)
4140 log_info (
"Found host for link address: %s.",
4149 if (!fixed_lease && !host) {
4154 host_dereference(&host,
MDL);
4155 host_reference(&host, hp,
MDL);
4156 host_dereference(&hp,
MDL);
4158 #if defined (DEBUG_FIND_LEASE)
4160 log_info (
"Found host via host-identifier");
4175 strcpy (dhcp_message,
"requested address is incorrect");
4176 #if defined (DEBUG_FIND_LEASE)
4177 log_info (
"Client's fixed-address %s doesn't match %s%s",
4195 #if defined (DEBUG_FIND_LEASE)
4196 log_info (
"trying next lease matching client id: %s",
4200 #if defined (FAILOVER_PROTOCOL)
4212 #if defined (DEBUG_FIND_LEASE)
4213 log_info(
"not active or not mine to allocate: %s",
4221 #if defined (DEBUG_FIND_LEASE)
4222 log_info (
"wrong network segment: %s",
4232 #if defined (DEBUG_FIND_LEASE)
4237 if (uid_lease -> n_uid)
4238 lease_reference (&
next,
4239 uid_lease -> n_uid,
MDL);
4240 if (!
packet -> raw -> ciaddr.s_addr)
4242 lease_dereference (&uid_lease,
MDL);
4244 lease_reference (&uid_lease,
next,
MDL);
4245 lease_dereference (&
next,
MDL);
4251 #if defined (DEBUG_FIND_LEASE)
4253 log_info (
"Found lease for client id: %s.",
4269 #if defined (DEBUG_FIND_LEASE)
4270 log_info (
"trying next lease matching hw addr: %s",
4273 #if defined (FAILOVER_PROTOCOL)
4286 #if defined (DEBUG_FIND_LEASE)
4287 log_info(
"not active or not mine to allocate: %s",
4300 if (hw_lease -> binding_state !=
FTS_FREE &&
4303 (!have_client_identifier ||
4304 hw_lease -> uid_len != client_identifier.
len ||
4305 memcmp (hw_lease -> uid, client_identifier.
data,
4306 hw_lease -> uid_len))) {
4307 #if defined (DEBUG_FIND_LEASE)
4308 log_info (
"wrong client identifier: %s",
4314 #if defined (DEBUG_FIND_LEASE)
4315 log_info (
"wrong network segment: %s",
4324 #if defined (DEBUG_FIND_LEASE)
4328 if (!
packet -> raw -> ciaddr.s_addr)
4331 if (hw_lease -> n_hw)
4332 lease_reference (&
next, hw_lease -> n_hw,
MDL);
4333 lease_dereference (&hw_lease,
MDL);
4335 lease_reference (&hw_lease,
next,
MDL);
4336 lease_dereference (&
next,
MDL);
4342 #if defined (DEBUG_FIND_LEASE)
4344 log_info (
"Found lease for hardware address: %s.",
4351 lease_reference (&ip_lease, ip_lease_in,
MDL);
4355 #if defined (DEBUG_FIND_LEASE)
4357 log_info (
"Found lease for requested address: %s.",
4364 if (ip_lease && ours)
4377 #if defined (DEBUG_FIND_LEASE)
4378 log_info (
"...but it was on the wrong shared network.");
4380 strcpy (dhcp_message,
"requested address on bad subnet");
4381 lease_dereference (&ip_lease,
MDL);
4395 (!have_client_identifier ||
4396 ip_lease -> uid_len != client_identifier.
len ||
4397 memcmp (ip_lease -> uid, client_identifier.
data,
4398 ip_lease -> uid_len)) :
4399 (ip_lease -> hardware_addr.hbuf [0] !=
packet -> raw -> htype ||
4400 ip_lease -> hardware_addr.hlen !=
packet -> raw -> hlen + 1 ||
4401 memcmp (&ip_lease -> hardware_addr.hbuf [1],
4403 (
unsigned)(ip_lease -> hardware_addr.hlen - 1))))) {
4412 if (ip_lease -> binding_state !=
FTS_FREE &&
4414 #if defined (DEBUG_FIND_LEASE)
4415 log_info (
"rejecting lease for requested address.");
4419 if (ours && ip_lease -> binding_state !=
FTS_ACTIVE)
4421 lease_dereference (&ip_lease,
MDL);
4429 if (ip_lease && (uid_lease || hw_lease) &&
4436 #if defined (DEBUG_FIND_LEASE)
4437 log_info(
"ip lease not active or not ours to offer.");
4439 lease_dereference(&ip_lease,
MDL);
4446 ip_lease->
uid && ip_lease != uid_lease) {
4447 if (have_client_identifier &&
4448 (ip_lease -> uid_len == client_identifier.
len) &&
4449 !memcmp (client_identifier.
data,
4450 ip_lease -> uid, ip_lease -> uid_len)) {
4453 log_error (
"client %s has duplicate%s on %s",
4464 !
packet -> raw -> ciaddr.s_addr &&
4470 lease_dereference (&uid_lease,
MDL);
4471 lease_reference (&uid_lease, ip_lease,
MDL);
4479 lease_dereference (&fixed_lease,
MDL);
4481 log_error (
"Dynamic and static leases present for %s.",
4483 log_error (
"Remove host declaration %s or remove %s",
4484 (fixed_lease && fixed_lease -> host
4485 ? (fixed_lease -> host -> name
4486 ? fixed_lease -> host -> name
4490 log_error (
"from the dynamic address pool for %s",
4494 lease_dereference (&ip_lease,
MDL);
4495 strcpy (dhcp_message,
4496 "database conflict - call for help!");
4499 if (ip_lease && ip_lease != uid_lease) {
4500 #if defined (DEBUG_FIND_LEASE)
4501 log_info (
"requested address not available.");
4503 lease_dereference (&ip_lease,
MDL);
4513 if (hw_lease && hw_lease == uid_lease) {
4514 #if defined (DEBUG_FIND_LEASE)
4515 log_info (
"hardware lease and uid lease are identical.");
4517 lease_dereference (&hw_lease,
MDL);
4519 if (ip_lease && ip_lease == hw_lease) {
4520 lease_dereference (&hw_lease,
MDL);
4521 #if defined (DEBUG_FIND_LEASE)
4522 log_info (
"hardware lease and ip lease are identical.");
4525 if (ip_lease && ip_lease == uid_lease) {
4526 lease_dereference (&uid_lease,
MDL);
4527 #if defined (DEBUG_FIND_LEASE)
4528 log_info (
"uid lease and ip lease are identical.");
4542 lease_dereference (&ip_lease,
MDL);
4550 if (!
packet -> raw -> ciaddr.s_addr)
4552 lease_dereference (&uid_lease,
MDL);
4560 if (!
packet -> raw -> ciaddr.s_addr)
4562 lease_dereference (&hw_lease,
MDL);
4569 strcpy (dhcp_message,
"requested address not available");
4576 !ip_lease && !fixed_lease) {
4577 #if defined (DEBUG_FIND_LEASE)
4578 log_info (
"no applicable lease found for DHCPREQUEST.");
4586 lease_reference (&
lease, fixed_lease,
MDL);
4587 lease_dereference (&fixed_lease,
MDL);
4588 #if defined (DEBUG_FIND_LEASE)
4589 log_info (
"choosing fixed address.");
4597 if (!
packet -> raw -> ciaddr.s_addr)
4599 #if defined (DEBUG_FIND_LEASE)
4600 log_info (
"not choosing requested address (!).");
4602 lease_dereference (&ip_lease,
MDL);
4604 #if defined (DEBUG_FIND_LEASE)
4605 log_info (
"choosing lease on requested address.");
4607 lease_reference (&
lease, ip_lease,
MDL);
4609 host_dereference (&
lease -> host,
MDL);
4618 log_error(
"uid lease %s for client %s is duplicate "
4624 if (!
packet -> raw -> ciaddr.s_addr &&
4628 #if defined (DEBUG_FIND_LEASE)
4629 log_info (
"not choosing uid lease.");
4632 lease_reference (&
lease, uid_lease,
MDL);
4634 host_dereference (&
lease -> host,
MDL);
4635 #if defined (DEBUG_FIND_LEASE)
4639 lease_dereference (&uid_lease,
MDL);
4645 #if defined (DEBUG_FIND_LEASE)
4646 log_info (
"not choosing hardware lease.");
4653 if (!hw_lease -> uid_len ||
4654 (have_client_identifier
4655 ? (hw_lease -> uid_len ==
4656 client_identifier.
len &&
4657 !memcmp (hw_lease -> uid,
4658 client_identifier.
data,
4659 client_identifier.
len))
4660 :
packet -> packet_type == 0)) {
4661 lease_reference (&
lease, hw_lease,
MDL);
4663 host_dereference (&
lease -> host,
MDL);
4664 #if defined (DEBUG_FIND_LEASE)
4665 log_info (
"choosing hardware lease.");
4668 #if defined (DEBUG_FIND_LEASE)
4669 log_info (
"not choosing hardware lease: %s.",
4674 lease_dereference (&hw_lease,
MDL);
4687 host_reference(&p, host,
MDL);
4708 host_dereference(&p,
MDL);
4713 host_dereference(&p,
MDL);
4715 host_reference(&p, n,
MDL);
4716 host_dereference(&n,
MDL);
4727 lease == ip_lease &&
4729 log_error (
"Reclaiming REQUESTed abandoned IP address %s.",
4742 if (have_client_identifier)
4746 lease_dereference (&fixed_lease,
MDL);
4748 lease_dereference (&hw_lease,
MDL);
4750 lease_dereference (&uid_lease,
MDL);
4752 lease_dereference (&ip_lease,
MDL);
4754 host_dereference (&host,
MDL);
4757 #if defined (DEBUG_FIND_LEASE)
4765 #if defined (DEBUG_FIND_LEASE)
4766 log_info (
"Not returning a lease.");
4781 if (lease_allocate (&
lease,
MDL) != ISC_R_SUCCESS)
4783 if (host_reference (&rhp, hp,
MDL) != ISC_R_SUCCESS) {
4790 host_dereference (&rhp,
MDL);
4793 host_reference (&
lease -> host, rhp,
MDL);
4798 if (!
lease -> uid) {
4800 host_dereference (&rhp,
MDL);
4814 host_dereference (&rhp,
MDL);
4826 struct pool *
pool,
int *peer_has_leases)
4829 struct lease *candl = NULL;
4832 if ((
pool -> prohibit_list &&
4834 (
pool -> permit_list &&
4838 #if defined (FAILOVER_PROTOCOL)
4854 struct lease *peerl = NULL;
4865 if (peerl != NULL) {
4866 if (((candl == NULL) ||
4871 *peer_has_leases = 1;
4878 if (peerl != NULL) {
4879 if (((candl == NULL) ||
4884 *peer_has_leases = 1;
4891 if ((candl == NULL) && (peerl != NULL) &&
4937 (candl -> ends < lease ->
ends))) {
4945 (candl -> ends < lease ->
ends))) {
4951 if (candl -> ends < lease ->
ends)
4955 if (
lease != NULL) {
4957 log_error(
"Reclaiming abandoned lease %s.",
4966 log_debug(
"soft impossible condition (%s:%d): stale "
4967 "host \"%s\" found on lease %s",
MDL,
4986 struct permit *permit_list;
4991 for (p = permit_list; p; p = p ->
next) {
4992 switch (p ->
type) {
5004 if (
packet -> authenticated)
5009 if (!
packet -> authenticated)
5017 if (!
packet -> options_valid ||
5023 for (i = 0; i <
packet -> class_count; i++) {
5024 if (p ->
class ==
packet -> classes [i])
5026 if (
packet -> classes [i] &&
5027 packet -> classes [i] -> superclass &&
5028 (
packet -> classes [i] -> superclass ==
5043 #if defined(DHCPv6) && defined(DHCP4o6)
5044 static int locate_network6 (
packet)
5047 const struct packet *chk_packet;
5048 const struct in6_addr *link_addr, *first_link_addr;
5120 first_link_addr = NULL;
5122 while (chk_packet != NULL) {
5124 if (!IN6_IS_ADDR_UNSPECIFIED(link_addr) &&
5125 !IN6_IS_ADDR_LINKLOCAL(link_addr)) {
5126 first_link_addr = link_addr;
5135 if (first_link_addr != NULL) {
5136 ia.len =
sizeof(*first_link_addr);
5137 memcpy(ia.iabuf, first_link_addr,
sizeof(*first_link_addr));
5163 log_error(
"No interface and no link address "
5164 "can't determine DHCP4o6 shared network");
5178 #if defined(DHCPv6) && defined(DHCP4o6)
5180 return (locate_network6 (
packet));
5198 struct in_addr any_addr;
5199 any_addr.s_addr = INADDR_ANY;
5201 if (!
packet -> packet_type && memcmp(&
packet -> raw -> ciaddr, &any_addr, 4)) {
5222 memset (&data, 0,
sizeof data);
5230 if (data.
len == 0) {
5233 if (data.
len != 4) {
5298 unsigned option_num;
5301 struct in_addr *a = NULL;
5302 isc_boolean_t found = ISC_FALSE;
5305 memset(&d, 0,
sizeof(d));
5306 memset(from, 0,
sizeof(*from));
5314 if (d.
len ==
sizeof(*from)) {
5316 memcpy(from, d.
data,
sizeof(*from));
5322 if ((out_options != NULL) &&
5323 (options != out_options)) {
5333 if ((found == ISC_FALSE) &&
5337 if (out_options != NULL) {
5345 (
unsigned char *)a,
sizeof(*a),
5346 0, allocate,
MDL)) {
5347 option_code_hash_lookup(&oc->
option,
5349 &option_num, 0,
MDL);
5382 struct group *network_group) {
5384 if (*network_options == NULL) {
5420 }
else if (network_group != NULL) {
5444 find_min_site_code(
struct universe *u)
5454 site_code_min = 224;
5455 option_code_hash_foreach(u->
code_hash, lowest_site_code);
5457 if (site_code_min < 224) {
5458 log_error(
"WARNING: site-local option codes less than 224 have "
5459 "been deprecated by RFC3942. You have options "
5460 "listed in site local space %s that number as low as "
5461 "%d. Please investigate if these should be declared "
5462 "as regular options rather than site-local options, "
5463 "or migrated up past 224.",
5464 u->
name, site_code_min);
5471 if (site_code_min < 128)
5472 site_code_min = 128;
5481 return site_code_min;
5485 lowest_site_code(
const void *key,
unsigned len,
void *
object)
5492 return ISC_R_SUCCESS;
5558 option_code_hash_lookup(&oc->
option,
5605 struct lease* new_lease,
5620 (new_lease->
ddns_cb == NULL) &&
5639 if (d1.
len == 1 && (d1.
data[0] < 100))
5640 thresh = d1.
data[0];
5648 int lease_length = 0;
5653 if (lease_length <= (INT_MAX / thresh))
5654 limit = lease_length * thresh / 100;
5656 limit = lease_length / 100 * thresh;
5662 if (lease_age <= limit) {
5667 if (new_lease->
scope != NULL) {
5686 log_debug(
"reuse_lease: lease age %ld (secs)"
5687 " under %d%% threshold, reply with "
5688 "unaltered, existing lease for %s",