void init_constants(void) { happy(anyaddr(AF_INET, &ipv4_any)); happy(anyaddr(AF_INET6, &ipv6_any)); happy(addrtosubnet(&ipv4_any, &ipv4_wildcard)); happy(addrtosubnet(&ipv6_any, &ipv6_wildcard)); happy(initsubnet(&ipv4_any, 0, '0', &ipv4_all)); happy(initsubnet(&ipv6_any, 0, '0', &ipv6_all)); }
prefix_node *dag_network::add_address(const ip_address addr) { ip_subnet vs; initsubnet(&addr, 128, 0, &vs); return add_address(vs); }
/* - ttosubnet - convert text "addr/mask" to address and mask * Mask can be integer bit count. */ err_t ttosubnet(const char *src, size_t srclen,int af,ip_subnet *dst) { const char *slash; const char *colon; const char *mask; size_t mlen; const char *oops; unsigned long bc; static char def[] = DEFAULTSUBNET; # define DEFLEN (sizeof(def) - 1) /* -1 for NUL */ static char defis4[] = "0/0"; # define DEFIS4LEN (sizeof(defis4) - 1) static char defis6[] = "::/0"; # define DEFIS6LEN (sizeof(defis6) - 1) ip_address addrtmp; ip_address masktmp; int nbits; int i; if (srclen == 0) srclen = strlen(src); if (srclen == 0) return "empty string"; switch (af) { case AF_INET: nbits = 32; break; case AF_INET6: nbits = 128; break; default: return "unknown address family in ttosubnet"; break; } if (srclen == DEFLEN && strncmp(src, def, srclen) == 0) { src = (af == AF_INET) ? defis4 : defis6; srclen = (af == AF_INET) ? DEFIS4LEN : DEFIS6LEN; } slash = memchr(src, '/', srclen); if (slash == NULL) return "no / in subnet specification"; mask = slash + 1; mlen = srclen - (mask - src); oops = ttoaddr(src, slash-src, af, &addrtmp); if (oops != NULL) return oops; /* extract port, as last : */ colon = memchr(mask, ':', mlen); if (colon == 0) { setportof(0, &addrtmp); } else { unsigned long port; oops = ttoul(colon+1, mlen-(colon-mask+1), 0, &port); if (oops != NULL) return oops; setportof(htons(port), &addrtmp); mlen = colon - mask; } /*extract mask */ oops = ttoul(mask, mlen, 10, &bc); if (oops == NULL) { /* ttoul succeeded, it's a bit-count mask */ if (bc > nbits) return "subnet mask bit count too large"; i = bc; } else if(af == AF_INET) { oops = ttoaddr(mask, mlen, af, &masktmp); if (oops != NULL) return oops; i = masktocount(&masktmp); if (i < 0) return "non-contiguous or otherwise erroneous mask"; } else { return "masks are not permitted for IPv6 addresses"; } return initsubnet(&addrtmp, i, '0', dst); }