netaddr.c revision 6eccf5bd07eb9abf65cc08fec4a8fc97b62c0e1b
499b34cea04a46823d003d4c0520c8b03e8513cbBrian Wellington * Copyright (C) 1999-2001 Internet Software Consortium.
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson * Permission to use, copy, modify, and distribute this software for any
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson * purpose with or without fee is hereby granted, provided that the above
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson * copyright notice and this permission notice appear in all copies.
15a44745412679c30a6d022733925af70a38b715David Lawrence * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
15a44745412679c30a6d022733925af70a38b715David Lawrence * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
15a44745412679c30a6d022733925af70a38b715David Lawrence * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
15a44745412679c30a6d022733925af70a38b715David Lawrence * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
15a44745412679c30a6d022733925af70a38b715David Lawrence * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
15a44745412679c30a6d022733925af70a38b715David Lawrence * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
15a44745412679c30a6d022733925af70a38b715David Lawrence * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
15a44745412679c30a6d022733925af70a38b715David Lawrence * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
6eccf5bd07eb9abf65cc08fec4a8fc97b62c0e1bBrian Wellington/* $Id: netaddr.c,v 1.16 2001/03/26 21:33:05 bwelling Exp $ */
b356893425f18a2399771faa875e91318f204fb5Andreas Gustafssonisc_netaddr_equal(const isc_netaddr_t *a, const isc_netaddr_t *b) {
b356893425f18a2399771faa875e91318f204fb5Andreas Gustafsson if (a->type.in.s_addr != b->type.in.s_addr)
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrence if (memcmp(&a->type.in6, &b->type.in6, sizeof a->type.in6)
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafssonisc_netaddr_eqprefix(const isc_netaddr_t *a, const isc_netaddr_t *b,
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson unsigned int ipabytes; /* Length of whole IP address in bytes */
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson unsigned int nbytes; /* Number of significant whole bytes */
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson unsigned int nbits; /* Number of significant leftover bits */
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson pa = pb = NULL; /* Avoid silly compiler warning. */
87cafc5e70f79f2586d067fbdd64f61bbab069d2David Lawrence * Don't crash if we get a pattern like 10.0.0.1/9999999.
8eaa51a6991ea6bc6c9db0b907beacde8dd1fed2Andreas Gustafssonisc_netaddr_totext(const isc_netaddr_t *netaddr, isc_buffer_t *target) {
8eaa51a6991ea6bc6c9db0b907beacde8dd1fed2Andreas Gustafsson char abuf[sizeof "xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255"];
8eaa51a6991ea6bc6c9db0b907beacde8dd1fed2Andreas Gustafsson const char *r;
8eaa51a6991ea6bc6c9db0b907beacde8dd1fed2Andreas Gustafsson r = inet_ntop(netaddr->family, &netaddr->type, abuf, sizeof abuf);
8eaa51a6991ea6bc6c9db0b907beacde8dd1fed2Andreas Gustafsson if (alen > isc_buffer_availablelength(target))
8eaa51a6991ea6bc6c9db0b907beacde8dd1fed2Andreas Gustafsson isc_buffer_putmem(target, (unsigned char *)abuf, alen);
8eaa51a6991ea6bc6c9db0b907beacde8dd1fed2Andreas Gustafssonisc_netaddr_format(isc_netaddr_t *na, char *array, unsigned int size) {
8eaa51a6991ea6bc6c9db0b907beacde8dd1fed2Andreas Gustafsson * Null terminate.
8eaa51a6991ea6bc6c9db0b907beacde8dd1fed2Andreas Gustafsson if (isc_buffer_availablelength(&buf) >= 1)
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence isc_msgcat_get(isc_msgcat, ISC_MSGSET_NETADDR,
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence "<unknown address, family %u>"),
87cafc5e70f79f2586d067fbdd64f61bbab069d2David Lawrenceisc_netaddr_masktoprefixlen(const isc_netaddr_t *s, unsigned int *lenp) {
87cafc5e70f79f2586d067fbdd64f61bbab069d2David Lawrence const unsigned char *p;
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson for (i = 0; i < ipbytes; i++) {
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson if (p[i] != 0xFF)
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson unsigned int c = p[nbytes];
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson if ((c & 0xFF) != 0)
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson for (; i < ipbytes; i++) {
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson if (p[i] != 0)
87cafc5e70f79f2586d067fbdd64f61bbab069d2David Lawrenceisc_netaddr_fromin(isc_netaddr_t *netaddr, const struct in_addr *ina) {
87cafc5e70f79f2586d067fbdd64f61bbab069d2David Lawrenceisc_netaddr_fromin6(isc_netaddr_t *netaddr, const struct in6_addr *ina6) {
d80da258e377f02f0dcd703b89a1044cc58e949fMichael Graffisc_netaddr_fromsockaddr(isc_netaddr_t *t, const isc_sockaddr_t *s) {
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson memcpy(&t->type.in6, &s->type.sin6.sin6_addr, 16);
7e361074bc8a2df7a0891a7040eea02ca3a5e286Andreas Gustafssonisc_netaddr_any6(isc_netaddr_t *netaddr) {
d80da258e377f02f0dcd703b89a1044cc58e949fMichael Graff return (ISC_TF(ISC_IPADDR_ISMULTICAST(na->type.in.s_addr)));
d80da258e377f02f0dcd703b89a1044cc58e949fMichael Graff return (ISC_TF(IN6_IS_ADDR_MULTICAST(&na->type.in6)));
6eccf5bd07eb9abf65cc08fec4a8fc97b62c0e1bBrian Wellingtonisc_netaddr_fromv4mapped(isc_netaddr_t *t, const isc_netaddr_t *s) {
6eccf5bd07eb9abf65cc08fec4a8fc97b62c0e1bBrian Wellington REQUIRE(IN6_IS_ADDR_V4MAPPED(&s->type.in6));
6eccf5bd07eb9abf65cc08fec4a8fc97b62c0e1bBrian Wellington memset(t, 0, sizeof *t);
6eccf5bd07eb9abf65cc08fec4a8fc97b62c0e1bBrian Wellington memcpy(&t->type.in, (const char *)&s->type.in6 + 12, 4);