170#include <sys/types.h>
172#include <netinet/in.h>
214 return ISC_R_NOMEMORY;
278 if (tmp->
ia != NULL) {
284 if (tmp->
scope != NULL) {
312 const char *duid,
unsigned int duid_len,
315 memset(key, 0,
sizeof(*key));
316 key->
len = duid_len +
sizeof(iaid);
318 return ISC_R_NOMEMORY;
321 memcpy((
char *)key->
data, &iaid,
sizeof(iaid));
322 memcpy((
char *)key->
data +
sizeof(iaid), duid, duid_len);
340 const char *duid,
unsigned int duid_len,
355 return ISC_R_NOMEMORY;
361 return ISC_R_NOMEMORY;
407 if ((ia == NULL) || (*ia == NULL)) {
455 return ISC_R_NOMEMORY;
569 sizeof(
struct in6_addr)) == 0) {
590lease_older(
void *a,
void *b) {
608active_changed(
void *
iasubopt,
unsigned int new_heap_index) {
613inactive_changed(
void *
iasubopt,
unsigned int new_heap_index) {
641 const struct in6_addr *start_addr,
int bits,
642 int units,
const char *
file,
int line) {
656 return ISC_R_NOMEMORY;
666 return ISC_R_NOMEMORY;
672 return ISC_R_NOMEMORY;
679 return ISC_R_NOMEMORY;
739dereference_hash_entry(
const void *name,
unsigned len,
void *
value) {
751dereference_heap_entry(
void *
value,
void *dummy) {
780 if ((
pool == NULL) || (*
pool == NULL)) {
794 iasubopt_hash_foreach(tmp->
leases, dereference_hash_entry);
797 dereference_heap_entry, NULL);
800 dereference_heap_entry, NULL);
813build_address6(
struct in6_addr *addr,
814 const struct in6_addr *net_start_addr,
int net_bits,
828 isc_md5_update(&ctx,
input->data,
input->len);
829 isc_md5_final(&ctx, (
unsigned char *)addr);
835 net_str = (
const char *)net_start_addr;
836 net_bytes = net_bits / 8;
837 for (i = 0; i < net_bytes; i++) {
840 switch (net_bits % 8) {
841 case 1: str[i] = (str[i] & 0x7F) | (net_str[i] & 0x80);
break;
842 case 2: str[i] = (str[i] & 0x3F) | (net_str[i] & 0xC0);
break;
843 case 3: str[i] = (str[i] & 0x1F) | (net_str[i] & 0xE0);
break;
844 case 4: str[i] = (str[i] & 0x0F) | (net_str[i] & 0xF0);
break;
845 case 5: str[i] = (str[i] & 0x07) | (net_str[i] & 0xF8);
break;
846 case 6: str[i] = (str[i] & 0x03) | (net_str[i] & 0xFC);
break;
847 case 7: str[i] = (str[i] & 0x01) | (net_str[i] & 0xFE);
break;
861valid_eui_64_duid(
const struct data_string* uid,
int offset) {
863 const unsigned char* duid = uid->
data + offset;
864 return (((duid[0] == 0x00 && duid[1] == 0x03) &&
865 (duid[2] == 0x00 && duid[3] == 0x1b)));
876build_address6_eui_64(
struct in6_addr *addr,
877 const struct in6_addr *net_start_addr,
int net_bits,
878 const struct data_string *iaid_duid,
int duid_beg) {
880 if (net_bits != 64) {
881 log_error(
"build_address_eui_64: network is not 64 bits");
882 return (ISC_R_FAILURE);
885 if (valid_eui_64_duid(iaid_duid, duid_beg)) {
886 const unsigned char *duid = iaid_duid->
data + duid_beg;
889 memcpy(addr->s6_addr, net_start_addr->s6_addr, 8);
892 memcpy(addr->s6_addr + 8, duid + 4, 8);
899 addr->s6_addr[8] |= 0x02;
903 log_error(
"build_address_eui_64: iaid_duid not a valid EUI-64: %s",
905 return (ISC_R_FAILURE);
910 int duid_beg,
struct in6_addr* ia_addr) {
911 struct in6_addr test_addr;
913 if (!
pool->ipv6_pond->use_eui_64) {
917 if (!valid_eui_64_duid(uid, duid_beg)) {
924 memset (&test_addr, 0,
sizeof(test_addr));
925 build_address6_eui_64(&test_addr, &
pool->start_addr,
pool->bits,
928 return (!memcmp(ia_addr, &test_addr,
sizeof(test_addr)));
938build_temporary6(
struct in6_addr *addr,
939 const struct in6_addr *net_start_addr,
int net_bits,
941 static u_int32_t history[2];
942 static u_int32_t counter = 0;
944 unsigned char md[16];
951 isc_random_get(&history[0]);
952 isc_random_get(&history[1]);
959 isc_md5_update(&ctx, (
unsigned char *)&history[0], 8UL);
960 isc_md5_update(&ctx,
input->data,
input->len);
961 isc_md5_final(&ctx, md);
966 if (net_bits == 64) {
967 memcpy(&addr->s6_addr[0], &net_start_addr->s6_addr[0], 8);
968 memcpy(&addr->s6_addr[8], md, 8);
969 addr->s6_addr[8] &= ~0x02;
980 net_str = (
const char *)net_start_addr;
981 net_bytes = net_bits / 8;
982 for (i = 0; i < net_bytes; i++) {
985 memcpy(str + net_bytes, md, 16 - net_bytes);
986 switch (net_bits % 8) {
987 case 1: str[i] = (str[i] & 0x7F) | (net_str[i] & 0x80);
break;
988 case 2: str[i] = (str[i] & 0x3F) | (net_str[i] & 0xC0);
break;
989 case 3: str[i] = (str[i] & 0x1F) | (net_str[i] & 0xE0);
break;
990 case 4: str[i] = (str[i] & 0x0F) | (net_str[i] & 0xF0);
break;
991 case 5: str[i] = (str[i] & 0x07) | (net_str[i] & 0xF8);
break;
992 case 6: str[i] = (str[i] & 0x03) | (net_str[i] & 0xFC);
break;
993 case 7: str[i] = (str[i] & 0x01) | (net_str[i] & 0xFE);
break;
1001 memcpy((
unsigned char *)&history[0], md + 8, 8);
1006static struct in6_addr rtany;
1008static struct in6_addr resany;
1033 unsigned int *attempts,
1034 const struct data_string *uid, time_t soft_lifetime_end_time) {
1036 struct in6_addr tmp;
1040 isc_result_t result;
1048 memset(&rtany, 0, 16);
1049 memset(&resany, 0, 8);
1050 resany.s6_addr[8] = 0xfd;
1051 memset(&resany.s6_addr[9], 0xff, 6);
1058 memset(&ds, 0,
sizeof(ds));
1066 if (++(*attempts) > 100) {
1068 return ISC_R_NORESOURCES;
1074 switch (
pool->pool_type) {
1077 build_address6(&tmp, &
pool->start_addr,
1082 build_temporary6(&tmp, &
pool->start_addr,
1087 log_error(
"create_lease6: prefix pool.");
1091 log_error(
"create_lease6: untyped pool.");
1100 if (memcmp(&tmp.s6_addr[8], &rtany.s6_addr[8], 8) == 0) {
1103 if (!reserved_iid &&
1104 (memcmp(&tmp.s6_addr[8], &resany.s6_addr[8], 7) == 0) &&
1105 ((tmp.s6_addr[15] & 0x80) == 0x80)) {
1113 if (!reserved_iid &&
1114 (iasubopt_hash_lookup(&test_iaaddr,
pool->leases,
1115 &tmp,
sizeof(tmp),
MDL) == 0)) {
1118 if (test_iaaddr != NULL)
1124 memset(&new_ds, 0,
sizeof(new_ds));
1125 new_ds.
len = ds.
len +
sizeof(tmp);
1128 return ISC_R_NOMEMORY;
1145 result = iasubopt_allocate(&iaaddr,
MDL);
1150 memcpy(&iaaddr->
addr, &tmp,
sizeof(iaaddr->
addr));
1178 struct in6_addr tmp;
1181 isc_result_t result;
1186 memset(&rtany, 0, 16);
1187 memset(&resany, 0, 8);
1188 resany.s6_addr[8] = 0xfd;
1189 memset(&resany.s6_addr[9], 0xff, 6);
1195 log_error(
"create_lease6_eui_64: pool type is not IA_NA.");
1200 if (build_address6_eui_64 (&tmp, &
pool->start_addr,
pool->bits,
1202 log_error(
"create_lease6_eui_64: build_address6_eui_64 failed");
1203 return (ISC_R_FAILURE);
1207 if ((memcmp(&tmp.s6_addr[8], &rtany.s6_addr[8], 8) == 0) ||
1208 ((memcmp(&tmp.s6_addr[8], &resany.s6_addr[8], 7) == 0) &&
1209 ((tmp.s6_addr[15] & 0x80) == 0x80))) {
1211 "address conflicts with reserved IID");
1212 return (ISC_R_FAILURE);
1217 if (iasubopt_hash_lookup(&test_iaaddr,
pool->leases,
1218 &tmp,
sizeof(tmp),
MDL) != 0) {
1222 if (!test_iaaddr->
ia) {
1224 "address %s is assigned to static lease",
1229 ours = ((found->
len == uid->
len) &&
1232 "address %s belongs to %s",
1240 return (ISC_R_FAILURE);
1246 result = iasubopt_allocate(&iaaddr,
MDL);
1248 log_error(
"create_lease6_eui_64: could not allocate iasubop");
1252 memcpy(&iaaddr->
addr, &tmp,
sizeof(iaaddr->
addr));
1311 struct iasubopt *test_iasubopt, *tmp_iasubopt;
1312 struct ia_xx *old_ia;
1315 test_iasubopt = NULL;
1322 if (iasubopt_hash_lookup(&test_iasubopt,
pool->leases,
1328 if (test_iasubopt->
ia == NULL) {
1364 status = ISC_R_FAILURE;
1373 if (
pool->ipv6_pond)
1374 pool->ipv6_pond->num_active--;
1377 pool->num_abandoned--;
1378 if (
pool->ipv6_pond)
1379 pool->ipv6_pond->num_abandoned--;
1382 iasubopt_hash_delete(
pool->leases, &test_iasubopt->
addr,
1383 sizeof(test_iasubopt->
addr),
MDL);
1386 ia_hash_delete(ia_table,
1396 tmp_iasubopt = test_iasubopt;
1417 time_t valid_lifetime_end_time) {
1418 isc_result_t insert_result;
1432 test_iasubopt = NULL;
1433 if (iasubopt_hash_lookup(&test_iasubopt,
pool->leases,
1446 if (
pool->ipv6_pond)
1447 pool->ipv6_pond->num_active--;
1450 pool->num_abandoned--;
1451 if (
pool->ipv6_pond)
1452 pool->ipv6_pond->num_abandoned--;
1457 pool->num_inactive--;
1460 iasubopt_hash_delete(
pool->leases, &test_iasubopt->
addr,
1461 sizeof(test_iasubopt->
addr),
MDL);
1471 tmp_iasubopt = test_iasubopt;
1479 tmp_iasubopt = NULL;
1484 iasubopt_hash_add(
pool->leases, &tmp_iasubopt->
addr,
1490 if (
pool->ipv6_pond)
1491 pool->ipv6_pond->num_active++;
1494 pool->num_abandoned++;
1495 if (
pool->ipv6_pond)
1496 pool->ipv6_pond->num_abandoned++;
1505 pool->num_inactive++;
1508 iasubopt_hash_delete(
pool->leases, &
lease->addr,
1511 return insert_result;
1530 if (iasubopt_hash_lookup(&test_iaaddr,
pool->leases,
1559 if (iasubopt_hash_lookup(&test_iaaddr,
lease->ipv6_pool->leases,
1560 (
void *)&
lease->addr,
1562 if (test_iaaddr !=
lease) {
1576 isc_result_t insert_result;
1580 iasubopt_hash_add(
pool->leases, &
lease->addr,
1583 lease->inactive_index);
1585 pool->num_inactive--;
1587 if (
pool->ipv6_pond)
1588 pool->ipv6_pond->num_active++;
1591 return insert_result;
1626 time_t old_end_time =
lease->hard_lifetime_end_time;
1627 lease->hard_lifetime_end_time =
lease->soft_lifetime_end_time;
1628 lease->soft_lifetime_end_time = 0;
1633 lease->active_index);
1636 lease->active_index);
1640 char tmp_addr[INET6_ADDRSTRLEN];
1643 log_info(
"Reclaiming previously abandoned address %s",
1644 inet_ntop(AF_INET6, &(
lease->addr), tmp_addr,
1647 pool->num_abandoned--;
1648 if (
pool->ipv6_pond)
1649 pool->ipv6_pond->num_abandoned--;
1653 return move_lease_to_active(
pool,
lease);
1663 isc_result_t insert_result;
1699#if defined (NSUPDATE)
1713 iasubopt_hash_delete(
pool->leases,
1718 pool->num_inactive++;
1719 if (
pool->ipv6_pond)
1720 pool->ipv6_pond->num_active--;
1723 pool->num_abandoned--;
1724 if (
pool->ipv6_pond)
1725 pool->ipv6_pond->num_abandoned--;
1728 return insert_result;
1744 isc_result_t result;
1746 if (leasep == NULL) {
1750 if (*leasep != NULL) {
1755 if (
pool->num_active > 0) {
1759 result = move_lease_to_inactive(
pool, tmp,
1777 isc_result_t result;
1781 result = move_lease_to_active(
pool,
lease);
1788 pool->num_abandoned++;
1789 if (
pool->ipv6_pond)
1790 pool->ipv6_pond->num_abandoned++;
1815 const struct in6_addr *net_start_pref,
1816 int pool_bits,
int pref_bits,
1822 const char *net_str;
1830 isc_md5_update(&ctx,
input->data,
input->len);
1831 isc_md5_final(&ctx, (
unsigned char *)pref);
1837 net_str = (
const char *)net_start_pref;
1838 net_bytes = pool_bits / 8;
1839 for (i = 0; i < net_bytes; i++) {
1840 str[i] = net_str[i];
1843 switch (pool_bits % 8) {
1844 case 1: str[i] = (str[i] & 0x7F) | (net_str[i] & 0x80);
break;
1845 case 2: str[i] = (str[i] & 0x3F) | (net_str[i] & 0xC0);
break;
1846 case 3: str[i] = (str[i] & 0x1F) | (net_str[i] & 0xE0);
break;
1847 case 4: str[i] = (str[i] & 0x0F) | (net_str[i] & 0xF0);
break;
1848 case 5: str[i] = (str[i] & 0x07) | (net_str[i] & 0xF8);
break;
1849 case 6: str[i] = (str[i] & 0x03) | (net_str[i] & 0xFC);
break;
1850 case 7: str[i] = (str[i] & 0x01) | (net_str[i] & 0xFE);
break;
1855 net_bytes = pref_bits / 8;
1856 for (i=net_bytes+1; i<16; i++) {
1860 switch (pref_bits % 8) {
1861 case 0: str[i] &= 0;
break;
1862 case 1: str[i] &= 0x80;
break;
1863 case 2: str[i] &= 0xC0;
break;
1864 case 3: str[i] &= 0xE0;
break;
1865 case 4: str[i] &= 0xF0;
break;
1866 case 5: str[i] &= 0xF8;
break;
1867 case 6: str[i] &= 0xFC;
break;
1868 case 7: str[i] &= 0xFE;
break;
1895 unsigned int *attempts,
1899 struct in6_addr tmp;
1903 isc_result_t result;
1908 memset(&ds, 0,
sizeof(ds));
1916 if (++(*attempts) > 10) {
1918 return ISC_R_NORESOURCES;
1931 if (iasubopt_hash_lookup(&test_iapref,
pool->leases,
1932 &tmp,
sizeof(tmp),
MDL) == 0) {
1940 memset(&new_ds, 0,
sizeof(new_ds));
1941 new_ds.
len = ds.
len +
sizeof(tmp);
1944 return ISC_R_NOMEMORY;
1948 memcpy(&new_ds.
buffer->
data[0] + ds.
len, &tmp,
sizeof(tmp));
1961 result = iasubopt_allocate(&iapref,
MDL);
1965 iapref->
plen = (u_int8_t)
pool->units;
1966 memcpy(&iapref->
addr, &tmp,
sizeof(iapref->
addr));
1984 const struct in6_addr *pref, u_int8_t
plen) {
1991 if (iasubopt_hash_lookup(&test_iapref,
pool->leases,
1992 (
void *)pref,
sizeof(*pref),
MDL)) {
2008 isc_result_t result;
2010 dummy_iasubopt = NULL;
2011 result = iasubopt_allocate(&dummy_iasubopt,
MDL);
2014 iasubopt_hash_add(
pool->leases, &dummy_iasubopt->
addr,
2015 sizeof(*
addr), dummy_iasubopt,
MDL);
2028 if (new_pools == NULL) {
2029 return ISC_R_NOMEMORY;
2032 if (num_pools > 0) {
2033 memcpy(new_pools,
pools,
2034 sizeof(
struct ipv6_pool *) * num_pools);
2039 pools[num_pools] = NULL;
2049 struct ia_xx *ia_active;
2050 unsigned char *tmpd;
2053 while (
pool->num_inactive > 0) {
2067 pool->num_inactive--;
2069 if (tmp->
ia != NULL) {
2084 (ia_active ==
ia)) {
2092 (ia_active ==
ia)) {
2100 (ia_active ==
ia)) {
2111lease_timeout_support(
void *vpool) {
2133 if (
lease == NULL) {
2152 cleanup_old_expired(
pool);
2168 time_t next_timeout;
2173 if (
pool->num_active > 0) {
2181 if (
pool->num_inactive > 0) {
2196 tv.tv_sec = next_timeout;
2211 for (i=0; i<num_pools; i++) {
2226ipv6_network_portion(
struct in6_addr *result,
2227 const struct in6_addr *
addr,
int bits) {
2228 unsigned char *addrp;
2234 static const unsigned char bitmasks[] = {
2235 0x00, 0xFE, 0xFC, 0xF8,
2236 0xF0, 0xE0, 0xC0, 0x80,
2242 if ((bits < 0) || (bits > 128)) {
2243 log_fatal(
"ipv6_network_portion: bits %d not between 0 and 128",
2251 addrp = ((
unsigned char *)result) + 15;
2256 mask_bits = 128 - bits;
2257 bytes = mask_bits / 8;
2258 extra_bits = mask_bits % 8;
2260 for (i=0; i<bytes; i++) {
2265 *addrp &= bitmasks[extra_bits];
2274 struct in6_addr tmp;
2276 ipv6_network_portion(&tmp, addr,
pool->bits);
2277 if (memcmp(&tmp, &
pool->start_addr,
sizeof(tmp)) == 0) {
2292 const struct in6_addr *addr) {
2299 if (*
pool != NULL) {
2304 for (i=0; i<num_pools; i++) {
2305 if (
pools[i]->pool_type != type)
2312 return ISC_R_NOTFOUND;
2320change_leases(
struct ia_xx *ia,
2321 isc_result_t (*change_func)(
struct ipv6_pool *,
2323 isc_result_t retval;
2324 isc_result_t renew_retval;
2326 struct in6_addr *addr;
2337 retval = renew_retval;
2376static int write_error;
2379write_ia_leases(
const void *name,
unsigned len,
void *
value) {
2412 log_info(
"Wrote %d NA, %d TA, %d PD leases to lease file.",
2419mark_hosts_unavailable_support(
const void *name,
unsigned len,
void *
value) {
2422 struct in6_addr addr;
2441 "error evaluating host address.");
2446 "host address is not 128 bits.");
2476mark_phosts_unavailable_support(
const void *
name,
unsigned len,
void *
value) {
2479 struct in6_addr pref;
2532 while (
ip != NULL) {
2533 for (i=0; i<
ip->v6address_count; i++) {
2538 &
ip->v6addresses[i]);
2544 &
ip->v6addresses[i]);
2577 if (*pond != NULL) {
2584 return ISC_R_NOMEMORY;
2619 if (*pond != NULL) {
2656 if ((pond == NULL) || (*pond == NULL)) {
2690 int invalid_cnt = 0;
2703 if (pond->use_eui_64) {
2708 if (p->
bits != 64) {
2709 log_error(
"Pool %s/%d cannot use EUI-64,"
2714 log_debug(
"Pool: %s/%d - will use EUI-64",
2722 return (invalid_cnt);
2743 int invalid_cnt = 0;
2752 invalid_cnt += set_eui_64(pond);
2757 char *bufptr = log_buf;
2758 size_t space_left =
sizeof(log_buf) - 1;
2766 (space_left > (INET6_ADDRSTRLEN + 6))) {
2776 inet_ntop(AF_INET6, &
pool->start_addr,
2777 bufptr, INET6_ADDRSTRLEN);
2779 used = strlen(bufptr);
2784 sprintf (bufptr,
"/%d",
pool->bits);
2785 used = strlen(bufptr);
2791 log_info(
"Threshold logging disabled for shared"
2792 " subnet of ranges: %s", log_buf);
2801 log_fatal (
"%d pool(s) are invalid for EUI-64 use",
2828 static int log_once = 0;
2830 if (htype & 0xFF00) {
2832 log_error(
"Attention: At least one client advertises a "
2833 "hardware type of %d, which exceeds the software "
2834 "limitation of 255.", htype);
2881 log_debug(
"find_hosts_by_haddr6: using packet->haddr,"
2882 " type: %d, len: %d", htype, hlen);
2905 memset(&rel_addr, 0,
sizeof(rel_addr));
2910 "Error evaluating option cache");
2918 hlen = rel_addr.
len - 2;
2924 "using relayed haddr"
2925 " type: %d, len: %d", htype, hlen);
2947 const unsigned char *chaddr;
2953 if (client_id->
len < 4)
2967 if (client_id->
len > 8) {
2968 hlen = client_id->
len - 8;
2969 chaddr = client_id->
data + 8;
2978 hlen = client_id->
len - 4;
2979 chaddr = client_id->
data + 4;
int buffer_allocate(struct buffer **ptr, unsigned len, const char *file, int line)
void data_string_forget(struct data_string *data, 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)
void data_string_copy(struct data_string *dest, const struct data_string *src, const char *file, int line)
void add_timeout(struct timeval *when, void *where, void *what, tvref_t ref, tvunref_t unref)
struct option_cache * lookup_option(struct universe *universe, struct option_state *options, unsigned code)
u_int32_t getUShort(const unsigned char *)
#define D6O_CLIENT_LINKLAYER_ADDR
int write_server_duid(void)
const char * pin6_addr(const struct in6_addr *)
void(* tvunref_t)(void *, const char *, int)
#define HARDWARE_ADDR_LEN
isc_result_t iasubopt_reference(struct iasubopt **iasubopt, struct iasubopt *src, const char *file, int line)
struct shared_network * shared_networks
int find_hosts_by_haddr(struct host_decl **, int, const unsigned char *, unsigned, const char *, int)
void(* tvref_t)(void *, void *, const char *, int)
isc_result_t decline_lease6(struct ipv6_pool *pool, struct iasubopt *lease)
#define EXPIRED_IPV6_CLEANUP_TIME
struct ipv6_pool ** pools
struct hash_table ia_hash_t
int find_hosts_by_uid(struct host_decl **, const unsigned char *, unsigned, const char *, int)
host_hash_t * host_name_hash
int commit_leases_timed(void)
struct universe server_universe
isc_result_t ia_dereference(struct ia_xx **ia, const char *file, int line)
int find_hosts_by_option(struct host_decl **, struct packet *, struct option_state *, const char *, int)
isc_result_t renew_lease6(struct ipv6_pool *pool, struct iasubopt *lease)
Renew a lease in the pool.
isc_result_t release_lease6(struct ipv6_pool *pool, struct iasubopt *lease)
isc_result_t ipv6_pool_dereference(struct ipv6_pool **pool, const char *file, int line)
de-reference an IPv6 pool structure.
int write_ia(const struct ia_xx *)
isc_result_t iasubopt_dereference(struct iasubopt **iasubopt, const char *file, int line)
isc_result_t ddns_removals(struct lease *, struct iasubopt *, struct dhcp_ddns_cb *, isc_boolean_t)
isc_result_t ipv6_pool_reference(struct ipv6_pool **pool, struct ipv6_pool *src, const char *file, int line)
reference an IPv6 pool structure.
isc_result_t ia_reference(struct ia_xx **ia, struct ia_xx *src, const char *file, int line)
struct hash_table iasubopt_hash_t
#define print_hex_1(len, data, limit)
struct interface_info * interfaces
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)
int hash_foreach(struct hash_table *, hash_foreach_func)
#define HASH_FUNCTIONS(name, bufarg, type, hashtype, ref, deref, hasher)
unsigned do_string_hash(const void *, unsigned, unsigned)
#define DEFAULT_HASH_SIZE
void * isc_heap_element(isc_heap_t *heap, unsigned int index)
Returns the element for a specific element index.
void isc_heap_foreach(isc_heap_t *heap, isc_heapaction_t action, void *uap)
Iterate over the heap, calling an action for each element. The order of iteration is not sorted.
void isc_heap_destroy(isc_heap_t **heapp)
Destroys a heap.
isc_result_t isc_heap_insert(isc_heap_t *heap, void *elt)
Inserts a new element into a heap.
void isc_heap_decreased(isc_heap_t *heap, unsigned int index)
Indicates to the heap that an element's priority has decreased. This function MUST be called whenever...
void isc_heap_increased(isc_heap_t *heap, unsigned int index)
Indicates to the heap that an element's priority has increased. This function MUST be called whenever...
isc_result_t isc_heap_create(isc_heapcompare_t compare, isc_heapindex_t index, unsigned int size_increment, isc_heap_t **heapp)
Create a new heap. The heap is implemented using a space-efficient storage method....
void isc_heap_delete(isc_heap_t *heap, unsigned int index)
Deletes an element from a heap, by element index.
dhcp_context_t dhcp_gbl_ctx
void mark_hosts_unavailable(void)
isc_result_t ipv6_pond_reference(struct ipv6_pond **pond, struct ipv6_pond *src, const char *file, int line)
reference an IPv6 pond structure.
isc_result_t ia_add_iasubopt(struct ia_xx *ia, struct iasubopt *iasubopt, const char *file, int line)
isc_result_t ipv6_pool_allocate(struct ipv6_pool **pool, u_int16_t type, const struct in6_addr *start_addr, int bits, int units, const char *file, int line)
Create a new IPv6 lease pool structure.
int htype_bounds_check(uint16_t htype)
isc_boolean_t ipv6_in_pool(const struct in6_addr *addr, const struct ipv6_pool *pool)
isc_boolean_t ia_equal(const struct ia_xx *a, const struct ia_xx *b)
isc_result_t iasubopt_reference(struct iasubopt **iasubopt, struct iasubopt *src, const char *file, int line)
isc_result_t add_ipv6_pool(struct ipv6_pool *pool)
int find_hosts6(struct host_decl **host, struct packet *packet, const struct data_string *client_id, char *file, int line)
isc_result_t decline_lease6(struct ipv6_pool *pool, struct iasubopt *lease)
isc_boolean_t lease6_usable(struct iasubopt *lease)
Check if address is available to a lease.
isc_result_t ia_allocate(struct ia_xx **ia, u_int32_t iaid, const char *duid, unsigned int duid_len, const char *file, int line)
isc_result_t ipv6_pond_dereference(struct ipv6_pond **pond, const char *file, int line)
de-reference an IPv6 pond structure.
void schedule_lease_timeout(struct ipv6_pool *pool)
isc_result_t create_prefix6(struct ipv6_pool *pool, struct iasubopt **pref, unsigned int *attempts, const struct data_string *uid, time_t soft_lifetime_end_time)
void mark_phosts_unavailable(void)
void build_prefix6(struct in6_addr *pref, const struct in6_addr *net_start_pref, int pool_bits, int pref_bits, const struct data_string *input)
isc_result_t ipv6_pond_allocate(struct ipv6_pond **pond, const char *file, int line)
Create a new IPv6 pond structure.
isc_result_t ia_dereference(struct ia_xx **ia, const char *file, int line)
isc_result_t renew_leases(struct ia_xx *ia)
isc_result_t expire_lease6(struct iasubopt **leasep, struct ipv6_pool *pool, time_t now)
isc_result_t ia_make_key(struct data_string *key, u_int32_t iaid, const char *duid, unsigned int duid_len, const char *file, int line)
isc_boolean_t lease6_exists(const struct ipv6_pool *pool, const struct in6_addr *addr)
isc_result_t create_lease6(struct ipv6_pool *pool, struct iasubopt **addr, unsigned int *attempts, const struct data_string *uid, time_t soft_lifetime_end_time)
isc_result_t renew_lease6(struct ipv6_pool *pool, struct iasubopt *lease)
Renew a lease in the pool.
isc_result_t release_lease6(struct ipv6_pool *pool, struct iasubopt *lease)
void schedule_all_ipv6_lease_timeouts(void)
isc_result_t find_ipv6_pool(struct ipv6_pool **pool, u_int16_t type, const struct in6_addr *addr)
void report_jumbo_ranges()
void ia_remove_iasubopt(struct ia_xx *ia, struct iasubopt *iasubopt, const char *file, int line)
isc_result_t ipv6_pool_dereference(struct ipv6_pool **pool, const char *file, int line)
de-reference an IPv6 pool structure.
int find_hosts_by_haddr6(struct host_decl **hp, struct packet *packet, struct option_state *opt_state, const char *file, int line)
Look for hosts by MAC address if it's available.
isc_result_t iasubopt_dereference(struct iasubopt **iasubopt, const char *file, int line)
isc_boolean_t prefix6_exists(const struct ipv6_pool *pool, const struct in6_addr *pref, u_int8_t plen)
isc_result_t cleanup_lease6(ia_hash_t *ia_table, struct ipv6_pool *pool, struct iasubopt *lease, struct ia_xx *ia)
Cleans up leases when reading from a lease file.
void ia_remove_all_lease(struct ia_xx *ia, const char *file, int line)
int find_hosts_by_duid_chaddr(struct host_decl **host, const struct data_string *client_id)
isc_result_t release_leases(struct ia_xx *ia)
isc_result_t add_lease6(struct ipv6_pool *pool, struct iasubopt *lease, time_t valid_lifetime_end_time)
isc_result_t decline_leases(struct ia_xx *ia)
isc_result_t ipv6_pool_reference(struct ipv6_pool **pool, struct ipv6_pool *src, const char *file, int line)
reference an IPv6 pool structure.
void mark_interfaces_unavailable(void)
isc_result_t ia_reference(struct ia_xx **ia, struct ia_xx *src, const char *file, int line)
isc_result_t mark_lease_unavailable(struct ipv6_pool *pool, const struct in6_addr *addr)
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__
#define DHCP_R_INVALIDARG
const unsigned char * data
u_int8_t hbuf[HARDWARE_ADDR_LEN+1]
struct iaddrcidrnetlist * fixed_prefix
struct option_cache * fixed_addr
struct data_string iaid_duid
struct iasubopt ** iasubopt
struct iaddrcidrnet cidrnet
struct iaddrcidrnetlist * next
time_t hard_lifetime_end_time
struct binding_scope * scope
struct ipv6_pool * ipv6_pool
time_t soft_lifetime_end_time
struct ipv6_pool ** ipv6_pools
struct in6_addr start_addr
isc_heap_t * inactive_timeouts
isc_heap_t * active_timeouts
struct lease_state * state
struct binding_scope * scope
struct executable_statement * on_commit
struct executable_statement * on_expiry
struct executable_statement * on_release
struct packet * dhcpv6_container_packet
struct option_state * options
struct shared_network * next
struct ipv6_pond * ipv6_pond
struct universe dhcpv6_universe
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)
struct binding_scope * global_scope