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) 1101 char msgbuf[1024], *addr_type;
1109 struct iaddr cip, gip, sip;
1112 struct sockaddr_in to;
1113 struct in_addr from;
1114 isc_boolean_t zeroed_ciaddr;
1116 int result, h_m_client_ip = 0;
1117 struct host_decl *host = NULL, *hp = NULL, *h;
1118 #if defined (DEBUG_INFORM_HOST) 1119 int h_w_fixed_addr = 0;
1126 zeroed_ciaddr = ISC_TRUE;
1132 addr_type =
"source";
1135 memset(cip.
iabuf, 0, 4);
1139 zeroed_ciaddr = ISC_FALSE;
1142 addr_type =
"client";
1150 if (zeroed_ciaddr == ISC_TRUE) {
1151 addr_type =
"relay";
1160 #if defined(DHCPv6) && defined(DHCP4o6) 1162 snprintf(msgbuf,
sizeof(msgbuf),
1163 "DHCP4o6 DHCPINFORM from %s via %s",
1168 snprintf(msgbuf,
sizeof(msgbuf),
"DHCPINFORM from %s via %s",
1175 if (!memcmp(cip.
iabuf,
"\0\0\0", 4)) {
1176 log_info(
"%s: ignored (null source address).", msgbuf);
1191 memset(&d1, 0,
sizeof d1);
1198 log_info(
"%s: ignored (invalid subnet selection option).", msgbuf);
1220 if ((zeroed_ciaddr == ISC_TRUE) && (gip.
len != 0))
1221 addr_type =
"relay link select";
1223 addr_type =
"selected";
1229 log_info(
"%s: unknown subnet for %s address %s",
1230 msgbuf, addr_type,
piaddr(sip));
1241 log_info(
"%s: not authoritative for subnet %s",
1244 log_info(
"If this DHCP server is authoritative for%s",
1246 log_info(
"please write an `authoritative;' directi%s",
1247 "ve either in the");
1248 log_info(
"subnet declaration or in some scope that%s",
1250 log_info(
"subnet declaration - for example, write %s",
1252 log_info(
"of the dhcpd.conf file.");
1261 memset(&outgoing, 0,
sizeof outgoing);
1262 memset(&raw, 0,
sizeof raw);
1263 outgoing.
raw = &raw;
1265 maybe_return_agent_options(
packet, options);
1274 if (zeroed_ciaddr == ISC_FALSE) {
1275 struct lease* cip_lease = NULL;
1283 NULL,
packet, NULL, NULL,
1291 lease_dereference (&cip_lease,
MDL);
1323 memset(&d1, 0,
sizeof(d1));
1331 #if defined (DEBUG_INFORM_HOST) 1333 log_debug (
"dhcpinform: found host by ID " 1334 "-- checking fixed-address match");
1338 for (h = hp; !h_m_client_ip && h; h = h->n_ipaddr) {
1342 memset(&fixed_addr, 0,
sizeof(fixed_addr));
1344 NULL, NULL, NULL, NULL,
1346 h->fixed_addr,
MDL))
1349 #if defined (DEBUG_INFORM_HOST) 1353 (i + cip.
len) <= fixed_addr.
len;
1355 if (memcmp(fixed_addr.
data + i,
1357 #if defined (DEBUG_INFORM_HOST) 1359 "host with matching " 1360 "fixed-address by ID");
1362 host_reference(&
host, h,
MDL);
1375 #if defined (DEBUG_INFORM_HOST) 1377 "without fixed-address by ID");
1379 host_reference(&
host, h,
MDL);
1383 host_dereference (&hp,
MDL);
1385 if (!
host || !h_m_client_ip) {
1390 #if defined (DEBUG_INFORM_HOST) 1392 log_debug (
"dhcpinform: found host by HW " 1393 "-- checking fixed-address match");
1398 for (h = hp; !h_m_client_ip && h; h = h->n_ipaddr) {
1402 memset (&fixed_addr, 0,
sizeof(fixed_addr));
1404 NULL, NULL, NULL, NULL,
1406 h->fixed_addr,
MDL))
1409 #if defined (DEBUG_INFORM_HOST) 1413 (i + cip.
len) <= fixed_addr.
len;
1415 if (memcmp(fixed_addr.
data + i,
1417 #if defined (DEBUG_INFORM_HOST) 1419 "host with matching " 1420 "fixed-address by HW");
1429 host_reference(&
host, h,
MDL);
1441 #if defined (DEBUG_INFORM_HOST) 1442 log_debug (
"dhcpinform: found host without " 1443 "fixed-address by HW");
1445 host_reference (&
host, h,
MDL);
1450 host_dereference (&hp,
MDL);
1453 #if defined (DEBUG_INFORM_HOST) 1458 if (h_w_fixed_addr && !h_m_client_ip) {
1459 log_info (
"dhcpinform: matching host with " 1460 "fixed-address different than " 1461 "client IP detected?!");
1469 #if defined (DEBUG_INFORM_HOST) 1470 log_info (
"dhcpinform: applying host (group) options");
1477 host_dereference (&
host,
MDL);
1483 memset (&d1, 0,
sizeof d1);
1491 if (i >=
sizeof(raw.
file)) {
1492 log_info(
"file name longer than packet field " 1493 "truncated - field: %lu name: %d %.*s",
1494 (
unsigned long)
sizeof(raw.
file), i,
1496 i =
sizeof(raw.
file);
1511 if (i >=
sizeof(raw.
sname)) {
1512 log_info(
"server name longer than packet field " 1513 "truncated - field: %lu name: %d %.*s",
1514 (
unsigned long)
sizeof(raw.
sname), i,
1516 i =
sizeof(raw.
sname);
1538 option_code_hash_lookup(&oc->
option,
1558 option_code_hash_lookup(&oc->
option,
1573 packet -> options, options,
1578 (
const char *)d1.
data, d1.
len,
1587 options -> site_universe = u ->
index;
1595 memset (&prl, 0,
sizeof prl);
1612 packet -> options, options,
1627 packet -> options, options,
1676 #if defined(DHCPv6) && defined(DHCP4o6) 1679 snprintf(msgbuf,
sizeof msgbuf,
1680 "DHCP4o6 DHCPACK to %s (%s) via",
piaddr(cip),
1684 "<no client hardware address>");
1692 log_fatal(
"No memory to store DHCP4o6 reply.");
1707 to.sin_family = AF_INET;
1709 to.sin_len =
sizeof to;
1711 memset (to.sin_zero, 0,
sizeof to.sin_zero);
1731 if (!raw.ciaddr.s_addr && gip.
len) {
1732 memcpy(&to.sin_addr, gip.
iabuf, 4);
1737 memcpy(&to.sin_addr, cip.
iabuf, 4);
1742 snprintf(msgbuf,
sizeof msgbuf,
"DHCPACK to %s (%s) via",
piaddr(cip),
1745 "<no client hardware address>");
1753 outgoing.packet_length, from, &to, NULL);
1755 log_error ("%s:%d: Failed to send %d byte long packet over %s "
1756 "interface.", MDL, outgoing.packet_length,
1762 subnet_dereference (&subnet, MDL);
1780 struct
group *network_group;
1782 struct sockaddr_in to;
1783 struct in_addr from;
1794 memset (&outgoing, 0,
sizeof outgoing);
1795 memset (&raw, 0,
sizeof raw);
1800 log_error (
"No memory for DHCPNAK message type.");
1806 log_error (
"No memory for expr_const expression.");
1819 log_error (
"No memory for DHCPNAK message type.");
1824 (
unsigned char *)dhcp_message,
1825 strlen (dhcp_message), 1, 0,
MDL)) {
1826 log_error (
"No memory for expr_const expression.");
1842 #if defined(SERVER_ID_FOR_NAK) 1910 #if defined(DHCPv6) && defined(DHCP4o6) 1912 log_info (
"DHCP4o6 DHCPNAK on %s to %s via %s",
1916 packet -> raw -> chaddr),
1920 log_info (
"DHCPNAK on %s to %s via %s",
1925 :
packet -> interface -> name);
1934 #if defined(DHCPv6) && defined(DHCP4o6) 1941 log_fatal(
"No memory to store DHCP4o6 reply.");
1952 to.sin_family = AF_INET;
1954 to.sin_len =
sizeof to;
1956 memset (to.sin_zero, 0,
sizeof to.sin_zero);
1960 if (raw.giaddr.s_addr) {
1961 to.sin_addr = raw.giaddr;
1962 if (raw.giaddr.s_addr != htonl (INADDR_LOOPBACK))
1972 log_error (
"%s:%d: Failed to send %d byte long " 1973 "packet over %s interface.",
MDL,
1989 log_error (
"%s:%d: Failed to send %d byte long packet over %s " 2038 memset(&client_id, 0,
sizeof client_id);
2051 option_code_hash_lookup(&oc->
option,
2073 int used, count, high_threshold, poolhigh = 0, poollow = 0;
2074 char *shared_name =
"no name";
2102 log_error(
"Pool threshold reset - shared subnet: %s; " 2103 "address: %s; low threshold %d/%d.",
2119 if ((poolhigh <= 0) || (poolhigh > 100)) {
2126 if (used < high_threshold) {
2132 log_error(
"Pool threshold exceeded - shared subnet: %s; " 2133 "address: %s; high threshold %d%% %d/%d.",
2135 poolhigh, used, count);
2151 if (poollow < poolhigh) {
2171 TIME offered_lease_time;
2173 TIME min_lease_time;
2177 isc_result_t result;
2180 struct in_addr from;
2181 TIME remaining_time;
2183 #if defined(DELAYED_ACK) && !defined(DHCP4o6) 2185 isc_boolean_t enqueue = ISC_FALSE;
2187 int use_old_lease = 0;
2203 host_reference (&host, hp,
MDL);
2204 else if (
lease -> host)
2205 host_reference (&host,
lease -> host,
MDL);
2210 log_fatal (
"unable to allocate lease state!");
2211 state -> got_requested_address =
packet -> got_requested_address;
2218 state -> got_server_identifier = 1;
2258 for (i =
packet -> class_count; i > 0; i--) {
2284 state -> options, &
lease -> scope,
2289 seek = (
struct lease *)0;
2295 lease_dereference (&seek,
MDL);
2306 if (seek !=
lease &&
2313 lease_dereference (&seek,
MDL);
2315 lease_reference (&seek,
next,
MDL);
2316 lease_dereference (&
next,
MDL);
2320 lease_dereference (&
next,
MDL);
2323 lease_dereference (&seek,
MDL);
2330 !
host -> client_identifier.len &&
2340 seek = (
struct lease *)0;
2347 lease_dereference (&seek,
MDL);
2354 if (seek !=
lease &&
2361 lease_dereference (&seek,
MDL);
2363 lease_reference (&seek,
next,
MDL);
2364 lease_dereference (&
next,
MDL);
2368 lease_dereference (&
next,
MDL);
2371 lease_dereference (&seek,
MDL);
2381 memset (&d1, 0,
sizeof d1);
2390 ntohs (
packet -> raw -> secs) < d1.
data [0]) {
2391 log_info(
"%s: configured min-secs value (%d) " 2392 "is greater than secs field (%d). " 2393 "message dropped.", msg, d1.
data[0],
2398 host_dereference (&
host,
MDL);
2424 packet -> options, state -> options,
2428 for (h = hp; h; h = h ->
n_ipaddr) {
2433 host_reference (&host, h,
MDL);
2435 host_dereference(&hp,
MDL);
2443 for (h = hp; h; h = h ->
n_ipaddr) {
2448 host_reference (&host, h,
MDL);
2450 host_dereference(&hp,
MDL);
2455 for (h = hp; h; h = h ->
n_ipaddr) {
2460 host_reference (&host, h,
MDL);
2462 host_dereference(&hp,
MDL);
2489 log_info (
"%s: unknown client", msg);
2492 host_dereference (&host,
MDL);
2507 log_info (
"%s: bootp disallowed", msg);
2510 host_dereference (&host,
MDL);
2525 log_info (
"%s: booting disallowed", msg);
2528 host_dereference (&host,
MDL);
2537 if (
lease -> billing_class) {
2538 for (i = 0; i <
packet -> class_count; i++)
2539 if (
packet -> classes [i] ==
2540 lease -> billing_class)
2542 if (i ==
packet -> class_count) {
2558 struct class *billclass, *subclass;
2567 if (subclass == NULL)
2568 cname = subclass->
name;
2570 cname = billclass->
name;
2574 log_info(
"%s: no available billing: lease " 2575 "limit reached in all matching " 2576 "classes (last: '%s')", msg, cname);
2579 host_dereference(&host,
MDL);
2609 packet -> options, state -> options,
2618 packet -> options, state -> options,
2624 lt = (
struct lease *)0;
2625 result = lease_allocate (<,
MDL);
2626 if (result != ISC_R_SUCCESS) {
2627 log_info (
"%s: can't allocate temporary lease structure: %s",
2628 msg, isc_result_totext (result));
2631 host_dereference (&
host,
MDL);
2655 if (d1.
len == sizeof (u_int32_t))
2672 if (s1 && (d1.
len == 4)) {
2673 u_int32_t ones = 0xffffffff;
2699 if ((memcmp(d1.
data, &ones, 4) == 0) &&
2710 "reservation made on %s.",
2730 if (d1.
len == sizeof (u_int32_t))
2753 if (d1.
len == sizeof (u_int32_t))
2763 memset(&d1, 0,
sizeof(d1));
2770 if (d1.
len == 1 && d1.
data[0] > 0 &&
2773 int poolfilled, total, count;
2776 adaptive_time = min_lease_time;
2788 poolfilled = (total > (INT_MAX / 100)) ?
2789 total / (count / 100) :
2790 (total * 100) / count;
2792 log_debug(
"Adap-lease: Total: %d, Free: %d, " 2793 "Ends: %d, Adaptive: %d, Fill: %d, " 2798 (
int)adaptive_time, poolfilled,
2801 if (poolfilled >= d1.
data[0] &&
2802 lease_time > adaptive_time) {
2803 log_info(
"Pool over threshold, time " 2804 "for %s reduced from %d to " 2807 (
int)adaptive_time);
2809 lease_time = adaptive_time;
2831 lease_dereference (<,
MDL);
2833 host_dereference (&
host,
MDL);
2861 lease_dereference (<,
MDL);
2863 host_dereference (&
host,
MDL);
2867 if (lease_time > remaining_time)
2868 lease_time = remaining_time;
2871 if (lease_time < min_lease_time) {
2873 lease_time = min_lease_time;
2879 #if defined (FAILOVER_PROTOCOL) 2883 TIME new_lease_time = lease_time;
2884 dhcp_failover_state_t *peer =
2894 if (lease_time > peer->mclt) {
2902 new_lease_time = peer->mclt;
2904 (lt->
tsfp + peer->mclt))
2923 + (new_lease_time / 2)),
2938 lease_time = new_lease_time;
2948 = leaseTimeCheck(
cur_time + lease_time,
2975 if (d1.
len == sizeof (u_int32_t))
2988 if (d1.
len == sizeof (u_int32_t))
3026 unsigned char *tuid;
3043 host_dereference (&
host,
MDL);
3128 }
else if (oc && s1) {
3131 log_error (
"no memory for client hostname.");
3145 sizeof packet -> raw -> chaddr);
3153 log_debug (
"Cannot reuse: lease is changing to RESERVED");
3172 if ((!offer || offer ==
DHCPACK) &&
3192 sizeof packet -> raw -> chaddr);
3194 int commit = (!offer || (offer ==
DHCPACK));
3199 if (use_old_lease == 1) {
3203 #if !defined(DELAYED_ACK) || defined(DHCP4o6) 3212 if ((use_old_lease == 0) &&
3232 if ((use_old_lease == 0) &&
3234 !offer || offer ==
DHCPACK, 0, 0)) {
3236 log_info (
"%s: database update failed", msg);
3238 lease_dereference (<,
MDL);
3242 lease_dereference (<,
MDL);
3254 state -> offer = offer;
3275 if (d1.
len == sizeof (u_int16_t))
3286 if (d1.
len == sizeof (u_int16_t))
3287 state -> max_message_size =
3318 if (state -> offer) {
3323 &state -> offer, 1, 0, 0,
MDL)) {
3324 option_code_hash_lookup(&oc->
option,
3328 state -> options, oc);
3335 memcpy(state->
from.
iabuf, &from,
sizeof(from));
3336 state->
from.
len =
sizeof(from);
3338 offered_lease_time =
3339 state -> offered_expiry -
cur_time;
3347 option_code_hash_lookup(&oc->
option,
3351 state -> options, oc);
3369 if (rebind_time >= offered_lease_time)
3373 offered_lease_time = rebind_time;
3391 if (state ->
ip -> address_count) {
3393 sizeof state ->
ip -> addresses [0];
3394 memcpy (state -> from.iabuf,
3395 &state ->
ip -> addresses [0],
3401 memset (&state -> siaddr, 0,
sizeof state -> siaddr);
3407 packet -> options, state -> options,
3412 memcpy (&state -> siaddr, d1.
data, 4);
3427 option_code_hash_lookup(&oc->
option,
3431 state -> options, oc);
3459 h = gethostbyaddr ((
char *)&ia,
sizeof ia, AF_INET);
3461 log_error (
"No hostname for %s", inet_ntoa (ia));
3468 strlen (h -> h_name) + 1,
3470 option_code_hash_lookup(&oc->
option,
3474 state -> options, oc);
3487 packet -> options, state -> options, &
lease -> scope,
3499 option_code_hash_lookup(&oc->
option,
3503 state -> options, oc);
3516 packet -> options, state -> options,
3521 (
const char *)d1.
data, d1.
len,
3527 state -> options -> site_universe = u ->
index;
3549 packet -> options, state -> options,
3557 lease -> state = state;
3586 if (d1.
len == sizeof (u_int32_t))
3596 log_debug (
"Ping timeout: %ld", (
long)ping_timeout);
3605 tv.tv_sec =
cur_tv.tv_sec + ping_timeout;
3606 tv.tv_usec =
cur_tv.tv_usec;
3613 #if defined(DELAYED_ACK) && !defined(DHCP4o6) 3615 delayed_ack_enqueue(
lease);
3622 #if defined(DELAYED_ACK) 3640 if (free_ackqueue) {
3642 free_ackqueue = q->
next;
3647 log_fatal(
"delayed_ack_enqueue: no memory!");
3649 memset(q, 0,
sizeof *q);
3652 q->
next = ackqueue_head;
3663 delayed_acks_timer(NULL);
3665 struct timeval next_fsync;
3667 if (max_fsync.tv_sec == 0 && max_fsync.tv_usec == 0) {
3670 max_fsync.tv_usec =
cur_tv.tv_usec +
3673 if (max_fsync.tv_usec >= 1000000) {
3675 max_fsync.tv_usec -= 1000000;
3680 next_fsync.tv_sec =
cur_tv.tv_sec;
3681 next_fsync.tv_usec =
cur_tv.tv_usec + min_ack_delay_usecs;
3682 if (next_fsync.tv_usec >= 1000000) {
3683 next_fsync.tv_sec++;
3684 next_fsync.tv_usec -= 1000000;
3687 if ((next_fsync.tv_sec > max_fsync.tv_sec) ||
3688 ((next_fsync.tv_sec == max_fsync.tv_sec) &&
3689 (next_fsync.tv_usec > max_fsync.tv_usec))) {
3690 next_fsync.tv_sec = max_fsync.tv_sec;
3691 next_fsync.tv_usec = max_fsync.tv_usec;
3694 add_timeout(&next_fsync, delayed_acks_timer, NULL,
3705 delayed_acks_timer(
void *foo)
3710 memset(&max_fsync, 0,
sizeof(max_fsync));
3712 if (!outstanding_acks) {
3727 for (ack = ackqueue_tail ; ack ; ack = p) {
3730 #if defined(FAILOVER_PROTOCOL) 3734 dhcp_failover_state_t *fpeer;
3737 if (fpeer && fpeer->link_to_peer) {
3745 log_error(
"delayed ack for %s has gone stale",
3751 lease_dereference(&ack->
lease,
MDL);
3752 ack->
next = free_ackqueue;
3753 free_ackqueue = ack;
3756 ackqueue_head = NULL;
3757 ackqueue_tail = NULL;
3758 outstanding_acks = 0;
3761 #if defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT) 3763 relinquish_ackqueue(
void)
3767 for (q = ackqueue_head ; q ; q = n) {
3771 for (q = free_ackqueue ; q ; q = n) {
3784 unsigned packet_length;
3786 struct sockaddr_in to;
3787 struct in_addr from;
3791 int nulltp, bootpp, unicastp = 1;
3796 log_fatal (
"dhcp_reply was supplied lease with no state!");
3799 memset (&raw, 0,
sizeof raw);
3800 memset (&d1, 0,
sizeof d1);
3804 if (state -> filename.len && state -> filename.data) {
3806 state -> filename.data,
3807 state -> filename.len >
sizeof raw.
file 3808 ?
sizeof raw.
file : state -> filename.len);
3809 if (
sizeof raw.
file > state -> filename.len)
3810 memset (&raw.
file [state -> filename.len], 0,
3811 (
sizeof raw.
file) - state -> filename.len);
3813 log_info(
"file name longer than packet field " 3814 "truncated - field: %lu name: %d %.*s",
3815 (
unsigned long)
sizeof(raw.
file),
3816 state->filename.len, (
int)state->filename.len,
3817 state->filename.data);
3823 if (state -> server_name.len && state -> server_name.data) {
3825 state -> server_name.data,
3826 state -> server_name.len >
sizeof raw.
sname 3827 ?
sizeof raw.
sname : state -> server_name.len);
3828 if (
sizeof raw.
sname > state -> server_name.len)
3829 memset (&raw.
sname [state -> server_name.len], 0,
3830 (
sizeof raw.
sname) - state -> server_name.len);
3832 log_info(
"server name longer than packet field " 3833 "truncated - field: %lu name: %d %.*s",
3834 (
unsigned long)
sizeof(raw.
sname),
3842 &
lease -> hardware_addr.hbuf [1],
sizeof raw.
chaddr);
3843 raw.
hlen =
lease -> hardware_addr.hlen - 1;
3862 state -> max_message_size,
3863 state ->
packet -> options,
3865 bufs, nulltp, bootpp,
3866 &state -> parameter_request_list,
3869 memcpy (&raw.
ciaddr, &state -> ciaddr,
sizeof raw.
ciaddr);
3871 raw.
siaddr = state -> siaddr;
3874 raw.
xid = state -> xid;
3875 raw.
secs = state -> secs;
3876 raw.
flags = state -> bootp_flags;
3877 raw.
hops = state -> hops;
3880 if (
lease -> client_hostname) {
3881 if ((strlen (
lease -> client_hostname) <= 64) &&
3883 s =
lease -> client_hostname;
3885 s =
"Hostname Unsuitable for Printing";
3894 #if defined(DHCPv6) && defined(DHCP4o6) 3897 log_info (
"DHCP4o6 %s on %s to %s %s%s%svia %s",
3900 ?
"DHCPACK" :
"DHCPOFFER")
3903 (
lease -> hardware_addr.hlen
3905 lease -> hardware_addr.hlen - 1,
3906 &
lease -> hardware_addr.hbuf [1])
3908 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
3915 packet_length,
MDL)) {
3916 log_fatal(
"No memory to store DHCP4o6 reply.");
3921 &raw, packet_length);
3932 log_info (
"%s on %s to %s %s%s%svia %s",
3934 ? (state ->
offer ==
DHCPACK ?
"DHCPACK" :
"DHCPOFFER")
3937 (
lease -> hardware_addr.hlen > 1
3939 lease -> hardware_addr.hlen - 1,
3940 &
lease -> hardware_addr.hbuf [1])
3942 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
3944 ? inet_ntoa (state ->
giaddr)
3945 : state ->
ip -> name));
3948 dump_raw ((
unsigned char *)&raw, packet_length);
3955 to.sin_family = AF_INET;
3957 to.sin_len =
sizeof to;
3959 memset (to.sin_zero, 0,
sizeof to.sin_zero);
3962 if (raw.giaddr.s_addr) {
3963 to.sin_addr = raw.giaddr;
3964 if (raw.giaddr.s_addr != htonl (INADDR_LOOPBACK))
3971 packet_length, raw.siaddr, &to,
3974 log_error (
"%s:%d: Failed to send %d byte long " 3975 "packet over %s interface.",
MDL,
3997 }
else if (raw.ciaddr.s_addr &&
4004 to.sin_addr = raw.
ciaddr;
4009 packet_length, raw.siaddr, &to,
4012 log_error(
"%s:%d: Failed to send %d byte long" 4013 " packet over %s interface.",
MDL,
4029 to.sin_addr = raw.yiaddr;
4043 from, &to, unicastp ? &hto : NULL);
4045 log_error (
"%s:%d: Failed to send %d byte long " 4046 "packet over %s interface.",
MDL,
4047 packet_length, state->
ip->
name);
4060 int *peer_has_leases,
struct lease *ip_lease_in,
4070 struct lease *fixed_lease = (
struct lease *)0;
4074 int have_client_identifier = 0;
4078 #if defined(FAILOVER_PROTOCOL) 4080 if (peer_has_leases) {
4089 *peer_has_leases = 1;
4096 if (
packet -> raw -> ciaddr.s_addr) {
4103 memset (&d1, 0,
sizeof d1);
4110 packet -> got_requested_address = 1;
4125 memset (&client_identifier, 0,
sizeof client_identifier);
4133 have_client_identifier = 1;
4138 client_identifier.
len,
MDL)) {
4144 #if defined (DEBUG_FIND_LEASE) 4146 log_info (
"Found host for client identifier: %s.",
4152 host_reference (&host, hp,
MDL);
4153 host_dereference (&hp,
MDL);
4157 client_identifier.
len,
MDL);
4162 if (!fixed_lease && !host) {
4169 host_dereference (&host,
MDL);
4170 host_reference (&host, hp,
MDL);
4171 host_dereference (&hp,
MDL);
4173 #if defined (DEBUG_FIND_LEASE) 4175 log_info (
"Found host for link address: %s.",
4184 if (!fixed_lease && !host) {
4189 host_dereference(&host,
MDL);
4190 host_reference(&host, hp,
MDL);
4191 host_dereference(&hp,
MDL);
4193 #if defined (DEBUG_FIND_LEASE) 4195 log_info (
"Found host via host-identifier");
4210 strcpy (dhcp_message,
"requested address is incorrect");
4211 #if defined (DEBUG_FIND_LEASE) 4212 log_info (
"Client's fixed-address %s doesn't match %s%s",
4231 #if defined (DEBUG_FIND_LEASE) 4232 log_info (
"trying next lease matching client id: %s",
4236 #if defined (FAILOVER_PROTOCOL) 4248 #if defined (DEBUG_FIND_LEASE) 4249 log_info(
"not active or not mine to allocate: %s",
4257 #if defined (DEBUG_FIND_LEASE) 4258 log_info (
"wrong network segment: %s",
4271 #if defined (DEBUG_FIND_LEASE) 4276 if (uid_lease -> n_uid)
4277 lease_reference (&
next,
4278 uid_lease -> n_uid,
MDL);
4281 lease_dereference (&uid_lease,
MDL);
4283 lease_reference (&uid_lease,
next,
MDL);
4284 lease_dereference (&
next,
MDL);
4290 #if defined (DEBUG_FIND_LEASE) 4292 log_info (
"Found lease for client id: %s.",
4308 #if defined (DEBUG_FIND_LEASE) 4309 log_info (
"trying next lease matching hw addr: %s",
4312 #if defined (FAILOVER_PROTOCOL) 4325 #if defined (DEBUG_FIND_LEASE) 4326 log_info(
"not active or not mine to allocate: %s",
4339 if (hw_lease -> binding_state !=
FTS_FREE &&
4342 (!have_client_identifier ||
4343 hw_lease -> uid_len != client_identifier.
len ||
4344 memcmp (hw_lease -> uid, client_identifier.
data,
4345 hw_lease -> uid_len))) {
4346 #if defined (DEBUG_FIND_LEASE) 4347 log_info (
"wrong client identifier: %s",
4353 #if defined (DEBUG_FIND_LEASE) 4354 log_info (
"wrong network segment: %s",
4363 #if defined (DEBUG_FIND_LEASE) 4367 if (!
packet -> raw -> ciaddr.s_addr)
4370 if (hw_lease -> n_hw)
4371 lease_reference (&
next, hw_lease -> n_hw,
MDL);
4372 lease_dereference (&hw_lease,
MDL);
4374 lease_reference (&hw_lease,
next,
MDL);
4375 lease_dereference (&
next,
MDL);
4381 #if defined (DEBUG_FIND_LEASE) 4383 log_info (
"Found lease for hardware address: %s.",
4390 lease_reference (&ip_lease, ip_lease_in,
MDL);
4394 #if defined (DEBUG_FIND_LEASE) 4396 log_info (
"Found lease for requested address: %s.",
4403 if (ip_lease && ours)
4416 #if defined (DEBUG_FIND_LEASE) 4417 log_info (
"...but it was on the wrong shared network.");
4419 strcpy (dhcp_message,
"requested address on bad subnet");
4420 lease_dereference (&ip_lease,
MDL);
4434 (!have_client_identifier ||
4435 ip_lease -> uid_len != client_identifier.
len ||
4436 memcmp (ip_lease -> uid, client_identifier.
data,
4437 ip_lease -> uid_len)) :
4438 (ip_lease -> hardware_addr.hbuf [0] !=
packet -> raw -> htype ||
4439 ip_lease -> hardware_addr.hlen !=
packet -> raw -> hlen + 1 ||
4440 memcmp (&ip_lease -> hardware_addr.hbuf [1],
4442 (
unsigned)(ip_lease -> hardware_addr.hlen - 1))))) {
4451 if (ip_lease -> binding_state !=
FTS_FREE &&
4453 #if defined (DEBUG_FIND_LEASE) 4454 log_info (
"rejecting lease for requested address.");
4458 if (ours && ip_lease -> binding_state !=
FTS_ACTIVE)
4460 lease_dereference (&ip_lease,
MDL);
4468 if (ip_lease && (uid_lease || hw_lease) &&
4475 #if defined (DEBUG_FIND_LEASE) 4476 log_info(
"ip lease not active or not ours to offer.");
4478 lease_dereference(&ip_lease,
MDL);
4485 ip_lease->
uid && ip_lease != uid_lease) {
4486 if (have_client_identifier &&
4487 (ip_lease -> uid_len == client_identifier.
len) &&
4488 !memcmp (client_identifier.
data,
4489 ip_lease -> uid, ip_lease -> uid_len)) {
4492 log_error (
"client %s has duplicate%s on %s",
4503 !
packet -> raw -> ciaddr.s_addr &&
4509 lease_dereference (&uid_lease,
MDL);
4510 lease_reference (&uid_lease, ip_lease,
MDL);
4518 lease_dereference (&fixed_lease,
MDL);
4520 log_error (
"Dynamic and static leases present for %s.",
4522 log_error (
"Remove host declaration %s or remove %s",
4523 (fixed_lease && fixed_lease -> host
4524 ? (fixed_lease -> host -> name
4525 ? fixed_lease -> host -> name
4529 log_error (
"from the dynamic address pool for %s",
4533 lease_dereference (&ip_lease,
MDL);
4534 strcpy (dhcp_message,
4535 "database conflict - call for help!");
4538 if (ip_lease && ip_lease != uid_lease) {
4539 #if defined (DEBUG_FIND_LEASE) 4540 log_info (
"requested address not available.");
4542 lease_dereference (&ip_lease,
MDL);
4552 if (hw_lease && hw_lease == uid_lease) {
4553 #if defined (DEBUG_FIND_LEASE) 4554 log_info (
"hardware lease and uid lease are identical.");
4556 lease_dereference (&hw_lease,
MDL);
4558 if (ip_lease && ip_lease == hw_lease) {
4559 lease_dereference (&hw_lease,
MDL);
4560 #if defined (DEBUG_FIND_LEASE) 4561 log_info (
"hardware lease and ip lease are identical.");
4564 if (ip_lease && ip_lease == uid_lease) {
4565 lease_dereference (&uid_lease,
MDL);
4566 #if defined (DEBUG_FIND_LEASE) 4567 log_info (
"uid lease and ip lease are identical.");
4581 lease_dereference (&ip_lease,
MDL);
4589 if (!
packet -> raw -> ciaddr.s_addr)
4591 lease_dereference (&uid_lease,
MDL);
4599 if (!
packet -> raw -> ciaddr.s_addr)
4601 lease_dereference (&hw_lease,
MDL);
4608 strcpy (dhcp_message,
"requested address not available");
4615 !ip_lease && !fixed_lease) {
4616 #if defined (DEBUG_FIND_LEASE) 4617 log_info (
"no applicable lease found for DHCPREQUEST.");
4625 lease_reference (&
lease, fixed_lease,
MDL);
4626 lease_dereference (&fixed_lease,
MDL);
4627 #if defined (DEBUG_FIND_LEASE) 4628 log_info (
"choosing fixed address.");
4636 if (!
packet -> raw -> ciaddr.s_addr)
4638 #if defined (DEBUG_FIND_LEASE) 4639 log_info (
"not choosing requested address (!).");
4641 lease_dereference (&ip_lease,
MDL);
4643 #if defined (DEBUG_FIND_LEASE) 4644 log_info (
"choosing lease on requested address.");
4646 lease_reference (&
lease, ip_lease,
MDL);
4648 host_dereference (&
lease -> host,
MDL);
4657 log_error(
"uid lease %s for client %s is duplicate " 4663 if (!
packet -> raw -> ciaddr.s_addr &&
4667 #if defined (DEBUG_FIND_LEASE) 4668 log_info (
"not choosing uid lease.");
4671 lease_reference (&
lease, uid_lease,
MDL);
4673 host_dereference (&
lease -> host,
MDL);
4674 #if defined (DEBUG_FIND_LEASE) 4678 lease_dereference (&uid_lease,
MDL);
4684 #if defined (DEBUG_FIND_LEASE) 4685 log_info (
"not choosing hardware lease.");
4692 if (!hw_lease -> uid_len ||
4693 (have_client_identifier
4694 ? (hw_lease -> uid_len ==
4695 client_identifier.
len &&
4696 !memcmp (hw_lease -> uid,
4697 client_identifier.
data,
4698 client_identifier.
len))
4699 :
packet -> packet_type == 0)) {
4700 lease_reference (&
lease, hw_lease,
MDL);
4702 host_dereference (&
lease -> host,
MDL);
4703 #if defined (DEBUG_FIND_LEASE) 4704 log_info (
"choosing hardware lease.");
4707 #if defined (DEBUG_FIND_LEASE) 4708 log_info (
"not choosing hardware lease: %s.",
4713 lease_dereference (&hw_lease,
MDL);
4726 host_reference(&p, host,
MDL);
4747 host_dereference(&p,
MDL);
4752 host_dereference(&p,
MDL);
4754 host_reference(&p, n,
MDL);
4755 host_dereference(&n,
MDL);
4766 lease == ip_lease &&
4768 log_error (
"Reclaiming REQUESTed abandoned IP address %s.",
4781 if (have_client_identifier)
4785 lease_dereference (&fixed_lease,
MDL);
4787 lease_dereference (&hw_lease,
MDL);
4789 lease_dereference (&uid_lease,
MDL);
4791 lease_dereference (&ip_lease,
MDL);
4793 host_dereference (&host,
MDL);
4796 #if defined (DEBUG_FIND_LEASE) 4804 #if defined (DEBUG_FIND_LEASE) 4805 log_info (
"Not returning a lease.");
4820 if (lease_allocate (&
lease,
MDL) != ISC_R_SUCCESS)
4822 if (host_reference (&rhp, hp,
MDL) != ISC_R_SUCCESS) {
4829 host_dereference (&rhp,
MDL);
4832 host_reference (&
lease -> host, rhp,
MDL);
4837 if (!
lease -> uid) {
4839 host_dereference (&rhp,
MDL);
4853 host_dereference (&rhp,
MDL);
4865 struct pool *
pool,
int *peer_has_leases)
4868 struct lease *candl = NULL;
4871 if ((
pool -> prohibit_list &&
4873 (
pool -> permit_list &&
4877 #if defined (FAILOVER_PROTOCOL) 4893 struct lease *peerl = NULL;
4904 if (peerl != NULL) {
4905 if (((candl == NULL) ||
4910 *peer_has_leases = 1;
4917 if (peerl != NULL) {
4918 if (((candl == NULL) ||
4923 *peer_has_leases = 1;
4930 if ((candl == NULL) && (peerl != NULL) &&
4976 (candl -> ends < lease ->
ends))) {
4984 (candl -> ends < lease ->
ends))) {
4990 if (candl -> ends < lease ->
ends)
4994 if (
lease != NULL) {
4996 log_error(
"Reclaiming abandoned lease %s.",
5005 log_debug(
"soft impossible condition (%s:%d): stale " 5006 "host \"%s\" found on lease %s",
MDL,
5025 struct permit *permit_list;
5030 for (p = permit_list; p; p = p ->
next) {
5031 switch (p ->
type) {
5043 if (
packet -> authenticated)
5048 if (!
packet -> authenticated)
5056 if (!
packet -> options_valid ||
5062 for (i = 0; i <
packet -> class_count; i++) {
5063 if (p ->
class ==
packet -> classes [i])
5065 if (
packet -> classes [i] &&
5066 packet -> classes [i] -> superclass &&
5067 (
packet -> classes [i] -> superclass ==
5082 #if defined(DHCPv6) && defined(DHCP4o6) 5083 static int locate_network6 (
packet)
5086 const struct packet *chk_packet;
5087 const struct in6_addr *link_addr, *first_link_addr;
5159 first_link_addr = NULL;
5161 while (chk_packet != NULL) {
5163 if (!IN6_IS_ADDR_UNSPECIFIED(link_addr) &&
5164 !IN6_IS_ADDR_LINKLOCAL(link_addr)) {
5165 first_link_addr = link_addr;
5174 if (first_link_addr != NULL) {
5175 ia.len =
sizeof(*first_link_addr);
5176 memcpy(ia.iabuf, first_link_addr,
sizeof(*first_link_addr));
5202 log_error(
"No interface and no link address " 5203 "can't determine DHCP4o6 shared network");
5217 #if defined(DHCPv6) && defined(DHCP4o6) 5219 return (locate_network6 (
packet));
5237 struct in_addr any_addr;
5238 any_addr.s_addr = INADDR_ANY;
5240 if (!
packet -> packet_type && memcmp(&
packet -> raw -> ciaddr, &any_addr, 4)) {
5261 memset (&data, 0,
sizeof data);
5269 if (data.
len == 0) {
5272 if (data.
len != 4) {
5337 unsigned option_num;
5340 struct in_addr *a = NULL;
5341 isc_boolean_t found = ISC_FALSE;
5344 memset(&d, 0,
sizeof(d));
5345 memset(from, 0,
sizeof(*from));
5353 if (d.
len ==
sizeof(*from)) {
5355 memcpy(from, d.
data,
sizeof(*from));
5361 if ((out_options != NULL) &&
5362 (options != out_options)) {
5372 if ((found == ISC_FALSE) &&
5376 if (out_options != NULL) {
5384 (
unsigned char *)a,
sizeof(*a),
5385 0, allocate,
MDL)) {
5386 option_code_hash_lookup(&oc->
option,
5388 &option_num, 0,
MDL);
5421 struct group *network_group) {
5423 if (*network_options == NULL) {
5459 }
else if (network_group != NULL) {
5483 find_min_site_code(
struct universe *u)
5493 site_code_min = 224;
5494 option_code_hash_foreach(u->
code_hash, lowest_site_code);
5496 if (site_code_min < 224) {
5497 log_error(
"WARNING: site-local option codes less than 224 have " 5498 "been deprecated by RFC3942. You have options " 5499 "listed in site local space %s that number as low as " 5500 "%d. Please investigate if these should be declared " 5501 "as regular options rather than site-local options, " 5502 "or migrated up past 224.",
5503 u->
name, site_code_min);
5510 if (site_code_min < 128)
5511 site_code_min = 128;
5520 return site_code_min;
5524 lowest_site_code(
const void *key,
unsigned len,
void *
object)
5531 return ISC_R_SUCCESS;
5597 option_code_hash_lookup(&oc->
option,
5644 struct lease* new_lease,
5659 (new_lease->
ddns_cb == NULL) &&
5678 if (d1.
len == 1 && (d1.
data[0] < 100))
5679 thresh = d1.
data[0];
5687 int lease_length = 0;
5692 if (lease_length <= (INT_MAX / thresh))
5693 limit = lease_length * thresh / 100;
5695 limit = lease_length / 100 * thresh;
5701 if (lease_age <= limit) {
5706 if (new_lease->
scope != NULL) {
5725 log_debug(
"reuse_lease: lease age %ld (secs)" 5726 " under %d%% threshold, reply with " 5727 "unaltered, existing lease for %s",
5764 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_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