34static void maybe_return_agent_options(
struct packet *
packet,
39 int offer,
int* same_client);
45#if defined(DHCPv6) && defined(DHCP4o6)
51#if defined(DELAYED_ACK)
52static void delayed_ack_enqueue(
struct lease *);
53static void delayed_acks_timer(
void *);
56struct leasequeue *ackqueue_head, *ackqueue_tail;
58static struct timeval max_fsync;
67static char dhcp_message [256];
68static int site_code_min;
70static int find_min_site_code(
struct universe *);
71static isc_result_t lowest_site_code(
const void *,
unsigned,
void *);
73static const char *dhcp_type_names [] = {
84 "DHCPLEASEUNASSIGNED",
91# define send_packet trace_packet_send
94static TIME leaseTimeCheck(
TIME calculated,
TIME alternate);
103 memset (&client_identifier, 0,
sizeof client_identifier);
118 return "\"no client id\"";
146 errmsg =
"unknown network segment";
158#if defined(DHCPv6) && defined(DHCP4o6)
160 log_info(
"DHCP4o6 %s from %s via %s: %s", s,
165 :
"<no identifier>"),
172 log_info(
"%s from %s via %s: %s", s,
175 :
"<no identifier>"),
211 cip.
len =
sizeof packet -> raw -> ciaddr;
213 sizeof packet -> raw -> ciaddr);
228 if (
lease -> uid_len) {
238 memset (&data, 0,
sizeof data);
253 if ((
lease -> hardware_addr.hbuf [0] !=
254 packet -> raw -> htype) ||
255 (
lease -> hardware_addr.hlen - 1 !=
257 memcmp (&
lease -> hardware_addr.hbuf [1],
288 switch (
packet -> packet_type) {
322 errmsg =
"unknown packet type";
338 int peer_has_leases = 0;
339#if defined (FAILOVER_PROTOCOL)
340 dhcp_failover_state_t *peer;
344 0, &peer_has_leases, (
struct lease *)0,
MDL);
351 s =
"Hostname Unsuitable for Printing";
358#if defined(DHCPv6) && defined(DHCP4o6)
360 snprintf (msgbuf,
sizeof msgbuf,
361 "DHCP4o6 DHCPDISCOVER from %s %s%s%svia %s",
368 :
"<no identifier>")),
369 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
373 snprintf (msgbuf,
sizeof msgbuf,
"DHCPDISCOVER from %s %s%s%svia %s",
378 :
"<no identifier>")),
379 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
382 :
packet -> interface -> name);
386#if defined(DHCPv6) && defined(DHCP4o6)
388 log_info (
"DHCP4o6 packet from unknown subnet: %s",
392 log_info (
"Packet from unknown subnet: %s",
397#if defined (FAILOVER_PROTOCOL)
419#if defined (DEBUG_FIND_LEASE)
435 log_error (
"%s: peer holds all free leases",
438 log_error (
"%s: network %s: no free leases",
445#if defined (FAILOVER_PROTOCOL)
451 msgbuf, peer -> nrr);
455 peer = (dhcp_failover_state_t *)0;
460 if (peer_has_leases) {
461 log_debug (
"%s: load balance to peer %s",
462 msgbuf, peer -> name);
465 log_debug (
"%s: cancel load balance to peer %s - %s",
466 msgbuf, peer -> name,
"no free leases");
478 if (when < lease ->
ends)
491 struct lease *ip_lease;
503#if defined (FAILOVER_PROTOCOL)
504 dhcp_failover_state_t *peer;
506 int have_requested_addr = 0;
519 have_requested_addr = 1;
523 memcpy (cip.
iabuf, &
packet -> raw -> ciaddr.s_addr, 4);
540 s =
"Hostname Unsuitable for Printing";
546 memset (&data, 0,
sizeof data);
558 sprintf (smbuf,
" (%s)",
piaddr (sip));
567#if defined(DHCPv6) && defined(DHCP4o6)
569 snprintf (msgbuf,
sizeof msgbuf,
570 "DHCP4o6 DHCPREQUEST for %s%s from %s %s%s%svia %s",
578 :
"<no identifier>")),
579 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
583 snprintf (msgbuf,
sizeof msgbuf,
584 "DHCPREQUEST for %s%s from %s %s%s%svia %s",
590 :
"<no identifier>")),
591 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
594 :
packet -> interface -> name);
596#if defined (FAILOVER_PROTOCOL)
602 msgbuf, peer -> nrr);
627 log_debug (
"%s: lease owned by peer", msgbuf);
641 log_debug(
"%s: lease in transition state %s", msgbuf,
643 ?
"released" :
"expired");
652 log_debug (
"%s: lease reset by administrator", msgbuf);
666 (memcmp(sip.
iabuf,
"\0\0\0\0", sip.
len) != 0)) {
674 if (memcmp(sip.
iabuf, &from, sip.
len) != 0) {
675 log_debug(
"%s: not our server id", msgbuf);
704 peer = (dhcp_failover_state_t *)0;
750 (
packet -> raw -> ciaddr.s_addr &&
752 (have_requested_addr && !
packet -> raw -> ciaddr.s_addr)) {
759 log_info (
"%s: wrong network.", msgbuf);
764 log_info (
"%s: ignored (%s).", msgbuf,
766 ?
"not authoritative" :
"unknown subnet"));
778 log_info (
"%s: wrong network.", msgbuf);
782 log_info (
"%s: ignored (not authoritative).", msgbuf);
789 if (!
lease && ours) {
819 char msgbuf [1024], cstr[16];
827 log_info (
"DHCPRELEASE from %s specified requested-address.",
849 lease_reference (&next,
lease -> n_uid,
MDL);
850 if (!memcmp (&
packet -> raw -> ciaddr,
856 lease_reference (&
lease, next,
MDL);
857 lease_dereference (&next,
MDL);
861 lease_dereference (&next,
MDL);
876 (
lease -> hardware_addr.hlen !=
packet -> raw -> hlen + 1 ||
877 lease -> hardware_addr.hbuf [0] !=
packet -> raw -> htype ||
878 memcmp (&
lease -> hardware_addr.hbuf [1],
883 if ((strlen (
lease -> client_hostname) <= 64) &&
885 s =
lease -> client_hostname;
887 s =
"Hostname Unsuitable for Printing";
895 strncpy(cstr, inet_ntoa (
packet -> raw -> ciaddr), 15);
901#if defined(DHCPv6) && defined(DHCP4o6)
903 snprintf (msgbuf,
sizeof msgbuf,
904 "DHCP4o6 DHCPRELEASE of %s from %s %s%s%svia "
913 :
"<no identifier>")),
914 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
916 lease ?
"" :
"not ");
919 snprintf (msgbuf,
sizeof msgbuf,
920 "DHCPRELEASE of %s from %s %s%s%svia %s (%sfound)",
926 :
"<no identifier>")),
927 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
930 :
packet -> interface -> name,
931 lease ?
"" :
"not ");
933#if defined (FAILOVER_PROTOCOL)
935 dhcp_failover_state_t *peer =
lease ->
pool -> failover_peer;
939 peer -> name, peer -> nrr);
957#if defined(FAILOVER_PROTOCOL)
997 if ((strlen (
lease -> client_hostname) <= 64) &&
999 s =
lease -> client_hostname;
1001 s =
"Hostname Unsuitable for Printing";
1008#if defined(DHCPv6) && defined(DHCP4o6)
1010 snprintf (msgbuf,
sizeof msgbuf,
1011 "DHCP4o6 DHCPDECLINE of %s from %s %s%s%svia %s",
1019 :
"<no identifier>")),
1020 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
1024 snprintf (msgbuf,
sizeof msgbuf,
1025 "DHCPDECLINE of %s from %s %s%s%svia %s",
1031 :
"<no identifier>")),
1032 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
1035 :
packet -> interface -> name);
1048 for (i =
packet -> class_count; i > 0; i--) {
1060 packet -> options, options,
1064#if defined (FAILOVER_PROTOCOL)
1066 dhcp_failover_state_t *peer =
1072 peer -> name, peer -> nrr);
1084 status =
"abandoned";
1086 status =
"not found";
1092 log_info (
"%s: %s", msgbuf, status);
1094#if defined(FAILOVER_PROTOCOL)
1103#if defined(RELAY_PORT)
1121 char msgbuf[1024], *addr_type;
1129 struct iaddr cip, gip, sip;
1132 struct sockaddr_in to;
1133 struct in_addr from;
1136 int result, h_m_client_ip = 0;
1137 struct host_decl *host = NULL, *hp = NULL, *h;
1138#if defined(RELAY_PORT)
1141#if defined (DEBUG_INFORM_HOST)
1142 int h_w_fixed_addr = 0;
1155 addr_type =
"source";
1158 memset(cip.
iabuf, 0, 4);
1165 addr_type =
"client";
1174 addr_type =
"relay";
1183#if defined(DHCPv6) && defined(DHCP4o6)
1185 snprintf(msgbuf,
sizeof(msgbuf),
1186 "DHCP4o6 DHCPINFORM from %s via %s",
1191 snprintf(msgbuf,
sizeof(msgbuf),
"DHCPINFORM from %s via %s",
1198 if (!memcmp(cip.
iabuf,
"\0\0\0", 4)) {
1199 log_info(
"%s: ignored (null source address).", msgbuf);
1203#if defined(RELAY_PORT)
1218 memset(&d1, 0,
sizeof d1);
1225 log_info(
"%s: ignored (invalid subnet selection option).", msgbuf);
1248 if ((zeroed_ciaddr ==
ISC_TRUE) && (gip.
len != 0))
1249 addr_type =
"relay link select";
1251 addr_type =
"selected";
1257 log_info(
"%s: unknown subnet for %s address %s",
1258 msgbuf, addr_type,
piaddr(sip));
1269 log_info(
"%s: not authoritative for subnet %s",
1272 log_info(
"If this DHCP server is authoritative for%s",
1274 log_info(
"please write an `authoritative;' directi%s",
1275 "ve either in the");
1276 log_info(
"subnet declaration or in some scope that%s",
1278 log_info(
"subnet declaration - for example, write %s",
1280 log_info(
"of the dhcpd.conf file.");
1289 memset(&outgoing, 0,
sizeof outgoing);
1290 memset(&raw, 0,
sizeof raw);
1291 outgoing.
raw = &raw;
1293 maybe_return_agent_options(
packet, options);
1303 struct lease* cip_lease = NULL;
1311 NULL,
packet, NULL, NULL,
1319 lease_dereference (&cip_lease,
MDL);
1351 memset(&d1, 0,
sizeof(d1));
1359#if defined (DEBUG_INFORM_HOST)
1361 log_debug (
"dhcpinform: found host by ID "
1362 "-- checking fixed-address match");
1366 for (h = hp; !h_m_client_ip && h; h = h->n_ipaddr) {
1370 memset(&fixed_addr, 0,
sizeof(fixed_addr));
1372 NULL, NULL, NULL, NULL,
1374 h->fixed_addr,
MDL))
1377#if defined (DEBUG_INFORM_HOST)
1381 (i + cip.
len) <= fixed_addr.
len;
1383 if (memcmp(fixed_addr.
data + i,
1385#if defined (DEBUG_INFORM_HOST)
1387 "host with matching "
1388 "fixed-address by ID");
1390 host_reference(&
host, h,
MDL);
1403#if defined (DEBUG_INFORM_HOST)
1405 "without fixed-address by ID");
1407 host_reference(&
host, h,
MDL);
1411 host_dereference (&hp,
MDL);
1413 if (!
host || !h_m_client_ip) {
1418#if defined (DEBUG_INFORM_HOST)
1420 log_debug (
"dhcpinform: found host by HW "
1421 "-- checking fixed-address match");
1426 for (h = hp; !h_m_client_ip && h; h = h->n_ipaddr) {
1430 memset (&fixed_addr, 0,
sizeof(fixed_addr));
1432 NULL, NULL, NULL, NULL,
1434 h->fixed_addr,
MDL))
1437#if defined (DEBUG_INFORM_HOST)
1441 (i + cip.
len) <= fixed_addr.
len;
1443 if (memcmp(fixed_addr.
data + i,
1445#if defined (DEBUG_INFORM_HOST)
1447 "host with matching "
1448 "fixed-address by HW");
1457 host_reference(&
host, h,
MDL);
1469#if defined (DEBUG_INFORM_HOST)
1470 log_debug (
"dhcpinform: found host without "
1471 "fixed-address by HW");
1473 host_reference (&
host, h,
MDL);
1478 host_dereference (&hp,
MDL);
1481#if defined (DEBUG_INFORM_HOST)
1486 if (h_w_fixed_addr && !h_m_client_ip) {
1487 log_info (
"dhcpinform: matching host with "
1488 "fixed-address different than "
1489 "client IP detected?!");
1497#if defined (DEBUG_INFORM_HOST)
1498 log_info (
"dhcpinform: applying host (group) options");
1505 host_dereference (&
host,
MDL);
1511 memset (&d1, 0,
sizeof d1);
1519 if (i >=
sizeof(raw.
file)) {
1520 log_info(
"file name longer than packet field "
1521 "truncated - field: %lu name: %d %.*s",
1522 (
unsigned long)
sizeof(raw.
file), i,
1524 i =
sizeof(raw.
file);
1539 if (i >=
sizeof(raw.
sname)) {
1540 log_info(
"server name longer than packet field "
1541 "truncated - field: %lu name: %d %.*s",
1542 (
unsigned long)
sizeof(raw.
sname), i,
1544 i =
sizeof(raw.
sname);
1566 option_code_hash_lookup(&oc->
option,
1586 option_code_hash_lookup(&oc->
option,
1601 packet -> options, options,
1606 (
const char *)d1.
data, d1.
len,
1616 options -> site_universe = u ->
index;
1621 options -> site_code_min = 0;
1624 memset (&prl, 0,
sizeof prl);
1641 packet -> options, options,
1656 packet -> options, options,
1705#if defined(DHCPv6) && defined(DHCP4o6)
1708 snprintf(msgbuf,
sizeof msgbuf,
1709 "DHCP4o6 DHCPACK to %s (%s) via",
piaddr(cip),
1713 "<no client hardware address>");
1721 log_fatal(
"No memory to store DHCP4o6 reply.");
1736 to.sin_family = AF_INET;
1738 to.sin_len =
sizeof to;
1740 memset (to.sin_zero, 0,
sizeof to.sin_zero);
1761 memcpy(&to.sin_addr, gip.
iabuf, 4);
1762#if defined(RELAY_PORT)
1770 memcpy(&to.sin_addr, cip.
iabuf, 4);
1775 snprintf(msgbuf,
sizeof msgbuf,
"DHCPACK to %s (%s) via",
piaddr(cip),
1778 "<no client hardware address>");
1786 outgoing.packet_length, from, &to, NULL);
1788 log_error ("%s:%d: Failed to send %d byte long packet over %s "
1789 "interface.", MDL, outgoing.packet_length,
1795 subnet_dereference (&subnet, MDL);
1813 struct
group *network_group;
1815 struct sockaddr_in to;
1816 struct in_addr from;
1822#if defined(RELAY_PORT)
1830 memset (&outgoing, 0,
sizeof outgoing);
1831 memset (&raw, 0,
sizeof raw);
1832 outgoing.
raw = &raw;
1836 log_error (
"No memory for DHCPNAK message type.");
1842 log_error (
"No memory for expr_const expression.");
1853#if defined(RELAY_PORT)
1859 log_error (
"No memory for DHCPNAK message type.");
1864 (
unsigned char *)dhcp_message,
1865 strlen (dhcp_message), 1, 0,
MDL)) {
1866 log_error (
"No memory for expr_const expression.");
1882#if defined(SERVER_ID_FOR_NAK)
1950#if defined(DHCPv6) && defined(DHCP4o6)
1952 log_info (
"DHCP4o6 DHCPNAK on %s to %s via %s",
1956 packet -> raw -> chaddr),
1960 log_info (
"DHCPNAK on %s to %s via %s",
1965 :
packet -> interface -> name);
1974#if defined(DHCPv6) && defined(DHCP4o6)
1981 log_fatal(
"No memory to store DHCP4o6 reply.");
1992 to.sin_family = AF_INET;
1994 to.sin_len =
sizeof to;
1996 memset (to.sin_zero, 0,
sizeof to.sin_zero);
2001 to.sin_addr = raw.
giaddr;
2002 if (raw.
giaddr.s_addr != htonl (INADDR_LOOPBACK))
2003#if defined(RELAY_PORT)
2016 log_error (
"%s:%d: Failed to send %d byte long "
2017 "packet over %s interface.",
MDL,
2033 log_error (
"%s:%d: Failed to send %d byte long packet over %s "
2082 memset(&client_id, 0,
sizeof client_id);
2095 option_code_hash_lookup(&oc->
option,
2117 int used, count, high_threshold, poolhigh = 0, poollow = 0;
2118 char *shared_name =
"no name";
2146 log_error(
"Pool threshold reset - shared subnet: %s; "
2147 "address: %s; low threshold %d/%d.",
2163 if ((poolhigh <= 0) || (poolhigh > 100)) {
2170 if (used < high_threshold) {
2176 log_error(
"Pool threshold exceeded - shared subnet: %s; "
2177 "address: %s; high threshold %d%% %d/%d.",
2179 poolhigh, used, count);
2195 if (poollow < poolhigh) {
2215 TIME offered_lease_time;
2217 TIME min_lease_time;
2221 isc_result_t result;
2223 struct in_addr from;
2224 TIME remaining_time;
2226#if defined(DELAYED_ACK)
2230 int use_old_lease = 0;
2231 int same_client = 0;
2246 host_reference (&host, hp,
MDL);
2247 else if (
lease -> host)
2248 host_reference (&host,
lease -> host,
MDL);
2253 log_fatal (
"unable to allocate lease state!");
2254 state -> got_requested_address =
packet -> got_requested_address;
2261 state -> got_server_identifier = 1;
2301 for (i =
packet -> class_count; i > 0; i--) {
2327 state -> options, &
lease -> scope,
2332 seek = (
struct lease *)0;
2338 lease_dereference (&seek,
MDL);
2349 if (seek !=
lease &&
2356 lease_dereference (&seek,
MDL);
2358 lease_reference (&seek,
next,
MDL);
2359 lease_dereference (&
next,
MDL);
2363 lease_dereference (&
next,
MDL);
2366 lease_dereference (&seek,
MDL);
2373 !
host -> client_identifier.len &&
2383 seek = (
struct lease *)0;
2390 lease_dereference (&seek,
MDL);
2397 if (seek !=
lease &&
2404 lease_dereference (&seek,
MDL);
2406 lease_reference (&seek,
next,
MDL);
2407 lease_dereference (&
next,
MDL);
2411 lease_dereference (&
next,
MDL);
2414 lease_dereference (&seek,
MDL);
2424 memset (&d1, 0,
sizeof d1);
2433 ntohs (
packet -> raw -> secs) < d1.
data [0]) {
2434 log_info(
"%s: configured min-secs value (%d) "
2435 "is greater than secs field (%d). "
2436 "message dropped.", msg, d1.
data[0],
2441 host_dereference (&
host,
MDL);
2467 packet -> options, state -> options,
2471 for (h = hp; h; h = h ->
n_ipaddr) {
2476 host_reference (&host, h,
MDL);
2478 host_dereference(&hp,
MDL);
2486 for (h = hp; h; h = h ->
n_ipaddr) {
2491 host_reference (&host, h,
MDL);
2493 host_dereference(&hp,
MDL);
2498 for (h = hp; h; h = h ->
n_ipaddr) {
2503 host_reference (&host, h,
MDL);
2505 host_dereference(&hp,
MDL);
2532 log_info (
"%s: unknown client", msg);
2535 host_dereference (&host,
MDL);
2550 log_info (
"%s: bootp disallowed", msg);
2553 host_dereference (&host,
MDL);
2568 log_info (
"%s: booting disallowed", msg);
2571 host_dereference (&host,
MDL);
2580 if (
lease -> billing_class) {
2581 for (i = 0; i <
packet -> class_count; i++)
2582 if (
packet -> classes [i] ==
2583 lease -> billing_class)
2585 if (i ==
packet -> class_count) {
2613 cname = billclass->
name;
2617 log_info(
"%s: no available billing: lease "
2618 "limit reached in all matching "
2619 "classes (last: '%s')", msg, cname);
2622 host_dereference(&host,
MDL);
2652 packet -> options, state -> options,
2661 packet -> options, state -> options,
2667 lt = (
struct lease *)0;
2668 result = lease_allocate (<,
MDL);
2670 log_info (
"%s: can't allocate temporary lease structure: %s",
2671 msg, isc_result_totext (result));
2674 host_dereference (&
host,
MDL);
2698 if (d1.
len == sizeof (u_int32_t))
2715 if (s1 && (d1.
len == 4)) {
2716 u_int32_t ones = 0xffffffff;
2742 if ((memcmp(d1.
data, &ones, 4) == 0) &&
2753 "reservation made on %s.",
2773 if (d1.
len == sizeof (u_int32_t))
2796 if (d1.
len == sizeof (u_int32_t))
2806 memset(&d1, 0,
sizeof(d1));
2813 if (d1.
len == 1 && d1.
data[0] > 0 &&
2816 int poolfilled, total, count;
2819 adaptive_time = min_lease_time;
2831 poolfilled = (total > (INT_MAX / 100)) ?
2832 total / (count / 100) :
2833 (total * 100) / count;
2835 log_debug(
"Adap-lease: Total: %d, Free: %d, "
2836 "Ends: %d, Adaptive: %d, Fill: %d, "
2841 (
int)adaptive_time, poolfilled,
2844 if (poolfilled >= d1.
data[0] &&
2845 lease_time > adaptive_time) {
2846 log_info(
"Pool over threshold, time "
2847 "for %s reduced from %d to "
2850 (
int)adaptive_time);
2852 lease_time = adaptive_time;
2874 lease_dereference (<,
MDL);
2876 host_dereference (&
host,
MDL);
2904 lease_dereference (<,
MDL);
2906 host_dereference (&
host,
MDL);
2910 if (lease_time > remaining_time)
2911 lease_time = remaining_time;
2914 if (lease_time < min_lease_time) {
2916 lease_time = min_lease_time;
2922#if defined (FAILOVER_PROTOCOL)
2926 TIME new_lease_time = lease_time;
2927 dhcp_failover_state_t *peer =
2937 if (lease_time > peer->mclt) {
2945 new_lease_time = peer->mclt;
2947 (lt->
tsfp + peer->mclt))
2966 + (new_lease_time / 2)),
2981 lease_time = new_lease_time;
2991 = leaseTimeCheck(
cur_time + lease_time,
3018 if (d1.
len == sizeof (u_int32_t))
3031 if (d1.
len == sizeof (u_int32_t))
3069 unsigned char *tuid;
3086 host_dereference (&
host,
MDL);
3171 }
else if (oc && s1) {
3174 log_error (
"no memory for client hostname.");
3188 sizeof packet -> raw -> chaddr);
3196 log_debug (
"Cannot reuse: lease is changing to RESERVED");
3215 if ((!offer || offer ==
DHCPACK) &&
3235 sizeof packet -> raw -> chaddr);
3237 int commit = (!offer || (offer ==
DHCPACK));
3243 if (use_old_lease == 1) {
3247#if !defined(DELAYED_ACK)
3256 if ((use_old_lease == 0) &&
3276 if ((use_old_lease == 0) &&
3278 !offer || offer ==
DHCPACK, 0, 0)) {
3280 log_info (
"%s: database update failed", msg);
3282 lease_dereference (<,
MDL);
3286 lease_dereference (<,
MDL);
3298 state -> offer = offer;
3319 if (d1.
len == sizeof (u_int16_t))
3330 if (d1.
len == sizeof (u_int16_t))
3331 state -> max_message_size =
3362 if (state -> offer) {
3367 &state -> offer, 1, 0, 0,
MDL)) {
3368 option_code_hash_lookup(&oc->
option,
3372 state -> options, oc);
3379 memcpy(state->
from.
iabuf, &from,
sizeof(from));
3380 state->
from.
len =
sizeof(from);
3382 offered_lease_time =
3383 state -> offered_expiry -
cur_time;
3391 option_code_hash_lookup(&oc->
option,
3395 state -> options, oc);
3413 if (rebind_time >= offered_lease_time)
3417 offered_lease_time = rebind_time;
3435 if (state ->
ip -> address_count) {
3437 sizeof state ->
ip -> addresses [0];
3438 memcpy (state -> from.iabuf,
3439 &state ->
ip -> addresses [0],
3445 memset (&state -> siaddr, 0,
sizeof state -> siaddr);
3451 packet -> options, state -> options,
3456 memcpy (&state -> siaddr, d1.
data, 4);
3471 option_code_hash_lookup(&oc->
option,
3475 state -> options, oc);
3503 h = gethostbyaddr ((
char *)&ia,
sizeof ia, AF_INET);
3505 log_error (
"No hostname for %s", inet_ntoa (ia));
3512 strlen (h -> h_name) + 1,
3514 option_code_hash_lookup(&oc->
option,
3518 state -> options, oc);
3531 packet -> options, state -> options, &
lease -> scope,
3543 option_code_hash_lookup(&oc->
option,
3547 state -> options, oc);
3560 packet -> options, state -> options,
3565 (
const char *)d1.
data, d1.
len,
3572 state -> options -> site_universe = u ->
index;
3576 state -> options -> site_code_min = 0;
3594 packet -> options, state -> options,
3602 lease -> state = state;
3612 do_ping_check(
packet, state,
lease, original_cltt, same_client)) {
3616#if defined(DELAYED_ACK)
3618 delayed_ack_enqueue(
lease);
3676 if (same_client && original_cltt &&
3679 memset(&ds, 0,
sizeof(ds));
3686 if (ds.
len == sizeof (u_int32_t)) {
3694 if (
cur_time - original_cltt < cltt_secs) {
3703 memset(&ds, 0,
sizeof(ds));
3710 if (ds.
len == sizeof (u_int32_t)) {
3722 if (ds.
len == sizeof (u_int32_t)) {
3735 if (ping_timeout_ms > 0) {
3736 timeout_secs = ping_timeout_ms / 1000;
3737 timeout_ms = ping_timeout_ms % 1000;
3739 timeout_secs = ping_timeout;
3744 tv.tv_sec =
cur_tv.tv_sec + timeout_secs;
3745 tv.tv_usec =
cur_tv.tv_usec + (timeout_ms * 1000);
3748 log_debug (
"Pinging:%s, state: %d, same client? %s, "
3749 " orig_cltt %s, elasped: %ld, timeout in: %d.%d secs" ,
3752 (same_client ?
"y" :
"n"),
3753 (original_cltt ?
print_time(original_cltt) :
"0"),
3754 (original_cltt ? (
long)(
cur_time - original_cltt) : 0),
3755 timeout_secs, timeout_ms);
3766#if defined(DELAYED_ACK)
3784 if (free_ackqueue) {
3786 free_ackqueue = q->
next;
3791 log_fatal(
"delayed_ack_enqueue: no memory!");
3793 memset(q, 0,
sizeof *q);
3796 q->
next = ackqueue_head;
3807 delayed_acks_timer(NULL);
3809 struct timeval next_fsync;
3811 if (max_fsync.tv_sec == 0 && max_fsync.tv_usec == 0) {
3814 max_fsync.tv_usec =
cur_tv.tv_usec +
3817 if (max_fsync.tv_usec >= 1000000) {
3819 max_fsync.tv_usec -= 1000000;
3824 next_fsync.tv_sec =
cur_tv.tv_sec;
3825 next_fsync.tv_usec =
cur_tv.tv_usec + min_ack_delay_usecs;
3826 if (next_fsync.tv_usec >= 1000000) {
3827 next_fsync.tv_sec++;
3828 next_fsync.tv_usec -= 1000000;
3831 if ((next_fsync.tv_sec > max_fsync.tv_sec) ||
3832 ((next_fsync.tv_sec == max_fsync.tv_sec) &&
3833 (next_fsync.tv_usec > max_fsync.tv_usec))) {
3834 next_fsync.tv_sec = max_fsync.tv_sec;
3835 next_fsync.tv_usec = max_fsync.tv_usec;
3838 add_timeout(&next_fsync, delayed_acks_timer, NULL,
3849delayed_acks_timer(
void *foo)
3854 memset(&max_fsync, 0,
sizeof(max_fsync));
3856 if (!outstanding_acks) {
3871 for (ack = ackqueue_tail ; ack ; ack = p) {
3874#if defined(FAILOVER_PROTOCOL)
3878 dhcp_failover_state_t *fpeer;
3881 if (fpeer && fpeer->link_to_peer) {
3889 log_error(
"delayed ack for %s has gone stale",
3895 lease_dereference(&ack->
lease,
MDL);
3896 ack->
next = free_ackqueue;
3897 free_ackqueue = ack;
3900 ackqueue_head = NULL;
3901 ackqueue_tail = NULL;
3902 outstanding_acks = 0;
3905#if defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
3907relinquish_ackqueue(
void)
3911 for (q = ackqueue_head ; q ; q = n) {
3915 for (q = free_ackqueue ; q ; q = n) {
3928 unsigned packet_length;
3930 struct sockaddr_in to;
3931 struct in_addr from;
3935 int nulltp, bootpp, unicastp = 1;
3936#if defined(RELAY_PORT)
3943 log_fatal (
"dhcp_reply was supplied lease with no state!");
3946 memset (&raw, 0,
sizeof raw);
3947 memset (&d1, 0,
sizeof d1);
3951 if (state -> filename.len && state -> filename.data) {
3953 state -> filename.data,
3954 state -> filename.len >
sizeof raw.
file
3955 ?
sizeof raw.
file : state -> filename.len);
3956 if (
sizeof raw.
file > state -> filename.len)
3957 memset (&raw.
file [state -> filename.len], 0,
3958 (
sizeof raw.
file) - state -> filename.len);
3960 log_info(
"file name longer than packet field "
3961 "truncated - field: %lu name: %d %.*s",
3962 (
unsigned long)
sizeof(raw.
file),
3963 state->filename.len, (
int)state->filename.len,
3964 state->filename.data);
3970 if (state -> server_name.len && state -> server_name.data) {
3972 state -> server_name.data,
3973 state -> server_name.len >
sizeof raw.
sname
3974 ?
sizeof raw.
sname : state -> server_name.len);
3975 if (
sizeof raw.
sname > state -> server_name.len)
3976 memset (&raw.
sname [state -> server_name.len], 0,
3977 (
sizeof raw.
sname) - state -> server_name.len);
3979 log_info(
"server name longer than packet field "
3980 "truncated - field: %lu name: %d %.*s",
3981 (
unsigned long)
sizeof(raw.
sname),
3989 &
lease -> hardware_addr.hbuf [1],
sizeof raw.
chaddr);
3990 raw.
hlen =
lease -> hardware_addr.hlen - 1;
4009 state -> max_message_size,
4010 state ->
packet -> options,
4012 bufs, nulltp, bootpp,
4013 &state -> parameter_request_list,
4016 memcpy (&raw.
ciaddr, &state -> ciaddr,
sizeof raw.
ciaddr);
4018 raw.
siaddr = state -> siaddr;
4021 raw.
xid = state -> xid;
4022 raw.
secs = state -> secs;
4023 raw.
flags = state -> bootp_flags;
4024 raw.
hops = state -> hops;
4027 if (
lease -> client_hostname) {
4028 if ((strlen (
lease -> client_hostname) <= 64) &&
4030 s =
lease -> client_hostname;
4032 s =
"Hostname Unsuitable for Printing";
4041#if defined(DHCPv6) && defined(DHCP4o6)
4044 log_info (
"DHCP4o6 %s on %s to %s %s%s%svia %s",
4047 ?
"DHCPACK" :
"DHCPOFFER")
4050 (
lease -> hardware_addr.hlen
4052 lease -> hardware_addr.hlen - 1,
4053 &
lease -> hardware_addr.hbuf [1])
4055 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
4062 packet_length,
MDL)) {
4063 log_fatal(
"No memory to store DHCP4o6 reply.");
4068 &raw, packet_length);
4079 log_info (
"%s on %s to %s %s%s%svia %s",
4081 ? (state ->
offer ==
DHCPACK ?
"DHCPACK" :
"DHCPOFFER")
4084 (
lease -> hardware_addr.hlen > 1
4086 lease -> hardware_addr.hlen - 1,
4087 &
lease -> hardware_addr.hbuf [1])
4089 s ?
"(" :
"", s ? s :
"", s ?
") " :
"",
4091 ? inet_ntoa (state ->
giaddr)
4092 : state ->
ip -> name));
4095 dump_raw ((
unsigned char *)&raw, packet_length);
4102 to.sin_family = AF_INET;
4104 to.sin_len =
sizeof to;
4106 memset (to.sin_zero, 0,
sizeof to.sin_zero);
4108#if defined(RELAY_PORT)
4114 to.sin_addr = raw.
giaddr;
4115 if (raw.
giaddr.s_addr != htonl (INADDR_LOOPBACK))
4116#if defined(RELAY_PORT)
4126 packet_length, raw.
siaddr, &to,
4129 log_error (
"%s:%d: Failed to send %d byte long "
4130 "packet over %s interface.",
MDL,
4152 }
else if (raw.
ciaddr.s_addr &&
4159 to.sin_addr = raw.
ciaddr;
4164 packet_length, raw.
siaddr, &to,
4167 log_error(
"%s:%d: Failed to send %d byte long"
4168 " packet over %s interface.",
MDL,
4184 to.sin_addr = raw.
yiaddr;
4198 from, &to, unicastp ? &hto : NULL);
4200 log_error (
"%s:%d: Failed to send %d byte long "
4201 "packet over %s interface.",
MDL,
4202 packet_length, state->
ip->
name);
4215 int *peer_has_leases,
struct lease *ip_lease_in,
4225 struct lease *fixed_lease = (
struct lease *)0;
4229 int have_client_identifier = 0;
4233#if defined(FAILOVER_PROTOCOL)
4235 if (peer_has_leases) {
4244 *peer_has_leases = 1;
4251 if (
packet -> raw -> ciaddr.s_addr) {
4258 memset (&d1, 0,
sizeof d1);
4265 packet -> got_requested_address = 1;
4280 memset (&client_identifier, 0,
sizeof client_identifier);
4288 have_client_identifier = 1;
4293 client_identifier.
len,
MDL)) {
4299#if defined (DEBUG_FIND_LEASE)
4301 log_info (
"Found host for client identifier: %s.",
4307 host_reference (&host, hp,
MDL);
4308 host_dereference (&hp,
MDL);
4312 client_identifier.
len,
MDL);
4317 if (!fixed_lease && !host) {
4324 host_dereference (&host,
MDL);
4325 host_reference (&host, hp,
MDL);
4326 host_dereference (&hp,
MDL);
4328#if defined (DEBUG_FIND_LEASE)
4330 log_info (
"Found host for link address: %s.",
4339 if (!fixed_lease && !host) {
4344 host_dereference(&host,
MDL);
4345 host_reference(&host, hp,
MDL);
4346 host_dereference(&hp,
MDL);
4348#if defined (DEBUG_FIND_LEASE)
4350 log_info (
"Found host via host-identifier");
4361 memcmp (fixed_lease ->
ip_addr.iabuf,
4365 strcpy (dhcp_message,
"requested address is incorrect");
4366#if defined (DEBUG_FIND_LEASE)
4367 log_info (
"Client's fixed-address %s doesn't match %s%s",
4386#if defined (DEBUG_FIND_LEASE)
4387 log_info (
"trying next lease matching client id: %s",
4391#if defined (FAILOVER_PROTOCOL)
4403#if defined (DEBUG_FIND_LEASE)
4404 log_info(
"not active or not mine to allocate: %s",
4412#if defined (DEBUG_FIND_LEASE)
4413 log_info (
"wrong network segment: %s",
4426#if defined (DEBUG_FIND_LEASE)
4431 if (uid_lease -> n_uid)
4432 lease_reference (&
next,
4433 uid_lease -> n_uid,
MDL);
4436 lease_dereference (&uid_lease,
MDL);
4438 lease_reference (&uid_lease,
next,
MDL);
4439 lease_dereference (&
next,
MDL);
4445#if defined (DEBUG_FIND_LEASE)
4447 log_info (
"Found lease for client id: %s.",
4463#if defined (DEBUG_FIND_LEASE)
4464 log_info (
"trying next lease matching hw addr: %s",
4467#if defined (FAILOVER_PROTOCOL)
4480#if defined (DEBUG_FIND_LEASE)
4481 log_info(
"not active or not mine to allocate: %s",
4494 if (hw_lease -> binding_state !=
FTS_FREE &&
4497 (!have_client_identifier ||
4498 hw_lease -> uid_len != client_identifier.
len ||
4499 memcmp (hw_lease -> uid, client_identifier.
data,
4500 hw_lease -> uid_len))) {
4501#if defined (DEBUG_FIND_LEASE)
4502 log_info (
"wrong client identifier: %s",
4508#if defined (DEBUG_FIND_LEASE)
4509 log_info (
"wrong network segment: %s",
4518#if defined (DEBUG_FIND_LEASE)
4522 if (!
packet -> raw -> ciaddr.s_addr)
4525 if (hw_lease -> n_hw)
4526 lease_reference (&
next, hw_lease -> n_hw,
MDL);
4527 lease_dereference (&hw_lease,
MDL);
4529 lease_reference (&hw_lease,
next,
MDL);
4530 lease_dereference (&
next,
MDL);
4536#if defined (DEBUG_FIND_LEASE)
4538 log_info (
"Found lease for hardware address: %s.",
4545 lease_reference (&ip_lease, ip_lease_in,
MDL);
4549#if defined (DEBUG_FIND_LEASE)
4551 log_info (
"Found lease for requested address: %s.",
4558 if (ip_lease && ours)
4571#if defined (DEBUG_FIND_LEASE)
4572 log_info (
"...but it was on the wrong shared network.");
4574 strcpy (dhcp_message,
"requested address on bad subnet");
4575 lease_dereference (&ip_lease,
MDL);
4589 (!have_client_identifier ||
4590 ip_lease -> uid_len != client_identifier.
len ||
4591 memcmp (ip_lease -> uid, client_identifier.
data,
4592 ip_lease -> uid_len)) :
4593 (ip_lease -> hardware_addr.hbuf [0] !=
packet -> raw -> htype ||
4594 ip_lease -> hardware_addr.hlen !=
packet -> raw -> hlen + 1 ||
4595 memcmp (&ip_lease -> hardware_addr.hbuf [1],
4597 (
unsigned)(ip_lease -> hardware_addr.hlen - 1))))) {
4606 if (ip_lease -> binding_state !=
FTS_FREE &&
4608#if defined (DEBUG_FIND_LEASE)
4609 log_info (
"rejecting lease for requested address.");
4613 if (ours && ip_lease -> binding_state !=
FTS_ACTIVE)
4615 lease_dereference (&ip_lease,
MDL);
4623 if (ip_lease && (uid_lease || hw_lease) &&
4630#if defined (DEBUG_FIND_LEASE)
4631 log_info(
"ip lease not active or not ours to offer.");
4633 lease_dereference(&ip_lease,
MDL);
4640 ip_lease->
uid && ip_lease != uid_lease) {
4641 if (have_client_identifier &&
4642 (ip_lease -> uid_len == client_identifier.
len) &&
4643 !memcmp (client_identifier.
data,
4644 ip_lease -> uid, ip_lease -> uid_len)) {
4647 log_error (
"client %s has duplicate%s on %s",
4658 !
packet -> raw -> ciaddr.s_addr &&
4664 lease_dereference (&uid_lease,
MDL);
4665 lease_reference (&uid_lease, ip_lease,
MDL);
4673 lease_dereference (&fixed_lease,
MDL);
4675 log_error (
"Dynamic and static leases present for %s.",
4677 log_error (
"Remove host declaration %s or remove %s",
4678 (fixed_lease && fixed_lease -> host
4679 ? (fixed_lease -> host -> name
4680 ? fixed_lease -> host -> name
4684 log_error (
"from the dynamic address pool for %s",
4688 lease_dereference (&ip_lease,
MDL);
4689 strcpy (dhcp_message,
4690 "database conflict - call for help!");
4693 if (ip_lease && ip_lease != uid_lease) {
4694#if defined (DEBUG_FIND_LEASE)
4695 log_info (
"requested address not available.");
4697 lease_dereference (&ip_lease,
MDL);
4707 if (hw_lease && hw_lease == uid_lease) {
4708#if defined (DEBUG_FIND_LEASE)
4709 log_info (
"hardware lease and uid lease are identical.");
4711 lease_dereference (&hw_lease,
MDL);
4713 if (ip_lease && ip_lease == hw_lease) {
4714 lease_dereference (&hw_lease,
MDL);
4715#if defined (DEBUG_FIND_LEASE)
4716 log_info (
"hardware lease and ip lease are identical.");
4719 if (ip_lease && ip_lease == uid_lease) {
4720 lease_dereference (&uid_lease,
MDL);
4721#if defined (DEBUG_FIND_LEASE)
4722 log_info (
"uid lease and ip lease are identical.");
4736 lease_dereference (&ip_lease,
MDL);
4744 if (!
packet -> raw -> ciaddr.s_addr)
4746 lease_dereference (&uid_lease,
MDL);
4754 if (!
packet -> raw -> ciaddr.s_addr)
4756 lease_dereference (&hw_lease,
MDL);
4763 strcpy (dhcp_message,
"requested address not available");
4770 !ip_lease && !fixed_lease) {
4771#if defined (DEBUG_FIND_LEASE)
4772 log_info (
"no applicable lease found for DHCPREQUEST.");
4780 lease_reference (&
lease, fixed_lease,
MDL);
4781 lease_dereference (&fixed_lease,
MDL);
4782#if defined (DEBUG_FIND_LEASE)
4783 log_info (
"choosing fixed address.");
4791 if (!
packet -> raw -> ciaddr.s_addr)
4793#if defined (DEBUG_FIND_LEASE)
4794 log_info (
"not choosing requested address (!).");
4796 lease_dereference (&ip_lease,
MDL);
4798#if defined (DEBUG_FIND_LEASE)
4799 log_info (
"choosing lease on requested address.");
4801 lease_reference (&
lease, ip_lease,
MDL);
4803 host_dereference (&
lease -> host,
MDL);
4812 log_error(
"uid lease %s for client %s is duplicate "
4818 if (!
packet -> raw -> ciaddr.s_addr &&
4822#if defined (DEBUG_FIND_LEASE)
4823 log_info (
"not choosing uid lease.");
4826 lease_reference (&
lease, uid_lease,
MDL);
4828 host_dereference (&
lease -> host,
MDL);
4829#if defined (DEBUG_FIND_LEASE)
4833 lease_dereference (&uid_lease,
MDL);
4839#if defined (DEBUG_FIND_LEASE)
4840 log_info (
"not choosing hardware lease.");
4847 if (!hw_lease -> uid_len ||
4848 (have_client_identifier
4849 ? (hw_lease -> uid_len ==
4850 client_identifier.
len &&
4851 !memcmp (hw_lease -> uid,
4852 client_identifier.
data,
4853 client_identifier.
len))
4854 :
packet -> packet_type == 0)) {
4855 lease_reference (&
lease, hw_lease,
MDL);
4857 host_dereference (&
lease -> host,
MDL);
4858#if defined (DEBUG_FIND_LEASE)
4859 log_info (
"choosing hardware lease.");
4862#if defined (DEBUG_FIND_LEASE)
4863 log_info (
"not choosing hardware lease: %s.",
4868 lease_dereference (&hw_lease,
MDL);
4881 host_reference(&p, host,
MDL);
4902 host_dereference(&p,
MDL);
4907 host_dereference(&p,
MDL);
4909 host_reference(&p, n,
MDL);
4910 host_dereference(&n,
MDL);
4921 lease == ip_lease &&
4923 log_error (
"Reclaiming REQUESTed abandoned IP address %s.",
4936 if (have_client_identifier)
4940 lease_dereference (&fixed_lease,
MDL);
4942 lease_dereference (&hw_lease,
MDL);
4944 lease_dereference (&uid_lease,
MDL);
4946 lease_dereference (&ip_lease,
MDL);
4948 host_dereference (&host,
MDL);
4951#if defined (DEBUG_FIND_LEASE)
4959#if defined (DEBUG_FIND_LEASE)
4960 log_info (
"Not returning a lease.");
4984 host_dereference (&rhp,
MDL);
4987 host_reference (&
lease -> host, rhp,
MDL);
4992 if (!
lease -> uid) {
4994 host_dereference (&rhp,
MDL);
5008 host_dereference (&rhp,
MDL);
5020 struct pool *
pool,
int *peer_has_leases)
5023 struct lease *candl = NULL;
5026 if ((
pool -> prohibit_list &&
5028 (
pool -> permit_list &&
5032#if defined (FAILOVER_PROTOCOL)
5048 struct lease *peerl = NULL;
5059 if (peerl != NULL) {
5060 if (((candl == NULL) ||
5065 *peer_has_leases = 1;
5072 if (peerl != NULL) {
5073 if (((candl == NULL) ||
5078 *peer_has_leases = 1;
5085 if ((candl == NULL) && (peerl != NULL) &&
5149 if (
lease != NULL) {
5151 log_error(
"Reclaiming abandoned lease %s.",
5160 log_debug(
"soft impossible condition (%s:%d): stale "
5161 "host \"%s\" found on lease %s",
MDL,
5180 struct permit *permit_list;
5185 for (p = permit_list; p; p = p ->
next) {
5186 switch (p ->
type) {
5198 if (
packet -> authenticated)
5203 if (!
packet -> authenticated)
5211 if (!
packet -> options_valid ||
5217 for (i = 0; i <
packet -> class_count; i++) {
5218 if (p ->
class ==
packet -> classes [i])
5220 if (
packet -> classes [i] &&
5221 packet -> classes [i] -> superclass &&
5222 (
packet -> classes [i] -> superclass ==
5237#if defined(DHCPv6) && defined(DHCP4o6)
5238static int locate_network6 (
packet)
5241 const struct packet *chk_packet;
5242 const struct in6_addr *link_addr, *first_link_addr;
5314 first_link_addr = NULL;
5316 while (chk_packet != NULL) {
5318 if (!IN6_IS_ADDR_UNSPECIFIED(link_addr) &&
5319 !IN6_IS_ADDR_LINKLOCAL(link_addr)) {
5320 first_link_addr = link_addr;
5329 if (first_link_addr != NULL) {
5330 ia.len =
sizeof(*first_link_addr);
5331 memcpy(ia.iabuf, first_link_addr,
sizeof(*first_link_addr));
5357 log_error(
"No interface and no link address "
5358 "can't determine DHCP4o6 shared network");
5372#if defined(DHCPv6) && defined(DHCP4o6)
5374 return (locate_network6 (
packet));
5392 struct in_addr any_addr;
5393 any_addr.s_addr = INADDR_ANY;
5395 if (!
packet -> packet_type && memcmp(&
packet -> raw -> ciaddr, &any_addr, 4)) {
5416 memset (&data, 0,
sizeof data);
5425 if (data.
len != 4) {
5491 unsigned option_num;
5494 struct in_addr *a = NULL;
5498 memset(&d, 0,
sizeof(d));
5499 memset(from, 0,
sizeof(*from));
5507 if (d.
len ==
sizeof(*from)) {
5509 memcpy(from, d.
data,
sizeof(*from));
5515 if ((out_options != NULL) &&
5516 (options != out_options)) {
5530 if (out_options != NULL) {
5538 (
unsigned char *)a,
sizeof(*a),
5539 0, allocate,
MDL)) {
5540 option_code_hash_lookup(&oc->
option,
5542 &option_num, 0,
MDL);
5575 struct group *network_group) {
5577 if (*network_options == NULL) {
5613 }
else if (network_group != NULL) {
5637find_min_site_code(
struct universe *u)
5647 site_code_min = 224;
5648 option_code_hash_foreach(u->
code_hash, lowest_site_code);
5650 if (site_code_min < 224) {
5651 log_error(
"WARNING: site-local option codes less than 224 have "
5652 "been deprecated by RFC3942. You have options "
5653 "listed in site local space %s that number as low as "
5654 "%d. Please investigate if these should be declared "
5655 "as regular options rather than site-local options, "
5656 "or migrated up past 224.",
5657 u->
name, site_code_min);
5664 if (site_code_min < 128)
5665 site_code_min = 128;
5674 return site_code_min;
5678lowest_site_code(
const void *key,
unsigned len,
void *
object)
5751 option_code_hash_lookup(&oc->
option,
5801 struct lease* new_lease,
5828 (new_lease->
ddns_cb == NULL) && *same_client) {
5840 if (d1.
len == 1 && (d1.
data[0] < 100))
5841 thresh = d1.
data[0];
5849 int lease_length = 0;
5854 if (lease_length <= (INT_MAX / thresh))
5855 limit = lease_length * thresh / 100;
5857 limit = lease_length / 100 * thresh;
5863 if (lease_age <= limit) {
5868 if (new_lease->
scope != NULL) {
5887 log_debug(
"reuse_lease: lease age %ld (secs)"
5888 " under %d%% threshold, reply with "
5889 "unaltered, existing lease for %s",
5926 return (calculated);
int buffer_allocate(struct buffer **ptr, unsigned len, const char *file, int line)
int expression_reference(struct expression **ptr, struct expression *src, const char *file, int line)
void data_string_forget(struct data_string *data, const char *file, int line)
int option_chain_head_reference(struct option_chain_head **ptr, struct option_chain_head *bp, const char *file, int line)
int option_state_allocate(struct option_state **ptr, const char *file, int line)
int option_state_dereference(struct option_state **ptr, const char *file, int line)
int packet_reference(struct packet **ptr, struct packet *bp, const char *file, int line)
int binding_scope_reference(struct binding_scope **ptr, struct binding_scope *bp, const char *file, int line)
void data_string_copy(struct data_string *dest, const struct data_string *src, const char *file, int line)
int option_cache_allocate(struct option_cache **cptr, const char *file, int line)
int option_chain_head_dereference(struct option_chain_head **ptr, const char *file, int line)
void add_timeout(struct timeval *when, void *where, void *what, tvref_t ref, tvunref_t unref)
void cancel_timeout(void *where, void *what)
void save_option(struct universe *universe, struct option_state *options, struct option_cache *oc)
int option_cache_dereference(struct option_cache **ptr, const char *file, int line)
void delete_option(struct universe *universe, struct option_state *options, int code)
struct option_cache * lookup_option(struct universe *universe, struct option_state *options, unsigned code)
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)
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)
char * print_dotted_quads(unsigned len, const u_int8_t *data)
char * print_hw_addr(int htype, const int hlen, const unsigned char *data) const
const char * print_time(TIME t)
void dump_raw(unsigned char *buf, unsigned len) const
#define FAILOVER_PROTOCOL
u_int32_t getUShort(const unsigned char *)
u_int32_t getULong(const unsigned char *)
void putULong(unsigned char *, u_int32_t)
void dhcpack(struct packet *packet)
void do_release(struct client_state *client)
int find_subnet(struct subnet **sp, struct iaddr addr, const char *file, int line)
void unbill_class(struct lease *lease)
int write_lease(struct lease *lease)
int permitted(struct packet *packet, struct permit *permit_list)
void ack_lease(struct packet *packet, struct lease *lease, unsigned int offer, TIME when, char *msg, int ms_nulltp, struct host_decl *hp)
void dhcpinform(struct packet *packet, int ms_nulltp)
void dhcp(struct packet *packet)
void dhcp_reply(struct lease *lease)
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.
char * print_hw_addr_or_client_id(struct packet *packet)
const int dhcp_type_name_max
char * print_client_identifier_from_packet(struct packet *packet)
int mockup_lease(struct lease **lp, struct packet *packet, struct shared_network *share, struct host_decl *hp)
void dhcprelease(struct packet *packet, int ms_nulltp)
void dhcprequest(struct packet *packet, int ms_nulltp, struct lease *ip_lease)
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.
int locate_network(struct packet *packet)
void dhcpdiscover(struct packet *packet, int ms_nulltp)
int allocate_lease(struct lease **lp, struct packet *packet, struct pool *pool, int *peer_has_leases)
void check_pool_threshold(struct packet *packet, struct lease *lease, struct lease_state *state)
void nak_lease(struct packet *packet, struct iaddr *cip, struct group *network_group)
Constructs and sends a DHCP Nak.
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)
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...
void dhcpdecline(struct packet *packet, int ms_nulltp)
void get_server_source_address(struct in_addr *from, struct option_state *options, struct option_state *out_options, struct packet *packet)
#define DHO_DHCP_MAX_MESSAGE_SIZE
#define DHO_DHCP_PARAMETER_REQUEST_LIST
#define DHO_VENDOR_CLASS_IDENTIFIER
#define DHO_SUBNET_SELECTION
#define DHO_DHCP_CLIENT_IDENTIFIER
#define DHO_PXE_CLIENT_ID
#define DHO_DHCP_MESSAGE_TYPE
#define DHCPLEASEUNASSIGNED
#define DHO_DHCP_RENEWAL_TIME
#define DHO_DHCP_REBINDING_TIME
#define DHO_DHCP_SERVER_IDENTIFIER
#define DHO_DHCP_REQUESTED_ADDRESS
#define DHO_DHCP_LEASE_TIME
void dump_raw(const unsigned char *, unsigned)
#define DEFAULT_DEFAULT_LEASE_TIME
#define DEFAULT_PING_TIMEOUT_MS
#define SV_ECHO_CLIENT_ID
u_int16_t dhcp_check_relayport(struct packet *packet)
#define SV_MIN_LEASE_TIME
void(* tvunref_t)(void *, const char *, int)
void execute_statements_in_scope(struct binding_value **result, struct packet *, struct lease *, struct client_state *, struct option_state *, struct option_state *, struct binding_scope **, struct group *, struct group *, struct on_star *)
int bill_class(struct lease *, struct class *)
#define DEFAULT_CACHE_THRESHOLD
int db_printable(const unsigned char *)
int option_chain_head_reference(struct option_chain_head **, struct option_chain_head *, const char *, int)
struct universe agent_universe
#define SV_LOG_THRESHOLD_LOW
void free_lease_state(struct lease_state *, const char *, int)
int find_hosts_by_haddr(struct host_decl **, int, const unsigned char *, unsigned, const char *, int)
#define LEASE_NOT_EMPTY(LQ)
void(* tvref_t)(void *, void *, const char *, int)
#define SV_STASH_AGENT_OPTIONS
void dump_packet(struct packet *)
int find_lease_by_uid(struct lease **, const unsigned char *, unsigned, const char *, int)
void abandon_lease(struct lease *, const char *)
struct ipv6_pool ** pools
void dhcpleasequery(struct packet *, int)
#define SV_USE_LEASE_ADDR_FOR_DEFAULT_ROUTE
ssize_t send_packet(struct interface_info *, struct packet *, struct dhcp_packet *, size_t, struct in_addr, struct sockaddr_in *, struct hardware *)
#define FIND_PERCENT(count, percent)
void nak_lease(struct packet *, struct iaddr *cip, struct group *)
Constructs and sends a DHCP Nak.
#define SV_BOOT_UNKNOWN_CLIENTS
#define SV_IGNORE_CLIENT_UIDS
int allocate_lease(struct lease **, struct packet *, struct pool *, int *)
int find_hosts_by_uid(struct host_decl **, const unsigned char *, unsigned, const char *, int)
int supersede_lease(struct lease *, struct lease *, int, int, int, int)
void save_option(struct universe *, struct option_state *, struct option_cache *)
int find_grouped_subnet(struct subnet **, struct shared_network *, struct iaddr, const char *, int)
void echo_client_id(struct packet *, struct lease *, struct option_state *, struct option_state *)
Adds a dhcp-client-id option to a set of options Given a set of input options, it searches for echo-c...
#define DEFAULT_MIN_ACK_DELAY_USECS
#define MS_NULL_TERMINATION
int find_lease_by_hw_addr(struct lease **, const unsigned char *, unsigned, const char *, int)
#define SV_CACHE_THRESHOLD
#define SV_PING_CLTT_SECS
int ddns_updates(struct packet *, struct lease *, struct lease *, struct iasubopt *, struct iasubopt *, struct option_state *)
#define SV_MAX_LEASE_TIME
#define SV_ONE_LEASE_PER_CLIENT
#define SV_GET_LEASE_HOSTNAMES
struct universe server_universe
isc_result_t dhcp_failover_send_updates(dhcp_failover_state_t *)
void eval_network_statements(struct option_state **options, struct packet *packet, struct group *network_group)
Builds option set from statements at the global and network scope.
struct universe dhcp_universe
#define SV_BOOTP_LEASE_CUTOFF
int find_hosts_by_option(struct host_decl **, struct packet *, struct option_state *, const char *, int)
#define DEFAULT_MIN_LEASE_TIME
#define SV_USE_HOST_DECL_NAMES
#define SV_LOG_THRESHOLD_HIGH
int find_lease_by_ip_addr(struct lease **, struct iaddr, const char *, int)
#define DEFAULT_PING_CLTT_SECS
#define DEFAULT_DELAYED_ACK
const char * piaddr(struct iaddr)
void classify_client(struct packet *)
void release_lease(struct lease *, struct packet *)
int find_host_for_network(struct subnet **, struct host_decl **, struct iaddr *, struct shared_network *)
#define SV_SITE_OPTION_SPACE
#define DEFAULT_PING_TIMEOUT
int can_unicast_without_arp(struct interface_info *)
#define DEFAULT_MAX_LEASE_TIME
int permitted(struct packet *, struct permit *)
int buffer_allocate(struct buffer **, unsigned, const char *, int)
#define SV_BOOTP_LEASE_LENGTH
#define UNICAST_BROADCAST_HACK
#define DEFAULT_ACK_DELAY_USECS
#define SV_RESERVE_INFINITE
void delete_option(struct universe *, struct option_state *, int)
void lease_ping_timeout(void *)
#define DEFAULT_ACK_DELAY_SECS
int lease_mine_to_reallocate(struct lease *)
int load_balance_mine(struct packet *, dhcp_failover_state_t *)
int option_state_dereference(struct option_state **, const char *, int)
void get_server_source_address(struct in_addr *from, struct option_state *options, struct option_state *out_options, struct packet *packet)
#define SV_ADAPTIVE_LEASE_TIME_THRESHOLD
#define SV_DEFAULT_LEASE_TIME
#define LEASE_GET_FIRST(LQ)
int option_state_allocate(struct option_state **, const char *, int)
int cons_options(struct packet *, struct dhcp_packet *, struct lease *, struct client_state *, int, struct option_state *, struct option_state *, struct binding_scope **, int, int, int, struct data_string *, const char *)
#define SV_PING_TIMEOUT_MS
#define print_hex_1(len, data, limit)
struct lease_state * new_lease_state(const char *, int)
int option_cache_dereference(struct option_cache **, const char *, int)
#define SV_ALWAYS_BROADCAST
struct interface_info * fallback_interface
struct in_addr limited_broadcast
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)
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)
int executable_statement_dereference(struct executable_statement **ptr, const char *file, int line)
const char * binding_state_print(enum failover_state state)
int icmp_echorequest(struct iaddr *addr)
struct iaddr ip_addr(struct iaddr subnet, struct iaddr mask, u_int32_t host_address)
const char * piaddr(const struct iaddr addr)
struct group * root_group
void * dmalloc(size_t, const char *, int)
void dfree(void *, const char *, int)
int log_error(const char *,...) __attribute__((__format__(__printf__
int int int log_debug(const char *,...) __attribute__((__format__(__printf__
void log_fatal(const char *,...) __attribute__((__format__(__printf__
int int log_info(const char *,...) __attribute__((__format__(__printf__
struct class * superclass
const unsigned char * data
char sname[DHCP_SNAME_LEN]
u_int8_t hbuf[HARDWARE_ADDR_LEN+1]
struct option_cache * fixed_addr
struct data_string client_identifier
struct host_decl * n_ipaddr
struct hardware interface
struct shared_network * shared_network
struct in_addr * addresses
struct interface_info * ip
struct option_state * options
int got_server_identifier
struct data_string filename server_name
binding_state_t next_binding_state
struct lease_state * state
struct dhcp_ddns_cb * ddns_cb
struct binding_scope * scope
unsigned short cannot_reuse
struct hardware hardware_addr
binding_state_t rewind_binding_state
struct class * billing_class
binding_state_t binding_state
struct executable_statement * on_commit
struct executable_statement * on_expiry
struct executable_statement * on_release
struct expression * expression
isc_boolean_t agent_options_stashed
struct in6_addr dhcpv6_link_address
struct packet * dhcpv6_container_packet
struct shared_network * shared_network
struct interface_info * interface
struct option_state * options
struct data_string * dhcp4o6_response
struct class * classes[PACKET_MAX_CLASSES]
enum permit::@011051276256032144365216260061073130004016310224 type
@ permit_dynamic_bootp_clients
@ permit_authenticated_clients
@ permit_unauthenticated_clients
struct permit * prohibit_list
struct permit * permit_list
dhcp_failover_state_t * failover_peer
struct shared_network * shared_network
struct shared_network * shared_network
option_code_hash_t * code_hash
int option_reference(struct option **dest, struct option *src, const char *file, int line)
universe_hash_t * universe_hash
struct universe ** universes
int binding_scope_dereference(struct binding_scope **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)
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 bind_ds_value(struct binding_scope **scope, const char *name, struct data_string *value)
struct binding_scope * global_scope