43 if (addr.len >
sizeof(addr.iabuf))
44 log_fatal(
"subnet_number():%s:%d: Invalid addr length.",
MDL);
45 if (addr.len != mask.len)
46 log_fatal(
"subnet_number():%s:%d: Addr/mask length mismatch.",
52 if (addr.len != mask.len)
56 for (i = 0; i < rv.len; i++)
57 rv.iabuf [i] = addr.iabuf [i] & mask.iabuf [i];
68 u_int32_t host_address;
73 unsigned char habuf [
sizeof swaddr];
77 if (
subnet.len != mask.len)
78 log_fatal(
"ip_addr():%s:%d: Addr/mask length mismatch.",
81 swaddr = htonl (host_address);
82 memcpy (habuf, &swaddr,
sizeof swaddr);
88 j = rv.len -
sizeof habuf;
89 for (i =
sizeof habuf - 1; i >= 0; i--) {
90 if (mask.iabuf [i + j]) {
91 if (habuf [i] > (mask.iabuf [i + j] ^ 0xFF)) {
95 for (k = i - 1; k >= 0; k--) {
101 rv.iabuf [i + j] |= habuf [i];
104 rv.iabuf [i + j] = habuf [i];
122 log_fatal(
"broadcast_addr():%s:%d: Invalid addr length.",
MDL);
123 if (
subnet.len != mask.len)
124 log_fatal(
"broadcast_addr():%s:%d: Addr/mask length mismatch.",
127 if (
subnet.len != mask.len) {
132 for (i = 0; i <
subnet.len; i++) {
133 rv.iabuf [i] =
subnet.iabuf [i] | (~mask.iabuf [i] & 255);
148 if (addr.len >
sizeof(addr.iabuf))
149 log_fatal(
"host_addr():%s:%d: Invalid addr length.",
MDL);
150 if (addr.len != mask.
len)
151 log_fatal(
"host_addr():%s:%d: Addr/mask length mismatch.",
158 for (i = 0; i < rv.
len; i++)
159 rv.
iabuf [i] = addr.iabuf [i] & ~mask.
iabuf [i];
162 memcpy (&swaddr, &rv.
iabuf [rv.
len -
sizeof swaddr],
sizeof swaddr);
165 return ntohl (swaddr);
169 struct
iaddr addr1, addr2;
171 if (addr1.len >
sizeof(addr1.iabuf))
172 log_fatal(
"addr_eq():%s:%d: Invalid addr length.",
MDL);
174 if (addr1.len != addr2.len)
176 return memcmp (addr1.iabuf, addr2.iabuf, addr1.len) == 0;
192 if (addr->len != match->
addr.
len)
195 for (i = 0 ; i < addr->len ; i++) {
196 if ((addr->iabuf[i] & match->
mask.
iabuf[i]) !=
220 for (i=0; i<a1->
len; i++) {
251 for (i=0; i<a1->
len; i++) {
253 if (result->
iabuf[i] != 0) {
280 for (i=0; i<a1->
len; i++) {
282 if (result->
iabuf[i] != 0) {
318 if (bits > (addr->
len * 8)) {
325 zero_bits = (addr->
len * 8) - bits;
326 zero_bytes = zero_bits / 8;
331 for (i=1; i<=zero_bytes; i++) {
332 if (addr->
iabuf[addr->
len-i] != 0) {
344 shift_bits = zero_bits % 8;
345 if (shift_bits == 0)
return ISC_TRUE;
346 byte = addr->
iabuf[addr->
len-zero_bytes-1];
347 return (((byte >> shift_bits) << shift_bits) == byte);
363 const struct iaddr *lo,
const struct iaddr *hi) {
367 struct iaddr end_addr;
373 if (result == NULL) {
376 if (*result != NULL) {
379 if ((lo == NULL) || (hi == NULL) || (lo->
len != hi->
len)) {
387 const struct iaddr *tmp;
428 memset(&mask, 0,
sizeof(mask));
434 ofs = addr.
len - (bit / 8) - 1;
435 val = 1 << (bit % 8);
437 mask.
iabuf[ofs] |= val;
443 addr_or(&end_addr, &addr, &mask);
452 while (*result != NULL) {
453 net = (*result)->
next;
457 return ISC_R_NOMEMORY;
469 tmp = addr.
iabuf[ofs] + val;
470 while ((ofs >= 0) && (tmp > 255)) {
471 addr.
iabuf[ofs] = tmp - 256;
473 tmp = addr.
iabuf[ofs] + 1;
479 addr.
iabuf[ofs] = tmp;
486 memset(end_addr.
iabuf, 0,
sizeof(end_addr.
iabuf));
498 return ISC_R_SUCCESS;
508 if (result == NULL) {
511 if (*result == NULL) {
515 while (*result != NULL) {
521 return ISC_R_SUCCESS;
525 inet_ntopdd(
const unsigned char *src,
unsigned srclen,
char *dst,
size_t size)
527 char tmp[
sizeof(
"32.255.255.255.255")];
532 len = sprintf (tmp,
"%u.%u", src[0], src[1]);
535 len = sprintf (tmp,
"%u.%u.%u", src[0], src[1], src[2]);
538 len = sprintf (tmp,
"%u.%u.%u.%u", src[0], src[1], src[2], src[3]);
541 len = sprintf (tmp,
"%u.%u.%u.%u.%u", src[0], src[1], src[2], src[3], src[4]);
554 return strcpy (dst, tmp);
560 static char pbuf[
sizeof(
"255.255.255.255.255")];
563 return "<null destination descriptor>";
568 if ((addr.
len >= 2) && (addr.
len <= 5)) {
569 return inet_ntopdd(addr.
iabuf, addr.
len, pbuf,
sizeof(pbuf));
572 log_fatal(
"pdestdesc():%s:%d: Invalid destination descriptor length %d.",
583 pbuf[
sizeof(
"ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")];
589 return "<null address>";
592 return inet_ntop(AF_INET, addr.
iabuf, pbuf,
sizeof(pbuf));
594 if (addr.
len == 16) {
595 return inet_ntop(AF_INET6, addr.
iabuf, pbuf,
sizeof(pbuf));
598 log_fatal(
"piaddr():%s:%d: Invalid address length %d.",
MDL,
610 unsigned int oct, bit;
612 if ((addr->
len != 4) && (addr->
len != 16))
613 log_fatal(
"piaddrmask():%s:%d: Address length %d invalid",
615 if (addr->
len != mask->
len)
616 log_fatal(
"piaddrmask():%s:%d: Address and mask size mismatch",
620 for (mw = (mask->
len * 8) ; mw > 0 ; ) {
622 bit = 0x80 >> ((mw - 1) % 8);
623 if (!mask->
iabuf[oct])
625 else if (mask->
iabuf[oct] & bit)
641 ret[
sizeof(
"ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255/128")];
648 if (bits > (addr->
len * 8))
651 sprintf(ret,
"%s/%d",
piaddr(*addr), bits);
668 local_port = strtol(port, &endptr, 10);
670 if ((*endptr !=
'\0') || (errno == ERANGE) || (errno == EINVAL))
671 log_fatal (
"Invalid port number specification: %s", port);
673 if (local_port < lower || local_port > upper)
674 log_fatal(
"Port number specified is out of range (%ld-%ld).",
677 return htons((u_int16_t)local_port);
struct iaddrcidrnet cidrnet
int addr_or(struct iaddr *result, const struct iaddr *a1, const struct iaddr *a2)
const char * piaddr(const struct iaddr addr)
void * dmalloc(unsigned, const char *, int)
char * piaddrmask(struct iaddr *addr, struct iaddr *mask)
int addr_cmp(const struct iaddr *a1, const struct iaddr *a2)
struct iaddr ip_addr(struct iaddr subnet, struct iaddr mask, u_int32_t host_address)
#define DHCP_R_INVALIDARG
const char * pdestdesc(const struct iaddr addr)
void log_fatal(const char *,...) __attribute__((__format__(__printf__
struct iaddr subnet_number(struct iaddr addr, struct iaddr mask)
u_int16_t validate_port(char *port)
struct iaddrcidrnetlist * next
isc_result_t free_iaddrcidrnetlist(struct iaddrcidrnetlist **result)
void dfree(void *, const char *, int)
int addr_eq(struct iaddr addr1, struct iaddr addr2)
struct iaddr broadcast_addr(struct iaddr subnet, struct iaddr mask)
u_int32_t host_addr(struct iaddr addr, struct iaddr mask)
isc_boolean_t is_cidr_mask_valid(const struct iaddr *addr, int bits)
int addr_match(struct iaddr *addr, struct iaddrmatch *match)
char * piaddrcidr(const struct iaddr *addr, unsigned int bits)
isc_result_t range2cidr(struct iaddrcidrnetlist **result, const struct iaddr *lo, const struct iaddr *hi)
int addr_and(struct iaddr *result, const struct iaddr *a1, const struct iaddr *a2)