41 if (addr.len >
sizeof(addr.iabuf))
42 log_fatal(
"subnet_number():%s:%d: Invalid addr length.",
MDL);
43 if (addr.len != mask.len)
44 log_fatal(
"subnet_number():%s:%d: Addr/mask length mismatch.",
50 if (addr.len != mask.len)
54 for (i = 0; i < rv.len; i++)
55 rv.iabuf [i] = addr.iabuf [i] & mask.iabuf [i];
66 u_int32_t host_address;
71 unsigned char habuf [
sizeof swaddr];
75 if (
subnet.len != mask.len)
76 log_fatal(
"ip_addr():%s:%d: Addr/mask length mismatch.",
79 swaddr = htonl (host_address);
80 memcpy (habuf, &swaddr,
sizeof swaddr);
86 j = rv.len -
sizeof habuf;
87 for (i =
sizeof habuf - 1; i >= 0; i--) {
88 if (mask.iabuf [i + j]) {
89 if (habuf [i] > (mask.iabuf [i + j] ^ 0xFF)) {
93 for (k = i - 1; k >= 0; k--) {
99 rv.iabuf [i + j] |= habuf [i];
102 rv.iabuf [i + j] = habuf [i];
120 log_fatal(
"broadcast_addr():%s:%d: Invalid addr length.",
MDL);
121 if (
subnet.len != mask.len)
122 log_fatal(
"broadcast_addr():%s:%d: Addr/mask length mismatch.",
125 if (
subnet.len != mask.len) {
130 for (i = 0; i <
subnet.len; i++) {
131 rv.iabuf [i] =
subnet.iabuf [i] | (~mask.iabuf [i] & 255);
146 if (addr.len >
sizeof(addr.iabuf))
147 log_fatal(
"host_addr():%s:%d: Invalid addr length.",
MDL);
148 if (addr.len != mask.len)
149 log_fatal(
"host_addr():%s:%d: Addr/mask length mismatch.",
156 for (i = 0; i < rv.len; i++)
157 rv.iabuf [i] = addr.iabuf [i] & ~mask.iabuf [i];
160 memcpy (&swaddr, &rv.iabuf [rv.len -
sizeof swaddr],
sizeof swaddr);
163 return ntohl (swaddr);
167 struct iaddr addr1, addr2;
169 if (addr1.len >
sizeof(addr1.iabuf))
170 log_fatal(
"addr_eq():%s:%d: Invalid addr length.",
MDL);
172 if (addr1.len != addr2.len)
174 return memcmp (addr1.iabuf, addr2.iabuf, addr1.len) == 0;
193 for (i = 0 ; i <
addr->
len ; i++) {
218 for (i=0; i<a1->
len; i++) {
249 for (i=0; i<a1->
len; i++) {
251 if (result->
iabuf[i] != 0) {
278 for (i=0; i<a1->
len; i++) {
280 if (result->
iabuf[i] != 0) {
323 zero_bits = (
addr->
len * 8) - bits;
324 zero_bytes = zero_bits / 8;
329 for (i=1; i<=zero_bytes; i++) {
342 shift_bits = zero_bits % 8;
343 if (shift_bits == 0)
return ISC_TRUE;
345 return (((
byte >> shift_bits) << shift_bits) ==
byte);
361 const struct iaddr *lo,
const struct iaddr *hi) {
365 struct iaddr end_addr;
371 if (result == NULL) {
374 if (*result != NULL) {
377 if ((lo == NULL) || (hi == NULL) || (lo->
len != hi->
len)) {
385 const struct iaddr *tmp;
426 memset(&mask, 0,
sizeof(mask));
432 ofs = addr.
len - (bit / 8) - 1;
433 val = 1 << (bit % 8);
435 mask.
iabuf[ofs] |= val;
441 addr_or(&end_addr, &addr, &mask);
450 while (*result != NULL) {
451 net = (*result)->
next;
455 return ISC_R_NOMEMORY;
467 tmp = addr.
iabuf[ofs] + val;
468 while ((ofs >= 0) && (tmp > 255)) {
469 addr.
iabuf[ofs] = tmp - 256;
471 tmp = addr.
iabuf[ofs] + 1;
477 addr.
iabuf[ofs] = tmp;
484 memset(end_addr.
iabuf, 0,
sizeof(end_addr.
iabuf));
506 if (result == NULL) {
509 if (*result == NULL) {
513 while (*result != NULL) {
523inet_ntopdd(
const unsigned char *src,
unsigned srclen,
char *dst,
size_t size)
525 char tmp[
sizeof(
"32.255.255.255.255")];
530 len = sprintf (tmp,
"%u.%u", src[0], src[1]);
533 len = sprintf (tmp,
"%u.%u.%u", src[0], src[1], src[2]);
536 len = sprintf (tmp,
"%u.%u.%u.%u", src[0], src[1], src[2], src[3]);
539 len = sprintf (tmp,
"%u.%u.%u.%u.%u", src[0], src[1], src[2], src[3], src[4]);
552 return strcpy (dst, tmp);
558 static char pbuf[
sizeof(
"255.255.255.255.255")];
561 return "<null destination descriptor>";
566 if ((addr.
len >= 2) && (addr.
len <= 5)) {
567 return inet_ntopdd(addr.
iabuf, addr.
len, pbuf,
sizeof(pbuf));
570 log_fatal(
"pdestdesc():%s:%d: Invalid destination descriptor length %d.",
581 pbuf[
sizeof(
"ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")];
587 return "<null address>";
590 return inet_ntop(AF_INET, addr.
iabuf, pbuf,
sizeof(pbuf));
592 if (addr.
len == 16) {
593 return inet_ntop(AF_INET6, addr.
iabuf, pbuf,
sizeof(pbuf));
596 log_fatal(
"piaddr():%s:%d: Invalid address length %d.",
MDL,
608 unsigned int oct, bit;
610 if ((addr->
len != 4) && (addr->
len != 16))
611 log_fatal(
"piaddrmask():%s:%d: Address length %d invalid",
613 if (addr->
len != mask->
len)
614 log_fatal(
"piaddrmask():%s:%d: Address and mask size mismatch",
618 for (mw = (mask->
len * 8) ; mw > 0 ; ) {
620 bit = 0x80 >> ((mw - 1) % 8);
621 if (!mask->
iabuf[oct])
623 else if (mask->
iabuf[oct] & bit)
639 ret[
sizeof(
"ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255/128")];
646 if (bits > (addr->
len * 8))
649 sprintf(ret,
"%s/%d",
piaddr(*addr), bits);
668 if ((*endptr !=
'\0') || (errno == ERANGE) || (errno == EINVAL))
669 log_fatal (
"Invalid port number specification: %s", port);
672 log_fatal(
"Port number specified is out of range (%ld-%ld).",
694 if ((*endptr !=
'\0') || (errno == ERANGE) || (errno == EINVAL))
695 log_fatal (
"Invalid port pair specification: %s", port);
698 log_fatal(
"Port pair specified is out of range (%ld-%ld).",
715 memcpy(addr.
iabuf, src->s6_addr, 16);
const char * pin6_addr(const struct in6_addr *)
isc_result_t range2cidr(struct iaddrcidrnetlist **result, const struct iaddr *lo, const struct iaddr *hi)
isc_result_t free_iaddrcidrnetlist(struct iaddrcidrnetlist **result)
u_int32_t host_addr(struct iaddr addr, struct iaddr mask)
isc_boolean_t is_cidr_mask_valid(const struct iaddr *addr, int bits)
u_int16_t validate_port(char *port)
struct iaddr ip_addr(struct iaddr subnet, struct iaddr mask, u_int32_t host_address)
char * piaddrcidr(const struct iaddr *addr, unsigned int bits)
const char * piaddr(const struct iaddr addr)
const char * pdestdesc(const struct iaddr addr)
int addr_or(struct iaddr *result, const struct iaddr *a1, const struct iaddr *a2)
int addr_eq(struct iaddr addr1, struct iaddr addr2)
struct iaddr broadcast_addr(struct iaddr subnet, struct iaddr mask)
int addr_cmp(const struct iaddr *a1, const struct iaddr *a2)
u_int16_t validate_port_pair(char *port)
int addr_match(struct iaddr *addr, struct iaddrmatch *match)
struct iaddr subnet_number(struct iaddr addr, struct iaddr mask)
char * piaddrmask(struct iaddr *addr, struct iaddr *mask)
int addr_and(struct iaddr *result, const struct iaddr *a1, const struct iaddr *a2)
void * dmalloc(size_t, const char *, int)
void dfree(void *, const char *, int)
void log_fatal(const char *,...) __attribute__((__format__(__printf__
#define DHCP_R_INVALIDARG
struct iaddrcidrnet cidrnet
struct iaddrcidrnetlist * next